Name: series-workflowzlg9z Phase: Succeeded StartedAt: 2026-09-06 00:27:46 +0000 UTC FinishedAt: 2026-09-06 04:49:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[0] Phase: Succeeded StartedAt: 2026-09-06 00:27:46 +0000 UTC FinishedAt: 2026-09-06 01:08:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[0].run-triage Phase: Succeeded StartedAt: 2026-09-06 00:27:46 +0000 UTC FinishedAt: 2026-09-06 01:08:50 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "21860bb220225edeb87e9c831e6bf25c620e2126", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NAMESPACES", "USER_NS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "21860bb220225edeb87e9c831e6bf25c620e2126", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NAMESPACES", "USER_NS" ], "series_id": "526f51b5-be88-4359-9d65-5aa07041d1f7" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "__do_sys_listns", "do_listns", "do_listns_userns" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05BTUVTUEFDRVMmIzM0OywKICAgICYjMzQ7VVNFUl9OUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O19fZG9fc3lzX2xpc3RucyYjMzQ7LAogICAgJiMzNDtkb19saXN0bnMmIzM0OywKICAgICYjMzQ7ZG9fbGlzdG5zX3VzZXJucyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGBsZWdpdGltaXplX25zKClgIGluIGBrZXJuZWwvbnN0cmVlLmNgIHRvIGNoZWNrIHBlcm1pc3Npb25zIChgbWF5X2xpc3RfbnMoKWApIGJlZm9yZSBhY3F1aXJpbmcgYSByZWZlcmVuY2UgKGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKClgKSwgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIGEgdGVtcG9yYXJ5IGF1dG8tY2xlYW51cCByZWZlcmVuY2UgKGBfX2ZyZWUobnNfcHV0KWApLiBcblxuVGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1hbmlwdWxhdGUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBuZXcgc3RhY2svaGVhcCBidWZmZXJzLCBvciBzdHJ1Y3QgcGFkZGluZywgbm9yIGRvZXMgaXQgYWx0ZXIgZGF0YSBjb3B5aW5nIHRvIHVzZXJzcGFjZSBpbiBhIG1hbm5lciB0aGF0IGNvdWxkIGxlYWsgdW5pbml0aWFsaXplZCBieXRlcy4gQW55IHBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgY2hhbmdlIHJlbGF0ZSB0byBvYmplY3QgbGlmZXRpbWUgb3IgUkNVIGRlcmVmZXJlbmNpbmcgYmVmb3JlIHJlZmVyZW5jZSBhY3F1aXNpdGlvbiwgd2hpY2ggYXJlIHN0cmljdGx5IHdpdGhpbiB0aGUgZG9tYWluIG9mIEtBU0FOIHJhdGhlciB0aGFuIEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBuYW1lc3BhY2UgdHJlZSBpdGVyYXRpb24gYW5kIHBlcm1pc3Npb24gdmFsaWRhdGlvbiBsb2dpYyBpbiBsZWdpdGltaXplX25zKCksIHdoaWNoIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGxpc3RucyBzeXN0ZW0gY2FsbC4gSXQgY2hhbmdlcyB3aGV0aGVyIG1heV9saXN0X25zKCkgaXMgZXZhbHVhdGVkIGJlZm9yZSBvciBhZnRlciB0YWtpbmcgYSByZWZlcmVuY2UgdmlhIG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKSwgbW9kaWZ5aW5nIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjb2RlIGFjY2Vzc2libGUgdG8gdXNlcnNwYWNlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZmYwMDExNjk0MzkxNGVjYTRlOWIxMTI0MGNmMzg0MGRjMzdlZDlkOVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gU2VwIDYgMDE6MDY6MjUgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL25zdHJlZS5jIGIva2VybmVsL25zdHJlZS5jXG5pbmRleCA2ZDEyZTU5MDBhYzAxLi44MzFmMjc5ZDE3NGEzIDEwMDY0NFxuLS0tIGEva2VybmVsL25zdHJlZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvbnN0cmVlLmNcbkBAIC01MzMsMTkgJiM0Mzs1MzMsMTMgQEAgREVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxuIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5zX2NvbW1vbiAqX19tdXN0X2NoZWNrIGxlZ2l0aW1pemVfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbiBcdFx0XHRcdFx0XHRcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcbiB7XG4tXHRzdHJ1Y3QgbnNfY29tbW9uICpucyBfX2ZyZWUobnNfcHV0KSA9IE5VTEw7XG4tXG4gXHRpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuLVx0bnMgPSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7XG4tXHRpZiAoIW5zKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cbi1cdGlmICghbWF5X2xpc3RfbnMoa2xzLCBucykpXG4mIzQzO1x0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIGNhbmRpZGF0ZSkpXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuLVx0cmV0dXJuIG5vX2ZyZWVfcHRyKG5zKTtcbiYjNDM7XHRyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpO1xuIH1cbiBcbiBzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TkFNRVNQQUNFUyYjMzQ7LAogICAgJiMzNDtVU0VSX05TJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19kb19zeXNfbGlzdG5zJiMzNDssCiAgICAmIzM0O2RvX2xpc3RucyYjMzQ7LAogICAgJiMzNDtkb19saXN0bnNfdXNlcm5zJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG5hbWVzcGFjZSB0cmVlIGl0ZXJhdGlvbiBhbmQgcGVybWlzc2lvbiB2YWxpZGF0aW9uIGxvZ2ljIGluIGxlZ2l0aW1pemVfbnMoKSwgd2hpY2ggaXMgY2FsbGVkIGR1cmluZyB0aGUgbGlzdG5zIHN5c3RlbSBjYWxsLiBJdCBjaGFuZ2VzIHdoZXRoZXIgbWF5X2xpc3RfbnMoKSBpcyBldmFsdWF0ZWQgYmVmb3JlIG9yIGFmdGVyIHRha2luZyBhIHJlZmVyZW5jZSB2aWEgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpLCBtb2RpZnlpbmcgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNvZGUgYWNjZXNzaWJsZSB0byB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmZjAwMTE2OTQzOTE0ZWNhNGU5YjExMjQwY2YzODQwZGMzN2VkOWQ5CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFN1biBTZXAgNiAwMTowNjoyNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9uc3RyZWUuYyBiL2tlcm5lbC9uc3RyZWUuYwppbmRleCA2ZDEyZTU5MDBhYzAxLi44MzFmMjc5ZDE3NGEzIDEwMDY0NAotLS0gYS9rZXJuZWwvbnN0cmVlLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL25zdHJlZS5jCkBAIC01MzMsMTkgJiM0Mzs1MzMsMTMgQEAgREVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLAogCQkJCQkJCSAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSkKIHsKLQlzdHJ1Y3QgbnNfY29tbW9uICpucyBfX2ZyZWUobnNfcHV0KSA9IE5VTEw7Ci0KIAlpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpCiAJCXJldHVybiBOVUxMOwogCi0JbnMgPSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7Ci0JaWYgKCFucykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoIW1heV9saXN0X25zKGtscywgbnMpKQomIzQzOwlpZiAoIW1heV9saXN0X25zKGtscywgY2FuZGlkYXRlKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gbm9fZnJlZV9wdHIobnMpOwomIzQzOwlyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI5ODYKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA0NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoaXMgdGFzaywgd2Fsa2luZyB0aHJvdWdoIG15IHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIGBuc3RyZWUuY2AgQ2hhbmdlcyoqCgpBbHJpZ2h0LCB0aGUgZmlyc3Qgc3RlcCBpcyBhbHdheXMgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBjaGFuZ2VzIHRoZW1zZWx2ZXMuIEkmIzM5O20gZ29pbmcgdG8gcHVsbCB1cCB0aGUgcGF0Y2ggYW5kIHRoZSBtb2RpZmllZCBga2VybmVsL25zdHJlZS5jYCBmaWxlLiBJJiMzOTttIGFscmVhZHkgYW50aWNpcGF0aW5nIHNvbWUgb2YgdGhlIHVzdWFsIHN1c3BlY3RzIHdpdGggdGhlc2UgdHlwZXMgb2YgZmlsZSBtb2RpZmljYXRpb25zIOKAkyBkYXRhIHN0cnVjdHVyZSBhbHRlcmF0aW9ucywgZnVuY3Rpb24gcmUtd3JpdGVzLCBwb3RlbnRpYWxseSBzb21lIGNvbmN1cnJlbmN5IGNvbnNpZGVyYXRpb25zIGlmIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYW55dGhpbmcgYWNjZXNzaW5nIHRoaXMgZmlsZSBzeXN0ZW0gY29kZS4KCk5vdywgaW5zdGVhZCBvZiBqdXN0IHJlYWRpbmcgbGluZSBieSBsaW5lLCBJJiMzOTtsbCBsaWtlbHkgZ28gc3RyYWlnaHQgZm9yIHNvbWUgdG9vbGluZy4gYHJlYWQtZmlsZWAgY291bGQgZ2l2ZSBtZSBhIHF1aWNrLCBmb3JtYXR0ZWQgb3ZlcnZpZXcgb2YgdGhlIGNvZGUuIEhvd2V2ZXIsIG15IGdvLXRvIGluIHRoaXMgc2l0dWF0aW9uIGlzIHVzdWFsbHkgYGdyZXBwZXJgLiBJJiMzOTttIGdvaW5nIHRvIHNlYXJjaCBmb3IgYSBmZXcga2V5IHRoaW5ncyBkaXJlY3RseSBpbiB0aGUgcGF0Y2ggYW5kIHRoZW4gaW4gdGhlIGBuc3RyZWUuY2Agc291cmNlOgoKKiAgICoqS2V5IERhdGEgU3RydWN0dXJlczoqKiBXaGF0IGFyZSB0aGUgbWFqb3IgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkPyBgbnN0cmVlX25vZGVgLCBgbnN0cmVlX3BhdGhgIG9yIHNvbWV0aGluZyBzaW1pbGFyPyBJJiMzOTtsbCBncmVwIGZvciB0aG9zZSBhbmQgbG9vayBmb3IgdGhlaXIgZGVmaW5pdGlvbnMgYW5kIGFueSBjaGFuZ2VzIHRvIHRoZWlyIGZpZWxkcy4KKiAgICoqS2V5IEZ1bmN0aW9uczoqKiBXaGF0IGFyZSB0aGUgY29yZSBmdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIHRoZSBOU1RyZWU/IGBuc3RyZWVfbG9va3VwYCwgYG5zdHJlZV9pbnNlcnRgLCBgbnN0cmVlX2RlbGV0ZWAsIGBuc3RyZWVfd2Fsa2AgKG9yIHNpbWlsYXIpPyBJJiMzOTtsbCBzZWFyY2ggZm9yIHRob3NlIGZ1bmN0aW9uIG5hbWVzIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBiZWluZyBtb2RpZmllZC4KKiAgICoqRXJyb3IgSGFuZGxpbmc6KiogQXJlIHRoZXJlIGFueSBuZXcgZXJyb3IgY29kZXMgb3IgY2hhbmdlcyB0byBleGlzdGluZyBlcnJvciBoYW5kbGluZz8gVGhhdCYjMzk7cyBhbHdheXMgYSBjcml0aWNhbCBhc3BlY3QsIGFuZCBlYXN5IHRvIG1pc3MuCiogICAqKkNvbmN1cnJlbmN5OioqIElzIHRoZXJlIGFueSB0aHJlYWRpbmcsIGxvY2tpbmcsIG9yIGF0b21pYyBvcGVyYXRpb25zIGludm9sdmVkPyBBbnkgY2FsbHMgdG8gbXV0ZXhlcyBvciBhdG9taWMgcHJpbWl0aXZlcz8gVGhpcyBpcyBhIGh1Z2UgYXJlYSBmb3IgcHJvYmxlbXMsIHNvIEkmIzM5O2xsIGJlIGV4dHJhIHZpZ2lsYW50IGhlcmUuCgpUaGlzIHRhcmdldGVkIGFwcHJvYWNoIGxldHMgbWUgcXVpY2tseSBwaW5wb2ludCB0aGUgKndoYXQqIGFuZCAqd2hlcmUqIG9mIHRoZSBwYXRjaC4gT25jZSBJIGhhdmUgYSBjbGVhciBpZGVhIG9mIHdoYXQmIzM5O3MgKmJlaW5nKiBtb2RpZmllZCwgSSBjYW4gdGhlbiBkaXZlIGRlZXBlciBpbnRvIHRoZSAqd2h5KiBvZiB0aGUgY2hhbmdlcy4gSSYjMzk7bGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByZWFzb25pbmcgYmVoaW5kIGVhY2ggb2YgdGhlIG1vZGlmaWNhdGlvbnMsIGFuZCB3aGV0aGVyIGl0IGNvdWxkIHBvdGVudGlhbGx5IGNhdXNlIHByb2JsZW1zLiBJJiMzOTtsbCBwcm9iYWJseSBzcGVuZCBhIGdvb2QgZGVhbCBvZiB0aW1lIHRyYWNpbmcgdGhyb3VnaCB0aGUga2V5IGZ1bmN0aW9ucyBhbmQgaG93IHRoZXkmIzM5O3JlIGludGVuZGVkIHRvIHdvcmsgdW5kZXIgdmFyaW91cyBjb25kaXRpb25zIHRvIGNvbWUgdG8gYSB3ZWxsIGluZm9ybWVkIGNvbmNsdXNpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvbnN0cmVlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDUyMDpcdFx0aWYgKGlzX2N1cnJlbnRfbmFtZXNwYWNlKG5zKSlcbiA1MjE6XHRcdFx0cmV0dXJuIHRydWU7XG4gNTIyOlx0XHRyZXR1cm4gbWF5X3NlZV9hbGxfbmFtZXNwYWNlcygpO1xuIDUyMzpcdH1cbiA1MjQ6XHRcbiA1MjU6XHRzdGF0aWMgaW5saW5lIHZvaWQgbnNfcHV0KHN0cnVjdCBuc19jb21tb24gKm5zKVxuIDUyNjpcdHtcbiA1Mjc6XHRcdGlmIChucyBcdTAwMjZcdTAwMjYgbnMtXHUwMDNlb3BzKVxuIDUyODpcdFx0XHRucy1cdTAwM2VvcHMtXHUwMDNlcHV0KG5zKTtcbiA1Mjk6XHR9XG4gNTMwOlx0XG4gNTMxOlx0REVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxuIDUzMjpcdFxuIDUzMzpcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5zX2NvbW1vbiAqX19tdXN0X2NoZWNrIGxlZ2l0aW1pemVfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbiA1MzQ6XHRcdFx0XHRcdFx0XHRcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcbiA1MzU6XHR7XG4gNTM2Olx0XHRpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpXG4gNTM3Olx0XHRcdHJldHVybiBOVUxMO1xuIDUzODpcdFxuIDUzOTpcdFx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIGNhbmRpZGF0ZSkpXG4gNTQwOlx0XHRcdHJldHVybiBOVUxMO1xuIDU0MTpcdFxuIDU0MjpcdFx0cmV0dXJuIG5zX2dldF91bmxlc3NfaW5hY3RpdmUoY2FuZGlkYXRlKTtcbiA1NDM6XHR9XG4gNTQ0Olx0XG4gNTQ1Olx0c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zX3VzZXJucyhzdHJ1Y3Qga2xpc3RucyAqa2xzKVxuIDU0NjpcdHtcbiA1NDc6XHRcdHU2NCBfX3VzZXIgKm5zX2lkcyA9IGtscy1cdTAwM2V1bnNfaWRzO1xuIDU0ODpcdFx0c2l6ZV90IG5yX25zX2lkcyA9IGtscy1cdTAwM2Vucl9uc19pZHM7XG4gNTQ5Olx0XHRzdHJ1Y3QgbnNfY29tbW9uICpucyA9IE5VTEwsICpmaXJzdF9ucyA9IE5VTEwsICpwcmV2ID0gTlVMTDtcbiA1NTA6XHRcdGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7XG4gNTUxOlx0XHRzc2l6ZV90IHJldDtcbiA1NTI6XHRcbiA1NTM6XHRcdFZGU19XQVJOX09OX09OQ0UoIWtscy1cdTAwM2V1c2VyX25zX2lkKTtcbiA1NTQ6XHRcbiA1NTU6XHRcdGlmIChrbHMtXHUwMDNldXNlcl9uc19pZCA9PSBMSVNUTlNfQ1VSUkVOVF9VU0VSKVxuIDU1NjpcdFx0XHRucyA9IHRvX25zX2NvbW1vbihjdXJyZW50X3VzZXJfbnMoKSk7XG4gNTU3Olx0XHRlbHNlIGlmIChrbHMtXHUwMDNldXNlcl9uc19pZClcbiA1NTg6XHRcdFx0bnMgPSBsb29rdXBfbnNfaWQoa2xzLVx1MDAzZXVzZXJfbnNfaWQsIENMT05FX05FV1VTRVIpO1xuIDU1OTpcdFx0aWYgKCFucylcbiA1NjA6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNTYxOlx0XHRrbHMtXHUwMDNldXNlcl9ucyA9IHRvX3VzZXJfbnMobnMpO1xuIDU2MjpcdFxuIDU2MzpcdFx0LypcbiA1NjQ6XHRcdCAqIFVzZSB0aGUgcmJ0cmVlIHRvIGZpbmQgdGhlIGZpcnN0IG5hbWVzcGFjZSB3ZSBjYXJlIGFib3V0IGFuZFxuIDU2NTpcdFx0ICogdGhlbiB1c2UgaXQmIzM5O3MgbGlzdCBlbnRyeSB0byBpdGVyYXRlIGZyb20gdGhlcmUuXG4gNTY2Olx0XHQgKi9cbiA1Njc6XHRcdGlmIChrbHMtXHUwMDNlbGFzdF9uc19pZCkge1xuIDU2ODpcdFx0XHRrbHMtXHUwMDNlZmlyc3RfbnMgPSBsb29rdXBfbnNfb3duZXJfYXQoa2xzLVx1MDAzZWxhc3RfbnNfaWQgJiM0MzsgMSwgbnMpO1xuIDU2OTpcdFx0XHRpZiAoIWtscy1cdTAwM2VmaXJzdF9ucylcbiA1NzA6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiA1NzE6XHRcdFx0Zmlyc3RfbnMgPSBrbHMtXHUwMDNlZmlyc3RfbnM7XG4gNTcyOlx0XHR9XG4gNTczOlx0XG4gNTc0Olx0XHRyZXQgPSAwO1xuIDU3NTpcdFx0aGVhZCA9IFx1MDAyNnRvX25zX2NvbW1vbihrbHMtXHUwMDNldXNlcl9ucyktXHUwMDNlbnNfb3duZXJfcm9vdC5uc19saXN0X2hlYWQ7XG4gNTc2Olx0XHRrbHMtXHUwMDNldXNlcm5zX2NhcGFibGUgPSBtYXlfc2VlX2FsbF9uYW1lc3BhY2VzKCk7XG4gNTc3Olx0XG4gNTc4Olx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gNTc5Olx0XG4gNTgwOlx0XHRpZiAoIWZpcnN0X25zKVxuIDU4MTpcdFx0XHRmaXJzdF9ucyA9IGxpc3RfZW50cnlfcmN1KGhlYWQtXHUwMDNlbmV4dCwgdHlwZW9mKCpmaXJzdF9ucyksIG5zX293bmVyX25vZGUubnNfbGlzdF9lbnRyeSk7XG4gNTgyOlx0XG4gNTgzOlx0XHRucyA9IGZpcnN0X25zO1xuIDU4NDpcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tX3JjdShucywgaGVhZCwgbnNfb3duZXJfbm9kZS5uc19saXN0X2VudHJ5KSB7XG4gNTg1Olx0XHRcdHN0cnVjdCBuc19jb21tb24gKnZhbGlkO1xuIDU4NjpcdFxuIDU4NzpcdFx0XHRpZiAoIW5yX25zX2lkcylcbiA1ODg6XHRcdFx0XHRicmVhaztcbiA1ODk6XHRcbiA1OTA6XHRcdFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xuIDU5MTpcdFx0XHRpZiAoIXZhbGlkKVxuIDU5MjpcdFx0XHRcdGNvbnRpbnVlO1xuIDU5MzpcdFxuIDU5NDpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiA1OTU6XHRcbiA1OTY6XHRcdFx0bnNfcHV0KHByZXYpO1xuIDU5NzpcdFx0XHRwcmV2ID0gdmFsaWQ7XG4gNTk4Olx0XG4gNTk5Olx0XHRcdGlmIChwdXRfdXNlcih2YWxpZC1cdTAwM2Vuc19pZCwgbnNfaWRzICYjNDM7IHJldCkpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0ODAwCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUga2VybmVsL25zdHJlZS5jIGludmVzdGlnYXRpb24sIGJhc2VkIG9uIHRoZSBwcm9tcHQ6CgoqKkRpdmluZyBEZWVwZXIgaW50byBga2VybmVsL25zdHJlZS5jYCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgYSBkZWNlbnQgZ3Jhc3Agb24gd2hhdCBgbnN0cmVlLmNgICppcyogZnJvbSB0aGUgaW5pdGlhbCBnbGFuY2UsIGJ1dCBJIHJlYWxseSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbnRleHQuIEtub3dpbmcgdGhlIHB1cnBvc2UgaXMgb25lIHRoaW5nLCBidXQgaG93IGl0JiMzOTtzIGFjdHVhbGx5ICp1c2VkKiBpcyB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgaXRzIHJlYWwgaW1wYWN0LiBJIG5lZWQgdG8gc2VlIHRoZSByZXN0IG9mIHRoZSBmaWxlIHRvIGdyYXNwIGl0cyBpbnRlcm5hbCB3b3JraW5ncywgb2YgY291cnNlLCBidXQgbW9yZSBpbXBvcnRhbnRseSwgaG93IHRoZSBrZXJuZWwgaW50ZXJhY3RzIHdpdGggaXQsIGhvdyBpdCYjMzk7cyBsaW5rZWQsIGFuZCBob3cgaXQmIzM5O3MgY29uZmlndXJlZCBhcmUgd2hlcmUgSeKAmWxsIGZpbmQgdGhlIHRydWUgc2lnbmlmaWNhbmNlLiBJcyBpdCBhIGNvcmUgY29tcG9uZW50IG9yIG1vcmUgb2YgYSBzdXBwb3J0aW5nIGxpYnJhcnk/IFdoYXQgb3RoZXIgc3Vic3lzdGVtcyBkZXBlbmQgb24gaXQ/IEkmIzM5O20gdGhpbmtpbmcgSSBuZWVkIHRvIGZpbmQgdGhlIGNhbGxzIHRvIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGF0IGZpbGUuIEkgYW0gbG9va2luZyBmb3IgdGhlIGJyb2FkZXIgc3lzdGVtLWxldmVsIGludGVyYWN0aW9ucyBub3cuIFRoaXMgd2lsbCBzaGFwZSBteSBmaW5hbCBhbmFseXNpcy4gTGV0JiMzOTtzIHNlZSBob3cgdGhpcyB0aGluZyAqYWN0dWFsbHkqIHdvcmtzIGluIHRoZSBncmFuZCBzY2hlbWUgb2YgdGhpbmdzIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL25zdHJlZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHQvKiBDb3B5cmlnaHQgKGMpIDIwMjUgQ2hyaXN0aWFuIEJyYXVuZXIgXHUwMDNjYnJhdW5lckBrZXJuZWwub3JnXHUwMDNlICovXG4gICAzOlx0XG4gICA0Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvbnN0cmVlLmhcdTAwM2VcbiAgIDU6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9wcm9jX25zLmhcdTAwM2VcbiAgIDY6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VsaXN0LmhcdTAwM2VcbiAgIDc6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC92ZnNkZWJ1Zy5oXHUwMDNlXG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvc3lzY2FsbHMuaFx1MDAzZVxuICAgOTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3VzZXJfbmFtZXNwYWNlLmhcdTAwM2VcbiAgMTA6XHRcbiAgMTE6XHRzdGF0aWMgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NFUUxPQ0sobnNfdHJlZV9sb2NrKTtcbiAgMTI6XHRcbiAgMTM6XHRERUZJTkVfTE9DS19HVUFSRF8wKG5zX3RyZWVfd3JpdGVyLFxuICAxNDpcdFx0XHQgICAgd3JpdGVfc2VxbG9jayhcdTAwMjZuc190cmVlX2xvY2spLFxuICAxNTpcdFx0XHQgICAgd3JpdGVfc2VxdW5sb2NrKFx1MDAyNm5zX3RyZWVfbG9jaykpXG4gIDE2Olx0XG4gIDE3Olx0REVGSU5FX0xPQ0tfR1VBUkRfMChuc190cmVlX2xvY2tlZF9yZWFkZXIsXG4gIDE4Olx0XHRcdCAgICByZWFkX3NlcWxvY2tfZXhjbChcdTAwMjZuc190cmVlX2xvY2spLFxuICAxOTpcdFx0XHQgICAgcmVhZF9zZXF1bmxvY2tfZXhjbChcdTAwMjZuc190cmVlX2xvY2spKVxuICAyMDpcdFxuICAyMTpcdHN0YXRpYyBzdHJ1Y3QgbnNfdHJlZV9yb290IG5zX3VuaWZpZWRfcm9vdCA9IHsgLyogcHJvdGVjdGVkIGJ5IG5zX3RyZWVfbG9jayAqL1xuICAyMjpcdFx0Lm5zX3JiID0gUkJfUk9PVCxcbiAgMjM6XHRcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChuc191bmlmaWVkX3Jvb3QubnNfbGlzdF9oZWFkKSxcbiAgMjQ6XHR9O1xuICAyNTpcdFxuICAyNjpcdHN0cnVjdCBuc190cmVlX3Jvb3QgbW50X25zX3RyZWUgPSB7XG4gIDI3Olx0XHQubnNfcmIgPSBSQl9ST09ULFxuICAyODpcdFx0Lm5zX2xpc3RfaGVhZCA9IExJU1RfSEVBRF9JTklUKG1udF9uc190cmVlLm5zX2xpc3RfaGVhZCksXG4gIDI5Olx0fTtcbiAgMzA6XHRcbiAgMzE6XHRzdHJ1Y3QgbnNfdHJlZV9yb290IG5ldF9uc190cmVlID0ge1xuICAzMjpcdFx0Lm5zX3JiID0gUkJfUk9PVCxcbiAgMzM6XHRcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChuZXRfbnNfdHJlZS5uc19saXN0X2hlYWQpLFxuICAzNDpcdH07XG4gIDM1Olx0RVhQT1JUX1NZTUJPTF9HUEwobmV0X25zX3RyZWUpO1xuICAzNjpcdFxuICAzNzpcdHN0cnVjdCBuc190cmVlX3Jvb3QgdXRzX25zX3RyZWUgPSB7XG4gIDM4Olx0XHQubnNfcmIgPSBSQl9ST09ULFxuICAzOTpcdFx0Lm5zX2xpc3RfaGVhZCA9IExJU1RfSEVBRF9JTklUKHV0c19uc190cmVlLm5zX2xpc3RfaGVhZCksXG4gIDQwOlx0fTtcbiAgNDE6XHRcbiAgNDI6XHRzdHJ1Y3QgbnNfdHJlZV9yb290IHVzZXJfbnNfdHJlZSA9IHtcbiAgNDM6XHRcdC5uc19yYiA9IFJCX1JPT1QsXG4gIDQ0Olx0XHQubnNfbGlzdF9oZWFkID0gTElTVF9IRUFEX0lOSVQodXNlcl9uc190cmVlLm5zX2xpc3RfaGVhZCksXG4gIDQ1Olx0fTtcbiAgNDY6XHRcbiAgNDc6XHRzdHJ1Y3QgbnNfdHJlZV9yb290IGlwY19uc190cmVlID0ge1xuICA0ODpcdFx0Lm5zX3JiID0gUkJfUk9PVCxcbiAgNDk6XHRcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChpcGNfbnNfdHJlZS5uc19saXN0X2hlYWQpLFxuICA1MDpcdH07XG4gIDUxOlx0XG4gIDUyOlx0c3RydWN0IG5zX3RyZWVfcm9vdCBwaWRfbnNfdHJlZSA9IHtcbiAgNTM6XHRcdC5uc19yYiA9IFJCX1JPT1QsXG4gIDU0Olx0XHQubnNfbGlzdF9oZWFkID0gTElTVF9IRUFEX0lOSVQocGlkX25zX3RyZWUubnNfbGlzdF9oZWFkKSxcbiAgNTU6XHR9O1xuICA1NjpcdFxuICA1NzpcdHN0cnVjdCBuc190cmVlX3Jvb3QgY2dyb3VwX25zX3RyZWUgPSB7XG4gIDU4Olx0XHQubnNfcmIgPSBSQl9ST09ULFxuICA1OTpcdFx0Lm5zX2xpc3RfaGVhZCA9IExJU1RfSEVBRF9JTklUKGNncm91cF9uc190cmVlLm5zX2xpc3RfaGVhZCksXG4gIDYwOlx0fTtcbiAgNjE6XHRcbiAgNjI6XHRzdHJ1Y3QgbnNfdHJlZV9yb290IHRpbWVfbnNfdHJlZSA9IHtcbiAgNjM6XHRcdC5uc19yYiA9IFJCX1JPT1QsXG4gIDY0Olx0XHQubnNfbGlzdF9oZWFkID0gTElTVF9IRUFEX0lOSVQodGltZV9uc190cmVlLm5zX2xpc3RfaGVhZCksXG4gIDY1Olx0fTtcbiAgNjY6XHRcbiAgNjc6XHQvKipcbiAgNjg6XHQgKiBuc190cmVlX25vZGVfaW5pdCAtIEluaXRpYWxpemUgYSBuYW1lc3BhY2UgdHJlZSBub2RlXG4gIDY5Olx0ICogQG5vZGU6IFRoZSBub2RlIHRvIGluaXRpYWxpemVcbiAgNzA6XHQgKlxuICA3MTpcdCAqIEluaXRpYWxpemVzIGJvdGggdGhlIHJidHJlZSBub2RlIGFuZCBsaXN0IGVudHJ5LlxuICA3MjpcdCAqL1xuICA3MzpcdHZvaWQgbnNfdHJlZV9ub2RlX2luaXQoc3RydWN0IG5zX3RyZWVfbm9kZSAqbm9kZSlcbiAgNzQ6XHR7XG4gIDc1Olx0XHRSQl9DTEVBUl9OT0RFKFx1MDAyNm5vZGUtXHUwMDNlbnNfbm9kZSk7XG4gIDc2Olx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZub2RlLVx1MDAzZW5zX2xpc3RfZW50cnkpO1xuICA3NzpcdH1cbiAgNzg6XHRcbiAgNzk6XHQvKipcbiAgODA6XHQgKiBuc190cmVlX3Jvb3RfaW5pdCAtIEluaXRpYWxpemUgYSBuYW1lc3BhY2UgdHJlZSByb290XG4gIDgxOlx0ICogQHJvb3Q6IFRoZSByb290IHRvIGluaXRpYWxpemVcbiAgODI6XHQgKlxuICA4MzpcdCAqIEluaXRpYWxpemVzIGJvdGggdGhlIHJidHJlZSByb290IGFuZCBsaXN0IGhlYWQuXG4gIDg0Olx0ICovXG4gIDg1Olx0dm9pZCBuc190cmVlX3Jvb3RfaW5pdChzdHJ1Y3QgbnNfdHJlZV9yb290ICpyb290KVxuICA4NjpcdHtcbiAgODc6XHRcdHJvb3QtXHUwMDNlbnNfcmIgPSBSQl9ST09UO1xuICA4ODpcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cm9vdC1cdTAwM2Vuc19saXN0X2hlYWQpO1xuICA4OTpcdH1cbiAgOTA6XHRcbiAgOTE6XHQvKipcbiAgOTI6XHQgKiBuc190cmVlX25vZGVfZW1wdHkgLSBDaGVjayBpZiBhIG5hbWVzcGFjZSB0cmVlIG5vZGUgaXMgZW1wdHlcbiAgOTM6XHQgKiBAbm9kZTogVGhlIG5vZGUgdG8gY2hlY2tcbiAgOTQ6XHQgKlxuICA5NTpcdCAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBub3QgaW4gYW55IHRyZWUuXG4gIDk2Olx0ICovXG4gIDk3Olx0Ym9vbCBuc190cmVlX25vZGVfZW1wdHkoY29uc3Qgc3RydWN0IG5zX3RyZWVfbm9kZSAqbm9kZSlcbiAgOTg6XHR7XG4gIDk5Olx0XHRyZXR1cm4gUkJfRU1QVFlfTk9ERShcdTAwMjZub2RlLVx1MDAzZW5zX25vZGUpO1xuIDEwMDpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NTkyCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgQmFjayBpbnRvIGBrZXJuZWwvbnN0cmVlLmNgKioKCkFscmlnaHQsIGxldCYjMzk7cyBwaWNrIHVwIHdoZXJlIHdlIGxlZnQgb2ZmLCBvciByYXRoZXIsIHdoZXJlIEkgbGVmdCBvZmYgaW4gbXkgbWVudGFsIG1hcCBvZiB0aGUgYGtlcm5lbC9uc3RyZWUuY2AgaW1wbGVtZW50YXRpb24uIEkgbmVlZCB0byBnZXQgYmFjayBpbnRvIHRoZSBsYXR0ZXIgaGFsZiBvZiB0aGUgZmlsZSwgc3RhcnRpbmcgZnJvbSBsaW5lIDYwMC4gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgaW50cmljYWNpZXMgb2YgdGhlIG5hbWVzcGFjZSB0cmVlIHN0cnVjdHVyZSBhbmQgaG93IGl0IGhhbmRsZXMgcGF0aCByZXNvbHV0aW9uIGFuZCBuYW1lc3BhY2Ugb3BlcmF0aW9ucy4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgbG9va2luZyBmb3IgYW55dGhpbmcgdGhhdCBtaWdodCBzaGVkIGxpZ2h0IG9uIGhvdyB0aGV5IG1hbmFnZSBuZXN0ZWQgbmFtZXNwYWNlcyBhbmQgcG90ZW50aWFsIGVkZ2UgY2FzZXMgYXJvdW5kIG1vdW50IHByb3BhZ2F0aW9uLiBMZXQmIzM5O3Mgc2VlIGlmIHRoZXJlIGFyZSBhbnkgc3VidGxlIG9wdGltaXphdGlvbiB0ZWNobmlxdWVzIHVzZWQgaGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9uc3RyZWUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDYwMDpcdFx0XHRcdG5zX3B1dChwcmV2KTtcbiA2MDE6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiA2MDI6XHRcdFx0fVxuIDYwMzpcdFxuIDYwNDpcdFx0XHRucl9uc19pZHMtLTtcbiA2MDU6XHRcdFx0cmV0JiM0MzsmIzQzOztcbiA2MDY6XHRcbiA2MDc6XHRcdFx0cmN1X3JlYWRfbG9jaygpO1xuIDYwODpcdFx0fVxuIDYwOTpcdFxuIDYxMDpcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gNjExOlx0XHRuc19wdXQocHJldik7XG4gNjEyOlx0XHRyZXR1cm4gcmV0O1xuIDYxMzpcdH1cbiA2MTQ6XHRcbiA2MTU6XHQvKlxuIDYxNjpcdCAqIExvb2t1cCBhIG5hbWVzcGFjZSB3aXRoIGlkIFx1MDAzZT0gbnNfaWQgaW4gZWl0aGVyIHRoZSB1bmlmaWVkIHRyZWUgb3IgYSB0eXBlLXNwZWNpZmljIHRyZWUuXG4gNjE3Olx0ICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIHdpdGggdGhlIHNtYWxsZXN0IGlkIHRoYXQgaXMgXHUwMDNlPSBuc19pZC5cbiA2MTg6XHQgKi9cbiA2MTk6XHRzdGF0aWMgc3RydWN0IG5zX2NvbW1vbiAqbG9va3VwX25zX2lkX2F0KHU2NCBuc19pZCwgaW50IG5zX3R5cGUpXG4gNjIwOlx0e1xuIDYyMTpcdFx0c3RydWN0IG5zX2NvbW1vbiAqcmV0ID0gTlVMTDtcbiA2MjI6XHRcdHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUgPSBOVUxMO1xuIDYyMzpcdFx0c3RydWN0IHJiX25vZGUgKm5vZGU7XG4gNjI0Olx0XG4gNjI1Olx0XHRpZiAobnNfdHlwZSkge1xuIDYyNjpcdFx0XHRuc190cmVlID0gbnNfdHJlZV9mcm9tX3R5cGUobnNfdHlwZSk7XG4gNjI3Olx0XHRcdGlmICghbnNfdHJlZSlcbiA2Mjg6XHRcdFx0XHRyZXR1cm4gTlVMTDtcbiA2Mjk6XHRcdH1cbiA2MzA6XHRcbiA2MzE6XHRcdGd1YXJkKG5zX3RyZWVfbG9ja2VkX3JlYWRlcikoKTtcbiA2MzI6XHRcbiA2MzM6XHRcdGlmIChuc190cmVlKVxuIDYzNDpcdFx0XHRub2RlID0gbnNfdHJlZS1cdTAwM2Vuc19yYi5yYl9ub2RlO1xuIDYzNTpcdFx0ZWxzZVxuIDYzNjpcdFx0XHRub2RlID0gbnNfdW5pZmllZF9yb290Lm5zX3JiLnJiX25vZGU7XG4gNjM3Olx0XG4gNjM4Olx0XHR3aGlsZSAobm9kZSkge1xuIDYzOTpcdFx0XHRzdHJ1Y3QgbnNfY29tbW9uICpucztcbiA2NDA6XHRcbiA2NDE6XHRcdFx0aWYgKG5zX3R5cGUpXG4gNjQyOlx0XHRcdFx0bnMgPSBub2RlX3RvX25zKG5vZGUpO1xuIDY0MzpcdFx0XHRlbHNlXG4gNjQ0Olx0XHRcdFx0bnMgPSBub2RlX3RvX25zX3VuaWZpZWQobm9kZSk7XG4gNjQ1Olx0XG4gNjQ2Olx0XHRcdGlmIChuc19pZCBcdTAwM2M9IG5zLVx1MDAzZW5zX2lkKSB7XG4gNjQ3Olx0XHRcdFx0aWYgKG5zX3R5cGUpXG4gNjQ4Olx0XHRcdFx0XHRyZXQgPSBub2RlX3RvX25zKG5vZGUpO1xuIDY0OTpcdFx0XHRcdGVsc2VcbiA2NTA6XHRcdFx0XHRcdHJldCA9IG5vZGVfdG9fbnNfdW5pZmllZChub2RlKTtcbiA2NTE6XHRcdFx0XHRpZiAobnNfaWQgPT0gbnMtXHUwMDNlbnNfaWQpXG4gNjUyOlx0XHRcdFx0XHRicmVhaztcbiA2NTM6XHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9sZWZ0O1xuIDY1NDpcdFx0XHR9IGVsc2Uge1xuIDY1NTpcdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX3JpZ2h0O1xuIDY1NjpcdFx0XHR9XG4gNjU3Olx0XHR9XG4gNjU4Olx0XG4gNjU5Olx0XHRpZiAocmV0KVxuIDY2MDpcdFx0XHRyZXQgPSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKHJldCk7XG4gNjYxOlx0XHRyZXR1cm4gcmV0O1xuIDY2MjpcdH1cbiA2NjM6XHRcbiA2NjQ6XHRzdGF0aWMgaW5saW5lIHN0cnVjdCBuc19jb21tb24gKmZpcnN0X25zX2NvbW1vbihjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLFxuIDY2NTpcdFx0XHRcdFx0XHRcdHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUpXG4gNjY2Olx0e1xuIDY2NzpcdFx0aWYgKG5zX3RyZWUpXG4gNjY4Olx0XHRcdHJldHVybiBsaXN0X2VudHJ5X3JjdShoZWFkLVx1MDAzZW5leHQsIHN0cnVjdCBuc19jb21tb24sIG5zX3RyZWVfbm9kZS5uc19saXN0X2VudHJ5KTtcbiA2Njk6XHRcdHJldHVybiBsaXN0X2VudHJ5X3JjdShoZWFkLVx1MDAzZW5leHQsIHN0cnVjdCBuc19jb21tb24sIG5zX3VuaWZpZWRfbm9kZS5uc19saXN0X2VudHJ5KTtcbiA2NzA6XHR9XG4gNjcxOlx0XG4gNjcyOlx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpuZXh0X25zX2NvbW1vbihzdHJ1Y3QgbnNfY29tbW9uICpucyxcbiA2NzM6XHRcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUpXG4gNjc0Olx0e1xuIDY3NTpcdFx0aWYgKG5zX3RyZWUpXG4gNjc2Olx0XHRcdHJldHVybiBsaXN0X2VudHJ5X3JjdShucy1cdTAwM2Vuc190cmVlX25vZGUubnNfbGlzdF9lbnRyeS5uZXh0LCBzdHJ1Y3QgbnNfY29tbW9uLCBuc190cmVlX25vZGUubnNfbGlzdF9lbnRyeSk7XG4gNjc3Olx0XHRyZXR1cm4gbGlzdF9lbnRyeV9yY3UobnMtXHUwMDNlbnNfdW5pZmllZF9ub2RlLm5zX2xpc3RfZW50cnkubmV4dCwgc3RydWN0IG5zX2NvbW1vbiwgbnNfdW5pZmllZF9ub2RlLm5zX2xpc3RfZW50cnkpO1xuIDY3ODpcdH1cbiA2Nzk6XHRcbiA2ODA6XHRzdGF0aWMgaW5saW5lIGJvb2wgbnNfY29tbW9uX2lzX2hlYWQoc3RydWN0IG5zX2NvbW1vbiAqbnMsXG4gNjgxOlx0XHRcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsXG4gNjgyOlx0XHRcdFx0XHQgICAgIHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUpXG4gNjgzOlx0e1xuIDY4NDpcdFx0aWYgKG5zX3RyZWUpXG4gNjg1Olx0XHRcdHJldHVybiBcdTAwMjZucy1cdTAwM2Vuc190cmVlX25vZGUubnNfbGlzdF9lbnRyeSA9PSBoZWFkO1xuIDY4NjpcdFx0cmV0dXJuIFx1MDAyNm5zLVx1MDAzZW5zX3VuaWZpZWRfbm9kZS5uc19saXN0X2VudHJ5ID09IGhlYWQ7XG4gNjg3Olx0fVxuIDY4ODpcdFxuIDY4OTpcdHN0YXRpYyBzc2l6ZV90IGRvX2xpc3RucyhzdHJ1Y3Qga2xpc3RucyAqa2xzKVxuIDY5MDpcdHtcbiA2OTE6XHRcdHU2NCBfX3VzZXIgKm5zX2lkcyA9IGtscy1cdTAwM2V1bnNfaWRzO1xuIDY5MjpcdFx0c2l6ZV90IG5yX25zX2lkcyA9IGtscy1cdTAwM2Vucl9uc19pZHM7XG4gNjkzOlx0XHRzdHJ1Y3QgbnNfY29tbW9uICpucywgKmZpcnN0X25zID0gTlVMTCwgKnByZXYgPSBOVUxMO1xuIDY5NDpcdFx0c3RydWN0IG5zX3RyZWVfcm9vdCAqbnNfdHJlZSA9IE5VTEw7XG4gNjk1Olx0XHRjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkO1xuIDY5NjpcdFx0dTMyIG5zX3R5cGU7XG4gNjk3Olx0XHRzc2l6ZV90IHJldDtcbiA2OTg6XHRcbiA2OTk6XHRcdGlmIChod2VpZ2h0MzIoa2xzLVx1MDAzZW5zX3R5cGUpID09IDEpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODMwMAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSByZXN0IG9mIGBrZXJuZWwvbnN0cmVlLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIG1vZHVsZSYjMzk7cyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBzeXN0ZW0gY2FsbHMgYW5kIGFueSBvdGhlciBrZXkgZnVuY3Rpb25zLiBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGlkZW50aWZ5aW5nIHRoZSBlbnRyeSBwb2ludHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gbXkgY3VycmVudCBhbmFseXNpcy4gVW5kZXJzdGFuZGluZyB0aGVzZSBlbnRyeSBwb2ludHMgaXMgY3J1Y2lhbCBmb3IgdHJhY2luZyB0aGUgZXhlY3V0aW9uIGZsb3cgYW5kIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBuYW1lc3BhY2UgdHJlZSBpcyB1dGlsaXplZCBieSB0aGUga2VybmVsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9uc3RyZWUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDcwMDpcdFx0XHRuc190eXBlID0ga2xzLVx1MDAzZW5zX3R5cGU7XG4gNzAxOlx0XHRlbHNlXG4gNzAyOlx0XHRcdG5zX3R5cGUgPSAwO1xuIDcwMzpcdFxuIDcwNDpcdFx0aWYgKG5zX3R5cGUpIHtcbiA3MDU6XHRcdFx0bnNfdHJlZSA9IG5zX3RyZWVfZnJvbV90eXBlKG5zX3R5cGUpO1xuIDcwNjpcdFx0XHRpZiAoIW5zX3RyZWUpXG4gNzA3Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNzA4Olx0XHR9XG4gNzA5Olx0XG4gNzEwOlx0XHRpZiAoa2xzLVx1MDAzZWxhc3RfbnNfaWQpIHtcbiA3MTE6XHRcdFx0a2xzLVx1MDAzZWZpcnN0X25zID0gbG9va3VwX25zX2lkX2F0KGtscy1cdTAwM2VsYXN0X25zX2lkICYjNDM7IDEsIG5zX3R5cGUpO1xuIDcxMjpcdFx0XHRpZiAoIWtscy1cdTAwM2VmaXJzdF9ucylcbiA3MTM6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiA3MTQ6XHRcdFx0Zmlyc3RfbnMgPSBrbHMtXHUwMDNlZmlyc3RfbnM7XG4gNzE1Olx0XHR9XG4gNzE2Olx0XG4gNzE3Olx0XHRyZXQgPSAwO1xuIDcxODpcdFx0aWYgKG5zX3RyZWUpXG4gNzE5Olx0XHRcdGhlYWQgPSBcdTAwMjZuc190cmVlLVx1MDAzZW5zX2xpc3RfaGVhZDtcbiA3MjA6XHRcdGVsc2VcbiA3MjE6XHRcdFx0aGVhZCA9IFx1MDAyNm5zX3VuaWZpZWRfcm9vdC5uc19saXN0X2hlYWQ7XG4gNzIyOlx0XG4gNzIzOlx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gNzI0Olx0XG4gNzI1Olx0XHRpZiAoIWZpcnN0X25zKVxuIDcyNjpcdFx0XHRmaXJzdF9ucyA9IGZpcnN0X25zX2NvbW1vbihoZWFkLCBuc190cmVlKTtcbiA3Mjc6XHRcbiA3Mjg6XHRcdGZvciAobnMgPSBmaXJzdF9uczsgIW5zX2NvbW1vbl9pc19oZWFkKG5zLCBoZWFkLCBuc190cmVlKSBcdTAwMjZcdTAwMjYgbnJfbnNfaWRzO1xuIDcyOTpcdFx0ICAgICBucyA9IG5leHRfbnNfY29tbW9uKG5zLCBuc190cmVlKSkge1xuIDczMDpcdFx0XHRzdHJ1Y3QgbnNfY29tbW9uICp2YWxpZDtcbiA3MzE6XHRcbiA3MzI6XHRcdFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xuIDczMzpcdFx0XHRpZiAoIXZhbGlkKVxuIDczNDpcdFx0XHRcdGNvbnRpbnVlO1xuIDczNTpcdFxuIDczNjpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiA3Mzc6XHRcbiA3Mzg6XHRcdFx0bnNfcHV0KHByZXYpO1xuIDczOTpcdFx0XHRwcmV2ID0gdmFsaWQ7XG4gNzQwOlx0XG4gNzQxOlx0XHRcdGlmIChwdXRfdXNlcih2YWxpZC1cdTAwM2Vuc19pZCwgbnNfaWRzICYjNDM7IHJldCkpIHtcbiA3NDI6XHRcdFx0XHRuc19wdXQocHJldik7XG4gNzQzOlx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gNzQ0Olx0XHRcdH1cbiA3NDU6XHRcbiA3NDY6XHRcdFx0bnJfbnNfaWRzLS07XG4gNzQ3Olx0XHRcdHJldCYjNDM7JiM0Mzs7XG4gNzQ4Olx0XG4gNzQ5Olx0XHRcdHJjdV9yZWFkX2xvY2soKTtcbiA3NTA6XHRcdH1cbiA3NTE6XHRcbiA3NTI6XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIDc1MzpcdFx0bnNfcHV0KHByZXYpO1xuIDc1NDpcdFx0cmV0dXJuIHJldDtcbiA3NTU6XHR9XG4gNzU2Olx0XG4gNzU3Olx0U1lTQ0FMTF9ERUZJTkU0KGxpc3RucywgY29uc3Qgc3RydWN0IG5zX2lkX3JlcSBfX3VzZXIgKiwgcmVxLFxuIDc1ODpcdFx0XHR1NjQgX191c2VyICosIG5zX2lkcywgc2l6ZV90LCBucl9uc19pZHMsIHVuc2lnbmVkIGludCwgZmxhZ3MpXG4gNzU5Olx0e1xuIDc2MDpcdFx0c3RydWN0IGtsaXN0bnMga2xucyBfX2ZyZWUoa2xpc3Ruc19mcmVlKSA9IHt9O1xuIDc2MTpcdFx0Y29uc3Qgc2l6ZV90IG1heGNvdW50ID0gMTAwMDAwMDtcbiA3NjI6XHRcdHN0cnVjdCBuc19pZF9yZXEga3JlcTtcbiA3NjM6XHRcdHNzaXplX3QgcmV0O1xuIDc2NDpcdFxuIDc2NTpcdFx0aWYgKGZsYWdzKVxuIDc2NjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA3Njc6XHRcbiA3Njg6XHRcdGlmICh1bmxpa2VseShucl9uc19pZHMgXHUwMDNlIG1heGNvdW50KSlcbiA3Njk6XHRcdFx0cmV0dXJuIC1FT1ZFUkZMT1c7XG4gNzcwOlx0XG4gNzcxOlx0XHRpZiAoIWFjY2Vzc19vayhuc19pZHMsIG5yX25zX2lkcyAqIHNpemVvZigqbnNfaWRzKSkpXG4gNzcyOlx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDc3MzpcdFxuIDc3NDpcdFx0cmV0ID0gY29weV9uc19pZF9yZXEocmVxLCBcdTAwMjZrcmVxKTtcbiA3NzU6XHRcdGlmIChyZXQpXG4gNzc2Olx0XHRcdHJldHVybiByZXQ7XG4gNzc3Olx0XG4gNzc4Olx0XHRyZXQgPSBwcmVwYXJlX2tsaXN0bnMoXHUwMDI2a2xucywgXHUwMDI2a3JlcSwgbnNfaWRzLCBucl9uc19pZHMpO1xuIDc3OTpcdFx0aWYgKHJldClcbiA3ODA6XHRcdFx0cmV0dXJuIHJldDtcbiA3ODE6XHRcbiA3ODI6XHRcdGlmIChrcmVxLnVzZXJfbnNfaWQpXG4gNzgzOlx0XHRcdHJldHVybiBkb19saXN0bnNfdXNlcm5zKFx1MDAyNmtsbnMpO1xuIDc4NDpcdFxuIDc4NTpcdFx0cmV0dXJuIGRvX2xpc3RucyhcdTAwMjZrbG5zKTtcbiA3ODY6XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk2NTAKCQkJCQkJCW91dHB1dDogMTgKCQkJCQkJCXRob3VnaHRzOiAyMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBCdWlsZCBDb25maWd1cmF0aW9uIGZvciBga2VybmVsL25zdHJlZS5jYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbi4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGJ1aWxkIHByb2Nlc3MgZm9yIGBrZXJuZWwvbnN0cmVlLmNgLiBJJiMzOTttIGdvaW5nIHRvIHN0YXJ0IGJ5IHRyYWNpbmcgaXRzIGNvbXBpbGF0aW9uLiBNeSBwcmltYXJ5IGdvYWwgaGVyZSBpcyB0byBkZXRlcm1pbmUgd2hpY2ggY29uZmlndXJhdGlvbiBvcHRpb25zIG9yIGRlcGVuZGVuY2llcyBhcmUgKnJlcXVpcmVkKiBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgdG8gYmUgc3VjY2Vzc2Z1bGx5IGJ1aWx0LiBJcyBpdCBwYXJ0IG9mIGEgc3BlY2lmaWMgc3Vic3lzdGVtLCBvciBpcyBpdCBtb3JlIGJyb2FkbHkgYXBwbGljYWJsZT8gVW5kZXJzdGFuZGluZyB0aGUgZGVwZW5kZW5jaWVzIHdpbGwgYWxsb3cgbWUgdG8sIGZvciBleGFtcGxlLCB1bmRlcnN0YW5kIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHQgZm9yIHRoZSBidWlsZC4gV2hlcmUgZG9lcyB0aGlzIGZpbGUgZml0IGluPyBJcyBpdCBsaW5rZWQgZHluYW1pY2FsbHkgb3Igc3RhdGljYWxseSwgYW5kIGhvdyBkb2VzIHRoYXQgYWZmZWN0IHRoZSBuZWVkZWQgY29uZmlndXJhdGlvbnM/IEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIGl0cyBpbnRlZ3JhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bnN0cmVlXFwubyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvTWFrZWZpbGU9Nj1vYmoteSAgICAgPSBmb3JrLm8gZXhlY19kb21haW4ubyBleGVjX3N0YXRlLm8gcGFuaWMubyBcXFxuLS1cbmtlcm5lbC9NYWtlZmlsZS0xMC1cdCAgICBleHRhYmxlLm8gcGFyYW1zLm8gXFxcbmtlcm5lbC9NYWtlZmlsZToxMTpcdCAgICBrdGhyZWFkLm8gc3lzX25pLm8gbnNwcm94eS5vIG5zdHJlZS5vIG5zY29tbW9uLm8gXFxcbmtlcm5lbC9NYWtlZmlsZS0xMi1cdCAgICBub3RpZmllci5vIGtzeXNmcy5vIGNyZWQubyByZWJvb3QubyBcXFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5OTY2CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyB0aGUgYG5zdHJlZS5vYCBPYmplY3QgRmlsZSoqCgpPa2F5LCBzbyBgbnN0cmVlLm9gIGlzIGRlZmluaXRlbHkgY29tcGlsZWQgYW5kIGxpbmtlZCBpbnRvIHRoZSBrZXJuZWwsIHNwZWNpZmljYWxseSByZXNpZGluZyB3aXRoaW4gYG9iai15YCBpbiB0aGUgYGtlcm5lbC9NYWtlZmlsZWAuIFRoYXQmIzM5O3MgdGhlIHN0YXJ0aW5nIHBvaW50LiBNeSBuZXh0IG1vdmUgaXMgdG8gY2hlY2sgZm9yIGFueSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIEkgbmVlZCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBLY29uZmlnIGVudHJpZXMgcmVsYXRlZCB0byAmIzM0O2xpc3RucywmIzM0OyAmIzM0O25zdHJlZSwmIzM0OyBvciBwZXJoYXBzIGV2ZW4gJiMzNDtuYW1lc3BhY2VzJiMzNDsgaW4gZ2VuZXJhbC4gVGhvc2UgYXJlIHRoZSBvYnZpb3VzIGxlYWRzLiBBZnRlciB0aGF0LCBJIHdpbGwgbW92ZSB0byB0aGUgc291cmNlIGNvZGUgaXRzZWxmIHRvIGluc3BlY3QgdGhlIGltcGxlbWVudGF0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIGRpZyBpbnRvIHRoZSBga2VybmVsL25zdHJlZS5jYCBmaWxlLCBhbmQgcHJvYmFibHkgYWxzbyB0YWtlIGEgbG9vayBhdCBgaW5jbHVkZS9saW51eC9uc3RyZWUuaGAgdG8gc2VlIGhvdyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGFuZCB3aGF0IHRoZSBwdWJsaWMgaW50ZXJmYWNlIGxvb2tzIGxpa2UuIFRoYXQgd2lsbCBwcm92aWRlIGluc2lnaHQgaW50byBob3cgdGhpcyB0aGluZyBpcyBhY3R1YWxseSBiZWluZyB1c2VkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9uc3RyZWUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDgwOlx0XHRcdFx0cmV0ID0gbnM7XG4gNDgxOlx0XHRcdFx0aWYgKG5zX2lkID09IG5zLVx1MDAzZW5zX2lkKVxuIDQ4MjpcdFx0XHRcdFx0YnJlYWs7XG4gNDgzOlx0XHRcdFx0bm9kZSA9IG5vZGUtXHUwMDNlcmJfbGVmdDtcbiA0ODQ6XHRcdFx0fSBlbHNlIHtcbiA0ODU6XHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9yaWdodDtcbiA0ODY6XHRcdFx0fVxuIDQ4NzpcdFx0fVxuIDQ4ODpcdFxuIDQ4OTpcdFx0aWYgKHJldClcbiA0OTA6XHRcdFx0cmV0ID0gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShyZXQpO1xuIDQ5MTpcdFx0cmV0dXJuIHJldDtcbiA0OTI6XHR9XG4gNDkzOlx0XG4gNDk0Olx0c3RhdGljIHN0cnVjdCBuc19jb21tb24gKmxvb2t1cF9uc19pZCh1NjQgbW50X25zX2lkLCBpbnQgbnNfdHlwZSlcbiA0OTU6XHR7XG4gNDk2Olx0XHRzdHJ1Y3QgbnNfY29tbW9uICpucztcbiA0OTc6XHRcbiA0OTg6XHRcdGd1YXJkKHJjdSkoKTtcbiA0OTk6XHRcdG5zID0gbnNfdHJlZV9sb29rdXBfcmN1KG1udF9uc19pZCwgbnNfdHlwZSk7XG4gNTAwOlx0XHRpZiAoIW5zKVxuIDUwMTpcdFx0XHRyZXR1cm4gTlVMTDtcbiA1MDI6XHRcbiA1MDM6XHRcdGlmICghbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShucykpXG4gNTA0Olx0XHRcdHJldHVybiBOVUxMO1xuIDUwNTpcdFxuIDUwNjpcdFx0cmV0dXJuIG5zO1xuIDUwNzpcdH1cbiA1MDg6XHRcbiA1MDk6XHRzdGF0aWMgaW5saW5lIGJvb2wgX19tdXN0X2NoZWNrIG5zX3JlcXVlc3RlZChjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxuIDUxMDpcdFx0XHRcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zKVxuIDUxMTpcdHtcbiA1MTI6XHRcdHJldHVybiAha2xzLVx1MDAzZW5zX3R5cGUgfHwgKGtscy1cdTAwM2Vuc190eXBlIFx1MDAyNiBucy1cdTAwM2Vuc190eXBlKTtcbiA1MTM6XHR9XG4gNTE0Olx0XG4gNTE1Olx0c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBtYXlfbGlzdF9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxuIDUxNjpcdFx0XHRcdFx0XHQgICAgc3RydWN0IG5zX2NvbW1vbiAqbnMpXG4gNTE3Olx0e1xuIDUxODpcdFx0aWYgKGtscy1cdTAwM2V1c2VyX25zIFx1MDAyNlx1MDAyNiBrbHMtXHUwMDNldXNlcm5zX2NhcGFibGUpXG4gNTE5Olx0XHRcdHJldHVybiB0cnVlO1xuIDUyMDpcdFx0aWYgKGlzX2N1cnJlbnRfbmFtZXNwYWNlKG5zKSlcbiA1MjE6XHRcdFx0cmV0dXJuIHRydWU7XG4gNTIyOlx0XHRyZXR1cm4gbWF5X3NlZV9hbGxfbmFtZXNwYWNlcygpO1xuIDUyMzpcdH1cbiA1MjQ6XHRcbiA1MjU6XHRzdGF0aWMgaW5saW5lIHZvaWQgbnNfcHV0KHN0cnVjdCBuc19jb21tb24gKm5zKVxuIDUyNjpcdHtcbiA1Mjc6XHRcdGlmIChucyBcdTAwMjZcdTAwMjYgbnMtXHUwMDNlb3BzKVxuIDUyODpcdFx0XHRucy1cdTAwM2VvcHMtXHUwMDNlcHV0KG5zKTtcbiA1Mjk6XHR9XG4gNTMwOlx0XG4gNTMxOlx0REVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxuIDUzMjpcdFxuIDUzMzpcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5zX2NvbW1vbiAqX19tdXN0X2NoZWNrIGxlZ2l0aW1pemVfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbiA1MzQ6XHRcdFx0XHRcdFx0XHRcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcbiA1MzU6XHR7XG4gNTM2Olx0XHRpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpXG4gNTM3Olx0XHRcdHJldHVybiBOVUxMO1xuIDUzODpcdFxuIDUzOTpcdFx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIGNhbmRpZGF0ZSkpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMDgwCgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogNDg2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYGxlZ2l0aW1pemVfbnNgIENoYW5nZSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gc2VlIHRoZSBmdW5jdGlvbmFsIGNoYW5nZXMgaW4gYGxlZ2l0aW1pemVfbnNgIGFuZCB0aGUgcmF0aW9uYWxlIGZvciB0aGUgcGF0Y2guIExvb2tpbmcgYXQgdGhlIGNvZGUsIHByZXZpb3VzbHksIHRoZSBmdW5jdGlvbiBoYWQgYSBzcGVjaWZpYyBmbG93LiBJdCBmaXJzdCBhdHRlbXB0ZWQgdG8gYWNxdWlyZSBhIHJlZmVyZW5jZSB1c2luZyBgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpYCwgYW5kIHRoZW4sIGNvbmRpdGlvbmFsbHksIGl0IGNoZWNrZWQgYG1heV9saXN0X25zKGtscywgbnMpYC4gSWYgYG1heV9saXN0X25zYCBmYWlsZWQsIHRoZSBjb2RlIHdvdWxkIHJlbGVhc2UgdGhhdCByZWZlcmVuY2UuIE5vdywgdGhlIGxvZ2ljIGlzIGRpZmZlcmVudC4gVGhlIGNyaXRpY2FsIGNoYW5nZSBpcyB0aGUgcmVvcmRlcmluZyBvZiBvcGVyYXRpb25zLiBJdCBub3cgY2hlY2tzIGBtYXlfbGlzdF9ucyhrbHMsIGNhbmRpZGF0ZSlgICpiZWZvcmUqIHRha2luZyB0aGUgcmVmZXJlbmNlIHZpYSBgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpYC4gU28sIHJhdGhlciB0aGFuIGluY3JlbWVudGluZyBhIHJlZmVyZW5jZSBhbmQgcG90ZW50aWFsbHkgcmVsZWFzaW5nIGl0LCB0aGUgbmV3IGZsb3cgYXZvaWRzIGluY3JlbWVudGluZyBpZiB0aGUgbGlzdCBjaGVjayB3b3VsZCByZWplY3QgdGhlIG5hbWVzcGFjZS4KClRoZSBrZXkgaXMgYG1heV9saXN0X25zYC4gTG9va2luZyBhdCB0aGF0IGZ1bmN0aW9uLCBpdCYjMzk7cyBwcmV0dHkgY2xlYXIuIEl0IGNoZWNrcyBpZiB0aGUgYGtsc2AgaGFzIGEgdXNlciBuYW1lc3BhY2UgYW5kIHRoZSB1c2VyIG5hbWVzcGFjZSBoYXMgdGhlIHByb3BlciBjYXBhYmlsaXRpZXMuIElmIHNvLCBpdCByZXR1cm5zIHRydWUsIGluZGljYXRpbmcgdGhhdCB0aGUgbmFtZXNwYWNlIGNhbiBiZSBsaXN0ZWQuIEl0IGFsc28gYWxsb3dzIGxpc3RpbmcgaWYgdGhlIHByb3ZpZGVkIG5hbWVzcGFjZSBpcyB0aGUgY3VycmVudCBuYW1lc3BhY2UsIHVzaW5nIHRoZSBmdW5jdGlvbiBgaXNfY3VycmVudF9uYW1lc3BhY2UobnMpYC4gTGFzdGx5LCBpZiB0aGUgZW52aXJvbm1lbnQgYWxsb3dzIHNlZWluZyBhbGwgbmFtZXNwYWNlcywgaXQgcmV0dXJucyB0cnVlLgoKU28sIGluIGVzc2VuY2UsIHRoZSBwYXRjaCBvcHRpbWl6ZWQgdGhpcyBmdW5jdGlvbiB0byBjaGVjayBwZXJtaXNzaW9ucyAqYmVmb3JlKiBhY3F1aXJpbmcgdGhlIHJlZmVyZW5jZS4gSSBub3cgbmVlZCB0byBkaXZlIGludG8gYGlzX2N1cnJlbnRfbmFtZXNwYWNlYCB0byBmdWxseSBhc3Nlc3MgdGhlIGNvbnNlcXVlbmNlcyBvZiB0aGlzIGNoYW5nZSwgYW5kIGhvdyBpdCBhbGlnbnMgd2l0aCB0aGUgb3ZlcmFsbCBkZXNpZ24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lzX2N1cnJlbnRfbmFtZXNwYWNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL25zZnMuYz00NTY9c3RhdGljIGludCBuc2ZzX2VuY29kZV9maChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgKmZoLCBpbnQgKm1heF9sZW4sXG4tLVxuZnMvbnNmcy5jLTQ3OC1cbmZzL25zZnMuYzo0Nzk6Ym9vbCBpc19jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3QgbnNfY29tbW9uICpucylcbmZzL25zZnMuYy00ODAte1xuLS1cbmluY2x1ZGUvbGludXgvbnNfY29tbW9uLmgtMTAtXG5pbmNsdWRlL2xpbnV4L25zX2NvbW1vbi5oOjExOmJvb2wgaXNfY3VycmVudF9uYW1lc3BhY2Uoc3RydWN0IG5zX2NvbW1vbiAqbnMpO1xuaW5jbHVkZS9saW51eC9uc19jb21tb24uaC0xMi1pbnQgX19uc19jb21tb25faW5pdChzdHJ1Y3QgbnNfY29tbW9uICpucywgdTMyIG5zX3R5cGUsIGNvbnN0IHN0cnVjdCBwcm9jX25zX29wZXJhdGlvbnMgKm9wcywgaW50IGludW0pO1xuLS1cbmtlcm5lbC9uc3RyZWUuYz01MTU9c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBtYXlfbGlzdF9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxuLS1cbmtlcm5lbC9uc3RyZWUuYy01MTktXHRcdHJldHVybiB0cnVlO1xua2VybmVsL25zdHJlZS5jOjUyMDpcdGlmIChpc19jdXJyZW50X25hbWVzcGFjZShucykpXG5rZXJuZWwvbnN0cmVlLmMtNTIxLVx0XHRyZXR1cm4gdHJ1ZTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIyMjAKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBJJiMzOTttIHRoaW5raW5nIGFib3V0IGBmcy9uc2ZzLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNDc5LiBUaGlzIGxpa2VseSByZWxhdGVzIHRvIHNvbWUgYXNwZWN0IG9mIHRoZSBuYW1lc3BhY2UgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb24uIEdpdmVuIG15IGV4cGVydGlzZSwgSSYjMzk7bSBhbHJlYWR5IGFudGljaXBhdGluZyB3aGF0IHRoYXQgYXJlYSBtaWdodCBjb3Zlci4gSXMgaXQgcmVsYXRlZCB0byBpbm9kZSBhbGxvY2F0aW9uLCBwZXJtaXNzaW9uIGNoZWNraW5nLCBtb3VudCBvcGVyYXRpb25zLCBvciBwZXJoYXBzIHNvbWUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdmlydHVhbCBmaWxlc3lzdGVtIGxheWVyPyBJJiMzOTtsbCBwcm9iYWJseSBzdGFydCBzY2FubmluZyBmb3IgZnVuY3Rpb24gY2FsbHMgb3IgY29uZGl0aW9uYWwgc3RhdGVtZW50cyB0aGVyZSBhbmQgdHJ5IHRvIHVuZGVyc3RhbmQgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuIEl0IGNvdWxkIGJlIGEgY3J1Y2lhbCBwaWVjZSBvZiB0aGUgcHV6emxlIEkmIzM5O20gdHJ5aW5nIHRvIHNvbHZlLCBvciBpdCBjb3VsZCBqdXN0IHByb3ZpZGUgc29tZSB1c2VmdWwgY29udGV4dC4gTGV0IG1lIGV4YW1pbmUgdGhlIGNvZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvbnNmcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDcwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0NzA6XHRcdFx0Km1heF9sZW4gPSBOU0ZTX0ZJRF9TSVpFX1UzMl9MQVRFU1Q7XG4gNDcxOlx0XHR9XG4gNDcyOlx0XG4gNDczOlx0XHRmaWQtXHUwMDNlbnNfaWRcdD0gbnMtXHUwMDNlbnNfaWQ7XG4gNDc0Olx0XHRmaWQtXHUwMDNlbnNfdHlwZVx0PSBucy1cdTAwM2Vuc190eXBlO1xuIDQ3NTpcdFx0ZmlkLVx1MDAzZW5zX2ludW1cdD0gaW5vZGUtXHUwMDNlaV9pbm87XG4gNDc2Olx0XHRyZXR1cm4gRklMRUlEX05TRlM7XG4gNDc3Olx0fVxuIDQ3ODpcdFxuIDQ3OTpcdGJvb2wgaXNfY3VycmVudF9uYW1lc3BhY2Uoc3RydWN0IG5zX2NvbW1vbiAqbnMpXG4gNDgwOlx0e1xuIDQ4MTpcdFx0c3dpdGNoIChucy1cdTAwM2Vuc190eXBlKSB7XG4gNDgyOlx0I2lmZGVmIENPTkZJR19DR1JPVVBTXG4gNDgzOlx0XHRjYXNlIENMT05FX05FV0NHUk9VUDpcbiA0ODQ6XHRcdFx0cmV0dXJuIGN1cnJlbnRfaW5fbmFtZXNwYWNlKHRvX2NnX25zKG5zKSk7XG4gNDg1Olx0I2VuZGlmXG4gNDg2Olx0I2lmZGVmIENPTkZJR19JUENfTlNcbiA0ODc6XHRcdGNhc2UgQ0xPTkVfTkVXSVBDOlxuIDQ4ODpcdFx0XHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9faXBjX25zKG5zKSk7XG4gNDg5Olx0I2VuZGlmXG4gNDkwOlx0XHRjYXNlIENMT05FX05FV05TOlxuIDQ5MTpcdFx0XHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fbW50X25zKG5zKSk7XG4gNDkyOlx0I2lmZGVmIENPTkZJR19ORVRfTlNcbiA0OTM6XHRcdGNhc2UgQ0xPTkVfTkVXTkVUOlxuIDQ5NDpcdFx0XHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fbmV0X25zKG5zKSk7XG4gNDk1Olx0I2VuZGlmXG4gNDk2Olx0I2lmZGVmIENPTkZJR19QSURfTlNcbiA0OTc6XHRcdGNhc2UgQ0xPTkVfTkVXUElEOlxuIDQ5ODpcdFx0XHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fcGlkX25zKG5zKSk7XG4gNDk5Olx0I2VuZGlmXG4gNTAwOlx0I2lmZGVmIENPTkZJR19USU1FX05TXG4gNTAxOlx0XHRjYXNlIENMT05FX05FV1RJTUU6XG4gNTAyOlx0XHRcdHJldHVybiBjdXJyZW50X2luX25hbWVzcGFjZSh0b190aW1lX25zKG5zKSk7XG4gNTAzOlx0I2VuZGlmXG4gNTA0Olx0I2lmZGVmIENPTkZJR19VU0VSX05TXG4gNTA1Olx0XHRjYXNlIENMT05FX05FV1VTRVI6XG4gNTA2Olx0XHRcdHJldHVybiBjdXJyZW50X2luX25hbWVzcGFjZSh0b191c2VyX25zKG5zKSk7XG4gNTA3Olx0I2VuZGlmXG4gNTA4Olx0I2lmZGVmIENPTkZJR19VVFNfTlNcbiA1MDk6XHRcdGNhc2UgQ0xPTkVfTkVXVVRTOlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzAxNQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDUyMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbjogYGxpc3Ruc2AgYW5kIE5hbWVzcGFjZSBMb2dpYyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBhbmFseXNpcyBpbmRpY2F0ZXMgdGhhdCBgbGVnaXRpbWl6ZV9uc2AgaXMgY2FsbGVkIHdpdGhpbiB0aGUgYGRvX2xpc3Ruc2AgYW5kIGBkb19saXN0bnNfdXNlcm5zYCBmdW5jdGlvbnMuIFRob3NlIGZ1bmN0aW9ucyBvcGVyYXRlIGluc2lkZSBhbiBSQ1UgcmVhZCBsb2NrLCBhbmQgY3J1Y2lhbGx5LCB0aGV5JiMzOTtyZSBwYXJ0IG9mIHRoZSBuYW1lc3BhY2UgaXRlcmF0aW9uIHByb2Nlc3MuIFRoaXMgbWVhbnMgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBtb2RpZmljYXRpb25zIHRvIGNvcmUga2VybmVsIGFuZCBWRlMgbmFtZXNwYWNlIGxvZ2ljLCBzcGVjaWZpY2FsbHkgdHJpZ2dlcmVkIGJ5IHRoZSBgbGlzdG5zYCBzeXNjYWxsLgoKVGhlIGtleSBxdWVzdGlvbiBpcyBhbHdheXMgcmVhY2hhYmlsaXR5LiBDYW4gdXNlcnNwYWNlIGNvZGUsIG9yIHRvb2xzIGxpa2Ugc3l6a2FsbGVyLCB0cmlnZ2VyIHRoaXMgY29kZSBwYXRoIGRpcmVjdGx5PyBUaGUgYW5zd2VyIGlzICp5ZXMqLiBUaGUgYGxpc3Ruc2Agc3lzY2FsbCwgb3IgYHN5c19saXN0bnNgLCBwcm92aWRlcyBhIGRpcmVjdCBlbnRyeSBwb2ludC4gVGhpcyBtYWtlcyBpdCBhIHBvdGVudGlhbCB0YXJnZXQuIFRoaXMgZGlyZWN0bHkgdG91Y2hlcyBleGVjdXRhYmxlIGNvZGUgaW4gdGhlIGNvcmUgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgYGtlcm5lbC9uc3RyZWUuY2AuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgZGVmaW5pdGVseSB0cnVlIGhlcmUuCgpOb3csIGZvciBgRm9jdXNTeW1ib2xzYCwgd2UgaGF2ZSB0byBwaW5wb2ludCB0aGUgcmVsZXZhbnQgc3ltYm9scyB0byB0YXJnZXQuCgoqICAgYGxlZ2l0aW1pemVfbnNgIGlzIGBzdGF0aWMgaW5saW5lYCwgc28gaXQgd2lsbCBiZSBpbmxpbmVkLgoqICAgYGxlZ2l0aW1pemVfbnNgIGlzIGNhbGxlZCBpbjoKICAgICogICBgZG9fbGlzdG5zYCAoc3RhdGljKQogICAgKiAgIGBkb19saXN0bnNfdXNlcm5zYCAoc3RhdGljKQogICAgKiAgIGBzeXNfbGlzdG5zYCAvIGBfX2RvX3N5c19saXN0bnNgIC8gYF9fc2Vfc3lzX2xpc3Ruc2AgKHN5c2NhbGwgZW50cnkpCgpHaXZlbiB0aGlzIGluZm9ybWF0aW9uLCBsZXQmIzM5O3MgZXhwbG9yZSB0aGUgc3ltYm9sIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gdGhlIGBsaXN0bnNgIHN5c2NhbGwuIFdlIG5lZWQgdGhlIHNwZWNpZmljIG5hbWVzIG9mIGZ1bmN0aW9ucyBhbmQgdGhlIGV4YWN0IHN5c2NhbGwgbmFtaW5nIGNvbnZlbnRpb24uIEdyZXBwaW5nIGZvciBgbGlzdG5zYCBvciBleGFtaW5pbmcgdGhlIGZpbGUgYXJvdW5kIGxpbmUgNzU3LCBhcyB3ZWxsIGFzIHRoZSBncmVwcGVyLCBzaG93cyB0aGUgZm9sbG93aW5nOgoKYFNZU0NBTExfREVGSU5FNChsaXN0bnMsIC4uLilgIGRlZmluZXMgdGhlIGZvbGxvd2luZyBzeW1ib2xzOgoqICAgYF9feDY0X3N5c19saXN0bnNgCiogICBgX19kb19zeXNfbGlzdG5zYAoqICAgYHN5c19saXN0bnNgCiogICBgZG9fbGlzdG5zYAoqICAgYGRvX2xpc3Ruc191c2VybnNgCgpFdmVuIHRob3VnaCBgZG9fbGlzdG5zYCBhbmQgYGRvX2xpc3Ruc191c2VybnNgIGFyZSBzdGF0aWMsIHdlIHNob3VsZCBzdGlsbCBjb25zaWRlciBmdXp6aW5nIGBfX2RvX3N5c19saXN0bnNgLCBgZG9fbGlzdG5zYCwgYGRvX2xpc3Ruc191c2VybnNgLiBNeSBuZXh0IHN0ZXAgaXMgdG8gdXNlIGdyZXBwZXIgdG8gZXhhbWluZSB0aGUgYGtlcm5lbC9uc3RyZWUuY2AgZmlsZSBhbmQgdW5kZXJzdGFuZCB0aGUgc3ltYm9sIGRlZmluaXRpb25zIGJldHRlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7KGRvX2xpc3Ruc3xsaXN0bnMpJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL25zdHJlZS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9uc3RyZWUuYz0zOTI9dTY0IF9fbnNfdHJlZV9nZW5faWQoc3RydWN0IG5zX2NvbW1vbiAqbnMsIHU2NCBpZClcbi0tXG5rZXJuZWwvbnN0cmVlLmMtNDAyLVxua2VybmVsL25zdHJlZS5jOjQwMzpzdHJ1Y3Qga2xpc3RucyB7XG5rZXJuZWwvbnN0cmVlLmMtNDA0LVx0dTY0IF9fdXNlciAqdW5zX2lkcztcbi0tXG5rZXJuZWwvbnN0cmVlLmMtNDEzLVxua2VybmVsL25zdHJlZS5jOjQxNDpzdGF0aWMgdm9pZCBfX2ZyZWVfa2xpc3Ruc19mcmVlKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMpXG5rZXJuZWwvbnN0cmVlLmMtNDE1LXtcbi0tXG5rZXJuZWwvbnN0cmVlLmM9NDI0PXN0YXRpYyBpbnQgY29weV9uc19pZF9yZXEoY29uc3Qgc3RydWN0IG5zX2lkX3JlcSBfX3VzZXIgKnJlcSxcbi0tXG5rZXJuZWwvbnN0cmVlLmMtNDQ5LVxua2VybmVsL25zdHJlZS5jOjQ1MDpzdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX2tsaXN0bnMoc3RydWN0IGtsaXN0bnMgKmtscywgc3RydWN0IG5zX2lkX3JlcSAqa3JlcSxcbmtlcm5lbC9uc3RyZWUuYy00NTEtXHRcdFx0XHQgIHU2NCBfX3VzZXIgKm5zX2lkcywgc2l6ZV90IG5yX25zX2lkcylcbi0tXG5rZXJuZWwvbnN0cmVlLmM9NDk0PXN0YXRpYyBzdHJ1Y3QgbnNfY29tbW9uICpsb29rdXBfbnNfaWQodTY0IG1udF9uc19pZCwgaW50IG5zX3R5cGUpXG4tLVxua2VybmVsL25zdHJlZS5jLTUwOC1cbmtlcm5lbC9uc3RyZWUuYzo1MDk6c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBuc19yZXF1ZXN0ZWQoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbmtlcm5lbC9uc3RyZWUuYy01MTAtXHRcdFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMpXG4tLVxua2VybmVsL25zdHJlZS5jLTUxNC1cbmtlcm5lbC9uc3RyZWUuYzo1MTU6c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBtYXlfbGlzdF9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxua2VybmVsL25zdHJlZS5jLTUxNi1cdFx0XHRcdFx0ICAgIHN0cnVjdCBuc19jb21tb24gKm5zKVxuLS1cbmtlcm5lbC9uc3RyZWUuYz01MzE9REVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxua2VybmVsL25zdHJlZS5jLTUzMi1cbmtlcm5lbC9uc3RyZWUuYzo1MzM6c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxua2VybmVsL25zdHJlZS5jLTUzNC1cdFx0XHRcdFx0XHRcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcbi0tXG5rZXJuZWwvbnN0cmVlLmMtNTQ0LVxua2VybmVsL25zdHJlZS5jOjU0NTpzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXG5rZXJuZWwvbnN0cmVlLmMtNTQ2LXtcbi0tXG5rZXJuZWwvbnN0cmVlLmM9NjgwPXN0YXRpYyBpbmxpbmUgYm9vbCBuc19jb21tb25faXNfaGVhZChzdHJ1Y3QgbnNfY29tbW9uICpucyxcbi0tXG5rZXJuZWwvbnN0cmVlLmMtNjg4LVxua2VybmVsL25zdHJlZS5jOjY4OTpzdGF0aWMgc3NpemVfdCBkb19saXN0bnMoc3RydWN0IGtsaXN0bnMgKmtscylcbmtlcm5lbC9uc3RyZWUuYy02OTAte1xuLS1cbmtlcm5lbC9uc3RyZWUuYy03NTYtXG5rZXJuZWwvbnN0cmVlLmM6NzU3OlNZU0NBTExfREVGSU5FNChsaXN0bnMsIGNvbnN0IHN0cnVjdCBuc19pZF9yZXEgX191c2VyICosIHJlcSxcbmtlcm5lbC9uc3RyZWUuYy03NTgtXHRcdHU2NCBfX3VzZXIgKiwgbnNfaWRzLCBzaXplX3QsIG5yX25zX2lkcywgdW5zaWduZWQgaW50LCBmbGFncylcbmtlcm5lbC9uc3RyZWUuYy03NTkte1xua2VybmVsL25zdHJlZS5jOjc2MDpcdHN0cnVjdCBrbGlzdG5zIGtsbnMgX19mcmVlKGtsaXN0bnNfZnJlZSkgPSB7fTtcbmtlcm5lbC9uc3RyZWUuYy03NjEtXHRjb25zdCBzaXplX3QgbWF4Y291bnQgPSAxMDAwMDAwO1xuLS1cbmtlcm5lbC9uc3RyZWUuYy03NzctXG5rZXJuZWwvbnN0cmVlLmM6Nzc4Olx0cmV0ID0gcHJlcGFyZV9rbGlzdG5zKFx1MDAyNmtsbnMsIFx1MDAyNmtyZXEsIG5zX2lkcywgbnJfbnNfaWRzKTtcbmtlcm5lbC9uc3RyZWUuYy03NzktXHRpZiAocmV0KVxuLS1cbmtlcm5lbC9uc3RyZWUuYy03ODItXHRpZiAoa3JlcS51c2VyX25zX2lkKVxua2VybmVsL25zdHJlZS5jOjc4MzpcdFx0cmV0dXJuIGRvX2xpc3Ruc191c2VybnMoXHUwMDI2a2xucyk7XG5rZXJuZWwvbnN0cmVlLmMtNzg0LVxua2VybmVsL25zdHJlZS5jOjc4NTpcdHJldHVybiBkb19saXN0bnMoXHUwMDI2a2xucyk7XG5rZXJuZWwvbnN0cmVlLmMtNzg2LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUxNTQKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA2MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipDb25maWd1cmF0aW9uIEludmVzdGlnYXRpb24qKgoKT2theSwgc28gYmVmb3JlIEkgZGl2ZSBpbiwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGhhdmVuJiMzOTt0IG1pc3NlZCBhbnkgY3J1Y2lhbCBjb25maWd1cmF0aW9uIGRldGFpbHMuIEZpcnN0LCBJJiMzOTttIHRoaW5raW5nIEkgc2hvdWxkIGludmVzdGlnYXRlIHBvdGVudGlhbCBkZXBlbmRlbmNpZXMgb24gY29uZmlndXJhdGlvbnMgdGhhdCBtYXkgYmUgbmVjZXNzYXJ5LiBJJiMzOTttIGdvaW5nIHRvIGxvb2sgYXQgaG93IGBOQU1FU1BBQ0VTYCBvciBgVVNFUl9OU2AgYXJlIGhhbmRsZWQgd2l0aGluIHRoZSBidWlsZCBzeXN0ZW0uIElzIGBuc3RyZWUub2AgYWx3YXlzIGJ1aWx0LCBvciBkb2VzIGl0IGhpbmdlIG9uIG9uZSBvZiB0aG9zZSBjb25maWd1cmF0aW9uIG9wdGlvbnM/IEkmIzM5O2xsIHByb2JhYmx5IHN0YXJ0IGJ5IGNoZWNraW5nIGZvciB0aG9zZSB2YXJpYWJsZXMsIGJlY2F1c2UgdGhhdCBzZWVtcyBsaWtlIHRoZSBuYXR1cmFsIHN0YXJ0aW5nIHBvaW50LiBUbyBwaW5wb2ludCB0aGUgZXhhY3QgYnVpbGQgc2V0dXAsIEkgc2hvdWxkIGNoZWNrIHRoZSBgaW5pdC9LY29uZmlnYCBmaWxlLCBvciBwZXJoYXBzIHRoZSBga2VybmVsL01ha2VmaWxlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7TkFNRVNQQUNFUyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbml0L0tjb25maWc9MTQwNz1lbmRpZiAjIENHUk9VUFNcbmluaXQvS2NvbmZpZy0xNDA4LVxuaW5pdC9LY29uZmlnOjE0MDk6bWVudWNvbmZpZyBOQU1FU1BBQ0VTXG5pbml0L0tjb25maWctMTQxMC1cdGJvb2wgXCYjMzQ7TmFtZXNwYWNlcyBzdXBwb3J0XCYjMzQ7IGlmIEVYUEVSVFxuLS1cbmluaXQvS2NvbmZpZy0xNDE4LVxuaW5pdC9LY29uZmlnOjE0MTk6aWYgTkFNRVNQQUNFU1xuaW5pdC9LY29uZmlnLTE0MjAtXG4tLVxuaW5pdC9LY29uZmlnPTE0Njg9Y29uZmlnIE5FVF9OU1xuLS1cbmluaXQvS2NvbmZpZy0xNDc1LVxuaW5pdC9LY29uZmlnOjE0NzY6ZW5kaWYgIyBOQU1FU1BBQ0VTXG5pbml0L0tjb25maWctMTQ3Ny1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU1NTcKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiA5OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIHRoZSBCdWlsZCBQcm9jZXNzIGZvciBgbGlzdG5zYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCB3aHkgYGxpc3Ruc2AgaXMgYmVoYXZpbmcgdGhpcyB3YXksIGFuZCBJIHN1c3BlY3QgaXQmIzM5O3MgcmVsYXRlZCB0byB0aGUgYnVpbGQgY29uZmlndXJhdGlvbi4gTXkgZmlyc3QgdGhvdWdodCBpcyB0byBjaGVjayB0aGUgYGtlcm5lbC9NYWtlZmlsZWAgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDExIHRvIHNlZSBob3cgYG5zdHJlZS5vYCBpcyBiZWluZyBoYW5kbGVkLiBSaWdodCwgYG5zdHJlZS5vYCBpcyB1bmNvbmRpdGlvbmFsbHkgY29tcGlsZWQgKGBvYmoteWApLCB3aGljaCBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhpcyBtb2R1bGUmIzM5O3MgaW5jbHVzaW9uIGRlcGVuZHMgb24gYW55IHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zLiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIGlmIGVpdGhlciBgQ09ORklHX05BTUVTUEFDRVNgIG9yIGBDT05GSUdfVVNFUl9OU2AgYXJlIGNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcyBmb3IgYGxpc3Ruc2AuIExldCYjMzk7cyBsb29rIGF0IGBpbml0L0tjb25maWdgIHRvIHNlZSBob3cgYE5BTUVTUEFDRVNgIGlzIGNvbmZpZ3VyZWQuIFRoZW4sIEkgc2hvdWxkIHByb2JhYmx5IGFsc28gZGVsdmUgaW50byBga2VybmVsL25zdHJlZS5jYCB0byBzZWUgaG93IHRoZSBjb2RlIGl0c2VsZiBsZXZlcmFnZXMgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiwgaWYgYXQgYWxsLiBUaGF0IHNob3VsZCBjbGFyaWZ5IHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBmbG93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0NPTkZJR18mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvbnN0cmVlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTkwNQoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDEwNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFeGFtaW5pbmcgdGhlIEtlcm5lbCBOYW1lc3BhY2UgQ29kZSoqCgpPa2F5LCBzbyBJJiMzOTttIGRpdmluZyBpbnRvIGBrZXJuZWwvbnN0cmVlLmNgIGFuZCBpbW1lZGlhdGVseSBub3RpY2luZyBzb21ldGhpbmcgaW50ZXJlc3Rpbmc6IG5vIGRpcmVjdCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBiYXNlZCBvbiBrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb25zLiBUaGlzIGlzIGEgY29tbW9uIHBhdHRlcm4sIGFuZCBJJiMzOTttIG5vdCBzdXJwcmlzZWQsIGJ1dCBpdCBzdGlsbCB3YXJyYW50cyBhIGNoZWNrLiBJdCBzZWVtcyB0aGUgZGVwZW5kZW5jaWVzIGFyZSBsaWtlbHkgcHVsbGVkIGluIHRocm91Z2ggaW5jbHVkZWQgaGVhZGVycyBsaWtlIGBmcy9uc2ZzLmNgIGFuZCB0aGUgYGlzX2N1cnJlbnRfbmFtZXNwYWNlYCBmdW5jdGlvbi4KCkhvd2V2ZXIsIEkgYWx3YXlzIGZpbmQgaXQgZ29vZCBwcmFjdGljZSB0byBoYXZlIGF0IGxlYXN0ICpzb21lKiBpbmRpY2F0aW9uIHdpdGhpbiBhIHNvdXJjZSBmaWxlIGl0c2VsZiB0aGF0IGl0cyBiZWhhdmlvciBpcyBnb3Zlcm5lZCBieSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucywgZXZlbiBpZiBpbmRpcmVjdGx5LiBUaGUgdXNlIG9mIGBOQU1FU1BBQ0VTYCBvciBgVVNFUl9OU2AsIG9yIHRoZSBvdmVyYXJjaGluZyBgTkFNRVNQQUNFU2AgY29uZmlndXJhdGlvbiBhcyBhIHdob2xlLCBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIHF1aWNrIGNvZGUgcmV2aWV3cyBhbmQgZGVidWdnaW5nLiBTbywgbGV0JiMzOTtzIGNvbmZpcm0gdGhlIGV4cGVjdGVkIGJlaGF2aW9yIGFuZCB2ZXJpZnkgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCgpMZXQmIzM5O3MgZ28gc3RyYWlnaHQgdG8gYGluaXQvS2NvbmZpZ2AgYW5kIHNlZSBob3cgYENPTkZJR19OQU1FU1BBQ0VTYCBpcyBkZWZpbmVkIGFuZCB3aGF0IGl0IGRlcGVuZHMgb24uIEkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBjb21wbGV0ZSBwaWN0dXJlIG9mIGhvdyB0aGlzIHNlY3Rpb24gb2YgY29kZSBpcyB0cmVhdGVkIGluIHRoZSBjb25maWd1cmF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE0MDgsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTQwODpcdFxuMTQwOTpcdG1lbnVjb25maWcgTkFNRVNQQUNFU1xuMTQxMDpcdFx0Ym9vbCBcJiMzNDtOYW1lc3BhY2VzIHN1cHBvcnRcJiMzNDsgaWYgRVhQRVJUXG4xNDExOlx0XHRkZXBlbmRzIG9uIE1VTFRJVVNFUlxuMTQxMjpcdFx0ZGVmYXVsdCAhRVhQRVJUXG4xNDEzOlx0XHRoZWxwXG4xNDE0Olx0XHQgIFByb3ZpZGVzIHRoZSB3YXkgdG8gbWFrZSB0YXNrcyB3b3JrIHdpdGggZGlmZmVyZW50IG9iamVjdHMgdXNpbmdcbjE0MTU6XHRcdCAgdGhlIHNhbWUgaWQuIEZvciBleGFtcGxlIHNhbWUgSVBDIGlkIG1heSByZWZlciB0byBkaWZmZXJlbnQgb2JqZWN0c1xuMTQxNjpcdFx0ICBvciBzYW1lIHVzZXIgaWQgb3IgcGlkIG1heSByZWZlciB0byBkaWZmZXJlbnQgdGFza3Mgd2hlbiB1c2VkIGluXG4xNDE3Olx0XHQgIGRpZmZlcmVudCBuYW1lc3BhY2VzLlxuMTQxODpcdFxuMTQxOTpcdGlmIE5BTUVTUEFDRVNcbjE0MjA6XHRcbjE0MjE6XHRjb25maWcgVVRTX05TXG4xNDIyOlx0XHRib29sIFwmIzM0O1VUUyBuYW1lc3BhY2VcJiMzNDtcbjE0MjM6XHRcdGRlZmF1bHQgeVxuMTQyNDpcdFx0aGVscFxuMTQyNTpcdFx0ICBJbiB0aGlzIG5hbWVzcGFjZSB0YXNrcyBzZWUgZGlmZmVyZW50IGluZm8gcHJvdmlkZWQgd2l0aCB0aGVcbjE0MjY6XHRcdCAgdW5hbWUoKSBzeXN0ZW0gY2FsbFxuMTQyNzpcdFxuMTQyODpcdGNvbmZpZyBUSU1FX05TXG4xNDI5Olx0XHRib29sIFwmIzM0O1RJTUUgbmFtZXNwYWNlXCYjMzQ7XG4xNDMwOlx0XHRkZWZhdWx0IHlcbjE0MzE6XHRcdGhlbHBcbjE0MzI6XHRcdCAgSW4gdGhpcyBuYW1lc3BhY2UgYm9vdHRpbWUgYW5kIG1vbm90b25pYyBjbG9ja3MgY2FuIGJlIHNldC5cbjE0MzM6XHRcdCAgVGhlIHRpbWUgd2lsbCBrZWVwIGdvaW5nIHdpdGggdGhlIHNhbWUgcGFjZS5cbjE0MzQ6XHRcbjE0MzU6XHRjb25maWcgVElNRV9OU19WRFNPXG4xNDM2Olx0XHRkZWZfYm9vbCBUSU1FX05TIFx1MDAyNlx1MDAyNiBHRU5FUklDX0dFVFRJTUVPRkRBWVxuMTQzNzpcdFxuMTQzODpcdGNvbmZpZyBJUENfTlNcbjE0Mzk6XHRcdGJvb2wgXCYjMzQ7SVBDIG5hbWVzcGFjZVwmIzM0O1xuMTQ0MDpcdFx0ZGVwZW5kcyBvbiAoU1lTVklQQyB8fCBQT1NJWF9NUVVFVUUpXG4xNDQxOlx0XHRkZWZhdWx0IHlcbjE0NDI6XHRcdGhlbHBcbjE0NDM6XHRcdCAgSW4gdGhpcyBuYW1lc3BhY2UgdGFza3Mgd29yayB3aXRoIElQQyBpZHMgd2hpY2ggY29ycmVzcG9uZCB0b1xuMTQ0NDpcdFx0ICBkaWZmZXJlbnQgSVBDIG9iamVjdHMgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMuXG4xNDQ1Olx0XG4xNDQ2Olx0Y29uZmlnIFVTRVJfTlNcbjE0NDc6XHRcdGJvb2wgXCYjMzQ7VXNlciBuYW1lc3BhY2VcJiMzNDtcbjE0NDg6XHRcdGRlZmF1bHQgblxuMTQ0OTpcdFx0aGVscFxuMTQ1MDpcdFx0ICBUaGlzIGFsbG93cyBjb250YWluZXJzLCBpLmUuIHZzZXJ2ZXJzLCB0byB1c2UgdXNlciBuYW1lc3BhY2VzXG4xNDUxOlx0XHQgIHRvIHByb3ZpZGUgZGlmZmVyZW50IHVzZXIgaW5mbyBmb3IgZGlmZmVyZW50IHNlcnZlcnMuXG4xNDUyOlx0XG4xNDUzOlx0XHQgIFdoZW4gdXNlciBuYW1lc3BhY2VzIGFyZSBlbmFibGVkIGluIHRoZSBrZXJuZWwgaXQgaXNcbjE0NTQ6XHRcdCAgcmVjb21tZW5kZWQgdGhhdCB0aGUgTUVNQ0cgb3B0aW9uIGFsc28gYmUgZW5hYmxlZCBhbmQgdGhhdFxuMTQ1NTpcdFx0ICB1c2VyLXNwYWNlIHVzZSB0aGUgbWVtb3J5IGNvbnRyb2wgZ3JvdXBzIHRvIGxpbWl0IHRoZSBhbW91bnRcbjE0NTY6XHRcdCAgb2YgbWVtb3J5IGEgbWVtb3J5IHVucHJpdmlsZWdlZCB1c2VycyBjYW4gdXNlLlxuMTQ1NzpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjkyNwoJCQkJCQkJb3V0cHV0OiAxMzAKCQkJCQkJCXRob3VnaHRzOiAzMzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBgbGlzdG5zYCBTeXN0ZW0gQ2FsbCBmb3IgUG90ZW50aWFsIEZ1enppbmcqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBGaXJzdCwgSSBuZWVkIHRvIHZlcmlmeSB3aGljaCBmdW5jdGlvbnMgYXJlIGF0IHRoZSBoZWFydCBvZiBgbGlzdG5zYC4gSSYjMzk7bGwgc3RhcnQgd2l0aCBgRm9jdXNTeW1ib2xzYC4gSW4gYGtlcm5lbC9uc3RyZWUuY2AsIHRoZSBpbml0aWFsIHN1c3BlY3RzIGFyZSBgZG9fbGlzdG5zYCwgYGRvX2xpc3Ruc191c2VybnNgLCBgX19kb19zeXNfbGlzdG5zYCwgYGxlZ2l0aW1pemVfbnNgIChldmVuIHRob3VnaCBpdCYjMzk7cyBzdGF0aWMgaW5saW5lLCBpdCYjMzk7cyB3b3J0aCBjaGVja2luZyB0aGUgY2FsbCBzaXRlcyksIGFuZCBgc3lzX2xpc3Ruc2AgKG9yIGBfX3g2NF9zeXNfbGlzdG5zYCkuCgpOb3csIGNvbmZpcm1pbmcgbXkgaHVuY2gsIGl0IGxvb2tzIGxpa2UgYF9fZG9fc3lzX2xpc3Ruc2AsIGBkb19saXN0bnNgLCBhbmQgYGRvX2xpc3Ruc191c2VybnNgIGFyZSBpbmRlZWQgdGhlIHByaW1hcnkgd29ya2hvcnNlcyBmb3IgdGhpcyBzeXN0ZW0gY2FsbC4gR29vZC4gTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zLiBJJiMzOTtsbCBxdWlja2x5IGNoZWNrIHRoZSBgRW5hYmxlQ29uZmlnc2AsIHdoaWNoIGFyZSBgTkFNRVNQQUNFU2AgYW5kIGBVU0VSX05TYC4KClJpZ2h0LCB0aW1lIGZvciBhIHNhbml0eSBjaGVjayBvbiB0aGUgYXJndW1lbnRzIEkmIzM5O20gYWJvdXQgdG8gZmVlZCB0byBgc2V0LXJlc3VsdHNgLiBUaGUgYFdvcnRoRnV6emluZ2AgZmxhZyBpcyBkZWZpbml0ZWx5IGB0cnVlYCBpbiB0aGlzIGNhc2UuIFRoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGFsdGVycyBuYW1lc3BhY2UgdHJlZSBpdGVyYXRpb24gYW5kIHZhbGlkYXRpb24gd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBgbGlzdG5zYCBzeXN0ZW0gY2FsbC4gVGhlIHJlb3JkZXJpbmcgb2YgcGVybWlzc2lvbiBhbmQgbWVtYmVyc2hpcCBjaGVja3Mg4oCTIGBtYXlfbGlzdF9uc2AgYW5kIGBuc19nZXRfdW5sZXNzX2luYWN0aXZlYCDigJMgaXMgYSBjcml0aWNhbCBkZXRhaWwsIGFzIHRoaXMgZGlyZWN0bHkgaW1wYWN0cyBjb3JlIGtlcm5lbCBjb2RlIHJlYWNoYWJsZSB0aHJvdWdoIGBsaXN0bnNgLgoKU28sIHRoZSBmb2N1cyBzeW1ib2xzIGFyZSBjb25maXJtZWQgYXMgYFsmIzM0O19fZG9fc3lzX2xpc3RucyYjMzQ7LCAmIzM0O2RvX2xpc3RucyYjMzQ7LCAmIzM0O2RvX2xpc3Ruc191c2VybnMmIzM0O11gLCBhbmQgdGhlIGVuYWJsaW5nIGNvbmZpZ3MgYXJlIGBbJiMzNDtOQU1FU1BBQ0VTJiMzNDssICYjMzQ7VVNFUl9OUyYjMzQ7XWAuIEkmIzM5O20gc2F0aXNmaWVkLiBOb3csIGl0JiMzOTtzIHRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgIGFuZCBtb3ZlIG9uIHRvIHRoZSBuZXh0IHN0YWdlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TkFNRVNQQUNFUyYjMzQ7LAogICAgJiMzNDtVU0VSX05TJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19kb19zeXNfbGlzdG5zJiMzNDssCiAgICAmIzM0O2RvX2xpc3RucyYjMzQ7LAogICAgJiMzNDtkb19saXN0bnNfdXNlcm5zJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG5hbWVzcGFjZSB0cmVlIGl0ZXJhdGlvbiBhbmQgcGVybWlzc2lvbiB2YWxpZGF0aW9uIGxvZ2ljIGluIGxlZ2l0aW1pemVfbnMoKSwgd2hpY2ggaXMgY2FsbGVkIGR1cmluZyB0aGUgbGlzdG5zIHN5c3RlbSBjYWxsLiBJdCBjaGFuZ2VzIHdoZXRoZXIgbWF5X2xpc3RfbnMoKSBpcyBldmFsdWF0ZWQgYmVmb3JlIG9yIGFmdGVyIHRha2luZyBhIHJlZmVyZW5jZSB2aWEgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpLCBtb2RpZnlpbmcgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNvZGUgYWNjZXNzaWJsZSB0byB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05BTUVTUEFDRVMmIzM0OywKICAgICYjMzQ7VVNFUl9OUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O19fZG9fc3lzX2xpc3RucyYjMzQ7LAogICAgJiMzNDtkb19saXN0bnMmIzM0OywKICAgICYjMzQ7ZG9fbGlzdG5zX3VzZXJucyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBuYW1lc3BhY2UgdHJlZSBpdGVyYXRpb24gYW5kIHBlcm1pc3Npb24gdmFsaWRhdGlvbiBsb2dpYyBpbiBsZWdpdGltaXplX25zKCksIHdoaWNoIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGxpc3RucyBzeXN0ZW0gY2FsbC4gSXQgY2hhbmdlcyB3aGV0aGVyIG1heV9saXN0X25zKCkgaXMgZXZhbHVhdGVkIGJlZm9yZSBvciBhZnRlciB0YWtpbmcgYSByZWZlcmVuY2UgdmlhIG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKSwgbW9kaWZ5aW5nIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjb2RlIGFjY2Vzc2libGUgdG8gdXNlcnNwYWNlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA4PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgYGxlZ2l0aW1pemVfbnMoKWAgaW4gYGtlcm5lbC9uc3RyZWUuY2AgdG8gY2hlY2sgcGVybWlzc2lvbnMgKGBtYXlfbGlzdF9ucygpYCkgYmVmb3JlIGFjcXVpcmluZyBhIHJlZmVyZW5jZSAoYG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKWApLCBlbGltaW5hdGluZyB0aGUgbmVlZCBmb3IgYSB0ZW1wb3JhcnkgYXV0by1jbGVhbnVwIHJlZmVyZW5jZSAoYF9fZnJlZShuc19wdXQpYCkuIFxuXG5UaGlzIGNoYW5nZSBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbWFuaXB1bGF0ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIG5ldyBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIHN0cnVjdCBwYWRkaW5nLCBub3IgZG9lcyBpdCBhbHRlciBkYXRhIGNvcHlpbmcgdG8gdXNlcnNwYWNlIGluIGEgbWFubmVyIHRoYXQgY291bGQgbGVhayB1bmluaXRpYWxpemVkIGJ5dGVzLiBBbnkgcG90ZW50aWFsIHJpc2tzIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2UgcmVsYXRlIHRvIG9iamVjdCBsaWZldGltZSBvciBSQ1UgZGVyZWZlcmVuY2luZyBiZWZvcmUgcmVmZXJlbmNlIGFjcXVpc2l0aW9uLCB3aGljaCBhcmUgc3RyaWN0bHkgd2l0aGluIHRoZSBkb21haW4gb2YgS0FTQU4gcmF0aGVyIHRoYW4gS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmZjAwMTE2OTQzOTE0ZWNhNGU5YjExMjQwY2YzODQwZGMzN2VkOWQ5CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFN1biBTZXAgNiAwMTowNjoyNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9uc3RyZWUuYyBiL2tlcm5lbC9uc3RyZWUuYwppbmRleCA2ZDEyZTU5MDBhYzAxLi44MzFmMjc5ZDE3NGEzIDEwMDY0NAotLS0gYS9rZXJuZWwvbnN0cmVlLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL25zdHJlZS5jCkBAIC01MzMsMTkgJiM0Mzs1MzMsMTMgQEAgREVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLAogCQkJCQkJCSAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSkKIHsKLQlzdHJ1Y3QgbnNfY29tbW9uICpucyBfX2ZyZWUobnNfcHV0KSA9IE5VTEw7Ci0KIAlpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpCiAJCXJldHVybiBOVUxMOwogCi0JbnMgPSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7Ci0JaWYgKCFucykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoIW1heV9saXN0X25zKGtscywgbnMpKQomIzQzOwlpZiAoIW1heV9saXN0X25zKGtscywgY2FuZGlkYXRlKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gbm9fZnJlZV9wdHIobnMpOwomIzQzOwlyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTk4CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogOTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRGl2aW5nIGludG8gdGhlIE5hbWVzcGFjZSBMZWdpdGltYWN5IENoZWNrKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgY2xlYXJseSB0b3VjaGluZyBga2VybmVsL25zdHJlZS5jYCwgc3BlY2lmaWNhbGx5IHRoZSBgbGVnaXRpbWl6ZV9uc2AgZnVuY3Rpb24uIE15IGZpcnN0IHRob3VnaHQgaXMgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb24gd2hhdCYjMzk7cyBoYXBwZW5pbmcgYXJvdW5kIHRoYXQgY2FsbC4gSXQgbG9va3MgbGlrZSBpdCBpcyBnb2luZyB0byBlZmZlY3QgdGhlIHdheSB0aGF0IHNvbWUgbmFtZXNwYWNlcyBhcmUgaGFuZGxlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBgbGVnaXRpbWl6ZV9uc2AgZG9lcywgYXMgd2VsbCBhcyB0aGUgcm9sZXMgb2YgYG1heV9saXN0X25zYCwgYW5kIGBuc19yZXF1ZXN0ZWRgLCBhbmQgaG93IHRoZXkgaW50ZXJhY3QuIExpbmUgNTMzIGlzIHRoZSB0YXJnZXQsIHNvIEkgc2hvdWxkIHJlYWQgdGhlIGNvZGUgYXJvdW5kIHRoZXJlIGFuZCB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24uCgpMZXQmIzM5O3MgdXNlIHRoZSBvbGQgYHJlYWQtZmlsZWAgdHJpY2sgdG8gbG9hZCB0aGUgY29kZS4gSSYjMzk7bGwgZm9jdXMgb24gbGluZXMgNTAwIHRocm91Z2ggNjAwLCBnaXZlIG9yIHRha2UuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGNvbnRleHQgSSBuZWVkIGFyb3VuZCB0aGF0IGltcG9ydGFudCBmdW5jdGlvbi4gVW5kZXJzdGFuZGluZyB0aGUgbG9naWMgaW4gdGhpcyBhcmVhIGlzIGtleSB0byBhc3Nlc3NpbmcgdGhlIGltcGFjdCBvZiB0aGlzIHBhdGNoLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UmIzM5O3ZlIGdvdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvbnN0cmVlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDUwMDpcdFx0aWYgKCFucylcbiA1MDE6XHRcdFx0cmV0dXJuIE5VTEw7XG4gNTAyOlx0XG4gNTAzOlx0XHRpZiAoIW5zX2dldF91bmxlc3NfaW5hY3RpdmUobnMpKVxuIDUwNDpcdFx0XHRyZXR1cm4gTlVMTDtcbiA1MDU6XHRcbiA1MDY6XHRcdHJldHVybiBucztcbiA1MDc6XHR9XG4gNTA4Olx0XG4gNTA5Olx0c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBuc19yZXF1ZXN0ZWQoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbiA1MTA6XHRcdFx0XHRcdFx0ICAgICBjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucylcbiA1MTE6XHR7XG4gNTEyOlx0XHRyZXR1cm4gIWtscy1cdTAwM2Vuc190eXBlIHx8IChrbHMtXHUwMDNlbnNfdHlwZSBcdTAwMjYgbnMtXHUwMDNlbnNfdHlwZSk7XG4gNTEzOlx0fVxuIDUxNDpcdFxuIDUxNTpcdHN0YXRpYyBpbmxpbmUgYm9vbCBfX211c3RfY2hlY2sgbWF5X2xpc3RfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbiA1MTY6XHRcdFx0XHRcdFx0ICAgIHN0cnVjdCBuc19jb21tb24gKm5zKVxuIDUxNzpcdHtcbiA1MTg6XHRcdGlmIChrbHMtXHUwMDNldXNlcl9ucyBcdTAwMjZcdTAwMjYga2xzLVx1MDAzZXVzZXJuc19jYXBhYmxlKVxuIDUxOTpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiA1MjA6XHRcdGlmIChpc19jdXJyZW50X25hbWVzcGFjZShucykpXG4gNTIxOlx0XHRcdHJldHVybiB0cnVlO1xuIDUyMjpcdFx0cmV0dXJuIG1heV9zZWVfYWxsX25hbWVzcGFjZXMoKTtcbiA1MjM6XHR9XG4gNTI0Olx0XG4gNTI1Olx0c3RhdGljIGlubGluZSB2b2lkIG5zX3B1dChzdHJ1Y3QgbnNfY29tbW9uICpucylcbiA1MjY6XHR7XG4gNTI3Olx0XHRpZiAobnMgXHUwMDI2XHUwMDI2IG5zLVx1MDAzZW9wcylcbiA1Mjg6XHRcdFx0bnMtXHUwMDNlb3BzLVx1MDAzZXB1dChucyk7XG4gNTI5Olx0fVxuIDUzMDpcdFxuIDUzMTpcdERFRklORV9GUkVFKG5zX3B1dCwgc3RydWN0IG5zX2NvbW1vbiAqLCBpZiAoIUlTX0VSUl9PUl9OVUxMKF9UKSkgbnNfcHV0KF9UKSlcbiA1MzI6XHRcbiA1MzM6XHRzdGF0aWMgaW5saW5lIHN0cnVjdCBuc19jb21tb24gKl9fbXVzdF9jaGVjayBsZWdpdGltaXplX25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXG4gNTM0Olx0XHRcdFx0XHRcdFx0XHQgICBzdHJ1Y3QgbnNfY29tbW9uICpjYW5kaWRhdGUpXG4gNTM1Olx0e1xuIDUzNjpcdFx0aWYgKCFuc19yZXF1ZXN0ZWQoa2xzLCBjYW5kaWRhdGUpKVxuIDUzNzpcdFx0XHRyZXR1cm4gTlVMTDtcbiA1Mzg6XHRcbiA1Mzk6XHRcdGlmICghbWF5X2xpc3RfbnMoa2xzLCBjYW5kaWRhdGUpKVxuIDU0MDpcdFx0XHRyZXR1cm4gTlVMTDtcbiA1NDE6XHRcbiA1NDI6XHRcdHJldHVybiBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7XG4gNTQzOlx0fVxuIDU0NDpcdFxuIDU0NTpcdHN0YXRpYyBzc2l6ZV90IGRvX2xpc3Ruc191c2VybnMoc3RydWN0IGtsaXN0bnMgKmtscylcbiA1NDY6XHR7XG4gNTQ3Olx0XHR1NjQgX191c2VyICpuc19pZHMgPSBrbHMtXHUwMDNldW5zX2lkcztcbiA1NDg6XHRcdHNpemVfdCBucl9uc19pZHMgPSBrbHMtXHUwMDNlbnJfbnNfaWRzO1xuIDU0OTpcdFx0c3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMLCAqZmlyc3RfbnMgPSBOVUxMLCAqcHJldiA9IE5VTEw7XG4gNTUwOlx0XHRjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkO1xuIDU1MTpcdFx0c3NpemVfdCByZXQ7XG4gNTUyOlx0XG4gNTUzOlx0XHRWRlNfV0FSTl9PTl9PTkNFKCFrbHMtXHUwMDNldXNlcl9uc19pZCk7XG4gNTU0Olx0XG4gNTU1Olx0XHRpZiAoa2xzLVx1MDAzZXVzZXJfbnNfaWQgPT0gTElTVE5TX0NVUlJFTlRfVVNFUilcbiA1NTY6XHRcdFx0bnMgPSB0b19uc19jb21tb24oY3VycmVudF91c2VyX25zKCkpO1xuIDU1NzpcdFx0ZWxzZSBpZiAoa2xzLVx1MDAzZXVzZXJfbnNfaWQpXG4gNTU4Olx0XHRcdG5zID0gbG9va3VwX25zX2lkKGtscy1cdTAwM2V1c2VyX25zX2lkLCBDTE9ORV9ORVdVU0VSKTtcbiA1NTk6XHRcdGlmICghbnMpXG4gNTYwOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDU2MTpcdFx0a2xzLVx1MDAzZXVzZXJfbnMgPSB0b191c2VyX25zKG5zKTtcbiA1NjI6XHRcbiA1NjM6XHRcdC8qXG4gNTY0Olx0XHQgKiBVc2UgdGhlIHJidHJlZSB0byBmaW5kIHRoZSBmaXJzdCBuYW1lc3BhY2Ugd2UgY2FyZSBhYm91dCBhbmRcbiA1NjU6XHRcdCAqIHRoZW4gdXNlIGl0JiMzOTtzIGxpc3QgZW50cnkgdG8gaXRlcmF0ZSBmcm9tIHRoZXJlLlxuIDU2NjpcdFx0ICovXG4gNTY3Olx0XHRpZiAoa2xzLVx1MDAzZWxhc3RfbnNfaWQpIHtcbiA1Njg6XHRcdFx0a2xzLVx1MDAzZWZpcnN0X25zID0gbG9va3VwX25zX293bmVyX2F0KGtscy1cdTAwM2VsYXN0X25zX2lkICYjNDM7IDEsIG5zKTtcbiA1Njk6XHRcdFx0aWYgKCFrbHMtXHUwMDNlZmlyc3RfbnMpXG4gNTcwOlx0XHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG4gNTcxOlx0XHRcdGZpcnN0X25zID0ga2xzLVx1MDAzZWZpcnN0X25zO1xuIDU3MjpcdFx0fVxuIDU3MzpcdFxuIDU3NDpcdFx0cmV0ID0gMDtcbiA1NzU6XHRcdGhlYWQgPSBcdTAwMjZ0b19uc19jb21tb24oa2xzLVx1MDAzZXVzZXJfbnMpLVx1MDAzZW5zX293bmVyX3Jvb3QubnNfbGlzdF9oZWFkO1xuIDU3NjpcdFx0a2xzLVx1MDAzZXVzZXJuc19jYXBhYmxlID0gbWF5X3NlZV9hbGxfbmFtZXNwYWNlcygpO1xuIDU3NzpcdFxuIDU3ODpcdFx0cmN1X3JlYWRfbG9jaygpO1xuIDU3OTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNzU3CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBhbiBleHBlcnQgaW4gbXkgZmllbGQsIGFzc3VtaW5nIEkmIzM5O20gdGhlIG9uZSBoYXZpbmcgdGhlbToKCioqQW5hbHl6aW5nIGBrZXJuZWwvbnN0cmVlLmNgIHRvIFVuZGVyc3RhbmQgYGxlZ2l0aW1pemVfbnNgKioKClJpZ2h0LCBzbyBJIG5lZWQgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiBob3cgYGxlZ2l0aW1pemVfbnNgIGlzIGFjdHVhbGx5ICp1c2VkKi4gSSBjYW4mIzM5O3QganVzdCBsb29rIGF0IGl0cyBkZWZpbml0aW9uLCBJIG5lZWQgdG8gc2VlIHRoZSBjb250ZXh0LiBUaGUgY3J1Y2lhbCB0aGluZyBoZXJlIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdzsgd2hhdCAqY2FsbHMqIGBsZWdpdGltaXplX25zYCwgYW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGltbWVkaWF0ZWx5IGJlZm9yZSBhbmQgYWZ0ZXIgdGhvc2UgY2FsbHMuIFRoYXQmIzM5O3MgaG93IHlvdSByZWFsbHkgZ3Jhc3AgdGhlIGludGVudGlvbiBiZWhpbmQgdGhlIGRlc2lnbi4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSByZXN0IG9mIGBrZXJuZWwvbnN0cmVlLmNgLiBJIG5lZWQgdG8gdHJhY2UgaXRzIHVzYWdlIGluIHRoZSBjb2RlIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBzeXN0ZW0gaXMgYmVoYXZpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL25zdHJlZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDgwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1ODA6XHRcdGlmICghZmlyc3RfbnMpXG4gNTgxOlx0XHRcdGZpcnN0X25zID0gbGlzdF9lbnRyeV9yY3UoaGVhZC1cdTAwM2VuZXh0LCB0eXBlb2YoKmZpcnN0X25zKSwgbnNfb3duZXJfbm9kZS5uc19saXN0X2VudHJ5KTtcbiA1ODI6XHRcbiA1ODM6XHRcdG5zID0gZmlyc3RfbnM7XG4gNTg0Olx0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb21fcmN1KG5zLCBoZWFkLCBuc19vd25lcl9ub2RlLm5zX2xpc3RfZW50cnkpIHtcbiA1ODU6XHRcdFx0c3RydWN0IG5zX2NvbW1vbiAqdmFsaWQ7XG4gNTg2Olx0XG4gNTg3Olx0XHRcdGlmICghbnJfbnNfaWRzKVxuIDU4ODpcdFx0XHRcdGJyZWFrO1xuIDU4OTpcdFxuIDU5MDpcdFx0XHR2YWxpZCA9IGxlZ2l0aW1pemVfbnMoa2xzLCBucyk7XG4gNTkxOlx0XHRcdGlmICghdmFsaWQpXG4gNTkyOlx0XHRcdFx0Y29udGludWU7XG4gNTkzOlx0XG4gNTk0Olx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIDU5NTpcdFxuIDU5NjpcdFx0XHRuc19wdXQocHJldik7XG4gNTk3Olx0XHRcdHByZXYgPSB2YWxpZDtcbiA1OTg6XHRcbiA1OTk6XHRcdFx0aWYgKHB1dF91c2VyKHZhbGlkLVx1MDAzZW5zX2lkLCBuc19pZHMgJiM0MzsgcmV0KSkge1xuIDYwMDpcdFx0XHRcdG5zX3B1dChwcmV2KTtcbiA2MDE6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiA2MDI6XHRcdFx0fVxuIDYwMzpcdFxuIDYwNDpcdFx0XHRucl9uc19pZHMtLTtcbiA2MDU6XHRcdFx0cmV0JiM0MzsmIzQzOztcbiA2MDY6XHRcbiA2MDc6XHRcdFx0cmN1X3JlYWRfbG9jaygpO1xuIDYwODpcdFx0fVxuIDYwOTpcdFxuIDYxMDpcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gNjExOlx0XHRuc19wdXQocHJldik7XG4gNjEyOlx0XHRyZXR1cm4gcmV0O1xuIDYxMzpcdH1cbiA2MTQ6XHRcbiA2MTU6XHQvKlxuIDYxNjpcdCAqIExvb2t1cCBhIG5hbWVzcGFjZSB3aXRoIGlkIFx1MDAzZT0gbnNfaWQgaW4gZWl0aGVyIHRoZSB1bmlmaWVkIHRyZWUgb3IgYSB0eXBlLXNwZWNpZmljIHRyZWUuXG4gNjE3Olx0ICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIHdpdGggdGhlIHNtYWxsZXN0IGlkIHRoYXQgaXMgXHUwMDNlPSBuc19pZC5cbiA2MTg6XHQgKi9cbiA2MTk6XHRzdGF0aWMgc3RydWN0IG5zX2NvbW1vbiAqbG9va3VwX25zX2lkX2F0KHU2NCBuc19pZCwgaW50IG5zX3R5cGUpXG4gNjIwOlx0e1xuIDYyMTpcdFx0c3RydWN0IG5zX2NvbW1vbiAqcmV0ID0gTlVMTDtcbiA2MjI6XHRcdHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUgPSBOVUxMO1xuIDYyMzpcdFx0c3RydWN0IHJiX25vZGUgKm5vZGU7XG4gNjI0Olx0XG4gNjI1Olx0XHRpZiAobnNfdHlwZSkge1xuIDYyNjpcdFx0XHRuc190cmVlID0gbnNfdHJlZV9mcm9tX3R5cGUobnNfdHlwZSk7XG4gNjI3Olx0XHRcdGlmICghbnNfdHJlZSlcbiA2Mjg6XHRcdFx0XHRyZXR1cm4gTlVMTDtcbiA2Mjk6XHRcdH1cbiA2MzA6XHRcbiA2MzE6XHRcdGd1YXJkKG5zX3RyZWVfbG9ja2VkX3JlYWRlcikoKTtcbiA2MzI6XHRcbiA2MzM6XHRcdGlmIChuc190cmVlKVxuIDYzNDpcdFx0XHRub2RlID0gbnNfdHJlZS1cdTAwM2Vuc19yYi5yYl9ub2RlO1xuIDYzNTpcdFx0ZWxzZVxuIDYzNjpcdFx0XHRub2RlID0gbnNfdW5pZmllZF9yb290Lm5zX3JiLnJiX25vZGU7XG4gNjM3Olx0XG4gNjM4Olx0XHR3aGlsZSAobm9kZSkge1xuIDYzOTpcdFx0XHRzdHJ1Y3QgbnNfY29tbW9uICpucztcbiA2NDA6XHRcbiA2NDE6XHRcdFx0aWYgKG5zX3R5cGUpXG4gNjQyOlx0XHRcdFx0bnMgPSBub2RlX3RvX25zKG5vZGUpO1xuIDY0MzpcdFx0XHRlbHNlXG4gNjQ0Olx0XHRcdFx0bnMgPSBub2RlX3RvX25zX3VuaWZpZWQobm9kZSk7XG4gNjQ1Olx0XG4gNjQ2Olx0XHRcdGlmIChuc19pZCBcdTAwM2M9IG5zLVx1MDAzZW5zX2lkKSB7XG4gNjQ3Olx0XHRcdFx0aWYgKG5zX3R5cGUpXG4gNjQ4Olx0XHRcdFx0XHRyZXQgPSBub2RlX3RvX25zKG5vZGUpO1xuIDY0OTpcdFx0XHRcdGVsc2VcbiA2NTA6XHRcdFx0XHRcdHJldCA9IG5vZGVfdG9fbnNfdW5pZmllZChub2RlKTtcbiA2NTE6XHRcdFx0XHRpZiAobnNfaWQgPT0gbnMtXHUwMDNlbnNfaWQpXG4gNjUyOlx0XHRcdFx0XHRicmVhaztcbiA2NTM6XHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9sZWZ0O1xuIDY1NDpcdFx0XHR9IGVsc2Uge1xuIDY1NTpcdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX3JpZ2h0O1xuIDY1NjpcdFx0XHR9XG4gNjU3Olx0XHR9XG4gNjU4Olx0XG4gNjU5Olx0XHRpZiAocmV0KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MDU5CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqQW5hbHl6aW5nIGBsZWdpdGltaXplX25zYCBVc2FnZSoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc2NvcGUgb2YgYGxlZ2l0aW1pemVfbnNgLiBXaGVyZSBlbHNlIGlzIHRoaXMgZnVuY3Rpb24sIG1ldGhvZCwgb3Igd2hhdGV2ZXIgaXQgaXMsIGFjdHVhbGx5IGJlaW5nIGNhbGxlZCB3aXRoaW4gdGhlIGNvZGViYXNlPyBJIGNhbiYjMzk7dCBqdXN0IHJlbHkgb24gbWVtb3J5OyBJIG5lZWQgY29uY3JldGUgZXZpZGVuY2UuIFRpbWUgdG8gYnJpbmcgb3V0IHRoZSBiaWcgZ3Vucy4uLiBJJiMzOTtsbCBmaXJlIHVwIGBncmVwcGVyYC4gVGhpcyB3aWxsIGFsbG93IG1lIHRvIHF1aWNrbHkgaWRlbnRpZnkgYWxsIGluc3RhbmNlcyBvZiBgbGVnaXRpbWl6ZV9uc2AgYW5kIGl0cyB1c2VzIHRocm91Z2hvdXQgdGhlIHByb2plY3QuIEkmIzM5O2xsIGJlIGFibGUgdG8gcXVpY2tseSBzZWUgYWxsIHRoZSBjb250ZXh0cyB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgcHJlc2VudC4gVGhpcyBpcyB0aGUgZmFzdGVzdCB3YXkgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb2YgaG93IHRoaXMgY29tcG9uZW50IGZpdHMgaW50byB0aGUgYmlnZ2VyIHBpY3R1cmUuIEZyb20gaGVyZSBJIGNhbiBzdGFydCB0byB1bmRlcnN0YW5kIGl0cyBpbXBhY3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2xlZ2l0aW1pemVfbnMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL25zdHJlZS5jPTUzMT1ERUZJTkVfRlJFRShuc19wdXQsIHN0cnVjdCBuc19jb21tb24gKiwgaWYgKCFJU19FUlJfT1JfTlVMTChfVCkpIG5zX3B1dChfVCkpXG5rZXJuZWwvbnN0cmVlLmMtNTMyLVxua2VybmVsL25zdHJlZS5jOjUzMzpzdGF0aWMgaW5saW5lIHN0cnVjdCBuc19jb21tb24gKl9fbXVzdF9jaGVjayBsZWdpdGltaXplX25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXG5rZXJuZWwvbnN0cmVlLmMtNTM0LVx0XHRcdFx0XHRcdFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxuLS1cbmtlcm5lbC9uc3RyZWUuYz01NDU9c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zX3VzZXJucyhzdHJ1Y3Qga2xpc3RucyAqa2xzKVxuLS1cbmtlcm5lbC9uc3RyZWUuYy01ODktXG5rZXJuZWwvbnN0cmVlLmM6NTkwOlx0XHR2YWxpZCA9IGxlZ2l0aW1pemVfbnMoa2xzLCBucyk7XG5rZXJuZWwvbnN0cmVlLmMtNTkxLVx0XHRpZiAoIXZhbGlkKVxuLS1cbmtlcm5lbC9uc3RyZWUuYz02ODk9c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zKHN0cnVjdCBrbGlzdG5zICprbHMpXG4tLVxua2VybmVsL25zdHJlZS5jLTczMS1cbmtlcm5lbC9uc3RyZWUuYzo3MzI6XHRcdHZhbGlkID0gbGVnaXRpbWl6ZV9ucyhrbHMsIG5zKTtcbmtlcm5lbC9uc3RyZWUuYy03MzMtXHRcdGlmICghdmFsaWQpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU1NjYKCQkJCQkJCW91dHB1dDogMTgxCgkJCQkJCQl0aG91Z2h0czogOTk2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIE5hbWVzcGFjZSBMZWdpdGltYWN5IFBhdGNoKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRoYXQgaXQmIzM5O3MgYSBzaW1wbGlmaWNhdGlvbiwgYWltaW5nIGZvciBhIGxlYW5lciBhbmQgcG90ZW50aWFsbHkgbW9yZSBlZmZpY2llbnQgcGF0aCBpbiB0aGUgYGxlZ2l0aW1pemVfbnNgIGZ1bmN0aW9uIHdpdGhpbiBga2VybmVsL25zdHJlZS5jYC4gSSYjMzk7bSBzZWVpbmcgYSByZWZhY3RvcmluZyBmb2N1c2VkIG9uIG9wdGltaXppbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgY29uY2VybmluZyBuYW1lc3BhY2UgcmVmZXJlbmNlIGNvdW50aW5nIGFuZCBhY2Nlc3MgY29udHJvbC4KCkVzc2VudGlhbGx5LCB0aGUgcGF0Y2ggc3RyZWFtbGluZXMgdGhlIHByb2Nlc3MuIFRoZSBwcmV2aW91cyB2ZXJzaW9uLCBpZiBJIHJlY2FsbCBjb3JyZWN0bHksIHdhczogY2hlY2sgaWYgdGhlIG5hbWVzcGFjZSBpcyByZXF1ZXN0ZWQsIHRoZW4gYWNxdWlyZSBhIHJlZmVyZW5jZSwgY2hlY2sgcGVybWlzc2lvbnMsIGFuZCBmaW5hbGx5IHJldHVybiB0aGUgcmVmZXJlbmNlLiBOb3csIGl0IGFwcGVhcnMgdG8gYmU6IGNoZWNrIGlmIHRoZSBuYW1lc3BhY2UgaXMgcmVxdWVzdGVkLCAqdGhlbiogY2hlY2sgcGVybWlzc2lvbnMsIGFuZCAqb25seSB0aGVuKiBhY3F1aXJlIGEgcmVmZXJlbmNlIChpZiBwZXJtaXR0ZWQpLiBUaGlzIGxvb2tzIGxpa2UgYSBnb29kIGNoYW5nZS4gSXQgc2F2ZXMgYSBjYWxsIHRvIGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKClgIChhbmQgaXRzIGFzc29jaWF0ZWQgYG5zX3B1dCgpYCBpZiBwZXJtaXNzaW9uIGlzIGRlbmllZCksIGVsaW1pbmF0aW5nIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGFuZCBpdHMgY2xlYW51cC4KClRoZSBjcml0aWNhbCBwaWVjZSBoZXJlIGlzIHRoZSB1c2Ugb2YgYG1heV9saXN0X25zKClgLiBCYXNlZCBvbiB0aGUgY29kZSBjb21tZW50cywgaXQgc291bmRzIGxpa2UgdGhpcyBmdW5jdGlvbiBvbmx5IGNoZWNrcyBuYW1lc3BhY2UgcG9pbnRlcnMgYW5kIGZsYWdzLCB3aXRob3V0IGFjdHVhbGx5IGluY3JlYXNpbmcgdGhlIHJlZmVyZW5jZSBjb3VudC4gR29vZCwgdGhhdCYjMzk7cyB3aGF0IEkgZXhwZWN0ZWQuIFRoZSBzaW1wbGlmaWNhdGlvbiByZWR1Y2VzIHRoZSB0aW1lIGEgbG9jayBpcyBoZWxkLCB0aGF0IHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgcG90ZW50aWFsIGJsb2NraW5nIGNhbGxzLgoKTm93LCBsZXQmIzM5O3MgY29uc2lkZXIgdGhlIHBvdGVudGlhbCByaXNrcy4gTXkgcHJpbWFyeSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgbGVha3MsIG9yIHVzZS1hZnRlci1mcmVlIHNjZW5hcmlvcy4gSSYjMzk7bGwgbmVlZCB0byBjYXJlZnVsbHkgZXhhbWluZSB3aGV0aGVyIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhbnkgb2YgdGhvc2U6CgoqICAgKipVbmluaXRpYWxpemVkIG1lbW9yeToqKiBJJiMzOTttIG5vdCBzZWVpbmcgYW55IG5ldyBhbGxvY2F0aW9ucyBvciBtb2RpZmljYXRpb25zIG9mIGV4aXN0aW5nIHN0cnVjdHVyZXMgdGhhdCBjb3VsZCBsZWFkIHRvIHVuaW5pdGlhbGl6ZWQgZGF0YSBiZWluZyBleHBvc2VkLiBUaGUgYGNhbmRpZGF0ZWAgcG9pbnRlciBpcyBwYXNzZWQgaW4sIGBrbHNgIGlzIGFsc28gcGFzc2VkIGluLCBhbmQgdGhlcmUmIzM5O3Mgbm90aGluZyBoZXJlIHRoYXQgbG9va3Mgcmlza3kgZnJvbSB0aGUgc3VyZmFjZS4KKiAgICoqS2VybmVsLXRvLXVzZXIgbGVha3M6KiogTm8gbWVtb3J5IGNvcGllcyB0byB1c2VyIHNwYWNlLiBUaGlzIGlzIGEgYmlnIG9uZSB0byBydWxlIG91dC4gVGhpcyBwYXRjaCBkb2VzbiYjMzk7dCBzZWVtIHRvIGJlIG1vZGlmeWluZyBhbnkgc3RydWN0dXJlcyB0aGF0IGdldCBwYXNzZWQgdG8gdXNlciBzcGFjZS4gTm90aGluZyBvYnZpb3VzIHRvIHNlZS4KKiAgICoqQ29uY3VycmVuY3kvVUFGOioqIFdoaWxlIGBtYXlfbGlzdF9ucygpYCByZWFkaW5nIGBjYW5kaWRhdGVgIGJlZm9yZSBgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpYCBjb3VsZCAqcG90ZW50aWFsbHkqIGludHJvZHVjZSBpc3N1ZXMgd2l0aCBhIHJhY2UgY29uZGl0aW9uIChpZiB0aGUgbmFtZXNwYWNlJiMzOTtzIHN0YXRlIGNoYW5nZXMgYmV0d2VlbiB0aGUgY2hlY2tzKSwgdGhhdCB0eXBlIG9mIGNvbmNlcm4gaXMgc29tZXRoaW5nIHRoYXQgS0FTQU4gKEtlcm5lbCBBZGRyZXNzIFNhbml0aXplcikgaXMgZGVzaWduZWQgdG8gaGFuZGxlLiBUaGlzIGZhbGxzIHVuZGVyIHN0YW5kYXJkIG9iamVjdCBsaWZldGltZSBhbmQgcmVmZXJlbmNlIGNvdW50aW5nIHByb3RlY3Rpb25zLgoKSSBhbSBjb25maWRlbnQgdGhhdCBpdCBkb2VzIG5vdC4KClNvLCBmb3IgS01TQU4gKEtlcm5lbCBNZW1vcnkgU2FuaXRpemVyKSwgSSB0aGluayB3ZSYjMzk7cmUgc2FmZS4gTXkgY3JpdGVyaWEgaXMsIGFuZCBoYXMgYmVlbjoKCjEuICBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2U/IE5vLgoyLiAgQ29uZGl0aW9uYWwgbG9naWMgd2l0aCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8gTm8uCjMuICBDb21wbGV4IGRhdGEgc3RydWN0dXJlcyBpbml0aWFsaXphdGlvbiBpc3N1ZXM/IE5vLgo0LiAgQm91bmRzIGNoZWNrcy9sZW5ndGhzIHJpc2tzPyBOby4KCk5vLCB0aGlzIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlza3MgdGhhdCBLTVNBTiBpcyBkZXNpZ25lZCB0byBjYXRjaC4gVGhpcyBpcyBtb3JlIG9mIGEgdXNlLWFmdGVyLWZyZWUgc3R5bGUgaXNzdWUsIHNvbWV0aGluZyBLQVNBTiBvciBhbm90aGVyIHN0YW5kYXJkIGRldGVjdG9yIHdpbGwgaGFuZGxlLgoKVGhpcyBzZWVtcyBsaWtlIGEgc3RyYWlnaHRmb3J3YXJkIG9wdGltaXphdGlvbi4gVGhlIHBhdGNoIGNsZWFucyB1cCB0aGUgcmVmZXJlbmNlIGNvdW50aW5nIGFuZCBwZXJtaXNzaW9uIGNoZWNraW5nIGxvZ2ljIGluIGBsZWdpdGltaXplX25zKClgIGJ5IG9wdGltaXppbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMuIE5vIG1lbW9yeSBhbGxvY2F0aW9uIGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0aGF0IG1heSBsZWFrIHVuaW5pdGlhbGl6ZWQgYnl0ZXMuIEFueSBjb25jZXJucyBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgbm90IEtNU0FOLgoKSSYjMzk7ZCBjbGFzc2lmeSB0aGlzIGFzIGBOZWVkc0tNU0FOID0gZmFsc2VgLCBhbmQgSSYjMzk7bGwgc3VibWl0IHRoYXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGBsZWdpdGltaXplX25zKClgIGluIGBrZXJuZWwvbnN0cmVlLmNgIHRvIGNoZWNrIHBlcm1pc3Npb25zIChgbWF5X2xpc3RfbnMoKWApIGJlZm9yZSBhY3F1aXJpbmcgYSByZWZlcmVuY2UgKGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKClgKSwgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIGEgdGVtcG9yYXJ5IGF1dG8tY2xlYW51cCByZWZlcmVuY2UgKGBfX2ZyZWUobnNfcHV0KWApLiBcblxuVGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1hbmlwdWxhdGUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBuZXcgc3RhY2svaGVhcCBidWZmZXJzLCBvciBzdHJ1Y3QgcGFkZGluZywgbm9yIGRvZXMgaXQgYWx0ZXIgZGF0YSBjb3B5aW5nIHRvIHVzZXJzcGFjZSBpbiBhIG1hbm5lciB0aGF0IGNvdWxkIGxlYWsgdW5pbml0aWFsaXplZCBieXRlcy4gQW55IHBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgY2hhbmdlIHJlbGF0ZSB0byBvYmplY3QgbGlmZXRpbWUgb3IgUkNVIGRlcmVmZXJlbmNpbmcgYmVmb3JlIHJlZmVyZW5jZSBhY3F1aXNpdGlvbiwgd2hpY2ggYXJlIHN0cmljdGx5IHdpdGhpbiB0aGUgZG9tYWluIG9mIEtBU0FOIHJhdGhlciB0aGFuIEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgYGxlZ2l0aW1pemVfbnMoKWAgaW4gYGtlcm5lbC9uc3RyZWUuY2AgdG8gY2hlY2sgcGVybWlzc2lvbnMgKGBtYXlfbGlzdF9ucygpYCkgYmVmb3JlIGFjcXVpcmluZyBhIHJlZmVyZW5jZSAoYG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKWApLCBlbGltaW5hdGluZyB0aGUgbmVlZCBmb3IgYSB0ZW1wb3JhcnkgYXV0by1jbGVhbnVwIHJlZmVyZW5jZSAoYF9fZnJlZShuc19wdXQpYCkuIFxuXG5UaGlzIGNoYW5nZSBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbWFuaXB1bGF0ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIG5ldyBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIHN0cnVjdCBwYWRkaW5nLCBub3IgZG9lcyBpdCBhbHRlciBkYXRhIGNvcHlpbmcgdG8gdXNlcnNwYWNlIGluIGEgbWFubmVyIHRoYXQgY291bGQgbGVhayB1bmluaXRpYWxpemVkIGJ5dGVzLiBBbnkgcG90ZW50aWFsIHJpc2tzIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2UgcmVsYXRlIHRvIG9iamVjdCBsaWZldGltZSBvciBSQ1UgZGVyZWZlcmVuY2luZyBiZWZvcmUgcmVmZXJlbmNlIGFjcXVpc2l0aW9uLCB3aGljaCBhcmUgc3RyaWN0bHkgd2l0aGluIHRoZSBkb21haW4gb2YgS0FTQU4gcmF0aGVyIHRoYW4gS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA2OjI1Ljk2MjU2NDkxNloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzMzAzMDI0Njk5NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJOQU1FU1BBQ0VTXCIsXG4gICAgXCJVU0VSX05TXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19kb19zeXNfbGlzdG5zXCIsXG4gICAgXCJkb19saXN0bnNcIixcbiAgICBcImRvX2xpc3Ruc191c2VybnNcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGBsZWdpdGltaXplX25zKClgIGluIGBrZXJuZWwvbnN0cmVlLmNgIHRvIGNoZWNrIHBlcm1pc3Npb25zIChgbWF5X2xpc3RfbnMoKWApIGJlZm9yZSBhY3F1aXJpbmcgYSByZWZlcmVuY2UgKGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKClgKSwgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIGEgdGVtcG9yYXJ5IGF1dG8tY2xlYW51cCByZWZlcmVuY2UgKGBfX2ZyZWUobnNfcHV0KWApLiBcXG5cXG5UaGlzIGNoYW5nZSBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbWFuaXB1bGF0ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIG5ldyBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIHN0cnVjdCBwYWRkaW5nLCBub3IgZG9lcyBpdCBhbHRlciBkYXRhIGNvcHlpbmcgdG8gdXNlcnNwYWNlIGluIGEgbWFubmVyIHRoYXQgY291bGQgbGVhayB1bmluaXRpYWxpemVkIGJ5dGVzLiBBbnkgcG90ZW50aWFsIHJpc2tzIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2UgcmVsYXRlIHRvIG9iamVjdCBsaWZldGltZSBvciBSQ1UgZGVyZWZlcmVuY2luZyBiZWZvcmUgcmVmZXJlbmNlIGFjcXVpc2l0aW9uLCB3aGljaCBhcmUgc3RyaWN0bHkgd2l0aGluIHRoZSBkb21haW4gb2YgS0FTQU4gcmF0aGVyIHRoYW4gS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgbmFtZXNwYWNlIHRyZWUgaXRlcmF0aW9uIGFuZCBwZXJtaXNzaW9uIHZhbGlkYXRpb24gbG9naWMgaW4gbGVnaXRpbWl6ZV9ucygpLCB3aGljaCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBsaXN0bnMgc3lzdGVtIGNhbGwuIEl0IGNoYW5nZXMgd2hldGhlciBtYXlfbGlzdF9ucygpIGlzIGV2YWx1YXRlZCBiZWZvcmUgb3IgYWZ0ZXIgdGFraW5nIGEgcmVmZXJlbmNlIHZpYSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKCksIG1vZGlmeWluZyByZWFjaGFibGUgY29yZSBrZXJuZWwgY29kZSBhY2Nlc3NpYmxlIHRvIHVzZXJzcGFjZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6MjUuOTYyNTY5NjY2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MTM1MDAyOTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBmZjAwMTE2OTQzOTE0ZWNhNGU5YjExMjQwY2YzODQwZGMzN2VkOWQ5XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTdW4gU2VwIDYgMDE6MDY6MjUgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEva2VybmVsL25zdHJlZS5jIGIva2VybmVsL25zdHJlZS5jXFxuaW5kZXggNmQxMmU1OTAwYWMwMS4uODMxZjI3OWQxNzRhMyAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvbnN0cmVlLmNcXG4rKysgYi9rZXJuZWwvbnN0cmVlLmNcXG5AQCAtNTMzLDE5ICs1MzMsMTMgQEAgREVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxcbiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuc19jb21tb24gKl9fbXVzdF9jaGVjayBsZWdpdGltaXplX25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcXG4ge1xcbi1cXHRzdHJ1Y3QgbnNfY29tbW9uICpucyBfX2ZyZWUobnNfcHV0KSA9IE5VTEw7XFxuLVxcbiBcXHRpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpXFxuIFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4tXFx0bnMgPSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7XFxuLVxcdGlmICghbnMpXFxuLVxcdFxcdHJldHVybiBOVUxMO1xcbi1cXG4tXFx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIG5zKSlcXG4rXFx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIGNhbmRpZGF0ZSkpXFxuIFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4tXFx0cmV0dXJuIG5vX2ZyZWVfcHRyKG5zKTtcXG4rXFx0cmV0dXJuIG5zX2dldF91bmxlc3NfaW5hY3RpdmUoY2FuZGlkYXRlKTtcXG4gfVxcbiBcXG4gc3RhdGljIHNzaXplX3QgZG9fbGlzdG5zX3VzZXJucyhzdHJ1Y3Qga2xpc3RucyAqa2xzKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjoyNi40NzY3MzUzODhaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjEwMjU0MTgxMTk2OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJOQU1FU1BBQ0VTXCIsXG4gICAgXCJVU0VSX05TXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19kb19zeXNfbGlzdG5zXCIsXG4gICAgXCJkb19saXN0bnNcIixcbiAgICBcImRvX2xpc3Ruc191c2VybnNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBuYW1lc3BhY2UgdHJlZSBpdGVyYXRpb24gYW5kIHBlcm1pc3Npb24gdmFsaWRhdGlvbiBsb2dpYyBpbiBsZWdpdGltaXplX25zKCksIHdoaWNoIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGxpc3RucyBzeXN0ZW0gY2FsbC4gSXQgY2hhbmdlcyB3aGV0aGVyIG1heV9saXN0X25zKCkgaXMgZXZhbHVhdGVkIGJlZm9yZSBvciBhZnRlciB0YWtpbmcgYSByZWZlcmVuY2UgdmlhIG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKSwgbW9kaWZ5aW5nIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjb2RlIGFjY2Vzc2libGUgdG8gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGZmMDAxMTY5NDM5MTRlY2E0ZTliMTEyNDBjZjM4NDBkYzM3ZWQ5ZDlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDAxOjA2OjI1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL25zdHJlZS5jIGIva2VybmVsL25zdHJlZS5jXG5pbmRleCA2ZDEyZTU5MDBhYzAxLi44MzFmMjc5ZDE3NGEzIDEwMDY0NFxuLS0tIGEva2VybmVsL25zdHJlZS5jXG4rKysgYi9rZXJuZWwvbnN0cmVlLmNcbkBAIC01MzMsMTkgKzUzMywxMyBAQCBERUZJTkVfRlJFRShuc19wdXQsIHN0cnVjdCBuc19jb21tb24gKiwgaWYgKCFJU19FUlJfT1JfTlVMTChfVCkpIG5zX3B1dChfVCkpXG4gc3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxuIFx0XHRcdFx0XHRcdFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxuIHtcbi1cdHN0cnVjdCBuc19jb21tb24gKm5zIF9fZnJlZShuc19wdXQpID0gTlVMTDtcbi1cbiBcdGlmICghbnNfcmVxdWVzdGVkKGtscywgY2FuZGlkYXRlKSlcbiBcdFx0cmV0dXJuIE5VTEw7XG4gXG4tXHRucyA9IG5zX2dldF91bmxlc3NfaW5hY3RpdmUoY2FuZGlkYXRlKTtcbi1cdGlmICghbnMpXG4tXHRcdHJldHVybiBOVUxMO1xuLVxuLVx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIG5zKSlcbitcdGlmICghbWF5X2xpc3RfbnMoa2xzLCBjYW5kaWRhdGUpKVxuIFx0XHRyZXR1cm4gTlVMTDtcbiBcbi1cdHJldHVybiBub19mcmVlX3B0cihucyk7XG4rXHRyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpO1xuIH1cbiBcbiBzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjoyNi40NzY3MzY5NDhaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2NTkyMzYyNjc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIGhvdyBJJ2QgYXBwcm9hY2ggdGhpcyB0YXNrLCB3YWxraW5nIHRocm91Z2ggbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBgbnN0cmVlLmNgIENoYW5nZXMqKlxuXG5BbHJpZ2h0LCB0aGUgZmlyc3Qgc3RlcCBpcyBhbHdheXMgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBjaGFuZ2VzIHRoZW1zZWx2ZXMuIEknbSBnb2luZyB0byBwdWxsIHVwIHRoZSBwYXRjaCBhbmQgdGhlIG1vZGlmaWVkIGBrZXJuZWwvbnN0cmVlLmNgIGZpbGUuIEknbSBhbHJlYWR5IGFudGljaXBhdGluZyBzb21lIG9mIHRoZSB1c3VhbCBzdXNwZWN0cyB3aXRoIHRoZXNlIHR5cGVzIG9mIGZpbGUgbW9kaWZpY2F0aW9ucyDigJMgZGF0YSBzdHJ1Y3R1cmUgYWx0ZXJhdGlvbnMsIGZ1bmN0aW9uIHJlLXdyaXRlcywgcG90ZW50aWFsbHkgc29tZSBjb25jdXJyZW5jeSBjb25zaWRlcmF0aW9ucyBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYW55dGhpbmcgYWNjZXNzaW5nIHRoaXMgZmlsZSBzeXN0ZW0gY29kZS5cblxuTm93LCBpbnN0ZWFkIG9mIGp1c3QgcmVhZGluZyBsaW5lIGJ5IGxpbmUsIEknbGwgbGlrZWx5IGdvIHN0cmFpZ2h0IGZvciBzb21lIHRvb2xpbmcuIGByZWFkLWZpbGVgIGNvdWxkIGdpdmUgbWUgYSBxdWljaywgZm9ybWF0dGVkIG92ZXJ2aWV3IG9mIHRoZSBjb2RlLiBIb3dldmVyLCBteSBnby10byBpbiB0aGlzIHNpdHVhdGlvbiBpcyB1c3VhbGx5IGBncmVwcGVyYC4gSSdtIGdvaW5nIHRvIHNlYXJjaCBmb3IgYSBmZXcga2V5IHRoaW5ncyBkaXJlY3RseSBpbiB0aGUgcGF0Y2ggYW5kIHRoZW4gaW4gdGhlIGBuc3RyZWUuY2Agc291cmNlOlxuXG4qICAgKipLZXkgRGF0YSBTdHJ1Y3R1cmVzOioqIFdoYXQgYXJlIHRoZSBtYWpvciBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQ/IGBuc3RyZWVfbm9kZWAsIGBuc3RyZWVfcGF0aGAgb3Igc29tZXRoaW5nIHNpbWlsYXI/IEknbGwgZ3JlcCBmb3IgdGhvc2UgYW5kIGxvb2sgZm9yIHRoZWlyIGRlZmluaXRpb25zIGFuZCBhbnkgY2hhbmdlcyB0byB0aGVpciBmaWVsZHMuXG4qICAgKipLZXkgRnVuY3Rpb25zOioqIFdoYXQgYXJlIHRoZSBjb3JlIGZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgb24gdGhlIE5TVHJlZT8gYG5zdHJlZV9sb29rdXBgLCBgbnN0cmVlX2luc2VydGAsIGBuc3RyZWVfZGVsZXRlYCwgYG5zdHJlZV93YWxrYCAob3Igc2ltaWxhcik/IEknbGwgc2VhcmNoIGZvciB0aG9zZSBmdW5jdGlvbiBuYW1lcyB0byB1bmRlcnN0YW5kIHdoYXQncyBiZWluZyBtb2RpZmllZC5cbiogICAqKkVycm9yIEhhbmRsaW5nOioqIEFyZSB0aGVyZSBhbnkgbmV3IGVycm9yIGNvZGVzIG9yIGNoYW5nZXMgdG8gZXhpc3RpbmcgZXJyb3IgaGFuZGxpbmc/IFRoYXQncyBhbHdheXMgYSBjcml0aWNhbCBhc3BlY3QsIGFuZCBlYXN5IHRvIG1pc3MuXG4qICAgKipDb25jdXJyZW5jeToqKiBJcyB0aGVyZSBhbnkgdGhyZWFkaW5nLCBsb2NraW5nLCBvciBhdG9taWMgb3BlcmF0aW9ucyBpbnZvbHZlZD8gQW55IGNhbGxzIHRvIG11dGV4ZXMgb3IgYXRvbWljIHByaW1pdGl2ZXM/IFRoaXMgaXMgYSBodWdlIGFyZWEgZm9yIHByb2JsZW1zLCBzbyBJJ2xsIGJlIGV4dHJhIHZpZ2lsYW50IGhlcmUuXG5cblRoaXMgdGFyZ2V0ZWQgYXBwcm9hY2ggbGV0cyBtZSBxdWlja2x5IHBpbnBvaW50IHRoZSAqd2hhdCogYW5kICp3aGVyZSogb2YgdGhlIHBhdGNoLiBPbmNlIEkgaGF2ZSBhIGNsZWFyIGlkZWEgb2Ygd2hhdCdzICpiZWluZyogbW9kaWZpZWQsIEkgY2FuIHRoZW4gZGl2ZSBkZWVwZXIgaW50byB0aGUgKndoeSogb2YgdGhlIGNoYW5nZXMuIEknbGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByZWFzb25pbmcgYmVoaW5kIGVhY2ggb2YgdGhlIG1vZGlmaWNhdGlvbnMsIGFuZCB3aGV0aGVyIGl0IGNvdWxkIHBvdGVudGlhbGx5IGNhdXNlIHByb2JsZW1zLiBJJ2xsIHByb2JhYmx5IHNwZW5kIGEgZ29vZCBkZWFsIG9mIHRpbWUgdHJhY2luZyB0aHJvdWdoIHRoZSBrZXkgZnVuY3Rpb25zIGFuZCBob3cgdGhleSdyZSBpbnRlbmRlZCB0byB3b3JrIHVuZGVyIHZhcmlvdXMgY29uZGl0aW9ucyB0byBjb21lIHRvIGEgd2VsbCBpbmZvcm1lZCBjb25jbHVzaW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyOTg2LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjozMy4wNjkxMDI3NzVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjE1NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL25zdHJlZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUyMCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUyMDpcXHRcXHRpZiAoaXNfY3VycmVudF9uYW1lc3BhY2UobnMpKVxcbiA1MjE6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDUyMjpcXHRcXHRyZXR1cm4gbWF5X3NlZV9hbGxfbmFtZXNwYWNlcygpO1xcbiA1MjM6XFx0fVxcbiA1MjQ6XFx0XFxuIDUyNTpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbnNfcHV0KHN0cnVjdCBuc19jb21tb24gKm5zKVxcbiA1MjY6XFx0e1xcbiA1Mjc6XFx0XFx0aWYgKG5zIFxcdTAwMjZcXHUwMDI2IG5zLVxcdTAwM2VvcHMpXFxuIDUyODpcXHRcXHRcXHRucy1cXHUwMDNlb3BzLVxcdTAwM2VwdXQobnMpO1xcbiA1Mjk6XFx0fVxcbiA1MzA6XFx0XFxuIDUzMTpcXHRERUZJTkVfRlJFRShuc19wdXQsIHN0cnVjdCBuc19jb21tb24gKiwgaWYgKCFJU19FUlJfT1JfTlVMTChfVCkpIG5zX3B1dChfVCkpXFxuIDUzMjpcXHRcXG4gNTMzOlxcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5zX2NvbW1vbiAqX19tdXN0X2NoZWNrIGxlZ2l0aW1pemVfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcXG4gNTM0OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcXG4gNTM1OlxcdHtcXG4gNTM2OlxcdFxcdGlmICghbnNfcmVxdWVzdGVkKGtscywgY2FuZGlkYXRlKSlcXG4gNTM3OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiA1Mzg6XFx0XFxuIDUzOTpcXHRcXHRpZiAoIW1heV9saXN0X25zKGtscywgY2FuZGlkYXRlKSlcXG4gNTQwOlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiA1NDE6XFx0XFxuIDU0MjpcXHRcXHRyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpO1xcbiA1NDM6XFx0fVxcbiA1NDQ6XFx0XFxuIDU0NTpcXHRzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXFxuIDU0NjpcXHR7XFxuIDU0NzpcXHRcXHR1NjQgX191c2VyICpuc19pZHMgPSBrbHMtXFx1MDAzZXVuc19pZHM7XFxuIDU0ODpcXHRcXHRzaXplX3QgbnJfbnNfaWRzID0ga2xzLVxcdTAwM2Vucl9uc19pZHM7XFxuIDU0OTpcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICpucyA9IE5VTEwsICpmaXJzdF9ucyA9IE5VTEwsICpwcmV2ID0gTlVMTDtcXG4gNTUwOlxcdFxcdGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7XFxuIDU1MTpcXHRcXHRzc2l6ZV90IHJldDtcXG4gNTUyOlxcdFxcbiA1NTM6XFx0XFx0VkZTX1dBUk5fT05fT05DRSgha2xzLVxcdTAwM2V1c2VyX25zX2lkKTtcXG4gNTU0OlxcdFxcbiA1NTU6XFx0XFx0aWYgKGtscy1cXHUwMDNldXNlcl9uc19pZCA9PSBMSVNUTlNfQ1VSUkVOVF9VU0VSKVxcbiA1NTY6XFx0XFx0XFx0bnMgPSB0b19uc19jb21tb24oY3VycmVudF91c2VyX25zKCkpO1xcbiA1NTc6XFx0XFx0ZWxzZSBpZiAoa2xzLVxcdTAwM2V1c2VyX25zX2lkKVxcbiA1NTg6XFx0XFx0XFx0bnMgPSBsb29rdXBfbnNfaWQoa2xzLVxcdTAwM2V1c2VyX25zX2lkLCBDTE9ORV9ORVdVU0VSKTtcXG4gNTU5OlxcdFxcdGlmICghbnMpXFxuIDU2MDpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNTYxOlxcdFxcdGtscy1cXHUwMDNldXNlcl9ucyA9IHRvX3VzZXJfbnMobnMpO1xcbiA1NjI6XFx0XFxuIDU2MzpcXHRcXHQvKlxcbiA1NjQ6XFx0XFx0ICogVXNlIHRoZSByYnRyZWUgdG8gZmluZCB0aGUgZmlyc3QgbmFtZXNwYWNlIHdlIGNhcmUgYWJvdXQgYW5kXFxuIDU2NTpcXHRcXHQgKiB0aGVuIHVzZSBpdCdzIGxpc3QgZW50cnkgdG8gaXRlcmF0ZSBmcm9tIHRoZXJlLlxcbiA1NjY6XFx0XFx0ICovXFxuIDU2NzpcXHRcXHRpZiAoa2xzLVxcdTAwM2VsYXN0X25zX2lkKSB7XFxuIDU2ODpcXHRcXHRcXHRrbHMtXFx1MDAzZWZpcnN0X25zID0gbG9va3VwX25zX293bmVyX2F0KGtscy1cXHUwMDNlbGFzdF9uc19pZCArIDEsIG5zKTtcXG4gNTY5OlxcdFxcdFxcdGlmICgha2xzLVxcdTAwM2VmaXJzdF9ucylcXG4gNTcwOlxcdFxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbiA1NzE6XFx0XFx0XFx0Zmlyc3RfbnMgPSBrbHMtXFx1MDAzZWZpcnN0X25zO1xcbiA1NzI6XFx0XFx0fVxcbiA1NzM6XFx0XFxuIDU3NDpcXHRcXHRyZXQgPSAwO1xcbiA1NzU6XFx0XFx0aGVhZCA9IFxcdTAwMjZ0b19uc19jb21tb24oa2xzLVxcdTAwM2V1c2VyX25zKS1cXHUwMDNlbnNfb3duZXJfcm9vdC5uc19saXN0X2hlYWQ7XFxuIDU3NjpcXHRcXHRrbHMtXFx1MDAzZXVzZXJuc19jYXBhYmxlID0gbWF5X3NlZV9hbGxfbmFtZXNwYWNlcygpO1xcbiA1Nzc6XFx0XFxuIDU3ODpcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIDU3OTpcXHRcXG4gNTgwOlxcdFxcdGlmICghZmlyc3RfbnMpXFxuIDU4MTpcXHRcXHRcXHRmaXJzdF9ucyA9IGxpc3RfZW50cnlfcmN1KGhlYWQtXFx1MDAzZW5leHQsIHR5cGVvZigqZmlyc3RfbnMpLCBuc19vd25lcl9ub2RlLm5zX2xpc3RfZW50cnkpO1xcbiA1ODI6XFx0XFxuIDU4MzpcXHRcXHRucyA9IGZpcnN0X25zO1xcbiA1ODQ6XFx0XFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tX3JjdShucywgaGVhZCwgbnNfb3duZXJfbm9kZS5uc19saXN0X2VudHJ5KSB7XFxuIDU4NTpcXHRcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICp2YWxpZDtcXG4gNTg2OlxcdFxcbiA1ODc6XFx0XFx0XFx0aWYgKCFucl9uc19pZHMpXFxuIDU4ODpcXHRcXHRcXHRcXHRicmVhaztcXG4gNTg5OlxcdFxcbiA1OTA6XFx0XFx0XFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xcbiA1OTE6XFx0XFx0XFx0aWYgKCF2YWxpZClcXG4gNTkyOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiA1OTM6XFx0XFxuIDU5NDpcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gNTk1OlxcdFxcbiA1OTY6XFx0XFx0XFx0bnNfcHV0KHByZXYpO1xcbiA1OTc6XFx0XFx0XFx0cHJldiA9IHZhbGlkO1xcbiA1OTg6XFx0XFxuIDU5OTpcXHRcXHRcXHRpZiAocHV0X3VzZXIodmFsaWQtXFx1MDAzZW5zX2lkLCBuc19pZHMgKyByZXQpKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA2OjMzLjA2OTIyNzA1NVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5OTYwNzk2NjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSBrZXJuZWwvbnN0cmVlLmMgaW52ZXN0aWdhdGlvbiwgYmFzZWQgb24gdGhlIHByb21wdDpcblxuKipEaXZpbmcgRGVlcGVyIGludG8gYGtlcm5lbC9uc3RyZWUuY2AqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCBhIGRlY2VudCBncmFzcCBvbiB3aGF0IGBuc3RyZWUuY2AgKmlzKiBmcm9tIHRoZSBpbml0aWFsIGdsYW5jZSwgYnV0IEkgcmVhbGx5IG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY29udGV4dC4gS25vd2luZyB0aGUgcHVycG9zZSBpcyBvbmUgdGhpbmcsIGJ1dCBob3cgaXQncyBhY3R1YWxseSAqdXNlZCogaXMgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIGl0cyByZWFsIGltcGFjdC4gSSBuZWVkIHRvIHNlZSB0aGUgcmVzdCBvZiB0aGUgZmlsZSB0byBncmFzcCBpdHMgaW50ZXJuYWwgd29ya2luZ3MsIG9mIGNvdXJzZSwgYnV0IG1vcmUgaW1wb3J0YW50bHksIGhvdyB0aGUga2VybmVsIGludGVyYWN0cyB3aXRoIGl0LCBob3cgaXQncyBsaW5rZWQsIGFuZCBob3cgaXQncyBjb25maWd1cmVkIGFyZSB3aGVyZSBJ4oCZbGwgZmluZCB0aGUgdHJ1ZSBzaWduaWZpY2FuY2UuIElzIGl0IGEgY29yZSBjb21wb25lbnQgb3IgbW9yZSBvZiBhIHN1cHBvcnRpbmcgbGlicmFyeT8gV2hhdCBvdGhlciBzdWJzeXN0ZW1zIGRlcGVuZCBvbiBpdD8gSSdtIHRoaW5raW5nIEkgbmVlZCB0byBmaW5kIHRoZSBjYWxscyB0byB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhhdCBmaWxlLiBJIGFtIGxvb2tpbmcgZm9yIHRoZSBicm9hZGVyIHN5c3RlbS1sZXZlbCBpbnRlcmFjdGlvbnMgbm93LiBUaGlzIHdpbGwgc2hhcGUgbXkgZmluYWwgYW5hbHlzaXMuIExldCdzIHNlZSBob3cgdGhpcyB0aGluZyAqYWN0dWFsbHkqIHdvcmtzIGluIHRoZSBncmFuZCBzY2hlbWUgb2YgdGhpbmdzIVxuXG5cbiIsIklucHV0VG9rZW5zIjo0ODAwLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjozNS4wNjUzMTA1ODVaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDk4OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL25zdHJlZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdC8qIENvcHlyaWdodCAoYykgMjAyNSBDaHJpc3RpYW4gQnJhdW5lciBcXHUwMDNjYnJhdW5lckBrZXJuZWwub3JnXFx1MDAzZSAqL1xcbiAgIDM6XFx0XFxuICAgNDpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbnN0cmVlLmhcXHUwMDNlXFxuICAgNTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvcHJvY19ucy5oXFx1MDAzZVxcbiAgIDY6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JjdWxpc3QuaFxcdTAwM2VcXG4gICA3OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC92ZnNkZWJ1Zy5oXFx1MDAzZVxcbiAgIDg6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N5c2NhbGxzLmhcXHUwMDNlXFxuICAgOTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvdXNlcl9uYW1lc3BhY2UuaFxcdTAwM2VcXG4gIDEwOlxcdFxcbiAgMTE6XFx0c3RhdGljIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wIERFRklORV9TRVFMT0NLKG5zX3RyZWVfbG9jayk7XFxuICAxMjpcXHRcXG4gIDEzOlxcdERFRklORV9MT0NLX0dVQVJEXzAobnNfdHJlZV93cml0ZXIsXFxuICAxNDpcXHRcXHRcXHQgICAgd3JpdGVfc2VxbG9jayhcXHUwMDI2bnNfdHJlZV9sb2NrKSxcXG4gIDE1OlxcdFxcdFxcdCAgICB3cml0ZV9zZXF1bmxvY2soXFx1MDAyNm5zX3RyZWVfbG9jaykpXFxuICAxNjpcXHRcXG4gIDE3OlxcdERFRklORV9MT0NLX0dVQVJEXzAobnNfdHJlZV9sb2NrZWRfcmVhZGVyLFxcbiAgMTg6XFx0XFx0XFx0ICAgIHJlYWRfc2VxbG9ja19leGNsKFxcdTAwMjZuc190cmVlX2xvY2spLFxcbiAgMTk6XFx0XFx0XFx0ICAgIHJlYWRfc2VxdW5sb2NrX2V4Y2woXFx1MDAyNm5zX3RyZWVfbG9jaykpXFxuICAyMDpcXHRcXG4gIDIxOlxcdHN0YXRpYyBzdHJ1Y3QgbnNfdHJlZV9yb290IG5zX3VuaWZpZWRfcm9vdCA9IHsgLyogcHJvdGVjdGVkIGJ5IG5zX3RyZWVfbG9jayAqL1xcbiAgMjI6XFx0XFx0Lm5zX3JiID0gUkJfUk9PVCxcXG4gIDIzOlxcdFxcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChuc191bmlmaWVkX3Jvb3QubnNfbGlzdF9oZWFkKSxcXG4gIDI0OlxcdH07XFxuICAyNTpcXHRcXG4gIDI2OlxcdHN0cnVjdCBuc190cmVlX3Jvb3QgbW50X25zX3RyZWUgPSB7XFxuICAyNzpcXHRcXHQubnNfcmIgPSBSQl9ST09ULFxcbiAgMjg6XFx0XFx0Lm5zX2xpc3RfaGVhZCA9IExJU1RfSEVBRF9JTklUKG1udF9uc190cmVlLm5zX2xpc3RfaGVhZCksXFxuICAyOTpcXHR9O1xcbiAgMzA6XFx0XFxuICAzMTpcXHRzdHJ1Y3QgbnNfdHJlZV9yb290IG5ldF9uc190cmVlID0ge1xcbiAgMzI6XFx0XFx0Lm5zX3JiID0gUkJfUk9PVCxcXG4gIDMzOlxcdFxcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChuZXRfbnNfdHJlZS5uc19saXN0X2hlYWQpLFxcbiAgMzQ6XFx0fTtcXG4gIDM1OlxcdEVYUE9SVF9TWU1CT0xfR1BMKG5ldF9uc190cmVlKTtcXG4gIDM2OlxcdFxcbiAgMzc6XFx0c3RydWN0IG5zX3RyZWVfcm9vdCB1dHNfbnNfdHJlZSA9IHtcXG4gIDM4OlxcdFxcdC5uc19yYiA9IFJCX1JPT1QsXFxuICAzOTpcXHRcXHQubnNfbGlzdF9oZWFkID0gTElTVF9IRUFEX0lOSVQodXRzX25zX3RyZWUubnNfbGlzdF9oZWFkKSxcXG4gIDQwOlxcdH07XFxuICA0MTpcXHRcXG4gIDQyOlxcdHN0cnVjdCBuc190cmVlX3Jvb3QgdXNlcl9uc190cmVlID0ge1xcbiAgNDM6XFx0XFx0Lm5zX3JiID0gUkJfUk9PVCxcXG4gIDQ0OlxcdFxcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVCh1c2VyX25zX3RyZWUubnNfbGlzdF9oZWFkKSxcXG4gIDQ1OlxcdH07XFxuICA0NjpcXHRcXG4gIDQ3OlxcdHN0cnVjdCBuc190cmVlX3Jvb3QgaXBjX25zX3RyZWUgPSB7XFxuICA0ODpcXHRcXHQubnNfcmIgPSBSQl9ST09ULFxcbiAgNDk6XFx0XFx0Lm5zX2xpc3RfaGVhZCA9IExJU1RfSEVBRF9JTklUKGlwY19uc190cmVlLm5zX2xpc3RfaGVhZCksXFxuICA1MDpcXHR9O1xcbiAgNTE6XFx0XFxuICA1MjpcXHRzdHJ1Y3QgbnNfdHJlZV9yb290IHBpZF9uc190cmVlID0ge1xcbiAgNTM6XFx0XFx0Lm5zX3JiID0gUkJfUk9PVCxcXG4gIDU0OlxcdFxcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChwaWRfbnNfdHJlZS5uc19saXN0X2hlYWQpLFxcbiAgNTU6XFx0fTtcXG4gIDU2OlxcdFxcbiAgNTc6XFx0c3RydWN0IG5zX3RyZWVfcm9vdCBjZ3JvdXBfbnNfdHJlZSA9IHtcXG4gIDU4OlxcdFxcdC5uc19yYiA9IFJCX1JPT1QsXFxuICA1OTpcXHRcXHQubnNfbGlzdF9oZWFkID0gTElTVF9IRUFEX0lOSVQoY2dyb3VwX25zX3RyZWUubnNfbGlzdF9oZWFkKSxcXG4gIDYwOlxcdH07XFxuICA2MTpcXHRcXG4gIDYyOlxcdHN0cnVjdCBuc190cmVlX3Jvb3QgdGltZV9uc190cmVlID0ge1xcbiAgNjM6XFx0XFx0Lm5zX3JiID0gUkJfUk9PVCxcXG4gIDY0OlxcdFxcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVCh0aW1lX25zX3RyZWUubnNfbGlzdF9oZWFkKSxcXG4gIDY1OlxcdH07XFxuICA2NjpcXHRcXG4gIDY3OlxcdC8qKlxcbiAgNjg6XFx0ICogbnNfdHJlZV9ub2RlX2luaXQgLSBJbml0aWFsaXplIGEgbmFtZXNwYWNlIHRyZWUgbm9kZVxcbiAgNjk6XFx0ICogQG5vZGU6IFRoZSBub2RlIHRvIGluaXRpYWxpemVcXG4gIDcwOlxcdCAqXFxuICA3MTpcXHQgKiBJbml0aWFsaXplcyBib3RoIHRoZSByYnRyZWUgbm9kZSBhbmQgbGlzdCBlbnRyeS5cXG4gIDcyOlxcdCAqL1xcbiAgNzM6XFx0dm9pZCBuc190cmVlX25vZGVfaW5pdChzdHJ1Y3QgbnNfdHJlZV9ub2RlICpub2RlKVxcbiAgNzQ6XFx0e1xcbiAgNzU6XFx0XFx0UkJfQ0xFQVJfTk9ERShcXHUwMDI2bm9kZS1cXHUwMDNlbnNfbm9kZSk7XFxuICA3NjpcXHRcXHRJTklUX0xJU1RfSEVBRChcXHUwMDI2bm9kZS1cXHUwMDNlbnNfbGlzdF9lbnRyeSk7XFxuICA3NzpcXHR9XFxuICA3ODpcXHRcXG4gIDc5OlxcdC8qKlxcbiAgODA6XFx0ICogbnNfdHJlZV9yb290X2luaXQgLSBJbml0aWFsaXplIGEgbmFtZXNwYWNlIHRyZWUgcm9vdFxcbiAgODE6XFx0ICogQHJvb3Q6IFRoZSByb290IHRvIGluaXRpYWxpemVcXG4gIDgyOlxcdCAqXFxuICA4MzpcXHQgKiBJbml0aWFsaXplcyBib3RoIHRoZSByYnRyZWUgcm9vdCBhbmQgbGlzdCBoZWFkLlxcbiAgODQ6XFx0ICovXFxuICA4NTpcXHR2b2lkIG5zX3RyZWVfcm9vdF9pbml0KHN0cnVjdCBuc190cmVlX3Jvb3QgKnJvb3QpXFxuICA4NjpcXHR7XFxuICA4NzpcXHRcXHRyb290LVxcdTAwM2Vuc19yYiA9IFJCX1JPT1Q7XFxuICA4ODpcXHRcXHRJTklUX0xJU1RfSEVBRChcXHUwMDI2cm9vdC1cXHUwMDNlbnNfbGlzdF9oZWFkKTtcXG4gIDg5OlxcdH1cXG4gIDkwOlxcdFxcbiAgOTE6XFx0LyoqXFxuICA5MjpcXHQgKiBuc190cmVlX25vZGVfZW1wdHkgLSBDaGVjayBpZiBhIG5hbWVzcGFjZSB0cmVlIG5vZGUgaXMgZW1wdHlcXG4gIDkzOlxcdCAqIEBub2RlOiBUaGUgbm9kZSB0byBjaGVja1xcbiAgOTQ6XFx0ICpcXG4gIDk1OlxcdCAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBub3QgaW4gYW55IHRyZWUuXFxuICA5NjpcXHQgKi9cXG4gIDk3OlxcdGJvb2wgbnNfdHJlZV9ub2RlX2VtcHR5KGNvbnN0IHN0cnVjdCBuc190cmVlX25vZGUgKm5vZGUpXFxuICA5ODpcXHR7XFxuICA5OTpcXHRcXHRyZXR1cm4gUkJfRU1QVFlfTk9ERShcXHUwMDI2bm9kZS1cXHUwMDNlbnNfbm9kZSk7XFxuIDEwMDpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA2OjM1LjA2NTQyMjgxNVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5OTM2MDk0NjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIEJhY2sgaW50byBga2VybmVsL25zdHJlZS5jYCoqXG5cbkFscmlnaHQsIGxldCdzIHBpY2sgdXAgd2hlcmUgd2UgbGVmdCBvZmYsIG9yIHJhdGhlciwgd2hlcmUgSSBsZWZ0IG9mZiBpbiBteSBtZW50YWwgbWFwIG9mIHRoZSBga2VybmVsL25zdHJlZS5jYCBpbXBsZW1lbnRhdGlvbi4gSSBuZWVkIHRvIGdldCBiYWNrIGludG8gdGhlIGxhdHRlciBoYWxmIG9mIHRoZSBmaWxlLCBzdGFydGluZyBmcm9tIGxpbmUgNjAwLiBJJ20gZm9jdXNpbmcgb24gdGhlIGludHJpY2FjaWVzIG9mIHRoZSBuYW1lc3BhY2UgdHJlZSBzdHJ1Y3R1cmUgYW5kIGhvdyBpdCBoYW5kbGVzIHBhdGggcmVzb2x1dGlvbiBhbmQgbmFtZXNwYWNlIG9wZXJhdGlvbnMuIEknbSBzcGVjaWZpY2FsbHkgbG9va2luZyBmb3IgYW55dGhpbmcgdGhhdCBtaWdodCBzaGVkIGxpZ2h0IG9uIGhvdyB0aGV5IG1hbmFnZSBuZXN0ZWQgbmFtZXNwYWNlcyBhbmQgcG90ZW50aWFsIGVkZ2UgY2FzZXMgYXJvdW5kIG1vdW50IHByb3BhZ2F0aW9uLiBMZXQncyBzZWUgaWYgdGhlcmUgYXJlIGFueSBzdWJ0bGUgb3B0aW1pemF0aW9uIHRlY2huaXF1ZXMgdXNlZCBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NTkyLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjozNy4wNTkwMzQ3ODZaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTA0MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL25zdHJlZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYwMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2MDA6XFx0XFx0XFx0XFx0bnNfcHV0KHByZXYpO1xcbiA2MDE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIDYwMjpcXHRcXHRcXHR9XFxuIDYwMzpcXHRcXG4gNjA0OlxcdFxcdFxcdG5yX25zX2lkcy0tO1xcbiA2MDU6XFx0XFx0XFx0cmV0Kys7XFxuIDYwNjpcXHRcXG4gNjA3OlxcdFxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gNjA4OlxcdFxcdH1cXG4gNjA5OlxcdFxcbiA2MTA6XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuIDYxMTpcXHRcXHRuc19wdXQocHJldik7XFxuIDYxMjpcXHRcXHRyZXR1cm4gcmV0O1xcbiA2MTM6XFx0fVxcbiA2MTQ6XFx0XFxuIDYxNTpcXHQvKlxcbiA2MTY6XFx0ICogTG9va3VwIGEgbmFtZXNwYWNlIHdpdGggaWQgXFx1MDAzZT0gbnNfaWQgaW4gZWl0aGVyIHRoZSB1bmlmaWVkIHRyZWUgb3IgYSB0eXBlLXNwZWNpZmljIHRyZWUuXFxuIDYxNzpcXHQgKiBSZXR1cm5zIHRoZSBuYW1lc3BhY2Ugd2l0aCB0aGUgc21hbGxlc3QgaWQgdGhhdCBpcyBcXHUwMDNlPSBuc19pZC5cXG4gNjE4OlxcdCAqL1xcbiA2MTk6XFx0c3RhdGljIHN0cnVjdCBuc19jb21tb24gKmxvb2t1cF9uc19pZF9hdCh1NjQgbnNfaWQsIGludCBuc190eXBlKVxcbiA2MjA6XFx0e1xcbiA2MjE6XFx0XFx0c3RydWN0IG5zX2NvbW1vbiAqcmV0ID0gTlVMTDtcXG4gNjIyOlxcdFxcdHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUgPSBOVUxMO1xcbiA2MjM6XFx0XFx0c3RydWN0IHJiX25vZGUgKm5vZGU7XFxuIDYyNDpcXHRcXG4gNjI1OlxcdFxcdGlmIChuc190eXBlKSB7XFxuIDYyNjpcXHRcXHRcXHRuc190cmVlID0gbnNfdHJlZV9mcm9tX3R5cGUobnNfdHlwZSk7XFxuIDYyNzpcXHRcXHRcXHRpZiAoIW5zX3RyZWUpXFxuIDYyODpcXHRcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gNjI5OlxcdFxcdH1cXG4gNjMwOlxcdFxcbiA2MzE6XFx0XFx0Z3VhcmQobnNfdHJlZV9sb2NrZWRfcmVhZGVyKSgpO1xcbiA2MzI6XFx0XFxuIDYzMzpcXHRcXHRpZiAobnNfdHJlZSlcXG4gNjM0OlxcdFxcdFxcdG5vZGUgPSBuc190cmVlLVxcdTAwM2Vuc19yYi5yYl9ub2RlO1xcbiA2MzU6XFx0XFx0ZWxzZVxcbiA2MzY6XFx0XFx0XFx0bm9kZSA9IG5zX3VuaWZpZWRfcm9vdC5uc19yYi5yYl9ub2RlO1xcbiA2Mzc6XFx0XFxuIDYzODpcXHRcXHR3aGlsZSAobm9kZSkge1xcbiA2Mzk6XFx0XFx0XFx0c3RydWN0IG5zX2NvbW1vbiAqbnM7XFxuIDY0MDpcXHRcXG4gNjQxOlxcdFxcdFxcdGlmIChuc190eXBlKVxcbiA2NDI6XFx0XFx0XFx0XFx0bnMgPSBub2RlX3RvX25zKG5vZGUpO1xcbiA2NDM6XFx0XFx0XFx0ZWxzZVxcbiA2NDQ6XFx0XFx0XFx0XFx0bnMgPSBub2RlX3RvX25zX3VuaWZpZWQobm9kZSk7XFxuIDY0NTpcXHRcXG4gNjQ2OlxcdFxcdFxcdGlmIChuc19pZCBcXHUwMDNjPSBucy1cXHUwMDNlbnNfaWQpIHtcXG4gNjQ3OlxcdFxcdFxcdFxcdGlmIChuc190eXBlKVxcbiA2NDg6XFx0XFx0XFx0XFx0XFx0cmV0ID0gbm9kZV90b19ucyhub2RlKTtcXG4gNjQ5OlxcdFxcdFxcdFxcdGVsc2VcXG4gNjUwOlxcdFxcdFxcdFxcdFxcdHJldCA9IG5vZGVfdG9fbnNfdW5pZmllZChub2RlKTtcXG4gNjUxOlxcdFxcdFxcdFxcdGlmIChuc19pZCA9PSBucy1cXHUwMDNlbnNfaWQpXFxuIDY1MjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gNjUzOlxcdFxcdFxcdFxcdG5vZGUgPSBub2RlLVxcdTAwM2VyYl9sZWZ0O1xcbiA2NTQ6XFx0XFx0XFx0fSBlbHNlIHtcXG4gNjU1OlxcdFxcdFxcdFxcdG5vZGUgPSBub2RlLVxcdTAwM2VyYl9yaWdodDtcXG4gNjU2OlxcdFxcdFxcdH1cXG4gNjU3OlxcdFxcdH1cXG4gNjU4OlxcdFxcbiA2NTk6XFx0XFx0aWYgKHJldClcXG4gNjYwOlxcdFxcdFxcdHJldCA9IG5zX2dldF91bmxlc3NfaW5hY3RpdmUocmV0KTtcXG4gNjYxOlxcdFxcdHJldHVybiByZXQ7XFxuIDY2MjpcXHR9XFxuIDY2MzpcXHRcXG4gNjY0OlxcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5zX2NvbW1vbiAqZmlyc3RfbnNfY29tbW9uKGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsXFxuIDY2NTpcXHRcXHRcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbnNfdHJlZV9yb290ICpuc190cmVlKVxcbiA2NjY6XFx0e1xcbiA2Njc6XFx0XFx0aWYgKG5zX3RyZWUpXFxuIDY2ODpcXHRcXHRcXHRyZXR1cm4gbGlzdF9lbnRyeV9yY3UoaGVhZC1cXHUwMDNlbmV4dCwgc3RydWN0IG5zX2NvbW1vbiwgbnNfdHJlZV9ub2RlLm5zX2xpc3RfZW50cnkpO1xcbiA2Njk6XFx0XFx0cmV0dXJuIGxpc3RfZW50cnlfcmN1KGhlYWQtXFx1MDAzZW5leHQsIHN0cnVjdCBuc19jb21tb24sIG5zX3VuaWZpZWRfbm9kZS5uc19saXN0X2VudHJ5KTtcXG4gNjcwOlxcdH1cXG4gNjcxOlxcdFxcbiA2NzI6XFx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpuZXh0X25zX2NvbW1vbihzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4gNjczOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgbnNfdHJlZV9yb290ICpuc190cmVlKVxcbiA2NzQ6XFx0e1xcbiA2NzU6XFx0XFx0aWYgKG5zX3RyZWUpXFxuIDY3NjpcXHRcXHRcXHRyZXR1cm4gbGlzdF9lbnRyeV9yY3UobnMtXFx1MDAzZW5zX3RyZWVfbm9kZS5uc19saXN0X2VudHJ5Lm5leHQsIHN0cnVjdCBuc19jb21tb24sIG5zX3RyZWVfbm9kZS5uc19saXN0X2VudHJ5KTtcXG4gNjc3OlxcdFxcdHJldHVybiBsaXN0X2VudHJ5X3JjdShucy1cXHUwMDNlbnNfdW5pZmllZF9ub2RlLm5zX2xpc3RfZW50cnkubmV4dCwgc3RydWN0IG5zX2NvbW1vbiwgbnNfdW5pZmllZF9ub2RlLm5zX2xpc3RfZW50cnkpO1xcbiA2Nzg6XFx0fVxcbiA2Nzk6XFx0XFxuIDY4MDpcXHRzdGF0aWMgaW5saW5lIGJvb2wgbnNfY29tbW9uX2lzX2hlYWQoc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuIDY4MTpcXHRcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsXFxuIDY4MjpcXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUpXFxuIDY4MzpcXHR7XFxuIDY4NDpcXHRcXHRpZiAobnNfdHJlZSlcXG4gNjg1OlxcdFxcdFxcdHJldHVybiBcXHUwMDI2bnMtXFx1MDAzZW5zX3RyZWVfbm9kZS5uc19saXN0X2VudHJ5ID09IGhlYWQ7XFxuIDY4NjpcXHRcXHRyZXR1cm4gXFx1MDAyNm5zLVxcdTAwM2Vuc191bmlmaWVkX25vZGUubnNfbGlzdF9lbnRyeSA9PSBoZWFkO1xcbiA2ODc6XFx0fVxcbiA2ODg6XFx0XFxuIDY4OTpcXHRzdGF0aWMgc3NpemVfdCBkb19saXN0bnMoc3RydWN0IGtsaXN0bnMgKmtscylcXG4gNjkwOlxcdHtcXG4gNjkxOlxcdFxcdHU2NCBfX3VzZXIgKm5zX2lkcyA9IGtscy1cXHUwMDNldW5zX2lkcztcXG4gNjkyOlxcdFxcdHNpemVfdCBucl9uc19pZHMgPSBrbHMtXFx1MDAzZW5yX25zX2lkcztcXG4gNjkzOlxcdFxcdHN0cnVjdCBuc19jb21tb24gKm5zLCAqZmlyc3RfbnMgPSBOVUxMLCAqcHJldiA9IE5VTEw7XFxuIDY5NDpcXHRcXHRzdHJ1Y3QgbnNfdHJlZV9yb290ICpuc190cmVlID0gTlVMTDtcXG4gNjk1OlxcdFxcdGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7XFxuIDY5NjpcXHRcXHR1MzIgbnNfdHlwZTtcXG4gNjk3OlxcdFxcdHNzaXplX3QgcmV0O1xcbiA2OTg6XFx0XFxuIDY5OTpcXHRcXHRpZiAoaHdlaWdodDMyKGtscy1cXHUwMDNlbnNfdHlwZSkgPT0gMSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6MzcuMDU5MTQ4MzA2WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTYxMTA2NjYxOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoZSByZXN0IG9mIGBrZXJuZWwvbnN0cmVlLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIG1vZHVsZSdzIGludGVyYWN0aW9uIHdpdGggdGhlIHN5c3RlbSBjYWxscyBhbmQgYW55IG90aGVyIGtleSBmdW5jdGlvbnMuIEknbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBpZGVudGlmeWluZyB0aGUgZW50cnkgcG9pbnRzIHRoYXQgYXJlIHJlbGV2YW50IHRvIG15IGN1cnJlbnQgYW5hbHlzaXMuIFVuZGVyc3RhbmRpbmcgdGhlc2UgZW50cnkgcG9pbnRzIGlzIGNydWNpYWwgZm9yIHRyYWNpbmcgdGhlIGV4ZWN1dGlvbiBmbG93IGFuZCB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgbmFtZXNwYWNlIHRyZWUgaXMgdXRpbGl6ZWQgYnkgdGhlIGtlcm5lbC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODMwMCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6MzguNjcwMjE4OTg1WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkxODMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9uc3RyZWUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA3MDAsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNzAwOlxcdFxcdFxcdG5zX3R5cGUgPSBrbHMtXFx1MDAzZW5zX3R5cGU7XFxuIDcwMTpcXHRcXHRlbHNlXFxuIDcwMjpcXHRcXHRcXHRuc190eXBlID0gMDtcXG4gNzAzOlxcdFxcbiA3MDQ6XFx0XFx0aWYgKG5zX3R5cGUpIHtcXG4gNzA1OlxcdFxcdFxcdG5zX3RyZWUgPSBuc190cmVlX2Zyb21fdHlwZShuc190eXBlKTtcXG4gNzA2OlxcdFxcdFxcdGlmICghbnNfdHJlZSlcXG4gNzA3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA3MDg6XFx0XFx0fVxcbiA3MDk6XFx0XFxuIDcxMDpcXHRcXHRpZiAoa2xzLVxcdTAwM2VsYXN0X25zX2lkKSB7XFxuIDcxMTpcXHRcXHRcXHRrbHMtXFx1MDAzZWZpcnN0X25zID0gbG9va3VwX25zX2lkX2F0KGtscy1cXHUwMDNlbGFzdF9uc19pZCArIDEsIG5zX3R5cGUpO1xcbiA3MTI6XFx0XFx0XFx0aWYgKCFrbHMtXFx1MDAzZWZpcnN0X25zKVxcbiA3MTM6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuIDcxNDpcXHRcXHRcXHRmaXJzdF9ucyA9IGtscy1cXHUwMDNlZmlyc3RfbnM7XFxuIDcxNTpcXHRcXHR9XFxuIDcxNjpcXHRcXG4gNzE3OlxcdFxcdHJldCA9IDA7XFxuIDcxODpcXHRcXHRpZiAobnNfdHJlZSlcXG4gNzE5OlxcdFxcdFxcdGhlYWQgPSBcXHUwMDI2bnNfdHJlZS1cXHUwMDNlbnNfbGlzdF9oZWFkO1xcbiA3MjA6XFx0XFx0ZWxzZVxcbiA3MjE6XFx0XFx0XFx0aGVhZCA9IFxcdTAwMjZuc191bmlmaWVkX3Jvb3QubnNfbGlzdF9oZWFkO1xcbiA3MjI6XFx0XFxuIDcyMzpcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIDcyNDpcXHRcXG4gNzI1OlxcdFxcdGlmICghZmlyc3RfbnMpXFxuIDcyNjpcXHRcXHRcXHRmaXJzdF9ucyA9IGZpcnN0X25zX2NvbW1vbihoZWFkLCBuc190cmVlKTtcXG4gNzI3OlxcdFxcbiA3Mjg6XFx0XFx0Zm9yIChucyA9IGZpcnN0X25zOyAhbnNfY29tbW9uX2lzX2hlYWQobnMsIGhlYWQsIG5zX3RyZWUpIFxcdTAwMjZcXHUwMDI2IG5yX25zX2lkcztcXG4gNzI5OlxcdFxcdCAgICAgbnMgPSBuZXh0X25zX2NvbW1vbihucywgbnNfdHJlZSkpIHtcXG4gNzMwOlxcdFxcdFxcdHN0cnVjdCBuc19jb21tb24gKnZhbGlkO1xcbiA3MzE6XFx0XFxuIDczMjpcXHRcXHRcXHR2YWxpZCA9IGxlZ2l0aW1pemVfbnMoa2xzLCBucyk7XFxuIDczMzpcXHRcXHRcXHRpZiAoIXZhbGlkKVxcbiA3MzQ6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuIDczNTpcXHRcXG4gNzM2OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiA3Mzc6XFx0XFxuIDczODpcXHRcXHRcXHRuc19wdXQocHJldik7XFxuIDczOTpcXHRcXHRcXHRwcmV2ID0gdmFsaWQ7XFxuIDc0MDpcXHRcXG4gNzQxOlxcdFxcdFxcdGlmIChwdXRfdXNlcih2YWxpZC1cXHUwMDNlbnNfaWQsIG5zX2lkcyArIHJldCkpIHtcXG4gNzQyOlxcdFxcdFxcdFxcdG5zX3B1dChwcmV2KTtcXG4gNzQzOlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiA3NDQ6XFx0XFx0XFx0fVxcbiA3NDU6XFx0XFxuIDc0NjpcXHRcXHRcXHRucl9uc19pZHMtLTtcXG4gNzQ3OlxcdFxcdFxcdHJldCsrO1xcbiA3NDg6XFx0XFxuIDc0OTpcXHRcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIDc1MDpcXHRcXHR9XFxuIDc1MTpcXHRcXG4gNzUyOlxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiA3NTM6XFx0XFx0bnNfcHV0KHByZXYpO1xcbiA3NTQ6XFx0XFx0cmV0dXJuIHJldDtcXG4gNzU1OlxcdH1cXG4gNzU2OlxcdFxcbiA3NTc6XFx0U1lTQ0FMTF9ERUZJTkU0KGxpc3RucywgY29uc3Qgc3RydWN0IG5zX2lkX3JlcSBfX3VzZXIgKiwgcmVxLFxcbiA3NTg6XFx0XFx0XFx0dTY0IF9fdXNlciAqLCBuc19pZHMsIHNpemVfdCwgbnJfbnNfaWRzLCB1bnNpZ25lZCBpbnQsIGZsYWdzKVxcbiA3NTk6XFx0e1xcbiA3NjA6XFx0XFx0c3RydWN0IGtsaXN0bnMga2xucyBfX2ZyZWUoa2xpc3Ruc19mcmVlKSA9IHt9O1xcbiA3NjE6XFx0XFx0Y29uc3Qgc2l6ZV90IG1heGNvdW50ID0gMTAwMDAwMDtcXG4gNzYyOlxcdFxcdHN0cnVjdCBuc19pZF9yZXEga3JlcTtcXG4gNzYzOlxcdFxcdHNzaXplX3QgcmV0O1xcbiA3NjQ6XFx0XFxuIDc2NTpcXHRcXHRpZiAoZmxhZ3MpXFxuIDc2NjpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNzY3OlxcdFxcbiA3Njg6XFx0XFx0aWYgKHVubGlrZWx5KG5yX25zX2lkcyBcXHUwMDNlIG1heGNvdW50KSlcXG4gNzY5OlxcdFxcdFxcdHJldHVybiAtRU9WRVJGTE9XO1xcbiA3NzA6XFx0XFxuIDc3MTpcXHRcXHRpZiAoIWFjY2Vzc19vayhuc19pZHMsIG5yX25zX2lkcyAqIHNpemVvZigqbnNfaWRzKSkpXFxuIDc3MjpcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gNzczOlxcdFxcbiA3NzQ6XFx0XFx0cmV0ID0gY29weV9uc19pZF9yZXEocmVxLCBcXHUwMDI2a3JlcSk7XFxuIDc3NTpcXHRcXHRpZiAocmV0KVxcbiA3NzY6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gNzc3OlxcdFxcbiA3Nzg6XFx0XFx0cmV0ID0gcHJlcGFyZV9rbGlzdG5zKFxcdTAwMjZrbG5zLCBcXHUwMDI2a3JlcSwgbnNfaWRzLCBucl9uc19pZHMpO1xcbiA3Nzk6XFx0XFx0aWYgKHJldClcXG4gNzgwOlxcdFxcdFxcdHJldHVybiByZXQ7XFxuIDc4MTpcXHRcXG4gNzgyOlxcdFxcdGlmIChrcmVxLnVzZXJfbnNfaWQpXFxuIDc4MzpcXHRcXHRcXHRyZXR1cm4gZG9fbGlzdG5zX3VzZXJucyhcXHUwMDI2a2xucyk7XFxuIDc4NDpcXHRcXG4gNzg1OlxcdFxcdHJldHVybiBkb19saXN0bnMoXFx1MDAyNmtsbnMpO1xcbiA3ODY6XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjozOC42NzAzMTM4NDVaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTgzNTk4Njc3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgQnVpbGQgQ29uZmlndXJhdGlvbiBmb3IgYGtlcm5lbC9uc3RyZWUuY2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGluLiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYnVpbGQgcHJvY2VzcyBmb3IgYGtlcm5lbC9uc3RyZWUuY2AuIEknbSBnb2luZyB0byBzdGFydCBieSB0cmFjaW5nIGl0cyBjb21waWxhdGlvbi4gTXkgcHJpbWFyeSBnb2FsIGhlcmUgaXMgdG8gZGV0ZXJtaW5lIHdoaWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvciBkZXBlbmRlbmNpZXMgYXJlICpyZXF1aXJlZCogZm9yIHRoaXMgcGFydGljdWxhciBmaWxlIHRvIGJlIHN1Y2Nlc3NmdWxseSBidWlsdC4gSXMgaXQgcGFydCBvZiBhIHNwZWNpZmljIHN1YnN5c3RlbSwgb3IgaXMgaXQgbW9yZSBicm9hZGx5IGFwcGxpY2FibGU/IFVuZGVyc3RhbmRpbmcgdGhlIGRlcGVuZGVuY2llcyB3aWxsIGFsbG93IG1lIHRvLCBmb3IgZXhhbXBsZSwgdW5kZXJzdGFuZCB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0IGZvciB0aGUgYnVpbGQuIFdoZXJlIGRvZXMgdGhpcyBmaWxlIGZpdCBpbj8gSXMgaXQgbGlua2VkIGR5bmFtaWNhbGx5IG9yIHN0YXRpY2FsbHksIGFuZCBob3cgZG9lcyB0aGF0IGFmZmVjdCB0aGUgbmVlZGVkIGNvbmZpZ3VyYXRpb25zPyBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBpdHMgaW50ZWdyYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk2NTAsIk91dHB1dFRva2VucyI6MTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA2OjQwLjUwNjMwNDI4OFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUyNzY5MTE2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuc3RyZWVcXFxcLm9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL01ha2VmaWxlPTY9b2JqLXkgICAgID0gZm9yay5vIGV4ZWNfZG9tYWluLm8gZXhlY19zdGF0ZS5vIHBhbmljLm8gXFxcXFxcbi0tXFxua2VybmVsL01ha2VmaWxlLTEwLVxcdCAgICBleHRhYmxlLm8gcGFyYW1zLm8gXFxcXFxcbmtlcm5lbC9NYWtlZmlsZToxMTpcXHQgICAga3RocmVhZC5vIHN5c19uaS5vIG5zcHJveHkubyBuc3RyZWUubyBuc2NvbW1vbi5vIFxcXFxcXG5rZXJuZWwvTWFrZWZpbGUtMTItXFx0ICAgIG5vdGlmaWVyLm8ga3N5c2ZzLm8gY3JlZC5vIHJlYm9vdC5vIFxcXFxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6NDMuMDM0MDAwNjQ4WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5MDMzMTg4MTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqSW52ZXN0aWdhdGluZyB0aGUgYG5zdHJlZS5vYCBPYmplY3QgRmlsZSoqXG5cbk9rYXksIHNvIGBuc3RyZWUub2AgaXMgZGVmaW5pdGVseSBjb21waWxlZCBhbmQgbGlua2VkIGludG8gdGhlIGtlcm5lbCwgc3BlY2lmaWNhbGx5IHJlc2lkaW5nIHdpdGhpbiBgb2JqLXlgIGluIHRoZSBga2VybmVsL01ha2VmaWxlYC4gVGhhdCdzIHRoZSBzdGFydGluZyBwb2ludC4gTXkgbmV4dCBtb3ZlIGlzIHRvIGNoZWNrIGZvciBhbnkgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zLiBJIG5lZWQgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgS2NvbmZpZyBlbnRyaWVzIHJlbGF0ZWQgdG8gXCJsaXN0bnMsXCIgXCJuc3RyZWUsXCIgb3IgcGVyaGFwcyBldmVuIFwibmFtZXNwYWNlc1wiIGluIGdlbmVyYWwuIFRob3NlIGFyZSB0aGUgb2J2aW91cyBsZWFkcy4gQWZ0ZXIgdGhhdCwgSSB3aWxsIG1vdmUgdG8gdGhlIHNvdXJjZSBjb2RlIGl0c2VsZiB0byBpbnNwZWN0IHRoZSBpbXBsZW1lbnRhdGlvbi4gSSdsbCBuZWVkIHRvIGRpZyBpbnRvIHRoZSBga2VybmVsL25zdHJlZS5jYCBmaWxlLCBhbmQgcHJvYmFibHkgYWxzbyB0YWtlIGEgbG9vayBhdCBgaW5jbHVkZS9saW51eC9uc3RyZWUuaGAgdG8gc2VlIGhvdyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGFuZCB3aGF0IHRoZSBwdWJsaWMgaW50ZXJmYWNlIGxvb2tzIGxpa2UuIFRoYXQgd2lsbCBwcm92aWRlIGluc2lnaHQgaW50byBob3cgdGhpcyB0aGluZyBpcyBhY3R1YWxseSBiZWluZyB1c2VkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5OTY2LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6NDQuOTM3MzIzMjc2WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMjg0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbnN0cmVlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDgwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDgwOlxcdFxcdFxcdFxcdHJldCA9IG5zO1xcbiA0ODE6XFx0XFx0XFx0XFx0aWYgKG5zX2lkID09IG5zLVxcdTAwM2Vuc19pZClcXG4gNDgyOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA0ODM6XFx0XFx0XFx0XFx0bm9kZSA9IG5vZGUtXFx1MDAzZXJiX2xlZnQ7XFxuIDQ4NDpcXHRcXHRcXHR9IGVsc2Uge1xcbiA0ODU6XFx0XFx0XFx0XFx0bm9kZSA9IG5vZGUtXFx1MDAzZXJiX3JpZ2h0O1xcbiA0ODY6XFx0XFx0XFx0fVxcbiA0ODc6XFx0XFx0fVxcbiA0ODg6XFx0XFxuIDQ4OTpcXHRcXHRpZiAocmV0KVxcbiA0OTA6XFx0XFx0XFx0cmV0ID0gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShyZXQpO1xcbiA0OTE6XFx0XFx0cmV0dXJuIHJldDtcXG4gNDkyOlxcdH1cXG4gNDkzOlxcdFxcbiA0OTQ6XFx0c3RhdGljIHN0cnVjdCBuc19jb21tb24gKmxvb2t1cF9uc19pZCh1NjQgbW50X25zX2lkLCBpbnQgbnNfdHlwZSlcXG4gNDk1OlxcdHtcXG4gNDk2OlxcdFxcdHN0cnVjdCBuc19jb21tb24gKm5zO1xcbiA0OTc6XFx0XFxuIDQ5ODpcXHRcXHRndWFyZChyY3UpKCk7XFxuIDQ5OTpcXHRcXHRucyA9IG5zX3RyZWVfbG9va3VwX3JjdShtbnRfbnNfaWQsIG5zX3R5cGUpO1xcbiA1MDA6XFx0XFx0aWYgKCFucylcXG4gNTAxOlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiA1MDI6XFx0XFxuIDUwMzpcXHRcXHRpZiAoIW5zX2dldF91bmxlc3NfaW5hY3RpdmUobnMpKVxcbiA1MDQ6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDUwNTpcXHRcXG4gNTA2OlxcdFxcdHJldHVybiBucztcXG4gNTA3OlxcdH1cXG4gNTA4OlxcdFxcbiA1MDk6XFx0c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBuc19yZXF1ZXN0ZWQoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcXG4gNTEwOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUxMTpcXHR7XFxuIDUxMjpcXHRcXHRyZXR1cm4gIWtscy1cXHUwMDNlbnNfdHlwZSB8fCAoa2xzLVxcdTAwM2Vuc190eXBlIFxcdTAwMjYgbnMtXFx1MDAzZW5zX3R5cGUpO1xcbiA1MTM6XFx0fVxcbiA1MTQ6XFx0XFxuIDUxNTpcXHRzdGF0aWMgaW5saW5lIGJvb2wgX19tdXN0X2NoZWNrIG1heV9saXN0X25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXFxuIDUxNjpcXHRcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUxNzpcXHR7XFxuIDUxODpcXHRcXHRpZiAoa2xzLVxcdTAwM2V1c2VyX25zIFxcdTAwMjZcXHUwMDI2IGtscy1cXHUwMDNldXNlcm5zX2NhcGFibGUpXFxuIDUxOTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTIwOlxcdFxcdGlmIChpc19jdXJyZW50X25hbWVzcGFjZShucykpXFxuIDUyMTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTIyOlxcdFxcdHJldHVybiBtYXlfc2VlX2FsbF9uYW1lc3BhY2VzKCk7XFxuIDUyMzpcXHR9XFxuIDUyNDpcXHRcXG4gNTI1OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBuc19wdXQoc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUyNjpcXHR7XFxuIDUyNzpcXHRcXHRpZiAobnMgXFx1MDAyNlxcdTAwMjYgbnMtXFx1MDAzZW9wcylcXG4gNTI4OlxcdFxcdFxcdG5zLVxcdTAwM2VvcHMtXFx1MDAzZXB1dChucyk7XFxuIDUyOTpcXHR9XFxuIDUzMDpcXHRcXG4gNTMxOlxcdERFRklORV9GUkVFKG5zX3B1dCwgc3RydWN0IG5zX2NvbW1vbiAqLCBpZiAoIUlTX0VSUl9PUl9OVUxMKF9UKSkgbnNfcHV0KF9UKSlcXG4gNTMyOlxcdFxcbiA1MzM6XFx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxcbiA1MzQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxcbiA1MzU6XFx0e1xcbiA1MzY6XFx0XFx0aWYgKCFuc19yZXF1ZXN0ZWQoa2xzLCBjYW5kaWRhdGUpKVxcbiA1Mzc6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDUzODpcXHRcXG4gNTM5OlxcdFxcdGlmICghbWF5X2xpc3RfbnMoa2xzLCBjYW5kaWRhdGUpKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjo0NC45Mzc0Mzc4OTZaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzY4Mjg3MTAxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGBsZWdpdGltaXplX25zYCBDaGFuZ2UqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBzZWUgdGhlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbiBgbGVnaXRpbWl6ZV9uc2AgYW5kIHRoZSByYXRpb25hbGUgZm9yIHRoZSBwYXRjaC4gTG9va2luZyBhdCB0aGUgY29kZSwgcHJldmlvdXNseSwgdGhlIGZ1bmN0aW9uIGhhZCBhIHNwZWNpZmljIGZsb3cuIEl0IGZpcnN0IGF0dGVtcHRlZCB0byBhY3F1aXJlIGEgcmVmZXJlbmNlIHVzaW5nIGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSlgLCBhbmQgdGhlbiwgY29uZGl0aW9uYWxseSwgaXQgY2hlY2tlZCBgbWF5X2xpc3RfbnMoa2xzLCBucylgLiBJZiBgbWF5X2xpc3RfbnNgIGZhaWxlZCwgdGhlIGNvZGUgd291bGQgcmVsZWFzZSB0aGF0IHJlZmVyZW5jZS4gTm93LCB0aGUgbG9naWMgaXMgZGlmZmVyZW50LiBUaGUgY3JpdGljYWwgY2hhbmdlIGlzIHRoZSByZW9yZGVyaW5nIG9mIG9wZXJhdGlvbnMuIEl0IG5vdyBjaGVja3MgYG1heV9saXN0X25zKGtscywgY2FuZGlkYXRlKWAgKmJlZm9yZSogdGFraW5nIHRoZSByZWZlcmVuY2UgdmlhIGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSlgLiBTbywgcmF0aGVyIHRoYW4gaW5jcmVtZW50aW5nIGEgcmVmZXJlbmNlIGFuZCBwb3RlbnRpYWxseSByZWxlYXNpbmcgaXQsIHRoZSBuZXcgZmxvdyBhdm9pZHMgaW5jcmVtZW50aW5nIGlmIHRoZSBsaXN0IGNoZWNrIHdvdWxkIHJlamVjdCB0aGUgbmFtZXNwYWNlLlxuXG5UaGUga2V5IGlzIGBtYXlfbGlzdF9uc2AuIExvb2tpbmcgYXQgdGhhdCBmdW5jdGlvbiwgaXQncyBwcmV0dHkgY2xlYXIuIEl0IGNoZWNrcyBpZiB0aGUgYGtsc2AgaGFzIGEgdXNlciBuYW1lc3BhY2UgYW5kIHRoZSB1c2VyIG5hbWVzcGFjZSBoYXMgdGhlIHByb3BlciBjYXBhYmlsaXRpZXMuIElmIHNvLCBpdCByZXR1cm5zIHRydWUsIGluZGljYXRpbmcgdGhhdCB0aGUgbmFtZXNwYWNlIGNhbiBiZSBsaXN0ZWQuIEl0IGFsc28gYWxsb3dzIGxpc3RpbmcgaWYgdGhlIHByb3ZpZGVkIG5hbWVzcGFjZSBpcyB0aGUgY3VycmVudCBuYW1lc3BhY2UsIHVzaW5nIHRoZSBmdW5jdGlvbiBgaXNfY3VycmVudF9uYW1lc3BhY2UobnMpYC4gTGFzdGx5LCBpZiB0aGUgZW52aXJvbm1lbnQgYWxsb3dzIHNlZWluZyBhbGwgbmFtZXNwYWNlcywgaXQgcmV0dXJucyB0cnVlLlxuXG5TbywgaW4gZXNzZW5jZSwgdGhlIHBhdGNoIG9wdGltaXplZCB0aGlzIGZ1bmN0aW9uIHRvIGNoZWNrIHBlcm1pc3Npb25zICpiZWZvcmUqIGFjcXVpcmluZyB0aGUgcmVmZXJlbmNlLiBJIG5vdyBuZWVkIHRvIGRpdmUgaW50byBgaXNfY3VycmVudF9uYW1lc3BhY2VgIHRvIGZ1bGx5IGFzc2VzcyB0aGUgY29uc2VxdWVuY2VzIG9mIHRoaXMgY2hhbmdlLCBhbmQgaG93IGl0IGFsaWducyB3aXRoIHRoZSBvdmVyYWxsIGRlc2lnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEwODAsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0ODYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjo0OC42MjAzMTIyNTlaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MjE1MDYxMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaXNfY3VycmVudF9uYW1lc3BhY2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvbnNmcy5jPTQ1Nj1zdGF0aWMgaW50IG5zZnNfZW5jb2RlX2ZoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqZmgsIGludCAqbWF4X2xlbixcXG4tLVxcbmZzL25zZnMuYy00NzgtXFxuZnMvbnNmcy5jOjQ3OTpib29sIGlzX2N1cnJlbnRfbmFtZXNwYWNlKHN0cnVjdCBuc19jb21tb24gKm5zKVxcbmZzL25zZnMuYy00ODAte1xcbi0tXFxuaW5jbHVkZS9saW51eC9uc19jb21tb24uaC0xMC1cXG5pbmNsdWRlL2xpbnV4L25zX2NvbW1vbi5oOjExOmJvb2wgaXNfY3VycmVudF9uYW1lc3BhY2Uoc3RydWN0IG5zX2NvbW1vbiAqbnMpO1xcbmluY2x1ZGUvbGludXgvbnNfY29tbW9uLmgtMTItaW50IF9fbnNfY29tbW9uX2luaXQoc3RydWN0IG5zX2NvbW1vbiAqbnMsIHUzMiBuc190eXBlLCBjb25zdCBzdHJ1Y3QgcHJvY19uc19vcGVyYXRpb25zICpvcHMsIGludCBpbnVtKTtcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYz01MTU9c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBtYXlfbGlzdF9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxcbi0tXFxua2VybmVsL25zdHJlZS5jLTUxOS1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG5rZXJuZWwvbnN0cmVlLmM6NTIwOlxcdGlmIChpc19jdXJyZW50X25hbWVzcGFjZShucykpXFxua2VybmVsL25zdHJlZS5jLTUyMS1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6NTAuMzQxODI1MTM5WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5ODM1NzgyNDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBJJ20gdGhpbmtpbmcgYWJvdXQgYGZzL25zZnMuY2AsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSA0NzkuIFRoaXMgbGlrZWx5IHJlbGF0ZXMgdG8gc29tZSBhc3BlY3Qgb2YgdGhlIG5hbWVzcGFjZSBmaWxlIHN5c3RlbSBpbXBsZW1lbnRhdGlvbi4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJJ20gYWxyZWFkeSBhbnRpY2lwYXRpbmcgd2hhdCB0aGF0IGFyZWEgbWlnaHQgY292ZXIuIElzIGl0IHJlbGF0ZWQgdG8gaW5vZGUgYWxsb2NhdGlvbiwgcGVybWlzc2lvbiBjaGVja2luZywgbW91bnQgb3BlcmF0aW9ucywgb3IgcGVyaGFwcyBzb21lIGludGVyYWN0aW9uIHdpdGggdGhlIHZpcnR1YWwgZmlsZXN5c3RlbSBsYXllcj8gSSdsbCBwcm9iYWJseSBzdGFydCBzY2FubmluZyBmb3IgZnVuY3Rpb24gY2FsbHMgb3IgY29uZGl0aW9uYWwgc3RhdGVtZW50cyB0aGVyZSBhbmQgdHJ5IHRvIHVuZGVyc3RhbmQgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuIEl0IGNvdWxkIGJlIGEgY3J1Y2lhbCBwaWVjZSBvZiB0aGUgcHV6emxlIEknbSB0cnlpbmcgdG8gc29sdmUsIG9yIGl0IGNvdWxkIGp1c3QgcHJvdmlkZSBzb21lIHVzZWZ1bCBjb250ZXh0LiBMZXQgbWUgZXhhbWluZSB0aGUgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIyMjAsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjo1Mi4zMjU0MDYyOTFaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA2MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL25zZnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0NzAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0NzA6XFx0XFx0XFx0Km1heF9sZW4gPSBOU0ZTX0ZJRF9TSVpFX1UzMl9MQVRFU1Q7XFxuIDQ3MTpcXHRcXHR9XFxuIDQ3MjpcXHRcXG4gNDczOlxcdFxcdGZpZC1cXHUwMDNlbnNfaWRcXHQ9IG5zLVxcdTAwM2Vuc19pZDtcXG4gNDc0OlxcdFxcdGZpZC1cXHUwMDNlbnNfdHlwZVxcdD0gbnMtXFx1MDAzZW5zX3R5cGU7XFxuIDQ3NTpcXHRcXHRmaWQtXFx1MDAzZW5zX2ludW1cXHQ9IGlub2RlLVxcdTAwM2VpX2lubztcXG4gNDc2OlxcdFxcdHJldHVybiBGSUxFSURfTlNGUztcXG4gNDc3OlxcdH1cXG4gNDc4OlxcdFxcbiA0Nzk6XFx0Ym9vbCBpc19jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3QgbnNfY29tbW9uICpucylcXG4gNDgwOlxcdHtcXG4gNDgxOlxcdFxcdHN3aXRjaCAobnMtXFx1MDAzZW5zX3R5cGUpIHtcXG4gNDgyOlxcdCNpZmRlZiBDT05GSUdfQ0dST1VQU1xcbiA0ODM6XFx0XFx0Y2FzZSBDTE9ORV9ORVdDR1JPVVA6XFxuIDQ4NDpcXHRcXHRcXHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fY2dfbnMobnMpKTtcXG4gNDg1OlxcdCNlbmRpZlxcbiA0ODY6XFx0I2lmZGVmIENPTkZJR19JUENfTlNcXG4gNDg3OlxcdFxcdGNhc2UgQ0xPTkVfTkVXSVBDOlxcbiA0ODg6XFx0XFx0XFx0cmV0dXJuIGN1cnJlbnRfaW5fbmFtZXNwYWNlKHRvX2lwY19ucyhucykpO1xcbiA0ODk6XFx0I2VuZGlmXFxuIDQ5MDpcXHRcXHRjYXNlIENMT05FX05FV05TOlxcbiA0OTE6XFx0XFx0XFx0cmV0dXJuIGN1cnJlbnRfaW5fbmFtZXNwYWNlKHRvX21udF9ucyhucykpO1xcbiA0OTI6XFx0I2lmZGVmIENPTkZJR19ORVRfTlNcXG4gNDkzOlxcdFxcdGNhc2UgQ0xPTkVfTkVXTkVUOlxcbiA0OTQ6XFx0XFx0XFx0cmV0dXJuIGN1cnJlbnRfaW5fbmFtZXNwYWNlKHRvX25ldF9ucyhucykpO1xcbiA0OTU6XFx0I2VuZGlmXFxuIDQ5NjpcXHQjaWZkZWYgQ09ORklHX1BJRF9OU1xcbiA0OTc6XFx0XFx0Y2FzZSBDTE9ORV9ORVdQSUQ6XFxuIDQ5ODpcXHRcXHRcXHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fcGlkX25zKG5zKSk7XFxuIDQ5OTpcXHQjZW5kaWZcXG4gNTAwOlxcdCNpZmRlZiBDT05GSUdfVElNRV9OU1xcbiA1MDE6XFx0XFx0Y2FzZSBDTE9ORV9ORVdUSU1FOlxcbiA1MDI6XFx0XFx0XFx0cmV0dXJuIGN1cnJlbnRfaW5fbmFtZXNwYWNlKHRvX3RpbWVfbnMobnMpKTtcXG4gNTAzOlxcdCNlbmRpZlxcbiA1MDQ6XFx0I2lmZGVmIENPTkZJR19VU0VSX05TXFxuIDUwNTpcXHRcXHRjYXNlIENMT05FX05FV1VTRVI6XFxuIDUwNjpcXHRcXHRcXHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fdXNlcl9ucyhucykpO1xcbiA1MDc6XFx0I2VuZGlmXFxuIDUwODpcXHQjaWZkZWYgQ09ORklHX1VUU19OU1xcbiA1MDk6XFx0XFx0Y2FzZSBDTE9ORV9ORVdVVFM6XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA2OjUyLjMyNTUxNDg4MVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0NjU0NDk4MTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uOiBgbGlzdG5zYCBhbmQgTmFtZXNwYWNlIExvZ2ljKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBhbmFseXNpcyBpbmRpY2F0ZXMgdGhhdCBgbGVnaXRpbWl6ZV9uc2AgaXMgY2FsbGVkIHdpdGhpbiB0aGUgYGRvX2xpc3Ruc2AgYW5kIGBkb19saXN0bnNfdXNlcm5zYCBmdW5jdGlvbnMuIFRob3NlIGZ1bmN0aW9ucyBvcGVyYXRlIGluc2lkZSBhbiBSQ1UgcmVhZCBsb2NrLCBhbmQgY3J1Y2lhbGx5LCB0aGV5J3JlIHBhcnQgb2YgdGhlIG5hbWVzcGFjZSBpdGVyYXRpb24gcHJvY2Vzcy4gVGhpcyBtZWFucyB3ZSdyZSBkZWFsaW5nIHdpdGggbW9kaWZpY2F0aW9ucyB0byBjb3JlIGtlcm5lbCBhbmQgVkZTIG5hbWVzcGFjZSBsb2dpYywgc3BlY2lmaWNhbGx5IHRyaWdnZXJlZCBieSB0aGUgYGxpc3Ruc2Agc3lzY2FsbC5cblxuVGhlIGtleSBxdWVzdGlvbiBpcyBhbHdheXMgcmVhY2hhYmlsaXR5LiBDYW4gdXNlcnNwYWNlIGNvZGUsIG9yIHRvb2xzIGxpa2Ugc3l6a2FsbGVyLCB0cmlnZ2VyIHRoaXMgY29kZSBwYXRoIGRpcmVjdGx5PyBUaGUgYW5zd2VyIGlzICp5ZXMqLiBUaGUgYGxpc3Ruc2Agc3lzY2FsbCwgb3IgYHN5c19saXN0bnNgLCBwcm92aWRlcyBhIGRpcmVjdCBlbnRyeSBwb2ludC4gVGhpcyBtYWtlcyBpdCBhIHBvdGVudGlhbCB0YXJnZXQuIFRoaXMgZGlyZWN0bHkgdG91Y2hlcyBleGVjdXRhYmxlIGNvZGUgaW4gdGhlIGNvcmUgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgYGtlcm5lbC9uc3RyZWUuY2AuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgZGVmaW5pdGVseSB0cnVlIGhlcmUuXG5cbk5vdywgZm9yIGBGb2N1c1N5bWJvbHNgLCB3ZSBoYXZlIHRvIHBpbnBvaW50IHRoZSByZWxldmFudCBzeW1ib2xzIHRvIHRhcmdldC5cblxuKiAgIGBsZWdpdGltaXplX25zYCBpcyBgc3RhdGljIGlubGluZWAsIHNvIGl0IHdpbGwgYmUgaW5saW5lZC5cbiogICBgbGVnaXRpbWl6ZV9uc2AgaXMgY2FsbGVkIGluOlxuICAgICogICBgZG9fbGlzdG5zYCAoc3RhdGljKVxuICAgICogICBgZG9fbGlzdG5zX3VzZXJuc2AgKHN0YXRpYylcbiAgICAqICAgYHN5c19saXN0bnNgIC8gYF9fZG9fc3lzX2xpc3Ruc2AgLyBgX19zZV9zeXNfbGlzdG5zYCAoc3lzY2FsbCBlbnRyeSlcblxuR2l2ZW4gdGhpcyBpbmZvcm1hdGlvbiwgbGV0J3MgZXhwbG9yZSB0aGUgc3ltYm9sIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gdGhlIGBsaXN0bnNgIHN5c2NhbGwuIFdlIG5lZWQgdGhlIHNwZWNpZmljIG5hbWVzIG9mIGZ1bmN0aW9ucyBhbmQgdGhlIGV4YWN0IHN5c2NhbGwgbmFtaW5nIGNvbnZlbnRpb24uIEdyZXBwaW5nIGZvciBgbGlzdG5zYCBvciBleGFtaW5pbmcgdGhlIGZpbGUgYXJvdW5kIGxpbmUgNzU3LCBhcyB3ZWxsIGFzIHRoZSBncmVwcGVyLCBzaG93cyB0aGUgZm9sbG93aW5nOlxuXG5gU1lTQ0FMTF9ERUZJTkU0KGxpc3RucywgLi4uKWAgZGVmaW5lcyB0aGUgZm9sbG93aW5nIHN5bWJvbHM6XG4qICAgYF9feDY0X3N5c19saXN0bnNgXG4qICAgYF9fZG9fc3lzX2xpc3Ruc2BcbiogICBgc3lzX2xpc3Ruc2BcbiogICBgZG9fbGlzdG5zYFxuKiAgIGBkb19saXN0bnNfdXNlcm5zYFxuXG5FdmVuIHRob3VnaCBgZG9fbGlzdG5zYCBhbmQgYGRvX2xpc3Ruc191c2VybnNgIGFyZSBzdGF0aWMsIHdlIHNob3VsZCBzdGlsbCBjb25zaWRlciBmdXp6aW5nIGBfX2RvX3N5c19saXN0bnNgLCBgZG9fbGlzdG5zYCwgYGRvX2xpc3Ruc191c2VybnNgLiBNeSBuZXh0IHN0ZXAgaXMgdG8gdXNlIGdyZXBwZXIgdG8gZXhhbWluZSB0aGUgYGtlcm5lbC9uc3RyZWUuY2AgZmlsZSBhbmQgdW5kZXJzdGFuZCB0aGUgc3ltYm9sIGRlZmluaXRpb25zIGJldHRlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMwMTUsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MjEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjo1Ni45ODAwMTYzMVoiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTExNDU0OTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiKGRvX2xpc3Ruc3xsaXN0bnMpXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9uc3RyZWUuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvbnN0cmVlLmM9MzkyPXU2NCBfX25zX3RyZWVfZ2VuX2lkKHN0cnVjdCBuc19jb21tb24gKm5zLCB1NjQgaWQpXFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNDAyLVxcbmtlcm5lbC9uc3RyZWUuYzo0MDM6c3RydWN0IGtsaXN0bnMge1xcbmtlcm5lbC9uc3RyZWUuYy00MDQtXFx0dTY0IF9fdXNlciAqdW5zX2lkcztcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYy00MTMtXFxua2VybmVsL25zdHJlZS5jOjQxNDpzdGF0aWMgdm9pZCBfX2ZyZWVfa2xpc3Ruc19mcmVlKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMpXFxua2VybmVsL25zdHJlZS5jLTQxNS17XFxuLS1cXG5rZXJuZWwvbnN0cmVlLmM9NDI0PXN0YXRpYyBpbnQgY29weV9uc19pZF9yZXEoY29uc3Qgc3RydWN0IG5zX2lkX3JlcSBfX3VzZXIgKnJlcSxcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYy00NDktXFxua2VybmVsL25zdHJlZS5jOjQ1MDpzdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX2tsaXN0bnMoc3RydWN0IGtsaXN0bnMgKmtscywgc3RydWN0IG5zX2lkX3JlcSAqa3JlcSxcXG5rZXJuZWwvbnN0cmVlLmMtNDUxLVxcdFxcdFxcdFxcdCAgdTY0IF9fdXNlciAqbnNfaWRzLCBzaXplX3QgbnJfbnNfaWRzKVxcbi0tXFxua2VybmVsL25zdHJlZS5jPTQ5ND1zdGF0aWMgc3RydWN0IG5zX2NvbW1vbiAqbG9va3VwX25zX2lkKHU2NCBtbnRfbnNfaWQsIGludCBuc190eXBlKVxcbi0tXFxua2VybmVsL25zdHJlZS5jLTUwOC1cXG5rZXJuZWwvbnN0cmVlLmM6NTA5OnN0YXRpYyBpbmxpbmUgYm9vbCBfX211c3RfY2hlY2sgbnNfcmVxdWVzdGVkKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXFxua2VybmVsL25zdHJlZS5jLTUxMC1cXHRcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zKVxcbi0tXFxua2VybmVsL25zdHJlZS5jLTUxNC1cXG5rZXJuZWwvbnN0cmVlLmM6NTE1OnN0YXRpYyBpbmxpbmUgYm9vbCBfX211c3RfY2hlY2sgbWF5X2xpc3RfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcXG5rZXJuZWwvbnN0cmVlLmMtNTE2LVxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgbnNfY29tbW9uICpucylcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYz01MzE9REVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxcbmtlcm5lbC9uc3RyZWUuYy01MzItXFxua2VybmVsL25zdHJlZS5jOjUzMzpzdGF0aWMgaW5saW5lIHN0cnVjdCBuc19jb21tb24gKl9fbXVzdF9jaGVjayBsZWdpdGltaXplX25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXFxua2VybmVsL25zdHJlZS5jLTUzNC1cXHRcXHRcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgbnNfY29tbW9uICpjYW5kaWRhdGUpXFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNTQ0LVxcbmtlcm5lbC9uc3RyZWUuYzo1NDU6c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zX3VzZXJucyhzdHJ1Y3Qga2xpc3RucyAqa2xzKVxcbmtlcm5lbC9uc3RyZWUuYy01NDYte1xcbi0tXFxua2VybmVsL25zdHJlZS5jPTY4MD1zdGF0aWMgaW5saW5lIGJvb2wgbnNfY29tbW9uX2lzX2hlYWQoc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNjg4LVxcbmtlcm5lbC9uc3RyZWUuYzo2ODk6c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zKHN0cnVjdCBrbGlzdG5zICprbHMpXFxua2VybmVsL25zdHJlZS5jLTY5MC17XFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNzU2LVxcbmtlcm5lbC9uc3RyZWUuYzo3NTc6U1lTQ0FMTF9ERUZJTkU0KGxpc3RucywgY29uc3Qgc3RydWN0IG5zX2lkX3JlcSBfX3VzZXIgKiwgcmVxLFxcbmtlcm5lbC9uc3RyZWUuYy03NTgtXFx0XFx0dTY0IF9fdXNlciAqLCBuc19pZHMsIHNpemVfdCwgbnJfbnNfaWRzLCB1bnNpZ25lZCBpbnQsIGZsYWdzKVxcbmtlcm5lbC9uc3RyZWUuYy03NTkte1xcbmtlcm5lbC9uc3RyZWUuYzo3NjA6XFx0c3RydWN0IGtsaXN0bnMga2xucyBfX2ZyZWUoa2xpc3Ruc19mcmVlKSA9IHt9O1xcbmtlcm5lbC9uc3RyZWUuYy03NjEtXFx0Y29uc3Qgc2l6ZV90IG1heGNvdW50ID0gMTAwMDAwMDtcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYy03NzctXFxua2VybmVsL25zdHJlZS5jOjc3ODpcXHRyZXQgPSBwcmVwYXJlX2tsaXN0bnMoXFx1MDAyNmtsbnMsIFxcdTAwMjZrcmVxLCBuc19pZHMsIG5yX25zX2lkcyk7XFxua2VybmVsL25zdHJlZS5jLTc3OS1cXHRpZiAocmV0KVxcbi0tXFxua2VybmVsL25zdHJlZS5jLTc4Mi1cXHRpZiAoa3JlcS51c2VyX25zX2lkKVxcbmtlcm5lbC9uc3RyZWUuYzo3ODM6XFx0XFx0cmV0dXJuIGRvX2xpc3Ruc191c2VybnMoXFx1MDAyNmtsbnMpO1xcbmtlcm5lbC9uc3RyZWUuYy03ODQtXFxua2VybmVsL25zdHJlZS5jOjc4NTpcXHRyZXR1cm4gZG9fbGlzdG5zKFxcdTAwMjZrbG5zKTtcXG5rZXJuZWwvbnN0cmVlLmMtNzg2LX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6NTcuMDMxMTY4ODM2WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjYxOTU2NDQ3NTYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkNvbmZpZ3VyYXRpb24gSW52ZXN0aWdhdGlvbioqXG5cbk9rYXksIHNvIGJlZm9yZSBJIGRpdmUgaW4sIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBoYXZlbid0IG1pc3NlZCBhbnkgY3J1Y2lhbCBjb25maWd1cmF0aW9uIGRldGFpbHMuIEZpcnN0LCBJJ20gdGhpbmtpbmcgSSBzaG91bGQgaW52ZXN0aWdhdGUgcG90ZW50aWFsIGRlcGVuZGVuY2llcyBvbiBjb25maWd1cmF0aW9ucyB0aGF0IG1heSBiZSBuZWNlc3NhcnkuIEknbSBnb2luZyB0byBsb29rIGF0IGhvdyBgTkFNRVNQQUNFU2Agb3IgYFVTRVJfTlNgIGFyZSBoYW5kbGVkIHdpdGhpbiB0aGUgYnVpbGQgc3lzdGVtLiBJcyBgbnN0cmVlLm9gIGFsd2F5cyBidWlsdCwgb3IgZG9lcyBpdCBoaW5nZSBvbiBvbmUgb2YgdGhvc2UgY29uZmlndXJhdGlvbiBvcHRpb25zPyBJJ2xsIHByb2JhYmx5IHN0YXJ0IGJ5IGNoZWNraW5nIGZvciB0aG9zZSB2YXJpYWJsZXMsIGJlY2F1c2UgdGhhdCBzZWVtcyBsaWtlIHRoZSBuYXR1cmFsIHN0YXJ0aW5nIHBvaW50LiBUbyBwaW5wb2ludCB0aGUgZXhhY3QgYnVpbGQgc2V0dXAsIEkgc2hvdWxkIGNoZWNrIHRoZSBgaW5pdC9LY29uZmlnYCBmaWxlLCBvciBwZXJoYXBzIHRoZSBga2VybmVsL01ha2VmaWxlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTUxNTQsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNzo1OC45ODc2MjAxNDlaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyMjA3NzcwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJOQU1FU1BBQ0VTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluaXQvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbml0L0tjb25maWc9MTQwNz1lbmRpZiAjIENHUk9VUFNcXG5pbml0L0tjb25maWctMTQwOC1cXG5pbml0L0tjb25maWc6MTQwOTptZW51Y29uZmlnIE5BTUVTUEFDRVNcXG5pbml0L0tjb25maWctMTQxMC1cXHRib29sIFxcXCJOYW1lc3BhY2VzIHN1cHBvcnRcXFwiIGlmIEVYUEVSVFxcbi0tXFxuaW5pdC9LY29uZmlnLTE0MTgtXFxuaW5pdC9LY29uZmlnOjE0MTk6aWYgTkFNRVNQQUNFU1xcbmluaXQvS2NvbmZpZy0xNDIwLVxcbi0tXFxuaW5pdC9LY29uZmlnPTE0Njg9Y29uZmlnIE5FVF9OU1xcbi0tXFxuaW5pdC9LY29uZmlnLTE0NzUtXFxuaW5pdC9LY29uZmlnOjE0NzY6ZW5kaWYgIyBOQU1FU1BBQ0VTXFxuaW5pdC9LY29uZmlnLTE0NzctXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA3OjU5LjQwOTcwNjQ3OFoiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDYyNDQzODE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgdGhlIEJ1aWxkIFByb2Nlc3MgZm9yIGBsaXN0bnNgKipcblxuT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2h5IGBsaXN0bnNgIGlzIGJlaGF2aW5nIHRoaXMgd2F5LCBhbmQgSSBzdXNwZWN0IGl0J3MgcmVsYXRlZCB0byB0aGUgYnVpbGQgY29uZmlndXJhdGlvbi4gTXkgZmlyc3QgdGhvdWdodCBpcyB0byBjaGVjayB0aGUgYGtlcm5lbC9NYWtlZmlsZWAgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDExIHRvIHNlZSBob3cgYG5zdHJlZS5vYCBpcyBiZWluZyBoYW5kbGVkLiBSaWdodCwgYG5zdHJlZS5vYCBpcyB1bmNvbmRpdGlvbmFsbHkgY29tcGlsZWQgKGBvYmoteWApLCB3aGljaCBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhpcyBtb2R1bGUncyBpbmNsdXNpb24gZGVwZW5kcyBvbiBhbnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMuIEknbGwgbmVlZCB0byBjaGVjayBpZiBlaXRoZXIgYENPTkZJR19OQU1FU1BBQ0VTYCBvciBgQ09ORklHX1VTRVJfTlNgIGFyZSBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZm9yIGBsaXN0bnNgLiBMZXQncyBsb29rIGF0IGBpbml0L0tjb25maWdgIHRvIHNlZSBob3cgYE5BTUVTUEFDRVNgIGlzIGNvbmZpZ3VyZWQuIFRoZW4sIEkgc2hvdWxkIHByb2JhYmx5IGFsc28gZGVsdmUgaW50byBga2VybmVsL25zdHJlZS5jYCB0byBzZWUgaG93IHRoZSBjb2RlIGl0c2VsZiBsZXZlcmFnZXMgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiwgaWYgYXQgYWxsLiBUaGF0IHNob3VsZCBjbGFyaWZ5IHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBmbG93LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTU1NywiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA4OjAxLjg3MjE1Mzg1NFoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk5MjQ5MTYsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkNPTkZJR19cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL25zdHJlZS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODowMS45MjIwODYzWiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI5NjI3Njg2MTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXhhbWluaW5nIHRoZSBLZXJuZWwgTmFtZXNwYWNlIENvZGUqKlxuXG5Pa2F5LCBzbyBJJ20gZGl2aW5nIGludG8gYGtlcm5lbC9uc3RyZWUuY2AgYW5kIGltbWVkaWF0ZWx5IG5vdGljaW5nIHNvbWV0aGluZyBpbnRlcmVzdGluZzogbm8gZGlyZWN0IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGJhc2VkIG9uIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIFRoaXMgaXMgYSBjb21tb24gcGF0dGVybiwgYW5kIEknbSBub3Qgc3VycHJpc2VkLCBidXQgaXQgc3RpbGwgd2FycmFudHMgYSBjaGVjay4gSXQgc2VlbXMgdGhlIGRlcGVuZGVuY2llcyBhcmUgbGlrZWx5IHB1bGxlZCBpbiB0aHJvdWdoIGluY2x1ZGVkIGhlYWRlcnMgbGlrZSBgZnMvbnNmcy5jYCBhbmQgdGhlIGBpc19jdXJyZW50X25hbWVzcGFjZWAgZnVuY3Rpb24uXG5cbkhvd2V2ZXIsIEkgYWx3YXlzIGZpbmQgaXQgZ29vZCBwcmFjdGljZSB0byBoYXZlIGF0IGxlYXN0ICpzb21lKiBpbmRpY2F0aW9uIHdpdGhpbiBhIHNvdXJjZSBmaWxlIGl0c2VsZiB0aGF0IGl0cyBiZWhhdmlvciBpcyBnb3Zlcm5lZCBieSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucywgZXZlbiBpZiBpbmRpcmVjdGx5LiBUaGUgdXNlIG9mIGBOQU1FU1BBQ0VTYCBvciBgVVNFUl9OU2AsIG9yIHRoZSBvdmVyYXJjaGluZyBgTkFNRVNQQUNFU2AgY29uZmlndXJhdGlvbiBhcyBhIHdob2xlLCBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIHF1aWNrIGNvZGUgcmV2aWV3cyBhbmQgZGVidWdnaW5nLiBTbywgbGV0J3MgY29uZmlybSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IgYW5kIHZlcmlmeSB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncy5cblxuTGV0J3MgZ28gc3RyYWlnaHQgdG8gYGluaXQvS2NvbmZpZ2AgYW5kIHNlZSBob3cgYENPTkZJR19OQU1FU1BBQ0VTYCBpcyBkZWZpbmVkIGFuZCB3aGF0IGl0IGRlcGVuZHMgb24uIEkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBjb21wbGV0ZSBwaWN0dXJlIG9mIGhvdyB0aGlzIHNlY3Rpb24gb2YgY29kZSBpcyB0cmVhdGVkIGluIHRoZSBjb25maWd1cmF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTkwNSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODowNC44ODQ4NTk0MTFaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMyOTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluaXQvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNDA4LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNDA4OlxcdFxcbjE0MDk6XFx0bWVudWNvbmZpZyBOQU1FU1BBQ0VTXFxuMTQxMDpcXHRcXHRib29sIFxcXCJOYW1lc3BhY2VzIHN1cHBvcnRcXFwiIGlmIEVYUEVSVFxcbjE0MTE6XFx0XFx0ZGVwZW5kcyBvbiBNVUxUSVVTRVJcXG4xNDEyOlxcdFxcdGRlZmF1bHQgIUVYUEVSVFxcbjE0MTM6XFx0XFx0aGVscFxcbjE0MTQ6XFx0XFx0ICBQcm92aWRlcyB0aGUgd2F5IHRvIG1ha2UgdGFza3Mgd29yayB3aXRoIGRpZmZlcmVudCBvYmplY3RzIHVzaW5nXFxuMTQxNTpcXHRcXHQgIHRoZSBzYW1lIGlkLiBGb3IgZXhhbXBsZSBzYW1lIElQQyBpZCBtYXkgcmVmZXIgdG8gZGlmZmVyZW50IG9iamVjdHNcXG4xNDE2OlxcdFxcdCAgb3Igc2FtZSB1c2VyIGlkIG9yIHBpZCBtYXkgcmVmZXIgdG8gZGlmZmVyZW50IHRhc2tzIHdoZW4gdXNlZCBpblxcbjE0MTc6XFx0XFx0ICBkaWZmZXJlbnQgbmFtZXNwYWNlcy5cXG4xNDE4OlxcdFxcbjE0MTk6XFx0aWYgTkFNRVNQQUNFU1xcbjE0MjA6XFx0XFxuMTQyMTpcXHRjb25maWcgVVRTX05TXFxuMTQyMjpcXHRcXHRib29sIFxcXCJVVFMgbmFtZXNwYWNlXFxcIlxcbjE0MjM6XFx0XFx0ZGVmYXVsdCB5XFxuMTQyNDpcXHRcXHRoZWxwXFxuMTQyNTpcXHRcXHQgIEluIHRoaXMgbmFtZXNwYWNlIHRhc2tzIHNlZSBkaWZmZXJlbnQgaW5mbyBwcm92aWRlZCB3aXRoIHRoZVxcbjE0MjY6XFx0XFx0ICB1bmFtZSgpIHN5c3RlbSBjYWxsXFxuMTQyNzpcXHRcXG4xNDI4OlxcdGNvbmZpZyBUSU1FX05TXFxuMTQyOTpcXHRcXHRib29sIFxcXCJUSU1FIG5hbWVzcGFjZVxcXCJcXG4xNDMwOlxcdFxcdGRlZmF1bHQgeVxcbjE0MzE6XFx0XFx0aGVscFxcbjE0MzI6XFx0XFx0ICBJbiB0aGlzIG5hbWVzcGFjZSBib290dGltZSBhbmQgbW9ub3RvbmljIGNsb2NrcyBjYW4gYmUgc2V0LlxcbjE0MzM6XFx0XFx0ICBUaGUgdGltZSB3aWxsIGtlZXAgZ29pbmcgd2l0aCB0aGUgc2FtZSBwYWNlLlxcbjE0MzQ6XFx0XFxuMTQzNTpcXHRjb25maWcgVElNRV9OU19WRFNPXFxuMTQzNjpcXHRcXHRkZWZfYm9vbCBUSU1FX05TIFxcdTAwMjZcXHUwMDI2IEdFTkVSSUNfR0VUVElNRU9GREFZXFxuMTQzNzpcXHRcXG4xNDM4OlxcdGNvbmZpZyBJUENfTlNcXG4xNDM5OlxcdFxcdGJvb2wgXFxcIklQQyBuYW1lc3BhY2VcXFwiXFxuMTQ0MDpcXHRcXHRkZXBlbmRzIG9uIChTWVNWSVBDIHx8IFBPU0lYX01RVUVVRSlcXG4xNDQxOlxcdFxcdGRlZmF1bHQgeVxcbjE0NDI6XFx0XFx0aGVscFxcbjE0NDM6XFx0XFx0ICBJbiB0aGlzIG5hbWVzcGFjZSB0YXNrcyB3b3JrIHdpdGggSVBDIGlkcyB3aGljaCBjb3JyZXNwb25kIHRvXFxuMTQ0NDpcXHRcXHQgIGRpZmZlcmVudCBJUEMgb2JqZWN0cyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcy5cXG4xNDQ1OlxcdFxcbjE0NDY6XFx0Y29uZmlnIFVTRVJfTlNcXG4xNDQ3OlxcdFxcdGJvb2wgXFxcIlVzZXIgbmFtZXNwYWNlXFxcIlxcbjE0NDg6XFx0XFx0ZGVmYXVsdCBuXFxuMTQ0OTpcXHRcXHRoZWxwXFxuMTQ1MDpcXHRcXHQgIFRoaXMgYWxsb3dzIGNvbnRhaW5lcnMsIGkuZS4gdnNlcnZlcnMsIHRvIHVzZSB1c2VyIG5hbWVzcGFjZXNcXG4xNDUxOlxcdFxcdCAgdG8gcHJvdmlkZSBkaWZmZXJlbnQgdXNlciBpbmZvIGZvciBkaWZmZXJlbnQgc2VydmVycy5cXG4xNDUyOlxcdFxcbjE0NTM6XFx0XFx0ICBXaGVuIHVzZXIgbmFtZXNwYWNlcyBhcmUgZW5hYmxlZCBpbiB0aGUga2VybmVsIGl0IGlzXFxuMTQ1NDpcXHRcXHQgIHJlY29tbWVuZGVkIHRoYXQgdGhlIE1FTUNHIG9wdGlvbiBhbHNvIGJlIGVuYWJsZWQgYW5kIHRoYXRcXG4xNDU1OlxcdFxcdCAgdXNlci1zcGFjZSB1c2UgdGhlIG1lbW9yeSBjb250cm9sIGdyb3VwcyB0byBsaW1pdCB0aGUgYW1vdW50XFxuMTQ1NjpcXHRcXHQgIG9mIG1lbW9yeSBhIG1lbW9yeSB1bnByaXZpbGVnZWQgdXNlcnMgY2FuIHVzZS5cXG4xNDU3OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODowNC44ODQ5OTQyNTFaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDA1Njk4MDg3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGBsaXN0bnNgIFN5c3RlbSBDYWxsIGZvciBQb3RlbnRpYWwgRnV6emluZyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBGaXJzdCwgSSBuZWVkIHRvIHZlcmlmeSB3aGljaCBmdW5jdGlvbnMgYXJlIGF0IHRoZSBoZWFydCBvZiBgbGlzdG5zYC4gSSdsbCBzdGFydCB3aXRoIGBGb2N1c1N5bWJvbHNgLiBJbiBga2VybmVsL25zdHJlZS5jYCwgdGhlIGluaXRpYWwgc3VzcGVjdHMgYXJlIGBkb19saXN0bnNgLCBgZG9fbGlzdG5zX3VzZXJuc2AsIGBfX2RvX3N5c19saXN0bnNgLCBgbGVnaXRpbWl6ZV9uc2AgKGV2ZW4gdGhvdWdoIGl0J3Mgc3RhdGljIGlubGluZSwgaXQncyB3b3J0aCBjaGVja2luZyB0aGUgY2FsbCBzaXRlcyksIGFuZCBgc3lzX2xpc3Ruc2AgKG9yIGBfX3g2NF9zeXNfbGlzdG5zYCkuXG5cbk5vdywgY29uZmlybWluZyBteSBodW5jaCwgaXQgbG9va3MgbGlrZSBgX19kb19zeXNfbGlzdG5zYCwgYGRvX2xpc3Ruc2AsIGFuZCBgZG9fbGlzdG5zX3VzZXJuc2AgYXJlIGluZGVlZCB0aGUgcHJpbWFyeSB3b3JraG9yc2VzIGZvciB0aGlzIHN5c3RlbSBjYWxsLiBHb29kLiBOZXh0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMuIEknbGwgcXVpY2tseSBjaGVjayB0aGUgYEVuYWJsZUNvbmZpZ3NgLCB3aGljaCBhcmUgYE5BTUVTUEFDRVNgIGFuZCBgVVNFUl9OU2AuXG5cblJpZ2h0LCB0aW1lIGZvciBhIHNhbml0eSBjaGVjayBvbiB0aGUgYXJndW1lbnRzIEknbSBhYm91dCB0byBmZWVkIHRvIGBzZXQtcmVzdWx0c2AuIFRoZSBgV29ydGhGdXp6aW5nYCBmbGFnIGlzIGRlZmluaXRlbHkgYHRydWVgIGluIHRoaXMgY2FzZS4gVGhlIHBhdGNoIGZ1bmRhbWVudGFsbHkgYWx0ZXJzIG5hbWVzcGFjZSB0cmVlIGl0ZXJhdGlvbiBhbmQgdmFsaWRhdGlvbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGBsaXN0bnNgIHN5c3RlbSBjYWxsLiBUaGUgcmVvcmRlcmluZyBvZiBwZXJtaXNzaW9uIGFuZCBtZW1iZXJzaGlwIGNoZWNrcyDigJMgYG1heV9saXN0X25zYCBhbmQgYG5zX2dldF91bmxlc3NfaW5hY3RpdmVgIOKAkyBpcyBhIGNyaXRpY2FsIGRldGFpbCwgYXMgdGhpcyBkaXJlY3RseSBpbXBhY3RzIGNvcmUga2VybmVsIGNvZGUgcmVhY2hhYmxlIHRocm91Z2ggYGxpc3Ruc2AuXG5cblNvLCB0aGUgZm9jdXMgc3ltYm9scyBhcmUgY29uZmlybWVkIGFzIGBbXCJfX2RvX3N5c19saXN0bnNcIiwgXCJkb19saXN0bnNcIiwgXCJkb19saXN0bnNfdXNlcm5zXCJdYCwgYW5kIHRoZSBlbmFibGluZyBjb25maWdzIGFyZSBgW1wiTkFNRVNQQUNFU1wiLCBcIlVTRVJfTlNcIl1gLiBJJ20gc2F0aXNmaWVkLiBOb3csIGl0J3MgdGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AgYW5kIG1vdmUgb24gdG8gdGhlIG5leHQgc3RhZ2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2OTI3LCJPdXRwdXRUb2tlbnMiOjEzMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMzOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA4OjA4Ljk0MTk3ODI3WiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzY1NjUwNTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk5BTUVTUEFDRVNcIixcbiAgICBcIlVTRVJfTlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJfX2RvX3N5c19saXN0bnNcIixcbiAgICBcImRvX2xpc3Ruc1wiLFxuICAgIFwiZG9fbGlzdG5zX3VzZXJuc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG5hbWVzcGFjZSB0cmVlIGl0ZXJhdGlvbiBhbmQgcGVybWlzc2lvbiB2YWxpZGF0aW9uIGxvZ2ljIGluIGxlZ2l0aW1pemVfbnMoKSwgd2hpY2ggaXMgY2FsbGVkIGR1cmluZyB0aGUgbGlzdG5zIHN5c3RlbSBjYWxsLiBJdCBjaGFuZ2VzIHdoZXRoZXIgbWF5X2xpc3RfbnMoKSBpcyBldmFsdWF0ZWQgYmVmb3JlIG9yIGFmdGVyIHRha2luZyBhIHJlZmVyZW5jZSB2aWEgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpLCBtb2RpZnlpbmcgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNvZGUgYWNjZXNzaWJsZSB0byB1c2Vyc3BhY2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTkFNRVNQQUNFU1wiLFxuICAgIFwiVVNFUl9OU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fZG9fc3lzX2xpc3Ruc1wiLFxuICAgIFwiZG9fbGlzdG5zXCIsXG4gICAgXCJkb19saXN0bnNfdXNlcm5zXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgbmFtZXNwYWNlIHRyZWUgaXRlcmF0aW9uIGFuZCBwZXJtaXNzaW9uIHZhbGlkYXRpb24gbG9naWMgaW4gbGVnaXRpbWl6ZV9ucygpLCB3aGljaCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBsaXN0bnMgc3lzdGVtIGNhbGwuIEl0IGNoYW5nZXMgd2hldGhlciBtYXlfbGlzdF9ucygpIGlzIGV2YWx1YXRlZCBiZWZvcmUgb3IgYWZ0ZXIgdGFraW5nIGEgcmVmZXJlbmNlIHZpYSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKCksIG1vZGlmeWluZyByZWFjaGFibGUgY29yZSBrZXJuZWwgY29kZSBhY2Nlc3NpYmxlIHRvIHVzZXJzcGFjZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDg6MDkuMDE4NTUyMTI1WiIsIlNlcSI6MjksIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTk3NDI0OTE3NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA4OjA5LjAxOTA4MTc5NFoiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjI5OTczNzE0NDU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgbGVnaXRpbWl6ZV9ucygpYCBpbiBga2VybmVsL25zdHJlZS5jYCB0byBjaGVjayBwZXJtaXNzaW9ucyAoYG1heV9saXN0X25zKClgKSBiZWZvcmUgYWNxdWlyaW5nIGEgcmVmZXJlbmNlIChgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpYCksIGVsaW1pbmF0aW5nIHRoZSBuZWVkIGZvciBhIHRlbXBvcmFyeSBhdXRvLWNsZWFudXAgcmVmZXJlbmNlIChgX19mcmVlKG5zX3B1dClgKS4gXFxuXFxuVGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1hbmlwdWxhdGUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBuZXcgc3RhY2svaGVhcCBidWZmZXJzLCBvciBzdHJ1Y3QgcGFkZGluZywgbm9yIGRvZXMgaXQgYWx0ZXIgZGF0YSBjb3B5aW5nIHRvIHVzZXJzcGFjZSBpbiBhIG1hbm5lciB0aGF0IGNvdWxkIGxlYWsgdW5pbml0aWFsaXplZCBieXRlcy4gQW55IHBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgY2hhbmdlIHJlbGF0ZSB0byBvYmplY3QgbGlmZXRpbWUgb3IgUkNVIGRlcmVmZXJlbmNpbmcgYmVmb3JlIHJlZmVyZW5jZSBhY3F1aXNpdGlvbiwgd2hpY2ggYXJlIHN0cmljdGx5IHdpdGhpbiB0aGUgZG9tYWluIG9mIEtBU0FOIHJhdGhlciB0aGFuIEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGZmMDAxMTY5NDM5MTRlY2E0ZTliMTEyNDBjZjM4NDBkYzM3ZWQ5ZDlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDAxOjA2OjI1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL25zdHJlZS5jIGIva2VybmVsL25zdHJlZS5jXG5pbmRleCA2ZDEyZTU5MDBhYzAxLi44MzFmMjc5ZDE3NGEzIDEwMDY0NFxuLS0tIGEva2VybmVsL25zdHJlZS5jXG4rKysgYi9rZXJuZWwvbnN0cmVlLmNcbkBAIC01MzMsMTkgKzUzMywxMyBAQCBERUZJTkVfRlJFRShuc19wdXQsIHN0cnVjdCBuc19jb21tb24gKiwgaWYgKCFJU19FUlJfT1JfTlVMTChfVCkpIG5zX3B1dChfVCkpXG4gc3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxuIFx0XHRcdFx0XHRcdFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxuIHtcbi1cdHN0cnVjdCBuc19jb21tb24gKm5zIF9fZnJlZShuc19wdXQpID0gTlVMTDtcbi1cbiBcdGlmICghbnNfcmVxdWVzdGVkKGtscywgY2FuZGlkYXRlKSlcbiBcdFx0cmV0dXJuIE5VTEw7XG4gXG4tXHRucyA9IG5zX2dldF91bmxlc3NfaW5hY3RpdmUoY2FuZGlkYXRlKTtcbi1cdGlmICghbnMpXG4tXHRcdHJldHVybiBOVUxMO1xuLVxuLVx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIG5zKSlcbitcdGlmICghbWF5X2xpc3RfbnMoa2xzLCBjYW5kaWRhdGUpKVxuIFx0XHRyZXR1cm4gTlVMTDtcbiBcbi1cdHJldHVybiBub19mcmVlX3B0cihucyk7XG4rXHRyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpO1xuIH1cbiBcbiBzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODowOS4wMTkwODI3NTRaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTY4MTQ1MjU2MTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRGl2aW5nIGludG8gdGhlIE5hbWVzcGFjZSBMZWdpdGltYWN5IENoZWNrKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyBjbGVhcmx5IHRvdWNoaW5nIGBrZXJuZWwvbnN0cmVlLmNgLCBzcGVjaWZpY2FsbHkgdGhlIGBsZWdpdGltaXplX25zYCBmdW5jdGlvbi4gTXkgZmlyc3QgdGhvdWdodCBpcyB0byBnZXQgYSBzb2xpZCBncmFzcCBvbiB3aGF0J3MgaGFwcGVuaW5nIGFyb3VuZCB0aGF0IGNhbGwuIEl0IGxvb2tzIGxpa2UgaXQgaXMgZ29pbmcgdG8gZWZmZWN0IHRoZSB3YXkgdGhhdCBzb21lIG5hbWVzcGFjZXMgYXJlIGhhbmRsZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYGxlZ2l0aW1pemVfbnNgIGRvZXMsIGFzIHdlbGwgYXMgdGhlIHJvbGVzIG9mIGBtYXlfbGlzdF9uc2AsIGFuZCBgbnNfcmVxdWVzdGVkYCwgYW5kIGhvdyB0aGV5IGludGVyYWN0LiBMaW5lIDUzMyBpcyB0aGUgdGFyZ2V0LCBzbyBJIHNob3VsZCByZWFkIHRoZSBjb2RlIGFyb3VuZCB0aGVyZSBhbmQgdW5kZXJzdGFuZCB0aGlzIGZ1bmN0aW9uLlxuXG5MZXQncyB1c2UgdGhlIG9sZCBgcmVhZC1maWxlYCB0cmljayB0byBsb2FkIHRoZSBjb2RlLiBJJ2xsIGZvY3VzIG9uIGxpbmVzIDUwMCB0aHJvdWdoIDYwMCwgZ2l2ZSBvciB0YWtlLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBjb250ZXh0IEkgbmVlZCBhcm91bmQgdGhhdCBpbXBvcnRhbnQgZnVuY3Rpb24uIFVuZGVyc3RhbmRpbmcgdGhlIGxvZ2ljIGluIHRoaXMgYXJlYSBpcyBrZXkgdG8gYXNzZXNzaW5nIHRoZSBpbXBhY3Qgb2YgdGhpcyBwYXRjaC4gTGV0J3Mgc2VlIHdoYXQgd2UndmUgZ290LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTk4LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODoyNS44MzM2MTE3NDhaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA4ODIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9uc3RyZWUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1MDAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1MDA6XFx0XFx0aWYgKCFucylcXG4gNTAxOlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiA1MDI6XFx0XFxuIDUwMzpcXHRcXHRpZiAoIW5zX2dldF91bmxlc3NfaW5hY3RpdmUobnMpKVxcbiA1MDQ6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDUwNTpcXHRcXG4gNTA2OlxcdFxcdHJldHVybiBucztcXG4gNTA3OlxcdH1cXG4gNTA4OlxcdFxcbiA1MDk6XFx0c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBuc19yZXF1ZXN0ZWQoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcXG4gNTEwOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUxMTpcXHR7XFxuIDUxMjpcXHRcXHRyZXR1cm4gIWtscy1cXHUwMDNlbnNfdHlwZSB8fCAoa2xzLVxcdTAwM2Vuc190eXBlIFxcdTAwMjYgbnMtXFx1MDAzZW5zX3R5cGUpO1xcbiA1MTM6XFx0fVxcbiA1MTQ6XFx0XFxuIDUxNTpcXHRzdGF0aWMgaW5saW5lIGJvb2wgX19tdXN0X2NoZWNrIG1heV9saXN0X25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXFxuIDUxNjpcXHRcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUxNzpcXHR7XFxuIDUxODpcXHRcXHRpZiAoa2xzLVxcdTAwM2V1c2VyX25zIFxcdTAwMjZcXHUwMDI2IGtscy1cXHUwMDNldXNlcm5zX2NhcGFibGUpXFxuIDUxOTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTIwOlxcdFxcdGlmIChpc19jdXJyZW50X25hbWVzcGFjZShucykpXFxuIDUyMTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTIyOlxcdFxcdHJldHVybiBtYXlfc2VlX2FsbF9uYW1lc3BhY2VzKCk7XFxuIDUyMzpcXHR9XFxuIDUyNDpcXHRcXG4gNTI1OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBuc19wdXQoc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUyNjpcXHR7XFxuIDUyNzpcXHRcXHRpZiAobnMgXFx1MDAyNlxcdTAwMjYgbnMtXFx1MDAzZW9wcylcXG4gNTI4OlxcdFxcdFxcdG5zLVxcdTAwM2VvcHMtXFx1MDAzZXB1dChucyk7XFxuIDUyOTpcXHR9XFxuIDUzMDpcXHRcXG4gNTMxOlxcdERFRklORV9GUkVFKG5zX3B1dCwgc3RydWN0IG5zX2NvbW1vbiAqLCBpZiAoIUlTX0VSUl9PUl9OVUxMKF9UKSkgbnNfcHV0KF9UKSlcXG4gNTMyOlxcdFxcbiA1MzM6XFx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxcbiA1MzQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxcbiA1MzU6XFx0e1xcbiA1MzY6XFx0XFx0aWYgKCFuc19yZXF1ZXN0ZWQoa2xzLCBjYW5kaWRhdGUpKVxcbiA1Mzc6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDUzODpcXHRcXG4gNTM5OlxcdFxcdGlmICghbWF5X2xpc3RfbnMoa2xzLCBjYW5kaWRhdGUpKVxcbiA1NDA6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDU0MTpcXHRcXG4gNTQyOlxcdFxcdHJldHVybiBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7XFxuIDU0MzpcXHR9XFxuIDU0NDpcXHRcXG4gNTQ1OlxcdHN0YXRpYyBzc2l6ZV90IGRvX2xpc3Ruc191c2VybnMoc3RydWN0IGtsaXN0bnMgKmtscylcXG4gNTQ2OlxcdHtcXG4gNTQ3OlxcdFxcdHU2NCBfX3VzZXIgKm5zX2lkcyA9IGtscy1cXHUwMDNldW5zX2lkcztcXG4gNTQ4OlxcdFxcdHNpemVfdCBucl9uc19pZHMgPSBrbHMtXFx1MDAzZW5yX25zX2lkcztcXG4gNTQ5OlxcdFxcdHN0cnVjdCBuc19jb21tb24gKm5zID0gTlVMTCwgKmZpcnN0X25zID0gTlVMTCwgKnByZXYgPSBOVUxMO1xcbiA1NTA6XFx0XFx0Y29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqaGVhZDtcXG4gNTUxOlxcdFxcdHNzaXplX3QgcmV0O1xcbiA1NTI6XFx0XFxuIDU1MzpcXHRcXHRWRlNfV0FSTl9PTl9PTkNFKCFrbHMtXFx1MDAzZXVzZXJfbnNfaWQpO1xcbiA1NTQ6XFx0XFxuIDU1NTpcXHRcXHRpZiAoa2xzLVxcdTAwM2V1c2VyX25zX2lkID09IExJU1ROU19DVVJSRU5UX1VTRVIpXFxuIDU1NjpcXHRcXHRcXHRucyA9IHRvX25zX2NvbW1vbihjdXJyZW50X3VzZXJfbnMoKSk7XFxuIDU1NzpcXHRcXHRlbHNlIGlmIChrbHMtXFx1MDAzZXVzZXJfbnNfaWQpXFxuIDU1ODpcXHRcXHRcXHRucyA9IGxvb2t1cF9uc19pZChrbHMtXFx1MDAzZXVzZXJfbnNfaWQsIENMT05FX05FV1VTRVIpO1xcbiA1NTk6XFx0XFx0aWYgKCFucylcXG4gNTYwOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA1NjE6XFx0XFx0a2xzLVxcdTAwM2V1c2VyX25zID0gdG9fdXNlcl9ucyhucyk7XFxuIDU2MjpcXHRcXG4gNTYzOlxcdFxcdC8qXFxuIDU2NDpcXHRcXHQgKiBVc2UgdGhlIHJidHJlZSB0byBmaW5kIHRoZSBmaXJzdCBuYW1lc3BhY2Ugd2UgY2FyZSBhYm91dCBhbmRcXG4gNTY1OlxcdFxcdCAqIHRoZW4gdXNlIGl0J3MgbGlzdCBlbnRyeSB0byBpdGVyYXRlIGZyb20gdGhlcmUuXFxuIDU2NjpcXHRcXHQgKi9cXG4gNTY3OlxcdFxcdGlmIChrbHMtXFx1MDAzZWxhc3RfbnNfaWQpIHtcXG4gNTY4OlxcdFxcdFxcdGtscy1cXHUwMDNlZmlyc3RfbnMgPSBsb29rdXBfbnNfb3duZXJfYXQoa2xzLVxcdTAwM2VsYXN0X25zX2lkICsgMSwgbnMpO1xcbiA1Njk6XFx0XFx0XFx0aWYgKCFrbHMtXFx1MDAzZWZpcnN0X25zKVxcbiA1NzA6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuIDU3MTpcXHRcXHRcXHRmaXJzdF9ucyA9IGtscy1cXHUwMDNlZmlyc3RfbnM7XFxuIDU3MjpcXHRcXHR9XFxuIDU3MzpcXHRcXG4gNTc0OlxcdFxcdHJldCA9IDA7XFxuIDU3NTpcXHRcXHRoZWFkID0gXFx1MDAyNnRvX25zX2NvbW1vbihrbHMtXFx1MDAzZXVzZXJfbnMpLVxcdTAwM2Vuc19vd25lcl9yb290Lm5zX2xpc3RfaGVhZDtcXG4gNTc2OlxcdFxcdGtscy1cXHUwMDNldXNlcm5zX2NhcGFibGUgPSBtYXlfc2VlX2FsbF9uYW1lc3BhY2VzKCk7XFxuIDU3NzpcXHRcXG4gNTc4OlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gNTc5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODoyNS44MzM3MjI5NDhaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTg3NjgyMzA2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBhbiBleHBlcnQgaW4gbXkgZmllbGQsIGFzc3VtaW5nIEknbSB0aGUgb25lIGhhdmluZyB0aGVtOlxuXG4qKkFuYWx5emluZyBga2VybmVsL25zdHJlZS5jYCB0byBVbmRlcnN0YW5kIGBsZWdpdGltaXplX25zYCoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiBob3cgYGxlZ2l0aW1pemVfbnNgIGlzIGFjdHVhbGx5ICp1c2VkKi4gSSBjYW4ndCBqdXN0IGxvb2sgYXQgaXRzIGRlZmluaXRpb24sIEkgbmVlZCB0byBzZWUgdGhlIGNvbnRleHQuIFRoZSBjcnVjaWFsIHRoaW5nIGhlcmUgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29udHJvbCBmbG93OyB3aGF0ICpjYWxscyogYGxlZ2l0aW1pemVfbnNgLCBhbmQgd2hhdCdzIGhhcHBlbmluZyBpbW1lZGlhdGVseSBiZWZvcmUgYW5kIGFmdGVyIHRob3NlIGNhbGxzLiBUaGF0J3MgaG93IHlvdSByZWFsbHkgZ3Jhc3AgdGhlIGludGVudGlvbiBiZWhpbmQgdGhlIGRlc2lnbi4gTGV0J3MgZGlnIGludG8gdGhlIHJlc3Qgb2YgYGtlcm5lbC9uc3RyZWUuY2AuIEkgbmVlZCB0byB0cmFjZSBpdHMgdXNhZ2UgaW4gdGhlIGNvZGUgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBpcyBiZWhhdmluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mzc1NywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDg6MjcuNzEwNTQ4NTU4WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNDY3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbnN0cmVlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTgwLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTgwOlxcdFxcdGlmICghZmlyc3RfbnMpXFxuIDU4MTpcXHRcXHRcXHRmaXJzdF9ucyA9IGxpc3RfZW50cnlfcmN1KGhlYWQtXFx1MDAzZW5leHQsIHR5cGVvZigqZmlyc3RfbnMpLCBuc19vd25lcl9ub2RlLm5zX2xpc3RfZW50cnkpO1xcbiA1ODI6XFx0XFxuIDU4MzpcXHRcXHRucyA9IGZpcnN0X25zO1xcbiA1ODQ6XFx0XFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tX3JjdShucywgaGVhZCwgbnNfb3duZXJfbm9kZS5uc19saXN0X2VudHJ5KSB7XFxuIDU4NTpcXHRcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICp2YWxpZDtcXG4gNTg2OlxcdFxcbiA1ODc6XFx0XFx0XFx0aWYgKCFucl9uc19pZHMpXFxuIDU4ODpcXHRcXHRcXHRcXHRicmVhaztcXG4gNTg5OlxcdFxcbiA1OTA6XFx0XFx0XFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xcbiA1OTE6XFx0XFx0XFx0aWYgKCF2YWxpZClcXG4gNTkyOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiA1OTM6XFx0XFxuIDU5NDpcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gNTk1OlxcdFxcbiA1OTY6XFx0XFx0XFx0bnNfcHV0KHByZXYpO1xcbiA1OTc6XFx0XFx0XFx0cHJldiA9IHZhbGlkO1xcbiA1OTg6XFx0XFxuIDU5OTpcXHRcXHRcXHRpZiAocHV0X3VzZXIodmFsaWQtXFx1MDAzZW5zX2lkLCBuc19pZHMgKyByZXQpKSB7XFxuIDYwMDpcXHRcXHRcXHRcXHRuc19wdXQocHJldik7XFxuIDYwMTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gNjAyOlxcdFxcdFxcdH1cXG4gNjAzOlxcdFxcbiA2MDQ6XFx0XFx0XFx0bnJfbnNfaWRzLS07XFxuIDYwNTpcXHRcXHRcXHRyZXQrKztcXG4gNjA2OlxcdFxcbiA2MDc6XFx0XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiA2MDg6XFx0XFx0fVxcbiA2MDk6XFx0XFxuIDYxMDpcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gNjExOlxcdFxcdG5zX3B1dChwcmV2KTtcXG4gNjEyOlxcdFxcdHJldHVybiByZXQ7XFxuIDYxMzpcXHR9XFxuIDYxNDpcXHRcXG4gNjE1OlxcdC8qXFxuIDYxNjpcXHQgKiBMb29rdXAgYSBuYW1lc3BhY2Ugd2l0aCBpZCBcXHUwMDNlPSBuc19pZCBpbiBlaXRoZXIgdGhlIHVuaWZpZWQgdHJlZSBvciBhIHR5cGUtc3BlY2lmaWMgdHJlZS5cXG4gNjE3OlxcdCAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSB3aXRoIHRoZSBzbWFsbGVzdCBpZCB0aGF0IGlzIFxcdTAwM2U9IG5zX2lkLlxcbiA2MTg6XFx0ICovXFxuIDYxOTpcXHRzdGF0aWMgc3RydWN0IG5zX2NvbW1vbiAqbG9va3VwX25zX2lkX2F0KHU2NCBuc19pZCwgaW50IG5zX3R5cGUpXFxuIDYyMDpcXHR7XFxuIDYyMTpcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICpyZXQgPSBOVUxMO1xcbiA2MjI6XFx0XFx0c3RydWN0IG5zX3RyZWVfcm9vdCAqbnNfdHJlZSA9IE5VTEw7XFxuIDYyMzpcXHRcXHRzdHJ1Y3QgcmJfbm9kZSAqbm9kZTtcXG4gNjI0OlxcdFxcbiA2MjU6XFx0XFx0aWYgKG5zX3R5cGUpIHtcXG4gNjI2OlxcdFxcdFxcdG5zX3RyZWUgPSBuc190cmVlX2Zyb21fdHlwZShuc190eXBlKTtcXG4gNjI3OlxcdFxcdFxcdGlmICghbnNfdHJlZSlcXG4gNjI4OlxcdFxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiA2Mjk6XFx0XFx0fVxcbiA2MzA6XFx0XFxuIDYzMTpcXHRcXHRndWFyZChuc190cmVlX2xvY2tlZF9yZWFkZXIpKCk7XFxuIDYzMjpcXHRcXG4gNjMzOlxcdFxcdGlmIChuc190cmVlKVxcbiA2MzQ6XFx0XFx0XFx0bm9kZSA9IG5zX3RyZWUtXFx1MDAzZW5zX3JiLnJiX25vZGU7XFxuIDYzNTpcXHRcXHRlbHNlXFxuIDYzNjpcXHRcXHRcXHRub2RlID0gbnNfdW5pZmllZF9yb290Lm5zX3JiLnJiX25vZGU7XFxuIDYzNzpcXHRcXG4gNjM4OlxcdFxcdHdoaWxlIChub2RlKSB7XFxuIDYzOTpcXHRcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICpucztcXG4gNjQwOlxcdFxcbiA2NDE6XFx0XFx0XFx0aWYgKG5zX3R5cGUpXFxuIDY0MjpcXHRcXHRcXHRcXHRucyA9IG5vZGVfdG9fbnMobm9kZSk7XFxuIDY0MzpcXHRcXHRcXHRlbHNlXFxuIDY0NDpcXHRcXHRcXHRcXHRucyA9IG5vZGVfdG9fbnNfdW5pZmllZChub2RlKTtcXG4gNjQ1OlxcdFxcbiA2NDY6XFx0XFx0XFx0aWYgKG5zX2lkIFxcdTAwM2M9IG5zLVxcdTAwM2Vuc19pZCkge1xcbiA2NDc6XFx0XFx0XFx0XFx0aWYgKG5zX3R5cGUpXFxuIDY0ODpcXHRcXHRcXHRcXHRcXHRyZXQgPSBub2RlX3RvX25zKG5vZGUpO1xcbiA2NDk6XFx0XFx0XFx0XFx0ZWxzZVxcbiA2NTA6XFx0XFx0XFx0XFx0XFx0cmV0ID0gbm9kZV90b19uc191bmlmaWVkKG5vZGUpO1xcbiA2NTE6XFx0XFx0XFx0XFx0aWYgKG5zX2lkID09IG5zLVxcdTAwM2Vuc19pZClcXG4gNjUyOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA2NTM6XFx0XFx0XFx0XFx0bm9kZSA9IG5vZGUtXFx1MDAzZXJiX2xlZnQ7XFxuIDY1NDpcXHRcXHRcXHR9IGVsc2Uge1xcbiA2NTU6XFx0XFx0XFx0XFx0bm9kZSA9IG5vZGUtXFx1MDAzZXJiX3JpZ2h0O1xcbiA2NTY6XFx0XFx0XFx0fVxcbiA2NTc6XFx0XFx0fVxcbiA2NTg6XFx0XFxuIDY1OTpcXHRcXHRpZiAocmV0KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODoyNy43MTA2NTUwNDhaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTg0OTc4NTE5MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIGBsZWdpdGltaXplX25zYCBVc2FnZSoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBvZiBgbGVnaXRpbWl6ZV9uc2AuIFdoZXJlIGVsc2UgaXMgdGhpcyBmdW5jdGlvbiwgbWV0aG9kLCBvciB3aGF0ZXZlciBpdCBpcywgYWN0dWFsbHkgYmVpbmcgY2FsbGVkIHdpdGhpbiB0aGUgY29kZWJhc2U/IEkgY2FuJ3QganVzdCByZWx5IG9uIG1lbW9yeTsgSSBuZWVkIGNvbmNyZXRlIGV2aWRlbmNlLiBUaW1lIHRvIGJyaW5nIG91dCB0aGUgYmlnIGd1bnMuLi4gSSdsbCBmaXJlIHVwIGBncmVwcGVyYC4gVGhpcyB3aWxsIGFsbG93IG1lIHRvIHF1aWNrbHkgaWRlbnRpZnkgYWxsIGluc3RhbmNlcyBvZiBgbGVnaXRpbWl6ZV9uc2AgYW5kIGl0cyB1c2VzIHRocm91Z2hvdXQgdGhlIHByb2plY3QuIEknbGwgYmUgYWJsZSB0byBxdWlja2x5IHNlZSBhbGwgdGhlIGNvbnRleHRzIHdoZXJlIHRoZSBmdW5jdGlvbiBpcyBwcmVzZW50LiBUaGlzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBnZXQgYSBzb2xpZCBncmFzcCBvZiBob3cgdGhpcyBjb21wb25lbnQgZml0cyBpbnRvIHRoZSBiaWdnZXIgcGljdHVyZS4gRnJvbSBoZXJlIEkgY2FuIHN0YXJ0IHRvIHVuZGVyc3RhbmQgaXRzIGltcGFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTA1OSwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDg6MjkuNTYwNDQzMzJaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MDA0NzQxNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibGVnaXRpbWl6ZV9uc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvbnN0cmVlLmM9NTMxPURFRklORV9GUkVFKG5zX3B1dCwgc3RydWN0IG5zX2NvbW1vbiAqLCBpZiAoIUlTX0VSUl9PUl9OVUxMKF9UKSkgbnNfcHV0KF9UKSlcXG5rZXJuZWwvbnN0cmVlLmMtNTMyLVxcbmtlcm5lbC9uc3RyZWUuYzo1MzM6c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxcbmtlcm5lbC9uc3RyZWUuYy01MzQtXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxcbi0tXFxua2VybmVsL25zdHJlZS5jPTU0NT1zdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNTg5LVxcbmtlcm5lbC9uc3RyZWUuYzo1OTA6XFx0XFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xcbmtlcm5lbC9uc3RyZWUuYy01OTEtXFx0XFx0aWYgKCF2YWxpZClcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYz02ODk9c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zKHN0cnVjdCBrbGlzdG5zICprbHMpXFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNzMxLVxcbmtlcm5lbC9uc3RyZWUuYzo3MzI6XFx0XFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xcbmtlcm5lbC9uc3RyZWUuYy03MzMtXFx0XFx0aWYgKCF2YWxpZClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDg6MzEuMTYwOTM1MjhaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzgzMTgzNjU5MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBOYW1lc3BhY2UgTGVnaXRpbWFjeSBQYXRjaCoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdGhhdCBpdCdzIGEgc2ltcGxpZmljYXRpb24sIGFpbWluZyBmb3IgYSBsZWFuZXIgYW5kIHBvdGVudGlhbGx5IG1vcmUgZWZmaWNpZW50IHBhdGggaW4gdGhlIGBsZWdpdGltaXplX25zYCBmdW5jdGlvbiB3aXRoaW4gYGtlcm5lbC9uc3RyZWUuY2AuIEknbSBzZWVpbmcgYSByZWZhY3RvcmluZyBmb2N1c2VkIG9uIG9wdGltaXppbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgY29uY2VybmluZyBuYW1lc3BhY2UgcmVmZXJlbmNlIGNvdW50aW5nIGFuZCBhY2Nlc3MgY29udHJvbC5cblxuRXNzZW50aWFsbHksIHRoZSBwYXRjaCBzdHJlYW1saW5lcyB0aGUgcHJvY2Vzcy4gVGhlIHByZXZpb3VzIHZlcnNpb24sIGlmIEkgcmVjYWxsIGNvcnJlY3RseSwgd2FzOiBjaGVjayBpZiB0aGUgbmFtZXNwYWNlIGlzIHJlcXVlc3RlZCwgdGhlbiBhY3F1aXJlIGEgcmVmZXJlbmNlLCBjaGVjayBwZXJtaXNzaW9ucywgYW5kIGZpbmFsbHkgcmV0dXJuIHRoZSByZWZlcmVuY2UuIE5vdywgaXQgYXBwZWFycyB0byBiZTogY2hlY2sgaWYgdGhlIG5hbWVzcGFjZSBpcyByZXF1ZXN0ZWQsICp0aGVuKiBjaGVjayBwZXJtaXNzaW9ucywgYW5kICpvbmx5IHRoZW4qIGFjcXVpcmUgYSByZWZlcmVuY2UgKGlmIHBlcm1pdHRlZCkuIFRoaXMgbG9va3MgbGlrZSBhIGdvb2QgY2hhbmdlLiBJdCBzYXZlcyBhIGNhbGwgdG8gYG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKWAgKGFuZCBpdHMgYXNzb2NpYXRlZCBgbnNfcHV0KClgIGlmIHBlcm1pc3Npb24gaXMgZGVuaWVkKSwgZWxpbWluYXRpbmcgYSB0ZW1wb3JhcnkgdmFyaWFibGUgYW5kIGl0cyBjbGVhbnVwLlxuXG5UaGUgY3JpdGljYWwgcGllY2UgaGVyZSBpcyB0aGUgdXNlIG9mIGBtYXlfbGlzdF9ucygpYC4gQmFzZWQgb24gdGhlIGNvZGUgY29tbWVudHMsIGl0IHNvdW5kcyBsaWtlIHRoaXMgZnVuY3Rpb24gb25seSBjaGVja3MgbmFtZXNwYWNlIHBvaW50ZXJzIGFuZCBmbGFncywgd2l0aG91dCBhY3R1YWxseSBpbmNyZWFzaW5nIHRoZSByZWZlcmVuY2UgY291bnQuIEdvb2QsIHRoYXQncyB3aGF0IEkgZXhwZWN0ZWQuIFRoZSBzaW1wbGlmaWNhdGlvbiByZWR1Y2VzIHRoZSB0aW1lIGEgbG9jayBpcyBoZWxkLCB0aGF0IHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgcG90ZW50aWFsIGJsb2NraW5nIGNhbGxzLlxuXG5Ob3csIGxldCdzIGNvbnNpZGVyIHRoZSBwb3RlbnRpYWwgcmlza3MuIE15IHByaW1hcnkgY29uY2VybiBpcyBhbHdheXMgdW5pbml0aWFsaXplZCBtZW1vcnksIGxlYWtzLCBvciB1c2UtYWZ0ZXItZnJlZSBzY2VuYXJpb3MuIEknbGwgbmVlZCB0byBjYXJlZnVsbHkgZXhhbWluZSB3aGV0aGVyIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhbnkgb2YgdGhvc2U6XG5cbiogICAqKlVuaW5pdGlhbGl6ZWQgbWVtb3J5OioqIEknbSBub3Qgc2VlaW5nIGFueSBuZXcgYWxsb2NhdGlvbnMgb3IgbW9kaWZpY2F0aW9ucyBvZiBleGlzdGluZyBzdHJ1Y3R1cmVzIHRoYXQgY291bGQgbGVhZCB0byB1bmluaXRpYWxpemVkIGRhdGEgYmVpbmcgZXhwb3NlZC4gVGhlIGBjYW5kaWRhdGVgIHBvaW50ZXIgaXMgcGFzc2VkIGluLCBga2xzYCBpcyBhbHNvIHBhc3NlZCBpbiwgYW5kIHRoZXJlJ3Mgbm90aGluZyBoZXJlIHRoYXQgbG9va3Mgcmlza3kgZnJvbSB0aGUgc3VyZmFjZS5cbiogICAqKktlcm5lbC10by11c2VyIGxlYWtzOioqIE5vIG1lbW9yeSBjb3BpZXMgdG8gdXNlciBzcGFjZS4gVGhpcyBpcyBhIGJpZyBvbmUgdG8gcnVsZSBvdXQuIFRoaXMgcGF0Y2ggZG9lc24ndCBzZWVtIHRvIGJlIG1vZGlmeWluZyBhbnkgc3RydWN0dXJlcyB0aGF0IGdldCBwYXNzZWQgdG8gdXNlciBzcGFjZS4gTm90aGluZyBvYnZpb3VzIHRvIHNlZS5cbiogICAqKkNvbmN1cnJlbmN5L1VBRjoqKiBXaGlsZSBgbWF5X2xpc3RfbnMoKWAgcmVhZGluZyBgY2FuZGlkYXRlYCBiZWZvcmUgYG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKWAgY291bGQgKnBvdGVudGlhbGx5KiBpbnRyb2R1Y2UgaXNzdWVzIHdpdGggYSByYWNlIGNvbmRpdGlvbiAoaWYgdGhlIG5hbWVzcGFjZSdzIHN0YXRlIGNoYW5nZXMgYmV0d2VlbiB0aGUgY2hlY2tzKSwgdGhhdCB0eXBlIG9mIGNvbmNlcm4gaXMgc29tZXRoaW5nIHRoYXQgS0FTQU4gKEtlcm5lbCBBZGRyZXNzIFNhbml0aXplcikgaXMgZGVzaWduZWQgdG8gaGFuZGxlLiBUaGlzIGZhbGxzIHVuZGVyIHN0YW5kYXJkIG9iamVjdCBsaWZldGltZSBhbmQgcmVmZXJlbmNlIGNvdW50aW5nIHByb3RlY3Rpb25zLlxuXG5JIGFtIGNvbmZpZGVudCB0aGF0IGl0IGRvZXMgbm90LlxuXG5TbywgZm9yIEtNU0FOIChLZXJuZWwgTWVtb3J5IFNhbml0aXplciksIEkgdGhpbmsgd2UncmUgc2FmZS4gTXkgY3JpdGVyaWEgaXMsIGFuZCBoYXMgYmVlbjpcblxuMS4gIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZT8gTm8uXG4yLiAgQ29uZGl0aW9uYWwgbG9naWMgd2l0aCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8gTm8uXG4zLiAgQ29tcGxleCBkYXRhIHN0cnVjdHVyZXMgaW5pdGlhbGl6YXRpb24gaXNzdWVzPyBOby5cbjQuICBCb3VuZHMgY2hlY2tzL2xlbmd0aHMgcmlza3M/IE5vLlxuXG5ObywgdGhpcyBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2tzIHRoYXQgS01TQU4gaXMgZGVzaWduZWQgdG8gY2F0Y2guIFRoaXMgaXMgbW9yZSBvZiBhIHVzZS1hZnRlci1mcmVlIHN0eWxlIGlzc3VlLCBzb21ldGhpbmcgS0FTQU4gb3IgYW5vdGhlciBzdGFuZGFyZCBkZXRlY3RvciB3aWxsIGhhbmRsZS5cblxuVGhpcyBzZWVtcyBsaWtlIGEgc3RyYWlnaHRmb3J3YXJkIG9wdGltaXphdGlvbi4gVGhlIHBhdGNoIGNsZWFucyB1cCB0aGUgcmVmZXJlbmNlIGNvdW50aW5nIGFuZCBwZXJtaXNzaW9uIGNoZWNraW5nIGxvZ2ljIGluIGBsZWdpdGltaXplX25zKClgIGJ5IG9wdGltaXppbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMuIE5vIG1lbW9yeSBhbGxvY2F0aW9uIGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0aGF0IG1heSBsZWFrIHVuaW5pdGlhbGl6ZWQgYnl0ZXMuIEFueSBjb25jZXJucyBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgbm90IEtNU0FOLlxuXG5JJ2QgY2xhc3NpZnkgdGhpcyBhcyBgTmVlZHNLTVNBTiA9IGZhbHNlYCwgYW5kIEknbGwgc3VibWl0IHRoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU1NjYsIk91dHB1dFRva2VucyI6MTgxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTk2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA4OjM4Ljk5Mjc3NDI4MVoiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MzkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgYGxlZ2l0aW1pemVfbnMoKWAgaW4gYGtlcm5lbC9uc3RyZWUuY2AgdG8gY2hlY2sgcGVybWlzc2lvbnMgKGBtYXlfbGlzdF9ucygpYCkgYmVmb3JlIGFjcXVpcmluZyBhIHJlZmVyZW5jZSAoYG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKWApLCBlbGltaW5hdGluZyB0aGUgbmVlZCBmb3IgYSB0ZW1wb3JhcnkgYXV0by1jbGVhbnVwIHJlZmVyZW5jZSAoYF9fZnJlZShuc19wdXQpYCkuIFxcblxcblRoaXMgY2hhbmdlIGRvZXMgbm90IGludHJvZHVjZSBvciBtYW5pcHVsYXRlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSwgbmV3IHN0YWNrL2hlYXAgYnVmZmVycywgb3Igc3RydWN0IHBhZGRpbmcsIG5vciBkb2VzIGl0IGFsdGVyIGRhdGEgY29weWluZyB0byB1c2Vyc3BhY2UgaW4gYSBtYW5uZXIgdGhhdCBjb3VsZCBsZWFrIHVuaW5pdGlhbGl6ZWQgYnl0ZXMuIEFueSBwb3RlbnRpYWwgcmlza3MgaW50cm9kdWNlZCBieSB0aGlzIGNoYW5nZSByZWxhdGUgdG8gb2JqZWN0IGxpZmV0aW1lIG9yIFJDVSBkZXJlZmVyZW5jaW5nIGJlZm9yZSByZWZlcmVuY2UgYWNxdWlzaXRpb24sIHdoaWNoIGFyZSBzdHJpY3RseSB3aXRoaW4gdGhlIGRvbWFpbiBvZiBLQVNBTiByYXRoZXIgdGhhbiBLTVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgbGVnaXRpbWl6ZV9ucygpYCBpbiBga2VybmVsL25zdHJlZS5jYCB0byBjaGVjayBwZXJtaXNzaW9ucyAoYG1heV9saXN0X25zKClgKSBiZWZvcmUgYWNxdWlyaW5nIGEgcmVmZXJlbmNlIChgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpYCksIGVsaW1pbmF0aW5nIHRoZSBuZWVkIGZvciBhIHRlbXBvcmFyeSBhdXRvLWNsZWFudXAgcmVmZXJlbmNlIChgX19mcmVlKG5zX3B1dClgKS4gXFxuXFxuVGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1hbmlwdWxhdGUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBuZXcgc3RhY2svaGVhcCBidWZmZXJzLCBvciBzdHJ1Y3QgcGFkZGluZywgbm9yIGRvZXMgaXQgYWx0ZXIgZGF0YSBjb3B5aW5nIHRvIHVzZXJzcGFjZSBpbiBhIG1hbm5lciB0aGF0IGNvdWxkIGxlYWsgdW5pbml0aWFsaXplZCBieXRlcy4gQW55IHBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgY2hhbmdlIHJlbGF0ZSB0byBvYmplY3QgbGlmZXRpbWUgb3IgUkNVIGRlcmVmZXJlbmNpbmcgYmVmb3JlIHJlZmVyZW5jZSBhY3F1aXNpdGlvbiwgd2hpY2ggYXJlIHN0cmljdGx5IHdpdGhpbiB0aGUgZG9tYWluIG9mIEtBU0FOIHJhdGhlciB0aGFuIEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlg9z[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-06 00:27:46 +0000 UTC FinishedAt: 2026-09-06 01:08:41 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "21860bb220225edeb87e9c831e6bf25c620e2126", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NAMESPACES", "USER_NS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "21860bb220225edeb87e9c831e6bf25c620e2126", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NAMESPACES", "USER_NS" ], "series_id": "526f51b5-be88-4359-9d65-5aa07041d1f7" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "__do_sys_listns", "do_listns", "do_listns_userns" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05BTUVTUEFDRVMmIzM0OywKICAgICYjMzQ7VVNFUl9OUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O19fZG9fc3lzX2xpc3RucyYjMzQ7LAogICAgJiMzNDtkb19saXN0bnMmIzM0OywKICAgICYjMzQ7ZG9fbGlzdG5zX3VzZXJucyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGBsZWdpdGltaXplX25zKClgIGluIGBrZXJuZWwvbnN0cmVlLmNgIHRvIGNoZWNrIHBlcm1pc3Npb25zIChgbWF5X2xpc3RfbnMoKWApIGJlZm9yZSBhY3F1aXJpbmcgYSByZWZlcmVuY2UgKGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKClgKSwgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIGEgdGVtcG9yYXJ5IGF1dG8tY2xlYW51cCByZWZlcmVuY2UgKGBfX2ZyZWUobnNfcHV0KWApLiBcblxuVGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1hbmlwdWxhdGUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBuZXcgc3RhY2svaGVhcCBidWZmZXJzLCBvciBzdHJ1Y3QgcGFkZGluZywgbm9yIGRvZXMgaXQgYWx0ZXIgZGF0YSBjb3B5aW5nIHRvIHVzZXJzcGFjZSBpbiBhIG1hbm5lciB0aGF0IGNvdWxkIGxlYWsgdW5pbml0aWFsaXplZCBieXRlcy4gQW55IHBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgY2hhbmdlIHJlbGF0ZSB0byBvYmplY3QgbGlmZXRpbWUgb3IgUkNVIGRlcmVmZXJlbmNpbmcgYmVmb3JlIHJlZmVyZW5jZSBhY3F1aXNpdGlvbiwgd2hpY2ggYXJlIHN0cmljdGx5IHdpdGhpbiB0aGUgZG9tYWluIG9mIEtBU0FOIHJhdGhlciB0aGFuIEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBuYW1lc3BhY2UgdHJlZSBpdGVyYXRpb24gYW5kIHBlcm1pc3Npb24gdmFsaWRhdGlvbiBsb2dpYyBpbiBsZWdpdGltaXplX25zKCksIHdoaWNoIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGxpc3RucyBzeXN0ZW0gY2FsbC4gSXQgY2hhbmdlcyB3aGV0aGVyIG1heV9saXN0X25zKCkgaXMgZXZhbHVhdGVkIGJlZm9yZSBvciBhZnRlciB0YWtpbmcgYSByZWZlcmVuY2UgdmlhIG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKSwgbW9kaWZ5aW5nIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjb2RlIGFjY2Vzc2libGUgdG8gdXNlcnNwYWNlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZmYwMDExNjk0MzkxNGVjYTRlOWIxMTI0MGNmMzg0MGRjMzdlZDlkOVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTdW4gU2VwIDYgMDE6MDY6MjUgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL25zdHJlZS5jIGIva2VybmVsL25zdHJlZS5jXG5pbmRleCA2ZDEyZTU5MDBhYzAxLi44MzFmMjc5ZDE3NGEzIDEwMDY0NFxuLS0tIGEva2VybmVsL25zdHJlZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvbnN0cmVlLmNcbkBAIC01MzMsMTkgJiM0Mzs1MzMsMTMgQEAgREVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxuIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5zX2NvbW1vbiAqX19tdXN0X2NoZWNrIGxlZ2l0aW1pemVfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbiBcdFx0XHRcdFx0XHRcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcbiB7XG4tXHRzdHJ1Y3QgbnNfY29tbW9uICpucyBfX2ZyZWUobnNfcHV0KSA9IE5VTEw7XG4tXG4gXHRpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuLVx0bnMgPSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7XG4tXHRpZiAoIW5zKVxuLVx0XHRyZXR1cm4gTlVMTDtcbi1cbi1cdGlmICghbWF5X2xpc3RfbnMoa2xzLCBucykpXG4mIzQzO1x0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIGNhbmRpZGF0ZSkpXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuLVx0cmV0dXJuIG5vX2ZyZWVfcHRyKG5zKTtcbiYjNDM7XHRyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpO1xuIH1cbiBcbiBzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TkFNRVNQQUNFUyYjMzQ7LAogICAgJiMzNDtVU0VSX05TJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19kb19zeXNfbGlzdG5zJiMzNDssCiAgICAmIzM0O2RvX2xpc3RucyYjMzQ7LAogICAgJiMzNDtkb19saXN0bnNfdXNlcm5zJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG5hbWVzcGFjZSB0cmVlIGl0ZXJhdGlvbiBhbmQgcGVybWlzc2lvbiB2YWxpZGF0aW9uIGxvZ2ljIGluIGxlZ2l0aW1pemVfbnMoKSwgd2hpY2ggaXMgY2FsbGVkIGR1cmluZyB0aGUgbGlzdG5zIHN5c3RlbSBjYWxsLiBJdCBjaGFuZ2VzIHdoZXRoZXIgbWF5X2xpc3RfbnMoKSBpcyBldmFsdWF0ZWQgYmVmb3JlIG9yIGFmdGVyIHRha2luZyBhIHJlZmVyZW5jZSB2aWEgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpLCBtb2RpZnlpbmcgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNvZGUgYWNjZXNzaWJsZSB0byB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmZjAwMTE2OTQzOTE0ZWNhNGU5YjExMjQwY2YzODQwZGMzN2VkOWQ5CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFN1biBTZXAgNiAwMTowNjoyNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9uc3RyZWUuYyBiL2tlcm5lbC9uc3RyZWUuYwppbmRleCA2ZDEyZTU5MDBhYzAxLi44MzFmMjc5ZDE3NGEzIDEwMDY0NAotLS0gYS9rZXJuZWwvbnN0cmVlLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL25zdHJlZS5jCkBAIC01MzMsMTkgJiM0Mzs1MzMsMTMgQEAgREVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLAogCQkJCQkJCSAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSkKIHsKLQlzdHJ1Y3QgbnNfY29tbW9uICpucyBfX2ZyZWUobnNfcHV0KSA9IE5VTEw7Ci0KIAlpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpCiAJCXJldHVybiBOVUxMOwogCi0JbnMgPSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7Ci0JaWYgKCFucykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoIW1heV9saXN0X25zKGtscywgbnMpKQomIzQzOwlpZiAoIW1heV9saXN0X25zKGtscywgY2FuZGlkYXRlKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gbm9fZnJlZV9wdHIobnMpOwomIzQzOwlyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI5ODYKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA0NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHRoaXMgdGFzaywgd2Fsa2luZyB0aHJvdWdoIG15IHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gdGhlIGBuc3RyZWUuY2AgQ2hhbmdlcyoqCgpBbHJpZ2h0LCB0aGUgZmlyc3Qgc3RlcCBpcyBhbHdheXMgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBjaGFuZ2VzIHRoZW1zZWx2ZXMuIEkmIzM5O20gZ29pbmcgdG8gcHVsbCB1cCB0aGUgcGF0Y2ggYW5kIHRoZSBtb2RpZmllZCBga2VybmVsL25zdHJlZS5jYCBmaWxlLiBJJiMzOTttIGFscmVhZHkgYW50aWNpcGF0aW5nIHNvbWUgb2YgdGhlIHVzdWFsIHN1c3BlY3RzIHdpdGggdGhlc2UgdHlwZXMgb2YgZmlsZSBtb2RpZmljYXRpb25zIOKAkyBkYXRhIHN0cnVjdHVyZSBhbHRlcmF0aW9ucywgZnVuY3Rpb24gcmUtd3JpdGVzLCBwb3RlbnRpYWxseSBzb21lIGNvbmN1cnJlbmN5IGNvbnNpZGVyYXRpb25zIGlmIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggYW55dGhpbmcgYWNjZXNzaW5nIHRoaXMgZmlsZSBzeXN0ZW0gY29kZS4KCk5vdywgaW5zdGVhZCBvZiBqdXN0IHJlYWRpbmcgbGluZSBieSBsaW5lLCBJJiMzOTtsbCBsaWtlbHkgZ28gc3RyYWlnaHQgZm9yIHNvbWUgdG9vbGluZy4gYHJlYWQtZmlsZWAgY291bGQgZ2l2ZSBtZSBhIHF1aWNrLCBmb3JtYXR0ZWQgb3ZlcnZpZXcgb2YgdGhlIGNvZGUuIEhvd2V2ZXIsIG15IGdvLXRvIGluIHRoaXMgc2l0dWF0aW9uIGlzIHVzdWFsbHkgYGdyZXBwZXJgLiBJJiMzOTttIGdvaW5nIHRvIHNlYXJjaCBmb3IgYSBmZXcga2V5IHRoaW5ncyBkaXJlY3RseSBpbiB0aGUgcGF0Y2ggYW5kIHRoZW4gaW4gdGhlIGBuc3RyZWUuY2Agc291cmNlOgoKKiAgICoqS2V5IERhdGEgU3RydWN0dXJlczoqKiBXaGF0IGFyZSB0aGUgbWFqb3IgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkPyBgbnN0cmVlX25vZGVgLCBgbnN0cmVlX3BhdGhgIG9yIHNvbWV0aGluZyBzaW1pbGFyPyBJJiMzOTtsbCBncmVwIGZvciB0aG9zZSBhbmQgbG9vayBmb3IgdGhlaXIgZGVmaW5pdGlvbnMgYW5kIGFueSBjaGFuZ2VzIHRvIHRoZWlyIGZpZWxkcy4KKiAgICoqS2V5IEZ1bmN0aW9uczoqKiBXaGF0IGFyZSB0aGUgY29yZSBmdW5jdGlvbnMgdGhhdCBvcGVyYXRlIG9uIHRoZSBOU1RyZWU/IGBuc3RyZWVfbG9va3VwYCwgYG5zdHJlZV9pbnNlcnRgLCBgbnN0cmVlX2RlbGV0ZWAsIGBuc3RyZWVfd2Fsa2AgKG9yIHNpbWlsYXIpPyBJJiMzOTtsbCBzZWFyY2ggZm9yIHRob3NlIGZ1bmN0aW9uIG5hbWVzIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBiZWluZyBtb2RpZmllZC4KKiAgICoqRXJyb3IgSGFuZGxpbmc6KiogQXJlIHRoZXJlIGFueSBuZXcgZXJyb3IgY29kZXMgb3IgY2hhbmdlcyB0byBleGlzdGluZyBlcnJvciBoYW5kbGluZz8gVGhhdCYjMzk7cyBhbHdheXMgYSBjcml0aWNhbCBhc3BlY3QsIGFuZCBlYXN5IHRvIG1pc3MuCiogICAqKkNvbmN1cnJlbmN5OioqIElzIHRoZXJlIGFueSB0aHJlYWRpbmcsIGxvY2tpbmcsIG9yIGF0b21pYyBvcGVyYXRpb25zIGludm9sdmVkPyBBbnkgY2FsbHMgdG8gbXV0ZXhlcyBvciBhdG9taWMgcHJpbWl0aXZlcz8gVGhpcyBpcyBhIGh1Z2UgYXJlYSBmb3IgcHJvYmxlbXMsIHNvIEkmIzM5O2xsIGJlIGV4dHJhIHZpZ2lsYW50IGhlcmUuCgpUaGlzIHRhcmdldGVkIGFwcHJvYWNoIGxldHMgbWUgcXVpY2tseSBwaW5wb2ludCB0aGUgKndoYXQqIGFuZCAqd2hlcmUqIG9mIHRoZSBwYXRjaC4gT25jZSBJIGhhdmUgYSBjbGVhciBpZGVhIG9mIHdoYXQmIzM5O3MgKmJlaW5nKiBtb2RpZmllZCwgSSBjYW4gdGhlbiBkaXZlIGRlZXBlciBpbnRvIHRoZSAqd2h5KiBvZiB0aGUgY2hhbmdlcy4gSSYjMzk7bGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByZWFzb25pbmcgYmVoaW5kIGVhY2ggb2YgdGhlIG1vZGlmaWNhdGlvbnMsIGFuZCB3aGV0aGVyIGl0IGNvdWxkIHBvdGVudGlhbGx5IGNhdXNlIHByb2JsZW1zLiBJJiMzOTtsbCBwcm9iYWJseSBzcGVuZCBhIGdvb2QgZGVhbCBvZiB0aW1lIHRyYWNpbmcgdGhyb3VnaCB0aGUga2V5IGZ1bmN0aW9ucyBhbmQgaG93IHRoZXkmIzM5O3JlIGludGVuZGVkIHRvIHdvcmsgdW5kZXIgdmFyaW91cyBjb25kaXRpb25zIHRvIGNvbWUgdG8gYSB3ZWxsIGluZm9ybWVkIGNvbmNsdXNpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvbnN0cmVlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDUyMDpcdFx0aWYgKGlzX2N1cnJlbnRfbmFtZXNwYWNlKG5zKSlcbiA1MjE6XHRcdFx0cmV0dXJuIHRydWU7XG4gNTIyOlx0XHRyZXR1cm4gbWF5X3NlZV9hbGxfbmFtZXNwYWNlcygpO1xuIDUyMzpcdH1cbiA1MjQ6XHRcbiA1MjU6XHRzdGF0aWMgaW5saW5lIHZvaWQgbnNfcHV0KHN0cnVjdCBuc19jb21tb24gKm5zKVxuIDUyNjpcdHtcbiA1Mjc6XHRcdGlmIChucyBcdTAwMjZcdTAwMjYgbnMtXHUwMDNlb3BzKVxuIDUyODpcdFx0XHRucy1cdTAwM2VvcHMtXHUwMDNlcHV0KG5zKTtcbiA1Mjk6XHR9XG4gNTMwOlx0XG4gNTMxOlx0REVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxuIDUzMjpcdFxuIDUzMzpcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5zX2NvbW1vbiAqX19tdXN0X2NoZWNrIGxlZ2l0aW1pemVfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbiA1MzQ6XHRcdFx0XHRcdFx0XHRcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcbiA1MzU6XHR7XG4gNTM2Olx0XHRpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpXG4gNTM3Olx0XHRcdHJldHVybiBOVUxMO1xuIDUzODpcdFxuIDUzOTpcdFx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIGNhbmRpZGF0ZSkpXG4gNTQwOlx0XHRcdHJldHVybiBOVUxMO1xuIDU0MTpcdFxuIDU0MjpcdFx0cmV0dXJuIG5zX2dldF91bmxlc3NfaW5hY3RpdmUoY2FuZGlkYXRlKTtcbiA1NDM6XHR9XG4gNTQ0Olx0XG4gNTQ1Olx0c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zX3VzZXJucyhzdHJ1Y3Qga2xpc3RucyAqa2xzKVxuIDU0NjpcdHtcbiA1NDc6XHRcdHU2NCBfX3VzZXIgKm5zX2lkcyA9IGtscy1cdTAwM2V1bnNfaWRzO1xuIDU0ODpcdFx0c2l6ZV90IG5yX25zX2lkcyA9IGtscy1cdTAwM2Vucl9uc19pZHM7XG4gNTQ5Olx0XHRzdHJ1Y3QgbnNfY29tbW9uICpucyA9IE5VTEwsICpmaXJzdF9ucyA9IE5VTEwsICpwcmV2ID0gTlVMTDtcbiA1NTA6XHRcdGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7XG4gNTUxOlx0XHRzc2l6ZV90IHJldDtcbiA1NTI6XHRcbiA1NTM6XHRcdFZGU19XQVJOX09OX09OQ0UoIWtscy1cdTAwM2V1c2VyX25zX2lkKTtcbiA1NTQ6XHRcbiA1NTU6XHRcdGlmIChrbHMtXHUwMDNldXNlcl9uc19pZCA9PSBMSVNUTlNfQ1VSUkVOVF9VU0VSKVxuIDU1NjpcdFx0XHRucyA9IHRvX25zX2NvbW1vbihjdXJyZW50X3VzZXJfbnMoKSk7XG4gNTU3Olx0XHRlbHNlIGlmIChrbHMtXHUwMDNldXNlcl9uc19pZClcbiA1NTg6XHRcdFx0bnMgPSBsb29rdXBfbnNfaWQoa2xzLVx1MDAzZXVzZXJfbnNfaWQsIENMT05FX05FV1VTRVIpO1xuIDU1OTpcdFx0aWYgKCFucylcbiA1NjA6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNTYxOlx0XHRrbHMtXHUwMDNldXNlcl9ucyA9IHRvX3VzZXJfbnMobnMpO1xuIDU2MjpcdFxuIDU2MzpcdFx0LypcbiA1NjQ6XHRcdCAqIFVzZSB0aGUgcmJ0cmVlIHRvIGZpbmQgdGhlIGZpcnN0IG5hbWVzcGFjZSB3ZSBjYXJlIGFib3V0IGFuZFxuIDU2NTpcdFx0ICogdGhlbiB1c2UgaXQmIzM5O3MgbGlzdCBlbnRyeSB0byBpdGVyYXRlIGZyb20gdGhlcmUuXG4gNTY2Olx0XHQgKi9cbiA1Njc6XHRcdGlmIChrbHMtXHUwMDNlbGFzdF9uc19pZCkge1xuIDU2ODpcdFx0XHRrbHMtXHUwMDNlZmlyc3RfbnMgPSBsb29rdXBfbnNfb3duZXJfYXQoa2xzLVx1MDAzZWxhc3RfbnNfaWQgJiM0MzsgMSwgbnMpO1xuIDU2OTpcdFx0XHRpZiAoIWtscy1cdTAwM2VmaXJzdF9ucylcbiA1NzA6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiA1NzE6XHRcdFx0Zmlyc3RfbnMgPSBrbHMtXHUwMDNlZmlyc3RfbnM7XG4gNTcyOlx0XHR9XG4gNTczOlx0XG4gNTc0Olx0XHRyZXQgPSAwO1xuIDU3NTpcdFx0aGVhZCA9IFx1MDAyNnRvX25zX2NvbW1vbihrbHMtXHUwMDNldXNlcl9ucyktXHUwMDNlbnNfb3duZXJfcm9vdC5uc19saXN0X2hlYWQ7XG4gNTc2Olx0XHRrbHMtXHUwMDNldXNlcm5zX2NhcGFibGUgPSBtYXlfc2VlX2FsbF9uYW1lc3BhY2VzKCk7XG4gNTc3Olx0XG4gNTc4Olx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gNTc5Olx0XG4gNTgwOlx0XHRpZiAoIWZpcnN0X25zKVxuIDU4MTpcdFx0XHRmaXJzdF9ucyA9IGxpc3RfZW50cnlfcmN1KGhlYWQtXHUwMDNlbmV4dCwgdHlwZW9mKCpmaXJzdF9ucyksIG5zX293bmVyX25vZGUubnNfbGlzdF9lbnRyeSk7XG4gNTgyOlx0XG4gNTgzOlx0XHRucyA9IGZpcnN0X25zO1xuIDU4NDpcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tX3JjdShucywgaGVhZCwgbnNfb3duZXJfbm9kZS5uc19saXN0X2VudHJ5KSB7XG4gNTg1Olx0XHRcdHN0cnVjdCBuc19jb21tb24gKnZhbGlkO1xuIDU4NjpcdFxuIDU4NzpcdFx0XHRpZiAoIW5yX25zX2lkcylcbiA1ODg6XHRcdFx0XHRicmVhaztcbiA1ODk6XHRcbiA1OTA6XHRcdFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xuIDU5MTpcdFx0XHRpZiAoIXZhbGlkKVxuIDU5MjpcdFx0XHRcdGNvbnRpbnVlO1xuIDU5MzpcdFxuIDU5NDpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiA1OTU6XHRcbiA1OTY6XHRcdFx0bnNfcHV0KHByZXYpO1xuIDU5NzpcdFx0XHRwcmV2ID0gdmFsaWQ7XG4gNTk4Olx0XG4gNTk5Olx0XHRcdGlmIChwdXRfdXNlcih2YWxpZC1cdTAwM2Vuc19pZCwgbnNfaWRzICYjNDM7IHJldCkpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0ODAwCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUga2VybmVsL25zdHJlZS5jIGludmVzdGlnYXRpb24sIGJhc2VkIG9uIHRoZSBwcm9tcHQ6CgoqKkRpdmluZyBEZWVwZXIgaW50byBga2VybmVsL25zdHJlZS5jYCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgYSBkZWNlbnQgZ3Jhc3Agb24gd2hhdCBgbnN0cmVlLmNgICppcyogZnJvbSB0aGUgaW5pdGlhbCBnbGFuY2UsIGJ1dCBJIHJlYWxseSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGNvbnRleHQuIEtub3dpbmcgdGhlIHB1cnBvc2UgaXMgb25lIHRoaW5nLCBidXQgaG93IGl0JiMzOTtzIGFjdHVhbGx5ICp1c2VkKiBpcyB0aGUga2V5IHRvIHVuZGVyc3RhbmRpbmcgaXRzIHJlYWwgaW1wYWN0LiBJIG5lZWQgdG8gc2VlIHRoZSByZXN0IG9mIHRoZSBmaWxlIHRvIGdyYXNwIGl0cyBpbnRlcm5hbCB3b3JraW5ncywgb2YgY291cnNlLCBidXQgbW9yZSBpbXBvcnRhbnRseSwgaG93IHRoZSBrZXJuZWwgaW50ZXJhY3RzIHdpdGggaXQsIGhvdyBpdCYjMzk7cyBsaW5rZWQsIGFuZCBob3cgaXQmIzM5O3MgY29uZmlndXJlZCBhcmUgd2hlcmUgSeKAmWxsIGZpbmQgdGhlIHRydWUgc2lnbmlmaWNhbmNlLiBJcyBpdCBhIGNvcmUgY29tcG9uZW50IG9yIG1vcmUgb2YgYSBzdXBwb3J0aW5nIGxpYnJhcnk/IFdoYXQgb3RoZXIgc3Vic3lzdGVtcyBkZXBlbmQgb24gaXQ/IEkmIzM5O20gdGhpbmtpbmcgSSBuZWVkIHRvIGZpbmQgdGhlIGNhbGxzIHRvIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGF0IGZpbGUuIEkgYW0gbG9va2luZyBmb3IgdGhlIGJyb2FkZXIgc3lzdGVtLWxldmVsIGludGVyYWN0aW9ucyBub3cuIFRoaXMgd2lsbCBzaGFwZSBteSBmaW5hbCBhbmFseXNpcy4gTGV0JiMzOTtzIHNlZSBob3cgdGhpcyB0aGluZyAqYWN0dWFsbHkqIHdvcmtzIGluIHRoZSBncmFuZCBzY2hlbWUgb2YgdGhpbmdzIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL25zdHJlZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHQvKiBDb3B5cmlnaHQgKGMpIDIwMjUgQ2hyaXN0aWFuIEJyYXVuZXIgXHUwMDNjYnJhdW5lckBrZXJuZWwub3JnXHUwMDNlICovXG4gICAzOlx0XG4gICA0Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvbnN0cmVlLmhcdTAwM2VcbiAgIDU6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9wcm9jX25zLmhcdTAwM2VcbiAgIDY6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VsaXN0LmhcdTAwM2VcbiAgIDc6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC92ZnNkZWJ1Zy5oXHUwMDNlXG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvc3lzY2FsbHMuaFx1MDAzZVxuICAgOTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3VzZXJfbmFtZXNwYWNlLmhcdTAwM2VcbiAgMTA6XHRcbiAgMTE6XHRzdGF0aWMgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NFUUxPQ0sobnNfdHJlZV9sb2NrKTtcbiAgMTI6XHRcbiAgMTM6XHRERUZJTkVfTE9DS19HVUFSRF8wKG5zX3RyZWVfd3JpdGVyLFxuICAxNDpcdFx0XHQgICAgd3JpdGVfc2VxbG9jayhcdTAwMjZuc190cmVlX2xvY2spLFxuICAxNTpcdFx0XHQgICAgd3JpdGVfc2VxdW5sb2NrKFx1MDAyNm5zX3RyZWVfbG9jaykpXG4gIDE2Olx0XG4gIDE3Olx0REVGSU5FX0xPQ0tfR1VBUkRfMChuc190cmVlX2xvY2tlZF9yZWFkZXIsXG4gIDE4Olx0XHRcdCAgICByZWFkX3NlcWxvY2tfZXhjbChcdTAwMjZuc190cmVlX2xvY2spLFxuICAxOTpcdFx0XHQgICAgcmVhZF9zZXF1bmxvY2tfZXhjbChcdTAwMjZuc190cmVlX2xvY2spKVxuICAyMDpcdFxuICAyMTpcdHN0YXRpYyBzdHJ1Y3QgbnNfdHJlZV9yb290IG5zX3VuaWZpZWRfcm9vdCA9IHsgLyogcHJvdGVjdGVkIGJ5IG5zX3RyZWVfbG9jayAqL1xuICAyMjpcdFx0Lm5zX3JiID0gUkJfUk9PVCxcbiAgMjM6XHRcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChuc191bmlmaWVkX3Jvb3QubnNfbGlzdF9oZWFkKSxcbiAgMjQ6XHR9O1xuICAyNTpcdFxuICAyNjpcdHN0cnVjdCBuc190cmVlX3Jvb3QgbW50X25zX3RyZWUgPSB7XG4gIDI3Olx0XHQubnNfcmIgPSBSQl9ST09ULFxuICAyODpcdFx0Lm5zX2xpc3RfaGVhZCA9IExJU1RfSEVBRF9JTklUKG1udF9uc190cmVlLm5zX2xpc3RfaGVhZCksXG4gIDI5Olx0fTtcbiAgMzA6XHRcbiAgMzE6XHRzdHJ1Y3QgbnNfdHJlZV9yb290IG5ldF9uc190cmVlID0ge1xuICAzMjpcdFx0Lm5zX3JiID0gUkJfUk9PVCxcbiAgMzM6XHRcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChuZXRfbnNfdHJlZS5uc19saXN0X2hlYWQpLFxuICAzNDpcdH07XG4gIDM1Olx0RVhQT1JUX1NZTUJPTF9HUEwobmV0X25zX3RyZWUpO1xuICAzNjpcdFxuICAzNzpcdHN0cnVjdCBuc190cmVlX3Jvb3QgdXRzX25zX3RyZWUgPSB7XG4gIDM4Olx0XHQubnNfcmIgPSBSQl9ST09ULFxuICAzOTpcdFx0Lm5zX2xpc3RfaGVhZCA9IExJU1RfSEVBRF9JTklUKHV0c19uc190cmVlLm5zX2xpc3RfaGVhZCksXG4gIDQwOlx0fTtcbiAgNDE6XHRcbiAgNDI6XHRzdHJ1Y3QgbnNfdHJlZV9yb290IHVzZXJfbnNfdHJlZSA9IHtcbiAgNDM6XHRcdC5uc19yYiA9IFJCX1JPT1QsXG4gIDQ0Olx0XHQubnNfbGlzdF9oZWFkID0gTElTVF9IRUFEX0lOSVQodXNlcl9uc190cmVlLm5zX2xpc3RfaGVhZCksXG4gIDQ1Olx0fTtcbiAgNDY6XHRcbiAgNDc6XHRzdHJ1Y3QgbnNfdHJlZV9yb290IGlwY19uc190cmVlID0ge1xuICA0ODpcdFx0Lm5zX3JiID0gUkJfUk9PVCxcbiAgNDk6XHRcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChpcGNfbnNfdHJlZS5uc19saXN0X2hlYWQpLFxuICA1MDpcdH07XG4gIDUxOlx0XG4gIDUyOlx0c3RydWN0IG5zX3RyZWVfcm9vdCBwaWRfbnNfdHJlZSA9IHtcbiAgNTM6XHRcdC5uc19yYiA9IFJCX1JPT1QsXG4gIDU0Olx0XHQubnNfbGlzdF9oZWFkID0gTElTVF9IRUFEX0lOSVQocGlkX25zX3RyZWUubnNfbGlzdF9oZWFkKSxcbiAgNTU6XHR9O1xuICA1NjpcdFxuICA1NzpcdHN0cnVjdCBuc190cmVlX3Jvb3QgY2dyb3VwX25zX3RyZWUgPSB7XG4gIDU4Olx0XHQubnNfcmIgPSBSQl9ST09ULFxuICA1OTpcdFx0Lm5zX2xpc3RfaGVhZCA9IExJU1RfSEVBRF9JTklUKGNncm91cF9uc190cmVlLm5zX2xpc3RfaGVhZCksXG4gIDYwOlx0fTtcbiAgNjE6XHRcbiAgNjI6XHRzdHJ1Y3QgbnNfdHJlZV9yb290IHRpbWVfbnNfdHJlZSA9IHtcbiAgNjM6XHRcdC5uc19yYiA9IFJCX1JPT1QsXG4gIDY0Olx0XHQubnNfbGlzdF9oZWFkID0gTElTVF9IRUFEX0lOSVQodGltZV9uc190cmVlLm5zX2xpc3RfaGVhZCksXG4gIDY1Olx0fTtcbiAgNjY6XHRcbiAgNjc6XHQvKipcbiAgNjg6XHQgKiBuc190cmVlX25vZGVfaW5pdCAtIEluaXRpYWxpemUgYSBuYW1lc3BhY2UgdHJlZSBub2RlXG4gIDY5Olx0ICogQG5vZGU6IFRoZSBub2RlIHRvIGluaXRpYWxpemVcbiAgNzA6XHQgKlxuICA3MTpcdCAqIEluaXRpYWxpemVzIGJvdGggdGhlIHJidHJlZSBub2RlIGFuZCBsaXN0IGVudHJ5LlxuICA3MjpcdCAqL1xuICA3MzpcdHZvaWQgbnNfdHJlZV9ub2RlX2luaXQoc3RydWN0IG5zX3RyZWVfbm9kZSAqbm9kZSlcbiAgNzQ6XHR7XG4gIDc1Olx0XHRSQl9DTEVBUl9OT0RFKFx1MDAyNm5vZGUtXHUwMDNlbnNfbm9kZSk7XG4gIDc2Olx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZub2RlLVx1MDAzZW5zX2xpc3RfZW50cnkpO1xuICA3NzpcdH1cbiAgNzg6XHRcbiAgNzk6XHQvKipcbiAgODA6XHQgKiBuc190cmVlX3Jvb3RfaW5pdCAtIEluaXRpYWxpemUgYSBuYW1lc3BhY2UgdHJlZSByb290XG4gIDgxOlx0ICogQHJvb3Q6IFRoZSByb290IHRvIGluaXRpYWxpemVcbiAgODI6XHQgKlxuICA4MzpcdCAqIEluaXRpYWxpemVzIGJvdGggdGhlIHJidHJlZSByb290IGFuZCBsaXN0IGhlYWQuXG4gIDg0Olx0ICovXG4gIDg1Olx0dm9pZCBuc190cmVlX3Jvb3RfaW5pdChzdHJ1Y3QgbnNfdHJlZV9yb290ICpyb290KVxuICA4NjpcdHtcbiAgODc6XHRcdHJvb3QtXHUwMDNlbnNfcmIgPSBSQl9ST09UO1xuICA4ODpcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cm9vdC1cdTAwM2Vuc19saXN0X2hlYWQpO1xuICA4OTpcdH1cbiAgOTA6XHRcbiAgOTE6XHQvKipcbiAgOTI6XHQgKiBuc190cmVlX25vZGVfZW1wdHkgLSBDaGVjayBpZiBhIG5hbWVzcGFjZSB0cmVlIG5vZGUgaXMgZW1wdHlcbiAgOTM6XHQgKiBAbm9kZTogVGhlIG5vZGUgdG8gY2hlY2tcbiAgOTQ6XHQgKlxuICA5NTpcdCAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBub3QgaW4gYW55IHRyZWUuXG4gIDk2Olx0ICovXG4gIDk3Olx0Ym9vbCBuc190cmVlX25vZGVfZW1wdHkoY29uc3Qgc3RydWN0IG5zX3RyZWVfbm9kZSAqbm9kZSlcbiAgOTg6XHR7XG4gIDk5Olx0XHRyZXR1cm4gUkJfRU1QVFlfTk9ERShcdTAwMjZub2RlLVx1MDAzZW5zX25vZGUpO1xuIDEwMDpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NTkyCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgQmFjayBpbnRvIGBrZXJuZWwvbnN0cmVlLmNgKioKCkFscmlnaHQsIGxldCYjMzk7cyBwaWNrIHVwIHdoZXJlIHdlIGxlZnQgb2ZmLCBvciByYXRoZXIsIHdoZXJlIEkgbGVmdCBvZmYgaW4gbXkgbWVudGFsIG1hcCBvZiB0aGUgYGtlcm5lbC9uc3RyZWUuY2AgaW1wbGVtZW50YXRpb24uIEkgbmVlZCB0byBnZXQgYmFjayBpbnRvIHRoZSBsYXR0ZXIgaGFsZiBvZiB0aGUgZmlsZSwgc3RhcnRpbmcgZnJvbSBsaW5lIDYwMC4gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgaW50cmljYWNpZXMgb2YgdGhlIG5hbWVzcGFjZSB0cmVlIHN0cnVjdHVyZSBhbmQgaG93IGl0IGhhbmRsZXMgcGF0aCByZXNvbHV0aW9uIGFuZCBuYW1lc3BhY2Ugb3BlcmF0aW9ucy4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgbG9va2luZyBmb3IgYW55dGhpbmcgdGhhdCBtaWdodCBzaGVkIGxpZ2h0IG9uIGhvdyB0aGV5IG1hbmFnZSBuZXN0ZWQgbmFtZXNwYWNlcyBhbmQgcG90ZW50aWFsIGVkZ2UgY2FzZXMgYXJvdW5kIG1vdW50IHByb3BhZ2F0aW9uLiBMZXQmIzM5O3Mgc2VlIGlmIHRoZXJlIGFyZSBhbnkgc3VidGxlIG9wdGltaXphdGlvbiB0ZWNobmlxdWVzIHVzZWQgaGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9uc3RyZWUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDYwMDpcdFx0XHRcdG5zX3B1dChwcmV2KTtcbiA2MDE6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiA2MDI6XHRcdFx0fVxuIDYwMzpcdFxuIDYwNDpcdFx0XHRucl9uc19pZHMtLTtcbiA2MDU6XHRcdFx0cmV0JiM0MzsmIzQzOztcbiA2MDY6XHRcbiA2MDc6XHRcdFx0cmN1X3JlYWRfbG9jaygpO1xuIDYwODpcdFx0fVxuIDYwOTpcdFxuIDYxMDpcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gNjExOlx0XHRuc19wdXQocHJldik7XG4gNjEyOlx0XHRyZXR1cm4gcmV0O1xuIDYxMzpcdH1cbiA2MTQ6XHRcbiA2MTU6XHQvKlxuIDYxNjpcdCAqIExvb2t1cCBhIG5hbWVzcGFjZSB3aXRoIGlkIFx1MDAzZT0gbnNfaWQgaW4gZWl0aGVyIHRoZSB1bmlmaWVkIHRyZWUgb3IgYSB0eXBlLXNwZWNpZmljIHRyZWUuXG4gNjE3Olx0ICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIHdpdGggdGhlIHNtYWxsZXN0IGlkIHRoYXQgaXMgXHUwMDNlPSBuc19pZC5cbiA2MTg6XHQgKi9cbiA2MTk6XHRzdGF0aWMgc3RydWN0IG5zX2NvbW1vbiAqbG9va3VwX25zX2lkX2F0KHU2NCBuc19pZCwgaW50IG5zX3R5cGUpXG4gNjIwOlx0e1xuIDYyMTpcdFx0c3RydWN0IG5zX2NvbW1vbiAqcmV0ID0gTlVMTDtcbiA2MjI6XHRcdHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUgPSBOVUxMO1xuIDYyMzpcdFx0c3RydWN0IHJiX25vZGUgKm5vZGU7XG4gNjI0Olx0XG4gNjI1Olx0XHRpZiAobnNfdHlwZSkge1xuIDYyNjpcdFx0XHRuc190cmVlID0gbnNfdHJlZV9mcm9tX3R5cGUobnNfdHlwZSk7XG4gNjI3Olx0XHRcdGlmICghbnNfdHJlZSlcbiA2Mjg6XHRcdFx0XHRyZXR1cm4gTlVMTDtcbiA2Mjk6XHRcdH1cbiA2MzA6XHRcbiA2MzE6XHRcdGd1YXJkKG5zX3RyZWVfbG9ja2VkX3JlYWRlcikoKTtcbiA2MzI6XHRcbiA2MzM6XHRcdGlmIChuc190cmVlKVxuIDYzNDpcdFx0XHRub2RlID0gbnNfdHJlZS1cdTAwM2Vuc19yYi5yYl9ub2RlO1xuIDYzNTpcdFx0ZWxzZVxuIDYzNjpcdFx0XHRub2RlID0gbnNfdW5pZmllZF9yb290Lm5zX3JiLnJiX25vZGU7XG4gNjM3Olx0XG4gNjM4Olx0XHR3aGlsZSAobm9kZSkge1xuIDYzOTpcdFx0XHRzdHJ1Y3QgbnNfY29tbW9uICpucztcbiA2NDA6XHRcbiA2NDE6XHRcdFx0aWYgKG5zX3R5cGUpXG4gNjQyOlx0XHRcdFx0bnMgPSBub2RlX3RvX25zKG5vZGUpO1xuIDY0MzpcdFx0XHRlbHNlXG4gNjQ0Olx0XHRcdFx0bnMgPSBub2RlX3RvX25zX3VuaWZpZWQobm9kZSk7XG4gNjQ1Olx0XG4gNjQ2Olx0XHRcdGlmIChuc19pZCBcdTAwM2M9IG5zLVx1MDAzZW5zX2lkKSB7XG4gNjQ3Olx0XHRcdFx0aWYgKG5zX3R5cGUpXG4gNjQ4Olx0XHRcdFx0XHRyZXQgPSBub2RlX3RvX25zKG5vZGUpO1xuIDY0OTpcdFx0XHRcdGVsc2VcbiA2NTA6XHRcdFx0XHRcdHJldCA9IG5vZGVfdG9fbnNfdW5pZmllZChub2RlKTtcbiA2NTE6XHRcdFx0XHRpZiAobnNfaWQgPT0gbnMtXHUwMDNlbnNfaWQpXG4gNjUyOlx0XHRcdFx0XHRicmVhaztcbiA2NTM6XHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9sZWZ0O1xuIDY1NDpcdFx0XHR9IGVsc2Uge1xuIDY1NTpcdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX3JpZ2h0O1xuIDY1NjpcdFx0XHR9XG4gNjU3Olx0XHR9XG4gNjU4Olx0XG4gNjU5Olx0XHRpZiAocmV0KVxuIDY2MDpcdFx0XHRyZXQgPSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKHJldCk7XG4gNjYxOlx0XHRyZXR1cm4gcmV0O1xuIDY2MjpcdH1cbiA2NjM6XHRcbiA2NjQ6XHRzdGF0aWMgaW5saW5lIHN0cnVjdCBuc19jb21tb24gKmZpcnN0X25zX2NvbW1vbihjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLFxuIDY2NTpcdFx0XHRcdFx0XHRcdHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUpXG4gNjY2Olx0e1xuIDY2NzpcdFx0aWYgKG5zX3RyZWUpXG4gNjY4Olx0XHRcdHJldHVybiBsaXN0X2VudHJ5X3JjdShoZWFkLVx1MDAzZW5leHQsIHN0cnVjdCBuc19jb21tb24sIG5zX3RyZWVfbm9kZS5uc19saXN0X2VudHJ5KTtcbiA2Njk6XHRcdHJldHVybiBsaXN0X2VudHJ5X3JjdShoZWFkLVx1MDAzZW5leHQsIHN0cnVjdCBuc19jb21tb24sIG5zX3VuaWZpZWRfbm9kZS5uc19saXN0X2VudHJ5KTtcbiA2NzA6XHR9XG4gNjcxOlx0XG4gNjcyOlx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpuZXh0X25zX2NvbW1vbihzdHJ1Y3QgbnNfY29tbW9uICpucyxcbiA2NzM6XHRcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUpXG4gNjc0Olx0e1xuIDY3NTpcdFx0aWYgKG5zX3RyZWUpXG4gNjc2Olx0XHRcdHJldHVybiBsaXN0X2VudHJ5X3JjdShucy1cdTAwM2Vuc190cmVlX25vZGUubnNfbGlzdF9lbnRyeS5uZXh0LCBzdHJ1Y3QgbnNfY29tbW9uLCBuc190cmVlX25vZGUubnNfbGlzdF9lbnRyeSk7XG4gNjc3Olx0XHRyZXR1cm4gbGlzdF9lbnRyeV9yY3UobnMtXHUwMDNlbnNfdW5pZmllZF9ub2RlLm5zX2xpc3RfZW50cnkubmV4dCwgc3RydWN0IG5zX2NvbW1vbiwgbnNfdW5pZmllZF9ub2RlLm5zX2xpc3RfZW50cnkpO1xuIDY3ODpcdH1cbiA2Nzk6XHRcbiA2ODA6XHRzdGF0aWMgaW5saW5lIGJvb2wgbnNfY29tbW9uX2lzX2hlYWQoc3RydWN0IG5zX2NvbW1vbiAqbnMsXG4gNjgxOlx0XHRcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsXG4gNjgyOlx0XHRcdFx0XHQgICAgIHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUpXG4gNjgzOlx0e1xuIDY4NDpcdFx0aWYgKG5zX3RyZWUpXG4gNjg1Olx0XHRcdHJldHVybiBcdTAwMjZucy1cdTAwM2Vuc190cmVlX25vZGUubnNfbGlzdF9lbnRyeSA9PSBoZWFkO1xuIDY4NjpcdFx0cmV0dXJuIFx1MDAyNm5zLVx1MDAzZW5zX3VuaWZpZWRfbm9kZS5uc19saXN0X2VudHJ5ID09IGhlYWQ7XG4gNjg3Olx0fVxuIDY4ODpcdFxuIDY4OTpcdHN0YXRpYyBzc2l6ZV90IGRvX2xpc3RucyhzdHJ1Y3Qga2xpc3RucyAqa2xzKVxuIDY5MDpcdHtcbiA2OTE6XHRcdHU2NCBfX3VzZXIgKm5zX2lkcyA9IGtscy1cdTAwM2V1bnNfaWRzO1xuIDY5MjpcdFx0c2l6ZV90IG5yX25zX2lkcyA9IGtscy1cdTAwM2Vucl9uc19pZHM7XG4gNjkzOlx0XHRzdHJ1Y3QgbnNfY29tbW9uICpucywgKmZpcnN0X25zID0gTlVMTCwgKnByZXYgPSBOVUxMO1xuIDY5NDpcdFx0c3RydWN0IG5zX3RyZWVfcm9vdCAqbnNfdHJlZSA9IE5VTEw7XG4gNjk1Olx0XHRjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkO1xuIDY5NjpcdFx0dTMyIG5zX3R5cGU7XG4gNjk3Olx0XHRzc2l6ZV90IHJldDtcbiA2OTg6XHRcbiA2OTk6XHRcdGlmIChod2VpZ2h0MzIoa2xzLVx1MDAzZW5zX3R5cGUpID09IDEpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODMwMAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSByZXN0IG9mIGBrZXJuZWwvbnN0cmVlLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIG1vZHVsZSYjMzk7cyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBzeXN0ZW0gY2FsbHMgYW5kIGFueSBvdGhlciBrZXkgZnVuY3Rpb25zLiBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGlkZW50aWZ5aW5nIHRoZSBlbnRyeSBwb2ludHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gbXkgY3VycmVudCBhbmFseXNpcy4gVW5kZXJzdGFuZGluZyB0aGVzZSBlbnRyeSBwb2ludHMgaXMgY3J1Y2lhbCBmb3IgdHJhY2luZyB0aGUgZXhlY3V0aW9uIGZsb3cgYW5kIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBuYW1lc3BhY2UgdHJlZSBpcyB1dGlsaXplZCBieSB0aGUga2VybmVsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9uc3RyZWUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDcwMDpcdFx0XHRuc190eXBlID0ga2xzLVx1MDAzZW5zX3R5cGU7XG4gNzAxOlx0XHRlbHNlXG4gNzAyOlx0XHRcdG5zX3R5cGUgPSAwO1xuIDcwMzpcdFxuIDcwNDpcdFx0aWYgKG5zX3R5cGUpIHtcbiA3MDU6XHRcdFx0bnNfdHJlZSA9IG5zX3RyZWVfZnJvbV90eXBlKG5zX3R5cGUpO1xuIDcwNjpcdFx0XHRpZiAoIW5zX3RyZWUpXG4gNzA3Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNzA4Olx0XHR9XG4gNzA5Olx0XG4gNzEwOlx0XHRpZiAoa2xzLVx1MDAzZWxhc3RfbnNfaWQpIHtcbiA3MTE6XHRcdFx0a2xzLVx1MDAzZWZpcnN0X25zID0gbG9va3VwX25zX2lkX2F0KGtscy1cdTAwM2VsYXN0X25zX2lkICYjNDM7IDEsIG5zX3R5cGUpO1xuIDcxMjpcdFx0XHRpZiAoIWtscy1cdTAwM2VmaXJzdF9ucylcbiA3MTM6XHRcdFx0XHRyZXR1cm4gLUVOT0VOVDtcbiA3MTQ6XHRcdFx0Zmlyc3RfbnMgPSBrbHMtXHUwMDNlZmlyc3RfbnM7XG4gNzE1Olx0XHR9XG4gNzE2Olx0XG4gNzE3Olx0XHRyZXQgPSAwO1xuIDcxODpcdFx0aWYgKG5zX3RyZWUpXG4gNzE5Olx0XHRcdGhlYWQgPSBcdTAwMjZuc190cmVlLVx1MDAzZW5zX2xpc3RfaGVhZDtcbiA3MjA6XHRcdGVsc2VcbiA3MjE6XHRcdFx0aGVhZCA9IFx1MDAyNm5zX3VuaWZpZWRfcm9vdC5uc19saXN0X2hlYWQ7XG4gNzIyOlx0XG4gNzIzOlx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gNzI0Olx0XG4gNzI1Olx0XHRpZiAoIWZpcnN0X25zKVxuIDcyNjpcdFx0XHRmaXJzdF9ucyA9IGZpcnN0X25zX2NvbW1vbihoZWFkLCBuc190cmVlKTtcbiA3Mjc6XHRcbiA3Mjg6XHRcdGZvciAobnMgPSBmaXJzdF9uczsgIW5zX2NvbW1vbl9pc19oZWFkKG5zLCBoZWFkLCBuc190cmVlKSBcdTAwMjZcdTAwMjYgbnJfbnNfaWRzO1xuIDcyOTpcdFx0ICAgICBucyA9IG5leHRfbnNfY29tbW9uKG5zLCBuc190cmVlKSkge1xuIDczMDpcdFx0XHRzdHJ1Y3QgbnNfY29tbW9uICp2YWxpZDtcbiA3MzE6XHRcbiA3MzI6XHRcdFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xuIDczMzpcdFx0XHRpZiAoIXZhbGlkKVxuIDczNDpcdFx0XHRcdGNvbnRpbnVlO1xuIDczNTpcdFxuIDczNjpcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiA3Mzc6XHRcbiA3Mzg6XHRcdFx0bnNfcHV0KHByZXYpO1xuIDczOTpcdFx0XHRwcmV2ID0gdmFsaWQ7XG4gNzQwOlx0XG4gNzQxOlx0XHRcdGlmIChwdXRfdXNlcih2YWxpZC1cdTAwM2Vuc19pZCwgbnNfaWRzICYjNDM7IHJldCkpIHtcbiA3NDI6XHRcdFx0XHRuc19wdXQocHJldik7XG4gNzQzOlx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gNzQ0Olx0XHRcdH1cbiA3NDU6XHRcbiA3NDY6XHRcdFx0bnJfbnNfaWRzLS07XG4gNzQ3Olx0XHRcdHJldCYjNDM7JiM0Mzs7XG4gNzQ4Olx0XG4gNzQ5Olx0XHRcdHJjdV9yZWFkX2xvY2soKTtcbiA3NTA6XHRcdH1cbiA3NTE6XHRcbiA3NTI6XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIDc1MzpcdFx0bnNfcHV0KHByZXYpO1xuIDc1NDpcdFx0cmV0dXJuIHJldDtcbiA3NTU6XHR9XG4gNzU2Olx0XG4gNzU3Olx0U1lTQ0FMTF9ERUZJTkU0KGxpc3RucywgY29uc3Qgc3RydWN0IG5zX2lkX3JlcSBfX3VzZXIgKiwgcmVxLFxuIDc1ODpcdFx0XHR1NjQgX191c2VyICosIG5zX2lkcywgc2l6ZV90LCBucl9uc19pZHMsIHVuc2lnbmVkIGludCwgZmxhZ3MpXG4gNzU5Olx0e1xuIDc2MDpcdFx0c3RydWN0IGtsaXN0bnMga2xucyBfX2ZyZWUoa2xpc3Ruc19mcmVlKSA9IHt9O1xuIDc2MTpcdFx0Y29uc3Qgc2l6ZV90IG1heGNvdW50ID0gMTAwMDAwMDtcbiA3NjI6XHRcdHN0cnVjdCBuc19pZF9yZXEga3JlcTtcbiA3NjM6XHRcdHNzaXplX3QgcmV0O1xuIDc2NDpcdFxuIDc2NTpcdFx0aWYgKGZsYWdzKVxuIDc2NjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA3Njc6XHRcbiA3Njg6XHRcdGlmICh1bmxpa2VseShucl9uc19pZHMgXHUwMDNlIG1heGNvdW50KSlcbiA3Njk6XHRcdFx0cmV0dXJuIC1FT1ZFUkZMT1c7XG4gNzcwOlx0XG4gNzcxOlx0XHRpZiAoIWFjY2Vzc19vayhuc19pZHMsIG5yX25zX2lkcyAqIHNpemVvZigqbnNfaWRzKSkpXG4gNzcyOlx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDc3MzpcdFxuIDc3NDpcdFx0cmV0ID0gY29weV9uc19pZF9yZXEocmVxLCBcdTAwMjZrcmVxKTtcbiA3NzU6XHRcdGlmIChyZXQpXG4gNzc2Olx0XHRcdHJldHVybiByZXQ7XG4gNzc3Olx0XG4gNzc4Olx0XHRyZXQgPSBwcmVwYXJlX2tsaXN0bnMoXHUwMDI2a2xucywgXHUwMDI2a3JlcSwgbnNfaWRzLCBucl9uc19pZHMpO1xuIDc3OTpcdFx0aWYgKHJldClcbiA3ODA6XHRcdFx0cmV0dXJuIHJldDtcbiA3ODE6XHRcbiA3ODI6XHRcdGlmIChrcmVxLnVzZXJfbnNfaWQpXG4gNzgzOlx0XHRcdHJldHVybiBkb19saXN0bnNfdXNlcm5zKFx1MDAyNmtsbnMpO1xuIDc4NDpcdFxuIDc4NTpcdFx0cmV0dXJuIGRvX2xpc3RucyhcdTAwMjZrbG5zKTtcbiA3ODY6XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk2NTAKCQkJCQkJCW91dHB1dDogMTgKCQkJCQkJCXRob3VnaHRzOiAyMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBCdWlsZCBDb25maWd1cmF0aW9uIGZvciBga2VybmVsL25zdHJlZS5jYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbi4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGJ1aWxkIHByb2Nlc3MgZm9yIGBrZXJuZWwvbnN0cmVlLmNgLiBJJiMzOTttIGdvaW5nIHRvIHN0YXJ0IGJ5IHRyYWNpbmcgaXRzIGNvbXBpbGF0aW9uLiBNeSBwcmltYXJ5IGdvYWwgaGVyZSBpcyB0byBkZXRlcm1pbmUgd2hpY2ggY29uZmlndXJhdGlvbiBvcHRpb25zIG9yIGRlcGVuZGVuY2llcyBhcmUgKnJlcXVpcmVkKiBmb3IgdGhpcyBwYXJ0aWN1bGFyIGZpbGUgdG8gYmUgc3VjY2Vzc2Z1bGx5IGJ1aWx0LiBJcyBpdCBwYXJ0IG9mIGEgc3BlY2lmaWMgc3Vic3lzdGVtLCBvciBpcyBpdCBtb3JlIGJyb2FkbHkgYXBwbGljYWJsZT8gVW5kZXJzdGFuZGluZyB0aGUgZGVwZW5kZW5jaWVzIHdpbGwgYWxsb3cgbWUgdG8sIGZvciBleGFtcGxlLCB1bmRlcnN0YW5kIHRoZSBjb25maWd1cmF0aW9uIGNvbnRleHQgZm9yIHRoZSBidWlsZC4gV2hlcmUgZG9lcyB0aGlzIGZpbGUgZml0IGluPyBJcyBpdCBsaW5rZWQgZHluYW1pY2FsbHkgb3Igc3RhdGljYWxseSwgYW5kIGhvdyBkb2VzIHRoYXQgYWZmZWN0IHRoZSBuZWVkZWQgY29uZmlndXJhdGlvbnM/IEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIGl0cyBpbnRlZ3JhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bnN0cmVlXFwubyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvTWFrZWZpbGU9Nj1vYmoteSAgICAgPSBmb3JrLm8gZXhlY19kb21haW4ubyBleGVjX3N0YXRlLm8gcGFuaWMubyBcXFxuLS1cbmtlcm5lbC9NYWtlZmlsZS0xMC1cdCAgICBleHRhYmxlLm8gcGFyYW1zLm8gXFxcbmtlcm5lbC9NYWtlZmlsZToxMTpcdCAgICBrdGhyZWFkLm8gc3lzX25pLm8gbnNwcm94eS5vIG5zdHJlZS5vIG5zY29tbW9uLm8gXFxcbmtlcm5lbC9NYWtlZmlsZS0xMi1cdCAgICBub3RpZmllci5vIGtzeXNmcy5vIGNyZWQubyByZWJvb3QubyBcXFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5OTY2CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyB0aGUgYG5zdHJlZS5vYCBPYmplY3QgRmlsZSoqCgpPa2F5LCBzbyBgbnN0cmVlLm9gIGlzIGRlZmluaXRlbHkgY29tcGlsZWQgYW5kIGxpbmtlZCBpbnRvIHRoZSBrZXJuZWwsIHNwZWNpZmljYWxseSByZXNpZGluZyB3aXRoaW4gYG9iai15YCBpbiB0aGUgYGtlcm5lbC9NYWtlZmlsZWAuIFRoYXQmIzM5O3MgdGhlIHN0YXJ0aW5nIHBvaW50LiBNeSBuZXh0IG1vdmUgaXMgdG8gY2hlY2sgZm9yIGFueSByZWxldmFudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIEkgbmVlZCB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBLY29uZmlnIGVudHJpZXMgcmVsYXRlZCB0byAmIzM0O2xpc3RucywmIzM0OyAmIzM0O25zdHJlZSwmIzM0OyBvciBwZXJoYXBzIGV2ZW4gJiMzNDtuYW1lc3BhY2VzJiMzNDsgaW4gZ2VuZXJhbC4gVGhvc2UgYXJlIHRoZSBvYnZpb3VzIGxlYWRzLiBBZnRlciB0aGF0LCBJIHdpbGwgbW92ZSB0byB0aGUgc291cmNlIGNvZGUgaXRzZWxmIHRvIGluc3BlY3QgdGhlIGltcGxlbWVudGF0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIGRpZyBpbnRvIHRoZSBga2VybmVsL25zdHJlZS5jYCBmaWxlLCBhbmQgcHJvYmFibHkgYWxzbyB0YWtlIGEgbG9vayBhdCBgaW5jbHVkZS9saW51eC9uc3RyZWUuaGAgdG8gc2VlIGhvdyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGFuZCB3aGF0IHRoZSBwdWJsaWMgaW50ZXJmYWNlIGxvb2tzIGxpa2UuIFRoYXQgd2lsbCBwcm92aWRlIGluc2lnaHQgaW50byBob3cgdGhpcyB0aGluZyBpcyBhY3R1YWxseSBiZWluZyB1c2VkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9uc3RyZWUuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQ4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDgwOlx0XHRcdFx0cmV0ID0gbnM7XG4gNDgxOlx0XHRcdFx0aWYgKG5zX2lkID09IG5zLVx1MDAzZW5zX2lkKVxuIDQ4MjpcdFx0XHRcdFx0YnJlYWs7XG4gNDgzOlx0XHRcdFx0bm9kZSA9IG5vZGUtXHUwMDNlcmJfbGVmdDtcbiA0ODQ6XHRcdFx0fSBlbHNlIHtcbiA0ODU6XHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9yaWdodDtcbiA0ODY6XHRcdFx0fVxuIDQ4NzpcdFx0fVxuIDQ4ODpcdFxuIDQ4OTpcdFx0aWYgKHJldClcbiA0OTA6XHRcdFx0cmV0ID0gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShyZXQpO1xuIDQ5MTpcdFx0cmV0dXJuIHJldDtcbiA0OTI6XHR9XG4gNDkzOlx0XG4gNDk0Olx0c3RhdGljIHN0cnVjdCBuc19jb21tb24gKmxvb2t1cF9uc19pZCh1NjQgbW50X25zX2lkLCBpbnQgbnNfdHlwZSlcbiA0OTU6XHR7XG4gNDk2Olx0XHRzdHJ1Y3QgbnNfY29tbW9uICpucztcbiA0OTc6XHRcbiA0OTg6XHRcdGd1YXJkKHJjdSkoKTtcbiA0OTk6XHRcdG5zID0gbnNfdHJlZV9sb29rdXBfcmN1KG1udF9uc19pZCwgbnNfdHlwZSk7XG4gNTAwOlx0XHRpZiAoIW5zKVxuIDUwMTpcdFx0XHRyZXR1cm4gTlVMTDtcbiA1MDI6XHRcbiA1MDM6XHRcdGlmICghbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShucykpXG4gNTA0Olx0XHRcdHJldHVybiBOVUxMO1xuIDUwNTpcdFxuIDUwNjpcdFx0cmV0dXJuIG5zO1xuIDUwNzpcdH1cbiA1MDg6XHRcbiA1MDk6XHRzdGF0aWMgaW5saW5lIGJvb2wgX19tdXN0X2NoZWNrIG5zX3JlcXVlc3RlZChjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxuIDUxMDpcdFx0XHRcdFx0XHQgICAgIGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zKVxuIDUxMTpcdHtcbiA1MTI6XHRcdHJldHVybiAha2xzLVx1MDAzZW5zX3R5cGUgfHwgKGtscy1cdTAwM2Vuc190eXBlIFx1MDAyNiBucy1cdTAwM2Vuc190eXBlKTtcbiA1MTM6XHR9XG4gNTE0Olx0XG4gNTE1Olx0c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBtYXlfbGlzdF9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxuIDUxNjpcdFx0XHRcdFx0XHQgICAgc3RydWN0IG5zX2NvbW1vbiAqbnMpXG4gNTE3Olx0e1xuIDUxODpcdFx0aWYgKGtscy1cdTAwM2V1c2VyX25zIFx1MDAyNlx1MDAyNiBrbHMtXHUwMDNldXNlcm5zX2NhcGFibGUpXG4gNTE5Olx0XHRcdHJldHVybiB0cnVlO1xuIDUyMDpcdFx0aWYgKGlzX2N1cnJlbnRfbmFtZXNwYWNlKG5zKSlcbiA1MjE6XHRcdFx0cmV0dXJuIHRydWU7XG4gNTIyOlx0XHRyZXR1cm4gbWF5X3NlZV9hbGxfbmFtZXNwYWNlcygpO1xuIDUyMzpcdH1cbiA1MjQ6XHRcbiA1MjU6XHRzdGF0aWMgaW5saW5lIHZvaWQgbnNfcHV0KHN0cnVjdCBuc19jb21tb24gKm5zKVxuIDUyNjpcdHtcbiA1Mjc6XHRcdGlmIChucyBcdTAwMjZcdTAwMjYgbnMtXHUwMDNlb3BzKVxuIDUyODpcdFx0XHRucy1cdTAwM2VvcHMtXHUwMDNlcHV0KG5zKTtcbiA1Mjk6XHR9XG4gNTMwOlx0XG4gNTMxOlx0REVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxuIDUzMjpcdFxuIDUzMzpcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5zX2NvbW1vbiAqX19tdXN0X2NoZWNrIGxlZ2l0aW1pemVfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbiA1MzQ6XHRcdFx0XHRcdFx0XHRcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcbiA1MzU6XHR7XG4gNTM2Olx0XHRpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpXG4gNTM3Olx0XHRcdHJldHVybiBOVUxMO1xuIDUzODpcdFxuIDUzOTpcdFx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIGNhbmRpZGF0ZSkpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMDgwCgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogNDg2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYGxlZ2l0aW1pemVfbnNgIENoYW5nZSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gc2VlIHRoZSBmdW5jdGlvbmFsIGNoYW5nZXMgaW4gYGxlZ2l0aW1pemVfbnNgIGFuZCB0aGUgcmF0aW9uYWxlIGZvciB0aGUgcGF0Y2guIExvb2tpbmcgYXQgdGhlIGNvZGUsIHByZXZpb3VzbHksIHRoZSBmdW5jdGlvbiBoYWQgYSBzcGVjaWZpYyBmbG93LiBJdCBmaXJzdCBhdHRlbXB0ZWQgdG8gYWNxdWlyZSBhIHJlZmVyZW5jZSB1c2luZyBgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpYCwgYW5kIHRoZW4sIGNvbmRpdGlvbmFsbHksIGl0IGNoZWNrZWQgYG1heV9saXN0X25zKGtscywgbnMpYC4gSWYgYG1heV9saXN0X25zYCBmYWlsZWQsIHRoZSBjb2RlIHdvdWxkIHJlbGVhc2UgdGhhdCByZWZlcmVuY2UuIE5vdywgdGhlIGxvZ2ljIGlzIGRpZmZlcmVudC4gVGhlIGNyaXRpY2FsIGNoYW5nZSBpcyB0aGUgcmVvcmRlcmluZyBvZiBvcGVyYXRpb25zLiBJdCBub3cgY2hlY2tzIGBtYXlfbGlzdF9ucyhrbHMsIGNhbmRpZGF0ZSlgICpiZWZvcmUqIHRha2luZyB0aGUgcmVmZXJlbmNlIHZpYSBgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpYC4gU28sIHJhdGhlciB0aGFuIGluY3JlbWVudGluZyBhIHJlZmVyZW5jZSBhbmQgcG90ZW50aWFsbHkgcmVsZWFzaW5nIGl0LCB0aGUgbmV3IGZsb3cgYXZvaWRzIGluY3JlbWVudGluZyBpZiB0aGUgbGlzdCBjaGVjayB3b3VsZCByZWplY3QgdGhlIG5hbWVzcGFjZS4KClRoZSBrZXkgaXMgYG1heV9saXN0X25zYC4gTG9va2luZyBhdCB0aGF0IGZ1bmN0aW9uLCBpdCYjMzk7cyBwcmV0dHkgY2xlYXIuIEl0IGNoZWNrcyBpZiB0aGUgYGtsc2AgaGFzIGEgdXNlciBuYW1lc3BhY2UgYW5kIHRoZSB1c2VyIG5hbWVzcGFjZSBoYXMgdGhlIHByb3BlciBjYXBhYmlsaXRpZXMuIElmIHNvLCBpdCByZXR1cm5zIHRydWUsIGluZGljYXRpbmcgdGhhdCB0aGUgbmFtZXNwYWNlIGNhbiBiZSBsaXN0ZWQuIEl0IGFsc28gYWxsb3dzIGxpc3RpbmcgaWYgdGhlIHByb3ZpZGVkIG5hbWVzcGFjZSBpcyB0aGUgY3VycmVudCBuYW1lc3BhY2UsIHVzaW5nIHRoZSBmdW5jdGlvbiBgaXNfY3VycmVudF9uYW1lc3BhY2UobnMpYC4gTGFzdGx5LCBpZiB0aGUgZW52aXJvbm1lbnQgYWxsb3dzIHNlZWluZyBhbGwgbmFtZXNwYWNlcywgaXQgcmV0dXJucyB0cnVlLgoKU28sIGluIGVzc2VuY2UsIHRoZSBwYXRjaCBvcHRpbWl6ZWQgdGhpcyBmdW5jdGlvbiB0byBjaGVjayBwZXJtaXNzaW9ucyAqYmVmb3JlKiBhY3F1aXJpbmcgdGhlIHJlZmVyZW5jZS4gSSBub3cgbmVlZCB0byBkaXZlIGludG8gYGlzX2N1cnJlbnRfbmFtZXNwYWNlYCB0byBmdWxseSBhc3Nlc3MgdGhlIGNvbnNlcXVlbmNlcyBvZiB0aGlzIGNoYW5nZSwgYW5kIGhvdyBpdCBhbGlnbnMgd2l0aCB0aGUgb3ZlcmFsbCBkZXNpZ24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2lzX2N1cnJlbnRfbmFtZXNwYWNlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL25zZnMuYz00NTY9c3RhdGljIGludCBuc2ZzX2VuY29kZV9maChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgKmZoLCBpbnQgKm1heF9sZW4sXG4tLVxuZnMvbnNmcy5jLTQ3OC1cbmZzL25zZnMuYzo0Nzk6Ym9vbCBpc19jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3QgbnNfY29tbW9uICpucylcbmZzL25zZnMuYy00ODAte1xuLS1cbmluY2x1ZGUvbGludXgvbnNfY29tbW9uLmgtMTAtXG5pbmNsdWRlL2xpbnV4L25zX2NvbW1vbi5oOjExOmJvb2wgaXNfY3VycmVudF9uYW1lc3BhY2Uoc3RydWN0IG5zX2NvbW1vbiAqbnMpO1xuaW5jbHVkZS9saW51eC9uc19jb21tb24uaC0xMi1pbnQgX19uc19jb21tb25faW5pdChzdHJ1Y3QgbnNfY29tbW9uICpucywgdTMyIG5zX3R5cGUsIGNvbnN0IHN0cnVjdCBwcm9jX25zX29wZXJhdGlvbnMgKm9wcywgaW50IGludW0pO1xuLS1cbmtlcm5lbC9uc3RyZWUuYz01MTU9c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBtYXlfbGlzdF9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxuLS1cbmtlcm5lbC9uc3RyZWUuYy01MTktXHRcdHJldHVybiB0cnVlO1xua2VybmVsL25zdHJlZS5jOjUyMDpcdGlmIChpc19jdXJyZW50X25hbWVzcGFjZShucykpXG5rZXJuZWwvbnN0cmVlLmMtNTIxLVx0XHRyZXR1cm4gdHJ1ZTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIyMjAKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBJJiMzOTttIHRoaW5raW5nIGFib3V0IGBmcy9uc2ZzLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNDc5LiBUaGlzIGxpa2VseSByZWxhdGVzIHRvIHNvbWUgYXNwZWN0IG9mIHRoZSBuYW1lc3BhY2UgZmlsZSBzeXN0ZW0gaW1wbGVtZW50YXRpb24uIEdpdmVuIG15IGV4cGVydGlzZSwgSSYjMzk7bSBhbHJlYWR5IGFudGljaXBhdGluZyB3aGF0IHRoYXQgYXJlYSBtaWdodCBjb3Zlci4gSXMgaXQgcmVsYXRlZCB0byBpbm9kZSBhbGxvY2F0aW9uLCBwZXJtaXNzaW9uIGNoZWNraW5nLCBtb3VudCBvcGVyYXRpb25zLCBvciBwZXJoYXBzIHNvbWUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdmlydHVhbCBmaWxlc3lzdGVtIGxheWVyPyBJJiMzOTtsbCBwcm9iYWJseSBzdGFydCBzY2FubmluZyBmb3IgZnVuY3Rpb24gY2FsbHMgb3IgY29uZGl0aW9uYWwgc3RhdGVtZW50cyB0aGVyZSBhbmQgdHJ5IHRvIHVuZGVyc3RhbmQgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuIEl0IGNvdWxkIGJlIGEgY3J1Y2lhbCBwaWVjZSBvZiB0aGUgcHV6emxlIEkmIzM5O20gdHJ5aW5nIHRvIHNvbHZlLCBvciBpdCBjb3VsZCBqdXN0IHByb3ZpZGUgc29tZSB1c2VmdWwgY29udGV4dC4gTGV0IG1lIGV4YW1pbmUgdGhlIGNvZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7ZnMvbnNmcy5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNDcwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA0NzA6XHRcdFx0Km1heF9sZW4gPSBOU0ZTX0ZJRF9TSVpFX1UzMl9MQVRFU1Q7XG4gNDcxOlx0XHR9XG4gNDcyOlx0XG4gNDczOlx0XHRmaWQtXHUwMDNlbnNfaWRcdD0gbnMtXHUwMDNlbnNfaWQ7XG4gNDc0Olx0XHRmaWQtXHUwMDNlbnNfdHlwZVx0PSBucy1cdTAwM2Vuc190eXBlO1xuIDQ3NTpcdFx0ZmlkLVx1MDAzZW5zX2ludW1cdD0gaW5vZGUtXHUwMDNlaV9pbm87XG4gNDc2Olx0XHRyZXR1cm4gRklMRUlEX05TRlM7XG4gNDc3Olx0fVxuIDQ3ODpcdFxuIDQ3OTpcdGJvb2wgaXNfY3VycmVudF9uYW1lc3BhY2Uoc3RydWN0IG5zX2NvbW1vbiAqbnMpXG4gNDgwOlx0e1xuIDQ4MTpcdFx0c3dpdGNoIChucy1cdTAwM2Vuc190eXBlKSB7XG4gNDgyOlx0I2lmZGVmIENPTkZJR19DR1JPVVBTXG4gNDgzOlx0XHRjYXNlIENMT05FX05FV0NHUk9VUDpcbiA0ODQ6XHRcdFx0cmV0dXJuIGN1cnJlbnRfaW5fbmFtZXNwYWNlKHRvX2NnX25zKG5zKSk7XG4gNDg1Olx0I2VuZGlmXG4gNDg2Olx0I2lmZGVmIENPTkZJR19JUENfTlNcbiA0ODc6XHRcdGNhc2UgQ0xPTkVfTkVXSVBDOlxuIDQ4ODpcdFx0XHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9faXBjX25zKG5zKSk7XG4gNDg5Olx0I2VuZGlmXG4gNDkwOlx0XHRjYXNlIENMT05FX05FV05TOlxuIDQ5MTpcdFx0XHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fbW50X25zKG5zKSk7XG4gNDkyOlx0I2lmZGVmIENPTkZJR19ORVRfTlNcbiA0OTM6XHRcdGNhc2UgQ0xPTkVfTkVXTkVUOlxuIDQ5NDpcdFx0XHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fbmV0X25zKG5zKSk7XG4gNDk1Olx0I2VuZGlmXG4gNDk2Olx0I2lmZGVmIENPTkZJR19QSURfTlNcbiA0OTc6XHRcdGNhc2UgQ0xPTkVfTkVXUElEOlxuIDQ5ODpcdFx0XHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fcGlkX25zKG5zKSk7XG4gNDk5Olx0I2VuZGlmXG4gNTAwOlx0I2lmZGVmIENPTkZJR19USU1FX05TXG4gNTAxOlx0XHRjYXNlIENMT05FX05FV1RJTUU6XG4gNTAyOlx0XHRcdHJldHVybiBjdXJyZW50X2luX25hbWVzcGFjZSh0b190aW1lX25zKG5zKSk7XG4gNTAzOlx0I2VuZGlmXG4gNTA0Olx0I2lmZGVmIENPTkZJR19VU0VSX05TXG4gNTA1Olx0XHRjYXNlIENMT05FX05FV1VTRVI6XG4gNTA2Olx0XHRcdHJldHVybiBjdXJyZW50X2luX25hbWVzcGFjZSh0b191c2VyX25zKG5zKSk7XG4gNTA3Olx0I2VuZGlmXG4gNTA4Olx0I2lmZGVmIENPTkZJR19VVFNfTlNcbiA1MDk6XHRcdGNhc2UgQ0xPTkVfTkVXVVRTOlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzAxNQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDUyMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbjogYGxpc3Ruc2AgYW5kIE5hbWVzcGFjZSBMb2dpYyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBhbmFseXNpcyBpbmRpY2F0ZXMgdGhhdCBgbGVnaXRpbWl6ZV9uc2AgaXMgY2FsbGVkIHdpdGhpbiB0aGUgYGRvX2xpc3Ruc2AgYW5kIGBkb19saXN0bnNfdXNlcm5zYCBmdW5jdGlvbnMuIFRob3NlIGZ1bmN0aW9ucyBvcGVyYXRlIGluc2lkZSBhbiBSQ1UgcmVhZCBsb2NrLCBhbmQgY3J1Y2lhbGx5LCB0aGV5JiMzOTtyZSBwYXJ0IG9mIHRoZSBuYW1lc3BhY2UgaXRlcmF0aW9uIHByb2Nlc3MuIFRoaXMgbWVhbnMgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBtb2RpZmljYXRpb25zIHRvIGNvcmUga2VybmVsIGFuZCBWRlMgbmFtZXNwYWNlIGxvZ2ljLCBzcGVjaWZpY2FsbHkgdHJpZ2dlcmVkIGJ5IHRoZSBgbGlzdG5zYCBzeXNjYWxsLgoKVGhlIGtleSBxdWVzdGlvbiBpcyBhbHdheXMgcmVhY2hhYmlsaXR5LiBDYW4gdXNlcnNwYWNlIGNvZGUsIG9yIHRvb2xzIGxpa2Ugc3l6a2FsbGVyLCB0cmlnZ2VyIHRoaXMgY29kZSBwYXRoIGRpcmVjdGx5PyBUaGUgYW5zd2VyIGlzICp5ZXMqLiBUaGUgYGxpc3Ruc2Agc3lzY2FsbCwgb3IgYHN5c19saXN0bnNgLCBwcm92aWRlcyBhIGRpcmVjdCBlbnRyeSBwb2ludC4gVGhpcyBtYWtlcyBpdCBhIHBvdGVudGlhbCB0YXJnZXQuIFRoaXMgZGlyZWN0bHkgdG91Y2hlcyBleGVjdXRhYmxlIGNvZGUgaW4gdGhlIGNvcmUgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgYGtlcm5lbC9uc3RyZWUuY2AuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgZGVmaW5pdGVseSB0cnVlIGhlcmUuCgpOb3csIGZvciBgRm9jdXNTeW1ib2xzYCwgd2UgaGF2ZSB0byBwaW5wb2ludCB0aGUgcmVsZXZhbnQgc3ltYm9scyB0byB0YXJnZXQuCgoqICAgYGxlZ2l0aW1pemVfbnNgIGlzIGBzdGF0aWMgaW5saW5lYCwgc28gaXQgd2lsbCBiZSBpbmxpbmVkLgoqICAgYGxlZ2l0aW1pemVfbnNgIGlzIGNhbGxlZCBpbjoKICAgICogICBgZG9fbGlzdG5zYCAoc3RhdGljKQogICAgKiAgIGBkb19saXN0bnNfdXNlcm5zYCAoc3RhdGljKQogICAgKiAgIGBzeXNfbGlzdG5zYCAvIGBfX2RvX3N5c19saXN0bnNgIC8gYF9fc2Vfc3lzX2xpc3Ruc2AgKHN5c2NhbGwgZW50cnkpCgpHaXZlbiB0aGlzIGluZm9ybWF0aW9uLCBsZXQmIzM5O3MgZXhwbG9yZSB0aGUgc3ltYm9sIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gdGhlIGBsaXN0bnNgIHN5c2NhbGwuIFdlIG5lZWQgdGhlIHNwZWNpZmljIG5hbWVzIG9mIGZ1bmN0aW9ucyBhbmQgdGhlIGV4YWN0IHN5c2NhbGwgbmFtaW5nIGNvbnZlbnRpb24uIEdyZXBwaW5nIGZvciBgbGlzdG5zYCBvciBleGFtaW5pbmcgdGhlIGZpbGUgYXJvdW5kIGxpbmUgNzU3LCBhcyB3ZWxsIGFzIHRoZSBncmVwcGVyLCBzaG93cyB0aGUgZm9sbG93aW5nOgoKYFNZU0NBTExfREVGSU5FNChsaXN0bnMsIC4uLilgIGRlZmluZXMgdGhlIGZvbGxvd2luZyBzeW1ib2xzOgoqICAgYF9feDY0X3N5c19saXN0bnNgCiogICBgX19kb19zeXNfbGlzdG5zYAoqICAgYHN5c19saXN0bnNgCiogICBgZG9fbGlzdG5zYAoqICAgYGRvX2xpc3Ruc191c2VybnNgCgpFdmVuIHRob3VnaCBgZG9fbGlzdG5zYCBhbmQgYGRvX2xpc3Ruc191c2VybnNgIGFyZSBzdGF0aWMsIHdlIHNob3VsZCBzdGlsbCBjb25zaWRlciBmdXp6aW5nIGBfX2RvX3N5c19saXN0bnNgLCBgZG9fbGlzdG5zYCwgYGRvX2xpc3Ruc191c2VybnNgLiBNeSBuZXh0IHN0ZXAgaXMgdG8gdXNlIGdyZXBwZXIgdG8gZXhhbWluZSB0aGUgYGtlcm5lbC9uc3RyZWUuY2AgZmlsZSBhbmQgdW5kZXJzdGFuZCB0aGUgc3ltYm9sIGRlZmluaXRpb25zIGJldHRlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7KGRvX2xpc3Ruc3xsaXN0bnMpJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL25zdHJlZS5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9uc3RyZWUuYz0zOTI9dTY0IF9fbnNfdHJlZV9nZW5faWQoc3RydWN0IG5zX2NvbW1vbiAqbnMsIHU2NCBpZClcbi0tXG5rZXJuZWwvbnN0cmVlLmMtNDAyLVxua2VybmVsL25zdHJlZS5jOjQwMzpzdHJ1Y3Qga2xpc3RucyB7XG5rZXJuZWwvbnN0cmVlLmMtNDA0LVx0dTY0IF9fdXNlciAqdW5zX2lkcztcbi0tXG5rZXJuZWwvbnN0cmVlLmMtNDEzLVxua2VybmVsL25zdHJlZS5jOjQxNDpzdGF0aWMgdm9pZCBfX2ZyZWVfa2xpc3Ruc19mcmVlKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMpXG5rZXJuZWwvbnN0cmVlLmMtNDE1LXtcbi0tXG5rZXJuZWwvbnN0cmVlLmM9NDI0PXN0YXRpYyBpbnQgY29weV9uc19pZF9yZXEoY29uc3Qgc3RydWN0IG5zX2lkX3JlcSBfX3VzZXIgKnJlcSxcbi0tXG5rZXJuZWwvbnN0cmVlLmMtNDQ5LVxua2VybmVsL25zdHJlZS5jOjQ1MDpzdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX2tsaXN0bnMoc3RydWN0IGtsaXN0bnMgKmtscywgc3RydWN0IG5zX2lkX3JlcSAqa3JlcSxcbmtlcm5lbC9uc3RyZWUuYy00NTEtXHRcdFx0XHQgIHU2NCBfX3VzZXIgKm5zX2lkcywgc2l6ZV90IG5yX25zX2lkcylcbi0tXG5rZXJuZWwvbnN0cmVlLmM9NDk0PXN0YXRpYyBzdHJ1Y3QgbnNfY29tbW9uICpsb29rdXBfbnNfaWQodTY0IG1udF9uc19pZCwgaW50IG5zX3R5cGUpXG4tLVxua2VybmVsL25zdHJlZS5jLTUwOC1cbmtlcm5lbC9uc3RyZWUuYzo1MDk6c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBuc19yZXF1ZXN0ZWQoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbmtlcm5lbC9uc3RyZWUuYy01MTAtXHRcdFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMpXG4tLVxua2VybmVsL25zdHJlZS5jLTUxNC1cbmtlcm5lbC9uc3RyZWUuYzo1MTU6c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBtYXlfbGlzdF9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxua2VybmVsL25zdHJlZS5jLTUxNi1cdFx0XHRcdFx0ICAgIHN0cnVjdCBuc19jb21tb24gKm5zKVxuLS1cbmtlcm5lbC9uc3RyZWUuYz01MzE9REVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxua2VybmVsL25zdHJlZS5jLTUzMi1cbmtlcm5lbC9uc3RyZWUuYzo1MzM6c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxua2VybmVsL25zdHJlZS5jLTUzNC1cdFx0XHRcdFx0XHRcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcbi0tXG5rZXJuZWwvbnN0cmVlLmMtNTQ0LVxua2VybmVsL25zdHJlZS5jOjU0NTpzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXG5rZXJuZWwvbnN0cmVlLmMtNTQ2LXtcbi0tXG5rZXJuZWwvbnN0cmVlLmM9NjgwPXN0YXRpYyBpbmxpbmUgYm9vbCBuc19jb21tb25faXNfaGVhZChzdHJ1Y3QgbnNfY29tbW9uICpucyxcbi0tXG5rZXJuZWwvbnN0cmVlLmMtNjg4LVxua2VybmVsL25zdHJlZS5jOjY4OTpzdGF0aWMgc3NpemVfdCBkb19saXN0bnMoc3RydWN0IGtsaXN0bnMgKmtscylcbmtlcm5lbC9uc3RyZWUuYy02OTAte1xuLS1cbmtlcm5lbC9uc3RyZWUuYy03NTYtXG5rZXJuZWwvbnN0cmVlLmM6NzU3OlNZU0NBTExfREVGSU5FNChsaXN0bnMsIGNvbnN0IHN0cnVjdCBuc19pZF9yZXEgX191c2VyICosIHJlcSxcbmtlcm5lbC9uc3RyZWUuYy03NTgtXHRcdHU2NCBfX3VzZXIgKiwgbnNfaWRzLCBzaXplX3QsIG5yX25zX2lkcywgdW5zaWduZWQgaW50LCBmbGFncylcbmtlcm5lbC9uc3RyZWUuYy03NTkte1xua2VybmVsL25zdHJlZS5jOjc2MDpcdHN0cnVjdCBrbGlzdG5zIGtsbnMgX19mcmVlKGtsaXN0bnNfZnJlZSkgPSB7fTtcbmtlcm5lbC9uc3RyZWUuYy03NjEtXHRjb25zdCBzaXplX3QgbWF4Y291bnQgPSAxMDAwMDAwO1xuLS1cbmtlcm5lbC9uc3RyZWUuYy03NzctXG5rZXJuZWwvbnN0cmVlLmM6Nzc4Olx0cmV0ID0gcHJlcGFyZV9rbGlzdG5zKFx1MDAyNmtsbnMsIFx1MDAyNmtyZXEsIG5zX2lkcywgbnJfbnNfaWRzKTtcbmtlcm5lbC9uc3RyZWUuYy03NzktXHRpZiAocmV0KVxuLS1cbmtlcm5lbC9uc3RyZWUuYy03ODItXHRpZiAoa3JlcS51c2VyX25zX2lkKVxua2VybmVsL25zdHJlZS5jOjc4MzpcdFx0cmV0dXJuIGRvX2xpc3Ruc191c2VybnMoXHUwMDI2a2xucyk7XG5rZXJuZWwvbnN0cmVlLmMtNzg0LVxua2VybmVsL25zdHJlZS5jOjc4NTpcdHJldHVybiBkb19saXN0bnMoXHUwMDI2a2xucyk7XG5rZXJuZWwvbnN0cmVlLmMtNzg2LX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTUxNTQKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA2MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipDb25maWd1cmF0aW9uIEludmVzdGlnYXRpb24qKgoKT2theSwgc28gYmVmb3JlIEkgZGl2ZSBpbiwgSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGhhdmVuJiMzOTt0IG1pc3NlZCBhbnkgY3J1Y2lhbCBjb25maWd1cmF0aW9uIGRldGFpbHMuIEZpcnN0LCBJJiMzOTttIHRoaW5raW5nIEkgc2hvdWxkIGludmVzdGlnYXRlIHBvdGVudGlhbCBkZXBlbmRlbmNpZXMgb24gY29uZmlndXJhdGlvbnMgdGhhdCBtYXkgYmUgbmVjZXNzYXJ5LiBJJiMzOTttIGdvaW5nIHRvIGxvb2sgYXQgaG93IGBOQU1FU1BBQ0VTYCBvciBgVVNFUl9OU2AgYXJlIGhhbmRsZWQgd2l0aGluIHRoZSBidWlsZCBzeXN0ZW0uIElzIGBuc3RyZWUub2AgYWx3YXlzIGJ1aWx0LCBvciBkb2VzIGl0IGhpbmdlIG9uIG9uZSBvZiB0aG9zZSBjb25maWd1cmF0aW9uIG9wdGlvbnM/IEkmIzM5O2xsIHByb2JhYmx5IHN0YXJ0IGJ5IGNoZWNraW5nIGZvciB0aG9zZSB2YXJpYWJsZXMsIGJlY2F1c2UgdGhhdCBzZWVtcyBsaWtlIHRoZSBuYXR1cmFsIHN0YXJ0aW5nIHBvaW50LiBUbyBwaW5wb2ludCB0aGUgZXhhY3QgYnVpbGQgc2V0dXAsIEkgc2hvdWxkIGNoZWNrIHRoZSBgaW5pdC9LY29uZmlnYCBmaWxlLCBvciBwZXJoYXBzIHRoZSBga2VybmVsL01ha2VmaWxlYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7TkFNRVNQQUNFUyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbml0L0tjb25maWc9MTQwNz1lbmRpZiAjIENHUk9VUFNcbmluaXQvS2NvbmZpZy0xNDA4LVxuaW5pdC9LY29uZmlnOjE0MDk6bWVudWNvbmZpZyBOQU1FU1BBQ0VTXG5pbml0L0tjb25maWctMTQxMC1cdGJvb2wgXCYjMzQ7TmFtZXNwYWNlcyBzdXBwb3J0XCYjMzQ7IGlmIEVYUEVSVFxuLS1cbmluaXQvS2NvbmZpZy0xNDE4LVxuaW5pdC9LY29uZmlnOjE0MTk6aWYgTkFNRVNQQUNFU1xuaW5pdC9LY29uZmlnLTE0MjAtXG4tLVxuaW5pdC9LY29uZmlnPTE0Njg9Y29uZmlnIE5FVF9OU1xuLS1cbmluaXQvS2NvbmZpZy0xNDc1LVxuaW5pdC9LY29uZmlnOjE0NzY6ZW5kaWYgIyBOQU1FU1BBQ0VTXG5pbml0L0tjb25maWctMTQ3Ny1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU1NTcKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiA5OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIHRoZSBCdWlsZCBQcm9jZXNzIGZvciBgbGlzdG5zYCoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCB3aHkgYGxpc3Ruc2AgaXMgYmVoYXZpbmcgdGhpcyB3YXksIGFuZCBJIHN1c3BlY3QgaXQmIzM5O3MgcmVsYXRlZCB0byB0aGUgYnVpbGQgY29uZmlndXJhdGlvbi4gTXkgZmlyc3QgdGhvdWdodCBpcyB0byBjaGVjayB0aGUgYGtlcm5lbC9NYWtlZmlsZWAgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDExIHRvIHNlZSBob3cgYG5zdHJlZS5vYCBpcyBiZWluZyBoYW5kbGVkLiBSaWdodCwgYG5zdHJlZS5vYCBpcyB1bmNvbmRpdGlvbmFsbHkgY29tcGlsZWQgKGBvYmoteWApLCB3aGljaCBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhpcyBtb2R1bGUmIzM5O3MgaW5jbHVzaW9uIGRlcGVuZHMgb24gYW55IHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zLiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIGlmIGVpdGhlciBgQ09ORklHX05BTUVTUEFDRVNgIG9yIGBDT05GSUdfVVNFUl9OU2AgYXJlIGNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcyBmb3IgYGxpc3Ruc2AuIExldCYjMzk7cyBsb29rIGF0IGBpbml0L0tjb25maWdgIHRvIHNlZSBob3cgYE5BTUVTUEFDRVNgIGlzIGNvbmZpZ3VyZWQuIFRoZW4sIEkgc2hvdWxkIHByb2JhYmx5IGFsc28gZGVsdmUgaW50byBga2VybmVsL25zdHJlZS5jYCB0byBzZWUgaG93IHRoZSBjb2RlIGl0c2VsZiBsZXZlcmFnZXMgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiwgaWYgYXQgYWxsLiBUaGF0IHNob3VsZCBjbGFyaWZ5IHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBmbG93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0NPTkZJR18mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvbnN0cmVlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTkwNQoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDEwNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFeGFtaW5pbmcgdGhlIEtlcm5lbCBOYW1lc3BhY2UgQ29kZSoqCgpPa2F5LCBzbyBJJiMzOTttIGRpdmluZyBpbnRvIGBrZXJuZWwvbnN0cmVlLmNgIGFuZCBpbW1lZGlhdGVseSBub3RpY2luZyBzb21ldGhpbmcgaW50ZXJlc3Rpbmc6IG5vIGRpcmVjdCBjb25kaXRpb25hbCBjb21waWxhdGlvbiBiYXNlZCBvbiBrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb25zLiBUaGlzIGlzIGEgY29tbW9uIHBhdHRlcm4sIGFuZCBJJiMzOTttIG5vdCBzdXJwcmlzZWQsIGJ1dCBpdCBzdGlsbCB3YXJyYW50cyBhIGNoZWNrLiBJdCBzZWVtcyB0aGUgZGVwZW5kZW5jaWVzIGFyZSBsaWtlbHkgcHVsbGVkIGluIHRocm91Z2ggaW5jbHVkZWQgaGVhZGVycyBsaWtlIGBmcy9uc2ZzLmNgIGFuZCB0aGUgYGlzX2N1cnJlbnRfbmFtZXNwYWNlYCBmdW5jdGlvbi4KCkhvd2V2ZXIsIEkgYWx3YXlzIGZpbmQgaXQgZ29vZCBwcmFjdGljZSB0byBoYXZlIGF0IGxlYXN0ICpzb21lKiBpbmRpY2F0aW9uIHdpdGhpbiBhIHNvdXJjZSBmaWxlIGl0c2VsZiB0aGF0IGl0cyBiZWhhdmlvciBpcyBnb3Zlcm5lZCBieSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucywgZXZlbiBpZiBpbmRpcmVjdGx5LiBUaGUgdXNlIG9mIGBOQU1FU1BBQ0VTYCBvciBgVVNFUl9OU2AsIG9yIHRoZSBvdmVyYXJjaGluZyBgTkFNRVNQQUNFU2AgY29uZmlndXJhdGlvbiBhcyBhIHdob2xlLCBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIHF1aWNrIGNvZGUgcmV2aWV3cyBhbmQgZGVidWdnaW5nLiBTbywgbGV0JiMzOTtzIGNvbmZpcm0gdGhlIGV4cGVjdGVkIGJlaGF2aW9yIGFuZCB2ZXJpZnkgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCgpMZXQmIzM5O3MgZ28gc3RyYWlnaHQgdG8gYGluaXQvS2NvbmZpZ2AgYW5kIHNlZSBob3cgYENPTkZJR19OQU1FU1BBQ0VTYCBpcyBkZWZpbmVkIGFuZCB3aGF0IGl0IGRlcGVuZHMgb24uIEkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBjb21wbGV0ZSBwaWN0dXJlIG9mIGhvdyB0aGlzIHNlY3Rpb24gb2YgY29kZSBpcyB0cmVhdGVkIGluIHRoZSBjb25maWd1cmF0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luaXQvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE0MDgsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTQwODpcdFxuMTQwOTpcdG1lbnVjb25maWcgTkFNRVNQQUNFU1xuMTQxMDpcdFx0Ym9vbCBcJiMzNDtOYW1lc3BhY2VzIHN1cHBvcnRcJiMzNDsgaWYgRVhQRVJUXG4xNDExOlx0XHRkZXBlbmRzIG9uIE1VTFRJVVNFUlxuMTQxMjpcdFx0ZGVmYXVsdCAhRVhQRVJUXG4xNDEzOlx0XHRoZWxwXG4xNDE0Olx0XHQgIFByb3ZpZGVzIHRoZSB3YXkgdG8gbWFrZSB0YXNrcyB3b3JrIHdpdGggZGlmZmVyZW50IG9iamVjdHMgdXNpbmdcbjE0MTU6XHRcdCAgdGhlIHNhbWUgaWQuIEZvciBleGFtcGxlIHNhbWUgSVBDIGlkIG1heSByZWZlciB0byBkaWZmZXJlbnQgb2JqZWN0c1xuMTQxNjpcdFx0ICBvciBzYW1lIHVzZXIgaWQgb3IgcGlkIG1heSByZWZlciB0byBkaWZmZXJlbnQgdGFza3Mgd2hlbiB1c2VkIGluXG4xNDE3Olx0XHQgIGRpZmZlcmVudCBuYW1lc3BhY2VzLlxuMTQxODpcdFxuMTQxOTpcdGlmIE5BTUVTUEFDRVNcbjE0MjA6XHRcbjE0MjE6XHRjb25maWcgVVRTX05TXG4xNDIyOlx0XHRib29sIFwmIzM0O1VUUyBuYW1lc3BhY2VcJiMzNDtcbjE0MjM6XHRcdGRlZmF1bHQgeVxuMTQyNDpcdFx0aGVscFxuMTQyNTpcdFx0ICBJbiB0aGlzIG5hbWVzcGFjZSB0YXNrcyBzZWUgZGlmZmVyZW50IGluZm8gcHJvdmlkZWQgd2l0aCB0aGVcbjE0MjY6XHRcdCAgdW5hbWUoKSBzeXN0ZW0gY2FsbFxuMTQyNzpcdFxuMTQyODpcdGNvbmZpZyBUSU1FX05TXG4xNDI5Olx0XHRib29sIFwmIzM0O1RJTUUgbmFtZXNwYWNlXCYjMzQ7XG4xNDMwOlx0XHRkZWZhdWx0IHlcbjE0MzE6XHRcdGhlbHBcbjE0MzI6XHRcdCAgSW4gdGhpcyBuYW1lc3BhY2UgYm9vdHRpbWUgYW5kIG1vbm90b25pYyBjbG9ja3MgY2FuIGJlIHNldC5cbjE0MzM6XHRcdCAgVGhlIHRpbWUgd2lsbCBrZWVwIGdvaW5nIHdpdGggdGhlIHNhbWUgcGFjZS5cbjE0MzQ6XHRcbjE0MzU6XHRjb25maWcgVElNRV9OU19WRFNPXG4xNDM2Olx0XHRkZWZfYm9vbCBUSU1FX05TIFx1MDAyNlx1MDAyNiBHRU5FUklDX0dFVFRJTUVPRkRBWVxuMTQzNzpcdFxuMTQzODpcdGNvbmZpZyBJUENfTlNcbjE0Mzk6XHRcdGJvb2wgXCYjMzQ7SVBDIG5hbWVzcGFjZVwmIzM0O1xuMTQ0MDpcdFx0ZGVwZW5kcyBvbiAoU1lTVklQQyB8fCBQT1NJWF9NUVVFVUUpXG4xNDQxOlx0XHRkZWZhdWx0IHlcbjE0NDI6XHRcdGhlbHBcbjE0NDM6XHRcdCAgSW4gdGhpcyBuYW1lc3BhY2UgdGFza3Mgd29yayB3aXRoIElQQyBpZHMgd2hpY2ggY29ycmVzcG9uZCB0b1xuMTQ0NDpcdFx0ICBkaWZmZXJlbnQgSVBDIG9iamVjdHMgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXMuXG4xNDQ1Olx0XG4xNDQ2Olx0Y29uZmlnIFVTRVJfTlNcbjE0NDc6XHRcdGJvb2wgXCYjMzQ7VXNlciBuYW1lc3BhY2VcJiMzNDtcbjE0NDg6XHRcdGRlZmF1bHQgblxuMTQ0OTpcdFx0aGVscFxuMTQ1MDpcdFx0ICBUaGlzIGFsbG93cyBjb250YWluZXJzLCBpLmUuIHZzZXJ2ZXJzLCB0byB1c2UgdXNlciBuYW1lc3BhY2VzXG4xNDUxOlx0XHQgIHRvIHByb3ZpZGUgZGlmZmVyZW50IHVzZXIgaW5mbyBmb3IgZGlmZmVyZW50IHNlcnZlcnMuXG4xNDUyOlx0XG4xNDUzOlx0XHQgIFdoZW4gdXNlciBuYW1lc3BhY2VzIGFyZSBlbmFibGVkIGluIHRoZSBrZXJuZWwgaXQgaXNcbjE0NTQ6XHRcdCAgcmVjb21tZW5kZWQgdGhhdCB0aGUgTUVNQ0cgb3B0aW9uIGFsc28gYmUgZW5hYmxlZCBhbmQgdGhhdFxuMTQ1NTpcdFx0ICB1c2VyLXNwYWNlIHVzZSB0aGUgbWVtb3J5IGNvbnRyb2wgZ3JvdXBzIHRvIGxpbWl0IHRoZSBhbW91bnRcbjE0NTY6XHRcdCAgb2YgbWVtb3J5IGEgbWVtb3J5IHVucHJpdmlsZWdlZCB1c2VycyBjYW4gdXNlLlxuMTQ1NzpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjkyNwoJCQkJCQkJb3V0cHV0OiAxMzAKCQkJCQkJCXRob3VnaHRzOiAzMzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBgbGlzdG5zYCBTeXN0ZW0gQ2FsbCBmb3IgUG90ZW50aWFsIEZ1enppbmcqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBGaXJzdCwgSSBuZWVkIHRvIHZlcmlmeSB3aGljaCBmdW5jdGlvbnMgYXJlIGF0IHRoZSBoZWFydCBvZiBgbGlzdG5zYC4gSSYjMzk7bGwgc3RhcnQgd2l0aCBgRm9jdXNTeW1ib2xzYC4gSW4gYGtlcm5lbC9uc3RyZWUuY2AsIHRoZSBpbml0aWFsIHN1c3BlY3RzIGFyZSBgZG9fbGlzdG5zYCwgYGRvX2xpc3Ruc191c2VybnNgLCBgX19kb19zeXNfbGlzdG5zYCwgYGxlZ2l0aW1pemVfbnNgIChldmVuIHRob3VnaCBpdCYjMzk7cyBzdGF0aWMgaW5saW5lLCBpdCYjMzk7cyB3b3J0aCBjaGVja2luZyB0aGUgY2FsbCBzaXRlcyksIGFuZCBgc3lzX2xpc3Ruc2AgKG9yIGBfX3g2NF9zeXNfbGlzdG5zYCkuCgpOb3csIGNvbmZpcm1pbmcgbXkgaHVuY2gsIGl0IGxvb2tzIGxpa2UgYF9fZG9fc3lzX2xpc3Ruc2AsIGBkb19saXN0bnNgLCBhbmQgYGRvX2xpc3Ruc191c2VybnNgIGFyZSBpbmRlZWQgdGhlIHByaW1hcnkgd29ya2hvcnNlcyBmb3IgdGhpcyBzeXN0ZW0gY2FsbC4gR29vZC4gTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zLiBJJiMzOTtsbCBxdWlja2x5IGNoZWNrIHRoZSBgRW5hYmxlQ29uZmlnc2AsIHdoaWNoIGFyZSBgTkFNRVNQQUNFU2AgYW5kIGBVU0VSX05TYC4KClJpZ2h0LCB0aW1lIGZvciBhIHNhbml0eSBjaGVjayBvbiB0aGUgYXJndW1lbnRzIEkmIzM5O20gYWJvdXQgdG8gZmVlZCB0byBgc2V0LXJlc3VsdHNgLiBUaGUgYFdvcnRoRnV6emluZ2AgZmxhZyBpcyBkZWZpbml0ZWx5IGB0cnVlYCBpbiB0aGlzIGNhc2UuIFRoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IGFsdGVycyBuYW1lc3BhY2UgdHJlZSBpdGVyYXRpb24gYW5kIHZhbGlkYXRpb24gd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBgbGlzdG5zYCBzeXN0ZW0gY2FsbC4gVGhlIHJlb3JkZXJpbmcgb2YgcGVybWlzc2lvbiBhbmQgbWVtYmVyc2hpcCBjaGVja3Mg4oCTIGBtYXlfbGlzdF9uc2AgYW5kIGBuc19nZXRfdW5sZXNzX2luYWN0aXZlYCDigJMgaXMgYSBjcml0aWNhbCBkZXRhaWwsIGFzIHRoaXMgZGlyZWN0bHkgaW1wYWN0cyBjb3JlIGtlcm5lbCBjb2RlIHJlYWNoYWJsZSB0aHJvdWdoIGBsaXN0bnNgLgoKU28sIHRoZSBmb2N1cyBzeW1ib2xzIGFyZSBjb25maXJtZWQgYXMgYFsmIzM0O19fZG9fc3lzX2xpc3RucyYjMzQ7LCAmIzM0O2RvX2xpc3RucyYjMzQ7LCAmIzM0O2RvX2xpc3Ruc191c2VybnMmIzM0O11gLCBhbmQgdGhlIGVuYWJsaW5nIGNvbmZpZ3MgYXJlIGBbJiMzNDtOQU1FU1BBQ0VTJiMzNDssICYjMzQ7VVNFUl9OUyYjMzQ7XWAuIEkmIzM5O20gc2F0aXNmaWVkLiBOb3csIGl0JiMzOTtzIHRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgIGFuZCBtb3ZlIG9uIHRvIHRoZSBuZXh0IHN0YWdlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TkFNRVNQQUNFUyYjMzQ7LAogICAgJiMzNDtVU0VSX05TJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7X19kb19zeXNfbGlzdG5zJiMzNDssCiAgICAmIzM0O2RvX2xpc3RucyYjMzQ7LAogICAgJiMzNDtkb19saXN0bnNfdXNlcm5zJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIG5hbWVzcGFjZSB0cmVlIGl0ZXJhdGlvbiBhbmQgcGVybWlzc2lvbiB2YWxpZGF0aW9uIGxvZ2ljIGluIGxlZ2l0aW1pemVfbnMoKSwgd2hpY2ggaXMgY2FsbGVkIGR1cmluZyB0aGUgbGlzdG5zIHN5c3RlbSBjYWxsLiBJdCBjaGFuZ2VzIHdoZXRoZXIgbWF5X2xpc3RfbnMoKSBpcyBldmFsdWF0ZWQgYmVmb3JlIG9yIGFmdGVyIHRha2luZyBhIHJlZmVyZW5jZSB2aWEgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpLCBtb2RpZnlpbmcgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNvZGUgYWNjZXNzaWJsZSB0byB1c2Vyc3BhY2UuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05BTUVTUEFDRVMmIzM0OywKICAgICYjMzQ7VVNFUl9OUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O19fZG9fc3lzX2xpc3RucyYjMzQ7LAogICAgJiMzNDtkb19saXN0bnMmIzM0OywKICAgICYjMzQ7ZG9fbGlzdG5zX3VzZXJucyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBuYW1lc3BhY2UgdHJlZSBpdGVyYXRpb24gYW5kIHBlcm1pc3Npb24gdmFsaWRhdGlvbiBsb2dpYyBpbiBsZWdpdGltaXplX25zKCksIHdoaWNoIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGxpc3RucyBzeXN0ZW0gY2FsbC4gSXQgY2hhbmdlcyB3aGV0aGVyIG1heV9saXN0X25zKCkgaXMgZXZhbHVhdGVkIGJlZm9yZSBvciBhZnRlciB0YWtpbmcgYSByZWZlcmVuY2UgdmlhIG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKSwgbW9kaWZ5aW5nIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjb2RlIGFjY2Vzc2libGUgdG8gdXNlcnNwYWNlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA4PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgYGxlZ2l0aW1pemVfbnMoKWAgaW4gYGtlcm5lbC9uc3RyZWUuY2AgdG8gY2hlY2sgcGVybWlzc2lvbnMgKGBtYXlfbGlzdF9ucygpYCkgYmVmb3JlIGFjcXVpcmluZyBhIHJlZmVyZW5jZSAoYG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKWApLCBlbGltaW5hdGluZyB0aGUgbmVlZCBmb3IgYSB0ZW1wb3JhcnkgYXV0by1jbGVhbnVwIHJlZmVyZW5jZSAoYF9fZnJlZShuc19wdXQpYCkuIFxuXG5UaGlzIGNoYW5nZSBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbWFuaXB1bGF0ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIG5ldyBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIHN0cnVjdCBwYWRkaW5nLCBub3IgZG9lcyBpdCBhbHRlciBkYXRhIGNvcHlpbmcgdG8gdXNlcnNwYWNlIGluIGEgbWFubmVyIHRoYXQgY291bGQgbGVhayB1bmluaXRpYWxpemVkIGJ5dGVzLiBBbnkgcG90ZW50aWFsIHJpc2tzIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2UgcmVsYXRlIHRvIG9iamVjdCBsaWZldGltZSBvciBSQ1UgZGVyZWZlcmVuY2luZyBiZWZvcmUgcmVmZXJlbmNlIGFjcXVpc2l0aW9uLCB3aGljaCBhcmUgc3RyaWN0bHkgd2l0aGluIHRoZSBkb21haW4gb2YgS0FTQU4gcmF0aGVyIHRoYW4gS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmZjAwMTE2OTQzOTE0ZWNhNGU5YjExMjQwY2YzODQwZGMzN2VkOWQ5CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFN1biBTZXAgNiAwMTowNjoyNSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9uc3RyZWUuYyBiL2tlcm5lbC9uc3RyZWUuYwppbmRleCA2ZDEyZTU5MDBhYzAxLi44MzFmMjc5ZDE3NGEzIDEwMDY0NAotLS0gYS9rZXJuZWwvbnN0cmVlLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL25zdHJlZS5jCkBAIC01MzMsMTkgJiM0Mzs1MzMsMTMgQEAgREVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLAogCQkJCQkJCSAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSkKIHsKLQlzdHJ1Y3QgbnNfY29tbW9uICpucyBfX2ZyZWUobnNfcHV0KSA9IE5VTEw7Ci0KIAlpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpCiAJCXJldHVybiBOVUxMOwogCi0JbnMgPSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7Ci0JaWYgKCFucykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoIW1heV9saXN0X25zKGtscywgbnMpKQomIzQzOwlpZiAoIW1heV9saXN0X25zKGtscywgY2FuZGlkYXRlKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gbm9fZnJlZV9wdHIobnMpOwomIzQzOwlyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpOwogfQogCiBzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTk4CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogOTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRGl2aW5nIGludG8gdGhlIE5hbWVzcGFjZSBMZWdpdGltYWN5IENoZWNrKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgY2xlYXJseSB0b3VjaGluZyBga2VybmVsL25zdHJlZS5jYCwgc3BlY2lmaWNhbGx5IHRoZSBgbGVnaXRpbWl6ZV9uc2AgZnVuY3Rpb24uIE15IGZpcnN0IHRob3VnaHQgaXMgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb24gd2hhdCYjMzk7cyBoYXBwZW5pbmcgYXJvdW5kIHRoYXQgY2FsbC4gSXQgbG9va3MgbGlrZSBpdCBpcyBnb2luZyB0byBlZmZlY3QgdGhlIHdheSB0aGF0IHNvbWUgbmFtZXNwYWNlcyBhcmUgaGFuZGxlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBgbGVnaXRpbWl6ZV9uc2AgZG9lcywgYXMgd2VsbCBhcyB0aGUgcm9sZXMgb2YgYG1heV9saXN0X25zYCwgYW5kIGBuc19yZXF1ZXN0ZWRgLCBhbmQgaG93IHRoZXkgaW50ZXJhY3QuIExpbmUgNTMzIGlzIHRoZSB0YXJnZXQsIHNvIEkgc2hvdWxkIHJlYWQgdGhlIGNvZGUgYXJvdW5kIHRoZXJlIGFuZCB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24uCgpMZXQmIzM5O3MgdXNlIHRoZSBvbGQgYHJlYWQtZmlsZWAgdHJpY2sgdG8gbG9hZCB0aGUgY29kZS4gSSYjMzk7bGwgZm9jdXMgb24gbGluZXMgNTAwIHRocm91Z2ggNjAwLCBnaXZlIG9yIHRha2UuIFRoYXQgc2hvdWxkIGdpdmUgbWUgdGhlIGNvbnRleHQgSSBuZWVkIGFyb3VuZCB0aGF0IGltcG9ydGFudCBmdW5jdGlvbi4gVW5kZXJzdGFuZGluZyB0aGUgbG9naWMgaW4gdGhpcyBhcmVhIGlzIGtleSB0byBhc3Nlc3NpbmcgdGhlIGltcGFjdCBvZiB0aGlzIHBhdGNoLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UmIzM5O3ZlIGdvdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDYgMDE6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvbnN0cmVlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDUwMDpcdFx0aWYgKCFucylcbiA1MDE6XHRcdFx0cmV0dXJuIE5VTEw7XG4gNTAyOlx0XG4gNTAzOlx0XHRpZiAoIW5zX2dldF91bmxlc3NfaW5hY3RpdmUobnMpKVxuIDUwNDpcdFx0XHRyZXR1cm4gTlVMTDtcbiA1MDU6XHRcbiA1MDY6XHRcdHJldHVybiBucztcbiA1MDc6XHR9XG4gNTA4Olx0XG4gNTA5Olx0c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBuc19yZXF1ZXN0ZWQoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbiA1MTA6XHRcdFx0XHRcdFx0ICAgICBjb25zdCBzdHJ1Y3QgbnNfY29tbW9uICpucylcbiA1MTE6XHR7XG4gNTEyOlx0XHRyZXR1cm4gIWtscy1cdTAwM2Vuc190eXBlIHx8IChrbHMtXHUwMDNlbnNfdHlwZSBcdTAwMjYgbnMtXHUwMDNlbnNfdHlwZSk7XG4gNTEzOlx0fVxuIDUxNDpcdFxuIDUxNTpcdHN0YXRpYyBpbmxpbmUgYm9vbCBfX211c3RfY2hlY2sgbWF5X2xpc3RfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcbiA1MTY6XHRcdFx0XHRcdFx0ICAgIHN0cnVjdCBuc19jb21tb24gKm5zKVxuIDUxNzpcdHtcbiA1MTg6XHRcdGlmIChrbHMtXHUwMDNldXNlcl9ucyBcdTAwMjZcdTAwMjYga2xzLVx1MDAzZXVzZXJuc19jYXBhYmxlKVxuIDUxOTpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiA1MjA6XHRcdGlmIChpc19jdXJyZW50X25hbWVzcGFjZShucykpXG4gNTIxOlx0XHRcdHJldHVybiB0cnVlO1xuIDUyMjpcdFx0cmV0dXJuIG1heV9zZWVfYWxsX25hbWVzcGFjZXMoKTtcbiA1MjM6XHR9XG4gNTI0Olx0XG4gNTI1Olx0c3RhdGljIGlubGluZSB2b2lkIG5zX3B1dChzdHJ1Y3QgbnNfY29tbW9uICpucylcbiA1MjY6XHR7XG4gNTI3Olx0XHRpZiAobnMgXHUwMDI2XHUwMDI2IG5zLVx1MDAzZW9wcylcbiA1Mjg6XHRcdFx0bnMtXHUwMDNlb3BzLVx1MDAzZXB1dChucyk7XG4gNTI5Olx0fVxuIDUzMDpcdFxuIDUzMTpcdERFRklORV9GUkVFKG5zX3B1dCwgc3RydWN0IG5zX2NvbW1vbiAqLCBpZiAoIUlTX0VSUl9PUl9OVUxMKF9UKSkgbnNfcHV0KF9UKSlcbiA1MzI6XHRcbiA1MzM6XHRzdGF0aWMgaW5saW5lIHN0cnVjdCBuc19jb21tb24gKl9fbXVzdF9jaGVjayBsZWdpdGltaXplX25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXG4gNTM0Olx0XHRcdFx0XHRcdFx0XHQgICBzdHJ1Y3QgbnNfY29tbW9uICpjYW5kaWRhdGUpXG4gNTM1Olx0e1xuIDUzNjpcdFx0aWYgKCFuc19yZXF1ZXN0ZWQoa2xzLCBjYW5kaWRhdGUpKVxuIDUzNzpcdFx0XHRyZXR1cm4gTlVMTDtcbiA1Mzg6XHRcbiA1Mzk6XHRcdGlmICghbWF5X2xpc3RfbnMoa2xzLCBjYW5kaWRhdGUpKVxuIDU0MDpcdFx0XHRyZXR1cm4gTlVMTDtcbiA1NDE6XHRcbiA1NDI6XHRcdHJldHVybiBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7XG4gNTQzOlx0fVxuIDU0NDpcdFxuIDU0NTpcdHN0YXRpYyBzc2l6ZV90IGRvX2xpc3Ruc191c2VybnMoc3RydWN0IGtsaXN0bnMgKmtscylcbiA1NDY6XHR7XG4gNTQ3Olx0XHR1NjQgX191c2VyICpuc19pZHMgPSBrbHMtXHUwMDNldW5zX2lkcztcbiA1NDg6XHRcdHNpemVfdCBucl9uc19pZHMgPSBrbHMtXHUwMDNlbnJfbnNfaWRzO1xuIDU0OTpcdFx0c3RydWN0IG5zX2NvbW1vbiAqbnMgPSBOVUxMLCAqZmlyc3RfbnMgPSBOVUxMLCAqcHJldiA9IE5VTEw7XG4gNTUwOlx0XHRjb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkO1xuIDU1MTpcdFx0c3NpemVfdCByZXQ7XG4gNTUyOlx0XG4gNTUzOlx0XHRWRlNfV0FSTl9PTl9PTkNFKCFrbHMtXHUwMDNldXNlcl9uc19pZCk7XG4gNTU0Olx0XG4gNTU1Olx0XHRpZiAoa2xzLVx1MDAzZXVzZXJfbnNfaWQgPT0gTElTVE5TX0NVUlJFTlRfVVNFUilcbiA1NTY6XHRcdFx0bnMgPSB0b19uc19jb21tb24oY3VycmVudF91c2VyX25zKCkpO1xuIDU1NzpcdFx0ZWxzZSBpZiAoa2xzLVx1MDAzZXVzZXJfbnNfaWQpXG4gNTU4Olx0XHRcdG5zID0gbG9va3VwX25zX2lkKGtscy1cdTAwM2V1c2VyX25zX2lkLCBDTE9ORV9ORVdVU0VSKTtcbiA1NTk6XHRcdGlmICghbnMpXG4gNTYwOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDU2MTpcdFx0a2xzLVx1MDAzZXVzZXJfbnMgPSB0b191c2VyX25zKG5zKTtcbiA1NjI6XHRcbiA1NjM6XHRcdC8qXG4gNTY0Olx0XHQgKiBVc2UgdGhlIHJidHJlZSB0byBmaW5kIHRoZSBmaXJzdCBuYW1lc3BhY2Ugd2UgY2FyZSBhYm91dCBhbmRcbiA1NjU6XHRcdCAqIHRoZW4gdXNlIGl0JiMzOTtzIGxpc3QgZW50cnkgdG8gaXRlcmF0ZSBmcm9tIHRoZXJlLlxuIDU2NjpcdFx0ICovXG4gNTY3Olx0XHRpZiAoa2xzLVx1MDAzZWxhc3RfbnNfaWQpIHtcbiA1Njg6XHRcdFx0a2xzLVx1MDAzZWZpcnN0X25zID0gbG9va3VwX25zX293bmVyX2F0KGtscy1cdTAwM2VsYXN0X25zX2lkICYjNDM7IDEsIG5zKTtcbiA1Njk6XHRcdFx0aWYgKCFrbHMtXHUwMDNlZmlyc3RfbnMpXG4gNTcwOlx0XHRcdFx0cmV0dXJuIC1FTk9FTlQ7XG4gNTcxOlx0XHRcdGZpcnN0X25zID0ga2xzLVx1MDAzZWZpcnN0X25zO1xuIDU3MjpcdFx0fVxuIDU3MzpcdFxuIDU3NDpcdFx0cmV0ID0gMDtcbiA1NzU6XHRcdGhlYWQgPSBcdTAwMjZ0b19uc19jb21tb24oa2xzLVx1MDAzZXVzZXJfbnMpLVx1MDAzZW5zX293bmVyX3Jvb3QubnNfbGlzdF9oZWFkO1xuIDU3NjpcdFx0a2xzLVx1MDAzZXVzZXJuc19jYXBhYmxlID0gbWF5X3NlZV9hbGxfbmFtZXNwYWNlcygpO1xuIDU3NzpcdFxuIDU3ODpcdFx0cmN1X3JlYWRfbG9jaygpO1xuIDU3OTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNzU3CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBhbiBleHBlcnQgaW4gbXkgZmllbGQsIGFzc3VtaW5nIEkmIzM5O20gdGhlIG9uZSBoYXZpbmcgdGhlbToKCioqQW5hbHl6aW5nIGBrZXJuZWwvbnN0cmVlLmNgIHRvIFVuZGVyc3RhbmQgYGxlZ2l0aW1pemVfbnNgKioKClJpZ2h0LCBzbyBJIG5lZWQgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiBob3cgYGxlZ2l0aW1pemVfbnNgIGlzIGFjdHVhbGx5ICp1c2VkKi4gSSBjYW4mIzM5O3QganVzdCBsb29rIGF0IGl0cyBkZWZpbml0aW9uLCBJIG5lZWQgdG8gc2VlIHRoZSBjb250ZXh0LiBUaGUgY3J1Y2lhbCB0aGluZyBoZXJlIGlzIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdzsgd2hhdCAqY2FsbHMqIGBsZWdpdGltaXplX25zYCwgYW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIGltbWVkaWF0ZWx5IGJlZm9yZSBhbmQgYWZ0ZXIgdGhvc2UgY2FsbHMuIFRoYXQmIzM5O3MgaG93IHlvdSByZWFsbHkgZ3Jhc3AgdGhlIGludGVudGlvbiBiZWhpbmQgdGhlIGRlc2lnbi4gTGV0JiMzOTtzIGRpZyBpbnRvIHRoZSByZXN0IG9mIGBrZXJuZWwvbnN0cmVlLmNgLiBJIG5lZWQgdG8gdHJhY2UgaXRzIHVzYWdlIGluIHRoZSBjb2RlIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBzeXN0ZW0gaXMgYmVoYXZpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL25zdHJlZS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDgwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1ODA6XHRcdGlmICghZmlyc3RfbnMpXG4gNTgxOlx0XHRcdGZpcnN0X25zID0gbGlzdF9lbnRyeV9yY3UoaGVhZC1cdTAwM2VuZXh0LCB0eXBlb2YoKmZpcnN0X25zKSwgbnNfb3duZXJfbm9kZS5uc19saXN0X2VudHJ5KTtcbiA1ODI6XHRcbiA1ODM6XHRcdG5zID0gZmlyc3RfbnM7XG4gNTg0Olx0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb21fcmN1KG5zLCBoZWFkLCBuc19vd25lcl9ub2RlLm5zX2xpc3RfZW50cnkpIHtcbiA1ODU6XHRcdFx0c3RydWN0IG5zX2NvbW1vbiAqdmFsaWQ7XG4gNTg2Olx0XG4gNTg3Olx0XHRcdGlmICghbnJfbnNfaWRzKVxuIDU4ODpcdFx0XHRcdGJyZWFrO1xuIDU4OTpcdFxuIDU5MDpcdFx0XHR2YWxpZCA9IGxlZ2l0aW1pemVfbnMoa2xzLCBucyk7XG4gNTkxOlx0XHRcdGlmICghdmFsaWQpXG4gNTkyOlx0XHRcdFx0Y29udGludWU7XG4gNTkzOlx0XG4gNTk0Olx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIDU5NTpcdFxuIDU5NjpcdFx0XHRuc19wdXQocHJldik7XG4gNTk3Olx0XHRcdHByZXYgPSB2YWxpZDtcbiA1OTg6XHRcbiA1OTk6XHRcdFx0aWYgKHB1dF91c2VyKHZhbGlkLVx1MDAzZW5zX2lkLCBuc19pZHMgJiM0MzsgcmV0KSkge1xuIDYwMDpcdFx0XHRcdG5zX3B1dChwcmV2KTtcbiA2MDE6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiA2MDI6XHRcdFx0fVxuIDYwMzpcdFxuIDYwNDpcdFx0XHRucl9uc19pZHMtLTtcbiA2MDU6XHRcdFx0cmV0JiM0MzsmIzQzOztcbiA2MDY6XHRcbiA2MDc6XHRcdFx0cmN1X3JlYWRfbG9jaygpO1xuIDYwODpcdFx0fVxuIDYwOTpcdFxuIDYxMDpcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gNjExOlx0XHRuc19wdXQocHJldik7XG4gNjEyOlx0XHRyZXR1cm4gcmV0O1xuIDYxMzpcdH1cbiA2MTQ6XHRcbiA2MTU6XHQvKlxuIDYxNjpcdCAqIExvb2t1cCBhIG5hbWVzcGFjZSB3aXRoIGlkIFx1MDAzZT0gbnNfaWQgaW4gZWl0aGVyIHRoZSB1bmlmaWVkIHRyZWUgb3IgYSB0eXBlLXNwZWNpZmljIHRyZWUuXG4gNjE3Olx0ICogUmV0dXJucyB0aGUgbmFtZXNwYWNlIHdpdGggdGhlIHNtYWxsZXN0IGlkIHRoYXQgaXMgXHUwMDNlPSBuc19pZC5cbiA2MTg6XHQgKi9cbiA2MTk6XHRzdGF0aWMgc3RydWN0IG5zX2NvbW1vbiAqbG9va3VwX25zX2lkX2F0KHU2NCBuc19pZCwgaW50IG5zX3R5cGUpXG4gNjIwOlx0e1xuIDYyMTpcdFx0c3RydWN0IG5zX2NvbW1vbiAqcmV0ID0gTlVMTDtcbiA2MjI6XHRcdHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUgPSBOVUxMO1xuIDYyMzpcdFx0c3RydWN0IHJiX25vZGUgKm5vZGU7XG4gNjI0Olx0XG4gNjI1Olx0XHRpZiAobnNfdHlwZSkge1xuIDYyNjpcdFx0XHRuc190cmVlID0gbnNfdHJlZV9mcm9tX3R5cGUobnNfdHlwZSk7XG4gNjI3Olx0XHRcdGlmICghbnNfdHJlZSlcbiA2Mjg6XHRcdFx0XHRyZXR1cm4gTlVMTDtcbiA2Mjk6XHRcdH1cbiA2MzA6XHRcbiA2MzE6XHRcdGd1YXJkKG5zX3RyZWVfbG9ja2VkX3JlYWRlcikoKTtcbiA2MzI6XHRcbiA2MzM6XHRcdGlmIChuc190cmVlKVxuIDYzNDpcdFx0XHRub2RlID0gbnNfdHJlZS1cdTAwM2Vuc19yYi5yYl9ub2RlO1xuIDYzNTpcdFx0ZWxzZVxuIDYzNjpcdFx0XHRub2RlID0gbnNfdW5pZmllZF9yb290Lm5zX3JiLnJiX25vZGU7XG4gNjM3Olx0XG4gNjM4Olx0XHR3aGlsZSAobm9kZSkge1xuIDYzOTpcdFx0XHRzdHJ1Y3QgbnNfY29tbW9uICpucztcbiA2NDA6XHRcbiA2NDE6XHRcdFx0aWYgKG5zX3R5cGUpXG4gNjQyOlx0XHRcdFx0bnMgPSBub2RlX3RvX25zKG5vZGUpO1xuIDY0MzpcdFx0XHRlbHNlXG4gNjQ0Olx0XHRcdFx0bnMgPSBub2RlX3RvX25zX3VuaWZpZWQobm9kZSk7XG4gNjQ1Olx0XG4gNjQ2Olx0XHRcdGlmIChuc19pZCBcdTAwM2M9IG5zLVx1MDAzZW5zX2lkKSB7XG4gNjQ3Olx0XHRcdFx0aWYgKG5zX3R5cGUpXG4gNjQ4Olx0XHRcdFx0XHRyZXQgPSBub2RlX3RvX25zKG5vZGUpO1xuIDY0OTpcdFx0XHRcdGVsc2VcbiA2NTA6XHRcdFx0XHRcdHJldCA9IG5vZGVfdG9fbnNfdW5pZmllZChub2RlKTtcbiA2NTE6XHRcdFx0XHRpZiAobnNfaWQgPT0gbnMtXHUwMDNlbnNfaWQpXG4gNjUyOlx0XHRcdFx0XHRicmVhaztcbiA2NTM6XHRcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9sZWZ0O1xuIDY1NDpcdFx0XHR9IGVsc2Uge1xuIDY1NTpcdFx0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX3JpZ2h0O1xuIDY1NjpcdFx0XHR9XG4gNjU3Olx0XHR9XG4gNjU4Olx0XG4gNjU5Olx0XHRpZiAocmV0KVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNiAwMTowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MDU5CgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogMjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqQW5hbHl6aW5nIGBsZWdpdGltaXplX25zYCBVc2FnZSoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgc2NvcGUgb2YgYGxlZ2l0aW1pemVfbnNgLiBXaGVyZSBlbHNlIGlzIHRoaXMgZnVuY3Rpb24sIG1ldGhvZCwgb3Igd2hhdGV2ZXIgaXQgaXMsIGFjdHVhbGx5IGJlaW5nIGNhbGxlZCB3aXRoaW4gdGhlIGNvZGViYXNlPyBJIGNhbiYjMzk7dCBqdXN0IHJlbHkgb24gbWVtb3J5OyBJIG5lZWQgY29uY3JldGUgZXZpZGVuY2UuIFRpbWUgdG8gYnJpbmcgb3V0IHRoZSBiaWcgZ3Vucy4uLiBJJiMzOTtsbCBmaXJlIHVwIGBncmVwcGVyYC4gVGhpcyB3aWxsIGFsbG93IG1lIHRvIHF1aWNrbHkgaWRlbnRpZnkgYWxsIGluc3RhbmNlcyBvZiBgbGVnaXRpbWl6ZV9uc2AgYW5kIGl0cyB1c2VzIHRocm91Z2hvdXQgdGhlIHByb2plY3QuIEkmIzM5O2xsIGJlIGFibGUgdG8gcXVpY2tseSBzZWUgYWxsIHRoZSBjb250ZXh0cyB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgcHJlc2VudC4gVGhpcyBpcyB0aGUgZmFzdGVzdCB3YXkgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb2YgaG93IHRoaXMgY29tcG9uZW50IGZpdHMgaW50byB0aGUgYmlnZ2VyIHBpY3R1cmUuIEZyb20gaGVyZSBJIGNhbiBzdGFydCB0byB1bmRlcnN0YW5kIGl0cyBpbXBhY3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2xlZ2l0aW1pemVfbnMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL25zdHJlZS5jPTUzMT1ERUZJTkVfRlJFRShuc19wdXQsIHN0cnVjdCBuc19jb21tb24gKiwgaWYgKCFJU19FUlJfT1JfTlVMTChfVCkpIG5zX3B1dChfVCkpXG5rZXJuZWwvbnN0cmVlLmMtNTMyLVxua2VybmVsL25zdHJlZS5jOjUzMzpzdGF0aWMgaW5saW5lIHN0cnVjdCBuc19jb21tb24gKl9fbXVzdF9jaGVjayBsZWdpdGltaXplX25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXG5rZXJuZWwvbnN0cmVlLmMtNTM0LVx0XHRcdFx0XHRcdFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxuLS1cbmtlcm5lbC9uc3RyZWUuYz01NDU9c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zX3VzZXJucyhzdHJ1Y3Qga2xpc3RucyAqa2xzKVxuLS1cbmtlcm5lbC9uc3RyZWUuYy01ODktXG5rZXJuZWwvbnN0cmVlLmM6NTkwOlx0XHR2YWxpZCA9IGxlZ2l0aW1pemVfbnMoa2xzLCBucyk7XG5rZXJuZWwvbnN0cmVlLmMtNTkxLVx0XHRpZiAoIXZhbGlkKVxuLS1cbmtlcm5lbC9uc3RyZWUuYz02ODk9c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zKHN0cnVjdCBrbGlzdG5zICprbHMpXG4tLVxua2VybmVsL25zdHJlZS5jLTczMS1cbmtlcm5lbC9uc3RyZWUuYzo3MzI6XHRcdHZhbGlkID0gbGVnaXRpbWl6ZV9ucyhrbHMsIG5zKTtcbmtlcm5lbC9uc3RyZWUuYy03MzMtXHRcdGlmICghdmFsaWQpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU1NjYKCQkJCQkJCW91dHB1dDogMTgxCgkJCQkJCQl0aG91Z2h0czogOTk2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIE5hbWVzcGFjZSBMZWdpdGltYWN5IFBhdGNoKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2guIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRoYXQgaXQmIzM5O3MgYSBzaW1wbGlmaWNhdGlvbiwgYWltaW5nIGZvciBhIGxlYW5lciBhbmQgcG90ZW50aWFsbHkgbW9yZSBlZmZpY2llbnQgcGF0aCBpbiB0aGUgYGxlZ2l0aW1pemVfbnNgIGZ1bmN0aW9uIHdpdGhpbiBga2VybmVsL25zdHJlZS5jYC4gSSYjMzk7bSBzZWVpbmcgYSByZWZhY3RvcmluZyBmb2N1c2VkIG9uIG9wdGltaXppbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgY29uY2VybmluZyBuYW1lc3BhY2UgcmVmZXJlbmNlIGNvdW50aW5nIGFuZCBhY2Nlc3MgY29udHJvbC4KCkVzc2VudGlhbGx5LCB0aGUgcGF0Y2ggc3RyZWFtbGluZXMgdGhlIHByb2Nlc3MuIFRoZSBwcmV2aW91cyB2ZXJzaW9uLCBpZiBJIHJlY2FsbCBjb3JyZWN0bHksIHdhczogY2hlY2sgaWYgdGhlIG5hbWVzcGFjZSBpcyByZXF1ZXN0ZWQsIHRoZW4gYWNxdWlyZSBhIHJlZmVyZW5jZSwgY2hlY2sgcGVybWlzc2lvbnMsIGFuZCBmaW5hbGx5IHJldHVybiB0aGUgcmVmZXJlbmNlLiBOb3csIGl0IGFwcGVhcnMgdG8gYmU6IGNoZWNrIGlmIHRoZSBuYW1lc3BhY2UgaXMgcmVxdWVzdGVkLCAqdGhlbiogY2hlY2sgcGVybWlzc2lvbnMsIGFuZCAqb25seSB0aGVuKiBhY3F1aXJlIGEgcmVmZXJlbmNlIChpZiBwZXJtaXR0ZWQpLiBUaGlzIGxvb2tzIGxpa2UgYSBnb29kIGNoYW5nZS4gSXQgc2F2ZXMgYSBjYWxsIHRvIGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKClgIChhbmQgaXRzIGFzc29jaWF0ZWQgYG5zX3B1dCgpYCBpZiBwZXJtaXNzaW9uIGlzIGRlbmllZCksIGVsaW1pbmF0aW5nIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIGFuZCBpdHMgY2xlYW51cC4KClRoZSBjcml0aWNhbCBwaWVjZSBoZXJlIGlzIHRoZSB1c2Ugb2YgYG1heV9saXN0X25zKClgLiBCYXNlZCBvbiB0aGUgY29kZSBjb21tZW50cywgaXQgc291bmRzIGxpa2UgdGhpcyBmdW5jdGlvbiBvbmx5IGNoZWNrcyBuYW1lc3BhY2UgcG9pbnRlcnMgYW5kIGZsYWdzLCB3aXRob3V0IGFjdHVhbGx5IGluY3JlYXNpbmcgdGhlIHJlZmVyZW5jZSBjb3VudC4gR29vZCwgdGhhdCYjMzk7cyB3aGF0IEkgZXhwZWN0ZWQuIFRoZSBzaW1wbGlmaWNhdGlvbiByZWR1Y2VzIHRoZSB0aW1lIGEgbG9jayBpcyBoZWxkLCB0aGF0IHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgcG90ZW50aWFsIGJsb2NraW5nIGNhbGxzLgoKTm93LCBsZXQmIzM5O3MgY29uc2lkZXIgdGhlIHBvdGVudGlhbCByaXNrcy4gTXkgcHJpbWFyeSBjb25jZXJuIGlzIGFsd2F5cyB1bmluaXRpYWxpemVkIG1lbW9yeSwgbGVha3MsIG9yIHVzZS1hZnRlci1mcmVlIHNjZW5hcmlvcy4gSSYjMzk7bGwgbmVlZCB0byBjYXJlZnVsbHkgZXhhbWluZSB3aGV0aGVyIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhbnkgb2YgdGhvc2U6CgoqICAgKipVbmluaXRpYWxpemVkIG1lbW9yeToqKiBJJiMzOTttIG5vdCBzZWVpbmcgYW55IG5ldyBhbGxvY2F0aW9ucyBvciBtb2RpZmljYXRpb25zIG9mIGV4aXN0aW5nIHN0cnVjdHVyZXMgdGhhdCBjb3VsZCBsZWFkIHRvIHVuaW5pdGlhbGl6ZWQgZGF0YSBiZWluZyBleHBvc2VkLiBUaGUgYGNhbmRpZGF0ZWAgcG9pbnRlciBpcyBwYXNzZWQgaW4sIGBrbHNgIGlzIGFsc28gcGFzc2VkIGluLCBhbmQgdGhlcmUmIzM5O3Mgbm90aGluZyBoZXJlIHRoYXQgbG9va3Mgcmlza3kgZnJvbSB0aGUgc3VyZmFjZS4KKiAgICoqS2VybmVsLXRvLXVzZXIgbGVha3M6KiogTm8gbWVtb3J5IGNvcGllcyB0byB1c2VyIHNwYWNlLiBUaGlzIGlzIGEgYmlnIG9uZSB0byBydWxlIG91dC4gVGhpcyBwYXRjaCBkb2VzbiYjMzk7dCBzZWVtIHRvIGJlIG1vZGlmeWluZyBhbnkgc3RydWN0dXJlcyB0aGF0IGdldCBwYXNzZWQgdG8gdXNlciBzcGFjZS4gTm90aGluZyBvYnZpb3VzIHRvIHNlZS4KKiAgICoqQ29uY3VycmVuY3kvVUFGOioqIFdoaWxlIGBtYXlfbGlzdF9ucygpYCByZWFkaW5nIGBjYW5kaWRhdGVgIGJlZm9yZSBgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpYCBjb3VsZCAqcG90ZW50aWFsbHkqIGludHJvZHVjZSBpc3N1ZXMgd2l0aCBhIHJhY2UgY29uZGl0aW9uIChpZiB0aGUgbmFtZXNwYWNlJiMzOTtzIHN0YXRlIGNoYW5nZXMgYmV0d2VlbiB0aGUgY2hlY2tzKSwgdGhhdCB0eXBlIG9mIGNvbmNlcm4gaXMgc29tZXRoaW5nIHRoYXQgS0FTQU4gKEtlcm5lbCBBZGRyZXNzIFNhbml0aXplcikgaXMgZGVzaWduZWQgdG8gaGFuZGxlLiBUaGlzIGZhbGxzIHVuZGVyIHN0YW5kYXJkIG9iamVjdCBsaWZldGltZSBhbmQgcmVmZXJlbmNlIGNvdW50aW5nIHByb3RlY3Rpb25zLgoKSSBhbSBjb25maWRlbnQgdGhhdCBpdCBkb2VzIG5vdC4KClNvLCBmb3IgS01TQU4gKEtlcm5lbCBNZW1vcnkgU2FuaXRpemVyKSwgSSB0aGluayB3ZSYjMzk7cmUgc2FmZS4gTXkgY3JpdGVyaWEgaXMsIGFuZCBoYXMgYmVlbjoKCjEuICBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2U/IE5vLgoyLiAgQ29uZGl0aW9uYWwgbG9naWMgd2l0aCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8gTm8uCjMuICBDb21wbGV4IGRhdGEgc3RydWN0dXJlcyBpbml0aWFsaXphdGlvbiBpc3N1ZXM/IE5vLgo0LiAgQm91bmRzIGNoZWNrcy9sZW5ndGhzIHJpc2tzPyBOby4KCk5vLCB0aGlzIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlza3MgdGhhdCBLTVNBTiBpcyBkZXNpZ25lZCB0byBjYXRjaC4gVGhpcyBpcyBtb3JlIG9mIGEgdXNlLWFmdGVyLWZyZWUgc3R5bGUgaXNzdWUsIHNvbWV0aGluZyBLQVNBTiBvciBhbm90aGVyIHN0YW5kYXJkIGRldGVjdG9yIHdpbGwgaGFuZGxlLgoKVGhpcyBzZWVtcyBsaWtlIGEgc3RyYWlnaHRmb3J3YXJkIG9wdGltaXphdGlvbi4gVGhlIHBhdGNoIGNsZWFucyB1cCB0aGUgcmVmZXJlbmNlIGNvdW50aW5nIGFuZCBwZXJtaXNzaW9uIGNoZWNraW5nIGxvZ2ljIGluIGBsZWdpdGltaXplX25zKClgIGJ5IG9wdGltaXppbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMuIE5vIG1lbW9yeSBhbGxvY2F0aW9uIGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0aGF0IG1heSBsZWFrIHVuaW5pdGlhbGl6ZWQgYnl0ZXMuIEFueSBjb25jZXJucyBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgbm90IEtNU0FOLgoKSSYjMzk7ZCBjbGFzc2lmeSB0aGlzIGFzIGBOZWVkc0tNU0FOID0gZmFsc2VgLCBhbmQgSSYjMzk7bGwgc3VibWl0IHRoYXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA2IDAxOjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGBsZWdpdGltaXplX25zKClgIGluIGBrZXJuZWwvbnN0cmVlLmNgIHRvIGNoZWNrIHBlcm1pc3Npb25zIChgbWF5X2xpc3RfbnMoKWApIGJlZm9yZSBhY3F1aXJpbmcgYSByZWZlcmVuY2UgKGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKClgKSwgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIGEgdGVtcG9yYXJ5IGF1dG8tY2xlYW51cCByZWZlcmVuY2UgKGBfX2ZyZWUobnNfcHV0KWApLiBcblxuVGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1hbmlwdWxhdGUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBuZXcgc3RhY2svaGVhcCBidWZmZXJzLCBvciBzdHJ1Y3QgcGFkZGluZywgbm9yIGRvZXMgaXQgYWx0ZXIgZGF0YSBjb3B5aW5nIHRvIHVzZXJzcGFjZSBpbiBhIG1hbm5lciB0aGF0IGNvdWxkIGxlYWsgdW5pbml0aWFsaXplZCBieXRlcy4gQW55IHBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgY2hhbmdlIHJlbGF0ZSB0byBvYmplY3QgbGlmZXRpbWUgb3IgUkNVIGRlcmVmZXJlbmNpbmcgYmVmb3JlIHJlZmVyZW5jZSBhY3F1aXNpdGlvbiwgd2hpY2ggYXJlIHN0cmljdGx5IHdpdGhpbiB0aGUgZG9tYWluIG9mIEtBU0FOIHJhdGhlciB0aGFuIEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgYGxlZ2l0aW1pemVfbnMoKWAgaW4gYGtlcm5lbC9uc3RyZWUuY2AgdG8gY2hlY2sgcGVybWlzc2lvbnMgKGBtYXlfbGlzdF9ucygpYCkgYmVmb3JlIGFjcXVpcmluZyBhIHJlZmVyZW5jZSAoYG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKWApLCBlbGltaW5hdGluZyB0aGUgbmVlZCBmb3IgYSB0ZW1wb3JhcnkgYXV0by1jbGVhbnVwIHJlZmVyZW5jZSAoYF9fZnJlZShuc19wdXQpYCkuIFxuXG5UaGlzIGNoYW5nZSBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbWFuaXB1bGF0ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIG5ldyBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIHN0cnVjdCBwYWRkaW5nLCBub3IgZG9lcyBpdCBhbHRlciBkYXRhIGNvcHlpbmcgdG8gdXNlcnNwYWNlIGluIGEgbWFubmVyIHRoYXQgY291bGQgbGVhayB1bmluaXRpYWxpemVkIGJ5dGVzLiBBbnkgcG90ZW50aWFsIHJpc2tzIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2UgcmVsYXRlIHRvIG9iamVjdCBsaWZldGltZSBvciBSQ1UgZGVyZWZlcmVuY2luZyBiZWZvcmUgcmVmZXJlbmNlIGFjcXVpc2l0aW9uLCB3aGljaCBhcmUgc3RyaWN0bHkgd2l0aGluIHRoZSBkb21haW4gb2YgS0FTQU4gcmF0aGVyIHRoYW4gS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA2OjI1Ljk2MjU2NDkxNloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzMzAzMDI0Njk5NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJOQU1FU1BBQ0VTXCIsXG4gICAgXCJVU0VSX05TXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19kb19zeXNfbGlzdG5zXCIsXG4gICAgXCJkb19saXN0bnNcIixcbiAgICBcImRvX2xpc3Ruc191c2VybnNcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGBsZWdpdGltaXplX25zKClgIGluIGBrZXJuZWwvbnN0cmVlLmNgIHRvIGNoZWNrIHBlcm1pc3Npb25zIChgbWF5X2xpc3RfbnMoKWApIGJlZm9yZSBhY3F1aXJpbmcgYSByZWZlcmVuY2UgKGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKClgKSwgZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIGEgdGVtcG9yYXJ5IGF1dG8tY2xlYW51cCByZWZlcmVuY2UgKGBfX2ZyZWUobnNfcHV0KWApLiBcXG5cXG5UaGlzIGNoYW5nZSBkb2VzIG5vdCBpbnRyb2R1Y2Ugb3IgbWFuaXB1bGF0ZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnksIG5ldyBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIHN0cnVjdCBwYWRkaW5nLCBub3IgZG9lcyBpdCBhbHRlciBkYXRhIGNvcHlpbmcgdG8gdXNlcnNwYWNlIGluIGEgbWFubmVyIHRoYXQgY291bGQgbGVhayB1bmluaXRpYWxpemVkIGJ5dGVzLiBBbnkgcG90ZW50aWFsIHJpc2tzIGludHJvZHVjZWQgYnkgdGhpcyBjaGFuZ2UgcmVsYXRlIHRvIG9iamVjdCBsaWZldGltZSBvciBSQ1UgZGVyZWZlcmVuY2luZyBiZWZvcmUgcmVmZXJlbmNlIGFjcXVpc2l0aW9uLCB3aGljaCBhcmUgc3RyaWN0bHkgd2l0aGluIHRoZSBkb21haW4gb2YgS0FTQU4gcmF0aGVyIHRoYW4gS01TQU4uIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgbmFtZXNwYWNlIHRyZWUgaXRlcmF0aW9uIGFuZCBwZXJtaXNzaW9uIHZhbGlkYXRpb24gbG9naWMgaW4gbGVnaXRpbWl6ZV9ucygpLCB3aGljaCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBsaXN0bnMgc3lzdGVtIGNhbGwuIEl0IGNoYW5nZXMgd2hldGhlciBtYXlfbGlzdF9ucygpIGlzIGV2YWx1YXRlZCBiZWZvcmUgb3IgYWZ0ZXIgdGFraW5nIGEgcmVmZXJlbmNlIHZpYSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKCksIG1vZGlmeWluZyByZWFjaGFibGUgY29yZSBrZXJuZWwgY29kZSBhY2Nlc3NpYmxlIHRvIHVzZXJzcGFjZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6MjUuOTYyNTY5NjY2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MTM1MDAyOTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBmZjAwMTE2OTQzOTE0ZWNhNGU5YjExMjQwY2YzODQwZGMzN2VkOWQ5XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTdW4gU2VwIDYgMDE6MDY6MjUgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEva2VybmVsL25zdHJlZS5jIGIva2VybmVsL25zdHJlZS5jXFxuaW5kZXggNmQxMmU1OTAwYWMwMS4uODMxZjI3OWQxNzRhMyAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvbnN0cmVlLmNcXG4rKysgYi9rZXJuZWwvbnN0cmVlLmNcXG5AQCAtNTMzLDE5ICs1MzMsMTMgQEAgREVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxcbiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuc19jb21tb24gKl9fbXVzdF9jaGVjayBsZWdpdGltaXplX25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcXG4ge1xcbi1cXHRzdHJ1Y3QgbnNfY29tbW9uICpucyBfX2ZyZWUobnNfcHV0KSA9IE5VTEw7XFxuLVxcbiBcXHRpZiAoIW5zX3JlcXVlc3RlZChrbHMsIGNhbmRpZGF0ZSkpXFxuIFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4tXFx0bnMgPSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7XFxuLVxcdGlmICghbnMpXFxuLVxcdFxcdHJldHVybiBOVUxMO1xcbi1cXG4tXFx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIG5zKSlcXG4rXFx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIGNhbmRpZGF0ZSkpXFxuIFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4tXFx0cmV0dXJuIG5vX2ZyZWVfcHRyKG5zKTtcXG4rXFx0cmV0dXJuIG5zX2dldF91bmxlc3NfaW5hY3RpdmUoY2FuZGlkYXRlKTtcXG4gfVxcbiBcXG4gc3RhdGljIHNzaXplX3QgZG9fbGlzdG5zX3VzZXJucyhzdHJ1Y3Qga2xpc3RucyAqa2xzKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjoyNi40NzY3MzUzODhaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjEwMjU0MTgxMTk2OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJOQU1FU1BBQ0VTXCIsXG4gICAgXCJVU0VSX05TXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiX19kb19zeXNfbGlzdG5zXCIsXG4gICAgXCJkb19saXN0bnNcIixcbiAgICBcImRvX2xpc3Ruc191c2VybnNcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBuYW1lc3BhY2UgdHJlZSBpdGVyYXRpb24gYW5kIHBlcm1pc3Npb24gdmFsaWRhdGlvbiBsb2dpYyBpbiBsZWdpdGltaXplX25zKCksIHdoaWNoIGlzIGNhbGxlZCBkdXJpbmcgdGhlIGxpc3RucyBzeXN0ZW0gY2FsbC4gSXQgY2hhbmdlcyB3aGV0aGVyIG1heV9saXN0X25zKCkgaXMgZXZhbHVhdGVkIGJlZm9yZSBvciBhZnRlciB0YWtpbmcgYSByZWZlcmVuY2UgdmlhIG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKSwgbW9kaWZ5aW5nIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjb2RlIGFjY2Vzc2libGUgdG8gdXNlcnNwYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGZmMDAxMTY5NDM5MTRlY2E0ZTliMTEyNDBjZjM4NDBkYzM3ZWQ5ZDlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDAxOjA2OjI1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL25zdHJlZS5jIGIva2VybmVsL25zdHJlZS5jXG5pbmRleCA2ZDEyZTU5MDBhYzAxLi44MzFmMjc5ZDE3NGEzIDEwMDY0NFxuLS0tIGEva2VybmVsL25zdHJlZS5jXG4rKysgYi9rZXJuZWwvbnN0cmVlLmNcbkBAIC01MzMsMTkgKzUzMywxMyBAQCBERUZJTkVfRlJFRShuc19wdXQsIHN0cnVjdCBuc19jb21tb24gKiwgaWYgKCFJU19FUlJfT1JfTlVMTChfVCkpIG5zX3B1dChfVCkpXG4gc3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxuIFx0XHRcdFx0XHRcdFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxuIHtcbi1cdHN0cnVjdCBuc19jb21tb24gKm5zIF9fZnJlZShuc19wdXQpID0gTlVMTDtcbi1cbiBcdGlmICghbnNfcmVxdWVzdGVkKGtscywgY2FuZGlkYXRlKSlcbiBcdFx0cmV0dXJuIE5VTEw7XG4gXG4tXHRucyA9IG5zX2dldF91bmxlc3NfaW5hY3RpdmUoY2FuZGlkYXRlKTtcbi1cdGlmICghbnMpXG4tXHRcdHJldHVybiBOVUxMO1xuLVxuLVx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIG5zKSlcbitcdGlmICghbWF5X2xpc3RfbnMoa2xzLCBjYW5kaWRhdGUpKVxuIFx0XHRyZXR1cm4gTlVMTDtcbiBcbi1cdHJldHVybiBub19mcmVlX3B0cihucyk7XG4rXHRyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpO1xuIH1cbiBcbiBzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjoyNi40NzY3MzY5NDhaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2NTkyMzYyNjc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIGhvdyBJJ2QgYXBwcm9hY2ggdGhpcyB0YXNrLCB3YWxraW5nIHRocm91Z2ggbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBgbnN0cmVlLmNgIENoYW5nZXMqKlxuXG5BbHJpZ2h0LCB0aGUgZmlyc3Qgc3RlcCBpcyBhbHdheXMgdG8gZ2V0IGEgaGFuZGxlIG9uIHRoZSBjaGFuZ2VzIHRoZW1zZWx2ZXMuIEknbSBnb2luZyB0byBwdWxsIHVwIHRoZSBwYXRjaCBhbmQgdGhlIG1vZGlmaWVkIGBrZXJuZWwvbnN0cmVlLmNgIGZpbGUuIEknbSBhbHJlYWR5IGFudGljaXBhdGluZyBzb21lIG9mIHRoZSB1c3VhbCBzdXNwZWN0cyB3aXRoIHRoZXNlIHR5cGVzIG9mIGZpbGUgbW9kaWZpY2F0aW9ucyDigJMgZGF0YSBzdHJ1Y3R1cmUgYWx0ZXJhdGlvbnMsIGZ1bmN0aW9uIHJlLXdyaXRlcywgcG90ZW50aWFsbHkgc29tZSBjb25jdXJyZW5jeSBjb25zaWRlcmF0aW9ucyBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYW55dGhpbmcgYWNjZXNzaW5nIHRoaXMgZmlsZSBzeXN0ZW0gY29kZS5cblxuTm93LCBpbnN0ZWFkIG9mIGp1c3QgcmVhZGluZyBsaW5lIGJ5IGxpbmUsIEknbGwgbGlrZWx5IGdvIHN0cmFpZ2h0IGZvciBzb21lIHRvb2xpbmcuIGByZWFkLWZpbGVgIGNvdWxkIGdpdmUgbWUgYSBxdWljaywgZm9ybWF0dGVkIG92ZXJ2aWV3IG9mIHRoZSBjb2RlLiBIb3dldmVyLCBteSBnby10byBpbiB0aGlzIHNpdHVhdGlvbiBpcyB1c3VhbGx5IGBncmVwcGVyYC4gSSdtIGdvaW5nIHRvIHNlYXJjaCBmb3IgYSBmZXcga2V5IHRoaW5ncyBkaXJlY3RseSBpbiB0aGUgcGF0Y2ggYW5kIHRoZW4gaW4gdGhlIGBuc3RyZWUuY2Agc291cmNlOlxuXG4qICAgKipLZXkgRGF0YSBTdHJ1Y3R1cmVzOioqIFdoYXQgYXJlIHRoZSBtYWpvciBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQ/IGBuc3RyZWVfbm9kZWAsIGBuc3RyZWVfcGF0aGAgb3Igc29tZXRoaW5nIHNpbWlsYXI/IEknbGwgZ3JlcCBmb3IgdGhvc2UgYW5kIGxvb2sgZm9yIHRoZWlyIGRlZmluaXRpb25zIGFuZCBhbnkgY2hhbmdlcyB0byB0aGVpciBmaWVsZHMuXG4qICAgKipLZXkgRnVuY3Rpb25zOioqIFdoYXQgYXJlIHRoZSBjb3JlIGZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgb24gdGhlIE5TVHJlZT8gYG5zdHJlZV9sb29rdXBgLCBgbnN0cmVlX2luc2VydGAsIGBuc3RyZWVfZGVsZXRlYCwgYG5zdHJlZV93YWxrYCAob3Igc2ltaWxhcik/IEknbGwgc2VhcmNoIGZvciB0aG9zZSBmdW5jdGlvbiBuYW1lcyB0byB1bmRlcnN0YW5kIHdoYXQncyBiZWluZyBtb2RpZmllZC5cbiogICAqKkVycm9yIEhhbmRsaW5nOioqIEFyZSB0aGVyZSBhbnkgbmV3IGVycm9yIGNvZGVzIG9yIGNoYW5nZXMgdG8gZXhpc3RpbmcgZXJyb3IgaGFuZGxpbmc/IFRoYXQncyBhbHdheXMgYSBjcml0aWNhbCBhc3BlY3QsIGFuZCBlYXN5IHRvIG1pc3MuXG4qICAgKipDb25jdXJyZW5jeToqKiBJcyB0aGVyZSBhbnkgdGhyZWFkaW5nLCBsb2NraW5nLCBvciBhdG9taWMgb3BlcmF0aW9ucyBpbnZvbHZlZD8gQW55IGNhbGxzIHRvIG11dGV4ZXMgb3IgYXRvbWljIHByaW1pdGl2ZXM/IFRoaXMgaXMgYSBodWdlIGFyZWEgZm9yIHByb2JsZW1zLCBzbyBJJ2xsIGJlIGV4dHJhIHZpZ2lsYW50IGhlcmUuXG5cblRoaXMgdGFyZ2V0ZWQgYXBwcm9hY2ggbGV0cyBtZSBxdWlja2x5IHBpbnBvaW50IHRoZSAqd2hhdCogYW5kICp3aGVyZSogb2YgdGhlIHBhdGNoLiBPbmNlIEkgaGF2ZSBhIGNsZWFyIGlkZWEgb2Ygd2hhdCdzICpiZWluZyogbW9kaWZpZWQsIEkgY2FuIHRoZW4gZGl2ZSBkZWVwZXIgaW50byB0aGUgKndoeSogb2YgdGhlIGNoYW5nZXMuIEknbGwgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByZWFzb25pbmcgYmVoaW5kIGVhY2ggb2YgdGhlIG1vZGlmaWNhdGlvbnMsIGFuZCB3aGV0aGVyIGl0IGNvdWxkIHBvdGVudGlhbGx5IGNhdXNlIHByb2JsZW1zLiBJJ2xsIHByb2JhYmx5IHNwZW5kIGEgZ29vZCBkZWFsIG9mIHRpbWUgdHJhY2luZyB0aHJvdWdoIHRoZSBrZXkgZnVuY3Rpb25zIGFuZCBob3cgdGhleSdyZSBpbnRlbmRlZCB0byB3b3JrIHVuZGVyIHZhcmlvdXMgY29uZGl0aW9ucyB0byBjb21lIHRvIGEgd2VsbCBpbmZvcm1lZCBjb25jbHVzaW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyOTg2LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjozMy4wNjkxMDI3NzVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjE1NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL25zdHJlZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDUyMCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDUyMDpcXHRcXHRpZiAoaXNfY3VycmVudF9uYW1lc3BhY2UobnMpKVxcbiA1MjE6XFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIDUyMjpcXHRcXHRyZXR1cm4gbWF5X3NlZV9hbGxfbmFtZXNwYWNlcygpO1xcbiA1MjM6XFx0fVxcbiA1MjQ6XFx0XFxuIDUyNTpcXHRzdGF0aWMgaW5saW5lIHZvaWQgbnNfcHV0KHN0cnVjdCBuc19jb21tb24gKm5zKVxcbiA1MjY6XFx0e1xcbiA1Mjc6XFx0XFx0aWYgKG5zIFxcdTAwMjZcXHUwMDI2IG5zLVxcdTAwM2VvcHMpXFxuIDUyODpcXHRcXHRcXHRucy1cXHUwMDNlb3BzLVxcdTAwM2VwdXQobnMpO1xcbiA1Mjk6XFx0fVxcbiA1MzA6XFx0XFxuIDUzMTpcXHRERUZJTkVfRlJFRShuc19wdXQsIHN0cnVjdCBuc19jb21tb24gKiwgaWYgKCFJU19FUlJfT1JfTlVMTChfVCkpIG5zX3B1dChfVCkpXFxuIDUzMjpcXHRcXG4gNTMzOlxcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5zX2NvbW1vbiAqX19tdXN0X2NoZWNrIGxlZ2l0aW1pemVfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcXG4gNTM0OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBuc19jb21tb24gKmNhbmRpZGF0ZSlcXG4gNTM1OlxcdHtcXG4gNTM2OlxcdFxcdGlmICghbnNfcmVxdWVzdGVkKGtscywgY2FuZGlkYXRlKSlcXG4gNTM3OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiA1Mzg6XFx0XFxuIDUzOTpcXHRcXHRpZiAoIW1heV9saXN0X25zKGtscywgY2FuZGlkYXRlKSlcXG4gNTQwOlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiA1NDE6XFx0XFxuIDU0MjpcXHRcXHRyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpO1xcbiA1NDM6XFx0fVxcbiA1NDQ6XFx0XFxuIDU0NTpcXHRzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXFxuIDU0NjpcXHR7XFxuIDU0NzpcXHRcXHR1NjQgX191c2VyICpuc19pZHMgPSBrbHMtXFx1MDAzZXVuc19pZHM7XFxuIDU0ODpcXHRcXHRzaXplX3QgbnJfbnNfaWRzID0ga2xzLVxcdTAwM2Vucl9uc19pZHM7XFxuIDU0OTpcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICpucyA9IE5VTEwsICpmaXJzdF9ucyA9IE5VTEwsICpwcmV2ID0gTlVMTDtcXG4gNTUwOlxcdFxcdGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7XFxuIDU1MTpcXHRcXHRzc2l6ZV90IHJldDtcXG4gNTUyOlxcdFxcbiA1NTM6XFx0XFx0VkZTX1dBUk5fT05fT05DRSgha2xzLVxcdTAwM2V1c2VyX25zX2lkKTtcXG4gNTU0OlxcdFxcbiA1NTU6XFx0XFx0aWYgKGtscy1cXHUwMDNldXNlcl9uc19pZCA9PSBMSVNUTlNfQ1VSUkVOVF9VU0VSKVxcbiA1NTY6XFx0XFx0XFx0bnMgPSB0b19uc19jb21tb24oY3VycmVudF91c2VyX25zKCkpO1xcbiA1NTc6XFx0XFx0ZWxzZSBpZiAoa2xzLVxcdTAwM2V1c2VyX25zX2lkKVxcbiA1NTg6XFx0XFx0XFx0bnMgPSBsb29rdXBfbnNfaWQoa2xzLVxcdTAwM2V1c2VyX25zX2lkLCBDTE9ORV9ORVdVU0VSKTtcXG4gNTU5OlxcdFxcdGlmICghbnMpXFxuIDU2MDpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNTYxOlxcdFxcdGtscy1cXHUwMDNldXNlcl9ucyA9IHRvX3VzZXJfbnMobnMpO1xcbiA1NjI6XFx0XFxuIDU2MzpcXHRcXHQvKlxcbiA1NjQ6XFx0XFx0ICogVXNlIHRoZSByYnRyZWUgdG8gZmluZCB0aGUgZmlyc3QgbmFtZXNwYWNlIHdlIGNhcmUgYWJvdXQgYW5kXFxuIDU2NTpcXHRcXHQgKiB0aGVuIHVzZSBpdCdzIGxpc3QgZW50cnkgdG8gaXRlcmF0ZSBmcm9tIHRoZXJlLlxcbiA1NjY6XFx0XFx0ICovXFxuIDU2NzpcXHRcXHRpZiAoa2xzLVxcdTAwM2VsYXN0X25zX2lkKSB7XFxuIDU2ODpcXHRcXHRcXHRrbHMtXFx1MDAzZWZpcnN0X25zID0gbG9va3VwX25zX293bmVyX2F0KGtscy1cXHUwMDNlbGFzdF9uc19pZCArIDEsIG5zKTtcXG4gNTY5OlxcdFxcdFxcdGlmICgha2xzLVxcdTAwM2VmaXJzdF9ucylcXG4gNTcwOlxcdFxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbiA1NzE6XFx0XFx0XFx0Zmlyc3RfbnMgPSBrbHMtXFx1MDAzZWZpcnN0X25zO1xcbiA1NzI6XFx0XFx0fVxcbiA1NzM6XFx0XFxuIDU3NDpcXHRcXHRyZXQgPSAwO1xcbiA1NzU6XFx0XFx0aGVhZCA9IFxcdTAwMjZ0b19uc19jb21tb24oa2xzLVxcdTAwM2V1c2VyX25zKS1cXHUwMDNlbnNfb3duZXJfcm9vdC5uc19saXN0X2hlYWQ7XFxuIDU3NjpcXHRcXHRrbHMtXFx1MDAzZXVzZXJuc19jYXBhYmxlID0gbWF5X3NlZV9hbGxfbmFtZXNwYWNlcygpO1xcbiA1Nzc6XFx0XFxuIDU3ODpcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIDU3OTpcXHRcXG4gNTgwOlxcdFxcdGlmICghZmlyc3RfbnMpXFxuIDU4MTpcXHRcXHRcXHRmaXJzdF9ucyA9IGxpc3RfZW50cnlfcmN1KGhlYWQtXFx1MDAzZW5leHQsIHR5cGVvZigqZmlyc3RfbnMpLCBuc19vd25lcl9ub2RlLm5zX2xpc3RfZW50cnkpO1xcbiA1ODI6XFx0XFxuIDU4MzpcXHRcXHRucyA9IGZpcnN0X25zO1xcbiA1ODQ6XFx0XFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tX3JjdShucywgaGVhZCwgbnNfb3duZXJfbm9kZS5uc19saXN0X2VudHJ5KSB7XFxuIDU4NTpcXHRcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICp2YWxpZDtcXG4gNTg2OlxcdFxcbiA1ODc6XFx0XFx0XFx0aWYgKCFucl9uc19pZHMpXFxuIDU4ODpcXHRcXHRcXHRcXHRicmVhaztcXG4gNTg5OlxcdFxcbiA1OTA6XFx0XFx0XFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xcbiA1OTE6XFx0XFx0XFx0aWYgKCF2YWxpZClcXG4gNTkyOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiA1OTM6XFx0XFxuIDU5NDpcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gNTk1OlxcdFxcbiA1OTY6XFx0XFx0XFx0bnNfcHV0KHByZXYpO1xcbiA1OTc6XFx0XFx0XFx0cHJldiA9IHZhbGlkO1xcbiA1OTg6XFx0XFxuIDU5OTpcXHRcXHRcXHRpZiAocHV0X3VzZXIodmFsaWQtXFx1MDAzZW5zX2lkLCBuc19pZHMgKyByZXQpKSB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA2OjMzLjA2OTIyNzA1NVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5OTYwNzk2NjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSBrZXJuZWwvbnN0cmVlLmMgaW52ZXN0aWdhdGlvbiwgYmFzZWQgb24gdGhlIHByb21wdDpcblxuKipEaXZpbmcgRGVlcGVyIGludG8gYGtlcm5lbC9uc3RyZWUuY2AqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCBhIGRlY2VudCBncmFzcCBvbiB3aGF0IGBuc3RyZWUuY2AgKmlzKiBmcm9tIHRoZSBpbml0aWFsIGdsYW5jZSwgYnV0IEkgcmVhbGx5IG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY29udGV4dC4gS25vd2luZyB0aGUgcHVycG9zZSBpcyBvbmUgdGhpbmcsIGJ1dCBob3cgaXQncyBhY3R1YWxseSAqdXNlZCogaXMgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIGl0cyByZWFsIGltcGFjdC4gSSBuZWVkIHRvIHNlZSB0aGUgcmVzdCBvZiB0aGUgZmlsZSB0byBncmFzcCBpdHMgaW50ZXJuYWwgd29ya2luZ3MsIG9mIGNvdXJzZSwgYnV0IG1vcmUgaW1wb3J0YW50bHksIGhvdyB0aGUga2VybmVsIGludGVyYWN0cyB3aXRoIGl0LCBob3cgaXQncyBsaW5rZWQsIGFuZCBob3cgaXQncyBjb25maWd1cmVkIGFyZSB3aGVyZSBJ4oCZbGwgZmluZCB0aGUgdHJ1ZSBzaWduaWZpY2FuY2UuIElzIGl0IGEgY29yZSBjb21wb25lbnQgb3IgbW9yZSBvZiBhIHN1cHBvcnRpbmcgbGlicmFyeT8gV2hhdCBvdGhlciBzdWJzeXN0ZW1zIGRlcGVuZCBvbiBpdD8gSSdtIHRoaW5raW5nIEkgbmVlZCB0byBmaW5kIHRoZSBjYWxscyB0byB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhhdCBmaWxlLiBJIGFtIGxvb2tpbmcgZm9yIHRoZSBicm9hZGVyIHN5c3RlbS1sZXZlbCBpbnRlcmFjdGlvbnMgbm93LiBUaGlzIHdpbGwgc2hhcGUgbXkgZmluYWwgYW5hbHlzaXMuIExldCdzIHNlZSBob3cgdGhpcyB0aGluZyAqYWN0dWFsbHkqIHdvcmtzIGluIHRoZSBncmFuZCBzY2hlbWUgb2YgdGhpbmdzIVxuXG5cbiIsIklucHV0VG9rZW5zIjo0ODAwLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjozNS4wNjUzMTA1ODVaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDk4OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL25zdHJlZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdC8qIENvcHlyaWdodCAoYykgMjAyNSBDaHJpc3RpYW4gQnJhdW5lciBcXHUwMDNjYnJhdW5lckBrZXJuZWwub3JnXFx1MDAzZSAqL1xcbiAgIDM6XFx0XFxuICAgNDpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbnN0cmVlLmhcXHUwMDNlXFxuICAgNTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvcHJvY19ucy5oXFx1MDAzZVxcbiAgIDY6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JjdWxpc3QuaFxcdTAwM2VcXG4gICA3OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC92ZnNkZWJ1Zy5oXFx1MDAzZVxcbiAgIDg6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N5c2NhbGxzLmhcXHUwMDNlXFxuICAgOTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvdXNlcl9uYW1lc3BhY2UuaFxcdTAwM2VcXG4gIDEwOlxcdFxcbiAgMTE6XFx0c3RhdGljIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wIERFRklORV9TRVFMT0NLKG5zX3RyZWVfbG9jayk7XFxuICAxMjpcXHRcXG4gIDEzOlxcdERFRklORV9MT0NLX0dVQVJEXzAobnNfdHJlZV93cml0ZXIsXFxuICAxNDpcXHRcXHRcXHQgICAgd3JpdGVfc2VxbG9jayhcXHUwMDI2bnNfdHJlZV9sb2NrKSxcXG4gIDE1OlxcdFxcdFxcdCAgICB3cml0ZV9zZXF1bmxvY2soXFx1MDAyNm5zX3RyZWVfbG9jaykpXFxuICAxNjpcXHRcXG4gIDE3OlxcdERFRklORV9MT0NLX0dVQVJEXzAobnNfdHJlZV9sb2NrZWRfcmVhZGVyLFxcbiAgMTg6XFx0XFx0XFx0ICAgIHJlYWRfc2VxbG9ja19leGNsKFxcdTAwMjZuc190cmVlX2xvY2spLFxcbiAgMTk6XFx0XFx0XFx0ICAgIHJlYWRfc2VxdW5sb2NrX2V4Y2woXFx1MDAyNm5zX3RyZWVfbG9jaykpXFxuICAyMDpcXHRcXG4gIDIxOlxcdHN0YXRpYyBzdHJ1Y3QgbnNfdHJlZV9yb290IG5zX3VuaWZpZWRfcm9vdCA9IHsgLyogcHJvdGVjdGVkIGJ5IG5zX3RyZWVfbG9jayAqL1xcbiAgMjI6XFx0XFx0Lm5zX3JiID0gUkJfUk9PVCxcXG4gIDIzOlxcdFxcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChuc191bmlmaWVkX3Jvb3QubnNfbGlzdF9oZWFkKSxcXG4gIDI0OlxcdH07XFxuICAyNTpcXHRcXG4gIDI2OlxcdHN0cnVjdCBuc190cmVlX3Jvb3QgbW50X25zX3RyZWUgPSB7XFxuICAyNzpcXHRcXHQubnNfcmIgPSBSQl9ST09ULFxcbiAgMjg6XFx0XFx0Lm5zX2xpc3RfaGVhZCA9IExJU1RfSEVBRF9JTklUKG1udF9uc190cmVlLm5zX2xpc3RfaGVhZCksXFxuICAyOTpcXHR9O1xcbiAgMzA6XFx0XFxuICAzMTpcXHRzdHJ1Y3QgbnNfdHJlZV9yb290IG5ldF9uc190cmVlID0ge1xcbiAgMzI6XFx0XFx0Lm5zX3JiID0gUkJfUk9PVCxcXG4gIDMzOlxcdFxcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChuZXRfbnNfdHJlZS5uc19saXN0X2hlYWQpLFxcbiAgMzQ6XFx0fTtcXG4gIDM1OlxcdEVYUE9SVF9TWU1CT0xfR1BMKG5ldF9uc190cmVlKTtcXG4gIDM2OlxcdFxcbiAgMzc6XFx0c3RydWN0IG5zX3RyZWVfcm9vdCB1dHNfbnNfdHJlZSA9IHtcXG4gIDM4OlxcdFxcdC5uc19yYiA9IFJCX1JPT1QsXFxuICAzOTpcXHRcXHQubnNfbGlzdF9oZWFkID0gTElTVF9IRUFEX0lOSVQodXRzX25zX3RyZWUubnNfbGlzdF9oZWFkKSxcXG4gIDQwOlxcdH07XFxuICA0MTpcXHRcXG4gIDQyOlxcdHN0cnVjdCBuc190cmVlX3Jvb3QgdXNlcl9uc190cmVlID0ge1xcbiAgNDM6XFx0XFx0Lm5zX3JiID0gUkJfUk9PVCxcXG4gIDQ0OlxcdFxcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVCh1c2VyX25zX3RyZWUubnNfbGlzdF9oZWFkKSxcXG4gIDQ1OlxcdH07XFxuICA0NjpcXHRcXG4gIDQ3OlxcdHN0cnVjdCBuc190cmVlX3Jvb3QgaXBjX25zX3RyZWUgPSB7XFxuICA0ODpcXHRcXHQubnNfcmIgPSBSQl9ST09ULFxcbiAgNDk6XFx0XFx0Lm5zX2xpc3RfaGVhZCA9IExJU1RfSEVBRF9JTklUKGlwY19uc190cmVlLm5zX2xpc3RfaGVhZCksXFxuICA1MDpcXHR9O1xcbiAgNTE6XFx0XFxuICA1MjpcXHRzdHJ1Y3QgbnNfdHJlZV9yb290IHBpZF9uc190cmVlID0ge1xcbiAgNTM6XFx0XFx0Lm5zX3JiID0gUkJfUk9PVCxcXG4gIDU0OlxcdFxcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVChwaWRfbnNfdHJlZS5uc19saXN0X2hlYWQpLFxcbiAgNTU6XFx0fTtcXG4gIDU2OlxcdFxcbiAgNTc6XFx0c3RydWN0IG5zX3RyZWVfcm9vdCBjZ3JvdXBfbnNfdHJlZSA9IHtcXG4gIDU4OlxcdFxcdC5uc19yYiA9IFJCX1JPT1QsXFxuICA1OTpcXHRcXHQubnNfbGlzdF9oZWFkID0gTElTVF9IRUFEX0lOSVQoY2dyb3VwX25zX3RyZWUubnNfbGlzdF9oZWFkKSxcXG4gIDYwOlxcdH07XFxuICA2MTpcXHRcXG4gIDYyOlxcdHN0cnVjdCBuc190cmVlX3Jvb3QgdGltZV9uc190cmVlID0ge1xcbiAgNjM6XFx0XFx0Lm5zX3JiID0gUkJfUk9PVCxcXG4gIDY0OlxcdFxcdC5uc19saXN0X2hlYWQgPSBMSVNUX0hFQURfSU5JVCh0aW1lX25zX3RyZWUubnNfbGlzdF9oZWFkKSxcXG4gIDY1OlxcdH07XFxuICA2NjpcXHRcXG4gIDY3OlxcdC8qKlxcbiAgNjg6XFx0ICogbnNfdHJlZV9ub2RlX2luaXQgLSBJbml0aWFsaXplIGEgbmFtZXNwYWNlIHRyZWUgbm9kZVxcbiAgNjk6XFx0ICogQG5vZGU6IFRoZSBub2RlIHRvIGluaXRpYWxpemVcXG4gIDcwOlxcdCAqXFxuICA3MTpcXHQgKiBJbml0aWFsaXplcyBib3RoIHRoZSByYnRyZWUgbm9kZSBhbmQgbGlzdCBlbnRyeS5cXG4gIDcyOlxcdCAqL1xcbiAgNzM6XFx0dm9pZCBuc190cmVlX25vZGVfaW5pdChzdHJ1Y3QgbnNfdHJlZV9ub2RlICpub2RlKVxcbiAgNzQ6XFx0e1xcbiAgNzU6XFx0XFx0UkJfQ0xFQVJfTk9ERShcXHUwMDI2bm9kZS1cXHUwMDNlbnNfbm9kZSk7XFxuICA3NjpcXHRcXHRJTklUX0xJU1RfSEVBRChcXHUwMDI2bm9kZS1cXHUwMDNlbnNfbGlzdF9lbnRyeSk7XFxuICA3NzpcXHR9XFxuICA3ODpcXHRcXG4gIDc5OlxcdC8qKlxcbiAgODA6XFx0ICogbnNfdHJlZV9yb290X2luaXQgLSBJbml0aWFsaXplIGEgbmFtZXNwYWNlIHRyZWUgcm9vdFxcbiAgODE6XFx0ICogQHJvb3Q6IFRoZSByb290IHRvIGluaXRpYWxpemVcXG4gIDgyOlxcdCAqXFxuICA4MzpcXHQgKiBJbml0aWFsaXplcyBib3RoIHRoZSByYnRyZWUgcm9vdCBhbmQgbGlzdCBoZWFkLlxcbiAgODQ6XFx0ICovXFxuICA4NTpcXHR2b2lkIG5zX3RyZWVfcm9vdF9pbml0KHN0cnVjdCBuc190cmVlX3Jvb3QgKnJvb3QpXFxuICA4NjpcXHR7XFxuICA4NzpcXHRcXHRyb290LVxcdTAwM2Vuc19yYiA9IFJCX1JPT1Q7XFxuICA4ODpcXHRcXHRJTklUX0xJU1RfSEVBRChcXHUwMDI2cm9vdC1cXHUwMDNlbnNfbGlzdF9oZWFkKTtcXG4gIDg5OlxcdH1cXG4gIDkwOlxcdFxcbiAgOTE6XFx0LyoqXFxuICA5MjpcXHQgKiBuc190cmVlX25vZGVfZW1wdHkgLSBDaGVjayBpZiBhIG5hbWVzcGFjZSB0cmVlIG5vZGUgaXMgZW1wdHlcXG4gIDkzOlxcdCAqIEBub2RlOiBUaGUgbm9kZSB0byBjaGVja1xcbiAgOTQ6XFx0ICpcXG4gIDk1OlxcdCAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBub3QgaW4gYW55IHRyZWUuXFxuICA5NjpcXHQgKi9cXG4gIDk3OlxcdGJvb2wgbnNfdHJlZV9ub2RlX2VtcHR5KGNvbnN0IHN0cnVjdCBuc190cmVlX25vZGUgKm5vZGUpXFxuICA5ODpcXHR7XFxuICA5OTpcXHRcXHRyZXR1cm4gUkJfRU1QVFlfTk9ERShcXHUwMDI2bm9kZS1cXHUwMDNlbnNfbm9kZSk7XFxuIDEwMDpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA2OjM1LjA2NTQyMjgxNVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5OTM2MDk0NjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqRGl2aW5nIEJhY2sgaW50byBga2VybmVsL25zdHJlZS5jYCoqXG5cbkFscmlnaHQsIGxldCdzIHBpY2sgdXAgd2hlcmUgd2UgbGVmdCBvZmYsIG9yIHJhdGhlciwgd2hlcmUgSSBsZWZ0IG9mZiBpbiBteSBtZW50YWwgbWFwIG9mIHRoZSBga2VybmVsL25zdHJlZS5jYCBpbXBsZW1lbnRhdGlvbi4gSSBuZWVkIHRvIGdldCBiYWNrIGludG8gdGhlIGxhdHRlciBoYWxmIG9mIHRoZSBmaWxlLCBzdGFydGluZyBmcm9tIGxpbmUgNjAwLiBJJ20gZm9jdXNpbmcgb24gdGhlIGludHJpY2FjaWVzIG9mIHRoZSBuYW1lc3BhY2UgdHJlZSBzdHJ1Y3R1cmUgYW5kIGhvdyBpdCBoYW5kbGVzIHBhdGggcmVzb2x1dGlvbiBhbmQgbmFtZXNwYWNlIG9wZXJhdGlvbnMuIEknbSBzcGVjaWZpY2FsbHkgbG9va2luZyBmb3IgYW55dGhpbmcgdGhhdCBtaWdodCBzaGVkIGxpZ2h0IG9uIGhvdyB0aGV5IG1hbmFnZSBuZXN0ZWQgbmFtZXNwYWNlcyBhbmQgcG90ZW50aWFsIGVkZ2UgY2FzZXMgYXJvdW5kIG1vdW50IHByb3BhZ2F0aW9uLiBMZXQncyBzZWUgaWYgdGhlcmUgYXJlIGFueSBzdWJ0bGUgb3B0aW1pemF0aW9uIHRlY2huaXF1ZXMgdXNlZCBoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NTkyLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjozNy4wNTkwMzQ3ODZaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTA0MzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL25zdHJlZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYwMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA2MDA6XFx0XFx0XFx0XFx0bnNfcHV0KHByZXYpO1xcbiA2MDE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIDYwMjpcXHRcXHRcXHR9XFxuIDYwMzpcXHRcXG4gNjA0OlxcdFxcdFxcdG5yX25zX2lkcy0tO1xcbiA2MDU6XFx0XFx0XFx0cmV0Kys7XFxuIDYwNjpcXHRcXG4gNjA3OlxcdFxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gNjA4OlxcdFxcdH1cXG4gNjA5OlxcdFxcbiA2MTA6XFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuIDYxMTpcXHRcXHRuc19wdXQocHJldik7XFxuIDYxMjpcXHRcXHRyZXR1cm4gcmV0O1xcbiA2MTM6XFx0fVxcbiA2MTQ6XFx0XFxuIDYxNTpcXHQvKlxcbiA2MTY6XFx0ICogTG9va3VwIGEgbmFtZXNwYWNlIHdpdGggaWQgXFx1MDAzZT0gbnNfaWQgaW4gZWl0aGVyIHRoZSB1bmlmaWVkIHRyZWUgb3IgYSB0eXBlLXNwZWNpZmljIHRyZWUuXFxuIDYxNzpcXHQgKiBSZXR1cm5zIHRoZSBuYW1lc3BhY2Ugd2l0aCB0aGUgc21hbGxlc3QgaWQgdGhhdCBpcyBcXHUwMDNlPSBuc19pZC5cXG4gNjE4OlxcdCAqL1xcbiA2MTk6XFx0c3RhdGljIHN0cnVjdCBuc19jb21tb24gKmxvb2t1cF9uc19pZF9hdCh1NjQgbnNfaWQsIGludCBuc190eXBlKVxcbiA2MjA6XFx0e1xcbiA2MjE6XFx0XFx0c3RydWN0IG5zX2NvbW1vbiAqcmV0ID0gTlVMTDtcXG4gNjIyOlxcdFxcdHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUgPSBOVUxMO1xcbiA2MjM6XFx0XFx0c3RydWN0IHJiX25vZGUgKm5vZGU7XFxuIDYyNDpcXHRcXG4gNjI1OlxcdFxcdGlmIChuc190eXBlKSB7XFxuIDYyNjpcXHRcXHRcXHRuc190cmVlID0gbnNfdHJlZV9mcm9tX3R5cGUobnNfdHlwZSk7XFxuIDYyNzpcXHRcXHRcXHRpZiAoIW5zX3RyZWUpXFxuIDYyODpcXHRcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gNjI5OlxcdFxcdH1cXG4gNjMwOlxcdFxcbiA2MzE6XFx0XFx0Z3VhcmQobnNfdHJlZV9sb2NrZWRfcmVhZGVyKSgpO1xcbiA2MzI6XFx0XFxuIDYzMzpcXHRcXHRpZiAobnNfdHJlZSlcXG4gNjM0OlxcdFxcdFxcdG5vZGUgPSBuc190cmVlLVxcdTAwM2Vuc19yYi5yYl9ub2RlO1xcbiA2MzU6XFx0XFx0ZWxzZVxcbiA2MzY6XFx0XFx0XFx0bm9kZSA9IG5zX3VuaWZpZWRfcm9vdC5uc19yYi5yYl9ub2RlO1xcbiA2Mzc6XFx0XFxuIDYzODpcXHRcXHR3aGlsZSAobm9kZSkge1xcbiA2Mzk6XFx0XFx0XFx0c3RydWN0IG5zX2NvbW1vbiAqbnM7XFxuIDY0MDpcXHRcXG4gNjQxOlxcdFxcdFxcdGlmIChuc190eXBlKVxcbiA2NDI6XFx0XFx0XFx0XFx0bnMgPSBub2RlX3RvX25zKG5vZGUpO1xcbiA2NDM6XFx0XFx0XFx0ZWxzZVxcbiA2NDQ6XFx0XFx0XFx0XFx0bnMgPSBub2RlX3RvX25zX3VuaWZpZWQobm9kZSk7XFxuIDY0NTpcXHRcXG4gNjQ2OlxcdFxcdFxcdGlmIChuc19pZCBcXHUwMDNjPSBucy1cXHUwMDNlbnNfaWQpIHtcXG4gNjQ3OlxcdFxcdFxcdFxcdGlmIChuc190eXBlKVxcbiA2NDg6XFx0XFx0XFx0XFx0XFx0cmV0ID0gbm9kZV90b19ucyhub2RlKTtcXG4gNjQ5OlxcdFxcdFxcdFxcdGVsc2VcXG4gNjUwOlxcdFxcdFxcdFxcdFxcdHJldCA9IG5vZGVfdG9fbnNfdW5pZmllZChub2RlKTtcXG4gNjUxOlxcdFxcdFxcdFxcdGlmIChuc19pZCA9PSBucy1cXHUwMDNlbnNfaWQpXFxuIDY1MjpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gNjUzOlxcdFxcdFxcdFxcdG5vZGUgPSBub2RlLVxcdTAwM2VyYl9sZWZ0O1xcbiA2NTQ6XFx0XFx0XFx0fSBlbHNlIHtcXG4gNjU1OlxcdFxcdFxcdFxcdG5vZGUgPSBub2RlLVxcdTAwM2VyYl9yaWdodDtcXG4gNjU2OlxcdFxcdFxcdH1cXG4gNjU3OlxcdFxcdH1cXG4gNjU4OlxcdFxcbiA2NTk6XFx0XFx0aWYgKHJldClcXG4gNjYwOlxcdFxcdFxcdHJldCA9IG5zX2dldF91bmxlc3NfaW5hY3RpdmUocmV0KTtcXG4gNjYxOlxcdFxcdHJldHVybiByZXQ7XFxuIDY2MjpcXHR9XFxuIDY2MzpcXHRcXG4gNjY0OlxcdHN0YXRpYyBpbmxpbmUgc3RydWN0IG5zX2NvbW1vbiAqZmlyc3RfbnNfY29tbW9uKGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsXFxuIDY2NTpcXHRcXHRcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgbnNfdHJlZV9yb290ICpuc190cmVlKVxcbiA2NjY6XFx0e1xcbiA2Njc6XFx0XFx0aWYgKG5zX3RyZWUpXFxuIDY2ODpcXHRcXHRcXHRyZXR1cm4gbGlzdF9lbnRyeV9yY3UoaGVhZC1cXHUwMDNlbmV4dCwgc3RydWN0IG5zX2NvbW1vbiwgbnNfdHJlZV9ub2RlLm5zX2xpc3RfZW50cnkpO1xcbiA2Njk6XFx0XFx0cmV0dXJuIGxpc3RfZW50cnlfcmN1KGhlYWQtXFx1MDAzZW5leHQsIHN0cnVjdCBuc19jb21tb24sIG5zX3VuaWZpZWRfbm9kZS5uc19saXN0X2VudHJ5KTtcXG4gNjcwOlxcdH1cXG4gNjcxOlxcdFxcbiA2NzI6XFx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpuZXh0X25zX2NvbW1vbihzdHJ1Y3QgbnNfY29tbW9uICpucyxcXG4gNjczOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgbnNfdHJlZV9yb290ICpuc190cmVlKVxcbiA2NzQ6XFx0e1xcbiA2NzU6XFx0XFx0aWYgKG5zX3RyZWUpXFxuIDY3NjpcXHRcXHRcXHRyZXR1cm4gbGlzdF9lbnRyeV9yY3UobnMtXFx1MDAzZW5zX3RyZWVfbm9kZS5uc19saXN0X2VudHJ5Lm5leHQsIHN0cnVjdCBuc19jb21tb24sIG5zX3RyZWVfbm9kZS5uc19saXN0X2VudHJ5KTtcXG4gNjc3OlxcdFxcdHJldHVybiBsaXN0X2VudHJ5X3JjdShucy1cXHUwMDNlbnNfdW5pZmllZF9ub2RlLm5zX2xpc3RfZW50cnkubmV4dCwgc3RydWN0IG5zX2NvbW1vbiwgbnNfdW5pZmllZF9ub2RlLm5zX2xpc3RfZW50cnkpO1xcbiA2Nzg6XFx0fVxcbiA2Nzk6XFx0XFxuIDY4MDpcXHRzdGF0aWMgaW5saW5lIGJvb2wgbnNfY29tbW9uX2lzX2hlYWQoc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuIDY4MTpcXHRcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsXFxuIDY4MjpcXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBuc190cmVlX3Jvb3QgKm5zX3RyZWUpXFxuIDY4MzpcXHR7XFxuIDY4NDpcXHRcXHRpZiAobnNfdHJlZSlcXG4gNjg1OlxcdFxcdFxcdHJldHVybiBcXHUwMDI2bnMtXFx1MDAzZW5zX3RyZWVfbm9kZS5uc19saXN0X2VudHJ5ID09IGhlYWQ7XFxuIDY4NjpcXHRcXHRyZXR1cm4gXFx1MDAyNm5zLVxcdTAwM2Vuc191bmlmaWVkX25vZGUubnNfbGlzdF9lbnRyeSA9PSBoZWFkO1xcbiA2ODc6XFx0fVxcbiA2ODg6XFx0XFxuIDY4OTpcXHRzdGF0aWMgc3NpemVfdCBkb19saXN0bnMoc3RydWN0IGtsaXN0bnMgKmtscylcXG4gNjkwOlxcdHtcXG4gNjkxOlxcdFxcdHU2NCBfX3VzZXIgKm5zX2lkcyA9IGtscy1cXHUwMDNldW5zX2lkcztcXG4gNjkyOlxcdFxcdHNpemVfdCBucl9uc19pZHMgPSBrbHMtXFx1MDAzZW5yX25zX2lkcztcXG4gNjkzOlxcdFxcdHN0cnVjdCBuc19jb21tb24gKm5zLCAqZmlyc3RfbnMgPSBOVUxMLCAqcHJldiA9IE5VTEw7XFxuIDY5NDpcXHRcXHRzdHJ1Y3QgbnNfdHJlZV9yb290ICpuc190cmVlID0gTlVMTDtcXG4gNjk1OlxcdFxcdGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7XFxuIDY5NjpcXHRcXHR1MzIgbnNfdHlwZTtcXG4gNjk3OlxcdFxcdHNzaXplX3QgcmV0O1xcbiA2OTg6XFx0XFxuIDY5OTpcXHRcXHRpZiAoaHdlaWdodDMyKGtscy1cXHUwMDNlbnNfdHlwZSkgPT0gMSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6MzcuMDU5MTQ4MzA2WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTYxMTA2NjYxOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoZSByZXN0IG9mIGBrZXJuZWwvbnN0cmVlLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIG1vZHVsZSdzIGludGVyYWN0aW9uIHdpdGggdGhlIHN5c3RlbSBjYWxscyBhbmQgYW55IG90aGVyIGtleSBmdW5jdGlvbnMuIEknbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBpZGVudGlmeWluZyB0aGUgZW50cnkgcG9pbnRzIHRoYXQgYXJlIHJlbGV2YW50IHRvIG15IGN1cnJlbnQgYW5hbHlzaXMuIFVuZGVyc3RhbmRpbmcgdGhlc2UgZW50cnkgcG9pbnRzIGlzIGNydWNpYWwgZm9yIHRyYWNpbmcgdGhlIGV4ZWN1dGlvbiBmbG93IGFuZCB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgbmFtZXNwYWNlIHRyZWUgaXMgdXRpbGl6ZWQgYnkgdGhlIGtlcm5lbC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODMwMCwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6MzguNjcwMjE4OTg1WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkxODMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9uc3RyZWUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA3MDAsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNzAwOlxcdFxcdFxcdG5zX3R5cGUgPSBrbHMtXFx1MDAzZW5zX3R5cGU7XFxuIDcwMTpcXHRcXHRlbHNlXFxuIDcwMjpcXHRcXHRcXHRuc190eXBlID0gMDtcXG4gNzAzOlxcdFxcbiA3MDQ6XFx0XFx0aWYgKG5zX3R5cGUpIHtcXG4gNzA1OlxcdFxcdFxcdG5zX3RyZWUgPSBuc190cmVlX2Zyb21fdHlwZShuc190eXBlKTtcXG4gNzA2OlxcdFxcdFxcdGlmICghbnNfdHJlZSlcXG4gNzA3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA3MDg6XFx0XFx0fVxcbiA3MDk6XFx0XFxuIDcxMDpcXHRcXHRpZiAoa2xzLVxcdTAwM2VsYXN0X25zX2lkKSB7XFxuIDcxMTpcXHRcXHRcXHRrbHMtXFx1MDAzZWZpcnN0X25zID0gbG9va3VwX25zX2lkX2F0KGtscy1cXHUwMDNlbGFzdF9uc19pZCArIDEsIG5zX3R5cGUpO1xcbiA3MTI6XFx0XFx0XFx0aWYgKCFrbHMtXFx1MDAzZWZpcnN0X25zKVxcbiA3MTM6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuIDcxNDpcXHRcXHRcXHRmaXJzdF9ucyA9IGtscy1cXHUwMDNlZmlyc3RfbnM7XFxuIDcxNTpcXHRcXHR9XFxuIDcxNjpcXHRcXG4gNzE3OlxcdFxcdHJldCA9IDA7XFxuIDcxODpcXHRcXHRpZiAobnNfdHJlZSlcXG4gNzE5OlxcdFxcdFxcdGhlYWQgPSBcXHUwMDI2bnNfdHJlZS1cXHUwMDNlbnNfbGlzdF9oZWFkO1xcbiA3MjA6XFx0XFx0ZWxzZVxcbiA3MjE6XFx0XFx0XFx0aGVhZCA9IFxcdTAwMjZuc191bmlmaWVkX3Jvb3QubnNfbGlzdF9oZWFkO1xcbiA3MjI6XFx0XFxuIDcyMzpcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIDcyNDpcXHRcXG4gNzI1OlxcdFxcdGlmICghZmlyc3RfbnMpXFxuIDcyNjpcXHRcXHRcXHRmaXJzdF9ucyA9IGZpcnN0X25zX2NvbW1vbihoZWFkLCBuc190cmVlKTtcXG4gNzI3OlxcdFxcbiA3Mjg6XFx0XFx0Zm9yIChucyA9IGZpcnN0X25zOyAhbnNfY29tbW9uX2lzX2hlYWQobnMsIGhlYWQsIG5zX3RyZWUpIFxcdTAwMjZcXHUwMDI2IG5yX25zX2lkcztcXG4gNzI5OlxcdFxcdCAgICAgbnMgPSBuZXh0X25zX2NvbW1vbihucywgbnNfdHJlZSkpIHtcXG4gNzMwOlxcdFxcdFxcdHN0cnVjdCBuc19jb21tb24gKnZhbGlkO1xcbiA3MzE6XFx0XFxuIDczMjpcXHRcXHRcXHR2YWxpZCA9IGxlZ2l0aW1pemVfbnMoa2xzLCBucyk7XFxuIDczMzpcXHRcXHRcXHRpZiAoIXZhbGlkKVxcbiA3MzQ6XFx0XFx0XFx0XFx0Y29udGludWU7XFxuIDczNTpcXHRcXG4gNzM2OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiA3Mzc6XFx0XFxuIDczODpcXHRcXHRcXHRuc19wdXQocHJldik7XFxuIDczOTpcXHRcXHRcXHRwcmV2ID0gdmFsaWQ7XFxuIDc0MDpcXHRcXG4gNzQxOlxcdFxcdFxcdGlmIChwdXRfdXNlcih2YWxpZC1cXHUwMDNlbnNfaWQsIG5zX2lkcyArIHJldCkpIHtcXG4gNzQyOlxcdFxcdFxcdFxcdG5zX3B1dChwcmV2KTtcXG4gNzQzOlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiA3NDQ6XFx0XFx0XFx0fVxcbiA3NDU6XFx0XFxuIDc0NjpcXHRcXHRcXHRucl9uc19pZHMtLTtcXG4gNzQ3OlxcdFxcdFxcdHJldCsrO1xcbiA3NDg6XFx0XFxuIDc0OTpcXHRcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIDc1MDpcXHRcXHR9XFxuIDc1MTpcXHRcXG4gNzUyOlxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiA3NTM6XFx0XFx0bnNfcHV0KHByZXYpO1xcbiA3NTQ6XFx0XFx0cmV0dXJuIHJldDtcXG4gNzU1OlxcdH1cXG4gNzU2OlxcdFxcbiA3NTc6XFx0U1lTQ0FMTF9ERUZJTkU0KGxpc3RucywgY29uc3Qgc3RydWN0IG5zX2lkX3JlcSBfX3VzZXIgKiwgcmVxLFxcbiA3NTg6XFx0XFx0XFx0dTY0IF9fdXNlciAqLCBuc19pZHMsIHNpemVfdCwgbnJfbnNfaWRzLCB1bnNpZ25lZCBpbnQsIGZsYWdzKVxcbiA3NTk6XFx0e1xcbiA3NjA6XFx0XFx0c3RydWN0IGtsaXN0bnMga2xucyBfX2ZyZWUoa2xpc3Ruc19mcmVlKSA9IHt9O1xcbiA3NjE6XFx0XFx0Y29uc3Qgc2l6ZV90IG1heGNvdW50ID0gMTAwMDAwMDtcXG4gNzYyOlxcdFxcdHN0cnVjdCBuc19pZF9yZXEga3JlcTtcXG4gNzYzOlxcdFxcdHNzaXplX3QgcmV0O1xcbiA3NjQ6XFx0XFxuIDc2NTpcXHRcXHRpZiAoZmxhZ3MpXFxuIDc2NjpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gNzY3OlxcdFxcbiA3Njg6XFx0XFx0aWYgKHVubGlrZWx5KG5yX25zX2lkcyBcXHUwMDNlIG1heGNvdW50KSlcXG4gNzY5OlxcdFxcdFxcdHJldHVybiAtRU9WRVJGTE9XO1xcbiA3NzA6XFx0XFxuIDc3MTpcXHRcXHRpZiAoIWFjY2Vzc19vayhuc19pZHMsIG5yX25zX2lkcyAqIHNpemVvZigqbnNfaWRzKSkpXFxuIDc3MjpcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gNzczOlxcdFxcbiA3NzQ6XFx0XFx0cmV0ID0gY29weV9uc19pZF9yZXEocmVxLCBcXHUwMDI2a3JlcSk7XFxuIDc3NTpcXHRcXHRpZiAocmV0KVxcbiA3NzY6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gNzc3OlxcdFxcbiA3Nzg6XFx0XFx0cmV0ID0gcHJlcGFyZV9rbGlzdG5zKFxcdTAwMjZrbG5zLCBcXHUwMDI2a3JlcSwgbnNfaWRzLCBucl9uc19pZHMpO1xcbiA3Nzk6XFx0XFx0aWYgKHJldClcXG4gNzgwOlxcdFxcdFxcdHJldHVybiByZXQ7XFxuIDc4MTpcXHRcXG4gNzgyOlxcdFxcdGlmIChrcmVxLnVzZXJfbnNfaWQpXFxuIDc4MzpcXHRcXHRcXHRyZXR1cm4gZG9fbGlzdG5zX3VzZXJucyhcXHUwMDI2a2xucyk7XFxuIDc4NDpcXHRcXG4gNzg1OlxcdFxcdHJldHVybiBkb19saXN0bnMoXFx1MDAyNmtsbnMpO1xcbiA3ODY6XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjozOC42NzAzMTM4NDVaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTgzNTk4Njc3MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgQnVpbGQgQ29uZmlndXJhdGlvbiBmb3IgYGtlcm5lbC9uc3RyZWUuY2AqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGluLiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYnVpbGQgcHJvY2VzcyBmb3IgYGtlcm5lbC9uc3RyZWUuY2AuIEknbSBnb2luZyB0byBzdGFydCBieSB0cmFjaW5nIGl0cyBjb21waWxhdGlvbi4gTXkgcHJpbWFyeSBnb2FsIGhlcmUgaXMgdG8gZGV0ZXJtaW5lIHdoaWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvciBkZXBlbmRlbmNpZXMgYXJlICpyZXF1aXJlZCogZm9yIHRoaXMgcGFydGljdWxhciBmaWxlIHRvIGJlIHN1Y2Nlc3NmdWxseSBidWlsdC4gSXMgaXQgcGFydCBvZiBhIHNwZWNpZmljIHN1YnN5c3RlbSwgb3IgaXMgaXQgbW9yZSBicm9hZGx5IGFwcGxpY2FibGU/IFVuZGVyc3RhbmRpbmcgdGhlIGRlcGVuZGVuY2llcyB3aWxsIGFsbG93IG1lIHRvLCBmb3IgZXhhbXBsZSwgdW5kZXJzdGFuZCB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0IGZvciB0aGUgYnVpbGQuIFdoZXJlIGRvZXMgdGhpcyBmaWxlIGZpdCBpbj8gSXMgaXQgbGlua2VkIGR5bmFtaWNhbGx5IG9yIHN0YXRpY2FsbHksIGFuZCBob3cgZG9lcyB0aGF0IGFmZmVjdCB0aGUgbmVlZGVkIGNvbmZpZ3VyYXRpb25zPyBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBpdHMgaW50ZWdyYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk2NTAsIk91dHB1dFRva2VucyI6MTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA2OjQwLjUwNjMwNDI4OFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUyNzY5MTE2MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuc3RyZWVcXFxcLm9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL01ha2VmaWxlPTY9b2JqLXkgICAgID0gZm9yay5vIGV4ZWNfZG9tYWluLm8gZXhlY19zdGF0ZS5vIHBhbmljLm8gXFxcXFxcbi0tXFxua2VybmVsL01ha2VmaWxlLTEwLVxcdCAgICBleHRhYmxlLm8gcGFyYW1zLm8gXFxcXFxcbmtlcm5lbC9NYWtlZmlsZToxMTpcXHQgICAga3RocmVhZC5vIHN5c19uaS5vIG5zcHJveHkubyBuc3RyZWUubyBuc2NvbW1vbi5vIFxcXFxcXG5rZXJuZWwvTWFrZWZpbGUtMTItXFx0ICAgIG5vdGlmaWVyLm8ga3N5c2ZzLm8gY3JlZC5vIHJlYm9vdC5vIFxcXFxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6NDMuMDM0MDAwNjQ4WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5MDMzMTg4MTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqSW52ZXN0aWdhdGluZyB0aGUgYG5zdHJlZS5vYCBPYmplY3QgRmlsZSoqXG5cbk9rYXksIHNvIGBuc3RyZWUub2AgaXMgZGVmaW5pdGVseSBjb21waWxlZCBhbmQgbGlua2VkIGludG8gdGhlIGtlcm5lbCwgc3BlY2lmaWNhbGx5IHJlc2lkaW5nIHdpdGhpbiBgb2JqLXlgIGluIHRoZSBga2VybmVsL01ha2VmaWxlYC4gVGhhdCdzIHRoZSBzdGFydGluZyBwb2ludC4gTXkgbmV4dCBtb3ZlIGlzIHRvIGNoZWNrIGZvciBhbnkgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zLiBJIG5lZWQgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgS2NvbmZpZyBlbnRyaWVzIHJlbGF0ZWQgdG8gXCJsaXN0bnMsXCIgXCJuc3RyZWUsXCIgb3IgcGVyaGFwcyBldmVuIFwibmFtZXNwYWNlc1wiIGluIGdlbmVyYWwuIFRob3NlIGFyZSB0aGUgb2J2aW91cyBsZWFkcy4gQWZ0ZXIgdGhhdCwgSSB3aWxsIG1vdmUgdG8gdGhlIHNvdXJjZSBjb2RlIGl0c2VsZiB0byBpbnNwZWN0IHRoZSBpbXBsZW1lbnRhdGlvbi4gSSdsbCBuZWVkIHRvIGRpZyBpbnRvIHRoZSBga2VybmVsL25zdHJlZS5jYCBmaWxlLCBhbmQgcHJvYmFibHkgYWxzbyB0YWtlIGEgbG9vayBhdCBgaW5jbHVkZS9saW51eC9uc3RyZWUuaGAgdG8gc2VlIGhvdyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGFuZCB3aGF0IHRoZSBwdWJsaWMgaW50ZXJmYWNlIGxvb2tzIGxpa2UuIFRoYXQgd2lsbCBwcm92aWRlIGluc2lnaHQgaW50byBob3cgdGhpcyB0aGluZyBpcyBhY3R1YWxseSBiZWluZyB1c2VkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5OTY2LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6NDQuOTM3MzIzMjc2WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExMjg0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbnN0cmVlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDgwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNDgwOlxcdFxcdFxcdFxcdHJldCA9IG5zO1xcbiA0ODE6XFx0XFx0XFx0XFx0aWYgKG5zX2lkID09IG5zLVxcdTAwM2Vuc19pZClcXG4gNDgyOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA0ODM6XFx0XFx0XFx0XFx0bm9kZSA9IG5vZGUtXFx1MDAzZXJiX2xlZnQ7XFxuIDQ4NDpcXHRcXHRcXHR9IGVsc2Uge1xcbiA0ODU6XFx0XFx0XFx0XFx0bm9kZSA9IG5vZGUtXFx1MDAzZXJiX3JpZ2h0O1xcbiA0ODY6XFx0XFx0XFx0fVxcbiA0ODc6XFx0XFx0fVxcbiA0ODg6XFx0XFxuIDQ4OTpcXHRcXHRpZiAocmV0KVxcbiA0OTA6XFx0XFx0XFx0cmV0ID0gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShyZXQpO1xcbiA0OTE6XFx0XFx0cmV0dXJuIHJldDtcXG4gNDkyOlxcdH1cXG4gNDkzOlxcdFxcbiA0OTQ6XFx0c3RhdGljIHN0cnVjdCBuc19jb21tb24gKmxvb2t1cF9uc19pZCh1NjQgbW50X25zX2lkLCBpbnQgbnNfdHlwZSlcXG4gNDk1OlxcdHtcXG4gNDk2OlxcdFxcdHN0cnVjdCBuc19jb21tb24gKm5zO1xcbiA0OTc6XFx0XFxuIDQ5ODpcXHRcXHRndWFyZChyY3UpKCk7XFxuIDQ5OTpcXHRcXHRucyA9IG5zX3RyZWVfbG9va3VwX3JjdShtbnRfbnNfaWQsIG5zX3R5cGUpO1xcbiA1MDA6XFx0XFx0aWYgKCFucylcXG4gNTAxOlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiA1MDI6XFx0XFxuIDUwMzpcXHRcXHRpZiAoIW5zX2dldF91bmxlc3NfaW5hY3RpdmUobnMpKVxcbiA1MDQ6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDUwNTpcXHRcXG4gNTA2OlxcdFxcdHJldHVybiBucztcXG4gNTA3OlxcdH1cXG4gNTA4OlxcdFxcbiA1MDk6XFx0c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBuc19yZXF1ZXN0ZWQoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcXG4gNTEwOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUxMTpcXHR7XFxuIDUxMjpcXHRcXHRyZXR1cm4gIWtscy1cXHUwMDNlbnNfdHlwZSB8fCAoa2xzLVxcdTAwM2Vuc190eXBlIFxcdTAwMjYgbnMtXFx1MDAzZW5zX3R5cGUpO1xcbiA1MTM6XFx0fVxcbiA1MTQ6XFx0XFxuIDUxNTpcXHRzdGF0aWMgaW5saW5lIGJvb2wgX19tdXN0X2NoZWNrIG1heV9saXN0X25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXFxuIDUxNjpcXHRcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUxNzpcXHR7XFxuIDUxODpcXHRcXHRpZiAoa2xzLVxcdTAwM2V1c2VyX25zIFxcdTAwMjZcXHUwMDI2IGtscy1cXHUwMDNldXNlcm5zX2NhcGFibGUpXFxuIDUxOTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTIwOlxcdFxcdGlmIChpc19jdXJyZW50X25hbWVzcGFjZShucykpXFxuIDUyMTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTIyOlxcdFxcdHJldHVybiBtYXlfc2VlX2FsbF9uYW1lc3BhY2VzKCk7XFxuIDUyMzpcXHR9XFxuIDUyNDpcXHRcXG4gNTI1OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBuc19wdXQoc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUyNjpcXHR7XFxuIDUyNzpcXHRcXHRpZiAobnMgXFx1MDAyNlxcdTAwMjYgbnMtXFx1MDAzZW9wcylcXG4gNTI4OlxcdFxcdFxcdG5zLVxcdTAwM2VvcHMtXFx1MDAzZXB1dChucyk7XFxuIDUyOTpcXHR9XFxuIDUzMDpcXHRcXG4gNTMxOlxcdERFRklORV9GUkVFKG5zX3B1dCwgc3RydWN0IG5zX2NvbW1vbiAqLCBpZiAoIUlTX0VSUl9PUl9OVUxMKF9UKSkgbnNfcHV0KF9UKSlcXG4gNTMyOlxcdFxcbiA1MzM6XFx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxcbiA1MzQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxcbiA1MzU6XFx0e1xcbiA1MzY6XFx0XFx0aWYgKCFuc19yZXF1ZXN0ZWQoa2xzLCBjYW5kaWRhdGUpKVxcbiA1Mzc6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDUzODpcXHRcXG4gNTM5OlxcdFxcdGlmICghbWF5X2xpc3RfbnMoa2xzLCBjYW5kaWRhdGUpKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjo0NC45Mzc0Mzc4OTZaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzY4Mjg3MTAxMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGBsZWdpdGltaXplX25zYCBDaGFuZ2UqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBzZWUgdGhlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbiBgbGVnaXRpbWl6ZV9uc2AgYW5kIHRoZSByYXRpb25hbGUgZm9yIHRoZSBwYXRjaC4gTG9va2luZyBhdCB0aGUgY29kZSwgcHJldmlvdXNseSwgdGhlIGZ1bmN0aW9uIGhhZCBhIHNwZWNpZmljIGZsb3cuIEl0IGZpcnN0IGF0dGVtcHRlZCB0byBhY3F1aXJlIGEgcmVmZXJlbmNlIHVzaW5nIGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSlgLCBhbmQgdGhlbiwgY29uZGl0aW9uYWxseSwgaXQgY2hlY2tlZCBgbWF5X2xpc3RfbnMoa2xzLCBucylgLiBJZiBgbWF5X2xpc3RfbnNgIGZhaWxlZCwgdGhlIGNvZGUgd291bGQgcmVsZWFzZSB0aGF0IHJlZmVyZW5jZS4gTm93LCB0aGUgbG9naWMgaXMgZGlmZmVyZW50LiBUaGUgY3JpdGljYWwgY2hhbmdlIGlzIHRoZSByZW9yZGVyaW5nIG9mIG9wZXJhdGlvbnMuIEl0IG5vdyBjaGVja3MgYG1heV9saXN0X25zKGtscywgY2FuZGlkYXRlKWAgKmJlZm9yZSogdGFraW5nIHRoZSByZWZlcmVuY2UgdmlhIGBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSlgLiBTbywgcmF0aGVyIHRoYW4gaW5jcmVtZW50aW5nIGEgcmVmZXJlbmNlIGFuZCBwb3RlbnRpYWxseSByZWxlYXNpbmcgaXQsIHRoZSBuZXcgZmxvdyBhdm9pZHMgaW5jcmVtZW50aW5nIGlmIHRoZSBsaXN0IGNoZWNrIHdvdWxkIHJlamVjdCB0aGUgbmFtZXNwYWNlLlxuXG5UaGUga2V5IGlzIGBtYXlfbGlzdF9uc2AuIExvb2tpbmcgYXQgdGhhdCBmdW5jdGlvbiwgaXQncyBwcmV0dHkgY2xlYXIuIEl0IGNoZWNrcyBpZiB0aGUgYGtsc2AgaGFzIGEgdXNlciBuYW1lc3BhY2UgYW5kIHRoZSB1c2VyIG5hbWVzcGFjZSBoYXMgdGhlIHByb3BlciBjYXBhYmlsaXRpZXMuIElmIHNvLCBpdCByZXR1cm5zIHRydWUsIGluZGljYXRpbmcgdGhhdCB0aGUgbmFtZXNwYWNlIGNhbiBiZSBsaXN0ZWQuIEl0IGFsc28gYWxsb3dzIGxpc3RpbmcgaWYgdGhlIHByb3ZpZGVkIG5hbWVzcGFjZSBpcyB0aGUgY3VycmVudCBuYW1lc3BhY2UsIHVzaW5nIHRoZSBmdW5jdGlvbiBgaXNfY3VycmVudF9uYW1lc3BhY2UobnMpYC4gTGFzdGx5LCBpZiB0aGUgZW52aXJvbm1lbnQgYWxsb3dzIHNlZWluZyBhbGwgbmFtZXNwYWNlcywgaXQgcmV0dXJucyB0cnVlLlxuXG5TbywgaW4gZXNzZW5jZSwgdGhlIHBhdGNoIG9wdGltaXplZCB0aGlzIGZ1bmN0aW9uIHRvIGNoZWNrIHBlcm1pc3Npb25zICpiZWZvcmUqIGFjcXVpcmluZyB0aGUgcmVmZXJlbmNlLiBJIG5vdyBuZWVkIHRvIGRpdmUgaW50byBgaXNfY3VycmVudF9uYW1lc3BhY2VgIHRvIGZ1bGx5IGFzc2VzcyB0aGUgY29uc2VxdWVuY2VzIG9mIHRoaXMgY2hhbmdlLCBhbmQgaG93IGl0IGFsaWducyB3aXRoIHRoZSBvdmVyYWxsIGRlc2lnbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEwODAsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0ODYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjo0OC42MjAzMTIyNTlaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MjE1MDYxMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaXNfY3VycmVudF9uYW1lc3BhY2VcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvbnNmcy5jPTQ1Nj1zdGF0aWMgaW50IG5zZnNfZW5jb2RlX2ZoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqZmgsIGludCAqbWF4X2xlbixcXG4tLVxcbmZzL25zZnMuYy00NzgtXFxuZnMvbnNmcy5jOjQ3OTpib29sIGlzX2N1cnJlbnRfbmFtZXNwYWNlKHN0cnVjdCBuc19jb21tb24gKm5zKVxcbmZzL25zZnMuYy00ODAte1xcbi0tXFxuaW5jbHVkZS9saW51eC9uc19jb21tb24uaC0xMC1cXG5pbmNsdWRlL2xpbnV4L25zX2NvbW1vbi5oOjExOmJvb2wgaXNfY3VycmVudF9uYW1lc3BhY2Uoc3RydWN0IG5zX2NvbW1vbiAqbnMpO1xcbmluY2x1ZGUvbGludXgvbnNfY29tbW9uLmgtMTItaW50IF9fbnNfY29tbW9uX2luaXQoc3RydWN0IG5zX2NvbW1vbiAqbnMsIHUzMiBuc190eXBlLCBjb25zdCBzdHJ1Y3QgcHJvY19uc19vcGVyYXRpb25zICpvcHMsIGludCBpbnVtKTtcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYz01MTU9c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBtYXlfbGlzdF9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxcbi0tXFxua2VybmVsL25zdHJlZS5jLTUxOS1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG5rZXJuZWwvbnN0cmVlLmM6NTIwOlxcdGlmIChpc19jdXJyZW50X25hbWVzcGFjZShucykpXFxua2VybmVsL25zdHJlZS5jLTUyMS1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6NTAuMzQxODI1MTM5WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5ODM1NzgyNDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBJJ20gdGhpbmtpbmcgYWJvdXQgYGZzL25zZnMuY2AsIHNwZWNpZmljYWxseSBhcm91bmQgbGluZSA0NzkuIFRoaXMgbGlrZWx5IHJlbGF0ZXMgdG8gc29tZSBhc3BlY3Qgb2YgdGhlIG5hbWVzcGFjZSBmaWxlIHN5c3RlbSBpbXBsZW1lbnRhdGlvbi4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJJ20gYWxyZWFkeSBhbnRpY2lwYXRpbmcgd2hhdCB0aGF0IGFyZWEgbWlnaHQgY292ZXIuIElzIGl0IHJlbGF0ZWQgdG8gaW5vZGUgYWxsb2NhdGlvbiwgcGVybWlzc2lvbiBjaGVja2luZywgbW91bnQgb3BlcmF0aW9ucywgb3IgcGVyaGFwcyBzb21lIGludGVyYWN0aW9uIHdpdGggdGhlIHZpcnR1YWwgZmlsZXN5c3RlbSBsYXllcj8gSSdsbCBwcm9iYWJseSBzdGFydCBzY2FubmluZyBmb3IgZnVuY3Rpb24gY2FsbHMgb3IgY29uZGl0aW9uYWwgc3RhdGVtZW50cyB0aGVyZSBhbmQgdHJ5IHRvIHVuZGVyc3RhbmQgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQuIEl0IGNvdWxkIGJlIGEgY3J1Y2lhbCBwaWVjZSBvZiB0aGUgcHV6emxlIEknbSB0cnlpbmcgdG8gc29sdmUsIG9yIGl0IGNvdWxkIGp1c3QgcHJvdmlkZSBzb21lIHVzZWZ1bCBjb250ZXh0LiBMZXQgbWUgZXhhbWluZSB0aGUgY29kZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTIyMjAsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjo1Mi4zMjU0MDYyOTFaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA2MTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL25zZnMuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA0NzAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA0NzA6XFx0XFx0XFx0Km1heF9sZW4gPSBOU0ZTX0ZJRF9TSVpFX1UzMl9MQVRFU1Q7XFxuIDQ3MTpcXHRcXHR9XFxuIDQ3MjpcXHRcXG4gNDczOlxcdFxcdGZpZC1cXHUwMDNlbnNfaWRcXHQ9IG5zLVxcdTAwM2Vuc19pZDtcXG4gNDc0OlxcdFxcdGZpZC1cXHUwMDNlbnNfdHlwZVxcdD0gbnMtXFx1MDAzZW5zX3R5cGU7XFxuIDQ3NTpcXHRcXHRmaWQtXFx1MDAzZW5zX2ludW1cXHQ9IGlub2RlLVxcdTAwM2VpX2lubztcXG4gNDc2OlxcdFxcdHJldHVybiBGSUxFSURfTlNGUztcXG4gNDc3OlxcdH1cXG4gNDc4OlxcdFxcbiA0Nzk6XFx0Ym9vbCBpc19jdXJyZW50X25hbWVzcGFjZShzdHJ1Y3QgbnNfY29tbW9uICpucylcXG4gNDgwOlxcdHtcXG4gNDgxOlxcdFxcdHN3aXRjaCAobnMtXFx1MDAzZW5zX3R5cGUpIHtcXG4gNDgyOlxcdCNpZmRlZiBDT05GSUdfQ0dST1VQU1xcbiA0ODM6XFx0XFx0Y2FzZSBDTE9ORV9ORVdDR1JPVVA6XFxuIDQ4NDpcXHRcXHRcXHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fY2dfbnMobnMpKTtcXG4gNDg1OlxcdCNlbmRpZlxcbiA0ODY6XFx0I2lmZGVmIENPTkZJR19JUENfTlNcXG4gNDg3OlxcdFxcdGNhc2UgQ0xPTkVfTkVXSVBDOlxcbiA0ODg6XFx0XFx0XFx0cmV0dXJuIGN1cnJlbnRfaW5fbmFtZXNwYWNlKHRvX2lwY19ucyhucykpO1xcbiA0ODk6XFx0I2VuZGlmXFxuIDQ5MDpcXHRcXHRjYXNlIENMT05FX05FV05TOlxcbiA0OTE6XFx0XFx0XFx0cmV0dXJuIGN1cnJlbnRfaW5fbmFtZXNwYWNlKHRvX21udF9ucyhucykpO1xcbiA0OTI6XFx0I2lmZGVmIENPTkZJR19ORVRfTlNcXG4gNDkzOlxcdFxcdGNhc2UgQ0xPTkVfTkVXTkVUOlxcbiA0OTQ6XFx0XFx0XFx0cmV0dXJuIGN1cnJlbnRfaW5fbmFtZXNwYWNlKHRvX25ldF9ucyhucykpO1xcbiA0OTU6XFx0I2VuZGlmXFxuIDQ5NjpcXHQjaWZkZWYgQ09ORklHX1BJRF9OU1xcbiA0OTc6XFx0XFx0Y2FzZSBDTE9ORV9ORVdQSUQ6XFxuIDQ5ODpcXHRcXHRcXHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fcGlkX25zKG5zKSk7XFxuIDQ5OTpcXHQjZW5kaWZcXG4gNTAwOlxcdCNpZmRlZiBDT05GSUdfVElNRV9OU1xcbiA1MDE6XFx0XFx0Y2FzZSBDTE9ORV9ORVdUSU1FOlxcbiA1MDI6XFx0XFx0XFx0cmV0dXJuIGN1cnJlbnRfaW5fbmFtZXNwYWNlKHRvX3RpbWVfbnMobnMpKTtcXG4gNTAzOlxcdCNlbmRpZlxcbiA1MDQ6XFx0I2lmZGVmIENPTkZJR19VU0VSX05TXFxuIDUwNTpcXHRcXHRjYXNlIENMT05FX05FV1VTRVI6XFxuIDUwNjpcXHRcXHRcXHRyZXR1cm4gY3VycmVudF9pbl9uYW1lc3BhY2UodG9fdXNlcl9ucyhucykpO1xcbiA1MDc6XFx0I2VuZGlmXFxuIDUwODpcXHQjaWZkZWYgQ09ORklHX1VUU19OU1xcbiA1MDk6XFx0XFx0Y2FzZSBDTE9ORV9ORVdVVFM6XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA2OjUyLjMyNTUxNDg4MVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0NjU0NDk4MTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uOiBgbGlzdG5zYCBhbmQgTmFtZXNwYWNlIExvZ2ljKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBhbmFseXNpcyBpbmRpY2F0ZXMgdGhhdCBgbGVnaXRpbWl6ZV9uc2AgaXMgY2FsbGVkIHdpdGhpbiB0aGUgYGRvX2xpc3Ruc2AgYW5kIGBkb19saXN0bnNfdXNlcm5zYCBmdW5jdGlvbnMuIFRob3NlIGZ1bmN0aW9ucyBvcGVyYXRlIGluc2lkZSBhbiBSQ1UgcmVhZCBsb2NrLCBhbmQgY3J1Y2lhbGx5LCB0aGV5J3JlIHBhcnQgb2YgdGhlIG5hbWVzcGFjZSBpdGVyYXRpb24gcHJvY2Vzcy4gVGhpcyBtZWFucyB3ZSdyZSBkZWFsaW5nIHdpdGggbW9kaWZpY2F0aW9ucyB0byBjb3JlIGtlcm5lbCBhbmQgVkZTIG5hbWVzcGFjZSBsb2dpYywgc3BlY2lmaWNhbGx5IHRyaWdnZXJlZCBieSB0aGUgYGxpc3Ruc2Agc3lzY2FsbC5cblxuVGhlIGtleSBxdWVzdGlvbiBpcyBhbHdheXMgcmVhY2hhYmlsaXR5LiBDYW4gdXNlcnNwYWNlIGNvZGUsIG9yIHRvb2xzIGxpa2Ugc3l6a2FsbGVyLCB0cmlnZ2VyIHRoaXMgY29kZSBwYXRoIGRpcmVjdGx5PyBUaGUgYW5zd2VyIGlzICp5ZXMqLiBUaGUgYGxpc3Ruc2Agc3lzY2FsbCwgb3IgYHN5c19saXN0bnNgLCBwcm92aWRlcyBhIGRpcmVjdCBlbnRyeSBwb2ludC4gVGhpcyBtYWtlcyBpdCBhIHBvdGVudGlhbCB0YXJnZXQuIFRoaXMgZGlyZWN0bHkgdG91Y2hlcyBleGVjdXRhYmxlIGNvZGUgaW4gdGhlIGNvcmUgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgYGtlcm5lbC9uc3RyZWUuY2AuIFRoZXJlZm9yZSwgYFdvcnRoRnV6emluZ2AgaXMgZGVmaW5pdGVseSB0cnVlIGhlcmUuXG5cbk5vdywgZm9yIGBGb2N1c1N5bWJvbHNgLCB3ZSBoYXZlIHRvIHBpbnBvaW50IHRoZSByZWxldmFudCBzeW1ib2xzIHRvIHRhcmdldC5cblxuKiAgIGBsZWdpdGltaXplX25zYCBpcyBgc3RhdGljIGlubGluZWAsIHNvIGl0IHdpbGwgYmUgaW5saW5lZC5cbiogICBgbGVnaXRpbWl6ZV9uc2AgaXMgY2FsbGVkIGluOlxuICAgICogICBgZG9fbGlzdG5zYCAoc3RhdGljKVxuICAgICogICBgZG9fbGlzdG5zX3VzZXJuc2AgKHN0YXRpYylcbiAgICAqICAgYHN5c19saXN0bnNgIC8gYF9fZG9fc3lzX2xpc3Ruc2AgLyBgX19zZV9zeXNfbGlzdG5zYCAoc3lzY2FsbCBlbnRyeSlcblxuR2l2ZW4gdGhpcyBpbmZvcm1hdGlvbiwgbGV0J3MgZXhwbG9yZSB0aGUgc3ltYm9sIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gdGhlIGBsaXN0bnNgIHN5c2NhbGwuIFdlIG5lZWQgdGhlIHNwZWNpZmljIG5hbWVzIG9mIGZ1bmN0aW9ucyBhbmQgdGhlIGV4YWN0IHN5c2NhbGwgbmFtaW5nIGNvbnZlbnRpb24uIEdyZXBwaW5nIGZvciBgbGlzdG5zYCBvciBleGFtaW5pbmcgdGhlIGZpbGUgYXJvdW5kIGxpbmUgNzU3LCBhcyB3ZWxsIGFzIHRoZSBncmVwcGVyLCBzaG93cyB0aGUgZm9sbG93aW5nOlxuXG5gU1lTQ0FMTF9ERUZJTkU0KGxpc3RucywgLi4uKWAgZGVmaW5lcyB0aGUgZm9sbG93aW5nIHN5bWJvbHM6XG4qICAgYF9feDY0X3N5c19saXN0bnNgXG4qICAgYF9fZG9fc3lzX2xpc3Ruc2BcbiogICBgc3lzX2xpc3Ruc2BcbiogICBgZG9fbGlzdG5zYFxuKiAgIGBkb19saXN0bnNfdXNlcm5zYFxuXG5FdmVuIHRob3VnaCBgZG9fbGlzdG5zYCBhbmQgYGRvX2xpc3Ruc191c2VybnNgIGFyZSBzdGF0aWMsIHdlIHNob3VsZCBzdGlsbCBjb25zaWRlciBmdXp6aW5nIGBfX2RvX3N5c19saXN0bnNgLCBgZG9fbGlzdG5zYCwgYGRvX2xpc3Ruc191c2VybnNgLiBNeSBuZXh0IHN0ZXAgaXMgdG8gdXNlIGdyZXBwZXIgdG8gZXhhbWluZSB0aGUgYGtlcm5lbC9uc3RyZWUuY2AgZmlsZSBhbmQgdW5kZXJzdGFuZCB0aGUgc3ltYm9sIGRlZmluaXRpb25zIGJldHRlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMwMTUsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MjEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNjo1Ni45ODAwMTYzMVoiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTExNDU0OTYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiKGRvX2xpc3Ruc3xsaXN0bnMpXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9uc3RyZWUuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvbnN0cmVlLmM9MzkyPXU2NCBfX25zX3RyZWVfZ2VuX2lkKHN0cnVjdCBuc19jb21tb24gKm5zLCB1NjQgaWQpXFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNDAyLVxcbmtlcm5lbC9uc3RyZWUuYzo0MDM6c3RydWN0IGtsaXN0bnMge1xcbmtlcm5lbC9uc3RyZWUuYy00MDQtXFx0dTY0IF9fdXNlciAqdW5zX2lkcztcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYy00MTMtXFxua2VybmVsL25zdHJlZS5jOjQxNDpzdGF0aWMgdm9pZCBfX2ZyZWVfa2xpc3Ruc19mcmVlKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMpXFxua2VybmVsL25zdHJlZS5jLTQxNS17XFxuLS1cXG5rZXJuZWwvbnN0cmVlLmM9NDI0PXN0YXRpYyBpbnQgY29weV9uc19pZF9yZXEoY29uc3Qgc3RydWN0IG5zX2lkX3JlcSBfX3VzZXIgKnJlcSxcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYy00NDktXFxua2VybmVsL25zdHJlZS5jOjQ1MDpzdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX2tsaXN0bnMoc3RydWN0IGtsaXN0bnMgKmtscywgc3RydWN0IG5zX2lkX3JlcSAqa3JlcSxcXG5rZXJuZWwvbnN0cmVlLmMtNDUxLVxcdFxcdFxcdFxcdCAgdTY0IF9fdXNlciAqbnNfaWRzLCBzaXplX3QgbnJfbnNfaWRzKVxcbi0tXFxua2VybmVsL25zdHJlZS5jPTQ5ND1zdGF0aWMgc3RydWN0IG5zX2NvbW1vbiAqbG9va3VwX25zX2lkKHU2NCBtbnRfbnNfaWQsIGludCBuc190eXBlKVxcbi0tXFxua2VybmVsL25zdHJlZS5jLTUwOC1cXG5rZXJuZWwvbnN0cmVlLmM6NTA5OnN0YXRpYyBpbmxpbmUgYm9vbCBfX211c3RfY2hlY2sgbnNfcmVxdWVzdGVkKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXFxua2VybmVsL25zdHJlZS5jLTUxMC1cXHRcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBuc19jb21tb24gKm5zKVxcbi0tXFxua2VybmVsL25zdHJlZS5jLTUxNC1cXG5rZXJuZWwvbnN0cmVlLmM6NTE1OnN0YXRpYyBpbmxpbmUgYm9vbCBfX211c3RfY2hlY2sgbWF5X2xpc3RfbnMoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcXG5rZXJuZWwvbnN0cmVlLmMtNTE2LVxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgbnNfY29tbW9uICpucylcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYz01MzE9REVGSU5FX0ZSRUUobnNfcHV0LCBzdHJ1Y3QgbnNfY29tbW9uICosIGlmICghSVNfRVJSX09SX05VTEwoX1QpKSBuc19wdXQoX1QpKVxcbmtlcm5lbC9uc3RyZWUuYy01MzItXFxua2VybmVsL25zdHJlZS5jOjUzMzpzdGF0aWMgaW5saW5lIHN0cnVjdCBuc19jb21tb24gKl9fbXVzdF9jaGVjayBsZWdpdGltaXplX25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXFxua2VybmVsL25zdHJlZS5jLTUzNC1cXHRcXHRcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgbnNfY29tbW9uICpjYW5kaWRhdGUpXFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNTQ0LVxcbmtlcm5lbC9uc3RyZWUuYzo1NDU6c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zX3VzZXJucyhzdHJ1Y3Qga2xpc3RucyAqa2xzKVxcbmtlcm5lbC9uc3RyZWUuYy01NDYte1xcbi0tXFxua2VybmVsL25zdHJlZS5jPTY4MD1zdGF0aWMgaW5saW5lIGJvb2wgbnNfY29tbW9uX2lzX2hlYWQoc3RydWN0IG5zX2NvbW1vbiAqbnMsXFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNjg4LVxcbmtlcm5lbC9uc3RyZWUuYzo2ODk6c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zKHN0cnVjdCBrbGlzdG5zICprbHMpXFxua2VybmVsL25zdHJlZS5jLTY5MC17XFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNzU2LVxcbmtlcm5lbC9uc3RyZWUuYzo3NTc6U1lTQ0FMTF9ERUZJTkU0KGxpc3RucywgY29uc3Qgc3RydWN0IG5zX2lkX3JlcSBfX3VzZXIgKiwgcmVxLFxcbmtlcm5lbC9uc3RyZWUuYy03NTgtXFx0XFx0dTY0IF9fdXNlciAqLCBuc19pZHMsIHNpemVfdCwgbnJfbnNfaWRzLCB1bnNpZ25lZCBpbnQsIGZsYWdzKVxcbmtlcm5lbC9uc3RyZWUuYy03NTkte1xcbmtlcm5lbC9uc3RyZWUuYzo3NjA6XFx0c3RydWN0IGtsaXN0bnMga2xucyBfX2ZyZWUoa2xpc3Ruc19mcmVlKSA9IHt9O1xcbmtlcm5lbC9uc3RyZWUuYy03NjEtXFx0Y29uc3Qgc2l6ZV90IG1heGNvdW50ID0gMTAwMDAwMDtcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYy03NzctXFxua2VybmVsL25zdHJlZS5jOjc3ODpcXHRyZXQgPSBwcmVwYXJlX2tsaXN0bnMoXFx1MDAyNmtsbnMsIFxcdTAwMjZrcmVxLCBuc19pZHMsIG5yX25zX2lkcyk7XFxua2VybmVsL25zdHJlZS5jLTc3OS1cXHRpZiAocmV0KVxcbi0tXFxua2VybmVsL25zdHJlZS5jLTc4Mi1cXHRpZiAoa3JlcS51c2VyX25zX2lkKVxcbmtlcm5lbC9uc3RyZWUuYzo3ODM6XFx0XFx0cmV0dXJuIGRvX2xpc3Ruc191c2VybnMoXFx1MDAyNmtsbnMpO1xcbmtlcm5lbC9uc3RyZWUuYy03ODQtXFxua2VybmVsL25zdHJlZS5jOjc4NTpcXHRyZXR1cm4gZG9fbGlzdG5zKFxcdTAwMjZrbG5zKTtcXG5rZXJuZWwvbnN0cmVlLmMtNzg2LX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDY6NTcuMDMxMTY4ODM2WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjYxOTU2NDQ3NTYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkNvbmZpZ3VyYXRpb24gSW52ZXN0aWdhdGlvbioqXG5cbk9rYXksIHNvIGJlZm9yZSBJIGRpdmUgaW4sIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBoYXZlbid0IG1pc3NlZCBhbnkgY3J1Y2lhbCBjb25maWd1cmF0aW9uIGRldGFpbHMuIEZpcnN0LCBJJ20gdGhpbmtpbmcgSSBzaG91bGQgaW52ZXN0aWdhdGUgcG90ZW50aWFsIGRlcGVuZGVuY2llcyBvbiBjb25maWd1cmF0aW9ucyB0aGF0IG1heSBiZSBuZWNlc3NhcnkuIEknbSBnb2luZyB0byBsb29rIGF0IGhvdyBgTkFNRVNQQUNFU2Agb3IgYFVTRVJfTlNgIGFyZSBoYW5kbGVkIHdpdGhpbiB0aGUgYnVpbGQgc3lzdGVtLiBJcyBgbnN0cmVlLm9gIGFsd2F5cyBidWlsdCwgb3IgZG9lcyBpdCBoaW5nZSBvbiBvbmUgb2YgdGhvc2UgY29uZmlndXJhdGlvbiBvcHRpb25zPyBJJ2xsIHByb2JhYmx5IHN0YXJ0IGJ5IGNoZWNraW5nIGZvciB0aG9zZSB2YXJpYWJsZXMsIGJlY2F1c2UgdGhhdCBzZWVtcyBsaWtlIHRoZSBuYXR1cmFsIHN0YXJ0aW5nIHBvaW50LiBUbyBwaW5wb2ludCB0aGUgZXhhY3QgYnVpbGQgc2V0dXAsIEkgc2hvdWxkIGNoZWNrIHRoZSBgaW5pdC9LY29uZmlnYCBmaWxlLCBvciBwZXJoYXBzIHRoZSBga2VybmVsL01ha2VmaWxlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTUxNTQsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowNzo1OC45ODc2MjAxNDlaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyMjA3NzcwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJOQU1FU1BBQ0VTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluaXQvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbml0L0tjb25maWc9MTQwNz1lbmRpZiAjIENHUk9VUFNcXG5pbml0L0tjb25maWctMTQwOC1cXG5pbml0L0tjb25maWc6MTQwOTptZW51Y29uZmlnIE5BTUVTUEFDRVNcXG5pbml0L0tjb25maWctMTQxMC1cXHRib29sIFxcXCJOYW1lc3BhY2VzIHN1cHBvcnRcXFwiIGlmIEVYUEVSVFxcbi0tXFxuaW5pdC9LY29uZmlnLTE0MTgtXFxuaW5pdC9LY29uZmlnOjE0MTk6aWYgTkFNRVNQQUNFU1xcbmluaXQvS2NvbmZpZy0xNDIwLVxcbi0tXFxuaW5pdC9LY29uZmlnPTE0Njg9Y29uZmlnIE5FVF9OU1xcbi0tXFxuaW5pdC9LY29uZmlnLTE0NzUtXFxuaW5pdC9LY29uZmlnOjE0NzY6ZW5kaWYgIyBOQU1FU1BBQ0VTXFxuaW5pdC9LY29uZmlnLTE0NzctXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA3OjU5LjQwOTcwNjQ3OFoiLCJTZXEiOjIzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDYyNDQzODE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgdGhlIEJ1aWxkIFByb2Nlc3MgZm9yIGBsaXN0bnNgKipcblxuT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2h5IGBsaXN0bnNgIGlzIGJlaGF2aW5nIHRoaXMgd2F5LCBhbmQgSSBzdXNwZWN0IGl0J3MgcmVsYXRlZCB0byB0aGUgYnVpbGQgY29uZmlndXJhdGlvbi4gTXkgZmlyc3QgdGhvdWdodCBpcyB0byBjaGVjayB0aGUgYGtlcm5lbC9NYWtlZmlsZWAgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDExIHRvIHNlZSBob3cgYG5zdHJlZS5vYCBpcyBiZWluZyBoYW5kbGVkLiBSaWdodCwgYG5zdHJlZS5vYCBpcyB1bmNvbmRpdGlvbmFsbHkgY29tcGlsZWQgKGBvYmoteWApLCB3aGljaCBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhpcyBtb2R1bGUncyBpbmNsdXNpb24gZGVwZW5kcyBvbiBhbnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMuIEknbGwgbmVlZCB0byBjaGVjayBpZiBlaXRoZXIgYENPTkZJR19OQU1FU1BBQ0VTYCBvciBgQ09ORklHX1VTRVJfTlNgIGFyZSBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgZm9yIGBsaXN0bnNgLiBMZXQncyBsb29rIGF0IGBpbml0L0tjb25maWdgIHRvIHNlZSBob3cgYE5BTUVTUEFDRVNgIGlzIGNvbmZpZ3VyZWQuIFRoZW4sIEkgc2hvdWxkIHByb2JhYmx5IGFsc28gZGVsdmUgaW50byBga2VybmVsL25zdHJlZS5jYCB0byBzZWUgaG93IHRoZSBjb2RlIGl0c2VsZiBsZXZlcmFnZXMgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiwgaWYgYXQgYWxsLiBUaGF0IHNob3VsZCBjbGFyaWZ5IHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBmbG93LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTU1NywiT3V0cHV0VG9rZW5zIjoyOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjk4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA4OjAxLjg3MjE1Mzg1NFoiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk5MjQ5MTYsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkNPTkZJR19cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL25zdHJlZS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODowMS45MjIwODYzWiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI5NjI3Njg2MTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRXhhbWluaW5nIHRoZSBLZXJuZWwgTmFtZXNwYWNlIENvZGUqKlxuXG5Pa2F5LCBzbyBJJ20gZGl2aW5nIGludG8gYGtlcm5lbC9uc3RyZWUuY2AgYW5kIGltbWVkaWF0ZWx5IG5vdGljaW5nIHNvbWV0aGluZyBpbnRlcmVzdGluZzogbm8gZGlyZWN0IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGJhc2VkIG9uIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIFRoaXMgaXMgYSBjb21tb24gcGF0dGVybiwgYW5kIEknbSBub3Qgc3VycHJpc2VkLCBidXQgaXQgc3RpbGwgd2FycmFudHMgYSBjaGVjay4gSXQgc2VlbXMgdGhlIGRlcGVuZGVuY2llcyBhcmUgbGlrZWx5IHB1bGxlZCBpbiB0aHJvdWdoIGluY2x1ZGVkIGhlYWRlcnMgbGlrZSBgZnMvbnNmcy5jYCBhbmQgdGhlIGBpc19jdXJyZW50X25hbWVzcGFjZWAgZnVuY3Rpb24uXG5cbkhvd2V2ZXIsIEkgYWx3YXlzIGZpbmQgaXQgZ29vZCBwcmFjdGljZSB0byBoYXZlIGF0IGxlYXN0ICpzb21lKiBpbmRpY2F0aW9uIHdpdGhpbiBhIHNvdXJjZSBmaWxlIGl0c2VsZiB0aGF0IGl0cyBiZWhhdmlvciBpcyBnb3Zlcm5lZCBieSBzcGVjaWZpYyBjb25maWd1cmF0aW9ucywgZXZlbiBpZiBpbmRpcmVjdGx5LiBUaGUgdXNlIG9mIGBOQU1FU1BBQ0VTYCBvciBgVVNFUl9OU2AsIG9yIHRoZSBvdmVyYXJjaGluZyBgTkFNRVNQQUNFU2AgY29uZmlndXJhdGlvbiBhcyBhIHdob2xlLCBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIHF1aWNrIGNvZGUgcmV2aWV3cyBhbmQgZGVidWdnaW5nLiBTbywgbGV0J3MgY29uZmlybSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IgYW5kIHZlcmlmeSB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncy5cblxuTGV0J3MgZ28gc3RyYWlnaHQgdG8gYGluaXQvS2NvbmZpZ2AgYW5kIHNlZSBob3cgYENPTkZJR19OQU1FU1BBQ0VTYCBpcyBkZWZpbmVkIGFuZCB3aGF0IGl0IGRlcGVuZHMgb24uIEkgd2FudCB0byB1bmRlcnN0YW5kIHRoZSBjb21wbGV0ZSBwaWN0dXJlIG9mIGhvdyB0aGlzIHNlY3Rpb24gb2YgY29kZSBpcyB0cmVhdGVkIGluIHRoZSBjb25maWd1cmF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTkwNSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODowNC44ODQ4NTk0MTFaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMyOTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluaXQvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNDA4LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNDA4OlxcdFxcbjE0MDk6XFx0bWVudWNvbmZpZyBOQU1FU1BBQ0VTXFxuMTQxMDpcXHRcXHRib29sIFxcXCJOYW1lc3BhY2VzIHN1cHBvcnRcXFwiIGlmIEVYUEVSVFxcbjE0MTE6XFx0XFx0ZGVwZW5kcyBvbiBNVUxUSVVTRVJcXG4xNDEyOlxcdFxcdGRlZmF1bHQgIUVYUEVSVFxcbjE0MTM6XFx0XFx0aGVscFxcbjE0MTQ6XFx0XFx0ICBQcm92aWRlcyB0aGUgd2F5IHRvIG1ha2UgdGFza3Mgd29yayB3aXRoIGRpZmZlcmVudCBvYmplY3RzIHVzaW5nXFxuMTQxNTpcXHRcXHQgIHRoZSBzYW1lIGlkLiBGb3IgZXhhbXBsZSBzYW1lIElQQyBpZCBtYXkgcmVmZXIgdG8gZGlmZmVyZW50IG9iamVjdHNcXG4xNDE2OlxcdFxcdCAgb3Igc2FtZSB1c2VyIGlkIG9yIHBpZCBtYXkgcmVmZXIgdG8gZGlmZmVyZW50IHRhc2tzIHdoZW4gdXNlZCBpblxcbjE0MTc6XFx0XFx0ICBkaWZmZXJlbnQgbmFtZXNwYWNlcy5cXG4xNDE4OlxcdFxcbjE0MTk6XFx0aWYgTkFNRVNQQUNFU1xcbjE0MjA6XFx0XFxuMTQyMTpcXHRjb25maWcgVVRTX05TXFxuMTQyMjpcXHRcXHRib29sIFxcXCJVVFMgbmFtZXNwYWNlXFxcIlxcbjE0MjM6XFx0XFx0ZGVmYXVsdCB5XFxuMTQyNDpcXHRcXHRoZWxwXFxuMTQyNTpcXHRcXHQgIEluIHRoaXMgbmFtZXNwYWNlIHRhc2tzIHNlZSBkaWZmZXJlbnQgaW5mbyBwcm92aWRlZCB3aXRoIHRoZVxcbjE0MjY6XFx0XFx0ICB1bmFtZSgpIHN5c3RlbSBjYWxsXFxuMTQyNzpcXHRcXG4xNDI4OlxcdGNvbmZpZyBUSU1FX05TXFxuMTQyOTpcXHRcXHRib29sIFxcXCJUSU1FIG5hbWVzcGFjZVxcXCJcXG4xNDMwOlxcdFxcdGRlZmF1bHQgeVxcbjE0MzE6XFx0XFx0aGVscFxcbjE0MzI6XFx0XFx0ICBJbiB0aGlzIG5hbWVzcGFjZSBib290dGltZSBhbmQgbW9ub3RvbmljIGNsb2NrcyBjYW4gYmUgc2V0LlxcbjE0MzM6XFx0XFx0ICBUaGUgdGltZSB3aWxsIGtlZXAgZ29pbmcgd2l0aCB0aGUgc2FtZSBwYWNlLlxcbjE0MzQ6XFx0XFxuMTQzNTpcXHRjb25maWcgVElNRV9OU19WRFNPXFxuMTQzNjpcXHRcXHRkZWZfYm9vbCBUSU1FX05TIFxcdTAwMjZcXHUwMDI2IEdFTkVSSUNfR0VUVElNRU9GREFZXFxuMTQzNzpcXHRcXG4xNDM4OlxcdGNvbmZpZyBJUENfTlNcXG4xNDM5OlxcdFxcdGJvb2wgXFxcIklQQyBuYW1lc3BhY2VcXFwiXFxuMTQ0MDpcXHRcXHRkZXBlbmRzIG9uIChTWVNWSVBDIHx8IFBPU0lYX01RVUVVRSlcXG4xNDQxOlxcdFxcdGRlZmF1bHQgeVxcbjE0NDI6XFx0XFx0aGVscFxcbjE0NDM6XFx0XFx0ICBJbiB0aGlzIG5hbWVzcGFjZSB0YXNrcyB3b3JrIHdpdGggSVBDIGlkcyB3aGljaCBjb3JyZXNwb25kIHRvXFxuMTQ0NDpcXHRcXHQgIGRpZmZlcmVudCBJUEMgb2JqZWN0cyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcy5cXG4xNDQ1OlxcdFxcbjE0NDY6XFx0Y29uZmlnIFVTRVJfTlNcXG4xNDQ3OlxcdFxcdGJvb2wgXFxcIlVzZXIgbmFtZXNwYWNlXFxcIlxcbjE0NDg6XFx0XFx0ZGVmYXVsdCBuXFxuMTQ0OTpcXHRcXHRoZWxwXFxuMTQ1MDpcXHRcXHQgIFRoaXMgYWxsb3dzIGNvbnRhaW5lcnMsIGkuZS4gdnNlcnZlcnMsIHRvIHVzZSB1c2VyIG5hbWVzcGFjZXNcXG4xNDUxOlxcdFxcdCAgdG8gcHJvdmlkZSBkaWZmZXJlbnQgdXNlciBpbmZvIGZvciBkaWZmZXJlbnQgc2VydmVycy5cXG4xNDUyOlxcdFxcbjE0NTM6XFx0XFx0ICBXaGVuIHVzZXIgbmFtZXNwYWNlcyBhcmUgZW5hYmxlZCBpbiB0aGUga2VybmVsIGl0IGlzXFxuMTQ1NDpcXHRcXHQgIHJlY29tbWVuZGVkIHRoYXQgdGhlIE1FTUNHIG9wdGlvbiBhbHNvIGJlIGVuYWJsZWQgYW5kIHRoYXRcXG4xNDU1OlxcdFxcdCAgdXNlci1zcGFjZSB1c2UgdGhlIG1lbW9yeSBjb250cm9sIGdyb3VwcyB0byBsaW1pdCB0aGUgYW1vdW50XFxuMTQ1NjpcXHRcXHQgIG9mIG1lbW9yeSBhIG1lbW9yeSB1bnByaXZpbGVnZWQgdXNlcnMgY2FuIHVzZS5cXG4xNDU3OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODowNC44ODQ5OTQyNTFaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDA1Njk4MDg3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIGBsaXN0bnNgIFN5c3RlbSBDYWxsIGZvciBQb3RlbnRpYWwgRnV6emluZyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLiBGaXJzdCwgSSBuZWVkIHRvIHZlcmlmeSB3aGljaCBmdW5jdGlvbnMgYXJlIGF0IHRoZSBoZWFydCBvZiBgbGlzdG5zYC4gSSdsbCBzdGFydCB3aXRoIGBGb2N1c1N5bWJvbHNgLiBJbiBga2VybmVsL25zdHJlZS5jYCwgdGhlIGluaXRpYWwgc3VzcGVjdHMgYXJlIGBkb19saXN0bnNgLCBgZG9fbGlzdG5zX3VzZXJuc2AsIGBfX2RvX3N5c19saXN0bnNgLCBgbGVnaXRpbWl6ZV9uc2AgKGV2ZW4gdGhvdWdoIGl0J3Mgc3RhdGljIGlubGluZSwgaXQncyB3b3J0aCBjaGVja2luZyB0aGUgY2FsbCBzaXRlcyksIGFuZCBgc3lzX2xpc3Ruc2AgKG9yIGBfX3g2NF9zeXNfbGlzdG5zYCkuXG5cbk5vdywgY29uZmlybWluZyBteSBodW5jaCwgaXQgbG9va3MgbGlrZSBgX19kb19zeXNfbGlzdG5zYCwgYGRvX2xpc3Ruc2AsIGFuZCBgZG9fbGlzdG5zX3VzZXJuc2AgYXJlIGluZGVlZCB0aGUgcHJpbWFyeSB3b3JraG9yc2VzIGZvciB0aGlzIHN5c3RlbSBjYWxsLiBHb29kLiBOZXh0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMuIEknbGwgcXVpY2tseSBjaGVjayB0aGUgYEVuYWJsZUNvbmZpZ3NgLCB3aGljaCBhcmUgYE5BTUVTUEFDRVNgIGFuZCBgVVNFUl9OU2AuXG5cblJpZ2h0LCB0aW1lIGZvciBhIHNhbml0eSBjaGVjayBvbiB0aGUgYXJndW1lbnRzIEknbSBhYm91dCB0byBmZWVkIHRvIGBzZXQtcmVzdWx0c2AuIFRoZSBgV29ydGhGdXp6aW5nYCBmbGFnIGlzIGRlZmluaXRlbHkgYHRydWVgIGluIHRoaXMgY2FzZS4gVGhlIHBhdGNoIGZ1bmRhbWVudGFsbHkgYWx0ZXJzIG5hbWVzcGFjZSB0cmVlIGl0ZXJhdGlvbiBhbmQgdmFsaWRhdGlvbiB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGBsaXN0bnNgIHN5c3RlbSBjYWxsLiBUaGUgcmVvcmRlcmluZyBvZiBwZXJtaXNzaW9uIGFuZCBtZW1iZXJzaGlwIGNoZWNrcyDigJMgYG1heV9saXN0X25zYCBhbmQgYG5zX2dldF91bmxlc3NfaW5hY3RpdmVgIOKAkyBpcyBhIGNyaXRpY2FsIGRldGFpbCwgYXMgdGhpcyBkaXJlY3RseSBpbXBhY3RzIGNvcmUga2VybmVsIGNvZGUgcmVhY2hhYmxlIHRocm91Z2ggYGxpc3Ruc2AuXG5cblNvLCB0aGUgZm9jdXMgc3ltYm9scyBhcmUgY29uZmlybWVkIGFzIGBbXCJfX2RvX3N5c19saXN0bnNcIiwgXCJkb19saXN0bnNcIiwgXCJkb19saXN0bnNfdXNlcm5zXCJdYCwgYW5kIHRoZSBlbmFibGluZyBjb25maWdzIGFyZSBgW1wiTkFNRVNQQUNFU1wiLCBcIlVTRVJfTlNcIl1gLiBJJ20gc2F0aXNmaWVkLiBOb3csIGl0J3MgdGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AgYW5kIG1vdmUgb24gdG8gdGhlIG5leHQgc3RhZ2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2OTI3LCJPdXRwdXRUb2tlbnMiOjEzMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMzOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA4OjA4Ljk0MTk3ODI3WiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzY1NjUwNTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk5BTUVTUEFDRVNcIixcbiAgICBcIlVTRVJfTlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJfX2RvX3N5c19saXN0bnNcIixcbiAgICBcImRvX2xpc3Ruc1wiLFxuICAgIFwiZG9fbGlzdG5zX3VzZXJuc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIG5hbWVzcGFjZSB0cmVlIGl0ZXJhdGlvbiBhbmQgcGVybWlzc2lvbiB2YWxpZGF0aW9uIGxvZ2ljIGluIGxlZ2l0aW1pemVfbnMoKSwgd2hpY2ggaXMgY2FsbGVkIGR1cmluZyB0aGUgbGlzdG5zIHN5c3RlbSBjYWxsLiBJdCBjaGFuZ2VzIHdoZXRoZXIgbWF5X2xpc3RfbnMoKSBpcyBldmFsdWF0ZWQgYmVmb3JlIG9yIGFmdGVyIHRha2luZyBhIHJlZmVyZW5jZSB2aWEgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpLCBtb2RpZnlpbmcgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNvZGUgYWNjZXNzaWJsZSB0byB1c2Vyc3BhY2UuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTkFNRVNQQUNFU1wiLFxuICAgIFwiVVNFUl9OU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIl9fZG9fc3lzX2xpc3Ruc1wiLFxuICAgIFwiZG9fbGlzdG5zXCIsXG4gICAgXCJkb19saXN0bnNfdXNlcm5zXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgbmFtZXNwYWNlIHRyZWUgaXRlcmF0aW9uIGFuZCBwZXJtaXNzaW9uIHZhbGlkYXRpb24gbG9naWMgaW4gbGVnaXRpbWl6ZV9ucygpLCB3aGljaCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBsaXN0bnMgc3lzdGVtIGNhbGwuIEl0IGNoYW5nZXMgd2hldGhlciBtYXlfbGlzdF9ucygpIGlzIGV2YWx1YXRlZCBiZWZvcmUgb3IgYWZ0ZXIgdGFraW5nIGEgcmVmZXJlbmNlIHZpYSBuc19nZXRfdW5sZXNzX2luYWN0aXZlKCksIG1vZGlmeWluZyByZWFjaGFibGUgY29yZSBrZXJuZWwgY29kZSBhY2Nlc3NpYmxlIHRvIHVzZXJzcGFjZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDg6MDkuMDE4NTUyMTI1WiIsIlNlcSI6MjksIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTk3NDI0OTE3NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA4OjA5LjAxOTA4MTc5NFoiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjI5OTczNzE0NDU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgbGVnaXRpbWl6ZV9ucygpYCBpbiBga2VybmVsL25zdHJlZS5jYCB0byBjaGVjayBwZXJtaXNzaW9ucyAoYG1heV9saXN0X25zKClgKSBiZWZvcmUgYWNxdWlyaW5nIGEgcmVmZXJlbmNlIChgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpYCksIGVsaW1pbmF0aW5nIHRoZSBuZWVkIGZvciBhIHRlbXBvcmFyeSBhdXRvLWNsZWFudXAgcmVmZXJlbmNlIChgX19mcmVlKG5zX3B1dClgKS4gXFxuXFxuVGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1hbmlwdWxhdGUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBuZXcgc3RhY2svaGVhcCBidWZmZXJzLCBvciBzdHJ1Y3QgcGFkZGluZywgbm9yIGRvZXMgaXQgYWx0ZXIgZGF0YSBjb3B5aW5nIHRvIHVzZXJzcGFjZSBpbiBhIG1hbm5lciB0aGF0IGNvdWxkIGxlYWsgdW5pbml0aWFsaXplZCBieXRlcy4gQW55IHBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgY2hhbmdlIHJlbGF0ZSB0byBvYmplY3QgbGlmZXRpbWUgb3IgUkNVIGRlcmVmZXJlbmNpbmcgYmVmb3JlIHJlZmVyZW5jZSBhY3F1aXNpdGlvbiwgd2hpY2ggYXJlIHN0cmljdGx5IHdpdGhpbiB0aGUgZG9tYWluIG9mIEtBU0FOIHJhdGhlciB0aGFuIEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGZmMDAxMTY5NDM5MTRlY2E0ZTliMTEyNDBjZjM4NDBkYzM3ZWQ5ZDlcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU3VuIFNlcCA2IDAxOjA2OjI1IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEva2VybmVsL25zdHJlZS5jIGIva2VybmVsL25zdHJlZS5jXG5pbmRleCA2ZDEyZTU5MDBhYzAxLi44MzFmMjc5ZDE3NGEzIDEwMDY0NFxuLS0tIGEva2VybmVsL25zdHJlZS5jXG4rKysgYi9rZXJuZWwvbnN0cmVlLmNcbkBAIC01MzMsMTkgKzUzMywxMyBAQCBERUZJTkVfRlJFRShuc19wdXQsIHN0cnVjdCBuc19jb21tb24gKiwgaWYgKCFJU19FUlJfT1JfTlVMTChfVCkpIG5zX3B1dChfVCkpXG4gc3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxuIFx0XHRcdFx0XHRcdFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxuIHtcbi1cdHN0cnVjdCBuc19jb21tb24gKm5zIF9fZnJlZShuc19wdXQpID0gTlVMTDtcbi1cbiBcdGlmICghbnNfcmVxdWVzdGVkKGtscywgY2FuZGlkYXRlKSlcbiBcdFx0cmV0dXJuIE5VTEw7XG4gXG4tXHRucyA9IG5zX2dldF91bmxlc3NfaW5hY3RpdmUoY2FuZGlkYXRlKTtcbi1cdGlmICghbnMpXG4tXHRcdHJldHVybiBOVUxMO1xuLVxuLVx0aWYgKCFtYXlfbGlzdF9ucyhrbHMsIG5zKSlcbitcdGlmICghbWF5X2xpc3RfbnMoa2xzLCBjYW5kaWRhdGUpKVxuIFx0XHRyZXR1cm4gTlVMTDtcbiBcbi1cdHJldHVybiBub19mcmVlX3B0cihucyk7XG4rXHRyZXR1cm4gbnNfZ2V0X3VubGVzc19pbmFjdGl2ZShjYW5kaWRhdGUpO1xuIH1cbiBcbiBzdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODowOS4wMTkwODI3NTRaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTY4MTQ1MjU2MTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRGl2aW5nIGludG8gdGhlIE5hbWVzcGFjZSBMZWdpdGltYWN5IENoZWNrKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpcyBjbGVhcmx5IHRvdWNoaW5nIGBrZXJuZWwvbnN0cmVlLmNgLCBzcGVjaWZpY2FsbHkgdGhlIGBsZWdpdGltaXplX25zYCBmdW5jdGlvbi4gTXkgZmlyc3QgdGhvdWdodCBpcyB0byBnZXQgYSBzb2xpZCBncmFzcCBvbiB3aGF0J3MgaGFwcGVuaW5nIGFyb3VuZCB0aGF0IGNhbGwuIEl0IGxvb2tzIGxpa2UgaXQgaXMgZ29pbmcgdG8gZWZmZWN0IHRoZSB3YXkgdGhhdCBzb21lIG5hbWVzcGFjZXMgYXJlIGhhbmRsZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYGxlZ2l0aW1pemVfbnNgIGRvZXMsIGFzIHdlbGwgYXMgdGhlIHJvbGVzIG9mIGBtYXlfbGlzdF9uc2AsIGFuZCBgbnNfcmVxdWVzdGVkYCwgYW5kIGhvdyB0aGV5IGludGVyYWN0LiBMaW5lIDUzMyBpcyB0aGUgdGFyZ2V0LCBzbyBJIHNob3VsZCByZWFkIHRoZSBjb2RlIGFyb3VuZCB0aGVyZSBhbmQgdW5kZXJzdGFuZCB0aGlzIGZ1bmN0aW9uLlxuXG5MZXQncyB1c2UgdGhlIG9sZCBgcmVhZC1maWxlYCB0cmljayB0byBsb2FkIHRoZSBjb2RlLiBJJ2xsIGZvY3VzIG9uIGxpbmVzIDUwMCB0aHJvdWdoIDYwMCwgZ2l2ZSBvciB0YWtlLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBjb250ZXh0IEkgbmVlZCBhcm91bmQgdGhhdCBpbXBvcnRhbnQgZnVuY3Rpb24uIFVuZGVyc3RhbmRpbmcgdGhlIGxvZ2ljIGluIHRoaXMgYXJlYSBpcyBrZXkgdG8gYXNzZXNzaW5nIHRoZSBpbXBhY3Qgb2YgdGhpcyBwYXRjaC4gTGV0J3Mgc2VlIHdoYXQgd2UndmUgZ290LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTk4LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODoyNS44MzM2MTE3NDhaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA4ODIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9uc3RyZWUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1MDAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1MDA6XFx0XFx0aWYgKCFucylcXG4gNTAxOlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiA1MDI6XFx0XFxuIDUwMzpcXHRcXHRpZiAoIW5zX2dldF91bmxlc3NfaW5hY3RpdmUobnMpKVxcbiA1MDQ6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDUwNTpcXHRcXG4gNTA2OlxcdFxcdHJldHVybiBucztcXG4gNTA3OlxcdH1cXG4gNTA4OlxcdFxcbiA1MDk6XFx0c3RhdGljIGlubGluZSBib29sIF9fbXVzdF9jaGVjayBuc19yZXF1ZXN0ZWQoY29uc3Qgc3RydWN0IGtsaXN0bnMgKmtscyxcXG4gNTEwOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgY29uc3Qgc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUxMTpcXHR7XFxuIDUxMjpcXHRcXHRyZXR1cm4gIWtscy1cXHUwMDNlbnNfdHlwZSB8fCAoa2xzLVxcdTAwM2Vuc190eXBlIFxcdTAwMjYgbnMtXFx1MDAzZW5zX3R5cGUpO1xcbiA1MTM6XFx0fVxcbiA1MTQ6XFx0XFxuIDUxNTpcXHRzdGF0aWMgaW5saW5lIGJvb2wgX19tdXN0X2NoZWNrIG1heV9saXN0X25zKGNvbnN0IHN0cnVjdCBrbGlzdG5zICprbHMsXFxuIDUxNjpcXHRcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUxNzpcXHR7XFxuIDUxODpcXHRcXHRpZiAoa2xzLVxcdTAwM2V1c2VyX25zIFxcdTAwMjZcXHUwMDI2IGtscy1cXHUwMDNldXNlcm5zX2NhcGFibGUpXFxuIDUxOTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTIwOlxcdFxcdGlmIChpc19jdXJyZW50X25hbWVzcGFjZShucykpXFxuIDUyMTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNTIyOlxcdFxcdHJldHVybiBtYXlfc2VlX2FsbF9uYW1lc3BhY2VzKCk7XFxuIDUyMzpcXHR9XFxuIDUyNDpcXHRcXG4gNTI1OlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBuc19wdXQoc3RydWN0IG5zX2NvbW1vbiAqbnMpXFxuIDUyNjpcXHR7XFxuIDUyNzpcXHRcXHRpZiAobnMgXFx1MDAyNlxcdTAwMjYgbnMtXFx1MDAzZW9wcylcXG4gNTI4OlxcdFxcdFxcdG5zLVxcdTAwM2VvcHMtXFx1MDAzZXB1dChucyk7XFxuIDUyOTpcXHR9XFxuIDUzMDpcXHRcXG4gNTMxOlxcdERFRklORV9GUkVFKG5zX3B1dCwgc3RydWN0IG5zX2NvbW1vbiAqLCBpZiAoIUlTX0VSUl9PUl9OVUxMKF9UKSkgbnNfcHV0KF9UKSlcXG4gNTMyOlxcdFxcbiA1MzM6XFx0c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxcbiA1MzQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxcbiA1MzU6XFx0e1xcbiA1MzY6XFx0XFx0aWYgKCFuc19yZXF1ZXN0ZWQoa2xzLCBjYW5kaWRhdGUpKVxcbiA1Mzc6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDUzODpcXHRcXG4gNTM5OlxcdFxcdGlmICghbWF5X2xpc3RfbnMoa2xzLCBjYW5kaWRhdGUpKVxcbiA1NDA6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDU0MTpcXHRcXG4gNTQyOlxcdFxcdHJldHVybiBuc19nZXRfdW5sZXNzX2luYWN0aXZlKGNhbmRpZGF0ZSk7XFxuIDU0MzpcXHR9XFxuIDU0NDpcXHRcXG4gNTQ1OlxcdHN0YXRpYyBzc2l6ZV90IGRvX2xpc3Ruc191c2VybnMoc3RydWN0IGtsaXN0bnMgKmtscylcXG4gNTQ2OlxcdHtcXG4gNTQ3OlxcdFxcdHU2NCBfX3VzZXIgKm5zX2lkcyA9IGtscy1cXHUwMDNldW5zX2lkcztcXG4gNTQ4OlxcdFxcdHNpemVfdCBucl9uc19pZHMgPSBrbHMtXFx1MDAzZW5yX25zX2lkcztcXG4gNTQ5OlxcdFxcdHN0cnVjdCBuc19jb21tb24gKm5zID0gTlVMTCwgKmZpcnN0X25zID0gTlVMTCwgKnByZXYgPSBOVUxMO1xcbiA1NTA6XFx0XFx0Y29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqaGVhZDtcXG4gNTUxOlxcdFxcdHNzaXplX3QgcmV0O1xcbiA1NTI6XFx0XFxuIDU1MzpcXHRcXHRWRlNfV0FSTl9PTl9PTkNFKCFrbHMtXFx1MDAzZXVzZXJfbnNfaWQpO1xcbiA1NTQ6XFx0XFxuIDU1NTpcXHRcXHRpZiAoa2xzLVxcdTAwM2V1c2VyX25zX2lkID09IExJU1ROU19DVVJSRU5UX1VTRVIpXFxuIDU1NjpcXHRcXHRcXHRucyA9IHRvX25zX2NvbW1vbihjdXJyZW50X3VzZXJfbnMoKSk7XFxuIDU1NzpcXHRcXHRlbHNlIGlmIChrbHMtXFx1MDAzZXVzZXJfbnNfaWQpXFxuIDU1ODpcXHRcXHRcXHRucyA9IGxvb2t1cF9uc19pZChrbHMtXFx1MDAzZXVzZXJfbnNfaWQsIENMT05FX05FV1VTRVIpO1xcbiA1NTk6XFx0XFx0aWYgKCFucylcXG4gNTYwOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiA1NjE6XFx0XFx0a2xzLVxcdTAwM2V1c2VyX25zID0gdG9fdXNlcl9ucyhucyk7XFxuIDU2MjpcXHRcXG4gNTYzOlxcdFxcdC8qXFxuIDU2NDpcXHRcXHQgKiBVc2UgdGhlIHJidHJlZSB0byBmaW5kIHRoZSBmaXJzdCBuYW1lc3BhY2Ugd2UgY2FyZSBhYm91dCBhbmRcXG4gNTY1OlxcdFxcdCAqIHRoZW4gdXNlIGl0J3MgbGlzdCBlbnRyeSB0byBpdGVyYXRlIGZyb20gdGhlcmUuXFxuIDU2NjpcXHRcXHQgKi9cXG4gNTY3OlxcdFxcdGlmIChrbHMtXFx1MDAzZWxhc3RfbnNfaWQpIHtcXG4gNTY4OlxcdFxcdFxcdGtscy1cXHUwMDNlZmlyc3RfbnMgPSBsb29rdXBfbnNfb3duZXJfYXQoa2xzLVxcdTAwM2VsYXN0X25zX2lkICsgMSwgbnMpO1xcbiA1Njk6XFx0XFx0XFx0aWYgKCFrbHMtXFx1MDAzZWZpcnN0X25zKVxcbiA1NzA6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9FTlQ7XFxuIDU3MTpcXHRcXHRcXHRmaXJzdF9ucyA9IGtscy1cXHUwMDNlZmlyc3RfbnM7XFxuIDU3MjpcXHRcXHR9XFxuIDU3MzpcXHRcXG4gNTc0OlxcdFxcdHJldCA9IDA7XFxuIDU3NTpcXHRcXHRoZWFkID0gXFx1MDAyNnRvX25zX2NvbW1vbihrbHMtXFx1MDAzZXVzZXJfbnMpLVxcdTAwM2Vuc19vd25lcl9yb290Lm5zX2xpc3RfaGVhZDtcXG4gNTc2OlxcdFxcdGtscy1cXHUwMDNldXNlcm5zX2NhcGFibGUgPSBtYXlfc2VlX2FsbF9uYW1lc3BhY2VzKCk7XFxuIDU3NzpcXHRcXG4gNTc4OlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gNTc5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODoyNS44MzM3MjI5NDhaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTg3NjgyMzA2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBhbiBleHBlcnQgaW4gbXkgZmllbGQsIGFzc3VtaW5nIEknbSB0aGUgb25lIGhhdmluZyB0aGVtOlxuXG4qKkFuYWx5emluZyBga2VybmVsL25zdHJlZS5jYCB0byBVbmRlcnN0YW5kIGBsZWdpdGltaXplX25zYCoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiBob3cgYGxlZ2l0aW1pemVfbnNgIGlzIGFjdHVhbGx5ICp1c2VkKi4gSSBjYW4ndCBqdXN0IGxvb2sgYXQgaXRzIGRlZmluaXRpb24sIEkgbmVlZCB0byBzZWUgdGhlIGNvbnRleHQuIFRoZSBjcnVjaWFsIHRoaW5nIGhlcmUgaXMgdG8gdW5kZXJzdGFuZCB0aGUgY29udHJvbCBmbG93OyB3aGF0ICpjYWxscyogYGxlZ2l0aW1pemVfbnNgLCBhbmQgd2hhdCdzIGhhcHBlbmluZyBpbW1lZGlhdGVseSBiZWZvcmUgYW5kIGFmdGVyIHRob3NlIGNhbGxzLiBUaGF0J3MgaG93IHlvdSByZWFsbHkgZ3Jhc3AgdGhlIGludGVudGlvbiBiZWhpbmQgdGhlIGRlc2lnbi4gTGV0J3MgZGlnIGludG8gdGhlIHJlc3Qgb2YgYGtlcm5lbC9uc3RyZWUuY2AuIEkgbmVlZCB0byB0cmFjZSBpdHMgdXNhZ2UgaW4gdGhlIGNvZGUgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHN5c3RlbSBpcyBiZWhhdmluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6Mzc1NywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDg6MjcuNzEwNTQ4NTU4WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNDY3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbnN0cmVlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNTgwLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTgwOlxcdFxcdGlmICghZmlyc3RfbnMpXFxuIDU4MTpcXHRcXHRcXHRmaXJzdF9ucyA9IGxpc3RfZW50cnlfcmN1KGhlYWQtXFx1MDAzZW5leHQsIHR5cGVvZigqZmlyc3RfbnMpLCBuc19vd25lcl9ub2RlLm5zX2xpc3RfZW50cnkpO1xcbiA1ODI6XFx0XFxuIDU4MzpcXHRcXHRucyA9IGZpcnN0X25zO1xcbiA1ODQ6XFx0XFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tX3JjdShucywgaGVhZCwgbnNfb3duZXJfbm9kZS5uc19saXN0X2VudHJ5KSB7XFxuIDU4NTpcXHRcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICp2YWxpZDtcXG4gNTg2OlxcdFxcbiA1ODc6XFx0XFx0XFx0aWYgKCFucl9uc19pZHMpXFxuIDU4ODpcXHRcXHRcXHRcXHRicmVhaztcXG4gNTg5OlxcdFxcbiA1OTA6XFx0XFx0XFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xcbiA1OTE6XFx0XFx0XFx0aWYgKCF2YWxpZClcXG4gNTkyOlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiA1OTM6XFx0XFxuIDU5NDpcXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gNTk1OlxcdFxcbiA1OTY6XFx0XFx0XFx0bnNfcHV0KHByZXYpO1xcbiA1OTc6XFx0XFx0XFx0cHJldiA9IHZhbGlkO1xcbiA1OTg6XFx0XFxuIDU5OTpcXHRcXHRcXHRpZiAocHV0X3VzZXIodmFsaWQtXFx1MDAzZW5zX2lkLCBuc19pZHMgKyByZXQpKSB7XFxuIDYwMDpcXHRcXHRcXHRcXHRuc19wdXQocHJldik7XFxuIDYwMTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gNjAyOlxcdFxcdFxcdH1cXG4gNjAzOlxcdFxcbiA2MDQ6XFx0XFx0XFx0bnJfbnNfaWRzLS07XFxuIDYwNTpcXHRcXHRcXHRyZXQrKztcXG4gNjA2OlxcdFxcbiA2MDc6XFx0XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiA2MDg6XFx0XFx0fVxcbiA2MDk6XFx0XFxuIDYxMDpcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gNjExOlxcdFxcdG5zX3B1dChwcmV2KTtcXG4gNjEyOlxcdFxcdHJldHVybiByZXQ7XFxuIDYxMzpcXHR9XFxuIDYxNDpcXHRcXG4gNjE1OlxcdC8qXFxuIDYxNjpcXHQgKiBMb29rdXAgYSBuYW1lc3BhY2Ugd2l0aCBpZCBcXHUwMDNlPSBuc19pZCBpbiBlaXRoZXIgdGhlIHVuaWZpZWQgdHJlZSBvciBhIHR5cGUtc3BlY2lmaWMgdHJlZS5cXG4gNjE3OlxcdCAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSB3aXRoIHRoZSBzbWFsbGVzdCBpZCB0aGF0IGlzIFxcdTAwM2U9IG5zX2lkLlxcbiA2MTg6XFx0ICovXFxuIDYxOTpcXHRzdGF0aWMgc3RydWN0IG5zX2NvbW1vbiAqbG9va3VwX25zX2lkX2F0KHU2NCBuc19pZCwgaW50IG5zX3R5cGUpXFxuIDYyMDpcXHR7XFxuIDYyMTpcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICpyZXQgPSBOVUxMO1xcbiA2MjI6XFx0XFx0c3RydWN0IG5zX3RyZWVfcm9vdCAqbnNfdHJlZSA9IE5VTEw7XFxuIDYyMzpcXHRcXHRzdHJ1Y3QgcmJfbm9kZSAqbm9kZTtcXG4gNjI0OlxcdFxcbiA2MjU6XFx0XFx0aWYgKG5zX3R5cGUpIHtcXG4gNjI2OlxcdFxcdFxcdG5zX3RyZWUgPSBuc190cmVlX2Zyb21fdHlwZShuc190eXBlKTtcXG4gNjI3OlxcdFxcdFxcdGlmICghbnNfdHJlZSlcXG4gNjI4OlxcdFxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiA2Mjk6XFx0XFx0fVxcbiA2MzA6XFx0XFxuIDYzMTpcXHRcXHRndWFyZChuc190cmVlX2xvY2tlZF9yZWFkZXIpKCk7XFxuIDYzMjpcXHRcXG4gNjMzOlxcdFxcdGlmIChuc190cmVlKVxcbiA2MzQ6XFx0XFx0XFx0bm9kZSA9IG5zX3RyZWUtXFx1MDAzZW5zX3JiLnJiX25vZGU7XFxuIDYzNTpcXHRcXHRlbHNlXFxuIDYzNjpcXHRcXHRcXHRub2RlID0gbnNfdW5pZmllZF9yb290Lm5zX3JiLnJiX25vZGU7XFxuIDYzNzpcXHRcXG4gNjM4OlxcdFxcdHdoaWxlIChub2RlKSB7XFxuIDYzOTpcXHRcXHRcXHRzdHJ1Y3QgbnNfY29tbW9uICpucztcXG4gNjQwOlxcdFxcbiA2NDE6XFx0XFx0XFx0aWYgKG5zX3R5cGUpXFxuIDY0MjpcXHRcXHRcXHRcXHRucyA9IG5vZGVfdG9fbnMobm9kZSk7XFxuIDY0MzpcXHRcXHRcXHRlbHNlXFxuIDY0NDpcXHRcXHRcXHRcXHRucyA9IG5vZGVfdG9fbnNfdW5pZmllZChub2RlKTtcXG4gNjQ1OlxcdFxcbiA2NDY6XFx0XFx0XFx0aWYgKG5zX2lkIFxcdTAwM2M9IG5zLVxcdTAwM2Vuc19pZCkge1xcbiA2NDc6XFx0XFx0XFx0XFx0aWYgKG5zX3R5cGUpXFxuIDY0ODpcXHRcXHRcXHRcXHRcXHRyZXQgPSBub2RlX3RvX25zKG5vZGUpO1xcbiA2NDk6XFx0XFx0XFx0XFx0ZWxzZVxcbiA2NTA6XFx0XFx0XFx0XFx0XFx0cmV0ID0gbm9kZV90b19uc191bmlmaWVkKG5vZGUpO1xcbiA2NTE6XFx0XFx0XFx0XFx0aWYgKG5zX2lkID09IG5zLVxcdTAwM2Vuc19pZClcXG4gNjUyOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiA2NTM6XFx0XFx0XFx0XFx0bm9kZSA9IG5vZGUtXFx1MDAzZXJiX2xlZnQ7XFxuIDY1NDpcXHRcXHRcXHR9IGVsc2Uge1xcbiA2NTU6XFx0XFx0XFx0XFx0bm9kZSA9IG5vZGUtXFx1MDAzZXJiX3JpZ2h0O1xcbiA2NTY6XFx0XFx0XFx0fVxcbiA2NTc6XFx0XFx0fVxcbiA2NTg6XFx0XFxuIDY1OTpcXHRcXHRpZiAocmV0KVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNlQwMTowODoyNy43MTA2NTUwNDhaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTg0OTc4NTE5MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIGBsZWdpdGltaXplX25zYCBVc2FnZSoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBvZiBgbGVnaXRpbWl6ZV9uc2AuIFdoZXJlIGVsc2UgaXMgdGhpcyBmdW5jdGlvbiwgbWV0aG9kLCBvciB3aGF0ZXZlciBpdCBpcywgYWN0dWFsbHkgYmVpbmcgY2FsbGVkIHdpdGhpbiB0aGUgY29kZWJhc2U/IEkgY2FuJ3QganVzdCByZWx5IG9uIG1lbW9yeTsgSSBuZWVkIGNvbmNyZXRlIGV2aWRlbmNlLiBUaW1lIHRvIGJyaW5nIG91dCB0aGUgYmlnIGd1bnMuLi4gSSdsbCBmaXJlIHVwIGBncmVwcGVyYC4gVGhpcyB3aWxsIGFsbG93IG1lIHRvIHF1aWNrbHkgaWRlbnRpZnkgYWxsIGluc3RhbmNlcyBvZiBgbGVnaXRpbWl6ZV9uc2AgYW5kIGl0cyB1c2VzIHRocm91Z2hvdXQgdGhlIHByb2plY3QuIEknbGwgYmUgYWJsZSB0byBxdWlja2x5IHNlZSBhbGwgdGhlIGNvbnRleHRzIHdoZXJlIHRoZSBmdW5jdGlvbiBpcyBwcmVzZW50LiBUaGlzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBnZXQgYSBzb2xpZCBncmFzcCBvZiBob3cgdGhpcyBjb21wb25lbnQgZml0cyBpbnRvIHRoZSBiaWdnZXIgcGljdHVyZS4gRnJvbSBoZXJlIEkgY2FuIHN0YXJ0IHRvIHVuZGVyc3RhbmQgaXRzIGltcGFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTA1OSwiT3V0cHV0VG9rZW5zIjoxOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDg6MjkuNTYwNDQzMzJaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MDA0NzQxNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibGVnaXRpbWl6ZV9uc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvbnN0cmVlLmM9NTMxPURFRklORV9GUkVFKG5zX3B1dCwgc3RydWN0IG5zX2NvbW1vbiAqLCBpZiAoIUlTX0VSUl9PUl9OVUxMKF9UKSkgbnNfcHV0KF9UKSlcXG5rZXJuZWwvbnN0cmVlLmMtNTMyLVxcbmtlcm5lbC9uc3RyZWUuYzo1MzM6c3RhdGljIGlubGluZSBzdHJ1Y3QgbnNfY29tbW9uICpfX211c3RfY2hlY2sgbGVnaXRpbWl6ZV9ucyhjb25zdCBzdHJ1Y3Qga2xpc3RucyAqa2xzLFxcbmtlcm5lbC9uc3RyZWUuYy01MzQtXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IG5zX2NvbW1vbiAqY2FuZGlkYXRlKVxcbi0tXFxua2VybmVsL25zdHJlZS5jPTU0NT1zdGF0aWMgc3NpemVfdCBkb19saXN0bnNfdXNlcm5zKHN0cnVjdCBrbGlzdG5zICprbHMpXFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNTg5LVxcbmtlcm5lbC9uc3RyZWUuYzo1OTA6XFx0XFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xcbmtlcm5lbC9uc3RyZWUuYy01OTEtXFx0XFx0aWYgKCF2YWxpZClcXG4tLVxcbmtlcm5lbC9uc3RyZWUuYz02ODk9c3RhdGljIHNzaXplX3QgZG9fbGlzdG5zKHN0cnVjdCBrbGlzdG5zICprbHMpXFxuLS1cXG5rZXJuZWwvbnN0cmVlLmMtNzMxLVxcbmtlcm5lbC9uc3RyZWUuYzo3MzI6XFx0XFx0dmFsaWQgPSBsZWdpdGltaXplX25zKGtscywgbnMpO1xcbmtlcm5lbC9uc3RyZWUuYy03MzMtXFx0XFx0aWYgKCF2YWxpZClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDZUMDE6MDg6MzEuMTYwOTM1MjhaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzgzMTgzNjU5MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBOYW1lc3BhY2UgTGVnaXRpbWFjeSBQYXRjaCoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdGhhdCBpdCdzIGEgc2ltcGxpZmljYXRpb24sIGFpbWluZyBmb3IgYSBsZWFuZXIgYW5kIHBvdGVudGlhbGx5IG1vcmUgZWZmaWNpZW50IHBhdGggaW4gdGhlIGBsZWdpdGltaXplX25zYCBmdW5jdGlvbiB3aXRoaW4gYGtlcm5lbC9uc3RyZWUuY2AuIEknbSBzZWVpbmcgYSByZWZhY3RvcmluZyBmb2N1c2VkIG9uIG9wdGltaXppbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMgY29uY2VybmluZyBuYW1lc3BhY2UgcmVmZXJlbmNlIGNvdW50aW5nIGFuZCBhY2Nlc3MgY29udHJvbC5cblxuRXNzZW50aWFsbHksIHRoZSBwYXRjaCBzdHJlYW1saW5lcyB0aGUgcHJvY2Vzcy4gVGhlIHByZXZpb3VzIHZlcnNpb24sIGlmIEkgcmVjYWxsIGNvcnJlY3RseSwgd2FzOiBjaGVjayBpZiB0aGUgbmFtZXNwYWNlIGlzIHJlcXVlc3RlZCwgdGhlbiBhY3F1aXJlIGEgcmVmZXJlbmNlLCBjaGVjayBwZXJtaXNzaW9ucywgYW5kIGZpbmFsbHkgcmV0dXJuIHRoZSByZWZlcmVuY2UuIE5vdywgaXQgYXBwZWFycyB0byBiZTogY2hlY2sgaWYgdGhlIG5hbWVzcGFjZSBpcyByZXF1ZXN0ZWQsICp0aGVuKiBjaGVjayBwZXJtaXNzaW9ucywgYW5kICpvbmx5IHRoZW4qIGFjcXVpcmUgYSByZWZlcmVuY2UgKGlmIHBlcm1pdHRlZCkuIFRoaXMgbG9va3MgbGlrZSBhIGdvb2QgY2hhbmdlLiBJdCBzYXZlcyBhIGNhbGwgdG8gYG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKWAgKGFuZCBpdHMgYXNzb2NpYXRlZCBgbnNfcHV0KClgIGlmIHBlcm1pc3Npb24gaXMgZGVuaWVkKSwgZWxpbWluYXRpbmcgYSB0ZW1wb3JhcnkgdmFyaWFibGUgYW5kIGl0cyBjbGVhbnVwLlxuXG5UaGUgY3JpdGljYWwgcGllY2UgaGVyZSBpcyB0aGUgdXNlIG9mIGBtYXlfbGlzdF9ucygpYC4gQmFzZWQgb24gdGhlIGNvZGUgY29tbWVudHMsIGl0IHNvdW5kcyBsaWtlIHRoaXMgZnVuY3Rpb24gb25seSBjaGVja3MgbmFtZXNwYWNlIHBvaW50ZXJzIGFuZCBmbGFncywgd2l0aG91dCBhY3R1YWxseSBpbmNyZWFzaW5nIHRoZSByZWZlcmVuY2UgY291bnQuIEdvb2QsIHRoYXQncyB3aGF0IEkgZXhwZWN0ZWQuIFRoZSBzaW1wbGlmaWNhdGlvbiByZWR1Y2VzIHRoZSB0aW1lIGEgbG9jayBpcyBoZWxkLCB0aGF0IHdpbGwgcmVkdWNlIHRoZSBudW1iZXIgb2YgcG90ZW50aWFsIGJsb2NraW5nIGNhbGxzLlxuXG5Ob3csIGxldCdzIGNvbnNpZGVyIHRoZSBwb3RlbnRpYWwgcmlza3MuIE15IHByaW1hcnkgY29uY2VybiBpcyBhbHdheXMgdW5pbml0aWFsaXplZCBtZW1vcnksIGxlYWtzLCBvciB1c2UtYWZ0ZXItZnJlZSBzY2VuYXJpb3MuIEknbGwgbmVlZCB0byBjYXJlZnVsbHkgZXhhbWluZSB3aGV0aGVyIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhbnkgb2YgdGhvc2U6XG5cbiogICAqKlVuaW5pdGlhbGl6ZWQgbWVtb3J5OioqIEknbSBub3Qgc2VlaW5nIGFueSBuZXcgYWxsb2NhdGlvbnMgb3IgbW9kaWZpY2F0aW9ucyBvZiBleGlzdGluZyBzdHJ1Y3R1cmVzIHRoYXQgY291bGQgbGVhZCB0byB1bmluaXRpYWxpemVkIGRhdGEgYmVpbmcgZXhwb3NlZC4gVGhlIGBjYW5kaWRhdGVgIHBvaW50ZXIgaXMgcGFzc2VkIGluLCBga2xzYCBpcyBhbHNvIHBhc3NlZCBpbiwgYW5kIHRoZXJlJ3Mgbm90aGluZyBoZXJlIHRoYXQgbG9va3Mgcmlza3kgZnJvbSB0aGUgc3VyZmFjZS5cbiogICAqKktlcm5lbC10by11c2VyIGxlYWtzOioqIE5vIG1lbW9yeSBjb3BpZXMgdG8gdXNlciBzcGFjZS4gVGhpcyBpcyBhIGJpZyBvbmUgdG8gcnVsZSBvdXQuIFRoaXMgcGF0Y2ggZG9lc24ndCBzZWVtIHRvIGJlIG1vZGlmeWluZyBhbnkgc3RydWN0dXJlcyB0aGF0IGdldCBwYXNzZWQgdG8gdXNlciBzcGFjZS4gTm90aGluZyBvYnZpb3VzIHRvIHNlZS5cbiogICAqKkNvbmN1cnJlbmN5L1VBRjoqKiBXaGlsZSBgbWF5X2xpc3RfbnMoKWAgcmVhZGluZyBgY2FuZGlkYXRlYCBiZWZvcmUgYG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKWAgY291bGQgKnBvdGVudGlhbGx5KiBpbnRyb2R1Y2UgaXNzdWVzIHdpdGggYSByYWNlIGNvbmRpdGlvbiAoaWYgdGhlIG5hbWVzcGFjZSdzIHN0YXRlIGNoYW5nZXMgYmV0d2VlbiB0aGUgY2hlY2tzKSwgdGhhdCB0eXBlIG9mIGNvbmNlcm4gaXMgc29tZXRoaW5nIHRoYXQgS0FTQU4gKEtlcm5lbCBBZGRyZXNzIFNhbml0aXplcikgaXMgZGVzaWduZWQgdG8gaGFuZGxlLiBUaGlzIGZhbGxzIHVuZGVyIHN0YW5kYXJkIG9iamVjdCBsaWZldGltZSBhbmQgcmVmZXJlbmNlIGNvdW50aW5nIHByb3RlY3Rpb25zLlxuXG5JIGFtIGNvbmZpZGVudCB0aGF0IGl0IGRvZXMgbm90LlxuXG5TbywgZm9yIEtNU0FOIChLZXJuZWwgTWVtb3J5IFNhbml0aXplciksIEkgdGhpbmsgd2UncmUgc2FmZS4gTXkgY3JpdGVyaWEgaXMsIGFuZCBoYXMgYmVlbjpcblxuMS4gIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZT8gTm8uXG4yLiAgQ29uZGl0aW9uYWwgbG9naWMgd2l0aCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8gTm8uXG4zLiAgQ29tcGxleCBkYXRhIHN0cnVjdHVyZXMgaW5pdGlhbGl6YXRpb24gaXNzdWVzPyBOby5cbjQuICBCb3VuZHMgY2hlY2tzL2xlbmd0aHMgcmlza3M/IE5vLlxuXG5ObywgdGhpcyBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2tzIHRoYXQgS01TQU4gaXMgZGVzaWduZWQgdG8gY2F0Y2guIFRoaXMgaXMgbW9yZSBvZiBhIHVzZS1hZnRlci1mcmVlIHN0eWxlIGlzc3VlLCBzb21ldGhpbmcgS0FTQU4gb3IgYW5vdGhlciBzdGFuZGFyZCBkZXRlY3RvciB3aWxsIGhhbmRsZS5cblxuVGhpcyBzZWVtcyBsaWtlIGEgc3RyYWlnaHRmb3J3YXJkIG9wdGltaXphdGlvbi4gVGhlIHBhdGNoIGNsZWFucyB1cCB0aGUgcmVmZXJlbmNlIGNvdW50aW5nIGFuZCBwZXJtaXNzaW9uIGNoZWNraW5nIGxvZ2ljIGluIGBsZWdpdGltaXplX25zKClgIGJ5IG9wdGltaXppbmcgdGhlIG9yZGVyIG9mIG9wZXJhdGlvbnMuIE5vIG1lbW9yeSBhbGxvY2F0aW9uIGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0aGF0IG1heSBsZWFrIHVuaW5pdGlhbGl6ZWQgYnl0ZXMuIEFueSBjb25jZXJucyBmYWxsIHVuZGVyIHRoZSBzY29wZSBvZiBLQVNBTiwgbm90IEtNU0FOLlxuXG5JJ2QgY2xhc3NpZnkgdGhpcyBhcyBgTmVlZHNLTVNBTiA9IGZhbHNlYCwgYW5kIEknbGwgc3VibWl0IHRoYXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU1NjYsIk91dHB1dFRva2VucyI6MTgxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTk2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA2VDAxOjA4OjM4Ljk5Mjc3NDI4MVoiLCJTZXEiOjM4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MzkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgYGxlZ2l0aW1pemVfbnMoKWAgaW4gYGtlcm5lbC9uc3RyZWUuY2AgdG8gY2hlY2sgcGVybWlzc2lvbnMgKGBtYXlfbGlzdF9ucygpYCkgYmVmb3JlIGFjcXVpcmluZyBhIHJlZmVyZW5jZSAoYG5zX2dldF91bmxlc3NfaW5hY3RpdmUoKWApLCBlbGltaW5hdGluZyB0aGUgbmVlZCBmb3IgYSB0ZW1wb3JhcnkgYXV0by1jbGVhbnVwIHJlZmVyZW5jZSAoYF9fZnJlZShuc19wdXQpYCkuIFxcblxcblRoaXMgY2hhbmdlIGRvZXMgbm90IGludHJvZHVjZSBvciBtYW5pcHVsYXRlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSwgbmV3IHN0YWNrL2hlYXAgYnVmZmVycywgb3Igc3RydWN0IHBhZGRpbmcsIG5vciBkb2VzIGl0IGFsdGVyIGRhdGEgY29weWluZyB0byB1c2Vyc3BhY2UgaW4gYSBtYW5uZXIgdGhhdCBjb3VsZCBsZWFrIHVuaW5pdGlhbGl6ZWQgYnl0ZXMuIEFueSBwb3RlbnRpYWwgcmlza3MgaW50cm9kdWNlZCBieSB0aGlzIGNoYW5nZSByZWxhdGUgdG8gb2JqZWN0IGxpZmV0aW1lIG9yIFJDVSBkZXJlZmVyZW5jaW5nIGJlZm9yZSByZWZlcmVuY2UgYWNxdWlzaXRpb24sIHdoaWNoIGFyZSBzdHJpY3RseSB3aXRoaW4gdGhlIGRvbWFpbiBvZiBLQVNBTiByYXRoZXIgdGhhbiBLTVNBTi4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBgbGVnaXRpbWl6ZV9ucygpYCBpbiBga2VybmVsL25zdHJlZS5jYCB0byBjaGVjayBwZXJtaXNzaW9ucyAoYG1heV9saXN0X25zKClgKSBiZWZvcmUgYWNxdWlyaW5nIGEgcmVmZXJlbmNlIChgbnNfZ2V0X3VubGVzc19pbmFjdGl2ZSgpYCksIGVsaW1pbmF0aW5nIHRoZSBuZWVkIGZvciBhIHRlbXBvcmFyeSBhdXRvLWNsZWFudXAgcmVmZXJlbmNlIChgX19mcmVlKG5zX3B1dClgKS4gXFxuXFxuVGhpcyBjaGFuZ2UgZG9lcyBub3QgaW50cm9kdWNlIG9yIG1hbmlwdWxhdGUgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBuZXcgc3RhY2svaGVhcCBidWZmZXJzLCBvciBzdHJ1Y3QgcGFkZGluZywgbm9yIGRvZXMgaXQgYWx0ZXIgZGF0YSBjb3B5aW5nIHRvIHVzZXJzcGFjZSBpbiBhIG1hbm5lciB0aGF0IGNvdWxkIGxlYWsgdW5pbml0aWFsaXplZCBieXRlcy4gQW55IHBvdGVudGlhbCByaXNrcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgY2hhbmdlIHJlbGF0ZSB0byBvYmplY3QgbGlmZXRpbWUgb3IgUkNVIGRlcmVmZXJlbmNpbmcgYmVmb3JlIHJlZmVyZW5jZSBhY3F1aXNpdGlvbiwgd2hpY2ggYXJlIHN0cmljdGx5IHdpdGhpbiB0aGUgZG9tYWluIG9mIEtBU0FOIHJhdGhlciB0aGFuIEtNU0FOLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlg9z[1] Phase: Succeeded StartedAt: 2026-09-06 01:08:50 +0000 UTC FinishedAt: 2026-09-06 01:08:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-06 01:08:50 +0000 UTC FinishedAt: 2026-09-06 01:08:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2] Phase: Succeeded StartedAt: 2026-09-06 01:08:50 +0000 UTC FinishedAt: 2026-09-06 04:49:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-06 01:08:50 +0000 UTC FinishedAt: 2026-09-06 04:49:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-06 01:08:50 +0000 UTC FinishedAt: 2026-09-06 01:09:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-06 01:08:50 +0000 UTC FinishedAt: 2026-09-06 01:08:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzlg9z/series-workflowzlg9z-convert-artifact-3065364583/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-06 01:09:01 +0000 UTC FinishedAt: 2026-09-06 01:25:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-06 01:09:01 +0000 UTC FinishedAt: 2026-09-06 01:25:30 +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:*93ee1e99-911a-4e8f-adb9-a8cfb62e6a26,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-workflowzlg9z/series-workflowzlg9z-convert-artifact-3065364583/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": "cd055b4c-67ae-46b8-9263-d828c1dd96f8", "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-workflowzlg9z/series-workflowzlg9z-build-action-3044062973/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-06 01:09:01 +0000 UTC FinishedAt: 2026-09-06 01:25:20 +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:*93ee1e99-911a-4e8f-adb9-a8cfb62e6a26,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-workflowzlg9z/series-workflowzlg9z-convert-artifact-3065364583/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": "cd055b4c-67ae-46b8-9263-d828c1dd96f8", "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-workflowzlg9z/series-workflowzlg9z-build-action-3044062973/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-06 01:25:30 +0000 UTC FinishedAt: 2026-09-06 01:25:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-06 01:25:30 +0000 UTC FinishedAt: 2026-09-06 01:25:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-06 01:25:30 +0000 UTC FinishedAt: 2026-09-06 01:25:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-06 01:25:30 +0000 UTC FinishedAt: 2026-09-06 01:25:35 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzlg9z/series-workflowzlg9z-convert-artifact-1033219606/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-06 01:25:40 +0000 UTC FinishedAt: 2026-09-06 01:28:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-06 01:25:40 +0000 UTC FinishedAt: 2026-09-06 01:28:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*cd055b4c-67ae-46b8-9263-d828c1dd96f8,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-workflowzlg9z/series-workflowzlg9z-build-action-3044062973/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-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-06 01:28:54 +0000 UTC FinishedAt: 2026-09-06 01:28:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-06 01:28:54 +0000 UTC FinishedAt: 2026-09-06 01:28:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-06 01:28:54 +0000 UTC FinishedAt: 2026-09-06 01:44:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-06 01:28:54 +0000 UTC FinishedAt: 2026-09-06 01:44:45 +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:*93ee1e99-911a-4e8f-adb9-a8cfb62e6a26,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-workflowzlg9z/series-workflowzlg9z-convert-artifact-1033219606/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": "61f4cb02-7fe2-478e-9eac-e48bcf31064d", "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-workflowzlg9z/series-workflowzlg9z-build-action-2812571418/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-06 01:28:54 +0000 UTC FinishedAt: 2026-09-06 01:44:35 +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:*93ee1e99-911a-4e8f-adb9-a8cfb62e6a26,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-workflowzlg9z/series-workflowzlg9z-convert-artifact-1033219606/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": "61f4cb02-7fe2-478e-9eac-e48bcf31064d", "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-workflowzlg9z/series-workflowzlg9z-build-action-2812571418/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-06 01:44:45 +0000 UTC FinishedAt: 2026-09-06 01:44:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-06 01:44:45 +0000 UTC FinishedAt: 2026-09-06 01:44:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-06 01:44:45 +0000 UTC FinishedAt: 2026-09-06 01:46:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-06 01:44:45 +0000 UTC FinishedAt: 2026-09-06 01:46:29 +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:*61f4cb02-7fe2-478e-9eac-e48bcf31064d,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-workflowzlg9z/series-workflowzlg9z-build-action-2812571418/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-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-06 01:46:39 +0000 UTC FinishedAt: 2026-09-06 04:49:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-06 01:46:39 +0000 UTC FinishedAt: 2026-09-06 04:49:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*cd055b4c-67ae-46b8-9263-d828c1dd96f8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*61f4cb02-7fe2-478e-9eac-e48bcf31064d,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-workflowzlg9z/series-workflowzlg9z-build-action-3044062973/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-workflowzlg9z/series-workflowzlg9z-build-action-2812571418/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-06 01:46:39 +0000 UTC FinishedAt: 2026-09-06 01:46:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-06 01:46:39 +0000 UTC FinishedAt: 2026-09-06 01:46:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzlg9z/series-workflowzlg9z-convert-artifact-758481595/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-06 01:46:39 +0000 UTC FinishedAt: 2026-09-06 01:46:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-06 01:46:39 +0000 UTC FinishedAt: 2026-09-06 01:46:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-06 01:46:39 +0000 UTC FinishedAt: 2026-09-06 01:46:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-06 01:46:49 +0000 UTC FinishedAt: 2026-09-06 04:49:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlg9z[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["__do_sys_listns","do_listns","do_listns_userns"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"21860bb220225edeb87e9c831e6bf25c620e2126","config_name":"upstream-apparmor-kasan.config","enable_configs":["NAMESPACES","USER_NS"],"series_id":"526f51b5-be88-4359-9d65-5aa07041d1f7","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-06 01:46:49 +0000 UTC FinishedAt: 2026-09-06 04:49:03 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*cd055b4c-67ae-46b8-9263-d828c1dd96f8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*61f4cb02-7fe2-478e-9eac-e48bcf31064d,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-workflowzlg9z/series-workflowzlg9z-build-action-3044062973/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-workflowzlg9z/series-workflowzlg9z-build-action-2812571418/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-workflowzlg9z/series-workflowzlg9z-convert-artifact-758481595/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,}