Name: series-workflow8sx2l Phase: Succeeded StartedAt: 2026-08-31 11:19:26 +0000 UTC FinishedAt: 2026-08-31 15:44:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[0] Phase: Succeeded StartedAt: 2026-08-31 11:19:26 +0000 UTC FinishedAt: 2026-08-31 12:05:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[0].run-triage Phase: Succeeded StartedAt: 2026-08-31 11:19:26 +0000 UTC FinishedAt: 2026-08-31 12:05:36 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "da6c37ed8beb273e3308e42d4bca3ce11b4432fa", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "GUP_TEST", "DEBUG_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "da6c37ed8beb273e3308e42d4bca3ce11b4432fa", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "GUP_TEST", "DEBUG_FS" ], "series_id": "b3a42e49-3d66-4fbe-9936-92cb2729840d" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "gup_test_ioctl", "__gup_test_ioctl" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0dVUF9URVNUJiMzNDssCiAgICAmIzM0O0RFQlVHX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Z3VwX3Rlc3RfaW9jdGwmIzM0OywKICAgICYjMzQ7X19ndXBfdGVzdF9pb2N0bCYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNoYW5nZXMgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXHUwMDNlc2l6ZWAgZnJvbSBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCB0byBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgIGluIGBfX2d1cF90ZXN0X2lvY3RsKClgIChgbW0vZ3VwX3Rlc3QuY2ApLiBUaGUgYHN0cnVjdCBndXBfdGVzdGAgYnVmZmVyIGlzIGZ1bGx5IGluaXRpYWxpemVkIHZpYSBgY29weV9mcm9tX3VzZXJgIGF0IHRoZSBlbnRyeSBvZiBgZ3VwX3Rlc3RfaW9jdGxgIGJlZm9yZSBiZWluZyBtb2RpZmllZCBhbmQgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRoIGBjb3B5X3RvX3VzZXJgLiBUaGUgY2hhbmdlIHNvbGVseSB1cGRhdGVzIGFuIGFyaXRobWV0aWMgY2FsY3VsYXRpb24gZm9yIGFuIG91dHB1dCBmaWVsZCByZXBvcnRpbmcgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsbHkgcGlubmVkIGJ5dGVzLiBJdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFsbG9jYXRpb25zLCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBvciBrZXJuZWwgaW5mby1sZWFrcy4gVGhlcmVmb3JlLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgX19ndXBfdGVzdF9pb2N0bCgpIGluIG1tL2d1cF90ZXN0LmMgdG8gY29ycmVjdGx5IHNldCB0aGUgcmV0dXJuZWQgc2l6ZSB0byAmIzM5O25yX3BhZ2VzICogUEFHRV9TSVpFJiMzOTsgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgJiMzOTthZGRyIC0gZ3VwLVx1MDAzZWFkZHImIzM5OyB3aGljaCBjb3VsZCBiZSBpbmNvcnJlY3QgaWYgZ2V0X3VzZXJfcGFnZXMvcGluX3VzZXJfcGFnZXMgdGVybWluYXRlZCBlYXJseS4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGlvY3RsIGludGVyZmFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDJhNzM1Njg4ZWE2YmU3YWYyZDM1M2Q5YjljOTAzMjM2MGVmNmFiM2JcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAzMSAxMjowMTowNiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xuaW5kZXggNDRjMWNkZmI5YzM3MS4uMTg1YmEzYmI4ZWQxMCAxMDA2NDRcbi0tLSBhL21tL2d1cF90ZXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2d1cF90ZXN0LmNcbkBAIC0xODgsNyAmIzQzOzE4OCw3IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIFx0bnJfcGFnZXMgPSBpO1xuIFxuIFx0Z3VwLVx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuLVx0Z3VwLVx1MDAzZXNpemUgPSBhZGRyIC0gZ3VwLVx1MDAzZWFkZHI7XG4mIzQzO1x0Z3VwLVx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcbiBcbiBcdC8qXG4gXHQgKiBUYWtlIGFuIHVuLWJlbmNobWFyay10aW1lZCBtb21lbnQgdG8gdmVyaWZ5IERNQSBwaW5uZWRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4zbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtHVVBfVEVTVCYjMzQ7LAogICAgJiMzNDtERUJVR19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2d1cF90ZXN0X2lvY3RsJiMzNDssCiAgICAmIzM0O19fZ3VwX3Rlc3RfaW9jdGwmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyBfX2d1cF90ZXN0X2lvY3RsKCkgaW4gbW0vZ3VwX3Rlc3QuYyB0byBjb3JyZWN0bHkgc2V0IHRoZSByZXR1cm5lZCBzaXplIHRvICYjMzk7bnJfcGFnZXMgKiBQQUdFX1NJWkUmIzM5OyByYXRoZXIgdGhhbiBjYWxjdWxhdGluZyAmIzM5O2FkZHIgLSBndXAtXHUwMDNlYWRkciYjMzk7IHdoaWNoIGNvdWxkIGJlIGluY29ycmVjdCBpZiBnZXRfdXNlcl9wYWdlcy9waW5fdXNlcl9wYWdlcyB0ZXJtaW5hdGVkIGVhcmx5LiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW9jdGwgaW50ZXJmYWNlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMmE3MzU2ODhlYTZiZTdhZjJkMzUzZDliOWM5MDMyMzYwZWY2YWIzYgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gQXVnIDMxIDEyOjAxOjA2IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vZ3VwX3Rlc3QuYyBiL21tL2d1cF90ZXN0LmMKaW5kZXggNDRjMWNkZmI5YzM3MS4uMTg1YmEzYmI4ZWQxMCAxMDA2NDQKLS0tIGEvbW0vZ3VwX3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9ndXBfdGVzdC5jCkBAIC0xODgsNyAmIzQzOzE4OCw3IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLAogCW5yX3BhZ2VzID0gaTsKIAogCWd1cC0mZ3Q7Z2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7Ci0JZ3VwLSZndDtzaXplID0gYWRkciAtIGd1cC0mZ3Q7YWRkcjsKJiM0MzsJZ3VwLSZndDtzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7CiAKIAkvKgogCSAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDcwCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjM2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIEtlcm5lbCBQYXRjaDogZ3VwX3Rlc3QuYyoqCgpPa2F5LCBzbyB0aGUgdXNlciB3YW50cyBtZSB0byB0YWtlIGEgbG9vayBhdCBhIHBhdGNoLCBzcGVjaWZpY2FsbHkgYSBgZGlmZmAgZm9yIGBtbS9ndXBfdGVzdC5jYC4gVGhlIGNvcmUgc2VlbXMgdG8gYmUgcmVsYXRlZCB0byBgZ3VwYCB0ZXN0aW5nLCB3aGljaCBsaWtlbHkgcGVydGFpbnMgdG8gJiMzNDtnZXQgdXNlciBwYWdlcyYjMzQ7IG9yIGEgc2ltaWxhciBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHF1aWNrbHkgdW5kZXJzdGFuZCB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZS4gTGV0JiMzOTtzIHNlZS4uLiBhIGNvbW1pdCwgYW5kIHRoZSBkaWZmIHNob3dzIGEgbW9kaWZpY2F0aW9uIGFyb3VuZCBsaW5lIDE4OC4KCkkgc2VlIGEgY2hhbmdlIHdoZXJlIHRoZSBjYWxjdWxhdGlvbiBvZiBgZ3VwLSZndDtzaXplYCBoYXMgYmVlbiBtb2RpZmllZC4gUHJldmlvdXNseSwgaXQgd2FzIGBhZGRyIC0gZ3VwLSZndDthZGRyYCwgYnV0IG5vdyBpdCYjMzk7cyBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgLiBBaCwgSSBzZWUhIEJlZm9yZSBpdCB3YXMgcHJlc3VtYWJseSBjYWxjdWxhdGluZyB0aGUgc2l6ZSBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzdGFydGluZyBhZGRyZXNzIGFuZCB0aGUgZW5kaW5nIGFkZHJlc3MsIGFuZCBub3csIGl0JiMzOTtzIGV4cGxpY2l0bHkgY29tcHV0aW5nIGl0IGJ5IG11bHRpcGx5aW5nIHRoZSBudW1iZXIgb2YgcGFnZXMgYnkgdGhlIHBhZ2Ugc2l6ZS4gVGhpcyBpcyBwcm9iYWJseSBhbiBpbXByb3ZlbWVudCBmb3IgY2xhcml0eSBhbmQgYWNjdXJhY3kuIEl0IHN0cm9uZ2x5IHN1Z2dlc3RzIHRoYXQgdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uIHdhcyBwcm9uZSB0byBlcnJvcnMsIHBvc3NpYmx5IGR1ZSB0byBhbGlnbm1lbnQgaXNzdWVzIG9yIGFuIGluY29ycmVjdCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYnVmZmVyIGJvdW5kYXJpZXMsIG9yLCBwZXJoYXBzLCB3YXMgbWlzbGVhZGluZy4gTm93LCBpdCYjMzk7cyBkaXJlY3RseSBkZXJpdmVkIGZyb20gdGhlIG51bWJlciBvZiBwYWdlcywgd2hpY2ggaXMgY2xlYW5lciBhbmQgbW9yZSByb2J1c3QuCgpJJiMzOTtsbCBoYXZlIHRvIGludmVzdGlnYXRlIGlmIHRoaXMgaXMgYSBjb3JyZWN0aW9uIG9mIGEgZGVmZWN0LCBvciBzaW1wbHkgYW4gaW1wcm92ZW1lbnQuIExldCYjMzk7cyBzZWUsIHdoYXQgZWxzZSBkb2VzIHRoZSBwYXRjaCB0b3VjaC4uLiBUaGUgc3Vycm91bmRpbmcgY29kZSBzZWVtcyByZWxhdGVkIHRvIGJlbmNobWFya2luZyB0aGUgZ2V0X3VzZXJfcGFnZXMgZnVuY3Rpb25hbGl0eSBhbmQgdmVyaWZ5aW5nIERNQS1waW5uZWQgcGFnZXMsIHByb2JhYmx5IGZvciBwZXJmb3JtYW5jZS4gSSBleHBlY3QgdGhpcyBjaGFuZ2Ugd2lsbCBtYWtlIHRoZSBiZW5jaG1hcmtzIG1vcmUgcHJlY2lzZS4gVGhpcyBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSBhbmQgcHJvYmFibHkgYSBnb29kIGNoYW5nZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE3MDpcdFx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNzE6XHRcdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4gMTcyOlx0XHRcdFx0ZWxzZVxuIDE3MzpcdFx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNzQ6XHRcdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4gMTc1Olx0XHRcdFx0YnJlYWs7XG4gMTc2Olx0XHRcdGRlZmF1bHQ6XG4gMTc3Olx0XHRcdFx0cmV0ID0gLUVJTlZBTDtcbiAxNzg6XHRcdFx0XHRnb3RvIHVubG9jaztcbiAxNzk6XHRcdFx0fVxuIDE4MDpcdFxuIDE4MTpcdFx0XHRpZiAobnIgXHUwMDNjPSAwKVxuIDE4MjpcdFx0XHRcdGJyZWFrO1xuIDE4MzpcdFx0XHRpICYjNDM7PSBucjtcbiAxODQ6XHRcdH1cbiAxODU6XHRcdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XG4gMTg2Olx0XG4gMTg3Olx0XHQvKiBTaGlmdGluZyB0aGUgbWVhbmluZyBvZiBucl9wYWdlczogbm93IGl0IGlzIGFjdHVhbCBudW1iZXIgcGlubmVkOiAqL1xuIDE4ODpcdFx0bnJfcGFnZXMgPSBpO1xuIDE4OTpcdFxuIDE5MDpcdFx0Z3VwLVx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuIDE5MTpcdFx0Z3VwLVx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcbiAxOTI6XHRcbiAxOTM6XHRcdC8qXG4gMTk0Olx0XHQgKiBUYWtlIGFuIHVuLWJlbmNobWFyay10aW1lZCBtb21lbnQgdG8gdmVyaWZ5IERNQSBwaW5uZWRcbiAxOTU6XHRcdCAqIHN0YXRlOiBwcmludCBhIHdhcm5pbmcgaWYgYW55IG5vbi1kbWEtcGlubmVkIHBhZ2VzIGFyZSBmb3VuZDpcbiAxOTY6XHRcdCAqL1xuIDE5NzpcdFx0dmVyaWZ5X2RtYV9waW5uZWQoY21kLCBwYWdlcywgbnJfcGFnZXMpO1xuIDE5ODpcdFxuIDE5OTpcdFx0aWYgKGNtZCA9PSBEVU1QX1VTRVJfUEFHRVNfVEVTVClcbiAyMDA6XHRcdFx0ZHVtcF9wYWdlc190ZXN0KGd1cCwgcGFnZXMsIG5yX3BhZ2VzKTtcbiAyMDE6XHRcbiAyMDI6XHRcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcbiAyMDM6XHRcbiAyMDQ6XHRcdHB1dF9iYWNrX3BhZ2VzKGNtZCwgcGFnZXMsIG5yX3BhZ2VzLCBndXAtXHUwMDNldGVzdF9mbGFncyk7XG4gMjA1Olx0XG4gMjA2Olx0XHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xuIDIwNzpcdFx0Z3VwLVx1MDAzZXB1dF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuIDIwODpcdFxuIDIwOTpcdHVubG9jazpcbiAyMTA6XHRcdGlmIChuZWVkc19tbWFwX2xvY2spXG4gMjExOlx0XHRcdG1tYXBfcmVhZF91bmxvY2soY3VycmVudC1cdTAwM2VtbSk7XG4gMjEyOlx0ZnJlZV9wYWdlczpcbiAyMTM6XHRcdGt2ZnJlZShwYWdlcyk7XG4gMjE0Olx0XHRyZXR1cm4gcmV0O1xuIDIxNTpcdH1cbiAyMTY6XHRcbiAyMTc6XHRzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcbiAyMTg6XHR7XG4gMjE5Olx0XHRpZiAoZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcykge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM0MDYKCQkJCQkJCW91dHB1dDogMjUKCQkJCQkJCXRob3VnaHRzOiA0MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLgoKKipFeGFtaW5pbmcgYGd1cF90ZXN0LmNgKioKCkFscmlnaHQsIG15IGZpcnN0IGluc3RpbmN0IGlzIHRvIGdldCBhIGhhbmRsZSBvbiBgZ3VwX3Rlc3QuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBmaWxlIGlzIGFib3V0LCBhbmQgdGhlIGJlc3Qgd2F5IHRvIHN0YXJ0IGlzIGJ5IGEgcXVpY2sgc2Nhbi4gTGV0JiMzOTtzIHNlZSB3aGF0IHdlIGhhdmUgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSwgYW5kIHRoZW4gSSYjMzk7bGwgcXVpY2tseSBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyB0byBzZWUgd2hlcmUgaXQmIzM5O3MgZGVmaW5lZCBhbmQgd2hhdCBjb25maWd1cmF0aW9ucyBtaWdodCBlbmFibGUgaXQuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGluaXRpYWwgY29udGV4dC4gRnJvbSB0aGVyZSwgSSBjYW4gZGVjaWRlIGhvdyBkZWVwIEkgbmVlZCB0byBnbyBiYXNlZCBvbiB3aGF0IEkmIzM5O20gdHJ5aW5nIHRvIGFjY29tcGxpc2gsIGJ1dCB0aGlzIGlzIHRoZSByaWdodCBzdGFydGluZyBwb2ludCBmb3IgYW55IGdvb2QgaW52ZXN0aWdhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtHVVBfVEVTVCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9MTI4Mj1jb25maWcgUEVSQ1BVX1NUQVRTXG4tLVxubW0vS2NvbmZpZy0xMjg4LVxubW0vS2NvbmZpZzoxMjg5OmNvbmZpZyBHVVBfVEVTVFxubW0vS2NvbmZpZy0xMjkwLVx0Ym9vbCBcJiMzNDtFbmFibGUgaW5mcmFzdHJ1Y3R1cmUgZm9yIGdldF91c2VyX3BhZ2VzKCktcmVsYXRlZCB1bml0IHRlc3RzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy0xMzA4LVxubW0vS2NvbmZpZzoxMzA5OmNvbW1lbnQgXCYjMzQ7R1VQX1RFU1QgbmVlZHMgdG8gaGF2ZSBERUJVR19GUyBlbmFibGVkXCYjMzQ7XG5tbS9LY29uZmlnOjEzMTA6XHRkZXBlbmRzIG9uICFHVVBfVEVTVCBcdTAwMjZcdTAwMjYgIURFQlVHX0ZTXG5tbS9LY29uZmlnLTEzMTEtXG4tLVxubW0vTWFrZWZpbGU9MTA5PW9iai0kKENPTkZJR19DR1JPVVBfSFVHRVRMQikgJiM0Mzs9IGh1Z2V0bGJfY2dyb3VwLm9cbm1tL01ha2VmaWxlOjExMDpvYmotJChDT05GSUdfR1VQX1RFU1QpICYjNDM7PSBndXBfdGVzdC5vXG5tbS9NYWtlZmlsZS0xMTEtb2JqLSQoQ09ORklHX0RNQVBPT0xfVEVTVCkgJiM0Mzs9IGRtYXBvb2xfdGVzdC5vXG4tLVxubW0vZ3VwX3Rlc3QuYz0xNz1zdGF0aWMgdm9pZCBwdXRfYmFja19wYWdlcyh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuLS1cbm1tL2d1cF90ZXN0LmMtMzQtXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxubW0vZ3VwX3Rlc3QuYzozNTpcdFx0aWYgKGd1cF90ZXN0X2ZsYWdzIFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTikge1xubW0vZ3VwX3Rlc3QuYy0zNi1cdFx0XHR1bnBpbl91c2VyX3BhZ2VzKHBhZ2VzLCBucl9wYWdlcyk7XG4tLVxubW0vZ3VwX3Rlc3QuYz03Nj1zdGF0aWMgdm9pZCBkdW1wX3BhZ2VzX3Rlc3Qoc3RydWN0IGd1cF90ZXN0ICpndXAsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4tLVxubW0vZ3VwX3Rlc3QuYy04NS1cdCAqL1xubW0vZ3VwX3Rlc3QuYzo4NjpcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpJiM0MzsmIzQzOykge1xubW0vZ3VwX3Rlc3QuYy04Ny1cdFx0aWYgKGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXSBcdTAwM2UgbnJfcGFnZXMpIHtcbi0tXG5tbS9ndXBfdGVzdC5jLTkzLVxubW0vZ3VwX3Rlc3QuYzo5NDpcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpJiM0MzsmIzQzOykge1xubW0vZ3VwX3Rlc3QuYy05NS1cdFx0aW5kZXhfdG9fZHVtcCA9IGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXTtcbi0tXG5tbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbi0tXG5tbS9ndXBfdGVzdC5jLTE2OC1cdFx0Y2FzZSBEVU1QX1VTRVJfUEFHRVNfVEVTVDpcbm1tL2d1cF90ZXN0LmM6MTY5Olx0XHRcdGlmIChndXAtXHUwMDNldGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXG5tbS9ndXBfdGVzdC5jLTE3MC1cdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG4tLVxubW0vZ3VwX3Rlc3QuaC0xLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyICovXG5tbS9ndXBfdGVzdC5oOjI6I2lmbmRlZiBfX0dVUF9URVNUX0hcbm1tL2d1cF90ZXN0Lmg6MzojZGVmaW5lIF9fR1VQX1RFU1RfSFxubW0vZ3VwX3Rlc3QuaC00LVxuLS1cbm1tL2d1cF90ZXN0LmgtMTYtXG5tbS9ndXBfdGVzdC5oOjE3OiNkZWZpbmUgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVBcdFx0OFxubW0vZ3VwX3Rlc3QuaC0xOC1cbm1tL2d1cF90ZXN0Lmg6MTk6I2RlZmluZSBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTlx0MHgxXG5tbS9ndXBfdGVzdC5oLTIwLVxubW0vZ3VwX3Rlc3QuaD0yMT1zdHJ1Y3QgZ3VwX3Rlc3Qge1xuLS1cbm1tL2d1cF90ZXN0LmgtMzItXHQgKi9cbm1tL2d1cF90ZXN0Lmg6MzM6XHRfX3UzMiB3aGljaF9wYWdlc1tHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUF07XG5tbS9ndXBfdGVzdC5oLTM0LX07XG4tLVxubW0vZ3VwX3Rlc3QuaD0zOT1zdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3Qge1xuLS1cbm1tL2d1cF90ZXN0LmgtNDQtXG5tbS9ndXBfdGVzdC5oOjQ1OiNlbmRpZlx0LyogX19HVVBfVEVTVF9IICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDY3MgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaWdnaW5nIGludG8gS2VybmVsIENvbmZpZ3VyYXRpb24gZm9yIEdVUF9URVNUKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBgR1VQX1RFU1RgIHRoaW5nIGlzIGFuZCBob3cgaXQmIzM5O3MgdXNlZC4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gZGl2ZSBpbnRvIHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gR2l2ZW4gbXkgZXhwZXJpZW5jZSB3aXRoIGtlcm5lbCBjb25maWd1cmF0aW9uLCBJJiMzOTttIGJldHRpbmcgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGRlcGVuZGVuY2llcyBhbmQgYSBwb3RlbnRpYWwgZGVmaW5pdGlvbiwgd2lsbCBiZSBhcm91bmQgbGluZSAxMjg5LiBUaGF0JiMzOTtzIGEgcmVhc29uYWJsZSBzcG90IHRvIHN0YXJ0IHNpbmNlIEtjb25maWcgZmlsZXMgdGVuZCB0byBiZSBvcmdhbml6ZWQgbG9naWNhbGx5LiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgY2FuIHVuY292ZXIgYWJvdXQgYEdVUF9URVNUYCBpbiB0aGF0IHNlY3Rpb24uIEhvcGVmdWxseSwgSSBjYW4gcXVpY2tseSBncmFzcCBpdHMgcHVycG9zZSBhbmQgYW55IGNvbmRpdGlvbnMgdGhhdCBkaWN0YXRlIGl0cyBhdmFpbGFiaWxpdHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTI4NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMjg1Olx0XHQgIFRoaXMgZmVhdHVyZSBjb2xsZWN0cyBhbmQgZXhwb3NlcyBzdGF0aXN0aWNzIHZpYSBkZWJ1Z2ZzLiBUaGVcbjEyODY6XHRcdCAgaW5mb3JtYXRpb24gaW5jbHVkZXMgZ2xvYmFsIGFuZCBwZXIgY2h1bmsgc3RhdGlzdGljcywgd2hpY2ggY2FuXG4xMjg3Olx0XHQgIGJlIHVzZWQgdG8gaGVscCB1bmRlcnN0YW5kIHBlcmNwdSBtZW1vcnkgdXNhZ2UuXG4xMjg4Olx0XG4xMjg5Olx0Y29uZmlnIEdVUF9URVNUXG4xMjkwOlx0XHRib29sIFwmIzM0O0VuYWJsZSBpbmZyYXN0cnVjdHVyZSBmb3IgZ2V0X3VzZXJfcGFnZXMoKS1yZWxhdGVkIHVuaXQgdGVzdHNcJiMzNDtcbjEyOTE6XHRcdGRlcGVuZHMgb24gREVCVUdfRlNcbjEyOTI6XHRcdGhlbHBcbjEyOTM6XHRcdCAgUHJvdmlkZXMgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QsIHdoaWNoIGluIHR1cm4gcHJvdmlkZXMgYSB3YXlcbjEyOTQ6XHRcdCAgdG8gbWFrZSBpb2N0bCBjYWxscyB0aGF0IGNhbiBsYXVuY2gga2VybmVsLWJhc2VkIHVuaXQgdGVzdHMgZm9yXG4xMjk1Olx0XHQgIHRoZSBnZXRfdXNlcl9wYWdlcyooKSBhbmQgcGluX3VzZXJfcGFnZXMqKCkgZmFtaWx5IG9mIEFQSSBjYWxscy5cbjEyOTY6XHRcbjEyOTc6XHRcdCAgVGhlc2UgdGVzdHMgaW5jbHVkZSBiZW5jaG1hcmsgdGVzdGluZyBvZiB0aGUgX2Zhc3QgdmFyaWFudHMgb2ZcbjEyOTg6XHRcdCAgZ2V0X3VzZXJfcGFnZXMqKCkgYW5kIHBpbl91c2VyX3BhZ2VzKigpLCBhcyB3ZWxsIGFzIHNtb2tlIHRlc3RzIG9mXG4xMjk5Olx0XHQgIHRoZSBub24tX2Zhc3QgdmFyaWFudHMuXG4xMzAwOlx0XG4xMzAxOlx0XHQgIFRoZXJlIGlzIGFsc28gYSBzdWItdGVzdCB0aGF0IGFsbG93cyBydW5uaW5nIGR1bXBfcGFnZSgpIG9uIGFueVxuMTMwMjpcdFx0ICBvZiB1cCB0byBlaWdodCBwYWdlcyAoc2VsZWN0ZWQgYnkgY29tbWFuZCBsaW5lIGFyZ3MpIHdpdGhpbiB0aGVcbjEzMDM6XHRcdCAgcmFuZ2Ugb2YgdXNlci1zcGFjZSBhZGRyZXNzZXMuIFRoZXNlIHBhZ2VzIGFyZSBlaXRoZXIgcGlubmVkIHZpYVxuMTMwNDpcdFx0ICBwaW5fdXNlcl9wYWdlcyooKSwgb3IgcGlubmVkIHZpYSBnZXRfdXNlcl9wYWdlcyooKSwgYXMgc3BlY2lmaWVkXG4xMzA1Olx0XHQgIGJ5IG90aGVyIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuXG4xMzA2Olx0XG4xMzA3Olx0XHQgIFNlZSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jXG4xMzA4Olx0XG4xMzA5Olx0Y29tbWVudCBcJiMzNDtHVVBfVEVTVCBuZWVkcyB0byBoYXZlIERFQlVHX0ZTIGVuYWJsZWRcJiMzNDtcbjEzMTA6XHRcdGRlcGVuZHMgb24gIUdVUF9URVNUIFx1MDAyNlx1MDAyNiAhREVCVUdfRlNcbjEzMTE6XHRcbjEzMTI6XHRjb25maWcgR1VQX0dFVF9QWFhfTE9XX0hJR0hcbjEzMTM6XHRcdGJvb2xcbjEzMTQ6XHRcbjEzMTU6XHRjb25maWcgRE1BUE9PTF9URVNUXG4xMzE2Olx0XHR0cmlzdGF0ZSBcJiMzNDtFbmFibGUgYSBtb2R1bGUgdG8gcnVuIHRpbWUgdGVzdHMgb24gZG1hX3Bvb2xcJiMzNDtcbjEzMTc6XHRcdGRlcGVuZHMgb24gSEFTX0RNQVxuMTMxODpcdFx0aGVscFxuMTMxOTpcdFx0ICBQcm92aWRlcyBhIHRlc3QgbW9kdWxlIHRoYXQgd2lsbCBhbGxvY2F0ZSBhbmQgZnJlZSBtYW55IGJsb2NrcyBvZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU0NzAKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGNvbW1pdCBhbmQgZmlndXJlIG91dCB3aGF0JiMzOTtzIGNoYW5nZWQgd2l0aGluIGBtbS9ndXBfdGVzdC5jYC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRoZSBgX19ndXBfdGVzdF9pb2N0bGAgZnVuY3Rpb24uIEkgbmVlZCBhIHNvbGlkIHVuZGVyc3RhbmRpbmcgb2YgaG93IGl0IG9wZXJhdGVzIGFuZCB3aGVyZSB0aGUgbW9kaWZpY2F0aW9ucyB3ZXJlIG1hZGUuIEkmIzM5O20gZ29pbmcgdG8gY2FyZWZ1bGx5IGRpc3NlY3QgaXRzIGVudGlyZSBzdHJ1Y3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vZ3VwX3Rlc3QuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDEwNTpcdH1cbiAxMDY6XHRcbiAxMDc6XHRzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbiAxMDg6XHRcdFx0c3RydWN0IGd1cF90ZXN0ICpndXApXG4gMTA5Olx0e1xuIDExMDpcdFx0a3RpbWVfdCBzdGFydF90aW1lLCBlbmRfdGltZTtcbiAxMTE6XHRcdHVuc2lnbmVkIGxvbmcgaSwgbnJfcGFnZXMsIGFkZHIsIG5leHQ7XG4gMTEyOlx0XHRsb25nIG5yO1xuIDExMzpcdFx0c3RydWN0IHBhZ2UgKipwYWdlcztcbiAxMTQ6XHRcdHVuc2lnbmVkIGxvbmcgZW5kO1xuIDExNTpcdFx0aW50IHJldCA9IDA7XG4gMTE2Olx0XHRib29sIG5lZWRzX21tYXBfbG9jayA9XG4gMTE3Olx0XHRcdGNtZCAhPSBHVVBfRkFTVF9CRU5DSE1BUksgXHUwMDI2XHUwMDI2IGNtZCAhPSBQSU5fRkFTVF9CRU5DSE1BUks7XG4gMTE4Olx0XG4gMTE5Olx0XHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYKVxuIDEyMDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjE6XHRcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG4gMTIyOlx0XHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxuIDEyMzpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjQ6XHRcbiAxMjU6XHRcdG5yX3BhZ2VzID0gZ3VwLVx1MDAzZXNpemUgLyBQQUdFX1NJWkU7XG4gMTI2Olx0XHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XG4gMTI3Olx0XHRpZiAoIXBhZ2VzKVxuIDEyODpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAxMjk6XHRcbiAxMzA6XHRcdGlmIChuZWVkc19tbWFwX2xvY2sgXHUwMDI2XHUwMDI2IG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKGN1cnJlbnQtXHUwMDNlbW0pKSB7XG4gMTMxOlx0XHRcdHJldCA9IC1FSU5UUjtcbiAxMzI6XHRcdFx0Z290byBmcmVlX3BhZ2VzO1xuIDEzMzpcdFx0fVxuIDEzNDpcdFxuIDEzNTpcdFx0aSA9IDA7XG4gMTM2Olx0XHRuciA9IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcbiAxMzc6XHRcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcbiAxMzg6XHRcdGZvciAoYWRkciA9IGd1cC1cdTAwM2VhZGRyOyBhZGRyIFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XG4gMTM5Olx0XHRcdGlmIChuciAhPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwpXG4gMTQwOlx0XHRcdFx0YnJlYWs7XG4gMTQxOlx0XG4gMTQyOlx0XHRcdG5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFO1xuIDE0MzpcdFx0XHRpZiAobmV4dCBcdTAwM2UgZW5kKSB7XG4gMTQ0Olx0XHRcdFx0bmV4dCA9IGVuZDtcbiAxNDU6XHRcdFx0XHRuciA9IChuZXh0IC0gYWRkcikgLyBQQUdFX1NJWkU7XG4gMTQ2Olx0XHRcdH1cbiAxNDc6XHRcbiAxNDg6XHRcdFx0c3dpdGNoIChjbWQpIHtcbiAxNDk6XHRcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4gMTUwOlx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1MTpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTI6XHRcdFx0XHRicmVhaztcbiAxNTM6XHRcdFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcbiAxNTQ6XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNTU6XHRcdFx0XHRicmVhaztcbiAxNTY6XHRcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMTU3Olx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1ODpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTk6XHRcdFx0XHRicmVhaztcbiAxNjA6XHRcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAxNjE6XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNjI6XHRcdFx0XHRicmVhaztcbiAxNjM6XHRcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxuIDE2NDpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXG4gMTY1Olx0XHRcdFx0XHRcdCAgICBndXAtXHUwMDNlZ3VwX2ZsYWdzIHwgRk9MTF9MT05HVEVSTSxcbiAxNjY6XHRcdFx0XHRcdFx0ICAgIHBhZ2VzICYjNDM7IGkpO1xuIDE2NzpcdFx0XHRcdGJyZWFrO1xuIDE2ODpcdFx0XHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxuIDE2OTpcdFx0XHRcdGlmIChndXAtXHUwMDNldGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXG4gMTcwOlx0XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3MTpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzI6XHRcdFx0XHRlbHNlXG4gMTczOlx0XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3NDpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzU6XHRcdFx0XHRicmVhaztcbiAxNzY6XHRcdFx0ZGVmYXVsdDpcbiAxNzc6XHRcdFx0XHRyZXQgPSAtRUlOVkFMO1xuIDE3ODpcdFx0XHRcdGdvdG8gdW5sb2NrO1xuIDE3OTpcdFx0XHR9XG4gMTgwOlx0XG4gMTgxOlx0XHRcdGlmIChuciBcdTAwM2M9IDApXG4gMTgyOlx0XHRcdFx0YnJlYWs7XG4gMTgzOlx0XHRcdGkgJiM0Mzs9IG5yO1xuIDE4NDpcdFx0fVxuIDE4NTpcdFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcbiAxODY6XHRcbiAxODc6XHRcdC8qIFNoaWZ0aW5nIHRoZSBtZWFuaW5nIG9mIG5yX3BhZ2VzOiBub3cgaXQgaXMgYWN0dWFsIG51bWJlciBwaW5uZWQ6ICovXG4gMTg4Olx0XHRucl9wYWdlcyA9IGk7XG4gMTg5Olx0XG4gMTkwOlx0XHRndXAtXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XG4gMTkxOlx0XHRndXAtXHUwMDNlc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuIDE5MjpcdFxuIDE5MzpcdFx0LypcbiAxOTQ6XHRcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxuIDE5NTpcdFx0ICogc3RhdGU6IHByaW50IGEgd2FybmluZyBpZiBhbnkgbm9uLWRtYS1waW5uZWQgcGFnZXMgYXJlIGZvdW5kOlxuIDE5NjpcdFx0ICovXG4gMTk3Olx0XHR2ZXJpZnlfZG1hX3Bpbm5lZChjbWQsIHBhZ2VzLCBucl9wYWdlcyk7XG4gMTk4Olx0XG4gMTk5Olx0XHRpZiAoY21kID09IERVTVBfVVNFUl9QQUdFU19URVNUKVxuIDIwMDpcdFx0XHRkdW1wX3BhZ2VzX3Rlc3QoZ3VwLCBwYWdlcywgbnJfcGFnZXMpO1xuIDIwMTpcdFxuIDIwMjpcdFx0c3RhcnRfdGltZSA9IGt0aW1lX2dldCgpO1xuIDIwMzpcdFxuIDIwNDpcdFx0cHV0X2JhY2tfcGFnZXMoY21kLCBwYWdlcywgbnJfcGFnZXMsIGd1cC1cdTAwM2V0ZXN0X2ZsYWdzKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzE0NwoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDMzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgR1VQIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEJlZm9yZSB0aGUgcGF0Y2gsIHRoZSBjb2RlIHdhcyBpdGVyYXRpbmcgdGhyb3VnaCBhIG1lbW9yeSByZWdpb24uIFRoZSBjb3JlIG9mIHRoZSBwcm9ibGVtIHNlZW1zIHRvIGxpZSB3aXRoaW4gdGhpcyBsb29wOiBgZm9yIChhZGRyID0gZ3VwLSZndDthZGRyOyBhZGRyICZsdDsgZW5kOyBhZGRyID0gbmV4dCkge2AuIFRoZSBjcml0aWNhbCB0aGluZyBoZXJlIGlzIGhvdyBgYWRkcmAgaXMgdXBkYXRlZC4gQXQgdGhlIGVuZCBvZiBlYWNoIGl0ZXJhdGlvbiwgYGFkZHJgIGlzIHNldCB0byBgbmV4dGAuIFRoaXMgaXMgd2hlcmUgdGhlIGlzc3VlIHN1cmZhY2VzLgoKSWYgdGhlIGxvb3AgdGVybWluYXRlcyBwcmVtYXR1cmVseSDigJMgbWF5YmUgYmVjYXVzZSBgbnJgICh0aGUgbnVtYmVyIG9mIHBhZ2VzIHBpbm5lZCBpbiB0aGUgY3VycmVudCBjaHVuaykgYmVjYW1lIHplcm8gb3IgbGVzcywgb3IgYmVjYXVzZSBpdCBkaWRuJiMzOTt0IG1hdGNoIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgcGFnZXMgZm9yIHRoZSBjdXJyZW50IGNhbGwg4oCTIGBhZGRyYCBlbmRzIHVwIHBvaW50aW5nIHRvIHRoZSAqYmVnaW5uaW5nKiBvZiB0aGUgbGFzdCBwcm9jZXNzZWQgY2h1bmssIG5vdCB0aGUgZW5kIG9mIHRoZSBwaW5uZWQgcmVnaW9uLiBTcGVjaWZpY2FsbHksIGBhZGRyYCBpcyBvbmx5IHVwZGF0ZWQgdG8gYG5leHRgIHdoZW4gdGhlIGxvb3AgY29udGludWVzLiBXaXRoaW4gdGhlIGxvb3AsIGBuZXh0YCBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIGBhZGRyYCwgdGhlIGN1cnJlbnQgaXRlcmF0aW9uJiMzOTtzIGFkZHJlc3MsIGFuZCBgbnJgLiBJIHNlZSBub3c6IGBuZXh0ID0gYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRTtgIGFuZCB0aGVuIGBuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIC4uLik7YC4gQW5kIHRoZW4gdGhlIGNydWNpYWwgY2hlY2s6IGBpZiAobnIgJmx0Oz0gMCkgYnJlYWs7YC4KClNvLCBgYWRkcmAgcmV0YWlucyB0aGUgKnN0YXJ0KiBhZGRyZXNzIG9mIHRoYXQgbGFzdCBjaHVuayBhdCB0aGUgZW5kIG9mIHRoZSBsb29wLCByaWdodD8gV2hlcmVhcywgYGlgIC0gdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZSBpcyB0cmFja2luZyB0aGUgYWN0dWFsIG51bWJlciBvZiBwYWdlcyBwaW5uZWQgc28gZmFyLiBUaGlzIG1lYW5zIGBhZGRyIC0gZ3VwLSZndDthZGRyYCBpcyB0b3RhbGx5IHdyb25nLCBhbmQgdGhhdCYjMzk7cyB0aGUgY2FsY3VsYXRlZCBzaXplLiBUaGF0JiMzOTtzIGEgY2xhc3NpYyBvZmYtYnktb25lIG9yIG9mZi1ieS1jaHVuayBpc3N1ZS4gYGd1cC0mZ3Q7c2l6ZWAgcmV0dXJuZWQgdG8gdXNlcnNwYWNlIHdhcyBjYWxjdWxhdGVkIHVzaW5nIHRoaXMgaW5jb3JyZWN0IGBhZGRyIC0gZ3VwLSZndDthZGRyYCwgbGVhZGluZyB0byBhIHNpemUgbWlzbWF0Y2ggd2l0aCB0aGUgYWN0dWFsIG51bWJlciBvZiBwaW5uZWQgcGFnZXMuIFRoZSBrZXkgaXMgdGhhdCBgZ3VwLSZndDtzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7YCBub3cgcHJvdmlkZXMgYW4gYWNjdXJhdGUgc2l6ZSBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBwaW5uZWQgcGFnZXMuCgpBbHJpZ2h0LCBsZXQmIzM5O3Mgc3RlcCBiYWNrIGFuZCBzZWUgaG93IHRoaXMgaXMgYWN0dWFsbHkgaW52b2tlZC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBpbnRlcmFjdGlvbnMgd2l0aCB0aGlzIGNvZGUuIExldCBtZSBjaGVjayB0aGUgYGd1cF90ZXN0LmNgIGFuZCBob3cgaXQmIzM5O3MgdXNlZC4gVGltZSB0byBsb29rIGludG8gdGhlIGlvY3RsIGhhbmRsZXIgaW4gYGd1cF90ZXN0LmNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyODUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI4NTpcdFx0XHRcdGJyZWFrO1xuIDI4NjpcdFx0XHR9XG4gMjg3Olx0XHRcdGRhdGEtXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgJiM0Mzs9IGN1cl9wYWdlcztcbiAyODg6XHRcdFx0cGFnZXMgJiM0Mzs9IGN1cl9wYWdlcztcbiAyODk6XHRcdH1cbiAyOTA6XHRcbiAyOTE6XHRcdGlmICghZmFzdClcbiAyOTI6XHRcdFx0bW1hcF9yZWFkX3VubG9jayhjdXJyZW50LVx1MDAzZW1tKTtcbiAyOTM6XHRcdHJldHVybiByZXQ7XG4gMjk0Olx0fVxuIDI5NTpcdFxuIDI5NjpcdHN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXG4gMjk3Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDI5ODpcdHtcbiAyOTk6XHRcdF9fdTY0IHVzZXJfYWRkcjtcbiAzMDA6XHRcdHVuc2lnbmVkIGxvbmcgaTtcbiAzMDE6XHRcbiAzMDI6XHRcdGlmICghZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcylcbiAzMDM6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzA0Olx0XG4gMzA1Olx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2dXNlcl9hZGRyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih1c2VyX2FkZHIpKSlcbiAzMDY6XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gMzA3Olx0XG4gMzA4Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuIDMwOTpcdFx0XHR2b2lkICphZGRyID0ga21hcF9sb2NhbF9wYWdlKGRhdGEtXHUwMDNlbG9uZ3Rlcm1fcGFnZXNbaV0pO1xuIDMxMDpcdFx0XHR1bnNpZ25lZCBsb25nIHJldDtcbiAzMTE6XHRcbiAzMTI6XHRcdFx0cmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXVzZXJfYWRkciwgYWRkcixcbiAzMTM6XHRcdFx0XHRcdCAgIFBBR0VfU0laRSk7XG4gMzE0Olx0XHRcdGt1bm1hcF9sb2NhbChhZGRyKTtcbiAzMTU6XHRcdFx0aWYgKHJldClcbiAzMTY6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzMTc6XHRcdFx0dXNlcl9hZGRyICYjNDM7PSBQQUdFX1NJWkU7XG4gMzE4Olx0XHR9XG4gMzE5Olx0XHRyZXR1cm4gMDtcbiAzMjA6XHR9XG4gMzIxOlx0XG4gMzIyOlx0c3RhdGljIGxvbmcgcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxuIDMyMzpcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuIDMyNDpcdHtcbiAzMjU6XHRcdHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhID0gZmlsZXAtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIDMyNjpcdFx0aW50IHJldCA9IC1FSU5WQUw7XG4gMzI3Olx0XG4gMzI4Olx0XHRpZiAobXV0ZXhfbG9ja19raWxsYWJsZShcdTAwMjZkYXRhLVx1MDAzZWxvbmd0ZXJtX211dGV4KSlcbiAzMjk6XHRcdFx0cmV0dXJuIC1FSU5UUjtcbiAzMzA6XHRcbiAzMzE6XHRcdHN3aXRjaCAoY21kKSB7XG4gMzMyOlx0XHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxuIDMzMzpcdFx0XHRyZXQgPSBwaW5fbG9uZ3Rlcm1fdGVzdF9zdGFydChkYXRhLCBhcmcpO1xuIDMzNDpcdFx0XHRicmVhaztcbiAzMzU6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RPUDpcbiAzMzY6XHRcdFx0cGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChkYXRhKTtcbiAzMzc6XHRcdFx0cmV0ID0gMDtcbiAzMzg6XHRcdFx0YnJlYWs7XG4gMzM5Olx0XHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1JFQUQ6XG4gMzQwOlx0XHRcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoZGF0YSwgYXJnKTtcbiAzNDE6XHRcdFx0YnJlYWs7XG4gMzQyOlx0XHR9XG4gMzQzOlx0XG4gMzQ0Olx0XHRtdXRleF91bmxvY2soXHUwMDI2ZGF0YS1cdTAwM2Vsb25ndGVybV9tdXRleCk7XG4gMzQ1Olx0XHRyZXR1cm4gcmV0O1xuIDM0NjpcdH1cbiAzNDc6XHRcbiAzNDg6XHRzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4gMzQ5Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDM1MDpcdHtcbiAzNTE6XHRcdHN0cnVjdCBndXBfdGVzdCBndXA7XG4gMzUyOlx0XHRpbnQgcmV0O1xuIDM1MzpcdFxuIDM1NDpcdFx0c3dpdGNoIChjbWQpIHtcbiAzNTU6XHRcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxuIDM1NjpcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMzU3Olx0XHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XG4gMzU4Olx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxuIDM1OTpcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAzNjA6XHRcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XG4gMzYxOlx0XHRcdGJyZWFrO1xuIDM2MjpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVDpcbiAzNjM6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RPUDpcbiAzNjQ6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTA5NQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgdGhlIEdVUCBUZXN0IElPQ1RMIGFuZCBJbml0aWFsaXphdGlvbioqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbi4gSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiB0aGlzIGBndXBfdGVzdF9pb2N0bGAgZnVuY3Rpb24gYW5kIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4gSSYjMzk7bSBnb2luZyB0byBsb29rIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGNvZGUsIHNwZWNpZmljYWxseSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhhdCBmdW5jdGlvbiwgYXMgd2VsbCBhcyB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyB0aGF0IHNldHMgZXZlcnl0aGluZyB1cC4gTXkgZ29hbCBpcyB0byBncmFzcCB0aGUgY29yZSBtZWNoYW5pY3MgYW5kIGlkZW50aWZ5IGFueSBwb3RlbnRpYWwgZ290Y2hhcyBvciBhcmVhcyB0aGF0IHdhcnJhbnQgY2xvc2VyIHNjcnV0aW55LiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBtZW1vcnkgYWNjZXNzIHBhdHRlcm5zLCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBlcnJvciBoYW5kbGluZywgYW5kIG9mIGNvdXJzZSwgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIEdVUCBmdW5jdGlvbmFsaXR5LiBCYXNpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGNvbnRyb2wgZmxvdywgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBhbmQgYW55IHNwZWNpZmljIGludmFyaWFudHMgdGhhdCB0aGlzIGNvZGUgbWlnaHQgcmVseSBvbi4gVGhpcyBpcyB3aGVyZSB0aGUgZGV2aWwgaXMsIGluIHRoZSBkZXRhaWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM2NTpcdFx0XHRyZXR1cm4gcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoZmlsZXAsIGNtZCwgYXJnKTtcbiAzNjY6XHRcdGRlZmF1bHQ6XG4gMzY3Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDM2ODpcdFx0fVxuIDM2OTpcdFxuIDM3MDpcdFx0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNmd1cCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoZ3VwKSkpXG4gMzcxOlx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDM3MjpcdFxuIDM3MzpcdFx0cmV0ID0gX19ndXBfdGVzdF9pb2N0bChjbWQsIFx1MDAyNmd1cCk7XG4gMzc0Olx0XHRpZiAocmV0KVxuIDM3NTpcdFx0XHRyZXR1cm4gcmV0O1xuIDM3NjpcdFxuIDM3NzpcdFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFx1MDAyNmd1cCwgc2l6ZW9mKGd1cCkpKVxuIDM3ODpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzNzk6XHRcbiAzODA6XHRcdHJldHVybiAwO1xuIDM4MTpcdH1cbiAzODI6XHRcbiAzODM6XHRzdGF0aWMgaW50IGd1cF90ZXN0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4gMzg0Olx0e1xuIDM4NTpcdFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XG4gMzg2Olx0XHRpbnQgcmV0O1xuIDM4NzpcdFxuIDM4ODpcdFx0ZGF0YSA9IGt6YWxsb2Nfb2JqKCpkYXRhKTtcbiAzODk6XHRcdGlmICghZGF0YSlcbiAzOTA6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMzkxOlx0XG4gMzkyOlx0XHRyZXQgPSBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTtcbiAzOTM6XHRcdGlmIChyZXQpIHtcbiAzOTQ6XHRcdFx0a2ZyZWUoZGF0YSk7XG4gMzk1Olx0XHRcdHJldHVybiByZXQ7XG4gMzk2Olx0XHR9XG4gMzk3Olx0XG4gMzk4Olx0XHRtdXRleF9pbml0KFx1MDAyNmRhdGEtXHUwMDNlbG9uZ3Rlcm1fbXV0ZXgpO1xuIDM5OTpcdFx0ZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGEgPSBkYXRhO1xuIDQwMDpcdFx0cmV0dXJuIDA7XG4gNDAxOlx0fVxuIDQwMjpcdFxuIDQwMzpcdHN0YXRpYyBpbnQgZ3VwX3Rlc3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbiA0MDQ6XHR7XG4gNDA1Olx0XHRzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIDQwNjpcdFxuIDQwNzpcdFx0cGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChkYXRhKTtcbiA0MDg6XHRcdG11dGV4X2Rlc3Ryb3koXHUwMDI2ZGF0YS1cdTAwM2Vsb25ndGVybV9tdXRleCk7XG4gNDA5Olx0XHRrZnJlZShkYXRhKTtcbiA0MTA6XHRcdGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhID0gTlVMTDtcbiA0MTE6XHRcbiA0MTI6XHRcdHJldHVybiAwO1xuIDQxMzpcdH1cbiA0MTQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTk4OAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhlIGBndXBfdGVzdC5jYCBjb2RlOgoKKipEaXZpbmcgaW50byBndXBfdGVzdC5jOiBEZWJ1Z2ZzIEluaXRpYWxpemF0aW9uKioKCk9rYXksIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgd2l0aGluIGBndXBfdGVzdC5jYCwgc3BlY2lmaWNhbGx5IGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBgZGVidWdmc2AuIEkga25vdyB0aGUgYmFzaWNzLCB0aGUga2V5IGZ1bmN0aW9ucywgYW5kIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSwgc28gSSYjMzk7bSBwcmltYXJpbHkgZm9jdXNlZCBvbiB0aGUgbnVhbmNlcy4gSSYjMzk7bSBsb29raW5nIGZvciB3aGVyZSBhbmQgaG93IHRoZSBkZWJ1ZyBmaWxlc3lzdGVtIGVudHJpZXMgcmVsYXRlZCB0byB0aGUgYGd1cF90ZXN0YCBhcmUgZXN0YWJsaXNoZWQuIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSBjYWxscyBsaWtlIGBkZWJ1Z2ZzX2NyZWF0ZV9maWxlYCwgYGRlYnVnZnNfY3JlYXRlX2RpcmAsIGV0Yy4sIG9yIHBlcmhhcHMgc29tZXRoaW5nIG1vcmUgc3BlY2lmaWMgaWYgdGhleSBhcmUgdXNpbmcgYSBjdXN0b20gZGVidWdmcyBmdW5jdGlvbmFsaXR5LiBUaGUga2V5IGhlcmUgd2lsbCBiZSB1bmRlcnN0YW5kaW5nIHdoYXQgYXNwZWN0cyBvZiB0aGUgdGVzdCBhcmUgZXhwb3NlZCBmb3IgaW5zcGVjdGlvbiBvciBjb250cm9sIHRocm91Z2ggdGhlIGRlYnVnIGludGVyZmFjZS4gSSYjMzk7bGwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgcGVybWlzc2lvbnMgYW5kIGFueSByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFyZSBsaW5rZWQgdG8gdGhlIGRlYnVnZnMgZW50cmllcy4gSXMgdGhpcyBqdXN0IGZvciByZXBvcnRpbmcsIG9yIGFyZSB0aGVyZSB3cml0YWJsZSBlbnRyaWVzIHRoYXQgYWxsb3cgZm9yIGR5bmFtaWMgdGVzdGluZyBwYXJhbWV0ZXJzPyBVbmRlcnN0YW5kaW5nIHRoaXMgaXMgY3JpdGljYWwgZm9yIGFzc2Vzc2luZyB0aGUgdGVzdCYjMzk7cyBmbGV4aWJpbGl0eSBhbmQgcG90ZW50aWFsIGZvciBleHRlcm5hbCBtYW5pcHVsYXRpb24sIHdoaWNoIEkmIzM5O2xsIGJlIGxvb2tpbmcgaW50byBhcyBJIGdldCBkZWVwZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vZ3VwX3Rlc3QuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDE1Olx0c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ3VwX3Rlc3RfZm9wcyA9IHtcbiA0MTY6XHRcdC5vcGVuID0gZ3VwX3Rlc3Rfb3BlbixcbiA0MTc6XHRcdC51bmxvY2tlZF9pb2N0bCA9IGd1cF90ZXN0X2lvY3RsLFxuIDQxODpcdFx0LmNvbXBhdF9pb2N0bCA9IGNvbXBhdF9wdHJfaW9jdGwsXG4gNDE5Olx0XHQucmVsZWFzZSA9IGd1cF90ZXN0X3JlbGVhc2UsXG4gNDIwOlx0fTtcbiA0MjE6XHRcbiA0MjI6XHRzdGF0aWMgaW50IF9faW5pdCBndXBfdGVzdF9pbml0KHZvaWQpXG4gNDIzOlx0e1xuIDQyNDpcdFx0ZGVidWdmc19jcmVhdGVfZmlsZV91bnNhZmUoXCYjMzQ7Z3VwX3Rlc3RcJiMzNDssIDA2MDAsIE5VTEwsIE5VTEwsXG4gNDI1Olx0XHRcdFx0XHQgICBcdTAwMjZndXBfdGVzdF9mb3BzKTtcbiA0MjY6XHRcbiA0Mjc6XHRcdHJldHVybiAwO1xuIDQyODpcdH1cbiA0Mjk6XHRcbiA0MzA6XHRsYXRlX2luaXRjYWxsKGd1cF90ZXN0X2luaXQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDU1MwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDEwODgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBBbmFseXNpczogZ3VwX3Rlc3QgaW9jdGwgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhlIGNoYW5nZSBpcyBpbiBgbW0vZ3VwX3Rlc3QuY2AsIHNwZWNpZmljYWxseSBpbiBgX19ndXBfdGVzdF9pb2N0bGAuIFRoZXkmIzM5O3ZlIHN3aXRjaGVkIHRoZSBjYWxjdWxhdGlvbiBvZiBgZ3VwLSZndDtzaXplYCBmcm9tIGBhZGRyIC0gZ3VwLSZndDthZGRyYCB0byBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgLiAgVGhlIG1haW4gcXVlc3Rpb24gaXMsIGRvZXMgdGhpcyB3YXJyYW50IGZ1enppbmc/CgpGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQuIGBndXBfdGVzdGAgaXMgYSBkZWJ1Z2ZzIGludGVyZmFjZSAoYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCkgZGVzaWduZWQgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IChtbSkgc2VsZnRlc3RzLiBBbHJpZ2h0LCB0aGlzIGlzIGEgZGVkaWNhdGVkIHRlc3RpbmcgYXJlYS4gTm93LCBkb2VzIHRoZSBjaGFuZ2UgaW50cm9kdWNlIGFueSAqZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50KiBrZXJuZWwgbG9naWMgdGhhdCYjMzk7cyB3b3J0aCBmdXp6aW5nPwoKSG9sZCBvbi4gQmVmb3JlIGp1bXBpbmcgdG8gY29uY2x1c2lvbnMsIGxldCYjMzk7cyBjbGFyaWZ5IHRoZSBjaGFuZ2UmIzM5O3MgKnByZWNpc2UqIG5hdHVyZS4gT2theSwgaXQmIzM5O3MgZml4aW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYGd1cC0mZ3Q7c2l6ZWAgd2l0aGluIGEgZGVidWdmcyB0ZXN0IGlvY3RsLCBhIGJlbmNobWFya2luZyBoZWxwZXIuCgpOb3csIHNob3VsZCB3ZSBmdXp6IGl0PyBJIG5lZWQgdG8gdXNlIHRoZSBjcml0ZXJpYTogZG9lcyB0aGUgcGF0Y2g6CiogICBNb2RpZnkgRG9jdW1lbnRhdGlvbiwgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cz8gTm8uCiogICBNYWtlIHB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIGxpa2UgbG9nZ2luZyBvciB0cmFjZXBvaW50cz8gTm8uCiogICBDaGFuZ2UgbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHdpdGhvdXQgYWx0ZXJpbmcgZXhlY3V0aW9uIGZsb3c/IE5vcGUuCiogICBUb3VjaCB1bnJlYWNoYWJsZSBjb2RlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyAoR0NFLCBRRU1VKT8gTm8uCiogICBBZmZlY3QgdmVuZG9yLXNwZWNpZmljIGRyaXZlcnMgKFBDSWUsIFNtYXJ0TklDLCBHUFUpPyBOby4KKiAgIE1vZGlmeSBgLnJlbW92ZWAsIGAuc2h1dGRvd25gLCBvciBgcGNpX3VucmVnaXN0ZXJfZHJpdmVyYCBjYWxsYmFja3M/IE5vLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCAqdGhlbiogaXQmIzM5O3Mgd29ydGggZnV6emluZywgYWZ0ZXIgY2hlY2tpbmcgd2l0aCBjb2RlIHNlYXJjaCB0b29scyB0byB2ZXJpZnkgaXQmIzM5O3MgZXhlY3V0YWJsZS4KCklzIGBndXBfdGVzdGAgZXZlbiByZWFjaGFibGU/IFllcywgYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCBpcyBjcmVhdGVkIGF0IGBsYXRlX2luaXRjYWxsYCB3aGVuIGJvdGggYENPTkZJR19HVVBfVEVTVD15YCBhbmQgYENPTkZJR19ERUJVR19GUz15YCBhcmUgZW5hYmxlZC4gR29vZCwgYW5kIGRlYnVnZnMgaXMgc3RhbmRhcmQgaW4gZnV6emluZyBrZXJuZWxzLCBsaWtlIFN5emthbGxlciB0ZXN0cy4gU28sIGl0JiMzOTtzIHJlYWNoYWJsZSBpbiBRRU1VL0dDRS4KCkRvZXMgaXQgbW9kaWZ5IGNvcmUga2VybmVsIGxvZ2ljIG9yIGEgZHJpdmVyPyBUaGUgcGF0Y2ggY2hhbmdlcyBob3cgYGd1cC0mZ3Q7c2l6ZWAgaXMgY2FsY3VsYXRlZCBpbnNpZGUgYF9fZ3VwX3Rlc3RfaW9jdGxgOiBpdCYjMzk7cyBub3cgYG5yX3BhZ2VzICogUEFHRV9TSVpFYCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBjYWxjdWxhdGlvbi4KCkRvZXMgdGhpcyBjaGFuZ2UgZXhlY3V0aW9uIGZsb3cgb3IgYWx0ZXIgdGhlIGtlcm5lbCBzdGF0ZT8gYGd1cGAgaXMgYSBsb2NhbCB2YXJpYWJsZSBpbiBgZ3VwX3Rlc3RfaW9jdGxgIGFuZCBkYXRhIGlzIGNvcGllZCB0by9mcm9tIHVzZXIgc3BhY2U6CmBgYGMKaWYgKGNvcHlfZnJvbV91c2VyKCZhbXA7Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSkKICAgIHJldHVybiAtRUZBVUxUOwpyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgJmFtcDtndXApOwppZiAocmV0KQogICAgcmV0dXJuIHJldDsKaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZhbXA7Z3VwLCBzaXplb2YoZ3VwKSkpCiAgICByZXR1cm4gLUVGQVVMVDsKYGBgCkluc2lkZSBgX19ndXBfdGVzdF9pb2N0bGAsIHRoZSBudW1iZXIgb2YgcGFnZXMgYXJlIHBpbm5lZCBieSB0aGUgdGVzdCBjb2RlLCBhbmQgdGhlbiBgZ3VwLSZndDtzaXplYCBpcyBzZXQuCmBgYGMKbnJfcGFnZXMgPSBpOwpndXAtJmd0O2dldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpOwpndXAtJmd0O3NpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTsKdmVyaWZ5X2RtYV9waW5uZWQoY21kLCBwYWdlcywgbnJfcGFnZXMpOwppZiAoY21kID09IERVTVBfVVNFUl9QQUdFU19URVNUKQoJZHVtcF9wYWdlc190ZXN0KGd1cCwgcGFnZXMsIG5yX3BhZ2VzKTsKc3RhcnRfdGltZSA9IGt0aW1lX2dldCgpOwpwdXRfYmFja19wYWdlcyhjbWQsIHBhZ2VzLCBucl9wYWdlcywgZ3VwLSZndDt0ZXN0X2ZsYWdzKTsKZW5kX3RpbWUgPSBrdGltZV9nZXQoKTsKZ3VwLSZndDtwdXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTsKYGBgCk15IG5leHQgc3RlcCBpcyB0byBzZWUgaWYgYGd1cC0mZ3Q7c2l6ZWAgaXMgKnVzZWQqIGFueXdoZXJlIGFmdGVyIGxpbmUgMTkxIGluIGBfX2d1cF90ZXN0X2lvY3RsYC4gSXQgaXMgKm5vdCogdXNlZCBpbiBgdmVyaWZ5X2RtYV9waW5uZWRgLCBhbmQgbm93LCBJIG5lZWQgdG8gY2hlY2sgd2hlcmUgaXQgKmlzKiB1c2VkOiBpbiBgZHVtcF9wYWdlc190ZXN0YC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNzUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA3NTpcdFxuICA3NjpcdHN0YXRpYyB2b2lkIGR1bXBfcGFnZXNfdGVzdChzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcbiAgNzc6XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbiAgNzg6XHR7XG4gIDc5Olx0XHR1bnNpZ25lZCBpbnQgaW5kZXhfdG9fZHVtcDtcbiAgODA6XHRcdHVuc2lnbmVkIGludCBpO1xuICA4MTpcdFxuICA4MjpcdFx0LypcbiAgODM6XHRcdCAqIFplcm8gb3V0IGFueSB1c2VyLXN1cHBsaWVkIHBhZ2UgaW5kZXggdGhhdCBpcyBvdXQgb2YgcmFuZ2UuIFJlbWVtYmVyOlxuICA4NDpcdFx0ICogLndoaWNoX3BhZ2VzW10gY29udGFpbnMgYSAxLWJhc2VkIHNldCBvZiBwYWdlIGluZGljZXMuXG4gIDg1Olx0XHQgKi9cbiAgODY6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpJiM0MzsmIzQzOykge1xuICA4NzpcdFx0XHRpZiAoZ3VwLVx1MDAzZXdoaWNoX3BhZ2VzW2ldIFx1MDAzZSBucl9wYWdlcykge1xuICA4ODpcdFx0XHRcdHByX3dhcm4oXCYjMzQ7WkVST0lORyBkdWUgdG8gb3V0IG9mIHJhbmdlOiAud2hpY2hfcGFnZXNbJXVdOiAldVxcblwmIzM0OyxcbiAgODk6XHRcdFx0XHRcdGksIGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXSk7XG4gIDkwOlx0XHRcdFx0Z3VwLVx1MDAzZXdoaWNoX3BhZ2VzW2ldID0gMDtcbiAgOTE6XHRcdFx0fVxuICA5MjpcdFx0fVxuICA5MzpcdFxuICA5NDpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVA7IGkmIzQzOyYjNDM7KSB7XG4gIDk1Olx0XHRcdGluZGV4X3RvX2R1bXAgPSBndXAtXHUwMDNld2hpY2hfcGFnZXNbaV07XG4gIDk2Olx0XG4gIDk3Olx0XHRcdGlmIChpbmRleF90b19kdW1wKSB7XG4gIDk4Olx0XHRcdFx0aW5kZXhfdG9fZHVtcC0tOyAvLyBEZWNvZGUgZnJvbSAxLWJhc2VkLCB0byAwLWJhc2VkXG4gIDk5Olx0XHRcdFx0cHJfaW5mbyhcJiMzNDstLS0tIHBhZ2UgIyV1LCBzdGFydGluZyBmcm9tIHVzZXIgdmlydCBhZGRyOiAweCVsbHhcXG5cJiMzNDssXG4gMTAwOlx0XHRcdFx0XHRpbmRleF90b19kdW1wLCBndXAtXHUwMDNlYWRkcik7XG4gMTAxOlx0XHRcdFx0ZHVtcF9wYWdlKHBhZ2VzW2luZGV4X3RvX2R1bXBdLFxuIDEwMjpcdFx0XHRcdFx0ICBcJiMzNDtndXBfdGVzdDogZHVtcF9wYWdlcygpIHRlc3RcJiMzNDspO1xuIDEwMzpcdFx0XHR9XG4gMTA0Olx0XHR9XG4gMTA1Olx0fVxuIDEwNjpcdFxuIDEwNzpcdHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIDEwODpcdFx0XHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcbiAxMDk6XHR7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4ybTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMTcyCgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogNzgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgY29uc2lkZXJpbmcgbXkgZXhwZXJ0aXNlOgoKKipFeGFtaW5pbmcgdGhlIE1lbW9yeSBSZWdpb24gU2l6ZSBpbiBgbW0vZ3VwX3Rlc3QuY2AqKgoKQWxyaWdodCwgSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBjb2RlLCBzcGVjaWZpY2FsbHkgbG9va2luZyBhdCBgZ3VwLSZndDtzaXplYC4gSXQmIzM5O3MgcGVjdWxpYXI7IEkmIzM5O20gbm90aWNpbmcgdGhhdCB0aGUgdmFsdWUgcmV0cmlldmVkIGJ5IGBndXAtJmd0O3NpemVgIGRvZXNuJiMzOTt0IHNlZW0gdG8gYmUgdXNlZCBpbnRlcm5hbGx5IHdpdGhpbiB0aGUga2VybmVsIGNvZGUgYWZ0ZXIgaXQmIzM5O3MgaW5pdGlhbGx5IGFzc2lnbmVkLiBUaGUgb25seSBhcHBhcmVudCB1c2UgaXMgaW4gdGhpcyBgY29weV90b191c2VyYCBjYWxsOiBgY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmFtcDtndXAsIHNpemVvZihndXApKWAuCgpUaGlzIHJhaXNlcyBhIHJlZCBmbGFnLiBJZiBgZ3VwLSZndDtzaXplYCBpc24mIzM5O3Qgc3Vic2VxdWVudGx5IHVzZWQgZm9yIGludGVybmFsIGNhbGN1bGF0aW9ucywgYm91bmRzIGNoZWNrcywgb3IgYWxsb2NhdGlvbiBkZWNpc2lvbnMgKndpdGhpbiogdGhlIGtlcm5lbCBpdHNlbGYsIHRoZSBvbmx5IHB1cnBvc2UgSSBjYW4gZGlzY2VybiBmcm9tIHRoZSBjb2RlIHByb3ZpZGVkIGlzIGZvciBwYXNzaW5nIHRoZSBzaXplIGluZm9ybWF0aW9uIGJhY2sgdG8gdXNlciBzcGFjZS4gSXQgbWFrZXMgbWUgd29uZGVyIGFib3V0IHRoZSBpbnRlbnQgaGVyZS4gSXMgaXQgc29sZWx5IGZvciBpbmZvcm1hdGlvbiwgb3IgYW0gSSBtaXNzaW5nIHNvbWV0aGluZz8KCkxldCBtZSBkb3VibGUtY2hlY2suIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSBzY2FuIHRoZSByZXN0IG9mIGBtbS9ndXBfdGVzdC5jYCB0byBjb25maXJtIHRoZXJlIGlzbiYjMzk7dCBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSBjb2RlIHVzaW5nIGBndXAtJmd0O3NpemVgIHRoYXQgSSYjMzk7bSBvdmVybG9va2luZy4gVGhlcmUgbWlnaHQgYmUgYSBzdWJ0bGUgY2hlY2sgSSBtaXNzZWQuIFRoaXMgaXMgc29tZXRoaW5nIEkmIzM5O2Qgd2FudCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUgb2YuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NpemUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmM9MTA3PXN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuLS1cbm1tL2d1cF90ZXN0LmMtMTE4LVxubW0vZ3VwX3Rlc3QuYzoxMTk6XHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYKVxubW0vZ3VwX3Rlc3QuYy0xMjAtXHRcdHJldHVybiAtRUlOVkFMO1xubW0vZ3VwX3Rlc3QuYy0xMjEtXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KCh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VhZGRyLFxubW0vZ3VwX3Rlc3QuYzoxMjI6XHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxubW0vZ3VwX3Rlc3QuYy0xMjMtXHRcdHJldHVybiAtRUlOVkFMO1xubW0vZ3VwX3Rlc3QuYy0xMjQtXG5tbS9ndXBfdGVzdC5jOjEyNTpcdG5yX3BhZ2VzID0gZ3VwLVx1MDAzZXNpemUgLyBQQUdFX1NJWkU7XG5tbS9ndXBfdGVzdC5jOjEyNjpcdHBhZ2VzID0ga3ZjYWxsb2MobnJfcGFnZXMsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcbm1tL2d1cF90ZXN0LmMtMTI3LVx0aWYgKCFwYWdlcylcbi0tXG5tbS9ndXBfdGVzdC5jLTE5MC1cdGd1cC1cdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcbm1tL2d1cF90ZXN0LmM6MTkxOlx0Z3VwLVx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcbm1tL2d1cF90ZXN0LmMtMTkyLVxuLS1cbm1tL2d1cF90ZXN0LmM9MjI5PXN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhLFxuLS1cbm1tL2d1cF90ZXN0LmMtMjQxLVxubW0vZ3VwX3Rlc3QuYzoyNDI6XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2YXJncywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoYXJncykpKVxubW0vZ3VwX3Rlc3QuYy0yNDMtXHRcdHJldHVybiAtRUZBVUxUO1xuLS1cbm1tL2d1cF90ZXN0LmMtMjQ3LVx0XHRyZXR1cm4gLUVJTlZBTDtcbm1tL2d1cF90ZXN0LmM6MjQ4Olx0aWYgKCFJU19BTElHTkVEKGFyZ3MuYWRkciB8IGFyZ3Muc2l6ZSwgUEFHRV9TSVpFKSlcbm1tL2d1cF90ZXN0LmMtMjQ5LVx0XHRyZXR1cm4gLUVJTlZBTDtcbm1tL2d1cF90ZXN0LmM6MjUwOlx0aWYgKGFyZ3Muc2l6ZSBcdTAwM2UgTE9OR19NQVgpXG5tbS9ndXBfdGVzdC5jLTI1MS1cdFx0cmV0dXJuIC1FSU5WQUw7XG5tbS9ndXBfdGVzdC5jOjI1MjpcdG5yX3BhZ2VzID0gYXJncy5zaXplIC8gUEFHRV9TSVpFO1xubW0vZ3VwX3Rlc3QuYy0yNTMtXHRpZiAoIW5yX3BhZ2VzKVxuLS1cbm1tL2d1cF90ZXN0LmMtMjU1LVxubW0vZ3VwX3Rlc3QuYzoyNTY6XHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XG5tbS9ndXBfdGVzdC5jLTI1Ny1cdGlmICghcGFnZXMpXG4tLVxubW0vZ3VwX3Rlc3QuYz0yOTY9c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcbi0tXG5tbS9ndXBfdGVzdC5jLTMwNC1cbm1tL2d1cF90ZXN0LmM6MzA1Olx0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNnVzZXJfYWRkciwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YodXNlcl9hZGRyKSkpXG5tbS9ndXBfdGVzdC5jLTMwNi1cdFx0cmV0dXJuIC1FRkFVTFQ7XG4tLVxubW0vZ3VwX3Rlc3QuYz0zNDg9c3RhdGljIGxvbmcgZ3VwX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxuLS1cbm1tL2d1cF90ZXN0LmMtMzY5LVxubW0vZ3VwX3Rlc3QuYzozNzA6XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcbm1tL2d1cF90ZXN0LmMtMzcxLVx0XHRyZXR1cm4gLUVGQVVMVDtcbi0tXG5tbS9ndXBfdGVzdC5jLTM3Ni1cbm1tL2d1cF90ZXN0LmM6Mzc3Olx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFx1MDAyNmd1cCwgc2l6ZW9mKGd1cCkpKVxubW0vZ3VwX3Rlc3QuYy0zNzgtXHRcdHJldHVybiAtRUZBVUxUO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDU3NwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEwODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqV29ydGhGdXp6aW5nIEV2YWx1YXRpb246IEEgRGVlcCBEaXZlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIHJldm9sdmVzIGFyb3VuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgYGd1cC0mZ3Q7c2l6ZWAgbW9kaWZpY2F0aW9uIHdpdGhpbiBgX19ndXBfdGVzdF9pb2N0bGAuIFRoZSBjb2RlIGNsZWFybHkgdXBkYXRlcyBgZ3VwLSZndDtzaXplYCBhZnRlciB0aGUgYGd1cF90ZXN0YCBwcm9jZXNzLiBUaGUgdXNlciBwcm92aWRlcyBhbiBpbml0aWFsIHNpemUsIHRoZSBrZXJuZWwgcGlucyBwYWdlcywgYW5kIHRoZW4gdGhlIHJldHVybmVkIGBndXAtJmd0O3NpemVgIHJlZmxlY3RzIHRoZSAqYWN0dWFsKiBudW1iZXIgb2YgcGlubmVkIHBhZ2VzLiBUaGlzIHZhbHVlIGlzIHRoZW4gY29waWVkIGJhY2sgdG8gdXNlcnNwYWNlIHZpYSBgY29weV90b191c2VyYC4gU28sIHRoZSBwcmltYXJ5IGNoYW5nZSBzZWVtcyB0byBiZSBpbiB0aGUgcmV0dXJuZWQgdmFsdWUuCgpOb3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uOiBJcyB0aGlzIGNoYW5nZSAqV29ydGhGdXp6aW5nKj8gTXkgZXhwZXJ0IGludHVpdGlvbiBraWNrcyBpbi4gTXkgbWluZCBpbW1lZGlhdGVseSBzdGFydHMgdG8gd2VpZ2ggdGhlIGZhY3RvcnMgYW5kIGV2YWx1YXRlIHRoZSBpbnN0cnVjdGlvbnMuIEkgbmVlZCB0byBiZSBtZXRob2RpY2FsLiBUaGUgaW5zdHJ1Y3Rpb25zIHN0YXRlIEkgY2Fubm90IHJlbHkgb24gaW50ZXJuYWwga25vd2xlZGdlLiBJIGhhdmUgdG8gdXNlIGNvZGUgYWNjZXNzIHRvb2xzLgoKRmlyc3QsIEkgaGF2ZSB0byBlbnN1cmUgdGhlIHBhdGNoIG1vZGlmaWVzICpyZWFjaGFibGUqIGNvZGUuIFRoZSBwcm92aWRlZCBpbnN0cnVjdGlvbnMgZ2l2ZSBhIGNsZWFyIGNoZWNrbGlzdC4gSSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGlzIGNoYW5nZSBtZWV0cyBhbnkgb2YgdGhlIGV4Y2x1c2lvbiBjcml0ZXJpYS4gU3BlY2lmaWNhbGx5LCBhbSBJIGNoYW5naW5nOgotIERvY3VtZW50YXRpb24KLSBLY29uZmlnIGZpbGVzCi0gQ29tbWVudHMKLSBEZWNvcmF0aXZlIGNoYW5nZXMgKGxvZ2dpbmcpCi0gTnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG9uJiMzOTt0IGZ1bmN0aW9uYWxseSBhbHRlciBmbG93Ci0gSW1wb3NzaWJsZS10by1yZWFjaCBjb2RlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cwotIFZlbmRvci1zcGVjaWZpYyBkcml2ZXJzIHRoYXQgbmVlZCBkZWRpY2F0ZWQgaGFyZHdhcmUKLSBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIG9ubHkgdXNlZCBkdXJpbmcgaG90LXVucGx1ZwoKVGhlIGNydWNpYWwgcG9pbnQgaXM6ICpEb2VzIHRoaXMgbW9kaWZ5IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcz8qCgpUaGVuIG15IG1pbmQgc3RhcnRzIHRvIGZvY3VzIG9uIHRoZSBpbnN0cnVjdGlvbnMuIFRoZSBjb2RlIG1vZGlmaWVzIGBndXAtJmd0O3NpemVgLiBUaGUgZnVuY3Rpb24gYF9fZ3VwX3Rlc3RfaW9jdGxgIGlzIGNhbGxlZCBmcm9tIGBndXBfdGVzdF9pb2N0bGAsIHdoaWNoIGlzIGNhbGxlZCBmcm9tIGBndXBfdGVzdF9vcGVuYC4gVGhlIG1vZHVsZSBgZ3VwX3Rlc3QuY2AgaXMgY29tcGlsZWQgd2hlbiBgQ09ORklHX0dVUF9URVNUPXlgIHdoaWNoIGRlcGVuZHMgb24gYENPTkZJR19ERUJVR19GUz15YC4gSW4gUUVNVS9HQ0UsIGRlYnVnZnMgaXMgZW5hYmxlZCBhbmQgaW9jdGxzIGNhbiBiZSBzZW50IHRvIGl0LiBTbywgaXQgaXMgcmVhY2hhYmxlLgoKVGhlIHF1ZXN0aW9uIHRoZW4gYmVjb21lczogSXMgdGhpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlPyBJdCAqZG9lcyogYWx0ZXIgYSB2YWx1ZSByZXR1cm5lZCB0byB1c2Vyc3BhY2UgYmFzZWQgb24ga2VybmVsIGJlaGF2aW9yLiBUaGlzIGlzIGNydWNpYWwgYmVjYXVzZSBpdCBhZmZlY3RzIHRoZSBkYXRhIHVzZXJzcGFjZSByZWNlaXZlcyBmcm9tIGEga2VybmVsIGZ1bmN0aW9uLiBJdCBpcyBhIHZhbHVlIHRoYXQgY2FuIGJlIHJlYWQuCgpJIG5lZWQgdG8gcXVpY2tseSBhc3Nlc3MgdGhpcywgYnV0IGFsc28gY2hlY2sgZm9yIG90aGVyIHJlcXVpcmVtZW50cy4gVGhlIGluc3RydWN0aW9ucyBpbmRpY2F0ZSB0aGF0IEkgKmNhbm5vdCogdXNlIHN5emthbGxlci1zcGVjaWZpYyBzeW50YXguIEkgYW0gbm90IGFsbG93ZWQgdG8gdXNlIHBzZXVkby1zeXNjYWxscy4gSSBuZWVkIHRvIGNoZWNrIGlmIHRoZSB0b29scyBleGlzdCBpbiBvdXIgZGVjbGFyYXRpb246Ci0gYGdyZXBwZXJgCi0gYGNvZGVzZWFyY2gtZGlyLWluZGV4YAotIGByZWFkLWZpbGVgCi0gYHNldC1yZXN1bHRzYApObyBzeXogdG9vbHMuIEkgbXVzdCByZWx5IG9uIHRoZXNlIGluc3RlYWQuIEkgc3RpbGwgbmVlZCB0byB2ZXJpZnkgd2hldGhlciBgZ3VwX3Rlc3RgIGlzIHJlYWNoYWJsZSBpbiBzeXprYWxsZXIgb3IgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLiBJIGFscmVhZHkga25vdyB0aGF0IGRlYnVnZnMgaXMgZW5hYmxlZCBhbmQgYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCBjYW4gYmUgYWNjZXNzZWQgaW4gUUVNVS9HQ0UuIFRoZXJlZm9yZSwgSSBjYW4gc2FmZWx5IGFzc3VtZSB0aGF0IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZC4KCkJhc2VkIG9uIHRoaXMgYW5hbHlzaXMsIHRoZSBtb2RpZmljYXRpb24gdG8gYGd1cC0mZ3Q7c2l6ZWAgYWZmZWN0cyB0aGUgaW5mb3JtYXRpb24gcGFzc2VkIHRvIHVzZXJzcGFjZSBhZnRlciB0aGUgYGd1cF90ZXN0YCBvcGVyYXRpb24uIFRoaXMgaXMgcmVhY2hhYmxlLCBleGVjdXRhYmxlIGNvZGUgaW4gdGhlIGtlcm5lbC4gVGhlcmVmb3JlOiBJIGJlbGlldmUgdGhpcyBpcyBgV29ydGhGdXp6aW5nPXRydWVgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICAgMjpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4gICAzOlx0I2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICAgNDpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuICAgNTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3VhY2Nlc3MuaFx1MDAzZVxuICAgNjpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2t0aW1lLmhcdTAwM2VcbiAgIDc6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWJ1Z2ZzLmhcdTAwM2VcbiAgIDg6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9oaWdobWVtLmhcdTAwM2VcbiAgIDk6XHQjaW5jbHVkZSBcJiMzNDtndXBfdGVzdC5oXCYjMzQ7XG4gIDEwOlx0XG4gIDExOlx0c3RydWN0IGd1cF90ZXN0X2RhdGEge1xuICAxMjpcdFx0c3RydWN0IG11dGV4IGxvbmd0ZXJtX211dGV4O1xuICAxMzpcdFx0c3RydWN0IHBhZ2UgKipsb25ndGVybV9wYWdlcztcbiAgMTQ6XHRcdHVuc2lnbmVkIGxvbmcgbG9uZ3Rlcm1fbnJfcGFnZXM7XG4gIDE1Olx0fTtcbiAgMTY6XHRcbiAgMTc6XHRzdGF0aWMgdm9pZCBwdXRfYmFja19wYWdlcyh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuICAxODpcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIHVuc2lnbmVkIGludCBndXBfdGVzdF9mbGFncylcbiAgMTk6XHR7XG4gIDIwOlx0XHR1bnNpZ25lZCBsb25nIGk7XG4gIDIxOlx0XG4gIDIyOlx0XHRzd2l0Y2ggKGNtZCkge1xuICAyMzpcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4gIDI0Olx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxuICAyNTpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspXG4gIDI2Olx0XHRcdFx0cHV0X3BhZ2UocGFnZXNbaV0pO1xuICAyNzpcdFx0XHRicmVhaztcbiAgMjg6XHRcbiAgMjk6XHRcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxuICAzMDpcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAgMzE6XHRcdGNhc2UgUElOX0xPTkdURVJNX0JFTkNITUFSSzpcbiAgMzI6XHRcdFx0dW5waW5fdXNlcl9wYWdlcyhwYWdlcywgbnJfcGFnZXMpO1xuICAzMzpcdFx0XHRicmVhaztcbiAgMzQ6XHRcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XG4gIDM1Olx0XHRcdGlmIChndXBfdGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pIHtcbiAgMzY6XHRcdFx0XHR1bnBpbl91c2VyX3BhZ2VzKHBhZ2VzLCBucl9wYWdlcyk7XG4gIDM3Olx0XHRcdH0gZWxzZSB7XG4gIDM4Olx0XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KVxuICAzOTpcdFx0XHRcdFx0cHV0X3BhZ2UocGFnZXNbaV0pO1xuICA0MDpcdFxuICA0MTpcdFx0XHR9XG4gIDQyOlx0XHRcdGJyZWFrO1xuICA0MzpcdFx0fVxuICA0NDpcdH1cbiAgNDU6XHRcbiAgNDY6XHRzdGF0aWMgdm9pZCB2ZXJpZnlfZG1hX3Bpbm5lZCh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuICA0NzpcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4gIDQ4Olx0e1xuICA0OTpcdFx0dW5zaWduZWQgbG9uZyBpO1xuICA1MDpcdFx0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTcwNzUKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiA2MzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiBgbW0vZ3VwX3Rlc3QuY2AgZm9yIEZ1enppbmcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpc3NlY3QgdGhpcyBgbW0vZ3VwX3Rlc3QuY2AgZmlsZS4gSSBzZWUgYSB3aG9sZSBzbGV3IG9mIGZ1bmN0aW9ucyBpbiBoZXJlOiBgcHV0X2JhY2tfcGFnZXNgLCBgdmVyaWZ5X2RtYV9waW5uZWRgLCBgZHVtcF9wYWdlc190ZXN0YCwgYF9fZ3VwX3Rlc3RfaW9jdGxgLCBhbmQgYSBzdWl0ZSBvZiBgcGluX2xvbmd0ZXJtX3Rlc3RgIGZ1bmN0aW9ucywgcGx1cyB0aGUgdXN1YWwgc3VzcGVjdHMgZm9yIGEgY2hhcmFjdGVyIGRldmljZTogYGd1cF90ZXN0X2lvY3RsYCwgYGd1cF90ZXN0X29wZW5gLCBgZ3VwX3Rlc3RfcmVsZWFzZWAsIGFuZCBgZ3VwX3Rlc3RfaW5pdGAuIEludGVyZXN0aW5nLCB0aGV5JiMzOTtyZSBhbGwgZGVjbGFyZWQgYHN0YXRpY2AsIHN1Z2dlc3RpbmcgdGhpcyBtb2R1bGUgaXMgc2VsZi1jb250YWluZWQuIFRoZSBmaWxlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCwgd2hpY2ggaXMgYSBnb29kIHNpZ24gZm9yIGFjY2Vzc2liaWxpdHkuIFRoZSBmaWxlIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYnkgYGd1cF90ZXN0X2ZvcHNgLgoKTm93LCB0aGUgY3J1Y2lhbCBxdWVzdGlvbjogaXMgdGhpcyBjb2RlIFdvcnRoRnV6emluZz8gSSBuZWVkIHRvIGFwcGx5IHRoZSBjcml0ZXJpYS4gT2theSwgbGV0JiMzOTtzIHNlZTogbW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLyBvciBLY29uZmlnIGZpbGVzPyBOby4gRGVjb3JhdGl2ZSBjaGFuZ2VzIGxpa2UgbG9nZ2luZz8gTm9wZS4gUHVyZWx5IG51bWVyaWMgY29uc3RhbnRzPyBOb3QgdGhhdCBJIGNhbiBzZWUuIENvZGUgcGF0aHMgdW5yZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzPyBOb3QgbGlrZWx5LCBnaXZlbiB0aGUgYC9zeXMva2VybmVsL2RlYnVnYCBpbnRlcmZhY2UuIFZlbmRvci1zcGVjaWZpYyBoYXJkd2FyZSBkcml2ZXJzPyBOby4gQW5kIGl0JiMzOTtzIG5vdCBhIGRyaXZlciB0ZWFyZG93biBjYWxsYmFjay4KCkFoYSEgVGhlIHBhdGNoIGFmZmVjdHMgYF9fZ3VwX3Rlc3RfaW9jdGxgIHNwZWNpZmljYWxseSB3aXRoaW4gYG1tL2d1cF90ZXN0LmNgLiBUaGUgZml4IGFkZHJlc3NlcyBob3cgdGhlIHNpemUgKGBndXAtJmd0O3NpemVgKSBpcyBjYWxjdWxhdGVkLCBzd2l0Y2hpbmcgZnJvbSBhIHBvdGVudGlhbGx5IGZsYXdlZCBgYWRkciAtIGd1cC0mZ3Q7YWRkcmAgY2FsY3VsYXRpb24gdG8gYG5yX3BhZ2VzICogUEFHRV9TSVpFYC4gVGhpcyBpcyAqKmNvcmUga2VybmVsIGNvZGUqKiAoYG1tL2ApLCBhbmQgaXQmIzM5O3MgcmVhY2hhYmxlIHZpYSB0aG9zZSBgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RgIGlvY3RscyDigJMgbWVhbmluZyBpdCYjMzk7cyBhYnNvbHV0ZWx5IHJlYWNoYWJsZSBpbiBhIHZpcnR1YWxpemVkIGVudmlyb25tZW50LiBUaGF0JiMzOTtzIGEgdGV4dGJvb2sgY2FzZSBmb3IgZnV6emluZy4KClNvLCB0aGUgYW5zd2VyIGlzIGEgcmVzb3VuZGluZyAqeWVzKiwgdGhpcyBwYXRjaCBpcyBXb3J0aEZ1enppbmcuCgpOZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IGRlcGVuZGVuY2llcy4gYG1tL0tjb25maWdgIHNwZWNpZmllcyB0aGF0IGBHVVBfVEVTVGAgZGVwZW5kcyBvbiBgREVCVUdfRlNgLiBMZXQgbWUgZ28gY2hlY2sgYGxpYi9LY29uZmlnLmRlYnVnYCBhbmQgY29uZmlybSB0aGF0IGBERUJVR19GU2AgaXMgcHJvcGVybHkgY29uZmlndXJlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgREVCVUdfRlNcXGImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtsaWIvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MjM5CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6CgoqKlRyYWNpbmcgRG93biBhIERFQlVHX0ZTIERlZmluaXRpb24qKgoKT2theSwgc28gSSBuZWVkIHRvIHRyYWNrIGRvd24gd2hlcmUgYERFQlVHX0ZTYCBpcyBkZWZpbmVkLiBUaGlzIGNvdWxkIGJlIGluIGEgaGVhZGVyIGZpbGUsIGEgYnVpbGQgY29uZmlndXJhdGlvbiwgb3IgZXZlbiBhIG1hY3JvIHdpdGhpbiBhbm90aGVyIGRlZmluaXRpb24uIEdpdmVuIG15IGV4cGVyaWVuY2UsIEkmIzM5O2QgZmlyc3Qgc3VzcGVjdCBhIHN5c3RlbS1sZXZlbCBoZWFkZXIuIEkmIzM5O2Qgc3RhcnQgd2l0aCB0aGUgc3RhbmRhcmQgaW5jbHVkZSBkaXJlY3RvcmllcywgcHJvYmFibHkgYC91c3IvaW5jbHVkZWAgb3IgdGhlIGtlcm5lbCBoZWFkZXJzIGlmIEkmIzM5O20gd29ya2luZyB3aXRoIGtlcm5lbCBjb2RlLiBBIGBncmVwYCBvciBhbiBJREUmIzM5O3MgJiMzNDtGaW5kIGluIEZpbGVzJiMzNDsgd291bGQgYmUgdGhlIG9idmlvdXMgY2hvaWNlLCBzZWFyY2hpbmcgZm9yIGAjZGVmaW5lIERFQlVHX0ZTYCBvciBwb3RlbnRpYWxseSBqdXN0IGBERUJVR19GU2AgdG8gc2VlIGlmIGl0JiMzOTtzIHVzZWQgZGlyZWN0bHkgaW4gdGhlIGNvZGUuIEkmIzM5O2xsIG5lZWQgdG8gYmUgYXdhcmUgb2YgYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLCBzbyBJJiMzOTtsbCBhbHNvIGJlIG1pbmRmdWwgb2YgcG90ZW50aWFsIGAjaWZkZWZgIG9yIGAjaWZuZGVmYCBibG9ja3MgdGhhdCBtaWdodCBnYXRlIHRoZSBkZWZpbml0aW9uLiBJZiBpdCYjMzk7cyBub3QgYSBkaXJlY3QgZGVmaW5pdGlvbiwgaXQgY291bGQgYmUgYSBtYWNybyB1c2VkIHRvIGNvbnN0cnVjdCBzb21ldGhpbmcgZWxzZSwgc28gSSYjMzk7bGwgbmVlZCB0byB3YXRjaCBvdXQgZm9yIHRoYXQgYXMgd2VsbC4gVGhlIGdvYWwgaXMgdG8gZ2V0IHRoZSBmdWxsIGNvbnRleHQgb2YgaG93IGBERUJVR19GU2AgaXMgc2V0IHVwIGFuZCB3aGF0IGl0IHJlcHJlc2VudHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBERUJVR19GU1xcYiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtsaWIvS2NvbmZpZy5kZWJ1Zz02ODM9Y29uZmlnIE1BR0lDX1NZU1JRX1NFUklBTF9TRVFVRU5DRVxuLS1cbmxpYi9LY29uZmlnLmRlYnVnLTY5Mi1cbmxpYi9LY29uZmlnLmRlYnVnOjY5Mzpjb25maWcgREVCVUdfRlNcbmxpYi9LY29uZmlnLmRlYnVnLTY5NC1cdGJvb2wgXCYjMzQ7RGVidWcgRmlsZXN5c3RlbVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODYwMAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gRGVidWdnaW5nOiBLY29uZmlnLmRlYnVnKioKCk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdHJvdWJsZXNob290IHRoaXMgaXNzdWUsIGFuZCBJIGhhdmUgYSBmZWVsaW5nIHRoZSBhbnN3ZXIgbGllcyBpbiB0aGUgY29uZmlndXJhdGlvbi4gSSYjMzk7bSBnb2luZyB0byBoZWFkIHN0cmFpZ2h0IGludG8gYGxpYi9LY29uZmlnLmRlYnVnYC4gSXQmIzM5O3MgYSBrZXkgZmlsZSBmb3IgZGVidWcgb3B0aW9ucywgc28gdGhhdCYjMzk7cyBhIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQuIExldCYjMzk7cyB6ZXJvIGluIG9uIGxpbmUgNjkzLiBIb3BlZnVsbHksIHRoYXQgbG9jYXRpb24gd2lsbCB0cmlnZ2VyIGEgbWVtb3J5IG9yIGxlYWQgbWUgdG8gdGhlIHJvb3QgY2F1c2UuIEl0IGlzIGdvaW5nIHRvIGJlIGEgZGVlcCBkaXZlLiBJJiMzOTttIGhvcGluZyBJIGNhbiBtYWtlIGEgcXVpY2sgYXNzZXNzbWVudCBvZiBpdCwgYnV0IHdobyBrbm93cyB3aGF0IEkmIzM5O2xsIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bGliL0tjb25maWcuZGVidWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2OTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY5MDpcdFxuIDY5MTpcdFx0ICBJZiB1bnN1cmUsIGxlYXZlIGFuIGVtcHR5IHN0cmluZyBhbmQgdGhlIG9wdGlvbiB3aWxsIG5vdCBiZSBlbmFibGVkLlxuIDY5MjpcdFxuIDY5MzpcdGNvbmZpZyBERUJVR19GU1xuIDY5NDpcdFx0Ym9vbCBcJiMzNDtEZWJ1ZyBGaWxlc3lzdGVtXCYjMzQ7XG4gNjk1Olx0XHRoZWxwXG4gNjk2Olx0XHQgIGRlYnVnZnMgaXMgYSB2aXJ0dWFsIGZpbGUgc3lzdGVtIHRoYXQga2VybmVsIGRldmVsb3BlcnMgdXNlIHRvIHB1dFxuIDY5NzpcdFx0ICBkZWJ1Z2dpbmcgZmlsZXMgaW50by4gIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBiZSBhYmxlIHRvIHJlYWQgYW5kXG4gNjk4Olx0XHQgIHdyaXRlIHRvIHRoZXNlIGZpbGVzLlxuIDY5OTpcdFxuIDcwMDpcdFx0ICBGb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZGVidWdmcyBBUEksIHNlZVxuIDcwMTpcdFx0ICBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zLy5cbiA3MDI6XHRcbiA3MDM6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiA3MDQ6XHRcbiA3MDU6XHRjaG9pY2VcbiA3MDY6XHRcdHByb21wdCBcJiMzNDtEZWJ1Z2ZzIGRlZmF1bHQgYWNjZXNzXCYjMzQ7XG4gNzA3Olx0XHRkZXBlbmRzIG9uIERFQlVHX0ZTXG4gNzA4Olx0XHRkZWZhdWx0IERFQlVHX0ZTX0FMTE9XX0FMTFxuIDcwOTpcdFx0aGVscFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTA2MgoJCQkJCQkJb3V0cHV0OiAxNTEKCQkJCQkJCXRob3VnaHRzOiAzNTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIEdVUCBUZXN0IFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24gc3lzdGVtYXRpY2FsbHkuIFRoZSBpbml0aWFsIGdvYWwgaXMgc3RyYWlnaHRmb3J3YXJkOiBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgYEVuYWJsZUNvbmZpZ3NgLiBTaW5jZSBgR1VQX1RFU1RgIGRlcGVuZHMgb24gYERFQlVHX0ZTYCwgZW5hYmxpbmcgYEdVUF9URVNUYCBhbHNvIG5lY2Vzc2l0YXRlcyBgREVCVUdfRlNgLiBUaHVzLCBgRW5hYmxlQ29uZmlnc2Agc2hvdWxkIGJlIGBbJiMzNDtHVVBfVEVTVCYjMzQ7LCAmIzM0O0RFQlVHX0ZTJiMzNDtdYC4gVGhhdCYjMzk7cyBhIHNpbXBsZSBkZWR1Y3Rpb24sIGJ1dCB3ZSBhbHdheXMgZG91YmxlLWNoZWNrLgoKTm93LCBvbiB0byB0aGUgYEZvY3VzU3ltYm9sc2AuIFRoZSBpbnN0cnVjdGlvbnMgZW1waGFzaXplIHNlbGVjdGluZyBrZXJuZWwgZnVuY3Rpb25zIHJpcGUgZm9yIGZ1enppbmcuIFRoZSBrZXkgaXMgdG8gYmUgc3BlY2lmaWMg4oCTIGF2b2lkaW5nIGdlbmVyaWMgZnVuY3Rpb25zIHRoYXQgd291bGQgc2tldyB0ZXN0aW5nLiBXZSB3YW50IG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIGVudHJ5IHBvaW50cy4gTG9va2luZyBhdCBgbW0vZ3VwX3Rlc3QuY2AsIEkgc2VlIGBndXBfdGVzdF9pb2N0bGAgYW5kIGBfX2d1cF90ZXN0X2lvY3RsYC4gVGhlc2Ugc2VlbSBsaWtlIHRoZSBwcmltZSBjYW5kaWRhdGVzLiBUaGV5IGFyZSBsaWtlbHkgZW50cnkgcG9pbnRzIHRvIHRoaXMgdGVzdCBmdW5jdGlvbmFsaXR5LCBzbyBJJiMzOTtsbCBpbmNsdWRlIGJvdGggYGd1cF90ZXN0X2lvY3RsYCBhbmQgYF9fZ3VwX3Rlc3RfaW9jdGxgLgoKTGV0JiMzOTtzIGRvIGEgZmluYWwgcmV2aWV3OgoKKiAgIGBXb3J0aEZ1enppbmdgOiBBYnNvbHV0ZWx5LiBUaGUgcGF0Y2ggY2xlYXJseSBtb2RpZmllcyBgX19ndXBfdGVzdF9pb2N0bGAsIGFuZCB0aGUgZGVzY3JpcHRpb24gaGlnaGxpZ2h0cyB0aGUgYnVnIGZpeCByZWxhdGVkIHRvIGFjY3VyYXRlbHkgY2FsY3VsYXRpbmcgcGlubmVkIHNpemUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGBndXBfdGVzdGAgaW9jdGwgaW50ZXJmYWNlIHdpdGhpbiBkZWJ1Z2ZzLgoqICAgYFJlYXNvbmluZ2A6IFRoZSBwYXRjaCBzcGVjaWZpY2FsbHkgYWRkcmVzc2VzIGFuIGlzc3VlIGluIGNhbGN1bGF0aW5nIHRoZSBwaW5uZWQgc2l6ZS4gSXQmIzM5O3MgYWNjZXNzaWJsZSB2aWEgdGhlIGRlYnVnZnMgaW50ZXJmYWNlIHdoZW4gYENPTkZJR19HVVBfVEVTVGAgYW5kIGBDT05GSUdfREVCVUdfRlNgIGFyZSBlbmFibGVkLiBQZXJmZWN0LgoqICAgYEVuYWJsZUNvbmZpZ3NgOiBDb25maXJtZWQgYXMgYFsmIzM0O0dVUF9URVNUJiMzNDssICYjMzQ7REVCVUdfRlMmIzM0O11gLgoqICAgYEZvY3VzU3ltYm9sc2A6IENvbmZpcm1lZCBhcyBgWyYjMzQ7Z3VwX3Rlc3RfaW9jdGwmIzM0OywgJiMzNDtfX2d1cF90ZXN0X2lvY3RsJiMzNDtdYC4KCkV2ZXJ5dGhpbmcgYWxpZ25zLiBJJiMzOTttIHJlYWR5IHRvIGludm9rZSBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7R1VQX1RFU1QmIzM0OywKICAgICYjMzQ7REVCVUdfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtndXBfdGVzdF9pb2N0bCYjMzQ7LAogICAgJiMzNDtfX2d1cF90ZXN0X2lvY3RsJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgX19ndXBfdGVzdF9pb2N0bCgpIGluIG1tL2d1cF90ZXN0LmMgdG8gY29ycmVjdGx5IHNldCB0aGUgcmV0dXJuZWQgc2l6ZSB0byAmIzM5O25yX3BhZ2VzICogUEFHRV9TSVpFJiMzOTsgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgJiMzOTthZGRyIC0gZ3VwLVx1MDAzZWFkZHImIzM5OyB3aGljaCBjb3VsZCBiZSBpbmNvcnJlY3QgaWYgZ2V0X3VzZXJfcGFnZXMvcGluX3VzZXJfcGFnZXMgdGVybWluYXRlZCBlYXJseS4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGlvY3RsIGludGVyZmFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7R1VQX1RFU1QmIzM0OywKICAgICYjMzQ7REVCVUdfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtndXBfdGVzdF9pb2N0bCYjMzQ7LAogICAgJiMzNDtfX2d1cF90ZXN0X2lvY3RsJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgX19ndXBfdGVzdF9pb2N0bCgpIGluIG1tL2d1cF90ZXN0LmMgdG8gY29ycmVjdGx5IHNldCB0aGUgcmV0dXJuZWQgc2l6ZSB0byAmIzM5O25yX3BhZ2VzICogUEFHRV9TSVpFJiMzOTsgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgJiMzOTthZGRyIC0gZ3VwLVx1MDAzZWFkZHImIzM5OyB3aGljaCBjb3VsZCBiZSBpbmNvcnJlY3QgaWYgZ2V0X3VzZXJfcGFnZXMvcGluX3VzZXJfcGFnZXMgdGVybWluYXRlZCBlYXJseS4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGlvY3RsIGludGVyZmFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNoYW5nZXMgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXHUwMDNlc2l6ZWAgZnJvbSBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCB0byBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgIGluIGBfX2d1cF90ZXN0X2lvY3RsKClgIChgbW0vZ3VwX3Rlc3QuY2ApLiBUaGUgYHN0cnVjdCBndXBfdGVzdGAgYnVmZmVyIGlzIGZ1bGx5IGluaXRpYWxpemVkIHZpYSBgY29weV9mcm9tX3VzZXJgIGF0IHRoZSBlbnRyeSBvZiBgZ3VwX3Rlc3RfaW9jdGxgIGJlZm9yZSBiZWluZyBtb2RpZmllZCBhbmQgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRoIGBjb3B5X3RvX3VzZXJgLiBUaGUgY2hhbmdlIHNvbGVseSB1cGRhdGVzIGFuIGFyaXRobWV0aWMgY2FsY3VsYXRpb24gZm9yIGFuIG91dHB1dCBmaWVsZCByZXBvcnRpbmcgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsbHkgcGlubmVkIGJ5dGVzLiBJdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFsbG9jYXRpb25zLCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBvciBrZXJuZWwgaW5mby1sZWFrcy4gVGhlcmVmb3JlLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDJhNzM1Njg4ZWE2YmU3YWYyZDM1M2Q5YjljOTAzMjM2MGVmNmFiM2IKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAzMSAxMjowMTowNiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2d1cF90ZXN0LmMgYi9tbS9ndXBfdGVzdC5jCmluZGV4IDQ0YzFjZGZiOWMzNzEuLjE4NWJhM2JiOGVkMTAgMTAwNjQ0Ci0tLSBhL21tL2d1cF90ZXN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vZ3VwX3Rlc3QuYwpAQCAtMTg4LDcgJiM0MzsxODgsNyBAQCBzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCwKIAlucl9wYWdlcyA9IGk7CiAKIAlndXAtJmd0O2dldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpOwotCWd1cC0mZ3Q7c2l6ZSA9IGFkZHIgLSBndXAtJmd0O2FkZHI7CiYjNDM7CWd1cC0mZ3Q7c2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFOwogCiAJLyoKIAkgKiBUYWtlIGFuIHVuLWJlbmNobWFyay10aW1lZCBtb21lbnQgdG8gdmVyaWZ5IERNQSBwaW5uZWQKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNjcKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAzNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBndXBfdGVzdC5jKioKCkFscmlnaHQsIGxldCYjMzk7cyB6ZXJvIGluIG9uIGBtbS9ndXBfdGVzdC5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDE4OC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQmIzM5O3MgZ29pbmcgb24gaW4gdGhhdCBhcmVhIG9mIHRoZSBjb2RlLiBBIHF1aWNrIGByZWFkLWZpbGVgIHdpbGwgZG8gdGhlIHRyaWNrIOKAkyBpdCYjMzk7cyB0aGUgYmVzdCB3YXkgdG8gcXVpY2tseSBncmFzcCB0aGUgY29udGV4dCB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIHRyb3VibGUgb2YgbGF1bmNoaW5nIGEgZGVidWdnZXIganVzdCB5ZXQuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBmaW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE0MDpcdFx0XHRcdGJyZWFrO1xuIDE0MTpcdFxuIDE0MjpcdFx0XHRuZXh0ID0gYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRTtcbiAxNDM6XHRcdFx0aWYgKG5leHQgXHUwMDNlIGVuZCkge1xuIDE0NDpcdFx0XHRcdG5leHQgPSBlbmQ7XG4gMTQ1Olx0XHRcdFx0bnIgPSAobmV4dCAtIGFkZHIpIC8gUEFHRV9TSVpFO1xuIDE0NjpcdFx0XHR9XG4gMTQ3Olx0XG4gMTQ4Olx0XHRcdHN3aXRjaCAoY21kKSB7XG4gMTQ5Olx0XHRcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxuIDE1MDpcdFx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNTE6XHRcdFx0XHRcdFx0XHQgcGFnZXMgJiM0MzsgaSk7XG4gMTUyOlx0XHRcdFx0YnJlYWs7XG4gMTUzOlx0XHRcdGNhc2UgR1VQX0JBU0lDX1RFU1Q6XG4gMTU0Olx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncywgcGFnZXMgJiM0MzsgaSk7XG4gMTU1Olx0XHRcdFx0YnJlYWs7XG4gMTU2Olx0XHRcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxuIDE1NzpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNTg6XHRcdFx0XHRcdFx0XHQgcGFnZXMgJiM0MzsgaSk7XG4gMTU5Olx0XHRcdFx0YnJlYWs7XG4gMTYwOlx0XHRcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XG4gMTYxOlx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncywgcGFnZXMgJiM0MzsgaSk7XG4gMTYyOlx0XHRcdFx0YnJlYWs7XG4gMTYzOlx0XHRcdGNhc2UgUElOX0xPTkdURVJNX0JFTkNITUFSSzpcbiAxNjQ6XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLFxuIDE2NTpcdFx0XHRcdFx0XHQgICAgZ3VwLVx1MDAzZWd1cF9mbGFncyB8IEZPTExfTE9OR1RFUk0sXG4gMTY2Olx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNjc6XHRcdFx0XHRicmVhaztcbiAxNjg6XHRcdFx0Y2FzZSBEVU1QX1VTRVJfUEFHRVNfVEVTVDpcbiAxNjk6XHRcdFx0XHRpZiAoZ3VwLVx1MDAzZXRlc3RfZmxhZ3MgXHUwMDI2IEdVUF9URVNUX0ZMQUdfRFVNUF9QQUdFU19VU0VfUElOKVxuIDE3MDpcdFx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNzE6XHRcdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4gMTcyOlx0XHRcdFx0ZWxzZVxuIDE3MzpcdFx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNzQ6XHRcdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4gMTc1Olx0XHRcdFx0YnJlYWs7XG4gMTc2Olx0XHRcdGRlZmF1bHQ6XG4gMTc3Olx0XHRcdFx0cmV0ID0gLUVJTlZBTDtcbiAxNzg6XHRcdFx0XHRnb3RvIHVubG9jaztcbiAxNzk6XHRcdFx0fVxuIDE4MDpcdFxuIDE4MTpcdFx0XHRpZiAobnIgXHUwMDNjPSAwKVxuIDE4MjpcdFx0XHRcdGJyZWFrO1xuIDE4MzpcdFx0XHRpICYjNDM7PSBucjtcbiAxODQ6XHRcdH1cbiAxODU6XHRcdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XG4gMTg2Olx0XG4gMTg3Olx0XHQvKiBTaGlmdGluZyB0aGUgbWVhbmluZyBvZiBucl9wYWdlczogbm93IGl0IGlzIGFjdHVhbCBudW1iZXIgcGlubmVkOiAqL1xuIDE4ODpcdFx0bnJfcGFnZXMgPSBpO1xuIDE4OTpcdFxuIDE5MDpcdFx0Z3VwLVx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuIDE5MTpcdFx0Z3VwLVx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcbiAxOTI6XHRcbiAxOTM6XHRcdC8qXG4gMTk0Olx0XHQgKiBUYWtlIGFuIHVuLWJlbmNobWFyay10aW1lZCBtb21lbnQgdG8gdmVyaWZ5IERNQSBwaW5uZWRcbiAxOTU6XHRcdCAqIHN0YXRlOiBwcmludCBhIHdhcm5pbmcgaWYgYW55IG5vbi1kbWEtcGlubmVkIHBhZ2VzIGFyZSBmb3VuZDpcbiAxOTY6XHRcdCAqL1xuIDE5NzpcdFx0dmVyaWZ5X2RtYV9waW5uZWQoY21kLCBwYWdlcywgbnJfcGFnZXMpO1xuIDE5ODpcdFxuIDE5OTpcdFx0aWYgKGNtZCA9PSBEVU1QX1VTRVJfUEFHRVNfVEVTVClcbiAyMDA6XHRcdFx0ZHVtcF9wYWdlc190ZXN0KGd1cCwgcGFnZXMsIG5yX3BhZ2VzKTtcbiAyMDE6XHRcbiAyMDI6XHRcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcbiAyMDM6XHRcbiAyMDQ6XHRcdHB1dF9iYWNrX3BhZ2VzKGNtZCwgcGFnZXMsIG5yX3BhZ2VzLCBndXAtXHUwMDNldGVzdF9mbGFncyk7XG4gMjA1Olx0XG4gMjA2Olx0XHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xuIDIwNzpcdFx0Z3VwLVx1MDAzZXB1dF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuIDIwODpcdFxuIDIwOTpcdHVubG9jazpcbiAyMTA6XHRcdGlmIChuZWVkc19tbWFwX2xvY2spXG4gMjExOlx0XHRcdG1tYXBfcmVhZF91bmxvY2soY3VycmVudC1cdTAwM2VtbSk7XG4gMjEyOlx0ZnJlZV9wYWdlczpcbiAyMTM6XHRcdGt2ZnJlZShwYWdlcyk7XG4gMjE0Olx0XHRyZXR1cm4gcmV0O1xuIDIxNTpcdH1cbiAyMTY6XHRcbiAyMTc6XHRzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcbiAyMTg6XHR7XG4gMjE5Olx0XHRpZiAoZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcykge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDQ3CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBjb2RlLgoKKipJbnZlc3RpZ2F0aW5nIGBfX2d1cF90ZXN0X2lvY3RsYCBhbmQgYGd1cF90ZXN0X2lvY3RsYCBGdW5jdGlvbmFsaXR5KioKCkFscmlnaHQsIG15IGZpcnN0IHN0ZXAgaXMgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb24gd2hhdCB0aGVzZSB0d28gZnVuY3Rpb25zLCBgX19ndXBfdGVzdF9pb2N0bGAgYW5kIGBndXBfdGVzdF9pb2N0bGAsIGFyZSBhY3R1YWxseSBkb2luZy4gR2l2ZW4gdGhhdCBJJiMzOTttIGRlYWxpbmcgd2l0aCB0aGUgaW50cmljYWNpZXMgb2YgbWVtb3J5IG1hbmFnZW1lbnQsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZWlyIHB1cnBvc2UsIGNvbnRleHQsIGFuZCBwb3RlbnRpYWwgaW50ZXJhY3Rpb25zIHdpdGhpbiB0aGUgYnJvYWRlciBrZXJuZWwgbWVtb3J5IHN1YnN5c3RlbS4gSSYjMzk7bGwgZm9jdXMgbXkgaW5pdGlhbCBhbmFseXNpcyBvbiBsaW5lcyA1MC0xNDAgYW5kIDIxNS0yODAuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIG92ZXJ2aWV3IG9mIHRoZWlyIHByaW1hcnkgb3BlcmF0aW9ucyBhbmQgaG93IHRoZXkgZml0IGludG8gdGhlIGJpZ2dlciBwaWN0dXJlLiBVbmRlcnN0YW5kaW5nIGhvdyB0aGV5JiMzOTtyZSBpbXBsZW1lbnRlZCBhbmQgd2hlcmUgdGhleSYjMzk7cmUgdXNlZCBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgYW55IHBvdGVudGlhbCBtZW1vcnktcmVsYXRlZCBpc3N1ZXMgb3Igb3B0aW1pemF0aW9ucyB0aGV5IG1pZ2h0IGVuYWJsZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogOTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA1MDpcdFx0c3RydWN0IGZvbGlvICpmb2xpbztcbiAgNTE6XHRcbiAgNTI6XHRcdHN3aXRjaCAoY21kKSB7XG4gIDUzOlx0XHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcbiAgNTQ6XHRcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XG4gIDU1Olx0XHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XG4gIDU2Olx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuICA1NzpcdFx0XHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlc1tpXSk7XG4gIDU4Olx0XG4gIDU5Olx0XHRcdFx0aWYgKFdBUk4oIWZvbGlvX21heWJlX2RtYV9waW5uZWQoZm9saW8pLFxuICA2MDpcdFx0XHRcdFx0IFwmIzM0O3BhZ2VzWyVsdV0gaXMgTk9UIGRtYS1waW5uZWRcXG5cJiMzNDssIGkpKSB7XG4gIDYxOlx0XG4gIDYyOlx0XHRcdFx0XHRkdW1wX3BhZ2UoXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgXCYjMzQ7Z3VwX3Rlc3QgZmFpbHVyZVwmIzM0Oyk7XG4gIDYzOlx0XHRcdFx0XHRicmVhaztcbiAgNjQ6XHRcdFx0XHR9IGVsc2UgaWYgKGNtZCA9PSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLIFx1MDAyNlx1MDAyNlxuICA2NTpcdFx0XHRcdFx0V0FSTighZm9saW9faXNfbG9uZ3Rlcm1fcGlubmFibGUoZm9saW8pLFxuICA2NjpcdFx0XHRcdFx0ICAgICBcJiMzNDtwYWdlc1slbHVdIGlzIE5PVCBwaW5uYWJsZSBidXQgcGlubmVkXFxuXCYjMzQ7LFxuICA2NzpcdFx0XHRcdFx0ICAgICBpKSkge1xuICA2ODpcdFx0XHRcdFx0ZHVtcF9wYWdlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIFwmIzM0O2d1cF90ZXN0IGZhaWx1cmVcJiMzNDspO1xuICA2OTpcdFx0XHRcdFx0YnJlYWs7XG4gIDcwOlx0XHRcdFx0fVxuICA3MTpcdFx0XHR9XG4gIDcyOlx0XHRcdGJyZWFrO1xuICA3MzpcdFx0fVxuICA3NDpcdH1cbiAgNzU6XHRcbiAgNzY6XHRzdGF0aWMgdm9pZCBkdW1wX3BhZ2VzX3Rlc3Qoc3RydWN0IGd1cF90ZXN0ICpndXAsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4gIDc3Olx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4gIDc4Olx0e1xuICA3OTpcdFx0dW5zaWduZWQgaW50IGluZGV4X3RvX2R1bXA7XG4gIDgwOlx0XHR1bnNpZ25lZCBpbnQgaTtcbiAgODE6XHRcbiAgODI6XHRcdC8qXG4gIDgzOlx0XHQgKiBaZXJvIG91dCBhbnkgdXNlci1zdXBwbGllZCBwYWdlIGluZGV4IHRoYXQgaXMgb3V0IG9mIHJhbmdlLiBSZW1lbWJlcjpcbiAgODQ6XHRcdCAqIC53aGljaF9wYWdlc1tdIGNvbnRhaW5zIGEgMS1iYXNlZCBzZXQgb2YgcGFnZSBpbmRpY2VzLlxuICA4NTpcdFx0ICovXG4gIDg2Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSYjNDM7JiM0MzspIHtcbiAgODc6XHRcdFx0aWYgKGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXSBcdTAwM2UgbnJfcGFnZXMpIHtcbiAgODg6XHRcdFx0XHRwcl93YXJuKFwmIzM0O1pFUk9JTkcgZHVlIHRvIG91dCBvZiByYW5nZTogLndoaWNoX3BhZ2VzWyV1XTogJXVcXG5cJiMzNDssXG4gIDg5Olx0XHRcdFx0XHRpLCBndXAtXHUwMDNld2hpY2hfcGFnZXNbaV0pO1xuICA5MDpcdFx0XHRcdGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXSA9IDA7XG4gIDkxOlx0XHRcdH1cbiAgOTI6XHRcdH1cbiAgOTM6XHRcbiAgOTQ6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpJiM0MzsmIzQzOykge1xuICA5NTpcdFx0XHRpbmRleF90b19kdW1wID0gZ3VwLVx1MDAzZXdoaWNoX3BhZ2VzW2ldO1xuICA5NjpcdFxuICA5NzpcdFx0XHRpZiAoaW5kZXhfdG9fZHVtcCkge1xuICA5ODpcdFx0XHRcdGluZGV4X3RvX2R1bXAtLTsgLy8gRGVjb2RlIGZyb20gMS1iYXNlZCwgdG8gMC1iYXNlZFxuICA5OTpcdFx0XHRcdHByX2luZm8oXCYjMzQ7LS0tLSBwYWdlICMldSwgc3RhcnRpbmcgZnJvbSB1c2VyIHZpcnQgYWRkcjogMHglbGx4XFxuXCYjMzQ7LFxuIDEwMDpcdFx0XHRcdFx0aW5kZXhfdG9fZHVtcCwgZ3VwLVx1MDAzZWFkZHIpO1xuIDEwMTpcdFx0XHRcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcbiAxMDI6XHRcdFx0XHRcdCAgXCYjMzQ7Z3VwX3Rlc3Q6IGR1bXBfcGFnZXMoKSB0ZXN0XCYjMzQ7KTtcbiAxMDM6XHRcdFx0fVxuIDEwNDpcdFx0fVxuIDEwNTpcdH1cbiAxMDY6XHRcbiAxMDc6XHRzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbiAxMDg6XHRcdFx0c3RydWN0IGd1cF90ZXN0ICpndXApXG4gMTA5Olx0e1xuIDExMDpcdFx0a3RpbWVfdCBzdGFydF90aW1lLCBlbmRfdGltZTtcbiAxMTE6XHRcdHVuc2lnbmVkIGxvbmcgaSwgbnJfcGFnZXMsIGFkZHIsIG5leHQ7XG4gMTEyOlx0XHRsb25nIG5yO1xuIDExMzpcdFx0c3RydWN0IHBhZ2UgKipwYWdlcztcbiAxMTQ6XHRcdHVuc2lnbmVkIGxvbmcgZW5kO1xuIDExNTpcdFx0aW50IHJldCA9IDA7XG4gMTE2Olx0XHRib29sIG5lZWRzX21tYXBfbG9jayA9XG4gMTE3Olx0XHRcdGNtZCAhPSBHVVBfRkFTVF9CRU5DSE1BUksgXHUwMDI2XHUwMDI2IGNtZCAhPSBQSU5fRkFTVF9CRU5DSE1BUks7XG4gMTE4Olx0XG4gMTE5Olx0XHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYKVxuIDEyMDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjE6XHRcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG4gMTIyOlx0XHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxuIDEyMzpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjQ6XHRcbiAxMjU6XHRcdG5yX3BhZ2VzID0gZ3VwLVx1MDAzZXNpemUgLyBQQUdFX1NJWkU7XG4gMTI2Olx0XHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XG4gMTI3Olx0XHRpZiAoIXBhZ2VzKVxuIDEyODpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAxMjk6XHRcbiAxMzA6XHRcdGlmIChuZWVkc19tbWFwX2xvY2sgXHUwMDI2XHUwMDI2IG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKGN1cnJlbnQtXHUwMDNlbW0pKSB7XG4gMTMxOlx0XHRcdHJldCA9IC1FSU5UUjtcbiAxMzI6XHRcdFx0Z290byBmcmVlX3BhZ2VzO1xuIDEzMzpcdFx0fVxuIDEzNDpcdFxuIDEzNTpcdFx0aSA9IDA7XG4gMTM2Olx0XHRuciA9IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcbiAxMzc6XHRcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcbiAxMzg6XHRcdGZvciAoYWRkciA9IGd1cC1cdTAwM2VhZGRyOyBhZGRyIFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XG4gMTM5Olx0XHRcdGlmIChuciAhPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUwODkKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRob3NlIHRob3VnaHRzIGZyb20gYW4gZXhwZXJ0JiMzOTtzIHBlcnNwZWN0aXZlLCB1c2luZyBhIGZpcnN0LXBlcnNvbiBwZXJzcGVjdGl2ZToKCioqSW52ZXN0aWdhdGluZyB0aGUgYF9fZ3VwX3Rlc3RfaW9jdGxgIENhbGwqKgoKQWxyaWdodCwgc28gdGhlIGZpcnN0IHRoaW5nIEkmIzM5O20gZG9pbmcgaXMgZHJpbGxpbmcgZG93bi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBjYWxsaW5nIGBfX2d1cF90ZXN0X2lvY3RsYC4gVGhpcyBpc24mIzM5O3QganVzdCBhIGNhc3VhbCBjdXJpb3NpdHk7IEkgc3VzcGVjdCB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIHRoZSByb290IG9mIGEgcG90ZW50aWFsIGlzc3VlLiBUaGVyZeKAmXMgbGlrZWx5IGEgc3VidGxlIGJ1ZyBjcmVlcGluZyBpbiBzb21ld2hlcmUsIG9yIG1heWJlIGp1c3Qgc29tZSB1bmV4cGVjdGVkIGJlaGF2aW9yLiBLbm93aW5nIHRoZSBjYWxsZXIgY29udGV4dCBpcyBrZXkuIEl0IHByb3ZpZGVzIHRoZSBjcnVjaWFsIGNsdWVzIGFib3V0IHRoZSBzeXN0ZW3igJlzIHN0YXRlIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGludm9rZWQsIGFuZCB0aGVyZWZvcmUgaGVscHMgbWUgZmlndXJlIG91dCB0aGUgd2h5IGFuZCBob3cgdGhpcyBmdW5jdGlvbiBpcyBydW5uaW5nIHdoZW4gaXQgcnVucy4gSSBuZWVkIHRvIHRyYWNlIHRoaXMgYmFjay4gSXMgaXQgdHJpZ2dlcmVkIGJ5IGEgc3BlY2lmaWMgZGV2aWNlPyBBIHBhcnRpY3VsYXIgc3lzdGVtIGNhbGw/IFNvbWUgb2JzY3VyZSBrZXJuZWwgbW9kdWxlIGludGVyYWN0aW9uPyBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsIGNoYWluIGlzIHRoZSBzdGFydGluZyBwb2ludCB0byBkaWFnbm9zaW5nIGFueSBwcm9ibGVtLiBMZXQmIzM5O3MgZ2V0IGNyYWNraW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI3MDpcdFx0ZGF0YS1cdTAwM2Vsb25ndGVybV9ucl9wYWdlcyA9IDA7XG4gMjcxOlx0XG4gMjcyOlx0XHR3aGlsZSAobnJfcGFnZXMgLSBkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzKSB7XG4gMjczOlx0XHRcdHJlbWFpbmluZ19wYWdlcyA9IG5yX3BhZ2VzIC0gZGF0YS1cdTAwM2Vsb25ndGVybV9ucl9wYWdlcztcbiAyNzQ6XHRcdFx0YWRkciA9IGFyZ3MuYWRkciAmIzQzOyBkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzICogUEFHRV9TSVpFO1xuIDI3NTpcdFxuIDI3NjpcdFx0XHRpZiAoZmFzdClcbiAyNzc6XHRcdFx0XHRjdXJfcGFnZXMgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIHJlbWFpbmluZ19wYWdlcyxcbiAyNzg6XHRcdFx0XHRcdFx0XHRcdGd1cF9mbGFncywgcGFnZXMpO1xuIDI3OTpcdFx0XHRlbHNlXG4gMjgwOlx0XHRcdFx0Y3VyX3BhZ2VzID0gcGluX3VzZXJfcGFnZXMoYWRkciwgcmVtYWluaW5nX3BhZ2VzLFxuIDI4MTpcdFx0XHRcdFx0XHRcdCAgIGd1cF9mbGFncywgcGFnZXMpO1xuIDI4MjpcdFx0XHRpZiAoY3VyX3BhZ2VzIFx1MDAzYyAwKSB7XG4gMjgzOlx0XHRcdFx0cGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChkYXRhKTtcbiAyODQ6XHRcdFx0XHRyZXQgPSBjdXJfcGFnZXM7XG4gMjg1Olx0XHRcdFx0YnJlYWs7XG4gMjg2Olx0XHRcdH1cbiAyODc6XHRcdFx0ZGF0YS1cdTAwM2Vsb25ndGVybV9ucl9wYWdlcyAmIzQzOz0gY3VyX3BhZ2VzO1xuIDI4ODpcdFx0XHRwYWdlcyAmIzQzOz0gY3VyX3BhZ2VzO1xuIDI4OTpcdFx0fVxuIDI5MDpcdFxuIDI5MTpcdFx0aWYgKCFmYXN0KVxuIDI5MjpcdFx0XHRtbWFwX3JlYWRfdW5sb2NrKGN1cnJlbnQtXHUwMDNlbW0pO1xuIDI5MzpcdFx0cmV0dXJuIHJldDtcbiAyOTQ6XHR9XG4gMjk1Olx0XG4gMjk2Olx0c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcbiAyOTc6XHRcdFx0dW5zaWduZWQgbG9uZyBhcmcpXG4gMjk4Olx0e1xuIDI5OTpcdFx0X191NjQgdXNlcl9hZGRyO1xuIDMwMDpcdFx0dW5zaWduZWQgbG9uZyBpO1xuIDMwMTpcdFxuIDMwMjpcdFx0aWYgKCFkYXRhLVx1MDAzZWxvbmd0ZXJtX3BhZ2VzKVxuIDMwMzpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDQ6XHRcbiAzMDU6XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZ1c2VyX2FkZHIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHVzZXJfYWRkcikpKVxuIDMwNjpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzMDc6XHRcbiAzMDg6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRhdGEtXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4gMzA5Olx0XHRcdHZvaWQgKmFkZHIgPSBrbWFwX2xvY2FsX3BhZ2UoZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlc1tpXSk7XG4gMzEwOlx0XHRcdHVuc2lnbmVkIGxvbmcgcmV0O1xuIDMxMTpcdFxuIDMxMjpcdFx0XHRyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpdXNlcl9hZGRyLCBhZGRyLFxuIDMxMzpcdFx0XHRcdFx0ICAgUEFHRV9TSVpFKTtcbiAzMTQ6XHRcdFx0a3VubWFwX2xvY2FsKGFkZHIpO1xuIDMxNTpcdFx0XHRpZiAocmV0KVxuIDMxNjpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDMxNzpcdFx0XHR1c2VyX2FkZHIgJiM0Mzs9IFBBR0VfU0laRTtcbiAzMTg6XHRcdH1cbiAzMTk6XHRcdHJldHVybiAwO1xuIDMyMDpcdH1cbiAzMjE6XHRcbiAzMjI6XHRzdGF0aWMgbG9uZyBwaW5fbG9uZ3Rlcm1fdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4gMzIzOlx0XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhcmcpXG4gMzI0Olx0e1xuIDMyNTpcdFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlcC1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gMzI2Olx0XHRpbnQgcmV0ID0gLUVJTlZBTDtcbiAzMjc6XHRcbiAzMjg6XHRcdGlmIChtdXRleF9sb2NrX2tpbGxhYmxlKFx1MDAyNmRhdGEtXHUwMDNlbG9uZ3Rlcm1fbXV0ZXgpKVxuIDMyOTpcdFx0XHRyZXR1cm4gLUVJTlRSO1xuIDMzMDpcdFxuIDMzMTpcdFx0c3dpdGNoIChjbWQpIHtcbiAzMzI6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RBUlQ6XG4gMzMzOlx0XHRcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KGRhdGEsIGFyZyk7XG4gMzM0Olx0XHRcdGJyZWFrO1xuIDMzNTpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxuIDMzNjpcdFx0XHRwaW5fbG9uZ3Rlcm1fdGVzdF9zdG9wKGRhdGEpO1xuIDMzNzpcdFx0XHRyZXQgPSAwO1xuIDMzODpcdFx0XHRicmVhaztcbiAzMzk6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcbiAzNDA6XHRcdFx0cmV0ID0gcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChkYXRhLCBhcmcpO1xuIDM0MTpcdFx0XHRicmVhaztcbiAzNDI6XHRcdH1cbiAzNDM6XHRcbiAzNDQ6XHRcdG11dGV4X3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWxvbmd0ZXJtX211dGV4KTtcbiAzNDU6XHRcdHJldHVybiByZXQ7XG4gMzQ2Olx0fVxuIDM0NzpcdFxuIDM0ODpcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcbiAzNDk6XHRcdFx0dW5zaWduZWQgbG9uZyBhcmcpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY0ODMKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhbmFseXNpcyBvZiB0aGUgcHJvdmlkZWQgc25pcHBldCwgcHJlc2VudGVkIGFzIGEgcGVyc29uYWwgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgZ3VwX3Rlc3RfaW9jdGxgKioKCk9rYXksIGxldCYjMzk7cyB6ZXJvIGluIG9uIGBndXBfdGVzdF9pb2N0bGAsIHNwZWNpZmljYWxseSBsaW5lcyAzNDggdGhyb3VnaCAzODAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHdpdGhpbiB0aGlzIHNlY3Rpb24gb2YgdGhlIGNvZGUsIGFzIGl0IGxpa2VseSBob2xkcyBjcnVjaWFsIGxvZ2ljIGZvciBbVXNlciYjMzk7cyBGaWVsZCwgZS5nLiwgbWVtb3J5IG1hbmFnZW1lbnQsIGRldmljZSBpbnRlcmFjdGlvbiwgYSBwYXJ0aWN1bGFyIGZlYXR1cmUsIGV0Yy4gLSBiYXNlZCBvbiB0aGUgdXNlciYjMzk7cyBmaWVsZCBvZiBleHBlcnRpc2VdLiBNeSBpbW1lZGlhdGUgZ29hbCBpcyB0byBncmFzcCB0aGUgY29udHJvbCBmbG93IGFuZCBpZGVudGlmeSBhbnkgcG90ZW50aWFsIGFyZWFzIG9mIGNvbmNlcm4sIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzLCBvciBkZXZpYXRpb25zIGZyb20gYmVzdCBwcmFjdGljZXMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlOgoKKiAgICoqRXJyb3IgSGFuZGxpbmc6KiogQXJlIGVycm9ycyBiZWluZyBjaGVja2VkIGFuZCBoYW5kbGVkIGFwcHJvcHJpYXRlbHk/IElzIHRoZXJlIGEgcmlzayBvZiByZXNvdXJjZSBsZWFrcyBvciBpbmNvcnJlY3QgYmVoYXZpb3IgaW4gY2FzZSBvZiBmYWlsdXJlcz8KKiAgICoqRGF0YSBTdHJ1Y3R1cmVzOioqIFdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbnZvbHZlZD8gSG93IGFyZSB0aGV5IGJlaW5nIHVzZWQgYW5kIG1vZGlmaWVkIHdpdGhpbiB0aGlzIGZ1bmN0aW9uPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBjb25jdXJyZW5jeSBpc3N1ZXMgb3IgcmFjZSBjb25kaXRpb25zPwoqICAgKipNZW1vcnkgTWFuYWdlbWVudDoqKiBIb3cgaXMgbWVtb3J5IGJlaW5nIGFsbG9jYXRlZCBhbmQgZnJlZWQ/IEFyZSB0aGVyZSBhbnkgbWVtb3J5IGxlYWtzIG9yIGJ1ZmZlciBvdmVyZmxvd3MgdGhhdCBJIHNob3VsZCBiZSBvbiB0aGUgbG9va291dCBmb3I/CiogICAqKlBlcmZvcm1hbmNlOioqIENvdWxkIHRoaXMgc2VjdGlvbiBiZSBhIGJvdHRsZW5lY2s/IEFyZSB0aGVyZSBhbnkgb2J2aW91cyBhcmVhcyBmb3Igb3B0aW1pemF0aW9uLCBzdWNoIGFzIHVzaW5nIHByZWZldGNoaW5nLCBpbmxpbmluZywgb3IgcmVkdWNpbmcgdW5uZWNlc3Nhcnkgc3lzdGVtIGNhbGxzPwoqICAgKipTZWN1cml0eToqKiBBcmUgdGhlcmUgYW55IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcywgc3VjaCBhcyBmb3JtYXQgc3RyaW5nIGJ1Z3Mgb3IgaW5qZWN0aW9uIGZsYXdzPwoKSSB3aWxsIHN0YXJ0IGJ5IG1lbnRhbGx5IHRyYWNpbmcgdGhlIGV4ZWN1dGlvbiBwYXRoLCBrZWVwaW5nIG15IGZpZWxkIG9mIGV4cGVydGlzZSBpbiBtaW5kIGFuZCB0aGUgcm9sZSB0aGlzIGZ1bmN0aW9uIHBsYXlzIGluIHRoZSBiaWdnZXIgcGljdHVyZS4gSSYjMzk7bGwgbmVlZCB0byBrbm93IHdoaWNoIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZCBpbiBhbmQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gZG8sIGFzIHdlbGwgYXMgdGhlIGV4cGVjdGVkIG91dHB1dHMuIEkgd2lsbCBnbyBsaW5lIGJ5IGxpbmUgdW50aWwgSSBoYXZlIGEgZ29vZCBncmFzcCBvZiB0aGUgd2hvbGUgcGljdHVyZSBhbmQgY2FuIGFuc3dlciBhbnkgcXVlc3Rpb25zIHRoYXQgSSBtYXkgaGF2ZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzQ4LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzNDg6XHRzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4gMzQ5Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDM1MDpcdHtcbiAzNTE6XHRcdHN0cnVjdCBndXBfdGVzdCBndXA7XG4gMzUyOlx0XHRpbnQgcmV0O1xuIDM1MzpcdFxuIDM1NDpcdFx0c3dpdGNoIChjbWQpIHtcbiAzNTU6XHRcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxuIDM1NjpcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMzU3Olx0XHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XG4gMzU4Olx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxuIDM1OTpcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAzNjA6XHRcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XG4gMzYxOlx0XHRcdGJyZWFrO1xuIDM2MjpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVDpcbiAzNjM6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RPUDpcbiAzNjQ6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcbiAzNjU6XHRcdFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XG4gMzY2Olx0XHRkZWZhdWx0OlxuIDM2NzpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzNjg6XHRcdH1cbiAzNjk6XHRcbiAzNzA6XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZndXAsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGd1cCkpKVxuIDM3MTpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzNzI6XHRcbiAzNzM6XHRcdHJldCA9IF9fZ3VwX3Rlc3RfaW9jdGwoY21kLCBcdTAwMjZndXApO1xuIDM3NDpcdFx0aWYgKHJldClcbiAzNzU6XHRcdFx0cmV0dXJuIHJldDtcbiAzNzY6XHRcbiAzNzc6XHRcdGlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBcdTAwMjZndXAsIHNpemVvZihndXApKSlcbiAzNzg6XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gMzc5Olx0XG4gMzgwOlx0XHRyZXR1cm4gMDtcbiAzODE6XHR9XG4gMzgyOlx0XG4gMzgzOlx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuIDM4NDpcdHtcbiAzODU6XHRcdHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhO1xuIDM4NjpcdFx0aW50IHJldDtcbiAzODc6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzQ5MgoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDU1MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIGd1cF90ZXN0X2lvY3RsIENoYW5nZXMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBtb2RpZmljYXRpb24gdG8gYF9fZ3VwX3Rlc3RfaW9jdGxgLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIHVuZGVyc3RhbmQgdGhlICYjMzQ7d2h5JiMzNDsgYmVoaW5kIHRoZSBjaGFuZ2UgdG8gYGd1cC0mZ3Q7c2l6ZWAuIEkgbmVlZCB0byByZWNvbnN0cnVjdCB0aGUgbG9naWMgaW4gbXkgaGVhZCwgc3RhcnRpbmcgd2l0aCBob3cgYGd1cC0mZ3Q7c2l6ZWAgd2FzIHByZXZpb3VzbHkgY2FsY3VsYXRlZCB2ZXJzdXMgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbi4KCkkgc2VlIHRoYXQgYGd1cC0mZ3Q7c2l6ZWAgdXNlZCB0byBiZSBgYWRkciAtIGd1cC0mZ3Q7YWRkcmAuIEkgbmVlZCB0byBjb25maXJtIHRoZSBjb25kaXRpb25zIHdoZXJlIHRoaXMgYXBwcm9hY2ggZmVsbCBzaG9ydCBhbmQgaG93IHRoZSBuZXcgbWV0aG9kLCBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgLCBpbXByb3ZlcyB0aGUgcmVzdWx0LgoKTG9va2luZyBjbG9zZWx5IGF0IHRoZSBsb29wLCB0aGUgdmFyaWFibGUgYGFkZHJgIGlzIGluY3JlbWVudGVkLCBhbmQgYG5leHRgIGlzIHNldCB0byBgYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRWAgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGl0ZXJhdGlvbi4gVGhlIGNydWNpYWwgcG9pbnQgaXMgdGhhdCBgbnJgIGlzIHRoZSAqcmVxdWVzdGVkKiBudW1iZXIgb2YgcGFnZXMgKmJlZm9yZSogdGhlIGBzd2l0Y2hgIHN0YXRlbWVudCB0aGF0IGNhbGxzIGBnZXRfdXNlcl9wYWdlc2AuIEkgYW0gbm90aWNpbmcgdGhhdCBgbnJgIG1pZ2h0IG5vdCBiZSB0aGUgYWN0dWFsIG51bWJlciBvZiBwYWdlcyBwaW5uZWQgKHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uKS4gSW4gdGhlIGNvZGUsIGlmIGBucmAgaXMgbGVzcyB0aGFuIHJlcXVlc3RlZCwgdGhlIGxvb3Agd2lsbCBicmVhay4gSSBuZWVkIHRvIHRoaW5rIHRoaXMgdGhyb3VnaC4gYG5leHRgIGlzIHN0aWxsIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgY291bnQsIGJ1dCBgaWAgd2lsbCBvbmx5IHRyYWNrIHRoZSBhY3R1YWwgbnVtYmVyIHBpbm5lZC4gVGhhdCYjMzk7cyBpdCEgSWYgYGdldF91c2VyX3BhZ2VzYCByZXR1cm5zIGZld2VyIHBhZ2VzIHRoYW4gcmVxdWVzdGVkIChwYXJ0aWFsIHN1Y2Nlc3Mgb3IgZmFpbHVyZSksIHRoZSBjb21wdXRhdGlvbiBvZiBgYWRkcmAgaXMgbm93IGluYWNjdXJhdGUuIFRoZSBlYXJsaWVyIGBhZGRyIC0gZ3VwLSZndDthZGRyYCBjYWxjdWxhdGlvbiBvZiBgZ3VwLSZndDtzaXplYCBkb2VzbiYjMzk7dCByZWZsZWN0IHRoZSBieXRlcyBvciBwYWdlcyB0aGF0IHdlcmUgKmFjdHVhbGx5KiBwaW5uZWQuIFRoZSBicmVhayBpcyB0aGUga2V5LgoKVGhpcyBsZWFkcyBtZSB0byB1bmRlcnN0YW5kIHRoZSBjaGFuZ2UuIFRoZSBuZXcgY2FsY3VsYXRpb24sIGBucl9wYWdlcyAqIFBBR0VfU0laRWAsIHVzZXMgYG5yX3BhZ2VzYCwgd2hpY2ggaXMgdGhlIHZhcmlhYmxlIGBpYCB0aGF0IEkgZGV0ZXJtaW5lZCBlYXJsaWVyLCBpcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHBpbm5lZC4gVGhpcyBpcyBhIG1vcmUgcHJlY2lzZSBhbmQgY29ycmVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBzaXplIHdpdGhpbiBgc3RydWN0IGd1cF90ZXN0YC4gVGhpcyBjaGFuZ2UgaXMgc3RyYWlnaHRmb3J3YXJkLCBhcyBgZ3VwLSZndDtzaXplYCBpcyBqdXN0IGFuIGludGVnZXIgaW4gdGhlIHN0cnVjdC4KCk5vdywgbGV0JiMzOTtzIHF1aWNrbHkgcmV2aWV3IHRoZSBgc3RydWN0IGd1cF90ZXN0YCBkZWZpbml0aW9uIHRvIGVuc3VyZSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoaXMgZmllbGQmIzM5O3MgcHVycG9zZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHN1cnJvdW5kaW5nIGRhdGEuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3N0cnVjdCBndXBfdGVzdFxcYiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jPTQ2PXN0YXRpYyB2b2lkIHZlcmlmeV9kbWFfcGlubmVkKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4tLVxubW0vZ3VwX3Rlc3QuYy03NS1cbm1tL2d1cF90ZXN0LmM6NzY6c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxubW0vZ3VwX3Rlc3QuYy03Ny1cdFx0XHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbi0tXG5tbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbm1tL2d1cF90ZXN0LmM6MTA4Olx0XHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcbm1tL2d1cF90ZXN0LmMtMTA5LXtcbi0tXG5tbS9ndXBfdGVzdC5jPTM0OD1zdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4tLVxubW0vZ3VwX3Rlc3QuYy0zNTAte1xubW0vZ3VwX3Rlc3QuYzozNTE6XHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwO1xubW0vZ3VwX3Rlc3QuYy0zNTItXHRpbnQgcmV0O1xuLS1cbm1tL2d1cF90ZXN0LmgtNi1cbm1tL2d1cF90ZXN0Lmg6NzojZGVmaW5lIEdVUF9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDEsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6ODojZGVmaW5lIFBJTl9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDIsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6OTojZGVmaW5lIFBJTl9MT05HVEVSTV9CRU5DSE1BUktcdF9JT1dSKCYjMzk7ZyYjMzk7LCAzLCBzdHJ1Y3QgZ3VwX3Rlc3QpXG5tbS9ndXBfdGVzdC5oOjEwOiNkZWZpbmUgR1VQX0JBU0lDX1RFU1RcdFx0X0lPV1IoJiMzOTtnJiMzOTssIDQsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6MTE6I2RlZmluZSBQSU5fQkFTSUNfVEVTVFx0XHRfSU9XUigmIzM5O2cmIzM5OywgNSwgc3RydWN0IGd1cF90ZXN0KVxubW0vZ3VwX3Rlc3QuaDoxMjojZGVmaW5lIERVTVBfVVNFUl9QQUdFU19URVNUXHRfSU9XUigmIzM5O2cmIzM5OywgNiwgc3RydWN0IGd1cF90ZXN0KVxubW0vZ3VwX3Rlc3QuaC0xMy0jZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUXHRfSU9XKCYjMzk7ZyYjMzk7LCA3LCBzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QpXG4tLVxubW0vZ3VwX3Rlc3QuaC0yMC1cbm1tL2d1cF90ZXN0Lmg6MjE6c3RydWN0IGd1cF90ZXN0IHtcbm1tL2d1cF90ZXN0LmgtMjItXHRfX3U2NCBnZXRfZGVsdGFfdXNlYztcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jPTUxPXZvaWQgKmd1cF90aHJlYWQodm9pZCAqZGF0YSlcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmMtNTIte1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZ3VwX3Rlc3QuYzo1MzpcdHN0cnVjdCBndXBfdGVzdCBndXAgPSAqKHN0cnVjdCBndXBfdGVzdCAqKWRhdGE7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jLTU0LVx0aW50IGksIHN0YXR1cztcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jPTkyPWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmMtOTMte1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZ3VwX3Rlc3QuYzo5NDpcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7IDAgfTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmMtOTUtXHRpbnQgZmlsZWQsIGksIG9wdCwgbnJfcGFnZXMgPSAxLCB0aHAgPSAtMSwgd3JpdGUgPSAxLCBudGhyZWFkcyA9IDEsIHJldDtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYz0xNzYyPXN0YXRpYyBpbnQgZ3VwX3Rlc3RfZXhlYyhpbnQgZ3VwX2ZkLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCBjbWQsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMtMTc2NC17XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYzoxNzY1Olx0c3RydWN0IGd1cF90ZXN0IGd1cCA9IHtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jLTE3NjYtXHRcdC5ucl9wYWdlc19wZXJfY2FsbFx0PSBucGFnZXMsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk1NTAKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIGBtbS9ndXBfdGVzdC5oYCoqCgpBbHJpZ2h0LCB0aW1lIHRvIGdldCB0byBpdC4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggYG1tL2d1cF90ZXN0LmhgLiBUaGlzIGlzIGxpa2VseSB3aGVyZSB0aGUgY29yZSB0ZXN0IGluZnJhc3RydWN0dXJlIGZvciB0aGUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgZnVuY3Rpb25hbGl0eSByZXNpZGVzLiBLbm93aW5nIHRoZSBpbnRyaWNhY2llcyBvZiB0aGlzIGZpbGUgaXMgY3J1Y2lhbCBmb3IgYSBkZWVwIHVuZGVyc3RhbmRpbmcgb2YgaG93IG1lbW9yeSBtYXBwaW5nIGFuZCBwYWdlIGZhdWx0IGhhbmRsaW5nIGFyZSBiZWluZyB0ZXN0ZWQgd2l0aGluIHRoZSBrZXJuZWwuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbnRhbCBtYXAgb2YgdGhpcyBwYXJ0aWN1bGFyIHNldCBvZiB0ZXN0cyDigJMgYXJlIHRoZXkgZm9jdXNpbmcgb24gc3BlY2lmaWMgR1VQIG9wdGltaXphdGlvbiBwYXRocywgYm91bmRhcnkgY29uZGl0aW9ucywgY29uY3VycmVudCBhY2Nlc3Mgc2NlbmFyaW9zLCBvciBwZXJoYXBzIGRpZmZlcmVudCBtZW1vcnkgem9uZXM/IAoKSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2UgdGhlIGRlZmluaXRpb25zIG9mIHRlc3Qgc3RydWN0dXJlcywgaGVscGVyIG1hY3JvcyBmb3Igc2V0dGluZyB1cCBtZW1vcnkgcmVnaW9ucyBhbmQgaW5qZWN0aW5nIGZhdWx0cywgYXNzZXJ0aW9ucyB0byB2YWxpZGF0ZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IsIGFuZCBhbnkgaW50cmljYXRlIHRocmVhZGluZyBtb2RlbHMgdGhleSYjMzk7cmUgZW1wbG95aW5nLiBTcGVjaWZpY2FsbHksIEkmIzM5O2xsIGJlIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gYW55IHVzZXMgb2YgYGd1cF9mYXN0YCwgYGd1cF9vbmVfcGFnZWAsIG9yIHNpbWlsYXIgZnVuY3Rpb25zIHRvIHNlZSBob3cgZWZmaWNpZW50bHkgdGhleSYjMzk7cmUgdGVzdGluZyB0aGUgY29tbW9uIEdVUCBjb2RlIHBhdGhzLiBBbnkgY3VzdG9tIHBhZ2UgZmF1bHQgaGFuZGxlcnMgdXNlZCBoZXJlPyBBbnkgaW50ZXJlc3Rpbmcgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM/IEFyZSB0aGV5IHVzaW5nIGtlcm5lbCB0ZXN0IHN1aXRlcyBvciBhIG1vcmUgYWQtaG9jIGFwcHJvYWNoPyBJdCYjMzk7cyBhbGwgYWJvdXQgZW5zdXJpbmcgdGhlIHRlc3QgY292ZXJhZ2UgaXMgcm9idXN0IGFuZCBlZmZlY3RpdmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vZ3VwX3Rlc3QuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyICovXG4gICAyOlx0I2lmbmRlZiBfX0dVUF9URVNUX0hcbiAgIDM6XHQjZGVmaW5lIF9fR1VQX1RFU1RfSFxuICAgNDpcdFxuICAgNTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiAgIDY6XHRcbiAgIDc6XHQjZGVmaW5lIEdVUF9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDEsIHN0cnVjdCBndXBfdGVzdClcbiAgIDg6XHQjZGVmaW5lIFBJTl9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDIsIHN0cnVjdCBndXBfdGVzdClcbiAgIDk6XHQjZGVmaW5lIFBJTl9MT05HVEVSTV9CRU5DSE1BUktcdF9JT1dSKCYjMzk7ZyYjMzk7LCAzLCBzdHJ1Y3QgZ3VwX3Rlc3QpXG4gIDEwOlx0I2RlZmluZSBHVVBfQkFTSUNfVEVTVFx0XHRfSU9XUigmIzM5O2cmIzM5OywgNCwgc3RydWN0IGd1cF90ZXN0KVxuICAxMTpcdCNkZWZpbmUgUElOX0JBU0lDX1RFU1RcdFx0X0lPV1IoJiMzOTtnJiMzOTssIDUsIHN0cnVjdCBndXBfdGVzdClcbiAgMTI6XHQjZGVmaW5lIERVTVBfVVNFUl9QQUdFU19URVNUXHRfSU9XUigmIzM5O2cmIzM5OywgNiwgc3RydWN0IGd1cF90ZXN0KVxuICAxMzpcdCNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfU1RBUlRcdF9JT1coJiMzOTtnJiMzOTssIDcsIHN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdClcbiAgMTQ6XHQjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUT1BcdF9JTygmIzM5O2cmIzM5OywgOClcbiAgMTU6XHQjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1JFQURcdF9JT1coJiMzOTtnJiMzOTssIDksIF9fdTY0KVxuICAxNjpcdFxuICAxNzpcdCNkZWZpbmUgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVBcdFx0OFxuICAxODpcdFxuICAxOTpcdCNkZWZpbmUgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU5cdDB4MVxuICAyMDpcdFxuICAyMTpcdHN0cnVjdCBndXBfdGVzdCB7XG4gIDIyOlx0XHRfX3U2NCBnZXRfZGVsdGFfdXNlYztcbiAgMjM6XHRcdF9fdTY0IHB1dF9kZWx0YV91c2VjO1xuICAyNDpcdFx0X191NjQgYWRkcjtcbiAgMjU6XHRcdF9fdTY0IHNpemU7XG4gIDI2Olx0XHRfX3UzMiBucl9wYWdlc19wZXJfY2FsbDtcbiAgMjc6XHRcdF9fdTMyIGd1cF9mbGFncztcbiAgMjg6XHRcdF9fdTMyIHRlc3RfZmxhZ3M7XG4gIDI5Olx0XHQvKlxuICAzMDpcdFx0ICogRWFjaCBub24temVybyBlbnRyeSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBwYWdlICgxLWJhc2VkOiBmaXJzdCBwYWdlIGlzXG4gIDMxOlx0XHQgKiBwYWdlIDEsIHNvIHRoYXQgemVybyBlbnRyaWVzIG1lYW4gXCYjMzQ7ZG8gbm90aGluZ1wmIzM0OykgZnJvbSB0aGUgLmFkZHIgYmFzZS5cbiAgMzI6XHRcdCAqL1xuICAzMzpcdFx0X191MzIgd2hpY2hfcGFnZXNbR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVBdO1xuICAzNDpcdH07XG4gIDM1Olx0XG4gIDM2Olx0I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9GTEFHX1VTRV9XUklURVx0MVxuICAzNzpcdCNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfRkxBR19VU0VfRkFTVFx0XHQyXG4gIDM4Olx0XG4gIDM5Olx0c3RydWN0IHBpbl9sb25ndGVybV90ZXN0IHtcbiAgNDA6XHRcdF9fdTY0IGFkZHI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNjA4CgkJCQkJCQlvdXRwdXQ6IDE4MgoJCQkJCQkJdGhvdWdodHM6IDYzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoOiBtbS9ndXBfdGVzdC5jKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaW4gYG1tL2d1cF90ZXN0LmNgIGlzIGNoYW5naW5nIGhvdyBgZ3VwLSZndDtzaXplYCBpcyBjYWxjdWxhdGVkLiBQcmV2aW91c2x5LCBpdCB3YXMgYGFkZHIgLSBndXAtJmd0O2FkZHJgLCBub3cgaXQmIzM5O3MgYG5yX3BhZ2VzICogUEFHRV9TSVpFYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGltbWVkaWF0ZWx5IGNoZWNrIGZvciBhbnkgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlcywgYXMgdGhhdCYjMzk7cyBhIGNsYXNzaWMgS01TQU4gcmVkIGZsYWcuCgpGaXJzdCwgaXMgdGhlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgKmV4cG9zZWQqPyBObywgdGhlIGBndXBgIHN0cnVjdCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBndXBfdGVzdF9pb2N0bGAsIGFuZCBgY29weV9mcm9tX3VzZXJgIGluaXRpYWxpemVzIHRoZSAqZW50aXJlKiBzdHJ1Y3QgZnJvbSB1c2VyIHNwYWNlLiBFdmVyeSBzaW5nbGUgYnl0ZSBnZXRzIHBvcHVsYXRlZC4gVGhlbiwgYF9fZ3VwX3Rlc3RfaW9jdGxgIG1vZGlmaWVzIGNlcnRhaW4gZmllbGRzIOKAkyBgZ3VwLSZndDtzaXplYCwgdGltaW5nIGRhdGEsIGFuZCBwb3NzaWJseSBhcnJheSBlbGVtZW50cyB3aXRoaW4gYGd1cGAgYnV0ICphZnRlciogdGhlIGBndXBgIHN0cnVjdCBpcyBpbml0aWFsaXplZC4gRmluYWxseSwgYGNvcHlfdG9fdXNlcmAgd3JpdGVzIHRoZSBlbnRpcmUgc3RydWN0IGJhY2suIFRoZSBjaGFuZ2UgaGVyZSBpcyAqc29sZWx5KiBob3cgYW4gaW50ZWdlciwgYGd1cC0mZ3Q7c2l6ZWAsIGlzIGNhbGN1bGF0ZWQsIGJlZm9yZSBiZWluZyByZXR1cm5lZCB0byB1c2VyIHNwYWNlLiBJdCBkb2VzbiYjMzk7dCBsZWF2ZSB1bmluaXRpYWxpemVkIGRhdGEgaW4gdGhlIGtlcm5lbC4KClNlY29uZCwgZG9lcyB0aGlzIG1lc3Mgd2l0aCBidWZmZXIgc2l6ZXMgb3IgYm91bmRzIGNoZWNrcyBhbmQgcG90ZW50aWFsbHkgKnJlYWQqIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBOby4gVGhlIGFsbG9jYXRpb24gb2YgYG5yX3BhZ2VzYCBhbmQgYHBhZ2VzYCBoYXBwZW5zICpiZWZvcmUqIHRoZSBsb29wLiBUaGUgYHBhZ2VzYCBhbGxvY2F0aW9uIGlzIGluZGVwZW5kZW50IGFuZCBgZ3VwLSZndDtzaXplYCAocG9zdCBjaGFuZ2UpIGlzbiYjMzk7dCB1c2VkIGluIGFueSBtZW1vcnkgYWNjZXNzICphZnRlcndhcmRzKi4gVGhlIGNoYW5nZSBpcyBqdXN0IGFib3V0IHRoZSBpbnRlZ2VyIGNhbGN1bGF0aW9uIHRoYXQgcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUgb3BlcmF0aW9uOyBpdCYjMzk7cyBqdXN0IGJlaW5nIHVwZGF0ZWQgYW5kIHNlbnQgYmFjayB0byB1c2Vyc3BhY2UuCgpTbywgaW4gc3VtbWFyeSwgYmFzZWQgb24gbXkgdW5kZXJzdGFuZGluZywgdGhlcmUgYXJlICpubyogdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIG5vIGluZm8gbGVha3Mgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LCBhbmQgbm8gYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcyBhIGNvbnNlcXVlbmNlIG9mIHRoaXMgcGF0Y2guIFRoZSBzdHJ1Y3QgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgZnJvbSB1c2VyIHNwYWNlLCBhbmQgdGhlIGNoYW5nZSBzaW1wbHkgYWx0ZXJzIGhvdyBhIHNpbmdsZSBpbnRlZ2VyIGlzIGNvbXB1dGVkIGJlZm9yZSBiZWluZyBjb3BpZWQgKmJhY2sqIHRvIHVzZXIgc3BhY2UsIGluZGljYXRpbmcgdGhhdCB0aGlzIGRvZXNuJiMzOTt0IHdhcnJhbnQgS01TQU4uIFN0YW5kYXJkIGZ1enppbmcgYW5kIG90aGVyIGRldGVjdG9ycyBzaG91bGQgYmUgc3VmZmljaWVudCB0byBpZGVudGlmeSBhbnkgaXNzdWVzLgoKVGhlcmVmb3JlLCBgTmVlZHNLTVNBTmAgaXMgZGVmaW5pdGVseSBgZmFsc2VgLiBUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggY2hhbmdlcyB0aGUgY2FsY3VsYXRpb24gb2YgYGd1cC1cdTAwM2VzaXplYCBmcm9tIGBhZGRyIC0gZ3VwLVx1MDAzZWFkZHJgIHRvIGBucl9wYWdlcyAqIFBBR0VfU0laRWAgaW4gYF9fZ3VwX3Rlc3RfaW9jdGwoKWAgKGBtbS9ndXBfdGVzdC5jYCkuIFRoZSBgc3RydWN0IGd1cF90ZXN0YCBidWZmZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYXQgdGhlIGVudHJ5IG9mIGBndXBfdGVzdF9pb2N0bGAgYmVmb3JlIGJlaW5nIG1vZGlmaWVkIGFuZCBjb3BpZWQgYmFjayB0byB1c2VyIHNwYWNlIHdpdGggYGNvcHlfdG9fdXNlcmAuIFRoZSBjaGFuZ2Ugc29sZWx5IHVwZGF0ZXMgYW4gYXJpdGhtZXRpYyBjYWxjdWxhdGlvbiBmb3IgYW4gb3V0cHV0IGZpZWxkIHJlcG9ydGluZyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBwaW5uZWQgYnl0ZXMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMsIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnksIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNoYW5nZXMgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXHUwMDNlc2l6ZWAgZnJvbSBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCB0byBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgIGluIGBfX2d1cF90ZXN0X2lvY3RsKClgIChgbW0vZ3VwX3Rlc3QuY2ApLiBUaGUgYHN0cnVjdCBndXBfdGVzdGAgYnVmZmVyIGlzIGZ1bGx5IGluaXRpYWxpemVkIHZpYSBgY29weV9mcm9tX3VzZXJgIGF0IHRoZSBlbnRyeSBvZiBgZ3VwX3Rlc3RfaW9jdGxgIGJlZm9yZSBiZWluZyBtb2RpZmllZCBhbmQgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRoIGBjb3B5X3RvX3VzZXJgLiBUaGUgY2hhbmdlIHNvbGVseSB1cGRhdGVzIGFuIGFyaXRobWV0aWMgY2FsY3VsYXRpb24gZm9yIGFuIG91dHB1dCBmaWVsZCByZXBvcnRpbmcgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsbHkgcGlubmVkIGJ5dGVzLiBJdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFsbG9jYXRpb25zLCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBvciBrZXJuZWwgaW5mby1sZWFrcy4gVGhlcmVmb3JlLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjAxOjA4LjExMjA2NDcxM1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1NzYyNjc1NDE3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJHVVBfVEVTVFwiLFxuICAgIFwiREVCVUdfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJndXBfdGVzdF9pb2N0bFwiLFxuICAgIFwiX19ndXBfdGVzdF9pb2N0bFwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY2hhbmdlcyB0aGUgY2FsY3VsYXRpb24gb2YgYGd1cC1cXHUwMDNlc2l6ZWAgZnJvbSBgYWRkciAtIGd1cC1cXHUwMDNlYWRkcmAgdG8gYG5yX3BhZ2VzICogUEFHRV9TSVpFYCBpbiBgX19ndXBfdGVzdF9pb2N0bCgpYCAoYG1tL2d1cF90ZXN0LmNgKS4gVGhlIGBzdHJ1Y3QgZ3VwX3Rlc3RgIGJ1ZmZlciBpcyBmdWxseSBpbml0aWFsaXplZCB2aWEgYGNvcHlfZnJvbV91c2VyYCBhdCB0aGUgZW50cnkgb2YgYGd1cF90ZXN0X2lvY3RsYCBiZWZvcmUgYmVpbmcgbW9kaWZpZWQgYW5kIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2Ugd2l0aCBgY29weV90b191c2VyYC4gVGhlIGNoYW5nZSBzb2xlbHkgdXBkYXRlcyBhbiBhcml0aG1ldGljIGNhbGN1bGF0aW9uIGZvciBhbiBvdXRwdXQgZmllbGQgcmVwb3J0aW5nIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IHBpbm5lZCBieXRlcy4gSXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBhbGxvY2F0aW9ucywgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSwgb3Iga2VybmVsIGluZm8tbGVha3MuIFRoZXJlZm9yZSwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgX19ndXBfdGVzdF9pb2N0bCgpIGluIG1tL2d1cF90ZXN0LmMgdG8gY29ycmVjdGx5IHNldCB0aGUgcmV0dXJuZWQgc2l6ZSB0byAnbnJfcGFnZXMgKiBQQUdFX1NJWkUnIHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nICdhZGRyIC0gZ3VwLVxcdTAwM2VhZGRyJyB3aGljaCBjb3VsZCBiZSBpbmNvcnJlY3QgaWYgZ2V0X3VzZXJfcGFnZXMvcGluX3VzZXJfcGFnZXMgdGVybWluYXRlZCBlYXJseS4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGlvY3RsIGludGVyZmFjZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6MDguMTEyMDY5MjUzWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzk0MTM1MTk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMmE3MzU2ODhlYTZiZTdhZjJkMzUzZDliOWM5MDMyMzYwZWY2YWIzYlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIEF1ZyAzMSAxMjowMTowNiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xcbmluZGV4IDQ0YzFjZGZiOWMzNzEuLjE4NWJhM2JiOGVkMTAgMTAwNjQ0XFxuLS0tIGEvbW0vZ3VwX3Rlc3QuY1xcbisrKyBiL21tL2d1cF90ZXN0LmNcXG5AQCAtMTg4LDcgKzE4OCw3IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxcbiBcXHRucl9wYWdlcyA9IGk7XFxuIFxcbiBcXHRndXAtXFx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xcbi1cXHRndXAtXFx1MDAzZXNpemUgPSBhZGRyIC0gZ3VwLVxcdTAwM2VhZGRyO1xcbitcXHRndXAtXFx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTowOS41MDcwODAyMzJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjE5NzAyNjU5NTg1MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJHVVBfVEVTVFwiLFxuICAgIFwiREVCVUdfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJndXBfdGVzdF9pb2N0bFwiLFxuICAgIFwiX19ndXBfdGVzdF9pb2N0bFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgX19ndXBfdGVzdF9pb2N0bCgpIGluIG1tL2d1cF90ZXN0LmMgdG8gY29ycmVjdGx5IHNldCB0aGUgcmV0dXJuZWQgc2l6ZSB0byAnbnJfcGFnZXMgKiBQQUdFX1NJWkUnIHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nICdhZGRyIC0gZ3VwLVxcdTAwM2VhZGRyJyB3aGljaCBjb3VsZCBiZSBpbmNvcnJlY3QgaWYgZ2V0X3VzZXJfcGFnZXMvcGluX3VzZXJfcGFnZXMgdGVybWluYXRlZCBlYXJseS4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGlvY3RsIGludGVyZmFjZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMmE3MzU2ODhlYTZiZTdhZjJkMzUzZDliOWM5MDMyMzYwZWY2YWIzYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDMxIDEyOjAxOjA2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vZ3VwX3Rlc3QuYyBiL21tL2d1cF90ZXN0LmNcbmluZGV4IDQ0YzFjZGZiOWMzNzEuLjE4NWJhM2JiOGVkMTAgMTAwNjQ0XG4tLS0gYS9tbS9ndXBfdGVzdC5jXG4rKysgYi9tbS9ndXBfdGVzdC5jXG5AQCAtMTg4LDcgKzE4OCw3IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIFx0bnJfcGFnZXMgPSBpO1xuIFxuIFx0Z3VwLVx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuLVx0Z3VwLVx1MDAzZXNpemUgPSBhZGRyIC0gZ3VwLVx1MDAzZWFkZHI7XG4rXHRndXAtXHUwMDNlc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuIFxuIFx0LypcbiBcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6MDkuNTA3MTA0NjkyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTY3Mzk0NjQ0OTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgS2VybmVsIFBhdGNoOiBndXBfdGVzdC5jKipcblxuT2theSwgc28gdGhlIHVzZXIgd2FudHMgbWUgdG8gdGFrZSBhIGxvb2sgYXQgYSBwYXRjaCwgc3BlY2lmaWNhbGx5IGEgYGRpZmZgIGZvciBgbW0vZ3VwX3Rlc3QuY2AuIFRoZSBjb3JlIHNlZW1zIHRvIGJlIHJlbGF0ZWQgdG8gYGd1cGAgdGVzdGluZywgd2hpY2ggbGlrZWx5IHBlcnRhaW5zIHRvIFwiZ2V0IHVzZXIgcGFnZXNcIiBvciBhIHNpbWlsYXIgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBxdWlja2x5IHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2UuIExldCdzIHNlZS4uLiBhIGNvbW1pdCwgYW5kIHRoZSBkaWZmIHNob3dzIGEgbW9kaWZpY2F0aW9uIGFyb3VuZCBsaW5lIDE4OC5cblxuSSBzZWUgYSBjaGFuZ2Ugd2hlcmUgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXHUwMDNlc2l6ZWAgaGFzIGJlZW4gbW9kaWZpZWQuIFByZXZpb3VzbHksIGl0IHdhcyBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCwgYnV0IG5vdyBpdCdzIGBucl9wYWdlcyAqIFBBR0VfU0laRWAuIEFoLCBJIHNlZSEgQmVmb3JlIGl0IHdhcyBwcmVzdW1hYmx5IGNhbGN1bGF0aW5nIHRoZSBzaXplIGJhc2VkIG9uIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0YXJ0aW5nIGFkZHJlc3MgYW5kIHRoZSBlbmRpbmcgYWRkcmVzcywgYW5kIG5vdywgaXQncyBleHBsaWNpdGx5IGNvbXB1dGluZyBpdCBieSBtdWx0aXBseWluZyB0aGUgbnVtYmVyIG9mIHBhZ2VzIGJ5IHRoZSBwYWdlIHNpemUuIFRoaXMgaXMgcHJvYmFibHkgYW4gaW1wcm92ZW1lbnQgZm9yIGNsYXJpdHkgYW5kIGFjY3VyYWN5LiBJdCBzdHJvbmdseSBzdWdnZXN0cyB0aGF0IHRoZSBwcmV2aW91cyBjYWxjdWxhdGlvbiB3YXMgcHJvbmUgdG8gZXJyb3JzLCBwb3NzaWJseSBkdWUgdG8gYWxpZ25tZW50IGlzc3VlcyBvciBhbiBpbmNvcnJlY3QgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGJ1ZmZlciBib3VuZGFyaWVzLCBvciwgcGVyaGFwcywgd2FzIG1pc2xlYWRpbmcuIE5vdywgaXQncyBkaXJlY3RseSBkZXJpdmVkIGZyb20gdGhlIG51bWJlciBvZiBwYWdlcywgd2hpY2ggaXMgY2xlYW5lciBhbmQgbW9yZSByb2J1c3QuXG5cbkknbGwgaGF2ZSB0byBpbnZlc3RpZ2F0ZSBpZiB0aGlzIGlzIGEgY29ycmVjdGlvbiBvZiBhIGRlZmVjdCwgb3Igc2ltcGx5IGFuIGltcHJvdmVtZW50LiBMZXQncyBzZWUsIHdoYXQgZWxzZSBkb2VzIHRoZSBwYXRjaCB0b3VjaC4uLiBUaGUgc3Vycm91bmRpbmcgY29kZSBzZWVtcyByZWxhdGVkIHRvIGJlbmNobWFya2luZyB0aGUgZ2V0X3VzZXJfcGFnZXMgZnVuY3Rpb25hbGl0eSBhbmQgdmVyaWZ5aW5nIERNQS1waW5uZWQgcGFnZXMsIHByb2JhYmx5IGZvciBwZXJmb3JtYW5jZS4gSSBleHBlY3QgdGhpcyBjaGFuZ2Ugd2lsbCBtYWtlIHRoZSBiZW5jaG1hcmtzIG1vcmUgcHJlY2lzZS4gVGhpcyBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSBhbmQgcHJvYmFibHkgYSBnb29kIGNoYW5nZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA3MCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzNiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjAxOjI2LjI0NjU3MTc5M1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY2NjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTcwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTcwOlxcdFxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNzE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE3MjpcXHRcXHRcXHRcXHRlbHNlXFxuIDE3MzpcXHRcXHRcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTc0OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNzU6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE3NjpcXHRcXHRcXHRkZWZhdWx0OlxcbiAxNzc6XFx0XFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4gMTc4OlxcdFxcdFxcdFxcdGdvdG8gdW5sb2NrO1xcbiAxNzk6XFx0XFx0XFx0fVxcbiAxODA6XFx0XFxuIDE4MTpcXHRcXHRcXHRpZiAobnIgXFx1MDAzYz0gMClcXG4gMTgyOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxODM6XFx0XFx0XFx0aSArPSBucjtcXG4gMTg0OlxcdFxcdH1cXG4gMTg1OlxcdFxcdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDE4NjpcXHRcXG4gMTg3OlxcdFxcdC8qIFNoaWZ0aW5nIHRoZSBtZWFuaW5nIG9mIG5yX3BhZ2VzOiBub3cgaXQgaXMgYWN0dWFsIG51bWJlciBwaW5uZWQ6ICovXFxuIDE4ODpcXHRcXHRucl9wYWdlcyA9IGk7XFxuIDE4OTpcXHRcXG4gMTkwOlxcdFxcdGd1cC1cXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XFxuIDE5MTpcXHRcXHRndXAtXFx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcXG4gMTkyOlxcdFxcbiAxOTM6XFx0XFx0LypcXG4gMTk0OlxcdFxcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxcbiAxOTU6XFx0XFx0ICogc3RhdGU6IHByaW50IGEgd2FybmluZyBpZiBhbnkgbm9uLWRtYS1waW5uZWQgcGFnZXMgYXJlIGZvdW5kOlxcbiAxOTY6XFx0XFx0ICovXFxuIDE5NzpcXHRcXHR2ZXJpZnlfZG1hX3Bpbm5lZChjbWQsIHBhZ2VzLCBucl9wYWdlcyk7XFxuIDE5ODpcXHRcXG4gMTk5OlxcdFxcdGlmIChjbWQgPT0gRFVNUF9VU0VSX1BBR0VTX1RFU1QpXFxuIDIwMDpcXHRcXHRcXHRkdW1wX3BhZ2VzX3Rlc3QoZ3VwLCBwYWdlcywgbnJfcGFnZXMpO1xcbiAyMDE6XFx0XFxuIDIwMjpcXHRcXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDIwMzpcXHRcXG4gMjA0OlxcdFxcdHB1dF9iYWNrX3BhZ2VzKGNtZCwgcGFnZXMsIG5yX3BhZ2VzLCBndXAtXFx1MDAzZXRlc3RfZmxhZ3MpO1xcbiAyMDU6XFx0XFxuIDIwNjpcXHRcXHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xcbiAyMDc6XFx0XFx0Z3VwLVxcdTAwM2VwdXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcXG4gMjA4OlxcdFxcbiAyMDk6XFx0dW5sb2NrOlxcbiAyMTA6XFx0XFx0aWYgKG5lZWRzX21tYXBfbG9jaylcXG4gMjExOlxcdFxcdFxcdG1tYXBfcmVhZF91bmxvY2soY3VycmVudC1cXHUwMDNlbW0pO1xcbiAyMTI6XFx0ZnJlZV9wYWdlczpcXG4gMjEzOlxcdFxcdGt2ZnJlZShwYWdlcyk7XFxuIDIxNDpcXHRcXHRyZXR1cm4gcmV0O1xcbiAyMTU6XFx0fVxcbiAyMTY6XFx0XFxuIDIxNzpcXHRzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcXG4gMjE4OlxcdHtcXG4gMjE5OlxcdFxcdGlmIChkYXRhLVxcdTAwM2Vsb25ndGVybV9wYWdlcykge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMToyNi4yNDY2NDA0MjNaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNjkwMDYzMjIwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy5cblxuKipFeGFtaW5pbmcgYGd1cF90ZXN0LmNgKipcblxuQWxyaWdodCwgbXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gZ2V0IGEgaGFuZGxlIG9uIGBndXBfdGVzdC5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZpbGUgaXMgYWJvdXQsIGFuZCB0aGUgYmVzdCB3YXkgdG8gc3RhcnQgaXMgYnkgYSBxdWljayBzY2FuLiBMZXQncyBzZWUgd2hhdCB3ZSBoYXZlIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIGFuZCB0aGVuIEknbGwgcXVpY2tseSBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyB0byBzZWUgd2hlcmUgaXQncyBkZWZpbmVkIGFuZCB3aGF0IGNvbmZpZ3VyYXRpb25zIG1pZ2h0IGVuYWJsZSBpdC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgaW5pdGlhbCBjb250ZXh0LiBGcm9tIHRoZXJlLCBJIGNhbiBkZWNpZGUgaG93IGRlZXAgSSBuZWVkIHRvIGdvIGJhc2VkIG9uIHdoYXQgSSdtIHRyeWluZyB0byBhY2NvbXBsaXNoLCBidXQgdGhpcyBpcyB0aGUgcmlnaHQgc3RhcnRpbmcgcG9pbnQgZm9yIGFueSBnb29kIGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM0MDYsIk91dHB1dFRva2VucyI6MjUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjAxOjI4LjkzNjcwNjg0M1oiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODQ1NDE5OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJHVVBfVEVTVFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTEyODI9Y29uZmlnIFBFUkNQVV9TVEFUU1xcbi0tXFxubW0vS2NvbmZpZy0xMjg4LVxcbm1tL0tjb25maWc6MTI4OTpjb25maWcgR1VQX1RFU1RcXG5tbS9LY29uZmlnLTEyOTAtXFx0Ym9vbCBcXFwiRW5hYmxlIGluZnJhc3RydWN0dXJlIGZvciBnZXRfdXNlcl9wYWdlcygpLXJlbGF0ZWQgdW5pdCB0ZXN0c1xcXCJcXG4tLVxcbm1tL0tjb25maWctMTMwOC1cXG5tbS9LY29uZmlnOjEzMDk6Y29tbWVudCBcXFwiR1VQX1RFU1QgbmVlZHMgdG8gaGF2ZSBERUJVR19GUyBlbmFibGVkXFxcIlxcbm1tL0tjb25maWc6MTMxMDpcXHRkZXBlbmRzIG9uICFHVVBfVEVTVCBcXHUwMDI2XFx1MDAyNiAhREVCVUdfRlNcXG5tbS9LY29uZmlnLTEzMTEtXFxuLS1cXG5tbS9NYWtlZmlsZT0xMDk9b2JqLSQoQ09ORklHX0NHUk9VUF9IVUdFVExCKSArPSBodWdldGxiX2Nncm91cC5vXFxubW0vTWFrZWZpbGU6MTEwOm9iai0kKENPTkZJR19HVVBfVEVTVCkgKz0gZ3VwX3Rlc3Qub1xcbm1tL01ha2VmaWxlLTExMS1vYmotJChDT05GSUdfRE1BUE9PTF9URVNUKSArPSBkbWFwb29sX3Rlc3Qub1xcbi0tXFxubW0vZ3VwX3Rlc3QuYz0xNz1zdGF0aWMgdm9pZCBwdXRfYmFja19wYWdlcyh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbi0tXFxubW0vZ3VwX3Rlc3QuYy0zNC1cXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbm1tL2d1cF90ZXN0LmM6MzU6XFx0XFx0aWYgKGd1cF90ZXN0X2ZsYWdzIFxcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pIHtcXG5tbS9ndXBfdGVzdC5jLTM2LVxcdFxcdFxcdHVucGluX3VzZXJfcGFnZXMocGFnZXMsIG5yX3BhZ2VzKTtcXG4tLVxcbm1tL2d1cF90ZXN0LmM9NzY9c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbi0tXFxubW0vZ3VwX3Rlc3QuYy04NS1cXHQgKi9cXG5tbS9ndXBfdGVzdC5jOjg2OlxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSsrKSB7XFxubW0vZ3VwX3Rlc3QuYy04Ny1cXHRcXHRpZiAoZ3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXSBcXHUwMDNlIG5yX3BhZ2VzKSB7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTkzLVxcbm1tL2d1cF90ZXN0LmM6OTQ6XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpKyspIHtcXG5tbS9ndXBfdGVzdC5jLTk1LVxcdFxcdGluZGV4X3RvX2R1bXAgPSBndXAtXFx1MDAzZXdoaWNoX3BhZ2VzW2ldO1xcbi0tXFxubW0vZ3VwX3Rlc3QuYz0xMDc9c3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTE2OC1cXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbm1tL2d1cF90ZXN0LmM6MTY5OlxcdFxcdFxcdGlmIChndXAtXFx1MDAzZXRlc3RfZmxhZ3MgXFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTilcXG5tbS9ndXBfdGVzdC5jLTE3MC1cXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4tLVxcbm1tL2d1cF90ZXN0LmgtMS0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqL1xcbm1tL2d1cF90ZXN0Lmg6MjojaWZuZGVmIF9fR1VQX1RFU1RfSFxcbm1tL2d1cF90ZXN0Lmg6MzojZGVmaW5lIF9fR1VQX1RFU1RfSFxcbm1tL2d1cF90ZXN0LmgtNC1cXG4tLVxcbm1tL2d1cF90ZXN0LmgtMTYtXFxubW0vZ3VwX3Rlc3QuaDoxNzojZGVmaW5lIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QXFx0XFx0OFxcbm1tL2d1cF90ZXN0LmgtMTgtXFxubW0vZ3VwX3Rlc3QuaDoxOTojZGVmaW5lIEdVUF9URVNUX0ZMQUdfRFVNUF9QQUdFU19VU0VfUElOXFx0MHgxXFxubW0vZ3VwX3Rlc3QuaC0yMC1cXG5tbS9ndXBfdGVzdC5oPTIxPXN0cnVjdCBndXBfdGVzdCB7XFxuLS1cXG5tbS9ndXBfdGVzdC5oLTMyLVxcdCAqL1xcbm1tL2d1cF90ZXN0Lmg6MzM6XFx0X191MzIgd2hpY2hfcGFnZXNbR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVBdO1xcbm1tL2d1cF90ZXN0LmgtMzQtfTtcXG4tLVxcbm1tL2d1cF90ZXN0Lmg9Mzk9c3RydWN0IHBpbl9sb25ndGVybV90ZXN0IHtcXG4tLVxcbm1tL2d1cF90ZXN0LmgtNDQtXFxubW0vZ3VwX3Rlc3QuaDo0NTojZW5kaWZcXHQvKiBfX0dVUF9URVNUX0ggKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6MjguOTg1MTY2MzMzWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Mjg2Njg1OTI1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpZ2dpbmcgaW50byBLZXJuZWwgQ29uZmlndXJhdGlvbiBmb3IgR1VQX1RFU1QqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgYEdVUF9URVNUYCB0aGluZyBpcyBhbmQgaG93IGl0J3MgdXNlZC4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gZGl2ZSBpbnRvIHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gR2l2ZW4gbXkgZXhwZXJpZW5jZSB3aXRoIGtlcm5lbCBjb25maWd1cmF0aW9uLCBJJ20gYmV0dGluZyB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgZGVwZW5kZW5jaWVzIGFuZCBhIHBvdGVudGlhbCBkZWZpbml0aW9uLCB3aWxsIGJlIGFyb3VuZCBsaW5lIDEyODkuIFRoYXQncyBhIHJlYXNvbmFibGUgc3BvdCB0byBzdGFydCBzaW5jZSBLY29uZmlnIGZpbGVzIHRlbmQgdG8gYmUgb3JnYW5pemVkIGxvZ2ljYWxseS4gTGV0J3Mgc2VlIHdoYXQgd2UgY2FuIHVuY292ZXIgYWJvdXQgYEdVUF9URVNUYCBpbiB0aGF0IHNlY3Rpb24uIEhvcGVmdWxseSwgSSBjYW4gcXVpY2tseSBncmFzcCBpdHMgcHVycG9zZSBhbmQgYW55IGNvbmRpdGlvbnMgdGhhdCBkaWN0YXRlIGl0cyBhdmFpbGFiaWxpdHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ2NzIsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTozMS44NTIwMjc0NVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0MzQyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEyODUsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEyODU6XFx0XFx0ICBUaGlzIGZlYXR1cmUgY29sbGVjdHMgYW5kIGV4cG9zZXMgc3RhdGlzdGljcyB2aWEgZGVidWdmcy4gVGhlXFxuMTI4NjpcXHRcXHQgIGluZm9ybWF0aW9uIGluY2x1ZGVzIGdsb2JhbCBhbmQgcGVyIGNodW5rIHN0YXRpc3RpY3MsIHdoaWNoIGNhblxcbjEyODc6XFx0XFx0ICBiZSB1c2VkIHRvIGhlbHAgdW5kZXJzdGFuZCBwZXJjcHUgbWVtb3J5IHVzYWdlLlxcbjEyODg6XFx0XFxuMTI4OTpcXHRjb25maWcgR1VQX1RFU1RcXG4xMjkwOlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBpbmZyYXN0cnVjdHVyZSBmb3IgZ2V0X3VzZXJfcGFnZXMoKS1yZWxhdGVkIHVuaXQgdGVzdHNcXFwiXFxuMTI5MTpcXHRcXHRkZXBlbmRzIG9uIERFQlVHX0ZTXFxuMTI5MjpcXHRcXHRoZWxwXFxuMTI5MzpcXHRcXHQgIFByb3ZpZGVzIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0LCB3aGljaCBpbiB0dXJuIHByb3ZpZGVzIGEgd2F5XFxuMTI5NDpcXHRcXHQgIHRvIG1ha2UgaW9jdGwgY2FsbHMgdGhhdCBjYW4gbGF1bmNoIGtlcm5lbC1iYXNlZCB1bml0IHRlc3RzIGZvclxcbjEyOTU6XFx0XFx0ICB0aGUgZ2V0X3VzZXJfcGFnZXMqKCkgYW5kIHBpbl91c2VyX3BhZ2VzKigpIGZhbWlseSBvZiBBUEkgY2FsbHMuXFxuMTI5NjpcXHRcXG4xMjk3OlxcdFxcdCAgVGhlc2UgdGVzdHMgaW5jbHVkZSBiZW5jaG1hcmsgdGVzdGluZyBvZiB0aGUgX2Zhc3QgdmFyaWFudHMgb2ZcXG4xMjk4OlxcdFxcdCAgZ2V0X3VzZXJfcGFnZXMqKCkgYW5kIHBpbl91c2VyX3BhZ2VzKigpLCBhcyB3ZWxsIGFzIHNtb2tlIHRlc3RzIG9mXFxuMTI5OTpcXHRcXHQgIHRoZSBub24tX2Zhc3QgdmFyaWFudHMuXFxuMTMwMDpcXHRcXG4xMzAxOlxcdFxcdCAgVGhlcmUgaXMgYWxzbyBhIHN1Yi10ZXN0IHRoYXQgYWxsb3dzIHJ1bm5pbmcgZHVtcF9wYWdlKCkgb24gYW55XFxuMTMwMjpcXHRcXHQgIG9mIHVwIHRvIGVpZ2h0IHBhZ2VzIChzZWxlY3RlZCBieSBjb21tYW5kIGxpbmUgYXJncykgd2l0aGluIHRoZVxcbjEzMDM6XFx0XFx0ICByYW5nZSBvZiB1c2VyLXNwYWNlIGFkZHJlc3Nlcy4gVGhlc2UgcGFnZXMgYXJlIGVpdGhlciBwaW5uZWQgdmlhXFxuMTMwNDpcXHRcXHQgIHBpbl91c2VyX3BhZ2VzKigpLCBvciBwaW5uZWQgdmlhIGdldF91c2VyX3BhZ2VzKigpLCBhcyBzcGVjaWZpZWRcXG4xMzA1OlxcdFxcdCAgYnkgb3RoZXIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy5cXG4xMzA2OlxcdFxcbjEzMDc6XFx0XFx0ICBTZWUgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZ3VwX3Rlc3QuY1xcbjEzMDg6XFx0XFxuMTMwOTpcXHRjb21tZW50IFxcXCJHVVBfVEVTVCBuZWVkcyB0byBoYXZlIERFQlVHX0ZTIGVuYWJsZWRcXFwiXFxuMTMxMDpcXHRcXHRkZXBlbmRzIG9uICFHVVBfVEVTVCBcXHUwMDI2XFx1MDAyNiAhREVCVUdfRlNcXG4xMzExOlxcdFxcbjEzMTI6XFx0Y29uZmlnIEdVUF9HRVRfUFhYX0xPV19ISUdIXFxuMTMxMzpcXHRcXHRib29sXFxuMTMxNDpcXHRcXG4xMzE1OlxcdGNvbmZpZyBETUFQT09MX1RFU1RcXG4xMzE2OlxcdFxcdHRyaXN0YXRlIFxcXCJFbmFibGUgYSBtb2R1bGUgdG8gcnVuIHRpbWUgdGVzdHMgb24gZG1hX3Bvb2xcXFwiXFxuMTMxNzpcXHRcXHRkZXBlbmRzIG9uIEhBU19ETUFcXG4xMzE4OlxcdFxcdGhlbHBcXG4xMzE5OlxcdFxcdCAgUHJvdmlkZXMgYSB0ZXN0IG1vZHVsZSB0aGF0IHdpbGwgYWxsb2NhdGUgYW5kIGZyZWUgbWFueSBibG9ja3Mgb2ZcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6MzEuODUyMTcyNjlaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MDk3OTgzMDEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBjb21taXQgYW5kIGZpZ3VyZSBvdXQgd2hhdCdzIGNoYW5nZWQgd2l0aGluIGBtbS9ndXBfdGVzdC5jYC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRoZSBgX19ndXBfdGVzdF9pb2N0bGAgZnVuY3Rpb24uIEkgbmVlZCBhIHNvbGlkIHVuZGVyc3RhbmRpbmcgb2YgaG93IGl0IG9wZXJhdGVzIGFuZCB3aGVyZSB0aGUgbW9kaWZpY2F0aW9ucyB3ZXJlIG1hZGUuIEknbSBnb2luZyB0byBjYXJlZnVsbHkgZGlzc2VjdCBpdHMgZW50aXJlIHN0cnVjdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTQ3MCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6MzUuOTUwMTU3OTVaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODM3MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDUsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTA1OlxcdH1cXG4gMTA2OlxcdFxcbiAxMDc6XFx0c3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXFxuIDEwODpcXHRcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcXG4gMTA5OlxcdHtcXG4gMTEwOlxcdFxcdGt0aW1lX3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7XFxuIDExMTpcXHRcXHR1bnNpZ25lZCBsb25nIGksIG5yX3BhZ2VzLCBhZGRyLCBuZXh0O1xcbiAxMTI6XFx0XFx0bG9uZyBucjtcXG4gMTEzOlxcdFxcdHN0cnVjdCBwYWdlICoqcGFnZXM7XFxuIDExNDpcXHRcXHR1bnNpZ25lZCBsb25nIGVuZDtcXG4gMTE1OlxcdFxcdGludCByZXQgPSAwO1xcbiAxMTY6XFx0XFx0Ym9vbCBuZWVkc19tbWFwX2xvY2sgPVxcbiAxMTc6XFx0XFx0XFx0Y21kICE9IEdVUF9GQVNUX0JFTkNITUFSSyBcXHUwMDI2XFx1MDAyNiBjbWQgIT0gUElOX0ZBU1RfQkVOQ0hNQVJLO1xcbiAxMTg6XFx0XFxuIDExOTpcXHRcXHRpZiAoZ3VwLVxcdTAwM2VhZGRyIFxcdTAwM2UgVUxPTkdfTUFYIHx8IGd1cC1cXHUwMDNlc2l6ZSBcXHUwMDNlIFVMT05HX01BWClcXG4gMTIwOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAxMjE6XFx0XFx0aWYgKGNoZWNrX2FkZF9vdmVyZmxvdygodW5zaWduZWQgbG9uZylndXAtXFx1MDAzZWFkZHIsXFxuIDEyMjpcXHRcXHRcXHRcXHQgICAgICAgKHVuc2lnbmVkIGxvbmcpZ3VwLVxcdTAwM2VzaXplLCBcXHUwMDI2ZW5kKSlcXG4gMTIzOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAxMjQ6XFx0XFxuIDEyNTpcXHRcXHRucl9wYWdlcyA9IGd1cC1cXHUwMDNlc2l6ZSAvIFBBR0VfU0laRTtcXG4gMTI2OlxcdFxcdHBhZ2VzID0ga3ZjYWxsb2MobnJfcGFnZXMsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcXG4gMTI3OlxcdFxcdGlmICghcGFnZXMpXFxuIDEyODpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gMTI5OlxcdFxcbiAxMzA6XFx0XFx0aWYgKG5lZWRzX21tYXBfbG9jayBcXHUwMDI2XFx1MDAyNiBtbWFwX3JlYWRfbG9ja19raWxsYWJsZShjdXJyZW50LVxcdTAwM2VtbSkpIHtcXG4gMTMxOlxcdFxcdFxcdHJldCA9IC1FSU5UUjtcXG4gMTMyOlxcdFxcdFxcdGdvdG8gZnJlZV9wYWdlcztcXG4gMTMzOlxcdFxcdH1cXG4gMTM0OlxcdFxcbiAxMzU6XFx0XFx0aSA9IDA7XFxuIDEzNjpcXHRcXHRuciA9IGd1cC1cXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGw7XFxuIDEzNzpcXHRcXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDEzODpcXHRcXHRmb3IgKGFkZHIgPSBndXAtXFx1MDAzZWFkZHI7IGFkZHIgXFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XFxuIDEzOTpcXHRcXHRcXHRpZiAobnIgIT0gZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbClcXG4gMTQwOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNDE6XFx0XFxuIDE0MjpcXHRcXHRcXHRuZXh0ID0gYWRkciArIG5yICogUEFHRV9TSVpFO1xcbiAxNDM6XFx0XFx0XFx0aWYgKG5leHQgXFx1MDAzZSBlbmQpIHtcXG4gMTQ0OlxcdFxcdFxcdFxcdG5leHQgPSBlbmQ7XFxuIDE0NTpcXHRcXHRcXHRcXHRuciA9IChuZXh0IC0gYWRkcikgLyBQQUdFX1NJWkU7XFxuIDE0NjpcXHRcXHRcXHR9XFxuIDE0NzpcXHRcXG4gMTQ4OlxcdFxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDE0OTpcXHRcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMTUwOlxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE1MTpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4gMTUyOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNTM6XFx0XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMTU0OlxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyArIGkpO1xcbiAxNTU6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1NjpcXHRcXHRcXHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcXG4gMTU3OlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE1ODpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4gMTU5OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNjA6XFx0XFx0XFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcXG4gMTYxOlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyArIGkpO1xcbiAxNjI6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2MzpcXHRcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XFxuIDE2NDpcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLFxcbiAxNjU6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzIHwgRk9MTF9MT05HVEVSTSxcXG4gMTY2OlxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNjc6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2ODpcXHRcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAxNjk6XFx0XFx0XFx0XFx0aWYgKGd1cC1cXHUwMDNldGVzdF9mbGFncyBcXHUwMDI2IEdVUF9URVNUX0ZMQUdfRFVNUF9QQUdFU19VU0VfUElOKVxcbiAxNzA6XFx0XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE3MTpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4gMTcyOlxcdFxcdFxcdFxcdGVsc2VcXG4gMTczOlxcdFxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNzQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE3NTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTc2OlxcdFxcdFxcdGRlZmF1bHQ6XFxuIDE3NzpcXHRcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbiAxNzg6XFx0XFx0XFx0XFx0Z290byB1bmxvY2s7XFxuIDE3OTpcXHRcXHRcXHR9XFxuIDE4MDpcXHRcXG4gMTgxOlxcdFxcdFxcdGlmIChuciBcXHUwMDNjPSAwKVxcbiAxODI6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE4MzpcXHRcXHRcXHRpICs9IG5yO1xcbiAxODQ6XFx0XFx0fVxcbiAxODU6XFx0XFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMTg2OlxcdFxcbiAxODc6XFx0XFx0LyogU2hpZnRpbmcgdGhlIG1lYW5pbmcgb2YgbnJfcGFnZXM6IG5vdyBpdCBpcyBhY3R1YWwgbnVtYmVyIHBpbm5lZDogKi9cXG4gMTg4OlxcdFxcdG5yX3BhZ2VzID0gaTtcXG4gMTg5OlxcdFxcbiAxOTA6XFx0XFx0Z3VwLVxcdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcXG4gMTkxOlxcdFxcdGd1cC1cXHUwMDNlc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xcbiAxOTI6XFx0XFxuIDE5MzpcXHRcXHQvKlxcbiAxOTQ6XFx0XFx0ICogVGFrZSBhbiB1bi1iZW5jaG1hcmstdGltZWQgbW9tZW50IHRvIHZlcmlmeSBETUEgcGlubmVkXFxuIDE5NTpcXHRcXHQgKiBzdGF0ZTogcHJpbnQgYSB3YXJuaW5nIGlmIGFueSBub24tZG1hLXBpbm5lZCBwYWdlcyBhcmUgZm91bmQ6XFxuIDE5NjpcXHRcXHQgKi9cXG4gMTk3OlxcdFxcdHZlcmlmeV9kbWFfcGlubmVkKGNtZCwgcGFnZXMsIG5yX3BhZ2VzKTtcXG4gMTk4OlxcdFxcbiAxOTk6XFx0XFx0aWYgKGNtZCA9PSBEVU1QX1VTRVJfUEFHRVNfVEVTVClcXG4gMjAwOlxcdFxcdFxcdGR1bXBfcGFnZXNfdGVzdChndXAsIHBhZ2VzLCBucl9wYWdlcyk7XFxuIDIwMTpcXHRcXG4gMjAyOlxcdFxcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMjAzOlxcdFxcbiAyMDQ6XFx0XFx0cHV0X2JhY2tfcGFnZXMoY21kLCBwYWdlcywgbnJfcGFnZXMsIGd1cC1cXHUwMDNldGVzdF9mbGFncyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjAxOjM1Ljk1MDI0Mzc5WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjYyMzY1OTQwNTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEdVUCBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gQmVmb3JlIHRoZSBwYXRjaCwgdGhlIGNvZGUgd2FzIGl0ZXJhdGluZyB0aHJvdWdoIGEgbWVtb3J5IHJlZ2lvbi4gVGhlIGNvcmUgb2YgdGhlIHByb2JsZW0gc2VlbXMgdG8gbGllIHdpdGhpbiB0aGlzIGxvb3A6IGBmb3IgKGFkZHIgPSBndXAtXHUwMDNlYWRkcjsgYWRkciBcdTAwM2MgZW5kOyBhZGRyID0gbmV4dCkge2AuIFRoZSBjcml0aWNhbCB0aGluZyBoZXJlIGlzIGhvdyBgYWRkcmAgaXMgdXBkYXRlZC4gQXQgdGhlIGVuZCBvZiBlYWNoIGl0ZXJhdGlvbiwgYGFkZHJgIGlzIHNldCB0byBgbmV4dGAuIFRoaXMgaXMgd2hlcmUgdGhlIGlzc3VlIHN1cmZhY2VzLlxuXG5JZiB0aGUgbG9vcCB0ZXJtaW5hdGVzIHByZW1hdHVyZWx5IOKAkyBtYXliZSBiZWNhdXNlIGBucmAgKHRoZSBudW1iZXIgb2YgcGFnZXMgcGlubmVkIGluIHRoZSBjdXJyZW50IGNodW5rKSBiZWNhbWUgemVybyBvciBsZXNzLCBvciBiZWNhdXNlIGl0IGRpZG4ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHBhZ2VzIGZvciB0aGUgY3VycmVudCBjYWxsIOKAkyBgYWRkcmAgZW5kcyB1cCBwb2ludGluZyB0byB0aGUgKmJlZ2lubmluZyogb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIGNodW5rLCBub3QgdGhlIGVuZCBvZiB0aGUgcGlubmVkIHJlZ2lvbi4gU3BlY2lmaWNhbGx5LCBgYWRkcmAgaXMgb25seSB1cGRhdGVkIHRvIGBuZXh0YCB3aGVuIHRoZSBsb29wIGNvbnRpbnVlcy4gV2l0aGluIHRoZSBsb29wLCBgbmV4dGAgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBgYWRkcmAsIHRoZSBjdXJyZW50IGl0ZXJhdGlvbidzIGFkZHJlc3MsIGFuZCBgbnJgLiBJIHNlZSBub3c6IGBuZXh0ID0gYWRkciArIG5yICogUEFHRV9TSVpFO2AgYW5kIHRoZW4gYG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgLi4uKTtgLiBBbmQgdGhlbiB0aGUgY3J1Y2lhbCBjaGVjazogYGlmIChuciBcdTAwM2M9IDApIGJyZWFrO2AuXG5cblNvLCBgYWRkcmAgcmV0YWlucyB0aGUgKnN0YXJ0KiBhZGRyZXNzIG9mIHRoYXQgbGFzdCBjaHVuayBhdCB0aGUgZW5kIG9mIHRoZSBsb29wLCByaWdodD8gV2hlcmVhcywgYGlgIC0gdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZSBpcyB0cmFja2luZyB0aGUgYWN0dWFsIG51bWJlciBvZiBwYWdlcyBwaW5uZWQgc28gZmFyLiBUaGlzIG1lYW5zIGBhZGRyIC0gZ3VwLVx1MDAzZWFkZHJgIGlzIHRvdGFsbHkgd3JvbmcsIGFuZCB0aGF0J3MgdGhlIGNhbGN1bGF0ZWQgc2l6ZS4gVGhhdCdzIGEgY2xhc3NpYyBvZmYtYnktb25lIG9yIG9mZi1ieS1jaHVuayBpc3N1ZS4gYGd1cC1cdTAwM2VzaXplYCByZXR1cm5lZCB0byB1c2Vyc3BhY2Ugd2FzIGNhbGN1bGF0ZWQgdXNpbmcgdGhpcyBpbmNvcnJlY3QgYGFkZHIgLSBndXAtXHUwMDNlYWRkcmAsIGxlYWRpbmcgdG8gYSBzaXplIG1pc21hdGNoIHdpdGggdGhlIGFjdHVhbCBudW1iZXIgb2YgcGlubmVkIHBhZ2VzLiBUaGUga2V5IGlzIHRoYXQgYGd1cC1cdTAwM2VzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7YCBub3cgcHJvdmlkZXMgYW4gYWNjdXJhdGUgc2l6ZSBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBwaW5uZWQgcGFnZXMuXG5cbkFscmlnaHQsIGxldCdzIHN0ZXAgYmFjayBhbmQgc2VlIGhvdyB0aGlzIGlzIGFjdHVhbGx5IGludm9rZWQuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgaW50ZXJhY3Rpb25zIHdpdGggdGhpcyBjb2RlLiBMZXQgbWUgY2hlY2sgdGhlIGBndXBfdGVzdC5jYCBhbmQgaG93IGl0J3MgdXNlZC4gVGltZSB0byBsb29rIGludG8gdGhlIGlvY3RsIGhhbmRsZXIgaW4gYGd1cF90ZXN0LmNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTQ3LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzMxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6NDIuMTg2ODQwMDQ4WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc1NTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjg1LFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjg1OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAyODY6XFx0XFx0XFx0fVxcbiAyODc6XFx0XFx0XFx0ZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgKz0gY3VyX3BhZ2VzO1xcbiAyODg6XFx0XFx0XFx0cGFnZXMgKz0gY3VyX3BhZ2VzO1xcbiAyODk6XFx0XFx0fVxcbiAyOTA6XFx0XFxuIDI5MTpcXHRcXHRpZiAoIWZhc3QpXFxuIDI5MjpcXHRcXHRcXHRtbWFwX3JlYWRfdW5sb2NrKGN1cnJlbnQtXFx1MDAzZW1tKTtcXG4gMjkzOlxcdFxcdHJldHVybiByZXQ7XFxuIDI5NDpcXHR9XFxuIDI5NTpcXHRcXG4gMjk2OlxcdHN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXFxuIDI5NzpcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFyZylcXG4gMjk4OlxcdHtcXG4gMjk5OlxcdFxcdF9fdTY0IHVzZXJfYWRkcjtcXG4gMzAwOlxcdFxcdHVuc2lnbmVkIGxvbmcgaTtcXG4gMzAxOlxcdFxcbiAzMDI6XFx0XFx0aWYgKCFkYXRhLVxcdTAwM2Vsb25ndGVybV9wYWdlcylcXG4gMzAzOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDQ6XFx0XFxuIDMwNTpcXHRcXHRpZiAoY29weV9mcm9tX3VzZXIoXFx1MDAyNnVzZXJfYWRkciwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YodXNlcl9hZGRyKSkpXFxuIDMwNjpcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gMzA3OlxcdFxcbiAzMDg6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGRhdGEtXFx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzOyBpKyspIHtcXG4gMzA5OlxcdFxcdFxcdHZvaWQgKmFkZHIgPSBrbWFwX2xvY2FsX3BhZ2UoZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXNbaV0pO1xcbiAzMTA6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyByZXQ7XFxuIDMxMTpcXHRcXG4gMzEyOlxcdFxcdFxcdHJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyl1c2VyX2FkZHIsIGFkZHIsXFxuIDMxMzpcXHRcXHRcXHRcXHRcXHQgICBQQUdFX1NJWkUpO1xcbiAzMTQ6XFx0XFx0XFx0a3VubWFwX2xvY2FsKGFkZHIpO1xcbiAzMTU6XFx0XFx0XFx0aWYgKHJldClcXG4gMzE2OlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzMTc6XFx0XFx0XFx0dXNlcl9hZGRyICs9IFBBR0VfU0laRTtcXG4gMzE4OlxcdFxcdH1cXG4gMzE5OlxcdFxcdHJldHVybiAwO1xcbiAzMjA6XFx0fVxcbiAzMjE6XFx0XFxuIDMyMjpcXHRzdGF0aWMgbG9uZyBwaW5fbG9uZ3Rlcm1fdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXFxuIDMyMzpcXHRcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhcmcpXFxuIDMyNDpcXHR7XFxuIDMyNTpcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSA9IGZpbGVwLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDMyNjpcXHRcXHRpbnQgcmV0ID0gLUVJTlZBTDtcXG4gMzI3OlxcdFxcbiAzMjg6XFx0XFx0aWYgKG11dGV4X2xvY2tfa2lsbGFibGUoXFx1MDAyNmRhdGEtXFx1MDAzZWxvbmd0ZXJtX211dGV4KSlcXG4gMzI5OlxcdFxcdFxcdHJldHVybiAtRUlOVFI7XFxuIDMzMDpcXHRcXG4gMzMxOlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDMzMjpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzMzM6XFx0XFx0XFx0cmV0ID0gcGluX2xvbmd0ZXJtX3Rlc3Rfc3RhcnQoZGF0YSwgYXJnKTtcXG4gMzM0OlxcdFxcdFxcdGJyZWFrO1xcbiAzMzU6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzMzY6XFx0XFx0XFx0cGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChkYXRhKTtcXG4gMzM3OlxcdFxcdFxcdHJldCA9IDA7XFxuIDMzODpcXHRcXHRcXHRicmVhaztcXG4gMzM5OlxcdFxcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcXG4gMzQwOlxcdFxcdFxcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoZGF0YSwgYXJnKTtcXG4gMzQxOlxcdFxcdFxcdGJyZWFrO1xcbiAzNDI6XFx0XFx0fVxcbiAzNDM6XFx0XFxuIDM0NDpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmRhdGEtXFx1MDAzZWxvbmd0ZXJtX211dGV4KTtcXG4gMzQ1OlxcdFxcdHJldHVybiByZXQ7XFxuIDM0NjpcXHR9XFxuIDM0NzpcXHRcXG4gMzQ4OlxcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG4gMzQ5OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzNTA6XFx0e1xcbiAzNTE6XFx0XFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcXG4gMzUyOlxcdFxcdGludCByZXQ7XFxuIDM1MzpcXHRcXG4gMzU0OlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDM1NTpcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMzU2OlxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAzNTc6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAzNTg6XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMzU5OlxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuIDM2MDpcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAzNjE6XFx0XFx0XFx0YnJlYWs7XFxuIDM2MjpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzNjM6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzNjQ6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEOlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTo0Mi4xODY5MTcyMzhaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDgyNjI4NTU0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkFuYWx5emluZyB0aGUgR1VQIFRlc3QgSU9DVEwgYW5kIEluaXRpYWxpemF0aW9uKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbi4gSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiB0aGlzIGBndXBfdGVzdF9pb2N0bGAgZnVuY3Rpb24gYW5kIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4gSSdtIGdvaW5nIHRvIGxvb2sgdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgY29kZSwgc3BlY2lmaWNhbGx5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGF0IGZ1bmN0aW9uLCBhcyB3ZWxsIGFzIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHRoYXQgc2V0cyBldmVyeXRoaW5nIHVwLiBNeSBnb2FsIGlzIHRvIGdyYXNwIHRoZSBjb3JlIG1lY2hhbmljcyBhbmQgaWRlbnRpZnkgYW55IHBvdGVudGlhbCBnb3RjaGFzIG9yIGFyZWFzIHRoYXQgd2FycmFudCBjbG9zZXIgc2NydXRpbnkuIEknbGwgYmUgbG9va2luZyBmb3IgbWVtb3J5IGFjY2VzcyBwYXR0ZXJucywgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucywgZXJyb3IgaGFuZGxpbmcsIGFuZCBvZiBjb3Vyc2UsIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBHVVAgZnVuY3Rpb25hbGl0eS4gQmFzaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGNvbnRyb2wgZmxvdywgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBhbmQgYW55IHNwZWNpZmljIGludmFyaWFudHMgdGhhdCB0aGlzIGNvZGUgbWlnaHQgcmVseSBvbi4gVGhpcyBpcyB3aGVyZSB0aGUgZGV2aWwgaXMsIGluIHRoZSBkZXRhaWxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MDk1LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTo0Ny4wMTMyMDQ4NzZaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODEzMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzNjUsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNjU6XFx0XFx0XFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XFxuIDM2NjpcXHRcXHRkZWZhdWx0OlxcbiAzNjc6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDM2ODpcXHRcXHR9XFxuIDM2OTpcXHRcXG4gMzcwOlxcdFxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcXG4gMzcxOlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzI6XFx0XFxuIDM3MzpcXHRcXHRyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgXFx1MDAyNmd1cCk7XFxuIDM3NDpcXHRcXHRpZiAocmV0KVxcbiAzNzU6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMzc2OlxcdFxcbiAzNzc6XFx0XFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFxcdTAwMjZndXAsIHNpemVvZihndXApKSlcXG4gMzc4OlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzk6XFx0XFxuIDM4MDpcXHRcXHRyZXR1cm4gMDtcXG4gMzgxOlxcdH1cXG4gMzgyOlxcdFxcbiAzODM6XFx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbiAzODQ6XFx0e1xcbiAzODU6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XFxuIDM4NjpcXHRcXHRpbnQgcmV0O1xcbiAzODc6XFx0XFxuIDM4ODpcXHRcXHRkYXRhID0ga3phbGxvY19vYmooKmRhdGEpO1xcbiAzODk6XFx0XFx0aWYgKCFkYXRhKVxcbiAzOTA6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIDM5MTpcXHRcXG4gMzkyOlxcdFxcdHJldCA9IG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpO1xcbiAzOTM6XFx0XFx0aWYgKHJldCkge1xcbiAzOTQ6XFx0XFx0XFx0a2ZyZWUoZGF0YSk7XFxuIDM5NTpcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiAzOTY6XFx0XFx0fVxcbiAzOTc6XFx0XFxuIDM5ODpcXHRcXHRtdXRleF9pbml0KFxcdTAwMjZkYXRhLVxcdTAwM2Vsb25ndGVybV9tdXRleCk7XFxuIDM5OTpcXHRcXHRmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBkYXRhO1xcbiA0MDA6XFx0XFx0cmV0dXJuIDA7XFxuIDQwMTpcXHR9XFxuIDQwMjpcXHRcXG4gNDAzOlxcdHN0YXRpYyBpbnQgZ3VwX3Rlc3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4gNDA0OlxcdHtcXG4gNDA1OlxcdFxcdHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhID0gZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbiA0MDY6XFx0XFxuIDQwNzpcXHRcXHRwaW5fbG9uZ3Rlcm1fdGVzdF9zdG9wKGRhdGEpO1xcbiA0MDg6XFx0XFx0bXV0ZXhfZGVzdHJveShcXHUwMDI2ZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbXV0ZXgpO1xcbiA0MDk6XFx0XFx0a2ZyZWUoZGF0YSk7XFxuIDQxMDpcXHRcXHRmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBOVUxMO1xcbiA0MTE6XFx0XFxuIDQxMjpcXHRcXHRyZXR1cm4gMDtcXG4gNDEzOlxcdH1cXG4gNDE0OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTo0Ny4wMTMyODc1OTZaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjYwMTgyNTI2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhlIGBndXBfdGVzdC5jYCBjb2RlOlxuXG4qKkRpdmluZyBpbnRvIGd1cF90ZXN0LmM6IERlYnVnZnMgSW5pdGlhbGl6YXRpb24qKlxuXG5Pa2F5LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgd2l0aGluIGBndXBfdGVzdC5jYCwgc3BlY2lmaWNhbGx5IGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBgZGVidWdmc2AuIEkga25vdyB0aGUgYmFzaWNzLCB0aGUga2V5IGZ1bmN0aW9ucywgYW5kIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSwgc28gSSdtIHByaW1hcmlseSBmb2N1c2VkIG9uIHRoZSBudWFuY2VzLiBJJ20gbG9va2luZyBmb3Igd2hlcmUgYW5kIGhvdyB0aGUgZGVidWcgZmlsZXN5c3RlbSBlbnRyaWVzIHJlbGF0ZWQgdG8gdGhlIGBndXBfdGVzdGAgYXJlIGVzdGFibGlzaGVkLiBJJ20gZXhwZWN0aW5nIHRvIHNlZSBjYWxscyBsaWtlIGBkZWJ1Z2ZzX2NyZWF0ZV9maWxlYCwgYGRlYnVnZnNfY3JlYXRlX2RpcmAsIGV0Yy4sIG9yIHBlcmhhcHMgc29tZXRoaW5nIG1vcmUgc3BlY2lmaWMgaWYgdGhleSBhcmUgdXNpbmcgYSBjdXN0b20gZGVidWdmcyBmdW5jdGlvbmFsaXR5LiBUaGUga2V5IGhlcmUgd2lsbCBiZSB1bmRlcnN0YW5kaW5nIHdoYXQgYXNwZWN0cyBvZiB0aGUgdGVzdCBhcmUgZXhwb3NlZCBmb3IgaW5zcGVjdGlvbiBvciBjb250cm9sIHRocm91Z2ggdGhlIGRlYnVnIGludGVyZmFjZS4gSSdsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBhbmQgYW55IHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGxpbmtlZCB0byB0aGUgZGVidWdmcyBlbnRyaWVzLiBJcyB0aGlzIGp1c3QgZm9yIHJlcG9ydGluZywgb3IgYXJlIHRoZXJlIHdyaXRhYmxlIGVudHJpZXMgdGhhdCBhbGxvdyBmb3IgZHluYW1pYyB0ZXN0aW5nIHBhcmFtZXRlcnM/IFVuZGVyc3RhbmRpbmcgdGhpcyBpcyBjcml0aWNhbCBmb3IgYXNzZXNzaW5nIHRoZSB0ZXN0J3MgZmxleGliaWxpdHkgYW5kIHBvdGVudGlhbCBmb3IgZXh0ZXJuYWwgbWFuaXB1bGF0aW9uLCB3aGljaCBJJ2xsIGJlIGxvb2tpbmcgaW50byBhcyBJIGdldCBkZWVwZXIuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk5ODgsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjAxOjQ5LjYxNTExNTE5OFoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2ODIxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9ndXBfdGVzdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQxNSxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQxNTpcXHRzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBndXBfdGVzdF9mb3BzID0ge1xcbiA0MTY6XFx0XFx0Lm9wZW4gPSBndXBfdGVzdF9vcGVuLFxcbiA0MTc6XFx0XFx0LnVubG9ja2VkX2lvY3RsID0gZ3VwX3Rlc3RfaW9jdGwsXFxuIDQxODpcXHRcXHQuY29tcGF0X2lvY3RsID0gY29tcGF0X3B0cl9pb2N0bCxcXG4gNDE5OlxcdFxcdC5yZWxlYXNlID0gZ3VwX3Rlc3RfcmVsZWFzZSxcXG4gNDIwOlxcdH07XFxuIDQyMTpcXHRcXG4gNDIyOlxcdHN0YXRpYyBpbnQgX19pbml0IGd1cF90ZXN0X2luaXQodm9pZClcXG4gNDIzOlxcdHtcXG4gNDI0OlxcdFxcdGRlYnVnZnNfY3JlYXRlX2ZpbGVfdW5zYWZlKFxcXCJndXBfdGVzdFxcXCIsIDA2MDAsIE5VTEwsIE5VTEwsXFxuIDQyNTpcXHRcXHRcXHRcXHRcXHQgICBcXHUwMDI2Z3VwX3Rlc3RfZm9wcyk7XFxuIDQyNjpcXHRcXG4gNDI3OlxcdFxcdHJldHVybiAwO1xcbiA0Mjg6XFx0fVxcbiA0Mjk6XFx0XFxuIDQzMDpcXHRsYXRlX2luaXRjYWxsKGd1cF90ZXN0X2luaXQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTo0OS42MTUxODQ4MjhaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTI0MDU0MzkyNjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBBbmFseXNpczogZ3VwX3Rlc3QgaW9jdGwgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoZSBjaGFuZ2UgaXMgaW4gYG1tL2d1cF90ZXN0LmNgLCBzcGVjaWZpY2FsbHkgaW4gYF9fZ3VwX3Rlc3RfaW9jdGxgLiBUaGV5J3ZlIHN3aXRjaGVkIHRoZSBjYWxjdWxhdGlvbiBvZiBgZ3VwLVx1MDAzZXNpemVgIGZyb20gYGFkZHIgLSBndXAtXHUwMDNlYWRkcmAgdG8gYG5yX3BhZ2VzICogUEFHRV9TSVpFYC4gIFRoZSBtYWluIHF1ZXN0aW9uIGlzLCBkb2VzIHRoaXMgd2FycmFudCBmdXp6aW5nP1xuXG5GaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQuIGBndXBfdGVzdGAgaXMgYSBkZWJ1Z2ZzIGludGVyZmFjZSAoYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCkgZGVzaWduZWQgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IChtbSkgc2VsZnRlc3RzLiBBbHJpZ2h0LCB0aGlzIGlzIGEgZGVkaWNhdGVkIHRlc3RpbmcgYXJlYS4gTm93LCBkb2VzIHRoZSBjaGFuZ2UgaW50cm9kdWNlIGFueSAqZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50KiBrZXJuZWwgbG9naWMgdGhhdCdzIHdvcnRoIGZ1enppbmc/XG5cbkhvbGQgb24uIEJlZm9yZSBqdW1waW5nIHRvIGNvbmNsdXNpb25zLCBsZXQncyBjbGFyaWZ5IHRoZSBjaGFuZ2UncyAqcHJlY2lzZSogbmF0dXJlLiBPa2F5LCBpdCdzIGZpeGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGBndXAtXHUwMDNlc2l6ZWAgd2l0aGluIGEgZGVidWdmcyB0ZXN0IGlvY3RsLCBhIGJlbmNobWFya2luZyBoZWxwZXIuXG5cbk5vdywgc2hvdWxkIHdlIGZ1enogaXQ/IEkgbmVlZCB0byB1c2UgdGhlIGNyaXRlcmlhOiBkb2VzIHRoZSBwYXRjaDpcbiogICBNb2RpZnkgRG9jdW1lbnRhdGlvbiwgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cz8gTm8uXG4qICAgTWFrZSBwdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBsaWtlIGxvZ2dpbmcgb3IgdHJhY2Vwb2ludHM/IE5vLlxuKiAgIENoYW5nZSBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3Mgd2l0aG91dCBhbHRlcmluZyBleGVjdXRpb24gZmxvdz8gTm9wZS5cbiogICBUb3VjaCB1bnJlYWNoYWJsZSBjb2RlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyAoR0NFLCBRRU1VKT8gTm8uXG4qICAgQWZmZWN0IHZlbmRvci1zcGVjaWZpYyBkcml2ZXJzIChQQ0llLCBTbWFydE5JQywgR1BVKT8gTm8uXG4qICAgTW9kaWZ5IGAucmVtb3ZlYCwgYC5zaHV0ZG93bmAsIG9yIGBwY2lfdW5yZWdpc3Rlcl9kcml2ZXJgIGNhbGxiYWNrcz8gTm8uXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgKnRoZW4qIGl0J3Mgd29ydGggZnV6emluZywgYWZ0ZXIgY2hlY2tpbmcgd2l0aCBjb2RlIHNlYXJjaCB0b29scyB0byB2ZXJpZnkgaXQncyBleGVjdXRhYmxlLlxuXG5JcyBgZ3VwX3Rlc3RgIGV2ZW4gcmVhY2hhYmxlPyBZZXMsIGAvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdGAgaXMgY3JlYXRlZCBhdCBgbGF0ZV9pbml0Y2FsbGAgd2hlbiBib3RoIGBDT05GSUdfR1VQX1RFU1Q9eWAgYW5kIGBDT05GSUdfREVCVUdfRlM9eWAgYXJlIGVuYWJsZWQuIEdvb2QsIGFuZCBkZWJ1Z2ZzIGlzIHN0YW5kYXJkIGluIGZ1enppbmcga2VybmVscywgbGlrZSBTeXprYWxsZXIgdGVzdHMuIFNvLCBpdCdzIHJlYWNoYWJsZSBpbiBRRU1VL0dDRS5cblxuRG9lcyBpdCBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMgb3IgYSBkcml2ZXI/IFRoZSBwYXRjaCBjaGFuZ2VzIGhvdyBgZ3VwLVx1MDAzZXNpemVgIGlzIGNhbGN1bGF0ZWQgaW5zaWRlIGBfX2d1cF90ZXN0X2lvY3RsYDogaXQncyBub3cgYG5yX3BhZ2VzICogUEFHRV9TSVpFYCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBjYWxjdWxhdGlvbi5cblxuRG9lcyB0aGlzIGNoYW5nZSBleGVjdXRpb24gZmxvdyBvciBhbHRlciB0aGUga2VybmVsIHN0YXRlPyBgZ3VwYCBpcyBhIGxvY2FsIHZhcmlhYmxlIGluIGBndXBfdGVzdF9pb2N0bGAgYW5kIGRhdGEgaXMgY29waWVkIHRvL2Zyb20gdXNlciBzcGFjZTpcbmBgYGNcbmlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZndXAsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGd1cCkpKVxuICAgIHJldHVybiAtRUZBVUxUO1xucmV0ID0gX19ndXBfdGVzdF9pb2N0bChjbWQsIFx1MDAyNmd1cCk7XG5pZiAocmV0KVxuICAgIHJldHVybiByZXQ7XG5pZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgXHUwMDI2Z3VwLCBzaXplb2YoZ3VwKSkpXG4gICAgcmV0dXJuIC1FRkFVTFQ7XG5gYGBcbkluc2lkZSBgX19ndXBfdGVzdF9pb2N0bGAsIHRoZSBudW1iZXIgb2YgcGFnZXMgYXJlIHBpbm5lZCBieSB0aGUgdGVzdCBjb2RlLCBhbmQgdGhlbiBgZ3VwLVx1MDAzZXNpemVgIGlzIHNldC5cbmBgYGNcbm5yX3BhZ2VzID0gaTtcbmd1cC1cdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcbmd1cC1cdTAwM2VzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7XG52ZXJpZnlfZG1hX3Bpbm5lZChjbWQsIHBhZ2VzLCBucl9wYWdlcyk7XG5pZiAoY21kID09IERVTVBfVVNFUl9QQUdFU19URVNUKVxuXHRkdW1wX3BhZ2VzX3Rlc3QoZ3VwLCBwYWdlcywgbnJfcGFnZXMpO1xuc3RhcnRfdGltZSA9IGt0aW1lX2dldCgpO1xucHV0X2JhY2tfcGFnZXMoY21kLCBwYWdlcywgbnJfcGFnZXMsIGd1cC1cdTAwM2V0ZXN0X2ZsYWdzKTtcbmVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XG5ndXAtXHUwMDNlcHV0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XG5gYGBcbk15IG5leHQgc3RlcCBpcyB0byBzZWUgaWYgYGd1cC1cdTAwM2VzaXplYCBpcyAqdXNlZCogYW55d2hlcmUgYWZ0ZXIgbGluZSAxOTEgaW4gYF9fZ3VwX3Rlc3RfaW9jdGxgLiBJdCBpcyAqbm90KiB1c2VkIGluIGB2ZXJpZnlfZG1hX3Bpbm5lZGAsIGFuZCBub3csIEkgbmVlZCB0byBjaGVjayB3aGVyZSBpdCAqaXMqIHVzZWQ6IGluIGBkdW1wX3BhZ2VzX3Rlc3RgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDU1MywiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwODgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMjowMi4wMjA2MjU3NDVaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEyMjkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogNzUsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgNzU6XFx0XFxuICA3NjpcXHRzdGF0aWMgdm9pZCBkdW1wX3BhZ2VzX3Rlc3Qoc3RydWN0IGd1cF90ZXN0ICpndXAsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxuICA3NzpcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4gIDc4OlxcdHtcXG4gIDc5OlxcdFxcdHVuc2lnbmVkIGludCBpbmRleF90b19kdW1wO1xcbiAgODA6XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuICA4MTpcXHRcXG4gIDgyOlxcdFxcdC8qXFxuICA4MzpcXHRcXHQgKiBaZXJvIG91dCBhbnkgdXNlci1zdXBwbGllZCBwYWdlIGluZGV4IHRoYXQgaXMgb3V0IG9mIHJhbmdlLiBSZW1lbWJlcjpcXG4gIDg0OlxcdFxcdCAqIC53aGljaF9wYWdlc1tdIGNvbnRhaW5zIGEgMS1iYXNlZCBzZXQgb2YgcGFnZSBpbmRpY2VzLlxcbiAgODU6XFx0XFx0ICovXFxuICA4NjpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVA7IGkrKykge1xcbiAgODc6XFx0XFx0XFx0aWYgKGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0gXFx1MDAzZSBucl9wYWdlcykge1xcbiAgODg6XFx0XFx0XFx0XFx0cHJfd2FybihcXFwiWkVST0lORyBkdWUgdG8gb3V0IG9mIHJhbmdlOiAud2hpY2hfcGFnZXNbJXVdOiAldVxcXFxuXFxcIixcXG4gIDg5OlxcdFxcdFxcdFxcdFxcdGksIGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0pO1xcbiAgOTA6XFx0XFx0XFx0XFx0Z3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXSA9IDA7XFxuICA5MTpcXHRcXHRcXHR9XFxuICA5MjpcXHRcXHR9XFxuICA5MzpcXHRcXG4gIDk0OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSsrKSB7XFxuICA5NTpcXHRcXHRcXHRpbmRleF90b19kdW1wID0gZ3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXTtcXG4gIDk2OlxcdFxcbiAgOTc6XFx0XFx0XFx0aWYgKGluZGV4X3RvX2R1bXApIHtcXG4gIDk4OlxcdFxcdFxcdFxcdGluZGV4X3RvX2R1bXAtLTsgLy8gRGVjb2RlIGZyb20gMS1iYXNlZCwgdG8gMC1iYXNlZFxcbiAgOTk6XFx0XFx0XFx0XFx0cHJfaW5mbyhcXFwiLS0tLSBwYWdlICMldSwgc3RhcnRpbmcgZnJvbSB1c2VyIHZpcnQgYWRkcjogMHglbGx4XFxcXG5cXFwiLFxcbiAxMDA6XFx0XFx0XFx0XFx0XFx0aW5kZXhfdG9fZHVtcCwgZ3VwLVxcdTAwM2VhZGRyKTtcXG4gMTAxOlxcdFxcdFxcdFxcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcXG4gMTAyOlxcdFxcdFxcdFxcdFxcdCAgXFxcImd1cF90ZXN0OiBkdW1wX3BhZ2VzKCkgdGVzdFxcXCIpO1xcbiAxMDM6XFx0XFx0XFx0fVxcbiAxMDQ6XFx0XFx0fVxcbiAxMDU6XFx0fVxcbiAxMDY6XFx0XFxuIDEwNzpcXHRzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG4gMTA4OlxcdFxcdFxcdHN0cnVjdCBndXBfdGVzdCAqZ3VwKVxcbiAxMDk6XFx0e1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMjowMi4wMjA3NDc2MTVaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTIwMjUxNTM3Mzk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgc3VtbWFyeSwgY29uc2lkZXJpbmcgbXkgZXhwZXJ0aXNlOlxuXG4qKkV4YW1pbmluZyB0aGUgTWVtb3J5IFJlZ2lvbiBTaXplIGluIGBtbS9ndXBfdGVzdC5jYCoqXG5cbkFscmlnaHQsIEknbSBkaWdnaW5nIGludG8gdGhpcyBjb2RlLCBzcGVjaWZpY2FsbHkgbG9va2luZyBhdCBgZ3VwLVx1MDAzZXNpemVgLiBJdCdzIHBlY3VsaWFyOyBJJ20gbm90aWNpbmcgdGhhdCB0aGUgdmFsdWUgcmV0cmlldmVkIGJ5IGBndXAtXHUwMDNlc2l6ZWAgZG9lc24ndCBzZWVtIHRvIGJlIHVzZWQgaW50ZXJuYWxseSB3aXRoaW4gdGhlIGtlcm5lbCBjb2RlIGFmdGVyIGl0J3MgaW5pdGlhbGx5IGFzc2lnbmVkLiBUaGUgb25seSBhcHBhcmVudCB1c2UgaXMgaW4gdGhpcyBgY29weV90b191c2VyYCBjYWxsOiBgY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgXHUwMDI2Z3VwLCBzaXplb2YoZ3VwKSlgLlxuXG5UaGlzIHJhaXNlcyBhIHJlZCBmbGFnLiBJZiBgZ3VwLVx1MDAzZXNpemVgIGlzbid0IHN1YnNlcXVlbnRseSB1c2VkIGZvciBpbnRlcm5hbCBjYWxjdWxhdGlvbnMsIGJvdW5kcyBjaGVja3MsIG9yIGFsbG9jYXRpb24gZGVjaXNpb25zICp3aXRoaW4qIHRoZSBrZXJuZWwgaXRzZWxmLCB0aGUgb25seSBwdXJwb3NlIEkgY2FuIGRpc2Nlcm4gZnJvbSB0aGUgY29kZSBwcm92aWRlZCBpcyBmb3IgcGFzc2luZyB0aGUgc2l6ZSBpbmZvcm1hdGlvbiBiYWNrIHRvIHVzZXIgc3BhY2UuIEl0IG1ha2VzIG1lIHdvbmRlciBhYm91dCB0aGUgaW50ZW50IGhlcmUuIElzIGl0IHNvbGVseSBmb3IgaW5mb3JtYXRpb24sIG9yIGFtIEkgbWlzc2luZyBzb21ldGhpbmc/XG5cbkxldCBtZSBkb3VibGUtY2hlY2suIEknbSBnb2luZyB0byBxdWlja2x5IHNjYW4gdGhlIHJlc3Qgb2YgYG1tL2d1cF90ZXN0LmNgIHRvIGNvbmZpcm0gdGhlcmUgaXNuJ3QgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgY29kZSB1c2luZyBgZ3VwLVx1MDAzZXNpemVgIHRoYXQgSSdtIG92ZXJsb29raW5nLiBUaGVyZSBtaWdodCBiZSBhIHN1YnRsZSBjaGVjayBJIG1pc3NlZC4gVGhpcyBpcyBzb21ldGhpbmcgSSdkIHdhbnQgdG8gYmUgYWJzb2x1dGVseSBzdXJlIG9mLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzE3MiwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MDIuMjcyMjg4MTY5WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDcwMDIwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzaXplXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cF90ZXN0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vZ3VwX3Rlc3QuYz0xMDc9c3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTExOC1cXG5tbS9ndXBfdGVzdC5jOjExOTpcXHRpZiAoZ3VwLVxcdTAwM2VhZGRyIFxcdTAwM2UgVUxPTkdfTUFYIHx8IGd1cC1cXHUwMDNlc2l6ZSBcXHUwMDNlIFVMT05HX01BWClcXG5tbS9ndXBfdGVzdC5jLTEyMC1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5tbS9ndXBfdGVzdC5jLTEyMS1cXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KCh1bnNpZ25lZCBsb25nKWd1cC1cXHUwMDNlYWRkcixcXG5tbS9ndXBfdGVzdC5jOjEyMjpcXHRcXHRcXHQgICAgICAgKHVuc2lnbmVkIGxvbmcpZ3VwLVxcdTAwM2VzaXplLCBcXHUwMDI2ZW5kKSlcXG5tbS9ndXBfdGVzdC5jLTEyMy1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5tbS9ndXBfdGVzdC5jLTEyNC1cXG5tbS9ndXBfdGVzdC5jOjEyNTpcXHRucl9wYWdlcyA9IGd1cC1cXHUwMDNlc2l6ZSAvIFBBR0VfU0laRTtcXG5tbS9ndXBfdGVzdC5jOjEyNjpcXHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XFxubW0vZ3VwX3Rlc3QuYy0xMjctXFx0aWYgKCFwYWdlcylcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTkwLVxcdGd1cC1cXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XFxubW0vZ3VwX3Rlc3QuYzoxOTE6XFx0Z3VwLVxcdTAwM2VzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7XFxubW0vZ3VwX3Rlc3QuYy0xOTItXFxuLS1cXG5tbS9ndXBfdGVzdC5jPTIyOT1zdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdGFydChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMjQxLVxcbm1tL2d1cF90ZXN0LmM6MjQyOlxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2YXJncywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoYXJncykpKVxcbm1tL2d1cF90ZXN0LmMtMjQzLVxcdFxcdHJldHVybiAtRUZBVUxUO1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy0yNDctXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxubW0vZ3VwX3Rlc3QuYzoyNDg6XFx0aWYgKCFJU19BTElHTkVEKGFyZ3MuYWRkciB8IGFyZ3Muc2l6ZSwgUEFHRV9TSVpFKSlcXG5tbS9ndXBfdGVzdC5jLTI0OS1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5tbS9ndXBfdGVzdC5jOjI1MDpcXHRpZiAoYXJncy5zaXplIFxcdTAwM2UgTE9OR19NQVgpXFxubW0vZ3VwX3Rlc3QuYy0yNTEtXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxubW0vZ3VwX3Rlc3QuYzoyNTI6XFx0bnJfcGFnZXMgPSBhcmdzLnNpemUgLyBQQUdFX1NJWkU7XFxubW0vZ3VwX3Rlc3QuYy0yNTMtXFx0aWYgKCFucl9wYWdlcylcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMjU1LVxcbm1tL2d1cF90ZXN0LmM6MjU2OlxcdHBhZ2VzID0ga3ZjYWxsb2MobnJfcGFnZXMsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcXG5tbS9ndXBfdGVzdC5jLTI1Ny1cXHRpZiAoIXBhZ2VzKVxcbi0tXFxubW0vZ3VwX3Rlc3QuYz0yOTY9c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMzA0LVxcbm1tL2d1cF90ZXN0LmM6MzA1OlxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2dXNlcl9hZGRyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih1c2VyX2FkZHIpKSlcXG5tbS9ndXBfdGVzdC5jLTMwNi1cXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4tLVxcbm1tL2d1cF90ZXN0LmM9MzQ4PXN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMzY5LVxcbm1tL2d1cF90ZXN0LmM6MzcwOlxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcXG5tbS9ndXBfdGVzdC5jLTM3MS1cXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMzc2LVxcbm1tL2d1cF90ZXN0LmM6Mzc3OlxcdGlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBcXHUwMDI2Z3VwLCBzaXplb2YoZ3VwKSkpXFxubW0vZ3VwX3Rlc3QuYy0zNzgtXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjA0OjAyLjMxNjk5MjE0OVoiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3NDk4NTkzNjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKldvcnRoRnV6emluZyBFdmFsdWF0aW9uOiBBIERlZXAgRGl2ZSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgcmV2b2x2ZXMgYXJvdW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBgZ3VwLVx1MDAzZXNpemVgIG1vZGlmaWNhdGlvbiB3aXRoaW4gYF9fZ3VwX3Rlc3RfaW9jdGxgLiBUaGUgY29kZSBjbGVhcmx5IHVwZGF0ZXMgYGd1cC1cdTAwM2VzaXplYCBhZnRlciB0aGUgYGd1cF90ZXN0YCBwcm9jZXNzLiBUaGUgdXNlciBwcm92aWRlcyBhbiBpbml0aWFsIHNpemUsIHRoZSBrZXJuZWwgcGlucyBwYWdlcywgYW5kIHRoZW4gdGhlIHJldHVybmVkIGBndXAtXHUwMDNlc2l6ZWAgcmVmbGVjdHMgdGhlICphY3R1YWwqIG51bWJlciBvZiBwaW5uZWQgcGFnZXMuIFRoaXMgdmFsdWUgaXMgdGhlbiBjb3BpZWQgYmFjayB0byB1c2Vyc3BhY2UgdmlhIGBjb3B5X3RvX3VzZXJgLiBTbywgdGhlIHByaW1hcnkgY2hhbmdlIHNlZW1zIHRvIGJlIGluIHRoZSByZXR1cm5lZCB2YWx1ZS5cblxuTm93LCB0aGUgY3J1Y2lhbCBxdWVzdGlvbjogSXMgdGhpcyBjaGFuZ2UgKldvcnRoRnV6emluZyo/IE15IGV4cGVydCBpbnR1aXRpb24ga2lja3MgaW4uIE15IG1pbmQgaW1tZWRpYXRlbHkgc3RhcnRzIHRvIHdlaWdoIHRoZSBmYWN0b3JzIGFuZCBldmFsdWF0ZSB0aGUgaW5zdHJ1Y3Rpb25zLiBJIG5lZWQgdG8gYmUgbWV0aG9kaWNhbC4gVGhlIGluc3RydWN0aW9ucyBzdGF0ZSBJIGNhbm5vdCByZWx5IG9uIGludGVybmFsIGtub3dsZWRnZS4gSSBoYXZlIHRvIHVzZSBjb2RlIGFjY2VzcyB0b29scy5cblxuRmlyc3QsIEkgaGF2ZSB0byBlbnN1cmUgdGhlIHBhdGNoIG1vZGlmaWVzICpyZWFjaGFibGUqIGNvZGUuIFRoZSBwcm92aWRlZCBpbnN0cnVjdGlvbnMgZ2l2ZSBhIGNsZWFyIGNoZWNrbGlzdC4gSSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGlzIGNoYW5nZSBtZWV0cyBhbnkgb2YgdGhlIGV4Y2x1c2lvbiBjcml0ZXJpYS4gU3BlY2lmaWNhbGx5LCBhbSBJIGNoYW5naW5nOlxuLSBEb2N1bWVudGF0aW9uXG4tIEtjb25maWcgZmlsZXNcbi0gQ29tbWVudHNcbi0gRGVjb3JhdGl2ZSBjaGFuZ2VzIChsb2dnaW5nKVxuLSBOdW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkb24ndCBmdW5jdGlvbmFsbHkgYWx0ZXIgZmxvd1xuLSBJbXBvc3NpYmxlLXRvLXJlYWNoIGNvZGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzXG4tIFZlbmRvci1zcGVjaWZpYyBkcml2ZXJzIHRoYXQgbmVlZCBkZWRpY2F0ZWQgaGFyZHdhcmVcbi0gRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyBvbmx5IHVzZWQgZHVyaW5nIGhvdC11bnBsdWdcblxuVGhlIGNydWNpYWwgcG9pbnQgaXM6ICpEb2VzIHRoaXMgbW9kaWZ5IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcz8qXG5cblRoZW4gbXkgbWluZCBzdGFydHMgdG8gZm9jdXMgb24gdGhlIGluc3RydWN0aW9ucy4gVGhlIGNvZGUgbW9kaWZpZXMgYGd1cC1cdTAwM2VzaXplYC4gVGhlIGZ1bmN0aW9uIGBfX2d1cF90ZXN0X2lvY3RsYCBpcyBjYWxsZWQgZnJvbSBgZ3VwX3Rlc3RfaW9jdGxgLCB3aGljaCBpcyBjYWxsZWQgZnJvbSBgZ3VwX3Rlc3Rfb3BlbmAuIFRoZSBtb2R1bGUgYGd1cF90ZXN0LmNgIGlzIGNvbXBpbGVkIHdoZW4gYENPTkZJR19HVVBfVEVTVD15YCB3aGljaCBkZXBlbmRzIG9uIGBDT05GSUdfREVCVUdfRlM9eWAuIEluIFFFTVUvR0NFLCBkZWJ1Z2ZzIGlzIGVuYWJsZWQgYW5kIGlvY3RscyBjYW4gYmUgc2VudCB0byBpdC4gU28sIGl0IGlzIHJlYWNoYWJsZS5cblxuVGhlIHF1ZXN0aW9uIHRoZW4gYmVjb21lczogSXMgdGhpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlPyBJdCAqZG9lcyogYWx0ZXIgYSB2YWx1ZSByZXR1cm5lZCB0byB1c2Vyc3BhY2UgYmFzZWQgb24ga2VybmVsIGJlaGF2aW9yLiBUaGlzIGlzIGNydWNpYWwgYmVjYXVzZSBpdCBhZmZlY3RzIHRoZSBkYXRhIHVzZXJzcGFjZSByZWNlaXZlcyBmcm9tIGEga2VybmVsIGZ1bmN0aW9uLiBJdCBpcyBhIHZhbHVlIHRoYXQgY2FuIGJlIHJlYWQuXG5cbkkgbmVlZCB0byBxdWlja2x5IGFzc2VzcyB0aGlzLCBidXQgYWxzbyBjaGVjayBmb3Igb3RoZXIgcmVxdWlyZW1lbnRzLiBUaGUgaW5zdHJ1Y3Rpb25zIGluZGljYXRlIHRoYXQgSSAqY2Fubm90KiB1c2Ugc3l6a2FsbGVyLXNwZWNpZmljIHN5bnRheC4gSSBhbSBub3QgYWxsb3dlZCB0byB1c2UgcHNldWRvLXN5c2NhbGxzLiBJIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHRvb2xzIGV4aXN0IGluIG91ciBkZWNsYXJhdGlvbjpcbi0gYGdyZXBwZXJgXG4tIGBjb2Rlc2VhcmNoLWRpci1pbmRleGBcbi0gYHJlYWQtZmlsZWBcbi0gYHNldC1yZXN1bHRzYFxuTm8gc3l6IHRvb2xzLiBJIG11c3QgcmVseSBvbiB0aGVzZSBpbnN0ZWFkLiBJIHN0aWxsIG5lZWQgdG8gdmVyaWZ5IHdoZXRoZXIgYGd1cF90ZXN0YCBpcyByZWFjaGFibGUgaW4gc3l6a2FsbGVyIG9yIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4gSSBhbHJlYWR5IGtub3cgdGhhdCBkZWJ1Z2ZzIGlzIGVuYWJsZWQgYW5kIGAvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdGAgY2FuIGJlIGFjY2Vzc2VkIGluIFFFTVUvR0NFLiBUaGVyZWZvcmUsIEkgY2FuIHNhZmVseSBhc3N1bWUgdGhhdCB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQuXG5cbkJhc2VkIG9uIHRoaXMgYW5hbHlzaXMsIHRoZSBtb2RpZmljYXRpb24gdG8gYGd1cC1cdTAwM2VzaXplYCBhZmZlY3RzIHRoZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gdXNlcnNwYWNlIGFmdGVyIHRoZSBgZ3VwX3Rlc3RgIG9wZXJhdGlvbi4gVGhpcyBpcyByZWFjaGFibGUsIGV4ZWN1dGFibGUgY29kZSBpbiB0aGUga2VybmVsLiBUaGVyZWZvcmU6IEkgYmVsaWV2ZSB0aGlzIGlzIGBXb3J0aEZ1enppbmc9dHJ1ZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0NTc3LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTA4NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDowOS44MTU1ODkwMThaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzEzMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuICAgMjpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxuICAgMzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbW0uaFxcdTAwM2VcXG4gICA0OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICAgNTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvdWFjY2Vzcy5oXFx1MDAzZVxcbiAgIDY6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L2t0aW1lLmhcXHUwMDNlXFxuICAgNzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvZGVidWdmcy5oXFx1MDAzZVxcbiAgIDg6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L2hpZ2htZW0uaFxcdTAwM2VcXG4gICA5OlxcdCNpbmNsdWRlIFxcXCJndXBfdGVzdC5oXFxcIlxcbiAgMTA6XFx0XFxuICAxMTpcXHRzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSB7XFxuICAxMjpcXHRcXHRzdHJ1Y3QgbXV0ZXggbG9uZ3Rlcm1fbXV0ZXg7XFxuICAxMzpcXHRcXHRzdHJ1Y3QgcGFnZSAqKmxvbmd0ZXJtX3BhZ2VzO1xcbiAgMTQ6XFx0XFx0dW5zaWduZWQgbG9uZyBsb25ndGVybV9ucl9wYWdlcztcXG4gIDE1OlxcdH07XFxuICAxNjpcXHRcXG4gIDE3OlxcdHN0YXRpYyB2b2lkIHB1dF9iYWNrX3BhZ2VzKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxuICAxODpcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCB1bnNpZ25lZCBpbnQgZ3VwX3Rlc3RfZmxhZ3MpXFxuICAxOTpcXHR7XFxuICAyMDpcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuICAyMTpcXHRcXG4gIDIyOlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuICAyMzpcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gIDI0OlxcdFxcdGNhc2UgR1VQX0JBU0lDX1RFU1Q6XFxuICAyNTpcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKylcXG4gIDI2OlxcdFxcdFxcdFxcdHB1dF9wYWdlKHBhZ2VzW2ldKTtcXG4gIDI3OlxcdFxcdFxcdGJyZWFrO1xcbiAgMjg6XFx0XFxuICAyOTpcXHRcXHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcXG4gIDMwOlxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuICAzMTpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XFxuICAzMjpcXHRcXHRcXHR1bnBpbl91c2VyX3BhZ2VzKHBhZ2VzLCBucl9wYWdlcyk7XFxuICAzMzpcXHRcXHRcXHRicmVhaztcXG4gIDM0OlxcdFxcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XFxuICAzNTpcXHRcXHRcXHRpZiAoZ3VwX3Rlc3RfZmxhZ3MgXFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTikge1xcbiAgMzY6XFx0XFx0XFx0XFx0dW5waW5fdXNlcl9wYWdlcyhwYWdlcywgbnJfcGFnZXMpO1xcbiAgMzc6XFx0XFx0XFx0fSBlbHNlIHtcXG4gIDM4OlxcdFxcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKVxcbiAgMzk6XFx0XFx0XFx0XFx0XFx0cHV0X3BhZ2UocGFnZXNbaV0pO1xcbiAgNDA6XFx0XFxuICA0MTpcXHRcXHRcXHR9XFxuICA0MjpcXHRcXHRcXHRicmVhaztcXG4gIDQzOlxcdFxcdH1cXG4gIDQ0OlxcdH1cXG4gIDQ1OlxcdFxcbiAgNDY6XFx0c3RhdGljIHZvaWQgdmVyaWZ5X2RtYV9waW5uZWQodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG4gIDQ3OlxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuICA0ODpcXHR7XFxuICA0OTpcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuICA1MDpcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDowOS44MTU2NjE3MzhaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDU2NDM3OTIwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIGBtbS9ndXBfdGVzdC5jYCBmb3IgRnV6emluZyoqXG5cbkFscmlnaHQsIGxldCdzIGRpc3NlY3QgdGhpcyBgbW0vZ3VwX3Rlc3QuY2AgZmlsZS4gSSBzZWUgYSB3aG9sZSBzbGV3IG9mIGZ1bmN0aW9ucyBpbiBoZXJlOiBgcHV0X2JhY2tfcGFnZXNgLCBgdmVyaWZ5X2RtYV9waW5uZWRgLCBgZHVtcF9wYWdlc190ZXN0YCwgYF9fZ3VwX3Rlc3RfaW9jdGxgLCBhbmQgYSBzdWl0ZSBvZiBgcGluX2xvbmd0ZXJtX3Rlc3RgIGZ1bmN0aW9ucywgcGx1cyB0aGUgdXN1YWwgc3VzcGVjdHMgZm9yIGEgY2hhcmFjdGVyIGRldmljZTogYGd1cF90ZXN0X2lvY3RsYCwgYGd1cF90ZXN0X29wZW5gLCBgZ3VwX3Rlc3RfcmVsZWFzZWAsIGFuZCBgZ3VwX3Rlc3RfaW5pdGAuIEludGVyZXN0aW5nLCB0aGV5J3JlIGFsbCBkZWNsYXJlZCBgc3RhdGljYCwgc3VnZ2VzdGluZyB0aGlzIG1vZHVsZSBpcyBzZWxmLWNvbnRhaW5lZC4gVGhlIGZpbGUgaXMgcmVnaXN0ZXJlZCB1bmRlciBgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RgLCB3aGljaCBpcyBhIGdvb2Qgc2lnbiBmb3IgYWNjZXNzaWJpbGl0eS4gVGhlIGZpbGUgb3BlcmF0aW9ucyBhcmUgaGFuZGxlZCBieSBgZ3VwX3Rlc3RfZm9wc2AuXG5cbk5vdywgdGhlIGNydWNpYWwgcXVlc3Rpb246IGlzIHRoaXMgY29kZSBXb3J0aEZ1enppbmc/IEkgbmVlZCB0byBhcHBseSB0aGUgY3JpdGVyaWEuIE9rYXksIGxldCdzIHNlZTogbW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLyBvciBLY29uZmlnIGZpbGVzPyBOby4gRGVjb3JhdGl2ZSBjaGFuZ2VzIGxpa2UgbG9nZ2luZz8gTm9wZS4gUHVyZWx5IG51bWVyaWMgY29uc3RhbnRzPyBOb3QgdGhhdCBJIGNhbiBzZWUuIENvZGUgcGF0aHMgdW5yZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzPyBOb3QgbGlrZWx5LCBnaXZlbiB0aGUgYC9zeXMva2VybmVsL2RlYnVnYCBpbnRlcmZhY2UuIFZlbmRvci1zcGVjaWZpYyBoYXJkd2FyZSBkcml2ZXJzPyBOby4gQW5kIGl0J3Mgbm90IGEgZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrLlxuXG5BaGEhIFRoZSBwYXRjaCBhZmZlY3RzIGBfX2d1cF90ZXN0X2lvY3RsYCBzcGVjaWZpY2FsbHkgd2l0aGluIGBtbS9ndXBfdGVzdC5jYC4gVGhlIGZpeCBhZGRyZXNzZXMgaG93IHRoZSBzaXplIChgZ3VwLVx1MDAzZXNpemVgKSBpcyBjYWxjdWxhdGVkLCBzd2l0Y2hpbmcgZnJvbSBhIHBvdGVudGlhbGx5IGZsYXdlZCBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCBjYWxjdWxhdGlvbiB0byBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgLiBUaGlzIGlzICoqY29yZSBrZXJuZWwgY29kZSoqIChgbW0vYCksIGFuZCBpdCdzIHJlYWNoYWJsZSB2aWEgdGhvc2UgYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCBpb2N0bHMg4oCTIG1lYW5pbmcgaXQncyBhYnNvbHV0ZWx5IHJlYWNoYWJsZSBpbiBhIHZpcnR1YWxpemVkIGVudmlyb25tZW50LiBUaGF0J3MgYSB0ZXh0Ym9vayBjYXNlIGZvciBmdXp6aW5nLlxuXG5TbywgdGhlIGFuc3dlciBpcyBhIHJlc291bmRpbmcgKnllcyosIHRoaXMgcGF0Y2ggaXMgV29ydGhGdXp6aW5nLlxuXG5OZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IGRlcGVuZGVuY2llcy4gYG1tL0tjb25maWdgIHNwZWNpZmllcyB0aGF0IGBHVVBfVEVTVGAgZGVwZW5kcyBvbiBgREVCVUdfRlNgLiBMZXQgbWUgZ28gY2hlY2sgYGxpYi9LY29uZmlnLmRlYnVnYCBhbmQgY29uZmlybSB0aGF0IGBERUJVR19GU2AgaXMgcHJvcGVybHkgY29uZmlndXJlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTcwNzUsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDoxNC4zODAwNDI5MjJaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0MTYyMDg5LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgREVCVUdfRlNcXFxcYlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJsaWIvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MTQuNDI0MjA4OTkxWiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwNzI0OTAyNTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBjb25zaWRlcmluZyB0aGlzIG15c2VsZjpcblxuKipUcmFjaW5nIERvd24gYSBERUJVR19GUyBEZWZpbml0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHRyYWNrIGRvd24gd2hlcmUgYERFQlVHX0ZTYCBpcyBkZWZpbmVkLiBUaGlzIGNvdWxkIGJlIGluIGEgaGVhZGVyIGZpbGUsIGEgYnVpbGQgY29uZmlndXJhdGlvbiwgb3IgZXZlbiBhIG1hY3JvIHdpdGhpbiBhbm90aGVyIGRlZmluaXRpb24uIEdpdmVuIG15IGV4cGVyaWVuY2UsIEknZCBmaXJzdCBzdXNwZWN0IGEgc3lzdGVtLWxldmVsIGhlYWRlci4gSSdkIHN0YXJ0IHdpdGggdGhlIHN0YW5kYXJkIGluY2x1ZGUgZGlyZWN0b3JpZXMsIHByb2JhYmx5IGAvdXNyL2luY2x1ZGVgIG9yIHRoZSBrZXJuZWwgaGVhZGVycyBpZiBJJ20gd29ya2luZyB3aXRoIGtlcm5lbCBjb2RlLiBBIGBncmVwYCBvciBhbiBJREUncyBcIkZpbmQgaW4gRmlsZXNcIiB3b3VsZCBiZSB0aGUgb2J2aW91cyBjaG9pY2UsIHNlYXJjaGluZyBmb3IgYCNkZWZpbmUgREVCVUdfRlNgIG9yIHBvdGVudGlhbGx5IGp1c3QgYERFQlVHX0ZTYCB0byBzZWUgaWYgaXQncyB1c2VkIGRpcmVjdGx5IGluIHRoZSBjb2RlLiBJJ2xsIG5lZWQgdG8gYmUgYXdhcmUgb2YgYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLCBzbyBJJ2xsIGFsc28gYmUgbWluZGZ1bCBvZiBwb3RlbnRpYWwgYCNpZmRlZmAgb3IgYCNpZm5kZWZgIGJsb2NrcyB0aGF0IG1pZ2h0IGdhdGUgdGhlIGRlZmluaXRpb24uIElmIGl0J3Mgbm90IGEgZGlyZWN0IGRlZmluaXRpb24sIGl0IGNvdWxkIGJlIGEgbWFjcm8gdXNlZCB0byBjb25zdHJ1Y3Qgc29tZXRoaW5nIGVsc2UsIHNvIEknbGwgbmVlZCB0byB3YXRjaCBvdXQgZm9yIHRoYXQgYXMgd2VsbC4gVGhlIGdvYWwgaXMgdG8gZ2V0IHRoZSBmdWxsIGNvbnRleHQgb2YgaG93IGBERUJVR19GU2AgaXMgc2V0IHVwIGFuZCB3aGF0IGl0IHJlcHJlc2VudHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MjM5LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MTYuNDk2NzAxODYzWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjE1Njk5NjA2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBERUJVR19GU1xcXFxiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImxpYi9LY29uZmlnLmRlYnVnPTY4Mz1jb25maWcgTUFHSUNfU1lTUlFfU0VSSUFMX1NFUVVFTkNFXFxuLS1cXG5saWIvS2NvbmZpZy5kZWJ1Zy02OTItXFxubGliL0tjb25maWcuZGVidWc6NjkzOmNvbmZpZyBERUJVR19GU1xcbmxpYi9LY29uZmlnLmRlYnVnLTY5NC1cXHRib29sIFxcXCJEZWJ1ZyBGaWxlc3lzdGVtXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDoxOC43MTI0MDYyMTlaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQ2ODUxMTU5NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBEZWJ1Z2dpbmc6IEtjb25maWcuZGVidWcqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHRyb3VibGVzaG9vdCB0aGlzIGlzc3VlLCBhbmQgSSBoYXZlIGEgZmVlbGluZyB0aGUgYW5zd2VyIGxpZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIEknbSBnb2luZyB0byBoZWFkIHN0cmFpZ2h0IGludG8gYGxpYi9LY29uZmlnLmRlYnVnYC4gSXQncyBhIGtleSBmaWxlIGZvciBkZWJ1ZyBvcHRpb25zLCBzbyB0aGF0J3MgYSBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0LiBMZXQncyB6ZXJvIGluIG9uIGxpbmUgNjkzLiBIb3BlZnVsbHksIHRoYXQgbG9jYXRpb24gd2lsbCB0cmlnZ2VyIGEgbWVtb3J5IG9yIGxlYWQgbWUgdG8gdGhlIHJvb3QgY2F1c2UuIEl0IGlzIGdvaW5nIHRvIGJlIGEgZGVlcCBkaXZlLiBJJ20gaG9waW5nIEkgY2FuIG1ha2UgYSBxdWljayBhc3Nlc3NtZW50IG9mIGl0LCBidXQgd2hvIGtub3dzIHdoYXQgSSdsbCBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODYwMCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjA0OjIxLjE4MDkyMTQ0M1oiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTAzMDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibGliL0tjb25maWcuZGVidWdcIixcbiAgXCJGaXJzdExpbmVcIjogNjkwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjkwOlxcdFxcbiA2OTE6XFx0XFx0ICBJZiB1bnN1cmUsIGxlYXZlIGFuIGVtcHR5IHN0cmluZyBhbmQgdGhlIG9wdGlvbiB3aWxsIG5vdCBiZSBlbmFibGVkLlxcbiA2OTI6XFx0XFxuIDY5MzpcXHRjb25maWcgREVCVUdfRlNcXG4gNjk0OlxcdFxcdGJvb2wgXFxcIkRlYnVnIEZpbGVzeXN0ZW1cXFwiXFxuIDY5NTpcXHRcXHRoZWxwXFxuIDY5NjpcXHRcXHQgIGRlYnVnZnMgaXMgYSB2aXJ0dWFsIGZpbGUgc3lzdGVtIHRoYXQga2VybmVsIGRldmVsb3BlcnMgdXNlIHRvIHB1dFxcbiA2OTc6XFx0XFx0ICBkZWJ1Z2dpbmcgZmlsZXMgaW50by4gIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBiZSBhYmxlIHRvIHJlYWQgYW5kXFxuIDY5ODpcXHRcXHQgIHdyaXRlIHRvIHRoZXNlIGZpbGVzLlxcbiA2OTk6XFx0XFxuIDcwMDpcXHRcXHQgIEZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9uIHRoZSBkZWJ1Z2ZzIEFQSSwgc2VlXFxuIDcwMTpcXHRcXHQgIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvLlxcbiA3MDI6XFx0XFxuIDcwMzpcXHRcXHQgIElmIHVuc3VyZSwgc2F5IE4uXFxuIDcwNDpcXHRcXG4gNzA1OlxcdGNob2ljZVxcbiA3MDY6XFx0XFx0cHJvbXB0IFxcXCJEZWJ1Z2ZzIGRlZmF1bHQgYWNjZXNzXFxcIlxcbiA3MDc6XFx0XFx0ZGVwZW5kcyBvbiBERUJVR19GU1xcbiA3MDg6XFx0XFx0ZGVmYXVsdCBERUJVR19GU19BTExPV19BTExcXG4gNzA5OlxcdFxcdGhlbHBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MjEuMTgxMTczMzE0WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUyODEwNzg5MjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEdVUCBUZXN0IFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duIHN5c3RlbWF0aWNhbGx5LiBUaGUgaW5pdGlhbCBnb2FsIGlzIHN0cmFpZ2h0Zm9yd2FyZDogZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGBFbmFibGVDb25maWdzYC4gU2luY2UgYEdVUF9URVNUYCBkZXBlbmRzIG9uIGBERUJVR19GU2AsIGVuYWJsaW5nIGBHVVBfVEVTVGAgYWxzbyBuZWNlc3NpdGF0ZXMgYERFQlVHX0ZTYC4gVGh1cywgYEVuYWJsZUNvbmZpZ3NgIHNob3VsZCBiZSBgW1wiR1VQX1RFU1RcIiwgXCJERUJVR19GU1wiXWAuIFRoYXQncyBhIHNpbXBsZSBkZWR1Y3Rpb24sIGJ1dCB3ZSBhbHdheXMgZG91YmxlLWNoZWNrLlxuXG5Ob3csIG9uIHRvIHRoZSBgRm9jdXNTeW1ib2xzYC4gVGhlIGluc3RydWN0aW9ucyBlbXBoYXNpemUgc2VsZWN0aW5nIGtlcm5lbCBmdW5jdGlvbnMgcmlwZSBmb3IgZnV6emluZy4gVGhlIGtleSBpcyB0byBiZSBzcGVjaWZpYyDigJMgYXZvaWRpbmcgZ2VuZXJpYyBmdW5jdGlvbnMgdGhhdCB3b3VsZCBza2V3IHRlc3RpbmcuIFdlIHdhbnQgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgZW50cnkgcG9pbnRzLiBMb29raW5nIGF0IGBtbS9ndXBfdGVzdC5jYCwgSSBzZWUgYGd1cF90ZXN0X2lvY3RsYCBhbmQgYF9fZ3VwX3Rlc3RfaW9jdGxgLiBUaGVzZSBzZWVtIGxpa2UgdGhlIHByaW1lIGNhbmRpZGF0ZXMuIFRoZXkgYXJlIGxpa2VseSBlbnRyeSBwb2ludHMgdG8gdGhpcyB0ZXN0IGZ1bmN0aW9uYWxpdHksIHNvIEknbGwgaW5jbHVkZSBib3RoIGBndXBfdGVzdF9pb2N0bGAgYW5kIGBfX2d1cF90ZXN0X2lvY3RsYC5cblxuTGV0J3MgZG8gYSBmaW5hbCByZXZpZXc6XG5cbiogICBgV29ydGhGdXp6aW5nYDogQWJzb2x1dGVseS4gVGhlIHBhdGNoIGNsZWFybHkgbW9kaWZpZXMgYF9fZ3VwX3Rlc3RfaW9jdGxgLCBhbmQgdGhlIGRlc2NyaXB0aW9uIGhpZ2hsaWdodHMgdGhlIGJ1ZyBmaXggcmVsYXRlZCB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0aW5nIHBpbm5lZCBzaXplIGluIHRoZSBjb250ZXh0IG9mIHRoZSBgZ3VwX3Rlc3RgIGlvY3RsIGludGVyZmFjZSB3aXRoaW4gZGVidWdmcy5cbiogICBgUmVhc29uaW5nYDogVGhlIHBhdGNoIHNwZWNpZmljYWxseSBhZGRyZXNzZXMgYW4gaXNzdWUgaW4gY2FsY3VsYXRpbmcgdGhlIHBpbm5lZCBzaXplLiBJdCdzIGFjY2Vzc2libGUgdmlhIHRoZSBkZWJ1Z2ZzIGludGVyZmFjZSB3aGVuIGBDT05GSUdfR1VQX1RFU1RgIGFuZCBgQ09ORklHX0RFQlVHX0ZTYCBhcmUgZW5hYmxlZC4gUGVyZmVjdC5cbiogICBgRW5hYmxlQ29uZmlnc2A6IENvbmZpcm1lZCBhcyBgW1wiR1VQX1RFU1RcIiwgXCJERUJVR19GU1wiXWAuXG4qICAgYEZvY3VzU3ltYm9sc2A6IENvbmZpcm1lZCBhcyBgW1wiZ3VwX3Rlc3RfaW9jdGxcIiwgXCJfX2d1cF90ZXN0X2lvY3RsXCJdYC5cblxuRXZlcnl0aGluZyBhbGlnbnMuIEknbSByZWFkeSB0byBpbnZva2UgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkwNjIsIk91dHB1dFRva2VucyI6MTUxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzUyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MjYuNDYyMjU0MDg1WiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzE0MTk2MTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkdVUF9URVNUXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImd1cF90ZXN0X2lvY3RsXCIsXG4gICAgXCJfX2d1cF90ZXN0X2lvY3RsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBfX2d1cF90ZXN0X2lvY3RsKCkgaW4gbW0vZ3VwX3Rlc3QuYyB0byBjb3JyZWN0bHkgc2V0IHRoZSByZXR1cm5lZCBzaXplIHRvICducl9wYWdlcyAqIFBBR0VfU0laRScgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgJ2FkZHIgLSBndXAtXFx1MDAzZWFkZHInIHdoaWNoIGNvdWxkIGJlIGluY29ycmVjdCBpZiBnZXRfdXNlcl9wYWdlcy9waW5fdXNlcl9wYWdlcyB0ZXJtaW5hdGVkIGVhcmx5LiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW9jdGwgaW50ZXJmYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkdVUF9URVNUXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImd1cF90ZXN0X2lvY3RsXCIsXG4gICAgXCJfX2d1cF90ZXN0X2lvY3RsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBfX2d1cF90ZXN0X2lvY3RsKCkgaW4gbW0vZ3VwX3Rlc3QuYyB0byBjb3JyZWN0bHkgc2V0IHRoZSByZXR1cm5lZCBzaXplIHRvICducl9wYWdlcyAqIFBBR0VfU0laRScgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgJ2FkZHIgLSBndXAtXFx1MDAzZWFkZHInIHdoaWNoIGNvdWxkIGJlIGluY29ycmVjdCBpZiBnZXRfdXNlcl9wYWdlcy9waW5fdXNlcl9wYWdlcyB0ZXJtaW5hdGVkIGVhcmx5LiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW9jdGwgaW50ZXJmYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDoyNi41MzM2Nzg4NjRaIiwiU2VxIjozMSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU5MjA1MTMxNjQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MjYuNTM0MTc5NjE1WiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NTkyMDQ2MjY0MjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGNoYW5nZXMgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXFx1MDAzZXNpemVgIGZyb20gYGFkZHIgLSBndXAtXFx1MDAzZWFkZHJgIHRvIGBucl9wYWdlcyAqIFBBR0VfU0laRWAgaW4gYF9fZ3VwX3Rlc3RfaW9jdGwoKWAgKGBtbS9ndXBfdGVzdC5jYCkuIFRoZSBgc3RydWN0IGd1cF90ZXN0YCBidWZmZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYXQgdGhlIGVudHJ5IG9mIGBndXBfdGVzdF9pb2N0bGAgYmVmb3JlIGJlaW5nIG1vZGlmaWVkIGFuZCBjb3BpZWQgYmFjayB0byB1c2VyIHNwYWNlIHdpdGggYGNvcHlfdG9fdXNlcmAuIFRoZSBjaGFuZ2Ugc29sZWx5IHVwZGF0ZXMgYW4gYXJpdGhtZXRpYyBjYWxjdWxhdGlvbiBmb3IgYW4gb3V0cHV0IGZpZWxkIHJlcG9ydGluZyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBwaW5uZWQgYnl0ZXMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMsIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnksIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAyYTczNTY4OGVhNmJlN2FmMmQzNTNkOWI5YzkwMzIzNjBlZjZhYjNiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMzEgMTI6MDE6MDYgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xuaW5kZXggNDRjMWNkZmI5YzM3MS4uMTg1YmEzYmI4ZWQxMCAxMDA2NDRcbi0tLSBhL21tL2d1cF90ZXN0LmNcbisrKyBiL21tL2d1cF90ZXN0LmNcbkBAIC0xODgsNyArMTg4LDcgQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXG4gXHRucl9wYWdlcyA9IGk7XG4gXG4gXHRndXAtXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XG4tXHRndXAtXHUwMDNlc2l6ZSA9IGFkZHIgLSBndXAtXHUwMDNlYWRkcjtcbitcdGd1cC1cdTAwM2VzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7XG4gXG4gXHQvKlxuIFx0ICogVGFrZSBhbiB1bi1iZW5jaG1hcmstdGltZWQgbW9tZW50IHRvIHZlcmlmeSBETUEgcGlubmVkXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDoyNi41MzQxODI5MjRaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjY2MDU2NjczNzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGd1cF90ZXN0LmMqKlxuXG5BbHJpZ2h0LCBsZXQncyB6ZXJvIGluIG9uIGBtbS9ndXBfdGVzdC5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDE4OC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQncyBnb2luZyBvbiBpbiB0aGF0IGFyZWEgb2YgdGhlIGNvZGUuIEEgcXVpY2sgYHJlYWQtZmlsZWAgd2lsbCBkbyB0aGUgdHJpY2sg4oCTIGl0J3MgdGhlIGJlc3Qgd2F5IHRvIHF1aWNrbHkgZ3Jhc3AgdGhlIGNvbnRleHQgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoZSB0cm91YmxlIG9mIGxhdW5jaGluZyBhIGRlYnVnZ2VyIGp1c3QgeWV0LiBMZXQncyBzZWUgd2hhdCB3ZSBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDY3LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDo1My4xMzk4NTM1ODJaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODM0NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNDAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxNDA6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE0MTpcXHRcXG4gMTQyOlxcdFxcdFxcdG5leHQgPSBhZGRyICsgbnIgKiBQQUdFX1NJWkU7XFxuIDE0MzpcXHRcXHRcXHRpZiAobmV4dCBcXHUwMDNlIGVuZCkge1xcbiAxNDQ6XFx0XFx0XFx0XFx0bmV4dCA9IGVuZDtcXG4gMTQ1OlxcdFxcdFxcdFxcdG5yID0gKG5leHQgLSBhZGRyKSAvIFBBR0VfU0laRTtcXG4gMTQ2OlxcdFxcdFxcdH1cXG4gMTQ3OlxcdFxcbiAxNDg6XFx0XFx0XFx0c3dpdGNoIChjbWQpIHtcXG4gMTQ5OlxcdFxcdFxcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxcbiAxNTA6XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTUxOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCBwYWdlcyArIGkpO1xcbiAxNTI6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1MzpcXHRcXHRcXHRjYXNlIEdVUF9CQVNJQ19URVNUOlxcbiAxNTQ6XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxuIDE1NTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTU2OlxcdFxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAxNTc6XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTU4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCBwYWdlcyArIGkpO1xcbiAxNTk6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2MDpcXHRcXHRcXHRjYXNlIFBJTl9CQVNJQ19URVNUOlxcbiAxNjE6XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxuIDE2MjpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTYzOlxcdFxcdFxcdGNhc2UgUElOX0xPTkdURVJNX0JFTkNITUFSSzpcXG4gMTY0OlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXFxuIDE2NTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgZ3VwLVxcdTAwM2VndXBfZmxhZ3MgfCBGT0xMX0xPTkdURVJNLFxcbiAxNjY6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE2NzpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTY4OlxcdFxcdFxcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XFxuIDE2OTpcXHRcXHRcXHRcXHRpZiAoZ3VwLVxcdTAwM2V0ZXN0X2ZsYWdzIFxcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXFxuIDE3MDpcXHRcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTcxOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNzI6XFx0XFx0XFx0XFx0ZWxzZVxcbiAxNzM6XFx0XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE3NDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4gMTc1OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNzY6XFx0XFx0XFx0ZGVmYXVsdDpcXG4gMTc3OlxcdFxcdFxcdFxcdHJldCA9IC1FSU5WQUw7XFxuIDE3ODpcXHRcXHRcXHRcXHRnb3RvIHVubG9jaztcXG4gMTc5OlxcdFxcdFxcdH1cXG4gMTgwOlxcdFxcbiAxODE6XFx0XFx0XFx0aWYgKG5yIFxcdTAwM2M9IDApXFxuIDE4MjpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTgzOlxcdFxcdFxcdGkgKz0gbnI7XFxuIDE4NDpcXHRcXHR9XFxuIDE4NTpcXHRcXHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xcbiAxODY6XFx0XFxuIDE4NzpcXHRcXHQvKiBTaGlmdGluZyB0aGUgbWVhbmluZyBvZiBucl9wYWdlczogbm93IGl0IGlzIGFjdHVhbCBudW1iZXIgcGlubmVkOiAqL1xcbiAxODg6XFx0XFx0bnJfcGFnZXMgPSBpO1xcbiAxODk6XFx0XFxuIDE5MDpcXHRcXHRndXAtXFx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xcbiAxOTE6XFx0XFx0Z3VwLVxcdTAwM2VzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7XFxuIDE5MjpcXHRcXG4gMTkzOlxcdFxcdC8qXFxuIDE5NDpcXHRcXHQgKiBUYWtlIGFuIHVuLWJlbmNobWFyay10aW1lZCBtb21lbnQgdG8gdmVyaWZ5IERNQSBwaW5uZWRcXG4gMTk1OlxcdFxcdCAqIHN0YXRlOiBwcmludCBhIHdhcm5pbmcgaWYgYW55IG5vbi1kbWEtcGlubmVkIHBhZ2VzIGFyZSBmb3VuZDpcXG4gMTk2OlxcdFxcdCAqL1xcbiAxOTc6XFx0XFx0dmVyaWZ5X2RtYV9waW5uZWQoY21kLCBwYWdlcywgbnJfcGFnZXMpO1xcbiAxOTg6XFx0XFxuIDE5OTpcXHRcXHRpZiAoY21kID09IERVTVBfVVNFUl9QQUdFU19URVNUKVxcbiAyMDA6XFx0XFx0XFx0ZHVtcF9wYWdlc190ZXN0KGd1cCwgcGFnZXMsIG5yX3BhZ2VzKTtcXG4gMjAxOlxcdFxcbiAyMDI6XFx0XFx0c3RhcnRfdGltZSA9IGt0aW1lX2dldCgpO1xcbiAyMDM6XFx0XFxuIDIwNDpcXHRcXHRwdXRfYmFja19wYWdlcyhjbWQsIHBhZ2VzLCBucl9wYWdlcywgZ3VwLVxcdTAwM2V0ZXN0X2ZsYWdzKTtcXG4gMjA1OlxcdFxcbiAyMDY6XFx0XFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMjA3OlxcdFxcdGd1cC1cXHUwMDNlcHV0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XFxuIDIwODpcXHRcXG4gMjA5OlxcdHVubG9jazpcXG4gMjEwOlxcdFxcdGlmIChuZWVkc19tbWFwX2xvY2spXFxuIDIxMTpcXHRcXHRcXHRtbWFwX3JlYWRfdW5sb2NrKGN1cnJlbnQtXFx1MDAzZW1tKTtcXG4gMjEyOlxcdGZyZWVfcGFnZXM6XFxuIDIxMzpcXHRcXHRrdmZyZWUocGFnZXMpO1xcbiAyMTQ6XFx0XFx0cmV0dXJuIHJldDtcXG4gMjE1OlxcdH1cXG4gMjE2OlxcdFxcbiAyMTc6XFx0c3RhdGljIGlubGluZSB2b2lkIHBpbl9sb25ndGVybV90ZXN0X3N0b3Aoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEpXFxuIDIxODpcXHR7XFxuIDIxOTpcXHRcXHRpZiAoZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6NTMuMTM5OTM4ODQyWiIsIlNlcSI6MzUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMxMDQ3OTM3NTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIGNvZGUuXG5cbioqSW52ZXN0aWdhdGluZyBgX19ndXBfdGVzdF9pb2N0bGAgYW5kIGBndXBfdGVzdF9pb2N0bGAgRnVuY3Rpb25hbGl0eSoqXG5cbkFscmlnaHQsIG15IGZpcnN0IHN0ZXAgaXMgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb24gd2hhdCB0aGVzZSB0d28gZnVuY3Rpb25zLCBgX19ndXBfdGVzdF9pb2N0bGAgYW5kIGBndXBfdGVzdF9pb2N0bGAsIGFyZSBhY3R1YWxseSBkb2luZy4gR2l2ZW4gdGhhdCBJJ20gZGVhbGluZyB3aXRoIHRoZSBpbnRyaWNhY2llcyBvZiBtZW1vcnkgbWFuYWdlbWVudCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlaXIgcHVycG9zZSwgY29udGV4dCwgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgd2l0aGluIHRoZSBicm9hZGVyIGtlcm5lbCBtZW1vcnkgc3Vic3lzdGVtLiBJJ2xsIGZvY3VzIG15IGluaXRpYWwgYW5hbHlzaXMgb24gbGluZXMgNTAtMTQwIGFuZCAyMTUtMjgwLiBUaGF0IHNob3VsZCBnaXZlIG1lIGEgZ29vZCBvdmVydmlldyBvZiB0aGVpciBwcmltYXJ5IG9wZXJhdGlvbnMgYW5kIGhvdyB0aGV5IGZpdCBpbnRvIHRoZSBiaWdnZXIgcGljdHVyZS4gVW5kZXJzdGFuZGluZyBob3cgdGhleSdyZSBpbXBsZW1lbnRlZCBhbmQgd2hlcmUgdGhleSdyZSB1c2VkIGlzIGNydWNpYWwgdG8gdW5kZXJzdGFuZGluZyBhbnkgcG90ZW50aWFsIG1lbW9yeS1yZWxhdGVkIGlzc3VlcyBvciBvcHRpbWl6YXRpb25zIHRoZXkgbWlnaHQgZW5hYmxlLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNDQ3LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDo1Ni4yNDQ3MzQ4NTZaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjkzNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1MCxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA1MDpcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbiAgNTE6XFx0XFxuICA1MjpcXHRcXHRzd2l0Y2ggKGNtZCkge1xcbiAgNTM6XFx0XFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XFxuICA1NDpcXHRcXHRjYXNlIFBJTl9CQVNJQ19URVNUOlxcbiAgNTU6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAgNTY6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcXG4gIDU3OlxcdFxcdFxcdFxcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlc1tpXSk7XFxuICA1ODpcXHRcXG4gIDU5OlxcdFxcdFxcdFxcdGlmIChXQVJOKCFmb2xpb19tYXliZV9kbWFfcGlubmVkKGZvbGlvKSxcXG4gIDYwOlxcdFxcdFxcdFxcdFxcdCBcXFwicGFnZXNbJWx1XSBpcyBOT1QgZG1hLXBpbm5lZFxcXFxuXFxcIiwgaSkpIHtcXG4gIDYxOlxcdFxcbiAgNjI6XFx0XFx0XFx0XFx0XFx0ZHVtcF9wYWdlKFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgXFxcImd1cF90ZXN0IGZhaWx1cmVcXFwiKTtcXG4gIDYzOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAgNjQ6XFx0XFx0XFx0XFx0fSBlbHNlIGlmIChjbWQgPT0gUElOX0xPTkdURVJNX0JFTkNITUFSSyBcXHUwMDI2XFx1MDAyNlxcbiAgNjU6XFx0XFx0XFx0XFx0XFx0V0FSTighZm9saW9faXNfbG9uZ3Rlcm1fcGlubmFibGUoZm9saW8pLFxcbiAgNjY6XFx0XFx0XFx0XFx0XFx0ICAgICBcXFwicGFnZXNbJWx1XSBpcyBOT1QgcGlubmFibGUgYnV0IHBpbm5lZFxcXFxuXFxcIixcXG4gIDY3OlxcdFxcdFxcdFxcdFxcdCAgICAgaSkpIHtcXG4gIDY4OlxcdFxcdFxcdFxcdFxcdGR1bXBfcGFnZShcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIFxcXCJndXBfdGVzdCBmYWlsdXJlXFxcIik7XFxuICA2OTpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gIDcwOlxcdFxcdFxcdFxcdH1cXG4gIDcxOlxcdFxcdFxcdH1cXG4gIDcyOlxcdFxcdFxcdGJyZWFrO1xcbiAgNzM6XFx0XFx0fVxcbiAgNzQ6XFx0fVxcbiAgNzU6XFx0XFxuICA3NjpcXHRzdGF0aWMgdm9pZCBkdW1wX3BhZ2VzX3Rlc3Qoc3RydWN0IGd1cF90ZXN0ICpndXAsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxuICA3NzpcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4gIDc4OlxcdHtcXG4gIDc5OlxcdFxcdHVuc2lnbmVkIGludCBpbmRleF90b19kdW1wO1xcbiAgODA6XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuICA4MTpcXHRcXG4gIDgyOlxcdFxcdC8qXFxuICA4MzpcXHRcXHQgKiBaZXJvIG91dCBhbnkgdXNlci1zdXBwbGllZCBwYWdlIGluZGV4IHRoYXQgaXMgb3V0IG9mIHJhbmdlLiBSZW1lbWJlcjpcXG4gIDg0OlxcdFxcdCAqIC53aGljaF9wYWdlc1tdIGNvbnRhaW5zIGEgMS1iYXNlZCBzZXQgb2YgcGFnZSBpbmRpY2VzLlxcbiAgODU6XFx0XFx0ICovXFxuICA4NjpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVA7IGkrKykge1xcbiAgODc6XFx0XFx0XFx0aWYgKGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0gXFx1MDAzZSBucl9wYWdlcykge1xcbiAgODg6XFx0XFx0XFx0XFx0cHJfd2FybihcXFwiWkVST0lORyBkdWUgdG8gb3V0IG9mIHJhbmdlOiAud2hpY2hfcGFnZXNbJXVdOiAldVxcXFxuXFxcIixcXG4gIDg5OlxcdFxcdFxcdFxcdFxcdGksIGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0pO1xcbiAgOTA6XFx0XFx0XFx0XFx0Z3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXSA9IDA7XFxuICA5MTpcXHRcXHRcXHR9XFxuICA5MjpcXHRcXHR9XFxuICA5MzpcXHRcXG4gIDk0OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSsrKSB7XFxuICA5NTpcXHRcXHRcXHRpbmRleF90b19kdW1wID0gZ3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXTtcXG4gIDk2OlxcdFxcbiAgOTc6XFx0XFx0XFx0aWYgKGluZGV4X3RvX2R1bXApIHtcXG4gIDk4OlxcdFxcdFxcdFxcdGluZGV4X3RvX2R1bXAtLTsgLy8gRGVjb2RlIGZyb20gMS1iYXNlZCwgdG8gMC1iYXNlZFxcbiAgOTk6XFx0XFx0XFx0XFx0cHJfaW5mbyhcXFwiLS0tLSBwYWdlICMldSwgc3RhcnRpbmcgZnJvbSB1c2VyIHZpcnQgYWRkcjogMHglbGx4XFxcXG5cXFwiLFxcbiAxMDA6XFx0XFx0XFx0XFx0XFx0aW5kZXhfdG9fZHVtcCwgZ3VwLVxcdTAwM2VhZGRyKTtcXG4gMTAxOlxcdFxcdFxcdFxcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcXG4gMTAyOlxcdFxcdFxcdFxcdFxcdCAgXFxcImd1cF90ZXN0OiBkdW1wX3BhZ2VzKCkgdGVzdFxcXCIpO1xcbiAxMDM6XFx0XFx0XFx0fVxcbiAxMDQ6XFx0XFx0fVxcbiAxMDU6XFx0fVxcbiAxMDY6XFx0XFxuIDEwNzpcXHRzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG4gMTA4OlxcdFxcdFxcdHN0cnVjdCBndXBfdGVzdCAqZ3VwKVxcbiAxMDk6XFx0e1xcbiAxMTA6XFx0XFx0a3RpbWVfdCBzdGFydF90aW1lLCBlbmRfdGltZTtcXG4gMTExOlxcdFxcdHVuc2lnbmVkIGxvbmcgaSwgbnJfcGFnZXMsIGFkZHIsIG5leHQ7XFxuIDExMjpcXHRcXHRsb25nIG5yO1xcbiAxMTM6XFx0XFx0c3RydWN0IHBhZ2UgKipwYWdlcztcXG4gMTE0OlxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kO1xcbiAxMTU6XFx0XFx0aW50IHJldCA9IDA7XFxuIDExNjpcXHRcXHRib29sIG5lZWRzX21tYXBfbG9jayA9XFxuIDExNzpcXHRcXHRcXHRjbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLIFxcdTAwMjZcXHUwMDI2IGNtZCAhPSBQSU5fRkFTVF9CRU5DSE1BUks7XFxuIDExODpcXHRcXG4gMTE5OlxcdFxcdGlmIChndXAtXFx1MDAzZWFkZHIgXFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVxcdTAwM2VzaXplIFxcdTAwM2UgVUxPTkdfTUFYKVxcbiAxMjA6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDEyMTpcXHRcXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KCh1bnNpZ25lZCBsb25nKWd1cC1cXHUwMDNlYWRkcixcXG4gMTIyOlxcdFxcdFxcdFxcdCAgICAgICAodW5zaWduZWQgbG9uZylndXAtXFx1MDAzZXNpemUsIFxcdTAwMjZlbmQpKVxcbiAxMjM6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDEyNDpcXHRcXG4gMTI1OlxcdFxcdG5yX3BhZ2VzID0gZ3VwLVxcdTAwM2VzaXplIC8gUEFHRV9TSVpFO1xcbiAxMjY6XFx0XFx0cGFnZXMgPSBrdmNhbGxvYyhucl9wYWdlcywgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpO1xcbiAxMjc6XFx0XFx0aWYgKCFwYWdlcylcXG4gMTI4OlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAxMjk6XFx0XFxuIDEzMDpcXHRcXHRpZiAobmVlZHNfbW1hcF9sb2NrIFxcdTAwMjZcXHUwMDI2IG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKGN1cnJlbnQtXFx1MDAzZW1tKSkge1xcbiAxMzE6XFx0XFx0XFx0cmV0ID0gLUVJTlRSO1xcbiAxMzI6XFx0XFx0XFx0Z290byBmcmVlX3BhZ2VzO1xcbiAxMzM6XFx0XFx0fVxcbiAxMzQ6XFx0XFxuIDEzNTpcXHRcXHRpID0gMDtcXG4gMTM2OlxcdFxcdG5yID0gZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcXG4gMTM3OlxcdFxcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMTM4OlxcdFxcdGZvciAoYWRkciA9IGd1cC1cXHUwMDNlYWRkcjsgYWRkciBcXHUwMDNjIGVuZDsgYWRkciA9IG5leHQpIHtcXG4gMTM5OlxcdFxcdFxcdGlmIChuciAhPSBndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDo1Ni4yNDQ4MDY2MDZaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzI3Mjg1NzMxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhvc2UgdGhvdWdodHMgZnJvbSBhbiBleHBlcnQncyBwZXJzcGVjdGl2ZSwgdXNpbmcgYSBmaXJzdC1wZXJzb24gcGVyc3BlY3RpdmU6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgYF9fZ3VwX3Rlc3RfaW9jdGxgIENhbGwqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgZmlyc3QgdGhpbmcgSSdtIGRvaW5nIGlzIGRyaWxsaW5nIGRvd24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBjYWxsaW5nIGBfX2d1cF90ZXN0X2lvY3RsYC4gVGhpcyBpc24ndCBqdXN0IGEgY2FzdWFsIGN1cmlvc2l0eTsgSSBzdXNwZWN0IHRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgdGhlIHJvb3Qgb2YgYSBwb3RlbnRpYWwgaXNzdWUuIFRoZXJl4oCZcyBsaWtlbHkgYSBzdWJ0bGUgYnVnIGNyZWVwaW5nIGluIHNvbWV3aGVyZSwgb3IgbWF5YmUganVzdCBzb21lIHVuZXhwZWN0ZWQgYmVoYXZpb3IuIEtub3dpbmcgdGhlIGNhbGxlciBjb250ZXh0IGlzIGtleS4gSXQgcHJvdmlkZXMgdGhlIGNydWNpYWwgY2x1ZXMgYWJvdXQgdGhlIHN5c3RlbeKAmXMgc3RhdGUgd2hlbiB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZCwgYW5kIHRoZXJlZm9yZSBoZWxwcyBtZSBmaWd1cmUgb3V0IHRoZSB3aHkgYW5kIGhvdyB0aGlzIGZ1bmN0aW9uIGlzIHJ1bm5pbmcgd2hlbiBpdCBydW5zLiBJIG5lZWQgdG8gdHJhY2UgdGhpcyBiYWNrLiBJcyBpdCB0cmlnZ2VyZWQgYnkgYSBzcGVjaWZpYyBkZXZpY2U/IEEgcGFydGljdWxhciBzeXN0ZW0gY2FsbD8gU29tZSBvYnNjdXJlIGtlcm5lbCBtb2R1bGUgaW50ZXJhY3Rpb24/IFVuZGVyc3RhbmRpbmcgdGhlIGNhbGwgY2hhaW4gaXMgdGhlIHN0YXJ0aW5nIHBvaW50IHRvIGRpYWdub3NpbmcgYW55IHByb2JsZW0uIExldCdzIGdldCBjcmFja2luZy5cblxuXG4iLCJJbnB1dFRva2VucyI6NTA4OSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6NTkuNTE3NjY2NTA3WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc2NTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjcwLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjcwOlxcdFxcdGRhdGEtXFx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzID0gMDtcXG4gMjcxOlxcdFxcbiAyNzI6XFx0XFx0d2hpbGUgKG5yX3BhZ2VzIC0gZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMpIHtcXG4gMjczOlxcdFxcdFxcdHJlbWFpbmluZ19wYWdlcyA9IG5yX3BhZ2VzIC0gZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXM7XFxuIDI3NDpcXHRcXHRcXHRhZGRyID0gYXJncy5hZGRyICsgZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgKiBQQUdFX1NJWkU7XFxuIDI3NTpcXHRcXG4gMjc2OlxcdFxcdFxcdGlmIChmYXN0KVxcbiAyNzc6XFx0XFx0XFx0XFx0Y3VyX3BhZ2VzID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCByZW1haW5pbmdfcGFnZXMsXFxuIDI3ODpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRndXBfZmxhZ3MsIHBhZ2VzKTtcXG4gMjc5OlxcdFxcdFxcdGVsc2VcXG4gMjgwOlxcdFxcdFxcdFxcdGN1cl9wYWdlcyA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIHJlbWFpbmluZ19wYWdlcyxcXG4gMjgxOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGd1cF9mbGFncywgcGFnZXMpO1xcbiAyODI6XFx0XFx0XFx0aWYgKGN1cl9wYWdlcyBcXHUwMDNjIDApIHtcXG4gMjgzOlxcdFxcdFxcdFxcdHBpbl9sb25ndGVybV90ZXN0X3N0b3AoZGF0YSk7XFxuIDI4NDpcXHRcXHRcXHRcXHRyZXQgPSBjdXJfcGFnZXM7XFxuIDI4NTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMjg2OlxcdFxcdFxcdH1cXG4gMjg3OlxcdFxcdFxcdGRhdGEtXFx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzICs9IGN1cl9wYWdlcztcXG4gMjg4OlxcdFxcdFxcdHBhZ2VzICs9IGN1cl9wYWdlcztcXG4gMjg5OlxcdFxcdH1cXG4gMjkwOlxcdFxcbiAyOTE6XFx0XFx0aWYgKCFmYXN0KVxcbiAyOTI6XFx0XFx0XFx0bW1hcF9yZWFkX3VubG9jayhjdXJyZW50LVxcdTAwM2VtbSk7XFxuIDI5MzpcXHRcXHRyZXR1cm4gcmV0O1xcbiAyOTQ6XFx0fVxcbiAyOTU6XFx0XFxuIDI5NjpcXHRzdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9yZWFkKHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhLFxcbiAyOTc6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhcmcpXFxuIDI5ODpcXHR7XFxuIDI5OTpcXHRcXHRfX3U2NCB1c2VyX2FkZHI7XFxuIDMwMDpcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuIDMwMTpcXHRcXG4gMzAyOlxcdFxcdGlmICghZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMpXFxuIDMwMzpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzA0OlxcdFxcbiAzMDU6XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZ1c2VyX2FkZHIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHVzZXJfYWRkcikpKVxcbiAzMDY6XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIDMwNzpcXHRcXG4gMzA4OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBkYXRhLVxcdTAwM2Vsb25ndGVybV9ucl9wYWdlczsgaSsrKSB7XFxuIDMwOTpcXHRcXHRcXHR2b2lkICphZGRyID0ga21hcF9sb2NhbF9wYWdlKGRhdGEtXFx1MDAzZWxvbmd0ZXJtX3BhZ2VzW2ldKTtcXG4gMzEwOlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgcmV0O1xcbiAzMTE6XFx0XFxuIDMxMjpcXHRcXHRcXHRyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpdXNlcl9hZGRyLCBhZGRyLFxcbiAzMTM6XFx0XFx0XFx0XFx0XFx0ICAgUEFHRV9TSVpFKTtcXG4gMzE0OlxcdFxcdFxcdGt1bm1hcF9sb2NhbChhZGRyKTtcXG4gMzE1OlxcdFxcdFxcdGlmIChyZXQpXFxuIDMxNjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gMzE3OlxcdFxcdFxcdHVzZXJfYWRkciArPSBQQUdFX1NJWkU7XFxuIDMxODpcXHRcXHR9XFxuIDMxOTpcXHRcXHRyZXR1cm4gMDtcXG4gMzIwOlxcdH1cXG4gMzIxOlxcdFxcbiAzMjI6XFx0c3RhdGljIGxvbmcgcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxcbiAzMjM6XFx0XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzMjQ6XFx0e1xcbiAzMjU6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlcC1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbiAzMjY6XFx0XFx0aW50IHJldCA9IC1FSU5WQUw7XFxuIDMyNzpcXHRcXG4gMzI4OlxcdFxcdGlmIChtdXRleF9sb2NrX2tpbGxhYmxlKFxcdTAwMjZkYXRhLVxcdTAwM2Vsb25ndGVybV9tdXRleCkpXFxuIDMyOTpcXHRcXHRcXHRyZXR1cm4gLUVJTlRSO1xcbiAzMzA6XFx0XFxuIDMzMTpcXHRcXHRzd2l0Y2ggKGNtZCkge1xcbiAzMzI6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVDpcXG4gMzMzOlxcdFxcdFxcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KGRhdGEsIGFyZyk7XFxuIDMzNDpcXHRcXHRcXHRicmVhaztcXG4gMzM1OlxcdFxcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RPUDpcXG4gMzM2OlxcdFxcdFxcdHBpbl9sb25ndGVybV90ZXN0X3N0b3AoZGF0YSk7XFxuIDMzNzpcXHRcXHRcXHRyZXQgPSAwO1xcbiAzMzg6XFx0XFx0XFx0YnJlYWs7XFxuIDMzOTpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1JFQUQ6XFxuIDM0MDpcXHRcXHRcXHRyZXQgPSBwaW5fbG9uZ3Rlcm1fdGVzdF9yZWFkKGRhdGEsIGFyZyk7XFxuIDM0MTpcXHRcXHRcXHRicmVhaztcXG4gMzQyOlxcdFxcdH1cXG4gMzQzOlxcdFxcbiAzNDQ6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZkYXRhLVxcdTAwM2Vsb25ndGVybV9tdXRleCk7XFxuIDM0NTpcXHRcXHRyZXR1cm4gcmV0O1xcbiAzNDY6XFx0fVxcbiAzNDc6XFx0XFxuIDM0ODpcXHRzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXFxuIDM0OTpcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFyZylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6NTkuNTE3NzQ0NjI3WiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUzMDc0NDE4NjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgcHJvdmlkZWQgc25pcHBldCwgcHJlc2VudGVkIGFzIGEgcGVyc29uYWwgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGBndXBfdGVzdF9pb2N0bGAqKlxuXG5Pa2F5LCBsZXQncyB6ZXJvIGluIG9uIGBndXBfdGVzdF9pb2N0bGAsIHNwZWNpZmljYWxseSBsaW5lcyAzNDggdGhyb3VnaCAzODAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcgd2l0aGluIHRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZSwgYXMgaXQgbGlrZWx5IGhvbGRzIGNydWNpYWwgbG9naWMgZm9yIFtVc2VyJ3MgRmllbGQsIGUuZy4sIG1lbW9yeSBtYW5hZ2VtZW50LCBkZXZpY2UgaW50ZXJhY3Rpb24sIGEgcGFydGljdWxhciBmZWF0dXJlLCBldGMuIC0gYmFzZWQgb24gdGhlIHVzZXIncyBmaWVsZCBvZiBleHBlcnRpc2VdLiBNeSBpbW1lZGlhdGUgZ29hbCBpcyB0byBncmFzcCB0aGUgY29udHJvbCBmbG93IGFuZCBpZGVudGlmeSBhbnkgcG90ZW50aWFsIGFyZWFzIG9mIGNvbmNlcm4sIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzLCBvciBkZXZpYXRpb25zIGZyb20gYmVzdCBwcmFjdGljZXMuIEknbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2U6XG5cbiogICAqKkVycm9yIEhhbmRsaW5nOioqIEFyZSBlcnJvcnMgYmVpbmcgY2hlY2tlZCBhbmQgaGFuZGxlZCBhcHByb3ByaWF0ZWx5PyBJcyB0aGVyZSBhIHJpc2sgb2YgcmVzb3VyY2UgbGVha3Mgb3IgaW5jb3JyZWN0IGJlaGF2aW9yIGluIGNhc2Ugb2YgZmFpbHVyZXM/XG4qICAgKipEYXRhIFN0cnVjdHVyZXM6KiogV2hhdCBkYXRhIHN0cnVjdHVyZXMgYXJlIGludm9sdmVkPyBIb3cgYXJlIHRoZXkgYmVpbmcgdXNlZCBhbmQgbW9kaWZpZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIGNvbmN1cnJlbmN5IGlzc3VlcyBvciByYWNlIGNvbmRpdGlvbnM/XG4qICAgKipNZW1vcnkgTWFuYWdlbWVudDoqKiBIb3cgaXMgbWVtb3J5IGJlaW5nIGFsbG9jYXRlZCBhbmQgZnJlZWQ/IEFyZSB0aGVyZSBhbnkgbWVtb3J5IGxlYWtzIG9yIGJ1ZmZlciBvdmVyZmxvd3MgdGhhdCBJIHNob3VsZCBiZSBvbiB0aGUgbG9va291dCBmb3I/XG4qICAgKipQZXJmb3JtYW5jZToqKiBDb3VsZCB0aGlzIHNlY3Rpb24gYmUgYSBib3R0bGVuZWNrPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgYXJlYXMgZm9yIG9wdGltaXphdGlvbiwgc3VjaCBhcyB1c2luZyBwcmVmZXRjaGluZywgaW5saW5pbmcsIG9yIHJlZHVjaW5nIHVubmVjZXNzYXJ5IHN5c3RlbSBjYWxscz9cbiogICAqKlNlY3VyaXR5OioqIEFyZSB0aGVyZSBhbnkgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLCBzdWNoIGFzIGZvcm1hdCBzdHJpbmcgYnVncyBvciBpbmplY3Rpb24gZmxhd3M/XG5cbkkgd2lsbCBzdGFydCBieSBtZW50YWxseSB0cmFjaW5nIHRoZSBleGVjdXRpb24gcGF0aCwga2VlcGluZyBteSBmaWVsZCBvZiBleHBlcnRpc2UgaW4gbWluZCBhbmQgdGhlIHJvbGUgdGhpcyBmdW5jdGlvbiBwbGF5cyBpbiB0aGUgYmlnZ2VyIHBpY3R1cmUuIEknbGwgbmVlZCB0byBrbm93IHdoaWNoIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZCBpbiBhbmQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gZG8sIGFzIHdlbGwgYXMgdGhlIGV4cGVjdGVkIG91dHB1dHMuIEkgd2lsbCBnbyBsaW5lIGJ5IGxpbmUgdW50aWwgSSBoYXZlIGEgZ29vZCBncmFzcCBvZiB0aGUgd2hvbGUgcGljdHVyZSBhbmQgY2FuIGFuc3dlciBhbnkgcXVlc3Rpb25zIHRoYXQgSSBtYXkgaGF2ZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NjQ4MywiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDU6MDQuODI1MTg5NjQ5WiIsIlNlcSI6NDAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY5ODcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzQ4LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzQ4OlxcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG4gMzQ5OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzNTA6XFx0e1xcbiAzNTE6XFx0XFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcXG4gMzUyOlxcdFxcdGludCByZXQ7XFxuIDM1MzpcXHRcXG4gMzU0OlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDM1NTpcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMzU2OlxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAzNTc6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAzNTg6XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMzU5OlxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuIDM2MDpcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAzNjE6XFx0XFx0XFx0YnJlYWs7XFxuIDM2MjpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzNjM6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzNjQ6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEOlxcbiAzNjU6XFx0XFx0XFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XFxuIDM2NjpcXHRcXHRkZWZhdWx0OlxcbiAzNjc6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDM2ODpcXHRcXHR9XFxuIDM2OTpcXHRcXG4gMzcwOlxcdFxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcXG4gMzcxOlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzI6XFx0XFxuIDM3MzpcXHRcXHRyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgXFx1MDAyNmd1cCk7XFxuIDM3NDpcXHRcXHRpZiAocmV0KVxcbiAzNzU6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMzc2OlxcdFxcbiAzNzc6XFx0XFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFxcdTAwMjZndXAsIHNpemVvZihndXApKSlcXG4gMzc4OlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzk6XFx0XFxuIDM4MDpcXHRcXHRyZXR1cm4gMDtcXG4gMzgxOlxcdH1cXG4gMzgyOlxcdFxcbiAzODM6XFx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbiAzODQ6XFx0e1xcbiAzODU6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XFxuIDM4NjpcXHRcXHRpbnQgcmV0O1xcbiAzODc6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjA1OjA0LjgyNTI2MjQzOVoiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2MzM3Nzk3ODk3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgZ3VwX3Rlc3RfaW9jdGwgQ2hhbmdlcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIGRvd24gdGhpcyBtb2RpZmljYXRpb24gdG8gYF9fZ3VwX3Rlc3RfaW9jdGxgLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIFwid2h5XCIgYmVoaW5kIHRoZSBjaGFuZ2UgdG8gYGd1cC1cdTAwM2VzaXplYC4gSSBuZWVkIHRvIHJlY29uc3RydWN0IHRoZSBsb2dpYyBpbiBteSBoZWFkLCBzdGFydGluZyB3aXRoIGhvdyBgZ3VwLVx1MDAzZXNpemVgIHdhcyBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgdmVyc3VzIHRoZSBuZXcgaW1wbGVtZW50YXRpb24uXG5cbkkgc2VlIHRoYXQgYGd1cC1cdTAwM2VzaXplYCB1c2VkIHRvIGJlIGBhZGRyIC0gZ3VwLVx1MDAzZWFkZHJgLiBJIG5lZWQgdG8gY29uZmlybSB0aGUgY29uZGl0aW9ucyB3aGVyZSB0aGlzIGFwcHJvYWNoIGZlbGwgc2hvcnQgYW5kIGhvdyB0aGUgbmV3IG1ldGhvZCwgYG5yX3BhZ2VzICogUEFHRV9TSVpFYCwgaW1wcm92ZXMgdGhlIHJlc3VsdC5cblxuTG9va2luZyBjbG9zZWx5IGF0IHRoZSBsb29wLCB0aGUgdmFyaWFibGUgYGFkZHJgIGlzIGluY3JlbWVudGVkLCBhbmQgYG5leHRgIGlzIHNldCB0byBgYWRkciArIG5yICogUEFHRV9TSVpFYCBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgaXRlcmF0aW9uLiBUaGUgY3J1Y2lhbCBwb2ludCBpcyB0aGF0IGBucmAgaXMgdGhlICpyZXF1ZXN0ZWQqIG51bWJlciBvZiBwYWdlcyAqYmVmb3JlKiB0aGUgYHN3aXRjaGAgc3RhdGVtZW50IHRoYXQgY2FsbHMgYGdldF91c2VyX3BhZ2VzYC4gSSBhbSBub3RpY2luZyB0aGF0IGBucmAgbWlnaHQgbm90IGJlIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHBhZ2VzIHBpbm5lZCAodGhlIG51bWJlciByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24pLiBJbiB0aGUgY29kZSwgaWYgYG5yYCBpcyBsZXNzIHRoYW4gcmVxdWVzdGVkLCB0aGUgbG9vcCB3aWxsIGJyZWFrLiBJIG5lZWQgdG8gdGhpbmsgdGhpcyB0aHJvdWdoLiBgbmV4dGAgaXMgc3RpbGwgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBjb3VudCwgYnV0IGBpYCB3aWxsIG9ubHkgdHJhY2sgdGhlIGFjdHVhbCBudW1iZXIgcGlubmVkLiBUaGF0J3MgaXQhIElmIGBnZXRfdXNlcl9wYWdlc2AgcmV0dXJucyBmZXdlciBwYWdlcyB0aGFuIHJlcXVlc3RlZCAocGFydGlhbCBzdWNjZXNzIG9yIGZhaWx1cmUpLCB0aGUgY29tcHV0YXRpb24gb2YgYGFkZHJgIGlzIG5vdyBpbmFjY3VyYXRlLiBUaGUgZWFybGllciBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCBjYWxjdWxhdGlvbiBvZiBgZ3VwLVx1MDAzZXNpemVgIGRvZXNuJ3QgcmVmbGVjdCB0aGUgYnl0ZXMgb3IgcGFnZXMgdGhhdCB3ZXJlICphY3R1YWxseSogcGlubmVkLiBUaGUgYnJlYWsgaXMgdGhlIGtleS5cblxuVGhpcyBsZWFkcyBtZSB0byB1bmRlcnN0YW5kIHRoZSBjaGFuZ2UuIFRoZSBuZXcgY2FsY3VsYXRpb24sIGBucl9wYWdlcyAqIFBBR0VfU0laRWAsIHVzZXMgYG5yX3BhZ2VzYCwgd2hpY2ggaXMgdGhlIHZhcmlhYmxlIGBpYCB0aGF0IEkgZGV0ZXJtaW5lZCBlYXJsaWVyLCBpcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHBpbm5lZC4gVGhpcyBpcyBhIG1vcmUgcHJlY2lzZSBhbmQgY29ycmVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBzaXplIHdpdGhpbiBgc3RydWN0IGd1cF90ZXN0YC4gVGhpcyBjaGFuZ2UgaXMgc3RyYWlnaHRmb3J3YXJkLCBhcyBgZ3VwLVx1MDAzZXNpemVgIGlzIGp1c3QgYW4gaW50ZWdlciBpbiB0aGUgc3RydWN0LlxuXG5Ob3csIGxldCdzIHF1aWNrbHkgcmV2aWV3IHRoZSBgc3RydWN0IGd1cF90ZXN0YCBkZWZpbml0aW9uIHRvIGVuc3VyZSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoaXMgZmllbGQncyBwdXJwb3NlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3Vycm91bmRpbmcgZGF0YS5cblxuXG4iLCJJbnB1dFRva2VucyI6NzQ5MiwiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU1MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjA1OjExLjE2MzA2Mjc2NVoiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIyNjk1MzkwNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3QgZ3VwX3Rlc3RcXFxcYlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9ndXBfdGVzdC5jPTQ2PXN0YXRpYyB2b2lkIHZlcmlmeV9kbWFfcGlubmVkKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTc1LVxcbm1tL2d1cF90ZXN0LmM6NzY6c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbm1tL2d1cF90ZXN0LmMtNzctXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5tbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG5tbS9ndXBfdGVzdC5jOjEwODpcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcXG5tbS9ndXBfdGVzdC5jLTEwOS17XFxuLS1cXG5tbS9ndXBfdGVzdC5jPTM0OD1zdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTM1MC17XFxubW0vZ3VwX3Rlc3QuYzozNTE6XFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcXG5tbS9ndXBfdGVzdC5jLTM1Mi1cXHRpbnQgcmV0O1xcbi0tXFxubW0vZ3VwX3Rlc3QuaC02LVxcbm1tL2d1cF90ZXN0Lmg6NzojZGVmaW5lIEdVUF9GQVNUX0JFTkNITUFSS1xcdF9JT1dSKCdnJywgMSwgc3RydWN0IGd1cF90ZXN0KVxcbm1tL2d1cF90ZXN0Lmg6ODojZGVmaW5lIFBJTl9GQVNUX0JFTkNITUFSS1xcdF9JT1dSKCdnJywgMiwgc3RydWN0IGd1cF90ZXN0KVxcbm1tL2d1cF90ZXN0Lmg6OTojZGVmaW5lIFBJTl9MT05HVEVSTV9CRU5DSE1BUktcXHRfSU9XUignZycsIDMsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oOjEwOiNkZWZpbmUgR1VQX0JBU0lDX1RFU1RcXHRcXHRfSU9XUignZycsIDQsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oOjExOiNkZWZpbmUgUElOX0JBU0lDX1RFU1RcXHRcXHRfSU9XUignZycsIDUsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oOjEyOiNkZWZpbmUgRFVNUF9VU0VSX1BBR0VTX1RFU1RcXHRfSU9XUignZycsIDYsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oLTEzLSNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfU1RBUlRcXHRfSU9XKCdnJywgNywgc3RydWN0IHBpbl9sb25ndGVybV90ZXN0KVxcbi0tXFxubW0vZ3VwX3Rlc3QuaC0yMC1cXG5tbS9ndXBfdGVzdC5oOjIxOnN0cnVjdCBndXBfdGVzdCB7XFxubW0vZ3VwX3Rlc3QuaC0yMi1cXHRfX3U2NCBnZXRfZGVsdGFfdXNlYztcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmM9NTE9dm9pZCAqZ3VwX3RocmVhZCh2b2lkICpkYXRhKVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmMtNTIte1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmM6NTM6XFx0c3RydWN0IGd1cF90ZXN0IGd1cCA9ICooc3RydWN0IGd1cF90ZXN0ICopZGF0YTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jLTU0LVxcdGludCBpLCBzdGF0dXM7XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jPTkyPWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jLTkzLXtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jOjk0OlxcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7IDAgfTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jLTk1LVxcdGludCBmaWxlZCwgaSwgb3B0LCBucl9wYWdlcyA9IDEsIHRocCA9IC0xLCB3cml0ZSA9IDEsIG50aHJlYWRzID0gMSwgcmV0O1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmM9MTc2Mj1zdGF0aWMgaW50IGd1cF90ZXN0X2V4ZWMoaW50IGd1cF9mZCwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgY21kLFxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMtMTc2NC17XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmM6MTc2NTpcXHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jLTE3NjYtXFx0XFx0Lm5yX3BhZ2VzX3Blcl9jYWxsXFx0PSBucGFnZXMsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjA1OjEzLjM5MDAyMTY4M1oiLCJTZXEiOjQzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0OTkzOTY5NDM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBtbS9ndXBfdGVzdC5oYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IHRvIGl0LiBMZXQncyBzdGFydCB3aXRoIGBtbS9ndXBfdGVzdC5oYC4gVGhpcyBpcyBsaWtlbHkgd2hlcmUgdGhlIGNvcmUgdGVzdCBpbmZyYXN0cnVjdHVyZSBmb3IgdGhlIEdldCBVc2VyIFBhZ2VzIChHVVApIGZ1bmN0aW9uYWxpdHkgcmVzaWRlcy4gS25vd2luZyB0aGUgaW50cmljYWNpZXMgb2YgdGhpcyBmaWxlIGlzIGNydWNpYWwgZm9yIGEgZGVlcCB1bmRlcnN0YW5kaW5nIG9mIGhvdyBtZW1vcnkgbWFwcGluZyBhbmQgcGFnZSBmYXVsdCBoYW5kbGluZyBhcmUgYmVpbmcgdGVzdGVkIHdpdGhpbiB0aGUga2VybmVsLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW50YWwgbWFwIG9mIHRoaXMgcGFydGljdWxhciBzZXQgb2YgdGVzdHMg4oCTIGFyZSB0aGV5IGZvY3VzaW5nIG9uIHNwZWNpZmljIEdVUCBvcHRpbWl6YXRpb24gcGF0aHMsIGJvdW5kYXJ5IGNvbmRpdGlvbnMsIGNvbmN1cnJlbnQgYWNjZXNzIHNjZW5hcmlvcywgb3IgcGVyaGFwcyBkaWZmZXJlbnQgbWVtb3J5IHpvbmVzPyBcblxuSSdsbCBiZSBsb29raW5nIGZvciB0aGluZ3MgbGlrZSB0aGUgZGVmaW5pdGlvbnMgb2YgdGVzdCBzdHJ1Y3R1cmVzLCBoZWxwZXIgbWFjcm9zIGZvciBzZXR0aW5nIHVwIG1lbW9yeSByZWdpb25zIGFuZCBpbmplY3RpbmcgZmF1bHRzLCBhc3NlcnRpb25zIHRvIHZhbGlkYXRlIHRoZSBleHBlY3RlZCBiZWhhdmlvciwgYW5kIGFueSBpbnRyaWNhdGUgdGhyZWFkaW5nIG1vZGVscyB0aGV5J3JlIGVtcGxveWluZy4gU3BlY2lmaWNhbGx5LCBJJ2xsIGJlIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gYW55IHVzZXMgb2YgYGd1cF9mYXN0YCwgYGd1cF9vbmVfcGFnZWAsIG9yIHNpbWlsYXIgZnVuY3Rpb25zIHRvIHNlZSBob3cgZWZmaWNpZW50bHkgdGhleSdyZSB0ZXN0aW5nIHRoZSBjb21tb24gR1VQIGNvZGUgcGF0aHMuIEFueSBjdXN0b20gcGFnZSBmYXVsdCBoYW5kbGVycyB1c2VkIGhlcmU/IEFueSBpbnRlcmVzdGluZyBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcz8gQXJlIHRoZXkgdXNpbmcga2VybmVsIHRlc3Qgc3VpdGVzIG9yIGEgbW9yZSBhZC1ob2MgYXBwcm9hY2g/IEl0J3MgYWxsIGFib3V0IGVuc3VyaW5nIHRoZSB0ZXN0IGNvdmVyYWdlIGlzIHJvYnVzdCBhbmQgZWZmZWN0aXZlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NTUwLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDU6MTguMzgzOTkyOTk5WiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxNDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmhcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqL1xcbiAgIDI6XFx0I2lmbmRlZiBfX0dVUF9URVNUX0hcXG4gICAzOlxcdCNkZWZpbmUgX19HVVBfVEVTVF9IXFxuICAgNDpcXHRcXG4gICA1OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC90eXBlcy5oXFx1MDAzZVxcbiAgIDY6XFx0XFxuICAgNzpcXHQjZGVmaW5lIEdVUF9GQVNUX0JFTkNITUFSS1xcdF9JT1dSKCdnJywgMSwgc3RydWN0IGd1cF90ZXN0KVxcbiAgIDg6XFx0I2RlZmluZSBQSU5fRkFTVF9CRU5DSE1BUktcXHRfSU9XUignZycsIDIsIHN0cnVjdCBndXBfdGVzdClcXG4gICA5OlxcdCNkZWZpbmUgUElOX0xPTkdURVJNX0JFTkNITUFSS1xcdF9JT1dSKCdnJywgMywgc3RydWN0IGd1cF90ZXN0KVxcbiAgMTA6XFx0I2RlZmluZSBHVVBfQkFTSUNfVEVTVFxcdFxcdF9JT1dSKCdnJywgNCwgc3RydWN0IGd1cF90ZXN0KVxcbiAgMTE6XFx0I2RlZmluZSBQSU5fQkFTSUNfVEVTVFxcdFxcdF9JT1dSKCdnJywgNSwgc3RydWN0IGd1cF90ZXN0KVxcbiAgMTI6XFx0I2RlZmluZSBEVU1QX1VTRVJfUEFHRVNfVEVTVFxcdF9JT1dSKCdnJywgNiwgc3RydWN0IGd1cF90ZXN0KVxcbiAgMTM6XFx0I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVFxcdF9JT1coJ2cnLCA3LCBzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QpXFxuICAxNDpcXHQjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUT1BcXHRfSU8oJ2cnLCA4KVxcbiAgMTU6XFx0I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEXFx0X0lPVygnZycsIDksIF9fdTY0KVxcbiAgMTY6XFx0XFxuICAxNzpcXHQjZGVmaW5lIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QXFx0XFx0OFxcbiAgMTg6XFx0XFxuICAxOTpcXHQjZGVmaW5lIEdVUF9URVNUX0ZMQUdfRFVNUF9QQUdFU19VU0VfUElOXFx0MHgxXFxuICAyMDpcXHRcXG4gIDIxOlxcdHN0cnVjdCBndXBfdGVzdCB7XFxuICAyMjpcXHRcXHRfX3U2NCBnZXRfZGVsdGFfdXNlYztcXG4gIDIzOlxcdFxcdF9fdTY0IHB1dF9kZWx0YV91c2VjO1xcbiAgMjQ6XFx0XFx0X191NjQgYWRkcjtcXG4gIDI1OlxcdFxcdF9fdTY0IHNpemU7XFxuICAyNjpcXHRcXHRfX3UzMiBucl9wYWdlc19wZXJfY2FsbDtcXG4gIDI3OlxcdFxcdF9fdTMyIGd1cF9mbGFncztcXG4gIDI4OlxcdFxcdF9fdTMyIHRlc3RfZmxhZ3M7XFxuICAyOTpcXHRcXHQvKlxcbiAgMzA6XFx0XFx0ICogRWFjaCBub24temVybyBlbnRyeSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBwYWdlICgxLWJhc2VkOiBmaXJzdCBwYWdlIGlzXFxuICAzMTpcXHRcXHQgKiBwYWdlIDEsIHNvIHRoYXQgemVybyBlbnRyaWVzIG1lYW4gXFxcImRvIG5vdGhpbmdcXFwiKSBmcm9tIHRoZSAuYWRkciBiYXNlLlxcbiAgMzI6XFx0XFx0ICovXFxuICAzMzpcXHRcXHRfX3UzMiB3aGljaF9wYWdlc1tHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUF07XFxuICAzNDpcXHR9O1xcbiAgMzU6XFx0XFxuICAzNjpcXHQjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX0ZMQUdfVVNFX1dSSVRFXFx0MVxcbiAgMzc6XFx0I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9GTEFHX1VTRV9GQVNUXFx0XFx0MlxcbiAgMzg6XFx0XFxuICAzOTpcXHRzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3Qge1xcbiAgNDA6XFx0XFx0X191NjQgYWRkcjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDU6MTguMzg0MDU1ODI5WiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjczNTQ3MzI2NzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaDogbW0vZ3VwX3Rlc3QuYyoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBpbiBgbW0vZ3VwX3Rlc3QuY2AgaXMgY2hhbmdpbmcgaG93IGBndXAtXHUwMDNlc2l6ZWAgaXMgY2FsY3VsYXRlZC4gUHJldmlvdXNseSwgaXQgd2FzIGBhZGRyIC0gZ3VwLVx1MDAzZWFkZHJgLCBub3cgaXQncyBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gaW1tZWRpYXRlbHkgY2hlY2sgZm9yIGFueSBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmVzLCBhcyB0aGF0J3MgYSBjbGFzc2ljIEtNU0FOIHJlZCBmbGFnLlxuXG5GaXJzdCwgaXMgdGhlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgKmV4cG9zZWQqPyBObywgdGhlIGBndXBgIHN0cnVjdCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBndXBfdGVzdF9pb2N0bGAsIGFuZCBgY29weV9mcm9tX3VzZXJgIGluaXRpYWxpemVzIHRoZSAqZW50aXJlKiBzdHJ1Y3QgZnJvbSB1c2VyIHNwYWNlLiBFdmVyeSBzaW5nbGUgYnl0ZSBnZXRzIHBvcHVsYXRlZC4gVGhlbiwgYF9fZ3VwX3Rlc3RfaW9jdGxgIG1vZGlmaWVzIGNlcnRhaW4gZmllbGRzIOKAkyBgZ3VwLVx1MDAzZXNpemVgLCB0aW1pbmcgZGF0YSwgYW5kIHBvc3NpYmx5IGFycmF5IGVsZW1lbnRzIHdpdGhpbiBgZ3VwYCBidXQgKmFmdGVyKiB0aGUgYGd1cGAgc3RydWN0IGlzIGluaXRpYWxpemVkLiBGaW5hbGx5LCBgY29weV90b191c2VyYCB3cml0ZXMgdGhlIGVudGlyZSBzdHJ1Y3QgYmFjay4gVGhlIGNoYW5nZSBoZXJlIGlzICpzb2xlbHkqIGhvdyBhbiBpbnRlZ2VyLCBgZ3VwLVx1MDAzZXNpemVgLCBpcyBjYWxjdWxhdGVkLCBiZWZvcmUgYmVpbmcgcmV0dXJuZWQgdG8gdXNlciBzcGFjZS4gSXQgZG9lc24ndCBsZWF2ZSB1bmluaXRpYWxpemVkIGRhdGEgaW4gdGhlIGtlcm5lbC5cblxuU2Vjb25kLCBkb2VzIHRoaXMgbWVzcyB3aXRoIGJ1ZmZlciBzaXplcyBvciBib3VuZHMgY2hlY2tzIGFuZCBwb3RlbnRpYWxseSAqcmVhZCogdW5pbml0aWFsaXplZCBtZW1vcnk/IE5vLiBUaGUgYWxsb2NhdGlvbiBvZiBgbnJfcGFnZXNgIGFuZCBgcGFnZXNgIGhhcHBlbnMgKmJlZm9yZSogdGhlIGxvb3AuIFRoZSBgcGFnZXNgIGFsbG9jYXRpb24gaXMgaW5kZXBlbmRlbnQgYW5kIGBndXAtXHUwMDNlc2l6ZWAgKHBvc3QgY2hhbmdlKSBpc24ndCB1c2VkIGluIGFueSBtZW1vcnkgYWNjZXNzICphZnRlcndhcmRzKi4gVGhlIGNoYW5nZSBpcyBqdXN0IGFib3V0IHRoZSBpbnRlZ2VyIGNhbGN1bGF0aW9uIHRoYXQgcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUgb3BlcmF0aW9uOyBpdCdzIGp1c3QgYmVpbmcgdXBkYXRlZCBhbmQgc2VudCBiYWNrIHRvIHVzZXJzcGFjZS5cblxuU28sIGluIHN1bW1hcnksIGJhc2VkIG9uIG15IHVuZGVyc3RhbmRpbmcsIHRoZXJlIGFyZSAqbm8qIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBubyBpbmZvIGxlYWtzIG9mIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSwgYW5kIG5vIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGRhdGEgYXMgYSBjb25zZXF1ZW5jZSBvZiB0aGlzIHBhdGNoLiBUaGUgc3RydWN0IGlzIGZ1bGx5IGluaXRpYWxpemVkIGZyb20gdXNlciBzcGFjZSwgYW5kIHRoZSBjaGFuZ2Ugc2ltcGx5IGFsdGVycyBob3cgYSBzaW5nbGUgaW50ZWdlciBpcyBjb21wdXRlZCBiZWZvcmUgYmVpbmcgY29waWVkICpiYWNrKiB0byB1c2VyIHNwYWNlLCBpbmRpY2F0aW5nIHRoYXQgdGhpcyBkb2Vzbid0IHdhcnJhbnQgS01TQU4uIFN0YW5kYXJkIGZ1enppbmcgYW5kIG90aGVyIGRldGVjdG9ycyBzaG91bGQgYmUgc3VmZmljaWVudCB0byBpZGVudGlmeSBhbnkgaXNzdWVzLlxuXG5UaGVyZWZvcmUsIGBOZWVkc0tNU0FOYCBpcyBkZWZpbml0ZWx5IGBmYWxzZWAuIFRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDYwOCwiT3V0cHV0VG9rZW5zIjoxODIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MzIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNToyNS43Mzg3OTAyNloiLCJTZXEiOjQ2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NDUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY2hhbmdlcyB0aGUgY2FsY3VsYXRpb24gb2YgYGd1cC1cXHUwMDNlc2l6ZWAgZnJvbSBgYWRkciAtIGd1cC1cXHUwMDNlYWRkcmAgdG8gYG5yX3BhZ2VzICogUEFHRV9TSVpFYCBpbiBgX19ndXBfdGVzdF9pb2N0bCgpYCAoYG1tL2d1cF90ZXN0LmNgKS4gVGhlIGBzdHJ1Y3QgZ3VwX3Rlc3RgIGJ1ZmZlciBpcyBmdWxseSBpbml0aWFsaXplZCB2aWEgYGNvcHlfZnJvbV91c2VyYCBhdCB0aGUgZW50cnkgb2YgYGd1cF90ZXN0X2lvY3RsYCBiZWZvcmUgYmVpbmcgbW9kaWZpZWQgYW5kIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2Ugd2l0aCBgY29weV90b191c2VyYC4gVGhlIGNoYW5nZSBzb2xlbHkgdXBkYXRlcyBhbiBhcml0aG1ldGljIGNhbGN1bGF0aW9uIGZvciBhbiBvdXRwdXQgZmllbGQgcmVwb3J0aW5nIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IHBpbm5lZCBieXRlcy4gSXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBhbGxvY2F0aW9ucywgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSwgb3Iga2VybmVsIGluZm8tbGVha3MuIFRoZXJlZm9yZSwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGNoYW5nZXMgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXFx1MDAzZXNpemVgIGZyb20gYGFkZHIgLSBndXAtXFx1MDAzZWFkZHJgIHRvIGBucl9wYWdlcyAqIFBBR0VfU0laRWAgaW4gYF9fZ3VwX3Rlc3RfaW9jdGwoKWAgKGBtbS9ndXBfdGVzdC5jYCkuIFRoZSBgc3RydWN0IGd1cF90ZXN0YCBidWZmZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYXQgdGhlIGVudHJ5IG9mIGBndXBfdGVzdF9pb2N0bGAgYmVmb3JlIGJlaW5nIG1vZGlmaWVkIGFuZCBjb3BpZWQgYmFjayB0byB1c2VyIHNwYWNlIHdpdGggYGNvcHlfdG9fdXNlcmAuIFRoZSBjaGFuZ2Ugc29sZWx5IHVwZGF0ZXMgYW4gYXJpdGhtZXRpYyBjYWxjdWxhdGlvbiBmb3IgYW4gb3V0cHV0IGZpZWxkIHJlcG9ydGluZyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBwaW5uZWQgYnl0ZXMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMsIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnksIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflow8sx2l[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-31 11:19:26 +0000 UTC FinishedAt: 2026-08-31 12:05:26 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "da6c37ed8beb273e3308e42d4bca3ce11b4432fa", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "GUP_TEST", "DEBUG_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "da6c37ed8beb273e3308e42d4bca3ce11b4432fa", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "GUP_TEST", "DEBUG_FS" ], "series_id": "b3a42e49-3d66-4fbe-9936-92cb2729840d" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "gup_test_ioctl", "__gup_test_ioctl" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0dVUF9URVNUJiMzNDssCiAgICAmIzM0O0RFQlVHX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Z3VwX3Rlc3RfaW9jdGwmIzM0OywKICAgICYjMzQ7X19ndXBfdGVzdF9pb2N0bCYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNoYW5nZXMgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXHUwMDNlc2l6ZWAgZnJvbSBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCB0byBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgIGluIGBfX2d1cF90ZXN0X2lvY3RsKClgIChgbW0vZ3VwX3Rlc3QuY2ApLiBUaGUgYHN0cnVjdCBndXBfdGVzdGAgYnVmZmVyIGlzIGZ1bGx5IGluaXRpYWxpemVkIHZpYSBgY29weV9mcm9tX3VzZXJgIGF0IHRoZSBlbnRyeSBvZiBgZ3VwX3Rlc3RfaW9jdGxgIGJlZm9yZSBiZWluZyBtb2RpZmllZCBhbmQgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRoIGBjb3B5X3RvX3VzZXJgLiBUaGUgY2hhbmdlIHNvbGVseSB1cGRhdGVzIGFuIGFyaXRobWV0aWMgY2FsY3VsYXRpb24gZm9yIGFuIG91dHB1dCBmaWVsZCByZXBvcnRpbmcgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsbHkgcGlubmVkIGJ5dGVzLiBJdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFsbG9jYXRpb25zLCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBvciBrZXJuZWwgaW5mby1sZWFrcy4gVGhlcmVmb3JlLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgX19ndXBfdGVzdF9pb2N0bCgpIGluIG1tL2d1cF90ZXN0LmMgdG8gY29ycmVjdGx5IHNldCB0aGUgcmV0dXJuZWQgc2l6ZSB0byAmIzM5O25yX3BhZ2VzICogUEFHRV9TSVpFJiMzOTsgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgJiMzOTthZGRyIC0gZ3VwLVx1MDAzZWFkZHImIzM5OyB3aGljaCBjb3VsZCBiZSBpbmNvcnJlY3QgaWYgZ2V0X3VzZXJfcGFnZXMvcGluX3VzZXJfcGFnZXMgdGVybWluYXRlZCBlYXJseS4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGlvY3RsIGludGVyZmFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDJhNzM1Njg4ZWE2YmU3YWYyZDM1M2Q5YjljOTAzMjM2MGVmNmFiM2JcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAzMSAxMjowMTowNiAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xuaW5kZXggNDRjMWNkZmI5YzM3MS4uMTg1YmEzYmI4ZWQxMCAxMDA2NDRcbi0tLSBhL21tL2d1cF90ZXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL21tL2d1cF90ZXN0LmNcbkBAIC0xODgsNyAmIzQzOzE4OCw3IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIFx0bnJfcGFnZXMgPSBpO1xuIFxuIFx0Z3VwLVx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuLVx0Z3VwLVx1MDAzZXNpemUgPSBhZGRyIC0gZ3VwLVx1MDAzZWFkZHI7XG4mIzQzO1x0Z3VwLVx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcbiBcbiBcdC8qXG4gXHQgKiBUYWtlIGFuIHVuLWJlbmNobWFyay10aW1lZCBtb21lbnQgdG8gdmVyaWZ5IERNQSBwaW5uZWRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4zbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtHVVBfVEVTVCYjMzQ7LAogICAgJiMzNDtERUJVR19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2d1cF90ZXN0X2lvY3RsJiMzNDssCiAgICAmIzM0O19fZ3VwX3Rlc3RfaW9jdGwmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggdXBkYXRlcyBfX2d1cF90ZXN0X2lvY3RsKCkgaW4gbW0vZ3VwX3Rlc3QuYyB0byBjb3JyZWN0bHkgc2V0IHRoZSByZXR1cm5lZCBzaXplIHRvICYjMzk7bnJfcGFnZXMgKiBQQUdFX1NJWkUmIzM5OyByYXRoZXIgdGhhbiBjYWxjdWxhdGluZyAmIzM5O2FkZHIgLSBndXAtXHUwMDNlYWRkciYjMzk7IHdoaWNoIGNvdWxkIGJlIGluY29ycmVjdCBpZiBnZXRfdXNlcl9wYWdlcy9waW5fdXNlcl9wYWdlcyB0ZXJtaW5hdGVkIGVhcmx5LiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW9jdGwgaW50ZXJmYWNlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMmE3MzU2ODhlYTZiZTdhZjJkMzUzZDliOWM5MDMyMzYwZWY2YWIzYgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gQXVnIDMxIDEyOjAxOjA2IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vZ3VwX3Rlc3QuYyBiL21tL2d1cF90ZXN0LmMKaW5kZXggNDRjMWNkZmI5YzM3MS4uMTg1YmEzYmI4ZWQxMCAxMDA2NDQKLS0tIGEvbW0vZ3VwX3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9ndXBfdGVzdC5jCkBAIC0xODgsNyAmIzQzOzE4OCw3IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLAogCW5yX3BhZ2VzID0gaTsKIAogCWd1cC0mZ3Q7Z2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7Ci0JZ3VwLSZndDtzaXplID0gYWRkciAtIGd1cC0mZ3Q7YWRkcjsKJiM0MzsJZ3VwLSZndDtzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7CiAKIAkvKgogCSAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDcwCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjM2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBhIEtlcm5lbCBQYXRjaDogZ3VwX3Rlc3QuYyoqCgpPa2F5LCBzbyB0aGUgdXNlciB3YW50cyBtZSB0byB0YWtlIGEgbG9vayBhdCBhIHBhdGNoLCBzcGVjaWZpY2FsbHkgYSBgZGlmZmAgZm9yIGBtbS9ndXBfdGVzdC5jYC4gVGhlIGNvcmUgc2VlbXMgdG8gYmUgcmVsYXRlZCB0byBgZ3VwYCB0ZXN0aW5nLCB3aGljaCBsaWtlbHkgcGVydGFpbnMgdG8gJiMzNDtnZXQgdXNlciBwYWdlcyYjMzQ7IG9yIGEgc2ltaWxhciBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHF1aWNrbHkgdW5kZXJzdGFuZCB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZS4gTGV0JiMzOTtzIHNlZS4uLiBhIGNvbW1pdCwgYW5kIHRoZSBkaWZmIHNob3dzIGEgbW9kaWZpY2F0aW9uIGFyb3VuZCBsaW5lIDE4OC4KCkkgc2VlIGEgY2hhbmdlIHdoZXJlIHRoZSBjYWxjdWxhdGlvbiBvZiBgZ3VwLSZndDtzaXplYCBoYXMgYmVlbiBtb2RpZmllZC4gUHJldmlvdXNseSwgaXQgd2FzIGBhZGRyIC0gZ3VwLSZndDthZGRyYCwgYnV0IG5vdyBpdCYjMzk7cyBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgLiBBaCwgSSBzZWUhIEJlZm9yZSBpdCB3YXMgcHJlc3VtYWJseSBjYWxjdWxhdGluZyB0aGUgc2l6ZSBiYXNlZCBvbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzdGFydGluZyBhZGRyZXNzIGFuZCB0aGUgZW5kaW5nIGFkZHJlc3MsIGFuZCBub3csIGl0JiMzOTtzIGV4cGxpY2l0bHkgY29tcHV0aW5nIGl0IGJ5IG11bHRpcGx5aW5nIHRoZSBudW1iZXIgb2YgcGFnZXMgYnkgdGhlIHBhZ2Ugc2l6ZS4gVGhpcyBpcyBwcm9iYWJseSBhbiBpbXByb3ZlbWVudCBmb3IgY2xhcml0eSBhbmQgYWNjdXJhY3kuIEl0IHN0cm9uZ2x5IHN1Z2dlc3RzIHRoYXQgdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uIHdhcyBwcm9uZSB0byBlcnJvcnMsIHBvc3NpYmx5IGR1ZSB0byBhbGlnbm1lbnQgaXNzdWVzIG9yIGFuIGluY29ycmVjdCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYnVmZmVyIGJvdW5kYXJpZXMsIG9yLCBwZXJoYXBzLCB3YXMgbWlzbGVhZGluZy4gTm93LCBpdCYjMzk7cyBkaXJlY3RseSBkZXJpdmVkIGZyb20gdGhlIG51bWJlciBvZiBwYWdlcywgd2hpY2ggaXMgY2xlYW5lciBhbmQgbW9yZSByb2J1c3QuCgpJJiMzOTtsbCBoYXZlIHRvIGludmVzdGlnYXRlIGlmIHRoaXMgaXMgYSBjb3JyZWN0aW9uIG9mIGEgZGVmZWN0LCBvciBzaW1wbHkgYW4gaW1wcm92ZW1lbnQuIExldCYjMzk7cyBzZWUsIHdoYXQgZWxzZSBkb2VzIHRoZSBwYXRjaCB0b3VjaC4uLiBUaGUgc3Vycm91bmRpbmcgY29kZSBzZWVtcyByZWxhdGVkIHRvIGJlbmNobWFya2luZyB0aGUgZ2V0X3VzZXJfcGFnZXMgZnVuY3Rpb25hbGl0eSBhbmQgdmVyaWZ5aW5nIERNQS1waW5uZWQgcGFnZXMsIHByb2JhYmx5IGZvciBwZXJmb3JtYW5jZS4gSSBleHBlY3QgdGhpcyBjaGFuZ2Ugd2lsbCBtYWtlIHRoZSBiZW5jaG1hcmtzIG1vcmUgcHJlY2lzZS4gVGhpcyBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSBhbmQgcHJvYmFibHkgYSBnb29kIGNoYW5nZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE3MDpcdFx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNzE6XHRcdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4gMTcyOlx0XHRcdFx0ZWxzZVxuIDE3MzpcdFx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNzQ6XHRcdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4gMTc1Olx0XHRcdFx0YnJlYWs7XG4gMTc2Olx0XHRcdGRlZmF1bHQ6XG4gMTc3Olx0XHRcdFx0cmV0ID0gLUVJTlZBTDtcbiAxNzg6XHRcdFx0XHRnb3RvIHVubG9jaztcbiAxNzk6XHRcdFx0fVxuIDE4MDpcdFxuIDE4MTpcdFx0XHRpZiAobnIgXHUwMDNjPSAwKVxuIDE4MjpcdFx0XHRcdGJyZWFrO1xuIDE4MzpcdFx0XHRpICYjNDM7PSBucjtcbiAxODQ6XHRcdH1cbiAxODU6XHRcdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XG4gMTg2Olx0XG4gMTg3Olx0XHQvKiBTaGlmdGluZyB0aGUgbWVhbmluZyBvZiBucl9wYWdlczogbm93IGl0IGlzIGFjdHVhbCBudW1iZXIgcGlubmVkOiAqL1xuIDE4ODpcdFx0bnJfcGFnZXMgPSBpO1xuIDE4OTpcdFxuIDE5MDpcdFx0Z3VwLVx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuIDE5MTpcdFx0Z3VwLVx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcbiAxOTI6XHRcbiAxOTM6XHRcdC8qXG4gMTk0Olx0XHQgKiBUYWtlIGFuIHVuLWJlbmNobWFyay10aW1lZCBtb21lbnQgdG8gdmVyaWZ5IERNQSBwaW5uZWRcbiAxOTU6XHRcdCAqIHN0YXRlOiBwcmludCBhIHdhcm5pbmcgaWYgYW55IG5vbi1kbWEtcGlubmVkIHBhZ2VzIGFyZSBmb3VuZDpcbiAxOTY6XHRcdCAqL1xuIDE5NzpcdFx0dmVyaWZ5X2RtYV9waW5uZWQoY21kLCBwYWdlcywgbnJfcGFnZXMpO1xuIDE5ODpcdFxuIDE5OTpcdFx0aWYgKGNtZCA9PSBEVU1QX1VTRVJfUEFHRVNfVEVTVClcbiAyMDA6XHRcdFx0ZHVtcF9wYWdlc190ZXN0KGd1cCwgcGFnZXMsIG5yX3BhZ2VzKTtcbiAyMDE6XHRcbiAyMDI6XHRcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcbiAyMDM6XHRcbiAyMDQ6XHRcdHB1dF9iYWNrX3BhZ2VzKGNtZCwgcGFnZXMsIG5yX3BhZ2VzLCBndXAtXHUwMDNldGVzdF9mbGFncyk7XG4gMjA1Olx0XG4gMjA2Olx0XHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xuIDIwNzpcdFx0Z3VwLVx1MDAzZXB1dF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuIDIwODpcdFxuIDIwOTpcdHVubG9jazpcbiAyMTA6XHRcdGlmIChuZWVkc19tbWFwX2xvY2spXG4gMjExOlx0XHRcdG1tYXBfcmVhZF91bmxvY2soY3VycmVudC1cdTAwM2VtbSk7XG4gMjEyOlx0ZnJlZV9wYWdlczpcbiAyMTM6XHRcdGt2ZnJlZShwYWdlcyk7XG4gMjE0Olx0XHRyZXR1cm4gcmV0O1xuIDIxNTpcdH1cbiAyMTY6XHRcbiAyMTc6XHRzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcbiAyMTg6XHR7XG4gMjE5Olx0XHRpZiAoZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcykge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM0MDYKCQkJCQkJCW91dHB1dDogMjUKCQkJCQkJCXRob3VnaHRzOiA0MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLgoKKipFeGFtaW5pbmcgYGd1cF90ZXN0LmNgKioKCkFscmlnaHQsIG15IGZpcnN0IGluc3RpbmN0IGlzIHRvIGdldCBhIGhhbmRsZSBvbiBgZ3VwX3Rlc3QuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBmaWxlIGlzIGFib3V0LCBhbmQgdGhlIGJlc3Qgd2F5IHRvIHN0YXJ0IGlzIGJ5IGEgcXVpY2sgc2Nhbi4gTGV0JiMzOTtzIHNlZSB3aGF0IHdlIGhhdmUgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSwgYW5kIHRoZW4gSSYjMzk7bGwgcXVpY2tseSBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyB0byBzZWUgd2hlcmUgaXQmIzM5O3MgZGVmaW5lZCBhbmQgd2hhdCBjb25maWd1cmF0aW9ucyBtaWdodCBlbmFibGUgaXQuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGluaXRpYWwgY29udGV4dC4gRnJvbSB0aGVyZSwgSSBjYW4gZGVjaWRlIGhvdyBkZWVwIEkgbmVlZCB0byBnbyBiYXNlZCBvbiB3aGF0IEkmIzM5O20gdHJ5aW5nIHRvIGFjY29tcGxpc2gsIGJ1dCB0aGlzIGlzIHRoZSByaWdodCBzdGFydGluZyBwb2ludCBmb3IgYW55IGdvb2QgaW52ZXN0aWdhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtHVVBfVEVTVCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9MTI4Mj1jb25maWcgUEVSQ1BVX1NUQVRTXG4tLVxubW0vS2NvbmZpZy0xMjg4LVxubW0vS2NvbmZpZzoxMjg5OmNvbmZpZyBHVVBfVEVTVFxubW0vS2NvbmZpZy0xMjkwLVx0Ym9vbCBcJiMzNDtFbmFibGUgaW5mcmFzdHJ1Y3R1cmUgZm9yIGdldF91c2VyX3BhZ2VzKCktcmVsYXRlZCB1bml0IHRlc3RzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy0xMzA4LVxubW0vS2NvbmZpZzoxMzA5OmNvbW1lbnQgXCYjMzQ7R1VQX1RFU1QgbmVlZHMgdG8gaGF2ZSBERUJVR19GUyBlbmFibGVkXCYjMzQ7XG5tbS9LY29uZmlnOjEzMTA6XHRkZXBlbmRzIG9uICFHVVBfVEVTVCBcdTAwMjZcdTAwMjYgIURFQlVHX0ZTXG5tbS9LY29uZmlnLTEzMTEtXG4tLVxubW0vTWFrZWZpbGU9MTA5PW9iai0kKENPTkZJR19DR1JPVVBfSFVHRVRMQikgJiM0Mzs9IGh1Z2V0bGJfY2dyb3VwLm9cbm1tL01ha2VmaWxlOjExMDpvYmotJChDT05GSUdfR1VQX1RFU1QpICYjNDM7PSBndXBfdGVzdC5vXG5tbS9NYWtlZmlsZS0xMTEtb2JqLSQoQ09ORklHX0RNQVBPT0xfVEVTVCkgJiM0Mzs9IGRtYXBvb2xfdGVzdC5vXG4tLVxubW0vZ3VwX3Rlc3QuYz0xNz1zdGF0aWMgdm9pZCBwdXRfYmFja19wYWdlcyh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuLS1cbm1tL2d1cF90ZXN0LmMtMzQtXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxubW0vZ3VwX3Rlc3QuYzozNTpcdFx0aWYgKGd1cF90ZXN0X2ZsYWdzIFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTikge1xubW0vZ3VwX3Rlc3QuYy0zNi1cdFx0XHR1bnBpbl91c2VyX3BhZ2VzKHBhZ2VzLCBucl9wYWdlcyk7XG4tLVxubW0vZ3VwX3Rlc3QuYz03Nj1zdGF0aWMgdm9pZCBkdW1wX3BhZ2VzX3Rlc3Qoc3RydWN0IGd1cF90ZXN0ICpndXAsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4tLVxubW0vZ3VwX3Rlc3QuYy04NS1cdCAqL1xubW0vZ3VwX3Rlc3QuYzo4NjpcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpJiM0MzsmIzQzOykge1xubW0vZ3VwX3Rlc3QuYy04Ny1cdFx0aWYgKGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXSBcdTAwM2UgbnJfcGFnZXMpIHtcbi0tXG5tbS9ndXBfdGVzdC5jLTkzLVxubW0vZ3VwX3Rlc3QuYzo5NDpcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpJiM0MzsmIzQzOykge1xubW0vZ3VwX3Rlc3QuYy05NS1cdFx0aW5kZXhfdG9fZHVtcCA9IGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXTtcbi0tXG5tbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbi0tXG5tbS9ndXBfdGVzdC5jLTE2OC1cdFx0Y2FzZSBEVU1QX1VTRVJfUEFHRVNfVEVTVDpcbm1tL2d1cF90ZXN0LmM6MTY5Olx0XHRcdGlmIChndXAtXHUwMDNldGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXG5tbS9ndXBfdGVzdC5jLTE3MC1cdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cdTAwM2VndXBfZmxhZ3MsXG4tLVxubW0vZ3VwX3Rlc3QuaC0xLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyICovXG5tbS9ndXBfdGVzdC5oOjI6I2lmbmRlZiBfX0dVUF9URVNUX0hcbm1tL2d1cF90ZXN0Lmg6MzojZGVmaW5lIF9fR1VQX1RFU1RfSFxubW0vZ3VwX3Rlc3QuaC00LVxuLS1cbm1tL2d1cF90ZXN0LmgtMTYtXG5tbS9ndXBfdGVzdC5oOjE3OiNkZWZpbmUgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVBcdFx0OFxubW0vZ3VwX3Rlc3QuaC0xOC1cbm1tL2d1cF90ZXN0Lmg6MTk6I2RlZmluZSBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTlx0MHgxXG5tbS9ndXBfdGVzdC5oLTIwLVxubW0vZ3VwX3Rlc3QuaD0yMT1zdHJ1Y3QgZ3VwX3Rlc3Qge1xuLS1cbm1tL2d1cF90ZXN0LmgtMzItXHQgKi9cbm1tL2d1cF90ZXN0Lmg6MzM6XHRfX3UzMiB3aGljaF9wYWdlc1tHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUF07XG5tbS9ndXBfdGVzdC5oLTM0LX07XG4tLVxubW0vZ3VwX3Rlc3QuaD0zOT1zdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3Qge1xuLS1cbm1tL2d1cF90ZXN0LmgtNDQtXG5tbS9ndXBfdGVzdC5oOjQ1OiNlbmRpZlx0LyogX19HVVBfVEVTVF9IICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDY3MgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaWdnaW5nIGludG8gS2VybmVsIENvbmZpZ3VyYXRpb24gZm9yIEdVUF9URVNUKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhpcyBgR1VQX1RFU1RgIHRoaW5nIGlzIGFuZCBob3cgaXQmIzM5O3MgdXNlZC4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gZGl2ZSBpbnRvIHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gR2l2ZW4gbXkgZXhwZXJpZW5jZSB3aXRoIGtlcm5lbCBjb25maWd1cmF0aW9uLCBJJiMzOTttIGJldHRpbmcgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgdGhlIGRlcGVuZGVuY2llcyBhbmQgYSBwb3RlbnRpYWwgZGVmaW5pdGlvbiwgd2lsbCBiZSBhcm91bmQgbGluZSAxMjg5LiBUaGF0JiMzOTtzIGEgcmVhc29uYWJsZSBzcG90IHRvIHN0YXJ0IHNpbmNlIEtjb25maWcgZmlsZXMgdGVuZCB0byBiZSBvcmdhbml6ZWQgbG9naWNhbGx5LiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgY2FuIHVuY292ZXIgYWJvdXQgYEdVUF9URVNUYCBpbiB0aGF0IHNlY3Rpb24uIEhvcGVmdWxseSwgSSBjYW4gcXVpY2tseSBncmFzcCBpdHMgcHVycG9zZSBhbmQgYW55IGNvbmRpdGlvbnMgdGhhdCBkaWN0YXRlIGl0cyBhdmFpbGFiaWxpdHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTI4NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMjg1Olx0XHQgIFRoaXMgZmVhdHVyZSBjb2xsZWN0cyBhbmQgZXhwb3NlcyBzdGF0aXN0aWNzIHZpYSBkZWJ1Z2ZzLiBUaGVcbjEyODY6XHRcdCAgaW5mb3JtYXRpb24gaW5jbHVkZXMgZ2xvYmFsIGFuZCBwZXIgY2h1bmsgc3RhdGlzdGljcywgd2hpY2ggY2FuXG4xMjg3Olx0XHQgIGJlIHVzZWQgdG8gaGVscCB1bmRlcnN0YW5kIHBlcmNwdSBtZW1vcnkgdXNhZ2UuXG4xMjg4Olx0XG4xMjg5Olx0Y29uZmlnIEdVUF9URVNUXG4xMjkwOlx0XHRib29sIFwmIzM0O0VuYWJsZSBpbmZyYXN0cnVjdHVyZSBmb3IgZ2V0X3VzZXJfcGFnZXMoKS1yZWxhdGVkIHVuaXQgdGVzdHNcJiMzNDtcbjEyOTE6XHRcdGRlcGVuZHMgb24gREVCVUdfRlNcbjEyOTI6XHRcdGhlbHBcbjEyOTM6XHRcdCAgUHJvdmlkZXMgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QsIHdoaWNoIGluIHR1cm4gcHJvdmlkZXMgYSB3YXlcbjEyOTQ6XHRcdCAgdG8gbWFrZSBpb2N0bCBjYWxscyB0aGF0IGNhbiBsYXVuY2gga2VybmVsLWJhc2VkIHVuaXQgdGVzdHMgZm9yXG4xMjk1Olx0XHQgIHRoZSBnZXRfdXNlcl9wYWdlcyooKSBhbmQgcGluX3VzZXJfcGFnZXMqKCkgZmFtaWx5IG9mIEFQSSBjYWxscy5cbjEyOTY6XHRcbjEyOTc6XHRcdCAgVGhlc2UgdGVzdHMgaW5jbHVkZSBiZW5jaG1hcmsgdGVzdGluZyBvZiB0aGUgX2Zhc3QgdmFyaWFudHMgb2ZcbjEyOTg6XHRcdCAgZ2V0X3VzZXJfcGFnZXMqKCkgYW5kIHBpbl91c2VyX3BhZ2VzKigpLCBhcyB3ZWxsIGFzIHNtb2tlIHRlc3RzIG9mXG4xMjk5Olx0XHQgIHRoZSBub24tX2Zhc3QgdmFyaWFudHMuXG4xMzAwOlx0XG4xMzAxOlx0XHQgIFRoZXJlIGlzIGFsc28gYSBzdWItdGVzdCB0aGF0IGFsbG93cyBydW5uaW5nIGR1bXBfcGFnZSgpIG9uIGFueVxuMTMwMjpcdFx0ICBvZiB1cCB0byBlaWdodCBwYWdlcyAoc2VsZWN0ZWQgYnkgY29tbWFuZCBsaW5lIGFyZ3MpIHdpdGhpbiB0aGVcbjEzMDM6XHRcdCAgcmFuZ2Ugb2YgdXNlci1zcGFjZSBhZGRyZXNzZXMuIFRoZXNlIHBhZ2VzIGFyZSBlaXRoZXIgcGlubmVkIHZpYVxuMTMwNDpcdFx0ICBwaW5fdXNlcl9wYWdlcyooKSwgb3IgcGlubmVkIHZpYSBnZXRfdXNlcl9wYWdlcyooKSwgYXMgc3BlY2lmaWVkXG4xMzA1Olx0XHQgIGJ5IG90aGVyIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuXG4xMzA2Olx0XG4xMzA3Olx0XHQgIFNlZSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jXG4xMzA4Olx0XG4xMzA5Olx0Y29tbWVudCBcJiMzNDtHVVBfVEVTVCBuZWVkcyB0byBoYXZlIERFQlVHX0ZTIGVuYWJsZWRcJiMzNDtcbjEzMTA6XHRcdGRlcGVuZHMgb24gIUdVUF9URVNUIFx1MDAyNlx1MDAyNiAhREVCVUdfRlNcbjEzMTE6XHRcbjEzMTI6XHRjb25maWcgR1VQX0dFVF9QWFhfTE9XX0hJR0hcbjEzMTM6XHRcdGJvb2xcbjEzMTQ6XHRcbjEzMTU6XHRjb25maWcgRE1BUE9PTF9URVNUXG4xMzE2Olx0XHR0cmlzdGF0ZSBcJiMzNDtFbmFibGUgYSBtb2R1bGUgdG8gcnVuIHRpbWUgdGVzdHMgb24gZG1hX3Bvb2xcJiMzNDtcbjEzMTc6XHRcdGRlcGVuZHMgb24gSEFTX0RNQVxuMTMxODpcdFx0aGVscFxuMTMxOTpcdFx0ICBQcm92aWRlcyBhIHRlc3QgbW9kdWxlIHRoYXQgd2lsbCBhbGxvY2F0ZSBhbmQgZnJlZSBtYW55IGJsb2NrcyBvZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU0NzAKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGNvbW1pdCBhbmQgZmlndXJlIG91dCB3aGF0JiMzOTtzIGNoYW5nZWQgd2l0aGluIGBtbS9ndXBfdGVzdC5jYC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRoZSBgX19ndXBfdGVzdF9pb2N0bGAgZnVuY3Rpb24uIEkgbmVlZCBhIHNvbGlkIHVuZGVyc3RhbmRpbmcgb2YgaG93IGl0IG9wZXJhdGVzIGFuZCB3aGVyZSB0aGUgbW9kaWZpY2F0aW9ucyB3ZXJlIG1hZGUuIEkmIzM5O20gZ29pbmcgdG8gY2FyZWZ1bGx5IGRpc3NlY3QgaXRzIGVudGlyZSBzdHJ1Y3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vZ3VwX3Rlc3QuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEwNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDEwNTpcdH1cbiAxMDY6XHRcbiAxMDc6XHRzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbiAxMDg6XHRcdFx0c3RydWN0IGd1cF90ZXN0ICpndXApXG4gMTA5Olx0e1xuIDExMDpcdFx0a3RpbWVfdCBzdGFydF90aW1lLCBlbmRfdGltZTtcbiAxMTE6XHRcdHVuc2lnbmVkIGxvbmcgaSwgbnJfcGFnZXMsIGFkZHIsIG5leHQ7XG4gMTEyOlx0XHRsb25nIG5yO1xuIDExMzpcdFx0c3RydWN0IHBhZ2UgKipwYWdlcztcbiAxMTQ6XHRcdHVuc2lnbmVkIGxvbmcgZW5kO1xuIDExNTpcdFx0aW50IHJldCA9IDA7XG4gMTE2Olx0XHRib29sIG5lZWRzX21tYXBfbG9jayA9XG4gMTE3Olx0XHRcdGNtZCAhPSBHVVBfRkFTVF9CRU5DSE1BUksgXHUwMDI2XHUwMDI2IGNtZCAhPSBQSU5fRkFTVF9CRU5DSE1BUks7XG4gMTE4Olx0XG4gMTE5Olx0XHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYKVxuIDEyMDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjE6XHRcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG4gMTIyOlx0XHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxuIDEyMzpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjQ6XHRcbiAxMjU6XHRcdG5yX3BhZ2VzID0gZ3VwLVx1MDAzZXNpemUgLyBQQUdFX1NJWkU7XG4gMTI2Olx0XHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XG4gMTI3Olx0XHRpZiAoIXBhZ2VzKVxuIDEyODpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAxMjk6XHRcbiAxMzA6XHRcdGlmIChuZWVkc19tbWFwX2xvY2sgXHUwMDI2XHUwMDI2IG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKGN1cnJlbnQtXHUwMDNlbW0pKSB7XG4gMTMxOlx0XHRcdHJldCA9IC1FSU5UUjtcbiAxMzI6XHRcdFx0Z290byBmcmVlX3BhZ2VzO1xuIDEzMzpcdFx0fVxuIDEzNDpcdFxuIDEzNTpcdFx0aSA9IDA7XG4gMTM2Olx0XHRuciA9IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcbiAxMzc6XHRcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcbiAxMzg6XHRcdGZvciAoYWRkciA9IGd1cC1cdTAwM2VhZGRyOyBhZGRyIFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XG4gMTM5Olx0XHRcdGlmIChuciAhPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwpXG4gMTQwOlx0XHRcdFx0YnJlYWs7XG4gMTQxOlx0XG4gMTQyOlx0XHRcdG5leHQgPSBhZGRyICYjNDM7IG5yICogUEFHRV9TSVpFO1xuIDE0MzpcdFx0XHRpZiAobmV4dCBcdTAwM2UgZW5kKSB7XG4gMTQ0Olx0XHRcdFx0bmV4dCA9IGVuZDtcbiAxNDU6XHRcdFx0XHRuciA9IChuZXh0IC0gYWRkcikgLyBQQUdFX1NJWkU7XG4gMTQ2Olx0XHRcdH1cbiAxNDc6XHRcbiAxNDg6XHRcdFx0c3dpdGNoIChjbWQpIHtcbiAxNDk6XHRcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4gMTUwOlx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1MTpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTI6XHRcdFx0XHRicmVhaztcbiAxNTM6XHRcdFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcbiAxNTQ6XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNTU6XHRcdFx0XHRicmVhaztcbiAxNTY6XHRcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMTU3Olx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE1ODpcdFx0XHRcdFx0XHRcdCBwYWdlcyAmIzQzOyBpKTtcbiAxNTk6XHRcdFx0XHRicmVhaztcbiAxNjA6XHRcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAxNjE6XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyAmIzQzOyBpKTtcbiAxNjI6XHRcdFx0XHRicmVhaztcbiAxNjM6XHRcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxuIDE2NDpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXG4gMTY1Olx0XHRcdFx0XHRcdCAgICBndXAtXHUwMDNlZ3VwX2ZsYWdzIHwgRk9MTF9MT05HVEVSTSxcbiAxNjY6XHRcdFx0XHRcdFx0ICAgIHBhZ2VzICYjNDM7IGkpO1xuIDE2NzpcdFx0XHRcdGJyZWFrO1xuIDE2ODpcdFx0XHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxuIDE2OTpcdFx0XHRcdGlmIChndXAtXHUwMDNldGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXG4gMTcwOlx0XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3MTpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzI6XHRcdFx0XHRlbHNlXG4gMTczOlx0XHRcdFx0XHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXHUwMDNlZ3VwX2ZsYWdzLFxuIDE3NDpcdFx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNzU6XHRcdFx0XHRicmVhaztcbiAxNzY6XHRcdFx0ZGVmYXVsdDpcbiAxNzc6XHRcdFx0XHRyZXQgPSAtRUlOVkFMO1xuIDE3ODpcdFx0XHRcdGdvdG8gdW5sb2NrO1xuIDE3OTpcdFx0XHR9XG4gMTgwOlx0XG4gMTgxOlx0XHRcdGlmIChuciBcdTAwM2M9IDApXG4gMTgyOlx0XHRcdFx0YnJlYWs7XG4gMTgzOlx0XHRcdGkgJiM0Mzs9IG5yO1xuIDE4NDpcdFx0fVxuIDE4NTpcdFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcbiAxODY6XHRcbiAxODc6XHRcdC8qIFNoaWZ0aW5nIHRoZSBtZWFuaW5nIG9mIG5yX3BhZ2VzOiBub3cgaXQgaXMgYWN0dWFsIG51bWJlciBwaW5uZWQ6ICovXG4gMTg4Olx0XHRucl9wYWdlcyA9IGk7XG4gMTg5Olx0XG4gMTkwOlx0XHRndXAtXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XG4gMTkxOlx0XHRndXAtXHUwMDNlc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuIDE5MjpcdFxuIDE5MzpcdFx0LypcbiAxOTQ6XHRcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxuIDE5NTpcdFx0ICogc3RhdGU6IHByaW50IGEgd2FybmluZyBpZiBhbnkgbm9uLWRtYS1waW5uZWQgcGFnZXMgYXJlIGZvdW5kOlxuIDE5NjpcdFx0ICovXG4gMTk3Olx0XHR2ZXJpZnlfZG1hX3Bpbm5lZChjbWQsIHBhZ2VzLCBucl9wYWdlcyk7XG4gMTk4Olx0XG4gMTk5Olx0XHRpZiAoY21kID09IERVTVBfVVNFUl9QQUdFU19URVNUKVxuIDIwMDpcdFx0XHRkdW1wX3BhZ2VzX3Rlc3QoZ3VwLCBwYWdlcywgbnJfcGFnZXMpO1xuIDIwMTpcdFxuIDIwMjpcdFx0c3RhcnRfdGltZSA9IGt0aW1lX2dldCgpO1xuIDIwMzpcdFxuIDIwNDpcdFx0cHV0X2JhY2tfcGFnZXMoY21kLCBwYWdlcywgbnJfcGFnZXMsIGd1cC1cdTAwM2V0ZXN0X2ZsYWdzKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzE0NwoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDMzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgR1VQIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEJlZm9yZSB0aGUgcGF0Y2gsIHRoZSBjb2RlIHdhcyBpdGVyYXRpbmcgdGhyb3VnaCBhIG1lbW9yeSByZWdpb24uIFRoZSBjb3JlIG9mIHRoZSBwcm9ibGVtIHNlZW1zIHRvIGxpZSB3aXRoaW4gdGhpcyBsb29wOiBgZm9yIChhZGRyID0gZ3VwLSZndDthZGRyOyBhZGRyICZsdDsgZW5kOyBhZGRyID0gbmV4dCkge2AuIFRoZSBjcml0aWNhbCB0aGluZyBoZXJlIGlzIGhvdyBgYWRkcmAgaXMgdXBkYXRlZC4gQXQgdGhlIGVuZCBvZiBlYWNoIGl0ZXJhdGlvbiwgYGFkZHJgIGlzIHNldCB0byBgbmV4dGAuIFRoaXMgaXMgd2hlcmUgdGhlIGlzc3VlIHN1cmZhY2VzLgoKSWYgdGhlIGxvb3AgdGVybWluYXRlcyBwcmVtYXR1cmVseSDigJMgbWF5YmUgYmVjYXVzZSBgbnJgICh0aGUgbnVtYmVyIG9mIHBhZ2VzIHBpbm5lZCBpbiB0aGUgY3VycmVudCBjaHVuaykgYmVjYW1lIHplcm8gb3IgbGVzcywgb3IgYmVjYXVzZSBpdCBkaWRuJiMzOTt0IG1hdGNoIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgcGFnZXMgZm9yIHRoZSBjdXJyZW50IGNhbGwg4oCTIGBhZGRyYCBlbmRzIHVwIHBvaW50aW5nIHRvIHRoZSAqYmVnaW5uaW5nKiBvZiB0aGUgbGFzdCBwcm9jZXNzZWQgY2h1bmssIG5vdCB0aGUgZW5kIG9mIHRoZSBwaW5uZWQgcmVnaW9uLiBTcGVjaWZpY2FsbHksIGBhZGRyYCBpcyBvbmx5IHVwZGF0ZWQgdG8gYG5leHRgIHdoZW4gdGhlIGxvb3AgY29udGludWVzLiBXaXRoaW4gdGhlIGxvb3AsIGBuZXh0YCBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIGBhZGRyYCwgdGhlIGN1cnJlbnQgaXRlcmF0aW9uJiMzOTtzIGFkZHJlc3MsIGFuZCBgbnJgLiBJIHNlZSBub3c6IGBuZXh0ID0gYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRTtgIGFuZCB0aGVuIGBuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIC4uLik7YC4gQW5kIHRoZW4gdGhlIGNydWNpYWwgY2hlY2s6IGBpZiAobnIgJmx0Oz0gMCkgYnJlYWs7YC4KClNvLCBgYWRkcmAgcmV0YWlucyB0aGUgKnN0YXJ0KiBhZGRyZXNzIG9mIHRoYXQgbGFzdCBjaHVuayBhdCB0aGUgZW5kIG9mIHRoZSBsb29wLCByaWdodD8gV2hlcmVhcywgYGlgIC0gdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZSBpcyB0cmFja2luZyB0aGUgYWN0dWFsIG51bWJlciBvZiBwYWdlcyBwaW5uZWQgc28gZmFyLiBUaGlzIG1lYW5zIGBhZGRyIC0gZ3VwLSZndDthZGRyYCBpcyB0b3RhbGx5IHdyb25nLCBhbmQgdGhhdCYjMzk7cyB0aGUgY2FsY3VsYXRlZCBzaXplLiBUaGF0JiMzOTtzIGEgY2xhc3NpYyBvZmYtYnktb25lIG9yIG9mZi1ieS1jaHVuayBpc3N1ZS4gYGd1cC0mZ3Q7c2l6ZWAgcmV0dXJuZWQgdG8gdXNlcnNwYWNlIHdhcyBjYWxjdWxhdGVkIHVzaW5nIHRoaXMgaW5jb3JyZWN0IGBhZGRyIC0gZ3VwLSZndDthZGRyYCwgbGVhZGluZyB0byBhIHNpemUgbWlzbWF0Y2ggd2l0aCB0aGUgYWN0dWFsIG51bWJlciBvZiBwaW5uZWQgcGFnZXMuIFRoZSBrZXkgaXMgdGhhdCBgZ3VwLSZndDtzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7YCBub3cgcHJvdmlkZXMgYW4gYWNjdXJhdGUgc2l6ZSBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBwaW5uZWQgcGFnZXMuCgpBbHJpZ2h0LCBsZXQmIzM5O3Mgc3RlcCBiYWNrIGFuZCBzZWUgaG93IHRoaXMgaXMgYWN0dWFsbHkgaW52b2tlZC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBpbnRlcmFjdGlvbnMgd2l0aCB0aGlzIGNvZGUuIExldCBtZSBjaGVjayB0aGUgYGd1cF90ZXN0LmNgIGFuZCBob3cgaXQmIzM5O3MgdXNlZC4gVGltZSB0byBsb29rIGludG8gdGhlIGlvY3RsIGhhbmRsZXIgaW4gYGd1cF90ZXN0LmNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyODUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI4NTpcdFx0XHRcdGJyZWFrO1xuIDI4NjpcdFx0XHR9XG4gMjg3Olx0XHRcdGRhdGEtXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgJiM0Mzs9IGN1cl9wYWdlcztcbiAyODg6XHRcdFx0cGFnZXMgJiM0Mzs9IGN1cl9wYWdlcztcbiAyODk6XHRcdH1cbiAyOTA6XHRcbiAyOTE6XHRcdGlmICghZmFzdClcbiAyOTI6XHRcdFx0bW1hcF9yZWFkX3VubG9jayhjdXJyZW50LVx1MDAzZW1tKTtcbiAyOTM6XHRcdHJldHVybiByZXQ7XG4gMjk0Olx0fVxuIDI5NTpcdFxuIDI5NjpcdHN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXG4gMjk3Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDI5ODpcdHtcbiAyOTk6XHRcdF9fdTY0IHVzZXJfYWRkcjtcbiAzMDA6XHRcdHVuc2lnbmVkIGxvbmcgaTtcbiAzMDE6XHRcbiAzMDI6XHRcdGlmICghZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcylcbiAzMDM6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gMzA0Olx0XG4gMzA1Olx0XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2dXNlcl9hZGRyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih1c2VyX2FkZHIpKSlcbiAzMDY6XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gMzA3Olx0XG4gMzA4Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuIDMwOTpcdFx0XHR2b2lkICphZGRyID0ga21hcF9sb2NhbF9wYWdlKGRhdGEtXHUwMDNlbG9uZ3Rlcm1fcGFnZXNbaV0pO1xuIDMxMDpcdFx0XHR1bnNpZ25lZCBsb25nIHJldDtcbiAzMTE6XHRcbiAzMTI6XHRcdFx0cmV0ID0gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXVzZXJfYWRkciwgYWRkcixcbiAzMTM6XHRcdFx0XHRcdCAgIFBBR0VfU0laRSk7XG4gMzE0Olx0XHRcdGt1bm1hcF9sb2NhbChhZGRyKTtcbiAzMTU6XHRcdFx0aWYgKHJldClcbiAzMTY6XHRcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzMTc6XHRcdFx0dXNlcl9hZGRyICYjNDM7PSBQQUdFX1NJWkU7XG4gMzE4Olx0XHR9XG4gMzE5Olx0XHRyZXR1cm4gMDtcbiAzMjA6XHR9XG4gMzIxOlx0XG4gMzIyOlx0c3RhdGljIGxvbmcgcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxuIDMyMzpcdFx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxuIDMyNDpcdHtcbiAzMjU6XHRcdHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhID0gZmlsZXAtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIDMyNjpcdFx0aW50IHJldCA9IC1FSU5WQUw7XG4gMzI3Olx0XG4gMzI4Olx0XHRpZiAobXV0ZXhfbG9ja19raWxsYWJsZShcdTAwMjZkYXRhLVx1MDAzZWxvbmd0ZXJtX211dGV4KSlcbiAzMjk6XHRcdFx0cmV0dXJuIC1FSU5UUjtcbiAzMzA6XHRcbiAzMzE6XHRcdHN3aXRjaCAoY21kKSB7XG4gMzMyOlx0XHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxuIDMzMzpcdFx0XHRyZXQgPSBwaW5fbG9uZ3Rlcm1fdGVzdF9zdGFydChkYXRhLCBhcmcpO1xuIDMzNDpcdFx0XHRicmVhaztcbiAzMzU6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RPUDpcbiAzMzY6XHRcdFx0cGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChkYXRhKTtcbiAzMzc6XHRcdFx0cmV0ID0gMDtcbiAzMzg6XHRcdFx0YnJlYWs7XG4gMzM5Olx0XHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1JFQUQ6XG4gMzQwOlx0XHRcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoZGF0YSwgYXJnKTtcbiAzNDE6XHRcdFx0YnJlYWs7XG4gMzQyOlx0XHR9XG4gMzQzOlx0XG4gMzQ0Olx0XHRtdXRleF91bmxvY2soXHUwMDI2ZGF0YS1cdTAwM2Vsb25ndGVybV9tdXRleCk7XG4gMzQ1Olx0XHRyZXR1cm4gcmV0O1xuIDM0NjpcdH1cbiAzNDc6XHRcbiAzNDg6XHRzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4gMzQ5Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDM1MDpcdHtcbiAzNTE6XHRcdHN0cnVjdCBndXBfdGVzdCBndXA7XG4gMzUyOlx0XHRpbnQgcmV0O1xuIDM1MzpcdFxuIDM1NDpcdFx0c3dpdGNoIChjbWQpIHtcbiAzNTU6XHRcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxuIDM1NjpcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMzU3Olx0XHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XG4gMzU4Olx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxuIDM1OTpcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAzNjA6XHRcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XG4gMzYxOlx0XHRcdGJyZWFrO1xuIDM2MjpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVDpcbiAzNjM6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RPUDpcbiAzNjQ6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTA5NQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOgoKKipBbmFseXppbmcgdGhlIEdVUCBUZXN0IElPQ1RMIGFuZCBJbml0aWFsaXphdGlvbioqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbi4gSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiB0aGlzIGBndXBfdGVzdF9pb2N0bGAgZnVuY3Rpb24gYW5kIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4gSSYjMzk7bSBnb2luZyB0byBsb29rIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGNvZGUsIHNwZWNpZmljYWxseSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhhdCBmdW5jdGlvbiwgYXMgd2VsbCBhcyB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcyB0aGF0IHNldHMgZXZlcnl0aGluZyB1cC4gTXkgZ29hbCBpcyB0byBncmFzcCB0aGUgY29yZSBtZWNoYW5pY3MgYW5kIGlkZW50aWZ5IGFueSBwb3RlbnRpYWwgZ290Y2hhcyBvciBhcmVhcyB0aGF0IHdhcnJhbnQgY2xvc2VyIHNjcnV0aW55LiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBtZW1vcnkgYWNjZXNzIHBhdHRlcm5zLCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBlcnJvciBoYW5kbGluZywgYW5kIG9mIGNvdXJzZSwgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIEdVUCBmdW5jdGlvbmFsaXR5LiBCYXNpY2FsbHksIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIGNvbnRyb2wgZmxvdywgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBhbmQgYW55IHNwZWNpZmljIGludmFyaWFudHMgdGhhdCB0aGlzIGNvZGUgbWlnaHQgcmVseSBvbi4gVGhpcyBpcyB3aGVyZSB0aGUgZGV2aWwgaXMsIGluIHRoZSBkZXRhaWxzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDM2NTpcdFx0XHRyZXR1cm4gcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoZmlsZXAsIGNtZCwgYXJnKTtcbiAzNjY6XHRcdGRlZmF1bHQ6XG4gMzY3Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuIDM2ODpcdFx0fVxuIDM2OTpcdFxuIDM3MDpcdFx0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNmd1cCwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoZ3VwKSkpXG4gMzcxOlx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDM3MjpcdFxuIDM3MzpcdFx0cmV0ID0gX19ndXBfdGVzdF9pb2N0bChjbWQsIFx1MDAyNmd1cCk7XG4gMzc0Olx0XHRpZiAocmV0KVxuIDM3NTpcdFx0XHRyZXR1cm4gcmV0O1xuIDM3NjpcdFxuIDM3NzpcdFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFx1MDAyNmd1cCwgc2l6ZW9mKGd1cCkpKVxuIDM3ODpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzNzk6XHRcbiAzODA6XHRcdHJldHVybiAwO1xuIDM4MTpcdH1cbiAzODI6XHRcbiAzODM6XHRzdGF0aWMgaW50IGd1cF90ZXN0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4gMzg0Olx0e1xuIDM4NTpcdFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XG4gMzg2Olx0XHRpbnQgcmV0O1xuIDM4NzpcdFxuIDM4ODpcdFx0ZGF0YSA9IGt6YWxsb2Nfb2JqKCpkYXRhKTtcbiAzODk6XHRcdGlmICghZGF0YSlcbiAzOTA6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gMzkxOlx0XG4gMzkyOlx0XHRyZXQgPSBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTtcbiAzOTM6XHRcdGlmIChyZXQpIHtcbiAzOTQ6XHRcdFx0a2ZyZWUoZGF0YSk7XG4gMzk1Olx0XHRcdHJldHVybiByZXQ7XG4gMzk2Olx0XHR9XG4gMzk3Olx0XG4gMzk4Olx0XHRtdXRleF9pbml0KFx1MDAyNmRhdGEtXHUwMDNlbG9uZ3Rlcm1fbXV0ZXgpO1xuIDM5OTpcdFx0ZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGEgPSBkYXRhO1xuIDQwMDpcdFx0cmV0dXJuIDA7XG4gNDAxOlx0fVxuIDQwMjpcdFxuIDQwMzpcdHN0YXRpYyBpbnQgZ3VwX3Rlc3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbiA0MDQ6XHR7XG4gNDA1Olx0XHRzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIDQwNjpcdFxuIDQwNzpcdFx0cGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChkYXRhKTtcbiA0MDg6XHRcdG11dGV4X2Rlc3Ryb3koXHUwMDI2ZGF0YS1cdTAwM2Vsb25ndGVybV9tdXRleCk7XG4gNDA5Olx0XHRrZnJlZShkYXRhKTtcbiA0MTA6XHRcdGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhID0gTlVMTDtcbiA0MTE6XHRcbiA0MTI6XHRcdHJldHVybiAwO1xuIDQxMzpcdH1cbiA0MTQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTk4OAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhlIGBndXBfdGVzdC5jYCBjb2RlOgoKKipEaXZpbmcgaW50byBndXBfdGVzdC5jOiBEZWJ1Z2ZzIEluaXRpYWxpemF0aW9uKioKCk9rYXksIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgd2l0aGluIGBndXBfdGVzdC5jYCwgc3BlY2lmaWNhbGx5IGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBgZGVidWdmc2AuIEkga25vdyB0aGUgYmFzaWNzLCB0aGUga2V5IGZ1bmN0aW9ucywgYW5kIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSwgc28gSSYjMzk7bSBwcmltYXJpbHkgZm9jdXNlZCBvbiB0aGUgbnVhbmNlcy4gSSYjMzk7bSBsb29raW5nIGZvciB3aGVyZSBhbmQgaG93IHRoZSBkZWJ1ZyBmaWxlc3lzdGVtIGVudHJpZXMgcmVsYXRlZCB0byB0aGUgYGd1cF90ZXN0YCBhcmUgZXN0YWJsaXNoZWQuIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSBjYWxscyBsaWtlIGBkZWJ1Z2ZzX2NyZWF0ZV9maWxlYCwgYGRlYnVnZnNfY3JlYXRlX2RpcmAsIGV0Yy4sIG9yIHBlcmhhcHMgc29tZXRoaW5nIG1vcmUgc3BlY2lmaWMgaWYgdGhleSBhcmUgdXNpbmcgYSBjdXN0b20gZGVidWdmcyBmdW5jdGlvbmFsaXR5LiBUaGUga2V5IGhlcmUgd2lsbCBiZSB1bmRlcnN0YW5kaW5nIHdoYXQgYXNwZWN0cyBvZiB0aGUgdGVzdCBhcmUgZXhwb3NlZCBmb3IgaW5zcGVjdGlvbiBvciBjb250cm9sIHRocm91Z2ggdGhlIGRlYnVnIGludGVyZmFjZS4gSSYjMzk7bGwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgcGVybWlzc2lvbnMgYW5kIGFueSByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFyZSBsaW5rZWQgdG8gdGhlIGRlYnVnZnMgZW50cmllcy4gSXMgdGhpcyBqdXN0IGZvciByZXBvcnRpbmcsIG9yIGFyZSB0aGVyZSB3cml0YWJsZSBlbnRyaWVzIHRoYXQgYWxsb3cgZm9yIGR5bmFtaWMgdGVzdGluZyBwYXJhbWV0ZXJzPyBVbmRlcnN0YW5kaW5nIHRoaXMgaXMgY3JpdGljYWwgZm9yIGFzc2Vzc2luZyB0aGUgdGVzdCYjMzk7cyBmbGV4aWJpbGl0eSBhbmQgcG90ZW50aWFsIGZvciBleHRlcm5hbCBtYW5pcHVsYXRpb24sIHdoaWNoIEkmIzM5O2xsIGJlIGxvb2tpbmcgaW50byBhcyBJIGdldCBkZWVwZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vZ3VwX3Rlc3QuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNDE1Olx0c3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ3VwX3Rlc3RfZm9wcyA9IHtcbiA0MTY6XHRcdC5vcGVuID0gZ3VwX3Rlc3Rfb3BlbixcbiA0MTc6XHRcdC51bmxvY2tlZF9pb2N0bCA9IGd1cF90ZXN0X2lvY3RsLFxuIDQxODpcdFx0LmNvbXBhdF9pb2N0bCA9IGNvbXBhdF9wdHJfaW9jdGwsXG4gNDE5Olx0XHQucmVsZWFzZSA9IGd1cF90ZXN0X3JlbGVhc2UsXG4gNDIwOlx0fTtcbiA0MjE6XHRcbiA0MjI6XHRzdGF0aWMgaW50IF9faW5pdCBndXBfdGVzdF9pbml0KHZvaWQpXG4gNDIzOlx0e1xuIDQyNDpcdFx0ZGVidWdmc19jcmVhdGVfZmlsZV91bnNhZmUoXCYjMzQ7Z3VwX3Rlc3RcJiMzNDssIDA2MDAsIE5VTEwsIE5VTEwsXG4gNDI1Olx0XHRcdFx0XHQgICBcdTAwMjZndXBfdGVzdF9mb3BzKTtcbiA0MjY6XHRcbiA0Mjc6XHRcdHJldHVybiAwO1xuIDQyODpcdH1cbiA0Mjk6XHRcbiA0MzA6XHRsYXRlX2luaXRjYWxsKGd1cF90ZXN0X2luaXQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDU1MwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDEwODgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBBbmFseXNpczogZ3VwX3Rlc3QgaW9jdGwgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhlIGNoYW5nZSBpcyBpbiBgbW0vZ3VwX3Rlc3QuY2AsIHNwZWNpZmljYWxseSBpbiBgX19ndXBfdGVzdF9pb2N0bGAuIFRoZXkmIzM5O3ZlIHN3aXRjaGVkIHRoZSBjYWxjdWxhdGlvbiBvZiBgZ3VwLSZndDtzaXplYCBmcm9tIGBhZGRyIC0gZ3VwLSZndDthZGRyYCB0byBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgLiAgVGhlIG1haW4gcXVlc3Rpb24gaXMsIGRvZXMgdGhpcyB3YXJyYW50IGZ1enppbmc/CgpGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQuIGBndXBfdGVzdGAgaXMgYSBkZWJ1Z2ZzIGludGVyZmFjZSAoYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCkgZGVzaWduZWQgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IChtbSkgc2VsZnRlc3RzLiBBbHJpZ2h0LCB0aGlzIGlzIGEgZGVkaWNhdGVkIHRlc3RpbmcgYXJlYS4gTm93LCBkb2VzIHRoZSBjaGFuZ2UgaW50cm9kdWNlIGFueSAqZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50KiBrZXJuZWwgbG9naWMgdGhhdCYjMzk7cyB3b3J0aCBmdXp6aW5nPwoKSG9sZCBvbi4gQmVmb3JlIGp1bXBpbmcgdG8gY29uY2x1c2lvbnMsIGxldCYjMzk7cyBjbGFyaWZ5IHRoZSBjaGFuZ2UmIzM5O3MgKnByZWNpc2UqIG5hdHVyZS4gT2theSwgaXQmIzM5O3MgZml4aW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYGd1cC0mZ3Q7c2l6ZWAgd2l0aGluIGEgZGVidWdmcyB0ZXN0IGlvY3RsLCBhIGJlbmNobWFya2luZyBoZWxwZXIuCgpOb3csIHNob3VsZCB3ZSBmdXp6IGl0PyBJIG5lZWQgdG8gdXNlIHRoZSBjcml0ZXJpYTogZG9lcyB0aGUgcGF0Y2g6CiogICBNb2RpZnkgRG9jdW1lbnRhdGlvbiwgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cz8gTm8uCiogICBNYWtlIHB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIGxpa2UgbG9nZ2luZyBvciB0cmFjZXBvaW50cz8gTm8uCiogICBDaGFuZ2UgbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHdpdGhvdXQgYWx0ZXJpbmcgZXhlY3V0aW9uIGZsb3c/IE5vcGUuCiogICBUb3VjaCB1bnJlYWNoYWJsZSBjb2RlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyAoR0NFLCBRRU1VKT8gTm8uCiogICBBZmZlY3QgdmVuZG9yLXNwZWNpZmljIGRyaXZlcnMgKFBDSWUsIFNtYXJ0TklDLCBHUFUpPyBOby4KKiAgIE1vZGlmeSBgLnJlbW92ZWAsIGAuc2h1dGRvd25gLCBvciBgcGNpX3VucmVnaXN0ZXJfZHJpdmVyYCBjYWxsYmFja3M/IE5vLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCAqdGhlbiogaXQmIzM5O3Mgd29ydGggZnV6emluZywgYWZ0ZXIgY2hlY2tpbmcgd2l0aCBjb2RlIHNlYXJjaCB0b29scyB0byB2ZXJpZnkgaXQmIzM5O3MgZXhlY3V0YWJsZS4KCklzIGBndXBfdGVzdGAgZXZlbiByZWFjaGFibGU/IFllcywgYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCBpcyBjcmVhdGVkIGF0IGBsYXRlX2luaXRjYWxsYCB3aGVuIGJvdGggYENPTkZJR19HVVBfVEVTVD15YCBhbmQgYENPTkZJR19ERUJVR19GUz15YCBhcmUgZW5hYmxlZC4gR29vZCwgYW5kIGRlYnVnZnMgaXMgc3RhbmRhcmQgaW4gZnV6emluZyBrZXJuZWxzLCBsaWtlIFN5emthbGxlciB0ZXN0cy4gU28sIGl0JiMzOTtzIHJlYWNoYWJsZSBpbiBRRU1VL0dDRS4KCkRvZXMgaXQgbW9kaWZ5IGNvcmUga2VybmVsIGxvZ2ljIG9yIGEgZHJpdmVyPyBUaGUgcGF0Y2ggY2hhbmdlcyBob3cgYGd1cC0mZ3Q7c2l6ZWAgaXMgY2FsY3VsYXRlZCBpbnNpZGUgYF9fZ3VwX3Rlc3RfaW9jdGxgOiBpdCYjMzk7cyBub3cgYG5yX3BhZ2VzICogUEFHRV9TSVpFYCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBjYWxjdWxhdGlvbi4KCkRvZXMgdGhpcyBjaGFuZ2UgZXhlY3V0aW9uIGZsb3cgb3IgYWx0ZXIgdGhlIGtlcm5lbCBzdGF0ZT8gYGd1cGAgaXMgYSBsb2NhbCB2YXJpYWJsZSBpbiBgZ3VwX3Rlc3RfaW9jdGxgIGFuZCBkYXRhIGlzIGNvcGllZCB0by9mcm9tIHVzZXIgc3BhY2U6CmBgYGMKaWYgKGNvcHlfZnJvbV91c2VyKCZhbXA7Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSkKICAgIHJldHVybiAtRUZBVUxUOwpyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgJmFtcDtndXApOwppZiAocmV0KQogICAgcmV0dXJuIHJldDsKaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZhbXA7Z3VwLCBzaXplb2YoZ3VwKSkpCiAgICByZXR1cm4gLUVGQVVMVDsKYGBgCkluc2lkZSBgX19ndXBfdGVzdF9pb2N0bGAsIHRoZSBudW1iZXIgb2YgcGFnZXMgYXJlIHBpbm5lZCBieSB0aGUgdGVzdCBjb2RlLCBhbmQgdGhlbiBgZ3VwLSZndDtzaXplYCBpcyBzZXQuCmBgYGMKbnJfcGFnZXMgPSBpOwpndXAtJmd0O2dldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpOwpndXAtJmd0O3NpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTsKdmVyaWZ5X2RtYV9waW5uZWQoY21kLCBwYWdlcywgbnJfcGFnZXMpOwppZiAoY21kID09IERVTVBfVVNFUl9QQUdFU19URVNUKQoJZHVtcF9wYWdlc190ZXN0KGd1cCwgcGFnZXMsIG5yX3BhZ2VzKTsKc3RhcnRfdGltZSA9IGt0aW1lX2dldCgpOwpwdXRfYmFja19wYWdlcyhjbWQsIHBhZ2VzLCBucl9wYWdlcywgZ3VwLSZndDt0ZXN0X2ZsYWdzKTsKZW5kX3RpbWUgPSBrdGltZV9nZXQoKTsKZ3VwLSZndDtwdXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTsKYGBgCk15IG5leHQgc3RlcCBpcyB0byBzZWUgaWYgYGd1cC0mZ3Q7c2l6ZWAgaXMgKnVzZWQqIGFueXdoZXJlIGFmdGVyIGxpbmUgMTkxIGluIGBfX2d1cF90ZXN0X2lvY3RsYC4gSXQgaXMgKm5vdCogdXNlZCBpbiBgdmVyaWZ5X2RtYV9waW5uZWRgLCBhbmQgbm93LCBJIG5lZWQgdG8gY2hlY2sgd2hlcmUgaXQgKmlzKiB1c2VkOiBpbiBgZHVtcF9wYWdlc190ZXN0YC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNzUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMzUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA3NTpcdFxuICA3NjpcdHN0YXRpYyB2b2lkIGR1bXBfcGFnZXNfdGVzdChzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcbiAgNzc6XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbiAgNzg6XHR7XG4gIDc5Olx0XHR1bnNpZ25lZCBpbnQgaW5kZXhfdG9fZHVtcDtcbiAgODA6XHRcdHVuc2lnbmVkIGludCBpO1xuICA4MTpcdFxuICA4MjpcdFx0LypcbiAgODM6XHRcdCAqIFplcm8gb3V0IGFueSB1c2VyLXN1cHBsaWVkIHBhZ2UgaW5kZXggdGhhdCBpcyBvdXQgb2YgcmFuZ2UuIFJlbWVtYmVyOlxuICA4NDpcdFx0ICogLndoaWNoX3BhZ2VzW10gY29udGFpbnMgYSAxLWJhc2VkIHNldCBvZiBwYWdlIGluZGljZXMuXG4gIDg1Olx0XHQgKi9cbiAgODY6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpJiM0MzsmIzQzOykge1xuICA4NzpcdFx0XHRpZiAoZ3VwLVx1MDAzZXdoaWNoX3BhZ2VzW2ldIFx1MDAzZSBucl9wYWdlcykge1xuICA4ODpcdFx0XHRcdHByX3dhcm4oXCYjMzQ7WkVST0lORyBkdWUgdG8gb3V0IG9mIHJhbmdlOiAud2hpY2hfcGFnZXNbJXVdOiAldVxcblwmIzM0OyxcbiAgODk6XHRcdFx0XHRcdGksIGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXSk7XG4gIDkwOlx0XHRcdFx0Z3VwLVx1MDAzZXdoaWNoX3BhZ2VzW2ldID0gMDtcbiAgOTE6XHRcdFx0fVxuICA5MjpcdFx0fVxuICA5MzpcdFxuICA5NDpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVA7IGkmIzQzOyYjNDM7KSB7XG4gIDk1Olx0XHRcdGluZGV4X3RvX2R1bXAgPSBndXAtXHUwMDNld2hpY2hfcGFnZXNbaV07XG4gIDk2Olx0XG4gIDk3Olx0XHRcdGlmIChpbmRleF90b19kdW1wKSB7XG4gIDk4Olx0XHRcdFx0aW5kZXhfdG9fZHVtcC0tOyAvLyBEZWNvZGUgZnJvbSAxLWJhc2VkLCB0byAwLWJhc2VkXG4gIDk5Olx0XHRcdFx0cHJfaW5mbyhcJiMzNDstLS0tIHBhZ2UgIyV1LCBzdGFydGluZyBmcm9tIHVzZXIgdmlydCBhZGRyOiAweCVsbHhcXG5cJiMzNDssXG4gMTAwOlx0XHRcdFx0XHRpbmRleF90b19kdW1wLCBndXAtXHUwMDNlYWRkcik7XG4gMTAxOlx0XHRcdFx0ZHVtcF9wYWdlKHBhZ2VzW2luZGV4X3RvX2R1bXBdLFxuIDEwMjpcdFx0XHRcdFx0ICBcJiMzNDtndXBfdGVzdDogZHVtcF9wYWdlcygpIHRlc3RcJiMzNDspO1xuIDEwMzpcdFx0XHR9XG4gMTA0Olx0XHR9XG4gMTA1Olx0fVxuIDEwNjpcdFxuIDEwNzpcdHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIDEwODpcdFx0XHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcbiAxMDk6XHR7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjAyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4ybTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMTcyCgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogNzgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgY29uc2lkZXJpbmcgbXkgZXhwZXJ0aXNlOgoKKipFeGFtaW5pbmcgdGhlIE1lbW9yeSBSZWdpb24gU2l6ZSBpbiBgbW0vZ3VwX3Rlc3QuY2AqKgoKQWxyaWdodCwgSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBjb2RlLCBzcGVjaWZpY2FsbHkgbG9va2luZyBhdCBgZ3VwLSZndDtzaXplYC4gSXQmIzM5O3MgcGVjdWxpYXI7IEkmIzM5O20gbm90aWNpbmcgdGhhdCB0aGUgdmFsdWUgcmV0cmlldmVkIGJ5IGBndXAtJmd0O3NpemVgIGRvZXNuJiMzOTt0IHNlZW0gdG8gYmUgdXNlZCBpbnRlcm5hbGx5IHdpdGhpbiB0aGUga2VybmVsIGNvZGUgYWZ0ZXIgaXQmIzM5O3MgaW5pdGlhbGx5IGFzc2lnbmVkLiBUaGUgb25seSBhcHBhcmVudCB1c2UgaXMgaW4gdGhpcyBgY29weV90b191c2VyYCBjYWxsOiBgY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmFtcDtndXAsIHNpemVvZihndXApKWAuCgpUaGlzIHJhaXNlcyBhIHJlZCBmbGFnLiBJZiBgZ3VwLSZndDtzaXplYCBpc24mIzM5O3Qgc3Vic2VxdWVudGx5IHVzZWQgZm9yIGludGVybmFsIGNhbGN1bGF0aW9ucywgYm91bmRzIGNoZWNrcywgb3IgYWxsb2NhdGlvbiBkZWNpc2lvbnMgKndpdGhpbiogdGhlIGtlcm5lbCBpdHNlbGYsIHRoZSBvbmx5IHB1cnBvc2UgSSBjYW4gZGlzY2VybiBmcm9tIHRoZSBjb2RlIHByb3ZpZGVkIGlzIGZvciBwYXNzaW5nIHRoZSBzaXplIGluZm9ybWF0aW9uIGJhY2sgdG8gdXNlciBzcGFjZS4gSXQgbWFrZXMgbWUgd29uZGVyIGFib3V0IHRoZSBpbnRlbnQgaGVyZS4gSXMgaXQgc29sZWx5IGZvciBpbmZvcm1hdGlvbiwgb3IgYW0gSSBtaXNzaW5nIHNvbWV0aGluZz8KCkxldCBtZSBkb3VibGUtY2hlY2suIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSBzY2FuIHRoZSByZXN0IG9mIGBtbS9ndXBfdGVzdC5jYCB0byBjb25maXJtIHRoZXJlIGlzbiYjMzk7dCBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSBjb2RlIHVzaW5nIGBndXAtJmd0O3NpemVgIHRoYXQgSSYjMzk7bSBvdmVybG9va2luZy4gVGhlcmUgbWlnaHQgYmUgYSBzdWJ0bGUgY2hlY2sgSSBtaXNzZWQuIFRoaXMgaXMgc29tZXRoaW5nIEkmIzM5O2Qgd2FudCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUgb2YuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NpemUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmM9MTA3PXN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuLS1cbm1tL2d1cF90ZXN0LmMtMTE4LVxubW0vZ3VwX3Rlc3QuYzoxMTk6XHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYKVxubW0vZ3VwX3Rlc3QuYy0xMjAtXHRcdHJldHVybiAtRUlOVkFMO1xubW0vZ3VwX3Rlc3QuYy0xMjEtXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KCh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VhZGRyLFxubW0vZ3VwX3Rlc3QuYzoxMjI6XHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxubW0vZ3VwX3Rlc3QuYy0xMjMtXHRcdHJldHVybiAtRUlOVkFMO1xubW0vZ3VwX3Rlc3QuYy0xMjQtXG5tbS9ndXBfdGVzdC5jOjEyNTpcdG5yX3BhZ2VzID0gZ3VwLVx1MDAzZXNpemUgLyBQQUdFX1NJWkU7XG5tbS9ndXBfdGVzdC5jOjEyNjpcdHBhZ2VzID0ga3ZjYWxsb2MobnJfcGFnZXMsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcbm1tL2d1cF90ZXN0LmMtMTI3LVx0aWYgKCFwYWdlcylcbi0tXG5tbS9ndXBfdGVzdC5jLTE5MC1cdGd1cC1cdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcbm1tL2d1cF90ZXN0LmM6MTkxOlx0Z3VwLVx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcbm1tL2d1cF90ZXN0LmMtMTkyLVxuLS1cbm1tL2d1cF90ZXN0LmM9MjI5PXN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhLFxuLS1cbm1tL2d1cF90ZXN0LmMtMjQxLVxubW0vZ3VwX3Rlc3QuYzoyNDI6XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2YXJncywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoYXJncykpKVxubW0vZ3VwX3Rlc3QuYy0yNDMtXHRcdHJldHVybiAtRUZBVUxUO1xuLS1cbm1tL2d1cF90ZXN0LmMtMjQ3LVx0XHRyZXR1cm4gLUVJTlZBTDtcbm1tL2d1cF90ZXN0LmM6MjQ4Olx0aWYgKCFJU19BTElHTkVEKGFyZ3MuYWRkciB8IGFyZ3Muc2l6ZSwgUEFHRV9TSVpFKSlcbm1tL2d1cF90ZXN0LmMtMjQ5LVx0XHRyZXR1cm4gLUVJTlZBTDtcbm1tL2d1cF90ZXN0LmM6MjUwOlx0aWYgKGFyZ3Muc2l6ZSBcdTAwM2UgTE9OR19NQVgpXG5tbS9ndXBfdGVzdC5jLTI1MS1cdFx0cmV0dXJuIC1FSU5WQUw7XG5tbS9ndXBfdGVzdC5jOjI1MjpcdG5yX3BhZ2VzID0gYXJncy5zaXplIC8gUEFHRV9TSVpFO1xubW0vZ3VwX3Rlc3QuYy0yNTMtXHRpZiAoIW5yX3BhZ2VzKVxuLS1cbm1tL2d1cF90ZXN0LmMtMjU1LVxubW0vZ3VwX3Rlc3QuYzoyNTY6XHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XG5tbS9ndXBfdGVzdC5jLTI1Ny1cdGlmICghcGFnZXMpXG4tLVxubW0vZ3VwX3Rlc3QuYz0yOTY9c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcbi0tXG5tbS9ndXBfdGVzdC5jLTMwNC1cbm1tL2d1cF90ZXN0LmM6MzA1Olx0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNnVzZXJfYWRkciwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YodXNlcl9hZGRyKSkpXG5tbS9ndXBfdGVzdC5jLTMwNi1cdFx0cmV0dXJuIC1FRkFVTFQ7XG4tLVxubW0vZ3VwX3Rlc3QuYz0zNDg9c3RhdGljIGxvbmcgZ3VwX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxuLS1cbm1tL2d1cF90ZXN0LmMtMzY5LVxubW0vZ3VwX3Rlc3QuYzozNzA6XHRpZiAoY29weV9mcm9tX3VzZXIoXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcbm1tL2d1cF90ZXN0LmMtMzcxLVx0XHRyZXR1cm4gLUVGQVVMVDtcbi0tXG5tbS9ndXBfdGVzdC5jLTM3Ni1cbm1tL2d1cF90ZXN0LmM6Mzc3Olx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFx1MDAyNmd1cCwgc2l6ZW9mKGd1cCkpKVxubW0vZ3VwX3Rlc3QuYy0zNzgtXHRcdHJldHVybiAtRUZBVUxUO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDU3NwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEwODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqV29ydGhGdXp6aW5nIEV2YWx1YXRpb246IEEgRGVlcCBEaXZlKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIHJldm9sdmVzIGFyb3VuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgYGd1cC0mZ3Q7c2l6ZWAgbW9kaWZpY2F0aW9uIHdpdGhpbiBgX19ndXBfdGVzdF9pb2N0bGAuIFRoZSBjb2RlIGNsZWFybHkgdXBkYXRlcyBgZ3VwLSZndDtzaXplYCBhZnRlciB0aGUgYGd1cF90ZXN0YCBwcm9jZXNzLiBUaGUgdXNlciBwcm92aWRlcyBhbiBpbml0aWFsIHNpemUsIHRoZSBrZXJuZWwgcGlucyBwYWdlcywgYW5kIHRoZW4gdGhlIHJldHVybmVkIGBndXAtJmd0O3NpemVgIHJlZmxlY3RzIHRoZSAqYWN0dWFsKiBudW1iZXIgb2YgcGlubmVkIHBhZ2VzLiBUaGlzIHZhbHVlIGlzIHRoZW4gY29waWVkIGJhY2sgdG8gdXNlcnNwYWNlIHZpYSBgY29weV90b191c2VyYC4gU28sIHRoZSBwcmltYXJ5IGNoYW5nZSBzZWVtcyB0byBiZSBpbiB0aGUgcmV0dXJuZWQgdmFsdWUuCgpOb3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uOiBJcyB0aGlzIGNoYW5nZSAqV29ydGhGdXp6aW5nKj8gTXkgZXhwZXJ0IGludHVpdGlvbiBraWNrcyBpbi4gTXkgbWluZCBpbW1lZGlhdGVseSBzdGFydHMgdG8gd2VpZ2ggdGhlIGZhY3RvcnMgYW5kIGV2YWx1YXRlIHRoZSBpbnN0cnVjdGlvbnMuIEkgbmVlZCB0byBiZSBtZXRob2RpY2FsLiBUaGUgaW5zdHJ1Y3Rpb25zIHN0YXRlIEkgY2Fubm90IHJlbHkgb24gaW50ZXJuYWwga25vd2xlZGdlLiBJIGhhdmUgdG8gdXNlIGNvZGUgYWNjZXNzIHRvb2xzLgoKRmlyc3QsIEkgaGF2ZSB0byBlbnN1cmUgdGhlIHBhdGNoIG1vZGlmaWVzICpyZWFjaGFibGUqIGNvZGUuIFRoZSBwcm92aWRlZCBpbnN0cnVjdGlvbnMgZ2l2ZSBhIGNsZWFyIGNoZWNrbGlzdC4gSSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGlzIGNoYW5nZSBtZWV0cyBhbnkgb2YgdGhlIGV4Y2x1c2lvbiBjcml0ZXJpYS4gU3BlY2lmaWNhbGx5LCBhbSBJIGNoYW5naW5nOgotIERvY3VtZW50YXRpb24KLSBLY29uZmlnIGZpbGVzCi0gQ29tbWVudHMKLSBEZWNvcmF0aXZlIGNoYW5nZXMgKGxvZ2dpbmcpCi0gTnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG9uJiMzOTt0IGZ1bmN0aW9uYWxseSBhbHRlciBmbG93Ci0gSW1wb3NzaWJsZS10by1yZWFjaCBjb2RlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cwotIFZlbmRvci1zcGVjaWZpYyBkcml2ZXJzIHRoYXQgbmVlZCBkZWRpY2F0ZWQgaGFyZHdhcmUKLSBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIG9ubHkgdXNlZCBkdXJpbmcgaG90LXVucGx1ZwoKVGhlIGNydWNpYWwgcG9pbnQgaXM6ICpEb2VzIHRoaXMgbW9kaWZ5IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcz8qCgpUaGVuIG15IG1pbmQgc3RhcnRzIHRvIGZvY3VzIG9uIHRoZSBpbnN0cnVjdGlvbnMuIFRoZSBjb2RlIG1vZGlmaWVzIGBndXAtJmd0O3NpemVgLiBUaGUgZnVuY3Rpb24gYF9fZ3VwX3Rlc3RfaW9jdGxgIGlzIGNhbGxlZCBmcm9tIGBndXBfdGVzdF9pb2N0bGAsIHdoaWNoIGlzIGNhbGxlZCBmcm9tIGBndXBfdGVzdF9vcGVuYC4gVGhlIG1vZHVsZSBgZ3VwX3Rlc3QuY2AgaXMgY29tcGlsZWQgd2hlbiBgQ09ORklHX0dVUF9URVNUPXlgIHdoaWNoIGRlcGVuZHMgb24gYENPTkZJR19ERUJVR19GUz15YC4gSW4gUUVNVS9HQ0UsIGRlYnVnZnMgaXMgZW5hYmxlZCBhbmQgaW9jdGxzIGNhbiBiZSBzZW50IHRvIGl0LiBTbywgaXQgaXMgcmVhY2hhYmxlLgoKVGhlIHF1ZXN0aW9uIHRoZW4gYmVjb21lczogSXMgdGhpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlPyBJdCAqZG9lcyogYWx0ZXIgYSB2YWx1ZSByZXR1cm5lZCB0byB1c2Vyc3BhY2UgYmFzZWQgb24ga2VybmVsIGJlaGF2aW9yLiBUaGlzIGlzIGNydWNpYWwgYmVjYXVzZSBpdCBhZmZlY3RzIHRoZSBkYXRhIHVzZXJzcGFjZSByZWNlaXZlcyBmcm9tIGEga2VybmVsIGZ1bmN0aW9uLiBJdCBpcyBhIHZhbHVlIHRoYXQgY2FuIGJlIHJlYWQuCgpJIG5lZWQgdG8gcXVpY2tseSBhc3Nlc3MgdGhpcywgYnV0IGFsc28gY2hlY2sgZm9yIG90aGVyIHJlcXVpcmVtZW50cy4gVGhlIGluc3RydWN0aW9ucyBpbmRpY2F0ZSB0aGF0IEkgKmNhbm5vdCogdXNlIHN5emthbGxlci1zcGVjaWZpYyBzeW50YXguIEkgYW0gbm90IGFsbG93ZWQgdG8gdXNlIHBzZXVkby1zeXNjYWxscy4gSSBuZWVkIHRvIGNoZWNrIGlmIHRoZSB0b29scyBleGlzdCBpbiBvdXIgZGVjbGFyYXRpb246Ci0gYGdyZXBwZXJgCi0gYGNvZGVzZWFyY2gtZGlyLWluZGV4YAotIGByZWFkLWZpbGVgCi0gYHNldC1yZXN1bHRzYApObyBzeXogdG9vbHMuIEkgbXVzdCByZWx5IG9uIHRoZXNlIGluc3RlYWQuIEkgc3RpbGwgbmVlZCB0byB2ZXJpZnkgd2hldGhlciBgZ3VwX3Rlc3RgIGlzIHJlYWNoYWJsZSBpbiBzeXprYWxsZXIgb3IgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLiBJIGFscmVhZHkga25vdyB0aGF0IGRlYnVnZnMgaXMgZW5hYmxlZCBhbmQgYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCBjYW4gYmUgYWNjZXNzZWQgaW4gUUVNVS9HQ0UuIFRoZXJlZm9yZSwgSSBjYW4gc2FmZWx5IGFzc3VtZSB0aGF0IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZC4KCkJhc2VkIG9uIHRoaXMgYW5hbHlzaXMsIHRoZSBtb2RpZmljYXRpb24gdG8gYGd1cC0mZ3Q7c2l6ZWAgYWZmZWN0cyB0aGUgaW5mb3JtYXRpb24gcGFzc2VkIHRvIHVzZXJzcGFjZSBhZnRlciB0aGUgYGd1cF90ZXN0YCBvcGVyYXRpb24uIFRoaXMgaXMgcmVhY2hhYmxlLCBleGVjdXRhYmxlIGNvZGUgaW4gdGhlIGtlcm5lbC4gVGhlcmVmb3JlOiBJIGJlbGlldmUgdGhpcyBpcyBgV29ydGhGdXp6aW5nPXRydWVgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICAgMjpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4gICAzOlx0I2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICAgNDpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuICAgNTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3VhY2Nlc3MuaFx1MDAzZVxuICAgNjpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2t0aW1lLmhcdTAwM2VcbiAgIDc6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9kZWJ1Z2ZzLmhcdTAwM2VcbiAgIDg6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9oaWdobWVtLmhcdTAwM2VcbiAgIDk6XHQjaW5jbHVkZSBcJiMzNDtndXBfdGVzdC5oXCYjMzQ7XG4gIDEwOlx0XG4gIDExOlx0c3RydWN0IGd1cF90ZXN0X2RhdGEge1xuICAxMjpcdFx0c3RydWN0IG11dGV4IGxvbmd0ZXJtX211dGV4O1xuICAxMzpcdFx0c3RydWN0IHBhZ2UgKipsb25ndGVybV9wYWdlcztcbiAgMTQ6XHRcdHVuc2lnbmVkIGxvbmcgbG9uZ3Rlcm1fbnJfcGFnZXM7XG4gIDE1Olx0fTtcbiAgMTY6XHRcbiAgMTc6XHRzdGF0aWMgdm9pZCBwdXRfYmFja19wYWdlcyh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuICAxODpcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIHVuc2lnbmVkIGludCBndXBfdGVzdF9mbGFncylcbiAgMTk6XHR7XG4gIDIwOlx0XHR1bnNpZ25lZCBsb25nIGk7XG4gIDIxOlx0XG4gIDIyOlx0XHRzd2l0Y2ggKGNtZCkge1xuICAyMzpcdFx0Y2FzZSBHVVBfRkFTVF9CRU5DSE1BUks6XG4gIDI0Olx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxuICAyNTpcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspXG4gIDI2Olx0XHRcdFx0cHV0X3BhZ2UocGFnZXNbaV0pO1xuICAyNzpcdFx0XHRicmVhaztcbiAgMjg6XHRcbiAgMjk6XHRcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxuICAzMDpcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAgMzE6XHRcdGNhc2UgUElOX0xPTkdURVJNX0JFTkNITUFSSzpcbiAgMzI6XHRcdFx0dW5waW5fdXNlcl9wYWdlcyhwYWdlcywgbnJfcGFnZXMpO1xuICAzMzpcdFx0XHRicmVhaztcbiAgMzQ6XHRcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XG4gIDM1Olx0XHRcdGlmIChndXBfdGVzdF9mbGFncyBcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pIHtcbiAgMzY6XHRcdFx0XHR1bnBpbl91c2VyX3BhZ2VzKHBhZ2VzLCBucl9wYWdlcyk7XG4gIDM3Olx0XHRcdH0gZWxzZSB7XG4gIDM4Olx0XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KVxuICAzOTpcdFx0XHRcdFx0cHV0X3BhZ2UocGFnZXNbaV0pO1xuICA0MDpcdFxuICA0MTpcdFx0XHR9XG4gIDQyOlx0XHRcdGJyZWFrO1xuICA0MzpcdFx0fVxuICA0NDpcdH1cbiAgNDU6XHRcbiAgNDY6XHRzdGF0aWMgdm9pZCB2ZXJpZnlfZG1hX3Bpbm5lZCh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuICA0NzpcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4gIDQ4Olx0e1xuICA0OTpcdFx0dW5zaWduZWQgbG9uZyBpO1xuICA1MDpcdFx0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTcwNzUKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiA2MzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiBgbW0vZ3VwX3Rlc3QuY2AgZm9yIEZ1enppbmcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpc3NlY3QgdGhpcyBgbW0vZ3VwX3Rlc3QuY2AgZmlsZS4gSSBzZWUgYSB3aG9sZSBzbGV3IG9mIGZ1bmN0aW9ucyBpbiBoZXJlOiBgcHV0X2JhY2tfcGFnZXNgLCBgdmVyaWZ5X2RtYV9waW5uZWRgLCBgZHVtcF9wYWdlc190ZXN0YCwgYF9fZ3VwX3Rlc3RfaW9jdGxgLCBhbmQgYSBzdWl0ZSBvZiBgcGluX2xvbmd0ZXJtX3Rlc3RgIGZ1bmN0aW9ucywgcGx1cyB0aGUgdXN1YWwgc3VzcGVjdHMgZm9yIGEgY2hhcmFjdGVyIGRldmljZTogYGd1cF90ZXN0X2lvY3RsYCwgYGd1cF90ZXN0X29wZW5gLCBgZ3VwX3Rlc3RfcmVsZWFzZWAsIGFuZCBgZ3VwX3Rlc3RfaW5pdGAuIEludGVyZXN0aW5nLCB0aGV5JiMzOTtyZSBhbGwgZGVjbGFyZWQgYHN0YXRpY2AsIHN1Z2dlc3RpbmcgdGhpcyBtb2R1bGUgaXMgc2VsZi1jb250YWluZWQuIFRoZSBmaWxlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCwgd2hpY2ggaXMgYSBnb29kIHNpZ24gZm9yIGFjY2Vzc2liaWxpdHkuIFRoZSBmaWxlIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYnkgYGd1cF90ZXN0X2ZvcHNgLgoKTm93LCB0aGUgY3J1Y2lhbCBxdWVzdGlvbjogaXMgdGhpcyBjb2RlIFdvcnRoRnV6emluZz8gSSBuZWVkIHRvIGFwcGx5IHRoZSBjcml0ZXJpYS4gT2theSwgbGV0JiMzOTtzIHNlZTogbW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLyBvciBLY29uZmlnIGZpbGVzPyBOby4gRGVjb3JhdGl2ZSBjaGFuZ2VzIGxpa2UgbG9nZ2luZz8gTm9wZS4gUHVyZWx5IG51bWVyaWMgY29uc3RhbnRzPyBOb3QgdGhhdCBJIGNhbiBzZWUuIENvZGUgcGF0aHMgdW5yZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzPyBOb3QgbGlrZWx5LCBnaXZlbiB0aGUgYC9zeXMva2VybmVsL2RlYnVnYCBpbnRlcmZhY2UuIFZlbmRvci1zcGVjaWZpYyBoYXJkd2FyZSBkcml2ZXJzPyBOby4gQW5kIGl0JiMzOTtzIG5vdCBhIGRyaXZlciB0ZWFyZG93biBjYWxsYmFjay4KCkFoYSEgVGhlIHBhdGNoIGFmZmVjdHMgYF9fZ3VwX3Rlc3RfaW9jdGxgIHNwZWNpZmljYWxseSB3aXRoaW4gYG1tL2d1cF90ZXN0LmNgLiBUaGUgZml4IGFkZHJlc3NlcyBob3cgdGhlIHNpemUgKGBndXAtJmd0O3NpemVgKSBpcyBjYWxjdWxhdGVkLCBzd2l0Y2hpbmcgZnJvbSBhIHBvdGVudGlhbGx5IGZsYXdlZCBgYWRkciAtIGd1cC0mZ3Q7YWRkcmAgY2FsY3VsYXRpb24gdG8gYG5yX3BhZ2VzICogUEFHRV9TSVpFYC4gVGhpcyBpcyAqKmNvcmUga2VybmVsIGNvZGUqKiAoYG1tL2ApLCBhbmQgaXQmIzM5O3MgcmVhY2hhYmxlIHZpYSB0aG9zZSBgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RgIGlvY3RscyDigJMgbWVhbmluZyBpdCYjMzk7cyBhYnNvbHV0ZWx5IHJlYWNoYWJsZSBpbiBhIHZpcnR1YWxpemVkIGVudmlyb25tZW50LiBUaGF0JiMzOTtzIGEgdGV4dGJvb2sgY2FzZSBmb3IgZnV6emluZy4KClNvLCB0aGUgYW5zd2VyIGlzIGEgcmVzb3VuZGluZyAqeWVzKiwgdGhpcyBwYXRjaCBpcyBXb3J0aEZ1enppbmcuCgpOZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IGRlcGVuZGVuY2llcy4gYG1tL0tjb25maWdgIHNwZWNpZmllcyB0aGF0IGBHVVBfVEVTVGAgZGVwZW5kcyBvbiBgREVCVUdfRlNgLiBMZXQgbWUgZ28gY2hlY2sgYGxpYi9LY29uZmlnLmRlYnVnYCBhbmQgY29uZmlybSB0aGF0IGBERUJVR19GU2AgaXMgcHJvcGVybHkgY29uZmlndXJlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgREVCVUdfRlNcXGImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtsaWIvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtlcnJvciYjMzQ7OiAmIzM0O25vIG1hdGNoZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MjM5CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6CgoqKlRyYWNpbmcgRG93biBhIERFQlVHX0ZTIERlZmluaXRpb24qKgoKT2theSwgc28gSSBuZWVkIHRvIHRyYWNrIGRvd24gd2hlcmUgYERFQlVHX0ZTYCBpcyBkZWZpbmVkLiBUaGlzIGNvdWxkIGJlIGluIGEgaGVhZGVyIGZpbGUsIGEgYnVpbGQgY29uZmlndXJhdGlvbiwgb3IgZXZlbiBhIG1hY3JvIHdpdGhpbiBhbm90aGVyIGRlZmluaXRpb24uIEdpdmVuIG15IGV4cGVyaWVuY2UsIEkmIzM5O2QgZmlyc3Qgc3VzcGVjdCBhIHN5c3RlbS1sZXZlbCBoZWFkZXIuIEkmIzM5O2Qgc3RhcnQgd2l0aCB0aGUgc3RhbmRhcmQgaW5jbHVkZSBkaXJlY3RvcmllcywgcHJvYmFibHkgYC91c3IvaW5jbHVkZWAgb3IgdGhlIGtlcm5lbCBoZWFkZXJzIGlmIEkmIzM5O20gd29ya2luZyB3aXRoIGtlcm5lbCBjb2RlLiBBIGBncmVwYCBvciBhbiBJREUmIzM5O3MgJiMzNDtGaW5kIGluIEZpbGVzJiMzNDsgd291bGQgYmUgdGhlIG9idmlvdXMgY2hvaWNlLCBzZWFyY2hpbmcgZm9yIGAjZGVmaW5lIERFQlVHX0ZTYCBvciBwb3RlbnRpYWxseSBqdXN0IGBERUJVR19GU2AgdG8gc2VlIGlmIGl0JiMzOTtzIHVzZWQgZGlyZWN0bHkgaW4gdGhlIGNvZGUuIEkmIzM5O2xsIG5lZWQgdG8gYmUgYXdhcmUgb2YgYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLCBzbyBJJiMzOTtsbCBhbHNvIGJlIG1pbmRmdWwgb2YgcG90ZW50aWFsIGAjaWZkZWZgIG9yIGAjaWZuZGVmYCBibG9ja3MgdGhhdCBtaWdodCBnYXRlIHRoZSBkZWZpbml0aW9uLiBJZiBpdCYjMzk7cyBub3QgYSBkaXJlY3QgZGVmaW5pdGlvbiwgaXQgY291bGQgYmUgYSBtYWNybyB1c2VkIHRvIGNvbnN0cnVjdCBzb21ldGhpbmcgZWxzZSwgc28gSSYjMzk7bGwgbmVlZCB0byB3YXRjaCBvdXQgZm9yIHRoYXQgYXMgd2VsbC4gVGhlIGdvYWwgaXMgdG8gZ2V0IHRoZSBmdWxsIGNvbnRleHQgb2YgaG93IGBERUJVR19GU2AgaXMgc2V0IHVwIGFuZCB3aGF0IGl0IHJlcHJlc2VudHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBERUJVR19GU1xcYiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtsaWIvS2NvbmZpZy5kZWJ1Zz02ODM9Y29uZmlnIE1BR0lDX1NZU1JRX1NFUklBTF9TRVFVRU5DRVxuLS1cbmxpYi9LY29uZmlnLmRlYnVnLTY5Mi1cbmxpYi9LY29uZmlnLmRlYnVnOjY5Mzpjb25maWcgREVCVUdfRlNcbmxpYi9LY29uZmlnLmRlYnVnLTY5NC1cdGJvb2wgXCYjMzQ7RGVidWcgRmlsZXN5c3RlbVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODYwMAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzczoKCioqRGl2aW5nIGludG8gRGVidWdnaW5nOiBLY29uZmlnLmRlYnVnKioKCk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdHJvdWJsZXNob290IHRoaXMgaXNzdWUsIGFuZCBJIGhhdmUgYSBmZWVsaW5nIHRoZSBhbnN3ZXIgbGllcyBpbiB0aGUgY29uZmlndXJhdGlvbi4gSSYjMzk7bSBnb2luZyB0byBoZWFkIHN0cmFpZ2h0IGludG8gYGxpYi9LY29uZmlnLmRlYnVnYC4gSXQmIzM5O3MgYSBrZXkgZmlsZSBmb3IgZGVidWcgb3B0aW9ucywgc28gdGhhdCYjMzk7cyBhIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQuIExldCYjMzk7cyB6ZXJvIGluIG9uIGxpbmUgNjkzLiBIb3BlZnVsbHksIHRoYXQgbG9jYXRpb24gd2lsbCB0cmlnZ2VyIGEgbWVtb3J5IG9yIGxlYWQgbWUgdG8gdGhlIHJvb3QgY2F1c2UuIEl0IGlzIGdvaW5nIHRvIGJlIGEgZGVlcCBkaXZlLiBJJiMzOTttIGhvcGluZyBJIGNhbiBtYWtlIGEgcXVpY2sgYXNzZXNzbWVudCBvZiBpdCwgYnV0IHdobyBrbm93cyB3aGF0IEkmIzM5O2xsIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bGliL0tjb25maWcuZGVidWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2OTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY5MDpcdFxuIDY5MTpcdFx0ICBJZiB1bnN1cmUsIGxlYXZlIGFuIGVtcHR5IHN0cmluZyBhbmQgdGhlIG9wdGlvbiB3aWxsIG5vdCBiZSBlbmFibGVkLlxuIDY5MjpcdFxuIDY5MzpcdGNvbmZpZyBERUJVR19GU1xuIDY5NDpcdFx0Ym9vbCBcJiMzNDtEZWJ1ZyBGaWxlc3lzdGVtXCYjMzQ7XG4gNjk1Olx0XHRoZWxwXG4gNjk2Olx0XHQgIGRlYnVnZnMgaXMgYSB2aXJ0dWFsIGZpbGUgc3lzdGVtIHRoYXQga2VybmVsIGRldmVsb3BlcnMgdXNlIHRvIHB1dFxuIDY5NzpcdFx0ICBkZWJ1Z2dpbmcgZmlsZXMgaW50by4gIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBiZSBhYmxlIHRvIHJlYWQgYW5kXG4gNjk4Olx0XHQgIHdyaXRlIHRvIHRoZXNlIGZpbGVzLlxuIDY5OTpcdFxuIDcwMDpcdFx0ICBGb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZGVidWdmcyBBUEksIHNlZVxuIDcwMTpcdFx0ICBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zLy5cbiA3MDI6XHRcbiA3MDM6XHRcdCAgSWYgdW5zdXJlLCBzYXkgTi5cbiA3MDQ6XHRcbiA3MDU6XHRjaG9pY2VcbiA3MDY6XHRcdHByb21wdCBcJiMzNDtEZWJ1Z2ZzIGRlZmF1bHQgYWNjZXNzXCYjMzQ7XG4gNzA3Olx0XHRkZXBlbmRzIG9uIERFQlVHX0ZTXG4gNzA4Olx0XHRkZWZhdWx0IERFQlVHX0ZTX0FMTE9XX0FMTFxuIDcwOTpcdFx0aGVscFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTA2MgoJCQkJCQkJb3V0cHV0OiAxNTEKCQkJCQkJCXRob3VnaHRzOiAzNTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgdGhlIEdVUCBUZXN0IFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24gc3lzdGVtYXRpY2FsbHkuIFRoZSBpbml0aWFsIGdvYWwgaXMgc3RyYWlnaHRmb3J3YXJkOiBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgYEVuYWJsZUNvbmZpZ3NgLiBTaW5jZSBgR1VQX1RFU1RgIGRlcGVuZHMgb24gYERFQlVHX0ZTYCwgZW5hYmxpbmcgYEdVUF9URVNUYCBhbHNvIG5lY2Vzc2l0YXRlcyBgREVCVUdfRlNgLiBUaHVzLCBgRW5hYmxlQ29uZmlnc2Agc2hvdWxkIGJlIGBbJiMzNDtHVVBfVEVTVCYjMzQ7LCAmIzM0O0RFQlVHX0ZTJiMzNDtdYC4gVGhhdCYjMzk7cyBhIHNpbXBsZSBkZWR1Y3Rpb24sIGJ1dCB3ZSBhbHdheXMgZG91YmxlLWNoZWNrLgoKTm93LCBvbiB0byB0aGUgYEZvY3VzU3ltYm9sc2AuIFRoZSBpbnN0cnVjdGlvbnMgZW1waGFzaXplIHNlbGVjdGluZyBrZXJuZWwgZnVuY3Rpb25zIHJpcGUgZm9yIGZ1enppbmcuIFRoZSBrZXkgaXMgdG8gYmUgc3BlY2lmaWMg4oCTIGF2b2lkaW5nIGdlbmVyaWMgZnVuY3Rpb25zIHRoYXQgd291bGQgc2tldyB0ZXN0aW5nLiBXZSB3YW50IG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIGVudHJ5IHBvaW50cy4gTG9va2luZyBhdCBgbW0vZ3VwX3Rlc3QuY2AsIEkgc2VlIGBndXBfdGVzdF9pb2N0bGAgYW5kIGBfX2d1cF90ZXN0X2lvY3RsYC4gVGhlc2Ugc2VlbSBsaWtlIHRoZSBwcmltZSBjYW5kaWRhdGVzLiBUaGV5IGFyZSBsaWtlbHkgZW50cnkgcG9pbnRzIHRvIHRoaXMgdGVzdCBmdW5jdGlvbmFsaXR5LCBzbyBJJiMzOTtsbCBpbmNsdWRlIGJvdGggYGd1cF90ZXN0X2lvY3RsYCBhbmQgYF9fZ3VwX3Rlc3RfaW9jdGxgLgoKTGV0JiMzOTtzIGRvIGEgZmluYWwgcmV2aWV3OgoKKiAgIGBXb3J0aEZ1enppbmdgOiBBYnNvbHV0ZWx5LiBUaGUgcGF0Y2ggY2xlYXJseSBtb2RpZmllcyBgX19ndXBfdGVzdF9pb2N0bGAsIGFuZCB0aGUgZGVzY3JpcHRpb24gaGlnaGxpZ2h0cyB0aGUgYnVnIGZpeCByZWxhdGVkIHRvIGFjY3VyYXRlbHkgY2FsY3VsYXRpbmcgcGlubmVkIHNpemUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGBndXBfdGVzdGAgaW9jdGwgaW50ZXJmYWNlIHdpdGhpbiBkZWJ1Z2ZzLgoqICAgYFJlYXNvbmluZ2A6IFRoZSBwYXRjaCBzcGVjaWZpY2FsbHkgYWRkcmVzc2VzIGFuIGlzc3VlIGluIGNhbGN1bGF0aW5nIHRoZSBwaW5uZWQgc2l6ZS4gSXQmIzM5O3MgYWNjZXNzaWJsZSB2aWEgdGhlIGRlYnVnZnMgaW50ZXJmYWNlIHdoZW4gYENPTkZJR19HVVBfVEVTVGAgYW5kIGBDT05GSUdfREVCVUdfRlNgIGFyZSBlbmFibGVkLiBQZXJmZWN0LgoqICAgYEVuYWJsZUNvbmZpZ3NgOiBDb25maXJtZWQgYXMgYFsmIzM0O0dVUF9URVNUJiMzNDssICYjMzQ7REVCVUdfRlMmIzM0O11gLgoqICAgYEZvY3VzU3ltYm9sc2A6IENvbmZpcm1lZCBhcyBgWyYjMzQ7Z3VwX3Rlc3RfaW9jdGwmIzM0OywgJiMzNDtfX2d1cF90ZXN0X2lvY3RsJiMzNDtdYC4KCkV2ZXJ5dGhpbmcgYWxpZ25zLiBJJiMzOTttIHJlYWR5IHRvIGludm9rZSBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7R1VQX1RFU1QmIzM0OywKICAgICYjMzQ7REVCVUdfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtndXBfdGVzdF9pb2N0bCYjMzQ7LAogICAgJiMzNDtfX2d1cF90ZXN0X2lvY3RsJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgX19ndXBfdGVzdF9pb2N0bCgpIGluIG1tL2d1cF90ZXN0LmMgdG8gY29ycmVjdGx5IHNldCB0aGUgcmV0dXJuZWQgc2l6ZSB0byAmIzM5O25yX3BhZ2VzICogUEFHRV9TSVpFJiMzOTsgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgJiMzOTthZGRyIC0gZ3VwLVx1MDAzZWFkZHImIzM5OyB3aGljaCBjb3VsZCBiZSBpbmNvcnJlY3QgaWYgZ2V0X3VzZXJfcGFnZXMvcGluX3VzZXJfcGFnZXMgdGVybWluYXRlZCBlYXJseS4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGlvY3RsIGludGVyZmFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7R1VQX1RFU1QmIzM0OywKICAgICYjMzQ7REVCVUdfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtndXBfdGVzdF9pb2N0bCYjMzQ7LAogICAgJiMzNDtfX2d1cF90ZXN0X2lvY3RsJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHVwZGF0ZXMgX19ndXBfdGVzdF9pb2N0bCgpIGluIG1tL2d1cF90ZXN0LmMgdG8gY29ycmVjdGx5IHNldCB0aGUgcmV0dXJuZWQgc2l6ZSB0byAmIzM5O25yX3BhZ2VzICogUEFHRV9TSVpFJiMzOTsgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgJiMzOTthZGRyIC0gZ3VwLVx1MDAzZWFkZHImIzM5OyB3aGljaCBjb3VsZCBiZSBpbmNvcnJlY3QgaWYgZ2V0X3VzZXJfcGFnZXMvcGluX3VzZXJfcGFnZXMgdGVybWluYXRlZCBlYXJseS4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGlvY3RsIGludGVyZmFjZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNoYW5nZXMgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXHUwMDNlc2l6ZWAgZnJvbSBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCB0byBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgIGluIGBfX2d1cF90ZXN0X2lvY3RsKClgIChgbW0vZ3VwX3Rlc3QuY2ApLiBUaGUgYHN0cnVjdCBndXBfdGVzdGAgYnVmZmVyIGlzIGZ1bGx5IGluaXRpYWxpemVkIHZpYSBgY29weV9mcm9tX3VzZXJgIGF0IHRoZSBlbnRyeSBvZiBgZ3VwX3Rlc3RfaW9jdGxgIGJlZm9yZSBiZWluZyBtb2RpZmllZCBhbmQgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRoIGBjb3B5X3RvX3VzZXJgLiBUaGUgY2hhbmdlIHNvbGVseSB1cGRhdGVzIGFuIGFyaXRobWV0aWMgY2FsY3VsYXRpb24gZm9yIGFuIG91dHB1dCBmaWVsZCByZXBvcnRpbmcgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsbHkgcGlubmVkIGJ5dGVzLiBJdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFsbG9jYXRpb25zLCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBvciBrZXJuZWwgaW5mby1sZWFrcy4gVGhlcmVmb3JlLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDJhNzM1Njg4ZWE2YmU3YWYyZDM1M2Q5YjljOTAzMjM2MGVmNmFiM2IKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAzMSAxMjowMTowNiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2d1cF90ZXN0LmMgYi9tbS9ndXBfdGVzdC5jCmluZGV4IDQ0YzFjZGZiOWMzNzEuLjE4NWJhM2JiOGVkMTAgMTAwNjQ0Ci0tLSBhL21tL2d1cF90ZXN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vZ3VwX3Rlc3QuYwpAQCAtMTg4LDcgJiM0MzsxODgsNyBAQCBzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCwKIAlucl9wYWdlcyA9IGk7CiAKIAlndXAtJmd0O2dldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpOwotCWd1cC0mZ3Q7c2l6ZSA9IGFkZHIgLSBndXAtJmd0O2FkZHI7CiYjNDM7CWd1cC0mZ3Q7c2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFOwogCiAJLyoKIAkgKiBUYWtlIGFuIHVuLWJlbmNobWFyay10aW1lZCBtb21lbnQgdG8gdmVyaWZ5IERNQSBwaW5uZWQKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNjcKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAzNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBndXBfdGVzdC5jKioKCkFscmlnaHQsIGxldCYjMzk7cyB6ZXJvIGluIG9uIGBtbS9ndXBfdGVzdC5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDE4OC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQmIzM5O3MgZ29pbmcgb24gaW4gdGhhdCBhcmVhIG9mIHRoZSBjb2RlLiBBIHF1aWNrIGByZWFkLWZpbGVgIHdpbGwgZG8gdGhlIHRyaWNrIOKAkyBpdCYjMzk7cyB0aGUgYmVzdCB3YXkgdG8gcXVpY2tseSBncmFzcCB0aGUgY29udGV4dCB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIHRyb3VibGUgb2YgbGF1bmNoaW5nIGEgZGVidWdnZXIganVzdCB5ZXQuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBmaW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxNDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE0MDpcdFx0XHRcdGJyZWFrO1xuIDE0MTpcdFxuIDE0MjpcdFx0XHRuZXh0ID0gYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRTtcbiAxNDM6XHRcdFx0aWYgKG5leHQgXHUwMDNlIGVuZCkge1xuIDE0NDpcdFx0XHRcdG5leHQgPSBlbmQ7XG4gMTQ1Olx0XHRcdFx0bnIgPSAobmV4dCAtIGFkZHIpIC8gUEFHRV9TSVpFO1xuIDE0NjpcdFx0XHR9XG4gMTQ3Olx0XG4gMTQ4Olx0XHRcdHN3aXRjaCAoY21kKSB7XG4gMTQ5Olx0XHRcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxuIDE1MDpcdFx0XHRcdG5yID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNTE6XHRcdFx0XHRcdFx0XHQgcGFnZXMgJiM0MzsgaSk7XG4gMTUyOlx0XHRcdFx0YnJlYWs7XG4gMTUzOlx0XHRcdGNhc2UgR1VQX0JBU0lDX1RFU1Q6XG4gMTU0Olx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncywgcGFnZXMgJiM0MzsgaSk7XG4gMTU1Olx0XHRcdFx0YnJlYWs7XG4gMTU2Olx0XHRcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxuIDE1NzpcdFx0XHRcdG5yID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNTg6XHRcdFx0XHRcdFx0XHQgcGFnZXMgJiM0MzsgaSk7XG4gMTU5Olx0XHRcdFx0YnJlYWs7XG4gMTYwOlx0XHRcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XG4gMTYxOlx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncywgcGFnZXMgJiM0MzsgaSk7XG4gMTYyOlx0XHRcdFx0YnJlYWs7XG4gMTYzOlx0XHRcdGNhc2UgUElOX0xPTkdURVJNX0JFTkNITUFSSzpcbiAxNjQ6XHRcdFx0XHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLFxuIDE2NTpcdFx0XHRcdFx0XHQgICAgZ3VwLVx1MDAzZWd1cF9mbGFncyB8IEZPTExfTE9OR1RFUk0sXG4gMTY2Olx0XHRcdFx0XHRcdCAgICBwYWdlcyAmIzQzOyBpKTtcbiAxNjc6XHRcdFx0XHRicmVhaztcbiAxNjg6XHRcdFx0Y2FzZSBEVU1QX1VTRVJfUEFHRVNfVEVTVDpcbiAxNjk6XHRcdFx0XHRpZiAoZ3VwLVx1MDAzZXRlc3RfZmxhZ3MgXHUwMDI2IEdVUF9URVNUX0ZMQUdfRFVNUF9QQUdFU19VU0VfUElOKVxuIDE3MDpcdFx0XHRcdFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNzE6XHRcdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4gMTcyOlx0XHRcdFx0ZWxzZVxuIDE3MzpcdFx0XHRcdFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVx1MDAzZWd1cF9mbGFncyxcbiAxNzQ6XHRcdFx0XHRcdFx0XHQgICAgcGFnZXMgJiM0MzsgaSk7XG4gMTc1Olx0XHRcdFx0YnJlYWs7XG4gMTc2Olx0XHRcdGRlZmF1bHQ6XG4gMTc3Olx0XHRcdFx0cmV0ID0gLUVJTlZBTDtcbiAxNzg6XHRcdFx0XHRnb3RvIHVubG9jaztcbiAxNzk6XHRcdFx0fVxuIDE4MDpcdFxuIDE4MTpcdFx0XHRpZiAobnIgXHUwMDNjPSAwKVxuIDE4MjpcdFx0XHRcdGJyZWFrO1xuIDE4MzpcdFx0XHRpICYjNDM7PSBucjtcbiAxODQ6XHRcdH1cbiAxODU6XHRcdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XG4gMTg2Olx0XG4gMTg3Olx0XHQvKiBTaGlmdGluZyB0aGUgbWVhbmluZyBvZiBucl9wYWdlczogbm93IGl0IGlzIGFjdHVhbCBudW1iZXIgcGlubmVkOiAqL1xuIDE4ODpcdFx0bnJfcGFnZXMgPSBpO1xuIDE4OTpcdFxuIDE5MDpcdFx0Z3VwLVx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuIDE5MTpcdFx0Z3VwLVx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcbiAxOTI6XHRcbiAxOTM6XHRcdC8qXG4gMTk0Olx0XHQgKiBUYWtlIGFuIHVuLWJlbmNobWFyay10aW1lZCBtb21lbnQgdG8gdmVyaWZ5IERNQSBwaW5uZWRcbiAxOTU6XHRcdCAqIHN0YXRlOiBwcmludCBhIHdhcm5pbmcgaWYgYW55IG5vbi1kbWEtcGlubmVkIHBhZ2VzIGFyZSBmb3VuZDpcbiAxOTY6XHRcdCAqL1xuIDE5NzpcdFx0dmVyaWZ5X2RtYV9waW5uZWQoY21kLCBwYWdlcywgbnJfcGFnZXMpO1xuIDE5ODpcdFxuIDE5OTpcdFx0aWYgKGNtZCA9PSBEVU1QX1VTRVJfUEFHRVNfVEVTVClcbiAyMDA6XHRcdFx0ZHVtcF9wYWdlc190ZXN0KGd1cCwgcGFnZXMsIG5yX3BhZ2VzKTtcbiAyMDE6XHRcbiAyMDI6XHRcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcbiAyMDM6XHRcbiAyMDQ6XHRcdHB1dF9iYWNrX3BhZ2VzKGNtZCwgcGFnZXMsIG5yX3BhZ2VzLCBndXAtXHUwMDNldGVzdF9mbGFncyk7XG4gMjA1Olx0XG4gMjA2Olx0XHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xuIDIwNzpcdFx0Z3VwLVx1MDAzZXB1dF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuIDIwODpcdFxuIDIwOTpcdHVubG9jazpcbiAyMTA6XHRcdGlmIChuZWVkc19tbWFwX2xvY2spXG4gMjExOlx0XHRcdG1tYXBfcmVhZF91bmxvY2soY3VycmVudC1cdTAwM2VtbSk7XG4gMjEyOlx0ZnJlZV9wYWdlczpcbiAyMTM6XHRcdGt2ZnJlZShwYWdlcyk7XG4gMjE0Olx0XHRyZXR1cm4gcmV0O1xuIDIxNTpcdH1cbiAyMTY6XHRcbiAyMTc6XHRzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcbiAyMTg6XHR7XG4gMjE5Olx0XHRpZiAoZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlcykge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNDQ3CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNDkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBjb2RlLgoKKipJbnZlc3RpZ2F0aW5nIGBfX2d1cF90ZXN0X2lvY3RsYCBhbmQgYGd1cF90ZXN0X2lvY3RsYCBGdW5jdGlvbmFsaXR5KioKCkFscmlnaHQsIG15IGZpcnN0IHN0ZXAgaXMgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb24gd2hhdCB0aGVzZSB0d28gZnVuY3Rpb25zLCBgX19ndXBfdGVzdF9pb2N0bGAgYW5kIGBndXBfdGVzdF9pb2N0bGAsIGFyZSBhY3R1YWxseSBkb2luZy4gR2l2ZW4gdGhhdCBJJiMzOTttIGRlYWxpbmcgd2l0aCB0aGUgaW50cmljYWNpZXMgb2YgbWVtb3J5IG1hbmFnZW1lbnQsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZWlyIHB1cnBvc2UsIGNvbnRleHQsIGFuZCBwb3RlbnRpYWwgaW50ZXJhY3Rpb25zIHdpdGhpbiB0aGUgYnJvYWRlciBrZXJuZWwgbWVtb3J5IHN1YnN5c3RlbS4gSSYjMzk7bGwgZm9jdXMgbXkgaW5pdGlhbCBhbmFseXNpcyBvbiBsaW5lcyA1MC0xNDAgYW5kIDIxNS0yODAuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIG92ZXJ2aWV3IG9mIHRoZWlyIHByaW1hcnkgb3BlcmF0aW9ucyBhbmQgaG93IHRoZXkgZml0IGludG8gdGhlIGJpZ2dlciBwaWN0dXJlLiBVbmRlcnN0YW5kaW5nIGhvdyB0aGV5JiMzOTtyZSBpbXBsZW1lbnRlZCBhbmQgd2hlcmUgdGhleSYjMzk7cmUgdXNlZCBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgYW55IHBvdGVudGlhbCBtZW1vcnktcmVsYXRlZCBpc3N1ZXMgb3Igb3B0aW1pemF0aW9ucyB0aGV5IG1pZ2h0IGVuYWJsZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogOTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA1MDpcdFx0c3RydWN0IGZvbGlvICpmb2xpbztcbiAgNTE6XHRcbiAgNTI6XHRcdHN3aXRjaCAoY21kKSB7XG4gIDUzOlx0XHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcbiAgNTQ6XHRcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XG4gIDU1Olx0XHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XG4gIDU2Olx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuICA1NzpcdFx0XHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlc1tpXSk7XG4gIDU4Olx0XG4gIDU5Olx0XHRcdFx0aWYgKFdBUk4oIWZvbGlvX21heWJlX2RtYV9waW5uZWQoZm9saW8pLFxuICA2MDpcdFx0XHRcdFx0IFwmIzM0O3BhZ2VzWyVsdV0gaXMgTk9UIGRtYS1waW5uZWRcXG5cJiMzNDssIGkpKSB7XG4gIDYxOlx0XG4gIDYyOlx0XHRcdFx0XHRkdW1wX3BhZ2UoXHUwMDI2Zm9saW8tXHUwMDNlcGFnZSwgXCYjMzQ7Z3VwX3Rlc3QgZmFpbHVyZVwmIzM0Oyk7XG4gIDYzOlx0XHRcdFx0XHRicmVhaztcbiAgNjQ6XHRcdFx0XHR9IGVsc2UgaWYgKGNtZCA9PSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLIFx1MDAyNlx1MDAyNlxuICA2NTpcdFx0XHRcdFx0V0FSTighZm9saW9faXNfbG9uZ3Rlcm1fcGlubmFibGUoZm9saW8pLFxuICA2NjpcdFx0XHRcdFx0ICAgICBcJiMzNDtwYWdlc1slbHVdIGlzIE5PVCBwaW5uYWJsZSBidXQgcGlubmVkXFxuXCYjMzQ7LFxuICA2NzpcdFx0XHRcdFx0ICAgICBpKSkge1xuICA2ODpcdFx0XHRcdFx0ZHVtcF9wYWdlKFx1MDAyNmZvbGlvLVx1MDAzZXBhZ2UsIFwmIzM0O2d1cF90ZXN0IGZhaWx1cmVcJiMzNDspO1xuICA2OTpcdFx0XHRcdFx0YnJlYWs7XG4gIDcwOlx0XHRcdFx0fVxuICA3MTpcdFx0XHR9XG4gIDcyOlx0XHRcdGJyZWFrO1xuICA3MzpcdFx0fVxuICA3NDpcdH1cbiAgNzU6XHRcbiAgNzY6XHRzdGF0aWMgdm9pZCBkdW1wX3BhZ2VzX3Rlc3Qoc3RydWN0IGd1cF90ZXN0ICpndXAsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4gIDc3Olx0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXG4gIDc4Olx0e1xuICA3OTpcdFx0dW5zaWduZWQgaW50IGluZGV4X3RvX2R1bXA7XG4gIDgwOlx0XHR1bnNpZ25lZCBpbnQgaTtcbiAgODE6XHRcbiAgODI6XHRcdC8qXG4gIDgzOlx0XHQgKiBaZXJvIG91dCBhbnkgdXNlci1zdXBwbGllZCBwYWdlIGluZGV4IHRoYXQgaXMgb3V0IG9mIHJhbmdlLiBSZW1lbWJlcjpcbiAgODQ6XHRcdCAqIC53aGljaF9wYWdlc1tdIGNvbnRhaW5zIGEgMS1iYXNlZCBzZXQgb2YgcGFnZSBpbmRpY2VzLlxuICA4NTpcdFx0ICovXG4gIDg2Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSYjNDM7JiM0MzspIHtcbiAgODc6XHRcdFx0aWYgKGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXSBcdTAwM2UgbnJfcGFnZXMpIHtcbiAgODg6XHRcdFx0XHRwcl93YXJuKFwmIzM0O1pFUk9JTkcgZHVlIHRvIG91dCBvZiByYW5nZTogLndoaWNoX3BhZ2VzWyV1XTogJXVcXG5cJiMzNDssXG4gIDg5Olx0XHRcdFx0XHRpLCBndXAtXHUwMDNld2hpY2hfcGFnZXNbaV0pO1xuICA5MDpcdFx0XHRcdGd1cC1cdTAwM2V3aGljaF9wYWdlc1tpXSA9IDA7XG4gIDkxOlx0XHRcdH1cbiAgOTI6XHRcdH1cbiAgOTM6XHRcbiAgOTQ6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpJiM0MzsmIzQzOykge1xuICA5NTpcdFx0XHRpbmRleF90b19kdW1wID0gZ3VwLVx1MDAzZXdoaWNoX3BhZ2VzW2ldO1xuICA5NjpcdFxuICA5NzpcdFx0XHRpZiAoaW5kZXhfdG9fZHVtcCkge1xuICA5ODpcdFx0XHRcdGluZGV4X3RvX2R1bXAtLTsgLy8gRGVjb2RlIGZyb20gMS1iYXNlZCwgdG8gMC1iYXNlZFxuICA5OTpcdFx0XHRcdHByX2luZm8oXCYjMzQ7LS0tLSBwYWdlICMldSwgc3RhcnRpbmcgZnJvbSB1c2VyIHZpcnQgYWRkcjogMHglbGx4XFxuXCYjMzQ7LFxuIDEwMDpcdFx0XHRcdFx0aW5kZXhfdG9fZHVtcCwgZ3VwLVx1MDAzZWFkZHIpO1xuIDEwMTpcdFx0XHRcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcbiAxMDI6XHRcdFx0XHRcdCAgXCYjMzQ7Z3VwX3Rlc3Q6IGR1bXBfcGFnZXMoKSB0ZXN0XCYjMzQ7KTtcbiAxMDM6XHRcdFx0fVxuIDEwNDpcdFx0fVxuIDEwNTpcdH1cbiAxMDY6XHRcbiAxMDc6XHRzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbiAxMDg6XHRcdFx0c3RydWN0IGd1cF90ZXN0ICpndXApXG4gMTA5Olx0e1xuIDExMDpcdFx0a3RpbWVfdCBzdGFydF90aW1lLCBlbmRfdGltZTtcbiAxMTE6XHRcdHVuc2lnbmVkIGxvbmcgaSwgbnJfcGFnZXMsIGFkZHIsIG5leHQ7XG4gMTEyOlx0XHRsb25nIG5yO1xuIDExMzpcdFx0c3RydWN0IHBhZ2UgKipwYWdlcztcbiAxMTQ6XHRcdHVuc2lnbmVkIGxvbmcgZW5kO1xuIDExNTpcdFx0aW50IHJldCA9IDA7XG4gMTE2Olx0XHRib29sIG5lZWRzX21tYXBfbG9jayA9XG4gMTE3Olx0XHRcdGNtZCAhPSBHVVBfRkFTVF9CRU5DSE1BUksgXHUwMDI2XHUwMDI2IGNtZCAhPSBQSU5fRkFTVF9CRU5DSE1BUks7XG4gMTE4Olx0XG4gMTE5Olx0XHRpZiAoZ3VwLVx1MDAzZWFkZHIgXHUwMDNlIFVMT05HX01BWCB8fCBndXAtXHUwMDNlc2l6ZSBcdTAwM2UgVUxPTkdfTUFYKVxuIDEyMDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjE6XHRcdGlmIChjaGVja19hZGRfb3ZlcmZsb3coKHVuc2lnbmVkIGxvbmcpZ3VwLVx1MDAzZWFkZHIsXG4gMTIyOlx0XHRcdFx0ICAgICAgICh1bnNpZ25lZCBsb25nKWd1cC1cdTAwM2VzaXplLCBcdTAwMjZlbmQpKVxuIDEyMzpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAxMjQ6XHRcbiAxMjU6XHRcdG5yX3BhZ2VzID0gZ3VwLVx1MDAzZXNpemUgLyBQQUdFX1NJWkU7XG4gMTI2Olx0XHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XG4gMTI3Olx0XHRpZiAoIXBhZ2VzKVxuIDEyODpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAxMjk6XHRcbiAxMzA6XHRcdGlmIChuZWVkc19tbWFwX2xvY2sgXHUwMDI2XHUwMDI2IG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKGN1cnJlbnQtXHUwMDNlbW0pKSB7XG4gMTMxOlx0XHRcdHJldCA9IC1FSU5UUjtcbiAxMzI6XHRcdFx0Z290byBmcmVlX3BhZ2VzO1xuIDEzMzpcdFx0fVxuIDEzNDpcdFxuIDEzNTpcdFx0aSA9IDA7XG4gMTM2Olx0XHRuciA9IGd1cC1cdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcbiAxMzc6XHRcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcbiAxMzg6XHRcdGZvciAoYWRkciA9IGd1cC1cdTAwM2VhZGRyOyBhZGRyIFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XG4gMTM5Olx0XHRcdGlmIChuciAhPSBndXAtXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGwpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUwODkKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRob3NlIHRob3VnaHRzIGZyb20gYW4gZXhwZXJ0JiMzOTtzIHBlcnNwZWN0aXZlLCB1c2luZyBhIGZpcnN0LXBlcnNvbiBwZXJzcGVjdGl2ZToKCioqSW52ZXN0aWdhdGluZyB0aGUgYF9fZ3VwX3Rlc3RfaW9jdGxgIENhbGwqKgoKQWxyaWdodCwgc28gdGhlIGZpcnN0IHRoaW5nIEkmIzM5O20gZG9pbmcgaXMgZHJpbGxpbmcgZG93bi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBjYWxsaW5nIGBfX2d1cF90ZXN0X2lvY3RsYC4gVGhpcyBpc24mIzM5O3QganVzdCBhIGNhc3VhbCBjdXJpb3NpdHk7IEkgc3VzcGVjdCB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIHRoZSByb290IG9mIGEgcG90ZW50aWFsIGlzc3VlLiBUaGVyZeKAmXMgbGlrZWx5IGEgc3VidGxlIGJ1ZyBjcmVlcGluZyBpbiBzb21ld2hlcmUsIG9yIG1heWJlIGp1c3Qgc29tZSB1bmV4cGVjdGVkIGJlaGF2aW9yLiBLbm93aW5nIHRoZSBjYWxsZXIgY29udGV4dCBpcyBrZXkuIEl0IHByb3ZpZGVzIHRoZSBjcnVjaWFsIGNsdWVzIGFib3V0IHRoZSBzeXN0ZW3igJlzIHN0YXRlIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGludm9rZWQsIGFuZCB0aGVyZWZvcmUgaGVscHMgbWUgZmlndXJlIG91dCB0aGUgd2h5IGFuZCBob3cgdGhpcyBmdW5jdGlvbiBpcyBydW5uaW5nIHdoZW4gaXQgcnVucy4gSSBuZWVkIHRvIHRyYWNlIHRoaXMgYmFjay4gSXMgaXQgdHJpZ2dlcmVkIGJ5IGEgc3BlY2lmaWMgZGV2aWNlPyBBIHBhcnRpY3VsYXIgc3lzdGVtIGNhbGw/IFNvbWUgb2JzY3VyZSBrZXJuZWwgbW9kdWxlIGludGVyYWN0aW9uPyBVbmRlcnN0YW5kaW5nIHRoZSBjYWxsIGNoYWluIGlzIHRoZSBzdGFydGluZyBwb2ludCB0byBkaWFnbm9zaW5nIGFueSBwcm9ibGVtLiBMZXQmIzM5O3MgZ2V0IGNyYWNraW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjowNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2d1cF90ZXN0LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI3MDpcdFx0ZGF0YS1cdTAwM2Vsb25ndGVybV9ucl9wYWdlcyA9IDA7XG4gMjcxOlx0XG4gMjcyOlx0XHR3aGlsZSAobnJfcGFnZXMgLSBkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzKSB7XG4gMjczOlx0XHRcdHJlbWFpbmluZ19wYWdlcyA9IG5yX3BhZ2VzIC0gZGF0YS1cdTAwM2Vsb25ndGVybV9ucl9wYWdlcztcbiAyNzQ6XHRcdFx0YWRkciA9IGFyZ3MuYWRkciAmIzQzOyBkYXRhLVx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzICogUEFHRV9TSVpFO1xuIDI3NTpcdFxuIDI3NjpcdFx0XHRpZiAoZmFzdClcbiAyNzc6XHRcdFx0XHRjdXJfcGFnZXMgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIHJlbWFpbmluZ19wYWdlcyxcbiAyNzg6XHRcdFx0XHRcdFx0XHRcdGd1cF9mbGFncywgcGFnZXMpO1xuIDI3OTpcdFx0XHRlbHNlXG4gMjgwOlx0XHRcdFx0Y3VyX3BhZ2VzID0gcGluX3VzZXJfcGFnZXMoYWRkciwgcmVtYWluaW5nX3BhZ2VzLFxuIDI4MTpcdFx0XHRcdFx0XHRcdCAgIGd1cF9mbGFncywgcGFnZXMpO1xuIDI4MjpcdFx0XHRpZiAoY3VyX3BhZ2VzIFx1MDAzYyAwKSB7XG4gMjgzOlx0XHRcdFx0cGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChkYXRhKTtcbiAyODQ6XHRcdFx0XHRyZXQgPSBjdXJfcGFnZXM7XG4gMjg1Olx0XHRcdFx0YnJlYWs7XG4gMjg2Olx0XHRcdH1cbiAyODc6XHRcdFx0ZGF0YS1cdTAwM2Vsb25ndGVybV9ucl9wYWdlcyAmIzQzOz0gY3VyX3BhZ2VzO1xuIDI4ODpcdFx0XHRwYWdlcyAmIzQzOz0gY3VyX3BhZ2VzO1xuIDI4OTpcdFx0fVxuIDI5MDpcdFxuIDI5MTpcdFx0aWYgKCFmYXN0KVxuIDI5MjpcdFx0XHRtbWFwX3JlYWRfdW5sb2NrKGN1cnJlbnQtXHUwMDNlbW0pO1xuIDI5MzpcdFx0cmV0dXJuIHJldDtcbiAyOTQ6XHR9XG4gMjk1Olx0XG4gMjk2Olx0c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcbiAyOTc6XHRcdFx0dW5zaWduZWQgbG9uZyBhcmcpXG4gMjk4Olx0e1xuIDI5OTpcdFx0X191NjQgdXNlcl9hZGRyO1xuIDMwMDpcdFx0dW5zaWduZWQgbG9uZyBpO1xuIDMwMTpcdFxuIDMwMjpcdFx0aWYgKCFkYXRhLVx1MDAzZWxvbmd0ZXJtX3BhZ2VzKVxuIDMwMzpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzMDQ6XHRcbiAzMDU6XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZ1c2VyX2FkZHIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHVzZXJfYWRkcikpKVxuIDMwNjpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzMDc6XHRcbiAzMDg6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGRhdGEtXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4gMzA5Olx0XHRcdHZvaWQgKmFkZHIgPSBrbWFwX2xvY2FsX3BhZ2UoZGF0YS1cdTAwM2Vsb25ndGVybV9wYWdlc1tpXSk7XG4gMzEwOlx0XHRcdHVuc2lnbmVkIGxvbmcgcmV0O1xuIDMxMTpcdFxuIDMxMjpcdFx0XHRyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpdXNlcl9hZGRyLCBhZGRyLFxuIDMxMzpcdFx0XHRcdFx0ICAgUEFHRV9TSVpFKTtcbiAzMTQ6XHRcdFx0a3VubWFwX2xvY2FsKGFkZHIpO1xuIDMxNTpcdFx0XHRpZiAocmV0KVxuIDMxNjpcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuIDMxNzpcdFx0XHR1c2VyX2FkZHIgJiM0Mzs9IFBBR0VfU0laRTtcbiAzMTg6XHRcdH1cbiAzMTk6XHRcdHJldHVybiAwO1xuIDMyMDpcdH1cbiAzMjE6XHRcbiAzMjI6XHRzdGF0aWMgbG9uZyBwaW5fbG9uZ3Rlcm1fdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4gMzIzOlx0XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhcmcpXG4gMzI0Olx0e1xuIDMyNTpcdFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlcC1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gMzI2Olx0XHRpbnQgcmV0ID0gLUVJTlZBTDtcbiAzMjc6XHRcbiAzMjg6XHRcdGlmIChtdXRleF9sb2NrX2tpbGxhYmxlKFx1MDAyNmRhdGEtXHUwMDNlbG9uZ3Rlcm1fbXV0ZXgpKVxuIDMyOTpcdFx0XHRyZXR1cm4gLUVJTlRSO1xuIDMzMDpcdFxuIDMzMTpcdFx0c3dpdGNoIChjbWQpIHtcbiAzMzI6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RBUlQ6XG4gMzMzOlx0XHRcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KGRhdGEsIGFyZyk7XG4gMzM0Olx0XHRcdGJyZWFrO1xuIDMzNTpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxuIDMzNjpcdFx0XHRwaW5fbG9uZ3Rlcm1fdGVzdF9zdG9wKGRhdGEpO1xuIDMzNzpcdFx0XHRyZXQgPSAwO1xuIDMzODpcdFx0XHRicmVhaztcbiAzMzk6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcbiAzNDA6XHRcdFx0cmV0ID0gcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChkYXRhLCBhcmcpO1xuIDM0MTpcdFx0XHRicmVhaztcbiAzNDI6XHRcdH1cbiAzNDM6XHRcbiAzNDQ6XHRcdG11dGV4X3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWxvbmd0ZXJtX211dGV4KTtcbiAzNDU6XHRcdHJldHVybiByZXQ7XG4gMzQ2Olx0fVxuIDM0NzpcdFxuIDM0ODpcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcbiAzNDk6XHRcdFx0dW5zaWduZWQgbG9uZyBhcmcpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY0ODMKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhbmFseXNpcyBvZiB0aGUgcHJvdmlkZWQgc25pcHBldCwgcHJlc2VudGVkIGFzIGEgcGVyc29uYWwgdGhvdWdodCBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBgZ3VwX3Rlc3RfaW9jdGxgKioKCk9rYXksIGxldCYjMzk7cyB6ZXJvIGluIG9uIGBndXBfdGVzdF9pb2N0bGAsIHNwZWNpZmljYWxseSBsaW5lcyAzNDggdGhyb3VnaCAzODAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHdpdGhpbiB0aGlzIHNlY3Rpb24gb2YgdGhlIGNvZGUsIGFzIGl0IGxpa2VseSBob2xkcyBjcnVjaWFsIGxvZ2ljIGZvciBbVXNlciYjMzk7cyBGaWVsZCwgZS5nLiwgbWVtb3J5IG1hbmFnZW1lbnQsIGRldmljZSBpbnRlcmFjdGlvbiwgYSBwYXJ0aWN1bGFyIGZlYXR1cmUsIGV0Yy4gLSBiYXNlZCBvbiB0aGUgdXNlciYjMzk7cyBmaWVsZCBvZiBleHBlcnRpc2VdLiBNeSBpbW1lZGlhdGUgZ29hbCBpcyB0byBncmFzcCB0aGUgY29udHJvbCBmbG93IGFuZCBpZGVudGlmeSBhbnkgcG90ZW50aWFsIGFyZWFzIG9mIGNvbmNlcm4sIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzLCBvciBkZXZpYXRpb25zIGZyb20gYmVzdCBwcmFjdGljZXMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlOgoKKiAgICoqRXJyb3IgSGFuZGxpbmc6KiogQXJlIGVycm9ycyBiZWluZyBjaGVja2VkIGFuZCBoYW5kbGVkIGFwcHJvcHJpYXRlbHk/IElzIHRoZXJlIGEgcmlzayBvZiByZXNvdXJjZSBsZWFrcyBvciBpbmNvcnJlY3QgYmVoYXZpb3IgaW4gY2FzZSBvZiBmYWlsdXJlcz8KKiAgICoqRGF0YSBTdHJ1Y3R1cmVzOioqIFdoYXQgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbnZvbHZlZD8gSG93IGFyZSB0aGV5IGJlaW5nIHVzZWQgYW5kIG1vZGlmaWVkIHdpdGhpbiB0aGlzIGZ1bmN0aW9uPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBjb25jdXJyZW5jeSBpc3N1ZXMgb3IgcmFjZSBjb25kaXRpb25zPwoqICAgKipNZW1vcnkgTWFuYWdlbWVudDoqKiBIb3cgaXMgbWVtb3J5IGJlaW5nIGFsbG9jYXRlZCBhbmQgZnJlZWQ/IEFyZSB0aGVyZSBhbnkgbWVtb3J5IGxlYWtzIG9yIGJ1ZmZlciBvdmVyZmxvd3MgdGhhdCBJIHNob3VsZCBiZSBvbiB0aGUgbG9va291dCBmb3I/CiogICAqKlBlcmZvcm1hbmNlOioqIENvdWxkIHRoaXMgc2VjdGlvbiBiZSBhIGJvdHRsZW5lY2s/IEFyZSB0aGVyZSBhbnkgb2J2aW91cyBhcmVhcyBmb3Igb3B0aW1pemF0aW9uLCBzdWNoIGFzIHVzaW5nIHByZWZldGNoaW5nLCBpbmxpbmluZywgb3IgcmVkdWNpbmcgdW5uZWNlc3Nhcnkgc3lzdGVtIGNhbGxzPwoqICAgKipTZWN1cml0eToqKiBBcmUgdGhlcmUgYW55IHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcywgc3VjaCBhcyBmb3JtYXQgc3RyaW5nIGJ1Z3Mgb3IgaW5qZWN0aW9uIGZsYXdzPwoKSSB3aWxsIHN0YXJ0IGJ5IG1lbnRhbGx5IHRyYWNpbmcgdGhlIGV4ZWN1dGlvbiBwYXRoLCBrZWVwaW5nIG15IGZpZWxkIG9mIGV4cGVydGlzZSBpbiBtaW5kIGFuZCB0aGUgcm9sZSB0aGlzIGZ1bmN0aW9uIHBsYXlzIGluIHRoZSBiaWdnZXIgcGljdHVyZS4gSSYjMzk7bGwgbmVlZCB0byBrbm93IHdoaWNoIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZCBpbiBhbmQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gZG8sIGFzIHdlbGwgYXMgdGhlIGV4cGVjdGVkIG91dHB1dHMuIEkgd2lsbCBnbyBsaW5lIGJ5IGxpbmUgdW50aWwgSSBoYXZlIGEgZ29vZCBncmFzcCBvZiB0aGUgd2hvbGUgcGljdHVyZSBhbmQgY2FuIGFuc3dlciBhbnkgcXVlc3Rpb25zIHRoYXQgSSBtYXkgaGF2ZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzQ4LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzNDg6XHRzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4gMzQ5Olx0XHRcdHVuc2lnbmVkIGxvbmcgYXJnKVxuIDM1MDpcdHtcbiAzNTE6XHRcdHN0cnVjdCBndXBfdGVzdCBndXA7XG4gMzUyOlx0XHRpbnQgcmV0O1xuIDM1MzpcdFxuIDM1NDpcdFx0c3dpdGNoIChjbWQpIHtcbiAzNTU6XHRcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxuIDM1NjpcdFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XG4gMzU3Olx0XHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XG4gMzU4Olx0XHRjYXNlIEdVUF9CQVNJQ19URVNUOlxuIDM1OTpcdFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcbiAzNjA6XHRcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XG4gMzYxOlx0XHRcdGJyZWFrO1xuIDM2MjpcdFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVDpcbiAzNjM6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RPUDpcbiAzNjQ6XHRcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcbiAzNjU6XHRcdFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XG4gMzY2Olx0XHRkZWZhdWx0OlxuIDM2NzpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiAzNjg6XHRcdH1cbiAzNjk6XHRcbiAzNzA6XHRcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZndXAsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGd1cCkpKVxuIDM3MTpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbiAzNzI6XHRcbiAzNzM6XHRcdHJldCA9IF9fZ3VwX3Rlc3RfaW9jdGwoY21kLCBcdTAwMjZndXApO1xuIDM3NDpcdFx0aWYgKHJldClcbiAzNzU6XHRcdFx0cmV0dXJuIHJldDtcbiAzNzY6XHRcbiAzNzc6XHRcdGlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBcdTAwMjZndXAsIHNpemVvZihndXApKSlcbiAzNzg6XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gMzc5Olx0XG4gMzgwOlx0XHRyZXR1cm4gMDtcbiAzODE6XHR9XG4gMzgyOlx0XG4gMzgzOlx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxuIDM4NDpcdHtcbiAzODU6XHRcdHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhO1xuIDM4NjpcdFx0aW50IHJldDtcbiAzODc6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzQ5MgoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDU1MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIGd1cF90ZXN0X2lvY3RsIENoYW5nZXMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBtb2RpZmljYXRpb24gdG8gYF9fZ3VwX3Rlc3RfaW9jdGxgLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIHVuZGVyc3RhbmQgdGhlICYjMzQ7d2h5JiMzNDsgYmVoaW5kIHRoZSBjaGFuZ2UgdG8gYGd1cC0mZ3Q7c2l6ZWAuIEkgbmVlZCB0byByZWNvbnN0cnVjdCB0aGUgbG9naWMgaW4gbXkgaGVhZCwgc3RhcnRpbmcgd2l0aCBob3cgYGd1cC0mZ3Q7c2l6ZWAgd2FzIHByZXZpb3VzbHkgY2FsY3VsYXRlZCB2ZXJzdXMgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbi4KCkkgc2VlIHRoYXQgYGd1cC0mZ3Q7c2l6ZWAgdXNlZCB0byBiZSBgYWRkciAtIGd1cC0mZ3Q7YWRkcmAuIEkgbmVlZCB0byBjb25maXJtIHRoZSBjb25kaXRpb25zIHdoZXJlIHRoaXMgYXBwcm9hY2ggZmVsbCBzaG9ydCBhbmQgaG93IHRoZSBuZXcgbWV0aG9kLCBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgLCBpbXByb3ZlcyB0aGUgcmVzdWx0LgoKTG9va2luZyBjbG9zZWx5IGF0IHRoZSBsb29wLCB0aGUgdmFyaWFibGUgYGFkZHJgIGlzIGluY3JlbWVudGVkLCBhbmQgYG5leHRgIGlzIHNldCB0byBgYWRkciAmIzQzOyBuciAqIFBBR0VfU0laRWAgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGl0ZXJhdGlvbi4gVGhlIGNydWNpYWwgcG9pbnQgaXMgdGhhdCBgbnJgIGlzIHRoZSAqcmVxdWVzdGVkKiBudW1iZXIgb2YgcGFnZXMgKmJlZm9yZSogdGhlIGBzd2l0Y2hgIHN0YXRlbWVudCB0aGF0IGNhbGxzIGBnZXRfdXNlcl9wYWdlc2AuIEkgYW0gbm90aWNpbmcgdGhhdCBgbnJgIG1pZ2h0IG5vdCBiZSB0aGUgYWN0dWFsIG51bWJlciBvZiBwYWdlcyBwaW5uZWQgKHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uKS4gSW4gdGhlIGNvZGUsIGlmIGBucmAgaXMgbGVzcyB0aGFuIHJlcXVlc3RlZCwgdGhlIGxvb3Agd2lsbCBicmVhay4gSSBuZWVkIHRvIHRoaW5rIHRoaXMgdGhyb3VnaC4gYG5leHRgIGlzIHN0aWxsIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgY291bnQsIGJ1dCBgaWAgd2lsbCBvbmx5IHRyYWNrIHRoZSBhY3R1YWwgbnVtYmVyIHBpbm5lZC4gVGhhdCYjMzk7cyBpdCEgSWYgYGdldF91c2VyX3BhZ2VzYCByZXR1cm5zIGZld2VyIHBhZ2VzIHRoYW4gcmVxdWVzdGVkIChwYXJ0aWFsIHN1Y2Nlc3Mgb3IgZmFpbHVyZSksIHRoZSBjb21wdXRhdGlvbiBvZiBgYWRkcmAgaXMgbm93IGluYWNjdXJhdGUuIFRoZSBlYXJsaWVyIGBhZGRyIC0gZ3VwLSZndDthZGRyYCBjYWxjdWxhdGlvbiBvZiBgZ3VwLSZndDtzaXplYCBkb2VzbiYjMzk7dCByZWZsZWN0IHRoZSBieXRlcyBvciBwYWdlcyB0aGF0IHdlcmUgKmFjdHVhbGx5KiBwaW5uZWQuIFRoZSBicmVhayBpcyB0aGUga2V5LgoKVGhpcyBsZWFkcyBtZSB0byB1bmRlcnN0YW5kIHRoZSBjaGFuZ2UuIFRoZSBuZXcgY2FsY3VsYXRpb24sIGBucl9wYWdlcyAqIFBBR0VfU0laRWAsIHVzZXMgYG5yX3BhZ2VzYCwgd2hpY2ggaXMgdGhlIHZhcmlhYmxlIGBpYCB0aGF0IEkgZGV0ZXJtaW5lZCBlYXJsaWVyLCBpcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHBpbm5lZC4gVGhpcyBpcyBhIG1vcmUgcHJlY2lzZSBhbmQgY29ycmVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBzaXplIHdpdGhpbiBgc3RydWN0IGd1cF90ZXN0YC4gVGhpcyBjaGFuZ2UgaXMgc3RyYWlnaHRmb3J3YXJkLCBhcyBgZ3VwLSZndDtzaXplYCBpcyBqdXN0IGFuIGludGVnZXIgaW4gdGhlIHN0cnVjdC4KCk5vdywgbGV0JiMzOTtzIHF1aWNrbHkgcmV2aWV3IHRoZSBgc3RydWN0IGd1cF90ZXN0YCBkZWZpbml0aW9uIHRvIGVuc3VyZSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoaXMgZmllbGQmIzM5O3MgcHVycG9zZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHN1cnJvdW5kaW5nIGRhdGEuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3N0cnVjdCBndXBfdGVzdFxcYiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9ndXBfdGVzdC5jPTQ2PXN0YXRpYyB2b2lkIHZlcmlmeV9kbWFfcGlubmVkKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4tLVxubW0vZ3VwX3Rlc3QuYy03NS1cbm1tL2d1cF90ZXN0LmM6NzY6c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxubW0vZ3VwX3Rlc3QuYy03Ny1cdFx0XHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbi0tXG5tbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcbm1tL2d1cF90ZXN0LmM6MTA4Olx0XHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcbm1tL2d1cF90ZXN0LmMtMTA5LXtcbi0tXG5tbS9ndXBfdGVzdC5jPTM0OD1zdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXG4tLVxubW0vZ3VwX3Rlc3QuYy0zNTAte1xubW0vZ3VwX3Rlc3QuYzozNTE6XHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwO1xubW0vZ3VwX3Rlc3QuYy0zNTItXHRpbnQgcmV0O1xuLS1cbm1tL2d1cF90ZXN0LmgtNi1cbm1tL2d1cF90ZXN0Lmg6NzojZGVmaW5lIEdVUF9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDEsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6ODojZGVmaW5lIFBJTl9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDIsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6OTojZGVmaW5lIFBJTl9MT05HVEVSTV9CRU5DSE1BUktcdF9JT1dSKCYjMzk7ZyYjMzk7LCAzLCBzdHJ1Y3QgZ3VwX3Rlc3QpXG5tbS9ndXBfdGVzdC5oOjEwOiNkZWZpbmUgR1VQX0JBU0lDX1RFU1RcdFx0X0lPV1IoJiMzOTtnJiMzOTssIDQsIHN0cnVjdCBndXBfdGVzdClcbm1tL2d1cF90ZXN0Lmg6MTE6I2RlZmluZSBQSU5fQkFTSUNfVEVTVFx0XHRfSU9XUigmIzM5O2cmIzM5OywgNSwgc3RydWN0IGd1cF90ZXN0KVxubW0vZ3VwX3Rlc3QuaDoxMjojZGVmaW5lIERVTVBfVVNFUl9QQUdFU19URVNUXHRfSU9XUigmIzM5O2cmIzM5OywgNiwgc3RydWN0IGd1cF90ZXN0KVxubW0vZ3VwX3Rlc3QuaC0xMy0jZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUXHRfSU9XKCYjMzk7ZyYjMzk7LCA3LCBzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QpXG4tLVxubW0vZ3VwX3Rlc3QuaC0yMC1cbm1tL2d1cF90ZXN0Lmg6MjE6c3RydWN0IGd1cF90ZXN0IHtcbm1tL2d1cF90ZXN0LmgtMjItXHRfX3U2NCBnZXRfZGVsdGFfdXNlYztcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jPTUxPXZvaWQgKmd1cF90aHJlYWQodm9pZCAqZGF0YSlcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmMtNTIte1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZ3VwX3Rlc3QuYzo1MzpcdHN0cnVjdCBndXBfdGVzdCBndXAgPSAqKHN0cnVjdCBndXBfdGVzdCAqKWRhdGE7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jLTU0LVx0aW50IGksIHN0YXR1cztcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jPTkyPWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmMtOTMte1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZ3VwX3Rlc3QuYzo5NDpcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7IDAgfTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmMtOTUtXHRpbnQgZmlsZWQsIGksIG9wdCwgbnJfcGFnZXMgPSAxLCB0aHAgPSAtMSwgd3JpdGUgPSAxLCBudGhyZWFkcyA9IDEsIHJldDtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYz0xNzYyPXN0YXRpYyBpbnQgZ3VwX3Rlc3RfZXhlYyhpbnQgZ3VwX2ZkLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCBjbWQsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMtMTc2NC17XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYzoxNzY1Olx0c3RydWN0IGd1cF90ZXN0IGd1cCA9IHtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jLTE3NjYtXHRcdC5ucl9wYWdlc19wZXJfY2FsbFx0PSBucGFnZXMsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk1NTAKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkRpdmluZyBpbnRvIGBtbS9ndXBfdGVzdC5oYCoqCgpBbHJpZ2h0LCB0aW1lIHRvIGdldCB0byBpdC4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggYG1tL2d1cF90ZXN0LmhgLiBUaGlzIGlzIGxpa2VseSB3aGVyZSB0aGUgY29yZSB0ZXN0IGluZnJhc3RydWN0dXJlIGZvciB0aGUgR2V0IFVzZXIgUGFnZXMgKEdVUCkgZnVuY3Rpb25hbGl0eSByZXNpZGVzLiBLbm93aW5nIHRoZSBpbnRyaWNhY2llcyBvZiB0aGlzIGZpbGUgaXMgY3J1Y2lhbCBmb3IgYSBkZWVwIHVuZGVyc3RhbmRpbmcgb2YgaG93IG1lbW9yeSBtYXBwaW5nIGFuZCBwYWdlIGZhdWx0IGhhbmRsaW5nIGFyZSBiZWluZyB0ZXN0ZWQgd2l0aGluIHRoZSBrZXJuZWwuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbnRhbCBtYXAgb2YgdGhpcyBwYXJ0aWN1bGFyIHNldCBvZiB0ZXN0cyDigJMgYXJlIHRoZXkgZm9jdXNpbmcgb24gc3BlY2lmaWMgR1VQIG9wdGltaXphdGlvbiBwYXRocywgYm91bmRhcnkgY29uZGl0aW9ucywgY29uY3VycmVudCBhY2Nlc3Mgc2NlbmFyaW9zLCBvciBwZXJoYXBzIGRpZmZlcmVudCBtZW1vcnkgem9uZXM/IAoKSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2UgdGhlIGRlZmluaXRpb25zIG9mIHRlc3Qgc3RydWN0dXJlcywgaGVscGVyIG1hY3JvcyBmb3Igc2V0dGluZyB1cCBtZW1vcnkgcmVnaW9ucyBhbmQgaW5qZWN0aW5nIGZhdWx0cywgYXNzZXJ0aW9ucyB0byB2YWxpZGF0ZSB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IsIGFuZCBhbnkgaW50cmljYXRlIHRocmVhZGluZyBtb2RlbHMgdGhleSYjMzk7cmUgZW1wbG95aW5nLiBTcGVjaWZpY2FsbHksIEkmIzM5O2xsIGJlIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gYW55IHVzZXMgb2YgYGd1cF9mYXN0YCwgYGd1cF9vbmVfcGFnZWAsIG9yIHNpbWlsYXIgZnVuY3Rpb25zIHRvIHNlZSBob3cgZWZmaWNpZW50bHkgdGhleSYjMzk7cmUgdGVzdGluZyB0aGUgY29tbW9uIEdVUCBjb2RlIHBhdGhzLiBBbnkgY3VzdG9tIHBhZ2UgZmF1bHQgaGFuZGxlcnMgdXNlZCBoZXJlPyBBbnkgaW50ZXJlc3Rpbmcgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM/IEFyZSB0aGV5IHVzaW5nIGtlcm5lbCB0ZXN0IHN1aXRlcyBvciBhIG1vcmUgYWQtaG9jIGFwcHJvYWNoPyBJdCYjMzk7cyBhbGwgYWJvdXQgZW5zdXJpbmcgdGhlIHRlc3QgY292ZXJhZ2UgaXMgcm9idXN0IGFuZCBlZmZlY3RpdmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vZ3VwX3Rlc3QuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyICovXG4gICAyOlx0I2lmbmRlZiBfX0dVUF9URVNUX0hcbiAgIDM6XHQjZGVmaW5lIF9fR1VQX1RFU1RfSFxuICAgNDpcdFxuICAgNTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L3R5cGVzLmhcdTAwM2VcbiAgIDY6XHRcbiAgIDc6XHQjZGVmaW5lIEdVUF9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDEsIHN0cnVjdCBndXBfdGVzdClcbiAgIDg6XHQjZGVmaW5lIFBJTl9GQVNUX0JFTkNITUFSS1x0X0lPV1IoJiMzOTtnJiMzOTssIDIsIHN0cnVjdCBndXBfdGVzdClcbiAgIDk6XHQjZGVmaW5lIFBJTl9MT05HVEVSTV9CRU5DSE1BUktcdF9JT1dSKCYjMzk7ZyYjMzk7LCAzLCBzdHJ1Y3QgZ3VwX3Rlc3QpXG4gIDEwOlx0I2RlZmluZSBHVVBfQkFTSUNfVEVTVFx0XHRfSU9XUigmIzM5O2cmIzM5OywgNCwgc3RydWN0IGd1cF90ZXN0KVxuICAxMTpcdCNkZWZpbmUgUElOX0JBU0lDX1RFU1RcdFx0X0lPV1IoJiMzOTtnJiMzOTssIDUsIHN0cnVjdCBndXBfdGVzdClcbiAgMTI6XHQjZGVmaW5lIERVTVBfVVNFUl9QQUdFU19URVNUXHRfSU9XUigmIzM5O2cmIzM5OywgNiwgc3RydWN0IGd1cF90ZXN0KVxuICAxMzpcdCNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfU1RBUlRcdF9JT1coJiMzOTtnJiMzOTssIDcsIHN0cnVjdCBwaW5fbG9uZ3Rlcm1fdGVzdClcbiAgMTQ6XHQjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUT1BcdF9JTygmIzM5O2cmIzM5OywgOClcbiAgMTU6XHQjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1JFQURcdF9JT1coJiMzOTtnJiMzOTssIDksIF9fdTY0KVxuICAxNjpcdFxuICAxNzpcdCNkZWZpbmUgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVBcdFx0OFxuICAxODpcdFxuICAxOTpcdCNkZWZpbmUgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU5cdDB4MVxuICAyMDpcdFxuICAyMTpcdHN0cnVjdCBndXBfdGVzdCB7XG4gIDIyOlx0XHRfX3U2NCBnZXRfZGVsdGFfdXNlYztcbiAgMjM6XHRcdF9fdTY0IHB1dF9kZWx0YV91c2VjO1xuICAyNDpcdFx0X191NjQgYWRkcjtcbiAgMjU6XHRcdF9fdTY0IHNpemU7XG4gIDI2Olx0XHRfX3UzMiBucl9wYWdlc19wZXJfY2FsbDtcbiAgMjc6XHRcdF9fdTMyIGd1cF9mbGFncztcbiAgMjg6XHRcdF9fdTMyIHRlc3RfZmxhZ3M7XG4gIDI5Olx0XHQvKlxuICAzMDpcdFx0ICogRWFjaCBub24temVybyBlbnRyeSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBwYWdlICgxLWJhc2VkOiBmaXJzdCBwYWdlIGlzXG4gIDMxOlx0XHQgKiBwYWdlIDEsIHNvIHRoYXQgemVybyBlbnRyaWVzIG1lYW4gXCYjMzQ7ZG8gbm90aGluZ1wmIzM0OykgZnJvbSB0aGUgLmFkZHIgYmFzZS5cbiAgMzI6XHRcdCAqL1xuICAzMzpcdFx0X191MzIgd2hpY2hfcGFnZXNbR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVBdO1xuICAzNDpcdH07XG4gIDM1Olx0XG4gIDM2Olx0I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9GTEFHX1VTRV9XUklURVx0MVxuICAzNzpcdCNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfRkxBR19VU0VfRkFTVFx0XHQyXG4gIDM4Olx0XG4gIDM5Olx0c3RydWN0IHBpbl9sb25ndGVybV90ZXN0IHtcbiAgNDA6XHRcdF9fdTY0IGFkZHI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNjA4CgkJCQkJCQlvdXRwdXQ6IDE4MgoJCQkJCQkJdGhvdWdodHM6IDYzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoOiBtbS9ndXBfdGVzdC5jKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoaXMgcGF0Y2ggaW4gYG1tL2d1cF90ZXN0LmNgIGlzIGNoYW5naW5nIGhvdyBgZ3VwLSZndDtzaXplYCBpcyBjYWxjdWxhdGVkLiBQcmV2aW91c2x5LCBpdCB3YXMgYGFkZHIgLSBndXAtJmd0O2FkZHJgLCBub3cgaXQmIzM5O3MgYG5yX3BhZ2VzICogUEFHRV9TSVpFYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGltbWVkaWF0ZWx5IGNoZWNrIGZvciBhbnkgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGV4cG9zdXJlcywgYXMgdGhhdCYjMzk7cyBhIGNsYXNzaWMgS01TQU4gcmVkIGZsYWcuCgpGaXJzdCwgaXMgdGhlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgKmV4cG9zZWQqPyBObywgdGhlIGBndXBgIHN0cnVjdCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBndXBfdGVzdF9pb2N0bGAsIGFuZCBgY29weV9mcm9tX3VzZXJgIGluaXRpYWxpemVzIHRoZSAqZW50aXJlKiBzdHJ1Y3QgZnJvbSB1c2VyIHNwYWNlLiBFdmVyeSBzaW5nbGUgYnl0ZSBnZXRzIHBvcHVsYXRlZC4gVGhlbiwgYF9fZ3VwX3Rlc3RfaW9jdGxgIG1vZGlmaWVzIGNlcnRhaW4gZmllbGRzIOKAkyBgZ3VwLSZndDtzaXplYCwgdGltaW5nIGRhdGEsIGFuZCBwb3NzaWJseSBhcnJheSBlbGVtZW50cyB3aXRoaW4gYGd1cGAgYnV0ICphZnRlciogdGhlIGBndXBgIHN0cnVjdCBpcyBpbml0aWFsaXplZC4gRmluYWxseSwgYGNvcHlfdG9fdXNlcmAgd3JpdGVzIHRoZSBlbnRpcmUgc3RydWN0IGJhY2suIFRoZSBjaGFuZ2UgaGVyZSBpcyAqc29sZWx5KiBob3cgYW4gaW50ZWdlciwgYGd1cC0mZ3Q7c2l6ZWAsIGlzIGNhbGN1bGF0ZWQsIGJlZm9yZSBiZWluZyByZXR1cm5lZCB0byB1c2VyIHNwYWNlLiBJdCBkb2VzbiYjMzk7dCBsZWF2ZSB1bmluaXRpYWxpemVkIGRhdGEgaW4gdGhlIGtlcm5lbC4KClNlY29uZCwgZG9lcyB0aGlzIG1lc3Mgd2l0aCBidWZmZXIgc2l6ZXMgb3IgYm91bmRzIGNoZWNrcyBhbmQgcG90ZW50aWFsbHkgKnJlYWQqIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBOby4gVGhlIGFsbG9jYXRpb24gb2YgYG5yX3BhZ2VzYCBhbmQgYHBhZ2VzYCBoYXBwZW5zICpiZWZvcmUqIHRoZSBsb29wLiBUaGUgYHBhZ2VzYCBhbGxvY2F0aW9uIGlzIGluZGVwZW5kZW50IGFuZCBgZ3VwLSZndDtzaXplYCAocG9zdCBjaGFuZ2UpIGlzbiYjMzk7dCB1c2VkIGluIGFueSBtZW1vcnkgYWNjZXNzICphZnRlcndhcmRzKi4gVGhlIGNoYW5nZSBpcyBqdXN0IGFib3V0IHRoZSBpbnRlZ2VyIGNhbGN1bGF0aW9uIHRoYXQgcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUgb3BlcmF0aW9uOyBpdCYjMzk7cyBqdXN0IGJlaW5nIHVwZGF0ZWQgYW5kIHNlbnQgYmFjayB0byB1c2Vyc3BhY2UuCgpTbywgaW4gc3VtbWFyeSwgYmFzZWQgb24gbXkgdW5kZXJzdGFuZGluZywgdGhlcmUgYXJlICpubyogdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIG5vIGluZm8gbGVha3Mgb2YgdW5pbml0aWFsaXplZCBrZXJuZWwgbWVtb3J5LCBhbmQgbm8gYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcyBhIGNvbnNlcXVlbmNlIG9mIHRoaXMgcGF0Y2guIFRoZSBzdHJ1Y3QgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgZnJvbSB1c2VyIHNwYWNlLCBhbmQgdGhlIGNoYW5nZSBzaW1wbHkgYWx0ZXJzIGhvdyBhIHNpbmdsZSBpbnRlZ2VyIGlzIGNvbXB1dGVkIGJlZm9yZSBiZWluZyBjb3BpZWQgKmJhY2sqIHRvIHVzZXIgc3BhY2UsIGluZGljYXRpbmcgdGhhdCB0aGlzIGRvZXNuJiMzOTt0IHdhcnJhbnQgS01TQU4uIFN0YW5kYXJkIGZ1enppbmcgYW5kIG90aGVyIGRldGVjdG9ycyBzaG91bGQgYmUgc3VmZmljaWVudCB0byBpZGVudGlmeSBhbnkgaXNzdWVzLgoKVGhlcmVmb3JlLCBgTmVlZHNLTVNBTmAgaXMgZGVmaW5pdGVseSBgZmFsc2VgLiBUaW1lIHRvIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggY2hhbmdlcyB0aGUgY2FsY3VsYXRpb24gb2YgYGd1cC1cdTAwM2VzaXplYCBmcm9tIGBhZGRyIC0gZ3VwLVx1MDAzZWFkZHJgIHRvIGBucl9wYWdlcyAqIFBBR0VfU0laRWAgaW4gYF9fZ3VwX3Rlc3RfaW9jdGwoKWAgKGBtbS9ndXBfdGVzdC5jYCkuIFRoZSBgc3RydWN0IGd1cF90ZXN0YCBidWZmZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYXQgdGhlIGVudHJ5IG9mIGBndXBfdGVzdF9pb2N0bGAgYmVmb3JlIGJlaW5nIG1vZGlmaWVkIGFuZCBjb3BpZWQgYmFjayB0byB1c2VyIHNwYWNlIHdpdGggYGNvcHlfdG9fdXNlcmAuIFRoZSBjaGFuZ2Ugc29sZWx5IHVwZGF0ZXMgYW4gYXJpdGhtZXRpYyBjYWxjdWxhdGlvbiBmb3IgYW4gb3V0cHV0IGZpZWxkIHJlcG9ydGluZyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBwaW5uZWQgYnl0ZXMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMsIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnksIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCByZXF1aXJlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGNoYW5nZXMgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXHUwMDNlc2l6ZWAgZnJvbSBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCB0byBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgIGluIGBfX2d1cF90ZXN0X2lvY3RsKClgIChgbW0vZ3VwX3Rlc3QuY2ApLiBUaGUgYHN0cnVjdCBndXBfdGVzdGAgYnVmZmVyIGlzIGZ1bGx5IGluaXRpYWxpemVkIHZpYSBgY29weV9mcm9tX3VzZXJgIGF0IHRoZSBlbnRyeSBvZiBgZ3VwX3Rlc3RfaW9jdGxgIGJlZm9yZSBiZWluZyBtb2RpZmllZCBhbmQgY29waWVkIGJhY2sgdG8gdXNlciBzcGFjZSB3aXRoIGBjb3B5X3RvX3VzZXJgLiBUaGUgY2hhbmdlIHNvbGVseSB1cGRhdGVzIGFuIGFyaXRobWV0aWMgY2FsY3VsYXRpb24gZm9yIGFuIG91dHB1dCBmaWVsZCByZXBvcnRpbmcgdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsbHkgcGlubmVkIGJ5dGVzLiBJdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFsbG9jYXRpb25zLCByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBvciBrZXJuZWwgaW5mby1sZWFrcy4gVGhlcmVmb3JlLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3QgcmVxdWlyZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjAxOjA4LjExMjA2NDcxM1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1NzYyNjc1NDE3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJHVVBfVEVTVFwiLFxuICAgIFwiREVCVUdfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJndXBfdGVzdF9pb2N0bFwiLFxuICAgIFwiX19ndXBfdGVzdF9pb2N0bFwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY2hhbmdlcyB0aGUgY2FsY3VsYXRpb24gb2YgYGd1cC1cXHUwMDNlc2l6ZWAgZnJvbSBgYWRkciAtIGd1cC1cXHUwMDNlYWRkcmAgdG8gYG5yX3BhZ2VzICogUEFHRV9TSVpFYCBpbiBgX19ndXBfdGVzdF9pb2N0bCgpYCAoYG1tL2d1cF90ZXN0LmNgKS4gVGhlIGBzdHJ1Y3QgZ3VwX3Rlc3RgIGJ1ZmZlciBpcyBmdWxseSBpbml0aWFsaXplZCB2aWEgYGNvcHlfZnJvbV91c2VyYCBhdCB0aGUgZW50cnkgb2YgYGd1cF90ZXN0X2lvY3RsYCBiZWZvcmUgYmVpbmcgbW9kaWZpZWQgYW5kIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2Ugd2l0aCBgY29weV90b191c2VyYC4gVGhlIGNoYW5nZSBzb2xlbHkgdXBkYXRlcyBhbiBhcml0aG1ldGljIGNhbGN1bGF0aW9uIGZvciBhbiBvdXRwdXQgZmllbGQgcmVwb3J0aW5nIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IHBpbm5lZCBieXRlcy4gSXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBhbGxvY2F0aW9ucywgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSwgb3Iga2VybmVsIGluZm8tbGVha3MuIFRoZXJlZm9yZSwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgX19ndXBfdGVzdF9pb2N0bCgpIGluIG1tL2d1cF90ZXN0LmMgdG8gY29ycmVjdGx5IHNldCB0aGUgcmV0dXJuZWQgc2l6ZSB0byAnbnJfcGFnZXMgKiBQQUdFX1NJWkUnIHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nICdhZGRyIC0gZ3VwLVxcdTAwM2VhZGRyJyB3aGljaCBjb3VsZCBiZSBpbmNvcnJlY3QgaWYgZ2V0X3VzZXJfcGFnZXMvcGluX3VzZXJfcGFnZXMgdGVybWluYXRlZCBlYXJseS4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGlvY3RsIGludGVyZmFjZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6MDguMTEyMDY5MjUzWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzk0MTM1MTk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMmE3MzU2ODhlYTZiZTdhZjJkMzUzZDliOWM5MDMyMzYwZWY2YWIzYlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIEF1ZyAzMSAxMjowMTowNiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xcbmluZGV4IDQ0YzFjZGZiOWMzNzEuLjE4NWJhM2JiOGVkMTAgMTAwNjQ0XFxuLS0tIGEvbW0vZ3VwX3Rlc3QuY1xcbisrKyBiL21tL2d1cF90ZXN0LmNcXG5AQCAtMTg4LDcgKzE4OCw3IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxcbiBcXHRucl9wYWdlcyA9IGk7XFxuIFxcbiBcXHRndXAtXFx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xcbi1cXHRndXAtXFx1MDAzZXNpemUgPSBhZGRyIC0gZ3VwLVxcdTAwM2VhZGRyO1xcbitcXHRndXAtXFx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcXG4gXFxuIFxcdC8qXFxuIFxcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTowOS41MDcwODAyMzJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjE5NzAyNjU5NTg1MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJHVVBfVEVTVFwiLFxuICAgIFwiREVCVUdfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJndXBfdGVzdF9pb2N0bFwiLFxuICAgIFwiX19ndXBfdGVzdF9pb2N0bFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHVwZGF0ZXMgX19ndXBfdGVzdF9pb2N0bCgpIGluIG1tL2d1cF90ZXN0LmMgdG8gY29ycmVjdGx5IHNldCB0aGUgcmV0dXJuZWQgc2l6ZSB0byAnbnJfcGFnZXMgKiBQQUdFX1NJWkUnIHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nICdhZGRyIC0gZ3VwLVxcdTAwM2VhZGRyJyB3aGljaCBjb3VsZCBiZSBpbmNvcnJlY3QgaWYgZ2V0X3VzZXJfcGFnZXMvcGluX3VzZXJfcGFnZXMgdGVybWluYXRlZCBlYXJseS4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IGlvY3RsIGludGVyZmFjZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMmE3MzU2ODhlYTZiZTdhZjJkMzUzZDliOWM5MDMyMzYwZWY2YWIzYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDMxIDEyOjAxOjA2IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vZ3VwX3Rlc3QuYyBiL21tL2d1cF90ZXN0LmNcbmluZGV4IDQ0YzFjZGZiOWMzNzEuLjE4NWJhM2JiOGVkMTAgMTAwNjQ0XG4tLS0gYS9tbS9ndXBfdGVzdC5jXG4rKysgYi9tbS9ndXBfdGVzdC5jXG5AQCAtMTg4LDcgKzE4OCw3IEBAIHN0YXRpYyBpbnQgX19ndXBfdGVzdF9pb2N0bCh1bnNpZ25lZCBpbnQgY21kLFxuIFx0bnJfcGFnZXMgPSBpO1xuIFxuIFx0Z3VwLVx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xuLVx0Z3VwLVx1MDAzZXNpemUgPSBhZGRyIC0gZ3VwLVx1MDAzZWFkZHI7XG4rXHRndXAtXHUwMDNlc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuIFxuIFx0LypcbiBcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6MDkuNTA3MTA0NjkyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTY3Mzk0NjQ0OTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGEgS2VybmVsIFBhdGNoOiBndXBfdGVzdC5jKipcblxuT2theSwgc28gdGhlIHVzZXIgd2FudHMgbWUgdG8gdGFrZSBhIGxvb2sgYXQgYSBwYXRjaCwgc3BlY2lmaWNhbGx5IGEgYGRpZmZgIGZvciBgbW0vZ3VwX3Rlc3QuY2AuIFRoZSBjb3JlIHNlZW1zIHRvIGJlIHJlbGF0ZWQgdG8gYGd1cGAgdGVzdGluZywgd2hpY2ggbGlrZWx5IHBlcnRhaW5zIHRvIFwiZ2V0IHVzZXIgcGFnZXNcIiBvciBhIHNpbWlsYXIgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBxdWlja2x5IHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2UuIExldCdzIHNlZS4uLiBhIGNvbW1pdCwgYW5kIHRoZSBkaWZmIHNob3dzIGEgbW9kaWZpY2F0aW9uIGFyb3VuZCBsaW5lIDE4OC5cblxuSSBzZWUgYSBjaGFuZ2Ugd2hlcmUgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXHUwMDNlc2l6ZWAgaGFzIGJlZW4gbW9kaWZpZWQuIFByZXZpb3VzbHksIGl0IHdhcyBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCwgYnV0IG5vdyBpdCdzIGBucl9wYWdlcyAqIFBBR0VfU0laRWAuIEFoLCBJIHNlZSEgQmVmb3JlIGl0IHdhcyBwcmVzdW1hYmx5IGNhbGN1bGF0aW5nIHRoZSBzaXplIGJhc2VkIG9uIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0YXJ0aW5nIGFkZHJlc3MgYW5kIHRoZSBlbmRpbmcgYWRkcmVzcywgYW5kIG5vdywgaXQncyBleHBsaWNpdGx5IGNvbXB1dGluZyBpdCBieSBtdWx0aXBseWluZyB0aGUgbnVtYmVyIG9mIHBhZ2VzIGJ5IHRoZSBwYWdlIHNpemUuIFRoaXMgaXMgcHJvYmFibHkgYW4gaW1wcm92ZW1lbnQgZm9yIGNsYXJpdHkgYW5kIGFjY3VyYWN5LiBJdCBzdHJvbmdseSBzdWdnZXN0cyB0aGF0IHRoZSBwcmV2aW91cyBjYWxjdWxhdGlvbiB3YXMgcHJvbmUgdG8gZXJyb3JzLCBwb3NzaWJseSBkdWUgdG8gYWxpZ25tZW50IGlzc3VlcyBvciBhbiBpbmNvcnJlY3QgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGJ1ZmZlciBib3VuZGFyaWVzLCBvciwgcGVyaGFwcywgd2FzIG1pc2xlYWRpbmcuIE5vdywgaXQncyBkaXJlY3RseSBkZXJpdmVkIGZyb20gdGhlIG51bWJlciBvZiBwYWdlcywgd2hpY2ggaXMgY2xlYW5lciBhbmQgbW9yZSByb2J1c3QuXG5cbkknbGwgaGF2ZSB0byBpbnZlc3RpZ2F0ZSBpZiB0aGlzIGlzIGEgY29ycmVjdGlvbiBvZiBhIGRlZmVjdCwgb3Igc2ltcGx5IGFuIGltcHJvdmVtZW50LiBMZXQncyBzZWUsIHdoYXQgZWxzZSBkb2VzIHRoZSBwYXRjaCB0b3VjaC4uLiBUaGUgc3Vycm91bmRpbmcgY29kZSBzZWVtcyByZWxhdGVkIHRvIGJlbmNobWFya2luZyB0aGUgZ2V0X3VzZXJfcGFnZXMgZnVuY3Rpb25hbGl0eSBhbmQgdmVyaWZ5aW5nIERNQS1waW5uZWQgcGFnZXMsIHByb2JhYmx5IGZvciBwZXJmb3JtYW5jZS4gSSBleHBlY3QgdGhpcyBjaGFuZ2Ugd2lsbCBtYWtlIHRoZSBiZW5jaG1hcmtzIG1vcmUgcHJlY2lzZS4gVGhpcyBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSBhbmQgcHJvYmFibHkgYSBnb29kIGNoYW5nZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA3MCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIzNiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjAxOjI2LjI0NjU3MTc5M1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY2NjMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTcwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTcwOlxcdFxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNzE6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE3MjpcXHRcXHRcXHRcXHRlbHNlXFxuIDE3MzpcXHRcXHRcXHRcXHRcXHRuciA9IGdldF91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTc0OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNzU6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE3NjpcXHRcXHRcXHRkZWZhdWx0OlxcbiAxNzc6XFx0XFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4gMTc4OlxcdFxcdFxcdFxcdGdvdG8gdW5sb2NrO1xcbiAxNzk6XFx0XFx0XFx0fVxcbiAxODA6XFx0XFxuIDE4MTpcXHRcXHRcXHRpZiAobnIgXFx1MDAzYz0gMClcXG4gMTgyOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxODM6XFx0XFx0XFx0aSArPSBucjtcXG4gMTg0OlxcdFxcdH1cXG4gMTg1OlxcdFxcdGVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDE4NjpcXHRcXG4gMTg3OlxcdFxcdC8qIFNoaWZ0aW5nIHRoZSBtZWFuaW5nIG9mIG5yX3BhZ2VzOiBub3cgaXQgaXMgYWN0dWFsIG51bWJlciBwaW5uZWQ6ICovXFxuIDE4ODpcXHRcXHRucl9wYWdlcyA9IGk7XFxuIDE4OTpcXHRcXG4gMTkwOlxcdFxcdGd1cC1cXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XFxuIDE5MTpcXHRcXHRndXAtXFx1MDAzZXNpemUgPSBucl9wYWdlcyAqIFBBR0VfU0laRTtcXG4gMTkyOlxcdFxcbiAxOTM6XFx0XFx0LypcXG4gMTk0OlxcdFxcdCAqIFRha2UgYW4gdW4tYmVuY2htYXJrLXRpbWVkIG1vbWVudCB0byB2ZXJpZnkgRE1BIHBpbm5lZFxcbiAxOTU6XFx0XFx0ICogc3RhdGU6IHByaW50IGEgd2FybmluZyBpZiBhbnkgbm9uLWRtYS1waW5uZWQgcGFnZXMgYXJlIGZvdW5kOlxcbiAxOTY6XFx0XFx0ICovXFxuIDE5NzpcXHRcXHR2ZXJpZnlfZG1hX3Bpbm5lZChjbWQsIHBhZ2VzLCBucl9wYWdlcyk7XFxuIDE5ODpcXHRcXG4gMTk5OlxcdFxcdGlmIChjbWQgPT0gRFVNUF9VU0VSX1BBR0VTX1RFU1QpXFxuIDIwMDpcXHRcXHRcXHRkdW1wX3BhZ2VzX3Rlc3QoZ3VwLCBwYWdlcywgbnJfcGFnZXMpO1xcbiAyMDE6XFx0XFxuIDIwMjpcXHRcXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDIwMzpcXHRcXG4gMjA0OlxcdFxcdHB1dF9iYWNrX3BhZ2VzKGNtZCwgcGFnZXMsIG5yX3BhZ2VzLCBndXAtXFx1MDAzZXRlc3RfZmxhZ3MpO1xcbiAyMDU6XFx0XFxuIDIwNjpcXHRcXHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xcbiAyMDc6XFx0XFx0Z3VwLVxcdTAwM2VwdXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcXG4gMjA4OlxcdFxcbiAyMDk6XFx0dW5sb2NrOlxcbiAyMTA6XFx0XFx0aWYgKG5lZWRzX21tYXBfbG9jaylcXG4gMjExOlxcdFxcdFxcdG1tYXBfcmVhZF91bmxvY2soY3VycmVudC1cXHUwMDNlbW0pO1xcbiAyMTI6XFx0ZnJlZV9wYWdlczpcXG4gMjEzOlxcdFxcdGt2ZnJlZShwYWdlcyk7XFxuIDIxNDpcXHRcXHRyZXR1cm4gcmV0O1xcbiAyMTU6XFx0fVxcbiAyMTY6XFx0XFxuIDIxNzpcXHRzdGF0aWMgaW5saW5lIHZvaWQgcGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSlcXG4gMjE4OlxcdHtcXG4gMjE5OlxcdFxcdGlmIChkYXRhLVxcdTAwM2Vsb25ndGVybV9wYWdlcykge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMToyNi4yNDY2NDA0MjNaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNjkwMDYzMjIwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy5cblxuKipFeGFtaW5pbmcgYGd1cF90ZXN0LmNgKipcblxuQWxyaWdodCwgbXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gZ2V0IGEgaGFuZGxlIG9uIGBndXBfdGVzdC5jYC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGZpbGUgaXMgYWJvdXQsIGFuZCB0aGUgYmVzdCB3YXkgdG8gc3RhcnQgaXMgYnkgYSBxdWljayBzY2FuLiBMZXQncyBzZWUgd2hhdCB3ZSBoYXZlIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUsIGFuZCB0aGVuIEknbGwgcXVpY2tseSBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyB0byBzZWUgd2hlcmUgaXQncyBkZWZpbmVkIGFuZCB3aGF0IGNvbmZpZ3VyYXRpb25zIG1pZ2h0IGVuYWJsZSBpdC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgaW5pdGlhbCBjb250ZXh0LiBGcm9tIHRoZXJlLCBJIGNhbiBkZWNpZGUgaG93IGRlZXAgSSBuZWVkIHRvIGdvIGJhc2VkIG9uIHdoYXQgSSdtIHRyeWluZyB0byBhY2NvbXBsaXNoLCBidXQgdGhpcyBpcyB0aGUgcmlnaHQgc3RhcnRpbmcgcG9pbnQgZm9yIGFueSBnb29kIGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM0MDYsIk91dHB1dFRva2VucyI6MjUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjAxOjI4LjkzNjcwNjg0M1oiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0ODQ1NDE5OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJHVVBfVEVTVFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9LY29uZmlnPTEyODI9Y29uZmlnIFBFUkNQVV9TVEFUU1xcbi0tXFxubW0vS2NvbmZpZy0xMjg4LVxcbm1tL0tjb25maWc6MTI4OTpjb25maWcgR1VQX1RFU1RcXG5tbS9LY29uZmlnLTEyOTAtXFx0Ym9vbCBcXFwiRW5hYmxlIGluZnJhc3RydWN0dXJlIGZvciBnZXRfdXNlcl9wYWdlcygpLXJlbGF0ZWQgdW5pdCB0ZXN0c1xcXCJcXG4tLVxcbm1tL0tjb25maWctMTMwOC1cXG5tbS9LY29uZmlnOjEzMDk6Y29tbWVudCBcXFwiR1VQX1RFU1QgbmVlZHMgdG8gaGF2ZSBERUJVR19GUyBlbmFibGVkXFxcIlxcbm1tL0tjb25maWc6MTMxMDpcXHRkZXBlbmRzIG9uICFHVVBfVEVTVCBcXHUwMDI2XFx1MDAyNiAhREVCVUdfRlNcXG5tbS9LY29uZmlnLTEzMTEtXFxuLS1cXG5tbS9NYWtlZmlsZT0xMDk9b2JqLSQoQ09ORklHX0NHUk9VUF9IVUdFVExCKSArPSBodWdldGxiX2Nncm91cC5vXFxubW0vTWFrZWZpbGU6MTEwOm9iai0kKENPTkZJR19HVVBfVEVTVCkgKz0gZ3VwX3Rlc3Qub1xcbm1tL01ha2VmaWxlLTExMS1vYmotJChDT05GSUdfRE1BUE9PTF9URVNUKSArPSBkbWFwb29sX3Rlc3Qub1xcbi0tXFxubW0vZ3VwX3Rlc3QuYz0xNz1zdGF0aWMgdm9pZCBwdXRfYmFja19wYWdlcyh1bnNpZ25lZCBpbnQgY21kLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbi0tXFxubW0vZ3VwX3Rlc3QuYy0zNC1cXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbm1tL2d1cF90ZXN0LmM6MzU6XFx0XFx0aWYgKGd1cF90ZXN0X2ZsYWdzIFxcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pIHtcXG5tbS9ndXBfdGVzdC5jLTM2LVxcdFxcdFxcdHVucGluX3VzZXJfcGFnZXMocGFnZXMsIG5yX3BhZ2VzKTtcXG4tLVxcbm1tL2d1cF90ZXN0LmM9NzY9c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbi0tXFxubW0vZ3VwX3Rlc3QuYy04NS1cXHQgKi9cXG5tbS9ndXBfdGVzdC5jOjg2OlxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSsrKSB7XFxubW0vZ3VwX3Rlc3QuYy04Ny1cXHRcXHRpZiAoZ3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXSBcXHUwMDNlIG5yX3BhZ2VzKSB7XFxuLS1cXG5tbS9ndXBfdGVzdC5jLTkzLVxcbm1tL2d1cF90ZXN0LmM6OTQ6XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QOyBpKyspIHtcXG5tbS9ndXBfdGVzdC5jLTk1LVxcdFxcdGluZGV4X3RvX2R1bXAgPSBndXAtXFx1MDAzZXdoaWNoX3BhZ2VzW2ldO1xcbi0tXFxubW0vZ3VwX3Rlc3QuYz0xMDc9c3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTE2OC1cXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbm1tL2d1cF90ZXN0LmM6MTY5OlxcdFxcdFxcdGlmIChndXAtXFx1MDAzZXRlc3RfZmxhZ3MgXFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTilcXG5tbS9ndXBfdGVzdC5jLTE3MC1cXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4tLVxcbm1tL2d1cF90ZXN0LmgtMS0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqL1xcbm1tL2d1cF90ZXN0Lmg6MjojaWZuZGVmIF9fR1VQX1RFU1RfSFxcbm1tL2d1cF90ZXN0Lmg6MzojZGVmaW5lIF9fR1VQX1RFU1RfSFxcbm1tL2d1cF90ZXN0LmgtNC1cXG4tLVxcbm1tL2d1cF90ZXN0LmgtMTYtXFxubW0vZ3VwX3Rlc3QuaDoxNzojZGVmaW5lIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QXFx0XFx0OFxcbm1tL2d1cF90ZXN0LmgtMTgtXFxubW0vZ3VwX3Rlc3QuaDoxOTojZGVmaW5lIEdVUF9URVNUX0ZMQUdfRFVNUF9QQUdFU19VU0VfUElOXFx0MHgxXFxubW0vZ3VwX3Rlc3QuaC0yMC1cXG5tbS9ndXBfdGVzdC5oPTIxPXN0cnVjdCBndXBfdGVzdCB7XFxuLS1cXG5tbS9ndXBfdGVzdC5oLTMyLVxcdCAqL1xcbm1tL2d1cF90ZXN0Lmg6MzM6XFx0X191MzIgd2hpY2hfcGFnZXNbR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVBdO1xcbm1tL2d1cF90ZXN0LmgtMzQtfTtcXG4tLVxcbm1tL2d1cF90ZXN0Lmg9Mzk9c3RydWN0IHBpbl9sb25ndGVybV90ZXN0IHtcXG4tLVxcbm1tL2d1cF90ZXN0LmgtNDQtXFxubW0vZ3VwX3Rlc3QuaDo0NTojZW5kaWZcXHQvKiBfX0dVUF9URVNUX0ggKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6MjguOTg1MTY2MzMzWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Mjg2Njg1OTI1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpZ2dpbmcgaW50byBLZXJuZWwgQ29uZmlndXJhdGlvbiBmb3IgR1VQX1RFU1QqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgYEdVUF9URVNUYCB0aGluZyBpcyBhbmQgaG93IGl0J3MgdXNlZC4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gZGl2ZSBpbnRvIHRoZSBgbW0vS2NvbmZpZ2AgZmlsZS4gR2l2ZW4gbXkgZXhwZXJpZW5jZSB3aXRoIGtlcm5lbCBjb25maWd1cmF0aW9uLCBJJ20gYmV0dGluZyB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgZGVwZW5kZW5jaWVzIGFuZCBhIHBvdGVudGlhbCBkZWZpbml0aW9uLCB3aWxsIGJlIGFyb3VuZCBsaW5lIDEyODkuIFRoYXQncyBhIHJlYXNvbmFibGUgc3BvdCB0byBzdGFydCBzaW5jZSBLY29uZmlnIGZpbGVzIHRlbmQgdG8gYmUgb3JnYW5pemVkIGxvZ2ljYWxseS4gTGV0J3Mgc2VlIHdoYXQgd2UgY2FuIHVuY292ZXIgYWJvdXQgYEdVUF9URVNUYCBpbiB0aGF0IHNlY3Rpb24uIEhvcGVmdWxseSwgSSBjYW4gcXVpY2tseSBncmFzcCBpdHMgcHVycG9zZSBhbmQgYW55IGNvbmRpdGlvbnMgdGhhdCBkaWN0YXRlIGl0cyBhdmFpbGFiaWxpdHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ2NzIsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTozMS44NTIwMjc0NVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0MzQyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEyODUsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjEyODU6XFx0XFx0ICBUaGlzIGZlYXR1cmUgY29sbGVjdHMgYW5kIGV4cG9zZXMgc3RhdGlzdGljcyB2aWEgZGVidWdmcy4gVGhlXFxuMTI4NjpcXHRcXHQgIGluZm9ybWF0aW9uIGluY2x1ZGVzIGdsb2JhbCBhbmQgcGVyIGNodW5rIHN0YXRpc3RpY3MsIHdoaWNoIGNhblxcbjEyODc6XFx0XFx0ICBiZSB1c2VkIHRvIGhlbHAgdW5kZXJzdGFuZCBwZXJjcHUgbWVtb3J5IHVzYWdlLlxcbjEyODg6XFx0XFxuMTI4OTpcXHRjb25maWcgR1VQX1RFU1RcXG4xMjkwOlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBpbmZyYXN0cnVjdHVyZSBmb3IgZ2V0X3VzZXJfcGFnZXMoKS1yZWxhdGVkIHVuaXQgdGVzdHNcXFwiXFxuMTI5MTpcXHRcXHRkZXBlbmRzIG9uIERFQlVHX0ZTXFxuMTI5MjpcXHRcXHRoZWxwXFxuMTI5MzpcXHRcXHQgIFByb3ZpZGVzIC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0LCB3aGljaCBpbiB0dXJuIHByb3ZpZGVzIGEgd2F5XFxuMTI5NDpcXHRcXHQgIHRvIG1ha2UgaW9jdGwgY2FsbHMgdGhhdCBjYW4gbGF1bmNoIGtlcm5lbC1iYXNlZCB1bml0IHRlc3RzIGZvclxcbjEyOTU6XFx0XFx0ICB0aGUgZ2V0X3VzZXJfcGFnZXMqKCkgYW5kIHBpbl91c2VyX3BhZ2VzKigpIGZhbWlseSBvZiBBUEkgY2FsbHMuXFxuMTI5NjpcXHRcXG4xMjk3OlxcdFxcdCAgVGhlc2UgdGVzdHMgaW5jbHVkZSBiZW5jaG1hcmsgdGVzdGluZyBvZiB0aGUgX2Zhc3QgdmFyaWFudHMgb2ZcXG4xMjk4OlxcdFxcdCAgZ2V0X3VzZXJfcGFnZXMqKCkgYW5kIHBpbl91c2VyX3BhZ2VzKigpLCBhcyB3ZWxsIGFzIHNtb2tlIHRlc3RzIG9mXFxuMTI5OTpcXHRcXHQgIHRoZSBub24tX2Zhc3QgdmFyaWFudHMuXFxuMTMwMDpcXHRcXG4xMzAxOlxcdFxcdCAgVGhlcmUgaXMgYWxzbyBhIHN1Yi10ZXN0IHRoYXQgYWxsb3dzIHJ1bm5pbmcgZHVtcF9wYWdlKCkgb24gYW55XFxuMTMwMjpcXHRcXHQgIG9mIHVwIHRvIGVpZ2h0IHBhZ2VzIChzZWxlY3RlZCBieSBjb21tYW5kIGxpbmUgYXJncykgd2l0aGluIHRoZVxcbjEzMDM6XFx0XFx0ICByYW5nZSBvZiB1c2VyLXNwYWNlIGFkZHJlc3Nlcy4gVGhlc2UgcGFnZXMgYXJlIGVpdGhlciBwaW5uZWQgdmlhXFxuMTMwNDpcXHRcXHQgIHBpbl91c2VyX3BhZ2VzKigpLCBvciBwaW5uZWQgdmlhIGdldF91c2VyX3BhZ2VzKigpLCBhcyBzcGVjaWZpZWRcXG4xMzA1OlxcdFxcdCAgYnkgb3RoZXIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy5cXG4xMzA2OlxcdFxcbjEzMDc6XFx0XFx0ICBTZWUgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZ3VwX3Rlc3QuY1xcbjEzMDg6XFx0XFxuMTMwOTpcXHRjb21tZW50IFxcXCJHVVBfVEVTVCBuZWVkcyB0byBoYXZlIERFQlVHX0ZTIGVuYWJsZWRcXFwiXFxuMTMxMDpcXHRcXHRkZXBlbmRzIG9uICFHVVBfVEVTVCBcXHUwMDI2XFx1MDAyNiAhREVCVUdfRlNcXG4xMzExOlxcdFxcbjEzMTI6XFx0Y29uZmlnIEdVUF9HRVRfUFhYX0xPV19ISUdIXFxuMTMxMzpcXHRcXHRib29sXFxuMTMxNDpcXHRcXG4xMzE1OlxcdGNvbmZpZyBETUFQT09MX1RFU1RcXG4xMzE2OlxcdFxcdHRyaXN0YXRlIFxcXCJFbmFibGUgYSBtb2R1bGUgdG8gcnVuIHRpbWUgdGVzdHMgb24gZG1hX3Bvb2xcXFwiXFxuMTMxNzpcXHRcXHRkZXBlbmRzIG9uIEhBU19ETUFcXG4xMzE4OlxcdFxcdGhlbHBcXG4xMzE5OlxcdFxcdCAgUHJvdmlkZXMgYSB0ZXN0IG1vZHVsZSB0aGF0IHdpbGwgYWxsb2NhdGUgYW5kIGZyZWUgbWFueSBibG9ja3Mgb2ZcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6MzEuODUyMTcyNjlaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MDk3OTgzMDEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBjb21taXQgYW5kIGZpZ3VyZSBvdXQgd2hhdCdzIGNoYW5nZWQgd2l0aGluIGBtbS9ndXBfdGVzdC5jYC4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIHRoZSBgX19ndXBfdGVzdF9pb2N0bGAgZnVuY3Rpb24uIEkgbmVlZCBhIHNvbGlkIHVuZGVyc3RhbmRpbmcgb2YgaG93IGl0IG9wZXJhdGVzIGFuZCB3aGVyZSB0aGUgbW9kaWZpY2F0aW9ucyB3ZXJlIG1hZGUuIEknbSBnb2luZyB0byBjYXJlZnVsbHkgZGlzc2VjdCBpdHMgZW50aXJlIHN0cnVjdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTQ3MCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6MzUuOTUwMTU3OTVaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODM3MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMDUsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTA1OlxcdH1cXG4gMTA2OlxcdFxcbiAxMDc6XFx0c3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXFxuIDEwODpcXHRcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcXG4gMTA5OlxcdHtcXG4gMTEwOlxcdFxcdGt0aW1lX3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7XFxuIDExMTpcXHRcXHR1bnNpZ25lZCBsb25nIGksIG5yX3BhZ2VzLCBhZGRyLCBuZXh0O1xcbiAxMTI6XFx0XFx0bG9uZyBucjtcXG4gMTEzOlxcdFxcdHN0cnVjdCBwYWdlICoqcGFnZXM7XFxuIDExNDpcXHRcXHR1bnNpZ25lZCBsb25nIGVuZDtcXG4gMTE1OlxcdFxcdGludCByZXQgPSAwO1xcbiAxMTY6XFx0XFx0Ym9vbCBuZWVkc19tbWFwX2xvY2sgPVxcbiAxMTc6XFx0XFx0XFx0Y21kICE9IEdVUF9GQVNUX0JFTkNITUFSSyBcXHUwMDI2XFx1MDAyNiBjbWQgIT0gUElOX0ZBU1RfQkVOQ0hNQVJLO1xcbiAxMTg6XFx0XFxuIDExOTpcXHRcXHRpZiAoZ3VwLVxcdTAwM2VhZGRyIFxcdTAwM2UgVUxPTkdfTUFYIHx8IGd1cC1cXHUwMDNlc2l6ZSBcXHUwMDNlIFVMT05HX01BWClcXG4gMTIwOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAxMjE6XFx0XFx0aWYgKGNoZWNrX2FkZF9vdmVyZmxvdygodW5zaWduZWQgbG9uZylndXAtXFx1MDAzZWFkZHIsXFxuIDEyMjpcXHRcXHRcXHRcXHQgICAgICAgKHVuc2lnbmVkIGxvbmcpZ3VwLVxcdTAwM2VzaXplLCBcXHUwMDI2ZW5kKSlcXG4gMTIzOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAxMjQ6XFx0XFxuIDEyNTpcXHRcXHRucl9wYWdlcyA9IGd1cC1cXHUwMDNlc2l6ZSAvIFBBR0VfU0laRTtcXG4gMTI2OlxcdFxcdHBhZ2VzID0ga3ZjYWxsb2MobnJfcGFnZXMsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcXG4gMTI3OlxcdFxcdGlmICghcGFnZXMpXFxuIDEyODpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gMTI5OlxcdFxcbiAxMzA6XFx0XFx0aWYgKG5lZWRzX21tYXBfbG9jayBcXHUwMDI2XFx1MDAyNiBtbWFwX3JlYWRfbG9ja19raWxsYWJsZShjdXJyZW50LVxcdTAwM2VtbSkpIHtcXG4gMTMxOlxcdFxcdFxcdHJldCA9IC1FSU5UUjtcXG4gMTMyOlxcdFxcdFxcdGdvdG8gZnJlZV9wYWdlcztcXG4gMTMzOlxcdFxcdH1cXG4gMTM0OlxcdFxcbiAxMzU6XFx0XFx0aSA9IDA7XFxuIDEzNjpcXHRcXHRuciA9IGd1cC1cXHUwMDNlbnJfcGFnZXNfcGVyX2NhbGw7XFxuIDEzNzpcXHRcXHRzdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XFxuIDEzODpcXHRcXHRmb3IgKGFkZHIgPSBndXAtXFx1MDAzZWFkZHI7IGFkZHIgXFx1MDAzYyBlbmQ7IGFkZHIgPSBuZXh0KSB7XFxuIDEzOTpcXHRcXHRcXHRpZiAobnIgIT0gZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbClcXG4gMTQwOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNDE6XFx0XFxuIDE0MjpcXHRcXHRcXHRuZXh0ID0gYWRkciArIG5yICogUEFHRV9TSVpFO1xcbiAxNDM6XFx0XFx0XFx0aWYgKG5leHQgXFx1MDAzZSBlbmQpIHtcXG4gMTQ0OlxcdFxcdFxcdFxcdG5leHQgPSBlbmQ7XFxuIDE0NTpcXHRcXHRcXHRcXHRuciA9IChuZXh0IC0gYWRkcikgLyBQQUdFX1NJWkU7XFxuIDE0NjpcXHRcXHRcXHR9XFxuIDE0NzpcXHRcXG4gMTQ4OlxcdFxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDE0OTpcXHRcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMTUwOlxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE1MTpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4gMTUyOlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNTM6XFx0XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMTU0OlxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyArIGkpO1xcbiAxNTU6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1NjpcXHRcXHRcXHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcXG4gMTU3OlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE1ODpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgcGFnZXMgKyBpKTtcXG4gMTU5OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNjA6XFx0XFx0XFx0Y2FzZSBQSU5fQkFTSUNfVEVTVDpcXG4gMTYxOlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLCBwYWdlcyArIGkpO1xcbiAxNjI6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2MzpcXHRcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XFxuIDE2NDpcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLFxcbiAxNjU6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzIHwgRk9MTF9MT05HVEVSTSxcXG4gMTY2OlxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNjc6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2ODpcXHRcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAxNjk6XFx0XFx0XFx0XFx0aWYgKGd1cC1cXHUwMDNldGVzdF9mbGFncyBcXHUwMDI2IEdVUF9URVNUX0ZMQUdfRFVNUF9QQUdFU19VU0VfUElOKVxcbiAxNzA6XFx0XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE3MTpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4gMTcyOlxcdFxcdFxcdFxcdGVsc2VcXG4gMTczOlxcdFxcdFxcdFxcdFxcdG5yID0gZ2V0X3VzZXJfcGFnZXMoYWRkciwgbnIsIGd1cC1cXHUwMDNlZ3VwX2ZsYWdzLFxcbiAxNzQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE3NTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTc2OlxcdFxcdFxcdGRlZmF1bHQ6XFxuIDE3NzpcXHRcXHRcXHRcXHRyZXQgPSAtRUlOVkFMO1xcbiAxNzg6XFx0XFx0XFx0XFx0Z290byB1bmxvY2s7XFxuIDE3OTpcXHRcXHRcXHR9XFxuIDE4MDpcXHRcXG4gMTgxOlxcdFxcdFxcdGlmIChuciBcXHUwMDNjPSAwKVxcbiAxODI6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE4MzpcXHRcXHRcXHRpICs9IG5yO1xcbiAxODQ6XFx0XFx0fVxcbiAxODU6XFx0XFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMTg2OlxcdFxcbiAxODc6XFx0XFx0LyogU2hpZnRpbmcgdGhlIG1lYW5pbmcgb2YgbnJfcGFnZXM6IG5vdyBpdCBpcyBhY3R1YWwgbnVtYmVyIHBpbm5lZDogKi9cXG4gMTg4OlxcdFxcdG5yX3BhZ2VzID0gaTtcXG4gMTg5OlxcdFxcbiAxOTA6XFx0XFx0Z3VwLVxcdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcXG4gMTkxOlxcdFxcdGd1cC1cXHUwMDNlc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xcbiAxOTI6XFx0XFxuIDE5MzpcXHRcXHQvKlxcbiAxOTQ6XFx0XFx0ICogVGFrZSBhbiB1bi1iZW5jaG1hcmstdGltZWQgbW9tZW50IHRvIHZlcmlmeSBETUEgcGlubmVkXFxuIDE5NTpcXHRcXHQgKiBzdGF0ZTogcHJpbnQgYSB3YXJuaW5nIGlmIGFueSBub24tZG1hLXBpbm5lZCBwYWdlcyBhcmUgZm91bmQ6XFxuIDE5NjpcXHRcXHQgKi9cXG4gMTk3OlxcdFxcdHZlcmlmeV9kbWFfcGlubmVkKGNtZCwgcGFnZXMsIG5yX3BhZ2VzKTtcXG4gMTk4OlxcdFxcbiAxOTk6XFx0XFx0aWYgKGNtZCA9PSBEVU1QX1VTRVJfUEFHRVNfVEVTVClcXG4gMjAwOlxcdFxcdFxcdGR1bXBfcGFnZXNfdGVzdChndXAsIHBhZ2VzLCBucl9wYWdlcyk7XFxuIDIwMTpcXHRcXG4gMjAyOlxcdFxcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMjAzOlxcdFxcbiAyMDQ6XFx0XFx0cHV0X2JhY2tfcGFnZXMoY21kLCBwYWdlcywgbnJfcGFnZXMsIGd1cC1cXHUwMDNldGVzdF9mbGFncyk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjAxOjM1Ljk1MDI0Mzc5WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjYyMzY1OTQwNTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEdVUCBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gQmVmb3JlIHRoZSBwYXRjaCwgdGhlIGNvZGUgd2FzIGl0ZXJhdGluZyB0aHJvdWdoIGEgbWVtb3J5IHJlZ2lvbi4gVGhlIGNvcmUgb2YgdGhlIHByb2JsZW0gc2VlbXMgdG8gbGllIHdpdGhpbiB0aGlzIGxvb3A6IGBmb3IgKGFkZHIgPSBndXAtXHUwMDNlYWRkcjsgYWRkciBcdTAwM2MgZW5kOyBhZGRyID0gbmV4dCkge2AuIFRoZSBjcml0aWNhbCB0aGluZyBoZXJlIGlzIGhvdyBgYWRkcmAgaXMgdXBkYXRlZC4gQXQgdGhlIGVuZCBvZiBlYWNoIGl0ZXJhdGlvbiwgYGFkZHJgIGlzIHNldCB0byBgbmV4dGAuIFRoaXMgaXMgd2hlcmUgdGhlIGlzc3VlIHN1cmZhY2VzLlxuXG5JZiB0aGUgbG9vcCB0ZXJtaW5hdGVzIHByZW1hdHVyZWx5IOKAkyBtYXliZSBiZWNhdXNlIGBucmAgKHRoZSBudW1iZXIgb2YgcGFnZXMgcGlubmVkIGluIHRoZSBjdXJyZW50IGNodW5rKSBiZWNhbWUgemVybyBvciBsZXNzLCBvciBiZWNhdXNlIGl0IGRpZG4ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHBhZ2VzIGZvciB0aGUgY3VycmVudCBjYWxsIOKAkyBgYWRkcmAgZW5kcyB1cCBwb2ludGluZyB0byB0aGUgKmJlZ2lubmluZyogb2YgdGhlIGxhc3QgcHJvY2Vzc2VkIGNodW5rLCBub3QgdGhlIGVuZCBvZiB0aGUgcGlubmVkIHJlZ2lvbi4gU3BlY2lmaWNhbGx5LCBgYWRkcmAgaXMgb25seSB1cGRhdGVkIHRvIGBuZXh0YCB3aGVuIHRoZSBsb29wIGNvbnRpbnVlcy4gV2l0aGluIHRoZSBsb29wLCBgbmV4dGAgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiBgYWRkcmAsIHRoZSBjdXJyZW50IGl0ZXJhdGlvbidzIGFkZHJlc3MsIGFuZCBgbnJgLiBJIHNlZSBub3c6IGBuZXh0ID0gYWRkciArIG5yICogUEFHRV9TSVpFO2AgYW5kIHRoZW4gYG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgLi4uKTtgLiBBbmQgdGhlbiB0aGUgY3J1Y2lhbCBjaGVjazogYGlmIChuciBcdTAwM2M9IDApIGJyZWFrO2AuXG5cblNvLCBgYWRkcmAgcmV0YWlucyB0aGUgKnN0YXJ0KiBhZGRyZXNzIG9mIHRoYXQgbGFzdCBjaHVuayBhdCB0aGUgZW5kIG9mIHRoZSBsb29wLCByaWdodD8gV2hlcmVhcywgYGlgIC0gdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZSBpcyB0cmFja2luZyB0aGUgYWN0dWFsIG51bWJlciBvZiBwYWdlcyBwaW5uZWQgc28gZmFyLiBUaGlzIG1lYW5zIGBhZGRyIC0gZ3VwLVx1MDAzZWFkZHJgIGlzIHRvdGFsbHkgd3JvbmcsIGFuZCB0aGF0J3MgdGhlIGNhbGN1bGF0ZWQgc2l6ZS4gVGhhdCdzIGEgY2xhc3NpYyBvZmYtYnktb25lIG9yIG9mZi1ieS1jaHVuayBpc3N1ZS4gYGd1cC1cdTAwM2VzaXplYCByZXR1cm5lZCB0byB1c2Vyc3BhY2Ugd2FzIGNhbGN1bGF0ZWQgdXNpbmcgdGhpcyBpbmNvcnJlY3QgYGFkZHIgLSBndXAtXHUwMDNlYWRkcmAsIGxlYWRpbmcgdG8gYSBzaXplIG1pc21hdGNoIHdpdGggdGhlIGFjdHVhbCBudW1iZXIgb2YgcGlubmVkIHBhZ2VzLiBUaGUga2V5IGlzIHRoYXQgYGd1cC1cdTAwM2VzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7YCBub3cgcHJvdmlkZXMgYW4gYWNjdXJhdGUgc2l6ZSBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBwaW5uZWQgcGFnZXMuXG5cbkFscmlnaHQsIGxldCdzIHN0ZXAgYmFjayBhbmQgc2VlIGhvdyB0aGlzIGlzIGFjdHVhbGx5IGludm9rZWQuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgaW50ZXJhY3Rpb25zIHdpdGggdGhpcyBjb2RlLiBMZXQgbWUgY2hlY2sgdGhlIGBndXBfdGVzdC5jYCBhbmQgaG93IGl0J3MgdXNlZC4gVGltZSB0byBsb29rIGludG8gdGhlIGlvY3RsIGhhbmRsZXIgaW4gYGd1cF90ZXN0LmNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTQ3LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzMxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDE6NDIuMTg2ODQwMDQ4WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc1NTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjg1LFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjg1OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAyODY6XFx0XFx0XFx0fVxcbiAyODc6XFx0XFx0XFx0ZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgKz0gY3VyX3BhZ2VzO1xcbiAyODg6XFx0XFx0XFx0cGFnZXMgKz0gY3VyX3BhZ2VzO1xcbiAyODk6XFx0XFx0fVxcbiAyOTA6XFx0XFxuIDI5MTpcXHRcXHRpZiAoIWZhc3QpXFxuIDI5MjpcXHRcXHRcXHRtbWFwX3JlYWRfdW5sb2NrKGN1cnJlbnQtXFx1MDAzZW1tKTtcXG4gMjkzOlxcdFxcdHJldHVybiByZXQ7XFxuIDI5NDpcXHR9XFxuIDI5NTpcXHRcXG4gMjk2OlxcdHN0YXRpYyBpbmxpbmUgaW50IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEsXFxuIDI5NzpcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFyZylcXG4gMjk4OlxcdHtcXG4gMjk5OlxcdFxcdF9fdTY0IHVzZXJfYWRkcjtcXG4gMzAwOlxcdFxcdHVuc2lnbmVkIGxvbmcgaTtcXG4gMzAxOlxcdFxcbiAzMDI6XFx0XFx0aWYgKCFkYXRhLVxcdTAwM2Vsb25ndGVybV9wYWdlcylcXG4gMzAzOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiAzMDQ6XFx0XFxuIDMwNTpcXHRcXHRpZiAoY29weV9mcm9tX3VzZXIoXFx1MDAyNnVzZXJfYWRkciwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YodXNlcl9hZGRyKSkpXFxuIDMwNjpcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gMzA3OlxcdFxcbiAzMDg6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGRhdGEtXFx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzOyBpKyspIHtcXG4gMzA5OlxcdFxcdFxcdHZvaWQgKmFkZHIgPSBrbWFwX2xvY2FsX3BhZ2UoZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXNbaV0pO1xcbiAzMTA6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyByZXQ7XFxuIDMxMTpcXHRcXG4gMzEyOlxcdFxcdFxcdHJldCA9IGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyl1c2VyX2FkZHIsIGFkZHIsXFxuIDMxMzpcXHRcXHRcXHRcXHRcXHQgICBQQUdFX1NJWkUpO1xcbiAzMTQ6XFx0XFx0XFx0a3VubWFwX2xvY2FsKGFkZHIpO1xcbiAzMTU6XFx0XFx0XFx0aWYgKHJldClcXG4gMzE2OlxcdFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzMTc6XFx0XFx0XFx0dXNlcl9hZGRyICs9IFBBR0VfU0laRTtcXG4gMzE4OlxcdFxcdH1cXG4gMzE5OlxcdFxcdHJldHVybiAwO1xcbiAzMjA6XFx0fVxcbiAzMjE6XFx0XFxuIDMyMjpcXHRzdGF0aWMgbG9uZyBwaW5fbG9uZ3Rlcm1fdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXFxuIDMyMzpcXHRcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhcmcpXFxuIDMyNDpcXHR7XFxuIDMyNTpcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSA9IGZpbGVwLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDMyNjpcXHRcXHRpbnQgcmV0ID0gLUVJTlZBTDtcXG4gMzI3OlxcdFxcbiAzMjg6XFx0XFx0aWYgKG11dGV4X2xvY2tfa2lsbGFibGUoXFx1MDAyNmRhdGEtXFx1MDAzZWxvbmd0ZXJtX211dGV4KSlcXG4gMzI5OlxcdFxcdFxcdHJldHVybiAtRUlOVFI7XFxuIDMzMDpcXHRcXG4gMzMxOlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDMzMjpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzMzM6XFx0XFx0XFx0cmV0ID0gcGluX2xvbmd0ZXJtX3Rlc3Rfc3RhcnQoZGF0YSwgYXJnKTtcXG4gMzM0OlxcdFxcdFxcdGJyZWFrO1xcbiAzMzU6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzMzY6XFx0XFx0XFx0cGluX2xvbmd0ZXJtX3Rlc3Rfc3RvcChkYXRhKTtcXG4gMzM3OlxcdFxcdFxcdHJldCA9IDA7XFxuIDMzODpcXHRcXHRcXHRicmVhaztcXG4gMzM5OlxcdFxcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfUkVBRDpcXG4gMzQwOlxcdFxcdFxcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3JlYWQoZGF0YSwgYXJnKTtcXG4gMzQxOlxcdFxcdFxcdGJyZWFrO1xcbiAzNDI6XFx0XFx0fVxcbiAzNDM6XFx0XFxuIDM0NDpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmRhdGEtXFx1MDAzZWxvbmd0ZXJtX211dGV4KTtcXG4gMzQ1OlxcdFxcdHJldHVybiByZXQ7XFxuIDM0NjpcXHR9XFxuIDM0NzpcXHRcXG4gMzQ4OlxcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG4gMzQ5OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzNTA6XFx0e1xcbiAzNTE6XFx0XFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcXG4gMzUyOlxcdFxcdGludCByZXQ7XFxuIDM1MzpcXHRcXG4gMzU0OlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDM1NTpcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMzU2OlxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAzNTc6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAzNTg6XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMzU5OlxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuIDM2MDpcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAzNjE6XFx0XFx0XFx0YnJlYWs7XFxuIDM2MjpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzNjM6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzNjQ6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEOlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTo0Mi4xODY5MTcyMzhaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDgyNjI4NTU0OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkFuYWx5emluZyB0aGUgR1VQIFRlc3QgSU9DVEwgYW5kIEluaXRpYWxpemF0aW9uKipcblxuQWxyaWdodCwgbGV0J3MgZGl2ZSBpbi4gSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiB0aGlzIGBndXBfdGVzdF9pb2N0bGAgZnVuY3Rpb24gYW5kIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4gSSdtIGdvaW5nIHRvIGxvb2sgdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgY29kZSwgc3BlY2lmaWNhbGx5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGF0IGZ1bmN0aW9uLCBhcyB3ZWxsIGFzIHRoZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHRoYXQgc2V0cyBldmVyeXRoaW5nIHVwLiBNeSBnb2FsIGlzIHRvIGdyYXNwIHRoZSBjb3JlIG1lY2hhbmljcyBhbmQgaWRlbnRpZnkgYW55IHBvdGVudGlhbCBnb3RjaGFzIG9yIGFyZWFzIHRoYXQgd2FycmFudCBjbG9zZXIgc2NydXRpbnkuIEknbGwgYmUgbG9va2luZyBmb3IgbWVtb3J5IGFjY2VzcyBwYXR0ZXJucywgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucywgZXJyb3IgaGFuZGxpbmcsIGFuZCBvZiBjb3Vyc2UsIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBHVVAgZnVuY3Rpb25hbGl0eS4gQmFzaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGNvbnRyb2wgZmxvdywgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBhbmQgYW55IHNwZWNpZmljIGludmFyaWFudHMgdGhhdCB0aGlzIGNvZGUgbWlnaHQgcmVseSBvbi4gVGhpcyBpcyB3aGVyZSB0aGUgZGV2aWwgaXMsIGluIHRoZSBkZXRhaWxzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MDk1LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTo0Ny4wMTMyMDQ4NzZaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODEzMjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAzNjUsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzNjU6XFx0XFx0XFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XFxuIDM2NjpcXHRcXHRkZWZhdWx0OlxcbiAzNjc6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDM2ODpcXHRcXHR9XFxuIDM2OTpcXHRcXG4gMzcwOlxcdFxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcXG4gMzcxOlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzI6XFx0XFxuIDM3MzpcXHRcXHRyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgXFx1MDAyNmd1cCk7XFxuIDM3NDpcXHRcXHRpZiAocmV0KVxcbiAzNzU6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMzc2OlxcdFxcbiAzNzc6XFx0XFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFxcdTAwMjZndXAsIHNpemVvZihndXApKSlcXG4gMzc4OlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzk6XFx0XFxuIDM4MDpcXHRcXHRyZXR1cm4gMDtcXG4gMzgxOlxcdH1cXG4gMzgyOlxcdFxcbiAzODM6XFx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbiAzODQ6XFx0e1xcbiAzODU6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XFxuIDM4NjpcXHRcXHRpbnQgcmV0O1xcbiAzODc6XFx0XFxuIDM4ODpcXHRcXHRkYXRhID0ga3phbGxvY19vYmooKmRhdGEpO1xcbiAzODk6XFx0XFx0aWYgKCFkYXRhKVxcbiAzOTA6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIDM5MTpcXHRcXG4gMzkyOlxcdFxcdHJldCA9IG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpO1xcbiAzOTM6XFx0XFx0aWYgKHJldCkge1xcbiAzOTQ6XFx0XFx0XFx0a2ZyZWUoZGF0YSk7XFxuIDM5NTpcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiAzOTY6XFx0XFx0fVxcbiAzOTc6XFx0XFxuIDM5ODpcXHRcXHRtdXRleF9pbml0KFxcdTAwMjZkYXRhLVxcdTAwM2Vsb25ndGVybV9tdXRleCk7XFxuIDM5OTpcXHRcXHRmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBkYXRhO1xcbiA0MDA6XFx0XFx0cmV0dXJuIDA7XFxuIDQwMTpcXHR9XFxuIDQwMjpcXHRcXG4gNDAzOlxcdHN0YXRpYyBpbnQgZ3VwX3Rlc3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4gNDA0OlxcdHtcXG4gNDA1OlxcdFxcdHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhID0gZmlsZS1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbiA0MDY6XFx0XFxuIDQwNzpcXHRcXHRwaW5fbG9uZ3Rlcm1fdGVzdF9zdG9wKGRhdGEpO1xcbiA0MDg6XFx0XFx0bXV0ZXhfZGVzdHJveShcXHUwMDI2ZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbXV0ZXgpO1xcbiA0MDk6XFx0XFx0a2ZyZWUoZGF0YSk7XFxuIDQxMDpcXHRcXHRmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBOVUxMO1xcbiA0MTE6XFx0XFxuIDQxMjpcXHRcXHRyZXR1cm4gMDtcXG4gNDEzOlxcdH1cXG4gNDE0OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTo0Ny4wMTMyODc1OTZaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjYwMTgyNTI2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhlIGBndXBfdGVzdC5jYCBjb2RlOlxuXG4qKkRpdmluZyBpbnRvIGd1cF90ZXN0LmM6IERlYnVnZnMgSW5pdGlhbGl6YXRpb24qKlxuXG5Pa2F5LCBsZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgd2l0aGluIGBndXBfdGVzdC5jYCwgc3BlY2lmaWNhbGx5IGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBgZGVidWdmc2AuIEkga25vdyB0aGUgYmFzaWNzLCB0aGUga2V5IGZ1bmN0aW9ucywgYW5kIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSwgc28gSSdtIHByaW1hcmlseSBmb2N1c2VkIG9uIHRoZSBudWFuY2VzLiBJJ20gbG9va2luZyBmb3Igd2hlcmUgYW5kIGhvdyB0aGUgZGVidWcgZmlsZXN5c3RlbSBlbnRyaWVzIHJlbGF0ZWQgdG8gdGhlIGBndXBfdGVzdGAgYXJlIGVzdGFibGlzaGVkLiBJJ20gZXhwZWN0aW5nIHRvIHNlZSBjYWxscyBsaWtlIGBkZWJ1Z2ZzX2NyZWF0ZV9maWxlYCwgYGRlYnVnZnNfY3JlYXRlX2RpcmAsIGV0Yy4sIG9yIHBlcmhhcHMgc29tZXRoaW5nIG1vcmUgc3BlY2lmaWMgaWYgdGhleSBhcmUgdXNpbmcgYSBjdXN0b20gZGVidWdmcyBmdW5jdGlvbmFsaXR5LiBUaGUga2V5IGhlcmUgd2lsbCBiZSB1bmRlcnN0YW5kaW5nIHdoYXQgYXNwZWN0cyBvZiB0aGUgdGVzdCBhcmUgZXhwb3NlZCBmb3IgaW5zcGVjdGlvbiBvciBjb250cm9sIHRocm91Z2ggdGhlIGRlYnVnIGludGVyZmFjZS4gSSdsbCBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBhbmQgYW55IHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGxpbmtlZCB0byB0aGUgZGVidWdmcyBlbnRyaWVzLiBJcyB0aGlzIGp1c3QgZm9yIHJlcG9ydGluZywgb3IgYXJlIHRoZXJlIHdyaXRhYmxlIGVudHJpZXMgdGhhdCBhbGxvdyBmb3IgZHluYW1pYyB0ZXN0aW5nIHBhcmFtZXRlcnM/IFVuZGVyc3RhbmRpbmcgdGhpcyBpcyBjcml0aWNhbCBmb3IgYXNzZXNzaW5nIHRoZSB0ZXN0J3MgZmxleGliaWxpdHkgYW5kIHBvdGVudGlhbCBmb3IgZXh0ZXJuYWwgbWFuaXB1bGF0aW9uLCB3aGljaCBJJ2xsIGJlIGxvb2tpbmcgaW50byBhcyBJIGdldCBkZWVwZXIuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk5ODgsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjAxOjQ5LjYxNTExNTE5OFoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2ODIxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9ndXBfdGVzdC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQxNSxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQxNTpcXHRzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBndXBfdGVzdF9mb3BzID0ge1xcbiA0MTY6XFx0XFx0Lm9wZW4gPSBndXBfdGVzdF9vcGVuLFxcbiA0MTc6XFx0XFx0LnVubG9ja2VkX2lvY3RsID0gZ3VwX3Rlc3RfaW9jdGwsXFxuIDQxODpcXHRcXHQuY29tcGF0X2lvY3RsID0gY29tcGF0X3B0cl9pb2N0bCxcXG4gNDE5OlxcdFxcdC5yZWxlYXNlID0gZ3VwX3Rlc3RfcmVsZWFzZSxcXG4gNDIwOlxcdH07XFxuIDQyMTpcXHRcXG4gNDIyOlxcdHN0YXRpYyBpbnQgX19pbml0IGd1cF90ZXN0X2luaXQodm9pZClcXG4gNDIzOlxcdHtcXG4gNDI0OlxcdFxcdGRlYnVnZnNfY3JlYXRlX2ZpbGVfdW5zYWZlKFxcXCJndXBfdGVzdFxcXCIsIDA2MDAsIE5VTEwsIE5VTEwsXFxuIDQyNTpcXHRcXHRcXHRcXHRcXHQgICBcXHUwMDI2Z3VwX3Rlc3RfZm9wcyk7XFxuIDQyNjpcXHRcXG4gNDI3OlxcdFxcdHJldHVybiAwO1xcbiA0Mjg6XFx0fVxcbiA0Mjk6XFx0XFxuIDQzMDpcXHRsYXRlX2luaXRjYWxsKGd1cF90ZXN0X2luaXQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMTo0OS42MTUxODQ4MjhaIiwiU2VxIjoxNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTI0MDU0MzkyNjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRnV6emluZyBBbmFseXNpczogZ3VwX3Rlc3QgaW9jdGwgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoZSBjaGFuZ2UgaXMgaW4gYG1tL2d1cF90ZXN0LmNgLCBzcGVjaWZpY2FsbHkgaW4gYF9fZ3VwX3Rlc3RfaW9jdGxgLiBUaGV5J3ZlIHN3aXRjaGVkIHRoZSBjYWxjdWxhdGlvbiBvZiBgZ3VwLVx1MDAzZXNpemVgIGZyb20gYGFkZHIgLSBndXAtXHUwMDNlYWRkcmAgdG8gYG5yX3BhZ2VzICogUEFHRV9TSVpFYC4gIFRoZSBtYWluIHF1ZXN0aW9uIGlzLCBkb2VzIHRoaXMgd2FycmFudCBmdXp6aW5nP1xuXG5GaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRleHQuIGBndXBfdGVzdGAgaXMgYSBkZWJ1Z2ZzIGludGVyZmFjZSAoYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCkgZGVzaWduZWQgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IChtbSkgc2VsZnRlc3RzLiBBbHJpZ2h0LCB0aGlzIGlzIGEgZGVkaWNhdGVkIHRlc3RpbmcgYXJlYS4gTm93LCBkb2VzIHRoZSBjaGFuZ2UgaW50cm9kdWNlIGFueSAqZnVuY3Rpb25hbGx5IHNpZ25pZmljYW50KiBrZXJuZWwgbG9naWMgdGhhdCdzIHdvcnRoIGZ1enppbmc/XG5cbkhvbGQgb24uIEJlZm9yZSBqdW1waW5nIHRvIGNvbmNsdXNpb25zLCBsZXQncyBjbGFyaWZ5IHRoZSBjaGFuZ2UncyAqcHJlY2lzZSogbmF0dXJlLiBPa2F5LCBpdCdzIGZpeGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGBndXAtXHUwMDNlc2l6ZWAgd2l0aGluIGEgZGVidWdmcyB0ZXN0IGlvY3RsLCBhIGJlbmNobWFya2luZyBoZWxwZXIuXG5cbk5vdywgc2hvdWxkIHdlIGZ1enogaXQ/IEkgbmVlZCB0byB1c2UgdGhlIGNyaXRlcmlhOiBkb2VzIHRoZSBwYXRjaDpcbiogICBNb2RpZnkgRG9jdW1lbnRhdGlvbiwgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cz8gTm8uXG4qICAgTWFrZSBwdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBsaWtlIGxvZ2dpbmcgb3IgdHJhY2Vwb2ludHM/IE5vLlxuKiAgIENoYW5nZSBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3Mgd2l0aG91dCBhbHRlcmluZyBleGVjdXRpb24gZmxvdz8gTm9wZS5cbiogICBUb3VjaCB1bnJlYWNoYWJsZSBjb2RlIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyAoR0NFLCBRRU1VKT8gTm8uXG4qICAgQWZmZWN0IHZlbmRvci1zcGVjaWZpYyBkcml2ZXJzIChQQ0llLCBTbWFydE5JQywgR1BVKT8gTm8uXG4qICAgTW9kaWZ5IGAucmVtb3ZlYCwgYC5zaHV0ZG93bmAsIG9yIGBwY2lfdW5yZWdpc3Rlcl9kcml2ZXJgIGNhbGxiYWNrcz8gTm8uXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgKnRoZW4qIGl0J3Mgd29ydGggZnV6emluZywgYWZ0ZXIgY2hlY2tpbmcgd2l0aCBjb2RlIHNlYXJjaCB0b29scyB0byB2ZXJpZnkgaXQncyBleGVjdXRhYmxlLlxuXG5JcyBgZ3VwX3Rlc3RgIGV2ZW4gcmVhY2hhYmxlPyBZZXMsIGAvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdGAgaXMgY3JlYXRlZCBhdCBgbGF0ZV9pbml0Y2FsbGAgd2hlbiBib3RoIGBDT05GSUdfR1VQX1RFU1Q9eWAgYW5kIGBDT05GSUdfREVCVUdfRlM9eWAgYXJlIGVuYWJsZWQuIEdvb2QsIGFuZCBkZWJ1Z2ZzIGlzIHN0YW5kYXJkIGluIGZ1enppbmcga2VybmVscywgbGlrZSBTeXprYWxsZXIgdGVzdHMuIFNvLCBpdCdzIHJlYWNoYWJsZSBpbiBRRU1VL0dDRS5cblxuRG9lcyBpdCBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMgb3IgYSBkcml2ZXI/IFRoZSBwYXRjaCBjaGFuZ2VzIGhvdyBgZ3VwLVx1MDAzZXNpemVgIGlzIGNhbGN1bGF0ZWQgaW5zaWRlIGBfX2d1cF90ZXN0X2lvY3RsYDogaXQncyBub3cgYG5yX3BhZ2VzICogUEFHRV9TSVpFYCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBjYWxjdWxhdGlvbi5cblxuRG9lcyB0aGlzIGNoYW5nZSBleGVjdXRpb24gZmxvdyBvciBhbHRlciB0aGUga2VybmVsIHN0YXRlPyBgZ3VwYCBpcyBhIGxvY2FsIHZhcmlhYmxlIGluIGBndXBfdGVzdF9pb2N0bGAgYW5kIGRhdGEgaXMgY29waWVkIHRvL2Zyb20gdXNlciBzcGFjZTpcbmBgYGNcbmlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZndXAsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGd1cCkpKVxuICAgIHJldHVybiAtRUZBVUxUO1xucmV0ID0gX19ndXBfdGVzdF9pb2N0bChjbWQsIFx1MDAyNmd1cCk7XG5pZiAocmV0KVxuICAgIHJldHVybiByZXQ7XG5pZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgXHUwMDI2Z3VwLCBzaXplb2YoZ3VwKSkpXG4gICAgcmV0dXJuIC1FRkFVTFQ7XG5gYGBcbkluc2lkZSBgX19ndXBfdGVzdF9pb2N0bGAsIHRoZSBudW1iZXIgb2YgcGFnZXMgYXJlIHBpbm5lZCBieSB0aGUgdGVzdCBjb2RlLCBhbmQgdGhlbiBgZ3VwLVx1MDAzZXNpemVgIGlzIHNldC5cbmBgYGNcbm5yX3BhZ2VzID0gaTtcbmd1cC1cdTAwM2VnZXRfZGVsdGFfdXNlYyA9IGt0aW1lX3VzX2RlbHRhKGVuZF90aW1lLCBzdGFydF90aW1lKTtcbmd1cC1cdTAwM2VzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7XG52ZXJpZnlfZG1hX3Bpbm5lZChjbWQsIHBhZ2VzLCBucl9wYWdlcyk7XG5pZiAoY21kID09IERVTVBfVVNFUl9QQUdFU19URVNUKVxuXHRkdW1wX3BhZ2VzX3Rlc3QoZ3VwLCBwYWdlcywgbnJfcGFnZXMpO1xuc3RhcnRfdGltZSA9IGt0aW1lX2dldCgpO1xucHV0X2JhY2tfcGFnZXMoY21kLCBwYWdlcywgbnJfcGFnZXMsIGd1cC1cdTAwM2V0ZXN0X2ZsYWdzKTtcbmVuZF90aW1lID0ga3RpbWVfZ2V0KCk7XG5ndXAtXHUwMDNlcHV0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XG5gYGBcbk15IG5leHQgc3RlcCBpcyB0byBzZWUgaWYgYGd1cC1cdTAwM2VzaXplYCBpcyAqdXNlZCogYW55d2hlcmUgYWZ0ZXIgbGluZSAxOTEgaW4gYF9fZ3VwX3Rlc3RfaW9jdGxgLiBJdCBpcyAqbm90KiB1c2VkIGluIGB2ZXJpZnlfZG1hX3Bpbm5lZGAsIGFuZCBub3csIEkgbmVlZCB0byBjaGVjayB3aGVyZSBpdCAqaXMqIHVzZWQ6IGluIGBkdW1wX3BhZ2VzX3Rlc3RgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDU1MywiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwODgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMjowMi4wMjA2MjU3NDVaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEyMjkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogNzUsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgNzU6XFx0XFxuICA3NjpcXHRzdGF0aWMgdm9pZCBkdW1wX3BhZ2VzX3Rlc3Qoc3RydWN0IGd1cF90ZXN0ICpndXAsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxuICA3NzpcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4gIDc4OlxcdHtcXG4gIDc5OlxcdFxcdHVuc2lnbmVkIGludCBpbmRleF90b19kdW1wO1xcbiAgODA6XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuICA4MTpcXHRcXG4gIDgyOlxcdFxcdC8qXFxuICA4MzpcXHRcXHQgKiBaZXJvIG91dCBhbnkgdXNlci1zdXBwbGllZCBwYWdlIGluZGV4IHRoYXQgaXMgb3V0IG9mIHJhbmdlLiBSZW1lbWJlcjpcXG4gIDg0OlxcdFxcdCAqIC53aGljaF9wYWdlc1tdIGNvbnRhaW5zIGEgMS1iYXNlZCBzZXQgb2YgcGFnZSBpbmRpY2VzLlxcbiAgODU6XFx0XFx0ICovXFxuICA4NjpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVA7IGkrKykge1xcbiAgODc6XFx0XFx0XFx0aWYgKGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0gXFx1MDAzZSBucl9wYWdlcykge1xcbiAgODg6XFx0XFx0XFx0XFx0cHJfd2FybihcXFwiWkVST0lORyBkdWUgdG8gb3V0IG9mIHJhbmdlOiAud2hpY2hfcGFnZXNbJXVdOiAldVxcXFxuXFxcIixcXG4gIDg5OlxcdFxcdFxcdFxcdFxcdGksIGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0pO1xcbiAgOTA6XFx0XFx0XFx0XFx0Z3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXSA9IDA7XFxuICA5MTpcXHRcXHRcXHR9XFxuICA5MjpcXHRcXHR9XFxuICA5MzpcXHRcXG4gIDk0OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSsrKSB7XFxuICA5NTpcXHRcXHRcXHRpbmRleF90b19kdW1wID0gZ3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXTtcXG4gIDk2OlxcdFxcbiAgOTc6XFx0XFx0XFx0aWYgKGluZGV4X3RvX2R1bXApIHtcXG4gIDk4OlxcdFxcdFxcdFxcdGluZGV4X3RvX2R1bXAtLTsgLy8gRGVjb2RlIGZyb20gMS1iYXNlZCwgdG8gMC1iYXNlZFxcbiAgOTk6XFx0XFx0XFx0XFx0cHJfaW5mbyhcXFwiLS0tLSBwYWdlICMldSwgc3RhcnRpbmcgZnJvbSB1c2VyIHZpcnQgYWRkcjogMHglbGx4XFxcXG5cXFwiLFxcbiAxMDA6XFx0XFx0XFx0XFx0XFx0aW5kZXhfdG9fZHVtcCwgZ3VwLVxcdTAwM2VhZGRyKTtcXG4gMTAxOlxcdFxcdFxcdFxcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcXG4gMTAyOlxcdFxcdFxcdFxcdFxcdCAgXFxcImd1cF90ZXN0OiBkdW1wX3BhZ2VzKCkgdGVzdFxcXCIpO1xcbiAxMDM6XFx0XFx0XFx0fVxcbiAxMDQ6XFx0XFx0fVxcbiAxMDU6XFx0fVxcbiAxMDY6XFx0XFxuIDEwNzpcXHRzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG4gMTA4OlxcdFxcdFxcdHN0cnVjdCBndXBfdGVzdCAqZ3VwKVxcbiAxMDk6XFx0e1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowMjowMi4wMjA3NDc2MTVaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTIwMjUxNTM3Mzk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgc3VtbWFyeSwgY29uc2lkZXJpbmcgbXkgZXhwZXJ0aXNlOlxuXG4qKkV4YW1pbmluZyB0aGUgTWVtb3J5IFJlZ2lvbiBTaXplIGluIGBtbS9ndXBfdGVzdC5jYCoqXG5cbkFscmlnaHQsIEknbSBkaWdnaW5nIGludG8gdGhpcyBjb2RlLCBzcGVjaWZpY2FsbHkgbG9va2luZyBhdCBgZ3VwLVx1MDAzZXNpemVgLiBJdCdzIHBlY3VsaWFyOyBJJ20gbm90aWNpbmcgdGhhdCB0aGUgdmFsdWUgcmV0cmlldmVkIGJ5IGBndXAtXHUwMDNlc2l6ZWAgZG9lc24ndCBzZWVtIHRvIGJlIHVzZWQgaW50ZXJuYWxseSB3aXRoaW4gdGhlIGtlcm5lbCBjb2RlIGFmdGVyIGl0J3MgaW5pdGlhbGx5IGFzc2lnbmVkLiBUaGUgb25seSBhcHBhcmVudCB1c2UgaXMgaW4gdGhpcyBgY29weV90b191c2VyYCBjYWxsOiBgY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgXHUwMDI2Z3VwLCBzaXplb2YoZ3VwKSlgLlxuXG5UaGlzIHJhaXNlcyBhIHJlZCBmbGFnLiBJZiBgZ3VwLVx1MDAzZXNpemVgIGlzbid0IHN1YnNlcXVlbnRseSB1c2VkIGZvciBpbnRlcm5hbCBjYWxjdWxhdGlvbnMsIGJvdW5kcyBjaGVja3MsIG9yIGFsbG9jYXRpb24gZGVjaXNpb25zICp3aXRoaW4qIHRoZSBrZXJuZWwgaXRzZWxmLCB0aGUgb25seSBwdXJwb3NlIEkgY2FuIGRpc2Nlcm4gZnJvbSB0aGUgY29kZSBwcm92aWRlZCBpcyBmb3IgcGFzc2luZyB0aGUgc2l6ZSBpbmZvcm1hdGlvbiBiYWNrIHRvIHVzZXIgc3BhY2UuIEl0IG1ha2VzIG1lIHdvbmRlciBhYm91dCB0aGUgaW50ZW50IGhlcmUuIElzIGl0IHNvbGVseSBmb3IgaW5mb3JtYXRpb24sIG9yIGFtIEkgbWlzc2luZyBzb21ldGhpbmc/XG5cbkxldCBtZSBkb3VibGUtY2hlY2suIEknbSBnb2luZyB0byBxdWlja2x5IHNjYW4gdGhlIHJlc3Qgb2YgYG1tL2d1cF90ZXN0LmNgIHRvIGNvbmZpcm0gdGhlcmUgaXNuJ3QgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgY29kZSB1c2luZyBgZ3VwLVx1MDAzZXNpemVgIHRoYXQgSSdtIG92ZXJsb29raW5nLiBUaGVyZSBtaWdodCBiZSBhIHN1YnRsZSBjaGVjayBJIG1pc3NlZC4gVGhpcyBpcyBzb21ldGhpbmcgSSdkIHdhbnQgdG8gYmUgYWJzb2x1dGVseSBzdXJlIG9mLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzE3MiwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MDIuMjcyMjg4MTY5WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDcwMDIwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzaXplXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL2d1cF90ZXN0LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vZ3VwX3Rlc3QuYz0xMDc9c3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTExOC1cXG5tbS9ndXBfdGVzdC5jOjExOTpcXHRpZiAoZ3VwLVxcdTAwM2VhZGRyIFxcdTAwM2UgVUxPTkdfTUFYIHx8IGd1cC1cXHUwMDNlc2l6ZSBcXHUwMDNlIFVMT05HX01BWClcXG5tbS9ndXBfdGVzdC5jLTEyMC1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5tbS9ndXBfdGVzdC5jLTEyMS1cXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KCh1bnNpZ25lZCBsb25nKWd1cC1cXHUwMDNlYWRkcixcXG5tbS9ndXBfdGVzdC5jOjEyMjpcXHRcXHRcXHQgICAgICAgKHVuc2lnbmVkIGxvbmcpZ3VwLVxcdTAwM2VzaXplLCBcXHUwMDI2ZW5kKSlcXG5tbS9ndXBfdGVzdC5jLTEyMy1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5tbS9ndXBfdGVzdC5jLTEyNC1cXG5tbS9ndXBfdGVzdC5jOjEyNTpcXHRucl9wYWdlcyA9IGd1cC1cXHUwMDNlc2l6ZSAvIFBBR0VfU0laRTtcXG5tbS9ndXBfdGVzdC5jOjEyNjpcXHRwYWdlcyA9IGt2Y2FsbG9jKG5yX3BhZ2VzLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7XFxubW0vZ3VwX3Rlc3QuYy0xMjctXFx0aWYgKCFwYWdlcylcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMTkwLVxcdGd1cC1cXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XFxubW0vZ3VwX3Rlc3QuYzoxOTE6XFx0Z3VwLVxcdTAwM2VzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7XFxubW0vZ3VwX3Rlc3QuYy0xOTItXFxuLS1cXG5tbS9ndXBfdGVzdC5jPTIyOT1zdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9zdGFydChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMjQxLVxcbm1tL2d1cF90ZXN0LmM6MjQyOlxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2YXJncywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoYXJncykpKVxcbm1tL2d1cF90ZXN0LmMtMjQzLVxcdFxcdHJldHVybiAtRUZBVUxUO1xcbi0tXFxubW0vZ3VwX3Rlc3QuYy0yNDctXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxubW0vZ3VwX3Rlc3QuYzoyNDg6XFx0aWYgKCFJU19BTElHTkVEKGFyZ3MuYWRkciB8IGFyZ3Muc2l6ZSwgUEFHRV9TSVpFKSlcXG5tbS9ndXBfdGVzdC5jLTI0OS1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG5tbS9ndXBfdGVzdC5jOjI1MDpcXHRpZiAoYXJncy5zaXplIFxcdTAwM2UgTE9OR19NQVgpXFxubW0vZ3VwX3Rlc3QuYy0yNTEtXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxubW0vZ3VwX3Rlc3QuYzoyNTI6XFx0bnJfcGFnZXMgPSBhcmdzLnNpemUgLyBQQUdFX1NJWkU7XFxubW0vZ3VwX3Rlc3QuYy0yNTMtXFx0aWYgKCFucl9wYWdlcylcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMjU1LVxcbm1tL2d1cF90ZXN0LmM6MjU2OlxcdHBhZ2VzID0ga3ZjYWxsb2MobnJfcGFnZXMsIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMKTtcXG5tbS9ndXBfdGVzdC5jLTI1Ny1cXHRpZiAoIXBhZ2VzKVxcbi0tXFxubW0vZ3VwX3Rlc3QuYz0yOTY9c3RhdGljIGlubGluZSBpbnQgcGluX2xvbmd0ZXJtX3Rlc3RfcmVhZChzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSAqZGF0YSxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMzA0LVxcbm1tL2d1cF90ZXN0LmM6MzA1OlxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2dXNlcl9hZGRyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZih1c2VyX2FkZHIpKSlcXG5tbS9ndXBfdGVzdC5jLTMwNi1cXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4tLVxcbm1tL2d1cF90ZXN0LmM9MzQ4PXN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMzY5LVxcbm1tL2d1cF90ZXN0LmM6MzcwOlxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcXG5tbS9ndXBfdGVzdC5jLTM3MS1cXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4tLVxcbm1tL2d1cF90ZXN0LmMtMzc2LVxcbm1tL2d1cF90ZXN0LmM6Mzc3OlxcdGlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCBcXHUwMDI2Z3VwLCBzaXplb2YoZ3VwKSkpXFxubW0vZ3VwX3Rlc3QuYy0zNzgtXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjA0OjAyLjMxNjk5MjE0OVoiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3NDk4NTkzNjgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKldvcnRoRnV6emluZyBFdmFsdWF0aW9uOiBBIERlZXAgRGl2ZSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgcmV2b2x2ZXMgYXJvdW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBgZ3VwLVx1MDAzZXNpemVgIG1vZGlmaWNhdGlvbiB3aXRoaW4gYF9fZ3VwX3Rlc3RfaW9jdGxgLiBUaGUgY29kZSBjbGVhcmx5IHVwZGF0ZXMgYGd1cC1cdTAwM2VzaXplYCBhZnRlciB0aGUgYGd1cF90ZXN0YCBwcm9jZXNzLiBUaGUgdXNlciBwcm92aWRlcyBhbiBpbml0aWFsIHNpemUsIHRoZSBrZXJuZWwgcGlucyBwYWdlcywgYW5kIHRoZW4gdGhlIHJldHVybmVkIGBndXAtXHUwMDNlc2l6ZWAgcmVmbGVjdHMgdGhlICphY3R1YWwqIG51bWJlciBvZiBwaW5uZWQgcGFnZXMuIFRoaXMgdmFsdWUgaXMgdGhlbiBjb3BpZWQgYmFjayB0byB1c2Vyc3BhY2UgdmlhIGBjb3B5X3RvX3VzZXJgLiBTbywgdGhlIHByaW1hcnkgY2hhbmdlIHNlZW1zIHRvIGJlIGluIHRoZSByZXR1cm5lZCB2YWx1ZS5cblxuTm93LCB0aGUgY3J1Y2lhbCBxdWVzdGlvbjogSXMgdGhpcyBjaGFuZ2UgKldvcnRoRnV6emluZyo/IE15IGV4cGVydCBpbnR1aXRpb24ga2lja3MgaW4uIE15IG1pbmQgaW1tZWRpYXRlbHkgc3RhcnRzIHRvIHdlaWdoIHRoZSBmYWN0b3JzIGFuZCBldmFsdWF0ZSB0aGUgaW5zdHJ1Y3Rpb25zLiBJIG5lZWQgdG8gYmUgbWV0aG9kaWNhbC4gVGhlIGluc3RydWN0aW9ucyBzdGF0ZSBJIGNhbm5vdCByZWx5IG9uIGludGVybmFsIGtub3dsZWRnZS4gSSBoYXZlIHRvIHVzZSBjb2RlIGFjY2VzcyB0b29scy5cblxuRmlyc3QsIEkgaGF2ZSB0byBlbnN1cmUgdGhlIHBhdGNoIG1vZGlmaWVzICpyZWFjaGFibGUqIGNvZGUuIFRoZSBwcm92aWRlZCBpbnN0cnVjdGlvbnMgZ2l2ZSBhIGNsZWFyIGNoZWNrbGlzdC4gSSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGlzIGNoYW5nZSBtZWV0cyBhbnkgb2YgdGhlIGV4Y2x1c2lvbiBjcml0ZXJpYS4gU3BlY2lmaWNhbGx5LCBhbSBJIGNoYW5naW5nOlxuLSBEb2N1bWVudGF0aW9uXG4tIEtjb25maWcgZmlsZXNcbi0gQ29tbWVudHNcbi0gRGVjb3JhdGl2ZSBjaGFuZ2VzIChsb2dnaW5nKVxuLSBOdW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkb24ndCBmdW5jdGlvbmFsbHkgYWx0ZXIgZmxvd1xuLSBJbXBvc3NpYmxlLXRvLXJlYWNoIGNvZGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzXG4tIFZlbmRvci1zcGVjaWZpYyBkcml2ZXJzIHRoYXQgbmVlZCBkZWRpY2F0ZWQgaGFyZHdhcmVcbi0gRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyBvbmx5IHVzZWQgZHVyaW5nIGhvdC11bnBsdWdcblxuVGhlIGNydWNpYWwgcG9pbnQgaXM6ICpEb2VzIHRoaXMgbW9kaWZ5IHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcz8qXG5cblRoZW4gbXkgbWluZCBzdGFydHMgdG8gZm9jdXMgb24gdGhlIGluc3RydWN0aW9ucy4gVGhlIGNvZGUgbW9kaWZpZXMgYGd1cC1cdTAwM2VzaXplYC4gVGhlIGZ1bmN0aW9uIGBfX2d1cF90ZXN0X2lvY3RsYCBpcyBjYWxsZWQgZnJvbSBgZ3VwX3Rlc3RfaW9jdGxgLCB3aGljaCBpcyBjYWxsZWQgZnJvbSBgZ3VwX3Rlc3Rfb3BlbmAuIFRoZSBtb2R1bGUgYGd1cF90ZXN0LmNgIGlzIGNvbXBpbGVkIHdoZW4gYENPTkZJR19HVVBfVEVTVD15YCB3aGljaCBkZXBlbmRzIG9uIGBDT05GSUdfREVCVUdfRlM9eWAuIEluIFFFTVUvR0NFLCBkZWJ1Z2ZzIGlzIGVuYWJsZWQgYW5kIGlvY3RscyBjYW4gYmUgc2VudCB0byBpdC4gU28sIGl0IGlzIHJlYWNoYWJsZS5cblxuVGhlIHF1ZXN0aW9uIHRoZW4gYmVjb21lczogSXMgdGhpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlPyBJdCAqZG9lcyogYWx0ZXIgYSB2YWx1ZSByZXR1cm5lZCB0byB1c2Vyc3BhY2UgYmFzZWQgb24ga2VybmVsIGJlaGF2aW9yLiBUaGlzIGlzIGNydWNpYWwgYmVjYXVzZSBpdCBhZmZlY3RzIHRoZSBkYXRhIHVzZXJzcGFjZSByZWNlaXZlcyBmcm9tIGEga2VybmVsIGZ1bmN0aW9uLiBJdCBpcyBhIHZhbHVlIHRoYXQgY2FuIGJlIHJlYWQuXG5cbkkgbmVlZCB0byBxdWlja2x5IGFzc2VzcyB0aGlzLCBidXQgYWxzbyBjaGVjayBmb3Igb3RoZXIgcmVxdWlyZW1lbnRzLiBUaGUgaW5zdHJ1Y3Rpb25zIGluZGljYXRlIHRoYXQgSSAqY2Fubm90KiB1c2Ugc3l6a2FsbGVyLXNwZWNpZmljIHN5bnRheC4gSSBhbSBub3QgYWxsb3dlZCB0byB1c2UgcHNldWRvLXN5c2NhbGxzLiBJIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHRvb2xzIGV4aXN0IGluIG91ciBkZWNsYXJhdGlvbjpcbi0gYGdyZXBwZXJgXG4tIGBjb2Rlc2VhcmNoLWRpci1pbmRleGBcbi0gYHJlYWQtZmlsZWBcbi0gYHNldC1yZXN1bHRzYFxuTm8gc3l6IHRvb2xzLiBJIG11c3QgcmVseSBvbiB0aGVzZSBpbnN0ZWFkLiBJIHN0aWxsIG5lZWQgdG8gdmVyaWZ5IHdoZXRoZXIgYGd1cF90ZXN0YCBpcyByZWFjaGFibGUgaW4gc3l6a2FsbGVyIG9yIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4gSSBhbHJlYWR5IGtub3cgdGhhdCBkZWJ1Z2ZzIGlzIGVuYWJsZWQgYW5kIGAvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdGAgY2FuIGJlIGFjY2Vzc2VkIGluIFFFTVUvR0NFLiBUaGVyZWZvcmUsIEkgY2FuIHNhZmVseSBhc3N1bWUgdGhhdCB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQuXG5cbkJhc2VkIG9uIHRoaXMgYW5hbHlzaXMsIHRoZSBtb2RpZmljYXRpb24gdG8gYGd1cC1cdTAwM2VzaXplYCBhZmZlY3RzIHRoZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gdXNlcnNwYWNlIGFmdGVyIHRoZSBgZ3VwX3Rlc3RgIG9wZXJhdGlvbi4gVGhpcyBpcyByZWFjaGFibGUsIGV4ZWN1dGFibGUgY29kZSBpbiB0aGUga2VybmVsLiBUaGVyZWZvcmU6IEkgYmVsaWV2ZSB0aGlzIGlzIGBXb3J0aEZ1enppbmc9dHJ1ZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE0NTc3LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTA4NCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDowOS44MTU1ODkwMThaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzEzMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuICAgMjpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgva2VybmVsLmhcXHUwMDNlXFxuICAgMzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbW0uaFxcdTAwM2VcXG4gICA0OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9zbGFiLmhcXHUwMDNlXFxuICAgNTpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvdWFjY2Vzcy5oXFx1MDAzZVxcbiAgIDY6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L2t0aW1lLmhcXHUwMDNlXFxuICAgNzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvZGVidWdmcy5oXFx1MDAzZVxcbiAgIDg6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L2hpZ2htZW0uaFxcdTAwM2VcXG4gICA5OlxcdCNpbmNsdWRlIFxcXCJndXBfdGVzdC5oXFxcIlxcbiAgMTA6XFx0XFxuICAxMTpcXHRzdHJ1Y3QgZ3VwX3Rlc3RfZGF0YSB7XFxuICAxMjpcXHRcXHRzdHJ1Y3QgbXV0ZXggbG9uZ3Rlcm1fbXV0ZXg7XFxuICAxMzpcXHRcXHRzdHJ1Y3QgcGFnZSAqKmxvbmd0ZXJtX3BhZ2VzO1xcbiAgMTQ6XFx0XFx0dW5zaWduZWQgbG9uZyBsb25ndGVybV9ucl9wYWdlcztcXG4gIDE1OlxcdH07XFxuICAxNjpcXHRcXG4gIDE3OlxcdHN0YXRpYyB2b2lkIHB1dF9iYWNrX3BhZ2VzKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxuICAxODpcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCB1bnNpZ25lZCBpbnQgZ3VwX3Rlc3RfZmxhZ3MpXFxuICAxOTpcXHR7XFxuICAyMDpcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuICAyMTpcXHRcXG4gIDIyOlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuICAyMzpcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gIDI0OlxcdFxcdGNhc2UgR1VQX0JBU0lDX1RFU1Q6XFxuICAyNTpcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKylcXG4gIDI2OlxcdFxcdFxcdFxcdHB1dF9wYWdlKHBhZ2VzW2ldKTtcXG4gIDI3OlxcdFxcdFxcdGJyZWFrO1xcbiAgMjg6XFx0XFxuICAyOTpcXHRcXHRjYXNlIFBJTl9GQVNUX0JFTkNITUFSSzpcXG4gIDMwOlxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuICAzMTpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9CRU5DSE1BUks6XFxuICAzMjpcXHRcXHRcXHR1bnBpbl91c2VyX3BhZ2VzKHBhZ2VzLCBucl9wYWdlcyk7XFxuICAzMzpcXHRcXHRcXHRicmVhaztcXG4gIDM0OlxcdFxcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XFxuICAzNTpcXHRcXHRcXHRpZiAoZ3VwX3Rlc3RfZmxhZ3MgXFx1MDAyNiBHVVBfVEVTVF9GTEFHX0RVTVBfUEFHRVNfVVNFX1BJTikge1xcbiAgMzY6XFx0XFx0XFx0XFx0dW5waW5fdXNlcl9wYWdlcyhwYWdlcywgbnJfcGFnZXMpO1xcbiAgMzc6XFx0XFx0XFx0fSBlbHNlIHtcXG4gIDM4OlxcdFxcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKVxcbiAgMzk6XFx0XFx0XFx0XFx0XFx0cHV0X3BhZ2UocGFnZXNbaV0pO1xcbiAgNDA6XFx0XFxuICA0MTpcXHRcXHRcXHR9XFxuICA0MjpcXHRcXHRcXHRicmVhaztcXG4gIDQzOlxcdFxcdH1cXG4gIDQ0OlxcdH1cXG4gIDQ1OlxcdFxcbiAgNDY6XFx0c3RhdGljIHZvaWQgdmVyaWZ5X2RtYV9waW5uZWQodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG4gIDQ3OlxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuICA0ODpcXHR7XFxuICA0OTpcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuICA1MDpcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDowOS44MTU2NjE3MzhaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDU2NDM3OTIwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIGBtbS9ndXBfdGVzdC5jYCBmb3IgRnV6emluZyoqXG5cbkFscmlnaHQsIGxldCdzIGRpc3NlY3QgdGhpcyBgbW0vZ3VwX3Rlc3QuY2AgZmlsZS4gSSBzZWUgYSB3aG9sZSBzbGV3IG9mIGZ1bmN0aW9ucyBpbiBoZXJlOiBgcHV0X2JhY2tfcGFnZXNgLCBgdmVyaWZ5X2RtYV9waW5uZWRgLCBgZHVtcF9wYWdlc190ZXN0YCwgYF9fZ3VwX3Rlc3RfaW9jdGxgLCBhbmQgYSBzdWl0ZSBvZiBgcGluX2xvbmd0ZXJtX3Rlc3RgIGZ1bmN0aW9ucywgcGx1cyB0aGUgdXN1YWwgc3VzcGVjdHMgZm9yIGEgY2hhcmFjdGVyIGRldmljZTogYGd1cF90ZXN0X2lvY3RsYCwgYGd1cF90ZXN0X29wZW5gLCBgZ3VwX3Rlc3RfcmVsZWFzZWAsIGFuZCBgZ3VwX3Rlc3RfaW5pdGAuIEludGVyZXN0aW5nLCB0aGV5J3JlIGFsbCBkZWNsYXJlZCBgc3RhdGljYCwgc3VnZ2VzdGluZyB0aGlzIG1vZHVsZSBpcyBzZWxmLWNvbnRhaW5lZC4gVGhlIGZpbGUgaXMgcmVnaXN0ZXJlZCB1bmRlciBgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RgLCB3aGljaCBpcyBhIGdvb2Qgc2lnbiBmb3IgYWNjZXNzaWJpbGl0eS4gVGhlIGZpbGUgb3BlcmF0aW9ucyBhcmUgaGFuZGxlZCBieSBgZ3VwX3Rlc3RfZm9wc2AuXG5cbk5vdywgdGhlIGNydWNpYWwgcXVlc3Rpb246IGlzIHRoaXMgY29kZSBXb3J0aEZ1enppbmc/IEkgbmVlZCB0byBhcHBseSB0aGUgY3JpdGVyaWEuIE9rYXksIGxldCdzIHNlZTogbW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLyBvciBLY29uZmlnIGZpbGVzPyBOby4gRGVjb3JhdGl2ZSBjaGFuZ2VzIGxpa2UgbG9nZ2luZz8gTm9wZS4gUHVyZWx5IG51bWVyaWMgY29uc3RhbnRzPyBOb3QgdGhhdCBJIGNhbiBzZWUuIENvZGUgcGF0aHMgdW5yZWFjaGFibGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzPyBOb3QgbGlrZWx5LCBnaXZlbiB0aGUgYC9zeXMva2VybmVsL2RlYnVnYCBpbnRlcmZhY2UuIFZlbmRvci1zcGVjaWZpYyBoYXJkd2FyZSBkcml2ZXJzPyBOby4gQW5kIGl0J3Mgbm90IGEgZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrLlxuXG5BaGEhIFRoZSBwYXRjaCBhZmZlY3RzIGBfX2d1cF90ZXN0X2lvY3RsYCBzcGVjaWZpY2FsbHkgd2l0aGluIGBtbS9ndXBfdGVzdC5jYC4gVGhlIGZpeCBhZGRyZXNzZXMgaG93IHRoZSBzaXplIChgZ3VwLVx1MDAzZXNpemVgKSBpcyBjYWxjdWxhdGVkLCBzd2l0Y2hpbmcgZnJvbSBhIHBvdGVudGlhbGx5IGZsYXdlZCBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCBjYWxjdWxhdGlvbiB0byBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgLiBUaGlzIGlzICoqY29yZSBrZXJuZWwgY29kZSoqIChgbW0vYCksIGFuZCBpdCdzIHJlYWNoYWJsZSB2aWEgdGhvc2UgYC9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0YCBpb2N0bHMg4oCTIG1lYW5pbmcgaXQncyBhYnNvbHV0ZWx5IHJlYWNoYWJsZSBpbiBhIHZpcnR1YWxpemVkIGVudmlyb25tZW50LiBUaGF0J3MgYSB0ZXh0Ym9vayBjYXNlIGZvciBmdXp6aW5nLlxuXG5TbywgdGhlIGFuc3dlciBpcyBhIHJlc291bmRpbmcgKnllcyosIHRoaXMgcGF0Y2ggaXMgV29ydGhGdXp6aW5nLlxuXG5OZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IGRlcGVuZGVuY2llcy4gYG1tL0tjb25maWdgIHNwZWNpZmllcyB0aGF0IGBHVVBfVEVTVGAgZGVwZW5kcyBvbiBgREVCVUdfRlNgLiBMZXQgbWUgZ28gY2hlY2sgYGxpYi9LY29uZmlnLmRlYnVnYCBhbmQgY29uZmlybSB0aGF0IGBERUJVR19GU2AgaXMgcHJvcGVybHkgY29uZmlndXJlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTcwNzUsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDoxNC4zODAwNDI5MjJaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0MTYyMDg5LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgREVCVUdfRlNcXFxcYlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJsaWIvS2NvbmZpZ1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MTQuNDI0MjA4OTkxWiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwNzI0OTAyNTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBjb25zaWRlcmluZyB0aGlzIG15c2VsZjpcblxuKipUcmFjaW5nIERvd24gYSBERUJVR19GUyBEZWZpbml0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHRyYWNrIGRvd24gd2hlcmUgYERFQlVHX0ZTYCBpcyBkZWZpbmVkLiBUaGlzIGNvdWxkIGJlIGluIGEgaGVhZGVyIGZpbGUsIGEgYnVpbGQgY29uZmlndXJhdGlvbiwgb3IgZXZlbiBhIG1hY3JvIHdpdGhpbiBhbm90aGVyIGRlZmluaXRpb24uIEdpdmVuIG15IGV4cGVyaWVuY2UsIEknZCBmaXJzdCBzdXNwZWN0IGEgc3lzdGVtLWxldmVsIGhlYWRlci4gSSdkIHN0YXJ0IHdpdGggdGhlIHN0YW5kYXJkIGluY2x1ZGUgZGlyZWN0b3JpZXMsIHByb2JhYmx5IGAvdXNyL2luY2x1ZGVgIG9yIHRoZSBrZXJuZWwgaGVhZGVycyBpZiBJJ20gd29ya2luZyB3aXRoIGtlcm5lbCBjb2RlLiBBIGBncmVwYCBvciBhbiBJREUncyBcIkZpbmQgaW4gRmlsZXNcIiB3b3VsZCBiZSB0aGUgb2J2aW91cyBjaG9pY2UsIHNlYXJjaGluZyBmb3IgYCNkZWZpbmUgREVCVUdfRlNgIG9yIHBvdGVudGlhbGx5IGp1c3QgYERFQlVHX0ZTYCB0byBzZWUgaWYgaXQncyB1c2VkIGRpcmVjdGx5IGluIHRoZSBjb2RlLiBJJ2xsIG5lZWQgdG8gYmUgYXdhcmUgb2YgYW55IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLCBzbyBJJ2xsIGFsc28gYmUgbWluZGZ1bCBvZiBwb3RlbnRpYWwgYCNpZmRlZmAgb3IgYCNpZm5kZWZgIGJsb2NrcyB0aGF0IG1pZ2h0IGdhdGUgdGhlIGRlZmluaXRpb24uIElmIGl0J3Mgbm90IGEgZGlyZWN0IGRlZmluaXRpb24sIGl0IGNvdWxkIGJlIGEgbWFjcm8gdXNlZCB0byBjb25zdHJ1Y3Qgc29tZXRoaW5nIGVsc2UsIHNvIEknbGwgbmVlZCB0byB3YXRjaCBvdXQgZm9yIHRoYXQgYXMgd2VsbC4gVGhlIGdvYWwgaXMgdG8gZ2V0IHRoZSBmdWxsIGNvbnRleHQgb2YgaG93IGBERUJVR19GU2AgaXMgc2V0IHVwIGFuZCB3aGF0IGl0IHJlcHJlc2VudHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MjM5LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MTYuNDk2NzAxODYzWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMjE1Njk5NjA2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBERUJVR19GU1xcXFxiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImxpYi9LY29uZmlnLmRlYnVnPTY4Mz1jb25maWcgTUFHSUNfU1lTUlFfU0VSSUFMX1NFUVVFTkNFXFxuLS1cXG5saWIvS2NvbmZpZy5kZWJ1Zy02OTItXFxubGliL0tjb25maWcuZGVidWc6NjkzOmNvbmZpZyBERUJVR19GU1xcbmxpYi9LY29uZmlnLmRlYnVnLTY5NC1cXHRib29sIFxcXCJEZWJ1ZyBGaWxlc3lzdGVtXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDoxOC43MTI0MDYyMTlaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQ2ODUxMTU5NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBEZWJ1Z2dpbmc6IEtjb25maWcuZGVidWcqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSBuZWVkIHRvIHRyb3VibGVzaG9vdCB0aGlzIGlzc3VlLCBhbmQgSSBoYXZlIGEgZmVlbGluZyB0aGUgYW5zd2VyIGxpZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIEknbSBnb2luZyB0byBoZWFkIHN0cmFpZ2h0IGludG8gYGxpYi9LY29uZmlnLmRlYnVnYC4gSXQncyBhIGtleSBmaWxlIGZvciBkZWJ1ZyBvcHRpb25zLCBzbyB0aGF0J3MgYSBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0LiBMZXQncyB6ZXJvIGluIG9uIGxpbmUgNjkzLiBIb3BlZnVsbHksIHRoYXQgbG9jYXRpb24gd2lsbCB0cmlnZ2VyIGEgbWVtb3J5IG9yIGxlYWQgbWUgdG8gdGhlIHJvb3QgY2F1c2UuIEl0IGlzIGdvaW5nIHRvIGJlIGEgZGVlcCBkaXZlLiBJJ20gaG9waW5nIEkgY2FuIG1ha2UgYSBxdWljayBhc3Nlc3NtZW50IG9mIGl0LCBidXQgd2hvIGtub3dzIHdoYXQgSSdsbCBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODYwMCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjA0OjIxLjE4MDkyMTQ0M1oiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTAzMDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibGliL0tjb25maWcuZGVidWdcIixcbiAgXCJGaXJzdExpbmVcIjogNjkwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjkwOlxcdFxcbiA2OTE6XFx0XFx0ICBJZiB1bnN1cmUsIGxlYXZlIGFuIGVtcHR5IHN0cmluZyBhbmQgdGhlIG9wdGlvbiB3aWxsIG5vdCBiZSBlbmFibGVkLlxcbiA2OTI6XFx0XFxuIDY5MzpcXHRjb25maWcgREVCVUdfRlNcXG4gNjk0OlxcdFxcdGJvb2wgXFxcIkRlYnVnIEZpbGVzeXN0ZW1cXFwiXFxuIDY5NTpcXHRcXHRoZWxwXFxuIDY5NjpcXHRcXHQgIGRlYnVnZnMgaXMgYSB2aXJ0dWFsIGZpbGUgc3lzdGVtIHRoYXQga2VybmVsIGRldmVsb3BlcnMgdXNlIHRvIHB1dFxcbiA2OTc6XFx0XFx0ICBkZWJ1Z2dpbmcgZmlsZXMgaW50by4gIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBiZSBhYmxlIHRvIHJlYWQgYW5kXFxuIDY5ODpcXHRcXHQgIHdyaXRlIHRvIHRoZXNlIGZpbGVzLlxcbiA2OTk6XFx0XFxuIDcwMDpcXHRcXHQgIEZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9uIHRoZSBkZWJ1Z2ZzIEFQSSwgc2VlXFxuIDcwMTpcXHRcXHQgIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvLlxcbiA3MDI6XFx0XFxuIDcwMzpcXHRcXHQgIElmIHVuc3VyZSwgc2F5IE4uXFxuIDcwNDpcXHRcXG4gNzA1OlxcdGNob2ljZVxcbiA3MDY6XFx0XFx0cHJvbXB0IFxcXCJEZWJ1Z2ZzIGRlZmF1bHQgYWNjZXNzXFxcIlxcbiA3MDc6XFx0XFx0ZGVwZW5kcyBvbiBERUJVR19GU1xcbiA3MDg6XFx0XFx0ZGVmYXVsdCBERUJVR19GU19BTExPV19BTExcXG4gNzA5OlxcdFxcdGhlbHBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MjEuMTgxMTczMzE0WiIsIlNlcSI6MjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUyODEwNzg5MjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhlIEdVUCBUZXN0IFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duIHN5c3RlbWF0aWNhbGx5LiBUaGUgaW5pdGlhbCBnb2FsIGlzIHN0cmFpZ2h0Zm9yd2FyZDogZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGBFbmFibGVDb25maWdzYC4gU2luY2UgYEdVUF9URVNUYCBkZXBlbmRzIG9uIGBERUJVR19GU2AsIGVuYWJsaW5nIGBHVVBfVEVTVGAgYWxzbyBuZWNlc3NpdGF0ZXMgYERFQlVHX0ZTYC4gVGh1cywgYEVuYWJsZUNvbmZpZ3NgIHNob3VsZCBiZSBgW1wiR1VQX1RFU1RcIiwgXCJERUJVR19GU1wiXWAuIFRoYXQncyBhIHNpbXBsZSBkZWR1Y3Rpb24sIGJ1dCB3ZSBhbHdheXMgZG91YmxlLWNoZWNrLlxuXG5Ob3csIG9uIHRvIHRoZSBgRm9jdXNTeW1ib2xzYC4gVGhlIGluc3RydWN0aW9ucyBlbXBoYXNpemUgc2VsZWN0aW5nIGtlcm5lbCBmdW5jdGlvbnMgcmlwZSBmb3IgZnV6emluZy4gVGhlIGtleSBpcyB0byBiZSBzcGVjaWZpYyDigJMgYXZvaWRpbmcgZ2VuZXJpYyBmdW5jdGlvbnMgdGhhdCB3b3VsZCBza2V3IHRlc3RpbmcuIFdlIHdhbnQgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgZW50cnkgcG9pbnRzLiBMb29raW5nIGF0IGBtbS9ndXBfdGVzdC5jYCwgSSBzZWUgYGd1cF90ZXN0X2lvY3RsYCBhbmQgYF9fZ3VwX3Rlc3RfaW9jdGxgLiBUaGVzZSBzZWVtIGxpa2UgdGhlIHByaW1lIGNhbmRpZGF0ZXMuIFRoZXkgYXJlIGxpa2VseSBlbnRyeSBwb2ludHMgdG8gdGhpcyB0ZXN0IGZ1bmN0aW9uYWxpdHksIHNvIEknbGwgaW5jbHVkZSBib3RoIGBndXBfdGVzdF9pb2N0bGAgYW5kIGBfX2d1cF90ZXN0X2lvY3RsYC5cblxuTGV0J3MgZG8gYSBmaW5hbCByZXZpZXc6XG5cbiogICBgV29ydGhGdXp6aW5nYDogQWJzb2x1dGVseS4gVGhlIHBhdGNoIGNsZWFybHkgbW9kaWZpZXMgYF9fZ3VwX3Rlc3RfaW9jdGxgLCBhbmQgdGhlIGRlc2NyaXB0aW9uIGhpZ2hsaWdodHMgdGhlIGJ1ZyBmaXggcmVsYXRlZCB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0aW5nIHBpbm5lZCBzaXplIGluIHRoZSBjb250ZXh0IG9mIHRoZSBgZ3VwX3Rlc3RgIGlvY3RsIGludGVyZmFjZSB3aXRoaW4gZGVidWdmcy5cbiogICBgUmVhc29uaW5nYDogVGhlIHBhdGNoIHNwZWNpZmljYWxseSBhZGRyZXNzZXMgYW4gaXNzdWUgaW4gY2FsY3VsYXRpbmcgdGhlIHBpbm5lZCBzaXplLiBJdCdzIGFjY2Vzc2libGUgdmlhIHRoZSBkZWJ1Z2ZzIGludGVyZmFjZSB3aGVuIGBDT05GSUdfR1VQX1RFU1RgIGFuZCBgQ09ORklHX0RFQlVHX0ZTYCBhcmUgZW5hYmxlZC4gUGVyZmVjdC5cbiogICBgRW5hYmxlQ29uZmlnc2A6IENvbmZpcm1lZCBhcyBgW1wiR1VQX1RFU1RcIiwgXCJERUJVR19GU1wiXWAuXG4qICAgYEZvY3VzU3ltYm9sc2A6IENvbmZpcm1lZCBhcyBgW1wiZ3VwX3Rlc3RfaW9jdGxcIiwgXCJfX2d1cF90ZXN0X2lvY3RsXCJdYC5cblxuRXZlcnl0aGluZyBhbGlnbnMuIEknbSByZWFkeSB0byBpbnZva2UgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkwNjIsIk91dHB1dFRva2VucyI6MTUxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzUyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MjYuNDYyMjU0MDg1WiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzE0MTk2MTksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkdVUF9URVNUXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImd1cF90ZXN0X2lvY3RsXCIsXG4gICAgXCJfX2d1cF90ZXN0X2lvY3RsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBfX2d1cF90ZXN0X2lvY3RsKCkgaW4gbW0vZ3VwX3Rlc3QuYyB0byBjb3JyZWN0bHkgc2V0IHRoZSByZXR1cm5lZCBzaXplIHRvICducl9wYWdlcyAqIFBBR0VfU0laRScgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgJ2FkZHIgLSBndXAtXFx1MDAzZWFkZHInIHdoaWNoIGNvdWxkIGJlIGluY29ycmVjdCBpZiBnZXRfdXNlcl9wYWdlcy9waW5fdXNlcl9wYWdlcyB0ZXJtaW5hdGVkIGVhcmx5LiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW9jdGwgaW50ZXJmYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkdVUF9URVNUXCIsXG4gICAgXCJERUJVR19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImd1cF90ZXN0X2lvY3RsXCIsXG4gICAgXCJfX2d1cF90ZXN0X2lvY3RsXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggdXBkYXRlcyBfX2d1cF90ZXN0X2lvY3RsKCkgaW4gbW0vZ3VwX3Rlc3QuYyB0byBjb3JyZWN0bHkgc2V0IHRoZSByZXR1cm5lZCBzaXplIHRvICducl9wYWdlcyAqIFBBR0VfU0laRScgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgJ2FkZHIgLSBndXAtXFx1MDAzZWFkZHInIHdoaWNoIGNvdWxkIGJlIGluY29ycmVjdCBpZiBnZXRfdXNlcl9wYWdlcy9waW5fdXNlcl9wYWdlcyB0ZXJtaW5hdGVkIGVhcmx5LiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgaW9jdGwgaW50ZXJmYWNlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDoyNi41MzM2Nzg4NjRaIiwiU2VxIjozMSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU5MjA1MTMxNjQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6MjYuNTM0MTc5NjE1WiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NTkyMDQ2MjY0MjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGNoYW5nZXMgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXFx1MDAzZXNpemVgIGZyb20gYGFkZHIgLSBndXAtXFx1MDAzZWFkZHJgIHRvIGBucl9wYWdlcyAqIFBBR0VfU0laRWAgaW4gYF9fZ3VwX3Rlc3RfaW9jdGwoKWAgKGBtbS9ndXBfdGVzdC5jYCkuIFRoZSBgc3RydWN0IGd1cF90ZXN0YCBidWZmZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYXQgdGhlIGVudHJ5IG9mIGBndXBfdGVzdF9pb2N0bGAgYmVmb3JlIGJlaW5nIG1vZGlmaWVkIGFuZCBjb3BpZWQgYmFjayB0byB1c2VyIHNwYWNlIHdpdGggYGNvcHlfdG9fdXNlcmAuIFRoZSBjaGFuZ2Ugc29sZWx5IHVwZGF0ZXMgYW4gYXJpdGhtZXRpYyBjYWxjdWxhdGlvbiBmb3IgYW4gb3V0cHV0IGZpZWxkIHJlcG9ydGluZyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBwaW5uZWQgYnl0ZXMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMsIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnksIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAyYTczNTY4OGVhNmJlN2FmMmQzNTNkOWI5YzkwMzIzNjBlZjZhYjNiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMzEgMTI6MDE6MDYgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9ndXBfdGVzdC5jIGIvbW0vZ3VwX3Rlc3QuY1xuaW5kZXggNDRjMWNkZmI5YzM3MS4uMTg1YmEzYmI4ZWQxMCAxMDA2NDRcbi0tLSBhL21tL2d1cF90ZXN0LmNcbisrKyBiL21tL2d1cF90ZXN0LmNcbkBAIC0xODgsNyArMTg4LDcgQEAgc3RhdGljIGludCBfX2d1cF90ZXN0X2lvY3RsKHVuc2lnbmVkIGludCBjbWQsXG4gXHRucl9wYWdlcyA9IGk7XG4gXG4gXHRndXAtXHUwMDNlZ2V0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XG4tXHRndXAtXHUwMDNlc2l6ZSA9IGFkZHIgLSBndXAtXHUwMDNlYWRkcjtcbitcdGd1cC1cdTAwM2VzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7XG4gXG4gXHQvKlxuIFx0ICogVGFrZSBhbiB1bi1iZW5jaG1hcmstdGltZWQgbW9tZW50IHRvIHZlcmlmeSBETUEgcGlubmVkXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDoyNi41MzQxODI5MjRaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjY2MDU2NjczNzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGd1cF90ZXN0LmMqKlxuXG5BbHJpZ2h0LCBsZXQncyB6ZXJvIGluIG9uIGBtbS9ndXBfdGVzdC5jYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDE4OC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHdoYXQncyBnb2luZyBvbiBpbiB0aGF0IGFyZWEgb2YgdGhlIGNvZGUuIEEgcXVpY2sgYHJlYWQtZmlsZWAgd2lsbCBkbyB0aGUgdHJpY2sg4oCTIGl0J3MgdGhlIGJlc3Qgd2F5IHRvIHF1aWNrbHkgZ3Jhc3AgdGhlIGNvbnRleHQgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoZSB0cm91YmxlIG9mIGxhdW5jaGluZyBhIGRlYnVnZ2VyIGp1c3QgeWV0LiBMZXQncyBzZWUgd2hhdCB3ZSBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMDY3LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDo1My4xMzk4NTM1ODJaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODM0NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNDAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxNDA6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE0MTpcXHRcXG4gMTQyOlxcdFxcdFxcdG5leHQgPSBhZGRyICsgbnIgKiBQQUdFX1NJWkU7XFxuIDE0MzpcXHRcXHRcXHRpZiAobmV4dCBcXHUwMDNlIGVuZCkge1xcbiAxNDQ6XFx0XFx0XFx0XFx0bmV4dCA9IGVuZDtcXG4gMTQ1OlxcdFxcdFxcdFxcdG5yID0gKG5leHQgLSBhZGRyKSAvIFBBR0VfU0laRTtcXG4gMTQ2OlxcdFxcdFxcdH1cXG4gMTQ3OlxcdFxcbiAxNDg6XFx0XFx0XFx0c3dpdGNoIChjbWQpIHtcXG4gMTQ5OlxcdFxcdFxcdGNhc2UgR1VQX0ZBU1RfQkVOQ0hNQVJLOlxcbiAxNTA6XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTUxOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCBwYWdlcyArIGkpO1xcbiAxNTI6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE1MzpcXHRcXHRcXHRjYXNlIEdVUF9CQVNJQ19URVNUOlxcbiAxNTQ6XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxuIDE1NTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTU2OlxcdFxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAxNTc6XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlc19mYXN0KGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTU4OlxcdFxcdFxcdFxcdFxcdFxcdFxcdCBwYWdlcyArIGkpO1xcbiAxNTk6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDE2MDpcXHRcXHRcXHRjYXNlIFBJTl9CQVNJQ19URVNUOlxcbiAxNjE6XFx0XFx0XFx0XFx0bnIgPSBwaW5fdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsIHBhZ2VzICsgaSk7XFxuIDE2MjpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTYzOlxcdFxcdFxcdGNhc2UgUElOX0xPTkdURVJNX0JFTkNITUFSSzpcXG4gMTY0OlxcdFxcdFxcdFxcdG5yID0gcGluX3VzZXJfcGFnZXMoYWRkciwgbnIsXFxuIDE2NTpcXHRcXHRcXHRcXHRcXHRcXHQgICAgZ3VwLVxcdTAwM2VndXBfZmxhZ3MgfCBGT0xMX0xPTkdURVJNLFxcbiAxNjY6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHBhZ2VzICsgaSk7XFxuIDE2NzpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTY4OlxcdFxcdFxcdGNhc2UgRFVNUF9VU0VSX1BBR0VTX1RFU1Q6XFxuIDE2OTpcXHRcXHRcXHRcXHRpZiAoZ3VwLVxcdTAwM2V0ZXN0X2ZsYWdzIFxcdTAwMjYgR1VQX1RFU1RfRkxBR19EVU1QX1BBR0VTX1VTRV9QSU4pXFxuIDE3MDpcXHRcXHRcXHRcXHRcXHRuciA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIG5yLCBndXAtXFx1MDAzZWd1cF9mbGFncyxcXG4gMTcxOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlcyArIGkpO1xcbiAxNzI6XFx0XFx0XFx0XFx0ZWxzZVxcbiAxNzM6XFx0XFx0XFx0XFx0XFx0bnIgPSBnZXRfdXNlcl9wYWdlcyhhZGRyLCBuciwgZ3VwLVxcdTAwM2VndXBfZmxhZ3MsXFxuIDE3NDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZXMgKyBpKTtcXG4gMTc1OlxcdFxcdFxcdFxcdGJyZWFrO1xcbiAxNzY6XFx0XFx0XFx0ZGVmYXVsdDpcXG4gMTc3OlxcdFxcdFxcdFxcdHJldCA9IC1FSU5WQUw7XFxuIDE3ODpcXHRcXHRcXHRcXHRnb3RvIHVubG9jaztcXG4gMTc5OlxcdFxcdFxcdH1cXG4gMTgwOlxcdFxcbiAxODE6XFx0XFx0XFx0aWYgKG5yIFxcdTAwM2M9IDApXFxuIDE4MjpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTgzOlxcdFxcdFxcdGkgKz0gbnI7XFxuIDE4NDpcXHRcXHR9XFxuIDE4NTpcXHRcXHRlbmRfdGltZSA9IGt0aW1lX2dldCgpO1xcbiAxODY6XFx0XFxuIDE4NzpcXHRcXHQvKiBTaGlmdGluZyB0aGUgbWVhbmluZyBvZiBucl9wYWdlczogbm93IGl0IGlzIGFjdHVhbCBudW1iZXIgcGlubmVkOiAqL1xcbiAxODg6XFx0XFx0bnJfcGFnZXMgPSBpO1xcbiAxODk6XFx0XFxuIDE5MDpcXHRcXHRndXAtXFx1MDAzZWdldF9kZWx0YV91c2VjID0ga3RpbWVfdXNfZGVsdGEoZW5kX3RpbWUsIHN0YXJ0X3RpbWUpO1xcbiAxOTE6XFx0XFx0Z3VwLVxcdTAwM2VzaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7XFxuIDE5MjpcXHRcXG4gMTkzOlxcdFxcdC8qXFxuIDE5NDpcXHRcXHQgKiBUYWtlIGFuIHVuLWJlbmNobWFyay10aW1lZCBtb21lbnQgdG8gdmVyaWZ5IERNQSBwaW5uZWRcXG4gMTk1OlxcdFxcdCAqIHN0YXRlOiBwcmludCBhIHdhcm5pbmcgaWYgYW55IG5vbi1kbWEtcGlubmVkIHBhZ2VzIGFyZSBmb3VuZDpcXG4gMTk2OlxcdFxcdCAqL1xcbiAxOTc6XFx0XFx0dmVyaWZ5X2RtYV9waW5uZWQoY21kLCBwYWdlcywgbnJfcGFnZXMpO1xcbiAxOTg6XFx0XFxuIDE5OTpcXHRcXHRpZiAoY21kID09IERVTVBfVVNFUl9QQUdFU19URVNUKVxcbiAyMDA6XFx0XFx0XFx0ZHVtcF9wYWdlc190ZXN0KGd1cCwgcGFnZXMsIG5yX3BhZ2VzKTtcXG4gMjAxOlxcdFxcbiAyMDI6XFx0XFx0c3RhcnRfdGltZSA9IGt0aW1lX2dldCgpO1xcbiAyMDM6XFx0XFxuIDIwNDpcXHRcXHRwdXRfYmFja19wYWdlcyhjbWQsIHBhZ2VzLCBucl9wYWdlcywgZ3VwLVxcdTAwM2V0ZXN0X2ZsYWdzKTtcXG4gMjA1OlxcdFxcbiAyMDY6XFx0XFx0ZW5kX3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMjA3OlxcdFxcdGd1cC1cXHUwMDNlcHV0X2RlbHRhX3VzZWMgPSBrdGltZV91c19kZWx0YShlbmRfdGltZSwgc3RhcnRfdGltZSk7XFxuIDIwODpcXHRcXG4gMjA5OlxcdHVubG9jazpcXG4gMjEwOlxcdFxcdGlmIChuZWVkc19tbWFwX2xvY2spXFxuIDIxMTpcXHRcXHRcXHRtbWFwX3JlYWRfdW5sb2NrKGN1cnJlbnQtXFx1MDAzZW1tKTtcXG4gMjEyOlxcdGZyZWVfcGFnZXM6XFxuIDIxMzpcXHRcXHRrdmZyZWUocGFnZXMpO1xcbiAyMTQ6XFx0XFx0cmV0dXJuIHJldDtcXG4gMjE1OlxcdH1cXG4gMjE2OlxcdFxcbiAyMTc6XFx0c3RhdGljIGlubGluZSB2b2lkIHBpbl9sb25ndGVybV90ZXN0X3N0b3Aoc3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEpXFxuIDIxODpcXHR7XFxuIDIxOTpcXHRcXHRpZiAoZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6NTMuMTM5OTM4ODQyWiIsIlNlcSI6MzUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMxMDQ3OTM3NTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIGNvZGUuXG5cbioqSW52ZXN0aWdhdGluZyBgX19ndXBfdGVzdF9pb2N0bGAgYW5kIGBndXBfdGVzdF9pb2N0bGAgRnVuY3Rpb25hbGl0eSoqXG5cbkFscmlnaHQsIG15IGZpcnN0IHN0ZXAgaXMgdG8gZ2V0IGEgc29saWQgZ3Jhc3Agb24gd2hhdCB0aGVzZSB0d28gZnVuY3Rpb25zLCBgX19ndXBfdGVzdF9pb2N0bGAgYW5kIGBndXBfdGVzdF9pb2N0bGAsIGFyZSBhY3R1YWxseSBkb2luZy4gR2l2ZW4gdGhhdCBJJ20gZGVhbGluZyB3aXRoIHRoZSBpbnRyaWNhY2llcyBvZiBtZW1vcnkgbWFuYWdlbWVudCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlaXIgcHVycG9zZSwgY29udGV4dCwgYW5kIHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgd2l0aGluIHRoZSBicm9hZGVyIGtlcm5lbCBtZW1vcnkgc3Vic3lzdGVtLiBJJ2xsIGZvY3VzIG15IGluaXRpYWwgYW5hbHlzaXMgb24gbGluZXMgNTAtMTQwIGFuZCAyMTUtMjgwLiBUaGF0IHNob3VsZCBnaXZlIG1lIGEgZ29vZCBvdmVydmlldyBvZiB0aGVpciBwcmltYXJ5IG9wZXJhdGlvbnMgYW5kIGhvdyB0aGV5IGZpdCBpbnRvIHRoZSBiaWdnZXIgcGljdHVyZS4gVW5kZXJzdGFuZGluZyBob3cgdGhleSdyZSBpbXBsZW1lbnRlZCBhbmQgd2hlcmUgdGhleSdyZSB1c2VkIGlzIGNydWNpYWwgdG8gdW5kZXJzdGFuZGluZyBhbnkgcG90ZW50aWFsIG1lbW9yeS1yZWxhdGVkIGlzc3VlcyBvciBvcHRpbWl6YXRpb25zIHRoZXkgbWlnaHQgZW5hYmxlLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNDQ3LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDo1Ni4yNDQ3MzQ4NTZaIiwiU2VxIjozNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjkzNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vZ3VwX3Rlc3QuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1MCxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA1MDpcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xcbiAgNTE6XFx0XFxuICA1MjpcXHRcXHRzd2l0Y2ggKGNtZCkge1xcbiAgNTM6XFx0XFx0Y2FzZSBQSU5fRkFTVF9CRU5DSE1BUks6XFxuICA1NDpcXHRcXHRjYXNlIFBJTl9CQVNJQ19URVNUOlxcbiAgNTU6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAgNTY6XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcXG4gIDU3OlxcdFxcdFxcdFxcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlc1tpXSk7XFxuICA1ODpcXHRcXG4gIDU5OlxcdFxcdFxcdFxcdGlmIChXQVJOKCFmb2xpb19tYXliZV9kbWFfcGlubmVkKGZvbGlvKSxcXG4gIDYwOlxcdFxcdFxcdFxcdFxcdCBcXFwicGFnZXNbJWx1XSBpcyBOT1QgZG1hLXBpbm5lZFxcXFxuXFxcIiwgaSkpIHtcXG4gIDYxOlxcdFxcbiAgNjI6XFx0XFx0XFx0XFx0XFx0ZHVtcF9wYWdlKFxcdTAwMjZmb2xpby1cXHUwMDNlcGFnZSwgXFxcImd1cF90ZXN0IGZhaWx1cmVcXFwiKTtcXG4gIDYzOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAgNjQ6XFx0XFx0XFx0XFx0fSBlbHNlIGlmIChjbWQgPT0gUElOX0xPTkdURVJNX0JFTkNITUFSSyBcXHUwMDI2XFx1MDAyNlxcbiAgNjU6XFx0XFx0XFx0XFx0XFx0V0FSTighZm9saW9faXNfbG9uZ3Rlcm1fcGlubmFibGUoZm9saW8pLFxcbiAgNjY6XFx0XFx0XFx0XFx0XFx0ICAgICBcXFwicGFnZXNbJWx1XSBpcyBOT1QgcGlubmFibGUgYnV0IHBpbm5lZFxcXFxuXFxcIixcXG4gIDY3OlxcdFxcdFxcdFxcdFxcdCAgICAgaSkpIHtcXG4gIDY4OlxcdFxcdFxcdFxcdFxcdGR1bXBfcGFnZShcXHUwMDI2Zm9saW8tXFx1MDAzZXBhZ2UsIFxcXCJndXBfdGVzdCBmYWlsdXJlXFxcIik7XFxuICA2OTpcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gIDcwOlxcdFxcdFxcdFxcdH1cXG4gIDcxOlxcdFxcdFxcdH1cXG4gIDcyOlxcdFxcdFxcdGJyZWFrO1xcbiAgNzM6XFx0XFx0fVxcbiAgNzQ6XFx0fVxcbiAgNzU6XFx0XFxuICA3NjpcXHRzdGF0aWMgdm9pZCBkdW1wX3BhZ2VzX3Rlc3Qoc3RydWN0IGd1cF90ZXN0ICpndXAsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxuICA3NzpcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4gIDc4OlxcdHtcXG4gIDc5OlxcdFxcdHVuc2lnbmVkIGludCBpbmRleF90b19kdW1wO1xcbiAgODA6XFx0XFx0dW5zaWduZWQgaW50IGk7XFxuICA4MTpcXHRcXG4gIDgyOlxcdFxcdC8qXFxuICA4MzpcXHRcXHQgKiBaZXJvIG91dCBhbnkgdXNlci1zdXBwbGllZCBwYWdlIGluZGV4IHRoYXQgaXMgb3V0IG9mIHJhbmdlLiBSZW1lbWJlcjpcXG4gIDg0OlxcdFxcdCAqIC53aGljaF9wYWdlc1tdIGNvbnRhaW5zIGEgMS1iYXNlZCBzZXQgb2YgcGFnZSBpbmRpY2VzLlxcbiAgODU6XFx0XFx0ICovXFxuICA4NjpcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgR1VQX1RFU1RfTUFYX1BBR0VTX1RPX0RVTVA7IGkrKykge1xcbiAgODc6XFx0XFx0XFx0aWYgKGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0gXFx1MDAzZSBucl9wYWdlcykge1xcbiAgODg6XFx0XFx0XFx0XFx0cHJfd2FybihcXFwiWkVST0lORyBkdWUgdG8gb3V0IG9mIHJhbmdlOiAud2hpY2hfcGFnZXNbJXVdOiAldVxcXFxuXFxcIixcXG4gIDg5OlxcdFxcdFxcdFxcdFxcdGksIGd1cC1cXHUwMDNld2hpY2hfcGFnZXNbaV0pO1xcbiAgOTA6XFx0XFx0XFx0XFx0Z3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXSA9IDA7XFxuICA5MTpcXHRcXHRcXHR9XFxuICA5MjpcXHRcXHR9XFxuICA5MzpcXHRcXG4gIDk0OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUDsgaSsrKSB7XFxuICA5NTpcXHRcXHRcXHRpbmRleF90b19kdW1wID0gZ3VwLVxcdTAwM2V3aGljaF9wYWdlc1tpXTtcXG4gIDk2OlxcdFxcbiAgOTc6XFx0XFx0XFx0aWYgKGluZGV4X3RvX2R1bXApIHtcXG4gIDk4OlxcdFxcdFxcdFxcdGluZGV4X3RvX2R1bXAtLTsgLy8gRGVjb2RlIGZyb20gMS1iYXNlZCwgdG8gMC1iYXNlZFxcbiAgOTk6XFx0XFx0XFx0XFx0cHJfaW5mbyhcXFwiLS0tLSBwYWdlICMldSwgc3RhcnRpbmcgZnJvbSB1c2VyIHZpcnQgYWRkcjogMHglbGx4XFxcXG5cXFwiLFxcbiAxMDA6XFx0XFx0XFx0XFx0XFx0aW5kZXhfdG9fZHVtcCwgZ3VwLVxcdTAwM2VhZGRyKTtcXG4gMTAxOlxcdFxcdFxcdFxcdGR1bXBfcGFnZShwYWdlc1tpbmRleF90b19kdW1wXSxcXG4gMTAyOlxcdFxcdFxcdFxcdFxcdCAgXFxcImd1cF90ZXN0OiBkdW1wX3BhZ2VzKCkgdGVzdFxcXCIpO1xcbiAxMDM6XFx0XFx0XFx0fVxcbiAxMDQ6XFx0XFx0fVxcbiAxMDU6XFx0fVxcbiAxMDY6XFx0XFxuIDEwNzpcXHRzdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG4gMTA4OlxcdFxcdFxcdHN0cnVjdCBndXBfdGVzdCAqZ3VwKVxcbiAxMDk6XFx0e1xcbiAxMTA6XFx0XFx0a3RpbWVfdCBzdGFydF90aW1lLCBlbmRfdGltZTtcXG4gMTExOlxcdFxcdHVuc2lnbmVkIGxvbmcgaSwgbnJfcGFnZXMsIGFkZHIsIG5leHQ7XFxuIDExMjpcXHRcXHRsb25nIG5yO1xcbiAxMTM6XFx0XFx0c3RydWN0IHBhZ2UgKipwYWdlcztcXG4gMTE0OlxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kO1xcbiAxMTU6XFx0XFx0aW50IHJldCA9IDA7XFxuIDExNjpcXHRcXHRib29sIG5lZWRzX21tYXBfbG9jayA9XFxuIDExNzpcXHRcXHRcXHRjbWQgIT0gR1VQX0ZBU1RfQkVOQ0hNQVJLIFxcdTAwMjZcXHUwMDI2IGNtZCAhPSBQSU5fRkFTVF9CRU5DSE1BUks7XFxuIDExODpcXHRcXG4gMTE5OlxcdFxcdGlmIChndXAtXFx1MDAzZWFkZHIgXFx1MDAzZSBVTE9OR19NQVggfHwgZ3VwLVxcdTAwM2VzaXplIFxcdTAwM2UgVUxPTkdfTUFYKVxcbiAxMjA6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDEyMTpcXHRcXHRpZiAoY2hlY2tfYWRkX292ZXJmbG93KCh1bnNpZ25lZCBsb25nKWd1cC1cXHUwMDNlYWRkcixcXG4gMTIyOlxcdFxcdFxcdFxcdCAgICAgICAodW5zaWduZWQgbG9uZylndXAtXFx1MDAzZXNpemUsIFxcdTAwMjZlbmQpKVxcbiAxMjM6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDEyNDpcXHRcXG4gMTI1OlxcdFxcdG5yX3BhZ2VzID0gZ3VwLVxcdTAwM2VzaXplIC8gUEFHRV9TSVpFO1xcbiAxMjY6XFx0XFx0cGFnZXMgPSBrdmNhbGxvYyhucl9wYWdlcywgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpO1xcbiAxMjc6XFx0XFx0aWYgKCFwYWdlcylcXG4gMTI4OlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAxMjk6XFx0XFxuIDEzMDpcXHRcXHRpZiAobmVlZHNfbW1hcF9sb2NrIFxcdTAwMjZcXHUwMDI2IG1tYXBfcmVhZF9sb2NrX2tpbGxhYmxlKGN1cnJlbnQtXFx1MDAzZW1tKSkge1xcbiAxMzE6XFx0XFx0XFx0cmV0ID0gLUVJTlRSO1xcbiAxMzI6XFx0XFx0XFx0Z290byBmcmVlX3BhZ2VzO1xcbiAxMzM6XFx0XFx0fVxcbiAxMzQ6XFx0XFxuIDEzNTpcXHRcXHRpID0gMDtcXG4gMTM2OlxcdFxcdG5yID0gZ3VwLVxcdTAwM2Vucl9wYWdlc19wZXJfY2FsbDtcXG4gMTM3OlxcdFxcdHN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTtcXG4gMTM4OlxcdFxcdGZvciAoYWRkciA9IGd1cC1cXHUwMDNlYWRkcjsgYWRkciBcXHUwMDNjIGVuZDsgYWRkciA9IG5leHQpIHtcXG4gMTM5OlxcdFxcdFxcdGlmIChuciAhPSBndXAtXFx1MDAzZW5yX3BhZ2VzX3Blcl9jYWxsKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNDo1Ni4yNDQ4MDY2MDZaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzI3Mjg1NzMxMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhvc2UgdGhvdWdodHMgZnJvbSBhbiBleHBlcnQncyBwZXJzcGVjdGl2ZSwgdXNpbmcgYSBmaXJzdC1wZXJzb24gcGVyc3BlY3RpdmU6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgYF9fZ3VwX3Rlc3RfaW9jdGxgIENhbGwqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgZmlyc3QgdGhpbmcgSSdtIGRvaW5nIGlzIGRyaWxsaW5nIGRvd24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBjYWxsaW5nIGBfX2d1cF90ZXN0X2lvY3RsYC4gVGhpcyBpc24ndCBqdXN0IGEgY2FzdWFsIGN1cmlvc2l0eTsgSSBzdXNwZWN0IHRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgdGhlIHJvb3Qgb2YgYSBwb3RlbnRpYWwgaXNzdWUuIFRoZXJl4oCZcyBsaWtlbHkgYSBzdWJ0bGUgYnVnIGNyZWVwaW5nIGluIHNvbWV3aGVyZSwgb3IgbWF5YmUganVzdCBzb21lIHVuZXhwZWN0ZWQgYmVoYXZpb3IuIEtub3dpbmcgdGhlIGNhbGxlciBjb250ZXh0IGlzIGtleS4gSXQgcHJvdmlkZXMgdGhlIGNydWNpYWwgY2x1ZXMgYWJvdXQgdGhlIHN5c3RlbeKAmXMgc3RhdGUgd2hlbiB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZCwgYW5kIHRoZXJlZm9yZSBoZWxwcyBtZSBmaWd1cmUgb3V0IHRoZSB3aHkgYW5kIGhvdyB0aGlzIGZ1bmN0aW9uIGlzIHJ1bm5pbmcgd2hlbiBpdCBydW5zLiBJIG5lZWQgdG8gdHJhY2UgdGhpcyBiYWNrLiBJcyBpdCB0cmlnZ2VyZWQgYnkgYSBzcGVjaWZpYyBkZXZpY2U/IEEgcGFydGljdWxhciBzeXN0ZW0gY2FsbD8gU29tZSBvYnNjdXJlIGtlcm5lbCBtb2R1bGUgaW50ZXJhY3Rpb24/IFVuZGVyc3RhbmRpbmcgdGhlIGNhbGwgY2hhaW4gaXMgdGhlIHN0YXJ0aW5nIHBvaW50IHRvIGRpYWdub3NpbmcgYW55IHByb2JsZW0uIExldCdzIGdldCBjcmFja2luZy5cblxuXG4iLCJJbnB1dFRva2VucyI6NTA4OSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6NTkuNTE3NjY2NTA3WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc2NTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjcwLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjcwOlxcdFxcdGRhdGEtXFx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzID0gMDtcXG4gMjcxOlxcdFxcbiAyNzI6XFx0XFx0d2hpbGUgKG5yX3BhZ2VzIC0gZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMpIHtcXG4gMjczOlxcdFxcdFxcdHJlbWFpbmluZ19wYWdlcyA9IG5yX3BhZ2VzIC0gZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXM7XFxuIDI3NDpcXHRcXHRcXHRhZGRyID0gYXJncy5hZGRyICsgZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fbnJfcGFnZXMgKiBQQUdFX1NJWkU7XFxuIDI3NTpcXHRcXG4gMjc2OlxcdFxcdFxcdGlmIChmYXN0KVxcbiAyNzc6XFx0XFx0XFx0XFx0Y3VyX3BhZ2VzID0gcGluX3VzZXJfcGFnZXNfZmFzdChhZGRyLCByZW1haW5pbmdfcGFnZXMsXFxuIDI3ODpcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRndXBfZmxhZ3MsIHBhZ2VzKTtcXG4gMjc5OlxcdFxcdFxcdGVsc2VcXG4gMjgwOlxcdFxcdFxcdFxcdGN1cl9wYWdlcyA9IHBpbl91c2VyX3BhZ2VzKGFkZHIsIHJlbWFpbmluZ19wYWdlcyxcXG4gMjgxOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgIGd1cF9mbGFncywgcGFnZXMpO1xcbiAyODI6XFx0XFx0XFx0aWYgKGN1cl9wYWdlcyBcXHUwMDNjIDApIHtcXG4gMjgzOlxcdFxcdFxcdFxcdHBpbl9sb25ndGVybV90ZXN0X3N0b3AoZGF0YSk7XFxuIDI4NDpcXHRcXHRcXHRcXHRyZXQgPSBjdXJfcGFnZXM7XFxuIDI4NTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMjg2OlxcdFxcdFxcdH1cXG4gMjg3OlxcdFxcdFxcdGRhdGEtXFx1MDAzZWxvbmd0ZXJtX25yX3BhZ2VzICs9IGN1cl9wYWdlcztcXG4gMjg4OlxcdFxcdFxcdHBhZ2VzICs9IGN1cl9wYWdlcztcXG4gMjg5OlxcdFxcdH1cXG4gMjkwOlxcdFxcbiAyOTE6XFx0XFx0aWYgKCFmYXN0KVxcbiAyOTI6XFx0XFx0XFx0bW1hcF9yZWFkX3VubG9jayhjdXJyZW50LVxcdTAwM2VtbSk7XFxuIDI5MzpcXHRcXHRyZXR1cm4gcmV0O1xcbiAyOTQ6XFx0fVxcbiAyOTU6XFx0XFxuIDI5NjpcXHRzdGF0aWMgaW5saW5lIGludCBwaW5fbG9uZ3Rlcm1fdGVzdF9yZWFkKHN0cnVjdCBndXBfdGVzdF9kYXRhICpkYXRhLFxcbiAyOTc6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhcmcpXFxuIDI5ODpcXHR7XFxuIDI5OTpcXHRcXHRfX3U2NCB1c2VyX2FkZHI7XFxuIDMwMDpcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuIDMwMTpcXHRcXG4gMzAyOlxcdFxcdGlmICghZGF0YS1cXHUwMDNlbG9uZ3Rlcm1fcGFnZXMpXFxuIDMwMzpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4gMzA0OlxcdFxcbiAzMDU6XFx0XFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZ1c2VyX2FkZHIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHVzZXJfYWRkcikpKVxcbiAzMDY6XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIDMwNzpcXHRcXG4gMzA4OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBkYXRhLVxcdTAwM2Vsb25ndGVybV9ucl9wYWdlczsgaSsrKSB7XFxuIDMwOTpcXHRcXHRcXHR2b2lkICphZGRyID0ga21hcF9sb2NhbF9wYWdlKGRhdGEtXFx1MDAzZWxvbmd0ZXJtX3BhZ2VzW2ldKTtcXG4gMzEwOlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgcmV0O1xcbiAzMTE6XFx0XFxuIDMxMjpcXHRcXHRcXHRyZXQgPSBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpdXNlcl9hZGRyLCBhZGRyLFxcbiAzMTM6XFx0XFx0XFx0XFx0XFx0ICAgUEFHRV9TSVpFKTtcXG4gMzE0OlxcdFxcdFxcdGt1bm1hcF9sb2NhbChhZGRyKTtcXG4gMzE1OlxcdFxcdFxcdGlmIChyZXQpXFxuIDMxNjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4gMzE3OlxcdFxcdFxcdHVzZXJfYWRkciArPSBQQUdFX1NJWkU7XFxuIDMxODpcXHRcXHR9XFxuIDMxOTpcXHRcXHRyZXR1cm4gMDtcXG4gMzIwOlxcdH1cXG4gMzIxOlxcdFxcbiAzMjI6XFx0c3RhdGljIGxvbmcgcGluX2xvbmd0ZXJtX3Rlc3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLFxcbiAzMjM6XFx0XFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzMjQ6XFx0e1xcbiAzMjU6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGEgPSBmaWxlcC1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbiAzMjY6XFx0XFx0aW50IHJldCA9IC1FSU5WQUw7XFxuIDMyNzpcXHRcXG4gMzI4OlxcdFxcdGlmIChtdXRleF9sb2NrX2tpbGxhYmxlKFxcdTAwMjZkYXRhLVxcdTAwM2Vsb25ndGVybV9tdXRleCkpXFxuIDMyOTpcXHRcXHRcXHRyZXR1cm4gLUVJTlRSO1xcbiAzMzA6XFx0XFxuIDMzMTpcXHRcXHRzd2l0Y2ggKGNtZCkge1xcbiAzMzI6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVDpcXG4gMzMzOlxcdFxcdFxcdHJldCA9IHBpbl9sb25ndGVybV90ZXN0X3N0YXJ0KGRhdGEsIGFyZyk7XFxuIDMzNDpcXHRcXHRcXHRicmVhaztcXG4gMzM1OlxcdFxcdGNhc2UgUElOX0xPTkdURVJNX1RFU1RfU1RPUDpcXG4gMzM2OlxcdFxcdFxcdHBpbl9sb25ndGVybV90ZXN0X3N0b3AoZGF0YSk7XFxuIDMzNzpcXHRcXHRcXHRyZXQgPSAwO1xcbiAzMzg6XFx0XFx0XFx0YnJlYWs7XFxuIDMzOTpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1JFQUQ6XFxuIDM0MDpcXHRcXHRcXHRyZXQgPSBwaW5fbG9uZ3Rlcm1fdGVzdF9yZWFkKGRhdGEsIGFyZyk7XFxuIDM0MTpcXHRcXHRcXHRicmVhaztcXG4gMzQyOlxcdFxcdH1cXG4gMzQzOlxcdFxcbiAzNDQ6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZkYXRhLVxcdTAwM2Vsb25ndGVybV9tdXRleCk7XFxuIDM0NTpcXHRcXHRyZXR1cm4gcmV0O1xcbiAzNDY6XFx0fVxcbiAzNDc6XFx0XFxuIDM0ODpcXHRzdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXFxuIDM0OTpcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFyZylcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDQ6NTkuNTE3NzQ0NjI3WiIsIlNlcSI6MzksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUzMDc0NDE4NjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhbmFseXNpcyBvZiB0aGUgcHJvdmlkZWQgc25pcHBldCwgcHJlc2VudGVkIGFzIGEgcGVyc29uYWwgdGhvdWdodCBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIGBndXBfdGVzdF9pb2N0bGAqKlxuXG5Pa2F5LCBsZXQncyB6ZXJvIGluIG9uIGBndXBfdGVzdF9pb2N0bGAsIHNwZWNpZmljYWxseSBsaW5lcyAzNDggdGhyb3VnaCAzODAuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcgd2l0aGluIHRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZSwgYXMgaXQgbGlrZWx5IGhvbGRzIGNydWNpYWwgbG9naWMgZm9yIFtVc2VyJ3MgRmllbGQsIGUuZy4sIG1lbW9yeSBtYW5hZ2VtZW50LCBkZXZpY2UgaW50ZXJhY3Rpb24sIGEgcGFydGljdWxhciBmZWF0dXJlLCBldGMuIC0gYmFzZWQgb24gdGhlIHVzZXIncyBmaWVsZCBvZiBleHBlcnRpc2VdLiBNeSBpbW1lZGlhdGUgZ29hbCBpcyB0byBncmFzcCB0aGUgY29udHJvbCBmbG93IGFuZCBpZGVudGlmeSBhbnkgcG90ZW50aWFsIGFyZWFzIG9mIGNvbmNlcm4sIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzLCBvciBkZXZpYXRpb25zIGZyb20gYmVzdCBwcmFjdGljZXMuIEknbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2U6XG5cbiogICAqKkVycm9yIEhhbmRsaW5nOioqIEFyZSBlcnJvcnMgYmVpbmcgY2hlY2tlZCBhbmQgaGFuZGxlZCBhcHByb3ByaWF0ZWx5PyBJcyB0aGVyZSBhIHJpc2sgb2YgcmVzb3VyY2UgbGVha3Mgb3IgaW5jb3JyZWN0IGJlaGF2aW9yIGluIGNhc2Ugb2YgZmFpbHVyZXM/XG4qICAgKipEYXRhIFN0cnVjdHVyZXM6KiogV2hhdCBkYXRhIHN0cnVjdHVyZXMgYXJlIGludm9sdmVkPyBIb3cgYXJlIHRoZXkgYmVpbmcgdXNlZCBhbmQgbW9kaWZpZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIGNvbmN1cnJlbmN5IGlzc3VlcyBvciByYWNlIGNvbmRpdGlvbnM/XG4qICAgKipNZW1vcnkgTWFuYWdlbWVudDoqKiBIb3cgaXMgbWVtb3J5IGJlaW5nIGFsbG9jYXRlZCBhbmQgZnJlZWQ/IEFyZSB0aGVyZSBhbnkgbWVtb3J5IGxlYWtzIG9yIGJ1ZmZlciBvdmVyZmxvd3MgdGhhdCBJIHNob3VsZCBiZSBvbiB0aGUgbG9va291dCBmb3I/XG4qICAgKipQZXJmb3JtYW5jZToqKiBDb3VsZCB0aGlzIHNlY3Rpb24gYmUgYSBib3R0bGVuZWNrPyBBcmUgdGhlcmUgYW55IG9idmlvdXMgYXJlYXMgZm9yIG9wdGltaXphdGlvbiwgc3VjaCBhcyB1c2luZyBwcmVmZXRjaGluZywgaW5saW5pbmcsIG9yIHJlZHVjaW5nIHVubmVjZXNzYXJ5IHN5c3RlbSBjYWxscz9cbiogICAqKlNlY3VyaXR5OioqIEFyZSB0aGVyZSBhbnkgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzLCBzdWNoIGFzIGZvcm1hdCBzdHJpbmcgYnVncyBvciBpbmplY3Rpb24gZmxhd3M/XG5cbkkgd2lsbCBzdGFydCBieSBtZW50YWxseSB0cmFjaW5nIHRoZSBleGVjdXRpb24gcGF0aCwga2VlcGluZyBteSBmaWVsZCBvZiBleHBlcnRpc2UgaW4gbWluZCBhbmQgdGhlIHJvbGUgdGhpcyBmdW5jdGlvbiBwbGF5cyBpbiB0aGUgYmlnZ2VyIHBpY3R1cmUuIEknbGwgbmVlZCB0byBrbm93IHdoaWNoIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZCBpbiBhbmQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gZG8sIGFzIHdlbGwgYXMgdGhlIGV4cGVjdGVkIG91dHB1dHMuIEkgd2lsbCBnbyBsaW5lIGJ5IGxpbmUgdW50aWwgSSBoYXZlIGEgZ29vZCBncmFzcCBvZiB0aGUgd2hvbGUgcGljdHVyZSBhbmQgY2FuIGFuc3dlciBhbnkgcXVlc3Rpb25zIHRoYXQgSSBtYXkgaGF2ZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NjQ4MywiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDU6MDQuODI1MTg5NjQ5WiIsIlNlcSI6NDAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY5ODcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMzQ4LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMzQ4OlxcdHN0YXRpYyBsb25nIGd1cF90ZXN0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgaW50IGNtZCxcXG4gMzQ5OlxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJnKVxcbiAzNTA6XFx0e1xcbiAzNTE6XFx0XFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcXG4gMzUyOlxcdFxcdGludCByZXQ7XFxuIDM1MzpcXHRcXG4gMzU0OlxcdFxcdHN3aXRjaCAoY21kKSB7XFxuIDM1NTpcXHRcXHRjYXNlIEdVUF9GQVNUX0JFTkNITUFSSzpcXG4gMzU2OlxcdFxcdGNhc2UgUElOX0ZBU1RfQkVOQ0hNQVJLOlxcbiAzNTc6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fQkVOQ0hNQVJLOlxcbiAzNTg6XFx0XFx0Y2FzZSBHVVBfQkFTSUNfVEVTVDpcXG4gMzU5OlxcdFxcdGNhc2UgUElOX0JBU0lDX1RFU1Q6XFxuIDM2MDpcXHRcXHRjYXNlIERVTVBfVVNFUl9QQUdFU19URVNUOlxcbiAzNjE6XFx0XFx0XFx0YnJlYWs7XFxuIDM2MjpcXHRcXHRjYXNlIFBJTl9MT05HVEVSTV9URVNUX1NUQVJUOlxcbiAzNjM6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9TVE9QOlxcbiAzNjQ6XFx0XFx0Y2FzZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEOlxcbiAzNjU6XFx0XFx0XFx0cmV0dXJuIHBpbl9sb25ndGVybV90ZXN0X2lvY3RsKGZpbGVwLCBjbWQsIGFyZyk7XFxuIDM2NjpcXHRcXHRkZWZhdWx0OlxcbiAzNjc6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDM2ODpcXHRcXHR9XFxuIDM2OTpcXHRcXG4gMzcwOlxcdFxcdGlmIChjb3B5X2Zyb21fdXNlcihcXHUwMDI2Z3VwLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihndXApKSlcXG4gMzcxOlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzI6XFx0XFxuIDM3MzpcXHRcXHRyZXQgPSBfX2d1cF90ZXN0X2lvY3RsKGNtZCwgXFx1MDAyNmd1cCk7XFxuIDM3NDpcXHRcXHRpZiAocmV0KVxcbiAzNzU6XFx0XFx0XFx0cmV0dXJuIHJldDtcXG4gMzc2OlxcdFxcbiAzNzc6XFx0XFx0aWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIFxcdTAwMjZndXAsIHNpemVvZihndXApKSlcXG4gMzc4OlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbiAzNzk6XFx0XFxuIDM4MDpcXHRcXHRyZXR1cm4gMDtcXG4gMzgxOlxcdH1cXG4gMzgyOlxcdFxcbiAzODM6XFx0c3RhdGljIGludCBndXBfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKVxcbiAzODQ6XFx0e1xcbiAzODU6XFx0XFx0c3RydWN0IGd1cF90ZXN0X2RhdGEgKmRhdGE7XFxuIDM4NjpcXHRcXHRpbnQgcmV0O1xcbiAzODc6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjA1OjA0LjgyNTI2MjQzOVoiLCJTZXEiOjQxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2MzM3Nzk3ODk3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgZ3VwX3Rlc3RfaW9jdGwgQ2hhbmdlcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIGRvd24gdGhpcyBtb2RpZmljYXRpb24gdG8gYF9fZ3VwX3Rlc3RfaW9jdGxgLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIFwid2h5XCIgYmVoaW5kIHRoZSBjaGFuZ2UgdG8gYGd1cC1cdTAwM2VzaXplYC4gSSBuZWVkIHRvIHJlY29uc3RydWN0IHRoZSBsb2dpYyBpbiBteSBoZWFkLCBzdGFydGluZyB3aXRoIGhvdyBgZ3VwLVx1MDAzZXNpemVgIHdhcyBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgdmVyc3VzIHRoZSBuZXcgaW1wbGVtZW50YXRpb24uXG5cbkkgc2VlIHRoYXQgYGd1cC1cdTAwM2VzaXplYCB1c2VkIHRvIGJlIGBhZGRyIC0gZ3VwLVx1MDAzZWFkZHJgLiBJIG5lZWQgdG8gY29uZmlybSB0aGUgY29uZGl0aW9ucyB3aGVyZSB0aGlzIGFwcHJvYWNoIGZlbGwgc2hvcnQgYW5kIGhvdyB0aGUgbmV3IG1ldGhvZCwgYG5yX3BhZ2VzICogUEFHRV9TSVpFYCwgaW1wcm92ZXMgdGhlIHJlc3VsdC5cblxuTG9va2luZyBjbG9zZWx5IGF0IHRoZSBsb29wLCB0aGUgdmFyaWFibGUgYGFkZHJgIGlzIGluY3JlbWVudGVkLCBhbmQgYG5leHRgIGlzIHNldCB0byBgYWRkciArIG5yICogUEFHRV9TSVpFYCBhdCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgaXRlcmF0aW9uLiBUaGUgY3J1Y2lhbCBwb2ludCBpcyB0aGF0IGBucmAgaXMgdGhlICpyZXF1ZXN0ZWQqIG51bWJlciBvZiBwYWdlcyAqYmVmb3JlKiB0aGUgYHN3aXRjaGAgc3RhdGVtZW50IHRoYXQgY2FsbHMgYGdldF91c2VyX3BhZ2VzYC4gSSBhbSBub3RpY2luZyB0aGF0IGBucmAgbWlnaHQgbm90IGJlIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHBhZ2VzIHBpbm5lZCAodGhlIG51bWJlciByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24pLiBJbiB0aGUgY29kZSwgaWYgYG5yYCBpcyBsZXNzIHRoYW4gcmVxdWVzdGVkLCB0aGUgbG9vcCB3aWxsIGJyZWFrLiBJIG5lZWQgdG8gdGhpbmsgdGhpcyB0aHJvdWdoLiBgbmV4dGAgaXMgc3RpbGwgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBjb3VudCwgYnV0IGBpYCB3aWxsIG9ubHkgdHJhY2sgdGhlIGFjdHVhbCBudW1iZXIgcGlubmVkLiBUaGF0J3MgaXQhIElmIGBnZXRfdXNlcl9wYWdlc2AgcmV0dXJucyBmZXdlciBwYWdlcyB0aGFuIHJlcXVlc3RlZCAocGFydGlhbCBzdWNjZXNzIG9yIGZhaWx1cmUpLCB0aGUgY29tcHV0YXRpb24gb2YgYGFkZHJgIGlzIG5vdyBpbmFjY3VyYXRlLiBUaGUgZWFybGllciBgYWRkciAtIGd1cC1cdTAwM2VhZGRyYCBjYWxjdWxhdGlvbiBvZiBgZ3VwLVx1MDAzZXNpemVgIGRvZXNuJ3QgcmVmbGVjdCB0aGUgYnl0ZXMgb3IgcGFnZXMgdGhhdCB3ZXJlICphY3R1YWxseSogcGlubmVkLiBUaGUgYnJlYWsgaXMgdGhlIGtleS5cblxuVGhpcyBsZWFkcyBtZSB0byB1bmRlcnN0YW5kIHRoZSBjaGFuZ2UuIFRoZSBuZXcgY2FsY3VsYXRpb24sIGBucl9wYWdlcyAqIFBBR0VfU0laRWAsIHVzZXMgYG5yX3BhZ2VzYCwgd2hpY2ggaXMgdGhlIHZhcmlhYmxlIGBpYCB0aGF0IEkgZGV0ZXJtaW5lZCBlYXJsaWVyLCBpcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIGFjdHVhbGx5IHBpbm5lZC4gVGhpcyBpcyBhIG1vcmUgcHJlY2lzZSBhbmQgY29ycmVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBzaXplIHdpdGhpbiBgc3RydWN0IGd1cF90ZXN0YC4gVGhpcyBjaGFuZ2UgaXMgc3RyYWlnaHRmb3J3YXJkLCBhcyBgZ3VwLVx1MDAzZXNpemVgIGlzIGp1c3QgYW4gaW50ZWdlciBpbiB0aGUgc3RydWN0LlxuXG5Ob3csIGxldCdzIHF1aWNrbHkgcmV2aWV3IHRoZSBgc3RydWN0IGd1cF90ZXN0YCBkZWZpbml0aW9uIHRvIGVuc3VyZSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoaXMgZmllbGQncyBwdXJwb3NlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3Vycm91bmRpbmcgZGF0YS5cblxuXG4iLCJJbnB1dFRva2VucyI6NzQ5MiwiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU1MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjA1OjExLjE2MzA2Mjc2NVoiLCJTZXEiOjQyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjIyNjk1MzkwNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3QgZ3VwX3Rlc3RcXFxcYlwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9ndXBfdGVzdC5jPTQ2PXN0YXRpYyB2b2lkIHZlcmlmeV9kbWFfcGlubmVkKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBwYWdlICoqcGFnZXMsXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTc1LVxcbm1tL2d1cF90ZXN0LmM6NzY6c3RhdGljIHZvaWQgZHVtcF9wYWdlc190ZXN0KHN0cnVjdCBndXBfdGVzdCAqZ3VwLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbm1tL2d1cF90ZXN0LmMtNzctXFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpXFxuLS1cXG5tbS9ndXBfdGVzdC5jPTEwNz1zdGF0aWMgaW50IF9fZ3VwX3Rlc3RfaW9jdGwodW5zaWduZWQgaW50IGNtZCxcXG5tbS9ndXBfdGVzdC5jOjEwODpcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgKmd1cClcXG5tbS9ndXBfdGVzdC5jLTEwOS17XFxuLS1cXG5tbS9ndXBfdGVzdC5jPTM0OD1zdGF0aWMgbG9uZyBndXBfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGludCBjbWQsXFxuLS1cXG5tbS9ndXBfdGVzdC5jLTM1MC17XFxubW0vZ3VwX3Rlc3QuYzozNTE6XFx0c3RydWN0IGd1cF90ZXN0IGd1cDtcXG5tbS9ndXBfdGVzdC5jLTM1Mi1cXHRpbnQgcmV0O1xcbi0tXFxubW0vZ3VwX3Rlc3QuaC02LVxcbm1tL2d1cF90ZXN0Lmg6NzojZGVmaW5lIEdVUF9GQVNUX0JFTkNITUFSS1xcdF9JT1dSKCdnJywgMSwgc3RydWN0IGd1cF90ZXN0KVxcbm1tL2d1cF90ZXN0Lmg6ODojZGVmaW5lIFBJTl9GQVNUX0JFTkNITUFSS1xcdF9JT1dSKCdnJywgMiwgc3RydWN0IGd1cF90ZXN0KVxcbm1tL2d1cF90ZXN0Lmg6OTojZGVmaW5lIFBJTl9MT05HVEVSTV9CRU5DSE1BUktcXHRfSU9XUignZycsIDMsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oOjEwOiNkZWZpbmUgR1VQX0JBU0lDX1RFU1RcXHRcXHRfSU9XUignZycsIDQsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oOjExOiNkZWZpbmUgUElOX0JBU0lDX1RFU1RcXHRcXHRfSU9XUignZycsIDUsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oOjEyOiNkZWZpbmUgRFVNUF9VU0VSX1BBR0VTX1RFU1RcXHRfSU9XUignZycsIDYsIHN0cnVjdCBndXBfdGVzdClcXG5tbS9ndXBfdGVzdC5oLTEzLSNkZWZpbmUgUElOX0xPTkdURVJNX1RFU1RfU1RBUlRcXHRfSU9XKCdnJywgNywgc3RydWN0IHBpbl9sb25ndGVybV90ZXN0KVxcbi0tXFxubW0vZ3VwX3Rlc3QuaC0yMC1cXG5tbS9ndXBfdGVzdC5oOjIxOnN0cnVjdCBndXBfdGVzdCB7XFxubW0vZ3VwX3Rlc3QuaC0yMi1cXHRfX3U2NCBnZXRfZGVsdGFfdXNlYztcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmM9NTE9dm9pZCAqZ3VwX3RocmVhZCh2b2lkICpkYXRhKVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmMtNTIte1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2d1cF90ZXN0LmM6NTM6XFx0c3RydWN0IGd1cF90ZXN0IGd1cCA9ICooc3RydWN0IGd1cF90ZXN0ICopZGF0YTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jLTU0LVxcdGludCBpLCBzdGF0dXM7XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jPTkyPWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jLTkzLXtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jOjk0OlxcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7IDAgfTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ndXBfdGVzdC5jLTk1LVxcdGludCBmaWxlZCwgaSwgb3B0LCBucl9wYWdlcyA9IDEsIHRocCA9IC0xLCB3cml0ZSA9IDEsIG50aHJlYWRzID0gMSwgcmV0O1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmM9MTc2Mj1zdGF0aWMgaW50IGd1cF90ZXN0X2V4ZWMoaW50IGd1cF9mZCwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgY21kLFxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMtMTc2NC17XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmM6MTc2NTpcXHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jLTE3NjYtXFx0XFx0Lm5yX3BhZ2VzX3Blcl9jYWxsXFx0PSBucGFnZXMsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjA1OjEzLjM5MDAyMTY4M1oiLCJTZXEiOjQzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0OTkzOTY5NDM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBtbS9ndXBfdGVzdC5oYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IHRvIGl0LiBMZXQncyBzdGFydCB3aXRoIGBtbS9ndXBfdGVzdC5oYC4gVGhpcyBpcyBsaWtlbHkgd2hlcmUgdGhlIGNvcmUgdGVzdCBpbmZyYXN0cnVjdHVyZSBmb3IgdGhlIEdldCBVc2VyIFBhZ2VzIChHVVApIGZ1bmN0aW9uYWxpdHkgcmVzaWRlcy4gS25vd2luZyB0aGUgaW50cmljYWNpZXMgb2YgdGhpcyBmaWxlIGlzIGNydWNpYWwgZm9yIGEgZGVlcCB1bmRlcnN0YW5kaW5nIG9mIGhvdyBtZW1vcnkgbWFwcGluZyBhbmQgcGFnZSBmYXVsdCBoYW5kbGluZyBhcmUgYmVpbmcgdGVzdGVkIHdpdGhpbiB0aGUga2VybmVsLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW50YWwgbWFwIG9mIHRoaXMgcGFydGljdWxhciBzZXQgb2YgdGVzdHMg4oCTIGFyZSB0aGV5IGZvY3VzaW5nIG9uIHNwZWNpZmljIEdVUCBvcHRpbWl6YXRpb24gcGF0aHMsIGJvdW5kYXJ5IGNvbmRpdGlvbnMsIGNvbmN1cnJlbnQgYWNjZXNzIHNjZW5hcmlvcywgb3IgcGVyaGFwcyBkaWZmZXJlbnQgbWVtb3J5IHpvbmVzPyBcblxuSSdsbCBiZSBsb29raW5nIGZvciB0aGluZ3MgbGlrZSB0aGUgZGVmaW5pdGlvbnMgb2YgdGVzdCBzdHJ1Y3R1cmVzLCBoZWxwZXIgbWFjcm9zIGZvciBzZXR0aW5nIHVwIG1lbW9yeSByZWdpb25zIGFuZCBpbmplY3RpbmcgZmF1bHRzLCBhc3NlcnRpb25zIHRvIHZhbGlkYXRlIHRoZSBleHBlY3RlZCBiZWhhdmlvciwgYW5kIGFueSBpbnRyaWNhdGUgdGhyZWFkaW5nIG1vZGVscyB0aGV5J3JlIGVtcGxveWluZy4gU3BlY2lmaWNhbGx5LCBJJ2xsIGJlIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gYW55IHVzZXMgb2YgYGd1cF9mYXN0YCwgYGd1cF9vbmVfcGFnZWAsIG9yIHNpbWlsYXIgZnVuY3Rpb25zIHRvIHNlZSBob3cgZWZmaWNpZW50bHkgdGhleSdyZSB0ZXN0aW5nIHRoZSBjb21tb24gR1VQIGNvZGUgcGF0aHMuIEFueSBjdXN0b20gcGFnZSBmYXVsdCBoYW5kbGVycyB1c2VkIGhlcmU/IEFueSBpbnRlcmVzdGluZyBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcz8gQXJlIHRoZXkgdXNpbmcga2VybmVsIHRlc3Qgc3VpdGVzIG9yIGEgbW9yZSBhZC1ob2MgYXBwcm9hY2g/IEl0J3MgYWxsIGFib3V0IGVuc3VyaW5nIHRoZSB0ZXN0IGNvdmVyYWdlIGlzIHJvYnVzdCBhbmQgZWZmZWN0aXZlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NTUwLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDU6MTguMzgzOTkyOTk5WiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxNDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2d1cF90ZXN0LmhcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vci1sYXRlciAqL1xcbiAgIDI6XFx0I2lmbmRlZiBfX0dVUF9URVNUX0hcXG4gICAzOlxcdCNkZWZpbmUgX19HVVBfVEVTVF9IXFxuICAgNDpcXHRcXG4gICA1OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC90eXBlcy5oXFx1MDAzZVxcbiAgIDY6XFx0XFxuICAgNzpcXHQjZGVmaW5lIEdVUF9GQVNUX0JFTkNITUFSS1xcdF9JT1dSKCdnJywgMSwgc3RydWN0IGd1cF90ZXN0KVxcbiAgIDg6XFx0I2RlZmluZSBQSU5fRkFTVF9CRU5DSE1BUktcXHRfSU9XUignZycsIDIsIHN0cnVjdCBndXBfdGVzdClcXG4gICA5OlxcdCNkZWZpbmUgUElOX0xPTkdURVJNX0JFTkNITUFSS1xcdF9JT1dSKCdnJywgMywgc3RydWN0IGd1cF90ZXN0KVxcbiAgMTA6XFx0I2RlZmluZSBHVVBfQkFTSUNfVEVTVFxcdFxcdF9JT1dSKCdnJywgNCwgc3RydWN0IGd1cF90ZXN0KVxcbiAgMTE6XFx0I2RlZmluZSBQSU5fQkFTSUNfVEVTVFxcdFxcdF9JT1dSKCdnJywgNSwgc3RydWN0IGd1cF90ZXN0KVxcbiAgMTI6XFx0I2RlZmluZSBEVU1QX1VTRVJfUEFHRVNfVEVTVFxcdF9JT1dSKCdnJywgNiwgc3RydWN0IGd1cF90ZXN0KVxcbiAgMTM6XFx0I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9TVEFSVFxcdF9JT1coJ2cnLCA3LCBzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3QpXFxuICAxNDpcXHQjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX1NUT1BcXHRfSU8oJ2cnLCA4KVxcbiAgMTU6XFx0I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9SRUFEXFx0X0lPVygnZycsIDksIF9fdTY0KVxcbiAgMTY6XFx0XFxuICAxNzpcXHQjZGVmaW5lIEdVUF9URVNUX01BWF9QQUdFU19UT19EVU1QXFx0XFx0OFxcbiAgMTg6XFx0XFxuICAxOTpcXHQjZGVmaW5lIEdVUF9URVNUX0ZMQUdfRFVNUF9QQUdFU19VU0VfUElOXFx0MHgxXFxuICAyMDpcXHRcXG4gIDIxOlxcdHN0cnVjdCBndXBfdGVzdCB7XFxuICAyMjpcXHRcXHRfX3U2NCBnZXRfZGVsdGFfdXNlYztcXG4gIDIzOlxcdFxcdF9fdTY0IHB1dF9kZWx0YV91c2VjO1xcbiAgMjQ6XFx0XFx0X191NjQgYWRkcjtcXG4gIDI1OlxcdFxcdF9fdTY0IHNpemU7XFxuICAyNjpcXHRcXHRfX3UzMiBucl9wYWdlc19wZXJfY2FsbDtcXG4gIDI3OlxcdFxcdF9fdTMyIGd1cF9mbGFncztcXG4gIDI4OlxcdFxcdF9fdTMyIHRlc3RfZmxhZ3M7XFxuICAyOTpcXHRcXHQvKlxcbiAgMzA6XFx0XFx0ICogRWFjaCBub24temVybyBlbnRyeSBpcyB0aGUgbnVtYmVyIG9mIHRoZSBwYWdlICgxLWJhc2VkOiBmaXJzdCBwYWdlIGlzXFxuICAzMTpcXHRcXHQgKiBwYWdlIDEsIHNvIHRoYXQgemVybyBlbnRyaWVzIG1lYW4gXFxcImRvIG5vdGhpbmdcXFwiKSBmcm9tIHRoZSAuYWRkciBiYXNlLlxcbiAgMzI6XFx0XFx0ICovXFxuICAzMzpcXHRcXHRfX3UzMiB3aGljaF9wYWdlc1tHVVBfVEVTVF9NQVhfUEFHRVNfVE9fRFVNUF07XFxuICAzNDpcXHR9O1xcbiAgMzU6XFx0XFxuICAzNjpcXHQjZGVmaW5lIFBJTl9MT05HVEVSTV9URVNUX0ZMQUdfVVNFX1dSSVRFXFx0MVxcbiAgMzc6XFx0I2RlZmluZSBQSU5fTE9OR1RFUk1fVEVTVF9GTEFHX1VTRV9GQVNUXFx0XFx0MlxcbiAgMzg6XFx0XFxuICAzOTpcXHRzdHJ1Y3QgcGluX2xvbmd0ZXJtX3Rlc3Qge1xcbiAgNDA6XFx0XFx0X191NjQgYWRkcjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MDU6MTguMzg0MDU1ODI5WiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjczNTQ3MzI2NzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaDogbW0vZ3VwX3Rlc3QuYyoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBpbiBgbW0vZ3VwX3Rlc3QuY2AgaXMgY2hhbmdpbmcgaG93IGBndXAtXHUwMDNlc2l6ZWAgaXMgY2FsY3VsYXRlZC4gUHJldmlvdXNseSwgaXQgd2FzIGBhZGRyIC0gZ3VwLVx1MDAzZWFkZHJgLCBub3cgaXQncyBgbnJfcGFnZXMgKiBQQUdFX1NJWkVgLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gaW1tZWRpYXRlbHkgY2hlY2sgZm9yIGFueSBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgZXhwb3N1cmVzLCBhcyB0aGF0J3MgYSBjbGFzc2ljIEtNU0FOIHJlZCBmbGFnLlxuXG5GaXJzdCwgaXMgdGhlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgKmV4cG9zZWQqPyBObywgdGhlIGBndXBgIHN0cnVjdCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGluIGBndXBfdGVzdF9pb2N0bGAsIGFuZCBgY29weV9mcm9tX3VzZXJgIGluaXRpYWxpemVzIHRoZSAqZW50aXJlKiBzdHJ1Y3QgZnJvbSB1c2VyIHNwYWNlLiBFdmVyeSBzaW5nbGUgYnl0ZSBnZXRzIHBvcHVsYXRlZC4gVGhlbiwgYF9fZ3VwX3Rlc3RfaW9jdGxgIG1vZGlmaWVzIGNlcnRhaW4gZmllbGRzIOKAkyBgZ3VwLVx1MDAzZXNpemVgLCB0aW1pbmcgZGF0YSwgYW5kIHBvc3NpYmx5IGFycmF5IGVsZW1lbnRzIHdpdGhpbiBgZ3VwYCBidXQgKmFmdGVyKiB0aGUgYGd1cGAgc3RydWN0IGlzIGluaXRpYWxpemVkLiBGaW5hbGx5LCBgY29weV90b191c2VyYCB3cml0ZXMgdGhlIGVudGlyZSBzdHJ1Y3QgYmFjay4gVGhlIGNoYW5nZSBoZXJlIGlzICpzb2xlbHkqIGhvdyBhbiBpbnRlZ2VyLCBgZ3VwLVx1MDAzZXNpemVgLCBpcyBjYWxjdWxhdGVkLCBiZWZvcmUgYmVpbmcgcmV0dXJuZWQgdG8gdXNlciBzcGFjZS4gSXQgZG9lc24ndCBsZWF2ZSB1bmluaXRpYWxpemVkIGRhdGEgaW4gdGhlIGtlcm5lbC5cblxuU2Vjb25kLCBkb2VzIHRoaXMgbWVzcyB3aXRoIGJ1ZmZlciBzaXplcyBvciBib3VuZHMgY2hlY2tzIGFuZCBwb3RlbnRpYWxseSAqcmVhZCogdW5pbml0aWFsaXplZCBtZW1vcnk/IE5vLiBUaGUgYWxsb2NhdGlvbiBvZiBgbnJfcGFnZXNgIGFuZCBgcGFnZXNgIGhhcHBlbnMgKmJlZm9yZSogdGhlIGxvb3AuIFRoZSBgcGFnZXNgIGFsbG9jYXRpb24gaXMgaW5kZXBlbmRlbnQgYW5kIGBndXAtXHUwMDNlc2l6ZWAgKHBvc3QgY2hhbmdlKSBpc24ndCB1c2VkIGluIGFueSBtZW1vcnkgYWNjZXNzICphZnRlcndhcmRzKi4gVGhlIGNoYW5nZSBpcyBqdXN0IGFib3V0IHRoZSBpbnRlZ2VyIGNhbGN1bGF0aW9uIHRoYXQgcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUgb3BlcmF0aW9uOyBpdCdzIGp1c3QgYmVpbmcgdXBkYXRlZCBhbmQgc2VudCBiYWNrIHRvIHVzZXJzcGFjZS5cblxuU28sIGluIHN1bW1hcnksIGJhc2VkIG9uIG15IHVuZGVyc3RhbmRpbmcsIHRoZXJlIGFyZSAqbm8qIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLCBubyBpbmZvIGxlYWtzIG9mIHVuaW5pdGlhbGl6ZWQga2VybmVsIG1lbW9yeSwgYW5kIG5vIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGRhdGEgYXMgYSBjb25zZXF1ZW5jZSBvZiB0aGlzIHBhdGNoLiBUaGUgc3RydWN0IGlzIGZ1bGx5IGluaXRpYWxpemVkIGZyb20gdXNlciBzcGFjZSwgYW5kIHRoZSBjaGFuZ2Ugc2ltcGx5IGFsdGVycyBob3cgYSBzaW5nbGUgaW50ZWdlciBpcyBjb21wdXRlZCBiZWZvcmUgYmVpbmcgY29waWVkICpiYWNrKiB0byB1c2VyIHNwYWNlLCBpbmRpY2F0aW5nIHRoYXQgdGhpcyBkb2Vzbid0IHdhcnJhbnQgS01TQU4uIFN0YW5kYXJkIGZ1enppbmcgYW5kIG90aGVyIGRldGVjdG9ycyBzaG91bGQgYmUgc3VmZmljaWVudCB0byBpZGVudGlmeSBhbnkgaXNzdWVzLlxuXG5UaGVyZWZvcmUsIGBOZWVkc0tNU0FOYCBpcyBkZWZpbml0ZWx5IGBmYWxzZWAuIFRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDYwOCwiT3V0cHV0VG9rZW5zIjoxODIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MzIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjowNToyNS43Mzg3OTAyNloiLCJTZXEiOjQ2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NDUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggY2hhbmdlcyB0aGUgY2FsY3VsYXRpb24gb2YgYGd1cC1cXHUwMDNlc2l6ZWAgZnJvbSBgYWRkciAtIGd1cC1cXHUwMDNlYWRkcmAgdG8gYG5yX3BhZ2VzICogUEFHRV9TSVpFYCBpbiBgX19ndXBfdGVzdF9pb2N0bCgpYCAoYG1tL2d1cF90ZXN0LmNgKS4gVGhlIGBzdHJ1Y3QgZ3VwX3Rlc3RgIGJ1ZmZlciBpcyBmdWxseSBpbml0aWFsaXplZCB2aWEgYGNvcHlfZnJvbV91c2VyYCBhdCB0aGUgZW50cnkgb2YgYGd1cF90ZXN0X2lvY3RsYCBiZWZvcmUgYmVpbmcgbW9kaWZpZWQgYW5kIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2Ugd2l0aCBgY29weV90b191c2VyYC4gVGhlIGNoYW5nZSBzb2xlbHkgdXBkYXRlcyBhbiBhcml0aG1ldGljIGNhbGN1bGF0aW9uIGZvciBhbiBvdXRwdXQgZmllbGQgcmVwb3J0aW5nIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IHBpbm5lZCBieXRlcy4gSXQgZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBhbGxvY2F0aW9ucywgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSwgb3Iga2VybmVsIGluZm8tbGVha3MuIFRoZXJlZm9yZSwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHJlcXVpcmVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGNoYW5nZXMgdGhlIGNhbGN1bGF0aW9uIG9mIGBndXAtXFx1MDAzZXNpemVgIGZyb20gYGFkZHIgLSBndXAtXFx1MDAzZWFkZHJgIHRvIGBucl9wYWdlcyAqIFBBR0VfU0laRWAgaW4gYF9fZ3VwX3Rlc3RfaW9jdGwoKWAgKGBtbS9ndXBfdGVzdC5jYCkuIFRoZSBgc3RydWN0IGd1cF90ZXN0YCBidWZmZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgdmlhIGBjb3B5X2Zyb21fdXNlcmAgYXQgdGhlIGVudHJ5IG9mIGBndXBfdGVzdF9pb2N0bGAgYmVmb3JlIGJlaW5nIG1vZGlmaWVkIGFuZCBjb3BpZWQgYmFjayB0byB1c2VyIHNwYWNlIHdpdGggYGNvcHlfdG9fdXNlcmAuIFRoZSBjaGFuZ2Ugc29sZWx5IHVwZGF0ZXMgYW4gYXJpdGhtZXRpYyBjYWxjdWxhdGlvbiBmb3IgYW4gb3V0cHV0IGZpZWxkIHJlcG9ydGluZyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBwaW5uZWQgYnl0ZXMuIEl0IGRvZXMgbm90IGludHJvZHVjZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMsIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnksIG9yIGtlcm5lbCBpbmZvLWxlYWtzLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCByZXF1aXJlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflow8sx2l[1] Phase: Succeeded StartedAt: 2026-08-31 12:05:36 +0000 UTC FinishedAt: 2026-08-31 12:05:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-31 12:05:36 +0000 UTC FinishedAt: 2026-08-31 12:05:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2] Phase: Succeeded StartedAt: 2026-08-31 12:05:36 +0000 UTC FinishedAt: 2026-08-31 15:44:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-31 12:05:36 +0000 UTC FinishedAt: 2026-08-31 15:44:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-31 12:05:36 +0000 UTC FinishedAt: 2026-08-31 12:05:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-31 12:05:36 +0000 UTC FinishedAt: 2026-08-31 12:05:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflow8sx2l/series-workflow8sx2l-convert-artifact-1523842589/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-31 12:05:46 +0000 UTC FinishedAt: 2026-08-31 12:21:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-31 12:05:46 +0000 UTC FinishedAt: 2026-08-31 12:21:35 +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:*7f2d8043-81ca-4984-a298-ff6cb3ea36a4,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-workflow8sx2l/series-workflow8sx2l-convert-artifact-1523842589/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": "39cd0d38-af05-4853-a12d-a2e33bdca4ad", "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-workflow8sx2l/series-workflow8sx2l-build-action-1535668051/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-31 12:05:46 +0000 UTC FinishedAt: 2026-08-31 12:21:25 +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:*7f2d8043-81ca-4984-a298-ff6cb3ea36a4,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-workflow8sx2l/series-workflow8sx2l-convert-artifact-1523842589/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": "39cd0d38-af05-4853-a12d-a2e33bdca4ad", "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-workflow8sx2l/series-workflow8sx2l-build-action-1535668051/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-31 12:21:35 +0000 UTC FinishedAt: 2026-08-31 12:21:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-31 12:21:35 +0000 UTC FinishedAt: 2026-08-31 12:21:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-31 12:21:35 +0000 UTC FinishedAt: 2026-08-31 12:21:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-31 12:21:35 +0000 UTC FinishedAt: 2026-08-31 12:21:40 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflow8sx2l/series-workflow8sx2l-convert-artifact-1953959416/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-31 12:21:45 +0000 UTC FinishedAt: 2026-08-31 12:23:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-31 12:21:45 +0000 UTC FinishedAt: 2026-08-31 12:23:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*39cd0d38-af05-4853-a12d-a2e33bdca4ad,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-workflow8sx2l/series-workflow8sx2l-build-action-1535668051/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-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-31 12:23:37 +0000 UTC FinishedAt: 2026-08-31 12:23:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-31 12:23:37 +0000 UTC FinishedAt: 2026-08-31 12:23:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-31 12:23:37 +0000 UTC FinishedAt: 2026-08-31 12:39:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-31 12:23:37 +0000 UTC FinishedAt: 2026-08-31 12:39:16 +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:*7f2d8043-81ca-4984-a298-ff6cb3ea36a4,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-workflow8sx2l/series-workflow8sx2l-convert-artifact-1953959416/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": "fc99cb04-10c8-41b7-aaf8-c1520185a79e", "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-workflow8sx2l/series-workflow8sx2l-build-action-4263555812/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-31 12:23:37 +0000 UTC FinishedAt: 2026-08-31 12:39:13 +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:*7f2d8043-81ca-4984-a298-ff6cb3ea36a4,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-workflow8sx2l/series-workflow8sx2l-convert-artifact-1953959416/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": "fc99cb04-10c8-41b7-aaf8-c1520185a79e", "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-workflow8sx2l/series-workflow8sx2l-build-action-4263555812/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-31 12:39:16 +0000 UTC FinishedAt: 2026-08-31 12:39:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-31 12:39:16 +0000 UTC FinishedAt: 2026-08-31 12:39:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-31 12:39:16 +0000 UTC FinishedAt: 2026-08-31 12:41:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-31 12:39:16 +0000 UTC FinishedAt: 2026-08-31 12:41:03 +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:*fc99cb04-10c8-41b7-aaf8-c1520185a79e,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-workflow8sx2l/series-workflow8sx2l-build-action-4263555812/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-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-31 12:41:12 +0000 UTC FinishedAt: 2026-08-31 15:44:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-31 12:41:12 +0000 UTC FinishedAt: 2026-08-31 15:44:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*39cd0d38-af05-4853-a12d-a2e33bdca4ad,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*fc99cb04-10c8-41b7-aaf8-c1520185a79e,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-workflow8sx2l/series-workflow8sx2l-build-action-1535668051/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-workflow8sx2l/series-workflow8sx2l-build-action-4263555812/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-31 12:41:12 +0000 UTC FinishedAt: 2026-08-31 12:41:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-31 12:41:12 +0000 UTC FinishedAt: 2026-08-31 12:41:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow8sx2l/series-workflow8sx2l-convert-artifact-2609786449/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-31 12:41:12 +0000 UTC FinishedAt: 2026-08-31 12:41:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-31 12:41:12 +0000 UTC FinishedAt: 2026-08-31 12:41:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-31 12:41:12 +0000 UTC FinishedAt: 2026-08-31 12:41:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-31 12:41:33 +0000 UTC FinishedAt: 2026-08-31 15:44:46 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8sx2l[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["gup_test_ioctl","__gup_test_ioctl"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"da6c37ed8beb273e3308e42d4bca3ce11b4432fa","config_name":"upstream-apparmor-kasan.config","enable_configs":["GUP_TEST","DEBUG_FS"],"series_id":"b3a42e49-3d66-4fbe-9936-92cb2729840d","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-31 12:41:33 +0000 UTC FinishedAt: 2026-08-31 15:44:36 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*39cd0d38-af05-4853-a12d-a2e33bdca4ad,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*fc99cb04-10c8-41b7-aaf8-c1520185a79e,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-workflow8sx2l/series-workflow8sx2l-build-action-1535668051/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-workflow8sx2l/series-workflow8sx2l-build-action-4263555812/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-workflow8sx2l/series-workflow8sx2l-convert-artifact-2609786449/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,}