Name: series-workflow77nkc Phase: Failed StartedAt: 2026-09-08 14:28:37 +0000 UTC FinishedAt: 2026-09-08 15:16:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow77nkc[0] Phase: Succeeded StartedAt: 2026-09-08 14:28:37 +0000 UTC FinishedAt: 2026-09-08 15:16:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflow77nkc[0].run-triage Phase: Succeeded StartedAt: 2026-09-08 14:28:37 +0000 UTC FinishedAt: 2026-09-08 15:16:02 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDE1OjE1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdXNlci1zcGFjZSBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBObyBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIG1vZHVsZSBjb2RlIGlzIGFsdGVyZWQsIG1ha2luZyB0aGUgY2hhbmdlcyBub24ta2VybmVsL25vbi1leGVjdXRhYmxlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxNToxNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDY4MjcwYTFhYjgyYjY3OTczZGU2N2ZmYjRkMzU0MDY1YWQ1YTg2OTFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIFNlcCA4IDE1OjE1OjM5IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbkBAIC0xMDQsNiAmIzQzOzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBndWFyZC1yZWdpb25zXG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1lcmdlXG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IHJtYXBcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0XG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19vcmRlcl9jaGVja1xuJiM0MztURVNUX0dFTl9GSUxFUyAmIzQzOz0ga2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3JhY2VcbiBcbiBpZm5lcSAoJChBUkNIKSxhcm02NClcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gc29mdC1kaXJ0eVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZmE3MzZjOWY3MDFhNFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xuQEAgLTAsMCAmIzQzOzEsMTIyIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGhlbHBlcnMsIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZFxuJiM0MzsgKiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIoKSwgd2hpY2ggdGhlIGtodWdlcGFnZWQgbVRIUCBjYXNlcyB1c2UgdG8gZGV0ZWN0XG4mIzQzOyAqIGNvbGxhcHNlIHJlc3VsdHMuICBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHRcbiYjNDM7ICogbWVtb3J5IGluIHdpdGggb25seSB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHJlcXVpcmUgdGhlIGhlbHBlcnMgdG8gcmVwb3J0XG4mIzQzOyAqIGV4YWN0bHkgdGhhdCBvcmRlci5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzZWxmdGVzdC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtX3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oXCYjMzQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4mIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcbiYjNDM7XG4mIzQzO3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xuJiM0MztcdGNoYXIgKnAsICphbGlnbmVkO1xuJiM0MztcbiYjNDM7XHRwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4mIzQzO1x0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRhbGlnbmVkID0gKGNoYXIgKilBTElHTigodWludHB0cl90KXAsIHNpemUpO1xuJiM0MztcdGlmIChhbGlnbmVkICE9IHApXG4mIzQzO1x0XHRtdW5tYXAocCwgYWxpZ25lZCAtIHApO1xuJiM0MztcdGlmIChhbGlnbmVkICYjNDM7IHNpemUgIT0gcCAmIzQzOyBsZW4pXG4mIzQzO1x0XHRtdW5tYXAoYWxpZ25lZCAmIzQzOyBzaXplLCBwICYjNDM7IGxlbiAtIGFsaWduZWQgLSBzaXplKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGFsaWduZWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX29yZGVyKGludCBvcmRlcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXHUwMDNjXHUwMDNjIG9yZGVyO1xuJiM0MztcdGJvb2wgb2sgPSB0cnVlO1xuJiM0MztcdGNoYXIgKnA7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRpZiAob3JkZXIpXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0cCA9IGFsbG9jX2FsaWduZWQoc2l6ZSk7XG4mIzQzO1x0KnAgPSAxO1xuJiM0MztcbiYjNDM7XHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBzaXplLCBvcmRlciwgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O29yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcblwmIzM0Oywgb3JkZXIpO1xuJiM0MztcdFx0b2sgPSBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEEgbG93ZXIgb3JkZXIgbXVzdCBiZSByZWplY3RlZDogdGhlIGZvbGlvIGlzIGxhcmdlciAqL1xuJiM0MztcdGlmIChvcmRlciBcdTAwMjZcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKHAsIHNpemUsIG9yZGVyIC0gMSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XG4mIzQzO1x0XHRvayA9IGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogQSBsYXJnZSBmb2xpbyBtdXN0IG5vdCBwYXNzIGFzIG9yZGVyIDAgKi9cbiYjNDM7XHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBzaXplLCAwLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O29yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxcblwmIzM0Oywgb3JkZXIpO1xuJiM0MztcdFx0b2sgPSBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG11bm1hcChwLCBzaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHQob2ssIFwmIzM0O29yZGVyICVkIGNsYXNzaWZpZWRcXG5cJiMzNDssIG9yZGVyKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG1haW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBvcmRlcnM7XG4mIzQzO1x0aW50IG9yZGVyO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0cGFnZW1hcF9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCYjMzQ7KTtcbiYjNDM7XHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcdGlmICghb3JkZXJzKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Tm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSAmIzQzOyAxKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRjaGVja19vcmRlcigwKTtcbiYjNDM7XHRmb3IgKG9yZGVyID0gMTsgb3JkZXIgXHUwMDNjIE5SX09SREVSUzsgb3JkZXImIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoIShvcmRlcnMgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIG9yZGVyKSkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0Y2hlY2tfb3JkZXIob3JkZXIpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xuaW5kZXggZTI2NDJlY2EwZDAyYi4uZGY0MjZmOTIxOGU3MSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xuQEAgLTY1LDcgJiM0Mzs2NSw2IEBAIGVudW0ge1xuICNkZWZpbmUgSE1NX1BBVEhfTUFYICAgIDY0XG4gI2RlZmluZSBOVElNRVNcdFx0MTBcbiBcbi0jZGVmaW5lIEFMSUdOKHgsIGEpICgoKHgpICYjNDM7IChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi9cbiBcbiAjaWZuZGVmIEZPTExfV1JJVEVcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuaW5kZXggZDc5MTdkY2UzYWJhYy4uY2E3M2Y5YWM4ZTliNiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbkBAIC0xODMsNiAmIzQzOzE4MywxMyBAQCB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0fVxuIH1cbiBcbiYjNDM7LyogQSBzdG9yZSB0byBlaXRoZXIgc2xlZXAga25vYiB3YWtlcyBraHVnZXBhZ2VkLCBzbyB3cml0ZSBvbmx5IG9uIGNoYW5nZSAqL1xuJiM0MztzdGF0aWMgdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcbiYjNDM7e1xuJiM0MztcdGlmICh0aHBfcmVhZF9udW0obmFtZSkgIT0gbnVtKVxuJiM0MztcdFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xuJiM0Mzt9XG4mIzQzO1xuIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIHtcbiBcdHN0cnVjdCBraHVnZXBhZ2VkX3NldHRpbmdzICpraHVnZXBhZ2VkID0gXHUwMDI2c2V0dGluZ3MtXHUwMDNla2h1Z2VwYWdlZDtcbkBAIC0xOTgsMTUgJiM0MzsyMDUsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHRcdFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVx1MDAzZXNobWVtX2VuYWJsZWRdKTtcbiBcdHRocF93cml0ZV9udW0oXCYjMzQ7dXNlX3plcm9fcGFnZVwmIzM0Oywgc2V0dGluZ3MtXHUwMDNldXNlX3plcm9fcGFnZSk7XG4gXG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvZGVmcmFnXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0Oyxcbi1cdFx0XHRraHVnZXBhZ2VkLVx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX25vbmUpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvcGFnZXNfdG9fc2NhblwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VwYWdlc190b19zY2FuKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL2RlZnJhZ1wmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VkZWZyYWcpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4gXG4gXHRpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSlcbiBcdFx0d3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLVx1MDAzZXJlYWRfYWhlYWRfa2IpO1xuQEAgLTIzMCw2ICYjNDM7MjM3LDQxIEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0fVxuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogV2FpdCBmb3IgYSBmdWxsIGtodWdlcGFnZWQgc2NhbiBwYXNzIHRoYXQgc3RhcnRlZCBhZnRlciB0aGlzIGNhbGw6IHRoZVxuJiM0MzsgKiBwYXNzIGluIHByb2dyZXNzIG1heSBhbHJlYWR5IGhhdmUgcGFzc2VkIHRoaXMgbW0sIHNvIGZ1bGxfc2NhbnMgaGFzIHRvXG4mIzQzOyAqIGFkdmFuY2UgdHdpY2UuXG4mIzQzOyAqXG4mIzQzOyAqIEEgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYnV0IG9uZSBtYWRlIHdoaWxlIGl0XG4mIzQzOyAqIGlzIHNjYW5uaW5nIHJhdGhlciB0aGFuIHNsZWVwaW5nIGlzIGxvc3QsIHNvIGtlZXAgc3RvcmluZyB1bnRpbCB0aGUgcGFzc1xuJiM0MzsgKiBsYW5kcy5cbiYjNDM7ICpcbiYjNDM7ICogT25lIHdha2UgaXMgb25lIHBhc3Mgb25seSBpZiBwYWdlc190b19zY2FuIGNvdmVycyBldmVyeSBtbSBvbiB0aGUgbGlzdC5cbiYjNDM7ICovXG4mIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbGFwc2VkX21zID0gMCwgcG9sbF9tcyA9IDEwO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc2xlZXBfbXM7XG4mIzQzO1x0aW50IHBhc3M7XG4mIzQzO1xuJiM0MztcdHNsZWVwX21zID0gdGhwX3JlYWRfbnVtKFwmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcJiMzNDspO1xuJiM0MztcdGZvciAocGFzcyA9IDA7IHBhc3MgXHUwMDNjIDI7IHBhc3MmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHRhcmdldCA9XG4mIzQzO1x0XHRcdHRocF9yZWFkX251bShcJiMzNDtraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcJiMzNDspICYjNDM7IDE7XG4mIzQzO1xuJiM0MztcdFx0d2hpbGUgKHRocF9yZWFkX251bShcJiMzNDtraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcJiMzNDspIFx1MDAzYyB0YXJnZXQpIHtcbiYjNDM7XHRcdFx0aWYgKGVsYXBzZWRfbXMgXHUwMDNlPSBkZWFkbGluZV9tcylcbiYjNDM7XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHRcdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICBzbGVlcF9tcyk7XG4mIzQzO1x0XHRcdHVzbGVlcChwb2xsX21zICogMTAwMCk7XG4mIzQzO1x0XHRcdGVsYXBzZWRfbXMgJiM0Mzs9IHBvbGxfbXM7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpXG4ge1xuIFx0aWYgKCFzZXR0aW5nc19pbmRleCkge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5pbmRleCA3MjZjNzNjNDNjMDViLi4yZWExNjlkMTE3OTYyIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuQEAgLTgzLDEwICYjNDM7ODMsMjEgQEAgc3RhdGljIGlubGluZSB2b2lkIHRocF9zYXZlX3NldHRpbmdzKHZvaWQpXG4gXHRodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7XG4gfVxuIFxuJiM0Mztib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpO1xuJiM0MztcbiB2b2lkIHRocF9zZXRfcmVhZF9haGVhZF9wYXRoKGNoYXIgKnBhdGgpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG4gdW5zaWduZWQgbG9uZyB0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcbiBcbiYjNDM7LypcbiYjNDM7ICogVGhlIHBlci1vcmRlciBzaG1lbV9lbmFibGVkIGF0dHJpYnV0ZSBpcyBjcmVhdGVkIGZvciB0aGUgb3JkZXJzIHRoZSBwYWdlXG4mIzQzOyAqIGNhY2hlIGNhbiBob2xkLCBub3QganVzdCBmb3Igc2htZW0sIHNvIGl0IGFuc3dlcnMgZm9yIHJlZ3VsYXIgZmlsZXMgdG9vLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRocF9maWxlX3N1cHBvcnRlZF9vcmRlcnModm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiB0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycygpO1xuJiM0Mzt9XG4mIzQzO1xuIGJvb2wgdGhwX2F2YWlsYWJsZSh2b2lkKTtcbiBib29sIHRocF9pc19lbmFibGVkKHZvaWQpO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuaW5kZXggZjgyNjczZjVmNmI0Ny4uMzM1Zjk0NmVjYTYxZSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5AQCAtMzEsNiAmIzQzOzMxLDExIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjtcbiBzdGF0aWMgaW50IGFub25fb3JkZXI7XG4gc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcjtcbiYjNDM7c3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfc2V0O1xuJiM0MztzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyc1tOUl9PUkRFUlNdO1xuJiM0MztzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVycztcbiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZCA9IC0xO1xuIFxuICNkZWZpbmUgUElEX1NNQVBTIFwmIzM0Oy9wcm9jL3NlbGYvc21hcHNcJiMzNDtcbiAjZGVmaW5lIFRFU1RfRklMRSBcJiMzNDtjb2xsYXBzZV90ZXN0X2ZpbGVcJiMzNDtcbkBAIC0yMjAsNiAmIzQzOzIyNSwyOSBAQCBzdGF0aWMgYm9vbCBjaGVja19zd2FwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiBcdHJldHVybiBzd2FwO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Lyoga2VlcCBraHVnZXBhZ2VkIGZyb20gY29sbGFwc2luZyB0aGUgcmFuZ2UgYW5kIHN3YXBwaW5nIGl0IGJhY2sgaW4gKi9cbiYjNDM7XHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX05PSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9OT0hVR0VQQUdFKVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogUmV0cnkgc2V2ZXJhbCB0aW1lcyBiZWNhdXNlIE1BRFZfUEFHRU9VVCBpcyBiZXN0IGVmZm9ydC4gIFNsZWVwXG4mIzQzO1x0ICogYmV0d2VlbiB0aGUgcmV0cmllcyB0byBnaXZlIG91dHN0YW5kaW5nIHdyaXRlYmFjayBhIGNoYW5jZSB0b1xuJiM0MztcdCAqIGZpbmlzaC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0MDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVClcJiMzNDspO1xuJiM0MztcdFx0aWYgKGNoZWNrX3N3YXAocCwgc2l6ZSkpXG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdFx0dXNsZWVwKDUwICogMTAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCAqYWxsb2NfbWFwcGluZyhpbnQgbnIpXG4ge1xuIFx0dm9pZCAqcDtcbkBAIC01MTAsOCAmIzQzOzUzOCw4IEBAIHN0YXRpYyBib29sIGlzX2Fub24oc3RydWN0IG1lbV9vcHMgKm9wcylcbiBzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxuIFx0XHRcdCAgICAgICBzdHJ1Y3QgbWVtX29wcyAqb3BzLCBib29sIGV4cGVjdClcbiB7XG4tXHRpbnQgcmV0O1xuIFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdGludCByZXQsIGk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDslcy4uLlwmIzM0OywgbXNnKTtcbiBcbkBAIC01MjQsOSAmIzQzOzU1MiwxNiBAQCBzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxuIFx0LypcbiBcdCAqIFByZXZlbnQga2h1Z2VwYWdlZCBpbnRlcmZlcmVuY2UgYW5kIHRlc3RzIHRoYXQgTUFEVl9DT0xMQVBTRVxuIFx0ICogaWdub3JlcyAvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9lbmFibGVkXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBcJiMzNDtpbmhlcml0XCYjMzQ7IHJhdGhlciB0aGFuIFwmIzM0O25ldmVyXCYjMzQ7IHNvIHRoYXQgTUFEVl9DT0xMQVBTRSBvbiBzaG1lbSBzdGlsbFxuJiM0MztcdCAqIGZpbmRzIGFuIG9yZGVyIHRvIGJ1aWxkLlxuIFx0ICovXG4gXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiBcdHNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuJiM0MztcdFx0c2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUO1xuJiM0MztcdH1cbiBcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiBcbiBcdC8qIENsZWFyIFZNX05PSFVHRVBBR0UgKi9cbkBAIC01NTYsOCAmIzQzOzU5MSwxMSBAQCBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IG5yX2hwYWdlcywgaW50IGNvbGxhcF9vcmRlciwgc3RydWN0IG1lbV9vcHMgKm9wcylcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGhwYWdlX3NpemUgPSBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcF9vcmRlcjtcbi1cdGludCBmdWxsX3NjYW5zO1xuLVx0aW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi9cbiYjNDM7XHR1bnNpZ25lZCBsb25nIGJ5dGVzID0gKHVuc2lnbmVkIGxvbmcpbnJfaHBhZ2VzICogaHBhZ2Vfc2l6ZTtcbiYjNDM7XHRpbnQgdGltZW91dCwgZnVsbF9zY2FucztcbiYjNDM7XG4mIzQzO1x0LyogSGFsZi1zZWNvbmQgdGlja3M6IHRocmVlIHNlY29uZHMgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gKi9cbiYjNDM7XHR0aW1lb3V0ID0gNiAmIzQzOyAyICogKGJ5dGVzIC8gKDEyOFVMIFx1MDAzY1x1MDAzYyAyMCkpO1xuIFxuIFx0LyogU2FuaXR5IGNoZWNrICovXG4gXHRpZiAoIW9wcy1cdTAwM2VjaGVja19odWdlKHAsIGxlbiwgMCwgaHBhZ2Vfc2l6ZSkpXG5AQCAtODIwLDEyICYjNDM7ODU4LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXG4gXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFxuIFx0a3NmdF9wcmludF9tc2coXCYjMzQ7U3dhcG91dCBvbmUgcGFnZS4uLlwmIzM0Oyk7XG4tXHRpZiAobWFkdmlzZShwLCBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVClcJiMzNDspO1xuLVx0aWYgKGNoZWNrX3N3YXAocCwgcGFnZV9zaXplKSkge1xuJiM0MztcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIHBhZ2Vfc2l6ZSkpIHtcbiBcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4gXHR9IGVsc2Uge1xuLVx0XHRmYWlsKFwmIzM0O0ZhaWxcJiMzNDspO1xuJiM0MztcdFx0c2tpcChcJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXRcJiMzNDspO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbkBAIC04NDYsMTIgJiM0Mzs4ODIsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cbiBcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCYjMzQ7LCBtYXhfcHRlc19zd2FwICYjNDM7IDEsIGhwYWdlX3BtZF9ucik7XG4tXHRpZiAobWFkdmlzZShwLCAobWF4X3B0ZXNfc3dhcCAmIzQzOyAxKSAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9QQUdFT1VUKVwmIzM0Oyk7XG4tXHRpZiAoY2hlY2tfc3dhcChwLCAobWF4X3B0ZXNfc3dhcCAmIzQzOyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcbiYjNDM7XHRpZiAoc3dhcG91dF9yYW5nZShwLCAobWF4X3B0ZXNfc3dhcCAmIzQzOyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcbiBcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4gXHR9IGVsc2Uge1xuLVx0XHRmYWlsKFwmIzM0O0ZhaWxcJiMzNDspO1xuJiM0MztcdFx0c2tpcChcJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXRcJiMzNDspO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbkBAIC04NjMsMTIgJiM0Mzs4OTcsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cbiBcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7U3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlwmIzM0OywgbWF4X3B0ZXNfc3dhcCxcbiBcdFx0ICAgICAgIGhwYWdlX3BtZF9ucik7XG4tXHRcdGlmIChtYWR2aXNlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9QQUdFT1VUKVwmIzM0Oyk7XG4tXHRcdGlmIChjaGVja19zd2FwKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUpKSB7XG4mIzQzO1x0XHRpZiAoc3dhcG91dF9yYW5nZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xuIFx0XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1x0XHRcdHNraXAoXCYjMzQ7Q291bGQgbm90IHN3YXAgb3V0XCYjMzQ7KTtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFxuQEAgLTkzNSw2ICYjNDM7OTY3LDE2IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbXBvdW5kX2V4dHJlbWUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHR2b2lkICpwO1xuIFx0aW50IGk7XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGlzIG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMgaW4gYSByb3csIHdoaWNoIHRoZVxuJiM0MztcdCAqIGFsbG9jYXRvciB3aWxsIG5vdCBzdXBwbHkgaWYgdGhlIFBNRCBpcyB2ZXJ5IGxhcmdlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChocGFnZV9wbWRfc2l6ZSBcdTAwM2UgKDMyVUwgXHUwMDNjXHUwMDNjIDIwKSkge1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwmIzM0OyVzOiBQTUQgdG9vIGxhcmdlIGZvciBmYXVsdC10aW1lIFRIUCBjb25zdHJ1Y3Rpb25cXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgICAgX19mdW5jX18pO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xcblwmIzM0Oyk7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBocGFnZV9wbWRfbnI7IGkmIzQzOyYjNDM7KSB7XG5AQCAtMTEyNSw2ICYjNDM7MTE2NywxMDMgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBUaGUgcGFyZW50IHdyaXRlcyB0byB0aGUgZm9yay1zaGFyZWQgcmFuZ2UgdGhyb3VnaG91dCB0aGUgY2hpbGQmIzM5O3NcbiYjNDM7ICogY29sbGFwc2UuICBDb1cgbXVzdCBrZWVwIHRoZSB0d28gYXBhcnQ6IHRoZSBjaGlsZCBzZWVzIHRoZSBwcmUtZm9ya1xuJiM0MzsgKiBjb250ZW50LCB0aGUgcGFyZW50IG9ubHkgaXRzIG93biB3cml0ZXMuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9mb3JrX2Nvd19yYWNlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xuJiM0MztcdGludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG47XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzaGFyZWQ7XG4mIzQzO1x0dm9sYXRpbGUgaW50ICppcDtcbiYjNDM7XHRwaWRfdCBjaGlsZDtcbiYjNDM7XHRpbnQgc3luY1syXTtcbiYjNDM7XHRjaGFyIGdvID0gMTtcbiYjNDM7XHR2b2lkICpwO1xuJiM0MztcbiYjNDM7XHQvKiBBdCBhIHBhZ2UgcGVyIDEwIG1zLCA2NCBwYWdlcyBzcHJlYWQgdGhlIHdyaXRlcyBhY3Jvc3MgdGhlIGNvbGxhcHNlICovXG4mIzQzO1x0biA9IDY0O1xuJiM0MztcdHNoYXJlZCA9IG4gKiBwYWdlX3NpemU7XG4mIzQzO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHQvKiBTaGFyZWQgcHJlZml4LCB3aXRoIHRoZSBwcmUtZm9yayBwYXR0ZXJuICovXG4mIzQzO1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIHNoYXJlZCk7XG4mIzQzO1x0aWYgKHBpcGUoc3luYykpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7cGlwZSgpXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LyogQSB2b2xhdGlsZSBwb2ludGVyIHNvIHRoZSBzdG9yZXMgYXJlIG5vdCBtZXJnZWQgb3IgZHJvcHBlZCAqL1xuJiM0MztcdGlwID0gcDtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Rm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cJiMzNDspO1xuJiM0MztcdGNoaWxkID0gZm9yaygpO1xuJiM0MztcdGlmICghY2hpbGQpIHtcbiYjNDM7XHRcdGludCBjb2xsYXBzZV9zdGF0dXM7XG4mIzQzO1xuJiM0MztcdFx0Y2xvc2Uoc3luY1swXSk7XG4mIzQzO1x0XHQvKiBQcml2YXRlIHJlbWFpbmRlciAqL1xuJiM0MztcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0LyogU3RhcnQgdGhlIHBhcmVudCB1bnNoYXJpbmcsIGFuZCBnaXZlIGl0IGEgaGVhZCBzdGFydCAqL1xuJiM0MztcdFx0aWYgKHdyaXRlKHN5bmNbMV0sIFx1MDAyNmdvLCAxKSAhPSAxKVxuJiM0MztcdFx0XHRfZXhpdChLU0ZUX0ZBSUwpO1xuJiM0MztcdFx0dXNsZWVwKDUwMDApO1xuJiM0MztcdFx0Yy1cdTAwM2Vjb2xsYXBzZShcJiMzNDtDb2xsYXBzZSBhIHJhbmdlIHRoZSBwYXJlbnQgaXMgd3JpdGluZyB0b1wmIzM0OyxcbiYjNDM7XHRcdFx0ICAgIHAsIDEsIG9wcywgdHJ1ZSk7XG4mIzQzO1x0XHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGRlYWQwMDAwKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0aWYgKGkgPT0gbilcbiYjNDM7XHRcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGZhaWwoXCYjMzQ7RmFpbDogY2hpbGQgY29udGVudFwmIzM0Oyk7XG4mIzQzO1x0XHQvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlICovXG4mIzQzO1x0XHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxuJiM0MztcdFx0XHRleGl0X3N0YXR1cyA9IGNvbGxhcHNlX3N0YXR1cztcbiYjNDM7XHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Y2xvc2Uoc3luY1sxXSk7XG4mIzQzO1x0aWYgKHJlYWQoc3luY1swXSwgXHUwMDI2Z28sIDEpICE9IDEpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7Y2hpbGQgbmV2ZXIgcmVhY2hlZCB0aGUgY29sbGFwc2VcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuc2hhcmUgb25lIHBhZ2UgYXQgYSB0aW1lOiBhIGJ1cnN0IHdvdWxkIGJyZWFrIENvVyBvbiB0aGUgd2hvbGVcbiYjNDM7XHQgKiByYW5nZSBiZWZvcmUgdGhlIGNvbGxhcHNlIHN0YXJ0cywgbGVhdmluZyBub3RoaW5nIHNoYXJlZCB0byBjb2xsYXBzZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpID0gMDtcbiYjNDM7XHRmb3IgKDs7KSB7XG4mIzQzO1x0XHRpZiAoaSBcdTAwM2MgbilcbiYjNDM7XHRcdFx0aXBbaSAqIHN0cmlkZV0gPSBpICYjNDM7IDB4YmVlZjAwMDA7XG4mIzQzO1x0XHRpJiM0MzsmIzQzOztcbiYjNDM7XHRcdHVzbGVlcCgxMCAqIDEwMDApO1xuJiM0MztcdFx0aWYgKHdhaXRwaWQoY2hpbGQsIFx1MDAyNndzdGF0dXMsIFdOT0hBTkcpKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEZpbmlzaCB3aGF0ZXZlciB0aGUgcGFjZWQgc3dlZXAgZGlkIG5vdCByZWFjaCAqL1xuJiM0MztcdGZvciAoOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlwW2kgKiBzdHJpZGVdID0gaSAmIzQzOyAweGJlZWYwMDAwO1xuJiM0MztcdC8qIEEgY2hpbGQgdGhhdCBkaWVkIHJlYWRpbmcgdGhlIHJhY2luZyBwYWdlcyBpcyBhIGZhaWx1cmUsIG5vdCBhIHplcm8gKi9cbiYjNDM7XHRjaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cJiMzNDspO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgJiM0MzsgMHhiZWVmMDAwMClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0aWYgKGkgPT0gbilcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbDogcGFyZW50IGNvbnRlbnRcJiMzNDspO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdC8qIFRoZSBwYXJlbnQmIzM5O3MgY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQmIzM5O3MgdmVyZGljdCAqL1xuJiM0MztcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXG4mIzQzO1x0XHRleGl0X3N0YXR1cyA9IGNoaWxkX3N0YXR1cztcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuQEAgLTExNzAsNiAmIzQzOzEzMDksMjAwIEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKiBTbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIHdpbGwgY29uc2lkZXIgZm9yIG1USFAgY29sbGFwc2UgKi9cbiYjNDM7I2RlZmluZSBNSU5fTVRIUF9PUkRFUiAyXG4mIzQzO1xuJiM0MzsvKiBUaW1lIGJ1ZGdldCBmb3Igb25lIGtodWdlcGFnZWQgcGFzcyBpbiB0aGUgY29sbGFwc2Vfb3JkZXJfKiBjYXNlcyAqL1xuJiM0MzsjZGVmaW5lIE1USFBfUEFTU19USU1FT1VUX1MgMzBcbiYjNDM7XG4mIzQzO3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHBhZ2Vfc2l6ZSBcdTAwM2NcdTAwM2MgY29sbGFwc2Vfb3JkZXI7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIG10aHBfcHVzaF90YXJnZXRfb3JkZXIodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBPbmx5IHRoZSB0YXJnZXQgb3JkZXIsIGFuZCBvbmx5IGZvciBtYWR2aXNlOiB0aGUgY2FzZXMgZmF1bHQgdGhlaXJcbiYjNDM7XHQgKiByZWdpb24gZmlyc3QsIHNvIHRoZSBzb3VyY2VzIHN0YXkgb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCBmb3IuXG4mIzQzO1x0ICovXG4mIzQzO1x0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuJiM0MztcdHNldHRpbmdzLmh1Z2VwYWdlc1tjb2xsYXBzZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgYWxsX3dpbmRvd3NfYXRfb3JkZXIodm9pZCAqcCwgc2l6ZV90IGxlbilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgbGVuLCBjb2xsYXBzZV9vcmRlcixcbiYjNDM7XHRcdFx0XHRcdHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBhbnlfd2luZG93X2F0X29yZGVyKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4mIzQzO3tcbiYjNDM7XHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuJiM0MztcdGNoYXIgKmFkZHIgPSBwO1xuJiM0MztcbiYjNDM7XHRmb3IgKDsgbGVuIFx1MDAzZT0gd2luZG93OyBhZGRyICYjNDM7PSB3aW5kb3csIGxlbiAtPSB3aW5kb3cpIHtcbiYjNDM7XHRcdGlmIChhbGxfd2luZG93c19hdF9vcmRlcihhZGRyLCB3aW5kb3cpKVxuJiM0MztcdFx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuJiM0MztcdGlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIG9uZSBmdWxseSBwb3B1bGF0ZWQgd2luZG93Li4uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKE1USFBfUEFTU19USU1FT1VUX1MpKVxuJiM0MztcdFx0ZmFpbChcJiMzNDtUaW1lb3V0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmIChhbGxfd2luZG93c19hdF9vcmRlcihwICYjNDM7IHdpbmRvdywgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwLCB3aW5kb3cpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICFhbnlfd2luZG93X2F0X29yZGVyKHAgJiM0MzsgMiAqIHdpbmRvdyxcbiYjNDM7XHRcdFx0XHQgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiYjNDM7XHRcdFx0XHRcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xuJiM0MztcdGlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIHdpbmRvdyB3aXRoIHNpbmdsZSBQVEUgZW50cnkgcHJlc2VudC4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgbXRocF93aW5kb3dfc2l6ZSgpKSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBwYWdlX3NpemUpO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiYjNDM7XHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbiYjNDM7XHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IDA7XG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4mIzQzO1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xuJiM0MztcdGlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwICYjNDM7IHdpbmRvdywgd2luZG93KSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgc291cmNlX29yZGVyID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgOiBNSU5fTVRIUF9PUkRFUjtcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdGlmIChzb3VyY2Vfb3JkZXIgXHUwMDNlPSBjb2xsYXBzZV9vcmRlciB8fFxuJiM0MztcdCAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIHNvdXJjZV9vcmRlcikpKSB7XG4mIzQzO1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCYjMzQ7JXM6IG5vIHN1cHBvcnRlZCBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBhbGxvY2F0b3IgY2FuIGZhbGwgYmFjayB0byBzbWFsbGVyIGZvbGlvcyB1bmRlciBmcmFnbWVudGF0aW9uO1xuJiM0MztcdCAqIGhhdmluZyBub3RoaW5nIHRvIGNvbGxhcHNlIGZyb20gaXMgbm90IGEgZmFpbHVyZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxuJiM0MztcdFx0XHRcdCAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtObyBvcmRlci0lZCBzb3VyY2VzIHRvIGNvbGxhcHNlLi4uXCYjMzQ7LCBzb3VyY2Vfb3JkZXIpO1xuJiM0MztcdFx0c2tpcChcJiMzNDtTa2lwXCYjMzQ7KTtcbiYjNDM7XHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX0hVR0VQQUdFKVwmIzM0Oyk7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7XFxuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gXHUwMDNjdGVzdCB0eXBlXHUwMDNlIFtkaXJdXFxuXFxuXCYjMzQ7KTtcbkBAIC0xMTg3LDExICYjNDM7MTUyMCwxNCBAQCBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQtYzogY29sbGFwc2Ugb3JkZXIgZm9yIG1USFAgY29sbGFwc2UsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgRGVmYXVsdHMgdG8gZXZlcnkgc3VwcG9ydGVkIG9yZGVyIGJlbG93IHRoZSBQTUQuXFxuXCYjMzQ7KTtcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcdFwmIzM0O1xcdFxcdCAgICAtcywgaWYgc2V0LCBpcyB0aGUgc291cmNlIG9yZGVyIGZvciB0aGUgbWl4ZWQtc291cmNlIGNhc2UuXFxuXCYjMzQ7KTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuJiM0MztcdGJvb2wgbXRocF9jb250ZXh0X2ltcGxpZWQgPSBmYWxzZTtcbiBcdGludCBvcHQ7XG4gXHRjaGFyICpidWY7XG4gXHRjb25zdCBjaGFyICp0b2tlbjtcbkBAIC0xMjAzLDYgJiM0MzsxNTM5LDcgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAmIzM5O2MmIzM5OzpcbiBcdFx0XHRjb2xsYXBzZV9vcmRlciA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0Y29sbGFwc2Vfb3JkZXJfc2V0ID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAmIzM5O2gmIzM5OzpcbiBcdFx0ZGVmYXVsdDpcbkBAIC0xMjEwLDEyICYjNDM7MTU0NywyNSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyXG4mIzQzO1x0ICogY2FuIGJlIG5lZ2F0aXZlLCBhbmQgYSB6ZXJvIGNvbGxhcHNlIG9yZGVyIGFza3MgZm9yIGJhc2UgcGFnZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGFub25fb3JkZXIgXHUwMDNjIDAgfHwgYW5vbl9vcmRlciBcdTAwM2UgaHBhZ2VfcG1kX29yZGVyKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0Oy1zIHRha2VzIGFuIG9yZGVyIGluIDAuLiVkLCBub3QgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTtcbiYjNDM7XHRpZiAoY29sbGFwc2Vfb3JkZXJfc2V0IFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDstYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgIGhwYWdlX3BtZF9vcmRlciAtIDEsIGNvbGxhcHNlX29yZGVyKTtcbiYjNDM7XG4gXHRhcmd2ICYjNDM7PSBvcHRpbmQ7XG4gXHRhcmdjIC09IG9wdGluZDtcbiBcbiBcdGlmIChhcmdjID09IDApIHtcbi1cdFx0LyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi9cbiYjNDM7XHRcdC8qIE5vIGFyZ3VtZW50czogYW5vbiB1bmRlciBldmVyeSBjb250ZXh0ICovXG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiYjNDM7XHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0XHRyZXR1cm47XG5AQCAtMTIyNiwxMyAmIzQzOzE1NzYsMTQgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcbiBcdGlmICghc3RyY21wKHRva2VuLCBcJiMzNDthbGxcJiMzNDspKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiYjNDM7XHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiYjNDM7XHRcdC8qIFRoZSBtVEhQIGNvbnRleHQgaGFzIG9ubHkgYW5vbiBjYXNlczsgbGV0IG90aGVyIG1lbV90eXBlcyBkcm9wIGl0ICovXG4mIzQzO1x0XHRtdGhwX2NvbnRleHRfaW1wbGllZCA9IHRydWU7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O2todWdlcGFnZWRcJiMzNDspKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCYjMzQ7bXRocF9raHVnZXBhZ2VkXCYjMzQ7KSkge1xuIFx0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuLVx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKVxuLVx0XHRcdHVzYWdlKCk7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O21hZHZpc2VcJiMzNDspKSB7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdH0gZWxzZSB7XG5AQCAtMTI0OCwyMCAmIzQzOzE1OTksMjAgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICBcdTAwMjZfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0c2htZW1fb3BzID0gXHUwMDI2X19zaG1lbV9vcHM7XG4tXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcbi1cdFx0XHR1c2FnZSgpO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7YW5vblwmIzM0OykpIHtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7ZmlsZVwmIzM0OykpIHtcbiBcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gIFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7c2htZW1cJiMzNDspKSB7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIHtcbiBcdFx0dXNhZ2UoKTtcbiBcdH1cbkBAIC0xMjgzLDkgJiM0MzsxNjM0LDEwIEBAIHN0cnVjdCB0ZXN0X2Nhc2Uge1xuIFx0c3RydWN0IG1lbV9vcHMgKm9wcztcbiBcdGNvbnN0IGNoYXIgKmRlc2M7XG4gXHR0ZXN0X2ZuIGZuO1xuJiM0MztcdGludCBvcmRlcjtcdFx0LyogbVRIUCBjb250ZXh0czogdGhlIGNvbGxhcHNlIG9yZGVyICovXG4gfTtcbiBcbi0jZGVmaW5lIE1BWF9URVNUX0NBU0VTIDY0XG4mIzQzOyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2XG4gc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107XG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xuIFxuQEAgLTEyOTgsNiAmIzQzOzE2NTAsNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXHRcdFx0Lm9wc1x0PSBvLFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5kZXNjXHQ9ICN0LFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5mblx0PSB0LFx0XHRcdFx0XHRcXFxuJiM0MztcdFx0XHQub3JkZXJcdD0gY29sbGFwc2Vfb3JkZXIsXHRcdFx0XFxcbiBcdFx0fTtcdFx0XHRcdFx0XHRcdFxcXG4gXHR9XHRcdFx0XHRcdFx0XHRcdFxcXG4gXHR9IHdoaWxlICgwKVxuQEAgLTEzMzgsOCAmIzQzOzE2OTEsNjYgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFxuIFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xuIFxuJiM0MztcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChjb2xsYXBzZV9vcmRlcl9zZXQpIHtcbiYjNDM7XHRcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBjb2xsYXBzZV9vcmRlcik7XG4mIzQzO1x0XHRcdGlmIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IGFub25fb3JkZXIpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7LWMgJWQgbmVlZHMgYSBzb3VyY2Ugb3JkZXIgYmVsb3cgaXQsIC1zIHNheXMgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xuJiM0MztcdFx0XHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzJiM0MzsmIzQzO10gPSBjb2xsYXBzZV9vcmRlcjtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIEV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBhYm92ZSB0aGUgc291cmNlOiAtcyBtYWtlcyB0aGVcbiYjNDM7XHRcdFx0ICogZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlciwgc28gYSB0YXJnZXRcbiYjNDM7XHRcdFx0ICogYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2UuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRpbnQgZmlyc3QgPSBhbm9uX29yZGVyICYjNDM7IDE7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoZmlyc3QgXHUwMDNjIE1JTl9NVEhQX09SREVSKVxuJiM0MztcdFx0XHRcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XG4mIzQzO1x0XHRcdGZvciAoaW50IGkgPSBmaXJzdDsgaSBcdTAwM2MgaHBhZ2VfcG1kX29yZGVyOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRcdGlmIChvcmRlcnMgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuJiM0MztcdFx0XHRcdFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gaTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcbiYjNDM7XHRcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDttVEhQIGNhc2VzIHNraXBwZWQ6IG5vIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2VcXG5cJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XG4mIzQzO1x0XHRwYWdlbWFwX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCYjMzQ7KTtcbiYjNDM7XHRcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9rcGFnZWZsYWdzKVwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiBcdHNldGJ1ZihzdGRvdXQsIE5VTEwpO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogV2l0aG91dCBhIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvIHRoZSBrZXJuZWwgcmVmdXNlcyB0aGVzZVxuJiM0MztcdCAqIGNvbGxhcHNlcywgc28gdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghKHRocF9maWxlX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaHBhZ2VfcG1kX29yZGVyKSkpIHtcbiYjNDM7XHRcdGlmIChzaG1lbV9vcHMpIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7bm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIHNobWVtXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0c2htZW1fb3BzID0gTlVMTDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChyZWFkX29ubHlfZmlsZV9vcHMpIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7bm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xuJiM0MztcdFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSBOVUxMO1xuJiM0MztcdFx0XHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gTlVMTDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmICghYW5vbl9vcHMgXHUwMDI2XHUwMDI2ICFzaG1lbV9vcHMgXHUwMDI2XHUwMDI2ICFyZWFkX29ubHlfZmlsZV9vcHMpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O05vIG1lbV90eXBlIGxlZnQgdG8gcnVuXFxuXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxO1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3N3YXAgPSBocGFnZV9wbWRfbnIgLyA4O1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3NoYXJlZCA9IGhwYWdlX3BtZF9uciAvIDI7XG5AQCAtMTM1Nyw3ICYjNDM7MTc2OCwxNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCBzaG1lbV9vcHMpO1xuLVx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBucl9jb2xsYXBzZV9vcmRlcnM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRjb2xsYXBzZV9vcmRlciA9IGNvbGxhcHNlX29yZGVyc1tpXTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2VfZnVsbCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX3NpbmdsZV9tdGhwLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTM2NSwxMSAmIzQzOzE3ODYsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgc2htZW1fb3BzKTtcbiBcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuLVx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFxuLVx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbi1cbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTE0MjQsNiAmIzQzOzE4NDIsOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXG4mIzQzO1x0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG4gXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTE0MzksNyAmIzQzOzE4NjAsMTUgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIG5yX3Rlc3RfY2FzZXM7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdHN0cnVjdCB0ZXN0X2Nhc2UgKnQgPSBcdTAwMjZ0ZXN0X2Nhc2VzW2ldO1xuIFxuLVx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXFxuXCYjMzQ7LCB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUpO1xuJiM0MztcdFx0aWYgKHQtXHUwMDNlY3R4ID09IFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcbiYjNDM7XHRcdFx0Y29sbGFwc2Vfb3JkZXIgPSB0LVx1MDAzZW9yZGVyO1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMsIG9yZGVyICVkKVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICAgdC1cdTAwM2VkZXNjLCB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lLFxuJiM0MztcdFx0XHRcdCAgICAgICB0LVx1MDAzZW9yZGVyKTtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1xcbiMgUnVuIHRlc3Q6ICVzICglczolcylcXG5cJiMzNDssIHQtXHUwMDNlZGVzYyxcbiYjNDM7XHRcdFx0XHQgICAgICAgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4mIzQzO1x0XHR9XG4gXHRcdHQtXHUwMDNlZm4odC1cdTAwM2VjdHgsIHQtXHUwMDNlb3BzKTtcbiBcdH1cbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYzM0NzhiNTEyM2UyM1xuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbkBAIC0wLDAgJiM0MzsxLDUzMyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBSYWNlIGNvbGxhcHNlIGFnYWluc3QgZmF1bHRzLCBHVVAgcGlucywgZm9yaywgbXJlbWFwIGFuZCBNQURWX0RPTlRORUVEXG4mIzQzOyAqIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLiAgQSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3IgYXNcbiYjNDM7ICogemVybywgbmV2ZXIgYW55dGhpbmcgZWxzZTsgdGhlIGtlcm5lbCYjMzk7cyBvd24gYXNzZXJ0aW9ucyBpbiBkbWVzZyBhcmUgdGhlXG4mIzQzOyAqIG90aGVyIGhhbGYgb2YgdGhlIGNoZWNrLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjcHRocmVhZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvdGltZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzZWxmdGVzdC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtX3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0Oy4uLy4uLy4uLy4uL21tL2d1cF90ZXN0LmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNpZm5kZWYgRk9MTF9XUklURVxuJiM0MzsjZGVmaW5lIEZPTExfV1JJVEUgMHgwMVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQkFTRV9BRERSXHQoKHZvaWQgKikoMVVMIFx1MDAzY1x1MDAzYyAzMCkpXG4mIzQzOyNkZWZpbmUgUEFTU19USU1FT1VUX1NcdDMwXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBQTUQtc2l6ZWQgYXJlYXMgdGhlIHJhY2luZyB0aHJlYWRzIHNoYXJlLCBwbHVzIG9uZSBmb3IgdGhlIG1yZW1hcFxuJiM0MzsgKiB0aHJlYWQuICAtYSBzaHJpbmtzIGl0IHdoZXJlIGEgUE1EIGlzIDUxMk0uXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4mIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzO1xuJiM0MztzdGF0aWMgaW50IG5yX2FyZWFzO1xuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiYjNDM7LyogbnJfYXJlYXMgUE1ELXNpemVkIGFyZWFzOyB0aGUgbGFzdCBvbmUgYmVsb25ncyB0byB0aGUgbXJlbWFwIHRocmVhZCAqL1xuJiM0MztzdGF0aWMgY2hhciAqcmVnaW9uO1xuJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX2FyZWE7XG4mIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcbiYjNDM7c3RhdGljIGNoYXIgKnBhZ2VvdXRfYXJlYTtcbiYjNDM7c3RhdGljIHNpemVfdCBwYWdlb3V0X3NpemU7XG4mIzQzO3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBjb3JydXB0ZWQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4mIzQzO1xuJiM0MztcdHJldHVybiB2YWwgPyB2YWwgOiAxO1x0LyogbmV2ZXIgY29sbGlkZXMgd2l0aCB0aGUgemVyby1maWxsICovXG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFplcm8gbWVhbnMgbmV2ZXIgd3JpdHRlbjsgYW55dGhpbmcgZWxzZSBtdXN0IGJlIHRoaXMgcGFnZSYjMzk7cyBwYXR0ZXJuICovXG4mIzQzO3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbClcbiYjNDM7e1xuJiM0MztcdCp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gKnZhbCBcdTAwMjZcdTAwMjYgKnZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHZhbDtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VfaXNfY29ycnVwdChwYWdlX2lkeCwgXHUwMDI2dmFsKSkge1xuJiM0MztcdFx0Y29ycnVwdGVkID0gMTtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ2xhbXAgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJiMzOTtzIGFyZWEgKi9cbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcm9vbV9mcm9tKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGxvbmcgd2FudClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XG4mIzQzO1xuJiM0MztcdHJldHVybiB3YW50IFx1MDAzYyBsZWZ0ID8gd2FudCA6IGxlZnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHJhbmRfcihcdTAwMjZzZWVkKSBcdTAwMjYgMSlcbiYjNDM7XHRcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKSA9XG4mIzQzO1x0XHRcdFx0cGF0dGVybihwYWdlX2lkeCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGNoZWNrX3BhZ2UocGFnZV9pZHgpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIG5yID0gMVVMIFx1MDAzY1x1MDAzYyAocmFuZF9yKFx1MDAyNnNlZWQpICUgNik7XHQvKiAxLi4zMiBwYWdlcyAqL1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBOb3cgYW5kIHRoZW4gemFwIGEgd2hvbGUgUE1ELWFsaWduZWQgYXJlYTogb25seSBhIHphcCB0aGF0XG4mIzQzO1x0XHQgKiBjb3ZlcnMgdGhlIGZ1bGwgdGFibGUgZnJlZXMgdGhlIHRhYmxlIGl0c2VsZiAoQ09ORklHX1BUX1JFQ0xBSU0pLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIShyYW5kX3IoXHUwMDI2c2VlZCkgJSA2NCkpIHtcbiYjNDM7XHRcdFx0dW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggL1xuJiM0MztcdFx0XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0XHRcdG1hZHZpc2UocmVnaW9uICYjNDM7IGFyZWEgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRtYWR2aXNlKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0XHRyb29tX2Zyb20ocGFnZV9pZHgsIG5yKSAqIHBhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSA1MDApO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKnBpbm5lcl9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpO1xuJiM0MztcbiYjNDM7XHRcdGd1cC5hZGRyID0gKHVuc2lnbmVkIGxvbmcpKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0XHRndXAuc2l6ZSA9IG5yICogcGFnZV9zaXplO1xuJiM0MztcdFx0Z3VwLm5yX3BhZ2VzX3Blcl9jYWxsID0gbnI7XG4mIzQzO1x0XHRndXAuZ3VwX2ZsYWdzID0gRk9MTF9XUklURTtcbiYjNDM7XHRcdC8qIFJhY2luZyBNQURWX0RPTlRORUVEIG1ha2VzIHRyYW5zaWVudCBmYWlsdXJlcyBleHBlY3RlZCAqL1xuJiM0MztcdFx0aW9jdGwoZ3VwX2ZkLCBQSU5fRkFTVF9CRU5DSE1BUkssIFx1MDAyNmd1cCk7XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpmb3JrZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChwaWQgPT0gMCkge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgdmFsO1xuJiM0MztcdFx0XHRpbnQgYmFkID0gMDtcbiYjNDM7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIE5vIHN0ZGlvIGluIHRoZSBjaGlsZDogYSB0aHJlYWQgbWF5IGhvbGQgc3Rkb3V0JiMzOTtzXG4mIzQzO1x0XHRcdCAqIGxvY2sgYWNyb3NzIHRoZSBmb3JrLCBhbmQgcHJpbnRpbmcgdW5kZXIgaXQgaGFuZ3MuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgMTY7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRcdGJhZCB8PSBwYWdlX2lzX2NvcnJ1cHQocmFuZF9wYWdlKFx1MDAyNnNlZWQpLCBcdTAwMjZ2YWwpO1xuJiM0MztcdFx0XHRfZXhpdChiYWQpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHBpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRpbnQgd3N0YXR1cztcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh3YWl0cGlkKHBpZCwgXHUwMDI2d3N0YXR1cywgMCkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O3dhaXRwaWQoKVwmIzM0Oyk7XG4mIzQzO1x0XHRcdC8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28gKi9cbiYjNDM7XHRcdFx0aWYgKCFXSUZFWElURUQod3N0YXR1cykgfHwgV0VYSVRTVEFUVVMod3N0YXR1cykpXG4mIzQzO1x0XHRcdFx0Y29ycnVwdGVkID0gMTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0XHRwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfc2NyYXRjaCk7XG4mIzQzO1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bXJlbWFwKCkgYXdheVwmIzM0Oyk7XG4mIzQzO1x0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgODsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXHUwMDI2c2VlZCkgJVxuJiM0MztcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkpICogcGFnZV9zaXplXSA9IDE7XG4mIzQzO1x0XHRwID0gbXJlbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7XG4mIzQzO1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bXJlbWFwKCkgYmFja1wmIzM0Oyk7XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBTd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBub3RoaW5nIGVsc2Ugd3JpdGVzLCBzbyBhIHBhZ2UmIzM5O3NcbiYjNDM7ICogcGF0dGVybiBtdXN0IHN1cnZpdmUgdGhlIHRyaXAgdGhyb3VnaCBzd2FwIGV4YWN0bHkuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yID0gcGFnZW91dF9zaXplIC8gcGFnZV9zaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0Kih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRtYWR2aXNlKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplLCBNQURWX1BBR0VPVVQpO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7XG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICBpICogcGFnZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh2YWwgIT0gcGF0dGVybihpKSkge1xuJiM0MztcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7UGFnZW91dCBjb3JydXB0aW9uIGF0IHBhZ2UgJWx1OiAlI3ggIT0gJSN4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIENvbXBhY3Rpb24gbWlncmF0ZXMgdGhlIGNvbGxhcHNlIHNvdXJjZXMgd2hpbGUgdGhleSBhcmUgYmVpbmcgZ2F0aGVyZWQgKi9cbiYjNDM7c3RhdGljIHZvaWQgKmNvbXBhY3Rvcl9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XHRpbnQgZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeVwmIzM0OywgT19XUk9OTFkpO1xuJiM0MztcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O05vIGNvbXBhY3RfbWVtb3J5OyBjb21wYWN0b3IgaWRsZVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHR9XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRpZiAod3JpdGUoZmQsIFwmIzM0OzFcJiMzNDssIDEpIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdHVzbGVlcCgxMDAwMCAmIzQzOyByYW5kX3IoXHUwMDI2c2VlZCkgJSAxMDAwMDApO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHN3YXBfYXZhaWxhYmxlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGxpbmVbMjU2XTtcbiYjNDM7XHRpbnQgbGluZXMgPSAwO1xuJiM0MztcdEZJTEUgKmZwID0gZm9wZW4oXCYjMzQ7L3Byb2Mvc3dhcHNcJiMzNDssIFwmIzM0O3JcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRpZiAoIWZwKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSlcbiYjNDM7XHRcdGxpbmVzJiM0MzsmIzQzOztcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztcdHJldHVybiBsaW5lcyBcdTAwM2UgMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgbm93X21zKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGltZXZhbCB0djtcbiYjNDM7XG4mIzQzO1x0Z2V0dGltZW9mZGF5KFx1MDAyNnR2LCBOVUxMKTtcbiYjNDM7XHRyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICYjNDM7IHR2LnR2X3VzZWMgLyAxMDAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXG4mIzQzO1x0XHRcJiMzNDtVc2FnZToga2h1Z2VwYWdlZF9yYWNlIFstZCBzZWNvbmRzXSBbLW0gc3RlcHBlZHxmcmVlfG1hZHZpc2VdIFstYSBhcmVhc10gWy10IG1hc2tdXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHRXaXRob3V0IC1tLCBldmVyeSBtb2RlIHJ1bnMgaW4gdHVybi5cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdC1kOiBzZWNvbmRzIHBlciBtb2RlIChkZWZhdWx0IDUpXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHQtYTogbnVtYmVyIG9mIHNoYXJlZCBQTUQtc2l6ZWQgcGxheWdyb3VuZCBhcmVhcyAoZGVmYXVsdCAzKVxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0LXQ6IGJpdG1hc2sgb2YgcmFjaW5nIHRocmVhZHMgdG8gc3RhcnQsIGZvciBiaXNlY3RpbmcgYSBmYWlsdXJlXFxuXCYjMzQ7KTtcbiYjNDM7XHRleGl0KDEpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4mIzQzO3tcbiYjNDM7XHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRocmVhZF9uYW1lc1tdID0ge1xuJiM0MztcdFx0XCYjMzQ7ZmF1bHRlclwmIzM0OywgXCYjMzQ7ZmF1bHRlcjJcJiMzNDssIFwmIzM0O2RvbnRuZWVkXCYjMzQ7LCBcJiMzNDtwaW5uZXJcJiMzNDssIFwmIzM0O2ZvcmtlclwmIzM0OyxcbiYjNDM7XHRcdFwmIzM0O21yZW1hcHBlclwmIzM0OywgXCYjMzQ7cGFnZW91dFwmIzM0OywgXCYjMzQ7Y29tcGFjdG9yXCYjMzQ7LFxuJiM0MztcdH07XG4mIzQzO1x0dm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7XG4mIzQzO1x0XHRmYXVsdGVyX2ZuLCBmYXVsdGVyX2ZuLCBkb250bmVlZF9mbiwgcGlubmVyX2ZuLCBmb3JrZXJfZm4sXG4mIzQzO1x0XHRtcmVtYXBwZXJfZm4sIHBhZ2VvdXRfZm4sIGNvbXBhY3Rvcl9mbixcbiYjNDM7XHR9O1xuJiM0MztcdGVudW0geyBUX0ZBVUxURVIsIFRfRkFVTFRFUjIsIFRfRE9OVE5FRUQsIFRfUElOTkVSLCBUX0ZPUktFUixcbiYjNDM7XHQgICAgICAgVF9NUkVNQVBQRVIsIFRfUEFHRU9VVCwgVF9DT01QQUNUT1IgfTtcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VvdXRfYml0ID0gMVVMIFx1MDAzY1x1MDAzYyBUX1BBR0VPVVQ7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBjb21wYWN0b3JfYml0ID0gMVVMIFx1MDAzY1x1MDAzYyBUX0NPTVBBQ1RPUjtcbiYjNDM7XHRjb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTtcbiYjNDM7XHRwdGhyZWFkX3QgdGhyZWFkc1tBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyldO1xuJiM0MztcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxsX21vZGVzW10gPSB7IFwmIzM0O3N0ZXBwZWRcJiMzNDssIFwmIzM0O2ZyZWVcJiMzNDssIFwmIzM0O21hZHZpc2VcJiMzNDsgfTtcbiYjNDM7XHRzdGF0aWMgY29uc3QgYm9vbCBvY2N1cGFuY2llc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1x0Lyogc3RyaWN0LCBob2xlcyAqL1xuJiM0MztcdHN0YXRpYyBjb25zdCBib29sIHByZXNzdXJlc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1x0LyogcXVpZXQsIHVuZGVyIHByZXNzdXJlICovXG4mIzQzO1x0Y29uc3QgaW50IG5yX29jY3VwYW5jaWVzID0gQVJSQVlfU0laRShvY2N1cGFuY2llcyk7XG4mIzQzO1x0Y29uc3QgaW50IG5yX3ByZXNzdXJlcyA9IEFSUkFZX1NJWkUocHJlc3N1cmVzKTtcbiYjNDM7XHRjb25zdCBjaGFyICpvbmVfbW9kZVsxXTtcbiYjNDM7XHRjb25zdCBjaGFyICogY29uc3QgKm1vZGVzID0gYWxsX21vZGVzO1xuJiM0MztcdGludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTtcbiYjNDM7XHRjb25zdCBjaGFyICptb2RlX2FyZyA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGVuZF9tcztcbiYjNDM7XHRpbnQgZHVyYXRpb25fcyA9IDU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB0aHJlYWRfbWFzayA9IH4wVUw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBiYXNlX21hc2s7XG4mIzQzO1x0Ym9vbCBoYXZlX3N3YXA7XG4mIzQzO1x0Y2hhciBsYWJlbFs2NF07XG4mIzQzO1x0aW50IG5yX2FyZWFzX2FyZyA9IDA7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcdGludCBzdGVwcyA9IDA7XG4mIzQzO1x0aW50IG9wdDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCYjMzQ7YTpkOm06dDpoXCYjMzQ7KSkgIT0gLTEpIHtcbiYjNDM7XHRcdHN3aXRjaCAob3B0KSB7XG4mIzQzO1x0XHRjYXNlICYjMzk7YSYjMzk7OlxuJiM0MztcdFx0XHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y2FzZSAmIzM5O2QmIzM5OzpcbiYjNDM7XHRcdFx0ZHVyYXRpb25fcyA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7bSYjMzk7OlxuJiM0MztcdFx0XHRtb2RlX2FyZyA9IG9wdGFyZztcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7dCYjMzk7OlxuJiM0MztcdFx0XHR0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRkZWZhdWx0OlxuJiM0MztcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG1vZGVfYXJnKSB7XG4mIzQzO1x0XHRpZiAoc3RyY21wKG1vZGVfYXJnLCBcJiMzNDtzdGVwcGVkXCYjMzQ7KSBcdTAwMjZcdTAwMjYgc3RyY21wKG1vZGVfYXJnLCBcJiMzNDtmcmVlXCYjMzQ7KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBzdHJjbXAobW9kZV9hcmcsIFwmIzM0O21hZHZpc2VcJiMzNDspKVxuJiM0MztcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0b25lX21vZGVbMF0gPSBtb2RlX2FyZztcbiYjNDM7XHRcdG1vZGVzID0gb25lX21vZGU7XG4mIzQzO1x0XHRucl9tb2RlcyA9IDE7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuJiM0MztcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpO1xuJiM0MztcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbiYjNDM7XHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1JlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGd1cF9mZCA9IG9wZW4oXCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcJiMzNDssIE9fUkRXUik7XG4mIzQzO1x0aWYgKGd1cF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0Oy9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IHJlcXVpcmVzIENPTkZJR19HVVBfVEVTVCBhbmQgcm9vdFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG5yX3NoYXJlZF9hcmVhcyA9IG5yX2FyZWFzX2FyZyBcdTAwM2UgMCA/IG5yX2FyZWFzX2FyZyA6IERFRkFVTFRfU0hBUkVEX0FSRUFTO1xuJiM0MztcdG5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICYjNDM7IDE7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogTVJFTUFQX0ZJWEVEIHVubWFwcyB3aGF0ZXZlciBpcyBpbiB0aGUgd2F5IHdpdGhvdXQgc2F5aW5nIHNvLCBzb1xuJiM0MztcdCAqIGNsYWltIHRoZSBtcmVtYXAgdGhyZWFkJiMzOTtzIHNjcmF0Y2ggYWRkcmVzcyB1cCBmcm9udC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRtcmVtYXBfc2NyYXRjaCA9IChjaGFyICopQkFTRV9BRERSICYjNDM7IDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcdGlmIChtbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9OT05FLFxuJiM0MztcdFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsXG4mIzQzO1x0XHQgLTEsIDApICE9ICh2b2lkICopbXJlbWFwX3NjcmF0Y2gpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bW1hcCgpIG1yZW1hcCBzY3JhdGNoXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0YmFzZV9tYXNrID0gdGhyZWFkX21hc2s7XG4mIzQzO1x0aGF2ZV9zd2FwID0gc3dhcF9hdmFpbGFibGUoKTtcbiYjNDM7XHRpZiAoIWhhdmVfc3dhcClcbiYjNDM7XHRcdC8qIE5vIHN3YXAsIG5vIGFub24gcmVjbGFpbTogY29tcGFjdGlvbi1vbmx5IHByZXNzdXJlICovXG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtubyBzd2FwOiB0aGUgcGFnZW91dCB0aHJlYWQgaXMgbm90IHN0YXJ0ZWRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xuJiM0MztcbiYjNDM7XHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuJiM0MztcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBydW4gPSAwOyBydW4gXHUwMDNjIG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXM7IHJ1biYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGludCByZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xuJiM0MztcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldO1xuJiM0MztcdFx0Ym9vbCBob2xlcyA9IG9jY3VwYW5jaWVzW3JlbSAvIG5yX3ByZXNzdXJlc107XG4mIzQzO1x0XHRib29sIHByZXNzdXJlID0gcHJlc3N1cmVzW3JlbSAlIG5yX3ByZXNzdXJlc107XG4mIzQzO1xuJiM0MztcdFx0c25wcmludGYobGFiZWwsIHNpemVvZihsYWJlbCksIFwmIzM0OyVzLyVzJXNcJiMzNDssIG1vZGUsXG4mIzQzO1x0XHRcdCBob2xlcyA/IFwmIzM0O2hvbGVzXCYjMzQ7IDogXCYjMzQ7c3RyaWN0XCYjMzQ7LCBwcmVzc3VyZSA/IFwmIzM0Oy9wcmVzc3VyZVwmIzM0OyA6IFwmIzM0O1wmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoY29ycnVwdGVkKSB7XG4mIzQzO1x0XHRcdC8qIE1lbW9yeSBpcyBzdXNwZWN0OyB0aGUgcmVzdCB3b3VsZCBwcm92ZSBub3RoaW5nICovXG4mIzQzO1x0XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDslczogc2tpcHBlZCBhZnRlciBjb3JydXB0aW9uXFxuXCYjMzQ7LCBsYWJlbCk7XG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHRocmVhZF9tYXNrID0gYmFzZV9tYXNrO1xuJiM0MztcdFx0aWYgKCFwcmVzc3VyZSlcbiYjNDM7XHRcdFx0dGhyZWFkX21hc2sgXHUwMDI2PSB+KHBhZ2VvdXRfYml0IHwgY29tcGFjdG9yX2JpdCk7XG4mIzQzO1x0XHRlbHNlIGlmICghaGF2ZV9zd2FwKVxuJiM0MztcdFx0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH5wYWdlb3V0X2JpdDtcbiYjNDM7XG4mIzQzO1x0XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0XHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuJiM0MztcdFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuJiM0MztcdFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9XG4mIzQzO1x0XHRcdHN0cmNtcChtb2RlLCBcJiMzNDtmcmVlXCYjMzQ7KSA/IDEwMDAgOiAwO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSAxMDtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogbVRIUCBjb2xsYXBzZSBob25vdXJzIG9ubHkgMCBvciBIUEFHRV9QTURfTlIgLSAxIGhlcmUuICBUaGUgdHdvXG4mIzQzO1x0XHQgKiBlbmRzIHJhY2UgZGlmZmVyZW50IHBhdGhzOiBhIHN0cmljdCB3aW5kb3cgaGFzIGV2ZXJ5IFBURVxuJiM0MztcdFx0ICogcHJlc2VudCwgYSBob2xlLWhlYXZ5IG9uZSBpcyBtb3N0bHkgemVyby1maWxsZWQuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhvbGVzID9cbiYjNDM7XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwO1xuJiM0MztcdFx0LyogT25lIHdha2UsIG9uZSBwYXNzOiB0aGUgcGxheWdyb3VuZCBwbHVzIHRoZSBmb3JrZWQgY2hpbGRyZW4mIzM5O3MgY29waWVzICovXG4mIzQzO1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPVxuJiM0MztcdFx0XHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpXG4mIzQzO1x0XHRcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0XHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8XG4mIzQzO1x0XHRcdCAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xuJiM0MztcdFx0aWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgcGxheWdyb3VuZFwmIzM0Oyk7XG4mIzQzO1x0XHRtcmVtYXBfYXJlYSA9IHJlZ2lvbiAmIzQzOyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAodGhyZWFkX21hc2sgXHUwMDI2IHBhZ2VvdXRfYml0KSB7XG4mIzQzO1x0XHRcdC8qIEVub3VnaCB0byBkcml2ZSByZWFsIHJlY2xhaW0gd2l0aG91dCBzd2FtcGluZyBhIHNtYWxsIGd1ZXN0ICovXG4mIzQzO1x0XHRcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XHRcdFx0aWYgKHBhZ2VvdXRfc2l6ZSBcdTAwM2MgMTZVTCBcdTAwM2NcdTAwM2MgMjApXG4mIzQzO1x0XHRcdFx0cGFnZW91dF9zaXplID0gMTZVTCBcdTAwM2NcdTAwM2MgMjA7XG4mIzQzO1x0XHRcdGlmIChwYWdlb3V0X3NpemUgXHUwMDNlIDY0VUwgXHUwMDNjXHUwMDNjIDIwKVxuJiM0MztcdFx0XHRcdHBhZ2VvdXRfc2l6ZSA9IDY0VUwgXHUwMDNjXHUwMDNjIDIwO1xuJiM0MztcdFx0XHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0XHRcdFx0ICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xuJiM0MztcdFx0XHRpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21tYXAoKSBwYWdlb3V0IGFyZWFcJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIFBvcHVsYXRlIHNvIHRoZSBmaXJzdCBwYXNzIGhhcyBzb21ldGhpbmcgdG8gY29sbGFwc2UgKi9cbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbiYjNDM7XHRcdG1lbXNldChtcmVtYXBfYXJlYSwgMSwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0aWYgKG1hZHZpc2UocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSlcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmICghKHRocmVhZF9tYXNrIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBpKSkpIHtcbiYjNDM7XHRcdFx0XHR0aHJlYWRzW2ldID0gMDtcbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRpZiAocHRocmVhZF9jcmVhdGUoXHUwMDI2dGhyZWFkc1tpXSwgTlVMTCwgdGhyZWFkX2Zuc1tpXSxcbiYjNDM7XHRcdFx0XHRcdCAgICh2b2lkICopKGkgJiM0MzsgMSkpKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcih0aHJlYWRfbmFtZXNbaV0pO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGVuZF9tcyA9IG5vd19tcygpICYjNDM7IGR1cmF0aW9uX3MgKiAxMDAwVUw7XG4mIzQzO1x0XHRpZiAoIXN0cmNtcChtb2RlLCBcJiMzNDtzdGVwcGVkXCYjMzQ7KSkge1xuJiM0MztcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHRcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoUEFTU19USU1FT1VUX1MpKVxuJiM0MztcdFx0XHRcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O2todWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRcdHN0ZXBzJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fSBlbHNlIGlmICghc3RyY21wKG1vZGUsIFwmIzM0O2ZyZWVcJiMzNDspKSB7XG4mIzQzO1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKVxuJiM0MztcdFx0XHRcdHVzbGVlcCgxMDAgKiAxMDAwKTtcbiYjNDM7XHRcdH0gZWxzZSB7XHQvKiBtYWR2aXNlICovXG4mIzQzO1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4mIzQzO1x0XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRcdFx0bWFkdmlzZShyZWdpb24gJiM0MzsgaSAqIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XG4mIzQzO1x0XHRcdFx0fVxuJiM0MztcdFx0XHRcdG1hZHZpc2UocmVnaW9uLCBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRcdE1BRFZfRE9OVE5FRUQpO1xuJiM0MztcdFx0XHRcdHN0ZXBzJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHN0b3AgPSAxO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKHRocmVhZHNbaV0pXG4mIzQzO1x0XHRcdFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0Y2hlY2tfcGFnZShpKTtcbiYjNDM7XG4mIzQzO1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KCFjb3JydXB0ZWQsIFwmIzM0OyVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCBsYWJlbCwgZHVyYXRpb25fcywgc3RlcHMpO1xuJiM0MztcbiYjNDM7XHRcdC8qIFRoZSBuZXh0IG1vZGUgbWFwcyB0aGUgc2FtZSBmaXhlZCBhZGRyZXNzIHdpdGggaXRzIG93biBzZXR0aW5ncyAqL1xuJiM0MztcdFx0bXVubWFwKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0XHRpZiAocGFnZW91dF9hcmVhKSB7XG4mIzQzO1x0XHRcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XG4mIzQzO1x0XHRcdHBhZ2VvdXRfYXJlYSA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0XHRzdG9wID0gMDtcbiYjNDM7XHRcdHN0ZXBzID0gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfZmluaXNoZWQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xYzFiOTQyYWMzMjU4XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xuQEAgLTAsMCAmIzQzOzEsMTc5IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIENoZWNrIHRoYXQga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkcml2ZXMga2h1Z2VwYWdlZCBpbiBzdGVwOiBvbmUgYmFycmllclxuJiM0MzsgKiBvdmVyIG9uZSBwcmVwYXJlZCB3aW5kb3cgbXVzdCBjb2xsYXBzZSBpdCB3aXRoIGV4YWN0bHkgb25lIGNvbGxhcHNlXG4mIzQzOyAqIGF0dGVtcHQgYXR0cmlidXRlZCB0byBpdHMgc291cmNlIHBhZ2VzLCBzdGVwIGFmdGVyIHN0ZXAuXG4mIzQzOyAqXG4mIzQzOyAqIHNjYW5fc2xlZXBfbWlsbGlzZWNzIGlzIGEgbWludXRlIHNvIHRoYXQgYSBzdGVwIHdoaWNoIHNsZXB0IGluc3RlYWQgb2ZcbiYjNDM7ICogYmVpbmcgd29rZW4gYmxvd3MgdGhlIGJ1ZGdldC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzZWxmdGVzdC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtX3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFx1MDAzY1x1MDAzYyAzMCkpXG4mIzQzOy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXG4mIzQzOyNkZWZpbmUgVEFSR0VUX09SREVSIDJcbiYjNDM7I2RlZmluZSBOUl9JVEVSQVRJT05TIDVcbiYjNDM7I2RlZmluZSBQQVNTX1RJTUVPVVRfUyAzMFxuJiM0MztcbiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4mIzQzO3N0YXRpYyBpbnQgdHJhY2VfZXZlbnRzX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGU6IHN3aXRjaCB0aGVtIG9mZiBob3dldmVyIHRoZSB0ZXN0IGVuZHMsXG4mIzQzOyAqIGluY2x1ZGluZyBmcm9tIGluc2lkZSBhIGhlbHBlciB0aGF0IGdpdmVzIHVwLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgdHJhY2VfZXZlbnRzX29mZih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHRyYWNlX2V2ZW50c19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHR0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIENvdW50IHRoZSBpc29sYXRlIGV2ZW50cyB3aG9zZSBzY2FuX3BmbiBpcyBvbmUgb2YgdGhlIHdpbmRvdyYjMzk7cyBzb3VyY2UgUEZOcyAqL1xuJiM0MztzdGF0aWMgaW50IGNvdW50X2F0dHJpYnV0ZWQodW5zaWduZWQgbG9uZyAqcGZucywgaW50IG5yX3BmbnMsXG4mIzQzO1x0XHRcdCAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGxpbmVbMTAyNF07XG4mIzQzO1x0aW50IGNvdW50ID0gMDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSB0cmFjaW5nX29wZW5fdHJhY2UoKTtcbiYjNDM7XHRpZiAoIWZwKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O0Nhbm5vdCBvcGVuIHRyYWNlIGJ1ZmZlclxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyB2YWw7XG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgb3JkO1xuJiM0MztcdFx0Y2hhciAqcywgKm87XG4mIzQzO1x0XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0XHRzID0gc3Ryc3RyKGxpbmUsIFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIXMpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0aWYgKHNzY2FuZihzLCBcJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHhcJiMzNDssXG4mIzQzO1x0XHRcdCAgIFx1MDAyNnZhbCkgIT0gMSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRvID0gc3Ryc3RyKHMsIFwmIzM0O29yZGVyPVwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIW8gfHwgc3NjYW5mKG8sIFwmIzM0O29yZGVyPSV1XCYjMzQ7LCBcdTAwMjZvcmQpICE9IDEgfHwgb3JkICE9IG9yZGVyKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BmbnM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmICh2YWwgPT0gcGZuc1tpXSkge1xuJiM0MztcdFx0XHRcdGNvdW50JiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztcdHJldHVybiBjb3VudDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgb25lX3N0ZXAoaW50IGl0ZXJhdGlvbilcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4mIzQzO1x0Y29uc3QgaW50IG5yX3BhZ2VzID0gMSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgcGZuc1sxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVJdO1xuJiM0MztcdGJvb2wgY29sbGFwc2VkLCBwYXNzZWQ7XG4mIzQzO1x0aW50IGF0dHJpYnV0ZWQ7XG4mIzQzO1x0Y2hhciAqcDtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0cCA9IG1tYXAoQkFTRV9BRERSLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XG4mIzQzO1x0aWYgKHAgIT0gQkFTRV9BRERSKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21tYXAoKSB3aW5kb3dcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSAmIzQzOyAxO1xuJiM0MztcdFx0cGZuc1tpXSA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwICYjNDM7IGkgKiBnZXRwYWdlc2l6ZSgpKTtcbiYjNDM7XHRcdGlmIChwZm5zW2ldID09IC0xVUwpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBDbGVhciBiZWZvcmUgZW5hYmxpbmcgc28gdGhlIGJ1ZmZlciBob2xkcyBvbmx5IHRoaXMgc3RlcCYjMzk7cyBldmVudHMgKi9cbiYjNDM7XHRpZiAodHJhY2luZ19jbGVhcl90cmFjZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O0Nhbm5vdCBjbGVhciB0aGUgdHJhY2UgYnVmZmVyXFxuXCYjMzQ7KTtcbiYjNDM7XHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7Q2Fubm90IGVuYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX0hVR0VQQUdFKVwmIzM0Oyk7XG4mIzQzO1x0cGFzc2VkID0ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoUEFTU19USU1FT1VUX1MpO1xuJiM0MztcbiYjNDM7XHQvKiBPZmYgYmVmb3JlIGFueXRoaW5nIHRoYXQgY2FuIGdpdmUgdXA6IHRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlICovXG4mIzQzO1x0aWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtDYW5ub3QgZGlzYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cJiMzNDspO1xuJiM0MztcdGlmICghcGFzc2VkKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O2todWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGNvbGxhcHNlZCA9IGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCB3aW5kb3csIFRBUkdFVF9PUkRFUixcbiYjNDM7XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XG4mIzQzO1x0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsIFRBUkdFVF9PUkRFUik7XG4mIzQzO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHQoY29sbGFwc2VkIFx1MDAyNlx1MDAyNiBhdHRyaWJ1dGVkID09IDEsXG4mIzQzO1x0XHRcdCBcJiMzNDtzdGVwICVkOiB3aW5kb3cgY29sbGFwc2VkLCAlZCBhdHRyaWJ1dGVkIHJlc3VsdChzKVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0IGl0ZXJhdGlvbiwgYXR0cmlidXRlZCk7XG4mIzQzO1xuJiM0MztcdG11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRpZiAoISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVIpKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIFRBUkdFVF9PUkRFUik7XG4mIzQzO1xuJiM0MztcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbiYjNDM7XHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1JlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0cGFnZW1hcF9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCYjMzQ7KTtcbiYjNDM7XHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcdHRyYWNlX2V2ZW50c19mZCA9IHRyYWNpbmdfZXZlbnRzX29wZW4oXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspO1xuJiM0MztcdGlmICh0cmFjZV9ldmVudHNfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XG4mIzQzO1xuJiM0MztcdGtzZnRfc2V0X3BsYW4oTlJfSVRFUkFUSU9OUyk7XG4mIzQzO1xuJiM0MztcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4mIzQzO1x0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAgKiAxMDAwO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAgKiAxMDAwO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTtcbiYjNDM7XHQvKiBPbmUgd2FrZSBtdXN0IGNvbXBsZXRlIG9uZSBmdWxsIHBhc3M7IHNlZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpICovXG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMIFx1MDAzY1x1MDAzYyAyNDtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0c2V0dGluZ3MuaHVnZXBhZ2VzW1RBUkdFVF9PUkRFUl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuJiM0MztcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZCAqL1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfSVRFUkFUSU9OUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRvbmVfc3RlcChpKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuQEAgLTIwLDcgJiM0MzsyMCw2IEBAXG4gXG4gI2RlZmluZSBUV09NRUdcdFx0KDJcdTAwM2NcdTAwM2MyMClcbiAjZGVmaW5lIFJVTlRJTUVcdFx0KDIwKVxuLSNkZWZpbmUgQUxJR04oeCwgYSlcdCgoKHgpICYjNDM7IChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gXG4gSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTQwMiw2ICYjNDM7NDAyLDEyIEBAIENBVEVHT1JZPVwmIzM0O3Bmbm1hcFwmIzM0OyBydW5fdGVzdCAuL3Bmbm1hcFxuICMgQ09XIHRlc3RzXG4gQ0FURUdPUlk9XCYjMzQ7Y293XCYjMzQ7IHJ1bl90ZXN0IC4vY293XG4gXG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrXG4mIzQzO1xuJiM0MztDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZVxuJiM0MztcbiBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXG4gXG4gQ0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyXG5AQCAtNDEwLDggJiM0Mzs0MTYsNiBAQCBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxuIFxuIENBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cbiBcbi1DQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub25cbi1cbiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZFxuIGlmIFsgLXogXCYjMzQ7JHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH1cJiMzNDsgXTsgdGhlblxuICAgICBpZiB0ZXN0X3NlbGVjdGVkIFwmIzM0O3RocFwmIzM0OzsgdGhlblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5pbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuQEAgLTQyLDY4ICYjNDM7NDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7O1xuIGludCBwYWdlbWFwX2ZkO1xuIGludCBrcGFnZWZsYWdzX2ZkO1xuIFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbi1cdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4te1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4tXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4tXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4tXG4tXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4tXHRpZiAocGZuID09IC0xVUwpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbi1cdGlmICghb3JkZXIpIHtcbi1cdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0Lyogbm9uIFRIUCBmb2xpbyAqL1xuLVx0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuLVx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuLVx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbi1cdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbi1cdCAqL1xuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpXG4ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuaW5kZXggNDgyMWEzNTYzMDM2My4uYWY4MzI0ZTFlOGYyYyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5AQCAtNDkwLDYgJiM0Mzs0OTAsMTUzIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuJiM0MztcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbiYjNDM7XHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm47XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcbiYjNDM7XHQvKiBub24gcHJlc2VudCBwYWdlICovXG4mIzQzO1x0aWYgKHBmbiA9PSAtMVVMKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4mIzQzO1x0aWYgKCFvcmRlcikge1xuJiM0MztcdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBub24gVEhQIGZvbGlvICovXG4mIzQzO1x0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4mIzQzO1x0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuJiM0MztcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbiYjNDM7XHRcdFx0Z290byBmYWlsO1xuJiM0MztcdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbiYjNDM7XHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuJiM0MztcdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuJiM0MztmYWlsOlxuJiM0MztcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcigpIC0gY2hlY2sgdGhhdCBhIHJhbmdlIGlzIGJhY2tlZCBieSBAb3JkZXIgZm9saW9zXG4mIzQzOyAqIEBzdGFydDogc3RhcnQgb2YgdGhlIHJhbmdlLCBhIG11bHRpcGxlIG9mIHRoZSBmb2xpbyBzaXplXG4mIzQzOyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgcmFuZ2UgaW4gYnl0ZXMsIGEgbXVsdGlwbGUgb2YgdGhlIGZvbGlvIHNpemVcbiYjNDM7ICogQG9yZGVyOiB0aGUgZm9saW8gb3JkZXIgdG8gY2hlY2sgZm9yXG4mIzQzOyAqIEBwYWdlbWFwX2ZkOiBvcGVuIC9wcm9jL1x1MDAzY3BpZFx1MDAzZS9wYWdlbWFwIG9mIHRoZSByYW5nZSYjMzk7cyBvd25lclxuJiM0MzsgKiBAa3BhZ2VmbGFnc19mZDogb3BlbiAvcHJvYy9rcGFnZWZsYWdzXG4mIzQzOyAqXG4mIzQzOyAqIEV2ZXJ5IGZvbGlvLXNpemVkLCBmb2xpby1hbGlnbmVkIHBhcnQgb2YgdGhlIHJhbmdlIG11c3QgbWFwIG9uZSBmb2xpbyBvZlxuJiM0MzsgKiBAb3JkZXIsIGhlYWQgdG8gdGFpbCwgd2l0aCB0aGUgaGVhZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhcnQuICBBIHBhcnRcbiYjNDM7ICogYmFja2VkIGJ5IHNldmVyYWwgc21hbGxlciBmb2xpb3MgZmFpbHMsIGFuZCBzbyBkb2VzIGEgZm9saW8gbWFwcGVkIG9mZlxuJiM0MzsgKiBpdHMgbmF0dXJhbCBhbGlnbm1lbnQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnM6IHRydWUgaWYgdGhlIHdob2xlIHJhbmdlIGlzIGJhY2tlZCB0aGF0IHdheSwgZmFsc2Ugb3RoZXJ3aXNlLlxuJiM0MzsgKi9cbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcbiYjNDM7XHRcdFx0ICAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0Y29uc3Qgc2l6ZV90IGZvbGlvX3NpemUgPSBucl9wYWdlcyAqIHBzaXplKCk7XG4mIzQzO1x0Y2hhciAqdmFkZHI7XG4mIzQzO1xuJiM0MztcdGlmICgodWludHB0cl90KXN0YXJ0ICUgZm9saW9fc2l6ZSB8fCBsZW4gJSBmb2xpb19zaXplKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRmb3IgKHZhZGRyID0gc3RhcnQ7IHZhZGRyIFx1MDAzYyBzdGFydCAmIzQzOyBsZW47IHZhZGRyICYjNDM7PSBmb2xpb19zaXplKSB7XG4mIzQzO1x0XHRjb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1xuJiM0MztcdFx0LyogTm90IHByZXNlbnQsIG9yIGEgdGFpbCBwYWdlICovXG4mIzQzO1x0XHRpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0Y2hhciAqcGFnZSA9IHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwYWdlKSAhPSBwZm4gJiM0MzsgaSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFpc19iYWNrZWRfYnlfZm9saW8odmFkZHIsIG9yZGVyLCBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNkZWZpbmUgVFJBQ0VGU19ST09UIFwmIzM0Oy9zeXMva2VybmVsL3RyYWNpbmdcJiMzNDtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFJldHVybnMgLTEgd2l0aG91dCB0cmFjZWZzIG9yIHRoZSBzdWJzeXN0ZW0uICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZTpcbiYjNDM7ICogd2hvZXZlciBzd2l0Y2hlcyB0aGVtIG9uIGhhcyB0byBzd2l0Y2ggdGhlbSBvZmYgYWdhaW4sIG9uIGV2ZXJ5IGV4aXQgcGF0aC5cbiYjNDM7ICovXG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFsyNTZdO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCBcJiMzNDsvZXZlbnRzLyVzL2VuYWJsZVwmIzM0OyxcbiYjNDM7XHRcdCBzdWJzeXMpO1xuJiM0MztcdHJldHVybiBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHB3cml0ZShmZCwgZW5hYmxlID8gXCYjMzQ7MVwmIzM0OyA6IFwmIzM0OzBcJiMzNDssIDEsIDApICE9IDEpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhciAqL1xuJiM0MztpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkID0gb3BlbihUUkFDRUZTX1JPT1QgXCYjMzQ7L3RyYWNlXCYjMzQ7LCBPX1dST05MWSB8IE9fVFJVTkMpO1xuJiM0MztcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmb3BlbihUUkFDRUZTX1JPT1QgXCYjMzQ7L3RyYWNlXCYjMzQ7LCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiAvKiBJZiBgaW9jdGxzJiMzOTsgbm9uLU5VTEwsIHRoZSBhbGxvd2VkIGlvY3RscyB3aWxsIGJlIHJldHVybmVkIGludG8gdGhlIHZhciAqL1xuIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdFx0ICAgICAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yLCB1aW50NjRfdCAqaW9jdGxzKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuaW5kZXggOWE0OWFmODg3MDJlNC4uNWE5MWI5Njc2ZWM1ZCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG5AQCAtMTAsNiAmIzQzOzEwLDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4gXG4gI2RlZmluZSBCSVRfVUxMKG5yKSAgICAgICAgICAgICAgICAgICAoMVVMTCBcdTAwM2NcdTAwM2MgKG5yKSlcbiYjNDM7I2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIzQzOyAoYSkgLSAxKSBcdTAwMjYgfigoYSkgLSAxKSlcbiYjNDM7XG4gI2RlZmluZSBQTV9TT0ZUX0RJUlRZICAgICAgICAgICAgICAgICBCSVRfVUxMKDU1KVxuICNkZWZpbmUgUE1fTU1BUF9FWENMVVNJVkUgICAgICAgICAgICAgQklUX1VMTCg1NilcbiAjZGVmaW5lIFBNX1VGRkRfV1AgICAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTcpXG5AQCAtOTcsNiAmIzQzOzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xuIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKTtcbiBpbnQgZ2F0aGVyX2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpO1xuJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpO1xuJiM0Mztib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxuJiM0MztcdFx0XHQgICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpO1xuIFxuIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdCAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTtcbkBAIC0xMTMsNiAmIzQzOzExOSwxMCBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cyk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7XG4mIzQzO2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpO1xuJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XG4gXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxuIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxNToxNTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O0FsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3IgbW9kdWxlIGNvZGUgaXMgYWx0ZXJlZCwgbWFraW5nIHRoZSBjaGFuZ2VzIG5vbi1rZXJuZWwvbm9uLWV4ZWN1dGFibGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Yga2VybmVsIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNjgyNzBhMWFiODJiNjc5NzNkZTY3ZmZiNGQzNTQwNjVhZDVhODY5MQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgU2VwIDggMTU6MTU6MzkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCkBAIC0xMDQsNiAmIzQzOzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBndWFyZC1yZWdpb25zCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbWVyZ2UKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBybWFwCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0CiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX29yZGVyX2NoZWNrCiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGtodWdlcGFnZWRfc3luY19jaGVjawomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3JhY2UKIAogaWZuZXEgKCQoQVJDSCksYXJtNjQpCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gc29mdC1kaXJ0eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uZmE3MzZjOWY3MDFhNAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMKQEAgLTAsMCAmIzQzOzEsMTIyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGhlbHBlcnMsIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZAomIzQzOyAqIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcigpLCB3aGljaCB0aGUga2h1Z2VwYWdlZCBtVEhQIGNhc2VzIHVzZSB0byBkZXRlY3QKJiM0MzsgKiBjb2xsYXBzZSByZXN1bHRzLiAgRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0CiYjNDM7ICogbWVtb3J5IGluIHdpdGggb25seSB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHJlcXVpcmUgdGhlIGhlbHBlcnMgdG8gcmVwb3J0CiYjNDM7ICogZXhhY3RseSB0aGF0IG9yZGVyLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0UKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7a3NlbGZ0ZXN0LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dm1fdXRpbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmgmIzM0OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZDsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7CiYjNDM7CiYjNDM7c3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlzaXplX3QgbGVuID0gc2l6ZSAqIDI7CiYjNDM7CWNoYXIgKnAsICphbGlnbmVkOwomIzQzOwomIzQzOwlwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkmIzM0Oyk7CiYjNDM7CiYjNDM7CWFsaWduZWQgPSAoY2hhciAqKUFMSUdOKCh1aW50cHRyX3QpcCwgc2l6ZSk7CiYjNDM7CWlmIChhbGlnbmVkICE9IHApCiYjNDM7CQltdW5tYXAocCwgYWxpZ25lZCAtIHApOwomIzQzOwlpZiAoYWxpZ25lZCAmIzQzOyBzaXplICE9IHAgJiM0MzsgbGVuKQomIzQzOwkJbXVubWFwKGFsaWduZWQgJiM0Mzsgc2l6ZSwgcCAmIzQzOyBsZW4gLSBhbGlnbmVkIC0gc2l6ZSk7CiYjNDM7CiYjNDM7CXJldHVybiBhbGlnbmVkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CXNpemVfdCBzaXplID0gcHNpemUoKSAmbHQ7Jmx0OyBvcmRlcjsKJiM0MzsJYm9vbCBvayA9IHRydWU7CiYjNDM7CWNoYXIgKnA7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlpZiAob3JkZXIpCiYjNDM7CQlzZXR0aW5ncy5odWdlcGFnZXNbb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTOwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJcCA9IGFsbG9jX2FsaWduZWQoc2l6ZSk7CiYjNDM7CSpwID0gMTsKJiM0MzsKJiM0MzsJaWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgb3JkZXIsIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O29yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxuJiMzNDssIG9yZGVyKTsKJiM0MzsJCW9rID0gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyICovCiYjNDM7CWlmIChvcmRlciAmYW1wOyZhbXA7IGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBzaXplLCBvcmRlciAtIDEsCiYjNDM7CQkJCQkgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXG4mIzM0OywKJiM0MzsJCQkgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7CiYjNDM7CQlvayA9IGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEEgbGFyZ2UgZm9saW8gbXVzdCBub3QgcGFzcyBhcyBvcmRlciAwICovCiYjNDM7CWlmIChvcmRlciAmYW1wOyZhbXA7IGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBzaXplLCAwLAomIzQzOwkJCQkJICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7b3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAwXG4mIzM0Oywgb3JkZXIpOwomIzQzOwkJb2sgPSBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwltdW5tYXAocCwgc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdChvaywgJiMzNDtvcmRlciAlZCBjbGFzc2lmaWVkXG4mIzM0Oywgb3JkZXIpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJdW5zaWduZWQgbG9uZyBvcmRlcnM7CiYjNDM7CWludCBvcmRlcjsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9oZWFkZXIoKTsKJiM0MzsKJiM0MzsJaWYgKCF0aHBfYXZhaWxhYmxlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXBhZ2VtYXBfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKHBhZ2VtYXBfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApJiMzNDspOwomIzQzOwlrcGFnZWZsYWdzX2ZkID0gb3BlbigmIzM0Oy9wcm9jL2twYWdlZmxhZ3MmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAoa3BhZ2VmbGFnc19mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O29wZW4oL3Byb2Mva3BhZ2VmbGFncykgcmVxdWlyZXMgcm9vdFxuJiMzNDspOwomIzQzOwomIzQzOwlvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpOwomIzQzOwlpZiAoIW9yZGVycykKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7Tm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbihfX2J1aWx0aW5fcG9wY291bnRsKG9yZGVycykgJiM0MzsgMSk7CiYjNDM7CiYjNDM7CXRocF9zYXZlX3NldHRpbmdzKCk7CiYjNDM7CXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwkvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQgKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWNoZWNrX29yZGVyKDApOwomIzQzOwlmb3IgKG9yZGVyID0gMTsgb3JkZXIgJmx0OyBOUl9PUkRFUlM7IG9yZGVyJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKCEob3JkZXJzICZhbXA7ICgxVUwgJmx0OyZsdDsgb3JkZXIpKSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWNoZWNrX29yZGVyKG9yZGVyKTsKJiM0MzsJfQomIzQzOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYwppbmRleCBlMjY0MmVjYTBkMDJiLi5kZjQyNmY5MjE4ZTcxIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYwpAQCAtNjUsNyAmIzQzOzY1LDYgQEAgZW51bSB7CiAjZGVmaW5lIEhNTV9QQVRIX01BWCAgICA2NAogI2RlZmluZSBOVElNRVMJCTEwCiAKLSNkZWZpbmUgQUxJR04oeCwgYSkgKCgoeCkgJiM0MzsgKGEgLSAxKSkgJmFtcDsgKH4oKGEpIC0gMSkpKQogLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi8KIAogI2lmbmRlZiBGT0xMX1dSSVRFCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYwppbmRleCBkNzkxN2RjZTNhYmFjLi5jYTczZjlhYzhlOWI2IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMKQEAgLTE4Myw2ICYjNDM7MTgzLDEzIEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpCiAJfQogfQogCiYjNDM7LyogQSBzdG9yZSB0byBlaXRoZXIgc2xlZXAga25vYiB3YWtlcyBraHVnZXBhZ2VkLCBzbyB3cml0ZSBvbmx5IG9uIGNoYW5nZSAqLwomIzQzO3N0YXRpYyB2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKQomIzQzO3sKJiM0MzsJaWYgKHRocF9yZWFkX251bShuYW1lKSAhPSBudW0pCiYjNDM7CQl0aHBfd3JpdGVfbnVtKG5hbWUsIG51bSk7CiYjNDM7fQomIzQzOwogdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpCiB7CiAJc3RydWN0IGtodWdlcGFnZWRfc2V0dGluZ3MgKmtodWdlcGFnZWQgPSAmYW1wO3NldHRpbmdzLSZndDtraHVnZXBhZ2VkOwpAQCAtMTk4LDE1ICYjNDM7MjA1LDE1IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCQkJc2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLSZndDtzaG1lbV9lbmFibGVkXSk7CiAJdGhwX3dyaXRlX251bSgmIzM0O3VzZV96ZXJvX3BhZ2UmIzM0Oywgc2V0dGluZ3MtJmd0O3VzZV96ZXJvX3BhZ2UpOwogCi0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvZGVmcmFnJiMzNDssIGtodWdlcGFnZWQtJmd0O2RlZnJhZyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzJiMzNDssCi0JCQlraHVnZXBhZ2VkLSZndDthbGxvY19zbGVlcF9taWxsaXNlY3MpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDssCi0JCQlraHVnZXBhZ2VkLSZndDtzY2FuX3NsZWVwX21pbGxpc2Vjcyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZSYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19ub25lKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3N3YXApOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZCYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19zaGFyZWQpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW4mIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7cGFnZXNfdG9fc2Nhbik7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWcmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7ZGVmcmFnKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJICAgICAgIGtodWdlcGFnZWQtJmd0O2FsbG9jX3NsZWVwX21pbGxpc2Vjcyk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJICAgICAgIGtodWdlcGFnZWQtJmd0O3NjYW5fc2xlZXBfbWlsbGlzZWNzKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX25vbmUmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfbm9uZSk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3N3YXApOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3NoYXJlZCk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9wYWdlc190b19zY2FuJiMzNDssIGtodWdlcGFnZWQtJmd0O3BhZ2VzX3RvX3NjYW4pOwogCiAJaWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pCiAJCXdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy0mZ3Q7cmVhZF9haGVhZF9rYik7CkBAIC0yMzAsNiAmIzQzOzIzNyw0MSBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncykKIAl9CiB9CiAKJiM0MzsvKgomIzQzOyAqIFdhaXQgZm9yIGEgZnVsbCBraHVnZXBhZ2VkIHNjYW4gcGFzcyB0aGF0IHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsOiB0aGUKJiM0MzsgKiBwYXNzIGluIHByb2dyZXNzIG1heSBhbHJlYWR5IGhhdmUgcGFzc2VkIHRoaXMgbW0sIHNvIGZ1bGxfc2NhbnMgaGFzIHRvCiYjNDM7ICogYWR2YW5jZSB0d2ljZS4KJiM0MzsgKgomIzQzOyAqIEEgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYnV0IG9uZSBtYWRlIHdoaWxlIGl0CiYjNDM7ICogaXMgc2Nhbm5pbmcgcmF0aGVyIHRoYW4gc2xlZXBpbmcgaXMgbG9zdCwgc28ga2VlcCBzdG9yaW5nIHVudGlsIHRoZSBwYXNzCiYjNDM7ICogbGFuZHMuCiYjNDM7ICoKJiM0MzsgKiBPbmUgd2FrZSBpcyBvbmUgcGFzcyBvbmx5IGlmIHBhZ2VzX3RvX3NjYW4gY292ZXJzIGV2ZXJ5IG1tIG9uIHRoZSBsaXN0LgomIzQzOyAqLwomIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZWxhcHNlZF9tcyA9IDAsIHBvbGxfbXMgPSAxMDsKJiM0MzsJdW5zaWduZWQgbG9uZyBzbGVlcF9tczsKJiM0MzsJaW50IHBhc3M7CiYjNDM7CiYjNDM7CXNsZWVwX21zID0gdGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7KTsKJiM0MzsJZm9yIChwYXNzID0gMDsgcGFzcyAmbHQ7IDI7IHBhc3MmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHRhcmdldCA9CiYjNDM7CQkJdGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICYjNDM7IDE7CiYjNDM7CiYjNDM7CQl3aGlsZSAodGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICZsdDsgdGFyZ2V0KSB7CiYjNDM7CQkJaWYgKGVsYXBzZWRfbXMgJmd0Oz0gZGVhZGxpbmVfbXMpCiYjNDM7CQkJCXJldHVybiBmYWxzZTsKJiM0MzsJCQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJCQkgICAgICBzbGVlcF9tcyk7CiYjNDM7CQkJdXNsZWVwKHBvbGxfbXMgKiAxMDAwKTsKJiM0MzsJCQllbGFwc2VkX21zICYjNDM7PSBwb2xsX21zOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpCiB7CiAJaWYgKCFzZXR0aW5nc19pbmRleCkgewpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmgKaW5kZXggNzI2YzczYzQzYzA1Yi4uMmVhMTY5ZDExNzk2MiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oCkBAIC04MywxMCAmIzQzOzgzLDIxIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB0aHBfc2F2ZV9zZXR0aW5ncyh2b2lkKQogCWh1Z2VwYWdlX3NhdmVfc2V0dGluZ3MoLyogdGhwID0gKi8gdHJ1ZSwgLyogaHVnZXRsYiA9ICovIGZhbHNlKTsKIH0KIAomIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcyk7CiYjNDM7CiB2b2lkIHRocF9zZXRfcmVhZF9haGVhZF9wYXRoKGNoYXIgKnBhdGgpOwogdW5zaWduZWQgbG9uZyB0aHBfc3VwcG9ydGVkX29yZGVycyh2b2lkKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7CiAKJiM0MzsvKgomIzQzOyAqIFRoZSBwZXItb3JkZXIgc2htZW1fZW5hYmxlZCBhdHRyaWJ1dGUgaXMgY3JlYXRlZCBmb3IgdGhlIG9yZGVycyB0aGUgcGFnZQomIzQzOyAqIGNhY2hlIGNhbiBob2xkLCBub3QganVzdCBmb3Igc2htZW0sIHNvIGl0IGFuc3dlcnMgZm9yIHJlZ3VsYXIgZmlsZXMgdG9vLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfZmlsZV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnMoKTsKJiM0Mzt9CiYjNDM7CiBib29sIHRocF9hdmFpbGFibGUodm9pZCk7CiBib29sIHRocF9pc19lbmFibGVkKHZvaWQpOwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMKaW5kZXggZjgyNjczZjVmNmI0Ny4uMzM1Zjk0NmVjYTYxZSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYwpAQCAtMzEsNiAmIzQzOzMxLDExIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yOwogc3RhdGljIGludCBhbm9uX29yZGVyOwogc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcjsKJiM0MztzdGF0aWMgYm9vbCBjb2xsYXBzZV9vcmRlcl9zZXQ7CiYjNDM7c3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTsKJiM0MztzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVyczsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTsKIAogI2RlZmluZSBQSURfU01BUFMgJiMzNDsvcHJvYy9zZWxmL3NtYXBzJiMzNDsKICNkZWZpbmUgVEVTVF9GSUxFICYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlJiMzNDsKQEAgLTIyMCw2ICYjNDM7MjI1LDI5IEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogCXJldHVybiBzd2FwOwogfQogCiYjNDM7c3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJLyoga2VlcCBraHVnZXBhZ2VkIGZyb20gY29sbGFwc2luZyB0aGUgcmFuZ2UgYW5kIHN3YXBwaW5nIGl0IGJhY2sgaW4gKi8KJiM0MzsJaWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9OT0hVR0VQQUdFKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21hZHZpc2UoTUFEVl9OT0hVR0VQQUdFKSYjMzQ7KTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogUmV0cnkgc2V2ZXJhbCB0aW1lcyBiZWNhdXNlIE1BRFZfUEFHRU9VVCBpcyBiZXN0IGVmZm9ydC4gIFNsZWVwCiYjNDM7CSAqIGJldHdlZW4gdGhlIHJldHJpZXMgdG8gZ2l2ZSBvdXRzdGFuZGluZyB3cml0ZWJhY2sgYSBjaGFuY2UgdG8KJiM0MzsJICogZmluaXNoLgomIzQzOwkgKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDQwOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9QQUdFT1VUKSkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7CiYjNDM7CQlpZiAoY2hlY2tfc3dhcChwLCBzaXplKSkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCXVzbGVlcCg1MCAqIDEwMDApOwomIzQzOwl9CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCAqYWxsb2NfbWFwcGluZyhpbnQgbnIpCiB7CiAJdm9pZCAqcDsKQEAgLTUxMCw4ICYjNDM7NTM4LDggQEAgc3RhdGljIGJvb2wgaXNfYW5vbihzdHJ1Y3QgbWVtX29wcyAqb3BzKQogc3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcywKIAkJCSAgICAgICBzdHJ1Y3QgbWVtX29wcyAqb3BzLCBib29sIGV4cGVjdCkKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTsKJiM0MzsJaW50IHJldCwgaTsKIAogCWtzZnRfcHJpbnRfbXNnKCYjMzQ7JXMuLi4mIzM0OywgbXNnKTsKIApAQCAtNTI0LDkgJiM0Mzs1NTIsMTYgQEAgc3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcywKIAkvKgogCSAqIFByZXZlbnQga2h1Z2VwYWdlZCBpbnRlcmZlcmVuY2UgYW5kIHRlc3RzIHRoYXQgTUFEVl9DT0xMQVBTRQogCSAqIGlnbm9yZXMgL3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvZW5hYmxlZAomIzQzOwkgKgomIzQzOwkgKiAmIzM0O2luaGVyaXQmIzM0OyByYXRoZXIgdGhhbiAmIzM0O25ldmVyJiMzNDsgc28gdGhhdCBNQURWX0NPTExBUFNFIG9uIHNobWVtIHN0aWxsCiYjNDM7CSAqIGZpbmRzIGFuIG9yZGVyIHRvIGJ1aWxkLgogCSAqLwogCXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSOwogCXNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5SX09SREVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7CiYjNDM7CQlzZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFNITUVNX0lOSEVSSVQ7CiYjNDM7CX0KIAl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKIAogCS8qIENsZWFyIFZNX05PSFVHRVBBR0UgKi8KQEAgLTU1Niw4ICYjNDM7NTkxLDExIEBAIHN0YXRpYyBib29sIHdhaXRfZm9yX3NjYW4oY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBzaXplX3QgbGVuLAogCQlpbnQgbnJfaHBhZ2VzLCBpbnQgY29sbGFwX29yZGVyLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKQogewogCXVuc2lnbmVkIGxvbmcgaHBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZSAmbHQ7Jmx0OyBjb2xsYXBfb3JkZXI7Ci0JaW50IGZ1bGxfc2NhbnM7Ci0JaW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi8KJiM0MzsJdW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3NpemU7CiYjNDM7CWludCB0aW1lb3V0LCBmdWxsX3NjYW5zOwomIzQzOwomIzQzOwkvKiBIYWxmLXNlY29uZCB0aWNrczogdGhyZWUgc2Vjb25kcyBmbG9vciwgcGx1cyBhIHNlY29uZCBwZXIgMTI4TSAqLwomIzQzOwl0aW1lb3V0ID0gNiAmIzQzOyAyICogKGJ5dGVzIC8gKDEyOFVMICZsdDsmbHQ7IDIwKSk7CiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAoIW9wcy0mZ3Q7Y2hlY2tfaHVnZShwLCBsZW4sIDAsIGhwYWdlX3NpemUpKQpAQCAtODIwLDEyICYjNDM7ODU4LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wCiAJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0O1N3YXBvdXQgb25lIHBhZ2UuLi4mIzM0Oyk7Ci0JaWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgcGFnZV9zaXplKSkgewomIzQzOwlpZiAoc3dhcG91dF9yYW5nZShwLCBwYWdlX3NpemUpKSB7CiAJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAl9IGVsc2UgewotCQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtODQ2LDEyICYjNDM7ODgyLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvCiAJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0O1N3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi4mIzM0OywgbWF4X3B0ZXNfc3dhcCAmIzQzOyAxLCBocGFnZV9wbWRfbnIpOwotCWlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgJiM0MzsgMSkgKiBwYWdlX3NpemUpKSB7CiYjNDM7CWlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkgewogCQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiAJfSBlbHNlIHsKLQkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CQlza2lwKCYjMzQ7Q291bGQgbm90IHN3YXAgb3V0JiMzNDspOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTg2MywxMiAmIzQzOzg5NywxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqbwogCQlvcHMtJmd0O2ZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKIAkJa3NmdF9wcmludF9tc2coJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uJiMzNDssIG1heF9wdGVzX3N3YXAsCiAJCSAgICAgICBocGFnZV9wbWRfbnIpOwotCQlpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpJiMzNDspOwotCQlpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkgewomIzQzOwkJaWYgKHN3YXBvdXRfcmFuZ2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHsKIAkJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAkJfSBlbHNlIHsKLQkJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwkJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC05MzUsNiAmIzQzOzk2NywxNiBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb21wb3VuZF9leHRyZW1lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcwogCXZvaWQgKnA7CiAJaW50IGk7CiAKJiM0MzsJLyoKJiM0MzsJICogVGhpcyBuZWVkcyBocGFnZV9wbWRfbnIgUE1ELW9yZGVyIGFsbG9jYXRpb25zIGluIGEgcm93LCB3aGljaCB0aGUKJiM0MzsJICogYWxsb2NhdG9yIHdpbGwgbm90IHN1cHBseSBpZiB0aGUgUE1EIGlzIHZlcnkgbGFyZ2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoaHBhZ2VfcG1kX3NpemUgJmd0OyAoMzJVTCAmbHQ7Jmx0OyAyMCkpIHsKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHRfc2tpcCgmIzM0OyVzOiBQTUQgdG9vIGxhcmdlIGZvciBmYXVsdC10aW1lIFRIUCBjb25zdHJ1Y3Rpb25cbiYjMzQ7LAomIzQzOwkJCQkgICAgICBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKIAlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwogCWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcbiYjMzQ7KTsKIAlmb3IgKGkgPSAwOyBpICZsdDsgaHBhZ2VfcG1kX25yOyBpJiM0MzsmIzQzOykgewpAQCAtMTEyNSw2ICYjNDM7MTE2NywxMDMgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcwogCWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwogfQogCiYjNDM7LyoKJiM0MzsgKiBUaGUgcGFyZW50IHdyaXRlcyB0byB0aGUgZm9yay1zaGFyZWQgcmFuZ2UgdGhyb3VnaG91dCB0aGUgY2hpbGQmIzM5O3MKJiM0MzsgKiBjb2xsYXBzZS4gIENvVyBtdXN0IGtlZXAgdGhlIHR3byBhcGFydDogdGhlIGNoaWxkIHNlZXMgdGhlIHByZS1mb3JrCiYjNDM7ICogY29udGVudCwgdGhlIHBhcmVudCBvbmx5IGl0cyBvd24gd3JpdGVzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX2ZvcmtfY293X3JhY2Uoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwljb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7CiYjNDM7CWludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG47CiYjNDM7CXVuc2lnbmVkIGxvbmcgc2hhcmVkOwomIzQzOwl2b2xhdGlsZSBpbnQgKmlwOwomIzQzOwlwaWRfdCBjaGlsZDsKJiM0MzsJaW50IHN5bmNbMl07CiYjNDM7CWNoYXIgZ28gPSAxOwomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwkvKiBBdCBhIHBhZ2UgcGVyIDEwIG1zLCA2NCBwYWdlcyBzcHJlYWQgdGhlIHdyaXRlcyBhY3Jvc3MgdGhlIGNvbGxhcHNlICovCiYjNDM7CW4gPSA2NDsKJiM0MzsJc2hhcmVkID0gbiAqIHBhZ2Vfc2l6ZTsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJLyogU2hhcmVkIHByZWZpeCwgd2l0aCB0aGUgcHJlLWZvcmsgcGF0dGVybiAqLwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIDAsIHNoYXJlZCk7CiYjNDM7CWlmIChwaXBlKHN5bmMpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7cGlwZSgpJiMzNDspOwomIzQzOwomIzQzOwkvKiBBIHZvbGF0aWxlIHBvaW50ZXIgc28gdGhlIHN0b3JlcyBhcmUgbm90IG1lcmdlZCBvciBkcm9wcGVkICovCiYjNDM7CWlwID0gcDsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLiYjMzQ7KTsKJiM0MzsJY2hpbGQgPSBmb3JrKCk7CiYjNDM7CWlmICghY2hpbGQpIHsKJiM0MzsJCWludCBjb2xsYXBzZV9zdGF0dXM7CiYjNDM7CiYjNDM7CQljbG9zZShzeW5jWzBdKTsKJiM0MzsJCS8qIFByaXZhdGUgcmVtYWluZGVyICovCiYjNDM7CQlvcHMtJmd0O2ZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJLyogU3RhcnQgdGhlIHBhcmVudCB1bnNoYXJpbmcsIGFuZCBnaXZlIGl0IGEgaGVhZCBzdGFydCAqLwomIzQzOwkJaWYgKHdyaXRlKHN5bmNbMV0sICZhbXA7Z28sIDEpICE9IDEpCiYjNDM7CQkJX2V4aXQoS1NGVF9GQUlMKTsKJiM0MzsJCXVzbGVlcCg1MDAwKTsKJiM0MzsJCWMtJmd0O2NvbGxhcHNlKCYjMzQ7Q29sbGFwc2UgYSByYW5nZSB0aGUgcGFyZW50IGlzIHdyaXRpbmcgdG8mIzM0OywKJiM0MzsJCQkgICAgcCwgMSwgb3BzLCB0cnVlKTsKJiM0MzsJCWNvbGxhcHNlX3N0YXR1cyA9IGV4aXRfc3RhdHVzOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJCWlmIChpcFtpICogc3RyaWRlXSAhPSBpICYjNDM7IDB4ZGVhZDAwMDApCiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJaWYgKGkgPT0gbikKJiM0MzsJCQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJZmFpbCgmIzM0O0ZhaWw6IGNoaWxkIGNvbnRlbnQmIzM0Oyk7CiYjNDM7CQkvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlICovCiYjNDM7CQlpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKQomIzQzOwkJCWV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzOwomIzQzOwkJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJX2V4aXQoZXhpdF9zdGF0dXMpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWNsb3NlKHN5bmNbMV0pOwomIzQzOwlpZiAocmVhZChzeW5jWzBdLCAmYW1wO2dvLCAxKSAhPSAxKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7Y2hpbGQgbmV2ZXIgcmVhY2hlZCB0aGUgY29sbGFwc2VcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5zaGFyZSBvbmUgcGFnZSBhdCBhIHRpbWU6IGEgYnVyc3Qgd291bGQgYnJlYWsgQ29XIG9uIHRoZSB3aG9sZQomIzQzOwkgKiByYW5nZSBiZWZvcmUgdGhlIGNvbGxhcHNlIHN0YXJ0cywgbGVhdmluZyBub3RoaW5nIHNoYXJlZCB0byBjb2xsYXBzZS4KJiM0MzsJICovCiYjNDM7CWkgPSAwOwomIzQzOwlmb3IgKDs7KSB7CiYjNDM7CQlpZiAoaSAmbHQ7IG4pCiYjNDM7CQkJaXBbaSAqIHN0cmlkZV0gPSBpICYjNDM7IDB4YmVlZjAwMDA7CiYjNDM7CQlpJiM0MzsmIzQzOzsKJiM0MzsJCXVzbGVlcCgxMCAqIDEwMDApOwomIzQzOwkJaWYgKHdhaXRwaWQoY2hpbGQsICZhbXA7d3N0YXR1cywgV05PSEFORykpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogRmluaXNoIHdoYXRldmVyIHRoZSBwYWNlZCBzd2VlcCBkaWQgbm90IHJlYWNoICovCiYjNDM7CWZvciAoOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspCiYjNDM7CQlpcFtpICogc3RyaWRlXSA9IGkgJiM0MzsgMHhiZWVmMDAwMDsKJiM0MzsJLyogQSBjaGlsZCB0aGF0IGRpZWQgcmVhZGluZyB0aGUgcmFjaW5nIHBhZ2VzIGlzIGEgZmFpbHVyZSwgbm90IGEgemVybyAqLwomIzQzOwljaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDaGVjayB0aGUgcGFyZW50IHNlZXMgb25seSBpdHMgb3duIHdyaXRlcy4uLiYjMzQ7KTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgJiM0MzsgMHhiZWVmMDAwMCkKJiM0MzsJCQlicmVhazsKJiM0MzsJaWYgKGkgPT0gbikKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWw6IHBhcmVudCBjb250ZW50JiMzNDspOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CS8qIFRoZSBwYXJlbnQmIzM5O3MgY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQmIzM5O3MgdmVyZGljdCAqLwomIzQzOwlpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKQomIzQzOwkJZXhpdF9zdGF0dXMgPSBjaGlsZF9zdGF0dXM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKIAkJCQkJICAgc3RydWN0IG1lbV9vcHMgKm9wcykKIHsKQEAgLTExNzAsNiAmIzQzOzEzMDksMjAwIEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAogCWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwogfQogCiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlICovCiYjNDM7I2RlZmluZSBNSU5fTVRIUF9PUkRFUiAyCiYjNDM7CiYjNDM7LyogVGltZSBidWRnZXQgZm9yIG9uZSBraHVnZXBhZ2VkIHBhc3MgaW4gdGhlIGNvbGxhcHNlX29yZGVyXyogY2FzZXMgKi8KJiM0MzsjZGVmaW5lIE1USFBfUEFTU19USU1FT1VUX1MgMzAKJiM0MzsKJiM0MztzdGF0aWMgc2l6ZV90IG10aHBfd2luZG93X3NpemUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBwYWdlX3NpemUgJmx0OyZsdDsgY29sbGFwc2Vfb3JkZXI7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIG10aHBfcHVzaF90YXJnZXRfb3JkZXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE9ubHkgdGhlIHRhcmdldCBvcmRlciwgYW5kIG9ubHkgZm9yIG1hZHZpc2U6IHRoZSBjYXNlcyBmYXVsdCB0aGVpcgomIzQzOwkgKiByZWdpb24gZmlyc3QsIHNvIHRoZSBzb3VyY2VzIHN0YXkgb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCBmb3IuCiYjNDM7CSAqLwomIzQzOwlzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9ORVZFUjsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5SX09SREVSUzsgaSYjNDM7JiM0MzspCiYjNDM7CQlzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjsKJiM0MzsJc2V0dGluZ3MuaHVnZXBhZ2VzW2NvbGxhcHNlX29yZGVyXS5lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBhbGxfd2luZG93c19hdF9vcmRlcih2b2lkICpwLCBzaXplX3QgbGVuKQomIzQzO3sKJiM0MzsJcmV0dXJuIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBsZW4sIGNvbGxhcHNlX29yZGVyLAomIzQzOwkJCQkJcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGFueV93aW5kb3dfYXRfb3JkZXIodm9pZCAqcCwgc2l6ZV90IGxlbikKJiM0Mzt7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7CiYjNDM7CWNoYXIgKmFkZHIgPSBwOwomIzQzOwomIzQzOwlmb3IgKDsgbGVuICZndDs9IHdpbmRvdzsgYWRkciAmIzQzOz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7CiYjNDM7CQlpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIoYWRkciwgd2luZG93KSkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7CiYjNDM7CXZvaWQgKnA7CiYjNDM7CiYjNDM7CW10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpOwomIzQzOwlpZiAoYW55X3dpbmRvd19hdF9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWlmIChtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSkmIzM0Oyk7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi4mIzM0Oyk7CiYjNDM7CWlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCAmIzQzOyB3aW5kb3csIHdpbmRvdykgJmFtcDsmYW1wOwomIzQzOwkJICFhbnlfd2luZG93X2F0X29yZGVyKHAsIHdpbmRvdykgJmFtcDsmYW1wOwomIzQzOwkJICFhbnlfd2luZG93X2F0X29yZGVyKHAgJiM0MzsgMiAqIHdpbmRvdywKJiM0MzsJCQkJICAgICAgaHBhZ2VfcG1kX3NpemUgLSAyICogd2luZG93KSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCB3aW5kb3csIDIgKiB3aW5kb3cpOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAomIzQzOwkJCQkJICBzdHJ1Y3QgbWVtX29wcyAqb3BzKQomIzQzO3sKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIDAsIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJaWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX0hVR0VQQUdFKSYjMzQ7KTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSB3aW5kb3cgd2l0aCBzaW5nbGUgUFRFIGVudHJ5IHByZXNlbnQuLi4mIzM0Oyk7CiYjNDM7CWlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgbXRocF93aW5kb3dfc2l6ZSgpKSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCBwYWdlX3NpemUpOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7CiYjNDM7CXZvaWQgKnA7CiYjNDM7CiYjNDM7CW10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTsKJiM0MzsJc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJaWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX0hVR0VQQUdFKSYjMzQ7KTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi4mIzM0Oyk7CiYjNDM7CWlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgd2luZG93KSAmYW1wOyZhbXA7CiYjNDM7CQkgIWFueV93aW5kb3dfYXRfb3JkZXIocCAmIzQzOyB3aW5kb3csIHdpbmRvdykpCiYjNDM7CQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwomIzQzOwl2YWxpZGF0ZV9tZW1vcnkocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAomIzQzOwkJCQkJIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwlpbnQgc291cmNlX29yZGVyID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgOiBNSU5fTVRIUF9PUkRFUjsKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJaWYgKHNvdXJjZV9vcmRlciAmZ3Q7PSBjb2xsYXBzZV9vcmRlciB8fAomIzQzOwkgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgc291cmNlX29yZGVyKSkpIHsKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHRfc2tpcCgmIzM0OyVzOiBubyBzdXBwb3J0ZWQgc291cmNlIG9yZGVyIGJlbG93IHRhcmdldFxuJiMzNDssCiYjNDM7CQkJCSAgICAgIF9fZnVuY19fKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwltdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7CiYjNDM7CiYjNDM7CXNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CXNldHRpbmdzLmh1Z2VwYWdlc1tzb3VyY2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTOwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIGFsbG9jYXRvciBjYW4gZmFsbCBiYWNrIHRvIHNtYWxsZXIgZm9saW9zIHVuZGVyIGZyYWdtZW50YXRpb247CiYjNDM7CSAqIGhhdmluZyBub3RoaW5nIHRvIGNvbGxhcHNlIGZyb20gaXMgbm90IGEgZmFpbHVyZS4KJiM0MzsJICovCiYjNDM7CWlmICghaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsCiYjNDM7CQkJCSAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O05vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi4mIzM0Oywgc291cmNlX29yZGVyKTsKJiM0MzsJCXNraXAoJiMzNDtTa2lwJiMzNDspOwomIzQzOwkJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX0hVR0VQQUdFKSYjMzQ7KTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi4mIzM0OywKJiM0MzsJCSAgICAgICBzb3VyY2Vfb3JkZXIpOwomIzQzOwlpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKE1USFBfUEFTU19USU1FT1VUX1MpKQomIzQzOwkJZmFpbCgmIzM0O1RpbWVvdXQmIzM0Oyk7CiYjNDM7CWVsc2UgaWYgKGFsbF93aW5kb3dzX2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQogewogCWZwcmludGYoc3RkZXJyLCAmIzM0O1xuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gJmx0O3Rlc3QgdHlwZSZndDsgW2Rpcl1cblxuJiMzNDspOwpAQCAtMTE4NywxMSAmIzQzOzE1MjAsMTQgQEAgc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKIAlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0LXM6IG1USFAgc2l6ZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXG4mIzM0Oyk7CiAJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBEZWZhdWx0cyB0byAwLiBVc2UgdGhpcyBzaXplIGZvciBhbm9uIG9yIHNobWVtIGFsbG9jYXRpb25zLlxuJiMzNDspOwogCWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQtYzogY29sbGFwc2Ugb3JkZXIgZm9yIG1USFAgY29sbGFwc2UsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxuJiMzNDspOwomIzQzOwlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0ICAgIERlZmF1bHRzIHRvIGV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBiZWxvdyB0aGUgUE1ELlxuJiMzNDspOwomIzQzOwlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0ICAgIC1zLCBpZiBzZXQsIGlzIHRoZSBzb3VyY2Ugb3JkZXIgZm9yIHRoZSBtaXhlZC1zb3VyY2UgY2FzZS5cbiYjMzQ7KTsKIAlleGl0KDEpOwogfQogCiBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewomIzQzOwlib29sIG10aHBfY29udGV4dF9pbXBsaWVkID0gZmFsc2U7CiAJaW50IG9wdDsKIAljaGFyICpidWY7CiAJY29uc3QgY2hhciAqdG9rZW47CkBAIC0xMjAzLDYgJiM0MzsxNTM5LDcgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7YyYjMzk7OgogCQkJY29sbGFwc2Vfb3JkZXIgPSBhdG9pKG9wdGFyZyk7CiYjNDM7CQkJY29sbGFwc2Vfb3JkZXJfc2V0ID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7aCYjMzk7OgogCQlkZWZhdWx0OgpAQCAtMTIxMCwxMiAmIzQzOzE1NDcsMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJfQogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyCiYjNDM7CSAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGFub25fb3JkZXIgJmx0OyAwIHx8IGFub25fb3JkZXIgJmd0OyBocGFnZV9wbWRfb3JkZXIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXG4mIzM0OywKJiM0MzsJCQkJICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTsKJiM0MzsJaWYgKGNvbGxhcHNlX29yZGVyX3NldCAmYW1wOyZhbXA7CiYjNDM7CSAgICAoY29sbGFwc2Vfb3JkZXIgJmx0Oz0gMCB8fCBjb2xsYXBzZV9vcmRlciAmZ3Q7PSBocGFnZV9wbWRfb3JkZXIpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7LWMgdGFrZXMgYW4gb3JkZXIgaW4gMS4uJWQsIG5vdCAlZFxuJiMzNDssCiYjNDM7CQkJCSAgIGhwYWdlX3BtZF9vcmRlciAtIDEsIGNvbGxhcHNlX29yZGVyKTsKJiM0MzsKIAlhcmd2ICYjNDM7PSBvcHRpbmQ7CiAJYXJnYyAtPSBvcHRpbmQ7CiAKIAlpZiAoYXJnYyA9PSAwKSB7Ci0JCS8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiYjNDM7CQkvKiBObyBhcmd1bWVudHM6IGFub24gdW5kZXIgZXZlcnkgY29udGV4dCAqLwogCQlraHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX2todWdlcGFnZWRfY29udGV4dDsKJiM0MzsJCW10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gICZhbXA7X19tdGhwX2todWdlcGFnZWRfY29udGV4dDsKIAkJbWFkdmlzZV9jb250ZXh0ID0gICZhbXA7X19tYWR2aXNlX2NvbnRleHQ7CiAJCWFub25fb3BzID0gJmFtcDtfX2Fub25fb3BzOwogCQlyZXR1cm47CkBAIC0xMjI2LDEzICYjNDM7MTU3NiwxNCBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCiAJaWYgKCFzdHJjbXAodG9rZW4sICYjMzQ7YWxsJiMzNDspKSB7CiAJCWtodWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fa2h1Z2VwYWdlZF9jb250ZXh0OwomIzQzOwkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0OwogCQltYWR2aXNlX2NvbnRleHQgPSAgJmFtcDtfX21hZHZpc2VfY29udGV4dDsKJiM0MzsJCS8qIFRoZSBtVEhQIGNvbnRleHQgaGFzIG9ubHkgYW5vbiBjYXNlczsgbGV0IG90aGVyIG1lbV90eXBlcyBkcm9wIGl0ICovCiYjNDM7CQltdGhwX2NvbnRleHRfaW1wbGllZCA9IHRydWU7CiAJfSBlbHNlIGlmICghc3RyY21wKHRva2VuLCAmIzM0O2todWdlcGFnZWQmIzM0OykpIHsKIAkJa2h1Z2VwYWdlZF9jb250ZXh0ID0gICZhbXA7X19raHVnZXBhZ2VkX2NvbnRleHQ7CiAJfSBlbHNlIGlmICghc3RyY21wKHRva2VuLCAmIzM0O210aHBfa2h1Z2VwYWdlZCYjMzQ7KSkgewogCQltdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7Ci0JCWlmIChjb2xsYXBzZV9vcmRlciAmbHQ7PSAwIHx8IGNvbGxhcHNlX29yZGVyICZndDs9IGhwYWdlX3BtZF9vcmRlcikKLQkJCXVzYWdlKCk7CiAJfSBlbHNlIGlmICghc3RyY21wKHRva2VuLCAmIzM0O21hZHZpc2UmIzM0OykpIHsKIAkJbWFkdmlzZV9jb250ZXh0ID0gICZhbXA7X19tYWR2aXNlX2NvbnRleHQ7CiAJfSBlbHNlIHsKQEAgLTEyNDgsMjAgJiM0MzsxNTk5LDIwIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCXJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgJmFtcDtfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7CiAJCWFub25fb3BzID0gJmFtcDtfX2Fub25fb3BzOwogCQlzaG1lbV9vcHMgPSAmYW1wO19fc2htZW1fb3BzOwotCQlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpCi0JCQl1c2FnZSgpOwogCX0gZWxzZSBpZiAoIXN0cmNtcChidWYsICYjMzQ7YW5vbiYjMzQ7KSkgewogCQlhbm9uX29wcyA9ICZhbXA7X19hbm9uX29wczsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAmIzM0O2ZpbGUmIzM0OykpIHsKIAkJcmVhZF9vbmx5X2ZpbGVfb3BzID0gICZhbXA7X19yZWFkX29ubHlfZmlsZV9vcHM7CiAJCXJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9ICAmYW1wO19fcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzOwogCQlyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gICZhbXA7X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzOwotCQlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpCiYjNDM7CQlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgJmFtcDsmYW1wOyAhbXRocF9jb250ZXh0X2ltcGxpZWQpCiAJCQl1c2FnZSgpOwomIzQzOwkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMOwogCX0gZWxzZSBpZiAoIXN0cmNtcChidWYsICYjMzQ7c2htZW0mIzM0OykpIHsKIAkJc2htZW1fb3BzID0gJmFtcDtfX3NobWVtX29wczsKLQkJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KQomIzQzOwkJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ICZhbXA7JmFtcDsgIW10aHBfY29udGV4dF9pbXBsaWVkKQogCQkJdXNhZ2UoKTsKJiM0MzsJCW10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gTlVMTDsKIAl9IGVsc2UgewogCQl1c2FnZSgpOwogCX0KQEAgLTEyODMsOSAmIzQzOzE2MzQsMTAgQEAgc3RydWN0IHRlc3RfY2FzZSB7CiAJc3RydWN0IG1lbV9vcHMgKm9wczsKIAljb25zdCBjaGFyICpkZXNjOwogCXRlc3RfZm4gZm47CiYjNDM7CWludCBvcmRlcjsJCS8qIG1USFAgY29udGV4dHM6IHRoZSBjb2xsYXBzZSBvcmRlciAqLwogfTsKIAotI2RlZmluZSBNQVhfVEVTVF9DQVNFUyA2NAomIzQzOyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2CiBzdGF0aWMgc3RydWN0IHRlc3RfY2FzZSB0ZXN0X2Nhc2VzW01BWF9URVNUX0NBU0VTXTsKIHN0YXRpYyBpbnQgbnJfdGVzdF9jYXNlczsKIApAQCAtMTI5OCw2ICYjNDM7MTY1MCw3IEBAIHN0YXRpYyBpbnQgbnJfdGVzdF9jYXNlczsKIAkJCS5vcHMJPSBvLAkJCQkJXAogCQkJLmRlc2MJPSAjdCwJCQkJCVwKIAkJCS5mbgk9IHQsCQkJCQlcCiYjNDM7CQkJLm9yZGVyCT0gY29sbGFwc2Vfb3JkZXIsCQkJXAogCQl9OwkJCQkJCQlcCiAJfQkJCQkJCQkJXAogCX0gd2hpbGUgKDApCkBAIC0xMzM4LDggJiM0MzsxNjkxLDY2IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAogCXBhcnNlX3Rlc3RfdHlwZShhcmdjLCBhcmd2KTsKIAomIzQzOwlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgb3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTsKJiM0MzsKJiM0MzsJCWlmIChjb2xsYXBzZV9vcmRlcl9zZXQpIHsKJiM0MzsJCQlpZiAoIShvcmRlcnMgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBjb2xsYXBzZV9vcmRlcikpKQomIzQzOwkJCQlrc2Z0X2V4aXRfc2tpcCgmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxuJiMzNDssCiYjNDM7CQkJCQkgICAgICAgY29sbGFwc2Vfb3JkZXIpOwomIzQzOwkJCWlmIChjb2xsYXBzZV9vcmRlciAmbHQ7PSBhbm9uX29yZGVyKQomIzQzOwkJCQlrc2Z0X2V4aXRfc2tpcCgmIzM0Oy1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXG4mIzM0OywKJiM0MzsJCQkJCSAgICAgICBjb2xsYXBzZV9vcmRlciwgYW5vbl9vcmRlcik7CiYjNDM7CQkJY29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gY29sbGFwc2Vfb3JkZXI7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCS8qCiYjNDM7CQkJICogRXZlcnkgc3VwcG9ydGVkIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2U6IC1zIG1ha2VzIHRoZQomIzQzOwkJCSAqIGZhdWx0IHBhdGggaGFuZCBvdXQgZm9saW9zIG9mIHRoYXQgb3JkZXIsIHNvIGEgdGFyZ2V0CiYjNDM7CQkJICogYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2UuCiYjNDM7CQkJICovCiYjNDM7CQkJaW50IGZpcnN0ID0gYW5vbl9vcmRlciAmIzQzOyAxOwomIzQzOwomIzQzOwkJCWlmIChmaXJzdCAmbHQ7IE1JTl9NVEhQX09SREVSKQomIzQzOwkJCQlmaXJzdCA9IE1JTl9NVEhQX09SREVSOwomIzQzOwkJCWZvciAoaW50IGkgPSBmaXJzdDsgaSAmbHQ7IGhwYWdlX3BtZF9vcmRlcjsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQkJaWYgKG9yZGVycyAmYW1wOyAoMVVMICZsdDsmbHQ7IGkpKQomIzQzOwkJCQkJY29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gaTsKJiM0MzsJCQl9CiYjNDM7CQkJaWYgKCFucl9jb2xsYXBzZV9vcmRlcnMpCiYjNDM7CQkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7bVRIUCBjYXNlcyBza2lwcGVkOiBubyBvcmRlciBhYm92ZSB0aGUgc291cmNlXG4mIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7CiYjNDM7CQlwYWdlbWFwX2ZkID0gb3BlbigmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CQlpZiAocGFnZW1hcF9mZCAmbHQ7IDApCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApJiMzNDspOwomIzQzOwkJa3BhZ2VmbGFnc19mZCA9IG9wZW4oJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJCWlmIChrcGFnZWZsYWdzX2ZkICZsdDsgMCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDtvcGVuKC9wcm9jL2twYWdlZmxhZ3MpJiMzNDspOwomIzQzOwl9CiYjNDM7CiAJc2V0YnVmKHN0ZG91dCwgTlVMTCk7CiAKJiM0MzsJLyoKJiM0MzsJICogV2l0aG91dCBhIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvIHRoZSBrZXJuZWwgcmVmdXNlcyB0aGVzZQomIzQzOwkgKiBjb2xsYXBzZXMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gdGVzdC4KJiM0MzsJICovCiYjNDM7CWlmICghKHRocF9maWxlX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IGhwYWdlX3BtZF9vcmRlcikpKSB7CiYjNDM7CQlpZiAoc2htZW1fb3BzKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cbiYjMzQ7KTsKJiM0MzsJCQlzaG1lbV9vcHMgPSBOVUxMOwomIzQzOwkJfQomIzQzOwkJaWYgKHJlYWRfb25seV9maWxlX29wcykgewomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7bm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcbiYjMzQ7KTsKJiM0MzsJCQlyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMOwomIzQzOwkJCXJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7CiYjNDM7CQkJcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQlpZiAoIWFub25fb3BzICZhbXA7JmFtcDsgIXNobWVtX29wcyAmYW1wOyZhbXA7ICFyZWFkX29ubHlfZmlsZV9vcHMpCiYjNDM7CQkJa3NmdF9leGl0X3NraXAoJiMzNDtObyBtZW1fdHlwZSBsZWZ0IHRvIHJ1blxuJiMzNDspOwomIzQzOwl9CiYjNDM7CiAJZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxOwogCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODsKIAlkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjsKQEAgLTEzNTcsNyAmIzQzOzE3NjgsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgbnJfY29sbGFwc2Vfb3JkZXJzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07CiYjNDM7CQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwomIzQzOwkJVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CX0KJiM0MzsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTM2NSwxMSAmIzQzOzE3ODYsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJVEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7CiAKIAlURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCi0JVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKLQogCVRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7CiAJVEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7CkBAIC0xNDI0LDYgJiM0MzsxODQyLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKIAlURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTQzOSw3ICYjNDM7MTg2MCwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBucl90ZXN0X2Nhc2VzOyBpJiM0MzsmIzQzOykgewogCQlzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gJmFtcDt0ZXN0X2Nhc2VzW2ldOwogCi0JCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXG4mIzM0OywgdC0mZ3Q7ZGVzYywgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJaWYgKHQtJmd0O2N0eCA9PSAmYW1wO19fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHsKJiM0MzsJCQljb2xsYXBzZV9vcmRlciA9IHQtJmd0O29yZGVyOwomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMsIG9yZGVyICVkKVxuJiMzNDssCiYjNDM7CQkJCSAgICAgICB0LSZndDtkZXNjLCB0LSZndDtjdHgtJmd0O25hbWUsIHQtJmd0O29wcy0mZ3Q7bmFtZSwKJiM0MzsJCQkJICAgICAgIHQtJmd0O29yZGVyKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtcbiMgUnVuIHRlc3Q6ICVzICglczolcylcbiYjMzQ7LCB0LSZndDtkZXNjLAomIzQzOwkJCQkgICAgICAgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJfQogCQl0LSZndDtmbih0LSZndDtjdHgsIHQtJmd0O29wcyk7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmMzNDc4YjUxMjNlMjMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYwpAQCAtMCwwICYjNDM7MSw1MzMgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogUmFjZSBjb2xsYXBzZSBhZ2FpbnN0IGZhdWx0cywgR1VQIHBpbnMsIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRAomIzQzOyAqIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLiAgQSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3IgYXMKJiM0MzsgKiB6ZXJvLCBuZXZlciBhbnl0aGluZyBlbHNlOyB0aGUga2VybmVsJiMzOTtzIG93biBhc3NlcnRpb25zIGluIGRtZXNnIGFyZSB0aGUKJiM0MzsgKiBvdGhlciBoYWxmIG9mIHRoZSBjaGVjay4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3B0aHJlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc2VsZnRlc3QuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDsuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oJiMzNDsKJiM0MzsKJiM0MzsjaWZuZGVmIEZPTExfV1JJVEUKJiM0MzsjZGVmaW5lIEZPTExfV1JJVEUgMHgwMQomIzQzOyNlbmRpZgomIzQzOwomIzQzOyNkZWZpbmUgQkFTRV9BRERSCSgodm9pZCAqKSgxVUwgJmx0OyZsdDsgMzApKQomIzQzOyNkZWZpbmUgUEFTU19USU1FT1VUX1MJMzAKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFBNRC1zaXplZCBhcmVhcyB0aGUgcmFjaW5nIHRocmVhZHMgc2hhcmUsIHBsdXMgb25lIGZvciB0aGUgbXJlbWFwCiYjNDM7ICogdGhyZWFkLiAgLWEgc2hyaW5rcyBpdCB3aGVyZSBhIFBNRCBpcyA1MTJNLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgREVGQVVMVF9TSEFSRURfQVJFQVMJMwomIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzOwomIzQzO3N0YXRpYyBpbnQgbnJfYXJlYXM7CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplOwomIzQzOy8qIG5yX2FyZWFzIFBNRC1zaXplZCBhcmVhczsgdGhlIGxhc3Qgb25lIGJlbG9uZ3MgdG8gdGhlIG1yZW1hcCB0aHJlYWQgKi8KJiM0MztzdGF0aWMgY2hhciAqcmVnaW9uOwomIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTsKJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX3NjcmF0Y2g7CiYjNDM7c3RhdGljIGNoYXIgKnBhZ2VvdXRfYXJlYTsKJiM0MztzdGF0aWMgc2l6ZV90IHBhZ2VvdXRfc2l6ZTsKJiM0MztzdGF0aWMgaW50IGd1cF9mZCA9IC0xOwomIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDsKJiM0MztzdGF0aWMgdm9sYXRpbGUgaW50IGNvcnJ1cHRlZDsKJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7CiYjNDM7CiYjNDM7CXJldHVybiB2YWwgPyB2YWwgOiAxOwkvKiBuZXZlciBjb2xsaWRlcyB3aXRoIHRoZSB6ZXJvLWZpbGwgKi8KJiM0Mzt9CiYjNDM7CiYjNDM7LyogWmVybyBtZWFucyBuZXZlciB3cml0dGVuOyBhbnl0aGluZyBlbHNlIG11c3QgYmUgdGhpcyBwYWdlJiMzOTtzIHBhdHRlcm4gKi8KJiM0MztzdGF0aWMgYm9vbCBwYWdlX2lzX2NvcnJ1cHQodW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgaW50ICp2YWwpCiYjNDM7ewomIzQzOwkqdmFsID0gKih1bnNpZ25lZCBpbnQgKikocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJcmV0dXJuICp2YWwgJmFtcDsmYW1wOyAqdmFsICE9IHBhdHRlcm4ocGFnZV9pZHgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjaGVja19wYWdlKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgdmFsOwomIzQzOwomIzQzOwlpZiAocGFnZV9pc19jb3JydXB0KHBhZ2VfaWR4LCAmYW1wO3ZhbCkpIHsKJiM0MzsJCWNvcnJ1cHRlZCA9IDE7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O0NvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgc2hhcmVkX3BhZ2VzKHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRfcGFnZSh1bnNpZ25lZCBpbnQgKnNlZWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcmFuZF9yKHNlZWQpICUgc2hhcmVkX3BhZ2VzKCk7CiYjNDM7fQomIzQzOwomIzQzOy8qIENsYW1wIHNvIGEgcmFuZ2UgbmV2ZXIgcmVhY2hlcyB0aGUgbXJlbWFwIHRocmVhZCYjMzk7cyBhcmVhICovCiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcm9vbV9mcm9tKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGxvbmcgd2FudCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7CiYjNDM7CiYjNDM7CXJldHVybiB3YW50ICZsdDsgbGVmdCA/IHdhbnQgOiBsZWZ0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCAqZmF1bHRlcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKCZhbXA7c2VlZCk7CiYjNDM7CiYjNDM7CQlpZiAocmFuZF9yKCZhbXA7c2VlZCkgJmFtcDsgMSkKJiM0MzsJCQkqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpID0KJiM0MzsJCQkJcGF0dGVybihwYWdlX2lkeCk7CiYjNDM7CQllbHNlCiYjNDM7CQkJY2hlY2tfcGFnZShwYWdlX2lkeCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpkb250bmVlZF9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKCZhbXA7c2VlZCk7CiYjNDM7CQl1bnNpZ25lZCBsb25nIG5yID0gMVVMICZsdDsmbHQ7IChyYW5kX3IoJmFtcDtzZWVkKSAlIDYpOwkvKiAxLi4zMiBwYWdlcyAqLwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIE5vdyBhbmQgdGhlbiB6YXAgYSB3aG9sZSBQTUQtYWxpZ25lZCBhcmVhOiBvbmx5IGEgemFwIHRoYXQKJiM0MzsJCSAqIGNvdmVycyB0aGUgZnVsbCB0YWJsZSBmcmVlcyB0aGUgdGFibGUgaXRzZWxmIChDT05GSUdfUFRfUkVDTEFJTSkuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghKHJhbmRfcigmYW1wO3NlZWQpICUgNjQpKSB7CiYjNDM7CQkJdW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggLwomIzQzOwkJCQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJCQltYWR2aXNlKHJlZ2lvbiAmIzQzOyBhcmVhICogaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJbWFkdmlzZShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUsCiYjNDM7CQkJCXJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLAomIzQzOwkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0KJiM0MzsJCXVzbGVlcChyYW5kX3IoJmFtcDtzZWVkKSAlIDUwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJc3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9OwomIzQzOwkJdW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZSgmYW1wO3NlZWQpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpOwomIzQzOwomIzQzOwkJZ3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTsKJiM0MzsJCWd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7CiYjNDM7CQlndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjsKJiM0MzsJCWd1cC5ndXBfZmxhZ3MgPSBGT0xMX1dSSVRFOwomIzQzOwkJLyogUmFjaW5nIE1BRFZfRE9OVE5FRUQgbWFrZXMgdHJhbnNpZW50IGZhaWx1cmVzIGV4cGVjdGVkICovCiYjNDM7CQlpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgJmFtcDtndXApOwomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQlwaWRfdCBwaWQgPSBmb3JrKCk7CiYjNDM7CiYjNDM7CQlpZiAocGlkID09IDApIHsKJiM0MzsJCQl1bnNpZ25lZCBpbnQgdmFsOwomIzQzOwkJCWludCBiYWQgPSAwOwomIzQzOwomIzQzOwkJCS8qCiYjNDM7CQkJICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaG9sZCBzdGRvdXQmIzM5O3MKJiM0MzsJCQkgKiBsb2NrIGFjcm9zcyB0aGUgZm9yaywgYW5kIHByaW50aW5nIHVuZGVyIGl0IGhhbmdzLgomIzQzOwkJCSAqLwomIzQzOwkJCWZvciAoaW50IGkgPSAwOyBpICZsdDsgMTY7IGkmIzQzOyYjNDM7KQomIzQzOwkJCQliYWQgfD0gcGFnZV9pc19jb3JydXB0KHJhbmRfcGFnZSgmYW1wO3NlZWQpLCAmYW1wO3ZhbCk7CiYjNDM7CQkJX2V4aXQoYmFkKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChwaWQgJmd0OyAwKSB7CiYjNDM7CQkJaW50IHdzdGF0dXM7CiYjNDM7CiYjNDM7CQkJaWYgKHdhaXRwaWQocGlkLCAmYW1wO3dzdGF0dXMsIDApICZsdDsgMCkKJiM0MzsJCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7d2FpdHBpZCgpJiMzNDspOwomIzQzOwkJCS8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28gKi8KJiM0MzsJCQlpZiAoIVdJRkVYSVRFRCh3c3RhdHVzKSB8fCBXRVhJVFNUQVRVUyh3c3RhdHVzKSkKJiM0MzsJCQkJY29ycnVwdGVkID0gMTsKJiM0MzsJCX0KJiM0MzsJCXVzbGVlcChyYW5kX3IoJmFtcDtzZWVkKSAlIDIwMDApOwomIzQzOwl9CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXZvaWQgKnA7CiYjNDM7CiYjNDM7CQlwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9zY3JhdGNoKTsKJiM0MzsJCWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bXJlbWFwKCkgYXdheSYjMzQ7KTsKJiM0MzsJCWZvciAoaW50IGkgPSAwOyBpICZsdDsgODsgaSYjNDM7JiM0MzspCiYjNDM7CQkJbXJlbWFwX3NjcmF0Y2hbKHJhbmRfcigmYW1wO3NlZWQpICUKJiM0MzsJCQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSkgKiBwYWdlX3NpemVdID0gMTsKJiM0MzsJCXAgPSBtcmVtYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpOwomIzQzOwkJaWYgKHAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttcmVtYXAoKSBiYWNrJiMzNDspOwomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogU3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm4gb24gYSByZWdpb24gbm90aGluZyBlbHNlIHdyaXRlcywgc28gYSBwYWdlJiMzOTtzCiYjNDM7ICogcGF0dGVybiBtdXN0IHN1cnZpdmUgdGhlIHRyaXAgdGhyb3VnaCBzd2FwIGV4YWN0bHkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgKnBhZ2VvdXRfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCSoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzOyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJbWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBuciAmYW1wOyZhbXA7ICFzdG9wOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCXVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgJiM0MzsKJiM0MzsJCQkJCQkJICAgICBpICogcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJCQlpZiAodmFsICE9IHBhdHRlcm4oaSkpIHsKJiM0MzsJCQkJY29ycnVwdGVkID0gMTsKJiM0MzsJCQkJa3NmdF9wcmludF9tc2coJiMzNDtQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcbiYjMzQ7LAomIzQzOwkJCQkJICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qIENvbXBhY3Rpb24gbWlncmF0ZXMgdGhlIGNvbGxhcHNlIHNvdXJjZXMgd2hpbGUgdGhleSBhcmUgYmVpbmcgZ2F0aGVyZWQgKi8KJiM0MztzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwlpbnQgZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5JiMzNDssIE9fV1JPTkxZKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtObyBjb21wYWN0X21lbW9yeTsgY29tcGFjdG9yIGlkbGVcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwl9CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJaWYgKHdyaXRlKGZkLCAmIzM0OzEmIzM0OywgMSkgJmx0OyAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKDEwMDAwICYjNDM7IHJhbmRfcigmYW1wO3NlZWQpICUgMTAwMDAwKTsKJiM0MzsJfQomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBzd2FwX2F2YWlsYWJsZSh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciBsaW5lWzI1Nl07CiYjNDM7CWludCBsaW5lcyA9IDA7CiYjNDM7CUZJTEUgKmZwID0gZm9wZW4oJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkKJiM0MzsJCWxpbmVzJiM0MzsmIzQzOzsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIGxpbmVzICZndDsgMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgbm93X21zKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXZhbCB0djsKJiM0MzsKJiM0MzsJZ2V0dGltZW9mZGF5KCZhbXA7dHYsIE5VTEwpOwomIzQzOwlyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICYjNDM7IHR2LnR2X3VzZWMgLyAxMDAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQomIzQzO3sKJiM0MzsJZnByaW50ZihzdGRlcnIsCiYjNDM7CQkmIzM0O1VzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy1hIGFyZWFzXSBbLXQgbWFza11cbiYjMzQ7CiYjNDM7CQkmIzM0O1x0V2l0aG91dCAtbSwgZXZlcnkgbW9kZSBydW5zIGluIHR1cm4uXG4mIzM0OwomIzQzOwkJJiMzNDtcdC1kOiBzZWNvbmRzIHBlciBtb2RlIChkZWZhdWx0IDUpXG4mIzM0OwomIzQzOwkJJiMzNDtcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXG4mIzM0OwomIzQzOwkJJiMzNDtcdC10OiBiaXRtYXNrIG9mIHJhY2luZyB0aHJlYWRzIHRvIHN0YXJ0LCBmb3IgYmlzZWN0aW5nIGEgZmFpbHVyZVxuJiMzNDspOwomIzQzOwlleGl0KDEpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiYjNDM7ewomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRocmVhZF9uYW1lc1tdID0gewomIzQzOwkJJiMzNDtmYXVsdGVyJiMzNDssICYjMzQ7ZmF1bHRlcjImIzM0OywgJiMzNDtkb250bmVlZCYjMzQ7LCAmIzM0O3Bpbm5lciYjMzQ7LCAmIzM0O2ZvcmtlciYjMzQ7LAomIzQzOwkJJiMzNDttcmVtYXBwZXImIzM0OywgJiMzNDtwYWdlb3V0JiMzNDssICYjMzQ7Y29tcGFjdG9yJiMzNDssCiYjNDM7CX07CiYjNDM7CXZvaWQgKigqY29uc3QgdGhyZWFkX2Zuc1tdKSh2b2lkICopID0gewomIzQzOwkJZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLAomIzQzOwkJbXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sCiYjNDM7CX07CiYjNDM7CWVudW0geyBUX0ZBVUxURVIsIFRfRkFVTFRFUjIsIFRfRE9OVE5FRUQsIFRfUElOTkVSLCBUX0ZPUktFUiwKJiM0MzsJICAgICAgIFRfTVJFTUFQUEVSLCBUX1BBR0VPVVQsIFRfQ09NUEFDVE9SIH07CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgcGFnZW91dF9iaXQgPSAxVUwgJmx0OyZsdDsgVF9QQUdFT1VUOwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIGNvbXBhY3Rvcl9iaXQgPSAxVUwgJmx0OyZsdDsgVF9DT01QQUNUT1I7CiYjNDM7CWNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpOwomIzQzOwlwdGhyZWFkX3QgdGhyZWFkc1tBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyldOwomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFsbF9tb2Rlc1tdID0geyAmIzM0O3N0ZXBwZWQmIzM0OywgJiMzNDtmcmVlJiMzNDssICYjMzQ7bWFkdmlzZSYjMzQ7IH07CiYjNDM7CXN0YXRpYyBjb25zdCBib29sIG9jY3VwYW5jaWVzW10gPSB7IGZhbHNlLCB0cnVlIH07CS8qIHN0cmljdCwgaG9sZXMgKi8KJiM0MzsJc3RhdGljIGNvbnN0IGJvb2wgcHJlc3N1cmVzW10gPSB7IGZhbHNlLCB0cnVlIH07CS8qIHF1aWV0LCB1bmRlciBwcmVzc3VyZSAqLwomIzQzOwljb25zdCBpbnQgbnJfb2NjdXBhbmNpZXMgPSBBUlJBWV9TSVpFKG9jY3VwYW5jaWVzKTsKJiM0MzsJY29uc3QgaW50IG5yX3ByZXNzdXJlcyA9IEFSUkFZX1NJWkUocHJlc3N1cmVzKTsKJiM0MzsJY29uc3QgY2hhciAqb25lX21vZGVbMV07CiYjNDM7CWNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7CiYjNDM7CWludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTsKJiM0MzsJY29uc3QgY2hhciAqbW9kZV9hcmcgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzOwomIzQzOwl1bnNpZ25lZCBsb25nIGVuZF9tczsKJiM0MzsJaW50IGR1cmF0aW9uX3MgPSA1OwomIzQzOwl1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDsKJiM0MzsJdW5zaWduZWQgbG9uZyBiYXNlX21hc2s7CiYjNDM7CWJvb2wgaGF2ZV9zd2FwOwomIzQzOwljaGFyIGxhYmVsWzY0XTsKJiM0MzsJaW50IG5yX2FyZWFzX2FyZyA9IDA7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsJaW50IHN0ZXBzID0gMDsKJiM0MzsJaW50IG9wdDsKJiM0MzsKJiM0MzsJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgJiMzNDthOmQ6bTp0OmgmIzM0OykpICE9IC0xKSB7CiYjNDM7CQlzd2l0Y2ggKG9wdCkgewomIzQzOwkJY2FzZSAmIzM5O2EmIzM5OzoKJiM0MzsJCQlucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7ZCYjMzk7OgomIzQzOwkJCWR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7bSYjMzk7OgomIzQzOwkJCW1vZGVfYXJnID0gb3B0YXJnOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3QmIzM5OzoKJiM0MzsJCQl0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWRlZmF1bHQ6CiYjNDM7CQkJdXNhZ2UoKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobW9kZV9hcmcpIHsKJiM0MzsJCWlmIChzdHJjbXAobW9kZV9hcmcsICYjMzQ7c3RlcHBlZCYjMzQ7KSAmYW1wOyZhbXA7IHN0cmNtcChtb2RlX2FyZywgJiMzNDtmcmVlJiMzNDspICZhbXA7JmFtcDsKJiM0MzsJCSAgICBzdHJjbXAobW9kZV9hcmcsICYjMzQ7bWFkdmlzZSYjMzQ7KSkKJiM0MzsJCQl1c2FnZSgpOwomIzQzOwkJb25lX21vZGVbMF0gPSBtb2RlX2FyZzsKJiM0MzsJCW1vZGVzID0gb25lX21vZGU7CiYjNDM7CQlucl9tb2RlcyA9IDE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa3NmdF9wcmludF9oZWFkZXIoKTsKJiM0MzsJaWYgKCF0aHBfYXZhaWxhYmxlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CiYjNDM7CWhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTsKJiM0MzsJaWYgKCFocGFnZV9wbWRfc2l6ZSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O1JlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxuJiMzNDspOwomIzQzOwomIzQzOwlndXBfZmQgPSBvcGVuKCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QmIzM0OywgT19SRFdSKTsKJiM0MzsJaWYgKGd1cF9mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0Oy9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IHJlcXVpcmVzIENPTkZJR19HVVBfVEVTVCBhbmQgcm9vdFxuJiMzNDspOwomIzQzOwomIzQzOwlucl9zaGFyZWRfYXJlYXMgPSBucl9hcmVhc19hcmcgJmd0OyAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7CiYjNDM7CW5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICYjNDM7IDE7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE1SRU1BUF9GSVhFRCB1bm1hcHMgd2hhdGV2ZXIgaXMgaW4gdGhlIHdheSB3aXRob3V0IHNheWluZyBzbywgc28KJiM0MzsJICogY2xhaW0gdGhlIG1yZW1hcCB0aHJlYWQmIzM5O3Mgc2NyYXRjaCBhZGRyZXNzIHVwIGZyb250LgomIzQzOwkgKi8KJiM0MzsJbXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiAmIzQzOyAyICogbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsJaWYgKG1tYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBQUk9UX05PTkUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwKJiM0MzsJCSAtMSwgMCkgIT0gKHZvaWQgKiltcmVtYXBfc2NyYXRjaCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSBtcmVtYXAgc2NyYXRjaCYjMzQ7KTsKJiM0MzsKJiM0MzsJYmFzZV9tYXNrID0gdGhyZWFkX21hc2s7CiYjNDM7CWhhdmVfc3dhcCA9IHN3YXBfYXZhaWxhYmxlKCk7CiYjNDM7CWlmICghaGF2ZV9zd2FwKQomIzQzOwkJLyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUgKi8KJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7bm8gc3dhcDogdGhlIHBhZ2VvdXQgdGhyZWFkIGlzIG5vdCBzdGFydGVkXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7CiYjNDM7CiYjNDM7CXRocF9zYXZlX3NldHRpbmdzKCk7CiYjNDM7CXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwomIzQzOwkvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQgKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWZvciAoaW50IHJ1biA9IDA7IHJ1biAmbHQ7IG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXM7IHJ1biYjNDM7JiM0MzspIHsKJiM0MzsJCWludCByZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpOwomIzQzOwkJY29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldOwomIzQzOwkJYm9vbCBob2xlcyA9IG9jY3VwYW5jaWVzW3JlbSAvIG5yX3ByZXNzdXJlc107CiYjNDM7CQlib29sIHByZXNzdXJlID0gcHJlc3N1cmVzW3JlbSAlIG5yX3ByZXNzdXJlc107CiYjNDM7CiYjNDM7CQlzbnByaW50ZihsYWJlbCwgc2l6ZW9mKGxhYmVsKSwgJiMzNDslcy8lcyVzJiMzNDssIG1vZGUsCiYjNDM7CQkJIGhvbGVzID8gJiMzNDtob2xlcyYjMzQ7IDogJiMzNDtzdHJpY3QmIzM0OywgcHJlc3N1cmUgPyAmIzM0Oy9wcmVzc3VyZSYjMzQ7IDogJiMzNDsmIzM0Oyk7CiYjNDM7CQlpZiAoY29ycnVwdGVkKSB7CiYjNDM7CQkJLyogTWVtb3J5IGlzIHN1c3BlY3Q7IHRoZSByZXN0IHdvdWxkIHByb3ZlIG5vdGhpbmcgKi8KJiM0MzsJCQlrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoJiMzNDslczogc2tpcHBlZCBhZnRlciBjb3JydXB0aW9uXG4mIzM0OywgbGFiZWwpOwomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwomIzQzOwkJdGhyZWFkX21hc2sgPSBiYXNlX21hc2s7CiYjNDM7CQlpZiAoIXByZXNzdXJlKQomIzQzOwkJCXRocmVhZF9tYXNrICZhbXA7PSB+KHBhZ2VvdXRfYml0IHwgY29tcGFjdG9yX2JpdCk7CiYjNDM7CQllbHNlIGlmICghaGF2ZV9zd2FwKQomIzQzOwkJCXRocmVhZF9tYXNrICZhbXA7PSB+cGFnZW91dF9iaXQ7CiYjNDM7CiYjNDM7CQl0aHBfcmVhZF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsJCXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CQlzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7CiYjNDM7CQlzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0KJiM0MzsJCQlzdHJjbXAobW9kZSwgJiMzNDtmcmVlJiMzNDspID8gMTAwMCA6IDA7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIG1USFAgY29sbGFwc2UgaG9ub3VycyBvbmx5IDAgb3IgSFBBR0VfUE1EX05SIC0gMSBoZXJlLiAgVGhlIHR3bwomIzQzOwkJICogZW5kcyByYWNlIGRpZmZlcmVudCBwYXRoczogYSBzdHJpY3Qgd2luZG93IGhhcyBldmVyeSBQVEUKJiM0MzsJCSAqIHByZXNlbnQsIGEgaG9sZS1oZWF2eSBvbmUgaXMgbW9zdGx5IHplcm8tZmlsbGVkLgomIzQzOwkJICovCiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/CiYjNDM7CQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwOwomIzQzOwkJLyogT25lIHdha2UsIG9uZSBwYXNzOiB0aGUgcGxheWdyb3VuZCBwbHVzIHRoZSBmb3JrZWQgY2hpbGRyZW4mIzM5O3MgY29waWVzICovCiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPQomIzQzOwkJCW5yX2FyZWFzICogKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAqIDg7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgaSkpCiYjNDM7CQkJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7CiYjNDM7CQl9CiYjNDM7CQl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJCXJlZ2lvbiA9IG1tYXAoQkFTRV9BRERSLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCSAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfAomIzQzOwkJCSAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApOwomIzQzOwkJaWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bW1hcCgpIHBsYXlncm91bmQmIzM0Oyk7CiYjNDM7CQltcmVtYXBfYXJlYSA9IHJlZ2lvbiAmIzQzOyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsKJiM0MzsJCWlmICh0aHJlYWRfbWFzayAmYW1wOyBwYWdlb3V0X2JpdCkgewomIzQzOwkJCS8qIEVub3VnaCB0byBkcml2ZSByZWFsIHJlY2xhaW0gd2l0aG91dCBzd2FtcGluZyBhIHNtYWxsIGd1ZXN0ICovCiYjNDM7CQkJcGFnZW91dF9zaXplID0gNCAqIGhwYWdlX3BtZF9zaXplOwomIzQzOwkJCWlmIChwYWdlb3V0X3NpemUgJmx0OyAxNlVMICZsdDsmbHQ7IDIwKQomIzQzOwkJCQlwYWdlb3V0X3NpemUgPSAxNlVMICZsdDsmbHQ7IDIwOwomIzQzOwkJCWlmIChwYWdlb3V0X3NpemUgJmd0OyA2NFVMICZsdDsmbHQ7IDIwKQomIzQzOwkJCQlwYWdlb3V0X3NpemUgPSA2NFVMICZsdDsmbHQ7IDIwOwomIzQzOwkJCXBhZ2VvdXRfYXJlYSA9IG1tYXAoTlVMTCwgcGFnZW91dF9zaXplLAomIzQzOwkJCQkJICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkJCQkgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CiYjNDM7CQkJaWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKQomIzQzOwkJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkgcGFnZW91dCBhcmVhJiMzNDspOwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyogUG9wdWxhdGUgc28gdGhlIGZpcnN0IHBhc3MgaGFzIHNvbWV0aGluZyB0byBjb2xsYXBzZSAqLwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCQkqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpOwomIzQzOwkJbWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CQlpZiAobWFkdmlzZShyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSkmIzM0Oyk7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAoISh0aHJlYWRfbWFzayAmYW1wOyAoMVVMICZsdDsmbHQ7IGkpKSkgewomIzQzOwkJCQl0aHJlYWRzW2ldID0gMDsKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJfQomIzQzOwkJCWlmIChwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sCiYjNDM7CQkJCQkgICAodm9pZCAqKShpICYjNDM7IDEpKSkKJiM0MzsJCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKHRocmVhZF9uYW1lc1tpXSk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQllbmRfbXMgPSBub3dfbXMoKSAmIzQzOyBkdXJhdGlvbl9zICogMTAwMFVMOwomIzQzOwkJaWYgKCFzdHJjbXAobW9kZSwgJiMzNDtzdGVwcGVkJiMzNDspKSB7CiYjNDM7CQkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkgewomIzQzOwkJCQlpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKFBBU1NfVElNRU9VVF9TKSkKJiM0MzsJCQkJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O2todWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcbiYjMzQ7KTsKJiM0MzsJCQkJc3RlcHMmIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCAmIzM0O2ZyZWUmIzM0OykpIHsKJiM0MzsJCQl3aGlsZSAobm93X21zKCkgJmx0OyBlbmRfbXMgJmFtcDsmYW1wOyAhY29ycnVwdGVkKQomIzQzOwkJCQl1c2xlZXAoMTAwICogMTAwMCk7CiYjNDM7CQl9IGVsc2UgewkvKiBtYWR2aXNlICovCiYjNDM7CQkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkgewomIzQzOwkJCQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfc2hhcmVkX2FyZWFzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCQkJbWFkdmlzZShyZWdpb24gJiM0MzsgaSAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0NPTExBUFNFKTsKJiM0MzsJCQkJfQomIzQzOwkJCQltYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCQkJc3RlcHMmIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsKJiM0MzsJCXN0b3AgPSAxOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaWYgKHRocmVhZHNbaV0pCiYjNDM7CQkJCXB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSYjNDM7JiM0MzspCiYjNDM7CQkJY2hlY2tfcGFnZShpKTsKJiM0MzsKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCwgJiMzNDslczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxuJiMzNDssCiYjNDM7CQkJCSBsYWJlbCwgZHVyYXRpb25fcywgc3RlcHMpOwomIzQzOwomIzQzOwkJLyogVGhlIG5leHQgbW9kZSBtYXBzIHRoZSBzYW1lIGZpeGVkIGFkZHJlc3Mgd2l0aCBpdHMgb3duIHNldHRpbmdzICovCiYjNDM7CQltdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJCWlmIChwYWdlb3V0X2FyZWEpIHsKJiM0MzsJCQltdW5tYXAocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUpOwomIzQzOwkJCXBhZ2VvdXRfYXJlYSA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CQlzdG9wID0gMDsKJiM0MzsJCXN0ZXBzID0gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4xYzFiOTQyYWMzMjU4Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMKQEAgLTAsMCAmIzQzOzEsMTc5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIENoZWNrIHRoYXQga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkcml2ZXMga2h1Z2VwYWdlZCBpbiBzdGVwOiBvbmUgYmFycmllcgomIzQzOyAqIG92ZXIgb25lIHByZXBhcmVkIHdpbmRvdyBtdXN0IGNvbGxhcHNlIGl0IHdpdGggZXhhY3RseSBvbmUgY29sbGFwc2UKJiM0MzsgKiBhdHRlbXB0IGF0dHJpYnV0ZWQgdG8gaXRzIHNvdXJjZSBwYWdlcywgc3RlcCBhZnRlciBzdGVwLgomIzQzOyAqCiYjNDM7ICogc2Nhbl9zbGVlcF9taWxsaXNlY3MgaXMgYSBtaW51dGUgc28gdGhhdCBhIHN0ZXAgd2hpY2ggc2xlcHQgaW5zdGVhZCBvZgomIzQzOyAqIGJlaW5nIHdva2VuIGJsb3dzIHRoZSBidWRnZXQuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7a3NlbGZ0ZXN0LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dm1fdXRpbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgJmx0OyZsdDsgMzApKQomIzQzOy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovCiYjNDM7I2RlZmluZSBUQVJHRVRfT1JERVIgMgomIzQzOyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1CiYjNDM7I2RlZmluZSBQQVNTX1RJTUVPVVRfUyAzMAomIzQzOwomIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZDsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7CiYjNDM7c3RhdGljIGludCB0cmFjZV9ldmVudHNfZmQgPSAtMTsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlOiBzd2l0Y2ggdGhlbSBvZmYgaG93ZXZlciB0aGUgdGVzdCBlbmRzLAomIzQzOyAqIGluY2x1ZGluZyBmcm9tIGluc2lkZSBhIGhlbHBlciB0aGF0IGdpdmVzIHVwLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHRyYWNlX2V2ZW50c19vZmYodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICh0cmFjZV9ldmVudHNfZmQgJmd0Oz0gMCkKJiM0MzsJCXRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQ291bnQgdGhlIGlzb2xhdGUgZXZlbnRzIHdob3NlIHNjYW5fcGZuIGlzIG9uZSBvZiB0aGUgd2luZG93JiMzOTtzIHNvdXJjZSBQRk5zICovCiYjNDM7c3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLAomIzQzOwkJCSAgICB1bnNpZ25lZCBpbnQgb3JkZXIpCiYjNDM7ewomIzQzOwljaGFyIGxpbmVbMTAyNF07CiYjNDM7CWludCBjb3VudCA9IDA7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7Q2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJdW5zaWduZWQgbG9uZyB2YWw7CiYjNDM7CQl1bnNpZ25lZCBpbnQgb3JkOwomIzQzOwkJY2hhciAqcywgKm87CiYjNDM7CQlpbnQgaTsKJiM0MzsKJiM0MzsJCXMgPSBzdHJzdHIobGluZSwgJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTomIzM0Oyk7CiYjNDM7CQlpZiAoIXMpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlpZiAoc3NjYW5mKHMsICYjMzQ7bW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4JiMzNDssCiYjNDM7CQkJICAgJmFtcDt2YWwpICE9IDEpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlvID0gc3Ryc3RyKHMsICYjMzQ7b3JkZXI9JiMzNDspOwomIzQzOwkJaWYgKCFvIHx8IHNzY2FuZihvLCAmIzM0O29yZGVyPSV1JiMzNDssICZhbXA7b3JkKSAhPSAxIHx8IG9yZCAhPSBvcmRlcikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9wZm5zOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICh2YWwgPT0gcGZuc1tpXSkgewomIzQzOwkJCQljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pCiYjNDM7ewomIzQzOwljb25zdCBzaXplX3Qgd2luZG93ID0gZ2V0cGFnZXNpemUoKSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVI7CiYjNDM7CWNvbnN0IGludCBucl9wYWdlcyA9IDEgJmx0OyZsdDsgVEFSR0VUX09SREVSOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbnNbMSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVJdOwomIzQzOwlib29sIGNvbGxhcHNlZCwgcGFzc2VkOwomIzQzOwlpbnQgYXR0cmlidXRlZDsKJiM0MzsJY2hhciAqcDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CXAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApOwomIzQzOwlpZiAocCAhPSBCQVNFX0FERFIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkgd2luZG93JiMzNDspOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlwW2kgKiBnZXRwYWdlc2l6ZSgpXSA9IGkgJiM0MzsgMTsKJiM0MzsJCXBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCAmIzQzOyBpICogZ2V0cGFnZXNpemUoKSk7CiYjNDM7CQlpZiAocGZuc1tpXSA9PSAtMVVMKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O1NvdXJjZSBwYWdlIG5vdCBwcmVzZW50XG4mIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogQ2xlYXIgYmVmb3JlIGVuYWJsaW5nIHNvIHRoZSBidWZmZXIgaG9sZHMgb25seSB0aGlzIHN0ZXAmIzM5O3MgZXZlbnRzICovCiYjNDM7CWlmICh0cmFjaW5nX2NsZWFyX3RyYWNlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxuJiMzNDspOwomIzQzOwlpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xuJiMzNDspOwomIzQzOwomIzQzOwlpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfSFVHRVBBR0UpJiMzNDspOwomIzQzOwlwYXNzZWQgPSBraHVnZXBhZ2VkX2Z1bGxfcGFzcyhQQVNTX1RJTUVPVVRfUyk7CiYjNDM7CiYjNDM7CS8qIE9mZiBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZ2l2ZSB1cDogdGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUgKi8KJiM0MzsJaWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0Nhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xuJiMzNDspOwomIzQzOwlpZiAoIXBhc3NlZCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O2todWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xuJiMzNDspOwomIzQzOwomIzQzOwljb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgd2luZG93LCBUQVJHRVRfT1JERVIsCiYjNDM7CQkJCQkgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpOwomIzQzOwlhdHRyaWJ1dGVkID0gY291bnRfYXR0cmlidXRlZChwZm5zLCBucl9wYWdlcywgVEFSR0VUX09SREVSKTsKJiM0MzsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgJmFtcDsmYW1wOyBhdHRyaWJ1dGVkID09IDEsCiYjNDM7CQkJICYjMzQ7c3RlcCAlZDogd2luZG93IGNvbGxhcHNlZCwgJWQgYXR0cmlidXRlZCByZXN1bHQocylcbiYjMzQ7LAomIzQzOwkJCSBpdGVyYXRpb24sIGF0dHJpYnV0ZWQpOwomIzQzOwomIzQzOwltdW5tYXAocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfaGVhZGVyKCk7CiYjNDM7CiYjNDM7CWlmICghdGhwX2F2YWlsYWJsZSgpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxuJiMzNDspOwomIzQzOwlpZiAoISh0aHBfc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgVEFSR0VUX09SREVSKSkpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxuJiMzNDssCiYjNDM7CQkJICAgICAgIFRBUkdFVF9PUkRFUik7CiYjNDM7CiYjNDM7CWhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTsKJiM0MzsJaWYgKCFocGFnZV9wbWRfc2l6ZSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O1JlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxuJiMzNDspOwomIzQzOwlwYWdlbWFwX2ZkID0gb3BlbigmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChwYWdlbWFwX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O29wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKSYjMzQ7KTsKJiM0MzsJa3BhZ2VmbGFnc19mZCA9IG9wZW4oJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGtwYWdlZmxhZ3NfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcbiYjMzQ7KTsKJiM0MzsJdHJhY2VfZXZlbnRzX2ZkID0gdHJhY2luZ19ldmVudHNfb3BlbigmIzM0O2h1Z2VfbWVtb3J5JiMzNDspOwomIzQzOwlpZiAodHJhY2VfZXZlbnRzX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7aHVnZV9tZW1vcnkgZXZlbnRzIHJlcXVpcmUgdHJhY2VmcyBhbmQgcm9vdFxuJiMzNDspOwomIzQzOwlhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7CiYjNDM7CiYjNDM7CWtzZnRfc2V0X3BsYW4oTlJfSVRFUkFUSU9OUyk7CiYjNDM7CiYjNDM7CXRocF9zYXZlX3NldHRpbmdzKCk7CiYjNDM7CXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwlzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFOwomIzQzOwlzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9IDYwICogMTAwMDsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MCAqIDEwMDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTsKJiM0MzsJLyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSAqLwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgJmx0OyZsdDsgMjQ7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KQomIzQzOwkJc2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7CiYjNDM7CXNldHRpbmdzLmh1Z2VwYWdlc1tUQVJHRVRfT1JERVJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDsKJiM0MzsJLyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovCiYjNDM7CXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfSVRFUkFUSU9OUzsgaSYjNDM7JiM0MzspCiYjNDM7CQlvbmVfc3RlcChpKTsKJiM0MzsKJiM0MzsJa3NmdF9maW5pc2hlZCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMKaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMKQEAgLTIwLDcgJiM0MzsyMCw2IEBACiAKICNkZWZpbmUgVFdPTUVHCQkoMiZsdDsmbHQ7MjApCiAjZGVmaW5lIFJVTlRJTUUJCSgyMCkKLSNkZWZpbmUgQUxJR04oeCwgYSkJKCgoeCkgJiM0MzsgKGEgLSAxKSkgJmFtcDsgKH4oKGEpIC0gMSkpKQogCiBIVUdFVExCX1NFVFVQX0RFRkFVTFRfUEFHRVMoMSkKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaAppbmRleCBkMDlmOWY2YTM4NGVlLi5mYzYxOTA3YWEzYjJhIDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaApAQCAtNDAyLDYgJiM0Mzs0MDIsMTIgQEAgQ0FURUdPUlk9JiMzNDtwZm5tYXAmIzM0OyBydW5fdGVzdCAuL3Bmbm1hcAogIyBDT1cgdGVzdHMKIENBVEVHT1JZPSYjMzQ7Y293JiMzNDsgcnVuX3Rlc3QgLi9jb3cKIAomIzQzO0NBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9mb2xpb19vcmRlcl9jaGVjawomIzQzOwomIzQzO0NBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2sKJiM0MzsKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlCiYjNDM7CiBDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZAogCiBDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyCkBAIC00MTAsOCAmIzQzOzQxNiw2IEBAIENBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbQogCiBDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyA0IGFsbDpzaG1lbQogCi1DQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtYyA0IG10aHBfa2h1Z2VwYWdlZDphbm9uCi0KICMgVHJ5IHRvIGNyZWF0ZSBYRlMgaWYgbm90IHByb3ZpZGVkCiBpZiBbIC16ICYjMzQ7JHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH0mIzM0OyBdOyB0aGVuCiAgICAgaWYgdGVzdF9zZWxlY3RlZCAmIzM0O3RocCYjMzQ7OyB0aGVuCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYwppbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMKQEAgLTQyLDY4ICYjNDM7NDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSAmIzM0Oy9wcm9jL2twYWdlZmxhZ3MmIzM0OzsKIGludCBwYWdlbWFwX2ZkOwogaW50IGtwYWdlZmxhZ3NfZmQ7CiAKLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCwKLQkJaW50IGtwYWdlZmxhZ3NfZmQpCi17Ci0JY29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDsKLQljb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7Ci0JdW5zaWduZWQgbG9uZyBwZm5faGVhZDsKLQl1aW50NjRfdCBwZm5fZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBwZm47Ci0JdW5zaWduZWQgbG9uZyBpOwotCi0JcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTsKLQotCS8qIG5vbiBwcmVzZW50IHBhZ2UgKi8KLQlpZiAocGZuID09IC0xVUwpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQotCQlnb3RvIGZhaWw7Ci0KLQkvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqLwotCWlmICghb3JkZXIpIHsKLQkJaWYgKHBmbl9mbGFncyAmYW1wOyAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiBub24gVEhQIGZvbGlvICovCi0JaWYgKCEocGZuX2ZsYWdzICZhbXA7IEtQRl9USFApKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlwZm5faGVhZCA9IHBmbiAmYW1wOyB+KG5yX3BhZ2VzIC0gMSk7Ci0KLQlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQotCQlnb3RvIGZhaWw7Ci0KLQkvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqLwotCWlmICgocGZuX2ZsYWdzICZhbXA7IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqLwotCWZvciAoaSA9IDE7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKLQkJaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgaSwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQotCQkJZ290byBmYWlsOwotCQlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCwKLQkgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyCi0JICovCi0JaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQkvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovCi0JcmV0dXJuIChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFnczsKLWZhaWw6Ci0Ja3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7RmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXG4mIzM0Oyk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbiwKIAkJaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpCiB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMKaW5kZXggNDgyMWEzNTYzMDM2My4uYWY4MzI0ZTFlOGYyYyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYwpAQCAtNDkwLDYgJiM0Mzs0OTAsMTUzIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKQogCXJldHVybiAwOwogfQogCiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsCiYjNDM7CQkJaW50IGtwYWdlZmxhZ3NfZmQpCiYjNDM7ewomIzQzOwljb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEOwomIzQzOwljb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMOwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbl9oZWFkOwomIzQzOwl1aW50NjRfdCBwZm5fZmxhZ3M7CiYjNDM7CXVuc2lnbmVkIGxvbmcgcGZuOwomIzQzOwl1bnNpZ25lZCBsb25nIGk7CiYjNDM7CiYjNDM7CXBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7CiYjNDM7CiYjNDM7CS8qIG5vbiBwcmVzZW50IHBhZ2UgKi8KJiM0MzsJaWYgKHBmbiA9PSAtMVVMKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJLyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi8KJiM0MzsJaWYgKCFvcmRlcikgewomIzQzOwkJaWYgKHBmbl9mbGFncyAmYW1wOyAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIG5vbiBUSFAgZm9saW8gKi8KJiM0MzsJaWYgKCEocGZuX2ZsYWdzICZhbXA7IEtQRl9USFApKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlwZm5faGVhZCA9IHBmbiAmYW1wOyB+KG5yX3BhZ2VzIC0gMSk7CiYjNDM7CiYjNDM7CWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CS8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovCiYjNDM7CWlmICgocGZuX2ZsYWdzICZhbXA7IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CS8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqLwomIzQzOwlmb3IgKGkgPSAxOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCAmIzQzOyBpLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCiYjNDM7CQkJZ290byBmYWlsOwomIzQzOwkJaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncykKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCwKJiM0MzsJICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlcgomIzQzOwkgKi8KJiM0MzsJaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwomIzQzOwkvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovCiYjNDM7CXJldHVybiAocGZuX2ZsYWdzICZhbXA7IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7CiYjNDM7ZmFpbDoKJiM0MzsJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7RmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXG4mIzM0Oyk7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKCkgLSBjaGVjayB0aGF0IGEgcmFuZ2UgaXMgYmFja2VkIGJ5IEBvcmRlciBmb2xpb3MKJiM0MzsgKiBAc3RhcnQ6IHN0YXJ0IG9mIHRoZSByYW5nZSwgYSBtdWx0aXBsZSBvZiB0aGUgZm9saW8gc2l6ZQomIzQzOyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgcmFuZ2UgaW4gYnl0ZXMsIGEgbXVsdGlwbGUgb2YgdGhlIGZvbGlvIHNpemUKJiM0MzsgKiBAb3JkZXI6IHRoZSBmb2xpbyBvcmRlciB0byBjaGVjayBmb3IKJiM0MzsgKiBAcGFnZW1hcF9mZDogb3BlbiAvcHJvYy8mbHQ7cGlkJmd0Oy9wYWdlbWFwIG9mIHRoZSByYW5nZSYjMzk7cyBvd25lcgomIzQzOyAqIEBrcGFnZWZsYWdzX2ZkOiBvcGVuIC9wcm9jL2twYWdlZmxhZ3MKJiM0MzsgKgomIzQzOyAqIEV2ZXJ5IGZvbGlvLXNpemVkLCBmb2xpby1hbGlnbmVkIHBhcnQgb2YgdGhlIHJhbmdlIG11c3QgbWFwIG9uZSBmb2xpbyBvZgomIzQzOyAqIEBvcmRlciwgaGVhZCB0byB0YWlsLCB3aXRoIHRoZSBoZWFkIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFydC4gIEEgcGFydAomIzQzOyAqIGJhY2tlZCBieSBzZXZlcmFsIHNtYWxsZXIgZm9saW9zIGZhaWxzLCBhbmQgc28gZG9lcyBhIGZvbGlvIG1hcHBlZCBvZmYKJiM0MzsgKiBpdHMgbmF0dXJhbCBhbGlnbm1lbnQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zOiB0cnVlIGlmIHRoZSB3aG9sZSByYW5nZSBpcyBiYWNrZWQgdGhhdCB3YXksIGZhbHNlIG90aGVyd2lzZS4KJiM0MzsgKi8KJiM0Mztib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLAomIzQzOwkJCSAgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7CiYjNDM7CWNvbnN0IHNpemVfdCBmb2xpb19zaXplID0gbnJfcGFnZXMgKiBwc2l6ZSgpOwomIzQzOwljaGFyICp2YWRkcjsKJiM0MzsKJiM0MzsJaWYgKCh1aW50cHRyX3Qpc3RhcnQgJSBmb2xpb19zaXplIHx8IGxlbiAlIGZvbGlvX3NpemUpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgJmx0OyBzdGFydCAmIzQzOyBsZW47IHZhZGRyICYjNDM7PSBmb2xpb19zaXplKSB7CiYjNDM7CQljb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGk7CiYjNDM7CiYjNDM7CQkvKiBOb3QgcHJlc2VudCwgb3IgYSB0YWlsIHBhZ2UgKi8KJiM0MzsJCWlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcykKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAxOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJY2hhciAqcGFnZSA9IHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpOwomIzQzOwomIzQzOwkJCWlmIChwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcGFnZSkgIT0gcGZuICYjNDM7IGkpCiYjNDM7CQkJCXJldHVybiBmYWxzZTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIFRSQUNFRlNfUk9PVCAmIzM0Oy9zeXMva2VybmVsL3RyYWNpbmcmIzM0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogUmV0dXJucyAtMSB3aXRob3V0IHRyYWNlZnMgb3IgdGhlIHN1YnN5c3RlbS4gIFRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlOgomIzQzOyAqIHdob2V2ZXIgc3dpdGNoZXMgdGhlbSBvbiBoYXMgdG8gc3dpdGNoIHRoZW0gb2ZmIGFnYWluLCBvbiBldmVyeSBleGl0IHBhdGguCiYjNDM7ICovCiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKQomIzQzO3sKJiM0MzsJY2hhciBwYXRoWzI1Nl07CiYjNDM7CiYjNDM7CXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UICYjMzQ7L2V2ZW50cy8lcy9lbmFibGUmIzM0OywKJiM0MzsJCSBzdWJzeXMpOwomIzQzOwlyZXR1cm4gb3BlbihwYXRoLCBPX1dST05MWSk7CiYjNDM7fQomIzQzOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSkKJiM0Mzt7CiYjNDM7CWlmIChwd3JpdGUoZmQsIGVuYWJsZSA/ICYjMzQ7MSYjMzQ7IDogJiMzNDswJiMzNDssIDEsIDApICE9IDEpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBEcm9wIHdoYXQgdGhlIHRyYWNlIGJ1ZmZlciBob2xkcyBzbyBmYXIgKi8KJiM0MztpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKQomIzQzO3sKJiM0MzsJaW50IGZkID0gb3BlbihUUkFDRUZTX1JPT1QgJiMzNDsvdHJhY2UmIzM0OywgT19XUk9OTFkgfCBPX1RSVU5DKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UICYjMzQ7L3RyYWNlJiMzNDssICYjMzQ7ciYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiAvKiBJZiBgaW9jdGxzJiMzOTsgbm9uLU5VTEwsIHRoZSBhbGxvd2VkIGlvY3RscyB3aWxsIGJlIHJldHVybmVkIGludG8gdGhlIHZhciAqLwogaW50IHVmZmRfcmVnaXN0ZXJfd2l0aF9pb2N0bHMoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbiwKIAkJCSAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscykKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaAppbmRleCA5YTQ5YWY4ODcwMmU0Li41YTkxYjk2NzZlYzVkIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oCkBAIC0xMCw2ICYjNDM7MTAsOCBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiAKICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgJmx0OyZsdDsgKG5yKSkKJiM0MzsjZGVmaW5lIEFMSUdOKHgsIGEpICAgICAgICAgICAgICAgICAgICgoKHgpICYjNDM7IChhKSAtIDEpICZhbXA7IH4oKGEpIC0gMSkpCiYjNDM7CiAjZGVmaW5lIFBNX1NPRlRfRElSVFkgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTUpCiAjZGVmaW5lIFBNX01NQVBfRVhDTFVTSVZFICAgICAgICAgICAgIEJJVF9VTEwoNTYpCiAjZGVmaW5lIFBNX1VGRkRfV1AgICAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTcpCkBAIC05Nyw2ICYjNDM7OTksMTAgQEAgaW50NjRfdCBhbGxvY2F0ZV90cmFuc2h1Z2Uodm9pZCAqcHRyLCBpbnQgcGFnZW1hcF9mZCk7CiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7CiBpbnQgZ2F0aGVyX2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbiwKIAkJaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpOwomIzQzO2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLAomIzQzOwkJCWludCBrcGFnZWZsYWdzX2ZkKTsKJiM0Mztib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLAomIzQzOwkJCSAgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7CiAKIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sCiAJCSAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTsKQEAgLTExMyw2ICYjNDM7MTE5LDEwIEBAIGludCBjbG9zZV9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwKTsKIGludCB3cml0ZV9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgdmFsKTsKIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTsKIGJvb2wgc29mdGRpcnR5X3N1cHBvcnRlZCh2b2lkKTsKJiM0MztpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7CiYjNDM7aW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZCk7CiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIGludCBvcGVuX3NlbGZfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcF9vdXQpCiB7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDE1OjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3OTA0CgkJCQkJCQlvdXRwdXQ6IDkwCgkJCQkJCQl0aG91Z2h0czogMTA0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgRWxpZ2liaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byBsb29rIGF0IHRoZSBkaWZmIGFuZCBxdWlja2x5IGlkZW50aWZ5IHdoaWNoIGZpbGVzIGhhdmUgYmVlbiBtb2RpZmllZC4gSXQmIzM5O3MgYWxsIHVuZGVyIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gLiAgUmlnaHQsIHRoYXQgbWVhbnMgdGhlc2UgYXJlIHNlbGYtdGVzdHMgcmVsYXRlZCB0byBtZW1vcnkgbWFuYWdlbWVudC4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIGFscmVhZHkga25vdyB0aGF0IHRoaXMgc2VjdGlvbiBjb250YWlucyB0ZXN0cyBmb3IgdHJhbnNwYXJlbnQgaHVnZXBhZ2VzIChUSFAva2h1Z2VwYWdlZCkuCgpOb3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoaXMgd2FycmFudHMgZnV6emluZy4gSSBoYXZlIHRvIGFwcGx5IHRoYXQgbmVnYXRpdmUgY3JpdGVyaWEgY2hlY2suIFNwZWNpZmljYWxseSwgdGhlIHJ1bGUgSSBuZWVkIHRvIGxvb2sgYXQgaXM6ICpVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLioKCkJpbmdvLiBFdmVyeSBzaW5nbGUgZmlsZSBsaXN0ZWTigJRgTWFrZWZpbGVgLCB0aGUgYC5jYCBmaWxlcywgYW5kIHRoZSBgLmhgIGZpbGVz4oCUcmVzaWRlcyBwcmVjaXNlbHkgd2l0aGluIHRoYXQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AgZGlyZWN0b3J5LiBUaGVzZSBhcmUgdXNlci1zcGFjZSB0ZXN0cywgYW5kIHRoZSBtb2RpZmllZCBmaWxlcyB3aWxsICpub3QqIGFmZmVjdCB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMuIEkmIzM5O3ZlIGRvdWJsZS1jaGVja2VkIHRoZSBkaWZmIGFuZCB0aGlzIGlzIHRoZSBlbnRpcmUgc2V0IG9mIGNoYW5nZXMuCgpUaGVyZWZvcmUsIGFjY29yZGluZyB0byB0aGUgJiMzNDtOZWdhdGl2ZSBDcml0ZXJpYSYjMzQ7IG91dGxpbmVkLCB0aGUgYFdvcnRoRnV6emluZ2AgcGFyYW1ldGVyIGlzIGBmYWxzZWAuCgpHaXZlbiB0aGlzLCBJIGhhdmUgdG8gZm9ybXVsYXRlIHRoZSBgc2V0LXJlc3VsdHNgIGNhbGw6CgoqICAgYFdvcnRoRnV6emluZ2A6IGBmYWxzZWAKKiAgIGBSZWFzb25pbmdgOiAmIzM0O01vZGlmaWVkIGZpbGVzIGFyZSBsb2NhdGVkIGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gLCB3aGljaCBjb25zaXN0cyBvZiB1c2VyLXNwYWNlIHRlc3RzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIG9yIGtlcm5lbCBtb2R1bGVzLiYjMzQ7CiogICBgRm9jdXNTeW1ib2xzYDogXFsgXQoqICAgYEVuYWJsZUNvbmZpZ3NgOiBcWyBdCgpJJiMzOTttIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC4gVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBjYXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDE1OjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdXNlci1zcGFjZSBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBObyBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIG1vZHVsZSBjb2RlIGlzIGFsdGVyZWQsIG1ha2luZyB0aGUgY2hhbmdlcyBub24ta2VybmVsL25vbi1leGVjdXRhYmxlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdXNlci1zcGFjZSBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBObyBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIG1vZHVsZSBjb2RlIGlzIGFsdGVyZWQsIG1ha2luZyB0aGUgY2hhbmdlcyBub24ta2VybmVsL25vbi1leGVjdXRhYmxlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxNToxNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDhUMTU6MTU6NDEuMjQ4NjE2NDQ3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTExNjEwMjk1MzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIkFsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3IgbW9kdWxlIGNvZGUgaXMgYWx0ZXJlZCwgbWFraW5nIHRoZSBjaGFuZ2VzIG5vbi1rZXJuZWwvbm9uLWV4ZWN1dGFibGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Yga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxNToxNTo0MS4yNDg2MjUyMTdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NDgwMzA2MjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA2ODI3MGExYWI4MmI2Nzk3M2RlNjdmZmI0ZDM1NDA2NWFkNWE4NjkxXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUdWUgU2VwIDggMTU6MTU6MzkgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxcbmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxcbkBAIC0xMDQsNiArMTA0LDkgQEAgVEVTVF9HRU5fRklMRVMgKz0gZ3VhcmQtcmVnaW9uc1xcbiBURVNUX0dFTl9GSUxFUyArPSBtZXJnZVxcbiBURVNUX0dFTl9GSUxFUyArPSBybWFwXFxuIFRFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX3NwbGl0X3JhY2VfdGVzdFxcbitURVNUX0dFTl9GSUxFUyArPSBmb2xpb19vcmRlcl9jaGVja1xcbitURVNUX0dFTl9GSUxFUyArPSBraHVnZXBhZ2VkX3N5bmNfY2hlY2tcXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9yYWNlXFxuIFxcbiBpZm5lcSAoJChBUkNIKSxhcm02NClcXG4gVEVTVF9HRU5fRklMRVMgKz0gc29mdC1kaXJ0eVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZmE3MzZjOWY3MDFhNFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXFxuQEAgLTAsMCArMSwxMjIgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogU2VsZi1jaGVjayBmb3IgdGhlIHZtX3V0aWwgZm9saW8tb3JkZXIgaGVscGVycywgaXNfYmFja2VkX2J5X2ZvbGlvKCkgYW5kXFxuKyAqIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcigpLCB3aGljaCB0aGUga2h1Z2VwYWdlZCBtVEhQIGNhc2VzIHVzZSB0byBkZXRlY3RcXG4rICogY29sbGFwc2UgcmVzdWx0cy4gIEZvciBldmVyeSBhbm9uIFRIUCBvcmRlciB0aGUga2VybmVsIHN1cHBvcnRzLCBmYXVsdFxcbisgKiBtZW1vcnkgaW4gd2l0aCBvbmx5IHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgcmVxdWlyZSB0aGUgaGVscGVycyB0byByZXBvcnRcXG4rICogZXhhY3RseSB0aGF0IG9yZGVyLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJrc2VsZnRlc3QuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInZtX3V0aWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImh1Z2VwYWdlX3NldHRpbmdzLmhcXFwiXFxuK1xcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcXG4rXFxuK3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxcbit7XFxuK1xcdHNpemVfdCBsZW4gPSBzaXplICogMjtcXG4rXFx0Y2hhciAqcCwgKmFsaWduZWQ7XFxuK1xcbitcXHRwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcXG4rXFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKClcXFwiKTtcXG4rXFxuK1xcdGFsaWduZWQgPSAoY2hhciAqKUFMSUdOKCh1aW50cHRyX3QpcCwgc2l6ZSk7XFxuK1xcdGlmIChhbGlnbmVkICE9IHApXFxuK1xcdFxcdG11bm1hcChwLCBhbGlnbmVkIC0gcCk7XFxuK1xcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSBwICsgbGVuKVxcbitcXHRcXHRtdW5tYXAoYWxpZ25lZCArIHNpemUsIHAgKyBsZW4gLSBhbGlnbmVkIC0gc2l6ZSk7XFxuK1xcbitcXHRyZXR1cm4gYWxpZ25lZDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfb3JkZXIoaW50IG9yZGVyKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2l6ZV90IHNpemUgPSBwc2l6ZSgpIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbitcXHRib29sIG9rID0gdHJ1ZTtcXG4rXFx0Y2hhciAqcDtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRpZiAob3JkZXIpXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRwID0gYWxsb2NfYWxpZ25lZChzaXplKTtcXG4rXFx0KnAgPSAxO1xcbitcXG4rXFx0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgb3JkZXIsIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJvcmRlciAlZCBub3QgZGV0ZWN0ZWQgYWZ0ZXIgZmF1bHRcXFxcblxcXCIsIG9yZGVyKTtcXG4rXFx0XFx0b2sgPSBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0LyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyICovXFxuK1xcdGlmIChvcmRlciBcXHUwMDI2XFx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgb3JkZXIgLSAxLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIG9yZGVyLCBvcmRlciAtIDEpO1xcbitcXHRcXHRvayA9IGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKiBBIGxhcmdlIGZvbGlvIG11c3Qgbm90IHBhc3MgYXMgb3JkZXIgMCAqL1xcbitcXHRpZiAob3JkZXIgXFx1MDAyNlxcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKHAsIHNpemUsIDAsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyIDBcXFxcblxcXCIsIG9yZGVyKTtcXG4rXFx0XFx0b2sgPSBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0bXVubWFwKHAsIHNpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0KG9rLCBcXFwib3JkZXIgJWQgY2xhc3NpZmllZFxcXFxuXFxcIiwgb3JkZXIpO1xcbit9XFxuK1xcbitpbnQgbWFpbih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgb3JkZXJzO1xcbitcXHRpbnQgb3JkZXI7XFxuK1xcbitcXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xcbitcXG4rXFx0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcXFxuXFxcIik7XFxuK1xcbitcXHRwYWdlbWFwX2ZkID0gb3BlbihcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAocGFnZW1hcF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXFxcIik7XFxuK1xcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcXFxcblxcXCIpO1xcbitcXG4rXFx0b3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcXG4rXFx0aWYgKCFvcmRlcnMpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xcXFxuXFxcIik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSArIDEpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRjaGVja19vcmRlcigwKTtcXG4rXFx0Zm9yIChvcmRlciA9IDE7IG9yZGVyIFxcdTAwM2MgTlJfT1JERVJTOyBvcmRlcisrKSB7XFxuK1xcdFxcdGlmICghKG9yZGVycyBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXIpKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGNoZWNrX29yZGVyKG9yZGVyKTtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9maW5pc2hlZCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcXG5pbmRleCBlMjY0MmVjYTBkMDJiLi5kZjQyNmY5MjE4ZTcxIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcXG5AQCAtNjUsNyArNjUsNiBAQCBlbnVtIHtcXG4gI2RlZmluZSBITU1fUEFUSF9NQVggICAgNjRcXG4gI2RlZmluZSBOVElNRVNcXHRcXHQxMFxcbiBcXG4tI2RlZmluZSBBTElHTih4LCBhKSAoKCh4KSArIChhIC0gMSkpIFxcdTAwMjYgKH4oKGEpIC0gMSkpKVxcbiAvKiBKdXN0IHRoZSBmbGFncyB3ZSBuZWVkLCBjb3BpZWQgZnJvbSBtbS5oOiAqL1xcbiBcXG4gI2lmbmRlZiBGT0xMX1dSSVRFXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXFxuaW5kZXggZDc5MTdkY2UzYWJhYy4uY2E3M2Y5YWM4ZTliNiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xcbkBAIC0xODMsNiArMTgzLDEzIEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXFxuIFxcdH1cXG4gfVxcbiBcXG4rLyogQSBzdG9yZSB0byBlaXRoZXIgc2xlZXAga25vYiB3YWtlcyBraHVnZXBhZ2VkLCBzbyB3cml0ZSBvbmx5IG9uIGNoYW5nZSAqL1xcbitzdGF0aWMgdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcXG4re1xcbitcXHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcXG4rXFx0XFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xcbit9XFxuK1xcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4ge1xcbiBcXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFxcdTAwMjZzZXR0aW5ncy1cXHUwMDNla2h1Z2VwYWdlZDtcXG5AQCAtMTk4LDE1ICsyMDUsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXFxuIFxcdFxcdFxcdHNobWVtX2VuYWJsZWRfc3RyaW5nc1tzZXR0aW5ncy1cXHUwMDNlc2htZW1fZW5hYmxlZF0pO1xcbiBcXHR0aHBfd3JpdGVfbnVtKFxcXCJ1c2VfemVyb19wYWdlXFxcIiwgc2V0dGluZ3MtXFx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xcbiBcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9kZWZyYWdcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VkZWZyYWcpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1xcXCIsXFxuLVxcdFxcdFxcdGtodWdlcGFnZWQtXFx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbi1cXHRcXHRcXHRraHVnZXBhZ2VkLVxcdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX25vbmUpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zd2FwKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VwYWdlc190b19zY2FuKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvZGVmcmFnXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlZGVmcmFnKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4rXFx0XFx0ICAgICAgIGtodWdlcGFnZWQtXFx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4rXFx0XFx0ICAgICAgIGtodWdlcGFnZWQtXFx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX25vbmUpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VwYWdlc190b19zY2FuKTtcXG4gXFxuIFxcdGlmIChkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoWzBdKVxcbiBcXHRcXHR3cml0ZV9udW0oZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aCwgc2V0dGluZ3MtXFx1MDAzZXJlYWRfYWhlYWRfa2IpO1xcbkBAIC0yMzAsNiArMjM3LDQxIEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxcbiBcXHR9XFxuIH1cXG4gXFxuKy8qXFxuKyAqIFdhaXQgZm9yIGEgZnVsbCBraHVnZXBhZ2VkIHNjYW4gcGFzcyB0aGF0IHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsOiB0aGVcXG4rICogcGFzcyBpbiBwcm9ncmVzcyBtYXkgYWxyZWFkeSBoYXZlIHBhc3NlZCB0aGlzIG1tLCBzbyBmdWxsX3NjYW5zIGhhcyB0b1xcbisgKiBhZHZhbmNlIHR3aWNlLlxcbisgKlxcbisgKiBBIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGJ1dCBvbmUgbWFkZSB3aGlsZSBpdFxcbisgKiBpcyBzY2FubmluZyByYXRoZXIgdGhhbiBzbGVlcGluZyBpcyBsb3N0LCBzbyBrZWVwIHN0b3JpbmcgdW50aWwgdGhlIHBhc3NcXG4rICogbGFuZHMuXFxuKyAqXFxuKyAqIE9uZSB3YWtlIGlzIG9uZSBwYXNzIG9ubHkgaWYgcGFnZXNfdG9fc2NhbiBjb3ZlcnMgZXZlcnkgbW0gb24gdGhlIGxpc3QuXFxuKyAqL1xcbitib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBkZWFkbGluZV9tcyA9IHRpbWVvdXRfcyAqIDEwMDBVTDtcXG4rXFx0dW5zaWduZWQgbG9uZyBlbGFwc2VkX21zID0gMCwgcG9sbF9tcyA9IDEwO1xcbitcXHR1bnNpZ25lZCBsb25nIHNsZWVwX21zO1xcbitcXHRpbnQgcGFzcztcXG4rXFxuK1xcdHNsZWVwX21zID0gdGhwX3JlYWRfbnVtKFxcXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXFxcIik7XFxuK1xcdGZvciAocGFzcyA9IDA7IHBhc3MgXFx1MDAzYyAyOyBwYXNzKyspIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxcbitcXHRcXHRcXHR0aHBfcmVhZF9udW0oXFxcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1xcXCIpICsgMTtcXG4rXFxuK1xcdFxcdHdoaWxlICh0aHBfcmVhZF9udW0oXFxcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1xcXCIpIFxcdTAwM2MgdGFyZ2V0KSB7XFxuK1xcdFxcdFxcdGlmIChlbGFwc2VkX21zIFxcdTAwM2U9IGRlYWRsaW5lX21zKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdFxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBzbGVlcF9tcyk7XFxuK1xcdFxcdFxcdHVzbGVlcChwb2xsX21zICogMTAwMCk7XFxuK1xcdFxcdFxcdGVsYXBzZWRfbXMgKz0gcG9sbF9tcztcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbiBzdHJ1Y3QgdGhwX3NldHRpbmdzICp0aHBfY3VycmVudF9zZXR0aW5ncyh2b2lkKVxcbiB7XFxuIFxcdGlmICghc2V0dGluZ3NfaW5kZXgpIHtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcXG5pbmRleCA3MjZjNzNjNDNjMDViLi4yZWExNjlkMTE3OTYyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXFxuQEAgLTgzLDEwICs4MywyMSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZClcXG4gXFx0aHVnZXBhZ2Vfc2F2ZV9zZXR0aW5ncygvKiB0aHAgPSAqLyB0cnVlLCAvKiBodWdldGxiID0gKi8gZmFsc2UpO1xcbiB9XFxuIFxcbitib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpO1xcbitcXG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcXG4gdW5zaWduZWQgbG9uZyB0aHBfc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcXG4gdW5zaWduZWQgbG9uZyB0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcXG4gXFxuKy8qXFxuKyAqIFRoZSBwZXItb3JkZXIgc2htZW1fZW5hYmxlZCBhdHRyaWJ1dGUgaXMgY3JlYXRlZCBmb3IgdGhlIG9yZGVycyB0aGUgcGFnZVxcbisgKiBjYWNoZSBjYW4gaG9sZCwgbm90IGp1c3QgZm9yIHNobWVtLCBzbyBpdCBhbnN3ZXJzIGZvciByZWd1bGFyIGZpbGVzIHRvby5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfZmlsZV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCk7XFxuK31cXG4rXFxuIGJvb2wgdGhwX2F2YWlsYWJsZSh2b2lkKTtcXG4gYm9vbCB0aHBfaXNfZW5hYmxlZCh2b2lkKTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xcbmluZGV4IGY4MjY3M2Y1ZjZiNDcuLjMzNWY5NDZlY2E2MWUgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXFxuQEAgLTMxLDYgKzMxLDExIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcXG4gc3RhdGljIGludCBocGFnZV9wbWRfbnI7XFxuIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjtcXG4gc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcjtcXG4rc3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfc2V0O1xcbitzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyc1tOUl9PUkRFUlNdO1xcbitzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVycztcXG4rc3RhdGljIGludCBwYWdlbWFwX2ZkID0gLTE7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZCA9IC0xO1xcbiBcXG4gI2RlZmluZSBQSURfU01BUFMgXFxcIi9wcm9jL3NlbGYvc21hcHNcXFwiXFxuICNkZWZpbmUgVEVTVF9GSUxFIFxcXCJjb2xsYXBzZV90ZXN0X2ZpbGVcXFwiXFxuQEAgLTIyMCw2ICsyMjUsMjkgQEAgc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXFxuIFxcdHJldHVybiBzd2FwO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCBzd2Fwb3V0X3JhbmdlKHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcXG4re1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdC8qIGtlZXAga2h1Z2VwYWdlZCBmcm9tIGNvbGxhcHNpbmcgdGhlIHJhbmdlIGFuZCBzd2FwcGluZyBpdCBiYWNrIGluICovXFxuK1xcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfTk9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX05PSFVHRVBBR0UpXFxcIik7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBSZXRyeSBzZXZlcmFsIHRpbWVzIGJlY2F1c2UgTUFEVl9QQUdFT1VUIGlzIGJlc3QgZWZmb3J0LiAgU2xlZXBcXG4rXFx0ICogYmV0d2VlbiB0aGUgcmV0cmllcyB0byBnaXZlIG91dHN0YW5kaW5nIHdyaXRlYmFjayBhIGNoYW5jZSB0b1xcbitcXHQgKiBmaW5pc2guXFxuK1xcdCAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgNDA7IGkrKykge1xcbitcXHRcXHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX1BBR0VPVVQpKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbitcXHRcXHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcXG4rXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdFxcdHVzbGVlcCg1MCAqIDEwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgKmFsbG9jX21hcHBpbmcoaW50IG5yKVxcbiB7XFxuIFxcdHZvaWQgKnA7XFxuQEAgLTUxMCw4ICs1MzgsOCBAQCBzdGF0aWMgYm9vbCBpc19hbm9uKHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXFxuIFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgbWVtX29wcyAqb3BzLCBib29sIGV4cGVjdClcXG4ge1xcbi1cXHRpbnQgcmV0O1xcbiBcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XFxuK1xcdGludCByZXQsIGk7XFxuIFxcbiBcXHRrc2Z0X3ByaW50X21zZyhcXFwiJXMuLi5cXFwiLCBtc2cpO1xcbiBcXG5AQCAtNTI0LDkgKzU1MiwxNiBAQCBzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxcbiBcXHQvKlxcbiBcXHQgKiBQcmV2ZW50IGtodWdlcGFnZWQgaW50ZXJmZXJlbmNlIGFuZCB0ZXN0cyB0aGF0IE1BRFZfQ09MTEFQU0VcXG4gXFx0ICogaWdub3JlcyAvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9lbmFibGVkXFxuK1xcdCAqXFxuK1xcdCAqIFxcXCJpbmhlcml0XFxcIiByYXRoZXIgdGhhbiBcXFwibmV2ZXJcXFwiIHNvIHRoYXQgTUFEVl9DT0xMQVBTRSBvbiBzaG1lbSBzdGlsbFxcbitcXHQgKiBmaW5kcyBhbiBvcmRlciB0byBidWlsZC5cXG4gXFx0ICovXFxuIFxcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSO1xcbiBcXHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKykge1xcbitcXHRcXHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xcbitcXHRcXHRzZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFNITUVNX0lOSEVSSVQ7XFxuK1xcdH1cXG4gXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4gXFxuIFxcdC8qIENsZWFyIFZNX05PSFVHRVBBR0UgKi9cXG5AQCAtNTU2LDggKzU5MSwxMSBAQCBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgc2l6ZV90IGxlbixcXG4gXFx0XFx0aW50IG5yX2hwYWdlcywgaW50IGNvbGxhcF9vcmRlciwgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4ge1xcbiBcXHR1bnNpZ25lZCBsb25nIGhwYWdlX3NpemUgPSBwYWdlX3NpemUgXFx1MDAzY1xcdTAwM2MgY29sbGFwX29yZGVyO1xcbi1cXHRpbnQgZnVsbF9zY2FucztcXG4tXFx0aW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi9cXG4rXFx0dW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3NpemU7XFxuK1xcdGludCB0aW1lb3V0LCBmdWxsX3NjYW5zO1xcbitcXG4rXFx0LyogSGFsZi1zZWNvbmQgdGlja3M6IHRocmVlIHNlY29uZHMgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gKi9cXG4rXFx0dGltZW91dCA9IDYgKyAyICogKGJ5dGVzIC8gKDEyOFVMIFxcdTAwM2NcXHUwMDNjIDIwKSk7XFxuIFxcbiBcXHQvKiBTYW5pdHkgY2hlY2sgKi9cXG4gXFx0aWYgKCFvcHMtXFx1MDAzZWNoZWNrX2h1Z2UocCwgbGVuLCAwLCBocGFnZV9zaXplKSlcXG5AQCAtODIwLDEyICs4NTgsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2Vfc3dhcGluX3NpbmdsZV9wdGUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BcXG4gXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuIFxcbiBcXHRrc2Z0X3ByaW50X21zZyhcXFwiU3dhcG91dCBvbmUgcGFnZS4uLlxcXCIpO1xcbi1cXHRpZiAobWFkdmlzZShwLCBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXFxuLVxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX1BBR0VPVVQpXFxcIik7XFxuLVxcdGlmIChjaGVja19zd2FwKHAsIHBhZ2Vfc2l6ZSkpIHtcXG4rXFx0aWYgKHN3YXBvdXRfcmFuZ2UocCwgcGFnZV9zaXplKSkge1xcbiBcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcdFxcdHNraXAoXFxcIkNvdWxkIG5vdCBzd2FwIG91dFxcXCIpO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG5AQCAtODQ2LDEyICs4ODIsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cXG4gXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuIFxcbiBcXHRrc2Z0X3ByaW50X21zZyhcXFwiU3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlxcXCIsIG1heF9wdGVzX3N3YXAgKyAxLCBocGFnZV9wbWRfbnIpO1xcbi1cXHRpZiAobWFkdmlzZShwLCAobWF4X3B0ZXNfc3dhcCArIDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxcbi1cXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbi1cXHRpZiAoY2hlY2tfc3dhcChwLCAobWF4X3B0ZXNfc3dhcCArIDEpICogcGFnZV9zaXplKSkge1xcbitcXHRpZiAoc3dhcG91dF9yYW5nZShwLCAobWF4X3B0ZXNfc3dhcCArIDEpICogcGFnZV9zaXplKSkge1xcbiBcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcdFxcdHNraXAoXFxcIkNvdWxkIG5vdCBzd2FwIG91dFxcXCIpO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG5AQCAtODYzLDEyICs4OTcsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cXG4gXFx0XFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuIFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXFxcIiwgbWF4X3B0ZXNfc3dhcCxcXG4gXFx0XFx0ICAgICAgIGhwYWdlX3BtZF9ucik7XFxuLVxcdFxcdGlmIChtYWR2aXNlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXFxuLVxcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX1BBR0VPVVQpXFxcIik7XFxuLVxcdFxcdGlmIChjaGVja19zd2FwKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUpKSB7XFxuK1xcdFxcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUpKSB7XFxuIFxcdFxcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuIFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFx0XFx0XFx0c2tpcChcXFwiQ291bGQgbm90IHN3YXAgb3V0XFxcIik7XFxuIFxcdFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRcXHR9XFxuIFxcbkBAIC05MzUsNiArOTY3LDE2IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbXBvdW5kX2V4dHJlbWUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXFxuIFxcdHZvaWQgKnA7XFxuIFxcdGludCBpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogVGhpcyBuZWVkcyBocGFnZV9wbWRfbnIgUE1ELW9yZGVyIGFsbG9jYXRpb25zIGluIGEgcm93LCB3aGljaCB0aGVcXG4rXFx0ICogYWxsb2NhdG9yIHdpbGwgbm90IHN1cHBseSBpZiB0aGUgUE1EIGlzIHZlcnkgbGFyZ2UuXFxuK1xcdCAqL1xcbitcXHRpZiAoaHBhZ2VfcG1kX3NpemUgXFx1MDAzZSAoMzJVTCBcXHUwMDNjXFx1MDAzYyAyMCkpIHtcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFxcXCIlczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBfX2Z1bmNfXyk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4gXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4gXFx0a3NmdF9wcmludF9tc2coXFxcIkNvbnN0cnVjdCBQVEUgcGFnZSB0YWJsZSBmdWxsIG9mIGRpZmZlcmVudCBQVEUtbWFwcGVkIGNvbXBvdW5kIHBhZ2VzXFxcXG5cXFwiKTtcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGhwYWdlX3BtZF9ucjsgaSsrKSB7XFxuQEAgLTExMjUsNiArMTE2NywxMDMgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xcbiBcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIFRoZSBwYXJlbnQgd3JpdGVzIHRvIHRoZSBmb3JrLXNoYXJlZCByYW5nZSB0aHJvdWdob3V0IHRoZSBjaGlsZCdzXFxuKyAqIGNvbGxhcHNlLiAgQ29XIG11c3Qga2VlcCB0aGUgdHdvIGFwYXJ0OiB0aGUgY2hpbGQgc2VlcyB0aGUgcHJlLWZvcmtcXG4rICogY29udGVudCwgdGhlIHBhcmVudCBvbmx5IGl0cyBvd24gd3JpdGVzLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRjb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7XFxuK1xcdGludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG47XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2hhcmVkO1xcbitcXHR2b2xhdGlsZSBpbnQgKmlwO1xcbitcXHRwaWRfdCBjaGlsZDtcXG4rXFx0aW50IHN5bmNbMl07XFxuK1xcdGNoYXIgZ28gPSAxO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0LyogQXQgYSBwYWdlIHBlciAxMCBtcywgNjQgcGFnZXMgc3ByZWFkIHRoZSB3cml0ZXMgYWNyb3NzIHRoZSBjb2xsYXBzZSAqL1xcbitcXHRuID0gNjQ7XFxuK1xcdHNoYXJlZCA9IG4gKiBwYWdlX3NpemU7XFxuK1xcbitcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHQvKiBTaGFyZWQgcHJlZml4LCB3aXRoIHRoZSBwcmUtZm9yayBwYXR0ZXJuICovXFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgc2hhcmVkKTtcXG4rXFx0aWYgKHBpcGUoc3luYykpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwicGlwZSgpXFxcIik7XFxuK1xcbitcXHQvKiBBIHZvbGF0aWxlIHBvaW50ZXIgc28gdGhlIHN0b3JlcyBhcmUgbm90IG1lcmdlZCBvciBkcm9wcGVkICovXFxuK1xcdGlwID0gcDtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLlxcXCIpO1xcbitcXHRjaGlsZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFjaGlsZCkge1xcbitcXHRcXHRpbnQgY29sbGFwc2Vfc3RhdHVzO1xcbitcXG4rXFx0XFx0Y2xvc2Uoc3luY1swXSk7XFxuK1xcdFxcdC8qIFByaXZhdGUgcmVtYWluZGVyICovXFxuK1xcdFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgc2hhcmVkLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdFxcdC8qIFN0YXJ0IHRoZSBwYXJlbnQgdW5zaGFyaW5nLCBhbmQgZ2l2ZSBpdCBhIGhlYWQgc3RhcnQgKi9cXG4rXFx0XFx0aWYgKHdyaXRlKHN5bmNbMV0sIFxcdTAwMjZnbywgMSkgIT0gMSlcXG4rXFx0XFx0XFx0X2V4aXQoS1NGVF9GQUlMKTtcXG4rXFx0XFx0dXNsZWVwKDUwMDApO1xcbitcXHRcXHRjLVxcdTAwM2Vjb2xsYXBzZShcXFwiQ29sbGFwc2UgYSByYW5nZSB0aGUgcGFyZW50IGlzIHdyaXRpbmcgdG9cXFwiLFxcbitcXHRcXHRcXHQgICAgcCwgMSwgb3BzLCB0cnVlKTtcXG4rXFx0XFx0Y29sbGFwc2Vfc3RhdHVzID0gZXhpdF9zdGF0dXM7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuOyBpKyspXFxuK1xcdFxcdFxcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICsgMHhkZWFkMDAwMClcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGlmIChpID09IG4pXFxuK1xcdFxcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0ZmFpbChcXFwiRmFpbDogY2hpbGQgY29udGVudFxcXCIpO1xcbitcXHRcXHQvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlICovXFxuK1xcdFxcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXFxuK1xcdFxcdFxcdGV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzO1xcbitcXHRcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdFxcdF9leGl0KGV4aXRfc3RhdHVzKTtcXG4rXFx0fVxcbitcXG4rXFx0Y2xvc2Uoc3luY1sxXSk7XFxuK1xcdGlmIChyZWFkKHN5bmNbMF0sIFxcdTAwMjZnbywgMSkgIT0gMSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJjaGlsZCBuZXZlciByZWFjaGVkIHRoZSBjb2xsYXBzZVxcXFxuXFxcIik7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBVbnNoYXJlIG9uZSBwYWdlIGF0IGEgdGltZTogYSBidXJzdCB3b3VsZCBicmVhayBDb1cgb24gdGhlIHdob2xlXFxuK1xcdCAqIHJhbmdlIGJlZm9yZSB0aGUgY29sbGFwc2Ugc3RhcnRzLCBsZWF2aW5nIG5vdGhpbmcgc2hhcmVkIHRvIGNvbGxhcHNlLlxcbitcXHQgKi9cXG4rXFx0aSA9IDA7XFxuK1xcdGZvciAoOzspIHtcXG4rXFx0XFx0aWYgKGkgXFx1MDAzYyBuKVxcbitcXHRcXHRcXHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xcbitcXHRcXHRpKys7XFxuK1xcdFxcdHVzbGVlcCgxMCAqIDEwMDApO1xcbitcXHRcXHRpZiAod2FpdHBpZChjaGlsZCwgXFx1MDAyNndzdGF0dXMsIFdOT0hBTkcpKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0LyogRmluaXNoIHdoYXRldmVyIHRoZSBwYWNlZCBzd2VlcCBkaWQgbm90IHJlYWNoICovXFxuK1xcdGZvciAoOyBpIFxcdTAwM2MgbjsgaSsrKVxcbitcXHRcXHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xcbitcXHQvKiBBIGNoaWxkIHRoYXQgZGllZCByZWFkaW5nIHRoZSByYWNpbmcgcGFnZXMgaXMgYSBmYWlsdXJlLCBub3QgYSB6ZXJvICovXFxuK1xcdGNoaWxkX3N0YXR1cyA9IFdJRkVYSVRFRCh3c3RhdHVzKSA/IFdFWElUU1RBVFVTKHdzdGF0dXMpIDogS1NGVF9GQUlMO1xcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIkNoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uXFxcIik7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuOyBpKyspXFxuK1xcdFxcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICsgMHhiZWVmMDAwMClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdGlmIChpID09IG4pXFxuK1xcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZmFpbChcXFwiRmFpbDogcGFyZW50IGNvbnRlbnRcXFwiKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHQvKiBUaGUgcGFyZW50J3MgY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQncyB2ZXJkaWN0ICovXFxuK1xcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXFxuK1xcdFxcdGV4aXRfc3RhdHVzID0gY2hpbGRfc3RhdHVzO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4ge1xcbkBAIC0xMTcwLDYgKzEzMDksMjAwIEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbiBcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuIH1cXG4gXFxuKy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgd2lsbCBjb25zaWRlciBmb3IgbVRIUCBjb2xsYXBzZSAqL1xcbisjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcXG4rXFxuKy8qIFRpbWUgYnVkZ2V0IGZvciBvbmUga2h1Z2VwYWdlZCBwYXNzIGluIHRoZSBjb2xsYXBzZV9vcmRlcl8qIGNhc2VzICovXFxuKyNkZWZpbmUgTVRIUF9QQVNTX1RJTUVPVVRfUyAzMFxcbitcXG4rc3RhdGljIHNpemVfdCBtdGhwX3dpbmRvd19zaXplKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIHBhZ2Vfc2l6ZSBcXHUwMDNjXFx1MDAzYyBjb2xsYXBzZV9vcmRlcjtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgbXRocF9wdXNoX3RhcmdldF9vcmRlcih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBPbmx5IHRoZSB0YXJnZXQgb3JkZXIsIGFuZCBvbmx5IGZvciBtYWR2aXNlOiB0aGUgY2FzZXMgZmF1bHQgdGhlaXJcXG4rXFx0ICogcmVnaW9uIGZpcnN0LCBzbyB0aGUgc291cmNlcyBzdGF5IG9yZGVyIDAgd2hhdGV2ZXIgLXMgYXNrZWQgZm9yLlxcbitcXHQgKi9cXG4rXFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdHNldHRpbmdzLmh1Z2VwYWdlc1tjb2xsYXBzZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBhbGxfd2luZG93c19hdF9vcmRlcih2b2lkICpwLCBzaXplX3QgbGVuKVxcbit7XFxuK1xcdHJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgbGVuLCBjb2xsYXBzZV9vcmRlcixcXG4rXFx0XFx0XFx0XFx0XFx0cGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGFueV93aW5kb3dfYXRfb3JkZXIodm9pZCAqcCwgc2l6ZV90IGxlbilcXG4re1xcbitcXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xcbitcXHRjaGFyICphZGRyID0gcDtcXG4rXFxuK1xcdGZvciAoOyBsZW4gXFx1MDAzZT0gd2luZG93OyBhZGRyICs9IHdpbmRvdywgbGVuIC09IHdpbmRvdykge1xcbitcXHRcXHRpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIoYWRkciwgd2luZG93KSlcXG4rXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbitcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xcbitcXHRpZiAoYW55X3dpbmRvd19hdF9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcXFxuXFxcIik7XFxuK1xcbitcXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVxcXCIpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcXG4rXFx0XFx0ZmFpbChcXFwiVGltZW91dFxcXCIpO1xcbitcXHRlbHNlIGlmIChhbGxfd2luZG93c19hdF9vcmRlcihwICsgd2luZG93LCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwLCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwICsgMiAqIHdpbmRvdyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgaHBhZ2VfcG1kX3NpemUgLSAyICogd2luZG93KSlcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcbitcXHR2YWxpZGF0ZV9tZW1vcnkocCwgd2luZG93LCAyICogd2luZG93KTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xcbitcXHRpZiAoYW55X3dpbmRvd19hdF9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcXFxuXFxcIik7XFxuK1xcbitcXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVxcXCIpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXFxcIik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgbXRocF93aW5kb3dfc2l6ZSgpKSlcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcbitcXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4rXFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcXG4rXFx0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDtcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XFxuK1xcdGlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxcXG5cXFwiKTtcXG4rXFxuK1xcdGlmIChtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXFxcIik7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcXG4rXFx0XFx0ZmFpbChcXFwiVGltZW91dFxcXCIpO1xcbitcXHRlbHNlIGlmIChhbGxfd2luZG93c19hdF9vcmRlcihwLCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwICsgd2luZG93LCB3aW5kb3cpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbitcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRpbnQgc291cmNlX29yZGVyID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgOiBNSU5fTVRIUF9PUkRFUjtcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdGlmIChzb3VyY2Vfb3JkZXIgXFx1MDAzZT0gY29sbGFwc2Vfb3JkZXIgfHxcXG4rXFx0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2Mgc291cmNlX29yZGVyKSkpIHtcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFxcXCIlczogbm8gc3VwcG9ydGVkIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIF9fZnVuY19fKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XFxuK1xcbitcXHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xcbitcXHRzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBhbGxvY2F0b3IgY2FuIGZhbGwgYmFjayB0byBzbWFsbGVyIGZvbGlvcyB1bmRlciBmcmFnbWVudGF0aW9uO1xcbitcXHQgKiBoYXZpbmcgbm90aGluZyB0byBjb2xsYXBzZSBmcm9tIGlzIG5vdCBhIGZhaWx1cmUuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiTm8gb3JkZXItJWQgc291cmNlcyB0byBjb2xsYXBzZS4uLlxcXCIsIHNvdXJjZV9vcmRlcik7XFxuK1xcdFxcdHNraXAoXFxcIlNraXBcXFwiKTtcXG4rXFx0XFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVxcXCIpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXFxcIixcXG4rXFx0XFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdG9wcy1cXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuIHtcXG4gXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJcXFxcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdIFxcdTAwM2N0ZXN0IHR5cGVcXHUwMDNlIFtkaXJdXFxcXG5cXFxcblxcXCIpO1xcbkBAIC0xMTg3LDExICsxNTIwLDE0IEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuIFxcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0LXM6IG1USFAgc2l6ZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxcXG5cXFwiKTtcXG4gXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXFxcblxcXCIpO1xcbiBcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdC1jOiBjb2xsYXBzZSBvcmRlciBmb3IgbVRIUCBjb2xsYXBzZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxcXG5cXFwiKTtcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgRGVmYXVsdHMgdG8gZXZlcnkgc3VwcG9ydGVkIG9yZGVyIGJlbG93IHRoZSBQTUQuXFxcXG5cXFwiKTtcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgLXMsIGlmIHNldCwgaXMgdGhlIHNvdXJjZSBvcmRlciBmb3IgdGhlIG1peGVkLXNvdXJjZSBjYXNlLlxcXFxuXFxcIik7XFxuIFxcdGV4aXQoMSk7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIHtcXG4rXFx0Ym9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlO1xcbiBcXHRpbnQgb3B0O1xcbiBcXHRjaGFyICpidWY7XFxuIFxcdGNvbnN0IGNoYXIgKnRva2VuO1xcbkBAIC0xMjAzLDYgKzE1MzksNyBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0Y2FzZSAnYyc6XFxuIFxcdFxcdFxcdGNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpO1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcl9zZXQgPSB0cnVlO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0Y2FzZSAnaCc6XFxuIFxcdFxcdGRlZmF1bHQ6XFxuQEAgLTEyMTAsMTIgKzE1NDcsMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcbitcXHQvKlxcbitcXHQgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyXFxuK1xcdCAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGFub25fb3JkZXIgXFx1MDAzYyAwIHx8IGFub25fb3JkZXIgXFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiLXMgdGFrZXMgYW4gb3JkZXIgaW4gMC4uJWQsIG5vdCAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTtcXG4rXFx0aWYgKGNvbGxhcHNlX29yZGVyX3NldCBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgKGNvbGxhcHNlX29yZGVyIFxcdTAwM2M9IDAgfHwgY29sbGFwc2Vfb3JkZXIgXFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCItYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBocGFnZV9wbWRfb3JkZXIgLSAxLCBjb2xsYXBzZV9vcmRlcik7XFxuK1xcbiBcXHRhcmd2ICs9IG9wdGluZDtcXG4gXFx0YXJnYyAtPSBvcHRpbmQ7XFxuIFxcbiBcXHRpZiAoYXJnYyA9PSAwKSB7XFxuLVxcdFxcdC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovXFxuK1xcdFxcdC8qIE5vIGFyZ3VtZW50czogYW5vbiB1bmRlciBldmVyeSBjb250ZXh0ICovXFxuIFxcdFxcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XFxuK1xcdFxcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xcbiBcXHRcXHRtYWR2aXNlX2NvbnRleHQgPSAgXFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xcbiBcXHRcXHRhbm9uX29wcyA9IFxcdTAwMjZfX2Fub25fb3BzO1xcbiBcXHRcXHRyZXR1cm47XFxuQEAgLTEyMjYsMTMgKzE1NzYsMTQgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFxuIFxcdGlmICghc3RyY21wKHRva2VuLCBcXFwiYWxsXFxcIikpIHtcXG4gXFx0XFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XFxuIFxcdFxcdG1hZHZpc2VfY29udGV4dCA9ICBcXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XFxuK1xcdFxcdC8qIFRoZSBtVEhQIGNvbnRleHQgaGFzIG9ubHkgYW5vbiBjYXNlczsgbGV0IG90aGVyIG1lbV90eXBlcyBkcm9wIGl0ICovXFxuK1xcdFxcdG10aHBfY29udGV4dF9pbXBsaWVkID0gdHJ1ZTtcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcXFwia2h1Z2VwYWdlZFxcXCIpKSB7XFxuIFxcdFxcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXFxcIm10aHBfa2h1Z2VwYWdlZFxcXCIpKSB7XFxuIFxcdFxcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xcbi1cXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzYz0gMCB8fCBjb2xsYXBzZV9vcmRlciBcXHUwMDNlPSBocGFnZV9wbWRfb3JkZXIpXFxuLVxcdFxcdFxcdHVzYWdlKCk7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXFxcIm1hZHZpc2VcXFwiKSkge1xcbiBcXHRcXHRtYWR2aXNlX2NvbnRleHQgPSAgXFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xcbiBcXHR9IGVsc2Uge1xcbkBAIC0xMjQ4LDIwICsxNTk5LDIwIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcztcXG4gXFx0XFx0YW5vbl9vcHMgPSBcXHUwMDI2X19hbm9uX29wcztcXG4gXFx0XFx0c2htZW1fb3BzID0gXFx1MDAyNl9fc2htZW1fb3BzO1xcbi1cXHRcXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXFxuLVxcdFxcdFxcdHVzYWdlKCk7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFxcXCJhbm9uXFxcIikpIHtcXG4gXFx0XFx0YW5vbl9vcHMgPSBcXHUwMDI2X19hbm9uX29wcztcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXFxcImZpbGVcXFwiKSkge1xcbiBcXHRcXHRyZWFkX29ubHlfZmlsZV9vcHMgPSAgXFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xcbiBcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzO1xcbiBcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gIFxcdTAwMjZfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7XFxuLVxcdFxcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcXG4rXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFxcdTAwMjZcXHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcXG4gXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xcbiBcXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcXFwic2htZW1cXFwiKSkge1xcbiBcXHRcXHRzaG1lbV9vcHMgPSBcXHUwMDI2X19zaG1lbV9vcHM7XFxuLVxcdFxcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcXG4rXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFxcdTAwMjZcXHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcXG4gXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHR1c2FnZSgpO1xcbiBcXHR9XFxuQEAgLTEyODMsOSArMTYzNCwxMCBAQCBzdHJ1Y3QgdGVzdF9jYXNlIHtcXG4gXFx0c3RydWN0IG1lbV9vcHMgKm9wcztcXG4gXFx0Y29uc3QgY2hhciAqZGVzYztcXG4gXFx0dGVzdF9mbiBmbjtcXG4rXFx0aW50IG9yZGVyO1xcdFxcdC8qIG1USFAgY29udGV4dHM6IHRoZSBjb2xsYXBzZSBvcmRlciAqL1xcbiB9O1xcbiBcXG4tI2RlZmluZSBNQVhfVEVTVF9DQVNFUyA2NFxcbisjZGVmaW5lIE1BWF9URVNUX0NBU0VTIDI1NlxcbiBzdGF0aWMgc3RydWN0IHRlc3RfY2FzZSB0ZXN0X2Nhc2VzW01BWF9URVNUX0NBU0VTXTtcXG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xcbiBcXG5AQCAtMTI5OCw2ICsxNjUwLDcgQEAgc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xcbiBcXHRcXHRcXHQub3BzXFx0PSBvLFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4gXFx0XFx0XFx0LmRlc2NcXHQ9ICN0LFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4gXFx0XFx0XFx0LmZuXFx0PSB0LFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0Lm9yZGVyXFx0PSBjb2xsYXBzZV9vcmRlcixcXHRcXHRcXHRcXFxcXFxuIFxcdFxcdH07XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHR9XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHR9IHdoaWxlICgwKVxcbkBAIC0xMzM4LDggKzE2OTEsNjYgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXG4gXFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xcbiBcXG4rXFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgb3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcXG4rXFxuK1xcdFxcdGlmIChjb2xsYXBzZV9vcmRlcl9zZXQpIHtcXG4rXFx0XFx0XFx0aWYgKCEob3JkZXJzIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIpO1xcbitcXHRcXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzYz0gYW5vbl9vcmRlcilcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIi1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gY29sbGFwc2Vfb3JkZXI7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIEV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBhYm92ZSB0aGUgc291cmNlOiAtcyBtYWtlcyB0aGVcXG4rXFx0XFx0XFx0ICogZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlciwgc28gYSB0YXJnZXRcXG4rXFx0XFx0XFx0ICogYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2UuXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRpbnQgZmlyc3QgPSBhbm9uX29yZGVyICsgMTtcXG4rXFxuK1xcdFxcdFxcdGlmIChmaXJzdCBcXHUwMDNjIE1JTl9NVEhQX09SREVSKVxcbitcXHRcXHRcXHRcXHRmaXJzdCA9IE1JTl9NVEhQX09SREVSO1xcbitcXHRcXHRcXHRmb3IgKGludCBpID0gZmlyc3Q7IGkgXFx1MDAzYyBocGFnZV9wbWRfb3JkZXI7IGkrKykge1xcbitcXHRcXHRcXHRcXHRpZiAob3JkZXJzIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSlcXG4rXFx0XFx0XFx0XFx0XFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycysrXSA9IGk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0aWYgKCFucl9jb2xsYXBzZV9vcmRlcnMpXFxuK1xcdFxcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJtVEhQIGNhc2VzIHNraXBwZWQ6IG5vIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2VcXFxcblxcXCIpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xcbitcXHRcXHRwYWdlbWFwX2ZkID0gb3BlbihcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcIiwgT19SRE9OTFkpO1xcbitcXHRcXHRpZiAocGFnZW1hcF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXFxcIik7XFxuK1xcdFxcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwib3BlbigvcHJvYy9rcGFnZWZsYWdzKVxcXCIpO1xcbitcXHR9XFxuK1xcbiBcXHRzZXRidWYoc3Rkb3V0LCBOVUxMKTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFdpdGhvdXQgYSBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbyB0aGUga2VybmVsIHJlZnVzZXMgdGhlc2VcXG4rXFx0ICogY29sbGFwc2VzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuXFxuK1xcdCAqL1xcbitcXHRpZiAoISh0aHBfZmlsZV9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGhwYWdlX3BtZF9vcmRlcikpKSB7XFxuK1xcdFxcdGlmIChzaG1lbV9vcHMpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm5vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHNobWVtX29wcyA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKHJlYWRfb25seV9maWxlX29wcykge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xcbitcXHRcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSBOVUxMO1xcbitcXHRcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gTlVMTDtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoIWFub25fb3BzIFxcdTAwMjZcXHUwMDI2ICFzaG1lbV9vcHMgXFx1MDAyNlxcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcXG4rXFx0XFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIk5vIG1lbV90eXBlIGxlZnQgdG8gcnVuXFxcXG5cXFwiKTtcXG4rXFx0fVxcbitcXG4gXFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxO1xcbiBcXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc3dhcCA9IGhwYWdlX3BtZF9uciAvIDg7XFxuIFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyO1xcbkBAIC0xMzU3LDcgKzE3NjgsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTtcXG4tXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIG5yX2NvbGxhcHNlX29yZGVyczsgaSsrKSB7XFxuK1xcdFxcdGNvbGxhcHNlX29yZGVyID0gY29sbGFwc2Vfb3JkZXJzW2ldO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdH1cXG4rXFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG5AQCAtMTM2NSwxMSArMTc4Niw4IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7XFxuIFxcbiBcXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4tXFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcbi1cXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9tdGhwLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbi1cXG4gXFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xcbkBAIC0xNDI0LDYgKzE4NDIsOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXG4rXFx0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFxuIFxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcXG4gXFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG5AQCAtMTQzOSw3ICsxODYwLDE1IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBucl90ZXN0X2Nhc2VzOyBpKyspIHtcXG4gXFx0XFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFxcdTAwMjZ0ZXN0X2Nhc2VzW2ldO1xcbiBcXG4tXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIlxcXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcXFxuXFxcIiwgdC1cXHUwMDNlZGVzYywgdC1cXHUwMDNlY3R4LVxcdTAwM2VuYW1lLCB0LVxcdTAwM2VvcHMtXFx1MDAzZW5hbWUpO1xcbitcXHRcXHRpZiAodC1cXHUwMDNlY3R4ID09IFxcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XFxuK1xcdFxcdFxcdGNvbGxhcHNlX29yZGVyID0gdC1cXHUwMDNlb3JkZXI7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJcXFxcbiMgUnVuIHRlc3Q6ICVzICglczolcywgb3JkZXIgJWQpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdC1cXHUwMDNlZGVzYywgdC1cXHUwMDNlY3R4LVxcdTAwM2VuYW1lLCB0LVxcdTAwM2VvcHMtXFx1MDAzZW5hbWUsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB0LVxcdTAwM2VvcmRlcik7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJcXFxcbiMgUnVuIHRlc3Q6ICVzICglczolcylcXFxcblxcXCIsIHQtXFx1MDAzZWRlc2MsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB0LVxcdTAwM2VjdHgtXFx1MDAzZW5hbWUsIHQtXFx1MDAzZW9wcy1cXHUwMDNlbmFtZSk7XFxuK1xcdFxcdH1cXG4gXFx0XFx0dC1cXHUwMDNlZm4odC1cXHUwMDNlY3R4LCB0LVxcdTAwM2VvcHMpO1xcbiBcXHR9XFxuIFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5jMzQ3OGI1MTIzZTIzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXFxuQEAgLTAsMCArMSw1MzMgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogUmFjZSBjb2xsYXBzZSBhZ2FpbnN0IGZhdWx0cywgR1VQIHBpbnMsIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRFxcbisgKiBvdmVyIHRoZSBzYW1lIHJhbmdlcy4gIEEgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yIGFzXFxuKyAqIHplcm8sIG5ldmVyIGFueXRoaW5nIGVsc2U7IHRoZSBrZXJuZWwncyBvd24gYXNzZXJ0aW9ucyBpbiBkbWVzZyBhcmUgdGhlXFxuKyAqIG90aGVyIGhhbGYgb2YgdGhlIGNoZWNrLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZXJybm8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy90aW1lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwia3NlbGZ0ZXN0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ2bV91dGlsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJodWdlcGFnZV9zZXR0aW5ncy5oXFxcIlxcbisjaW5jbHVkZSBcXFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFxcXCJcXG4rXFxuKyNpZm5kZWYgRk9MTF9XUklURVxcbisjZGVmaW5lIEZPTExfV1JJVEUgMHgwMVxcbisjZW5kaWZcXG4rXFxuKyNkZWZpbmUgQkFTRV9BRERSXFx0KCh2b2lkICopKDFVTCBcXHUwMDNjXFx1MDAzYyAzMCkpXFxuKyNkZWZpbmUgUEFTU19USU1FT1VUX1NcXHQzMFxcbitcXG4rLypcXG4rICogUE1ELXNpemVkIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzaGFyZSwgcGx1cyBvbmUgZm9yIHRoZSBtcmVtYXBcXG4rICogdGhyZWFkLiAgLWEgc2hyaW5rcyBpdCB3aGVyZSBhIFBNRCBpcyA1MTJNLlxcbisgKi9cXG4rI2RlZmluZSBERUZBVUxUX1NIQVJFRF9BUkVBU1xcdDNcXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XFxuK3N0YXRpYyBpbnQgbnJfYXJlYXM7XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xcbisvKiBucl9hcmVhcyBQTUQtc2l6ZWQgYXJlYXM7IHRoZSBsYXN0IG9uZSBiZWxvbmdzIHRvIHRoZSBtcmVtYXAgdGhyZWFkICovXFxuK3N0YXRpYyBjaGFyICpyZWdpb247XFxuK3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTtcXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9zY3JhdGNoO1xcbitzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1xcbitzdGF0aWMgc2l6ZV90IHBhZ2VvdXRfc2l6ZTtcXG4rc3RhdGljIGludCBndXBfZmQgPSAtMTtcXG4rc3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xcbitzdGF0aWMgdm9sYXRpbGUgaW50IGNvcnJ1cHRlZDtcXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XFxuK1xcbitcXHRyZXR1cm4gdmFsID8gdmFsIDogMTtcXHQvKiBuZXZlciBjb2xsaWRlcyB3aXRoIHRoZSB6ZXJvLWZpbGwgKi9cXG4rfVxcbitcXG4rLyogWmVybyBtZWFucyBuZXZlciB3cml0dGVuOyBhbnl0aGluZyBlbHNlIG11c3QgYmUgdGhpcyBwYWdlJ3MgcGF0dGVybiAqL1xcbitzdGF0aWMgYm9vbCBwYWdlX2lzX2NvcnJ1cHQodW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgaW50ICp2YWwpXFxuK3tcXG4rXFx0KnZhbCA9ICoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcXG4rXFxuK1xcdHJldHVybiAqdmFsIFxcdTAwMjZcXHUwMDI2ICp2YWwgIT0gcGF0dGVybihwYWdlX2lkeCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeClcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgdmFsO1xcbitcXG4rXFx0aWYgKHBhZ2VfaXNfY29ycnVwdChwYWdlX2lkeCwgXFx1MDAyNnZhbCkpIHtcXG4rXFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hhcmVkX3BhZ2VzKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplO1xcbit9XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kX3BhZ2UodW5zaWduZWQgaW50ICpzZWVkKVxcbit7XFxuK1xcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTtcXG4rfVxcbitcXG4rLyogQ2xhbXAgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJ3MgYXJlYSAqL1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XFxuK1xcbitcXHRyZXR1cm4gd2FudCBcXHUwMDNjIGxlZnQgPyB3YW50IDogbGVmdDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgKmZhdWx0ZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXFx1MDAyNnNlZWQpO1xcbitcXG4rXFx0XFx0aWYgKHJhbmRfcihcXHUwMDI2c2VlZCkgXFx1MDAyNiAxKVxcbitcXHRcXHRcXHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPVxcbitcXHRcXHRcXHRcXHRwYXR0ZXJuKHBhZ2VfaWR4KTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRjaGVja19wYWdlKHBhZ2VfaWR4KTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFxcdTAwMjZzZWVkKTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBuciA9IDFVTCBcXHUwMDNjXFx1MDAzYyAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDYpO1xcdC8qIDEuLjMyIHBhZ2VzICovXFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBOb3cgYW5kIHRoZW4gemFwIGEgd2hvbGUgUE1ELWFsaWduZWQgYXJlYTogb25seSBhIHphcCB0aGF0XFxuK1xcdFxcdCAqIGNvdmVycyB0aGUgZnVsbCB0YWJsZSBmcmVlcyB0aGUgdGFibGUgaXRzZWxmIChDT05GSUdfUFRfUkVDTEFJTSkuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoIShyYW5kX3IoXFx1MDAyNnNlZWQpICUgNjQpKSB7XFxuK1xcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJlYSA9IHBhZ2VfaWR4IC9cXG4rXFx0XFx0XFx0XFx0XFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTtcXG4rXFxuK1xcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgYXJlYSAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUsXFxuK1xcdFxcdFxcdFxcdHJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLFxcbitcXHRcXHRcXHRcXHRNQURWX0RPTlRORUVEKTtcXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDUwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7fTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcXHUwMDI2c2VlZCk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbnIgPSByb29tX2Zyb20ocGFnZV9pZHgsIDE2KTtcXG4rXFxuK1xcdFxcdGd1cC5hZGRyID0gKHVuc2lnbmVkIGxvbmcpKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcXG4rXFx0XFx0Z3VwLnNpemUgPSBuciAqIHBhZ2Vfc2l6ZTtcXG4rXFx0XFx0Z3VwLm5yX3BhZ2VzX3Blcl9jYWxsID0gbnI7XFxuK1xcdFxcdGd1cC5ndXBfZmxhZ3MgPSBGT0xMX1dSSVRFO1xcbitcXHRcXHQvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQgKi9cXG4rXFx0XFx0aW9jdGwoZ3VwX2ZkLCBQSU5fRkFTVF9CRU5DSE1BUkssIFxcdTAwMjZndXApO1xcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpmb3JrZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHBpZF90IHBpZCA9IGZvcmsoKTtcXG4rXFxuK1xcdFxcdGlmIChwaWQgPT0gMCkge1xcbitcXHRcXHRcXHR1bnNpZ25lZCBpbnQgdmFsO1xcbitcXHRcXHRcXHRpbnQgYmFkID0gMDtcXG4rXFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIE5vIHN0ZGlvIGluIHRoZSBjaGlsZDogYSB0aHJlYWQgbWF5IGhvbGQgc3Rkb3V0J3NcXG4rXFx0XFx0XFx0ICogbG9jayBhY3Jvc3MgdGhlIGZvcmssIGFuZCBwcmludGluZyB1bmRlciBpdCBoYW5ncy5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgMTY7IGkrKylcXG4rXFx0XFx0XFx0XFx0YmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoXFx1MDAyNnNlZWQpLCBcXHUwMDI2dmFsKTtcXG4rXFx0XFx0XFx0X2V4aXQoYmFkKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAocGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRpbnQgd3N0YXR1cztcXG4rXFxuK1xcdFxcdFxcdGlmICh3YWl0cGlkKHBpZCwgXFx1MDAyNndzdGF0dXMsIDApIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJ3YWl0cGlkKClcXFwiKTtcXG4rXFx0XFx0XFx0LyogQSBjaGlsZCBraWxsZWQgb24gdGhlIHJlYWQgY291bnRzIHRvbyAqL1xcbitcXHRcXHRcXHRpZiAoIVdJRkVYSVRFRCh3c3RhdHVzKSB8fCBXRVhJVFNUQVRVUyh3c3RhdHVzKSlcXG4rXFx0XFx0XFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHR2b2lkICpwO1xcbitcXG4rXFx0XFx0cCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpO1xcbitcXHRcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1yZW1hcCgpIGF3YXlcXFwiKTtcXG4rXFx0XFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyA4OyBpKyspXFxuK1xcdFxcdFxcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXFx1MDAyNnNlZWQpICVcXG4rXFx0XFx0XFx0XFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSkgKiBwYWdlX3NpemVdID0gMTtcXG4rXFx0XFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpO1xcbitcXHRcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1yZW1hcCgpIGJhY2tcXFwiKTtcXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDAwKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLypcXG4rICogU3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm4gb24gYSByZWdpb24gbm90aGluZyBlbHNlIHdyaXRlcywgc28gYSBwYWdlJ3NcXG4rICogcGF0dGVybiBtdXN0IHN1cnZpdmUgdGhlIHRyaXAgdGhyb3VnaCBzd2FwIGV4YWN0bHkuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucjsgaSsrKVxcbitcXHRcXHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XFxuK1xcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yIFxcdTAwMjZcXHUwMDI2ICFzdG9wOyBpKyspIHtcXG4rXFx0XFx0XFx0dW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSArXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XFxuK1xcbitcXHRcXHRcXHRpZiAodmFsICE9IHBhdHRlcm4oaSkpIHtcXG4rXFx0XFx0XFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIlBhZ2VvdXQgY29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisvKiBDb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIHdoaWxlIHRoZXkgYXJlIGJlaW5nIGdhdGhlcmVkICovXFxuK3N0YXRpYyB2b2lkICpjb21wYWN0b3JfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXHRpbnQgZmQgPSBvcGVuKFxcXCIvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnlcXFwiLCBPX1dST05MWSk7XFxuK1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJObyBjb21wYWN0X21lbW9yeTsgY29tcGFjdG9yIGlkbGVcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0aWYgKHdyaXRlKGZkLCBcXFwiMVxcXCIsIDEpIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHVzbGVlcCgxMDAwMCArIHJhbmRfcihcXHUwMDI2c2VlZCkgJSAxMDAwMDApO1xcbitcXHR9XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHN3YXBfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0Y2hhciBsaW5lWzI1Nl07XFxuK1xcdGludCBsaW5lcyA9IDA7XFxuK1xcdEZJTEUgKmZwID0gZm9wZW4oXFxcIi9wcm9jL3N3YXBzXFxcIiwgXFxcInJcXFwiKTtcXG4rXFxuK1xcdGlmICghZnApXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxcbitcXHRcXHRsaW5lcysrO1xcbitcXHRmY2xvc2UoZnApO1xcbitcXHRyZXR1cm4gbGluZXMgXFx1MDAzZSAxO1xcbit9XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGltZXZhbCB0djtcXG4rXFxuK1xcdGdldHRpbWVvZmRheShcXHUwMDI2dHYsIE5VTEwpO1xcbitcXHRyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICsgdHYudHZfdXNlYyAvIDEwMDA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuK3tcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFxuK1xcdFxcdFxcXCJVc2FnZToga2h1Z2VwYWdlZF9yYWNlIFstZCBzZWNvbmRzXSBbLW0gc3RlcHBlZHxmcmVlfG1hZHZpc2VdIFstYSBhcmVhc10gWy10IG1hc2tdXFxcXG5cXFwiXFxuK1xcdFxcdFxcXCJcXFxcdFdpdGhvdXQgLW0sIGV2ZXJ5IG1vZGUgcnVucyBpbiB0dXJuLlxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtZDogc2Vjb25kcyBwZXIgbW9kZSAoZGVmYXVsdCA1KVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtYTogbnVtYmVyIG9mIHNoYXJlZCBQTUQtc2l6ZWQgcGxheWdyb3VuZCBhcmVhcyAoZGVmYXVsdCAzKVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtdDogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCwgZm9yIGJpc2VjdGluZyBhIGZhaWx1cmVcXFxcblxcXCIpO1xcbitcXHRleGl0KDEpO1xcbit9XFxuK1xcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuK3tcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aHJlYWRfbmFtZXNbXSA9IHtcXG4rXFx0XFx0XFxcImZhdWx0ZXJcXFwiLCBcXFwiZmF1bHRlcjJcXFwiLCBcXFwiZG9udG5lZWRcXFwiLCBcXFwicGlubmVyXFxcIiwgXFxcImZvcmtlclxcXCIsXFxuK1xcdFxcdFxcXCJtcmVtYXBwZXJcXFwiLCBcXFwicGFnZW91dFxcXCIsIFxcXCJjb21wYWN0b3JcXFwiLFxcbitcXHR9O1xcbitcXHR2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHtcXG4rXFx0XFx0ZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLFxcbitcXHRcXHRtcmVtYXBwZXJfZm4sIHBhZ2VvdXRfZm4sIGNvbXBhY3Rvcl9mbixcXG4rXFx0fTtcXG4rXFx0ZW51bSB7IFRfRkFVTFRFUiwgVF9GQVVMVEVSMiwgVF9ET05UTkVFRCwgVF9QSU5ORVIsIFRfRk9SS0VSLFxcbitcXHQgICAgICAgVF9NUkVNQVBQRVIsIFRfUEFHRU9VVCwgVF9DT01QQUNUT1IgfTtcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCBcXHUwMDNjXFx1MDAzYyBUX1BBR0VPVVQ7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgY29tcGFjdG9yX2JpdCA9IDFVTCBcXHUwMDNjXFx1MDAzYyBUX0NPTVBBQ1RPUjtcXG4rXFx0Y29uc3QgaW50IG5yX3RocmVhZHMgPSBBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyk7XFxuK1xcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxsX21vZGVzW10gPSB7IFxcXCJzdGVwcGVkXFxcIiwgXFxcImZyZWVcXFwiLCBcXFwibWFkdmlzZVxcXCIgfTtcXG4rXFx0c3RhdGljIGNvbnN0IGJvb2wgb2NjdXBhbmNpZXNbXSA9IHsgZmFsc2UsIHRydWUgfTtcXHQvKiBzdHJpY3QsIGhvbGVzICovXFxuK1xcdHN0YXRpYyBjb25zdCBib29sIHByZXNzdXJlc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1xcdC8qIHF1aWV0LCB1bmRlciBwcmVzc3VyZSAqL1xcbitcXHRjb25zdCBpbnQgbnJfb2NjdXBhbmNpZXMgPSBBUlJBWV9TSVpFKG9jY3VwYW5jaWVzKTtcXG4rXFx0Y29uc3QgaW50IG5yX3ByZXNzdXJlcyA9IEFSUkFZX1NJWkUocHJlc3N1cmVzKTtcXG4rXFx0Y29uc3QgY2hhciAqb25lX21vZGVbMV07XFxuK1xcdGNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7XFxuK1xcdGludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTtcXG4rXFx0Y29uc3QgY2hhciAqbW9kZV9hcmcgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHR1bnNpZ25lZCBsb25nIGVuZF9tcztcXG4rXFx0aW50IGR1cmF0aW9uX3MgPSA1O1xcbitcXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcXG4rXFx0dW5zaWduZWQgbG9uZyBiYXNlX21hc2s7XFxuK1xcdGJvb2wgaGF2ZV9zd2FwO1xcbitcXHRjaGFyIGxhYmVsWzY0XTtcXG4rXFx0aW50IG5yX2FyZWFzX2FyZyA9IDA7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFx0aW50IHN0ZXBzID0gMDtcXG4rXFx0aW50IG9wdDtcXG4rXFxuK1xcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFxcXCJhOmQ6bTp0OmhcXFwiKSkgIT0gLTEpIHtcXG4rXFx0XFx0c3dpdGNoIChvcHQpIHtcXG4rXFx0XFx0Y2FzZSAnYSc6XFxuK1xcdFxcdFxcdG5yX2FyZWFzX2FyZyA9IGF0b2kob3B0YXJnKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ2QnOlxcbitcXHRcXHRcXHRkdXJhdGlvbl9zID0gYXRvaShvcHRhcmcpO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAnbSc6XFxuK1xcdFxcdFxcdG1vZGVfYXJnID0gb3B0YXJnO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAndCc6XFxuK1xcdFxcdFxcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0ZGVmYXVsdDpcXG4rXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRpZiAobW9kZV9hcmcpIHtcXG4rXFx0XFx0aWYgKHN0cmNtcChtb2RlX2FyZywgXFxcInN0ZXBwZWRcXFwiKSBcXHUwMDI2XFx1MDAyNiBzdHJjbXAobW9kZV9hcmcsIFxcXCJmcmVlXFxcIikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIHN0cmNtcChtb2RlX2FyZywgXFxcIm1hZHZpc2VcXFwiKSlcXG4rXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0b25lX21vZGVbMF0gPSBtb2RlX2FyZztcXG4rXFx0XFx0bW9kZXMgPSBvbmVfbW9kZTtcXG4rXFx0XFx0bnJfbW9kZXMgPSAxO1xcbitcXHR9XFxuK1xcbitcXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xcbitcXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XFxuK1xcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcXG4rXFx0aWYgKCFocGFnZV9wbWRfc2l6ZSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXG4rXFx0Z3VwX2ZkID0gb3BlbihcXFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcXFwiLCBPX1JEV1IpO1xcbitcXHRpZiAoZ3VwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIi9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IHJlcXVpcmVzIENPTkZJR19HVVBfVEVTVCBhbmQgcm9vdFxcXFxuXFxcIik7XFxuK1xcbitcXHRucl9zaGFyZWRfYXJlYXMgPSBucl9hcmVhc19hcmcgXFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XFxuK1xcdG5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICsgMTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIE1SRU1BUF9GSVhFRCB1bm1hcHMgd2hhdGV2ZXIgaXMgaW4gdGhlIHdheSB3aXRob3V0IHNheWluZyBzbywgc29cXG4rXFx0ICogY2xhaW0gdGhlIG1yZW1hcCB0aHJlYWQncyBzY3JhdGNoIGFkZHJlc3MgdXAgZnJvbnQuXFxuK1xcdCAqL1xcbitcXHRtcmVtYXBfc2NyYXRjaCA9IChjaGFyICopQkFTRV9BRERSICsgMiAqIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XFxuK1xcdGlmIChtbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9OT05FLFxcbitcXHRcXHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSxcXG4rXFx0XFx0IC0xLCAwKSAhPSAodm9pZCAqKW1yZW1hcF9zY3JhdGNoKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKSBtcmVtYXAgc2NyYXRjaFxcXCIpO1xcbitcXG4rXFx0YmFzZV9tYXNrID0gdGhyZWFkX21hc2s7XFxuK1xcdGhhdmVfc3dhcCA9IHN3YXBfYXZhaWxhYmxlKCk7XFxuK1xcdGlmICghaGF2ZV9zd2FwKVxcbitcXHRcXHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZSAqL1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibm8gc3dhcDogdGhlIHBhZ2VvdXQgdGhyZWFkIGlzIG5vdCBzdGFydGVkXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7XFxuK1xcbitcXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xcbitcXHR0aHBfcmVhZF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRmb3IgKGludCBydW4gPSAwOyBydW4gXFx1MDAzYyBucl9tb2RlcyAqIG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzOyBydW4rKykge1xcbitcXHRcXHRpbnQgcmVtID0gcnVuICUgKG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKTtcXG4rXFx0XFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldO1xcbitcXHRcXHRib29sIGhvbGVzID0gb2NjdXBhbmNpZXNbcmVtIC8gbnJfcHJlc3N1cmVzXTtcXG4rXFx0XFx0Ym9vbCBwcmVzc3VyZSA9IHByZXNzdXJlc1tyZW0gJSBucl9wcmVzc3VyZXNdO1xcbitcXG4rXFx0XFx0c25wcmludGYobGFiZWwsIHNpemVvZihsYWJlbCksIFxcXCIlcy8lcyVzXFxcIiwgbW9kZSxcXG4rXFx0XFx0XFx0IGhvbGVzID8gXFxcImhvbGVzXFxcIiA6IFxcXCJzdHJpY3RcXFwiLCBwcmVzc3VyZSA/IFxcXCIvcHJlc3N1cmVcXFwiIDogXFxcIlxcXCIpO1xcbitcXHRcXHRpZiAoY29ycnVwdGVkKSB7XFxuK1xcdFxcdFxcdC8qIE1lbW9yeSBpcyBzdXNwZWN0OyB0aGUgcmVzdCB3b3VsZCBwcm92ZSBub3RoaW5nICovXFxuK1xcdFxcdFxcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcXFwiJXM6IHNraXBwZWQgYWZ0ZXIgY29ycnVwdGlvblxcXFxuXFxcIiwgbGFiZWwpO1xcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0dGhyZWFkX21hc2sgPSBiYXNlX21hc2s7XFxuK1xcdFxcdGlmICghcHJlc3N1cmUpXFxuK1xcdFxcdFxcdHRocmVhZF9tYXNrIFxcdTAwMjY9IH4ocGFnZW91dF9iaXQgfCBjb21wYWN0b3JfYml0KTtcXG4rXFx0XFx0ZWxzZSBpZiAoIWhhdmVfc3dhcClcXG4rXFx0XFx0XFx0dGhyZWFkX21hc2sgXFx1MDAyNj0gfnBhZ2VvdXRfYml0O1xcbitcXG4rXFx0XFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0XFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcXG4rXFx0XFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xcbitcXHRcXHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XFxuK1xcdFxcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9XFxuK1xcdFxcdFxcdHN0cmNtcChtb2RlLCBcXFwiZnJlZVxcXCIpID8gMTAwMCA6IDA7XFxuK1xcdFxcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gMTA7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBtVEhQIGNvbGxhcHNlIGhvbm91cnMgb25seSAwIG9yIEhQQUdFX1BNRF9OUiAtIDEgaGVyZS4gIFRoZSB0d29cXG4rXFx0XFx0ICogZW5kcyByYWNlIGRpZmZlcmVudCBwYXRoczogYSBzdHJpY3Qgd2luZG93IGhhcyBldmVyeSBQVEVcXG4rXFx0XFx0ICogcHJlc2VudCwgYSBob2xlLWhlYXZ5IG9uZSBpcyBtb3N0bHkgemVyby1maWxsZWQuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/XFxuK1xcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgLSAxIDogMDtcXG4rXFx0XFx0LyogT25lIHdha2UsIG9uZSBwYXNzOiB0aGUgcGxheWdyb3VuZCBwbHVzIHRoZSBmb3JrZWQgY2hpbGRyZW4ncyBjb3BpZXMgKi9cXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cXG4rXFx0XFx0XFx0bnJfYXJlYXMgKiAoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpICogODtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX09SREVSUzsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSlcXG4rXFx0XFx0XFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0XFx0fVxcbitcXHRcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0XFx0cmVnaW9uID0gbW1hcChCQVNFX0FERFIsIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXFxuK1xcdFxcdFxcdCAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfFxcbitcXHRcXHRcXHQgICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcXG4rXFx0XFx0aWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibW1hcCgpIHBsYXlncm91bmRcXFwiKTtcXG4rXFx0XFx0bXJlbWFwX2FyZWEgPSByZWdpb24gKyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcXG4rXFxuK1xcdFxcdGlmICh0aHJlYWRfbWFzayBcXHUwMDI2IHBhZ2VvdXRfYml0KSB7XFxuK1xcdFxcdFxcdC8qIEVub3VnaCB0byBkcml2ZSByZWFsIHJlY2xhaW0gd2l0aG91dCBzd2FtcGluZyBhIHNtYWxsIGd1ZXN0ICovXFxuK1xcdFxcdFxcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcXG4rXFx0XFx0XFx0aWYgKHBhZ2VvdXRfc2l6ZSBcXHUwMDNjIDE2VUwgXFx1MDAzY1xcdTAwM2MgMjApXFxuK1xcdFxcdFxcdFxcdHBhZ2VvdXRfc2l6ZSA9IDE2VUwgXFx1MDAzY1xcdTAwM2MgMjA7XFxuK1xcdFxcdFxcdGlmIChwYWdlb3V0X3NpemUgXFx1MDAzZSA2NFVMIFxcdTAwM2NcXHUwMDNjIDIwKVxcbitcXHRcXHRcXHRcXHRwYWdlb3V0X3NpemUgPSA2NFVMIFxcdTAwM2NcXHUwMDNjIDIwO1xcbitcXHRcXHRcXHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcXG4rXFx0XFx0XFx0aWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKSBwYWdlb3V0IGFyZWFcXFwiKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LyogUG9wdWxhdGUgc28gdGhlIGZpcnN0IHBhc3MgaGFzIHNvbWV0aGluZyB0byBjb2xsYXBzZSAqL1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcXG4rXFx0XFx0XFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xcbitcXHRcXHRtZW1zZXQobXJlbWFwX2FyZWEsIDEsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0XFx0aWYgKG1hZHZpc2UocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSlcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXFxcIik7XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfdGhyZWFkczsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICghKHRocmVhZF9tYXNrIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSkpIHtcXG4rXFx0XFx0XFx0XFx0dGhyZWFkc1tpXSA9IDA7XFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGlmIChwdGhyZWFkX2NyZWF0ZShcXHUwMDI2dGhyZWFkc1tpXSwgTlVMTCwgdGhyZWFkX2Zuc1tpXSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgKHZvaWQgKikoaSArIDEpKSlcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKHRocmVhZF9uYW1lc1tpXSk7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGVuZF9tcyA9IG5vd19tcygpICsgZHVyYXRpb25fcyAqIDEwMDBVTDtcXG4rXFx0XFx0aWYgKCFzdHJjbXAobW9kZSwgXFxcInN0ZXBwZWRcXFwiKSkge1xcbitcXHRcXHRcXHR3aGlsZSAobm93X21zKCkgXFx1MDAzYyBlbmRfbXMgXFx1MDAyNlxcdTAwMjYgIWNvcnJ1cHRlZCkge1xcbitcXHRcXHRcXHRcXHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKFBBU1NfVElNRU9VVF9TKSlcXG4rXFx0XFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0XFx0c3RlcHMrKztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgXFxcImZyZWVcXFwiKSkge1xcbitcXHRcXHRcXHR3aGlsZSAobm93X21zKCkgXFx1MDAzYyBlbmRfbXMgXFx1MDAyNlxcdTAwMjYgIWNvcnJ1cHRlZClcXG4rXFx0XFx0XFx0XFx0dXNsZWVwKDEwMCAqIDEwMDApO1xcbitcXHRcXHR9IGVsc2Uge1xcdC8qIG1hZHZpc2UgKi9cXG4rXFx0XFx0XFx0d2hpbGUgKG5vd19tcygpIFxcdTAwM2MgZW5kX21zIFxcdTAwMjZcXHUwMDI2ICFjb3JydXB0ZWQpIHtcXG4rXFx0XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3NoYXJlZF9hcmVhczsgaSsrKSB7XFxuK1xcdFxcdFxcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgaSAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0XFx0bWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRcXHRNQURWX0RPTlRORUVEKTtcXG4rXFx0XFx0XFx0XFx0c3RlcHMrKztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRzdG9wID0gMTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xcbitcXHRcXHRcXHRpZiAodGhyZWFkc1tpXSlcXG4rXFx0XFx0XFx0XFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcXG4rXFx0XFx0XFx0Y2hlY2tfcGFnZShpKTtcXG4rXFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCwgXFxcIiVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgbGFiZWwsIGR1cmF0aW9uX3MsIHN0ZXBzKTtcXG4rXFxuK1xcdFxcdC8qIFRoZSBuZXh0IG1vZGUgbWFwcyB0aGUgc2FtZSBmaXhlZCBhZGRyZXNzIHdpdGggaXRzIG93biBzZXR0aW5ncyAqL1xcbitcXHRcXHRtdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0XFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xcbitcXHRcXHRcXHRtdW5tYXAocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUpO1xcbitcXHRcXHRcXHRwYWdlb3V0X2FyZWEgPSBOVUxMO1xcbitcXHRcXHR9XFxuK1xcdFxcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0XFx0c3RvcCA9IDA7XFxuK1xcdFxcdHN0ZXBzID0gMDtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9maW5pc2hlZCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjFjMWI5NDJhYzMyNThcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcXG5AQCAtMCwwICsxLDE3OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBDaGVjayB0aGF0IGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZHJpdmVzIGtodWdlcGFnZWQgaW4gc3RlcDogb25lIGJhcnJpZXJcXG4rICogb3ZlciBvbmUgcHJlcGFyZWQgd2luZG93IG11c3QgY29sbGFwc2UgaXQgd2l0aCBleGFjdGx5IG9uZSBjb2xsYXBzZVxcbisgKiBhdHRlbXB0IGF0dHJpYnV0ZWQgdG8gaXRzIHNvdXJjZSBwYWdlcywgc3RlcCBhZnRlciBzdGVwLlxcbisgKlxcbisgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBhIG1pbnV0ZSBzbyB0aGF0IGEgc3RlcCB3aGljaCBzbGVwdCBpbnN0ZWFkIG9mXFxuKyAqIGJlaW5nIHdva2VuIGJsb3dzIHRoZSBidWRnZXQuXFxuKyAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwia3NlbGZ0ZXN0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ2bV91dGlsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJodWdlcGFnZV9zZXR0aW5ncy5oXFxcIlxcbitcXG4rI2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCBcXHUwMDNjXFx1MDAzYyAzMCkpXFxuKy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXFxuKyNkZWZpbmUgVEFSR0VUX09SREVSIDJcXG4rI2RlZmluZSBOUl9JVEVSQVRJT05TIDVcXG4rI2RlZmluZSBQQVNTX1RJTUVPVVRfUyAzMFxcbitcXG4rc3RhdGljIGludCBwYWdlbWFwX2ZkO1xcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XFxuK3N0YXRpYyBpbnQgdHJhY2VfZXZlbnRzX2ZkID0gLTE7XFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplO1xcbitcXG4rLypcXG4rICogVGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGU6IHN3aXRjaCB0aGVtIG9mZiBob3dldmVyIHRoZSB0ZXN0IGVuZHMsXFxuKyAqIGluY2x1ZGluZyBmcm9tIGluc2lkZSBhIGhlbHBlciB0aGF0IGdpdmVzIHVwLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgdHJhY2VfZXZlbnRzX29mZih2b2lkKVxcbit7XFxuK1xcdGlmICh0cmFjZV9ldmVudHNfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0dHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpO1xcbit9XFxuK1xcbisvKiBDb3VudCB0aGUgaXNvbGF0ZSBldmVudHMgd2hvc2Ugc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cncyBzb3VyY2UgUEZOcyAqL1xcbitzdGF0aWMgaW50IGNvdW50X2F0dHJpYnV0ZWQodW5zaWduZWQgbG9uZyAqcGZucywgaW50IG5yX3BmbnMsXFxuK1xcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXFxuK3tcXG4rXFx0Y2hhciBsaW5lWzEwMjRdO1xcbitcXHRpbnQgY291bnQgPSAwO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gdHJhY2luZ19vcGVuX3RyYWNlKCk7XFxuK1xcdGlmICghZnApXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiQ2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHZhbDtcXG4rXFx0XFx0dW5zaWduZWQgaW50IG9yZDtcXG4rXFx0XFx0Y2hhciAqcywgKm87XFxuK1xcdFxcdGludCBpO1xcbitcXG4rXFx0XFx0cyA9IHN0cnN0cihsaW5lLCBcXFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6XFxcIik7XFxuK1xcdFxcdGlmICghcylcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGlmIChzc2NhbmYocywgXFxcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOiBzY2FuX3Bmbj0weCVseFxcXCIsXFxuK1xcdFxcdFxcdCAgIFxcdTAwMjZ2YWwpICE9IDEpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRvID0gc3Ryc3RyKHMsIFxcXCJvcmRlcj1cXFwiKTtcXG4rXFx0XFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcXFwib3JkZXI9JXVcXFwiLCBcXHUwMDI2b3JkKSAhPSAxIHx8IG9yZCAhPSBvcmRlcilcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wZm5zOyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKHZhbCA9PSBwZm5zW2ldKSB7XFxuK1xcdFxcdFxcdFxcdGNvdW50Kys7XFxuK1xcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRmY2xvc2UoZnApO1xcbitcXHRyZXR1cm4gY291bnQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pXFxuK3tcXG4rXFx0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSO1xcbitcXHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUjtcXG4rXFx0dW5zaWduZWQgbG9uZyBwZm5zWzEgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSXTtcXG4rXFx0Ym9vbCBjb2xsYXBzZWQsIHBhc3NlZDtcXG4rXFx0aW50IGF0dHJpYnV0ZWQ7XFxuK1xcdGNoYXIgKnA7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0cCA9IG1tYXAoQkFTRV9BRERSLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcXG4rXFx0aWYgKHAgIT0gQkFTRV9BRERSKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKSB3aW5kb3dcXFwiKTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XFxuK1xcdFxcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0XFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIENsZWFyIGJlZm9yZSBlbmFibGluZyBzbyB0aGUgYnVmZmVyIGhvbGRzIG9ubHkgdGhpcyBzdGVwJ3MgZXZlbnRzICovXFxuK1xcdGlmICh0cmFjaW5nX2NsZWFyX3RyYWNlKCkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiQ2Fubm90IGNsZWFyIHRoZSB0cmFjZSBidWZmZXJcXFxcblxcXCIpO1xcbitcXHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiQ2Fubm90IGVuYWJsZSBodWdlX21lbW9yeSBldmVudHNcXFxcblxcXCIpO1xcbitcXG4rXFx0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9IVUdFUEFHRSlcXFwiKTtcXG4rXFx0cGFzc2VkID0ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoUEFTU19USU1FT1VUX1MpO1xcbitcXG4rXFx0LyogT2ZmIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBnaXZlIHVwOiB0aGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSAqL1xcbitcXHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkNhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcXFxuXFxcIik7XFxuK1xcdGlmICghcGFzc2VkKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcImtodWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xcXFxuXFxcIik7XFxuK1xcbitcXHRjb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgd2luZG93LCBUQVJHRVRfT1JERVIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XFxuK1xcdGF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCBUQVJHRVRfT1JERVIpO1xcbitcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXFx1MDAyNlxcdTAwMjYgYXR0cmlidXRlZCA9PSAxLFxcbitcXHRcXHRcXHQgXFxcInN0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTtcXG4rXFxuK1xcdG11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK31cXG4rXFxuK2ludCBtYWluKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xcbitcXG4rXFx0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcXFxuXFxcIik7XFxuK1xcdGlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUikpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgVEFSR0VUX09SREVSKTtcXG4rXFxuK1xcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcXG4rXFx0aWYgKCFocGFnZV9wbWRfc2l6ZSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRwYWdlbWFwX2ZkID0gb3BlbihcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAocGFnZW1hcF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXFxcIik7XFxuK1xcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcXFxcblxcXCIpO1xcbitcXHR0cmFjZV9ldmVudHNfZmQgPSB0cmFjaW5nX2V2ZW50c19vcGVuKFxcXCJodWdlX21lbW9yeVxcXCIpO1xcbitcXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcImh1Z2VfbWVtb3J5IGV2ZW50cyByZXF1aXJlIHRyYWNlZnMgYW5kIHJvb3RcXFxcblxcXCIpO1xcbitcXHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcXG4rXFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPSA2MCAqIDEwMDA7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAgKiAxMDAwO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAoaHBhZ2VfcG1kX3NpemUgLyBnZXRwYWdlc2l6ZSgpKSAtIDE7XFxuK1xcdC8qIE9uZSB3YWtlIG11c3QgY29tcGxldGUgb25lIGZ1bGwgcGFzczsgc2VlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgKi9cXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMIFxcdTAwM2NcXHUwMDNjIDI0O1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XFxuK1xcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZCAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX0lURVJBVElPTlM7IGkrKylcXG4rXFx0XFx0b25lX3N0ZXAoaSk7XFxuK1xcbitcXHRrc2Z0X2ZpbmlzaGVkKCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xcbmluZGV4IGYxOWQ1M2M2OTU3NjQuLmZkMzVmOGE3YjViODMgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xcbkBAIC0yMCw3ICsyMCw2IEBAXFxuIFxcbiAjZGVmaW5lIFRXT01FR1xcdFxcdCgyXFx1MDAzY1xcdTAwM2MyMClcXG4gI2RlZmluZSBSVU5USU1FXFx0XFx0KDIwKVxcbi0jZGVmaW5lIEFMSUdOKHgsIGEpXFx0KCgoeCkgKyAoYSAtIDEpKSBcXHUwMDI2ICh+KChhKSAtIDEpKSlcXG4gXFxuIEhVR0VUTEJfU0VUVVBfREVGQVVMVF9QQUdFUygxKVxcbiBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxcbmluZGV4IGQwOWY5ZjZhMzg0ZWUuLmZjNjE5MDdhYTNiMmEgMTAwNzU1XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxcbkBAIC00MDIsNiArNDAyLDEyIEBAIENBVEVHT1JZPVxcXCJwZm5tYXBcXFwiIHJ1bl90ZXN0IC4vcGZubWFwXFxuICMgQ09XIHRlc3RzXFxuIENBVEVHT1JZPVxcXCJjb3dcXFwiIHJ1bl90ZXN0IC4vY293XFxuIFxcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrXFxuK1xcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfc3luY19jaGVja1xcbitcXG4rQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2VcXG4rXFxuIENBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZFxcbiBcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDJcXG5AQCAtNDEwLDggKzQxNiw2IEBAIENBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCBhbGw6c2htZW1cXG4gXFxuIENBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyA0IGFsbDpzaG1lbVxcbiBcXG4tQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub25cXG4tXFxuICMgVHJ5IHRvIGNyZWF0ZSBYRlMgaWYgbm90IHByb3ZpZGVkXFxuIGlmIFsgLXogXFxcIiR7U1BMSVRfSFVHRV9QQUdFX1RFU1RfWEZTX1BBVEh9XFxcIiBdOyB0aGVuXFxuICAgICBpZiB0ZXN0X3NlbGVjdGVkIFxcXCJ0aHBcXFwiOyB0aGVuXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXFxuaW5kZXggODZhNjAzNjkyODI2MS4uMGFkZmU3ZGRlN2U1OSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xcbkBAIC00Miw2OCArNDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXCI7XFxuIGludCBwYWdlbWFwX2ZkO1xcbiBpbnQga3BhZ2VmbGFnc19mZDtcXG4gXFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcXG4tXFx0XFx0aW50IGtwYWdlZmxhZ3NfZmQpXFxuLXtcXG4tXFx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcXG4tXFx0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcXG4tXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcjtcXG4tXFx0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcXG4tXFx0dWludDY0X3QgcGZuX2ZsYWdzO1xcbi1cXHR1bnNpZ25lZCBsb25nIHBmbjtcXG4tXFx0dW5zaWduZWQgbG9uZyBpO1xcbi1cXG4tXFx0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcXG4tXFxuLVxcdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cXG4tXFx0aWYgKHBmbiA9PSAtMVVMKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbi1cXHRcXHRnb3RvIGZhaWw7XFxuLVxcbi1cXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xcbi1cXHRpZiAoIW9yZGVyKSB7XFxuLVxcdFxcdGlmIChwZm5fZmxhZ3MgXFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxcbi1cXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXHR9XFxuLVxcbi1cXHQvKiBub24gVEhQIGZvbGlvICovXFxuLVxcdGlmICghKHBmbl9mbGFncyBcXHUwMDI2IEtQRl9USFApKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHRwZm5faGVhZCA9IHBmbiBcXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcXG4tXFxuLVxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0Z290byBmYWlsO1xcbi1cXG4tXFx0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cXG4tXFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cXG4tXFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcXG4tXFx0XFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0XFx0Z290byBmYWlsO1xcbi1cXHRcXHRpZiAoKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXFxuLVxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcXG4tXFx0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxcbi1cXHQgKi9cXG4tXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXG4tXFx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xcbi1cXHRyZXR1cm4gKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XFxuLWZhaWw6XFxuLVxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiRmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxcXG5cXFwiKTtcXG4tXFx0cmV0dXJuIGZhbHNlO1xcbi19XFxuLVxcbiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcXG4gXFx0XFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpXFxuIHtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXFxuaW5kZXggNDgyMWEzNTYzMDM2My4uYWY4MzI0ZTFlOGYyYyAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcXG5AQCAtNDkwLDYgKzQ5MCwxNTMgQEAgaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbitib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0aW50IGtwYWdlZmxhZ3NfZmQpXFxuK3tcXG4rXFx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcXG4rXFx0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcjtcXG4rXFx0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcXG4rXFx0dWludDY0X3QgcGZuX2ZsYWdzO1xcbitcXHR1bnNpZ25lZCBsb25nIHBmbjtcXG4rXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXG4rXFx0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcXG4rXFxuK1xcdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cXG4rXFx0aWYgKHBmbiA9PSAtMVVMKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xcbitcXHRpZiAoIW9yZGVyKSB7XFxuK1xcdFxcdGlmIChwZm5fZmxhZ3MgXFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXHR9XFxuK1xcbitcXHQvKiBub24gVEhQIGZvbGlvICovXFxuK1xcdGlmICghKHBmbl9mbGFncyBcXHUwMDI2IEtQRl9USFApKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRwZm5faGVhZCA9IHBmbiBcXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcXG4rXFxuK1xcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cXG4rXFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cXG4rXFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcXG4rXFx0XFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4rXFx0XFx0XFx0Z290byBmYWlsO1xcbitcXHRcXHRpZiAoKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcXG4rXFx0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxcbitcXHQgKi9cXG4rXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXG4rXFx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xcbitcXHRyZXR1cm4gKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XFxuK2ZhaWw6XFxuK1xcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiRmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxcXG5cXFwiKTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbisvKipcXG4rICogaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKCkgLSBjaGVjayB0aGF0IGEgcmFuZ2UgaXMgYmFja2VkIGJ5IEBvcmRlciBmb2xpb3NcXG4rICogQHN0YXJ0OiBzdGFydCBvZiB0aGUgcmFuZ2UsIGEgbXVsdGlwbGUgb2YgdGhlIGZvbGlvIHNpemVcXG4rICogQGxlbjogbGVuZ3RoIG9mIHRoZSByYW5nZSBpbiBieXRlcywgYSBtdWx0aXBsZSBvZiB0aGUgZm9saW8gc2l6ZVxcbisgKiBAb3JkZXI6IHRoZSBmb2xpbyBvcmRlciB0byBjaGVjayBmb3JcXG4rICogQHBhZ2VtYXBfZmQ6IG9wZW4gL3Byb2MvXFx1MDAzY3BpZFxcdTAwM2UvcGFnZW1hcCBvZiB0aGUgcmFuZ2UncyBvd25lclxcbisgKiBAa3BhZ2VmbGFnc19mZDogb3BlbiAvcHJvYy9rcGFnZWZsYWdzXFxuKyAqXFxuKyAqIEV2ZXJ5IGZvbGlvLXNpemVkLCBmb2xpby1hbGlnbmVkIHBhcnQgb2YgdGhlIHJhbmdlIG11c3QgbWFwIG9uZSBmb2xpbyBvZlxcbisgKiBAb3JkZXIsIGhlYWQgdG8gdGFpbCwgd2l0aCB0aGUgaGVhZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhcnQuICBBIHBhcnRcXG4rICogYmFja2VkIGJ5IHNldmVyYWwgc21hbGxlciBmb2xpb3MgZmFpbHMsIGFuZCBzbyBkb2VzIGEgZm9saW8gbWFwcGVkIG9mZlxcbisgKiBpdHMgbmF0dXJhbCBhbGlnbm1lbnQuXFxuKyAqXFxuKyAqIFJldHVybnM6IHRydWUgaWYgdGhlIHdob2xlIHJhbmdlIGlzIGJhY2tlZCB0aGF0IHdheSwgZmFsc2Ugb3RoZXJ3aXNlLlxcbisgKi9cXG4rYm9vbCBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcXG4rXFx0XFx0XFx0ICAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKVxcbit7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdGNvbnN0IHNpemVfdCBmb2xpb19zaXplID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xcbitcXHRjaGFyICp2YWRkcjtcXG4rXFxuK1xcdGlmICgodWludHB0cl90KXN0YXJ0ICUgZm9saW9fc2l6ZSB8fCBsZW4gJSBmb2xpb19zaXplKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRmb3IgKHZhZGRyID0gc3RhcnQ7IHZhZGRyIFxcdTAwM2Mgc3RhcnQgKyBsZW47IHZhZGRyICs9IGZvbGlvX3NpemUpIHtcXG4rXFx0XFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRcXHQvKiBOb3QgcHJlc2VudCwgb3IgYSB0YWlsIHBhZ2UgKi9cXG4rXFx0XFx0aWYgKHBmbiA9PSAtMVVMIHx8IHBmbiAlIG5yX3BhZ2VzKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xcbitcXHRcXHRcXHRjaGFyICpwYWdlID0gdmFkZHIgKyBpICogcHNpemUoKTtcXG4rXFxuK1xcdFxcdFxcdGlmIChwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcGFnZSkgIT0gcGZuICsgaSlcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRpZiAoIWlzX2JhY2tlZF9ieV9mb2xpbyh2YWRkciwgb3JkZXIsIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbisjZGVmaW5lIFRSQUNFRlNfUk9PVCBcXFwiL3N5cy9rZXJuZWwvdHJhY2luZ1xcXCJcXG4rXFxuKy8qXFxuKyAqIFJldHVybnMgLTEgd2l0aG91dCB0cmFjZWZzIG9yIHRoZSBzdWJzeXN0ZW0uICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZTpcXG4rICogd2hvZXZlciBzd2l0Y2hlcyB0aGVtIG9uIGhhcyB0byBzd2l0Y2ggdGhlbSBvZmYgYWdhaW4sIG9uIGV2ZXJ5IGV4aXQgcGF0aC5cXG4rICovXFxuK2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcXG4re1xcbitcXHRjaGFyIHBhdGhbMjU2XTtcXG4rXFxuK1xcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UIFxcXCIvZXZlbnRzLyVzL2VuYWJsZVxcXCIsXFxuK1xcdFxcdCBzdWJzeXMpO1xcbitcXHRyZXR1cm4gb3BlbihwYXRoLCBPX1dST05MWSk7XFxuK31cXG4rXFxuK2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSlcXG4re1xcbitcXHRpZiAocHdyaXRlKGZkLCBlbmFibGUgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIsIDEsIDApICE9IDEpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhciAqL1xcbitpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKVxcbit7XFxuK1xcdGludCBmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFxcXCIvdHJhY2VcXFwiLCBPX1dST05MWSB8IE9fVFJVTkMpO1xcbitcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZClcXG4re1xcbitcXHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFxcXCIvdHJhY2VcXFwiLCBcXFwiclxcXCIpO1xcbit9XFxuK1xcbiAvKiBJZiBgaW9jdGxzJyBub24tTlVMTCwgdGhlIGFsbG93ZWQgaW9jdGxzIHdpbGwgYmUgcmV0dXJuZWQgaW50byB0aGUgdmFyICovXFxuIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXFxuIFxcdFxcdFxcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuaW5kZXggOWE0OWFmODg3MDJlNC4uNWE5MWI5Njc2ZWM1ZCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcXG5AQCAtMTAsNiArMTAsOCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvZnMuaFxcdTAwM2VcXG4gXFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXFx1MDAzY1xcdTAwM2MgKG5yKSlcXG4rI2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSArIChhKSAtIDEpIFxcdTAwMjYgfigoYSkgLSAxKSlcXG4rXFxuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcXG4gI2RlZmluZSBQTV9NTUFQX0VYQ0xVU0lWRSAgICAgICAgICAgICBCSVRfVUxMKDU2KVxcbiAjZGVmaW5lIFBNX1VGRkRfV1AgICAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTcpXFxuQEAgLTk3LDYgKzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xcbiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7XFxuIGludCBnYXRoZXJfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLFxcbiBcXHRcXHRpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycyk7XFxuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRpbnQga3BhZ2VmbGFnc19mZCk7XFxuK2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXFxuK1xcdFxcdFxcdCAgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XFxuIFxcbiBpbnQgdWZmZF9yZWdpc3RlcihpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxcbiBcXHRcXHQgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vcik7XFxuQEAgLTExMyw2ICsxMTksMTAgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApO1xcbiBpbnQgd3JpdGVfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nIHZhbCk7XFxuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcXG4gYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpO1xcbitpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpO1xcbitpbnQgdHJhY2luZ19ldmVudHNfZW5hYmxlKGludCBmZCwgYm9vbCBlbmFibGUpO1xcbitpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKTtcXG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpO1xcbiBcXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxcbiB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDE1OjE1OjQyLjc5ODQwMDc4NloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6OTYxMTIyOTM2MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdXNlci1zcGFjZSBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBObyBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIG1vZHVsZSBjb2RlIGlzIGFsdGVyZWQsIG1ha2luZyB0aGUgY2hhbmdlcyBub24ta2VybmVsL25vbi1leGVjdXRhYmxlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGtlcm5lbCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2ODI3MGExYWI4MmI2Nzk3M2RlNjdmZmI0ZDM1NDA2NWFkNWE4NjkxXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBTZXAgOCAxNToxNTozOSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbkBAIC0xMDQsNiArMTA0LDkgQEAgVEVTVF9HRU5fRklMRVMgKz0gZ3VhcmQtcmVnaW9uc1xuIFRFU1RfR0VOX0ZJTEVTICs9IG1lcmdlXG4gVEVTVF9HRU5fRklMRVMgKz0gcm1hcFxuIFRFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX3NwbGl0X3JhY2VfdGVzdFxuK1RFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX29yZGVyX2NoZWNrXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9yYWNlXG4gXG4gaWZuZXEgKCQoQVJDSCksYXJtNjQpXG4gVEVTVF9HRU5fRklMRVMgKz0gc29mdC1kaXJ0eVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZmE3MzZjOWY3MDFhNFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xuQEAgLTAsMCArMSwxMjIgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogU2VsZi1jaGVjayBmb3IgdGhlIHZtX3V0aWwgZm9saW8tb3JkZXIgaGVscGVycywgaXNfYmFja2VkX2J5X2ZvbGlvKCkgYW5kXG4rICogaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKCksIHdoaWNoIHRoZSBraHVnZXBhZ2VkIG1USFAgY2FzZXMgdXNlIHRvIGRldGVjdFxuKyAqIGNvbGxhcHNlIHJlc3VsdHMuICBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHRcbisgKiBtZW1vcnkgaW4gd2l0aCBvbmx5IHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgcmVxdWlyZSB0aGUgaGVscGVycyB0byByZXBvcnRcbisgKiBleGFjdGx5IHRoYXQgb3JkZXIuXG4rICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImtzZWxmdGVzdC5oXCJcbisjaW5jbHVkZSBcInZtX3V0aWwuaFwiXG4rI2luY2x1ZGUgXCJodWdlcGFnZV9zZXR0aW5ncy5oXCJcbitcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuK1xuK3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxuK3tcbitcdHNpemVfdCBsZW4gPSBzaXplICogMjtcbitcdGNoYXIgKnAsICphbGlnbmVkO1xuK1xuK1x0cCA9IG1tYXAoTlVMTCwgbGVuLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4rXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtbWFwKClcIik7XG4rXG4rXHRhbGlnbmVkID0gKGNoYXIgKilBTElHTigodWludHB0cl90KXAsIHNpemUpO1xuK1x0aWYgKGFsaWduZWQgIT0gcClcbitcdFx0bXVubWFwKHAsIGFsaWduZWQgLSBwKTtcbitcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSBwICsgbGVuKVxuK1x0XHRtdW5tYXAoYWxpZ25lZCArIHNpemUsIHAgKyBsZW4gLSBhbGlnbmVkIC0gc2l6ZSk7XG4rXG4rXHRyZXR1cm4gYWxpZ25lZDtcbit9XG4rXG4rc3RhdGljIHZvaWQgY2hlY2tfb3JkZXIoaW50IG9yZGVyKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdHNpemVfdCBzaXplID0gcHNpemUoKSBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4rXHRib29sIG9rID0gdHJ1ZTtcbitcdGNoYXIgKnA7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSsrKVxuK1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbitcdGlmIChvcmRlcilcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbitcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcbitcdHAgPSBhbGxvY19hbGlnbmVkKHNpemUpO1xuK1x0KnAgPSAxO1xuK1xuK1x0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgb3JkZXIsIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwib3JkZXIgJWQgbm90IGRldGVjdGVkIGFmdGVyIGZhdWx0XFxuXCIsIG9yZGVyKTtcbitcdFx0b2sgPSBmYWxzZTtcbitcdH1cbitcbitcdC8qIEEgbG93ZXIgb3JkZXIgbXVzdCBiZSByZWplY3RlZDogdGhlIGZvbGlvIGlzIGxhcmdlciAqL1xuK1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgb3JkZXIgLSAxLFxuK1x0XHRcdFx0XHQgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgJWRcXG5cIixcbitcdFx0XHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHQvKiBBIGxhcmdlIGZvbGlvIG11c3Qgbm90IHBhc3MgYXMgb3JkZXIgMCAqL1xuK1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgMCxcbitcdFx0XHRcdFx0ICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyIDBcXG5cIiwgb3JkZXIpO1xuK1x0XHRvayA9IGZhbHNlO1xuK1x0fVxuK1xuK1x0bXVubWFwKHAsIHNpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1xuK1x0a3NmdF90ZXN0X3Jlc3VsdChvaywgXCJvcmRlciAlZCBjbGFzc2lmaWVkXFxuXCIsIG9yZGVyKTtcbit9XG4rXG4raW50IG1haW4odm9pZClcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dW5zaWduZWQgbG9uZyBvcmRlcnM7XG4rXHRpbnQgb3JkZXI7XG4rXG4rXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuK1xuK1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cIik7XG4rXG4rXHRwYWdlbWFwX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvcGFnZW1hcFwiLCBPX1JET05MWSk7XG4rXHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCIpO1xuK1x0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCIvcHJvYy9rcGFnZWZsYWdzXCIsIE9fUkRPTkxZKTtcbitcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIm9wZW4oL3Byb2Mva3BhZ2VmbGFncykgcmVxdWlyZXMgcm9vdFxcblwiKTtcbitcbitcdG9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7XG4rXHRpZiAoIW9yZGVycylcbitcdFx0a3NmdF9leGl0X3NraXAoXCJObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xcblwiKTtcbitcbitcdGtzZnRfc2V0X3BsYW4oX19idWlsdGluX3BvcGNvdW50bChvcmRlcnMpICsgMSk7XG4rXG4rXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuK1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRjaGVja19vcmRlcigwKTtcbitcdGZvciAob3JkZXIgPSAxOyBvcmRlciBcdTAwM2MgTlJfT1JERVJTOyBvcmRlcisrKSB7XG4rXHRcdGlmICghKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXIpKSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0Y2hlY2tfb3JkZXIob3JkZXIpO1xuK1x0fVxuK1xuK1x0a3NmdF9maW5pc2hlZCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5pbmRleCBlMjY0MmVjYTBkMDJiLi5kZjQyNmY5MjE4ZTcxIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5AQCAtNjUsNyArNjUsNiBAQCBlbnVtIHtcbiAjZGVmaW5lIEhNTV9QQVRIX01BWCAgICA2NFxuICNkZWZpbmUgTlRJTUVTXHRcdDEwXG4gXG4tI2RlZmluZSBBTElHTih4LCBhKSAoKCh4KSArIChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi9cbiBcbiAjaWZuZGVmIEZPTExfV1JJVEVcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuaW5kZXggZDc5MTdkY2UzYWJhYy4uY2E3M2Y5YWM4ZTliNiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbkBAIC0xODMsNiArMTgzLDEzIEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuKy8qIEEgc3RvcmUgdG8gZWl0aGVyIHNsZWVwIGtub2Igd2FrZXMga2h1Z2VwYWdlZCwgc28gd3JpdGUgb25seSBvbiBjaGFuZ2UgKi9cbitzdGF0aWMgdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcbit7XG4rXHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcbitcdFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xuK31cbitcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiB7XG4gXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFx1MDAyNnNldHRpbmdzLVx1MDAzZWtodWdlcGFnZWQ7XG5AQCAtMTk4LDE1ICsyMDUsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHRcdFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVx1MDAzZXNobWVtX2VuYWJsZWRdKTtcbiBcdHRocF93cml0ZV9udW0oXCJ1c2VfemVyb19wYWdlXCIsIHNldHRpbmdzLVx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xuIFxuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvZGVmcmFnXCIsIGtodWdlcGFnZWQtXHUwMDNlZGVmcmFnKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wiLFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCIsXG4tXHRcdFx0a2h1Z2VwYWdlZC1cdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblwiLCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL2RlZnJhZ1wiLCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCIsXG4rXHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL21heF9wdGVzX25vbmVcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9wYWdlc190b19zY2FuXCIsIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4gXG4gXHRpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSlcbiBcdFx0d3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLVx1MDAzZXJlYWRfYWhlYWRfa2IpO1xuQEAgLTIzMCw2ICsyMzcsNDEgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuKy8qXG4rICogV2FpdCBmb3IgYSBmdWxsIGtodWdlcGFnZWQgc2NhbiBwYXNzIHRoYXQgc3RhcnRlZCBhZnRlciB0aGlzIGNhbGw6IHRoZVxuKyAqIHBhc3MgaW4gcHJvZ3Jlc3MgbWF5IGFscmVhZHkgaGF2ZSBwYXNzZWQgdGhpcyBtbSwgc28gZnVsbF9zY2FucyBoYXMgdG9cbisgKiBhZHZhbmNlIHR3aWNlLlxuKyAqXG4rICogQSBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBidXQgb25lIG1hZGUgd2hpbGUgaXRcbisgKiBpcyBzY2FubmluZyByYXRoZXIgdGhhbiBzbGVlcGluZyBpcyBsb3N0LCBzbyBrZWVwIHN0b3JpbmcgdW50aWwgdGhlIHBhc3NcbisgKiBsYW5kcy5cbisgKlxuKyAqIE9uZSB3YWtlIGlzIG9uZSBwYXNzIG9ubHkgaWYgcGFnZXNfdG9fc2NhbiBjb3ZlcnMgZXZlcnkgbW0gb24gdGhlIGxpc3QuXG4rICovXG4rYm9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XG4rXHR1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwLCBwb2xsX21zID0gMTA7XG4rXHR1bnNpZ25lZCBsb25nIHNsZWVwX21zO1xuK1x0aW50IHBhc3M7XG4rXG4rXHRzbGVlcF9tcyA9IHRocF9yZWFkX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIik7XG4rXHRmb3IgKHBhc3MgPSAwOyBwYXNzIFx1MDAzYyAyOyBwYXNzKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxuK1x0XHRcdHRocF9yZWFkX251bShcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1wiKSArIDE7XG4rXG4rXHRcdHdoaWxlICh0aHBfcmVhZF9udW0oXCJraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcIikgXHUwMDNjIHRhcmdldCkge1xuK1x0XHRcdGlmIChlbGFwc2VkX21zIFx1MDAzZT0gZGVhZGxpbmVfbXMpXG4rXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdFx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0XHRcdCAgICAgIHNsZWVwX21zKTtcbitcdFx0XHR1c2xlZXAocG9sbF9tcyAqIDEwMDApO1xuK1x0XHRcdGVsYXBzZWRfbXMgKz0gcG9sbF9tcztcbitcdFx0fVxuK1x0fVxuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpXG4ge1xuIFx0aWYgKCFzZXR0aW5nc19pbmRleCkge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5pbmRleCA3MjZjNzNjNDNjMDViLi4yZWExNjlkMTE3OTYyIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuQEAgLTgzLDEwICs4MywyMSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZClcbiBcdGh1Z2VwYWdlX3NhdmVfc2V0dGluZ3MoLyogdGhwID0gKi8gdHJ1ZSwgLyogaHVnZXRsYiA9ICovIGZhbHNlKTtcbiB9XG4gXG4rYm9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKTtcbitcbiB2b2lkIHRocF9zZXRfcmVhZF9haGVhZF9wYXRoKGNoYXIgKnBhdGgpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG4gdW5zaWduZWQgbG9uZyB0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcbiBcbisvKlxuKyAqIFRoZSBwZXItb3JkZXIgc2htZW1fZW5hYmxlZCBhdHRyaWJ1dGUgaXMgY3JlYXRlZCBmb3IgdGhlIG9yZGVycyB0aGUgcGFnZVxuKyAqIGNhY2hlIGNhbiBob2xkLCBub3QganVzdCBmb3Igc2htZW0sIHNvIGl0IGFuc3dlcnMgZm9yIHJlZ3VsYXIgZmlsZXMgdG9vLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfZmlsZV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpXG4re1xuK1x0cmV0dXJuIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCk7XG4rfVxuK1xuIGJvb2wgdGhwX2F2YWlsYWJsZSh2b2lkKTtcbiBib29sIHRocF9pc19lbmFibGVkKHZvaWQpO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuaW5kZXggZjgyNjczZjVmNmI0Ny4uMzM1Zjk0NmVjYTYxZSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5AQCAtMzEsNiArMzEsMTEgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xuIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yO1xuIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjtcbiBzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyO1xuK3N0YXRpYyBib29sIGNvbGxhcHNlX29yZGVyX3NldDtcbitzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyc1tOUl9PUkRFUlNdO1xuK3N0YXRpYyBpbnQgbnJfY29sbGFwc2Vfb3JkZXJzO1xuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZCA9IC0xO1xuIFxuICNkZWZpbmUgUElEX1NNQVBTIFwiL3Byb2Mvc2VsZi9zbWFwc1wiXG4gI2RlZmluZSBURVNUX0ZJTEUgXCJjb2xsYXBzZV90ZXN0X2ZpbGVcIlxuQEAgLTIyMCw2ICsyMjUsMjkgQEAgc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXG4gXHRyZXR1cm4gc3dhcDtcbiB9XG4gXG4rc3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0aW50IGk7XG4rXG4rXHQvKiBrZWVwIGtodWdlcGFnZWQgZnJvbSBjb2xsYXBzaW5nIHRoZSByYW5nZSBhbmQgc3dhcHBpbmcgaXQgYmFjayBpbiAqL1xuK1x0aWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9OT0hVR0VQQUdFKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX05PSFVHRVBBR0UpXCIpO1xuK1xuK1x0LypcbitcdCAqIFJldHJ5IHNldmVyYWwgdGltZXMgYmVjYXVzZSBNQURWX1BBR0VPVVQgaXMgYmVzdCBlZmZvcnQuICBTbGVlcFxuK1x0ICogYmV0d2VlbiB0aGUgcmV0cmllcyB0byBnaXZlIG91dHN0YW5kaW5nIHdyaXRlYmFjayBhIGNoYW5jZSB0b1xuK1x0ICogZmluaXNoLlxuK1x0ICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0MDsgaSsrKSB7XG4rXHRcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX1BBR0VPVVQpXCIpO1xuK1x0XHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0dXNsZWVwKDUwICogMTAwMCk7XG4rXHR9XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuIHN0YXRpYyB2b2lkICphbGxvY19tYXBwaW5nKGludCBucilcbiB7XG4gXHR2b2lkICpwO1xuQEAgLTUxMCw4ICs1MzgsOCBAQCBzdGF0aWMgYm9vbCBpc19hbm9uKHN0cnVjdCBtZW1fb3BzICpvcHMpXG4gc3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcbiBcdFx0XHQgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4ge1xuLVx0aW50IHJldDtcbiBcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdGludCByZXQsIGk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcIiVzLi4uXCIsIG1zZyk7XG4gXG5AQCAtNTI0LDkgKzU1MiwxNiBAQCBzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxuIFx0LypcbiBcdCAqIFByZXZlbnQga2h1Z2VwYWdlZCBpbnRlcmZlcmVuY2UgYW5kIHRlc3RzIHRoYXQgTUFEVl9DT0xMQVBTRVxuIFx0ICogaWdub3JlcyAvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9lbmFibGVkXG4rXHQgKlxuK1x0ICogXCJpbmhlcml0XCIgcmF0aGVyIHRoYW4gXCJuZXZlclwiIHNvIHRoYXQgTUFEVl9DT0xMQVBTRSBvbiBzaG1lbSBzdGlsbFxuK1x0ICogZmluZHMgYW4gb3JkZXIgdG8gYnVpbGQuXG4gXHQgKi9cbiBcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSO1xuIFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspIHtcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbitcdFx0c2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUO1xuK1x0fVxuIFx0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuIFxuIFx0LyogQ2xlYXIgVk1fTk9IVUdFUEFHRSAqL1xuQEAgLTU1Niw4ICs1OTEsMTEgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sXG4gXHRcdGludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBjb2xsYXBfb3JkZXI7XG4tXHRpbnQgZnVsbF9zY2Fucztcbi1cdGludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovXG4rXHR1bnNpZ25lZCBsb25nIGJ5dGVzID0gKHVuc2lnbmVkIGxvbmcpbnJfaHBhZ2VzICogaHBhZ2Vfc2l6ZTtcbitcdGludCB0aW1lb3V0LCBmdWxsX3NjYW5zO1xuK1xuK1x0LyogSGFsZi1zZWNvbmQgdGlja3M6IHRocmVlIHNlY29uZHMgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gKi9cbitcdHRpbWVvdXQgPSA2ICsgMiAqIChieXRlcyAvICgxMjhVTCBcdTAwM2NcdTAwM2MgMjApKTtcbiBcbiBcdC8qIFNhbml0eSBjaGVjayAqL1xuIFx0aWYgKCFvcHMtXHUwMDNlY2hlY2tfaHVnZShwLCBsZW4sIDAsIGhwYWdlX3NpemUpKVxuQEAgLTgyMCwxMiArODU4LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXG4gXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFxuIFx0a3NmdF9wcmludF9tc2coXCJTd2Fwb3V0IG9uZSBwYWdlLi4uXCIpO1xuLVx0aWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfUEFHRU9VVClcIik7XG4tXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XG4rXHRpZiAoc3dhcG91dF9yYW5nZShwLCBwYWdlX3NpemUpKSB7XG4gXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1x0XHRza2lwKFwiQ291bGQgbm90IHN3YXAgb3V0XCIpO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbkBAIC04NDYsMTIgKzg4MiwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbiBcdGtzZnRfcHJpbnRfbXNnKFwiU3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlwiLCBtYXhfcHRlc19zd2FwICsgMSwgaHBhZ2VfcG1kX25yKTtcbi1cdGlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICsgMSkgKiBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVwiKTtcbi1cdGlmIChjaGVja19zd2FwKHAsIChtYXhfcHRlc19zd2FwICsgMSkgKiBwYWdlX3NpemUpKSB7XG4rXHRpZiAoc3dhcG91dF9yYW5nZShwLCAobWF4X3B0ZXNfc3dhcCArIDEpICogcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwiT0tcIik7XG4gXHR9IGVsc2Uge1xuLVx0XHRmYWlsKFwiRmFpbFwiKTtcbitcdFx0c2tpcChcIkNvdWxkIG5vdCBzd2FwIG91dFwiKTtcbiBcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG5AQCAtODYzLDEyICs4OTcsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cbiBcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcdFx0a3NmdF9wcmludF9tc2coXCJTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCIsIG1heF9wdGVzX3N3YXAsXG4gXHRcdCAgICAgICBocGFnZV9wbWRfbnIpO1xuLVx0XHRpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVwiKTtcbi1cdFx0aWYgKGNoZWNrX3N3YXAocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbitcdFx0aWYgKHN3YXBvdXRfcmFuZ2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbiBcdFx0XHRzdWNjZXNzKFwiT0tcIik7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0ZmFpbChcIkZhaWxcIik7XG4rXHRcdFx0c2tpcChcIkNvdWxkIG5vdCBzd2FwIG91dFwiKTtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFxuQEAgLTkzNSw2ICs5NjcsMTYgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcbiBcdHZvaWQgKnA7XG4gXHRpbnQgaTtcbiBcbitcdC8qXG4rXHQgKiBUaGlzIG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMgaW4gYSByb3csIHdoaWNoIHRoZVxuK1x0ICogYWxsb2NhdG9yIHdpbGwgbm90IHN1cHBseSBpZiB0aGUgUE1EIGlzIHZlcnkgbGFyZ2UuXG4rXHQgKi9cbitcdGlmIChocGFnZV9wbWRfc2l6ZSBcdTAwM2UgKDMyVUwgXHUwMDNjXHUwMDNjIDIwKSkge1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxuXCIsXG4rXHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbiBcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiBcdGtzZnRfcHJpbnRfbXNnKFwiQ29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXG5cIik7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBocGFnZV9wbWRfbnI7IGkrKykge1xuQEAgLTExMjUsNiArMTE2NywxMDMgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuIH1cbiBcbisvKlxuKyAqIFRoZSBwYXJlbnQgd3JpdGVzIHRvIHRoZSBmb3JrLXNoYXJlZCByYW5nZSB0aHJvdWdob3V0IHRoZSBjaGlsZCdzXG4rICogY29sbGFwc2UuICBDb1cgbXVzdCBrZWVwIHRoZSB0d28gYXBhcnQ6IHRoZSBjaGlsZCBzZWVzIHRoZSBwcmUtZm9ya1xuKyAqIGNvbnRlbnQsIHRoZSBwYXJlbnQgb25seSBpdHMgb3duIHdyaXRlcy5cbisgKi9cbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9mb3JrX2Nvd19yYWNlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdGNvbnN0IGludCBzdHJpZGUgPSBwYWdlX3NpemUgLyBzaXplb2YoaW50KTtcbitcdGludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG47XG4rXHR1bnNpZ25lZCBsb25nIHNoYXJlZDtcbitcdHZvbGF0aWxlIGludCAqaXA7XG4rXHRwaWRfdCBjaGlsZDtcbitcdGludCBzeW5jWzJdO1xuK1x0Y2hhciBnbyA9IDE7XG4rXHR2b2lkICpwO1xuK1xuK1x0LyogQXQgYSBwYWdlIHBlciAxMCBtcywgNjQgcGFnZXMgc3ByZWFkIHRoZSB3cml0ZXMgYWNyb3NzIHRoZSBjb2xsYXBzZSAqL1xuK1x0biA9IDY0O1xuK1x0c2hhcmVkID0gbiAqIHBhZ2Vfc2l6ZTtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdC8qIFNoYXJlZCBwcmVmaXgsIHdpdGggdGhlIHByZS1mb3JrIHBhdHRlcm4gKi9cbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBzaGFyZWQpO1xuK1x0aWYgKHBpcGUoc3luYykpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcInBpcGUoKVwiKTtcbitcbitcdC8qIEEgdm9sYXRpbGUgcG9pbnRlciBzbyB0aGUgc3RvcmVzIGFyZSBub3QgbWVyZ2VkIG9yIGRyb3BwZWQgKi9cbitcdGlwID0gcDtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiRm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cIik7XG4rXHRjaGlsZCA9IGZvcmsoKTtcbitcdGlmICghY2hpbGQpIHtcbitcdFx0aW50IGNvbGxhcHNlX3N0YXR1cztcbitcbitcdFx0Y2xvc2Uoc3luY1swXSk7XG4rXHRcdC8qIFByaXZhdGUgcmVtYWluZGVyICovXG4rXHRcdG9wcy1cdTAwM2VmYXVsdChwLCBzaGFyZWQsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0LyogU3RhcnQgdGhlIHBhcmVudCB1bnNoYXJpbmcsIGFuZCBnaXZlIGl0IGEgaGVhZCBzdGFydCAqL1xuK1x0XHRpZiAod3JpdGUoc3luY1sxXSwgXHUwMDI2Z28sIDEpICE9IDEpXG4rXHRcdFx0X2V4aXQoS1NGVF9GQUlMKTtcbitcdFx0dXNsZWVwKDUwMDApO1xuK1x0XHRjLVx1MDAzZWNvbGxhcHNlKFwiQ29sbGFwc2UgYSByYW5nZSB0aGUgcGFyZW50IGlzIHdyaXRpbmcgdG9cIixcbitcdFx0XHQgICAgcCwgMSwgb3BzLCB0cnVlKTtcbitcdFx0Y29sbGFwc2Vfc3RhdHVzID0gZXhpdF9zdGF0dXM7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkrKylcbitcdFx0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSArIDB4ZGVhZDAwMDApXG4rXHRcdFx0XHRicmVhaztcbitcdFx0aWYgKGkgPT0gbilcbitcdFx0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRcdGVsc2VcbitcdFx0XHRmYWlsKFwiRmFpbDogY2hpbGQgY29udGVudFwiKTtcbitcdFx0LyogVGhlIGNvbnRlbnQgY2hlY2sgbXVzdCBub3QgYnVyeSBhIGZhaWxlZCBjb2xsYXBzZSAqL1xuK1x0XHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxuK1x0XHRcdGV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzO1xuK1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuK1x0fVxuK1xuK1x0Y2xvc2Uoc3luY1sxXSk7XG4rXHRpZiAocmVhZChzeW5jWzBdLCBcdTAwMjZnbywgMSkgIT0gMSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiY2hpbGQgbmV2ZXIgcmVhY2hlZCB0aGUgY29sbGFwc2VcXG5cIik7XG4rXG4rXHQvKlxuK1x0ICogVW5zaGFyZSBvbmUgcGFnZSBhdCBhIHRpbWU6IGEgYnVyc3Qgd291bGQgYnJlYWsgQ29XIG9uIHRoZSB3aG9sZVxuK1x0ICogcmFuZ2UgYmVmb3JlIHRoZSBjb2xsYXBzZSBzdGFydHMsIGxlYXZpbmcgbm90aGluZyBzaGFyZWQgdG8gY29sbGFwc2UuXG4rXHQgKi9cbitcdGkgPSAwO1xuK1x0Zm9yICg7Oykge1xuK1x0XHRpZiAoaSBcdTAwM2MgbilcbitcdFx0XHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xuK1x0XHRpKys7XG4rXHRcdHVzbGVlcCgxMCAqIDEwMDApO1xuK1x0XHRpZiAod2FpdHBpZChjaGlsZCwgXHUwMDI2d3N0YXR1cywgV05PSEFORykpXG4rXHRcdFx0YnJlYWs7XG4rXHR9XG4rXG4rXHQvKiBGaW5pc2ggd2hhdGV2ZXIgdGhlIHBhY2VkIHN3ZWVwIGRpZCBub3QgcmVhY2ggKi9cbitcdGZvciAoOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdGlwW2kgKiBzdHJpZGVdID0gaSArIDB4YmVlZjAwMDA7XG4rXHQvKiBBIGNoaWxkIHRoYXQgZGllZCByZWFkaW5nIHRoZSByYWNpbmcgcGFnZXMgaXMgYSBmYWlsdXJlLCBub3QgYSB6ZXJvICovXG4rXHRjaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICsgMHhiZWVmMDAwMClcbitcdFx0XHRicmVhaztcbitcdGlmIChpID09IG4pXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWw6IHBhcmVudCBjb250ZW50XCIpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHQvKiBUaGUgcGFyZW50J3MgY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQncyB2ZXJkaWN0ICovXG4rXHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxuK1x0XHRleGl0X3N0YXR1cyA9IGNoaWxkX3N0YXR1cztcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0XHRcdFx0XHQgICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuIHtcbkBAIC0xMTcwLDYgKzEzMDksMjAwIEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuIH1cbiBcbisvKiBTbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIHdpbGwgY29uc2lkZXIgZm9yIG1USFAgY29sbGFwc2UgKi9cbisjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcbitcbisvKiBUaW1lIGJ1ZGdldCBmb3Igb25lIGtodWdlcGFnZWQgcGFzcyBpbiB0aGUgY29sbGFwc2Vfb3JkZXJfKiBjYXNlcyAqL1xuKyNkZWZpbmUgTVRIUF9QQVNTX1RJTUVPVVRfUyAzMFxuK1xuK3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKVxuK3tcbitcdHJldHVybiBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcHNlX29yZGVyO1xuK31cbitcbitzdGF0aWMgdm9pZCBtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKHZvaWQpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0aW50IGk7XG4rXG4rXHQvKlxuK1x0ICogT25seSB0aGUgdGFyZ2V0IG9yZGVyLCBhbmQgb25seSBmb3IgbWFkdmlzZTogdGhlIGNhc2VzIGZhdWx0IHRoZWlyXG4rXHQgKiByZWdpb24gZmlyc3QsIHNvIHRoZSBzb3VyY2VzIHN0YXkgb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCBmb3IuXG4rXHQgKi9cbitcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0c2V0dGluZ3MuaHVnZXBhZ2VzW2NvbGxhcHNlX29yZGVyXS5lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rfVxuK1xuK3N0YXRpYyBib29sIGFsbF93aW5kb3dzX2F0X29yZGVyKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4re1xuK1x0cmV0dXJuIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBsZW4sIGNvbGxhcHNlX29yZGVyLFxuK1x0XHRcdFx0XHRwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgYW55X3dpbmRvd19hdF9vcmRlcih2b2lkICpwLCBzaXplX3QgbGVuKVxuK3tcbitcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4rXHRjaGFyICphZGRyID0gcDtcbitcbitcdGZvciAoOyBsZW4gXHUwMDNlPSB3aW5kb3c7IGFkZHIgKz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7XG4rXHRcdGlmIChhbGxfd2luZG93c19hdF9vcmRlcihhZGRyLCB3aW5kb3cpKVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0fVxuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuK1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuK1x0dm9pZCAqcDtcbitcbitcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuK1x0aWYgKGFueV93aW5kb3dfYXRfb3JkZXIocCwgaHBhZ2VfcG1kX3NpemUpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCIpO1xuK1xuK1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXCIpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLlwiKTtcbitcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCArIHdpbmRvdywgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0ICFhbnlfd2luZG93X2F0X29yZGVyKHAsIHdpbmRvdykgXHUwMDI2XHUwMDI2XG4rXHRcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwICsgMiAqIHdpbmRvdyxcbitcdFx0XHRcdCAgICAgIGhwYWdlX3BtZF9zaXplIC0gMiAqIHdpbmRvdykpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgd2luZG93LCAyICogd2luZG93KTtcbitcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdHZvaWQgKnA7XG4rXG4rXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgcGFnZV9zaXplKTtcbitcdGlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwiKTtcbitcbitcdGlmIChtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVwiKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXCIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmIChhbGxfd2luZG93c19hdF9vcmRlcihwLCBtdGhwX3dpbmRvd19zaXplKCkpKVxuK1x0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRlbHNlXG4rXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1xuK1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIHBhZ2Vfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbitcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4rXHR2b2lkICpwO1xuK1xuK1x0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xuK1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IDA7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XG4rXHRpZiAoYW55X3dpbmRvd19hdF9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cIik7XG4rXG4rXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9IVUdFUEFHRSlcIik7XG4rXHRrc2Z0X3ByaW50X21zZyhcIkNvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlwiKTtcbitcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0ICFhbnlfd2luZG93X2F0X29yZGVyKHAgKyB3aW5kb3csIHdpbmRvdykpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0aW50IHNvdXJjZV9vcmRlciA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyIDogTUlOX01USFBfT1JERVI7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dm9pZCAqcDtcbitcbitcdGlmIChzb3VyY2Vfb3JkZXIgXHUwMDNlPSBjb2xsYXBzZV9vcmRlciB8fFxuK1x0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgc291cmNlX29yZGVyKSkpIHtcbitcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwiJXM6IG5vIHN1cHBvcnRlZCBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxuXCIsXG4rXHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbitcbitcdHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4rXHRzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbitcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXG4rXHQvKlxuK1x0ICogVGhlIGFsbG9jYXRvciBjYW4gZmFsbCBiYWNrIHRvIHNtYWxsZXIgZm9saW9zIHVuZGVyIGZyYWdtZW50YXRpb247XG4rXHQgKiBoYXZpbmcgbm90aGluZyB0byBjb2xsYXBzZSBmcm9tIGlzIG5vdCBhIGZhaWx1cmUuXG4rXHQgKi9cbitcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsXG4rXHRcdFx0XHQgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIk5vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi5cIiwgc291cmNlX29yZGVyKTtcbitcdFx0c2tpcChcIlNraXBcIik7XG4rXHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXCIpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi5cIixcbitcdFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XG4rXHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKE1USFBfUEFTU19USU1FT1VUX1MpKVxuK1x0XHRmYWlsKFwiVGltZW91dFwiKTtcbitcdGVsc2UgaWYgKGFsbF93aW5kb3dzX2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCJcXG5Vc2FnZTogLi9raHVnZXBhZ2VkIFtPUFRJT05TXSBcdTAwM2N0ZXN0IHR5cGVcdTAwM2UgW2Rpcl1cXG5cXG5cIik7XG5AQCAtMTE4NywxMSArMTUyMCwxNCBAQCBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuIFx0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdC1zOiBtVEhQIHNpemUsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxcblwiKTtcbiBcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXG5cIik7XG4gXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIERlZmF1bHRzIHRvIGV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBiZWxvdyB0aGUgUE1ELlxcblwiKTtcbitcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQgICAgLXMsIGlmIHNldCwgaXMgdGhlIHNvdXJjZSBvcmRlciBmb3IgdGhlIG1peGVkLXNvdXJjZSBjYXNlLlxcblwiKTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuK1x0Ym9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlO1xuIFx0aW50IG9wdDtcbiBcdGNoYXIgKmJ1ZjtcbiBcdGNvbnN0IGNoYXIgKnRva2VuO1xuQEAgLTEyMDMsNiArMTUzOSw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2MnOlxuIFx0XHRcdGNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpO1xuK1x0XHRcdGNvbGxhcHNlX29yZGVyX3NldCA9IHRydWU7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2gnOlxuIFx0XHRkZWZhdWx0OlxuQEAgLTEyMTAsMTIgKzE1NDcsMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0fVxuIFx0fVxuIFxuK1x0LypcbitcdCAqIEJvdGggb3JkZXJzIGVuZCB1cCBhcyBhcnJheSBpbmRpY2VzIGFuZCBzaGlmdCBjb3VudHMsIHNvIG5laXRoZXJcbitcdCAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLlxuK1x0ICovXG4rXHRpZiAoYW5vbl9vcmRlciBcdTAwM2MgMCB8fCBhbm9uX29yZGVyIFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIi1zIHRha2VzIGFuIG9yZGVyIGluIDAuLiVkLCBub3QgJWRcXG5cIixcbitcdFx0XHRcdCAgIGhwYWdlX3BtZF9vcmRlciwgYW5vbl9vcmRlcik7XG4rXHRpZiAoY29sbGFwc2Vfb3JkZXJfc2V0IFx1MDAyNlx1MDAyNlxuK1x0ICAgIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IDAgfHwgY29sbGFwc2Vfb3JkZXIgXHUwMDNlPSBocGFnZV9wbWRfb3JkZXIpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCItYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXFxuXCIsXG4rXHRcdFx0XHQgICBocGFnZV9wbWRfb3JkZXIgLSAxLCBjb2xsYXBzZV9vcmRlcik7XG4rXG4gXHRhcmd2ICs9IG9wdGluZDtcbiBcdGFyZ2MgLT0gb3B0aW5kO1xuIFxuIFx0aWYgKGFyZ2MgPT0gMCkge1xuLVx0XHQvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqL1xuK1x0XHQvKiBObyBhcmd1bWVudHM6IGFub24gdW5kZXIgZXZlcnkgY29udGV4dCAqL1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0XHRyZXR1cm47XG5AQCAtMTIyNiwxMyArMTU3NiwxNCBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFxuIFx0aWYgKCFzdHJjbXAodG9rZW4sIFwiYWxsXCIpKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbitcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dDtcbiBcdFx0bWFkdmlzZV9jb250ZXh0ID0gIFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xuK1x0XHQvKiBUaGUgbVRIUCBjb250ZXh0IGhhcyBvbmx5IGFub24gY2FzZXM7IGxldCBvdGhlciBtZW1fdHlwZXMgZHJvcCBpdCAqL1xuK1x0XHRtdGhwX2NvbnRleHRfaW1wbGllZCA9IHRydWU7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwia2h1Z2VwYWdlZFwiKSkge1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwibXRocF9raHVnZXBhZ2VkXCIpKSB7XG4gXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4tXHRcdGlmIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IDAgfHwgY29sbGFwc2Vfb3JkZXIgXHUwMDNlPSBocGFnZV9wbWRfb3JkZXIpXG4tXHRcdFx0dXNhZ2UoKTtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCJtYWR2aXNlXCIpKSB7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdH0gZWxzZSB7XG5AQCAtMTI0OCwyMCArMTU5OSwyMCBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gIFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcztcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0XHRzaG1lbV9vcHMgPSBcdTAwMjZfX3NobWVtX29wcztcbi1cdFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KVxuLVx0XHRcdHVzYWdlKCk7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcImFub25cIikpIHtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCJmaWxlXCIpKSB7XG4gXHRcdHJlYWRfb25seV9maWxlX29wcyA9ICBcdTAwMjZfX3JlYWRfb25seV9maWxlX29wcztcbiBcdFx0cmVhZF93cml0ZV9maWxlX3JlYWRfb3BzID0gIFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gIFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcztcbi1cdFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KVxuK1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuK1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9IE5VTEw7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcInNobWVtXCIpKSB7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4rXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCBcdTAwMjZcdTAwMjYgIW10aHBfY29udGV4dF9pbXBsaWVkKVxuIFx0XHRcdHVzYWdlKCk7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gTlVMTDtcbiBcdH0gZWxzZSB7XG4gXHRcdHVzYWdlKCk7XG4gXHR9XG5AQCAtMTI4Myw5ICsxNjM0LDEwIEBAIHN0cnVjdCB0ZXN0X2Nhc2Uge1xuIFx0c3RydWN0IG1lbV9vcHMgKm9wcztcbiBcdGNvbnN0IGNoYXIgKmRlc2M7XG4gXHR0ZXN0X2ZuIGZuO1xuK1x0aW50IG9yZGVyO1x0XHQvKiBtVEhQIGNvbnRleHRzOiB0aGUgY29sbGFwc2Ugb3JkZXIgKi9cbiB9O1xuIFxuLSNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgNjRcbisjZGVmaW5lIE1BWF9URVNUX0NBU0VTIDI1NlxuIHN0YXRpYyBzdHJ1Y3QgdGVzdF9jYXNlIHRlc3RfY2FzZXNbTUFYX1RFU1RfQ0FTRVNdO1xuIHN0YXRpYyBpbnQgbnJfdGVzdF9jYXNlcztcbiBcbkBAIC0xMjk4LDYgKzE2NTAsNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXHRcdFx0Lm9wc1x0PSBvLFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5kZXNjXHQ9ICN0LFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5mblx0PSB0LFx0XHRcdFx0XHRcXFxuK1x0XHRcdC5vcmRlclx0PSBjb2xsYXBzZV9vcmRlcixcdFx0XHRcXFxuIFx0XHR9O1x0XHRcdFx0XHRcdFx0XFxcbiBcdH1cdFx0XHRcdFx0XHRcdFx0XFxcbiBcdH0gd2hpbGUgKDApXG5AQCAtMTMzOCw4ICsxNjkxLDY2IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcbiBcdHBhcnNlX3Rlc3RfdHlwZShhcmdjLCBhcmd2KTtcbiBcbitcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7XG4rXG4rXHRcdGlmIChjb2xsYXBzZV9vcmRlcl9zZXQpIHtcbitcdFx0XHRpZiAoIShvcmRlcnMgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGNvbGxhcHNlX29yZGVyKSkpXG4rXHRcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIk9yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwiLFxuK1x0XHRcdFx0XHQgICAgICAgY29sbGFwc2Vfb3JkZXIpO1xuK1x0XHRcdGlmIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IGFub25fb3JkZXIpXG4rXHRcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIi1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXFxuXCIsXG4rXHRcdFx0XHRcdCAgICAgICBjb2xsYXBzZV9vcmRlciwgYW5vbl9vcmRlcik7XG4rXHRcdFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycysrXSA9IGNvbGxhcHNlX29yZGVyO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogRXZlcnkgc3VwcG9ydGVkIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2U6IC1zIG1ha2VzIHRoZVxuK1x0XHRcdCAqIGZhdWx0IHBhdGggaGFuZCBvdXQgZm9saW9zIG9mIHRoYXQgb3JkZXIsIHNvIGEgdGFyZ2V0XG4rXHRcdFx0ICogYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2UuXG4rXHRcdFx0ICovXG4rXHRcdFx0aW50IGZpcnN0ID0gYW5vbl9vcmRlciArIDE7XG4rXG4rXHRcdFx0aWYgKGZpcnN0IFx1MDAzYyBNSU5fTVRIUF9PUkRFUilcbitcdFx0XHRcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XG4rXHRcdFx0Zm9yIChpbnQgaSA9IGZpcnN0OyBpIFx1MDAzYyBocGFnZV9wbWRfb3JkZXI7IGkrKykge1xuK1x0XHRcdFx0aWYgKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpXG4rXHRcdFx0XHRcdGNvbGxhcHNlX29yZGVyc1tucl9jb2xsYXBzZV9vcmRlcnMrK10gPSBpO1xuK1x0XHRcdH1cbitcdFx0XHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcbitcdFx0XHRcdGtzZnRfcHJpbnRfbXNnKFwibVRIUCBjYXNlcyBza2lwcGVkOiBubyBvcmRlciBhYm92ZSB0aGUgc291cmNlXFxuXCIpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcbitcdFx0cGFnZW1hcF9mZCA9IG9wZW4oXCIvcHJvYy9zZWxmL3BhZ2VtYXBcIiwgT19SRE9OTFkpO1xuK1x0XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcIik7XG4rXHRcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwiL3Byb2Mva3BhZ2VmbGFnc1wiLCBPX1JET05MWSk7XG4rXHRcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm9wZW4oL3Byb2Mva3BhZ2VmbGFncylcIik7XG4rXHR9XG4rXG4gXHRzZXRidWYoc3Rkb3V0LCBOVUxMKTtcbiBcbitcdC8qXG4rXHQgKiBXaXRob3V0IGEgUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW8gdGhlIGtlcm5lbCByZWZ1c2VzIHRoZXNlXG4rXHQgKiBjb2xsYXBzZXMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gdGVzdC5cbitcdCAqL1xuK1x0aWYgKCEodGhwX2ZpbGVfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBocGFnZV9wbWRfb3JkZXIpKSkge1xuK1x0XHRpZiAoc2htZW1fb3BzKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cXG5cIik7XG4rXHRcdFx0c2htZW1fb3BzID0gTlVMTDtcbitcdFx0fVxuK1x0XHRpZiAocmVhZF9vbmx5X2ZpbGVfb3BzKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgZmlsZVxcblwiKTtcbitcdFx0XHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xuK1x0XHRcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XG4rXHRcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7XG4rXHRcdH1cbitcdFx0aWYgKCFhbm9uX29wcyBcdTAwMjZcdTAwMjYgIXNobWVtX29wcyBcdTAwMjZcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcbitcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIk5vIG1lbV90eXBlIGxlZnQgdG8gcnVuXFxuXCIpO1xuK1x0fVxuK1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxO1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3N3YXAgPSBocGFnZV9wbWRfbnIgLyA4O1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3NoYXJlZCA9IGhwYWdlX3BtZF9uciAvIDI7XG5AQCAtMTM1Nyw3ICsxNzY4LDE3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHNobWVtX29wcyk7XG4tXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgbnJfY29sbGFwc2Vfb3JkZXJzOyBpKyspIHtcbitcdFx0Y29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07XG4rXHRcdFRFU1QoY29sbGFwc2VfZnVsbCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdH1cbitcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTEzNjUsMTEgKzE3ODYsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgc2htZW1fb3BzKTtcbiBcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuLVx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFxuLVx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbi1cbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTE0MjQsNiArMTg0Miw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbitcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuK1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTQzOSw3ICsxODYwLDE1IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBucl90ZXN0X2Nhc2VzOyBpKyspIHtcbiBcdFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFx1MDAyNnRlc3RfY2FzZXNbaV07XG4gXG4tXHRcdGtzZnRfcHJpbnRfbXNnKFwiXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwiLCB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUpO1xuK1x0XHRpZiAodC1cdTAwM2VjdHggPT0gXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuK1x0XHRcdGNvbGxhcHNlX29yZGVyID0gdC1cdTAwM2VvcmRlcjtcbitcdFx0XHRrc2Z0X3ByaW50X21zZyhcIlxcbiMgUnVuIHRlc3Q6ICVzICglczolcywgb3JkZXIgJWQpXFxuXCIsXG4rXHRcdFx0XHQgICAgICAgdC1cdTAwM2VkZXNjLCB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lLFxuK1x0XHRcdFx0ICAgICAgIHQtXHUwMDNlb3JkZXIpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwiLCB0LVx1MDAzZWRlc2MsXG4rXHRcdFx0XHQgICAgICAgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4rXHRcdH1cbiBcdFx0dC1cdTAwM2Vmbih0LVx1MDAzZWN0eCwgdC1cdTAwM2VvcHMpO1xuIFx0fVxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5jMzQ3OGI1MTIzZTIzXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xuQEAgLTAsMCArMSw1MzMgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogUmFjZSBjb2xsYXBzZSBhZ2FpbnN0IGZhdWx0cywgR1VQIHBpbnMsIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRFxuKyAqIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLiAgQSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3IgYXNcbisgKiB6ZXJvLCBuZXZlciBhbnl0aGluZyBlbHNlOyB0aGUga2VybmVsJ3Mgb3duIGFzc2VydGlvbnMgaW4gZG1lc2cgYXJlIHRoZVxuKyAqIG90aGVyIGhhbGYgb2YgdGhlIGNoZWNrLlxuKyAqL1xuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwia3NlbGZ0ZXN0LmhcIlxuKyNpbmNsdWRlIFwidm1fdXRpbC5oXCJcbisjaW5jbHVkZSBcImh1Z2VwYWdlX3NldHRpbmdzLmhcIlxuKyNpbmNsdWRlIFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFwiXG4rXG4rI2lmbmRlZiBGT0xMX1dSSVRFXG4rI2RlZmluZSBGT0xMX1dSSVRFIDB4MDFcbisjZW5kaWZcbitcbisjZGVmaW5lIEJBU0VfQUREUlx0KCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuKyNkZWZpbmUgUEFTU19USU1FT1VUX1NcdDMwXG4rXG4rLypcbisgKiBQTUQtc2l6ZWQgYXJlYXMgdGhlIHJhY2luZyB0aHJlYWRzIHNoYXJlLCBwbHVzIG9uZSBmb3IgdGhlIG1yZW1hcFxuKyAqIHRocmVhZC4gIC1hIHNocmlua3MgaXQgd2hlcmUgYSBQTUQgaXMgNTEyTS5cbisgKi9cbisjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XG4rc3RhdGljIGludCBucl9hcmVhcztcbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XG4rLyogbnJfYXJlYXMgUE1ELXNpemVkIGFyZWFzOyB0aGUgbGFzdCBvbmUgYmVsb25ncyB0byB0aGUgbXJlbWFwIHRocmVhZCAqL1xuK3N0YXRpYyBjaGFyICpyZWdpb247XG4rc3RhdGljIGNoYXIgKm1yZW1hcF9hcmVhO1xuK3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcbitzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1xuK3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplO1xuK3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4rc3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xuK3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkO1xuK1xuK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuK3tcbitcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4rXG4rXHRyZXR1cm4gdmFsID8gdmFsIDogMTtcdC8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqL1xuK31cbitcbisvKiBaZXJvIG1lYW5zIG5ldmVyIHdyaXR0ZW47IGFueXRoaW5nIGVsc2UgbXVzdCBiZSB0aGlzIHBhZ2UncyBwYXR0ZXJuICovXG4rc3RhdGljIGJvb2wgcGFnZV9pc19jb3JydXB0KHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGludCAqdmFsKVxuK3tcbitcdCp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRyZXR1cm4gKnZhbCBcdTAwMjZcdTAwMjYgKnZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY2hlY2tfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuK3tcbitcdHVuc2lnbmVkIGludCB2YWw7XG4rXG4rXHRpZiAocGFnZV9pc19jb3JydXB0KHBhZ2VfaWR4LCBcdTAwMjZ2YWwpKSB7XG4rXHRcdGNvcnJ1cHRlZCA9IDE7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiQ29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcblwiLFxuK1x0XHRcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNoYXJlZF9wYWdlcyh2b2lkKVxuK3tcbitcdHJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbit9XG4rXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcbit7XG4rXHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcmFuZF9yKHNlZWQpICUgc2hhcmVkX3BhZ2VzKCk7XG4rfVxuK1xuKy8qIENsYW1wIHNvIGEgcmFuZ2UgbmV2ZXIgcmVhY2hlcyB0aGUgbXJlbWFwIHRocmVhZCdzIGFyZWEgKi9cbitzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XG4rXG4rXHRyZXR1cm4gd2FudCBcdTAwM2MgbGVmdCA/IHdhbnQgOiBsZWZ0O1xuK31cbitcbitzdGF0aWMgdm9pZCAqZmF1bHRlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbitcbitcdFx0aWYgKHJhbmRfcihcdTAwMjZzZWVkKSBcdTAwMjYgMSlcbitcdFx0XHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPVxuK1x0XHRcdFx0cGF0dGVybihwYWdlX2lkeCk7XG4rXHRcdGVsc2VcbitcdFx0XHRjaGVja19wYWdlKHBhZ2VfaWR4KTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqZG9udG5lZWRfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1xuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgXHUwMDNjXHUwMDNjIChyYW5kX3IoXHUwMDI2c2VlZCkgJSA2KTtcdC8qIDEuLjMyIHBhZ2VzICovXG4rXG4rXHRcdC8qXG4rXHRcdCAqIE5vdyBhbmQgdGhlbiB6YXAgYSB3aG9sZSBQTUQtYWxpZ25lZCBhcmVhOiBvbmx5IGEgemFwIHRoYXRcbitcdFx0ICogY292ZXJzIHRoZSBmdWxsIHRhYmxlIGZyZWVzIHRoZSB0YWJsZSBpdHNlbGYgKENPTkZJR19QVF9SRUNMQUlNKS5cbitcdFx0ICovXG4rXHRcdGlmICghKHJhbmRfcihcdTAwMjZzZWVkKSAlIDY0KSkge1xuK1x0XHRcdHVuc2lnbmVkIGxvbmcgYXJlYSA9IHBhZ2VfaWR4IC9cbitcdFx0XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTtcbitcbitcdFx0XHRtYWR2aXNlKHJlZ2lvbiArIGFyZWEgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHRcdGhwYWdlX3BtZF9zaXplLCBNQURWX0RPTlRORUVEKTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRtYWR2aXNlKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplLFxuK1x0XHRcdFx0cm9vbV9mcm9tKHBhZ2VfaWR4LCBucikgKiBwYWdlX3NpemUsXG4rXHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbitcdFx0fVxuK1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgNTAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqcGlubmVyX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbnIgPSByb29tX2Zyb20ocGFnZV9pZHgsIDE2KTtcbitcbitcdFx0Z3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuK1x0XHRndXAuc2l6ZSA9IG5yICogcGFnZV9zaXplO1xuK1x0XHRndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjtcbitcdFx0Z3VwLmd1cF9mbGFncyA9IEZPTExfV1JJVEU7XG4rXHRcdC8qIFJhY2luZyBNQURWX0RPTlRORUVEIG1ha2VzIHRyYW5zaWVudCBmYWlsdXJlcyBleHBlY3RlZCAqL1xuK1x0XHRpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgXHUwMDI2Z3VwKTtcbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0XHRpZiAocGlkID09IDApIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsO1xuK1x0XHRcdGludCBiYWQgPSAwO1xuK1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaG9sZCBzdGRvdXQnc1xuK1x0XHRcdCAqIGxvY2sgYWNyb3NzIHRoZSBmb3JrLCBhbmQgcHJpbnRpbmcgdW5kZXIgaXQgaGFuZ3MuXG4rXHRcdFx0ICovXG4rXHRcdFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIDE2OyBpKyspXG4rXHRcdFx0XHRiYWQgfD0gcGFnZV9pc19jb3JydXB0KHJhbmRfcGFnZShcdTAwMjZzZWVkKSwgXHUwMDI2dmFsKTtcbitcdFx0XHRfZXhpdChiYWQpO1xuK1x0XHR9XG4rXHRcdGlmIChwaWQgXHUwMDNlIDApIHtcbitcdFx0XHRpbnQgd3N0YXR1cztcbitcbitcdFx0XHRpZiAod2FpdHBpZChwaWQsIFx1MDAyNndzdGF0dXMsIDApIFx1MDAzYyAwKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwid2FpdHBpZCgpXCIpO1xuK1x0XHRcdC8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28gKi9cbitcdFx0XHRpZiAoIVdJRkVYSVRFRCh3c3RhdHVzKSB8fCBXRVhJVFNUQVRVUyh3c3RhdHVzKSlcbitcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4rXHRcdH1cbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMDApO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1xuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdHZvaWQgKnA7XG4rXG4rXHRcdHAgPSBtcmVtYXAobXJlbWFwX2FyZWEsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpO1xuK1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1yZW1hcCgpIGF3YXlcIik7XG4rXHRcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyA4OyBpKyspXG4rXHRcdFx0bXJlbWFwX3NjcmF0Y2hbKHJhbmRfcihcdTAwMjZzZWVkKSAlXG4rXHRcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxO1xuK1x0XHRwID0gbXJlbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0ICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9hcmVhKTtcbitcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtcmVtYXAoKSBiYWNrXCIpO1xuK1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rLypcbisgKiBTd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBub3RoaW5nIGVsc2Ugd3JpdGVzLCBzbyBhIHBhZ2Unc1xuKyAqIHBhdHRlcm4gbXVzdCBzdXJ2aXZlIHRoZSB0cmlwIHRocm91Z2ggc3dhcCBleGFjdGx5LlxuKyAqL1xuK3N0YXRpYyB2b2lkICpwYWdlb3V0X2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSsrKVxuK1x0XHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpKyspIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICtcbitcdFx0XHRcdFx0XHRcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRcdFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKiBDb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIHdoaWxlIHRoZXkgYXJlIGJlaW5nIGdhdGhlcmVkICovXG4rc3RhdGljIHZvaWQgKmNvbXBhY3Rvcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXHRpbnQgZmQgPSBvcGVuKFwiL3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5XCIsIE9fV1JPTkxZKTtcbitcbitcdGlmIChmZCBcdTAwM2MgMCkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIk5vIGNvbXBhY3RfbWVtb3J5OyBjb21wYWN0b3IgaWRsZVxcblwiKTtcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHR9XG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0aWYgKHdyaXRlKGZkLCBcIjFcIiwgMSkgXHUwMDNjIDApXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHVzbGVlcCgxMDAwMCArIHJhbmRfcihcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XG4rXHR9XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcbit7XG4rXHRjaGFyIGxpbmVbMjU2XTtcbitcdGludCBsaW5lcyA9IDA7XG4rXHRGSUxFICpmcCA9IGZvcGVuKFwiL3Byb2Mvc3dhcHNcIiwgXCJyXCIpO1xuK1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxuK1x0XHRsaW5lcysrO1xuK1x0ZmNsb3NlKGZwKTtcbitcdHJldHVybiBsaW5lcyBcdTAwM2UgMTtcbit9XG4rXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgbm93X21zKHZvaWQpXG4re1xuK1x0c3RydWN0IHRpbWV2YWwgdHY7XG4rXG4rXHRnZXR0aW1lb2ZkYXkoXHUwMDI2dHYsIE5VTEwpO1xuK1x0cmV0dXJuIHR2LnR2X3NlYyAqIDEwMDBVTCArIHR2LnR2X3VzZWMgLyAxMDAwO1xuK31cbitcbitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuK3tcbitcdGZwcmludGYoc3RkZXJyLFxuK1x0XHRcIlVzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy1hIGFyZWFzXSBbLXQgbWFza11cXG5cIlxuK1x0XHRcIlxcdFdpdGhvdXQgLW0sIGV2ZXJ5IG1vZGUgcnVucyBpbiB0dXJuLlxcblwiXG4rXHRcdFwiXFx0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcXG5cIlxuK1x0XHRcIlxcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXFxuXCJcbitcdFx0XCJcXHQtdDogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCwgZm9yIGJpc2VjdGluZyBhIGZhaWx1cmVcXG5cIik7XG4rXHRleGl0KDEpO1xuK31cbitcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4re1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aHJlYWRfbmFtZXNbXSA9IHtcbitcdFx0XCJmYXVsdGVyXCIsIFwiZmF1bHRlcjJcIiwgXCJkb250bmVlZFwiLCBcInBpbm5lclwiLCBcImZvcmtlclwiLFxuK1x0XHRcIm1yZW1hcHBlclwiLCBcInBhZ2VvdXRcIiwgXCJjb21wYWN0b3JcIixcbitcdH07XG4rXHR2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHtcbitcdFx0ZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLFxuK1x0XHRtcmVtYXBwZXJfZm4sIHBhZ2VvdXRfZm4sIGNvbXBhY3Rvcl9mbixcbitcdH07XG4rXHRlbnVtIHsgVF9GQVVMVEVSLCBUX0ZBVUxURVIyLCBUX0RPTlRORUVELCBUX1BJTk5FUiwgVF9GT1JLRVIsXG4rXHQgICAgICAgVF9NUkVNQVBQRVIsIFRfUEFHRU9VVCwgVF9DT01QQUNUT1IgfTtcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgcGFnZW91dF9iaXQgPSAxVUwgXHUwMDNjXHUwMDNjIFRfUEFHRU9VVDtcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgY29tcGFjdG9yX2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgVF9DT01QQUNUT1I7XG4rXHRjb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTtcbitcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XG4rXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFsbF9tb2Rlc1tdID0geyBcInN0ZXBwZWRcIiwgXCJmcmVlXCIsIFwibWFkdmlzZVwiIH07XG4rXHRzdGF0aWMgY29uc3QgYm9vbCBvY2N1cGFuY2llc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1x0Lyogc3RyaWN0LCBob2xlcyAqL1xuK1x0c3RhdGljIGNvbnN0IGJvb2wgcHJlc3N1cmVzW10gPSB7IGZhbHNlLCB0cnVlIH07XHQvKiBxdWlldCwgdW5kZXIgcHJlc3N1cmUgKi9cbitcdGNvbnN0IGludCBucl9vY2N1cGFuY2llcyA9IEFSUkFZX1NJWkUob2NjdXBhbmNpZXMpO1xuK1x0Y29uc3QgaW50IG5yX3ByZXNzdXJlcyA9IEFSUkFZX1NJWkUocHJlc3N1cmVzKTtcbitcdGNvbnN0IGNoYXIgKm9uZV9tb2RlWzFdO1xuK1x0Y29uc3QgY2hhciAqIGNvbnN0ICptb2RlcyA9IGFsbF9tb2RlcztcbitcdGludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTtcbitcdGNvbnN0IGNoYXIgKm1vZGVfYXJnID0gTlVMTDtcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4rXHR1bnNpZ25lZCBsb25nIGVuZF9tcztcbitcdGludCBkdXJhdGlvbl9zID0gNTtcbitcdHVuc2lnbmVkIGxvbmcgdGhyZWFkX21hc2sgPSB+MFVMO1xuK1x0dW5zaWduZWQgbG9uZyBiYXNlX21hc2s7XG4rXHRib29sIGhhdmVfc3dhcDtcbitcdGNoYXIgbGFiZWxbNjRdO1xuK1x0aW50IG5yX2FyZWFzX2FyZyA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXHRpbnQgc3RlcHMgPSAwO1xuK1x0aW50IG9wdDtcbitcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFwiYTpkOm06dDpoXCIpKSAhPSAtMSkge1xuK1x0XHRzd2l0Y2ggKG9wdCkge1xuK1x0XHRjYXNlICdhJzpcbitcdFx0XHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ2QnOlxuK1x0XHRcdGR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ20nOlxuK1x0XHRcdG1vZGVfYXJnID0gb3B0YXJnO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd0JzpcbitcdFx0XHR0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTtcbitcdFx0XHRicmVhaztcbitcdFx0ZGVmYXVsdDpcbitcdFx0XHR1c2FnZSgpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobW9kZV9hcmcpIHtcbitcdFx0aWYgKHN0cmNtcChtb2RlX2FyZywgXCJzdGVwcGVkXCIpIFx1MDAyNlx1MDAyNiBzdHJjbXAobW9kZV9hcmcsIFwiZnJlZVwiKSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIHN0cmNtcChtb2RlX2FyZywgXCJtYWR2aXNlXCIpKVxuK1x0XHRcdHVzYWdlKCk7XG4rXHRcdG9uZV9tb2RlWzBdID0gbW9kZV9hcmc7XG4rXHRcdG1vZGVzID0gb25lX21vZGU7XG4rXHRcdG5yX21vZGVzID0gMTtcbitcdH1cbitcbitcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4rXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwiKTtcbitcbitcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XG4rXHRocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7XG4rXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXG5cIik7XG4rXG4rXHRndXBfZmQgPSBvcGVuKFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcIiwgT19SRFdSKTtcbitcdGlmIChndXBfZmQgXHUwMDNjIDApXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxuXCIpO1xuK1xuK1x0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XG4rXHRucl9hcmVhcyA9IG5yX3NoYXJlZF9hcmVhcyArIDE7XG4rXG4rXHQvKlxuK1x0ICogTVJFTUFQX0ZJWEVEIHVubWFwcyB3aGF0ZXZlciBpcyBpbiB0aGUgd2F5IHdpdGhvdXQgc2F5aW5nIHNvLCBzb1xuK1x0ICogY2xhaW0gdGhlIG1yZW1hcCB0aHJlYWQncyBzY3JhdGNoIGFkZHJlc3MgdXAgZnJvbnQuXG4rXHQgKi9cbitcdG1yZW1hcF9zY3JhdGNoID0gKGNoYXIgKilCQVNFX0FERFIgKyAyICogbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbitcdGlmIChtbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9OT05FLFxuK1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSxcbitcdFx0IC0xLCAwKSAhPSAodm9pZCAqKW1yZW1hcF9zY3JhdGNoKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtbWFwKCkgbXJlbWFwIHNjcmF0Y2hcIik7XG4rXG4rXHRiYXNlX21hc2sgPSB0aHJlYWRfbWFzaztcbitcdGhhdmVfc3dhcCA9IHN3YXBfYXZhaWxhYmxlKCk7XG4rXHRpZiAoIWhhdmVfc3dhcClcbitcdFx0LyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUgKi9cbitcdFx0a3NmdF9wcmludF9tc2coXCJubyBzd2FwOiB0aGUgcGFnZW91dCB0aHJlYWQgaXMgbm90IHN0YXJ0ZWRcXG5cIik7XG4rXG4rXHRrc2Z0X3NldF9wbGFuKG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xuK1xuK1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbitcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcbitcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZCAqL1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0Zm9yIChpbnQgcnVuID0gMDsgcnVuIFx1MDAzYyBucl9tb2RlcyAqIG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzOyBydW4rKykge1xuK1x0XHRpbnQgcmVtID0gcnVuICUgKG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKTtcbitcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldO1xuK1x0XHRib29sIGhvbGVzID0gb2NjdXBhbmNpZXNbcmVtIC8gbnJfcHJlc3N1cmVzXTtcbitcdFx0Ym9vbCBwcmVzc3VyZSA9IHByZXNzdXJlc1tyZW0gJSBucl9wcmVzc3VyZXNdO1xuK1xuK1x0XHRzbnByaW50ZihsYWJlbCwgc2l6ZW9mKGxhYmVsKSwgXCIlcy8lcyVzXCIsIG1vZGUsXG4rXHRcdFx0IGhvbGVzID8gXCJob2xlc1wiIDogXCJzdHJpY3RcIiwgcHJlc3N1cmUgPyBcIi9wcmVzc3VyZVwiIDogXCJcIik7XG4rXHRcdGlmIChjb3JydXB0ZWQpIHtcbitcdFx0XHQvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZyAqL1xuK1x0XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcIiVzOiBza2lwcGVkIGFmdGVyIGNvcnJ1cHRpb25cXG5cIiwgbGFiZWwpO1xuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXG4rXHRcdHRocmVhZF9tYXNrID0gYmFzZV9tYXNrO1xuK1x0XHRpZiAoIXByZXNzdXJlKVxuK1x0XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpO1xuK1x0XHRlbHNlIGlmICghaGF2ZV9zd2FwKVxuK1x0XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfnBhZ2VvdXRfYml0O1xuK1xuK1x0XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXHRcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHRcdHNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUztcbitcdFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xuK1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4rXHRcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPVxuK1x0XHRcdHN0cmNtcChtb2RlLCBcImZyZWVcIikgPyAxMDAwIDogMDtcbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSAxMDtcbitcbitcdFx0LypcbitcdFx0ICogbVRIUCBjb2xsYXBzZSBob25vdXJzIG9ubHkgMCBvciBIUEFHRV9QTURfTlIgLSAxIGhlcmUuICBUaGUgdHdvXG4rXHRcdCAqIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHM6IGEgc3RyaWN0IHdpbmRvdyBoYXMgZXZlcnkgUFRFXG4rXHRcdCAqIHByZXNlbnQsIGEgaG9sZS1oZWF2eSBvbmUgaXMgbW9zdGx5IHplcm8tZmlsbGVkLlxuK1x0XHQgKi9cbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaG9sZXMgP1xuK1x0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgLSAxIDogMDtcbitcdFx0LyogT25lIHdha2UsIG9uZSBwYXNzOiB0aGUgcGxheWdyb3VuZCBwbHVzIHRoZSBmb3JrZWQgY2hpbGRyZW4ncyBjb3BpZXMgKi9cbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cbitcdFx0XHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKykge1xuK1x0XHRcdGlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBpKSlcbitcdFx0XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4rXHRcdH1cbitcdFx0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0XHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHQgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfQU5PTllNT1VTIHxcbitcdFx0XHQgICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcbitcdFx0aWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibW1hcCgpIHBsYXlncm91bmRcIik7XG4rXHRcdG1yZW1hcF9hcmVhID0gcmVnaW9uICsgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XG4rXG4rXHRcdGlmICh0aHJlYWRfbWFzayBcdTAwMjYgcGFnZW91dF9iaXQpIHtcbitcdFx0XHQvKiBFbm91Z2ggdG8gZHJpdmUgcmVhbCByZWNsYWltIHdpdGhvdXQgc3dhbXBpbmcgYSBzbWFsbCBndWVzdCAqL1xuK1x0XHRcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcbitcdFx0XHRpZiAocGFnZW91dF9zaXplIFx1MDAzYyAxNlVMIFx1MDAzY1x1MDAzYyAyMClcbitcdFx0XHRcdHBhZ2VvdXRfc2l6ZSA9IDE2VUwgXHUwMDNjXHUwMDNjIDIwO1xuK1x0XHRcdGlmIChwYWdlb3V0X3NpemUgXHUwMDNlIDY0VUwgXHUwMDNjXHUwMDNjIDIwKVxuK1x0XHRcdFx0cGFnZW91dF9zaXplID0gNjRVTCBcdTAwM2NcdTAwM2MgMjA7XG4rXHRcdFx0cGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsXG4rXHRcdFx0XHRcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHRcdFx0XHQgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4rXHRcdFx0aWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibW1hcCgpIHBhZ2VvdXQgYXJlYVwiKTtcbitcdFx0fVxuK1xuK1x0XHQvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlICovXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpKyspXG4rXHRcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xuK1x0XHRtZW1zZXQobXJlbWFwX2FyZWEsIDEsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0aWYgKG1hZHZpc2UocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSlcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXCIpO1xuK1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl90aHJlYWRzOyBpKyspIHtcbitcdFx0XHRpZiAoISh0aHJlYWRfbWFzayBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpKSB7XG4rXHRcdFx0XHR0aHJlYWRzW2ldID0gMDtcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbitcdFx0XHRpZiAocHRocmVhZF9jcmVhdGUoXHUwMDI2dGhyZWFkc1tpXSwgTlVMTCwgdGhyZWFkX2Zuc1tpXSxcbitcdFx0XHRcdFx0ICAgKHZvaWQgKikoaSArIDEpKSlcbitcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcih0aHJlYWRfbmFtZXNbaV0pO1xuK1x0XHR9XG4rXG4rXHRcdGVuZF9tcyA9IG5vd19tcygpICsgZHVyYXRpb25fcyAqIDEwMDBVTDtcbitcdFx0aWYgKCFzdHJjbXAobW9kZSwgXCJzdGVwcGVkXCIpKSB7XG4rXHRcdFx0d2hpbGUgKG5vd19tcygpIFx1MDAzYyBlbmRfbXMgXHUwMDI2XHUwMDI2ICFjb3JydXB0ZWQpIHtcbitcdFx0XHRcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoUEFTU19USU1FT1VUX1MpKVxuK1x0XHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XFxuXCIpO1xuK1x0XHRcdFx0c3RlcHMrKztcbitcdFx0XHR9XG4rXHRcdH0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCBcImZyZWVcIikpIHtcbitcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZClcbitcdFx0XHRcdHVzbGVlcCgxMDAgKiAxMDAwKTtcbitcdFx0fSBlbHNlIHtcdC8qIG1hZHZpc2UgKi9cbitcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuK1x0XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzOyBpKyspIHtcbitcdFx0XHRcdFx0bWFkdmlzZShyZWdpb24gKyBpICogaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfQ09MTEFQU0UpO1xuK1x0XHRcdFx0fVxuK1x0XHRcdFx0bWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbitcdFx0XHRcdHN0ZXBzKys7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXG4rXHRcdHN0b3AgPSAxO1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl90aHJlYWRzOyBpKyspIHtcbitcdFx0XHRpZiAodGhyZWFkc1tpXSlcbitcdFx0XHRcdHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTtcbitcdFx0fVxuK1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSsrKVxuK1x0XHRcdGNoZWNrX3BhZ2UoaSk7XG4rXG4rXHRcdGtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCwgXCIlczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxcblwiLFxuK1x0XHRcdFx0IGxhYmVsLCBkdXJhdGlvbl9zLCBzdGVwcyk7XG4rXG4rXHRcdC8qIFRoZSBuZXh0IG1vZGUgbWFwcyB0aGUgc2FtZSBmaXhlZCBhZGRyZXNzIHdpdGggaXRzIG93biBzZXR0aW5ncyAqL1xuK1x0XHRtdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xuK1x0XHRcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XG4rXHRcdFx0cGFnZW91dF9hcmVhID0gTlVMTDtcbitcdFx0fVxuK1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRcdHN0b3AgPSAwO1xuK1x0XHRzdGVwcyA9IDA7XG4rXHR9XG4rXG4rXHRrc2Z0X2ZpbmlzaGVkKCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xYzFiOTQyYWMzMjU4XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xuQEAgLTAsMCArMSwxNzkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogQ2hlY2sgdGhhdCBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGRyaXZlcyBraHVnZXBhZ2VkIGluIHN0ZXA6IG9uZSBiYXJyaWVyXG4rICogb3ZlciBvbmUgcHJlcGFyZWQgd2luZG93IG11c3QgY29sbGFwc2UgaXQgd2l0aCBleGFjdGx5IG9uZSBjb2xsYXBzZVxuKyAqIGF0dGVtcHQgYXR0cmlidXRlZCB0byBpdHMgc291cmNlIHBhZ2VzLCBzdGVwIGFmdGVyIHN0ZXAuXG4rICpcbisgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBhIG1pbnV0ZSBzbyB0aGF0IGEgc3RlcCB3aGljaCBzbGVwdCBpbnN0ZWFkIG9mXG4rICogYmVpbmcgd29rZW4gYmxvd3MgdGhlIGJ1ZGdldC5cbisgKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJrc2VsZnRlc3QuaFwiXG4rI2luY2x1ZGUgXCJ2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFwiXG4rXG4rI2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuKy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXG4rI2RlZmluZSBUQVJHRVRfT1JERVIgMlxuKyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1XG4rI2RlZmluZSBQQVNTX1RJTUVPVVRfUyAzMFxuK1xuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4rc3RhdGljIGludCB0cmFjZV9ldmVudHNfZmQgPSAtMTtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbitcbisvKlxuKyAqIFRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlOiBzd2l0Y2ggdGhlbSBvZmYgaG93ZXZlciB0aGUgdGVzdCBlbmRzLFxuKyAqIGluY2x1ZGluZyBmcm9tIGluc2lkZSBhIGhlbHBlciB0aGF0IGdpdmVzIHVwLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHRyYWNlX2V2ZW50c19vZmYodm9pZClcbit7XG4rXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzZT0gMClcbitcdFx0dHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpO1xuK31cbitcbisvKiBDb3VudCB0aGUgaXNvbGF0ZSBldmVudHMgd2hvc2Ugc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cncyBzb3VyY2UgUEZOcyAqL1xuK3N0YXRpYyBpbnQgY291bnRfYXR0cmlidXRlZCh1bnNpZ25lZCBsb25nICpwZm5zLCBpbnQgbnJfcGZucyxcbitcdFx0XHQgICAgdW5zaWduZWQgaW50IG9yZGVyKVxuK3tcbitcdGNoYXIgbGluZVsxMDI0XTtcbitcdGludCBjb3VudCA9IDA7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gdHJhY2luZ19vcGVuX3RyYWNlKCk7XG4rXHRpZiAoIWZwKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJDYW5ub3Qgb3BlbiB0cmFjZSBidWZmZXJcXG5cIik7XG4rXG4rXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcbitcdFx0dW5zaWduZWQgbG9uZyB2YWw7XG4rXHRcdHVuc2lnbmVkIGludCBvcmQ7XG4rXHRcdGNoYXIgKnMsICpvO1xuK1x0XHRpbnQgaTtcbitcbitcdFx0cyA9IHN0cnN0cihsaW5lLCBcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlwiKTtcbitcdFx0aWYgKCFzKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAoc3NjYW5mKHMsIFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4XCIsXG4rXHRcdFx0ICAgXHUwMDI2dmFsKSAhPSAxKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRvID0gc3Ryc3RyKHMsIFwib3JkZXI9XCIpO1xuK1x0XHRpZiAoIW8gfHwgc3NjYW5mKG8sIFwib3JkZXI9JXVcIiwgXHUwMDI2b3JkKSAhPSAxIHx8IG9yZCAhPSBvcmRlcilcbitcdFx0XHRjb250aW51ZTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGZuczsgaSsrKSB7XG4rXHRcdFx0aWYgKHZhbCA9PSBwZm5zW2ldKSB7XG4rXHRcdFx0XHRjb3VudCsrO1xuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHR9XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGNvdW50O1xuK31cbitcbitzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxuK3tcbitcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHR1bnNpZ25lZCBsb25nIHBmbnNbMSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSXTtcbitcdGJvb2wgY29sbGFwc2VkLCBwYXNzZWQ7XG4rXHRpbnQgYXR0cmlidXRlZDtcbitcdGNoYXIgKnA7XG4rXHRpbnQgaTtcbitcbitcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XG4rXHRpZiAocCAhPSBCQVNFX0FERFIpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSB3aW5kb3dcIik7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XG4rXHRcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcbitcdFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcblwiKTtcbitcdH1cbitcbitcdC8qIENsZWFyIGJlZm9yZSBlbmFibGluZyBzbyB0aGUgYnVmZmVyIGhvbGRzIG9ubHkgdGhpcyBzdGVwJ3MgZXZlbnRzICovXG4rXHRpZiAodHJhY2luZ19jbGVhcl90cmFjZSgpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxcblwiKTtcbitcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCB0cnVlKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiQ2Fubm90IGVuYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cIik7XG4rXG4rXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9IVUdFUEFHRSlcIik7XG4rXHRwYXNzZWQgPSBraHVnZXBhZ2VkX2Z1bGxfcGFzcyhQQVNTX1RJTUVPVVRfUyk7XG4rXG4rXHQvKiBPZmYgYmVmb3JlIGFueXRoaW5nIHRoYXQgY2FuIGdpdmUgdXA6IHRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlICovXG4rXHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJDYW5ub3QgZGlzYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cIik7XG4rXHRpZiAoIXBhc3NlZClcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwia2h1Z2VwYWdlZCBkaWQgbm90IGNvbXBsZXRlIGEgZnVsbCBwYXNzXFxuXCIpO1xuK1xuK1x0Y29sbGFwc2VkID0gaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLFxuK1x0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuK1x0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsIFRBUkdFVF9PUkRFUik7XG4rXG4rXHRrc2Z0X3Rlc3RfcmVzdWx0KGNvbGxhcHNlZCBcdTAwMjZcdTAwMjYgYXR0cmlidXRlZCA9PSAxLFxuK1x0XHRcdCBcInN0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXFxuXCIsXG4rXHRcdFx0IGl0ZXJhdGlvbiwgYXR0cmlidXRlZCk7XG4rXG4rXHRtdW5tYXAocCwgaHBhZ2VfcG1kX3NpemUpO1xuK31cbitcbitpbnQgbWFpbih2b2lkKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4rXHRpbnQgaTtcbitcbitcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4rXG4rXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwiKTtcbitcdGlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUikpKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIk9yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwiLFxuK1x0XHRcdCAgICAgICBUQVJHRVRfT1JERVIpO1xuK1xuK1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuK1x0aWYgKCFocGFnZV9wbWRfc2l6ZSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiUmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCIpO1xuK1x0cGFnZW1hcF9mZCA9IG9wZW4oXCIvcHJvYy9zZWxmL3BhZ2VtYXBcIiwgT19SRE9OTFkpO1xuK1x0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm9wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKVwiKTtcbitcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwiL3Byb2Mva3BhZ2VmbGFnc1wiLCBPX1JET05MWSk7XG4rXHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCJvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcXG5cIik7XG4rXHR0cmFjZV9ldmVudHNfZmQgPSB0cmFjaW5nX2V2ZW50c19vcGVuKFwiaHVnZV9tZW1vcnlcIik7XG4rXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcImh1Z2VfbWVtb3J5IGV2ZW50cyByZXF1aXJlIHRyYWNlZnMgYW5kIHJvb3RcXG5cIik7XG4rXHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XG4rXG4rXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xuK1xuK1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbitcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAgKiAxMDAwO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MCAqIDEwMDA7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAoaHBhZ2VfcG1kX3NpemUgLyBnZXRwYWdlc2l6ZSgpKSAtIDE7XG4rXHQvKiBPbmUgd2FrZSBtdXN0IGNvbXBsZXRlIG9uZSBmdWxsIHBhc3M7IHNlZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpICovXG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXHUwMDNjXHUwMDNjIDI0O1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0c2V0dGluZ3MuaHVnZXBhZ2VzW1RBUkdFVF9PUkRFUl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuK1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9JVEVSQVRJT05TOyBpKyspXG4rXHRcdG9uZV9zdGVwKGkpO1xuK1xuK1x0a3NmdF9maW5pc2hlZCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG5pbmRleCBmMTlkNTNjNjk1NzY0Li5mZDM1ZjhhN2I1YjgzIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG5AQCAtMjAsNyArMjAsNiBAQFxuIFxuICNkZWZpbmUgVFdPTUVHXHRcdCgyXHUwMDNjXHUwMDNjMjApXG4gI2RlZmluZSBSVU5USU1FXHRcdCgyMClcbi0jZGVmaW5lIEFMSUdOKHgsIGEpXHQoKCh4KSArIChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gXG4gSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTQwMiw2ICs0MDIsMTIgQEAgQ0FURUdPUlk9XCJwZm5tYXBcIiBydW5fdGVzdCAuL3Bmbm1hcFxuICMgQ09XIHRlc3RzXG4gQ0FURUdPUlk9XCJjb3dcIiBydW5fdGVzdCAuL2Nvd1xuIFxuK0NBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9mb2xpb19vcmRlcl9jaGVja1xuK1xuK0NBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcbitcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlXG4rXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWRcbiBcbiBDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyXG5AQCAtNDEwLDggKzQxNiw2IEBAIENBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxuIFxuIENBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDQgYWxsOnNobWVtXG4gXG4tQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLWMgNCBtdGhwX2todWdlcGFnZWQ6YW5vblxuLVxuICMgVHJ5IHRvIGNyZWF0ZSBYRlMgaWYgbm90IHByb3ZpZGVkXG4gaWYgWyAteiBcIiR7U1BMSVRfSFVHRV9QQUdFX1RFU1RfWEZTX1BBVEh9XCIgXTsgdGhlblxuICAgICBpZiB0ZXN0X3NlbGVjdGVkIFwidGhwXCI7IHRoZW5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuaW5kZXggODZhNjAzNjkyODI2MS4uMGFkZmU3ZGRlN2U1OSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcbkBAIC00Miw2OCArNDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcIi9wcm9jL2twYWdlZmxhZ3NcIjtcbiBpbnQgcGFnZW1hcF9mZDtcbiBpbnQga3BhZ2VmbGFnc19mZDtcbiBcbi1zdGF0aWMgYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4tXHRcdGludCBrcGFnZWZsYWdzX2ZkKVxuLXtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XG4tXHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xuLVx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4tXHR1bnNpZ25lZCBsb25nIHBmbl9oZWFkO1xuLVx0dWludDY0X3QgcGZuX2ZsYWdzO1xuLVx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGk7XG4tXG4tXHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuLVxuLVx0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xuLVx0aWYgKHBmbiA9PSAtMVVMKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdGdvdG8gZmFpbDtcbi1cbi1cdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4tXHRpZiAoIW9yZGVyKSB7XG4tXHRcdGlmIChwZm5fZmxhZ3MgXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXG4tXHRcdFx0cmV0dXJuIGZhbHNlO1xuLVx0XHRyZXR1cm4gdHJ1ZTtcbi1cdH1cbi1cbi1cdC8qIG5vbiBUSFAgZm9saW8gKi9cbi1cdGlmICghKHBmbl9mbGFncyBcdTAwMjYgS1BGX1RIUCkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdHBmbl9oZWFkID0gcGZuIFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XG4tXG4tXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cbi1cdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cbi1cdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcbi1cdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRcdGdvdG8gZmFpbDtcbi1cdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4tXHRcdFx0cmV0dXJuIGZhbHNlO1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXG4tXHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4tXHQgKi9cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcblwiKTtcbi1cdHJldHVybiBmYWxzZTtcbi19XG4tXG4gc3RhdGljIGludCBjaGVja19hZnRlcl9zcGxpdF9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sXG4gXHRcdGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKVxuIHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbmluZGV4IDQ4MjFhMzU2MzAzNjMuLmFmODMyNGUxZThmMmMgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuQEAgLTQ5MCw2ICs0OTAsMTUzIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxuK1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKVxuK3tcbitcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XG4rXHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4rXHR1bnNpZ25lZCBsb25nIHBmbl9oZWFkO1xuK1x0dWludDY0X3QgcGZuX2ZsYWdzO1xuK1x0dW5zaWduZWQgbG9uZyBwZm47XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuK1xuK1x0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xuK1x0aWYgKHBmbiA9PSAtMVVMKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4rXHRpZiAoIW9yZGVyKSB7XG4rXHRcdGlmIChwZm5fZmxhZ3MgXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcdH1cbitcbitcdC8qIG5vbiBUSFAgZm9saW8gKi9cbitcdGlmICghKHBmbl9mbGFncyBcdTAwMjYgS1BGX1RIUCkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdHBmbl9oZWFkID0gcGZuIFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XG4rXG4rXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cbitcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cbitcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcbitcdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXG4rXHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4rXHQgKi9cbitcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4rXHRcdHJldHVybiB0cnVlO1xuK1xuK1x0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuK1x0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4rZmFpbDpcbitcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcblwiKTtcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rLyoqXG4rICogaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKCkgLSBjaGVjayB0aGF0IGEgcmFuZ2UgaXMgYmFja2VkIGJ5IEBvcmRlciBmb2xpb3NcbisgKiBAc3RhcnQ6IHN0YXJ0IG9mIHRoZSByYW5nZSwgYSBtdWx0aXBsZSBvZiB0aGUgZm9saW8gc2l6ZVxuKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgcmFuZ2UgaW4gYnl0ZXMsIGEgbXVsdGlwbGUgb2YgdGhlIGZvbGlvIHNpemVcbisgKiBAb3JkZXI6IHRoZSBmb2xpbyBvcmRlciB0byBjaGVjayBmb3JcbisgKiBAcGFnZW1hcF9mZDogb3BlbiAvcHJvYy9cdTAwM2NwaWRcdTAwM2UvcGFnZW1hcCBvZiB0aGUgcmFuZ2UncyBvd25lclxuKyAqIEBrcGFnZWZsYWdzX2ZkOiBvcGVuIC9wcm9jL2twYWdlZmxhZ3NcbisgKlxuKyAqIEV2ZXJ5IGZvbGlvLXNpemVkLCBmb2xpby1hbGlnbmVkIHBhcnQgb2YgdGhlIHJhbmdlIG11c3QgbWFwIG9uZSBmb2xpbyBvZlxuKyAqIEBvcmRlciwgaGVhZCB0byB0YWlsLCB3aXRoIHRoZSBoZWFkIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFydC4gIEEgcGFydFxuKyAqIGJhY2tlZCBieSBzZXZlcmFsIHNtYWxsZXIgZm9saW9zIGZhaWxzLCBhbmQgc28gZG9lcyBhIGZvbGlvIG1hcHBlZCBvZmZcbisgKiBpdHMgbmF0dXJhbCBhbGlnbm1lbnQuXG4rICpcbisgKiBSZXR1cm5zOiB0cnVlIGlmIHRoZSB3aG9sZSByYW5nZSBpcyBiYWNrZWQgdGhhdCB3YXksIGZhbHNlIG90aGVyd2lzZS5cbisgKi9cbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxuK1x0XHRcdCAgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZClcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdGNvbnN0IHNpemVfdCBmb2xpb19zaXplID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xuK1x0Y2hhciAqdmFkZHI7XG4rXG4rXHRpZiAoKHVpbnRwdHJfdClzdGFydCAlIGZvbGlvX3NpemUgfHwgbGVuICUgZm9saW9fc2l6ZSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0Zm9yICh2YWRkciA9IHN0YXJ0OyB2YWRkciBcdTAwM2Mgc3RhcnQgKyBsZW47IHZhZGRyICs9IGZvbGlvX3NpemUpIHtcbitcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuK1x0XHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRcdC8qIE5vdCBwcmVzZW50LCBvciBhIHRhaWwgcGFnZSAqL1xuK1x0XHRpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdFx0Y2hhciAqcGFnZSA9IHZhZGRyICsgaSAqIHBzaXplKCk7XG4rXG4rXHRcdFx0aWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwYWdlKSAhPSBwZm4gKyBpKVxuK1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9XG4rXG4rXHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKyNkZWZpbmUgVFJBQ0VGU19ST09UIFwiL3N5cy9rZXJuZWwvdHJhY2luZ1wiXG4rXG4rLypcbisgKiBSZXR1cm5zIC0xIHdpdGhvdXQgdHJhY2VmcyBvciB0aGUgc3Vic3lzdGVtLiAgVGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGU6XG4rICogd2hvZXZlciBzd2l0Y2hlcyB0aGVtIG9uIGhhcyB0byBzd2l0Y2ggdGhlbSBvZmYgYWdhaW4sIG9uIGV2ZXJ5IGV4aXQgcGF0aC5cbisgKi9cbitpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpXG4re1xuK1x0Y2hhciBwYXRoWzI1Nl07XG4rXG4rXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCBcIi9ldmVudHMvJXMvZW5hYmxlXCIsXG4rXHRcdCBzdWJzeXMpO1xuK1x0cmV0dXJuIG9wZW4ocGF0aCwgT19XUk9OTFkpO1xuK31cbitcbitpbnQgdHJhY2luZ19ldmVudHNfZW5hYmxlKGludCBmZCwgYm9vbCBlbmFibGUpXG4re1xuK1x0aWYgKHB3cml0ZShmZCwgZW5hYmxlID8gXCIxXCIgOiBcIjBcIiwgMSwgMCkgIT0gMSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhciAqL1xuK2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpXG4re1xuK1x0aW50IGZkID0gb3BlbihUUkFDRUZTX1JPT1QgXCIvdHJhY2VcIiwgT19XUk9OTFkgfCBPX1RSVU5DKTtcbitcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKVxuK3tcbitcdHJldHVybiBmb3BlbihUUkFDRUZTX1JPT1QgXCIvdHJhY2VcIiwgXCJyXCIpO1xuK31cbitcbiAvKiBJZiBgaW9jdGxzJyBub24tTlVMTCwgdGhlIGFsbG93ZWQgaW9jdGxzIHdpbGwgYmUgcmV0dXJuZWQgaW50byB0aGUgdmFyICovXG4gaW50IHVmZmRfcmVnaXN0ZXJfd2l0aF9pb2N0bHMoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcbiBcdFx0XHQgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG5pbmRleCA5YTQ5YWY4ODcwMmU0Li41YTkxYjk2NzZlYzVkIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbkBAIC0xMCw2ICsxMCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuIFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXHUwMDNjXHUwMDNjIChucikpXG4rI2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSArIChhKSAtIDEpIFx1MDAyNiB+KChhKSAtIDEpKVxuK1xuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcbiAjZGVmaW5lIFBNX01NQVBfRVhDTFVTSVZFICAgICAgICAgICAgIEJJVF9VTEwoNTYpXG4gI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KVxuQEAgLTk3LDYgKzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xuIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKTtcbiBpbnQgZ2F0aGVyX2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpO1xuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxuK1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKTtcbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxuK1x0XHRcdCAgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XG4gXG4gaW50IHVmZmRfcmVnaXN0ZXIoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcbiBcdFx0ICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IpO1xuQEAgLTExMyw2ICsxMTksMTAgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApO1xuIGludCB3cml0ZV9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgdmFsKTtcbiBpbnQgcmVhZF9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgKnZhbCk7XG4gYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpO1xuK2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cyk7XG4raW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKTtcbitpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKTtcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XG4gXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxuIHtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDE1OjE1OjQyLjc5ODQwNDEwNloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjk2MTExOTIxMzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgdGhlIFBhdGNoIGZvciBGdXp6aW5nIEVsaWdpYmlsaXR5KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIGxvb2sgYXQgdGhlIGRpZmYgYW5kIHF1aWNrbHkgaWRlbnRpZnkgd2hpY2ggZmlsZXMgaGF2ZSBiZWVuIG1vZGlmaWVkLiBJdCdzIGFsbCB1bmRlciBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gIFJpZ2h0LCB0aGF0IG1lYW5zIHRoZXNlIGFyZSBzZWxmLXRlc3RzIHJlbGF0ZWQgdG8gbWVtb3J5IG1hbmFnZW1lbnQuIEdpdmVuIG15IGV4cGVydGlzZSwgSSBhbHJlYWR5IGtub3cgdGhhdCB0aGlzIHNlY3Rpb24gY29udGFpbnMgdGVzdHMgZm9yIHRyYW5zcGFyZW50IGh1Z2VwYWdlcyAoVEhQL2todWdlcGFnZWQpLlxuXG5Ob3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoaXMgd2FycmFudHMgZnV6emluZy4gSSBoYXZlIHRvIGFwcGx5IHRoYXQgbmVnYXRpdmUgY3JpdGVyaWEgY2hlY2suIFNwZWNpZmljYWxseSwgdGhlIHJ1bGUgSSBuZWVkIHRvIGxvb2sgYXQgaXM6ICpVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLipcblxuQmluZ28uIEV2ZXJ5IHNpbmdsZSBmaWxlIGxpc3RlZOKAlGBNYWtlZmlsZWAsIHRoZSBgLmNgIGZpbGVzLCBhbmQgdGhlIGAuaGAgZmlsZXPigJRyZXNpZGVzIHByZWNpc2VseSB3aXRoaW4gdGhhdCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYCBkaXJlY3RvcnkuIFRoZXNlIGFyZSB1c2VyLXNwYWNlIHRlc3RzLCBhbmQgdGhlIG1vZGlmaWVkIGZpbGVzIHdpbGwgKm5vdCogYWZmZWN0IHRoZSBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy4gSSd2ZSBkb3VibGUtY2hlY2tlZCB0aGUgZGlmZiBhbmQgdGhpcyBpcyB0aGUgZW50aXJlIHNldCBvZiBjaGFuZ2VzLlxuXG5UaGVyZWZvcmUsIGFjY29yZGluZyB0byB0aGUgXCJOZWdhdGl2ZSBDcml0ZXJpYVwiIG91dGxpbmVkLCB0aGUgYFdvcnRoRnV6emluZ2AgcGFyYW1ldGVyIGlzIGBmYWxzZWAuXG5cbkdpdmVuIHRoaXMsIEkgaGF2ZSB0byBmb3JtdWxhdGUgdGhlIGBzZXQtcmVzdWx0c2AgY2FsbDpcblxuKiAgIGBXb3J0aEZ1enppbmdgOiBgZmFsc2VgXG4qICAgYFJlYXNvbmluZ2A6IFwiTW9kaWZpZWQgZmlsZXMgYXJlIGxvY2F0ZWQgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AsIHdoaWNoIGNvbnNpc3RzIG9mIHVzZXItc3BhY2UgdGVzdHMgYW5kIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2Ugb3Iga2VybmVsIG1vZHVsZXMuXCJcbiogICBgRm9jdXNTeW1ib2xzYDogXFxbIF1cbiogICBgRW5hYmxlQ29uZmlnc2A6IFxcWyBdXG5cbkknbSByZWFkeSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgY2FzZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc5MDQsIk91dHB1dFRva2VucyI6OTAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDQwLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTU6MTU6NTIuNDA5NjAwMTQ3WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzg3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIkFsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3IgbW9kdWxlIGNvZGUgaXMgYWx0ZXJlZCwgbWFraW5nIHRoZSBjaGFuZ2VzIG5vbi1rZXJuZWwvbm9uLWV4ZWN1dGFibGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Yga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIkFsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3IgbW9kdWxlIGNvZGUgaXMgYWx0ZXJlZCwgbWFraW5nIHRoZSBjaGFuZ2VzIG5vbi1rZXJuZWwvbm9uLWV4ZWN1dGFibGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Yga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxNToxNTo1Mi40MDk2MzI3NjdaIiwiU2VxIjo1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzI5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+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-workflow77nkc[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-08 14:28:37 +0000 UTC FinishedAt: 2026-09-08 15:15:53 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDE1OjE1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdXNlci1zcGFjZSBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBObyBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIG1vZHVsZSBjb2RlIGlzIGFsdGVyZWQsIG1ha2luZyB0aGUgY2hhbmdlcyBub24ta2VybmVsL25vbi1leGVjdXRhYmxlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxNToxNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDY4MjcwYTFhYjgyYjY3OTczZGU2N2ZmYjRkMzU0MDY1YWQ1YTg2OTFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIFNlcCA4IDE1OjE1OjM5IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbkBAIC0xMDQsNiAmIzQzOzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBndWFyZC1yZWdpb25zXG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1lcmdlXG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IHJtYXBcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0XG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19vcmRlcl9jaGVja1xuJiM0MztURVNUX0dFTl9GSUxFUyAmIzQzOz0ga2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3JhY2VcbiBcbiBpZm5lcSAoJChBUkNIKSxhcm02NClcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gc29mdC1kaXJ0eVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZmE3MzZjOWY3MDFhNFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xuQEAgLTAsMCAmIzQzOzEsMTIyIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGhlbHBlcnMsIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZFxuJiM0MzsgKiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIoKSwgd2hpY2ggdGhlIGtodWdlcGFnZWQgbVRIUCBjYXNlcyB1c2UgdG8gZGV0ZWN0XG4mIzQzOyAqIGNvbGxhcHNlIHJlc3VsdHMuICBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHRcbiYjNDM7ICogbWVtb3J5IGluIHdpdGggb25seSB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHJlcXVpcmUgdGhlIGhlbHBlcnMgdG8gcmVwb3J0XG4mIzQzOyAqIGV4YWN0bHkgdGhhdCBvcmRlci5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzZWxmdGVzdC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtX3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oXCYjMzQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4mIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcbiYjNDM7XG4mIzQzO3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xuJiM0MztcdGNoYXIgKnAsICphbGlnbmVkO1xuJiM0MztcbiYjNDM7XHRwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4mIzQzO1x0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRhbGlnbmVkID0gKGNoYXIgKilBTElHTigodWludHB0cl90KXAsIHNpemUpO1xuJiM0MztcdGlmIChhbGlnbmVkICE9IHApXG4mIzQzO1x0XHRtdW5tYXAocCwgYWxpZ25lZCAtIHApO1xuJiM0MztcdGlmIChhbGlnbmVkICYjNDM7IHNpemUgIT0gcCAmIzQzOyBsZW4pXG4mIzQzO1x0XHRtdW5tYXAoYWxpZ25lZCAmIzQzOyBzaXplLCBwICYjNDM7IGxlbiAtIGFsaWduZWQgLSBzaXplKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGFsaWduZWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX29yZGVyKGludCBvcmRlcilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXHUwMDNjXHUwMDNjIG9yZGVyO1xuJiM0MztcdGJvb2wgb2sgPSB0cnVlO1xuJiM0MztcdGNoYXIgKnA7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRpZiAob3JkZXIpXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0cCA9IGFsbG9jX2FsaWduZWQoc2l6ZSk7XG4mIzQzO1x0KnAgPSAxO1xuJiM0MztcbiYjNDM7XHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBzaXplLCBvcmRlciwgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O29yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcblwmIzM0Oywgb3JkZXIpO1xuJiM0MztcdFx0b2sgPSBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEEgbG93ZXIgb3JkZXIgbXVzdCBiZSByZWplY3RlZDogdGhlIGZvbGlvIGlzIGxhcmdlciAqL1xuJiM0MztcdGlmIChvcmRlciBcdTAwMjZcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKHAsIHNpemUsIG9yZGVyIC0gMSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XG4mIzQzO1x0XHRvayA9IGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogQSBsYXJnZSBmb2xpbyBtdXN0IG5vdCBwYXNzIGFzIG9yZGVyIDAgKi9cbiYjNDM7XHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBzaXplLCAwLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O29yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxcblwmIzM0Oywgb3JkZXIpO1xuJiM0MztcdFx0b2sgPSBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG11bm1hcChwLCBzaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHQob2ssIFwmIzM0O29yZGVyICVkIGNsYXNzaWZpZWRcXG5cJiMzNDssIG9yZGVyKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG1haW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBvcmRlcnM7XG4mIzQzO1x0aW50IG9yZGVyO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0cGFnZW1hcF9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCYjMzQ7KTtcbiYjNDM7XHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcdGlmICghb3JkZXJzKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Tm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSAmIzQzOyAxKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRjaGVja19vcmRlcigwKTtcbiYjNDM7XHRmb3IgKG9yZGVyID0gMTsgb3JkZXIgXHUwMDNjIE5SX09SREVSUzsgb3JkZXImIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoIShvcmRlcnMgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIG9yZGVyKSkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0Y2hlY2tfb3JkZXIob3JkZXIpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xuaW5kZXggZTI2NDJlY2EwZDAyYi4uZGY0MjZmOTIxOGU3MSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xuQEAgLTY1LDcgJiM0Mzs2NSw2IEBAIGVudW0ge1xuICNkZWZpbmUgSE1NX1BBVEhfTUFYICAgIDY0XG4gI2RlZmluZSBOVElNRVNcdFx0MTBcbiBcbi0jZGVmaW5lIEFMSUdOKHgsIGEpICgoKHgpICYjNDM7IChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi9cbiBcbiAjaWZuZGVmIEZPTExfV1JJVEVcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuaW5kZXggZDc5MTdkY2UzYWJhYy4uY2E3M2Y5YWM4ZTliNiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbkBAIC0xODMsNiAmIzQzOzE4MywxMyBAQCB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0fVxuIH1cbiBcbiYjNDM7LyogQSBzdG9yZSB0byBlaXRoZXIgc2xlZXAga25vYiB3YWtlcyBraHVnZXBhZ2VkLCBzbyB3cml0ZSBvbmx5IG9uIGNoYW5nZSAqL1xuJiM0MztzdGF0aWMgdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcbiYjNDM7e1xuJiM0MztcdGlmICh0aHBfcmVhZF9udW0obmFtZSkgIT0gbnVtKVxuJiM0MztcdFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xuJiM0Mzt9XG4mIzQzO1xuIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIHtcbiBcdHN0cnVjdCBraHVnZXBhZ2VkX3NldHRpbmdzICpraHVnZXBhZ2VkID0gXHUwMDI2c2V0dGluZ3MtXHUwMDNla2h1Z2VwYWdlZDtcbkBAIC0xOTgsMTUgJiM0MzsyMDUsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHRcdFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVx1MDAzZXNobWVtX2VuYWJsZWRdKTtcbiBcdHRocF93cml0ZV9udW0oXCYjMzQ7dXNlX3plcm9fcGFnZVwmIzM0Oywgc2V0dGluZ3MtXHUwMDNldXNlX3plcm9fcGFnZSk7XG4gXG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvZGVmcmFnXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0Oyxcbi1cdFx0XHRraHVnZXBhZ2VkLVx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX25vbmUpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvcGFnZXNfdG9fc2NhblwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VwYWdlc190b19zY2FuKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL2RlZnJhZ1wmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VkZWZyYWcpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4gXG4gXHRpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSlcbiBcdFx0d3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLVx1MDAzZXJlYWRfYWhlYWRfa2IpO1xuQEAgLTIzMCw2ICYjNDM7MjM3LDQxIEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0fVxuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogV2FpdCBmb3IgYSBmdWxsIGtodWdlcGFnZWQgc2NhbiBwYXNzIHRoYXQgc3RhcnRlZCBhZnRlciB0aGlzIGNhbGw6IHRoZVxuJiM0MzsgKiBwYXNzIGluIHByb2dyZXNzIG1heSBhbHJlYWR5IGhhdmUgcGFzc2VkIHRoaXMgbW0sIHNvIGZ1bGxfc2NhbnMgaGFzIHRvXG4mIzQzOyAqIGFkdmFuY2UgdHdpY2UuXG4mIzQzOyAqXG4mIzQzOyAqIEEgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYnV0IG9uZSBtYWRlIHdoaWxlIGl0XG4mIzQzOyAqIGlzIHNjYW5uaW5nIHJhdGhlciB0aGFuIHNsZWVwaW5nIGlzIGxvc3QsIHNvIGtlZXAgc3RvcmluZyB1bnRpbCB0aGUgcGFzc1xuJiM0MzsgKiBsYW5kcy5cbiYjNDM7ICpcbiYjNDM7ICogT25lIHdha2UgaXMgb25lIHBhc3Mgb25seSBpZiBwYWdlc190b19zY2FuIGNvdmVycyBldmVyeSBtbSBvbiB0aGUgbGlzdC5cbiYjNDM7ICovXG4mIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbGFwc2VkX21zID0gMCwgcG9sbF9tcyA9IDEwO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgc2xlZXBfbXM7XG4mIzQzO1x0aW50IHBhc3M7XG4mIzQzO1xuJiM0MztcdHNsZWVwX21zID0gdGhwX3JlYWRfbnVtKFwmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcJiMzNDspO1xuJiM0MztcdGZvciAocGFzcyA9IDA7IHBhc3MgXHUwMDNjIDI7IHBhc3MmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHRhcmdldCA9XG4mIzQzO1x0XHRcdHRocF9yZWFkX251bShcJiMzNDtraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcJiMzNDspICYjNDM7IDE7XG4mIzQzO1xuJiM0MztcdFx0d2hpbGUgKHRocF9yZWFkX251bShcJiMzNDtraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcJiMzNDspIFx1MDAzYyB0YXJnZXQpIHtcbiYjNDM7XHRcdFx0aWYgKGVsYXBzZWRfbXMgXHUwMDNlPSBkZWFkbGluZV9tcylcbiYjNDM7XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHRcdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICBzbGVlcF9tcyk7XG4mIzQzO1x0XHRcdHVzbGVlcChwb2xsX21zICogMTAwMCk7XG4mIzQzO1x0XHRcdGVsYXBzZWRfbXMgJiM0Mzs9IHBvbGxfbXM7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpXG4ge1xuIFx0aWYgKCFzZXR0aW5nc19pbmRleCkge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5pbmRleCA3MjZjNzNjNDNjMDViLi4yZWExNjlkMTE3OTYyIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuQEAgLTgzLDEwICYjNDM7ODMsMjEgQEAgc3RhdGljIGlubGluZSB2b2lkIHRocF9zYXZlX3NldHRpbmdzKHZvaWQpXG4gXHRodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7XG4gfVxuIFxuJiM0Mztib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpO1xuJiM0MztcbiB2b2lkIHRocF9zZXRfcmVhZF9haGVhZF9wYXRoKGNoYXIgKnBhdGgpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG4gdW5zaWduZWQgbG9uZyB0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcbiBcbiYjNDM7LypcbiYjNDM7ICogVGhlIHBlci1vcmRlciBzaG1lbV9lbmFibGVkIGF0dHJpYnV0ZSBpcyBjcmVhdGVkIGZvciB0aGUgb3JkZXJzIHRoZSBwYWdlXG4mIzQzOyAqIGNhY2hlIGNhbiBob2xkLCBub3QganVzdCBmb3Igc2htZW0sIHNvIGl0IGFuc3dlcnMgZm9yIHJlZ3VsYXIgZmlsZXMgdG9vLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRocF9maWxlX3N1cHBvcnRlZF9vcmRlcnModm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiB0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycygpO1xuJiM0Mzt9XG4mIzQzO1xuIGJvb2wgdGhwX2F2YWlsYWJsZSh2b2lkKTtcbiBib29sIHRocF9pc19lbmFibGVkKHZvaWQpO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuaW5kZXggZjgyNjczZjVmNmI0Ny4uMzM1Zjk0NmVjYTYxZSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5AQCAtMzEsNiAmIzQzOzMxLDExIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjtcbiBzdGF0aWMgaW50IGFub25fb3JkZXI7XG4gc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcjtcbiYjNDM7c3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfc2V0O1xuJiM0MztzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyc1tOUl9PUkRFUlNdO1xuJiM0MztzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVycztcbiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZCA9IC0xO1xuIFxuICNkZWZpbmUgUElEX1NNQVBTIFwmIzM0Oy9wcm9jL3NlbGYvc21hcHNcJiMzNDtcbiAjZGVmaW5lIFRFU1RfRklMRSBcJiMzNDtjb2xsYXBzZV90ZXN0X2ZpbGVcJiMzNDtcbkBAIC0yMjAsNiAmIzQzOzIyNSwyOSBAQCBzdGF0aWMgYm9vbCBjaGVja19zd2FwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiBcdHJldHVybiBzd2FwO1xuIH1cbiBcbiYjNDM7c3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Lyoga2VlcCBraHVnZXBhZ2VkIGZyb20gY29sbGFwc2luZyB0aGUgcmFuZ2UgYW5kIHN3YXBwaW5nIGl0IGJhY2sgaW4gKi9cbiYjNDM7XHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX05PSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9OT0hVR0VQQUdFKVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogUmV0cnkgc2V2ZXJhbCB0aW1lcyBiZWNhdXNlIE1BRFZfUEFHRU9VVCBpcyBiZXN0IGVmZm9ydC4gIFNsZWVwXG4mIzQzO1x0ICogYmV0d2VlbiB0aGUgcmV0cmllcyB0byBnaXZlIG91dHN0YW5kaW5nIHdyaXRlYmFjayBhIGNoYW5jZSB0b1xuJiM0MztcdCAqIGZpbmlzaC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0MDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVClcJiMzNDspO1xuJiM0MztcdFx0aWYgKGNoZWNrX3N3YXAocCwgc2l6ZSkpXG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdFx0dXNsZWVwKDUwICogMTAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCAqYWxsb2NfbWFwcGluZyhpbnQgbnIpXG4ge1xuIFx0dm9pZCAqcDtcbkBAIC01MTAsOCAmIzQzOzUzOCw4IEBAIHN0YXRpYyBib29sIGlzX2Fub24oc3RydWN0IG1lbV9vcHMgKm9wcylcbiBzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxuIFx0XHRcdCAgICAgICBzdHJ1Y3QgbWVtX29wcyAqb3BzLCBib29sIGV4cGVjdClcbiB7XG4tXHRpbnQgcmV0O1xuIFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdGludCByZXQsIGk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDslcy4uLlwmIzM0OywgbXNnKTtcbiBcbkBAIC01MjQsOSAmIzQzOzU1MiwxNiBAQCBzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxuIFx0LypcbiBcdCAqIFByZXZlbnQga2h1Z2VwYWdlZCBpbnRlcmZlcmVuY2UgYW5kIHRlc3RzIHRoYXQgTUFEVl9DT0xMQVBTRVxuIFx0ICogaWdub3JlcyAvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9lbmFibGVkXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBcJiMzNDtpbmhlcml0XCYjMzQ7IHJhdGhlciB0aGFuIFwmIzM0O25ldmVyXCYjMzQ7IHNvIHRoYXQgTUFEVl9DT0xMQVBTRSBvbiBzaG1lbSBzdGlsbFxuJiM0MztcdCAqIGZpbmRzIGFuIG9yZGVyIHRvIGJ1aWxkLlxuIFx0ICovXG4gXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiBcdHNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuJiM0MztcdFx0c2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUO1xuJiM0MztcdH1cbiBcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiBcbiBcdC8qIENsZWFyIFZNX05PSFVHRVBBR0UgKi9cbkBAIC01NTYsOCAmIzQzOzU5MSwxMSBAQCBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IG5yX2hwYWdlcywgaW50IGNvbGxhcF9vcmRlciwgc3RydWN0IG1lbV9vcHMgKm9wcylcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGhwYWdlX3NpemUgPSBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcF9vcmRlcjtcbi1cdGludCBmdWxsX3NjYW5zO1xuLVx0aW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi9cbiYjNDM7XHR1bnNpZ25lZCBsb25nIGJ5dGVzID0gKHVuc2lnbmVkIGxvbmcpbnJfaHBhZ2VzICogaHBhZ2Vfc2l6ZTtcbiYjNDM7XHRpbnQgdGltZW91dCwgZnVsbF9zY2FucztcbiYjNDM7XG4mIzQzO1x0LyogSGFsZi1zZWNvbmQgdGlja3M6IHRocmVlIHNlY29uZHMgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gKi9cbiYjNDM7XHR0aW1lb3V0ID0gNiAmIzQzOyAyICogKGJ5dGVzIC8gKDEyOFVMIFx1MDAzY1x1MDAzYyAyMCkpO1xuIFxuIFx0LyogU2FuaXR5IGNoZWNrICovXG4gXHRpZiAoIW9wcy1cdTAwM2VjaGVja19odWdlKHAsIGxlbiwgMCwgaHBhZ2Vfc2l6ZSkpXG5AQCAtODIwLDEyICYjNDM7ODU4LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXG4gXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFxuIFx0a3NmdF9wcmludF9tc2coXCYjMzQ7U3dhcG91dCBvbmUgcGFnZS4uLlwmIzM0Oyk7XG4tXHRpZiAobWFkdmlzZShwLCBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVClcJiMzNDspO1xuLVx0aWYgKGNoZWNrX3N3YXAocCwgcGFnZV9zaXplKSkge1xuJiM0MztcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIHBhZ2Vfc2l6ZSkpIHtcbiBcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4gXHR9IGVsc2Uge1xuLVx0XHRmYWlsKFwmIzM0O0ZhaWxcJiMzNDspO1xuJiM0MztcdFx0c2tpcChcJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXRcJiMzNDspO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbkBAIC04NDYsMTIgJiM0Mzs4ODIsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cbiBcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCYjMzQ7LCBtYXhfcHRlc19zd2FwICYjNDM7IDEsIGhwYWdlX3BtZF9ucik7XG4tXHRpZiAobWFkdmlzZShwLCAobWF4X3B0ZXNfc3dhcCAmIzQzOyAxKSAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9QQUdFT1VUKVwmIzM0Oyk7XG4tXHRpZiAoY2hlY2tfc3dhcChwLCAobWF4X3B0ZXNfc3dhcCAmIzQzOyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcbiYjNDM7XHRpZiAoc3dhcG91dF9yYW5nZShwLCAobWF4X3B0ZXNfc3dhcCAmIzQzOyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcbiBcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4gXHR9IGVsc2Uge1xuLVx0XHRmYWlsKFwmIzM0O0ZhaWxcJiMzNDspO1xuJiM0MztcdFx0c2tpcChcJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXRcJiMzNDspO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbkBAIC04NjMsMTIgJiM0Mzs4OTcsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cbiBcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7U3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlwmIzM0OywgbWF4X3B0ZXNfc3dhcCxcbiBcdFx0ICAgICAgIGhwYWdlX3BtZF9ucik7XG4tXHRcdGlmIChtYWR2aXNlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9QQUdFT1VUKVwmIzM0Oyk7XG4tXHRcdGlmIChjaGVja19zd2FwKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUpKSB7XG4mIzQzO1x0XHRpZiAoc3dhcG91dF9yYW5nZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xuIFx0XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1x0XHRcdHNraXAoXCYjMzQ7Q291bGQgbm90IHN3YXAgb3V0XCYjMzQ7KTtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFxuQEAgLTkzNSw2ICYjNDM7OTY3LDE2IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbXBvdW5kX2V4dHJlbWUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHR2b2lkICpwO1xuIFx0aW50IGk7XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGlzIG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMgaW4gYSByb3csIHdoaWNoIHRoZVxuJiM0MztcdCAqIGFsbG9jYXRvciB3aWxsIG5vdCBzdXBwbHkgaWYgdGhlIFBNRCBpcyB2ZXJ5IGxhcmdlLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChocGFnZV9wbWRfc2l6ZSBcdTAwM2UgKDMyVUwgXHUwMDNjXHUwMDNjIDIwKSkge1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwmIzM0OyVzOiBQTUQgdG9vIGxhcmdlIGZvciBmYXVsdC10aW1lIFRIUCBjb25zdHJ1Y3Rpb25cXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgICAgX19mdW5jX18pO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xcblwmIzM0Oyk7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBocGFnZV9wbWRfbnI7IGkmIzQzOyYjNDM7KSB7XG5AQCAtMTEyNSw2ICYjNDM7MTE2NywxMDMgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBUaGUgcGFyZW50IHdyaXRlcyB0byB0aGUgZm9yay1zaGFyZWQgcmFuZ2UgdGhyb3VnaG91dCB0aGUgY2hpbGQmIzM5O3NcbiYjNDM7ICogY29sbGFwc2UuICBDb1cgbXVzdCBrZWVwIHRoZSB0d28gYXBhcnQ6IHRoZSBjaGlsZCBzZWVzIHRoZSBwcmUtZm9ya1xuJiM0MzsgKiBjb250ZW50LCB0aGUgcGFyZW50IG9ubHkgaXRzIG93biB3cml0ZXMuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9mb3JrX2Nvd19yYWNlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xuJiM0MztcdGludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG47XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzaGFyZWQ7XG4mIzQzO1x0dm9sYXRpbGUgaW50ICppcDtcbiYjNDM7XHRwaWRfdCBjaGlsZDtcbiYjNDM7XHRpbnQgc3luY1syXTtcbiYjNDM7XHRjaGFyIGdvID0gMTtcbiYjNDM7XHR2b2lkICpwO1xuJiM0MztcbiYjNDM7XHQvKiBBdCBhIHBhZ2UgcGVyIDEwIG1zLCA2NCBwYWdlcyBzcHJlYWQgdGhlIHdyaXRlcyBhY3Jvc3MgdGhlIGNvbGxhcHNlICovXG4mIzQzO1x0biA9IDY0O1xuJiM0MztcdHNoYXJlZCA9IG4gKiBwYWdlX3NpemU7XG4mIzQzO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHQvKiBTaGFyZWQgcHJlZml4LCB3aXRoIHRoZSBwcmUtZm9yayBwYXR0ZXJuICovXG4mIzQzO1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIHNoYXJlZCk7XG4mIzQzO1x0aWYgKHBpcGUoc3luYykpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7cGlwZSgpXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LyogQSB2b2xhdGlsZSBwb2ludGVyIHNvIHRoZSBzdG9yZXMgYXJlIG5vdCBtZXJnZWQgb3IgZHJvcHBlZCAqL1xuJiM0MztcdGlwID0gcDtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Rm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cJiMzNDspO1xuJiM0MztcdGNoaWxkID0gZm9yaygpO1xuJiM0MztcdGlmICghY2hpbGQpIHtcbiYjNDM7XHRcdGludCBjb2xsYXBzZV9zdGF0dXM7XG4mIzQzO1xuJiM0MztcdFx0Y2xvc2Uoc3luY1swXSk7XG4mIzQzO1x0XHQvKiBQcml2YXRlIHJlbWFpbmRlciAqL1xuJiM0MztcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0LyogU3RhcnQgdGhlIHBhcmVudCB1bnNoYXJpbmcsIGFuZCBnaXZlIGl0IGEgaGVhZCBzdGFydCAqL1xuJiM0MztcdFx0aWYgKHdyaXRlKHN5bmNbMV0sIFx1MDAyNmdvLCAxKSAhPSAxKVxuJiM0MztcdFx0XHRfZXhpdChLU0ZUX0ZBSUwpO1xuJiM0MztcdFx0dXNsZWVwKDUwMDApO1xuJiM0MztcdFx0Yy1cdTAwM2Vjb2xsYXBzZShcJiMzNDtDb2xsYXBzZSBhIHJhbmdlIHRoZSBwYXJlbnQgaXMgd3JpdGluZyB0b1wmIzM0OyxcbiYjNDM7XHRcdFx0ICAgIHAsIDEsIG9wcywgdHJ1ZSk7XG4mIzQzO1x0XHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGRlYWQwMDAwKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0aWYgKGkgPT0gbilcbiYjNDM7XHRcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGZhaWwoXCYjMzQ7RmFpbDogY2hpbGQgY29udGVudFwmIzM0Oyk7XG4mIzQzO1x0XHQvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlICovXG4mIzQzO1x0XHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxuJiM0MztcdFx0XHRleGl0X3N0YXR1cyA9IGNvbGxhcHNlX3N0YXR1cztcbiYjNDM7XHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Y2xvc2Uoc3luY1sxXSk7XG4mIzQzO1x0aWYgKHJlYWQoc3luY1swXSwgXHUwMDI2Z28sIDEpICE9IDEpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7Y2hpbGQgbmV2ZXIgcmVhY2hlZCB0aGUgY29sbGFwc2VcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFVuc2hhcmUgb25lIHBhZ2UgYXQgYSB0aW1lOiBhIGJ1cnN0IHdvdWxkIGJyZWFrIENvVyBvbiB0aGUgd2hvbGVcbiYjNDM7XHQgKiByYW5nZSBiZWZvcmUgdGhlIGNvbGxhcHNlIHN0YXJ0cywgbGVhdmluZyBub3RoaW5nIHNoYXJlZCB0byBjb2xsYXBzZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpID0gMDtcbiYjNDM7XHRmb3IgKDs7KSB7XG4mIzQzO1x0XHRpZiAoaSBcdTAwM2MgbilcbiYjNDM7XHRcdFx0aXBbaSAqIHN0cmlkZV0gPSBpICYjNDM7IDB4YmVlZjAwMDA7XG4mIzQzO1x0XHRpJiM0MzsmIzQzOztcbiYjNDM7XHRcdHVzbGVlcCgxMCAqIDEwMDApO1xuJiM0MztcdFx0aWYgKHdhaXRwaWQoY2hpbGQsIFx1MDAyNndzdGF0dXMsIFdOT0hBTkcpKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEZpbmlzaCB3aGF0ZXZlciB0aGUgcGFjZWQgc3dlZXAgZGlkIG5vdCByZWFjaCAqL1xuJiM0MztcdGZvciAoOyBpIFx1MDAzYyBuOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlwW2kgKiBzdHJpZGVdID0gaSAmIzQzOyAweGJlZWYwMDAwO1xuJiM0MztcdC8qIEEgY2hpbGQgdGhhdCBkaWVkIHJlYWRpbmcgdGhlIHJhY2luZyBwYWdlcyBpcyBhIGZhaWx1cmUsIG5vdCBhIHplcm8gKi9cbiYjNDM7XHRjaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cJiMzNDspO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgJiM0MzsgMHhiZWVmMDAwMClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0aWYgKGkgPT0gbilcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbDogcGFyZW50IGNvbnRlbnRcJiMzNDspO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdC8qIFRoZSBwYXJlbnQmIzM5O3MgY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQmIzM5O3MgdmVyZGljdCAqL1xuJiM0MztcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXG4mIzQzO1x0XHRleGl0X3N0YXR1cyA9IGNoaWxkX3N0YXR1cztcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuQEAgLTExNzAsNiAmIzQzOzEzMDksMjAwIEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKiBTbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIHdpbGwgY29uc2lkZXIgZm9yIG1USFAgY29sbGFwc2UgKi9cbiYjNDM7I2RlZmluZSBNSU5fTVRIUF9PUkRFUiAyXG4mIzQzO1xuJiM0MzsvKiBUaW1lIGJ1ZGdldCBmb3Igb25lIGtodWdlcGFnZWQgcGFzcyBpbiB0aGUgY29sbGFwc2Vfb3JkZXJfKiBjYXNlcyAqL1xuJiM0MzsjZGVmaW5lIE1USFBfUEFTU19USU1FT1VUX1MgMzBcbiYjNDM7XG4mIzQzO3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHBhZ2Vfc2l6ZSBcdTAwM2NcdTAwM2MgY29sbGFwc2Vfb3JkZXI7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIG10aHBfcHVzaF90YXJnZXRfb3JkZXIodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBPbmx5IHRoZSB0YXJnZXQgb3JkZXIsIGFuZCBvbmx5IGZvciBtYWR2aXNlOiB0aGUgY2FzZXMgZmF1bHQgdGhlaXJcbiYjNDM7XHQgKiByZWdpb24gZmlyc3QsIHNvIHRoZSBzb3VyY2VzIHN0YXkgb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCBmb3IuXG4mIzQzO1x0ICovXG4mIzQzO1x0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuJiM0MztcdHNldHRpbmdzLmh1Z2VwYWdlc1tjb2xsYXBzZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgYWxsX3dpbmRvd3NfYXRfb3JkZXIodm9pZCAqcCwgc2l6ZV90IGxlbilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgbGVuLCBjb2xsYXBzZV9vcmRlcixcbiYjNDM7XHRcdFx0XHRcdHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBhbnlfd2luZG93X2F0X29yZGVyKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4mIzQzO3tcbiYjNDM7XHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuJiM0MztcdGNoYXIgKmFkZHIgPSBwO1xuJiM0MztcbiYjNDM7XHRmb3IgKDsgbGVuIFx1MDAzZT0gd2luZG93OyBhZGRyICYjNDM7PSB3aW5kb3csIGxlbiAtPSB3aW5kb3cpIHtcbiYjNDM7XHRcdGlmIChhbGxfd2luZG93c19hdF9vcmRlcihhZGRyLCB3aW5kb3cpKVxuJiM0MztcdFx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuJiM0MztcdGlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIG9uZSBmdWxseSBwb3B1bGF0ZWQgd2luZG93Li4uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKE1USFBfUEFTU19USU1FT1VUX1MpKVxuJiM0MztcdFx0ZmFpbChcJiMzNDtUaW1lb3V0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmIChhbGxfd2luZG93c19hdF9vcmRlcihwICYjNDM7IHdpbmRvdywgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwLCB3aW5kb3cpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICFhbnlfd2luZG93X2F0X29yZGVyKHAgJiM0MzsgMiAqIHdpbmRvdyxcbiYjNDM7XHRcdFx0XHQgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiYjNDM7XHRcdFx0XHRcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xuJiM0MztcdGlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIHdpbmRvdyB3aXRoIHNpbmdsZSBQVEUgZW50cnkgcHJlc2VudC4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgbXRocF93aW5kb3dfc2l6ZSgpKSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBwYWdlX3NpemUpO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiYjNDM7XHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbiYjNDM7XHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IDA7XG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4mIzQzO1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xuJiM0MztcdGlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwICYjNDM7IHdpbmRvdywgd2luZG93KSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgc291cmNlX29yZGVyID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgOiBNSU5fTVRIUF9PUkRFUjtcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdGlmIChzb3VyY2Vfb3JkZXIgXHUwMDNlPSBjb2xsYXBzZV9vcmRlciB8fFxuJiM0MztcdCAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIHNvdXJjZV9vcmRlcikpKSB7XG4mIzQzO1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCYjMzQ7JXM6IG5vIHN1cHBvcnRlZCBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBhbGxvY2F0b3IgY2FuIGZhbGwgYmFjayB0byBzbWFsbGVyIGZvbGlvcyB1bmRlciBmcmFnbWVudGF0aW9uO1xuJiM0MztcdCAqIGhhdmluZyBub3RoaW5nIHRvIGNvbGxhcHNlIGZyb20gaXMgbm90IGEgZmFpbHVyZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxuJiM0MztcdFx0XHRcdCAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtObyBvcmRlci0lZCBzb3VyY2VzIHRvIGNvbGxhcHNlLi4uXCYjMzQ7LCBzb3VyY2Vfb3JkZXIpO1xuJiM0MztcdFx0c2tpcChcJiMzNDtTa2lwXCYjMzQ7KTtcbiYjNDM7XHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX0hVR0VQQUdFKVwmIzM0Oyk7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7XFxuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gXHUwMDNjdGVzdCB0eXBlXHUwMDNlIFtkaXJdXFxuXFxuXCYjMzQ7KTtcbkBAIC0xMTg3LDExICYjNDM7MTUyMCwxNCBAQCBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQtYzogY29sbGFwc2Ugb3JkZXIgZm9yIG1USFAgY29sbGFwc2UsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgRGVmYXVsdHMgdG8gZXZlcnkgc3VwcG9ydGVkIG9yZGVyIGJlbG93IHRoZSBQTUQuXFxuXCYjMzQ7KTtcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcdFwmIzM0O1xcdFxcdCAgICAtcywgaWYgc2V0LCBpcyB0aGUgc291cmNlIG9yZGVyIGZvciB0aGUgbWl4ZWQtc291cmNlIGNhc2UuXFxuXCYjMzQ7KTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuJiM0MztcdGJvb2wgbXRocF9jb250ZXh0X2ltcGxpZWQgPSBmYWxzZTtcbiBcdGludCBvcHQ7XG4gXHRjaGFyICpidWY7XG4gXHRjb25zdCBjaGFyICp0b2tlbjtcbkBAIC0xMjAzLDYgJiM0MzsxNTM5LDcgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAmIzM5O2MmIzM5OzpcbiBcdFx0XHRjb2xsYXBzZV9vcmRlciA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0Y29sbGFwc2Vfb3JkZXJfc2V0ID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAmIzM5O2gmIzM5OzpcbiBcdFx0ZGVmYXVsdDpcbkBAIC0xMjEwLDEyICYjNDM7MTU0NywyNSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyXG4mIzQzO1x0ICogY2FuIGJlIG5lZ2F0aXZlLCBhbmQgYSB6ZXJvIGNvbGxhcHNlIG9yZGVyIGFza3MgZm9yIGJhc2UgcGFnZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGFub25fb3JkZXIgXHUwMDNjIDAgfHwgYW5vbl9vcmRlciBcdTAwM2UgaHBhZ2VfcG1kX29yZGVyKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0Oy1zIHRha2VzIGFuIG9yZGVyIGluIDAuLiVkLCBub3QgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTtcbiYjNDM7XHRpZiAoY29sbGFwc2Vfb3JkZXJfc2V0IFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDstYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgIGhwYWdlX3BtZF9vcmRlciAtIDEsIGNvbGxhcHNlX29yZGVyKTtcbiYjNDM7XG4gXHRhcmd2ICYjNDM7PSBvcHRpbmQ7XG4gXHRhcmdjIC09IG9wdGluZDtcbiBcbiBcdGlmIChhcmdjID09IDApIHtcbi1cdFx0LyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi9cbiYjNDM7XHRcdC8qIE5vIGFyZ3VtZW50czogYW5vbiB1bmRlciBldmVyeSBjb250ZXh0ICovXG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiYjNDM7XHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0XHRyZXR1cm47XG5AQCAtMTIyNiwxMyAmIzQzOzE1NzYsMTQgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcbiBcdGlmICghc3RyY21wKHRva2VuLCBcJiMzNDthbGxcJiMzNDspKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiYjNDM7XHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiYjNDM7XHRcdC8qIFRoZSBtVEhQIGNvbnRleHQgaGFzIG9ubHkgYW5vbiBjYXNlczsgbGV0IG90aGVyIG1lbV90eXBlcyBkcm9wIGl0ICovXG4mIzQzO1x0XHRtdGhwX2NvbnRleHRfaW1wbGllZCA9IHRydWU7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O2todWdlcGFnZWRcJiMzNDspKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCYjMzQ7bXRocF9raHVnZXBhZ2VkXCYjMzQ7KSkge1xuIFx0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuLVx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKVxuLVx0XHRcdHVzYWdlKCk7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O21hZHZpc2VcJiMzNDspKSB7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdH0gZWxzZSB7XG5AQCAtMTI0OCwyMCAmIzQzOzE1OTksMjAgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICBcdTAwMjZfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0c2htZW1fb3BzID0gXHUwMDI2X19zaG1lbV9vcHM7XG4tXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcbi1cdFx0XHR1c2FnZSgpO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7YW5vblwmIzM0OykpIHtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7ZmlsZVwmIzM0OykpIHtcbiBcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gIFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7c2htZW1cJiMzNDspKSB7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIHtcbiBcdFx0dXNhZ2UoKTtcbiBcdH1cbkBAIC0xMjgzLDkgJiM0MzsxNjM0LDEwIEBAIHN0cnVjdCB0ZXN0X2Nhc2Uge1xuIFx0c3RydWN0IG1lbV9vcHMgKm9wcztcbiBcdGNvbnN0IGNoYXIgKmRlc2M7XG4gXHR0ZXN0X2ZuIGZuO1xuJiM0MztcdGludCBvcmRlcjtcdFx0LyogbVRIUCBjb250ZXh0czogdGhlIGNvbGxhcHNlIG9yZGVyICovXG4gfTtcbiBcbi0jZGVmaW5lIE1BWF9URVNUX0NBU0VTIDY0XG4mIzQzOyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2XG4gc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107XG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xuIFxuQEAgLTEyOTgsNiAmIzQzOzE2NTAsNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXHRcdFx0Lm9wc1x0PSBvLFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5kZXNjXHQ9ICN0LFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5mblx0PSB0LFx0XHRcdFx0XHRcXFxuJiM0MztcdFx0XHQub3JkZXJcdD0gY29sbGFwc2Vfb3JkZXIsXHRcdFx0XFxcbiBcdFx0fTtcdFx0XHRcdFx0XHRcdFxcXG4gXHR9XHRcdFx0XHRcdFx0XHRcdFxcXG4gXHR9IHdoaWxlICgwKVxuQEAgLTEzMzgsOCAmIzQzOzE2OTEsNjYgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFxuIFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xuIFxuJiM0MztcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChjb2xsYXBzZV9vcmRlcl9zZXQpIHtcbiYjNDM7XHRcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBjb2xsYXBzZV9vcmRlcik7XG4mIzQzO1x0XHRcdGlmIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IGFub25fb3JkZXIpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7LWMgJWQgbmVlZHMgYSBzb3VyY2Ugb3JkZXIgYmVsb3cgaXQsIC1zIHNheXMgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xuJiM0MztcdFx0XHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzJiM0MzsmIzQzO10gPSBjb2xsYXBzZV9vcmRlcjtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIEV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBhYm92ZSB0aGUgc291cmNlOiAtcyBtYWtlcyB0aGVcbiYjNDM7XHRcdFx0ICogZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlciwgc28gYSB0YXJnZXRcbiYjNDM7XHRcdFx0ICogYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2UuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRpbnQgZmlyc3QgPSBhbm9uX29yZGVyICYjNDM7IDE7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoZmlyc3QgXHUwMDNjIE1JTl9NVEhQX09SREVSKVxuJiM0MztcdFx0XHRcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XG4mIzQzO1x0XHRcdGZvciAoaW50IGkgPSBmaXJzdDsgaSBcdTAwM2MgaHBhZ2VfcG1kX29yZGVyOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRcdGlmIChvcmRlcnMgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuJiM0MztcdFx0XHRcdFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gaTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcbiYjNDM7XHRcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDttVEhQIGNhc2VzIHNraXBwZWQ6IG5vIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2VcXG5cJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XG4mIzQzO1x0XHRwYWdlbWFwX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCYjMzQ7KTtcbiYjNDM7XHRcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9rcGFnZWZsYWdzKVwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiBcdHNldGJ1ZihzdGRvdXQsIE5VTEwpO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogV2l0aG91dCBhIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvIHRoZSBrZXJuZWwgcmVmdXNlcyB0aGVzZVxuJiM0MztcdCAqIGNvbGxhcHNlcywgc28gdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghKHRocF9maWxlX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaHBhZ2VfcG1kX29yZGVyKSkpIHtcbiYjNDM7XHRcdGlmIChzaG1lbV9vcHMpIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7bm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIHNobWVtXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0c2htZW1fb3BzID0gTlVMTDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChyZWFkX29ubHlfZmlsZV9vcHMpIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7bm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xuJiM0MztcdFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSBOVUxMO1xuJiM0MztcdFx0XHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gTlVMTDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmICghYW5vbl9vcHMgXHUwMDI2XHUwMDI2ICFzaG1lbV9vcHMgXHUwMDI2XHUwMDI2ICFyZWFkX29ubHlfZmlsZV9vcHMpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O05vIG1lbV90eXBlIGxlZnQgdG8gcnVuXFxuXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxO1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3N3YXAgPSBocGFnZV9wbWRfbnIgLyA4O1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3NoYXJlZCA9IGhwYWdlX3BtZF9uciAvIDI7XG5AQCAtMTM1Nyw3ICYjNDM7MTc2OCwxNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCBzaG1lbV9vcHMpO1xuLVx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBucl9jb2xsYXBzZV9vcmRlcnM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRjb2xsYXBzZV9vcmRlciA9IGNvbGxhcHNlX29yZGVyc1tpXTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2VfZnVsbCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX3NpbmdsZV9tdGhwLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTM2NSwxMSAmIzQzOzE3ODYsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgc2htZW1fb3BzKTtcbiBcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuLVx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFxuLVx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbi1cbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTE0MjQsNiAmIzQzOzE4NDIsOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXG4mIzQzO1x0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG4gXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTE0MzksNyAmIzQzOzE4NjAsMTUgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIG5yX3Rlc3RfY2FzZXM7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdHN0cnVjdCB0ZXN0X2Nhc2UgKnQgPSBcdTAwMjZ0ZXN0X2Nhc2VzW2ldO1xuIFxuLVx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXFxuXCYjMzQ7LCB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUpO1xuJiM0MztcdFx0aWYgKHQtXHUwMDNlY3R4ID09IFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcbiYjNDM7XHRcdFx0Y29sbGFwc2Vfb3JkZXIgPSB0LVx1MDAzZW9yZGVyO1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMsIG9yZGVyICVkKVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICAgdC1cdTAwM2VkZXNjLCB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lLFxuJiM0MztcdFx0XHRcdCAgICAgICB0LVx1MDAzZW9yZGVyKTtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1xcbiMgUnVuIHRlc3Q6ICVzICglczolcylcXG5cJiMzNDssIHQtXHUwMDNlZGVzYyxcbiYjNDM7XHRcdFx0XHQgICAgICAgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4mIzQzO1x0XHR9XG4gXHRcdHQtXHUwMDNlZm4odC1cdTAwM2VjdHgsIHQtXHUwMDNlb3BzKTtcbiBcdH1cbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYzM0NzhiNTEyM2UyM1xuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbkBAIC0wLDAgJiM0MzsxLDUzMyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBSYWNlIGNvbGxhcHNlIGFnYWluc3QgZmF1bHRzLCBHVVAgcGlucywgZm9yaywgbXJlbWFwIGFuZCBNQURWX0RPTlRORUVEXG4mIzQzOyAqIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLiAgQSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3IgYXNcbiYjNDM7ICogemVybywgbmV2ZXIgYW55dGhpbmcgZWxzZTsgdGhlIGtlcm5lbCYjMzk7cyBvd24gYXNzZXJ0aW9ucyBpbiBkbWVzZyBhcmUgdGhlXG4mIzQzOyAqIG90aGVyIGhhbGYgb2YgdGhlIGNoZWNrLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjcHRocmVhZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvdGltZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzZWxmdGVzdC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtX3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0Oy4uLy4uLy4uLy4uL21tL2d1cF90ZXN0LmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNpZm5kZWYgRk9MTF9XUklURVxuJiM0MzsjZGVmaW5lIEZPTExfV1JJVEUgMHgwMVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQkFTRV9BRERSXHQoKHZvaWQgKikoMVVMIFx1MDAzY1x1MDAzYyAzMCkpXG4mIzQzOyNkZWZpbmUgUEFTU19USU1FT1VUX1NcdDMwXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBQTUQtc2l6ZWQgYXJlYXMgdGhlIHJhY2luZyB0aHJlYWRzIHNoYXJlLCBwbHVzIG9uZSBmb3IgdGhlIG1yZW1hcFxuJiM0MzsgKiB0aHJlYWQuICAtYSBzaHJpbmtzIGl0IHdoZXJlIGEgUE1EIGlzIDUxMk0uXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4mIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzO1xuJiM0MztzdGF0aWMgaW50IG5yX2FyZWFzO1xuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiYjNDM7LyogbnJfYXJlYXMgUE1ELXNpemVkIGFyZWFzOyB0aGUgbGFzdCBvbmUgYmVsb25ncyB0byB0aGUgbXJlbWFwIHRocmVhZCAqL1xuJiM0MztzdGF0aWMgY2hhciAqcmVnaW9uO1xuJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX2FyZWE7XG4mIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcbiYjNDM7c3RhdGljIGNoYXIgKnBhZ2VvdXRfYXJlYTtcbiYjNDM7c3RhdGljIHNpemVfdCBwYWdlb3V0X3NpemU7XG4mIzQzO3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBjb3JydXB0ZWQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4mIzQzO1xuJiM0MztcdHJldHVybiB2YWwgPyB2YWwgOiAxO1x0LyogbmV2ZXIgY29sbGlkZXMgd2l0aCB0aGUgemVyby1maWxsICovXG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFplcm8gbWVhbnMgbmV2ZXIgd3JpdHRlbjsgYW55dGhpbmcgZWxzZSBtdXN0IGJlIHRoaXMgcGFnZSYjMzk7cyBwYXR0ZXJuICovXG4mIzQzO3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbClcbiYjNDM7e1xuJiM0MztcdCp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gKnZhbCBcdTAwMjZcdTAwMjYgKnZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHZhbDtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VfaXNfY29ycnVwdChwYWdlX2lkeCwgXHUwMDI2dmFsKSkge1xuJiM0MztcdFx0Y29ycnVwdGVkID0gMTtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ2xhbXAgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJiMzOTtzIGFyZWEgKi9cbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcm9vbV9mcm9tKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGxvbmcgd2FudClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XG4mIzQzO1xuJiM0MztcdHJldHVybiB3YW50IFx1MDAzYyBsZWZ0ID8gd2FudCA6IGxlZnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHJhbmRfcihcdTAwMjZzZWVkKSBcdTAwMjYgMSlcbiYjNDM7XHRcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKSA9XG4mIzQzO1x0XHRcdFx0cGF0dGVybihwYWdlX2lkeCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGNoZWNrX3BhZ2UocGFnZV9pZHgpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIG5yID0gMVVMIFx1MDAzY1x1MDAzYyAocmFuZF9yKFx1MDAyNnNlZWQpICUgNik7XHQvKiAxLi4zMiBwYWdlcyAqL1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBOb3cgYW5kIHRoZW4gemFwIGEgd2hvbGUgUE1ELWFsaWduZWQgYXJlYTogb25seSBhIHphcCB0aGF0XG4mIzQzO1x0XHQgKiBjb3ZlcnMgdGhlIGZ1bGwgdGFibGUgZnJlZXMgdGhlIHRhYmxlIGl0c2VsZiAoQ09ORklHX1BUX1JFQ0xBSU0pLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIShyYW5kX3IoXHUwMDI2c2VlZCkgJSA2NCkpIHtcbiYjNDM7XHRcdFx0dW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggL1xuJiM0MztcdFx0XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0XHRcdG1hZHZpc2UocmVnaW9uICYjNDM7IGFyZWEgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRtYWR2aXNlKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0XHRyb29tX2Zyb20ocGFnZV9pZHgsIG5yKSAqIHBhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSA1MDApO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKnBpbm5lcl9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpO1xuJiM0MztcbiYjNDM7XHRcdGd1cC5hZGRyID0gKHVuc2lnbmVkIGxvbmcpKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0XHRndXAuc2l6ZSA9IG5yICogcGFnZV9zaXplO1xuJiM0MztcdFx0Z3VwLm5yX3BhZ2VzX3Blcl9jYWxsID0gbnI7XG4mIzQzO1x0XHRndXAuZ3VwX2ZsYWdzID0gRk9MTF9XUklURTtcbiYjNDM7XHRcdC8qIFJhY2luZyBNQURWX0RPTlRORUVEIG1ha2VzIHRyYW5zaWVudCBmYWlsdXJlcyBleHBlY3RlZCAqL1xuJiM0MztcdFx0aW9jdGwoZ3VwX2ZkLCBQSU5fRkFTVF9CRU5DSE1BUkssIFx1MDAyNmd1cCk7XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpmb3JrZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChwaWQgPT0gMCkge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgdmFsO1xuJiM0MztcdFx0XHRpbnQgYmFkID0gMDtcbiYjNDM7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIE5vIHN0ZGlvIGluIHRoZSBjaGlsZDogYSB0aHJlYWQgbWF5IGhvbGQgc3Rkb3V0JiMzOTtzXG4mIzQzO1x0XHRcdCAqIGxvY2sgYWNyb3NzIHRoZSBmb3JrLCBhbmQgcHJpbnRpbmcgdW5kZXIgaXQgaGFuZ3MuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgMTY7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRcdGJhZCB8PSBwYWdlX2lzX2NvcnJ1cHQocmFuZF9wYWdlKFx1MDAyNnNlZWQpLCBcdTAwMjZ2YWwpO1xuJiM0MztcdFx0XHRfZXhpdChiYWQpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHBpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRpbnQgd3N0YXR1cztcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh3YWl0cGlkKHBpZCwgXHUwMDI2d3N0YXR1cywgMCkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O3dhaXRwaWQoKVwmIzM0Oyk7XG4mIzQzO1x0XHRcdC8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28gKi9cbiYjNDM7XHRcdFx0aWYgKCFXSUZFWElURUQod3N0YXR1cykgfHwgV0VYSVRTVEFUVVMod3N0YXR1cykpXG4mIzQzO1x0XHRcdFx0Y29ycnVwdGVkID0gMTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0XHRwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfc2NyYXRjaCk7XG4mIzQzO1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bXJlbWFwKCkgYXdheVwmIzM0Oyk7XG4mIzQzO1x0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgODsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXHUwMDI2c2VlZCkgJVxuJiM0MztcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkpICogcGFnZV9zaXplXSA9IDE7XG4mIzQzO1x0XHRwID0gbXJlbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7XG4mIzQzO1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bXJlbWFwKCkgYmFja1wmIzM0Oyk7XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBTd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBub3RoaW5nIGVsc2Ugd3JpdGVzLCBzbyBhIHBhZ2UmIzM5O3NcbiYjNDM7ICogcGF0dGVybiBtdXN0IHN1cnZpdmUgdGhlIHRyaXAgdGhyb3VnaCBzd2FwIGV4YWN0bHkuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yID0gcGFnZW91dF9zaXplIC8gcGFnZV9zaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0Kih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRtYWR2aXNlKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplLCBNQURWX1BBR0VPVVQpO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7XG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICBpICogcGFnZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh2YWwgIT0gcGF0dGVybihpKSkge1xuJiM0MztcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7UGFnZW91dCBjb3JydXB0aW9uIGF0IHBhZ2UgJWx1OiAlI3ggIT0gJSN4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIENvbXBhY3Rpb24gbWlncmF0ZXMgdGhlIGNvbGxhcHNlIHNvdXJjZXMgd2hpbGUgdGhleSBhcmUgYmVpbmcgZ2F0aGVyZWQgKi9cbiYjNDM7c3RhdGljIHZvaWQgKmNvbXBhY3Rvcl9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XHRpbnQgZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeVwmIzM0OywgT19XUk9OTFkpO1xuJiM0MztcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O05vIGNvbXBhY3RfbWVtb3J5OyBjb21wYWN0b3IgaWRsZVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHR9XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRpZiAod3JpdGUoZmQsIFwmIzM0OzFcJiMzNDssIDEpIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdHVzbGVlcCgxMDAwMCAmIzQzOyByYW5kX3IoXHUwMDI2c2VlZCkgJSAxMDAwMDApO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHN3YXBfYXZhaWxhYmxlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGxpbmVbMjU2XTtcbiYjNDM7XHRpbnQgbGluZXMgPSAwO1xuJiM0MztcdEZJTEUgKmZwID0gZm9wZW4oXCYjMzQ7L3Byb2Mvc3dhcHNcJiMzNDssIFwmIzM0O3JcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRpZiAoIWZwKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSlcbiYjNDM7XHRcdGxpbmVzJiM0MzsmIzQzOztcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztcdHJldHVybiBsaW5lcyBcdTAwM2UgMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgbm93X21zKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGltZXZhbCB0djtcbiYjNDM7XG4mIzQzO1x0Z2V0dGltZW9mZGF5KFx1MDAyNnR2LCBOVUxMKTtcbiYjNDM7XHRyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICYjNDM7IHR2LnR2X3VzZWMgLyAxMDAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXG4mIzQzO1x0XHRcJiMzNDtVc2FnZToga2h1Z2VwYWdlZF9yYWNlIFstZCBzZWNvbmRzXSBbLW0gc3RlcHBlZHxmcmVlfG1hZHZpc2VdIFstYSBhcmVhc10gWy10IG1hc2tdXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHRXaXRob3V0IC1tLCBldmVyeSBtb2RlIHJ1bnMgaW4gdHVybi5cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdC1kOiBzZWNvbmRzIHBlciBtb2RlIChkZWZhdWx0IDUpXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHQtYTogbnVtYmVyIG9mIHNoYXJlZCBQTUQtc2l6ZWQgcGxheWdyb3VuZCBhcmVhcyAoZGVmYXVsdCAzKVxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0LXQ6IGJpdG1hc2sgb2YgcmFjaW5nIHRocmVhZHMgdG8gc3RhcnQsIGZvciBiaXNlY3RpbmcgYSBmYWlsdXJlXFxuXCYjMzQ7KTtcbiYjNDM7XHRleGl0KDEpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4mIzQzO3tcbiYjNDM7XHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRocmVhZF9uYW1lc1tdID0ge1xuJiM0MztcdFx0XCYjMzQ7ZmF1bHRlclwmIzM0OywgXCYjMzQ7ZmF1bHRlcjJcJiMzNDssIFwmIzM0O2RvbnRuZWVkXCYjMzQ7LCBcJiMzNDtwaW5uZXJcJiMzNDssIFwmIzM0O2ZvcmtlclwmIzM0OyxcbiYjNDM7XHRcdFwmIzM0O21yZW1hcHBlclwmIzM0OywgXCYjMzQ7cGFnZW91dFwmIzM0OywgXCYjMzQ7Y29tcGFjdG9yXCYjMzQ7LFxuJiM0MztcdH07XG4mIzQzO1x0dm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7XG4mIzQzO1x0XHRmYXVsdGVyX2ZuLCBmYXVsdGVyX2ZuLCBkb250bmVlZF9mbiwgcGlubmVyX2ZuLCBmb3JrZXJfZm4sXG4mIzQzO1x0XHRtcmVtYXBwZXJfZm4sIHBhZ2VvdXRfZm4sIGNvbXBhY3Rvcl9mbixcbiYjNDM7XHR9O1xuJiM0MztcdGVudW0geyBUX0ZBVUxURVIsIFRfRkFVTFRFUjIsIFRfRE9OVE5FRUQsIFRfUElOTkVSLCBUX0ZPUktFUixcbiYjNDM7XHQgICAgICAgVF9NUkVNQVBQRVIsIFRfUEFHRU9VVCwgVF9DT01QQUNUT1IgfTtcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VvdXRfYml0ID0gMVVMIFx1MDAzY1x1MDAzYyBUX1BBR0VPVVQ7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBjb21wYWN0b3JfYml0ID0gMVVMIFx1MDAzY1x1MDAzYyBUX0NPTVBBQ1RPUjtcbiYjNDM7XHRjb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTtcbiYjNDM7XHRwdGhyZWFkX3QgdGhyZWFkc1tBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyldO1xuJiM0MztcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxsX21vZGVzW10gPSB7IFwmIzM0O3N0ZXBwZWRcJiMzNDssIFwmIzM0O2ZyZWVcJiMzNDssIFwmIzM0O21hZHZpc2VcJiMzNDsgfTtcbiYjNDM7XHRzdGF0aWMgY29uc3QgYm9vbCBvY2N1cGFuY2llc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1x0Lyogc3RyaWN0LCBob2xlcyAqL1xuJiM0MztcdHN0YXRpYyBjb25zdCBib29sIHByZXNzdXJlc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1x0LyogcXVpZXQsIHVuZGVyIHByZXNzdXJlICovXG4mIzQzO1x0Y29uc3QgaW50IG5yX29jY3VwYW5jaWVzID0gQVJSQVlfU0laRShvY2N1cGFuY2llcyk7XG4mIzQzO1x0Y29uc3QgaW50IG5yX3ByZXNzdXJlcyA9IEFSUkFZX1NJWkUocHJlc3N1cmVzKTtcbiYjNDM7XHRjb25zdCBjaGFyICpvbmVfbW9kZVsxXTtcbiYjNDM7XHRjb25zdCBjaGFyICogY29uc3QgKm1vZGVzID0gYWxsX21vZGVzO1xuJiM0MztcdGludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTtcbiYjNDM7XHRjb25zdCBjaGFyICptb2RlX2FyZyA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGVuZF9tcztcbiYjNDM7XHRpbnQgZHVyYXRpb25fcyA9IDU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB0aHJlYWRfbWFzayA9IH4wVUw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBiYXNlX21hc2s7XG4mIzQzO1x0Ym9vbCBoYXZlX3N3YXA7XG4mIzQzO1x0Y2hhciBsYWJlbFs2NF07XG4mIzQzO1x0aW50IG5yX2FyZWFzX2FyZyA9IDA7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcdGludCBzdGVwcyA9IDA7XG4mIzQzO1x0aW50IG9wdDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCYjMzQ7YTpkOm06dDpoXCYjMzQ7KSkgIT0gLTEpIHtcbiYjNDM7XHRcdHN3aXRjaCAob3B0KSB7XG4mIzQzO1x0XHRjYXNlICYjMzk7YSYjMzk7OlxuJiM0MztcdFx0XHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y2FzZSAmIzM5O2QmIzM5OzpcbiYjNDM7XHRcdFx0ZHVyYXRpb25fcyA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7bSYjMzk7OlxuJiM0MztcdFx0XHRtb2RlX2FyZyA9IG9wdGFyZztcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7dCYjMzk7OlxuJiM0MztcdFx0XHR0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRkZWZhdWx0OlxuJiM0MztcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG1vZGVfYXJnKSB7XG4mIzQzO1x0XHRpZiAoc3RyY21wKG1vZGVfYXJnLCBcJiMzNDtzdGVwcGVkXCYjMzQ7KSBcdTAwMjZcdTAwMjYgc3RyY21wKG1vZGVfYXJnLCBcJiMzNDtmcmVlXCYjMzQ7KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBzdHJjbXAobW9kZV9hcmcsIFwmIzM0O21hZHZpc2VcJiMzNDspKVxuJiM0MztcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0b25lX21vZGVbMF0gPSBtb2RlX2FyZztcbiYjNDM7XHRcdG1vZGVzID0gb25lX21vZGU7XG4mIzQzO1x0XHRucl9tb2RlcyA9IDE7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuJiM0MztcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpO1xuJiM0MztcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbiYjNDM7XHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1JlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGd1cF9mZCA9IG9wZW4oXCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcJiMzNDssIE9fUkRXUik7XG4mIzQzO1x0aWYgKGd1cF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0Oy9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IHJlcXVpcmVzIENPTkZJR19HVVBfVEVTVCBhbmQgcm9vdFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG5yX3NoYXJlZF9hcmVhcyA9IG5yX2FyZWFzX2FyZyBcdTAwM2UgMCA/IG5yX2FyZWFzX2FyZyA6IERFRkFVTFRfU0hBUkVEX0FSRUFTO1xuJiM0MztcdG5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICYjNDM7IDE7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogTVJFTUFQX0ZJWEVEIHVubWFwcyB3aGF0ZXZlciBpcyBpbiB0aGUgd2F5IHdpdGhvdXQgc2F5aW5nIHNvLCBzb1xuJiM0MztcdCAqIGNsYWltIHRoZSBtcmVtYXAgdGhyZWFkJiMzOTtzIHNjcmF0Y2ggYWRkcmVzcyB1cCBmcm9udC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRtcmVtYXBfc2NyYXRjaCA9IChjaGFyICopQkFTRV9BRERSICYjNDM7IDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcdGlmIChtbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9OT05FLFxuJiM0MztcdFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsXG4mIzQzO1x0XHQgLTEsIDApICE9ICh2b2lkICopbXJlbWFwX3NjcmF0Y2gpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bW1hcCgpIG1yZW1hcCBzY3JhdGNoXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0YmFzZV9tYXNrID0gdGhyZWFkX21hc2s7XG4mIzQzO1x0aGF2ZV9zd2FwID0gc3dhcF9hdmFpbGFibGUoKTtcbiYjNDM7XHRpZiAoIWhhdmVfc3dhcClcbiYjNDM7XHRcdC8qIE5vIHN3YXAsIG5vIGFub24gcmVjbGFpbTogY29tcGFjdGlvbi1vbmx5IHByZXNzdXJlICovXG4mIzQzO1x0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtubyBzd2FwOiB0aGUgcGFnZW91dCB0aHJlYWQgaXMgbm90IHN0YXJ0ZWRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xuJiM0MztcbiYjNDM7XHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuJiM0MztcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBydW4gPSAwOyBydW4gXHUwMDNjIG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXM7IHJ1biYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGludCByZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xuJiM0MztcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldO1xuJiM0MztcdFx0Ym9vbCBob2xlcyA9IG9jY3VwYW5jaWVzW3JlbSAvIG5yX3ByZXNzdXJlc107XG4mIzQzO1x0XHRib29sIHByZXNzdXJlID0gcHJlc3N1cmVzW3JlbSAlIG5yX3ByZXNzdXJlc107XG4mIzQzO1xuJiM0MztcdFx0c25wcmludGYobGFiZWwsIHNpemVvZihsYWJlbCksIFwmIzM0OyVzLyVzJXNcJiMzNDssIG1vZGUsXG4mIzQzO1x0XHRcdCBob2xlcyA/IFwmIzM0O2hvbGVzXCYjMzQ7IDogXCYjMzQ7c3RyaWN0XCYjMzQ7LCBwcmVzc3VyZSA/IFwmIzM0Oy9wcmVzc3VyZVwmIzM0OyA6IFwmIzM0O1wmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoY29ycnVwdGVkKSB7XG4mIzQzO1x0XHRcdC8qIE1lbW9yeSBpcyBzdXNwZWN0OyB0aGUgcmVzdCB3b3VsZCBwcm92ZSBub3RoaW5nICovXG4mIzQzO1x0XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDslczogc2tpcHBlZCBhZnRlciBjb3JydXB0aW9uXFxuXCYjMzQ7LCBsYWJlbCk7XG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHRocmVhZF9tYXNrID0gYmFzZV9tYXNrO1xuJiM0MztcdFx0aWYgKCFwcmVzc3VyZSlcbiYjNDM7XHRcdFx0dGhyZWFkX21hc2sgXHUwMDI2PSB+KHBhZ2VvdXRfYml0IHwgY29tcGFjdG9yX2JpdCk7XG4mIzQzO1x0XHRlbHNlIGlmICghaGF2ZV9zd2FwKVxuJiM0MztcdFx0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH5wYWdlb3V0X2JpdDtcbiYjNDM7XG4mIzQzO1x0XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0XHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuJiM0MztcdFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuJiM0MztcdFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9XG4mIzQzO1x0XHRcdHN0cmNtcChtb2RlLCBcJiMzNDtmcmVlXCYjMzQ7KSA/IDEwMDAgOiAwO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSAxMDtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogbVRIUCBjb2xsYXBzZSBob25vdXJzIG9ubHkgMCBvciBIUEFHRV9QTURfTlIgLSAxIGhlcmUuICBUaGUgdHdvXG4mIzQzO1x0XHQgKiBlbmRzIHJhY2UgZGlmZmVyZW50IHBhdGhzOiBhIHN0cmljdCB3aW5kb3cgaGFzIGV2ZXJ5IFBURVxuJiM0MztcdFx0ICogcHJlc2VudCwgYSBob2xlLWhlYXZ5IG9uZSBpcyBtb3N0bHkgemVyby1maWxsZWQuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhvbGVzID9cbiYjNDM7XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwO1xuJiM0MztcdFx0LyogT25lIHdha2UsIG9uZSBwYXNzOiB0aGUgcGxheWdyb3VuZCBwbHVzIHRoZSBmb3JrZWQgY2hpbGRyZW4mIzM5O3MgY29waWVzICovXG4mIzQzO1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPVxuJiM0MztcdFx0XHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpXG4mIzQzO1x0XHRcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0XHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8XG4mIzQzO1x0XHRcdCAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xuJiM0MztcdFx0aWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgcGxheWdyb3VuZFwmIzM0Oyk7XG4mIzQzO1x0XHRtcmVtYXBfYXJlYSA9IHJlZ2lvbiAmIzQzOyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAodGhyZWFkX21hc2sgXHUwMDI2IHBhZ2VvdXRfYml0KSB7XG4mIzQzO1x0XHRcdC8qIEVub3VnaCB0byBkcml2ZSByZWFsIHJlY2xhaW0gd2l0aG91dCBzd2FtcGluZyBhIHNtYWxsIGd1ZXN0ICovXG4mIzQzO1x0XHRcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XHRcdFx0aWYgKHBhZ2VvdXRfc2l6ZSBcdTAwM2MgMTZVTCBcdTAwM2NcdTAwM2MgMjApXG4mIzQzO1x0XHRcdFx0cGFnZW91dF9zaXplID0gMTZVTCBcdTAwM2NcdTAwM2MgMjA7XG4mIzQzO1x0XHRcdGlmIChwYWdlb3V0X3NpemUgXHUwMDNlIDY0VUwgXHUwMDNjXHUwMDNjIDIwKVxuJiM0MztcdFx0XHRcdHBhZ2VvdXRfc2l6ZSA9IDY0VUwgXHUwMDNjXHUwMDNjIDIwO1xuJiM0MztcdFx0XHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0XHRcdFx0ICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xuJiM0MztcdFx0XHRpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21tYXAoKSBwYWdlb3V0IGFyZWFcJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIFBvcHVsYXRlIHNvIHRoZSBmaXJzdCBwYXNzIGhhcyBzb21ldGhpbmcgdG8gY29sbGFwc2UgKi9cbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbiYjNDM7XHRcdG1lbXNldChtcmVtYXBfYXJlYSwgMSwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0aWYgKG1hZHZpc2UocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSlcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmICghKHRocmVhZF9tYXNrIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBpKSkpIHtcbiYjNDM7XHRcdFx0XHR0aHJlYWRzW2ldID0gMDtcbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRpZiAocHRocmVhZF9jcmVhdGUoXHUwMDI2dGhyZWFkc1tpXSwgTlVMTCwgdGhyZWFkX2Zuc1tpXSxcbiYjNDM7XHRcdFx0XHRcdCAgICh2b2lkICopKGkgJiM0MzsgMSkpKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcih0aHJlYWRfbmFtZXNbaV0pO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGVuZF9tcyA9IG5vd19tcygpICYjNDM7IGR1cmF0aW9uX3MgKiAxMDAwVUw7XG4mIzQzO1x0XHRpZiAoIXN0cmNtcChtb2RlLCBcJiMzNDtzdGVwcGVkXCYjMzQ7KSkge1xuJiM0MztcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHRcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoUEFTU19USU1FT1VUX1MpKVxuJiM0MztcdFx0XHRcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O2todWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRcdHN0ZXBzJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fSBlbHNlIGlmICghc3RyY21wKG1vZGUsIFwmIzM0O2ZyZWVcJiMzNDspKSB7XG4mIzQzO1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKVxuJiM0MztcdFx0XHRcdHVzbGVlcCgxMDAgKiAxMDAwKTtcbiYjNDM7XHRcdH0gZWxzZSB7XHQvKiBtYWR2aXNlICovXG4mIzQzO1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4mIzQzO1x0XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRcdFx0bWFkdmlzZShyZWdpb24gJiM0MzsgaSAqIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XG4mIzQzO1x0XHRcdFx0fVxuJiM0MztcdFx0XHRcdG1hZHZpc2UocmVnaW9uLCBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRcdE1BRFZfRE9OVE5FRUQpO1xuJiM0MztcdFx0XHRcdHN0ZXBzJiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHN0b3AgPSAxO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKHRocmVhZHNbaV0pXG4mIzQzO1x0XHRcdFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0Y2hlY2tfcGFnZShpKTtcbiYjNDM7XG4mIzQzO1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KCFjb3JydXB0ZWQsIFwmIzM0OyVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCBsYWJlbCwgZHVyYXRpb25fcywgc3RlcHMpO1xuJiM0MztcbiYjNDM7XHRcdC8qIFRoZSBuZXh0IG1vZGUgbWFwcyB0aGUgc2FtZSBmaXhlZCBhZGRyZXNzIHdpdGggaXRzIG93biBzZXR0aW5ncyAqL1xuJiM0MztcdFx0bXVubWFwKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0XHRpZiAocGFnZW91dF9hcmVhKSB7XG4mIzQzO1x0XHRcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XG4mIzQzO1x0XHRcdHBhZ2VvdXRfYXJlYSA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0XHRzdG9wID0gMDtcbiYjNDM7XHRcdHN0ZXBzID0gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfZmluaXNoZWQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xYzFiOTQyYWMzMjU4XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xuQEAgLTAsMCAmIzQzOzEsMTc5IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIENoZWNrIHRoYXQga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkcml2ZXMga2h1Z2VwYWdlZCBpbiBzdGVwOiBvbmUgYmFycmllclxuJiM0MzsgKiBvdmVyIG9uZSBwcmVwYXJlZCB3aW5kb3cgbXVzdCBjb2xsYXBzZSBpdCB3aXRoIGV4YWN0bHkgb25lIGNvbGxhcHNlXG4mIzQzOyAqIGF0dGVtcHQgYXR0cmlidXRlZCB0byBpdHMgc291cmNlIHBhZ2VzLCBzdGVwIGFmdGVyIHN0ZXAuXG4mIzQzOyAqXG4mIzQzOyAqIHNjYW5fc2xlZXBfbWlsbGlzZWNzIGlzIGEgbWludXRlIHNvIHRoYXQgYSBzdGVwIHdoaWNoIHNsZXB0IGluc3RlYWQgb2ZcbiYjNDM7ICogYmVpbmcgd29rZW4gYmxvd3MgdGhlIGJ1ZGdldC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzZWxmdGVzdC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtX3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFx1MDAzY1x1MDAzYyAzMCkpXG4mIzQzOy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXG4mIzQzOyNkZWZpbmUgVEFSR0VUX09SREVSIDJcbiYjNDM7I2RlZmluZSBOUl9JVEVSQVRJT05TIDVcbiYjNDM7I2RlZmluZSBQQVNTX1RJTUVPVVRfUyAzMFxuJiM0MztcbiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4mIzQzO3N0YXRpYyBpbnQgdHJhY2VfZXZlbnRzX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGU6IHN3aXRjaCB0aGVtIG9mZiBob3dldmVyIHRoZSB0ZXN0IGVuZHMsXG4mIzQzOyAqIGluY2x1ZGluZyBmcm9tIGluc2lkZSBhIGhlbHBlciB0aGF0IGdpdmVzIHVwLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgdHJhY2VfZXZlbnRzX29mZih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHRyYWNlX2V2ZW50c19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHR0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIENvdW50IHRoZSBpc29sYXRlIGV2ZW50cyB3aG9zZSBzY2FuX3BmbiBpcyBvbmUgb2YgdGhlIHdpbmRvdyYjMzk7cyBzb3VyY2UgUEZOcyAqL1xuJiM0MztzdGF0aWMgaW50IGNvdW50X2F0dHJpYnV0ZWQodW5zaWduZWQgbG9uZyAqcGZucywgaW50IG5yX3BmbnMsXG4mIzQzO1x0XHRcdCAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGxpbmVbMTAyNF07XG4mIzQzO1x0aW50IGNvdW50ID0gMDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSB0cmFjaW5nX29wZW5fdHJhY2UoKTtcbiYjNDM7XHRpZiAoIWZwKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O0Nhbm5vdCBvcGVuIHRyYWNlIGJ1ZmZlclxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyB2YWw7XG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgb3JkO1xuJiM0MztcdFx0Y2hhciAqcywgKm87XG4mIzQzO1x0XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0XHRzID0gc3Ryc3RyKGxpbmUsIFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIXMpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0aWYgKHNzY2FuZihzLCBcJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHhcJiMzNDssXG4mIzQzO1x0XHRcdCAgIFx1MDAyNnZhbCkgIT0gMSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRvID0gc3Ryc3RyKHMsIFwmIzM0O29yZGVyPVwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIW8gfHwgc3NjYW5mKG8sIFwmIzM0O29yZGVyPSV1XCYjMzQ7LCBcdTAwMjZvcmQpICE9IDEgfHwgb3JkICE9IG9yZGVyKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BmbnM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmICh2YWwgPT0gcGZuc1tpXSkge1xuJiM0MztcdFx0XHRcdGNvdW50JiM0MzsmIzQzOztcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztcdHJldHVybiBjb3VudDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgb25lX3N0ZXAoaW50IGl0ZXJhdGlvbilcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4mIzQzO1x0Y29uc3QgaW50IG5yX3BhZ2VzID0gMSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgcGZuc1sxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVJdO1xuJiM0MztcdGJvb2wgY29sbGFwc2VkLCBwYXNzZWQ7XG4mIzQzO1x0aW50IGF0dHJpYnV0ZWQ7XG4mIzQzO1x0Y2hhciAqcDtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0cCA9IG1tYXAoQkFTRV9BRERSLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XG4mIzQzO1x0aWYgKHAgIT0gQkFTRV9BRERSKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21tYXAoKSB3aW5kb3dcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSAmIzQzOyAxO1xuJiM0MztcdFx0cGZuc1tpXSA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwICYjNDM7IGkgKiBnZXRwYWdlc2l6ZSgpKTtcbiYjNDM7XHRcdGlmIChwZm5zW2ldID09IC0xVUwpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBDbGVhciBiZWZvcmUgZW5hYmxpbmcgc28gdGhlIGJ1ZmZlciBob2xkcyBvbmx5IHRoaXMgc3RlcCYjMzk7cyBldmVudHMgKi9cbiYjNDM7XHRpZiAodHJhY2luZ19jbGVhcl90cmFjZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O0Nhbm5vdCBjbGVhciB0aGUgdHJhY2UgYnVmZmVyXFxuXCYjMzQ7KTtcbiYjNDM7XHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7Q2Fubm90IGVuYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX0hVR0VQQUdFKVwmIzM0Oyk7XG4mIzQzO1x0cGFzc2VkID0ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoUEFTU19USU1FT1VUX1MpO1xuJiM0MztcbiYjNDM7XHQvKiBPZmYgYmVmb3JlIGFueXRoaW5nIHRoYXQgY2FuIGdpdmUgdXA6IHRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlICovXG4mIzQzO1x0aWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtDYW5ub3QgZGlzYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cJiMzNDspO1xuJiM0MztcdGlmICghcGFzc2VkKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O2todWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGNvbGxhcHNlZCA9IGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCB3aW5kb3csIFRBUkdFVF9PUkRFUixcbiYjNDM7XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XG4mIzQzO1x0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsIFRBUkdFVF9PUkRFUik7XG4mIzQzO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHQoY29sbGFwc2VkIFx1MDAyNlx1MDAyNiBhdHRyaWJ1dGVkID09IDEsXG4mIzQzO1x0XHRcdCBcJiMzNDtzdGVwICVkOiB3aW5kb3cgY29sbGFwc2VkLCAlZCBhdHRyaWJ1dGVkIHJlc3VsdChzKVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0IGl0ZXJhdGlvbiwgYXR0cmlidXRlZCk7XG4mIzQzO1xuJiM0MztcdG11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRpZiAoISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVIpKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIFRBUkdFVF9PUkRFUik7XG4mIzQzO1xuJiM0MztcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbiYjNDM7XHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1JlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0cGFnZW1hcF9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCYjMzQ7KTtcbiYjNDM7XHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcdHRyYWNlX2V2ZW50c19mZCA9IHRyYWNpbmdfZXZlbnRzX29wZW4oXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspO1xuJiM0MztcdGlmICh0cmFjZV9ldmVudHNfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XG4mIzQzO1xuJiM0MztcdGtzZnRfc2V0X3BsYW4oTlJfSVRFUkFUSU9OUyk7XG4mIzQzO1xuJiM0MztcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4mIzQzO1x0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAgKiAxMDAwO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAgKiAxMDAwO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTtcbiYjNDM7XHQvKiBPbmUgd2FrZSBtdXN0IGNvbXBsZXRlIG9uZSBmdWxsIHBhc3M7IHNlZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpICovXG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMIFx1MDAzY1x1MDAzYyAyNDtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0c2V0dGluZ3MuaHVnZXBhZ2VzW1RBUkdFVF9PUkRFUl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuJiM0MztcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZCAqL1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfSVRFUkFUSU9OUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRvbmVfc3RlcChpKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuQEAgLTIwLDcgJiM0MzsyMCw2IEBAXG4gXG4gI2RlZmluZSBUV09NRUdcdFx0KDJcdTAwM2NcdTAwM2MyMClcbiAjZGVmaW5lIFJVTlRJTUVcdFx0KDIwKVxuLSNkZWZpbmUgQUxJR04oeCwgYSlcdCgoKHgpICYjNDM7IChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gXG4gSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTQwMiw2ICYjNDM7NDAyLDEyIEBAIENBVEVHT1JZPVwmIzM0O3Bmbm1hcFwmIzM0OyBydW5fdGVzdCAuL3Bmbm1hcFxuICMgQ09XIHRlc3RzXG4gQ0FURUdPUlk9XCYjMzQ7Y293XCYjMzQ7IHJ1bl90ZXN0IC4vY293XG4gXG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrXG4mIzQzO1xuJiM0MztDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZVxuJiM0MztcbiBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXG4gXG4gQ0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyXG5AQCAtNDEwLDggJiM0Mzs0MTYsNiBAQCBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxuIFxuIENBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cbiBcbi1DQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub25cbi1cbiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZFxuIGlmIFsgLXogXCYjMzQ7JHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH1cJiMzNDsgXTsgdGhlblxuICAgICBpZiB0ZXN0X3NlbGVjdGVkIFwmIzM0O3RocFwmIzM0OzsgdGhlblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5pbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuQEAgLTQyLDY4ICYjNDM7NDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7O1xuIGludCBwYWdlbWFwX2ZkO1xuIGludCBrcGFnZWZsYWdzX2ZkO1xuIFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbi1cdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4te1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4tXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4tXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4tXG4tXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4tXHRpZiAocGZuID09IC0xVUwpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbi1cdGlmICghb3JkZXIpIHtcbi1cdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0Lyogbm9uIFRIUCBmb2xpbyAqL1xuLVx0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuLVx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuLVx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbi1cdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbi1cdCAqL1xuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpXG4ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuaW5kZXggNDgyMWEzNTYzMDM2My4uYWY4MzI0ZTFlOGYyYyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5AQCAtNDkwLDYgJiM0Mzs0OTAsMTUzIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuJiM0MztcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbiYjNDM7XHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm47XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcbiYjNDM7XHQvKiBub24gcHJlc2VudCBwYWdlICovXG4mIzQzO1x0aWYgKHBmbiA9PSAtMVVMKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4mIzQzO1x0aWYgKCFvcmRlcikge1xuJiM0MztcdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBub24gVEhQIGZvbGlvICovXG4mIzQzO1x0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4mIzQzO1x0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuJiM0MztcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbiYjNDM7XHRcdFx0Z290byBmYWlsO1xuJiM0MztcdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbiYjNDM7XHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuJiM0MztcdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuJiM0MztmYWlsOlxuJiM0MztcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcigpIC0gY2hlY2sgdGhhdCBhIHJhbmdlIGlzIGJhY2tlZCBieSBAb3JkZXIgZm9saW9zXG4mIzQzOyAqIEBzdGFydDogc3RhcnQgb2YgdGhlIHJhbmdlLCBhIG11bHRpcGxlIG9mIHRoZSBmb2xpbyBzaXplXG4mIzQzOyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgcmFuZ2UgaW4gYnl0ZXMsIGEgbXVsdGlwbGUgb2YgdGhlIGZvbGlvIHNpemVcbiYjNDM7ICogQG9yZGVyOiB0aGUgZm9saW8gb3JkZXIgdG8gY2hlY2sgZm9yXG4mIzQzOyAqIEBwYWdlbWFwX2ZkOiBvcGVuIC9wcm9jL1x1MDAzY3BpZFx1MDAzZS9wYWdlbWFwIG9mIHRoZSByYW5nZSYjMzk7cyBvd25lclxuJiM0MzsgKiBAa3BhZ2VmbGFnc19mZDogb3BlbiAvcHJvYy9rcGFnZWZsYWdzXG4mIzQzOyAqXG4mIzQzOyAqIEV2ZXJ5IGZvbGlvLXNpemVkLCBmb2xpby1hbGlnbmVkIHBhcnQgb2YgdGhlIHJhbmdlIG11c3QgbWFwIG9uZSBmb2xpbyBvZlxuJiM0MzsgKiBAb3JkZXIsIGhlYWQgdG8gdGFpbCwgd2l0aCB0aGUgaGVhZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhcnQuICBBIHBhcnRcbiYjNDM7ICogYmFja2VkIGJ5IHNldmVyYWwgc21hbGxlciBmb2xpb3MgZmFpbHMsIGFuZCBzbyBkb2VzIGEgZm9saW8gbWFwcGVkIG9mZlxuJiM0MzsgKiBpdHMgbmF0dXJhbCBhbGlnbm1lbnQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnM6IHRydWUgaWYgdGhlIHdob2xlIHJhbmdlIGlzIGJhY2tlZCB0aGF0IHdheSwgZmFsc2Ugb3RoZXJ3aXNlLlxuJiM0MzsgKi9cbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcbiYjNDM7XHRcdFx0ICAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0Y29uc3Qgc2l6ZV90IGZvbGlvX3NpemUgPSBucl9wYWdlcyAqIHBzaXplKCk7XG4mIzQzO1x0Y2hhciAqdmFkZHI7XG4mIzQzO1xuJiM0MztcdGlmICgodWludHB0cl90KXN0YXJ0ICUgZm9saW9fc2l6ZSB8fCBsZW4gJSBmb2xpb19zaXplKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRmb3IgKHZhZGRyID0gc3RhcnQ7IHZhZGRyIFx1MDAzYyBzdGFydCAmIzQzOyBsZW47IHZhZGRyICYjNDM7PSBmb2xpb19zaXplKSB7XG4mIzQzO1x0XHRjb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1xuJiM0MztcdFx0LyogTm90IHByZXNlbnQsIG9yIGEgdGFpbCBwYWdlICovXG4mIzQzO1x0XHRpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0Y2hhciAqcGFnZSA9IHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwYWdlKSAhPSBwZm4gJiM0MzsgaSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFpc19iYWNrZWRfYnlfZm9saW8odmFkZHIsIG9yZGVyLCBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNkZWZpbmUgVFJBQ0VGU19ST09UIFwmIzM0Oy9zeXMva2VybmVsL3RyYWNpbmdcJiMzNDtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFJldHVybnMgLTEgd2l0aG91dCB0cmFjZWZzIG9yIHRoZSBzdWJzeXN0ZW0uICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZTpcbiYjNDM7ICogd2hvZXZlciBzd2l0Y2hlcyB0aGVtIG9uIGhhcyB0byBzd2l0Y2ggdGhlbSBvZmYgYWdhaW4sIG9uIGV2ZXJ5IGV4aXQgcGF0aC5cbiYjNDM7ICovXG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFsyNTZdO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCBcJiMzNDsvZXZlbnRzLyVzL2VuYWJsZVwmIzM0OyxcbiYjNDM7XHRcdCBzdWJzeXMpO1xuJiM0MztcdHJldHVybiBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHB3cml0ZShmZCwgZW5hYmxlID8gXCYjMzQ7MVwmIzM0OyA6IFwmIzM0OzBcJiMzNDssIDEsIDApICE9IDEpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhciAqL1xuJiM0MztpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkID0gb3BlbihUUkFDRUZTX1JPT1QgXCYjMzQ7L3RyYWNlXCYjMzQ7LCBPX1dST05MWSB8IE9fVFJVTkMpO1xuJiM0MztcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmb3BlbihUUkFDRUZTX1JPT1QgXCYjMzQ7L3RyYWNlXCYjMzQ7LCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiAvKiBJZiBgaW9jdGxzJiMzOTsgbm9uLU5VTEwsIHRoZSBhbGxvd2VkIGlvY3RscyB3aWxsIGJlIHJldHVybmVkIGludG8gdGhlIHZhciAqL1xuIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdFx0ICAgICAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yLCB1aW50NjRfdCAqaW9jdGxzKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuaW5kZXggOWE0OWFmODg3MDJlNC4uNWE5MWI5Njc2ZWM1ZCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG5AQCAtMTAsNiAmIzQzOzEwLDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4gXG4gI2RlZmluZSBCSVRfVUxMKG5yKSAgICAgICAgICAgICAgICAgICAoMVVMTCBcdTAwM2NcdTAwM2MgKG5yKSlcbiYjNDM7I2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIzQzOyAoYSkgLSAxKSBcdTAwMjYgfigoYSkgLSAxKSlcbiYjNDM7XG4gI2RlZmluZSBQTV9TT0ZUX0RJUlRZICAgICAgICAgICAgICAgICBCSVRfVUxMKDU1KVxuICNkZWZpbmUgUE1fTU1BUF9FWENMVVNJVkUgICAgICAgICAgICAgQklUX1VMTCg1NilcbiAjZGVmaW5lIFBNX1VGRkRfV1AgICAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTcpXG5AQCAtOTcsNiAmIzQzOzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xuIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKTtcbiBpbnQgZ2F0aGVyX2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpO1xuJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpO1xuJiM0Mztib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxuJiM0MztcdFx0XHQgICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpO1xuIFxuIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdCAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTtcbkBAIC0xMTMsNiAmIzQzOzExOSwxMCBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cyk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7XG4mIzQzO2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpO1xuJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XG4gXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxuIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxNToxNTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O0FsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3IgbW9kdWxlIGNvZGUgaXMgYWx0ZXJlZCwgbWFraW5nIHRoZSBjaGFuZ2VzIG5vbi1rZXJuZWwvbm9uLWV4ZWN1dGFibGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Yga2VybmVsIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNjgyNzBhMWFiODJiNjc5NzNkZTY3ZmZiNGQzNTQwNjVhZDVhODY5MQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgU2VwIDggMTU6MTU6MzkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCkBAIC0xMDQsNiAmIzQzOzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBndWFyZC1yZWdpb25zCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbWVyZ2UKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBybWFwCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0CiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX29yZGVyX2NoZWNrCiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGtodWdlcGFnZWRfc3luY19jaGVjawomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3JhY2UKIAogaWZuZXEgKCQoQVJDSCksYXJtNjQpCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gc29mdC1kaXJ0eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uZmE3MzZjOWY3MDFhNAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMKQEAgLTAsMCAmIzQzOzEsMTIyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGhlbHBlcnMsIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZAomIzQzOyAqIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcigpLCB3aGljaCB0aGUga2h1Z2VwYWdlZCBtVEhQIGNhc2VzIHVzZSB0byBkZXRlY3QKJiM0MzsgKiBjb2xsYXBzZSByZXN1bHRzLiAgRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0CiYjNDM7ICogbWVtb3J5IGluIHdpdGggb25seSB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHJlcXVpcmUgdGhlIGhlbHBlcnMgdG8gcmVwb3J0CiYjNDM7ICogZXhhY3RseSB0aGF0IG9yZGVyLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0UKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7a3NlbGZ0ZXN0LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dm1fdXRpbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmgmIzM0OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZDsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7CiYjNDM7CiYjNDM7c3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlzaXplX3QgbGVuID0gc2l6ZSAqIDI7CiYjNDM7CWNoYXIgKnAsICphbGlnbmVkOwomIzQzOwomIzQzOwlwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkmIzM0Oyk7CiYjNDM7CiYjNDM7CWFsaWduZWQgPSAoY2hhciAqKUFMSUdOKCh1aW50cHRyX3QpcCwgc2l6ZSk7CiYjNDM7CWlmIChhbGlnbmVkICE9IHApCiYjNDM7CQltdW5tYXAocCwgYWxpZ25lZCAtIHApOwomIzQzOwlpZiAoYWxpZ25lZCAmIzQzOyBzaXplICE9IHAgJiM0MzsgbGVuKQomIzQzOwkJbXVubWFwKGFsaWduZWQgJiM0Mzsgc2l6ZSwgcCAmIzQzOyBsZW4gLSBhbGlnbmVkIC0gc2l6ZSk7CiYjNDM7CiYjNDM7CXJldHVybiBhbGlnbmVkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CXNpemVfdCBzaXplID0gcHNpemUoKSAmbHQ7Jmx0OyBvcmRlcjsKJiM0MzsJYm9vbCBvayA9IHRydWU7CiYjNDM7CWNoYXIgKnA7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlpZiAob3JkZXIpCiYjNDM7CQlzZXR0aW5ncy5odWdlcGFnZXNbb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTOwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJcCA9IGFsbG9jX2FsaWduZWQoc2l6ZSk7CiYjNDM7CSpwID0gMTsKJiM0MzsKJiM0MzsJaWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgb3JkZXIsIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O29yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxuJiMzNDssIG9yZGVyKTsKJiM0MzsJCW9rID0gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyICovCiYjNDM7CWlmIChvcmRlciAmYW1wOyZhbXA7IGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBzaXplLCBvcmRlciAtIDEsCiYjNDM7CQkJCQkgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXG4mIzM0OywKJiM0MzsJCQkgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7CiYjNDM7CQlvayA9IGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEEgbGFyZ2UgZm9saW8gbXVzdCBub3QgcGFzcyBhcyBvcmRlciAwICovCiYjNDM7CWlmIChvcmRlciAmYW1wOyZhbXA7IGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBzaXplLCAwLAomIzQzOwkJCQkJICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7b3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAwXG4mIzM0Oywgb3JkZXIpOwomIzQzOwkJb2sgPSBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwltdW5tYXAocCwgc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdChvaywgJiMzNDtvcmRlciAlZCBjbGFzc2lmaWVkXG4mIzM0Oywgb3JkZXIpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJdW5zaWduZWQgbG9uZyBvcmRlcnM7CiYjNDM7CWludCBvcmRlcjsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9oZWFkZXIoKTsKJiM0MzsKJiM0MzsJaWYgKCF0aHBfYXZhaWxhYmxlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXBhZ2VtYXBfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKHBhZ2VtYXBfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApJiMzNDspOwomIzQzOwlrcGFnZWZsYWdzX2ZkID0gb3BlbigmIzM0Oy9wcm9jL2twYWdlZmxhZ3MmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAoa3BhZ2VmbGFnc19mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O29wZW4oL3Byb2Mva3BhZ2VmbGFncykgcmVxdWlyZXMgcm9vdFxuJiMzNDspOwomIzQzOwomIzQzOwlvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpOwomIzQzOwlpZiAoIW9yZGVycykKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7Tm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbihfX2J1aWx0aW5fcG9wY291bnRsKG9yZGVycykgJiM0MzsgMSk7CiYjNDM7CiYjNDM7CXRocF9zYXZlX3NldHRpbmdzKCk7CiYjNDM7CXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwkvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQgKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWNoZWNrX29yZGVyKDApOwomIzQzOwlmb3IgKG9yZGVyID0gMTsgb3JkZXIgJmx0OyBOUl9PUkRFUlM7IG9yZGVyJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKCEob3JkZXJzICZhbXA7ICgxVUwgJmx0OyZsdDsgb3JkZXIpKSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWNoZWNrX29yZGVyKG9yZGVyKTsKJiM0MzsJfQomIzQzOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYwppbmRleCBlMjY0MmVjYTBkMDJiLi5kZjQyNmY5MjE4ZTcxIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYwpAQCAtNjUsNyAmIzQzOzY1LDYgQEAgZW51bSB7CiAjZGVmaW5lIEhNTV9QQVRIX01BWCAgICA2NAogI2RlZmluZSBOVElNRVMJCTEwCiAKLSNkZWZpbmUgQUxJR04oeCwgYSkgKCgoeCkgJiM0MzsgKGEgLSAxKSkgJmFtcDsgKH4oKGEpIC0gMSkpKQogLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi8KIAogI2lmbmRlZiBGT0xMX1dSSVRFCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYwppbmRleCBkNzkxN2RjZTNhYmFjLi5jYTczZjlhYzhlOWI2IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMKQEAgLTE4Myw2ICYjNDM7MTgzLDEzIEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpCiAJfQogfQogCiYjNDM7LyogQSBzdG9yZSB0byBlaXRoZXIgc2xlZXAga25vYiB3YWtlcyBraHVnZXBhZ2VkLCBzbyB3cml0ZSBvbmx5IG9uIGNoYW5nZSAqLwomIzQzO3N0YXRpYyB2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKQomIzQzO3sKJiM0MzsJaWYgKHRocF9yZWFkX251bShuYW1lKSAhPSBudW0pCiYjNDM7CQl0aHBfd3JpdGVfbnVtKG5hbWUsIG51bSk7CiYjNDM7fQomIzQzOwogdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpCiB7CiAJc3RydWN0IGtodWdlcGFnZWRfc2V0dGluZ3MgKmtodWdlcGFnZWQgPSAmYW1wO3NldHRpbmdzLSZndDtraHVnZXBhZ2VkOwpAQCAtMTk4LDE1ICYjNDM7MjA1LDE1IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCQkJc2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLSZndDtzaG1lbV9lbmFibGVkXSk7CiAJdGhwX3dyaXRlX251bSgmIzM0O3VzZV96ZXJvX3BhZ2UmIzM0Oywgc2V0dGluZ3MtJmd0O3VzZV96ZXJvX3BhZ2UpOwogCi0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvZGVmcmFnJiMzNDssIGtodWdlcGFnZWQtJmd0O2RlZnJhZyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzJiMzNDssCi0JCQlraHVnZXBhZ2VkLSZndDthbGxvY19zbGVlcF9taWxsaXNlY3MpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDssCi0JCQlraHVnZXBhZ2VkLSZndDtzY2FuX3NsZWVwX21pbGxpc2Vjcyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZSYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19ub25lKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3N3YXApOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZCYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19zaGFyZWQpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW4mIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7cGFnZXNfdG9fc2Nhbik7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWcmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7ZGVmcmFnKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJICAgICAgIGtodWdlcGFnZWQtJmd0O2FsbG9jX3NsZWVwX21pbGxpc2Vjcyk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJICAgICAgIGtodWdlcGFnZWQtJmd0O3NjYW5fc2xlZXBfbWlsbGlzZWNzKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX25vbmUmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfbm9uZSk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3N3YXApOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3NoYXJlZCk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9wYWdlc190b19zY2FuJiMzNDssIGtodWdlcGFnZWQtJmd0O3BhZ2VzX3RvX3NjYW4pOwogCiAJaWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pCiAJCXdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy0mZ3Q7cmVhZF9haGVhZF9rYik7CkBAIC0yMzAsNiAmIzQzOzIzNyw0MSBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncykKIAl9CiB9CiAKJiM0MzsvKgomIzQzOyAqIFdhaXQgZm9yIGEgZnVsbCBraHVnZXBhZ2VkIHNjYW4gcGFzcyB0aGF0IHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsOiB0aGUKJiM0MzsgKiBwYXNzIGluIHByb2dyZXNzIG1heSBhbHJlYWR5IGhhdmUgcGFzc2VkIHRoaXMgbW0sIHNvIGZ1bGxfc2NhbnMgaGFzIHRvCiYjNDM7ICogYWR2YW5jZSB0d2ljZS4KJiM0MzsgKgomIzQzOyAqIEEgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYnV0IG9uZSBtYWRlIHdoaWxlIGl0CiYjNDM7ICogaXMgc2Nhbm5pbmcgcmF0aGVyIHRoYW4gc2xlZXBpbmcgaXMgbG9zdCwgc28ga2VlcCBzdG9yaW5nIHVudGlsIHRoZSBwYXNzCiYjNDM7ICogbGFuZHMuCiYjNDM7ICoKJiM0MzsgKiBPbmUgd2FrZSBpcyBvbmUgcGFzcyBvbmx5IGlmIHBhZ2VzX3RvX3NjYW4gY292ZXJzIGV2ZXJ5IG1tIG9uIHRoZSBsaXN0LgomIzQzOyAqLwomIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZWxhcHNlZF9tcyA9IDAsIHBvbGxfbXMgPSAxMDsKJiM0MzsJdW5zaWduZWQgbG9uZyBzbGVlcF9tczsKJiM0MzsJaW50IHBhc3M7CiYjNDM7CiYjNDM7CXNsZWVwX21zID0gdGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7KTsKJiM0MzsJZm9yIChwYXNzID0gMDsgcGFzcyAmbHQ7IDI7IHBhc3MmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHRhcmdldCA9CiYjNDM7CQkJdGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICYjNDM7IDE7CiYjNDM7CiYjNDM7CQl3aGlsZSAodGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICZsdDsgdGFyZ2V0KSB7CiYjNDM7CQkJaWYgKGVsYXBzZWRfbXMgJmd0Oz0gZGVhZGxpbmVfbXMpCiYjNDM7CQkJCXJldHVybiBmYWxzZTsKJiM0MzsJCQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJCQkgICAgICBzbGVlcF9tcyk7CiYjNDM7CQkJdXNsZWVwKHBvbGxfbXMgKiAxMDAwKTsKJiM0MzsJCQllbGFwc2VkX21zICYjNDM7PSBwb2xsX21zOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpCiB7CiAJaWYgKCFzZXR0aW5nc19pbmRleCkgewpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmgKaW5kZXggNzI2YzczYzQzYzA1Yi4uMmVhMTY5ZDExNzk2MiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oCkBAIC04MywxMCAmIzQzOzgzLDIxIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB0aHBfc2F2ZV9zZXR0aW5ncyh2b2lkKQogCWh1Z2VwYWdlX3NhdmVfc2V0dGluZ3MoLyogdGhwID0gKi8gdHJ1ZSwgLyogaHVnZXRsYiA9ICovIGZhbHNlKTsKIH0KIAomIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcyk7CiYjNDM7CiB2b2lkIHRocF9zZXRfcmVhZF9haGVhZF9wYXRoKGNoYXIgKnBhdGgpOwogdW5zaWduZWQgbG9uZyB0aHBfc3VwcG9ydGVkX29yZGVycyh2b2lkKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7CiAKJiM0MzsvKgomIzQzOyAqIFRoZSBwZXItb3JkZXIgc2htZW1fZW5hYmxlZCBhdHRyaWJ1dGUgaXMgY3JlYXRlZCBmb3IgdGhlIG9yZGVycyB0aGUgcGFnZQomIzQzOyAqIGNhY2hlIGNhbiBob2xkLCBub3QganVzdCBmb3Igc2htZW0sIHNvIGl0IGFuc3dlcnMgZm9yIHJlZ3VsYXIgZmlsZXMgdG9vLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfZmlsZV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnMoKTsKJiM0Mzt9CiYjNDM7CiBib29sIHRocF9hdmFpbGFibGUodm9pZCk7CiBib29sIHRocF9pc19lbmFibGVkKHZvaWQpOwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMKaW5kZXggZjgyNjczZjVmNmI0Ny4uMzM1Zjk0NmVjYTYxZSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYwpAQCAtMzEsNiAmIzQzOzMxLDExIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yOwogc3RhdGljIGludCBhbm9uX29yZGVyOwogc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcjsKJiM0MztzdGF0aWMgYm9vbCBjb2xsYXBzZV9vcmRlcl9zZXQ7CiYjNDM7c3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTsKJiM0MztzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVyczsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTsKIAogI2RlZmluZSBQSURfU01BUFMgJiMzNDsvcHJvYy9zZWxmL3NtYXBzJiMzNDsKICNkZWZpbmUgVEVTVF9GSUxFICYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlJiMzNDsKQEAgLTIyMCw2ICYjNDM7MjI1LDI5IEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogCXJldHVybiBzd2FwOwogfQogCiYjNDM7c3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJLyoga2VlcCBraHVnZXBhZ2VkIGZyb20gY29sbGFwc2luZyB0aGUgcmFuZ2UgYW5kIHN3YXBwaW5nIGl0IGJhY2sgaW4gKi8KJiM0MzsJaWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9OT0hVR0VQQUdFKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21hZHZpc2UoTUFEVl9OT0hVR0VQQUdFKSYjMzQ7KTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogUmV0cnkgc2V2ZXJhbCB0aW1lcyBiZWNhdXNlIE1BRFZfUEFHRU9VVCBpcyBiZXN0IGVmZm9ydC4gIFNsZWVwCiYjNDM7CSAqIGJldHdlZW4gdGhlIHJldHJpZXMgdG8gZ2l2ZSBvdXRzdGFuZGluZyB3cml0ZWJhY2sgYSBjaGFuY2UgdG8KJiM0MzsJICogZmluaXNoLgomIzQzOwkgKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IDQwOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9QQUdFT1VUKSkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7CiYjNDM7CQlpZiAoY2hlY2tfc3dhcChwLCBzaXplKSkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCXVzbGVlcCg1MCAqIDEwMDApOwomIzQzOwl9CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCAqYWxsb2NfbWFwcGluZyhpbnQgbnIpCiB7CiAJdm9pZCAqcDsKQEAgLTUxMCw4ICYjNDM7NTM4LDggQEAgc3RhdGljIGJvb2wgaXNfYW5vbihzdHJ1Y3QgbWVtX29wcyAqb3BzKQogc3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcywKIAkJCSAgICAgICBzdHJ1Y3QgbWVtX29wcyAqb3BzLCBib29sIGV4cGVjdCkKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTsKJiM0MzsJaW50IHJldCwgaTsKIAogCWtzZnRfcHJpbnRfbXNnKCYjMzQ7JXMuLi4mIzM0OywgbXNnKTsKIApAQCAtNTI0LDkgJiM0Mzs1NTIsMTYgQEAgc3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcywKIAkvKgogCSAqIFByZXZlbnQga2h1Z2VwYWdlZCBpbnRlcmZlcmVuY2UgYW5kIHRlc3RzIHRoYXQgTUFEVl9DT0xMQVBTRQogCSAqIGlnbm9yZXMgL3N5cy9rZXJuZWwvbW0vdHJhbnNwYXJlbnRfaHVnZXBhZ2UvZW5hYmxlZAomIzQzOwkgKgomIzQzOwkgKiAmIzM0O2luaGVyaXQmIzM0OyByYXRoZXIgdGhhbiAmIzM0O25ldmVyJiMzNDsgc28gdGhhdCBNQURWX0NPTExBUFNFIG9uIHNobWVtIHN0aWxsCiYjNDM7CSAqIGZpbmRzIGFuIG9yZGVyIHRvIGJ1aWxkLgogCSAqLwogCXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSOwogCXNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5SX09SREVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7CiYjNDM7CQlzZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFNITUVNX0lOSEVSSVQ7CiYjNDM7CX0KIAl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKIAogCS8qIENsZWFyIFZNX05PSFVHRVBBR0UgKi8KQEAgLTU1Niw4ICYjNDM7NTkxLDExIEBAIHN0YXRpYyBib29sIHdhaXRfZm9yX3NjYW4oY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBzaXplX3QgbGVuLAogCQlpbnQgbnJfaHBhZ2VzLCBpbnQgY29sbGFwX29yZGVyLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKQogewogCXVuc2lnbmVkIGxvbmcgaHBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZSAmbHQ7Jmx0OyBjb2xsYXBfb3JkZXI7Ci0JaW50IGZ1bGxfc2NhbnM7Ci0JaW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi8KJiM0MzsJdW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3NpemU7CiYjNDM7CWludCB0aW1lb3V0LCBmdWxsX3NjYW5zOwomIzQzOwomIzQzOwkvKiBIYWxmLXNlY29uZCB0aWNrczogdGhyZWUgc2Vjb25kcyBmbG9vciwgcGx1cyBhIHNlY29uZCBwZXIgMTI4TSAqLwomIzQzOwl0aW1lb3V0ID0gNiAmIzQzOyAyICogKGJ5dGVzIC8gKDEyOFVMICZsdDsmbHQ7IDIwKSk7CiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAoIW9wcy0mZ3Q7Y2hlY2tfaHVnZShwLCBsZW4sIDAsIGhwYWdlX3NpemUpKQpAQCAtODIwLDEyICYjNDM7ODU4LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wCiAJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0O1N3YXBvdXQgb25lIHBhZ2UuLi4mIzM0Oyk7Ci0JaWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgcGFnZV9zaXplKSkgewomIzQzOwlpZiAoc3dhcG91dF9yYW5nZShwLCBwYWdlX3NpemUpKSB7CiAJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAl9IGVsc2UgewotCQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtODQ2LDEyICYjNDM7ODgyLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvCiAJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0O1N3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi4mIzM0OywgbWF4X3B0ZXNfc3dhcCAmIzQzOyAxLCBocGFnZV9wbWRfbnIpOwotCWlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgJiM0MzsgMSkgKiBwYWdlX3NpemUpKSB7CiYjNDM7CWlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkgewogCQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiAJfSBlbHNlIHsKLQkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CQlza2lwKCYjMzQ7Q291bGQgbm90IHN3YXAgb3V0JiMzNDspOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTg2MywxMiAmIzQzOzg5NywxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqbwogCQlvcHMtJmd0O2ZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKIAkJa3NmdF9wcmludF9tc2coJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uJiMzNDssIG1heF9wdGVzX3N3YXAsCiAJCSAgICAgICBocGFnZV9wbWRfbnIpOwotCQlpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpJiMzNDspOwotCQlpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkgewomIzQzOwkJaWYgKHN3YXBvdXRfcmFuZ2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHsKIAkJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAkJfSBlbHNlIHsKLQkJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwkJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC05MzUsNiAmIzQzOzk2NywxNiBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb21wb3VuZF9leHRyZW1lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcwogCXZvaWQgKnA7CiAJaW50IGk7CiAKJiM0MzsJLyoKJiM0MzsJICogVGhpcyBuZWVkcyBocGFnZV9wbWRfbnIgUE1ELW9yZGVyIGFsbG9jYXRpb25zIGluIGEgcm93LCB3aGljaCB0aGUKJiM0MzsJICogYWxsb2NhdG9yIHdpbGwgbm90IHN1cHBseSBpZiB0aGUgUE1EIGlzIHZlcnkgbGFyZ2UuCiYjNDM7CSAqLwomIzQzOwlpZiAoaHBhZ2VfcG1kX3NpemUgJmd0OyAoMzJVTCAmbHQ7Jmx0OyAyMCkpIHsKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHRfc2tpcCgmIzM0OyVzOiBQTUQgdG9vIGxhcmdlIGZvciBmYXVsdC10aW1lIFRIUCBjb25zdHJ1Y3Rpb25cbiYjMzQ7LAomIzQzOwkJCQkgICAgICBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKIAlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwogCWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcbiYjMzQ7KTsKIAlmb3IgKGkgPSAwOyBpICZsdDsgaHBhZ2VfcG1kX25yOyBpJiM0MzsmIzQzOykgewpAQCAtMTEyNSw2ICYjNDM7MTE2NywxMDMgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcwogCWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwogfQogCiYjNDM7LyoKJiM0MzsgKiBUaGUgcGFyZW50IHdyaXRlcyB0byB0aGUgZm9yay1zaGFyZWQgcmFuZ2UgdGhyb3VnaG91dCB0aGUgY2hpbGQmIzM5O3MKJiM0MzsgKiBjb2xsYXBzZS4gIENvVyBtdXN0IGtlZXAgdGhlIHR3byBhcGFydDogdGhlIGNoaWxkIHNlZXMgdGhlIHByZS1mb3JrCiYjNDM7ICogY29udGVudCwgdGhlIHBhcmVudCBvbmx5IGl0cyBvd24gd3JpdGVzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX2ZvcmtfY293X3JhY2Uoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwljb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7CiYjNDM7CWludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG47CiYjNDM7CXVuc2lnbmVkIGxvbmcgc2hhcmVkOwomIzQzOwl2b2xhdGlsZSBpbnQgKmlwOwomIzQzOwlwaWRfdCBjaGlsZDsKJiM0MzsJaW50IHN5bmNbMl07CiYjNDM7CWNoYXIgZ28gPSAxOwomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwkvKiBBdCBhIHBhZ2UgcGVyIDEwIG1zLCA2NCBwYWdlcyBzcHJlYWQgdGhlIHdyaXRlcyBhY3Jvc3MgdGhlIGNvbGxhcHNlICovCiYjNDM7CW4gPSA2NDsKJiM0MzsJc2hhcmVkID0gbiAqIHBhZ2Vfc2l6ZTsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJLyogU2hhcmVkIHByZWZpeCwgd2l0aCB0aGUgcHJlLWZvcmsgcGF0dGVybiAqLwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIDAsIHNoYXJlZCk7CiYjNDM7CWlmIChwaXBlKHN5bmMpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7cGlwZSgpJiMzNDspOwomIzQzOwomIzQzOwkvKiBBIHZvbGF0aWxlIHBvaW50ZXIgc28gdGhlIHN0b3JlcyBhcmUgbm90IG1lcmdlZCBvciBkcm9wcGVkICovCiYjNDM7CWlwID0gcDsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLiYjMzQ7KTsKJiM0MzsJY2hpbGQgPSBmb3JrKCk7CiYjNDM7CWlmICghY2hpbGQpIHsKJiM0MzsJCWludCBjb2xsYXBzZV9zdGF0dXM7CiYjNDM7CiYjNDM7CQljbG9zZShzeW5jWzBdKTsKJiM0MzsJCS8qIFByaXZhdGUgcmVtYWluZGVyICovCiYjNDM7CQlvcHMtJmd0O2ZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJLyogU3RhcnQgdGhlIHBhcmVudCB1bnNoYXJpbmcsIGFuZCBnaXZlIGl0IGEgaGVhZCBzdGFydCAqLwomIzQzOwkJaWYgKHdyaXRlKHN5bmNbMV0sICZhbXA7Z28sIDEpICE9IDEpCiYjNDM7CQkJX2V4aXQoS1NGVF9GQUlMKTsKJiM0MzsJCXVzbGVlcCg1MDAwKTsKJiM0MzsJCWMtJmd0O2NvbGxhcHNlKCYjMzQ7Q29sbGFwc2UgYSByYW5nZSB0aGUgcGFyZW50IGlzIHdyaXRpbmcgdG8mIzM0OywKJiM0MzsJCQkgICAgcCwgMSwgb3BzLCB0cnVlKTsKJiM0MzsJCWNvbGxhcHNlX3N0YXR1cyA9IGV4aXRfc3RhdHVzOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJCWlmIChpcFtpICogc3RyaWRlXSAhPSBpICYjNDM7IDB4ZGVhZDAwMDApCiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJaWYgKGkgPT0gbikKJiM0MzsJCQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJZmFpbCgmIzM0O0ZhaWw6IGNoaWxkIGNvbnRlbnQmIzM0Oyk7CiYjNDM7CQkvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlICovCiYjNDM7CQlpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKQomIzQzOwkJCWV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzOwomIzQzOwkJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJX2V4aXQoZXhpdF9zdGF0dXMpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWNsb3NlKHN5bmNbMV0pOwomIzQzOwlpZiAocmVhZChzeW5jWzBdLCAmYW1wO2dvLCAxKSAhPSAxKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7Y2hpbGQgbmV2ZXIgcmVhY2hlZCB0aGUgY29sbGFwc2VcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVW5zaGFyZSBvbmUgcGFnZSBhdCBhIHRpbWU6IGEgYnVyc3Qgd291bGQgYnJlYWsgQ29XIG9uIHRoZSB3aG9sZQomIzQzOwkgKiByYW5nZSBiZWZvcmUgdGhlIGNvbGxhcHNlIHN0YXJ0cywgbGVhdmluZyBub3RoaW5nIHNoYXJlZCB0byBjb2xsYXBzZS4KJiM0MzsJICovCiYjNDM7CWkgPSAwOwomIzQzOwlmb3IgKDs7KSB7CiYjNDM7CQlpZiAoaSAmbHQ7IG4pCiYjNDM7CQkJaXBbaSAqIHN0cmlkZV0gPSBpICYjNDM7IDB4YmVlZjAwMDA7CiYjNDM7CQlpJiM0MzsmIzQzOzsKJiM0MzsJCXVzbGVlcCgxMCAqIDEwMDApOwomIzQzOwkJaWYgKHdhaXRwaWQoY2hpbGQsICZhbXA7d3N0YXR1cywgV05PSEFORykpCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogRmluaXNoIHdoYXRldmVyIHRoZSBwYWNlZCBzd2VlcCBkaWQgbm90IHJlYWNoICovCiYjNDM7CWZvciAoOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspCiYjNDM7CQlpcFtpICogc3RyaWRlXSA9IGkgJiM0MzsgMHhiZWVmMDAwMDsKJiM0MzsJLyogQSBjaGlsZCB0aGF0IGRpZWQgcmVhZGluZyB0aGUgcmFjaW5nIHBhZ2VzIGlzIGEgZmFpbHVyZSwgbm90IGEgemVybyAqLwomIzQzOwljaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDaGVjayB0aGUgcGFyZW50IHNlZXMgb25seSBpdHMgb3duIHdyaXRlcy4uLiYjMzQ7KTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgJiM0MzsgMHhiZWVmMDAwMCkKJiM0MzsJCQlicmVhazsKJiM0MzsJaWYgKGkgPT0gbikKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWw6IHBhcmVudCBjb250ZW50JiMzNDspOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CS8qIFRoZSBwYXJlbnQmIzM5O3MgY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQmIzM5O3MgdmVyZGljdCAqLwomIzQzOwlpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKQomIzQzOwkJZXhpdF9zdGF0dXMgPSBjaGlsZF9zdGF0dXM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKIAkJCQkJICAgc3RydWN0IG1lbV9vcHMgKm9wcykKIHsKQEAgLTExNzAsNiAmIzQzOzEzMDksMjAwIEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAogCWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwogfQogCiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlICovCiYjNDM7I2RlZmluZSBNSU5fTVRIUF9PUkRFUiAyCiYjNDM7CiYjNDM7LyogVGltZSBidWRnZXQgZm9yIG9uZSBraHVnZXBhZ2VkIHBhc3MgaW4gdGhlIGNvbGxhcHNlX29yZGVyXyogY2FzZXMgKi8KJiM0MzsjZGVmaW5lIE1USFBfUEFTU19USU1FT1VUX1MgMzAKJiM0MzsKJiM0MztzdGF0aWMgc2l6ZV90IG10aHBfd2luZG93X3NpemUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBwYWdlX3NpemUgJmx0OyZsdDsgY29sbGFwc2Vfb3JkZXI7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIG10aHBfcHVzaF90YXJnZXRfb3JkZXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE9ubHkgdGhlIHRhcmdldCBvcmRlciwgYW5kIG9ubHkgZm9yIG1hZHZpc2U6IHRoZSBjYXNlcyBmYXVsdCB0aGVpcgomIzQzOwkgKiByZWdpb24gZmlyc3QsIHNvIHRoZSBzb3VyY2VzIHN0YXkgb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCBmb3IuCiYjNDM7CSAqLwomIzQzOwlzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9ORVZFUjsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5SX09SREVSUzsgaSYjNDM7JiM0MzspCiYjNDM7CQlzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjsKJiM0MzsJc2V0dGluZ3MuaHVnZXBhZ2VzW2NvbGxhcHNlX29yZGVyXS5lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBhbGxfd2luZG93c19hdF9vcmRlcih2b2lkICpwLCBzaXplX3QgbGVuKQomIzQzO3sKJiM0MzsJcmV0dXJuIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBsZW4sIGNvbGxhcHNlX29yZGVyLAomIzQzOwkJCQkJcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIGFueV93aW5kb3dfYXRfb3JkZXIodm9pZCAqcCwgc2l6ZV90IGxlbikKJiM0Mzt7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7CiYjNDM7CWNoYXIgKmFkZHIgPSBwOwomIzQzOwomIzQzOwlmb3IgKDsgbGVuICZndDs9IHdpbmRvdzsgYWRkciAmIzQzOz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7CiYjNDM7CQlpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIoYWRkciwgd2luZG93KSkKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7CiYjNDM7CXZvaWQgKnA7CiYjNDM7CiYjNDM7CW10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpOwomIzQzOwlpZiAoYW55X3dpbmRvd19hdF9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWlmIChtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSkmIzM0Oyk7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi4mIzM0Oyk7CiYjNDM7CWlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCAmIzQzOyB3aW5kb3csIHdpbmRvdykgJmFtcDsmYW1wOwomIzQzOwkJICFhbnlfd2luZG93X2F0X29yZGVyKHAsIHdpbmRvdykgJmFtcDsmYW1wOwomIzQzOwkJICFhbnlfd2luZG93X2F0X29yZGVyKHAgJiM0MzsgMiAqIHdpbmRvdywKJiM0MzsJCQkJICAgICAgaHBhZ2VfcG1kX3NpemUgLSAyICogd2luZG93KSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCB3aW5kb3csIDIgKiB3aW5kb3cpOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAomIzQzOwkJCQkJICBzdHJ1Y3QgbWVtX29wcyAqb3BzKQomIzQzO3sKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIDAsIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJaWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX0hVR0VQQUdFKSYjMzQ7KTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSB3aW5kb3cgd2l0aCBzaW5nbGUgUFRFIGVudHJ5IHByZXNlbnQuLi4mIzM0Oyk7CiYjNDM7CWlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgbXRocF93aW5kb3dfc2l6ZSgpKSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCBwYWdlX3NpemUpOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7CiYjNDM7CXZvaWQgKnA7CiYjNDM7CiYjNDM7CW10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTsKJiM0MzsJc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7CiYjNDM7CWlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJaWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX0hVR0VQQUdFKSYjMzQ7KTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi4mIzM0Oyk7CiYjNDM7CWlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgd2luZG93KSAmYW1wOyZhbXA7CiYjNDM7CQkgIWFueV93aW5kb3dfYXRfb3JkZXIocCAmIzQzOyB3aW5kb3csIHdpbmRvdykpCiYjNDM7CQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwomIzQzOwl2YWxpZGF0ZV9tZW1vcnkocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAomIzQzOwkJCQkJIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwlpbnQgc291cmNlX29yZGVyID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgOiBNSU5fTVRIUF9PUkRFUjsKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJaWYgKHNvdXJjZV9vcmRlciAmZ3Q7PSBjb2xsYXBzZV9vcmRlciB8fAomIzQzOwkgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgc291cmNlX29yZGVyKSkpIHsKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHRfc2tpcCgmIzM0OyVzOiBubyBzdXBwb3J0ZWQgc291cmNlIG9yZGVyIGJlbG93IHRhcmdldFxuJiMzNDssCiYjNDM7CQkJCSAgICAgIF9fZnVuY19fKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwltdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7CiYjNDM7CiYjNDM7CXNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CXNldHRpbmdzLmh1Z2VwYWdlc1tzb3VyY2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTOwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIGFsbG9jYXRvciBjYW4gZmFsbCBiYWNrIHRvIHNtYWxsZXIgZm9saW9zIHVuZGVyIGZyYWdtZW50YXRpb247CiYjNDM7CSAqIGhhdmluZyBub3RoaW5nIHRvIGNvbGxhcHNlIGZyb20gaXMgbm90IGEgZmFpbHVyZS4KJiM0MzsJICovCiYjNDM7CWlmICghaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsCiYjNDM7CQkJCSAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O05vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi4mIzM0Oywgc291cmNlX29yZGVyKTsKJiM0MzsJCXNraXAoJiMzNDtTa2lwJiMzNDspOwomIzQzOwkJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX0hVR0VQQUdFKSYjMzQ7KTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi4mIzM0OywKJiM0MzsJCSAgICAgICBzb3VyY2Vfb3JkZXIpOwomIzQzOwlpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKE1USFBfUEFTU19USU1FT1VUX1MpKQomIzQzOwkJZmFpbCgmIzM0O1RpbWVvdXQmIzM0Oyk7CiYjNDM7CWVsc2UgaWYgKGFsbF93aW5kb3dzX2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQogewogCWZwcmludGYoc3RkZXJyLCAmIzM0O1xuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gJmx0O3Rlc3QgdHlwZSZndDsgW2Rpcl1cblxuJiMzNDspOwpAQCAtMTE4NywxMSAmIzQzOzE1MjAsMTQgQEAgc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKIAlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0LXM6IG1USFAgc2l6ZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXG4mIzM0Oyk7CiAJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBEZWZhdWx0cyB0byAwLiBVc2UgdGhpcyBzaXplIGZvciBhbm9uIG9yIHNobWVtIGFsbG9jYXRpb25zLlxuJiMzNDspOwogCWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQtYzogY29sbGFwc2Ugb3JkZXIgZm9yIG1USFAgY29sbGFwc2UsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxuJiMzNDspOwomIzQzOwlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0ICAgIERlZmF1bHRzIHRvIGV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBiZWxvdyB0aGUgUE1ELlxuJiMzNDspOwomIzQzOwlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0ICAgIC1zLCBpZiBzZXQsIGlzIHRoZSBzb3VyY2Ugb3JkZXIgZm9yIHRoZSBtaXhlZC1zb3VyY2UgY2FzZS5cbiYjMzQ7KTsKIAlleGl0KDEpOwogfQogCiBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewomIzQzOwlib29sIG10aHBfY29udGV4dF9pbXBsaWVkID0gZmFsc2U7CiAJaW50IG9wdDsKIAljaGFyICpidWY7CiAJY29uc3QgY2hhciAqdG9rZW47CkBAIC0xMjAzLDYgJiM0MzsxNTM5LDcgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7YyYjMzk7OgogCQkJY29sbGFwc2Vfb3JkZXIgPSBhdG9pKG9wdGFyZyk7CiYjNDM7CQkJY29sbGFwc2Vfb3JkZXJfc2V0ID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7aCYjMzk7OgogCQlkZWZhdWx0OgpAQCAtMTIxMCwxMiAmIzQzOzE1NDcsMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJfQogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyCiYjNDM7CSAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGFub25fb3JkZXIgJmx0OyAwIHx8IGFub25fb3JkZXIgJmd0OyBocGFnZV9wbWRfb3JkZXIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXG4mIzM0OywKJiM0MzsJCQkJICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTsKJiM0MzsJaWYgKGNvbGxhcHNlX29yZGVyX3NldCAmYW1wOyZhbXA7CiYjNDM7CSAgICAoY29sbGFwc2Vfb3JkZXIgJmx0Oz0gMCB8fCBjb2xsYXBzZV9vcmRlciAmZ3Q7PSBocGFnZV9wbWRfb3JkZXIpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7LWMgdGFrZXMgYW4gb3JkZXIgaW4gMS4uJWQsIG5vdCAlZFxuJiMzNDssCiYjNDM7CQkJCSAgIGhwYWdlX3BtZF9vcmRlciAtIDEsIGNvbGxhcHNlX29yZGVyKTsKJiM0MzsKIAlhcmd2ICYjNDM7PSBvcHRpbmQ7CiAJYXJnYyAtPSBvcHRpbmQ7CiAKIAlpZiAoYXJnYyA9PSAwKSB7Ci0JCS8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiYjNDM7CQkvKiBObyBhcmd1bWVudHM6IGFub24gdW5kZXIgZXZlcnkgY29udGV4dCAqLwogCQlraHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX2todWdlcGFnZWRfY29udGV4dDsKJiM0MzsJCW10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gICZhbXA7X19tdGhwX2todWdlcGFnZWRfY29udGV4dDsKIAkJbWFkdmlzZV9jb250ZXh0ID0gICZhbXA7X19tYWR2aXNlX2NvbnRleHQ7CiAJCWFub25fb3BzID0gJmFtcDtfX2Fub25fb3BzOwogCQlyZXR1cm47CkBAIC0xMjI2LDEzICYjNDM7MTU3NiwxNCBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCiAJaWYgKCFzdHJjbXAodG9rZW4sICYjMzQ7YWxsJiMzNDspKSB7CiAJCWtodWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fa2h1Z2VwYWdlZF9jb250ZXh0OwomIzQzOwkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0OwogCQltYWR2aXNlX2NvbnRleHQgPSAgJmFtcDtfX21hZHZpc2VfY29udGV4dDsKJiM0MzsJCS8qIFRoZSBtVEhQIGNvbnRleHQgaGFzIG9ubHkgYW5vbiBjYXNlczsgbGV0IG90aGVyIG1lbV90eXBlcyBkcm9wIGl0ICovCiYjNDM7CQltdGhwX2NvbnRleHRfaW1wbGllZCA9IHRydWU7CiAJfSBlbHNlIGlmICghc3RyY21wKHRva2VuLCAmIzM0O2todWdlcGFnZWQmIzM0OykpIHsKIAkJa2h1Z2VwYWdlZF9jb250ZXh0ID0gICZhbXA7X19raHVnZXBhZ2VkX2NvbnRleHQ7CiAJfSBlbHNlIGlmICghc3RyY21wKHRva2VuLCAmIzM0O210aHBfa2h1Z2VwYWdlZCYjMzQ7KSkgewogCQltdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7Ci0JCWlmIChjb2xsYXBzZV9vcmRlciAmbHQ7PSAwIHx8IGNvbGxhcHNlX29yZGVyICZndDs9IGhwYWdlX3BtZF9vcmRlcikKLQkJCXVzYWdlKCk7CiAJfSBlbHNlIGlmICghc3RyY21wKHRva2VuLCAmIzM0O21hZHZpc2UmIzM0OykpIHsKIAkJbWFkdmlzZV9jb250ZXh0ID0gICZhbXA7X19tYWR2aXNlX2NvbnRleHQ7CiAJfSBlbHNlIHsKQEAgLTEyNDgsMjAgJiM0MzsxNTk5LDIwIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCXJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgJmFtcDtfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7CiAJCWFub25fb3BzID0gJmFtcDtfX2Fub25fb3BzOwogCQlzaG1lbV9vcHMgPSAmYW1wO19fc2htZW1fb3BzOwotCQlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpCi0JCQl1c2FnZSgpOwogCX0gZWxzZSBpZiAoIXN0cmNtcChidWYsICYjMzQ7YW5vbiYjMzQ7KSkgewogCQlhbm9uX29wcyA9ICZhbXA7X19hbm9uX29wczsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAmIzM0O2ZpbGUmIzM0OykpIHsKIAkJcmVhZF9vbmx5X2ZpbGVfb3BzID0gICZhbXA7X19yZWFkX29ubHlfZmlsZV9vcHM7CiAJCXJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9ICAmYW1wO19fcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzOwogCQlyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gICZhbXA7X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzOwotCQlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpCiYjNDM7CQlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgJmFtcDsmYW1wOyAhbXRocF9jb250ZXh0X2ltcGxpZWQpCiAJCQl1c2FnZSgpOwomIzQzOwkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMOwogCX0gZWxzZSBpZiAoIXN0cmNtcChidWYsICYjMzQ7c2htZW0mIzM0OykpIHsKIAkJc2htZW1fb3BzID0gJmFtcDtfX3NobWVtX29wczsKLQkJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KQomIzQzOwkJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ICZhbXA7JmFtcDsgIW10aHBfY29udGV4dF9pbXBsaWVkKQogCQkJdXNhZ2UoKTsKJiM0MzsJCW10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gTlVMTDsKIAl9IGVsc2UgewogCQl1c2FnZSgpOwogCX0KQEAgLTEyODMsOSAmIzQzOzE2MzQsMTAgQEAgc3RydWN0IHRlc3RfY2FzZSB7CiAJc3RydWN0IG1lbV9vcHMgKm9wczsKIAljb25zdCBjaGFyICpkZXNjOwogCXRlc3RfZm4gZm47CiYjNDM7CWludCBvcmRlcjsJCS8qIG1USFAgY29udGV4dHM6IHRoZSBjb2xsYXBzZSBvcmRlciAqLwogfTsKIAotI2RlZmluZSBNQVhfVEVTVF9DQVNFUyA2NAomIzQzOyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2CiBzdGF0aWMgc3RydWN0IHRlc3RfY2FzZSB0ZXN0X2Nhc2VzW01BWF9URVNUX0NBU0VTXTsKIHN0YXRpYyBpbnQgbnJfdGVzdF9jYXNlczsKIApAQCAtMTI5OCw2ICYjNDM7MTY1MCw3IEBAIHN0YXRpYyBpbnQgbnJfdGVzdF9jYXNlczsKIAkJCS5vcHMJPSBvLAkJCQkJXAogCQkJLmRlc2MJPSAjdCwJCQkJCVwKIAkJCS5mbgk9IHQsCQkJCQlcCiYjNDM7CQkJLm9yZGVyCT0gY29sbGFwc2Vfb3JkZXIsCQkJXAogCQl9OwkJCQkJCQlcCiAJfQkJCQkJCQkJXAogCX0gd2hpbGUgKDApCkBAIC0xMzM4LDggJiM0MzsxNjkxLDY2IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAogCXBhcnNlX3Rlc3RfdHlwZShhcmdjLCBhcmd2KTsKIAomIzQzOwlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgb3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTsKJiM0MzsKJiM0MzsJCWlmIChjb2xsYXBzZV9vcmRlcl9zZXQpIHsKJiM0MzsJCQlpZiAoIShvcmRlcnMgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBjb2xsYXBzZV9vcmRlcikpKQomIzQzOwkJCQlrc2Z0X2V4aXRfc2tpcCgmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxuJiMzNDssCiYjNDM7CQkJCQkgICAgICAgY29sbGFwc2Vfb3JkZXIpOwomIzQzOwkJCWlmIChjb2xsYXBzZV9vcmRlciAmbHQ7PSBhbm9uX29yZGVyKQomIzQzOwkJCQlrc2Z0X2V4aXRfc2tpcCgmIzM0Oy1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXG4mIzM0OywKJiM0MzsJCQkJCSAgICAgICBjb2xsYXBzZV9vcmRlciwgYW5vbl9vcmRlcik7CiYjNDM7CQkJY29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gY29sbGFwc2Vfb3JkZXI7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCS8qCiYjNDM7CQkJICogRXZlcnkgc3VwcG9ydGVkIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2U6IC1zIG1ha2VzIHRoZQomIzQzOwkJCSAqIGZhdWx0IHBhdGggaGFuZCBvdXQgZm9saW9zIG9mIHRoYXQgb3JkZXIsIHNvIGEgdGFyZ2V0CiYjNDM7CQkJICogYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2UuCiYjNDM7CQkJICovCiYjNDM7CQkJaW50IGZpcnN0ID0gYW5vbl9vcmRlciAmIzQzOyAxOwomIzQzOwomIzQzOwkJCWlmIChmaXJzdCAmbHQ7IE1JTl9NVEhQX09SREVSKQomIzQzOwkJCQlmaXJzdCA9IE1JTl9NVEhQX09SREVSOwomIzQzOwkJCWZvciAoaW50IGkgPSBmaXJzdDsgaSAmbHQ7IGhwYWdlX3BtZF9vcmRlcjsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQkJaWYgKG9yZGVycyAmYW1wOyAoMVVMICZsdDsmbHQ7IGkpKQomIzQzOwkJCQkJY29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gaTsKJiM0MzsJCQl9CiYjNDM7CQkJaWYgKCFucl9jb2xsYXBzZV9vcmRlcnMpCiYjNDM7CQkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7bVRIUCBjYXNlcyBza2lwcGVkOiBubyBvcmRlciBhYm92ZSB0aGUgc291cmNlXG4mIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7CiYjNDM7CQlwYWdlbWFwX2ZkID0gb3BlbigmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CQlpZiAocGFnZW1hcF9mZCAmbHQ7IDApCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApJiMzNDspOwomIzQzOwkJa3BhZ2VmbGFnc19mZCA9IG9wZW4oJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJCWlmIChrcGFnZWZsYWdzX2ZkICZsdDsgMCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDtvcGVuKC9wcm9jL2twYWdlZmxhZ3MpJiMzNDspOwomIzQzOwl9CiYjNDM7CiAJc2V0YnVmKHN0ZG91dCwgTlVMTCk7CiAKJiM0MzsJLyoKJiM0MzsJICogV2l0aG91dCBhIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvIHRoZSBrZXJuZWwgcmVmdXNlcyB0aGVzZQomIzQzOwkgKiBjb2xsYXBzZXMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gdGVzdC4KJiM0MzsJICovCiYjNDM7CWlmICghKHRocF9maWxlX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IGhwYWdlX3BtZF9vcmRlcikpKSB7CiYjNDM7CQlpZiAoc2htZW1fb3BzKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cbiYjMzQ7KTsKJiM0MzsJCQlzaG1lbV9vcHMgPSBOVUxMOwomIzQzOwkJfQomIzQzOwkJaWYgKHJlYWRfb25seV9maWxlX29wcykgewomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7bm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcbiYjMzQ7KTsKJiM0MzsJCQlyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMOwomIzQzOwkJCXJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7CiYjNDM7CQkJcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQlpZiAoIWFub25fb3BzICZhbXA7JmFtcDsgIXNobWVtX29wcyAmYW1wOyZhbXA7ICFyZWFkX29ubHlfZmlsZV9vcHMpCiYjNDM7CQkJa3NmdF9leGl0X3NraXAoJiMzNDtObyBtZW1fdHlwZSBsZWZ0IHRvIHJ1blxuJiMzNDspOwomIzQzOwl9CiYjNDM7CiAJZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxOwogCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODsKIAlkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjsKQEAgLTEzNTcsNyAmIzQzOzE3NjgsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgbnJfY29sbGFwc2Vfb3JkZXJzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07CiYjNDM7CQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwomIzQzOwkJVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CX0KJiM0MzsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTM2NSwxMSAmIzQzOzE3ODYsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJVEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7CiAKIAlURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCi0JVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKLQogCVRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7CiAJVEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7CkBAIC0xNDI0LDYgJiM0MzsxODQyLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKIAlURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTQzOSw3ICYjNDM7MTg2MCwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBucl90ZXN0X2Nhc2VzOyBpJiM0MzsmIzQzOykgewogCQlzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gJmFtcDt0ZXN0X2Nhc2VzW2ldOwogCi0JCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXG4mIzM0OywgdC0mZ3Q7ZGVzYywgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJaWYgKHQtJmd0O2N0eCA9PSAmYW1wO19fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHsKJiM0MzsJCQljb2xsYXBzZV9vcmRlciA9IHQtJmd0O29yZGVyOwomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMsIG9yZGVyICVkKVxuJiMzNDssCiYjNDM7CQkJCSAgICAgICB0LSZndDtkZXNjLCB0LSZndDtjdHgtJmd0O25hbWUsIHQtJmd0O29wcy0mZ3Q7bmFtZSwKJiM0MzsJCQkJICAgICAgIHQtJmd0O29yZGVyKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtcbiMgUnVuIHRlc3Q6ICVzICglczolcylcbiYjMzQ7LCB0LSZndDtkZXNjLAomIzQzOwkJCQkgICAgICAgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJfQogCQl0LSZndDtmbih0LSZndDtjdHgsIHQtJmd0O29wcyk7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmMzNDc4YjUxMjNlMjMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYwpAQCAtMCwwICYjNDM7MSw1MzMgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogUmFjZSBjb2xsYXBzZSBhZ2FpbnN0IGZhdWx0cywgR1VQIHBpbnMsIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRAomIzQzOyAqIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLiAgQSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3IgYXMKJiM0MzsgKiB6ZXJvLCBuZXZlciBhbnl0aGluZyBlbHNlOyB0aGUga2VybmVsJiMzOTtzIG93biBhc3NlcnRpb25zIGluIGRtZXNnIGFyZSB0aGUKJiM0MzsgKiBvdGhlciBoYWxmIG9mIHRoZSBjaGVjay4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3B0aHJlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc2VsZnRlc3QuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDsuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oJiMzNDsKJiM0MzsKJiM0MzsjaWZuZGVmIEZPTExfV1JJVEUKJiM0MzsjZGVmaW5lIEZPTExfV1JJVEUgMHgwMQomIzQzOyNlbmRpZgomIzQzOwomIzQzOyNkZWZpbmUgQkFTRV9BRERSCSgodm9pZCAqKSgxVUwgJmx0OyZsdDsgMzApKQomIzQzOyNkZWZpbmUgUEFTU19USU1FT1VUX1MJMzAKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFBNRC1zaXplZCBhcmVhcyB0aGUgcmFjaW5nIHRocmVhZHMgc2hhcmUsIHBsdXMgb25lIGZvciB0aGUgbXJlbWFwCiYjNDM7ICogdGhyZWFkLiAgLWEgc2hyaW5rcyBpdCB3aGVyZSBhIFBNRCBpcyA1MTJNLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgREVGQVVMVF9TSEFSRURfQVJFQVMJMwomIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzOwomIzQzO3N0YXRpYyBpbnQgbnJfYXJlYXM7CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplOwomIzQzOy8qIG5yX2FyZWFzIFBNRC1zaXplZCBhcmVhczsgdGhlIGxhc3Qgb25lIGJlbG9uZ3MgdG8gdGhlIG1yZW1hcCB0aHJlYWQgKi8KJiM0MztzdGF0aWMgY2hhciAqcmVnaW9uOwomIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTsKJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX3NjcmF0Y2g7CiYjNDM7c3RhdGljIGNoYXIgKnBhZ2VvdXRfYXJlYTsKJiM0MztzdGF0aWMgc2l6ZV90IHBhZ2VvdXRfc2l6ZTsKJiM0MztzdGF0aWMgaW50IGd1cF9mZCA9IC0xOwomIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDsKJiM0MztzdGF0aWMgdm9sYXRpbGUgaW50IGNvcnJ1cHRlZDsKJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7CiYjNDM7CiYjNDM7CXJldHVybiB2YWwgPyB2YWwgOiAxOwkvKiBuZXZlciBjb2xsaWRlcyB3aXRoIHRoZSB6ZXJvLWZpbGwgKi8KJiM0Mzt9CiYjNDM7CiYjNDM7LyogWmVybyBtZWFucyBuZXZlciB3cml0dGVuOyBhbnl0aGluZyBlbHNlIG11c3QgYmUgdGhpcyBwYWdlJiMzOTtzIHBhdHRlcm4gKi8KJiM0MztzdGF0aWMgYm9vbCBwYWdlX2lzX2NvcnJ1cHQodW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgaW50ICp2YWwpCiYjNDM7ewomIzQzOwkqdmFsID0gKih1bnNpZ25lZCBpbnQgKikocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJcmV0dXJuICp2YWwgJmFtcDsmYW1wOyAqdmFsICE9IHBhdHRlcm4ocGFnZV9pZHgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjaGVja19wYWdlKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgdmFsOwomIzQzOwomIzQzOwlpZiAocGFnZV9pc19jb3JydXB0KHBhZ2VfaWR4LCAmYW1wO3ZhbCkpIHsKJiM0MzsJCWNvcnJ1cHRlZCA9IDE7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O0NvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgc2hhcmVkX3BhZ2VzKHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRfcGFnZSh1bnNpZ25lZCBpbnQgKnNlZWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcmFuZF9yKHNlZWQpICUgc2hhcmVkX3BhZ2VzKCk7CiYjNDM7fQomIzQzOwomIzQzOy8qIENsYW1wIHNvIGEgcmFuZ2UgbmV2ZXIgcmVhY2hlcyB0aGUgbXJlbWFwIHRocmVhZCYjMzk7cyBhcmVhICovCiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcm9vbV9mcm9tKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGxvbmcgd2FudCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7CiYjNDM7CiYjNDM7CXJldHVybiB3YW50ICZsdDsgbGVmdCA/IHdhbnQgOiBsZWZ0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCAqZmF1bHRlcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKCZhbXA7c2VlZCk7CiYjNDM7CiYjNDM7CQlpZiAocmFuZF9yKCZhbXA7c2VlZCkgJmFtcDsgMSkKJiM0MzsJCQkqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpID0KJiM0MzsJCQkJcGF0dGVybihwYWdlX2lkeCk7CiYjNDM7CQllbHNlCiYjNDM7CQkJY2hlY2tfcGFnZShwYWdlX2lkeCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpkb250bmVlZF9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKCZhbXA7c2VlZCk7CiYjNDM7CQl1bnNpZ25lZCBsb25nIG5yID0gMVVMICZsdDsmbHQ7IChyYW5kX3IoJmFtcDtzZWVkKSAlIDYpOwkvKiAxLi4zMiBwYWdlcyAqLwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIE5vdyBhbmQgdGhlbiB6YXAgYSB3aG9sZSBQTUQtYWxpZ25lZCBhcmVhOiBvbmx5IGEgemFwIHRoYXQKJiM0MzsJCSAqIGNvdmVycyB0aGUgZnVsbCB0YWJsZSBmcmVlcyB0aGUgdGFibGUgaXRzZWxmIChDT05GSUdfUFRfUkVDTEFJTSkuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghKHJhbmRfcigmYW1wO3NlZWQpICUgNjQpKSB7CiYjNDM7CQkJdW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggLwomIzQzOwkJCQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJCQltYWR2aXNlKHJlZ2lvbiAmIzQzOyBhcmVhICogaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJbWFkdmlzZShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUsCiYjNDM7CQkJCXJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLAomIzQzOwkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0KJiM0MzsJCXVzbGVlcChyYW5kX3IoJmFtcDtzZWVkKSAlIDUwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJc3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9OwomIzQzOwkJdW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZSgmYW1wO3NlZWQpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpOwomIzQzOwomIzQzOwkJZ3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTsKJiM0MzsJCWd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7CiYjNDM7CQlndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjsKJiM0MzsJCWd1cC5ndXBfZmxhZ3MgPSBGT0xMX1dSSVRFOwomIzQzOwkJLyogUmFjaW5nIE1BRFZfRE9OVE5FRUQgbWFrZXMgdHJhbnNpZW50IGZhaWx1cmVzIGV4cGVjdGVkICovCiYjNDM7CQlpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgJmFtcDtndXApOwomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQlwaWRfdCBwaWQgPSBmb3JrKCk7CiYjNDM7CiYjNDM7CQlpZiAocGlkID09IDApIHsKJiM0MzsJCQl1bnNpZ25lZCBpbnQgdmFsOwomIzQzOwkJCWludCBiYWQgPSAwOwomIzQzOwomIzQzOwkJCS8qCiYjNDM7CQkJICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaG9sZCBzdGRvdXQmIzM5O3MKJiM0MzsJCQkgKiBsb2NrIGFjcm9zcyB0aGUgZm9yaywgYW5kIHByaW50aW5nIHVuZGVyIGl0IGhhbmdzLgomIzQzOwkJCSAqLwomIzQzOwkJCWZvciAoaW50IGkgPSAwOyBpICZsdDsgMTY7IGkmIzQzOyYjNDM7KQomIzQzOwkJCQliYWQgfD0gcGFnZV9pc19jb3JydXB0KHJhbmRfcGFnZSgmYW1wO3NlZWQpLCAmYW1wO3ZhbCk7CiYjNDM7CQkJX2V4aXQoYmFkKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChwaWQgJmd0OyAwKSB7CiYjNDM7CQkJaW50IHdzdGF0dXM7CiYjNDM7CiYjNDM7CQkJaWYgKHdhaXRwaWQocGlkLCAmYW1wO3dzdGF0dXMsIDApICZsdDsgMCkKJiM0MzsJCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7d2FpdHBpZCgpJiMzNDspOwomIzQzOwkJCS8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28gKi8KJiM0MzsJCQlpZiAoIVdJRkVYSVRFRCh3c3RhdHVzKSB8fCBXRVhJVFNUQVRVUyh3c3RhdHVzKSkKJiM0MzsJCQkJY29ycnVwdGVkID0gMTsKJiM0MzsJCX0KJiM0MzsJCXVzbGVlcChyYW5kX3IoJmFtcDtzZWVkKSAlIDIwMDApOwomIzQzOwl9CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXZvaWQgKnA7CiYjNDM7CiYjNDM7CQlwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9zY3JhdGNoKTsKJiM0MzsJCWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bXJlbWFwKCkgYXdheSYjMzQ7KTsKJiM0MzsJCWZvciAoaW50IGkgPSAwOyBpICZsdDsgODsgaSYjNDM7JiM0MzspCiYjNDM7CQkJbXJlbWFwX3NjcmF0Y2hbKHJhbmRfcigmYW1wO3NlZWQpICUKJiM0MzsJCQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSkgKiBwYWdlX3NpemVdID0gMTsKJiM0MzsJCXAgPSBtcmVtYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpOwomIzQzOwkJaWYgKHAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttcmVtYXAoKSBiYWNrJiMzNDspOwomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogU3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm4gb24gYSByZWdpb24gbm90aGluZyBlbHNlIHdyaXRlcywgc28gYSBwYWdlJiMzOTtzCiYjNDM7ICogcGF0dGVybiBtdXN0IHN1cnZpdmUgdGhlIHRyaXAgdGhyb3VnaCBzd2FwIGV4YWN0bHkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgKnBhZ2VvdXRfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCSoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzOyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJbWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBuciAmYW1wOyZhbXA7ICFzdG9wOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCXVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgJiM0MzsKJiM0MzsJCQkJCQkJICAgICBpICogcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJCQlpZiAodmFsICE9IHBhdHRlcm4oaSkpIHsKJiM0MzsJCQkJY29ycnVwdGVkID0gMTsKJiM0MzsJCQkJa3NmdF9wcmludF9tc2coJiMzNDtQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcbiYjMzQ7LAomIzQzOwkJCQkJICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qIENvbXBhY3Rpb24gbWlncmF0ZXMgdGhlIGNvbGxhcHNlIHNvdXJjZXMgd2hpbGUgdGhleSBhcmUgYmVpbmcgZ2F0aGVyZWQgKi8KJiM0MztzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwlpbnQgZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5JiMzNDssIE9fV1JPTkxZKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtObyBjb21wYWN0X21lbW9yeTsgY29tcGFjdG9yIGlkbGVcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwl9CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJaWYgKHdyaXRlKGZkLCAmIzM0OzEmIzM0OywgMSkgJmx0OyAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKDEwMDAwICYjNDM7IHJhbmRfcigmYW1wO3NlZWQpICUgMTAwMDAwKTsKJiM0MzsJfQomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBzd2FwX2F2YWlsYWJsZSh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciBsaW5lWzI1Nl07CiYjNDM7CWludCBsaW5lcyA9IDA7CiYjNDM7CUZJTEUgKmZwID0gZm9wZW4oJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkKJiM0MzsJCWxpbmVzJiM0MzsmIzQzOzsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIGxpbmVzICZndDsgMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgbm93X21zKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXZhbCB0djsKJiM0MzsKJiM0MzsJZ2V0dGltZW9mZGF5KCZhbXA7dHYsIE5VTEwpOwomIzQzOwlyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICYjNDM7IHR2LnR2X3VzZWMgLyAxMDAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQomIzQzO3sKJiM0MzsJZnByaW50ZihzdGRlcnIsCiYjNDM7CQkmIzM0O1VzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy1hIGFyZWFzXSBbLXQgbWFza11cbiYjMzQ7CiYjNDM7CQkmIzM0O1x0V2l0aG91dCAtbSwgZXZlcnkgbW9kZSBydW5zIGluIHR1cm4uXG4mIzM0OwomIzQzOwkJJiMzNDtcdC1kOiBzZWNvbmRzIHBlciBtb2RlIChkZWZhdWx0IDUpXG4mIzM0OwomIzQzOwkJJiMzNDtcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXG4mIzM0OwomIzQzOwkJJiMzNDtcdC10OiBiaXRtYXNrIG9mIHJhY2luZyB0aHJlYWRzIHRvIHN0YXJ0LCBmb3IgYmlzZWN0aW5nIGEgZmFpbHVyZVxuJiMzNDspOwomIzQzOwlleGl0KDEpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiYjNDM7ewomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRocmVhZF9uYW1lc1tdID0gewomIzQzOwkJJiMzNDtmYXVsdGVyJiMzNDssICYjMzQ7ZmF1bHRlcjImIzM0OywgJiMzNDtkb250bmVlZCYjMzQ7LCAmIzM0O3Bpbm5lciYjMzQ7LCAmIzM0O2ZvcmtlciYjMzQ7LAomIzQzOwkJJiMzNDttcmVtYXBwZXImIzM0OywgJiMzNDtwYWdlb3V0JiMzNDssICYjMzQ7Y29tcGFjdG9yJiMzNDssCiYjNDM7CX07CiYjNDM7CXZvaWQgKigqY29uc3QgdGhyZWFkX2Zuc1tdKSh2b2lkICopID0gewomIzQzOwkJZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLAomIzQzOwkJbXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sCiYjNDM7CX07CiYjNDM7CWVudW0geyBUX0ZBVUxURVIsIFRfRkFVTFRFUjIsIFRfRE9OVE5FRUQsIFRfUElOTkVSLCBUX0ZPUktFUiwKJiM0MzsJICAgICAgIFRfTVJFTUFQUEVSLCBUX1BBR0VPVVQsIFRfQ09NUEFDVE9SIH07CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgcGFnZW91dF9iaXQgPSAxVUwgJmx0OyZsdDsgVF9QQUdFT1VUOwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIGNvbXBhY3Rvcl9iaXQgPSAxVUwgJmx0OyZsdDsgVF9DT01QQUNUT1I7CiYjNDM7CWNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpOwomIzQzOwlwdGhyZWFkX3QgdGhyZWFkc1tBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyldOwomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFsbF9tb2Rlc1tdID0geyAmIzM0O3N0ZXBwZWQmIzM0OywgJiMzNDtmcmVlJiMzNDssICYjMzQ7bWFkdmlzZSYjMzQ7IH07CiYjNDM7CXN0YXRpYyBjb25zdCBib29sIG9jY3VwYW5jaWVzW10gPSB7IGZhbHNlLCB0cnVlIH07CS8qIHN0cmljdCwgaG9sZXMgKi8KJiM0MzsJc3RhdGljIGNvbnN0IGJvb2wgcHJlc3N1cmVzW10gPSB7IGZhbHNlLCB0cnVlIH07CS8qIHF1aWV0LCB1bmRlciBwcmVzc3VyZSAqLwomIzQzOwljb25zdCBpbnQgbnJfb2NjdXBhbmNpZXMgPSBBUlJBWV9TSVpFKG9jY3VwYW5jaWVzKTsKJiM0MzsJY29uc3QgaW50IG5yX3ByZXNzdXJlcyA9IEFSUkFZX1NJWkUocHJlc3N1cmVzKTsKJiM0MzsJY29uc3QgY2hhciAqb25lX21vZGVbMV07CiYjNDM7CWNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7CiYjNDM7CWludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTsKJiM0MzsJY29uc3QgY2hhciAqbW9kZV9hcmcgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzOwomIzQzOwl1bnNpZ25lZCBsb25nIGVuZF9tczsKJiM0MzsJaW50IGR1cmF0aW9uX3MgPSA1OwomIzQzOwl1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDsKJiM0MzsJdW5zaWduZWQgbG9uZyBiYXNlX21hc2s7CiYjNDM7CWJvb2wgaGF2ZV9zd2FwOwomIzQzOwljaGFyIGxhYmVsWzY0XTsKJiM0MzsJaW50IG5yX2FyZWFzX2FyZyA9IDA7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsJaW50IHN0ZXBzID0gMDsKJiM0MzsJaW50IG9wdDsKJiM0MzsKJiM0MzsJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgJiMzNDthOmQ6bTp0OmgmIzM0OykpICE9IC0xKSB7CiYjNDM7CQlzd2l0Y2ggKG9wdCkgewomIzQzOwkJY2FzZSAmIzM5O2EmIzM5OzoKJiM0MzsJCQlucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7ZCYjMzk7OgomIzQzOwkJCWR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7bSYjMzk7OgomIzQzOwkJCW1vZGVfYXJnID0gb3B0YXJnOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3QmIzM5OzoKJiM0MzsJCQl0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWRlZmF1bHQ6CiYjNDM7CQkJdXNhZ2UoKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobW9kZV9hcmcpIHsKJiM0MzsJCWlmIChzdHJjbXAobW9kZV9hcmcsICYjMzQ7c3RlcHBlZCYjMzQ7KSAmYW1wOyZhbXA7IHN0cmNtcChtb2RlX2FyZywgJiMzNDtmcmVlJiMzNDspICZhbXA7JmFtcDsKJiM0MzsJCSAgICBzdHJjbXAobW9kZV9hcmcsICYjMzQ7bWFkdmlzZSYjMzQ7KSkKJiM0MzsJCQl1c2FnZSgpOwomIzQzOwkJb25lX21vZGVbMF0gPSBtb2RlX2FyZzsKJiM0MzsJCW1vZGVzID0gb25lX21vZGU7CiYjNDM7CQlucl9tb2RlcyA9IDE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJa3NmdF9wcmludF9oZWFkZXIoKTsKJiM0MzsJaWYgKCF0aHBfYXZhaWxhYmxlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CiYjNDM7CWhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTsKJiM0MzsJaWYgKCFocGFnZV9wbWRfc2l6ZSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O1JlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxuJiMzNDspOwomIzQzOwomIzQzOwlndXBfZmQgPSBvcGVuKCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QmIzM0OywgT19SRFdSKTsKJiM0MzsJaWYgKGd1cF9mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0Oy9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IHJlcXVpcmVzIENPTkZJR19HVVBfVEVTVCBhbmQgcm9vdFxuJiMzNDspOwomIzQzOwomIzQzOwlucl9zaGFyZWRfYXJlYXMgPSBucl9hcmVhc19hcmcgJmd0OyAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7CiYjNDM7CW5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICYjNDM7IDE7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE1SRU1BUF9GSVhFRCB1bm1hcHMgd2hhdGV2ZXIgaXMgaW4gdGhlIHdheSB3aXRob3V0IHNheWluZyBzbywgc28KJiM0MzsJICogY2xhaW0gdGhlIG1yZW1hcCB0aHJlYWQmIzM5O3Mgc2NyYXRjaCBhZGRyZXNzIHVwIGZyb250LgomIzQzOwkgKi8KJiM0MzsJbXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiAmIzQzOyAyICogbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsJaWYgKG1tYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBQUk9UX05PTkUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwKJiM0MzsJCSAtMSwgMCkgIT0gKHZvaWQgKiltcmVtYXBfc2NyYXRjaCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSBtcmVtYXAgc2NyYXRjaCYjMzQ7KTsKJiM0MzsKJiM0MzsJYmFzZV9tYXNrID0gdGhyZWFkX21hc2s7CiYjNDM7CWhhdmVfc3dhcCA9IHN3YXBfYXZhaWxhYmxlKCk7CiYjNDM7CWlmICghaGF2ZV9zd2FwKQomIzQzOwkJLyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUgKi8KJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7bm8gc3dhcDogdGhlIHBhZ2VvdXQgdGhyZWFkIGlzIG5vdCBzdGFydGVkXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7CiYjNDM7CiYjNDM7CXRocF9zYXZlX3NldHRpbmdzKCk7CiYjNDM7CXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwomIzQzOwkvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQgKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWZvciAoaW50IHJ1biA9IDA7IHJ1biAmbHQ7IG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXM7IHJ1biYjNDM7JiM0MzspIHsKJiM0MzsJCWludCByZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpOwomIzQzOwkJY29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldOwomIzQzOwkJYm9vbCBob2xlcyA9IG9jY3VwYW5jaWVzW3JlbSAvIG5yX3ByZXNzdXJlc107CiYjNDM7CQlib29sIHByZXNzdXJlID0gcHJlc3N1cmVzW3JlbSAlIG5yX3ByZXNzdXJlc107CiYjNDM7CiYjNDM7CQlzbnByaW50ZihsYWJlbCwgc2l6ZW9mKGxhYmVsKSwgJiMzNDslcy8lcyVzJiMzNDssIG1vZGUsCiYjNDM7CQkJIGhvbGVzID8gJiMzNDtob2xlcyYjMzQ7IDogJiMzNDtzdHJpY3QmIzM0OywgcHJlc3N1cmUgPyAmIzM0Oy9wcmVzc3VyZSYjMzQ7IDogJiMzNDsmIzM0Oyk7CiYjNDM7CQlpZiAoY29ycnVwdGVkKSB7CiYjNDM7CQkJLyogTWVtb3J5IGlzIHN1c3BlY3Q7IHRoZSByZXN0IHdvdWxkIHByb3ZlIG5vdGhpbmcgKi8KJiM0MzsJCQlrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoJiMzNDslczogc2tpcHBlZCBhZnRlciBjb3JydXB0aW9uXG4mIzM0OywgbGFiZWwpOwomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwomIzQzOwkJdGhyZWFkX21hc2sgPSBiYXNlX21hc2s7CiYjNDM7CQlpZiAoIXByZXNzdXJlKQomIzQzOwkJCXRocmVhZF9tYXNrICZhbXA7PSB+KHBhZ2VvdXRfYml0IHwgY29tcGFjdG9yX2JpdCk7CiYjNDM7CQllbHNlIGlmICghaGF2ZV9zd2FwKQomIzQzOwkJCXRocmVhZF9tYXNrICZhbXA7PSB+cGFnZW91dF9iaXQ7CiYjNDM7CiYjNDM7CQl0aHBfcmVhZF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsJCXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CQlzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7CiYjNDM7CQlzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0KJiM0MzsJCQlzdHJjbXAobW9kZSwgJiMzNDtmcmVlJiMzNDspID8gMTAwMCA6IDA7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIG1USFAgY29sbGFwc2UgaG9ub3VycyBvbmx5IDAgb3IgSFBBR0VfUE1EX05SIC0gMSBoZXJlLiAgVGhlIHR3bwomIzQzOwkJICogZW5kcyByYWNlIGRpZmZlcmVudCBwYXRoczogYSBzdHJpY3Qgd2luZG93IGhhcyBldmVyeSBQVEUKJiM0MzsJCSAqIHByZXNlbnQsIGEgaG9sZS1oZWF2eSBvbmUgaXMgbW9zdGx5IHplcm8tZmlsbGVkLgomIzQzOwkJICovCiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/CiYjNDM7CQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwOwomIzQzOwkJLyogT25lIHdha2UsIG9uZSBwYXNzOiB0aGUgcGxheWdyb3VuZCBwbHVzIHRoZSBmb3JrZWQgY2hpbGRyZW4mIzM5O3MgY29waWVzICovCiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPQomIzQzOwkJCW5yX2FyZWFzICogKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAqIDg7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgaSkpCiYjNDM7CQkJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7CiYjNDM7CQl9CiYjNDM7CQl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJCXJlZ2lvbiA9IG1tYXAoQkFTRV9BRERSLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCSAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfAomIzQzOwkJCSAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApOwomIzQzOwkJaWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bW1hcCgpIHBsYXlncm91bmQmIzM0Oyk7CiYjNDM7CQltcmVtYXBfYXJlYSA9IHJlZ2lvbiAmIzQzOyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsKJiM0MzsJCWlmICh0aHJlYWRfbWFzayAmYW1wOyBwYWdlb3V0X2JpdCkgewomIzQzOwkJCS8qIEVub3VnaCB0byBkcml2ZSByZWFsIHJlY2xhaW0gd2l0aG91dCBzd2FtcGluZyBhIHNtYWxsIGd1ZXN0ICovCiYjNDM7CQkJcGFnZW91dF9zaXplID0gNCAqIGhwYWdlX3BtZF9zaXplOwomIzQzOwkJCWlmIChwYWdlb3V0X3NpemUgJmx0OyAxNlVMICZsdDsmbHQ7IDIwKQomIzQzOwkJCQlwYWdlb3V0X3NpemUgPSAxNlVMICZsdDsmbHQ7IDIwOwomIzQzOwkJCWlmIChwYWdlb3V0X3NpemUgJmd0OyA2NFVMICZsdDsmbHQ7IDIwKQomIzQzOwkJCQlwYWdlb3V0X3NpemUgPSA2NFVMICZsdDsmbHQ7IDIwOwomIzQzOwkJCXBhZ2VvdXRfYXJlYSA9IG1tYXAoTlVMTCwgcGFnZW91dF9zaXplLAomIzQzOwkJCQkJICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkJCQkgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CiYjNDM7CQkJaWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKQomIzQzOwkJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkgcGFnZW91dCBhcmVhJiMzNDspOwomIzQzOwkJfQomIzQzOwomIzQzOwkJLyogUG9wdWxhdGUgc28gdGhlIGZpcnN0IHBhc3MgaGFzIHNvbWV0aGluZyB0byBjb2xsYXBzZSAqLwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCQkqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpOwomIzQzOwkJbWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CQlpZiAobWFkdmlzZShyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSkmIzM0Oyk7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAoISh0aHJlYWRfbWFzayAmYW1wOyAoMVVMICZsdDsmbHQ7IGkpKSkgewomIzQzOwkJCQl0aHJlYWRzW2ldID0gMDsKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJfQomIzQzOwkJCWlmIChwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sCiYjNDM7CQkJCQkgICAodm9pZCAqKShpICYjNDM7IDEpKSkKJiM0MzsJCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKHRocmVhZF9uYW1lc1tpXSk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQllbmRfbXMgPSBub3dfbXMoKSAmIzQzOyBkdXJhdGlvbl9zICogMTAwMFVMOwomIzQzOwkJaWYgKCFzdHJjbXAobW9kZSwgJiMzNDtzdGVwcGVkJiMzNDspKSB7CiYjNDM7CQkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkgewomIzQzOwkJCQlpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKFBBU1NfVElNRU9VVF9TKSkKJiM0MzsJCQkJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O2todWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcbiYjMzQ7KTsKJiM0MzsJCQkJc3RlcHMmIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCAmIzM0O2ZyZWUmIzM0OykpIHsKJiM0MzsJCQl3aGlsZSAobm93X21zKCkgJmx0OyBlbmRfbXMgJmFtcDsmYW1wOyAhY29ycnVwdGVkKQomIzQzOwkJCQl1c2xlZXAoMTAwICogMTAwMCk7CiYjNDM7CQl9IGVsc2UgewkvKiBtYWR2aXNlICovCiYjNDM7CQkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkgewomIzQzOwkJCQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfc2hhcmVkX2FyZWFzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCQkJbWFkdmlzZShyZWdpb24gJiM0MzsgaSAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0NPTExBUFNFKTsKJiM0MzsJCQkJfQomIzQzOwkJCQltYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCQkJc3RlcHMmIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsKJiM0MzsJCXN0b3AgPSAxOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaWYgKHRocmVhZHNbaV0pCiYjNDM7CQkJCXB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSYjNDM7JiM0MzspCiYjNDM7CQkJY2hlY2tfcGFnZShpKTsKJiM0MzsKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCwgJiMzNDslczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxuJiMzNDssCiYjNDM7CQkJCSBsYWJlbCwgZHVyYXRpb25fcywgc3RlcHMpOwomIzQzOwomIzQzOwkJLyogVGhlIG5leHQgbW9kZSBtYXBzIHRoZSBzYW1lIGZpeGVkIGFkZHJlc3Mgd2l0aCBpdHMgb3duIHNldHRpbmdzICovCiYjNDM7CQltdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJCWlmIChwYWdlb3V0X2FyZWEpIHsKJiM0MzsJCQltdW5tYXAocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUpOwomIzQzOwkJCXBhZ2VvdXRfYXJlYSA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CQlzdG9wID0gMDsKJiM0MzsJCXN0ZXBzID0gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4xYzFiOTQyYWMzMjU4Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMKQEAgLTAsMCAmIzQzOzEsMTc5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIENoZWNrIHRoYXQga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkcml2ZXMga2h1Z2VwYWdlZCBpbiBzdGVwOiBvbmUgYmFycmllcgomIzQzOyAqIG92ZXIgb25lIHByZXBhcmVkIHdpbmRvdyBtdXN0IGNvbGxhcHNlIGl0IHdpdGggZXhhY3RseSBvbmUgY29sbGFwc2UKJiM0MzsgKiBhdHRlbXB0IGF0dHJpYnV0ZWQgdG8gaXRzIHNvdXJjZSBwYWdlcywgc3RlcCBhZnRlciBzdGVwLgomIzQzOyAqCiYjNDM7ICogc2Nhbl9zbGVlcF9taWxsaXNlY3MgaXMgYSBtaW51dGUgc28gdGhhdCBhIHN0ZXAgd2hpY2ggc2xlcHQgaW5zdGVhZCBvZgomIzQzOyAqIGJlaW5nIHdva2VuIGJsb3dzIHRoZSBidWRnZXQuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7a3NlbGZ0ZXN0LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dm1fdXRpbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgJmx0OyZsdDsgMzApKQomIzQzOy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovCiYjNDM7I2RlZmluZSBUQVJHRVRfT1JERVIgMgomIzQzOyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1CiYjNDM7I2RlZmluZSBQQVNTX1RJTUVPVVRfUyAzMAomIzQzOwomIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZDsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7CiYjNDM7c3RhdGljIGludCB0cmFjZV9ldmVudHNfZmQgPSAtMTsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlOiBzd2l0Y2ggdGhlbSBvZmYgaG93ZXZlciB0aGUgdGVzdCBlbmRzLAomIzQzOyAqIGluY2x1ZGluZyBmcm9tIGluc2lkZSBhIGhlbHBlciB0aGF0IGdpdmVzIHVwLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHRyYWNlX2V2ZW50c19vZmYodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICh0cmFjZV9ldmVudHNfZmQgJmd0Oz0gMCkKJiM0MzsJCXRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQ291bnQgdGhlIGlzb2xhdGUgZXZlbnRzIHdob3NlIHNjYW5fcGZuIGlzIG9uZSBvZiB0aGUgd2luZG93JiMzOTtzIHNvdXJjZSBQRk5zICovCiYjNDM7c3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLAomIzQzOwkJCSAgICB1bnNpZ25lZCBpbnQgb3JkZXIpCiYjNDM7ewomIzQzOwljaGFyIGxpbmVbMTAyNF07CiYjNDM7CWludCBjb3VudCA9IDA7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7Q2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJdW5zaWduZWQgbG9uZyB2YWw7CiYjNDM7CQl1bnNpZ25lZCBpbnQgb3JkOwomIzQzOwkJY2hhciAqcywgKm87CiYjNDM7CQlpbnQgaTsKJiM0MzsKJiM0MzsJCXMgPSBzdHJzdHIobGluZSwgJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTomIzM0Oyk7CiYjNDM7CQlpZiAoIXMpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlpZiAoc3NjYW5mKHMsICYjMzQ7bW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4JiMzNDssCiYjNDM7CQkJICAgJmFtcDt2YWwpICE9IDEpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlvID0gc3Ryc3RyKHMsICYjMzQ7b3JkZXI9JiMzNDspOwomIzQzOwkJaWYgKCFvIHx8IHNzY2FuZihvLCAmIzM0O29yZGVyPSV1JiMzNDssICZhbXA7b3JkKSAhPSAxIHx8IG9yZCAhPSBvcmRlcikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9wZm5zOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICh2YWwgPT0gcGZuc1tpXSkgewomIzQzOwkJCQljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pCiYjNDM7ewomIzQzOwljb25zdCBzaXplX3Qgd2luZG93ID0gZ2V0cGFnZXNpemUoKSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVI7CiYjNDM7CWNvbnN0IGludCBucl9wYWdlcyA9IDEgJmx0OyZsdDsgVEFSR0VUX09SREVSOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbnNbMSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVJdOwomIzQzOwlib29sIGNvbGxhcHNlZCwgcGFzc2VkOwomIzQzOwlpbnQgYXR0cmlidXRlZDsKJiM0MzsJY2hhciAqcDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CXAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApOwomIzQzOwlpZiAocCAhPSBCQVNFX0FERFIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkgd2luZG93JiMzNDspOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlwW2kgKiBnZXRwYWdlc2l6ZSgpXSA9IGkgJiM0MzsgMTsKJiM0MzsJCXBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCAmIzQzOyBpICogZ2V0cGFnZXNpemUoKSk7CiYjNDM7CQlpZiAocGZuc1tpXSA9PSAtMVVMKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O1NvdXJjZSBwYWdlIG5vdCBwcmVzZW50XG4mIzM0Oyk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogQ2xlYXIgYmVmb3JlIGVuYWJsaW5nIHNvIHRoZSBidWZmZXIgaG9sZHMgb25seSB0aGlzIHN0ZXAmIzM5O3MgZXZlbnRzICovCiYjNDM7CWlmICh0cmFjaW5nX2NsZWFyX3RyYWNlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxuJiMzNDspOwomIzQzOwlpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xuJiMzNDspOwomIzQzOwomIzQzOwlpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfSFVHRVBBR0UpJiMzNDspOwomIzQzOwlwYXNzZWQgPSBraHVnZXBhZ2VkX2Z1bGxfcGFzcyhQQVNTX1RJTUVPVVRfUyk7CiYjNDM7CiYjNDM7CS8qIE9mZiBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZ2l2ZSB1cDogdGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUgKi8KJiM0MzsJaWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0Nhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xuJiMzNDspOwomIzQzOwlpZiAoIXBhc3NlZCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O2todWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xuJiMzNDspOwomIzQzOwomIzQzOwljb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgd2luZG93LCBUQVJHRVRfT1JERVIsCiYjNDM7CQkJCQkgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpOwomIzQzOwlhdHRyaWJ1dGVkID0gY291bnRfYXR0cmlidXRlZChwZm5zLCBucl9wYWdlcywgVEFSR0VUX09SREVSKTsKJiM0MzsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgJmFtcDsmYW1wOyBhdHRyaWJ1dGVkID09IDEsCiYjNDM7CQkJICYjMzQ7c3RlcCAlZDogd2luZG93IGNvbGxhcHNlZCwgJWQgYXR0cmlidXRlZCByZXN1bHQocylcbiYjMzQ7LAomIzQzOwkJCSBpdGVyYXRpb24sIGF0dHJpYnV0ZWQpOwomIzQzOwomIzQzOwltdW5tYXAocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfaGVhZGVyKCk7CiYjNDM7CiYjNDM7CWlmICghdGhwX2F2YWlsYWJsZSgpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxuJiMzNDspOwomIzQzOwlpZiAoISh0aHBfc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgVEFSR0VUX09SREVSKSkpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxuJiMzNDssCiYjNDM7CQkJICAgICAgIFRBUkdFVF9PUkRFUik7CiYjNDM7CiYjNDM7CWhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTsKJiM0MzsJaWYgKCFocGFnZV9wbWRfc2l6ZSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O1JlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxuJiMzNDspOwomIzQzOwlwYWdlbWFwX2ZkID0gb3BlbigmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChwYWdlbWFwX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O29wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKSYjMzQ7KTsKJiM0MzsJa3BhZ2VmbGFnc19mZCA9IG9wZW4oJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGtwYWdlZmxhZ3NfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcbiYjMzQ7KTsKJiM0MzsJdHJhY2VfZXZlbnRzX2ZkID0gdHJhY2luZ19ldmVudHNfb3BlbigmIzM0O2h1Z2VfbWVtb3J5JiMzNDspOwomIzQzOwlpZiAodHJhY2VfZXZlbnRzX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7aHVnZV9tZW1vcnkgZXZlbnRzIHJlcXVpcmUgdHJhY2VmcyBhbmQgcm9vdFxuJiMzNDspOwomIzQzOwlhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7CiYjNDM7CiYjNDM7CWtzZnRfc2V0X3BsYW4oTlJfSVRFUkFUSU9OUyk7CiYjNDM7CiYjNDM7CXRocF9zYXZlX3NldHRpbmdzKCk7CiYjNDM7CXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwlzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFOwomIzQzOwlzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9IDYwICogMTAwMDsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MCAqIDEwMDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTsKJiM0MzsJLyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSAqLwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgJmx0OyZsdDsgMjQ7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KQomIzQzOwkJc2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7CiYjNDM7CXNldHRpbmdzLmh1Z2VwYWdlc1tUQVJHRVRfT1JERVJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDsKJiM0MzsJLyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovCiYjNDM7CXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfSVRFUkFUSU9OUzsgaSYjNDM7JiM0MzspCiYjNDM7CQlvbmVfc3RlcChpKTsKJiM0MzsKJiM0MzsJa3NmdF9maW5pc2hlZCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMKaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMKQEAgLTIwLDcgJiM0MzsyMCw2IEBACiAKICNkZWZpbmUgVFdPTUVHCQkoMiZsdDsmbHQ7MjApCiAjZGVmaW5lIFJVTlRJTUUJCSgyMCkKLSNkZWZpbmUgQUxJR04oeCwgYSkJKCgoeCkgJiM0MzsgKGEgLSAxKSkgJmFtcDsgKH4oKGEpIC0gMSkpKQogCiBIVUdFVExCX1NFVFVQX0RFRkFVTFRfUEFHRVMoMSkKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaAppbmRleCBkMDlmOWY2YTM4NGVlLi5mYzYxOTA3YWEzYjJhIDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaApAQCAtNDAyLDYgJiM0Mzs0MDIsMTIgQEAgQ0FURUdPUlk9JiMzNDtwZm5tYXAmIzM0OyBydW5fdGVzdCAuL3Bmbm1hcAogIyBDT1cgdGVzdHMKIENBVEVHT1JZPSYjMzQ7Y293JiMzNDsgcnVuX3Rlc3QgLi9jb3cKIAomIzQzO0NBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9mb2xpb19vcmRlcl9jaGVjawomIzQzOwomIzQzO0NBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2sKJiM0MzsKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlCiYjNDM7CiBDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZAogCiBDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyCkBAIC00MTAsOCAmIzQzOzQxNiw2IEBAIENBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbQogCiBDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyA0IGFsbDpzaG1lbQogCi1DQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtYyA0IG10aHBfa2h1Z2VwYWdlZDphbm9uCi0KICMgVHJ5IHRvIGNyZWF0ZSBYRlMgaWYgbm90IHByb3ZpZGVkCiBpZiBbIC16ICYjMzQ7JHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH0mIzM0OyBdOyB0aGVuCiAgICAgaWYgdGVzdF9zZWxlY3RlZCAmIzM0O3RocCYjMzQ7OyB0aGVuCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYwppbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMKQEAgLTQyLDY4ICYjNDM7NDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSAmIzM0Oy9wcm9jL2twYWdlZmxhZ3MmIzM0OzsKIGludCBwYWdlbWFwX2ZkOwogaW50IGtwYWdlZmxhZ3NfZmQ7CiAKLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCwKLQkJaW50IGtwYWdlZmxhZ3NfZmQpCi17Ci0JY29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDsKLQljb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMOwotCWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7Ci0JdW5zaWduZWQgbG9uZyBwZm5faGVhZDsKLQl1aW50NjRfdCBwZm5fZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBwZm47Ci0JdW5zaWduZWQgbG9uZyBpOwotCi0JcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTsKLQotCS8qIG5vbiBwcmVzZW50IHBhZ2UgKi8KLQlpZiAocGZuID09IC0xVUwpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQotCQlnb3RvIGZhaWw7Ci0KLQkvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqLwotCWlmICghb3JkZXIpIHsKLQkJaWYgKHBmbl9mbGFncyAmYW1wOyAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKiBub24gVEhQIGZvbGlvICovCi0JaWYgKCEocGZuX2ZsYWdzICZhbXA7IEtQRl9USFApKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlwZm5faGVhZCA9IHBmbiAmYW1wOyB+KG5yX3BhZ2VzIC0gMSk7Ci0KLQlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQotCQlnb3RvIGZhaWw7Ci0KLQkvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqLwotCWlmICgocGZuX2ZsYWdzICZhbXA7IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqLwotCWZvciAoaSA9IDE7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKLQkJaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgaSwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQotCQkJZ290byBmYWlsOwotCQlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCwKLQkgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyCi0JICovCi0JaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQkvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovCi0JcmV0dXJuIChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFnczsKLWZhaWw6Ci0Ja3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7RmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXG4mIzM0Oyk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbiwKIAkJaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpCiB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMKaW5kZXggNDgyMWEzNTYzMDM2My4uYWY4MzI0ZTFlOGYyYyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYwpAQCAtNDkwLDYgJiM0Mzs0OTAsMTUzIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKQogCXJldHVybiAwOwogfQogCiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsCiYjNDM7CQkJaW50IGtwYWdlZmxhZ3NfZmQpCiYjNDM7ewomIzQzOwljb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEOwomIzQzOwljb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMOwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbl9oZWFkOwomIzQzOwl1aW50NjRfdCBwZm5fZmxhZ3M7CiYjNDM7CXVuc2lnbmVkIGxvbmcgcGZuOwomIzQzOwl1bnNpZ25lZCBsb25nIGk7CiYjNDM7CiYjNDM7CXBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7CiYjNDM7CiYjNDM7CS8qIG5vbiBwcmVzZW50IHBhZ2UgKi8KJiM0MzsJaWYgKHBmbiA9PSAtMVVMKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJLyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi8KJiM0MzsJaWYgKCFvcmRlcikgewomIzQzOwkJaWYgKHBmbl9mbGFncyAmYW1wOyAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIG5vbiBUSFAgZm9saW8gKi8KJiM0MzsJaWYgKCEocGZuX2ZsYWdzICZhbXA7IEtQRl9USFApKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlwZm5faGVhZCA9IHBmbiAmYW1wOyB+KG5yX3BhZ2VzIC0gMSk7CiYjNDM7CiYjNDM7CWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CS8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovCiYjNDM7CWlmICgocGZuX2ZsYWdzICZhbXA7IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CS8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqLwomIzQzOwlmb3IgKGkgPSAxOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCAmIzQzOyBpLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCiYjNDM7CQkJZ290byBmYWlsOwomIzQzOwkJaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncykKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCwKJiM0MzsJICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlcgomIzQzOwkgKi8KJiM0MzsJaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCXJldHVybiB0cnVlOwomIzQzOwomIzQzOwkvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovCiYjNDM7CXJldHVybiAocGZuX2ZsYWdzICZhbXA7IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7CiYjNDM7ZmFpbDoKJiM0MzsJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7RmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXG4mIzM0Oyk7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKCkgLSBjaGVjayB0aGF0IGEgcmFuZ2UgaXMgYmFja2VkIGJ5IEBvcmRlciBmb2xpb3MKJiM0MzsgKiBAc3RhcnQ6IHN0YXJ0IG9mIHRoZSByYW5nZSwgYSBtdWx0aXBsZSBvZiB0aGUgZm9saW8gc2l6ZQomIzQzOyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgcmFuZ2UgaW4gYnl0ZXMsIGEgbXVsdGlwbGUgb2YgdGhlIGZvbGlvIHNpemUKJiM0MzsgKiBAb3JkZXI6IHRoZSBmb2xpbyBvcmRlciB0byBjaGVjayBmb3IKJiM0MzsgKiBAcGFnZW1hcF9mZDogb3BlbiAvcHJvYy8mbHQ7cGlkJmd0Oy9wYWdlbWFwIG9mIHRoZSByYW5nZSYjMzk7cyBvd25lcgomIzQzOyAqIEBrcGFnZWZsYWdzX2ZkOiBvcGVuIC9wcm9jL2twYWdlZmxhZ3MKJiM0MzsgKgomIzQzOyAqIEV2ZXJ5IGZvbGlvLXNpemVkLCBmb2xpby1hbGlnbmVkIHBhcnQgb2YgdGhlIHJhbmdlIG11c3QgbWFwIG9uZSBmb2xpbyBvZgomIzQzOyAqIEBvcmRlciwgaGVhZCB0byB0YWlsLCB3aXRoIHRoZSBoZWFkIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFydC4gIEEgcGFydAomIzQzOyAqIGJhY2tlZCBieSBzZXZlcmFsIHNtYWxsZXIgZm9saW9zIGZhaWxzLCBhbmQgc28gZG9lcyBhIGZvbGlvIG1hcHBlZCBvZmYKJiM0MzsgKiBpdHMgbmF0dXJhbCBhbGlnbm1lbnQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zOiB0cnVlIGlmIHRoZSB3aG9sZSByYW5nZSBpcyBiYWNrZWQgdGhhdCB3YXksIGZhbHNlIG90aGVyd2lzZS4KJiM0MzsgKi8KJiM0Mztib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLAomIzQzOwkJCSAgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7CiYjNDM7CWNvbnN0IHNpemVfdCBmb2xpb19zaXplID0gbnJfcGFnZXMgKiBwc2l6ZSgpOwomIzQzOwljaGFyICp2YWRkcjsKJiM0MzsKJiM0MzsJaWYgKCh1aW50cHRyX3Qpc3RhcnQgJSBmb2xpb19zaXplIHx8IGxlbiAlIGZvbGlvX3NpemUpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgJmx0OyBzdGFydCAmIzQzOyBsZW47IHZhZGRyICYjNDM7PSBmb2xpb19zaXplKSB7CiYjNDM7CQljb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGk7CiYjNDM7CiYjNDM7CQkvKiBOb3QgcHJlc2VudCwgb3IgYSB0YWlsIHBhZ2UgKi8KJiM0MzsJCWlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcykKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAxOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJY2hhciAqcGFnZSA9IHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpOwomIzQzOwomIzQzOwkJCWlmIChwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcGFnZSkgIT0gcGZuICYjNDM7IGkpCiYjNDM7CQkJCXJldHVybiBmYWxzZTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIFRSQUNFRlNfUk9PVCAmIzM0Oy9zeXMva2VybmVsL3RyYWNpbmcmIzM0OwomIzQzOwomIzQzOy8qCiYjNDM7ICogUmV0dXJucyAtMSB3aXRob3V0IHRyYWNlZnMgb3IgdGhlIHN1YnN5c3RlbS4gIFRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlOgomIzQzOyAqIHdob2V2ZXIgc3dpdGNoZXMgdGhlbSBvbiBoYXMgdG8gc3dpdGNoIHRoZW0gb2ZmIGFnYWluLCBvbiBldmVyeSBleGl0IHBhdGguCiYjNDM7ICovCiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKQomIzQzO3sKJiM0MzsJY2hhciBwYXRoWzI1Nl07CiYjNDM7CiYjNDM7CXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UICYjMzQ7L2V2ZW50cy8lcy9lbmFibGUmIzM0OywKJiM0MzsJCSBzdWJzeXMpOwomIzQzOwlyZXR1cm4gb3BlbihwYXRoLCBPX1dST05MWSk7CiYjNDM7fQomIzQzOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSkKJiM0Mzt7CiYjNDM7CWlmIChwd3JpdGUoZmQsIGVuYWJsZSA/ICYjMzQ7MSYjMzQ7IDogJiMzNDswJiMzNDssIDEsIDApICE9IDEpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBEcm9wIHdoYXQgdGhlIHRyYWNlIGJ1ZmZlciBob2xkcyBzbyBmYXIgKi8KJiM0MztpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKQomIzQzO3sKJiM0MzsJaW50IGZkID0gb3BlbihUUkFDRUZTX1JPT1QgJiMzNDsvdHJhY2UmIzM0OywgT19XUk9OTFkgfCBPX1RSVU5DKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UICYjMzQ7L3RyYWNlJiMzNDssICYjMzQ7ciYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiAvKiBJZiBgaW9jdGxzJiMzOTsgbm9uLU5VTEwsIHRoZSBhbGxvd2VkIGlvY3RscyB3aWxsIGJlIHJldHVybmVkIGludG8gdGhlIHZhciAqLwogaW50IHVmZmRfcmVnaXN0ZXJfd2l0aF9pb2N0bHMoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbiwKIAkJCSAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscykKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaAppbmRleCA5YTQ5YWY4ODcwMmU0Li41YTkxYjk2NzZlYzVkIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oCkBAIC0xMCw2ICYjNDM7MTAsOCBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiAKICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgJmx0OyZsdDsgKG5yKSkKJiM0MzsjZGVmaW5lIEFMSUdOKHgsIGEpICAgICAgICAgICAgICAgICAgICgoKHgpICYjNDM7IChhKSAtIDEpICZhbXA7IH4oKGEpIC0gMSkpCiYjNDM7CiAjZGVmaW5lIFBNX1NPRlRfRElSVFkgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTUpCiAjZGVmaW5lIFBNX01NQVBfRVhDTFVTSVZFICAgICAgICAgICAgIEJJVF9VTEwoNTYpCiAjZGVmaW5lIFBNX1VGRkRfV1AgICAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTcpCkBAIC05Nyw2ICYjNDM7OTksMTAgQEAgaW50NjRfdCBhbGxvY2F0ZV90cmFuc2h1Z2Uodm9pZCAqcHRyLCBpbnQgcGFnZW1hcF9mZCk7CiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7CiBpbnQgZ2F0aGVyX2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbiwKIAkJaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpOwomIzQzO2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLAomIzQzOwkJCWludCBrcGFnZWZsYWdzX2ZkKTsKJiM0Mztib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLAomIzQzOwkJCSAgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7CiAKIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sCiAJCSAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTsKQEAgLTExMyw2ICYjNDM7MTE5LDEwIEBAIGludCBjbG9zZV9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwKTsKIGludCB3cml0ZV9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgdmFsKTsKIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTsKIGJvb2wgc29mdGRpcnR5X3N1cHBvcnRlZCh2b2lkKTsKJiM0MztpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7CiYjNDM7aW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZCk7CiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIGludCBvcGVuX3NlbGZfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcF9vdXQpCiB7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDE1OjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3OTA0CgkJCQkJCQlvdXRwdXQ6IDkwCgkJCQkJCQl0aG91Z2h0czogMTA0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgRWxpZ2liaWxpdHkqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byBsb29rIGF0IHRoZSBkaWZmIGFuZCBxdWlja2x5IGlkZW50aWZ5IHdoaWNoIGZpbGVzIGhhdmUgYmVlbiBtb2RpZmllZC4gSXQmIzM5O3MgYWxsIHVuZGVyIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gLiAgUmlnaHQsIHRoYXQgbWVhbnMgdGhlc2UgYXJlIHNlbGYtdGVzdHMgcmVsYXRlZCB0byBtZW1vcnkgbWFuYWdlbWVudC4gR2l2ZW4gbXkgZXhwZXJ0aXNlLCBJIGFscmVhZHkga25vdyB0aGF0IHRoaXMgc2VjdGlvbiBjb250YWlucyB0ZXN0cyBmb3IgdHJhbnNwYXJlbnQgaHVnZXBhZ2VzIChUSFAva2h1Z2VwYWdlZCkuCgpOb3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoaXMgd2FycmFudHMgZnV6emluZy4gSSBoYXZlIHRvIGFwcGx5IHRoYXQgbmVnYXRpdmUgY3JpdGVyaWEgY2hlY2suIFNwZWNpZmljYWxseSwgdGhlIHJ1bGUgSSBuZWVkIHRvIGxvb2sgYXQgaXM6ICpVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLioKCkJpbmdvLiBFdmVyeSBzaW5nbGUgZmlsZSBsaXN0ZWTigJRgTWFrZWZpbGVgLCB0aGUgYC5jYCBmaWxlcywgYW5kIHRoZSBgLmhgIGZpbGVz4oCUcmVzaWRlcyBwcmVjaXNlbHkgd2l0aGluIHRoYXQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AgZGlyZWN0b3J5LiBUaGVzZSBhcmUgdXNlci1zcGFjZSB0ZXN0cywgYW5kIHRoZSBtb2RpZmllZCBmaWxlcyB3aWxsICpub3QqIGFmZmVjdCB0aGUga2VybmVsIGltYWdlIG9yIG1vZHVsZXMuIEkmIzM5O3ZlIGRvdWJsZS1jaGVja2VkIHRoZSBkaWZmIGFuZCB0aGlzIGlzIHRoZSBlbnRpcmUgc2V0IG9mIGNoYW5nZXMuCgpUaGVyZWZvcmUsIGFjY29yZGluZyB0byB0aGUgJiMzNDtOZWdhdGl2ZSBDcml0ZXJpYSYjMzQ7IG91dGxpbmVkLCB0aGUgYFdvcnRoRnV6emluZ2AgcGFyYW1ldGVyIGlzIGBmYWxzZWAuCgpHaXZlbiB0aGlzLCBJIGhhdmUgdG8gZm9ybXVsYXRlIHRoZSBgc2V0LXJlc3VsdHNgIGNhbGw6CgoqICAgYFdvcnRoRnV6emluZ2A6IGBmYWxzZWAKKiAgIGBSZWFzb25pbmdgOiAmIzM0O01vZGlmaWVkIGZpbGVzIGFyZSBsb2NhdGVkIGluIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gLCB3aGljaCBjb25zaXN0cyBvZiB1c2VyLXNwYWNlIHRlc3RzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlIG9yIGtlcm5lbCBtb2R1bGVzLiYjMzQ7CiogICBgRm9jdXNTeW1ib2xzYDogXFsgXQoqICAgYEVuYWJsZUNvbmZpZ3NgOiBcWyBdCgpJJiMzOTttIHJlYWR5IHRvIGNhbGwgYHNldC1yZXN1bHRzYC4gVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBjYXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA4IDE1OjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdXNlci1zcGFjZSBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBObyBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIG1vZHVsZSBjb2RlIGlzIGFsdGVyZWQsIG1ha2luZyB0aGUgY2hhbmdlcyBub24ta2VybmVsL25vbi1leGVjdXRhYmxlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdXNlci1zcGFjZSBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBObyBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIG1vZHVsZSBjb2RlIGlzIGFsdGVyZWQsIG1ha2luZyB0aGUgY2hhbmdlcyBub24ta2VybmVsL25vbi1leGVjdXRhYmxlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGtlcm5lbCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOCAxNToxNTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDhUMTU6MTU6NDEuMjQ4NjE2NDQ3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTExNjEwMjk1MzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIkFsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3IgbW9kdWxlIGNvZGUgaXMgYWx0ZXJlZCwgbWFraW5nIHRoZSBjaGFuZ2VzIG5vbi1rZXJuZWwvbm9uLWV4ZWN1dGFibGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Yga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxNToxNTo0MS4yNDg2MjUyMTdaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NDgwMzA2MjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA2ODI3MGExYWI4MmI2Nzk3M2RlNjdmZmI0ZDM1NDA2NWFkNWE4NjkxXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUdWUgU2VwIDggMTU6MTU6MzkgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxcbmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxcbkBAIC0xMDQsNiArMTA0LDkgQEAgVEVTVF9HRU5fRklMRVMgKz0gZ3VhcmQtcmVnaW9uc1xcbiBURVNUX0dFTl9GSUxFUyArPSBtZXJnZVxcbiBURVNUX0dFTl9GSUxFUyArPSBybWFwXFxuIFRFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX3NwbGl0X3JhY2VfdGVzdFxcbitURVNUX0dFTl9GSUxFUyArPSBmb2xpb19vcmRlcl9jaGVja1xcbitURVNUX0dFTl9GSUxFUyArPSBraHVnZXBhZ2VkX3N5bmNfY2hlY2tcXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9yYWNlXFxuIFxcbiBpZm5lcSAoJChBUkNIKSxhcm02NClcXG4gVEVTVF9HRU5fRklMRVMgKz0gc29mdC1kaXJ0eVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZmE3MzZjOWY3MDFhNFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXFxuQEAgLTAsMCArMSwxMjIgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogU2VsZi1jaGVjayBmb3IgdGhlIHZtX3V0aWwgZm9saW8tb3JkZXIgaGVscGVycywgaXNfYmFja2VkX2J5X2ZvbGlvKCkgYW5kXFxuKyAqIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcigpLCB3aGljaCB0aGUga2h1Z2VwYWdlZCBtVEhQIGNhc2VzIHVzZSB0byBkZXRlY3RcXG4rICogY29sbGFwc2UgcmVzdWx0cy4gIEZvciBldmVyeSBhbm9uIFRIUCBvcmRlciB0aGUga2VybmVsIHN1cHBvcnRzLCBmYXVsdFxcbisgKiBtZW1vcnkgaW4gd2l0aCBvbmx5IHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgcmVxdWlyZSB0aGUgaGVscGVycyB0byByZXBvcnRcXG4rICogZXhhY3RseSB0aGF0IG9yZGVyLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJrc2VsZnRlc3QuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInZtX3V0aWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImh1Z2VwYWdlX3NldHRpbmdzLmhcXFwiXFxuK1xcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcXG4rXFxuK3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxcbit7XFxuK1xcdHNpemVfdCBsZW4gPSBzaXplICogMjtcXG4rXFx0Y2hhciAqcCwgKmFsaWduZWQ7XFxuK1xcbitcXHRwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcXG4rXFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKClcXFwiKTtcXG4rXFxuK1xcdGFsaWduZWQgPSAoY2hhciAqKUFMSUdOKCh1aW50cHRyX3QpcCwgc2l6ZSk7XFxuK1xcdGlmIChhbGlnbmVkICE9IHApXFxuK1xcdFxcdG11bm1hcChwLCBhbGlnbmVkIC0gcCk7XFxuK1xcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSBwICsgbGVuKVxcbitcXHRcXHRtdW5tYXAoYWxpZ25lZCArIHNpemUsIHAgKyBsZW4gLSBhbGlnbmVkIC0gc2l6ZSk7XFxuK1xcbitcXHRyZXR1cm4gYWxpZ25lZDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfb3JkZXIoaW50IG9yZGVyKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2l6ZV90IHNpemUgPSBwc2l6ZSgpIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbitcXHRib29sIG9rID0gdHJ1ZTtcXG4rXFx0Y2hhciAqcDtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRpZiAob3JkZXIpXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRwID0gYWxsb2NfYWxpZ25lZChzaXplKTtcXG4rXFx0KnAgPSAxO1xcbitcXG4rXFx0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgb3JkZXIsIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJvcmRlciAlZCBub3QgZGV0ZWN0ZWQgYWZ0ZXIgZmF1bHRcXFxcblxcXCIsIG9yZGVyKTtcXG4rXFx0XFx0b2sgPSBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0LyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyICovXFxuK1xcdGlmIChvcmRlciBcXHUwMDI2XFx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgb3JkZXIgLSAxLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIG9yZGVyLCBvcmRlciAtIDEpO1xcbitcXHRcXHRvayA9IGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKiBBIGxhcmdlIGZvbGlvIG11c3Qgbm90IHBhc3MgYXMgb3JkZXIgMCAqL1xcbitcXHRpZiAob3JkZXIgXFx1MDAyNlxcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKHAsIHNpemUsIDAsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyIDBcXFxcblxcXCIsIG9yZGVyKTtcXG4rXFx0XFx0b2sgPSBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0bXVubWFwKHAsIHNpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0KG9rLCBcXFwib3JkZXIgJWQgY2xhc3NpZmllZFxcXFxuXFxcIiwgb3JkZXIpO1xcbit9XFxuK1xcbitpbnQgbWFpbih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgb3JkZXJzO1xcbitcXHRpbnQgb3JkZXI7XFxuK1xcbitcXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xcbitcXG4rXFx0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcXFxuXFxcIik7XFxuK1xcbitcXHRwYWdlbWFwX2ZkID0gb3BlbihcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAocGFnZW1hcF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXFxcIik7XFxuK1xcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcXFxcblxcXCIpO1xcbitcXG4rXFx0b3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcXG4rXFx0aWYgKCFvcmRlcnMpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xcXFxuXFxcIik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSArIDEpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRjaGVja19vcmRlcigwKTtcXG4rXFx0Zm9yIChvcmRlciA9IDE7IG9yZGVyIFxcdTAwM2MgTlJfT1JERVJTOyBvcmRlcisrKSB7XFxuK1xcdFxcdGlmICghKG9yZGVycyBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXIpKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGNoZWNrX29yZGVyKG9yZGVyKTtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9maW5pc2hlZCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcXG5pbmRleCBlMjY0MmVjYTBkMDJiLi5kZjQyNmY5MjE4ZTcxIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcXG5AQCAtNjUsNyArNjUsNiBAQCBlbnVtIHtcXG4gI2RlZmluZSBITU1fUEFUSF9NQVggICAgNjRcXG4gI2RlZmluZSBOVElNRVNcXHRcXHQxMFxcbiBcXG4tI2RlZmluZSBBTElHTih4LCBhKSAoKCh4KSArIChhIC0gMSkpIFxcdTAwMjYgKH4oKGEpIC0gMSkpKVxcbiAvKiBKdXN0IHRoZSBmbGFncyB3ZSBuZWVkLCBjb3BpZWQgZnJvbSBtbS5oOiAqL1xcbiBcXG4gI2lmbmRlZiBGT0xMX1dSSVRFXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXFxuaW5kZXggZDc5MTdkY2UzYWJhYy4uY2E3M2Y5YWM4ZTliNiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xcbkBAIC0xODMsNiArMTgzLDEzIEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXFxuIFxcdH1cXG4gfVxcbiBcXG4rLyogQSBzdG9yZSB0byBlaXRoZXIgc2xlZXAga25vYiB3YWtlcyBraHVnZXBhZ2VkLCBzbyB3cml0ZSBvbmx5IG9uIGNoYW5nZSAqL1xcbitzdGF0aWMgdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcXG4re1xcbitcXHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcXG4rXFx0XFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xcbit9XFxuK1xcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4ge1xcbiBcXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFxcdTAwMjZzZXR0aW5ncy1cXHUwMDNla2h1Z2VwYWdlZDtcXG5AQCAtMTk4LDE1ICsyMDUsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXFxuIFxcdFxcdFxcdHNobWVtX2VuYWJsZWRfc3RyaW5nc1tzZXR0aW5ncy1cXHUwMDNlc2htZW1fZW5hYmxlZF0pO1xcbiBcXHR0aHBfd3JpdGVfbnVtKFxcXCJ1c2VfemVyb19wYWdlXFxcIiwgc2V0dGluZ3MtXFx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xcbiBcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9kZWZyYWdcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VkZWZyYWcpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1xcXCIsXFxuLVxcdFxcdFxcdGtodWdlcGFnZWQtXFx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbi1cXHRcXHRcXHRraHVnZXBhZ2VkLVxcdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX25vbmUpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zd2FwKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VwYWdlc190b19zY2FuKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvZGVmcmFnXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlZGVmcmFnKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4rXFx0XFx0ICAgICAgIGtodWdlcGFnZWQtXFx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4rXFx0XFx0ICAgICAgIGtodWdlcGFnZWQtXFx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX25vbmUpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VwYWdlc190b19zY2FuKTtcXG4gXFxuIFxcdGlmIChkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoWzBdKVxcbiBcXHRcXHR3cml0ZV9udW0oZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aCwgc2V0dGluZ3MtXFx1MDAzZXJlYWRfYWhlYWRfa2IpO1xcbkBAIC0yMzAsNiArMjM3LDQxIEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxcbiBcXHR9XFxuIH1cXG4gXFxuKy8qXFxuKyAqIFdhaXQgZm9yIGEgZnVsbCBraHVnZXBhZ2VkIHNjYW4gcGFzcyB0aGF0IHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsOiB0aGVcXG4rICogcGFzcyBpbiBwcm9ncmVzcyBtYXkgYWxyZWFkeSBoYXZlIHBhc3NlZCB0aGlzIG1tLCBzbyBmdWxsX3NjYW5zIGhhcyB0b1xcbisgKiBhZHZhbmNlIHR3aWNlLlxcbisgKlxcbisgKiBBIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGJ1dCBvbmUgbWFkZSB3aGlsZSBpdFxcbisgKiBpcyBzY2FubmluZyByYXRoZXIgdGhhbiBzbGVlcGluZyBpcyBsb3N0LCBzbyBrZWVwIHN0b3JpbmcgdW50aWwgdGhlIHBhc3NcXG4rICogbGFuZHMuXFxuKyAqXFxuKyAqIE9uZSB3YWtlIGlzIG9uZSBwYXNzIG9ubHkgaWYgcGFnZXNfdG9fc2NhbiBjb3ZlcnMgZXZlcnkgbW0gb24gdGhlIGxpc3QuXFxuKyAqL1xcbitib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBkZWFkbGluZV9tcyA9IHRpbWVvdXRfcyAqIDEwMDBVTDtcXG4rXFx0dW5zaWduZWQgbG9uZyBlbGFwc2VkX21zID0gMCwgcG9sbF9tcyA9IDEwO1xcbitcXHR1bnNpZ25lZCBsb25nIHNsZWVwX21zO1xcbitcXHRpbnQgcGFzcztcXG4rXFxuK1xcdHNsZWVwX21zID0gdGhwX3JlYWRfbnVtKFxcXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXFxcIik7XFxuK1xcdGZvciAocGFzcyA9IDA7IHBhc3MgXFx1MDAzYyAyOyBwYXNzKyspIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxcbitcXHRcXHRcXHR0aHBfcmVhZF9udW0oXFxcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1xcXCIpICsgMTtcXG4rXFxuK1xcdFxcdHdoaWxlICh0aHBfcmVhZF9udW0oXFxcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1xcXCIpIFxcdTAwM2MgdGFyZ2V0KSB7XFxuK1xcdFxcdFxcdGlmIChlbGFwc2VkX21zIFxcdTAwM2U9IGRlYWRsaW5lX21zKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdFxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBzbGVlcF9tcyk7XFxuK1xcdFxcdFxcdHVzbGVlcChwb2xsX21zICogMTAwMCk7XFxuK1xcdFxcdFxcdGVsYXBzZWRfbXMgKz0gcG9sbF9tcztcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbiBzdHJ1Y3QgdGhwX3NldHRpbmdzICp0aHBfY3VycmVudF9zZXR0aW5ncyh2b2lkKVxcbiB7XFxuIFxcdGlmICghc2V0dGluZ3NfaW5kZXgpIHtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcXG5pbmRleCA3MjZjNzNjNDNjMDViLi4yZWExNjlkMTE3OTYyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXFxuQEAgLTgzLDEwICs4MywyMSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZClcXG4gXFx0aHVnZXBhZ2Vfc2F2ZV9zZXR0aW5ncygvKiB0aHAgPSAqLyB0cnVlLCAvKiBodWdldGxiID0gKi8gZmFsc2UpO1xcbiB9XFxuIFxcbitib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpO1xcbitcXG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcXG4gdW5zaWduZWQgbG9uZyB0aHBfc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcXG4gdW5zaWduZWQgbG9uZyB0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcXG4gXFxuKy8qXFxuKyAqIFRoZSBwZXItb3JkZXIgc2htZW1fZW5hYmxlZCBhdHRyaWJ1dGUgaXMgY3JlYXRlZCBmb3IgdGhlIG9yZGVycyB0aGUgcGFnZVxcbisgKiBjYWNoZSBjYW4gaG9sZCwgbm90IGp1c3QgZm9yIHNobWVtLCBzbyBpdCBhbnN3ZXJzIGZvciByZWd1bGFyIGZpbGVzIHRvby5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfZmlsZV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCk7XFxuK31cXG4rXFxuIGJvb2wgdGhwX2F2YWlsYWJsZSh2b2lkKTtcXG4gYm9vbCB0aHBfaXNfZW5hYmxlZCh2b2lkKTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xcbmluZGV4IGY4MjY3M2Y1ZjZiNDcuLjMzNWY5NDZlY2E2MWUgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXFxuQEAgLTMxLDYgKzMxLDExIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcXG4gc3RhdGljIGludCBocGFnZV9wbWRfbnI7XFxuIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjtcXG4gc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcjtcXG4rc3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfc2V0O1xcbitzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyc1tOUl9PUkRFUlNdO1xcbitzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVycztcXG4rc3RhdGljIGludCBwYWdlbWFwX2ZkID0gLTE7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZCA9IC0xO1xcbiBcXG4gI2RlZmluZSBQSURfU01BUFMgXFxcIi9wcm9jL3NlbGYvc21hcHNcXFwiXFxuICNkZWZpbmUgVEVTVF9GSUxFIFxcXCJjb2xsYXBzZV90ZXN0X2ZpbGVcXFwiXFxuQEAgLTIyMCw2ICsyMjUsMjkgQEAgc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXFxuIFxcdHJldHVybiBzd2FwO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCBzd2Fwb3V0X3JhbmdlKHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcXG4re1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdC8qIGtlZXAga2h1Z2VwYWdlZCBmcm9tIGNvbGxhcHNpbmcgdGhlIHJhbmdlIGFuZCBzd2FwcGluZyBpdCBiYWNrIGluICovXFxuK1xcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfTk9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX05PSFVHRVBBR0UpXFxcIik7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBSZXRyeSBzZXZlcmFsIHRpbWVzIGJlY2F1c2UgTUFEVl9QQUdFT1VUIGlzIGJlc3QgZWZmb3J0LiAgU2xlZXBcXG4rXFx0ICogYmV0d2VlbiB0aGUgcmV0cmllcyB0byBnaXZlIG91dHN0YW5kaW5nIHdyaXRlYmFjayBhIGNoYW5jZSB0b1xcbitcXHQgKiBmaW5pc2guXFxuK1xcdCAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgNDA7IGkrKykge1xcbitcXHRcXHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX1BBR0VPVVQpKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbitcXHRcXHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcXG4rXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdFxcdHVzbGVlcCg1MCAqIDEwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgKmFsbG9jX21hcHBpbmcoaW50IG5yKVxcbiB7XFxuIFxcdHZvaWQgKnA7XFxuQEAgLTUxMCw4ICs1MzgsOCBAQCBzdGF0aWMgYm9vbCBpc19hbm9uKHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXFxuIFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgbWVtX29wcyAqb3BzLCBib29sIGV4cGVjdClcXG4ge1xcbi1cXHRpbnQgcmV0O1xcbiBcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XFxuK1xcdGludCByZXQsIGk7XFxuIFxcbiBcXHRrc2Z0X3ByaW50X21zZyhcXFwiJXMuLi5cXFwiLCBtc2cpO1xcbiBcXG5AQCAtNTI0LDkgKzU1MiwxNiBAQCBzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxcbiBcXHQvKlxcbiBcXHQgKiBQcmV2ZW50IGtodWdlcGFnZWQgaW50ZXJmZXJlbmNlIGFuZCB0ZXN0cyB0aGF0IE1BRFZfQ09MTEFQU0VcXG4gXFx0ICogaWdub3JlcyAvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9lbmFibGVkXFxuK1xcdCAqXFxuK1xcdCAqIFxcXCJpbmhlcml0XFxcIiByYXRoZXIgdGhhbiBcXFwibmV2ZXJcXFwiIHNvIHRoYXQgTUFEVl9DT0xMQVBTRSBvbiBzaG1lbSBzdGlsbFxcbitcXHQgKiBmaW5kcyBhbiBvcmRlciB0byBidWlsZC5cXG4gXFx0ICovXFxuIFxcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSO1xcbiBcXHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKykge1xcbitcXHRcXHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xcbitcXHRcXHRzZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFNITUVNX0lOSEVSSVQ7XFxuK1xcdH1cXG4gXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4gXFxuIFxcdC8qIENsZWFyIFZNX05PSFVHRVBBR0UgKi9cXG5AQCAtNTU2LDggKzU5MSwxMSBAQCBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgc2l6ZV90IGxlbixcXG4gXFx0XFx0aW50IG5yX2hwYWdlcywgaW50IGNvbGxhcF9vcmRlciwgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4ge1xcbiBcXHR1bnNpZ25lZCBsb25nIGhwYWdlX3NpemUgPSBwYWdlX3NpemUgXFx1MDAzY1xcdTAwM2MgY29sbGFwX29yZGVyO1xcbi1cXHRpbnQgZnVsbF9zY2FucztcXG4tXFx0aW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi9cXG4rXFx0dW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3NpemU7XFxuK1xcdGludCB0aW1lb3V0LCBmdWxsX3NjYW5zO1xcbitcXG4rXFx0LyogSGFsZi1zZWNvbmQgdGlja3M6IHRocmVlIHNlY29uZHMgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gKi9cXG4rXFx0dGltZW91dCA9IDYgKyAyICogKGJ5dGVzIC8gKDEyOFVMIFxcdTAwM2NcXHUwMDNjIDIwKSk7XFxuIFxcbiBcXHQvKiBTYW5pdHkgY2hlY2sgKi9cXG4gXFx0aWYgKCFvcHMtXFx1MDAzZWNoZWNrX2h1Z2UocCwgbGVuLCAwLCBocGFnZV9zaXplKSlcXG5AQCAtODIwLDEyICs4NTgsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2Vfc3dhcGluX3NpbmdsZV9wdGUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BcXG4gXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuIFxcbiBcXHRrc2Z0X3ByaW50X21zZyhcXFwiU3dhcG91dCBvbmUgcGFnZS4uLlxcXCIpO1xcbi1cXHRpZiAobWFkdmlzZShwLCBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXFxuLVxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX1BBR0VPVVQpXFxcIik7XFxuLVxcdGlmIChjaGVja19zd2FwKHAsIHBhZ2Vfc2l6ZSkpIHtcXG4rXFx0aWYgKHN3YXBvdXRfcmFuZ2UocCwgcGFnZV9zaXplKSkge1xcbiBcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcdFxcdHNraXAoXFxcIkNvdWxkIG5vdCBzd2FwIG91dFxcXCIpO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG5AQCAtODQ2LDEyICs4ODIsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cXG4gXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuIFxcbiBcXHRrc2Z0X3ByaW50X21zZyhcXFwiU3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlxcXCIsIG1heF9wdGVzX3N3YXAgKyAxLCBocGFnZV9wbWRfbnIpO1xcbi1cXHRpZiAobWFkdmlzZShwLCAobWF4X3B0ZXNfc3dhcCArIDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxcbi1cXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbi1cXHRpZiAoY2hlY2tfc3dhcChwLCAobWF4X3B0ZXNfc3dhcCArIDEpICogcGFnZV9zaXplKSkge1xcbitcXHRpZiAoc3dhcG91dF9yYW5nZShwLCAobWF4X3B0ZXNfc3dhcCArIDEpICogcGFnZV9zaXplKSkge1xcbiBcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcdFxcdHNraXAoXFxcIkNvdWxkIG5vdCBzd2FwIG91dFxcXCIpO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG5AQCAtODYzLDEyICs4OTcsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cXG4gXFx0XFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuIFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXFxcIiwgbWF4X3B0ZXNfc3dhcCxcXG4gXFx0XFx0ICAgICAgIGhwYWdlX3BtZF9ucik7XFxuLVxcdFxcdGlmIChtYWR2aXNlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXFxuLVxcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX1BBR0VPVVQpXFxcIik7XFxuLVxcdFxcdGlmIChjaGVja19zd2FwKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUpKSB7XFxuK1xcdFxcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUpKSB7XFxuIFxcdFxcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuIFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFx0XFx0XFx0c2tpcChcXFwiQ291bGQgbm90IHN3YXAgb3V0XFxcIik7XFxuIFxcdFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRcXHR9XFxuIFxcbkBAIC05MzUsNiArOTY3LDE2IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbXBvdW5kX2V4dHJlbWUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXFxuIFxcdHZvaWQgKnA7XFxuIFxcdGludCBpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogVGhpcyBuZWVkcyBocGFnZV9wbWRfbnIgUE1ELW9yZGVyIGFsbG9jYXRpb25zIGluIGEgcm93LCB3aGljaCB0aGVcXG4rXFx0ICogYWxsb2NhdG9yIHdpbGwgbm90IHN1cHBseSBpZiB0aGUgUE1EIGlzIHZlcnkgbGFyZ2UuXFxuK1xcdCAqL1xcbitcXHRpZiAoaHBhZ2VfcG1kX3NpemUgXFx1MDAzZSAoMzJVTCBcXHUwMDNjXFx1MDAzYyAyMCkpIHtcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFxcXCIlczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBfX2Z1bmNfXyk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4gXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4gXFx0a3NmdF9wcmludF9tc2coXFxcIkNvbnN0cnVjdCBQVEUgcGFnZSB0YWJsZSBmdWxsIG9mIGRpZmZlcmVudCBQVEUtbWFwcGVkIGNvbXBvdW5kIHBhZ2VzXFxcXG5cXFwiKTtcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGhwYWdlX3BtZF9ucjsgaSsrKSB7XFxuQEAgLTExMjUsNiArMTE2NywxMDMgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xcbiBcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIFRoZSBwYXJlbnQgd3JpdGVzIHRvIHRoZSBmb3JrLXNoYXJlZCByYW5nZSB0aHJvdWdob3V0IHRoZSBjaGlsZCdzXFxuKyAqIGNvbGxhcHNlLiAgQ29XIG11c3Qga2VlcCB0aGUgdHdvIGFwYXJ0OiB0aGUgY2hpbGQgc2VlcyB0aGUgcHJlLWZvcmtcXG4rICogY29udGVudCwgdGhlIHBhcmVudCBvbmx5IGl0cyBvd24gd3JpdGVzLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRjb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7XFxuK1xcdGludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG47XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2hhcmVkO1xcbitcXHR2b2xhdGlsZSBpbnQgKmlwO1xcbitcXHRwaWRfdCBjaGlsZDtcXG4rXFx0aW50IHN5bmNbMl07XFxuK1xcdGNoYXIgZ28gPSAxO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0LyogQXQgYSBwYWdlIHBlciAxMCBtcywgNjQgcGFnZXMgc3ByZWFkIHRoZSB3cml0ZXMgYWNyb3NzIHRoZSBjb2xsYXBzZSAqL1xcbitcXHRuID0gNjQ7XFxuK1xcdHNoYXJlZCA9IG4gKiBwYWdlX3NpemU7XFxuK1xcbitcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHQvKiBTaGFyZWQgcHJlZml4LCB3aXRoIHRoZSBwcmUtZm9yayBwYXR0ZXJuICovXFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgc2hhcmVkKTtcXG4rXFx0aWYgKHBpcGUoc3luYykpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwicGlwZSgpXFxcIik7XFxuK1xcbitcXHQvKiBBIHZvbGF0aWxlIHBvaW50ZXIgc28gdGhlIHN0b3JlcyBhcmUgbm90IG1lcmdlZCBvciBkcm9wcGVkICovXFxuK1xcdGlwID0gcDtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLlxcXCIpO1xcbitcXHRjaGlsZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFjaGlsZCkge1xcbitcXHRcXHRpbnQgY29sbGFwc2Vfc3RhdHVzO1xcbitcXG4rXFx0XFx0Y2xvc2Uoc3luY1swXSk7XFxuK1xcdFxcdC8qIFByaXZhdGUgcmVtYWluZGVyICovXFxuK1xcdFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgc2hhcmVkLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdFxcdC8qIFN0YXJ0IHRoZSBwYXJlbnQgdW5zaGFyaW5nLCBhbmQgZ2l2ZSBpdCBhIGhlYWQgc3RhcnQgKi9cXG4rXFx0XFx0aWYgKHdyaXRlKHN5bmNbMV0sIFxcdTAwMjZnbywgMSkgIT0gMSlcXG4rXFx0XFx0XFx0X2V4aXQoS1NGVF9GQUlMKTtcXG4rXFx0XFx0dXNsZWVwKDUwMDApO1xcbitcXHRcXHRjLVxcdTAwM2Vjb2xsYXBzZShcXFwiQ29sbGFwc2UgYSByYW5nZSB0aGUgcGFyZW50IGlzIHdyaXRpbmcgdG9cXFwiLFxcbitcXHRcXHRcXHQgICAgcCwgMSwgb3BzLCB0cnVlKTtcXG4rXFx0XFx0Y29sbGFwc2Vfc3RhdHVzID0gZXhpdF9zdGF0dXM7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuOyBpKyspXFxuK1xcdFxcdFxcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICsgMHhkZWFkMDAwMClcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGlmIChpID09IG4pXFxuK1xcdFxcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0ZmFpbChcXFwiRmFpbDogY2hpbGQgY29udGVudFxcXCIpO1xcbitcXHRcXHQvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlICovXFxuK1xcdFxcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXFxuK1xcdFxcdFxcdGV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzO1xcbitcXHRcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdFxcdF9leGl0KGV4aXRfc3RhdHVzKTtcXG4rXFx0fVxcbitcXG4rXFx0Y2xvc2Uoc3luY1sxXSk7XFxuK1xcdGlmIChyZWFkKHN5bmNbMF0sIFxcdTAwMjZnbywgMSkgIT0gMSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJjaGlsZCBuZXZlciByZWFjaGVkIHRoZSBjb2xsYXBzZVxcXFxuXFxcIik7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBVbnNoYXJlIG9uZSBwYWdlIGF0IGEgdGltZTogYSBidXJzdCB3b3VsZCBicmVhayBDb1cgb24gdGhlIHdob2xlXFxuK1xcdCAqIHJhbmdlIGJlZm9yZSB0aGUgY29sbGFwc2Ugc3RhcnRzLCBsZWF2aW5nIG5vdGhpbmcgc2hhcmVkIHRvIGNvbGxhcHNlLlxcbitcXHQgKi9cXG4rXFx0aSA9IDA7XFxuK1xcdGZvciAoOzspIHtcXG4rXFx0XFx0aWYgKGkgXFx1MDAzYyBuKVxcbitcXHRcXHRcXHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xcbitcXHRcXHRpKys7XFxuK1xcdFxcdHVzbGVlcCgxMCAqIDEwMDApO1xcbitcXHRcXHRpZiAod2FpdHBpZChjaGlsZCwgXFx1MDAyNndzdGF0dXMsIFdOT0hBTkcpKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0LyogRmluaXNoIHdoYXRldmVyIHRoZSBwYWNlZCBzd2VlcCBkaWQgbm90IHJlYWNoICovXFxuK1xcdGZvciAoOyBpIFxcdTAwM2MgbjsgaSsrKVxcbitcXHRcXHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xcbitcXHQvKiBBIGNoaWxkIHRoYXQgZGllZCByZWFkaW5nIHRoZSByYWNpbmcgcGFnZXMgaXMgYSBmYWlsdXJlLCBub3QgYSB6ZXJvICovXFxuK1xcdGNoaWxkX3N0YXR1cyA9IFdJRkVYSVRFRCh3c3RhdHVzKSA/IFdFWElUU1RBVFVTKHdzdGF0dXMpIDogS1NGVF9GQUlMO1xcbitcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIkNoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uXFxcIik7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuOyBpKyspXFxuK1xcdFxcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICsgMHhiZWVmMDAwMClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdGlmIChpID09IG4pXFxuK1xcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZmFpbChcXFwiRmFpbDogcGFyZW50IGNvbnRlbnRcXFwiKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHQvKiBUaGUgcGFyZW50J3MgY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQncyB2ZXJkaWN0ICovXFxuK1xcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXFxuK1xcdFxcdGV4aXRfc3RhdHVzID0gY2hpbGRfc3RhdHVzO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4ge1xcbkBAIC0xMTcwLDYgKzEzMDksMjAwIEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbiBcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuIH1cXG4gXFxuKy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgd2lsbCBjb25zaWRlciBmb3IgbVRIUCBjb2xsYXBzZSAqL1xcbisjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcXG4rXFxuKy8qIFRpbWUgYnVkZ2V0IGZvciBvbmUga2h1Z2VwYWdlZCBwYXNzIGluIHRoZSBjb2xsYXBzZV9vcmRlcl8qIGNhc2VzICovXFxuKyNkZWZpbmUgTVRIUF9QQVNTX1RJTUVPVVRfUyAzMFxcbitcXG4rc3RhdGljIHNpemVfdCBtdGhwX3dpbmRvd19zaXplKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIHBhZ2Vfc2l6ZSBcXHUwMDNjXFx1MDAzYyBjb2xsYXBzZV9vcmRlcjtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgbXRocF9wdXNoX3RhcmdldF9vcmRlcih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBPbmx5IHRoZSB0YXJnZXQgb3JkZXIsIGFuZCBvbmx5IGZvciBtYWR2aXNlOiB0aGUgY2FzZXMgZmF1bHQgdGhlaXJcXG4rXFx0ICogcmVnaW9uIGZpcnN0LCBzbyB0aGUgc291cmNlcyBzdGF5IG9yZGVyIDAgd2hhdGV2ZXIgLXMgYXNrZWQgZm9yLlxcbitcXHQgKi9cXG4rXFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdHNldHRpbmdzLmh1Z2VwYWdlc1tjb2xsYXBzZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBhbGxfd2luZG93c19hdF9vcmRlcih2b2lkICpwLCBzaXplX3QgbGVuKVxcbit7XFxuK1xcdHJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgbGVuLCBjb2xsYXBzZV9vcmRlcixcXG4rXFx0XFx0XFx0XFx0XFx0cGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGFueV93aW5kb3dfYXRfb3JkZXIodm9pZCAqcCwgc2l6ZV90IGxlbilcXG4re1xcbitcXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xcbitcXHRjaGFyICphZGRyID0gcDtcXG4rXFxuK1xcdGZvciAoOyBsZW4gXFx1MDAzZT0gd2luZG93OyBhZGRyICs9IHdpbmRvdywgbGVuIC09IHdpbmRvdykge1xcbitcXHRcXHRpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIoYWRkciwgd2luZG93KSlcXG4rXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbitcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xcbitcXHRpZiAoYW55X3dpbmRvd19hdF9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcXFxuXFxcIik7XFxuK1xcbitcXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVxcXCIpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcXG4rXFx0XFx0ZmFpbChcXFwiVGltZW91dFxcXCIpO1xcbitcXHRlbHNlIGlmIChhbGxfd2luZG93c19hdF9vcmRlcihwICsgd2luZG93LCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwLCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwICsgMiAqIHdpbmRvdyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgaHBhZ2VfcG1kX3NpemUgLSAyICogd2luZG93KSlcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcbitcXHR2YWxpZGF0ZV9tZW1vcnkocCwgd2luZG93LCAyICogd2luZG93KTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xcbitcXHRpZiAoYW55X3dpbmRvd19hdF9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcXFxuXFxcIik7XFxuK1xcbitcXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVxcXCIpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXFxcIik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgbXRocF93aW5kb3dfc2l6ZSgpKSlcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcbitcXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4rXFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcXG4rXFx0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDtcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XFxuK1xcdGlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxcXG5cXFwiKTtcXG4rXFxuK1xcdGlmIChtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXFxcIik7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcXG4rXFx0XFx0ZmFpbChcXFwiVGltZW91dFxcXCIpO1xcbitcXHRlbHNlIGlmIChhbGxfd2luZG93c19hdF9vcmRlcihwLCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwICsgd2luZG93LCB3aW5kb3cpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbitcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRpbnQgc291cmNlX29yZGVyID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgOiBNSU5fTVRIUF9PUkRFUjtcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdGlmIChzb3VyY2Vfb3JkZXIgXFx1MDAzZT0gY29sbGFwc2Vfb3JkZXIgfHxcXG4rXFx0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2Mgc291cmNlX29yZGVyKSkpIHtcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFxcXCIlczogbm8gc3VwcG9ydGVkIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIF9fZnVuY19fKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XFxuK1xcbitcXHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xcbitcXHRzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBhbGxvY2F0b3IgY2FuIGZhbGwgYmFjayB0byBzbWFsbGVyIGZvbGlvcyB1bmRlciBmcmFnbWVudGF0aW9uO1xcbitcXHQgKiBoYXZpbmcgbm90aGluZyB0byBjb2xsYXBzZSBmcm9tIGlzIG5vdCBhIGZhaWx1cmUuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiTm8gb3JkZXItJWQgc291cmNlcyB0byBjb2xsYXBzZS4uLlxcXCIsIHNvdXJjZV9vcmRlcik7XFxuK1xcdFxcdHNraXAoXFxcIlNraXBcXFwiKTtcXG4rXFx0XFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVxcXCIpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXFxcIixcXG4rXFx0XFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdG9wcy1cXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuIHtcXG4gXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJcXFxcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdIFxcdTAwM2N0ZXN0IHR5cGVcXHUwMDNlIFtkaXJdXFxcXG5cXFxcblxcXCIpO1xcbkBAIC0xMTg3LDExICsxNTIwLDE0IEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuIFxcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0LXM6IG1USFAgc2l6ZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxcXG5cXFwiKTtcXG4gXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXFxcblxcXCIpO1xcbiBcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdC1jOiBjb2xsYXBzZSBvcmRlciBmb3IgbVRIUCBjb2xsYXBzZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxcXG5cXFwiKTtcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgRGVmYXVsdHMgdG8gZXZlcnkgc3VwcG9ydGVkIG9yZGVyIGJlbG93IHRoZSBQTUQuXFxcXG5cXFwiKTtcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgLXMsIGlmIHNldCwgaXMgdGhlIHNvdXJjZSBvcmRlciBmb3IgdGhlIG1peGVkLXNvdXJjZSBjYXNlLlxcXFxuXFxcIik7XFxuIFxcdGV4aXQoMSk7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIHtcXG4rXFx0Ym9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlO1xcbiBcXHRpbnQgb3B0O1xcbiBcXHRjaGFyICpidWY7XFxuIFxcdGNvbnN0IGNoYXIgKnRva2VuO1xcbkBAIC0xMjAzLDYgKzE1MzksNyBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0Y2FzZSAnYyc6XFxuIFxcdFxcdFxcdGNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpO1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcl9zZXQgPSB0cnVlO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0Y2FzZSAnaCc6XFxuIFxcdFxcdGRlZmF1bHQ6XFxuQEAgLTEyMTAsMTIgKzE1NDcsMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcbitcXHQvKlxcbitcXHQgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyXFxuK1xcdCAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGFub25fb3JkZXIgXFx1MDAzYyAwIHx8IGFub25fb3JkZXIgXFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiLXMgdGFrZXMgYW4gb3JkZXIgaW4gMC4uJWQsIG5vdCAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTtcXG4rXFx0aWYgKGNvbGxhcHNlX29yZGVyX3NldCBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgKGNvbGxhcHNlX29yZGVyIFxcdTAwM2M9IDAgfHwgY29sbGFwc2Vfb3JkZXIgXFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCItYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBocGFnZV9wbWRfb3JkZXIgLSAxLCBjb2xsYXBzZV9vcmRlcik7XFxuK1xcbiBcXHRhcmd2ICs9IG9wdGluZDtcXG4gXFx0YXJnYyAtPSBvcHRpbmQ7XFxuIFxcbiBcXHRpZiAoYXJnYyA9PSAwKSB7XFxuLVxcdFxcdC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovXFxuK1xcdFxcdC8qIE5vIGFyZ3VtZW50czogYW5vbiB1bmRlciBldmVyeSBjb250ZXh0ICovXFxuIFxcdFxcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XFxuK1xcdFxcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xcbiBcXHRcXHRtYWR2aXNlX2NvbnRleHQgPSAgXFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xcbiBcXHRcXHRhbm9uX29wcyA9IFxcdTAwMjZfX2Fub25fb3BzO1xcbiBcXHRcXHRyZXR1cm47XFxuQEAgLTEyMjYsMTMgKzE1NzYsMTQgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFxuIFxcdGlmICghc3RyY21wKHRva2VuLCBcXFwiYWxsXFxcIikpIHtcXG4gXFx0XFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XFxuIFxcdFxcdG1hZHZpc2VfY29udGV4dCA9ICBcXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XFxuK1xcdFxcdC8qIFRoZSBtVEhQIGNvbnRleHQgaGFzIG9ubHkgYW5vbiBjYXNlczsgbGV0IG90aGVyIG1lbV90eXBlcyBkcm9wIGl0ICovXFxuK1xcdFxcdG10aHBfY29udGV4dF9pbXBsaWVkID0gdHJ1ZTtcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcXFwia2h1Z2VwYWdlZFxcXCIpKSB7XFxuIFxcdFxcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXFxcIm10aHBfa2h1Z2VwYWdlZFxcXCIpKSB7XFxuIFxcdFxcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xcbi1cXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzYz0gMCB8fCBjb2xsYXBzZV9vcmRlciBcXHUwMDNlPSBocGFnZV9wbWRfb3JkZXIpXFxuLVxcdFxcdFxcdHVzYWdlKCk7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXFxcIm1hZHZpc2VcXFwiKSkge1xcbiBcXHRcXHRtYWR2aXNlX2NvbnRleHQgPSAgXFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xcbiBcXHR9IGVsc2Uge1xcbkBAIC0xMjQ4LDIwICsxNTk5LDIwIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcztcXG4gXFx0XFx0YW5vbl9vcHMgPSBcXHUwMDI2X19hbm9uX29wcztcXG4gXFx0XFx0c2htZW1fb3BzID0gXFx1MDAyNl9fc2htZW1fb3BzO1xcbi1cXHRcXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXFxuLVxcdFxcdFxcdHVzYWdlKCk7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFxcXCJhbm9uXFxcIikpIHtcXG4gXFx0XFx0YW5vbl9vcHMgPSBcXHUwMDI2X19hbm9uX29wcztcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXFxcImZpbGVcXFwiKSkge1xcbiBcXHRcXHRyZWFkX29ubHlfZmlsZV9vcHMgPSAgXFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xcbiBcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzO1xcbiBcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gIFxcdTAwMjZfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7XFxuLVxcdFxcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcXG4rXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFxcdTAwMjZcXHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcXG4gXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xcbiBcXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcXFwic2htZW1cXFwiKSkge1xcbiBcXHRcXHRzaG1lbV9vcHMgPSBcXHUwMDI2X19zaG1lbV9vcHM7XFxuLVxcdFxcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcXG4rXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFxcdTAwMjZcXHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcXG4gXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHR1c2FnZSgpO1xcbiBcXHR9XFxuQEAgLTEyODMsOSArMTYzNCwxMCBAQCBzdHJ1Y3QgdGVzdF9jYXNlIHtcXG4gXFx0c3RydWN0IG1lbV9vcHMgKm9wcztcXG4gXFx0Y29uc3QgY2hhciAqZGVzYztcXG4gXFx0dGVzdF9mbiBmbjtcXG4rXFx0aW50IG9yZGVyO1xcdFxcdC8qIG1USFAgY29udGV4dHM6IHRoZSBjb2xsYXBzZSBvcmRlciAqL1xcbiB9O1xcbiBcXG4tI2RlZmluZSBNQVhfVEVTVF9DQVNFUyA2NFxcbisjZGVmaW5lIE1BWF9URVNUX0NBU0VTIDI1NlxcbiBzdGF0aWMgc3RydWN0IHRlc3RfY2FzZSB0ZXN0X2Nhc2VzW01BWF9URVNUX0NBU0VTXTtcXG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xcbiBcXG5AQCAtMTI5OCw2ICsxNjUwLDcgQEAgc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xcbiBcXHRcXHRcXHQub3BzXFx0PSBvLFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4gXFx0XFx0XFx0LmRlc2NcXHQ9ICN0LFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4gXFx0XFx0XFx0LmZuXFx0PSB0LFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0Lm9yZGVyXFx0PSBjb2xsYXBzZV9vcmRlcixcXHRcXHRcXHRcXFxcXFxuIFxcdFxcdH07XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHR9XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHR9IHdoaWxlICgwKVxcbkBAIC0xMzM4LDggKzE2OTEsNjYgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXG4gXFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xcbiBcXG4rXFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgb3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcXG4rXFxuK1xcdFxcdGlmIChjb2xsYXBzZV9vcmRlcl9zZXQpIHtcXG4rXFx0XFx0XFx0aWYgKCEob3JkZXJzIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIpO1xcbitcXHRcXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzYz0gYW5vbl9vcmRlcilcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIi1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gY29sbGFwc2Vfb3JkZXI7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIEV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBhYm92ZSB0aGUgc291cmNlOiAtcyBtYWtlcyB0aGVcXG4rXFx0XFx0XFx0ICogZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlciwgc28gYSB0YXJnZXRcXG4rXFx0XFx0XFx0ICogYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2UuXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRpbnQgZmlyc3QgPSBhbm9uX29yZGVyICsgMTtcXG4rXFxuK1xcdFxcdFxcdGlmIChmaXJzdCBcXHUwMDNjIE1JTl9NVEhQX09SREVSKVxcbitcXHRcXHRcXHRcXHRmaXJzdCA9IE1JTl9NVEhQX09SREVSO1xcbitcXHRcXHRcXHRmb3IgKGludCBpID0gZmlyc3Q7IGkgXFx1MDAzYyBocGFnZV9wbWRfb3JkZXI7IGkrKykge1xcbitcXHRcXHRcXHRcXHRpZiAob3JkZXJzIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSlcXG4rXFx0XFx0XFx0XFx0XFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycysrXSA9IGk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0aWYgKCFucl9jb2xsYXBzZV9vcmRlcnMpXFxuK1xcdFxcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJtVEhQIGNhc2VzIHNraXBwZWQ6IG5vIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2VcXFxcblxcXCIpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xcbitcXHRcXHRwYWdlbWFwX2ZkID0gb3BlbihcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcIiwgT19SRE9OTFkpO1xcbitcXHRcXHRpZiAocGFnZW1hcF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXFxcIik7XFxuK1xcdFxcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwib3BlbigvcHJvYy9rcGFnZWZsYWdzKVxcXCIpO1xcbitcXHR9XFxuK1xcbiBcXHRzZXRidWYoc3Rkb3V0LCBOVUxMKTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFdpdGhvdXQgYSBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbyB0aGUga2VybmVsIHJlZnVzZXMgdGhlc2VcXG4rXFx0ICogY29sbGFwc2VzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuXFxuK1xcdCAqL1xcbitcXHRpZiAoISh0aHBfZmlsZV9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGhwYWdlX3BtZF9vcmRlcikpKSB7XFxuK1xcdFxcdGlmIChzaG1lbV9vcHMpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm5vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHNobWVtX29wcyA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKHJlYWRfb25seV9maWxlX29wcykge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xcbitcXHRcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSBOVUxMO1xcbitcXHRcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gTlVMTDtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoIWFub25fb3BzIFxcdTAwMjZcXHUwMDI2ICFzaG1lbV9vcHMgXFx1MDAyNlxcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcXG4rXFx0XFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIk5vIG1lbV90eXBlIGxlZnQgdG8gcnVuXFxcXG5cXFwiKTtcXG4rXFx0fVxcbitcXG4gXFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxO1xcbiBcXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc3dhcCA9IGhwYWdlX3BtZF9uciAvIDg7XFxuIFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyO1xcbkBAIC0xMzU3LDcgKzE3NjgsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTtcXG4tXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIG5yX2NvbGxhcHNlX29yZGVyczsgaSsrKSB7XFxuK1xcdFxcdGNvbGxhcHNlX29yZGVyID0gY29sbGFwc2Vfb3JkZXJzW2ldO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdH1cXG4rXFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG5AQCAtMTM2NSwxMSArMTc4Niw4IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7XFxuIFxcbiBcXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4tXFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcbi1cXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9tdGhwLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbi1cXG4gXFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xcbkBAIC0xNDI0LDYgKzE4NDIsOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXG4rXFx0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFxuIFxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcXG4gXFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG5AQCAtMTQzOSw3ICsxODYwLDE1IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBucl90ZXN0X2Nhc2VzOyBpKyspIHtcXG4gXFx0XFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFxcdTAwMjZ0ZXN0X2Nhc2VzW2ldO1xcbiBcXG4tXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIlxcXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcXFxuXFxcIiwgdC1cXHUwMDNlZGVzYywgdC1cXHUwMDNlY3R4LVxcdTAwM2VuYW1lLCB0LVxcdTAwM2VvcHMtXFx1MDAzZW5hbWUpO1xcbitcXHRcXHRpZiAodC1cXHUwMDNlY3R4ID09IFxcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XFxuK1xcdFxcdFxcdGNvbGxhcHNlX29yZGVyID0gdC1cXHUwMDNlb3JkZXI7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJcXFxcbiMgUnVuIHRlc3Q6ICVzICglczolcywgb3JkZXIgJWQpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdC1cXHUwMDNlZGVzYywgdC1cXHUwMDNlY3R4LVxcdTAwM2VuYW1lLCB0LVxcdTAwM2VvcHMtXFx1MDAzZW5hbWUsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB0LVxcdTAwM2VvcmRlcik7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJcXFxcbiMgUnVuIHRlc3Q6ICVzICglczolcylcXFxcblxcXCIsIHQtXFx1MDAzZWRlc2MsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB0LVxcdTAwM2VjdHgtXFx1MDAzZW5hbWUsIHQtXFx1MDAzZW9wcy1cXHUwMDNlbmFtZSk7XFxuK1xcdFxcdH1cXG4gXFx0XFx0dC1cXHUwMDNlZm4odC1cXHUwMDNlY3R4LCB0LVxcdTAwM2VvcHMpO1xcbiBcXHR9XFxuIFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5jMzQ3OGI1MTIzZTIzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXFxuQEAgLTAsMCArMSw1MzMgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogUmFjZSBjb2xsYXBzZSBhZ2FpbnN0IGZhdWx0cywgR1VQIHBpbnMsIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRFxcbisgKiBvdmVyIHRoZSBzYW1lIHJhbmdlcy4gIEEgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yIGFzXFxuKyAqIHplcm8sIG5ldmVyIGFueXRoaW5nIGVsc2U7IHRoZSBrZXJuZWwncyBvd24gYXNzZXJ0aW9ucyBpbiBkbWVzZyBhcmUgdGhlXFxuKyAqIG90aGVyIGhhbGYgb2YgdGhlIGNoZWNrLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZXJybm8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy90aW1lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwia3NlbGZ0ZXN0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ2bV91dGlsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJodWdlcGFnZV9zZXR0aW5ncy5oXFxcIlxcbisjaW5jbHVkZSBcXFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFxcXCJcXG4rXFxuKyNpZm5kZWYgRk9MTF9XUklURVxcbisjZGVmaW5lIEZPTExfV1JJVEUgMHgwMVxcbisjZW5kaWZcXG4rXFxuKyNkZWZpbmUgQkFTRV9BRERSXFx0KCh2b2lkICopKDFVTCBcXHUwMDNjXFx1MDAzYyAzMCkpXFxuKyNkZWZpbmUgUEFTU19USU1FT1VUX1NcXHQzMFxcbitcXG4rLypcXG4rICogUE1ELXNpemVkIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzaGFyZSwgcGx1cyBvbmUgZm9yIHRoZSBtcmVtYXBcXG4rICogdGhyZWFkLiAgLWEgc2hyaW5rcyBpdCB3aGVyZSBhIFBNRCBpcyA1MTJNLlxcbisgKi9cXG4rI2RlZmluZSBERUZBVUxUX1NIQVJFRF9BUkVBU1xcdDNcXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XFxuK3N0YXRpYyBpbnQgbnJfYXJlYXM7XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xcbisvKiBucl9hcmVhcyBQTUQtc2l6ZWQgYXJlYXM7IHRoZSBsYXN0IG9uZSBiZWxvbmdzIHRvIHRoZSBtcmVtYXAgdGhyZWFkICovXFxuK3N0YXRpYyBjaGFyICpyZWdpb247XFxuK3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTtcXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9zY3JhdGNoO1xcbitzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1xcbitzdGF0aWMgc2l6ZV90IHBhZ2VvdXRfc2l6ZTtcXG4rc3RhdGljIGludCBndXBfZmQgPSAtMTtcXG4rc3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xcbitzdGF0aWMgdm9sYXRpbGUgaW50IGNvcnJ1cHRlZDtcXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XFxuK1xcbitcXHRyZXR1cm4gdmFsID8gdmFsIDogMTtcXHQvKiBuZXZlciBjb2xsaWRlcyB3aXRoIHRoZSB6ZXJvLWZpbGwgKi9cXG4rfVxcbitcXG4rLyogWmVybyBtZWFucyBuZXZlciB3cml0dGVuOyBhbnl0aGluZyBlbHNlIG11c3QgYmUgdGhpcyBwYWdlJ3MgcGF0dGVybiAqL1xcbitzdGF0aWMgYm9vbCBwYWdlX2lzX2NvcnJ1cHQodW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgaW50ICp2YWwpXFxuK3tcXG4rXFx0KnZhbCA9ICoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcXG4rXFxuK1xcdHJldHVybiAqdmFsIFxcdTAwMjZcXHUwMDI2ICp2YWwgIT0gcGF0dGVybihwYWdlX2lkeCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeClcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgdmFsO1xcbitcXG4rXFx0aWYgKHBhZ2VfaXNfY29ycnVwdChwYWdlX2lkeCwgXFx1MDAyNnZhbCkpIHtcXG4rXFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hhcmVkX3BhZ2VzKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplO1xcbit9XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kX3BhZ2UodW5zaWduZWQgaW50ICpzZWVkKVxcbit7XFxuK1xcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTtcXG4rfVxcbitcXG4rLyogQ2xhbXAgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJ3MgYXJlYSAqL1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XFxuK1xcbitcXHRyZXR1cm4gd2FudCBcXHUwMDNjIGxlZnQgPyB3YW50IDogbGVmdDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgKmZhdWx0ZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXFx1MDAyNnNlZWQpO1xcbitcXG4rXFx0XFx0aWYgKHJhbmRfcihcXHUwMDI2c2VlZCkgXFx1MDAyNiAxKVxcbitcXHRcXHRcXHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPVxcbitcXHRcXHRcXHRcXHRwYXR0ZXJuKHBhZ2VfaWR4KTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRjaGVja19wYWdlKHBhZ2VfaWR4KTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFxcdTAwMjZzZWVkKTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBuciA9IDFVTCBcXHUwMDNjXFx1MDAzYyAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDYpO1xcdC8qIDEuLjMyIHBhZ2VzICovXFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBOb3cgYW5kIHRoZW4gemFwIGEgd2hvbGUgUE1ELWFsaWduZWQgYXJlYTogb25seSBhIHphcCB0aGF0XFxuK1xcdFxcdCAqIGNvdmVycyB0aGUgZnVsbCB0YWJsZSBmcmVlcyB0aGUgdGFibGUgaXRzZWxmIChDT05GSUdfUFRfUkVDTEFJTSkuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoIShyYW5kX3IoXFx1MDAyNnNlZWQpICUgNjQpKSB7XFxuK1xcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJlYSA9IHBhZ2VfaWR4IC9cXG4rXFx0XFx0XFx0XFx0XFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTtcXG4rXFxuK1xcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgYXJlYSAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUsXFxuK1xcdFxcdFxcdFxcdHJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLFxcbitcXHRcXHRcXHRcXHRNQURWX0RPTlRORUVEKTtcXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDUwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7fTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcXHUwMDI2c2VlZCk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgbnIgPSByb29tX2Zyb20ocGFnZV9pZHgsIDE2KTtcXG4rXFxuK1xcdFxcdGd1cC5hZGRyID0gKHVuc2lnbmVkIGxvbmcpKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcXG4rXFx0XFx0Z3VwLnNpemUgPSBuciAqIHBhZ2Vfc2l6ZTtcXG4rXFx0XFx0Z3VwLm5yX3BhZ2VzX3Blcl9jYWxsID0gbnI7XFxuK1xcdFxcdGd1cC5ndXBfZmxhZ3MgPSBGT0xMX1dSSVRFO1xcbitcXHRcXHQvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQgKi9cXG4rXFx0XFx0aW9jdGwoZ3VwX2ZkLCBQSU5fRkFTVF9CRU5DSE1BUkssIFxcdTAwMjZndXApO1xcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpmb3JrZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHBpZF90IHBpZCA9IGZvcmsoKTtcXG4rXFxuK1xcdFxcdGlmIChwaWQgPT0gMCkge1xcbitcXHRcXHRcXHR1bnNpZ25lZCBpbnQgdmFsO1xcbitcXHRcXHRcXHRpbnQgYmFkID0gMDtcXG4rXFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIE5vIHN0ZGlvIGluIHRoZSBjaGlsZDogYSB0aHJlYWQgbWF5IGhvbGQgc3Rkb3V0J3NcXG4rXFx0XFx0XFx0ICogbG9jayBhY3Jvc3MgdGhlIGZvcmssIGFuZCBwcmludGluZyB1bmRlciBpdCBoYW5ncy5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgMTY7IGkrKylcXG4rXFx0XFx0XFx0XFx0YmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoXFx1MDAyNnNlZWQpLCBcXHUwMDI2dmFsKTtcXG4rXFx0XFx0XFx0X2V4aXQoYmFkKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAocGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRpbnQgd3N0YXR1cztcXG4rXFxuK1xcdFxcdFxcdGlmICh3YWl0cGlkKHBpZCwgXFx1MDAyNndzdGF0dXMsIDApIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJ3YWl0cGlkKClcXFwiKTtcXG4rXFx0XFx0XFx0LyogQSBjaGlsZCBraWxsZWQgb24gdGhlIHJlYWQgY291bnRzIHRvbyAqL1xcbitcXHRcXHRcXHRpZiAoIVdJRkVYSVRFRCh3c3RhdHVzKSB8fCBXRVhJVFNUQVRVUyh3c3RhdHVzKSlcXG4rXFx0XFx0XFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHR2b2lkICpwO1xcbitcXG4rXFx0XFx0cCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpO1xcbitcXHRcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1yZW1hcCgpIGF3YXlcXFwiKTtcXG4rXFx0XFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyA4OyBpKyspXFxuK1xcdFxcdFxcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXFx1MDAyNnNlZWQpICVcXG4rXFx0XFx0XFx0XFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSkgKiBwYWdlX3NpemVdID0gMTtcXG4rXFx0XFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpO1xcbitcXHRcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1yZW1hcCgpIGJhY2tcXFwiKTtcXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDAwKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLypcXG4rICogU3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm4gb24gYSByZWdpb24gbm90aGluZyBlbHNlIHdyaXRlcywgc28gYSBwYWdlJ3NcXG4rICogcGF0dGVybiBtdXN0IHN1cnZpdmUgdGhlIHRyaXAgdGhyb3VnaCBzd2FwIGV4YWN0bHkuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucjsgaSsrKVxcbitcXHRcXHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XFxuK1xcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yIFxcdTAwMjZcXHUwMDI2ICFzdG9wOyBpKyspIHtcXG4rXFx0XFx0XFx0dW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSArXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XFxuK1xcbitcXHRcXHRcXHRpZiAodmFsICE9IHBhdHRlcm4oaSkpIHtcXG4rXFx0XFx0XFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIlBhZ2VvdXQgY29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisvKiBDb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIHdoaWxlIHRoZXkgYXJlIGJlaW5nIGdhdGhlcmVkICovXFxuK3N0YXRpYyB2b2lkICpjb21wYWN0b3JfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXHRpbnQgZmQgPSBvcGVuKFxcXCIvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnlcXFwiLCBPX1dST05MWSk7XFxuK1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJObyBjb21wYWN0X21lbW9yeTsgY29tcGFjdG9yIGlkbGVcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0aWYgKHdyaXRlKGZkLCBcXFwiMVxcXCIsIDEpIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHVzbGVlcCgxMDAwMCArIHJhbmRfcihcXHUwMDI2c2VlZCkgJSAxMDAwMDApO1xcbitcXHR9XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHN3YXBfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0Y2hhciBsaW5lWzI1Nl07XFxuK1xcdGludCBsaW5lcyA9IDA7XFxuK1xcdEZJTEUgKmZwID0gZm9wZW4oXFxcIi9wcm9jL3N3YXBzXFxcIiwgXFxcInJcXFwiKTtcXG4rXFxuK1xcdGlmICghZnApXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxcbitcXHRcXHRsaW5lcysrO1xcbitcXHRmY2xvc2UoZnApO1xcbitcXHRyZXR1cm4gbGluZXMgXFx1MDAzZSAxO1xcbit9XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGltZXZhbCB0djtcXG4rXFxuK1xcdGdldHRpbWVvZmRheShcXHUwMDI2dHYsIE5VTEwpO1xcbitcXHRyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICsgdHYudHZfdXNlYyAvIDEwMDA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuK3tcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFxuK1xcdFxcdFxcXCJVc2FnZToga2h1Z2VwYWdlZF9yYWNlIFstZCBzZWNvbmRzXSBbLW0gc3RlcHBlZHxmcmVlfG1hZHZpc2VdIFstYSBhcmVhc10gWy10IG1hc2tdXFxcXG5cXFwiXFxuK1xcdFxcdFxcXCJcXFxcdFdpdGhvdXQgLW0sIGV2ZXJ5IG1vZGUgcnVucyBpbiB0dXJuLlxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtZDogc2Vjb25kcyBwZXIgbW9kZSAoZGVmYXVsdCA1KVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtYTogbnVtYmVyIG9mIHNoYXJlZCBQTUQtc2l6ZWQgcGxheWdyb3VuZCBhcmVhcyAoZGVmYXVsdCAzKVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtdDogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCwgZm9yIGJpc2VjdGluZyBhIGZhaWx1cmVcXFxcblxcXCIpO1xcbitcXHRleGl0KDEpO1xcbit9XFxuK1xcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuK3tcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aHJlYWRfbmFtZXNbXSA9IHtcXG4rXFx0XFx0XFxcImZhdWx0ZXJcXFwiLCBcXFwiZmF1bHRlcjJcXFwiLCBcXFwiZG9udG5lZWRcXFwiLCBcXFwicGlubmVyXFxcIiwgXFxcImZvcmtlclxcXCIsXFxuK1xcdFxcdFxcXCJtcmVtYXBwZXJcXFwiLCBcXFwicGFnZW91dFxcXCIsIFxcXCJjb21wYWN0b3JcXFwiLFxcbitcXHR9O1xcbitcXHR2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHtcXG4rXFx0XFx0ZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLFxcbitcXHRcXHRtcmVtYXBwZXJfZm4sIHBhZ2VvdXRfZm4sIGNvbXBhY3Rvcl9mbixcXG4rXFx0fTtcXG4rXFx0ZW51bSB7IFRfRkFVTFRFUiwgVF9GQVVMVEVSMiwgVF9ET05UTkVFRCwgVF9QSU5ORVIsIFRfRk9SS0VSLFxcbitcXHQgICAgICAgVF9NUkVNQVBQRVIsIFRfUEFHRU9VVCwgVF9DT01QQUNUT1IgfTtcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCBcXHUwMDNjXFx1MDAzYyBUX1BBR0VPVVQ7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgY29tcGFjdG9yX2JpdCA9IDFVTCBcXHUwMDNjXFx1MDAzYyBUX0NPTVBBQ1RPUjtcXG4rXFx0Y29uc3QgaW50IG5yX3RocmVhZHMgPSBBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyk7XFxuK1xcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxsX21vZGVzW10gPSB7IFxcXCJzdGVwcGVkXFxcIiwgXFxcImZyZWVcXFwiLCBcXFwibWFkdmlzZVxcXCIgfTtcXG4rXFx0c3RhdGljIGNvbnN0IGJvb2wgb2NjdXBhbmNpZXNbXSA9IHsgZmFsc2UsIHRydWUgfTtcXHQvKiBzdHJpY3QsIGhvbGVzICovXFxuK1xcdHN0YXRpYyBjb25zdCBib29sIHByZXNzdXJlc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1xcdC8qIHF1aWV0LCB1bmRlciBwcmVzc3VyZSAqL1xcbitcXHRjb25zdCBpbnQgbnJfb2NjdXBhbmNpZXMgPSBBUlJBWV9TSVpFKG9jY3VwYW5jaWVzKTtcXG4rXFx0Y29uc3QgaW50IG5yX3ByZXNzdXJlcyA9IEFSUkFZX1NJWkUocHJlc3N1cmVzKTtcXG4rXFx0Y29uc3QgY2hhciAqb25lX21vZGVbMV07XFxuK1xcdGNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7XFxuK1xcdGludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTtcXG4rXFx0Y29uc3QgY2hhciAqbW9kZV9hcmcgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHR1bnNpZ25lZCBsb25nIGVuZF9tcztcXG4rXFx0aW50IGR1cmF0aW9uX3MgPSA1O1xcbitcXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcXG4rXFx0dW5zaWduZWQgbG9uZyBiYXNlX21hc2s7XFxuK1xcdGJvb2wgaGF2ZV9zd2FwO1xcbitcXHRjaGFyIGxhYmVsWzY0XTtcXG4rXFx0aW50IG5yX2FyZWFzX2FyZyA9IDA7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFx0aW50IHN0ZXBzID0gMDtcXG4rXFx0aW50IG9wdDtcXG4rXFxuK1xcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFxcXCJhOmQ6bTp0OmhcXFwiKSkgIT0gLTEpIHtcXG4rXFx0XFx0c3dpdGNoIChvcHQpIHtcXG4rXFx0XFx0Y2FzZSAnYSc6XFxuK1xcdFxcdFxcdG5yX2FyZWFzX2FyZyA9IGF0b2kob3B0YXJnKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ2QnOlxcbitcXHRcXHRcXHRkdXJhdGlvbl9zID0gYXRvaShvcHRhcmcpO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAnbSc6XFxuK1xcdFxcdFxcdG1vZGVfYXJnID0gb3B0YXJnO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAndCc6XFxuK1xcdFxcdFxcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0ZGVmYXVsdDpcXG4rXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRpZiAobW9kZV9hcmcpIHtcXG4rXFx0XFx0aWYgKHN0cmNtcChtb2RlX2FyZywgXFxcInN0ZXBwZWRcXFwiKSBcXHUwMDI2XFx1MDAyNiBzdHJjbXAobW9kZV9hcmcsIFxcXCJmcmVlXFxcIikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIHN0cmNtcChtb2RlX2FyZywgXFxcIm1hZHZpc2VcXFwiKSlcXG4rXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0b25lX21vZGVbMF0gPSBtb2RlX2FyZztcXG4rXFx0XFx0bW9kZXMgPSBvbmVfbW9kZTtcXG4rXFx0XFx0bnJfbW9kZXMgPSAxO1xcbitcXHR9XFxuK1xcbitcXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xcbitcXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XFxuK1xcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcXG4rXFx0aWYgKCFocGFnZV9wbWRfc2l6ZSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXG4rXFx0Z3VwX2ZkID0gb3BlbihcXFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcXFwiLCBPX1JEV1IpO1xcbitcXHRpZiAoZ3VwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIi9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0IHJlcXVpcmVzIENPTkZJR19HVVBfVEVTVCBhbmQgcm9vdFxcXFxuXFxcIik7XFxuK1xcbitcXHRucl9zaGFyZWRfYXJlYXMgPSBucl9hcmVhc19hcmcgXFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XFxuK1xcdG5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICsgMTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIE1SRU1BUF9GSVhFRCB1bm1hcHMgd2hhdGV2ZXIgaXMgaW4gdGhlIHdheSB3aXRob3V0IHNheWluZyBzbywgc29cXG4rXFx0ICogY2xhaW0gdGhlIG1yZW1hcCB0aHJlYWQncyBzY3JhdGNoIGFkZHJlc3MgdXAgZnJvbnQuXFxuK1xcdCAqL1xcbitcXHRtcmVtYXBfc2NyYXRjaCA9IChjaGFyICopQkFTRV9BRERSICsgMiAqIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XFxuK1xcdGlmIChtbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9OT05FLFxcbitcXHRcXHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSxcXG4rXFx0XFx0IC0xLCAwKSAhPSAodm9pZCAqKW1yZW1hcF9zY3JhdGNoKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKSBtcmVtYXAgc2NyYXRjaFxcXCIpO1xcbitcXG4rXFx0YmFzZV9tYXNrID0gdGhyZWFkX21hc2s7XFxuK1xcdGhhdmVfc3dhcCA9IHN3YXBfYXZhaWxhYmxlKCk7XFxuK1xcdGlmICghaGF2ZV9zd2FwKVxcbitcXHRcXHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZSAqL1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibm8gc3dhcDogdGhlIHBhZ2VvdXQgdGhyZWFkIGlzIG5vdCBzdGFydGVkXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7XFxuK1xcbitcXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xcbitcXHR0aHBfcmVhZF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRmb3IgKGludCBydW4gPSAwOyBydW4gXFx1MDAzYyBucl9tb2RlcyAqIG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzOyBydW4rKykge1xcbitcXHRcXHRpbnQgcmVtID0gcnVuICUgKG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKTtcXG4rXFx0XFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldO1xcbitcXHRcXHRib29sIGhvbGVzID0gb2NjdXBhbmNpZXNbcmVtIC8gbnJfcHJlc3N1cmVzXTtcXG4rXFx0XFx0Ym9vbCBwcmVzc3VyZSA9IHByZXNzdXJlc1tyZW0gJSBucl9wcmVzc3VyZXNdO1xcbitcXG4rXFx0XFx0c25wcmludGYobGFiZWwsIHNpemVvZihsYWJlbCksIFxcXCIlcy8lcyVzXFxcIiwgbW9kZSxcXG4rXFx0XFx0XFx0IGhvbGVzID8gXFxcImhvbGVzXFxcIiA6IFxcXCJzdHJpY3RcXFwiLCBwcmVzc3VyZSA/IFxcXCIvcHJlc3N1cmVcXFwiIDogXFxcIlxcXCIpO1xcbitcXHRcXHRpZiAoY29ycnVwdGVkKSB7XFxuK1xcdFxcdFxcdC8qIE1lbW9yeSBpcyBzdXNwZWN0OyB0aGUgcmVzdCB3b3VsZCBwcm92ZSBub3RoaW5nICovXFxuK1xcdFxcdFxcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcXFwiJXM6IHNraXBwZWQgYWZ0ZXIgY29ycnVwdGlvblxcXFxuXFxcIiwgbGFiZWwpO1xcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0dGhyZWFkX21hc2sgPSBiYXNlX21hc2s7XFxuK1xcdFxcdGlmICghcHJlc3N1cmUpXFxuK1xcdFxcdFxcdHRocmVhZF9tYXNrIFxcdTAwMjY9IH4ocGFnZW91dF9iaXQgfCBjb21wYWN0b3JfYml0KTtcXG4rXFx0XFx0ZWxzZSBpZiAoIWhhdmVfc3dhcClcXG4rXFx0XFx0XFx0dGhyZWFkX21hc2sgXFx1MDAyNj0gfnBhZ2VvdXRfYml0O1xcbitcXG4rXFx0XFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0XFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcXG4rXFx0XFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xcbitcXHRcXHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XFxuK1xcdFxcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9XFxuK1xcdFxcdFxcdHN0cmNtcChtb2RlLCBcXFwiZnJlZVxcXCIpID8gMTAwMCA6IDA7XFxuK1xcdFxcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gMTA7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBtVEhQIGNvbGxhcHNlIGhvbm91cnMgb25seSAwIG9yIEhQQUdFX1BNRF9OUiAtIDEgaGVyZS4gIFRoZSB0d29cXG4rXFx0XFx0ICogZW5kcyByYWNlIGRpZmZlcmVudCBwYXRoczogYSBzdHJpY3Qgd2luZG93IGhhcyBldmVyeSBQVEVcXG4rXFx0XFx0ICogcHJlc2VudCwgYSBob2xlLWhlYXZ5IG9uZSBpcyBtb3N0bHkgemVyby1maWxsZWQuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/XFxuK1xcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgLSAxIDogMDtcXG4rXFx0XFx0LyogT25lIHdha2UsIG9uZSBwYXNzOiB0aGUgcGxheWdyb3VuZCBwbHVzIHRoZSBmb3JrZWQgY2hpbGRyZW4ncyBjb3BpZXMgKi9cXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cXG4rXFx0XFx0XFx0bnJfYXJlYXMgKiAoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpICogODtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX09SREVSUzsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSlcXG4rXFx0XFx0XFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0XFx0fVxcbitcXHRcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0XFx0cmVnaW9uID0gbW1hcChCQVNFX0FERFIsIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXFxuK1xcdFxcdFxcdCAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfFxcbitcXHRcXHRcXHQgICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcXG4rXFx0XFx0aWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibW1hcCgpIHBsYXlncm91bmRcXFwiKTtcXG4rXFx0XFx0bXJlbWFwX2FyZWEgPSByZWdpb24gKyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcXG4rXFxuK1xcdFxcdGlmICh0aHJlYWRfbWFzayBcXHUwMDI2IHBhZ2VvdXRfYml0KSB7XFxuK1xcdFxcdFxcdC8qIEVub3VnaCB0byBkcml2ZSByZWFsIHJlY2xhaW0gd2l0aG91dCBzd2FtcGluZyBhIHNtYWxsIGd1ZXN0ICovXFxuK1xcdFxcdFxcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcXG4rXFx0XFx0XFx0aWYgKHBhZ2VvdXRfc2l6ZSBcXHUwMDNjIDE2VUwgXFx1MDAzY1xcdTAwM2MgMjApXFxuK1xcdFxcdFxcdFxcdHBhZ2VvdXRfc2l6ZSA9IDE2VUwgXFx1MDAzY1xcdTAwM2MgMjA7XFxuK1xcdFxcdFxcdGlmIChwYWdlb3V0X3NpemUgXFx1MDAzZSA2NFVMIFxcdTAwM2NcXHUwMDNjIDIwKVxcbitcXHRcXHRcXHRcXHRwYWdlb3V0X3NpemUgPSA2NFVMIFxcdTAwM2NcXHUwMDNjIDIwO1xcbitcXHRcXHRcXHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcXG4rXFx0XFx0XFx0aWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKSBwYWdlb3V0IGFyZWFcXFwiKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LyogUG9wdWxhdGUgc28gdGhlIGZpcnN0IHBhc3MgaGFzIHNvbWV0aGluZyB0byBjb2xsYXBzZSAqL1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcXG4rXFx0XFx0XFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xcbitcXHRcXHRtZW1zZXQobXJlbWFwX2FyZWEsIDEsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0XFx0aWYgKG1hZHZpc2UocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSlcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXFxcIik7XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfdGhyZWFkczsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICghKHRocmVhZF9tYXNrIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSkpIHtcXG4rXFx0XFx0XFx0XFx0dGhyZWFkc1tpXSA9IDA7XFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGlmIChwdGhyZWFkX2NyZWF0ZShcXHUwMDI2dGhyZWFkc1tpXSwgTlVMTCwgdGhyZWFkX2Zuc1tpXSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgKHZvaWQgKikoaSArIDEpKSlcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKHRocmVhZF9uYW1lc1tpXSk7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGVuZF9tcyA9IG5vd19tcygpICsgZHVyYXRpb25fcyAqIDEwMDBVTDtcXG4rXFx0XFx0aWYgKCFzdHJjbXAobW9kZSwgXFxcInN0ZXBwZWRcXFwiKSkge1xcbitcXHRcXHRcXHR3aGlsZSAobm93X21zKCkgXFx1MDAzYyBlbmRfbXMgXFx1MDAyNlxcdTAwMjYgIWNvcnJ1cHRlZCkge1xcbitcXHRcXHRcXHRcXHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKFBBU1NfVElNRU9VVF9TKSlcXG4rXFx0XFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0XFx0c3RlcHMrKztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgXFxcImZyZWVcXFwiKSkge1xcbitcXHRcXHRcXHR3aGlsZSAobm93X21zKCkgXFx1MDAzYyBlbmRfbXMgXFx1MDAyNlxcdTAwMjYgIWNvcnJ1cHRlZClcXG4rXFx0XFx0XFx0XFx0dXNsZWVwKDEwMCAqIDEwMDApO1xcbitcXHRcXHR9IGVsc2Uge1xcdC8qIG1hZHZpc2UgKi9cXG4rXFx0XFx0XFx0d2hpbGUgKG5vd19tcygpIFxcdTAwM2MgZW5kX21zIFxcdTAwMjZcXHUwMDI2ICFjb3JydXB0ZWQpIHtcXG4rXFx0XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3NoYXJlZF9hcmVhczsgaSsrKSB7XFxuK1xcdFxcdFxcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgaSAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0XFx0bWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRcXHRNQURWX0RPTlRORUVEKTtcXG4rXFx0XFx0XFx0XFx0c3RlcHMrKztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRzdG9wID0gMTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xcbitcXHRcXHRcXHRpZiAodGhyZWFkc1tpXSlcXG4rXFx0XFx0XFx0XFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcXG4rXFx0XFx0XFx0Y2hlY2tfcGFnZShpKTtcXG4rXFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCwgXFxcIiVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgbGFiZWwsIGR1cmF0aW9uX3MsIHN0ZXBzKTtcXG4rXFxuK1xcdFxcdC8qIFRoZSBuZXh0IG1vZGUgbWFwcyB0aGUgc2FtZSBmaXhlZCBhZGRyZXNzIHdpdGggaXRzIG93biBzZXR0aW5ncyAqL1xcbitcXHRcXHRtdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0XFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xcbitcXHRcXHRcXHRtdW5tYXAocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUpO1xcbitcXHRcXHRcXHRwYWdlb3V0X2FyZWEgPSBOVUxMO1xcbitcXHRcXHR9XFxuK1xcdFxcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0XFx0c3RvcCA9IDA7XFxuK1xcdFxcdHN0ZXBzID0gMDtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9maW5pc2hlZCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjFjMWI5NDJhYzMyNThcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcXG5AQCAtMCwwICsxLDE3OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBDaGVjayB0aGF0IGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZHJpdmVzIGtodWdlcGFnZWQgaW4gc3RlcDogb25lIGJhcnJpZXJcXG4rICogb3ZlciBvbmUgcHJlcGFyZWQgd2luZG93IG11c3QgY29sbGFwc2UgaXQgd2l0aCBleGFjdGx5IG9uZSBjb2xsYXBzZVxcbisgKiBhdHRlbXB0IGF0dHJpYnV0ZWQgdG8gaXRzIHNvdXJjZSBwYWdlcywgc3RlcCBhZnRlciBzdGVwLlxcbisgKlxcbisgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBhIG1pbnV0ZSBzbyB0aGF0IGEgc3RlcCB3aGljaCBzbGVwdCBpbnN0ZWFkIG9mXFxuKyAqIGJlaW5nIHdva2VuIGJsb3dzIHRoZSBidWRnZXQuXFxuKyAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwia3NlbGZ0ZXN0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ2bV91dGlsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJodWdlcGFnZV9zZXR0aW5ncy5oXFxcIlxcbitcXG4rI2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCBcXHUwMDNjXFx1MDAzYyAzMCkpXFxuKy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXFxuKyNkZWZpbmUgVEFSR0VUX09SREVSIDJcXG4rI2RlZmluZSBOUl9JVEVSQVRJT05TIDVcXG4rI2RlZmluZSBQQVNTX1RJTUVPVVRfUyAzMFxcbitcXG4rc3RhdGljIGludCBwYWdlbWFwX2ZkO1xcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XFxuK3N0YXRpYyBpbnQgdHJhY2VfZXZlbnRzX2ZkID0gLTE7XFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplO1xcbitcXG4rLypcXG4rICogVGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGU6IHN3aXRjaCB0aGVtIG9mZiBob3dldmVyIHRoZSB0ZXN0IGVuZHMsXFxuKyAqIGluY2x1ZGluZyBmcm9tIGluc2lkZSBhIGhlbHBlciB0aGF0IGdpdmVzIHVwLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgdHJhY2VfZXZlbnRzX29mZih2b2lkKVxcbit7XFxuK1xcdGlmICh0cmFjZV9ldmVudHNfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0dHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpO1xcbit9XFxuK1xcbisvKiBDb3VudCB0aGUgaXNvbGF0ZSBldmVudHMgd2hvc2Ugc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cncyBzb3VyY2UgUEZOcyAqL1xcbitzdGF0aWMgaW50IGNvdW50X2F0dHJpYnV0ZWQodW5zaWduZWQgbG9uZyAqcGZucywgaW50IG5yX3BmbnMsXFxuK1xcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXFxuK3tcXG4rXFx0Y2hhciBsaW5lWzEwMjRdO1xcbitcXHRpbnQgY291bnQgPSAwO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gdHJhY2luZ19vcGVuX3RyYWNlKCk7XFxuK1xcdGlmICghZnApXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiQ2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHZhbDtcXG4rXFx0XFx0dW5zaWduZWQgaW50IG9yZDtcXG4rXFx0XFx0Y2hhciAqcywgKm87XFxuK1xcdFxcdGludCBpO1xcbitcXG4rXFx0XFx0cyA9IHN0cnN0cihsaW5lLCBcXFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6XFxcIik7XFxuK1xcdFxcdGlmICghcylcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGlmIChzc2NhbmYocywgXFxcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOiBzY2FuX3Bmbj0weCVseFxcXCIsXFxuK1xcdFxcdFxcdCAgIFxcdTAwMjZ2YWwpICE9IDEpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRvID0gc3Ryc3RyKHMsIFxcXCJvcmRlcj1cXFwiKTtcXG4rXFx0XFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcXFwib3JkZXI9JXVcXFwiLCBcXHUwMDI2b3JkKSAhPSAxIHx8IG9yZCAhPSBvcmRlcilcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wZm5zOyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKHZhbCA9PSBwZm5zW2ldKSB7XFxuK1xcdFxcdFxcdFxcdGNvdW50Kys7XFxuK1xcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRmY2xvc2UoZnApO1xcbitcXHRyZXR1cm4gY291bnQ7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pXFxuK3tcXG4rXFx0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSO1xcbitcXHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUjtcXG4rXFx0dW5zaWduZWQgbG9uZyBwZm5zWzEgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSXTtcXG4rXFx0Ym9vbCBjb2xsYXBzZWQsIHBhc3NlZDtcXG4rXFx0aW50IGF0dHJpYnV0ZWQ7XFxuK1xcdGNoYXIgKnA7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0cCA9IG1tYXAoQkFTRV9BRERSLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcXG4rXFx0aWYgKHAgIT0gQkFTRV9BRERSKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKSB3aW5kb3dcXFwiKTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XFxuK1xcdFxcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0XFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIENsZWFyIGJlZm9yZSBlbmFibGluZyBzbyB0aGUgYnVmZmVyIGhvbGRzIG9ubHkgdGhpcyBzdGVwJ3MgZXZlbnRzICovXFxuK1xcdGlmICh0cmFjaW5nX2NsZWFyX3RyYWNlKCkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiQ2Fubm90IGNsZWFyIHRoZSB0cmFjZSBidWZmZXJcXFxcblxcXCIpO1xcbitcXHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiQ2Fubm90IGVuYWJsZSBodWdlX21lbW9yeSBldmVudHNcXFxcblxcXCIpO1xcbitcXG4rXFx0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9IVUdFUEFHRSlcXFwiKTtcXG4rXFx0cGFzc2VkID0ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoUEFTU19USU1FT1VUX1MpO1xcbitcXG4rXFx0LyogT2ZmIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBnaXZlIHVwOiB0aGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSAqL1xcbitcXHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkNhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcXFxuXFxcIik7XFxuK1xcdGlmICghcGFzc2VkKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcImtodWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xcXFxuXFxcIik7XFxuK1xcbitcXHRjb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgd2luZG93LCBUQVJHRVRfT1JERVIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XFxuK1xcdGF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCBUQVJHRVRfT1JERVIpO1xcbitcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXFx1MDAyNlxcdTAwMjYgYXR0cmlidXRlZCA9PSAxLFxcbitcXHRcXHRcXHQgXFxcInN0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTtcXG4rXFxuK1xcdG11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK31cXG4rXFxuK2ludCBtYWluKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xcbitcXG4rXFx0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcXFxuXFxcIik7XFxuK1xcdGlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUikpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgVEFSR0VUX09SREVSKTtcXG4rXFxuK1xcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcXG4rXFx0aWYgKCFocGFnZV9wbWRfc2l6ZSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRwYWdlbWFwX2ZkID0gb3BlbihcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAocGFnZW1hcF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXFxcIik7XFxuK1xcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcXFxcblxcXCIpO1xcbitcXHR0cmFjZV9ldmVudHNfZmQgPSB0cmFjaW5nX2V2ZW50c19vcGVuKFxcXCJodWdlX21lbW9yeVxcXCIpO1xcbitcXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcImh1Z2VfbWVtb3J5IGV2ZW50cyByZXF1aXJlIHRyYWNlZnMgYW5kIHJvb3RcXFxcblxcXCIpO1xcbitcXHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcXG4rXFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPSA2MCAqIDEwMDA7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAgKiAxMDAwO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAoaHBhZ2VfcG1kX3NpemUgLyBnZXRwYWdlc2l6ZSgpKSAtIDE7XFxuK1xcdC8qIE9uZSB3YWtlIG11c3QgY29tcGxldGUgb25lIGZ1bGwgcGFzczsgc2VlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgKi9cXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMIFxcdTAwM2NcXHUwMDNjIDI0O1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XFxuK1xcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZCAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX0lURVJBVElPTlM7IGkrKylcXG4rXFx0XFx0b25lX3N0ZXAoaSk7XFxuK1xcbitcXHRrc2Z0X2ZpbmlzaGVkKCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xcbmluZGV4IGYxOWQ1M2M2OTU3NjQuLmZkMzVmOGE3YjViODMgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xcbkBAIC0yMCw3ICsyMCw2IEBAXFxuIFxcbiAjZGVmaW5lIFRXT01FR1xcdFxcdCgyXFx1MDAzY1xcdTAwM2MyMClcXG4gI2RlZmluZSBSVU5USU1FXFx0XFx0KDIwKVxcbi0jZGVmaW5lIEFMSUdOKHgsIGEpXFx0KCgoeCkgKyAoYSAtIDEpKSBcXHUwMDI2ICh+KChhKSAtIDEpKSlcXG4gXFxuIEhVR0VUTEJfU0VUVVBfREVGQVVMVF9QQUdFUygxKVxcbiBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxcbmluZGV4IGQwOWY5ZjZhMzg0ZWUuLmZjNjE5MDdhYTNiMmEgMTAwNzU1XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxcbkBAIC00MDIsNiArNDAyLDEyIEBAIENBVEVHT1JZPVxcXCJwZm5tYXBcXFwiIHJ1bl90ZXN0IC4vcGZubWFwXFxuICMgQ09XIHRlc3RzXFxuIENBVEVHT1JZPVxcXCJjb3dcXFwiIHJ1bl90ZXN0IC4vY293XFxuIFxcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrXFxuK1xcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfc3luY19jaGVja1xcbitcXG4rQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2VcXG4rXFxuIENBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZFxcbiBcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDJcXG5AQCAtNDEwLDggKzQxNiw2IEBAIENBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCBhbGw6c2htZW1cXG4gXFxuIENBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyA0IGFsbDpzaG1lbVxcbiBcXG4tQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub25cXG4tXFxuICMgVHJ5IHRvIGNyZWF0ZSBYRlMgaWYgbm90IHByb3ZpZGVkXFxuIGlmIFsgLXogXFxcIiR7U1BMSVRfSFVHRV9QQUdFX1RFU1RfWEZTX1BBVEh9XFxcIiBdOyB0aGVuXFxuICAgICBpZiB0ZXN0X3NlbGVjdGVkIFxcXCJ0aHBcXFwiOyB0aGVuXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXFxuaW5kZXggODZhNjAzNjkyODI2MS4uMGFkZmU3ZGRlN2U1OSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xcbkBAIC00Miw2OCArNDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXCI7XFxuIGludCBwYWdlbWFwX2ZkO1xcbiBpbnQga3BhZ2VmbGFnc19mZDtcXG4gXFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcXG4tXFx0XFx0aW50IGtwYWdlZmxhZ3NfZmQpXFxuLXtcXG4tXFx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcXG4tXFx0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcXG4tXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcjtcXG4tXFx0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcXG4tXFx0dWludDY0X3QgcGZuX2ZsYWdzO1xcbi1cXHR1bnNpZ25lZCBsb25nIHBmbjtcXG4tXFx0dW5zaWduZWQgbG9uZyBpO1xcbi1cXG4tXFx0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcXG4tXFxuLVxcdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cXG4tXFx0aWYgKHBmbiA9PSAtMVVMKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbi1cXHRcXHRnb3RvIGZhaWw7XFxuLVxcbi1cXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xcbi1cXHRpZiAoIW9yZGVyKSB7XFxuLVxcdFxcdGlmIChwZm5fZmxhZ3MgXFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxcbi1cXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXHR9XFxuLVxcbi1cXHQvKiBub24gVEhQIGZvbGlvICovXFxuLVxcdGlmICghKHBmbl9mbGFncyBcXHUwMDI2IEtQRl9USFApKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHRwZm5faGVhZCA9IHBmbiBcXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcXG4tXFxuLVxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0Z290byBmYWlsO1xcbi1cXG4tXFx0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cXG4tXFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxcbi1cXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcbi1cXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cXG4tXFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcXG4tXFx0XFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0XFx0Z290byBmYWlsO1xcbi1cXHRcXHRpZiAoKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXFxuLVxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFx0fVxcbi1cXG4tXFx0LypcXG4tXFx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcXG4tXFx0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxcbi1cXHQgKi9cXG4tXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuLVxcdFxcdHJldHVybiB0cnVlO1xcbi1cXG4tXFx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xcbi1cXHRyZXR1cm4gKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XFxuLWZhaWw6XFxuLVxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiRmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxcXG5cXFwiKTtcXG4tXFx0cmV0dXJuIGZhbHNlO1xcbi19XFxuLVxcbiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcXG4gXFx0XFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpXFxuIHtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXFxuaW5kZXggNDgyMWEzNTYzMDM2My4uYWY4MzI0ZTFlOGYyYyAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcXG5AQCAtNDkwLDYgKzQ5MCwxNTMgQEAgaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbitib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0aW50IGtwYWdlZmxhZ3NfZmQpXFxuK3tcXG4rXFx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcXG4rXFx0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcXHUwMDNjXFx1MDAzYyBvcmRlcjtcXG4rXFx0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcXG4rXFx0dWludDY0X3QgcGZuX2ZsYWdzO1xcbitcXHR1bnNpZ25lZCBsb25nIHBmbjtcXG4rXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXG4rXFx0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcXG4rXFxuK1xcdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cXG4rXFx0aWYgKHBmbiA9PSAtMVVMKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xcbitcXHRpZiAoIW9yZGVyKSB7XFxuK1xcdFxcdGlmIChwZm5fZmxhZ3MgXFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXHR9XFxuK1xcbitcXHQvKiBub24gVEhQIGZvbGlvICovXFxuK1xcdGlmICghKHBmbl9mbGFncyBcXHUwMDI2IEtQRl9USFApKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRwZm5faGVhZCA9IHBmbiBcXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcXG4rXFxuK1xcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cXG4rXFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cXG4rXFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcXG4rXFx0XFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4rXFx0XFx0XFx0Z290byBmYWlsO1xcbitcXHRcXHRpZiAoKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcXG4rXFx0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxcbitcXHQgKi9cXG4rXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdHJldHVybiB0cnVlO1xcbitcXG4rXFx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xcbitcXHRyZXR1cm4gKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XFxuK2ZhaWw6XFxuK1xcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiRmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxcXG5cXFwiKTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbisvKipcXG4rICogaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKCkgLSBjaGVjayB0aGF0IGEgcmFuZ2UgaXMgYmFja2VkIGJ5IEBvcmRlciBmb2xpb3NcXG4rICogQHN0YXJ0OiBzdGFydCBvZiB0aGUgcmFuZ2UsIGEgbXVsdGlwbGUgb2YgdGhlIGZvbGlvIHNpemVcXG4rICogQGxlbjogbGVuZ3RoIG9mIHRoZSByYW5nZSBpbiBieXRlcywgYSBtdWx0aXBsZSBvZiB0aGUgZm9saW8gc2l6ZVxcbisgKiBAb3JkZXI6IHRoZSBmb2xpbyBvcmRlciB0byBjaGVjayBmb3JcXG4rICogQHBhZ2VtYXBfZmQ6IG9wZW4gL3Byb2MvXFx1MDAzY3BpZFxcdTAwM2UvcGFnZW1hcCBvZiB0aGUgcmFuZ2UncyBvd25lclxcbisgKiBAa3BhZ2VmbGFnc19mZDogb3BlbiAvcHJvYy9rcGFnZWZsYWdzXFxuKyAqXFxuKyAqIEV2ZXJ5IGZvbGlvLXNpemVkLCBmb2xpby1hbGlnbmVkIHBhcnQgb2YgdGhlIHJhbmdlIG11c3QgbWFwIG9uZSBmb2xpbyBvZlxcbisgKiBAb3JkZXIsIGhlYWQgdG8gdGFpbCwgd2l0aCB0aGUgaGVhZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHBhcnQuICBBIHBhcnRcXG4rICogYmFja2VkIGJ5IHNldmVyYWwgc21hbGxlciBmb2xpb3MgZmFpbHMsIGFuZCBzbyBkb2VzIGEgZm9saW8gbWFwcGVkIG9mZlxcbisgKiBpdHMgbmF0dXJhbCBhbGlnbm1lbnQuXFxuKyAqXFxuKyAqIFJldHVybnM6IHRydWUgaWYgdGhlIHdob2xlIHJhbmdlIGlzIGJhY2tlZCB0aGF0IHdheSwgZmFsc2Ugb3RoZXJ3aXNlLlxcbisgKi9cXG4rYm9vbCBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcXG4rXFx0XFx0XFx0ICAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKVxcbit7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdGNvbnN0IHNpemVfdCBmb2xpb19zaXplID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xcbitcXHRjaGFyICp2YWRkcjtcXG4rXFxuK1xcdGlmICgodWludHB0cl90KXN0YXJ0ICUgZm9saW9fc2l6ZSB8fCBsZW4gJSBmb2xpb19zaXplKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRmb3IgKHZhZGRyID0gc3RhcnQ7IHZhZGRyIFxcdTAwM2Mgc3RhcnQgKyBsZW47IHZhZGRyICs9IGZvbGlvX3NpemUpIHtcXG4rXFx0XFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRcXHQvKiBOb3QgcHJlc2VudCwgb3IgYSB0YWlsIHBhZ2UgKi9cXG4rXFx0XFx0aWYgKHBmbiA9PSAtMVVMIHx8IHBmbiAlIG5yX3BhZ2VzKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xcbitcXHRcXHRcXHRjaGFyICpwYWdlID0gdmFkZHIgKyBpICogcHNpemUoKTtcXG4rXFxuK1xcdFxcdFxcdGlmIChwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcGFnZSkgIT0gcGZuICsgaSlcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRpZiAoIWlzX2JhY2tlZF9ieV9mb2xpbyh2YWRkciwgb3JkZXIsIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbisjZGVmaW5lIFRSQUNFRlNfUk9PVCBcXFwiL3N5cy9rZXJuZWwvdHJhY2luZ1xcXCJcXG4rXFxuKy8qXFxuKyAqIFJldHVybnMgLTEgd2l0aG91dCB0cmFjZWZzIG9yIHRoZSBzdWJzeXN0ZW0uICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZTpcXG4rICogd2hvZXZlciBzd2l0Y2hlcyB0aGVtIG9uIGhhcyB0byBzd2l0Y2ggdGhlbSBvZmYgYWdhaW4sIG9uIGV2ZXJ5IGV4aXQgcGF0aC5cXG4rICovXFxuK2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcXG4re1xcbitcXHRjaGFyIHBhdGhbMjU2XTtcXG4rXFxuK1xcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UIFxcXCIvZXZlbnRzLyVzL2VuYWJsZVxcXCIsXFxuK1xcdFxcdCBzdWJzeXMpO1xcbitcXHRyZXR1cm4gb3BlbihwYXRoLCBPX1dST05MWSk7XFxuK31cXG4rXFxuK2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSlcXG4re1xcbitcXHRpZiAocHdyaXRlKGZkLCBlbmFibGUgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIsIDEsIDApICE9IDEpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhciAqL1xcbitpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKVxcbit7XFxuK1xcdGludCBmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFxcXCIvdHJhY2VcXFwiLCBPX1dST05MWSB8IE9fVFJVTkMpO1xcbitcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZClcXG4re1xcbitcXHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFxcXCIvdHJhY2VcXFwiLCBcXFwiclxcXCIpO1xcbit9XFxuK1xcbiAvKiBJZiBgaW9jdGxzJyBub24tTlVMTCwgdGhlIGFsbG93ZWQgaW9jdGxzIHdpbGwgYmUgcmV0dXJuZWQgaW50byB0aGUgdmFyICovXFxuIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXFxuIFxcdFxcdFxcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuaW5kZXggOWE0OWFmODg3MDJlNC4uNWE5MWI5Njc2ZWM1ZCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcXG5AQCAtMTAsNiArMTAsOCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvZnMuaFxcdTAwM2VcXG4gXFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXFx1MDAzY1xcdTAwM2MgKG5yKSlcXG4rI2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSArIChhKSAtIDEpIFxcdTAwMjYgfigoYSkgLSAxKSlcXG4rXFxuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcXG4gI2RlZmluZSBQTV9NTUFQX0VYQ0xVU0lWRSAgICAgICAgICAgICBCSVRfVUxMKDU2KVxcbiAjZGVmaW5lIFBNX1VGRkRfV1AgICAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTcpXFxuQEAgLTk3LDYgKzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xcbiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7XFxuIGludCBnYXRoZXJfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLFxcbiBcXHRcXHRpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycyk7XFxuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRpbnQga3BhZ2VmbGFnc19mZCk7XFxuK2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXFxuK1xcdFxcdFxcdCAgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XFxuIFxcbiBpbnQgdWZmZF9yZWdpc3RlcihpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxcbiBcXHRcXHQgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vcik7XFxuQEAgLTExMyw2ICsxMTksMTAgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApO1xcbiBpbnQgd3JpdGVfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nIHZhbCk7XFxuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcXG4gYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpO1xcbitpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpO1xcbitpbnQgdHJhY2luZ19ldmVudHNfZW5hYmxlKGludCBmZCwgYm9vbCBlbmFibGUpO1xcbitpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKTtcXG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpO1xcbiBcXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxcbiB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDE1OjE1OjQyLjc5ODQwMDc4NloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6OTYxMTIyOTM2MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJBbGwgbW9kaWZpY2F0aW9ucyBpbiB0aGlzIHBhdGNoIHNlcmllcyBhcmUgc3RyaWN0bHkgY29uZmluZWQgdG8gdXNlci1zcGFjZSBzZWxmdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBObyBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIG1vZHVsZSBjb2RlIGlzIGFsdGVyZWQsIG1ha2luZyB0aGUgY2hhbmdlcyBub24ta2VybmVsL25vbi1leGVjdXRhYmxlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGtlcm5lbCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2ODI3MGExYWI4MmI2Nzk3M2RlNjdmZmI0ZDM1NDA2NWFkNWE4NjkxXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBTZXAgOCAxNToxNTozOSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbkBAIC0xMDQsNiArMTA0LDkgQEAgVEVTVF9HRU5fRklMRVMgKz0gZ3VhcmQtcmVnaW9uc1xuIFRFU1RfR0VOX0ZJTEVTICs9IG1lcmdlXG4gVEVTVF9HRU5fRklMRVMgKz0gcm1hcFxuIFRFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX3NwbGl0X3JhY2VfdGVzdFxuK1RFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX29yZGVyX2NoZWNrXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9yYWNlXG4gXG4gaWZuZXEgKCQoQVJDSCksYXJtNjQpXG4gVEVTVF9HRU5fRklMRVMgKz0gc29mdC1kaXJ0eVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZmE3MzZjOWY3MDFhNFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xuQEAgLTAsMCArMSwxMjIgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogU2VsZi1jaGVjayBmb3IgdGhlIHZtX3V0aWwgZm9saW8tb3JkZXIgaGVscGVycywgaXNfYmFja2VkX2J5X2ZvbGlvKCkgYW5kXG4rICogaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKCksIHdoaWNoIHRoZSBraHVnZXBhZ2VkIG1USFAgY2FzZXMgdXNlIHRvIGRldGVjdFxuKyAqIGNvbGxhcHNlIHJlc3VsdHMuICBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHRcbisgKiBtZW1vcnkgaW4gd2l0aCBvbmx5IHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgcmVxdWlyZSB0aGUgaGVscGVycyB0byByZXBvcnRcbisgKiBleGFjdGx5IHRoYXQgb3JkZXIuXG4rICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImtzZWxmdGVzdC5oXCJcbisjaW5jbHVkZSBcInZtX3V0aWwuaFwiXG4rI2luY2x1ZGUgXCJodWdlcGFnZV9zZXR0aW5ncy5oXCJcbitcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuK1xuK3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxuK3tcbitcdHNpemVfdCBsZW4gPSBzaXplICogMjtcbitcdGNoYXIgKnAsICphbGlnbmVkO1xuK1xuK1x0cCA9IG1tYXAoTlVMTCwgbGVuLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4rXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtbWFwKClcIik7XG4rXG4rXHRhbGlnbmVkID0gKGNoYXIgKilBTElHTigodWludHB0cl90KXAsIHNpemUpO1xuK1x0aWYgKGFsaWduZWQgIT0gcClcbitcdFx0bXVubWFwKHAsIGFsaWduZWQgLSBwKTtcbitcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSBwICsgbGVuKVxuK1x0XHRtdW5tYXAoYWxpZ25lZCArIHNpemUsIHAgKyBsZW4gLSBhbGlnbmVkIC0gc2l6ZSk7XG4rXG4rXHRyZXR1cm4gYWxpZ25lZDtcbit9XG4rXG4rc3RhdGljIHZvaWQgY2hlY2tfb3JkZXIoaW50IG9yZGVyKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdHNpemVfdCBzaXplID0gcHNpemUoKSBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4rXHRib29sIG9rID0gdHJ1ZTtcbitcdGNoYXIgKnA7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSsrKVxuK1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbitcdGlmIChvcmRlcilcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbitcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcbitcdHAgPSBhbGxvY19hbGlnbmVkKHNpemUpO1xuK1x0KnAgPSAxO1xuK1xuK1x0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgb3JkZXIsIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwib3JkZXIgJWQgbm90IGRldGVjdGVkIGFmdGVyIGZhdWx0XFxuXCIsIG9yZGVyKTtcbitcdFx0b2sgPSBmYWxzZTtcbitcdH1cbitcbitcdC8qIEEgbG93ZXIgb3JkZXIgbXVzdCBiZSByZWplY3RlZDogdGhlIGZvbGlvIGlzIGxhcmdlciAqL1xuK1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgb3JkZXIgLSAxLFxuK1x0XHRcdFx0XHQgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgJWRcXG5cIixcbitcdFx0XHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHQvKiBBIGxhcmdlIGZvbGlvIG11c3Qgbm90IHBhc3MgYXMgb3JkZXIgMCAqL1xuK1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfb3JkZXIocCwgc2l6ZSwgMCxcbitcdFx0XHRcdFx0ICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyIDBcXG5cIiwgb3JkZXIpO1xuK1x0XHRvayA9IGZhbHNlO1xuK1x0fVxuK1xuK1x0bXVubWFwKHAsIHNpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1xuK1x0a3NmdF90ZXN0X3Jlc3VsdChvaywgXCJvcmRlciAlZCBjbGFzc2lmaWVkXFxuXCIsIG9yZGVyKTtcbit9XG4rXG4raW50IG1haW4odm9pZClcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dW5zaWduZWQgbG9uZyBvcmRlcnM7XG4rXHRpbnQgb3JkZXI7XG4rXG4rXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuK1xuK1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cIik7XG4rXG4rXHRwYWdlbWFwX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvcGFnZW1hcFwiLCBPX1JET05MWSk7XG4rXHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCIpO1xuK1x0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCIvcHJvYy9rcGFnZWZsYWdzXCIsIE9fUkRPTkxZKTtcbitcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIm9wZW4oL3Byb2Mva3BhZ2VmbGFncykgcmVxdWlyZXMgcm9vdFxcblwiKTtcbitcbitcdG9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7XG4rXHRpZiAoIW9yZGVycylcbitcdFx0a3NmdF9leGl0X3NraXAoXCJObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xcblwiKTtcbitcbitcdGtzZnRfc2V0X3BsYW4oX19idWlsdGluX3BvcGNvdW50bChvcmRlcnMpICsgMSk7XG4rXG4rXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuK1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRjaGVja19vcmRlcigwKTtcbitcdGZvciAob3JkZXIgPSAxOyBvcmRlciBcdTAwM2MgTlJfT1JERVJTOyBvcmRlcisrKSB7XG4rXHRcdGlmICghKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXIpKSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0Y2hlY2tfb3JkZXIob3JkZXIpO1xuK1x0fVxuK1xuK1x0a3NmdF9maW5pc2hlZCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5pbmRleCBlMjY0MmVjYTBkMDJiLi5kZjQyNmY5MjE4ZTcxIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5AQCAtNjUsNyArNjUsNiBAQCBlbnVtIHtcbiAjZGVmaW5lIEhNTV9QQVRIX01BWCAgICA2NFxuICNkZWZpbmUgTlRJTUVTXHRcdDEwXG4gXG4tI2RlZmluZSBBTElHTih4LCBhKSAoKCh4KSArIChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi9cbiBcbiAjaWZuZGVmIEZPTExfV1JJVEVcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuaW5kZXggZDc5MTdkY2UzYWJhYy4uY2E3M2Y5YWM4ZTliNiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbkBAIC0xODMsNiArMTgzLDEzIEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuKy8qIEEgc3RvcmUgdG8gZWl0aGVyIHNsZWVwIGtub2Igd2FrZXMga2h1Z2VwYWdlZCwgc28gd3JpdGUgb25seSBvbiBjaGFuZ2UgKi9cbitzdGF0aWMgdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcbit7XG4rXHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcbitcdFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xuK31cbitcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiB7XG4gXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFx1MDAyNnNldHRpbmdzLVx1MDAzZWtodWdlcGFnZWQ7XG5AQCAtMTk4LDE1ICsyMDUsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHRcdFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVx1MDAzZXNobWVtX2VuYWJsZWRdKTtcbiBcdHRocF93cml0ZV9udW0oXCJ1c2VfemVyb19wYWdlXCIsIHNldHRpbmdzLVx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xuIFxuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvZGVmcmFnXCIsIGtodWdlcGFnZWQtXHUwMDNlZGVmcmFnKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wiLFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCIsXG4tXHRcdFx0a2h1Z2VwYWdlZC1cdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblwiLCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL2RlZnJhZ1wiLCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCIsXG4rXHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL21heF9wdGVzX25vbmVcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9wYWdlc190b19zY2FuXCIsIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4gXG4gXHRpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSlcbiBcdFx0d3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLVx1MDAzZXJlYWRfYWhlYWRfa2IpO1xuQEAgLTIzMCw2ICsyMzcsNDEgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuKy8qXG4rICogV2FpdCBmb3IgYSBmdWxsIGtodWdlcGFnZWQgc2NhbiBwYXNzIHRoYXQgc3RhcnRlZCBhZnRlciB0aGlzIGNhbGw6IHRoZVxuKyAqIHBhc3MgaW4gcHJvZ3Jlc3MgbWF5IGFscmVhZHkgaGF2ZSBwYXNzZWQgdGhpcyBtbSwgc28gZnVsbF9zY2FucyBoYXMgdG9cbisgKiBhZHZhbmNlIHR3aWNlLlxuKyAqXG4rICogQSBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBidXQgb25lIG1hZGUgd2hpbGUgaXRcbisgKiBpcyBzY2FubmluZyByYXRoZXIgdGhhbiBzbGVlcGluZyBpcyBsb3N0LCBzbyBrZWVwIHN0b3JpbmcgdW50aWwgdGhlIHBhc3NcbisgKiBsYW5kcy5cbisgKlxuKyAqIE9uZSB3YWtlIGlzIG9uZSBwYXNzIG9ubHkgaWYgcGFnZXNfdG9fc2NhbiBjb3ZlcnMgZXZlcnkgbW0gb24gdGhlIGxpc3QuXG4rICovXG4rYm9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XG4rXHR1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwLCBwb2xsX21zID0gMTA7XG4rXHR1bnNpZ25lZCBsb25nIHNsZWVwX21zO1xuK1x0aW50IHBhc3M7XG4rXG4rXHRzbGVlcF9tcyA9IHRocF9yZWFkX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIik7XG4rXHRmb3IgKHBhc3MgPSAwOyBwYXNzIFx1MDAzYyAyOyBwYXNzKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxuK1x0XHRcdHRocF9yZWFkX251bShcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1wiKSArIDE7XG4rXG4rXHRcdHdoaWxlICh0aHBfcmVhZF9udW0oXCJraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcIikgXHUwMDNjIHRhcmdldCkge1xuK1x0XHRcdGlmIChlbGFwc2VkX21zIFx1MDAzZT0gZGVhZGxpbmVfbXMpXG4rXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdFx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0XHRcdCAgICAgIHNsZWVwX21zKTtcbitcdFx0XHR1c2xlZXAocG9sbF9tcyAqIDEwMDApO1xuK1x0XHRcdGVsYXBzZWRfbXMgKz0gcG9sbF9tcztcbitcdFx0fVxuK1x0fVxuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpXG4ge1xuIFx0aWYgKCFzZXR0aW5nc19pbmRleCkge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5pbmRleCA3MjZjNzNjNDNjMDViLi4yZWExNjlkMTE3OTYyIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuQEAgLTgzLDEwICs4MywyMSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZClcbiBcdGh1Z2VwYWdlX3NhdmVfc2V0dGluZ3MoLyogdGhwID0gKi8gdHJ1ZSwgLyogaHVnZXRsYiA9ICovIGZhbHNlKTtcbiB9XG4gXG4rYm9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKTtcbitcbiB2b2lkIHRocF9zZXRfcmVhZF9haGVhZF9wYXRoKGNoYXIgKnBhdGgpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG4gdW5zaWduZWQgbG9uZyB0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcbiBcbisvKlxuKyAqIFRoZSBwZXItb3JkZXIgc2htZW1fZW5hYmxlZCBhdHRyaWJ1dGUgaXMgY3JlYXRlZCBmb3IgdGhlIG9yZGVycyB0aGUgcGFnZVxuKyAqIGNhY2hlIGNhbiBob2xkLCBub3QganVzdCBmb3Igc2htZW0sIHNvIGl0IGFuc3dlcnMgZm9yIHJlZ3VsYXIgZmlsZXMgdG9vLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0aHBfZmlsZV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpXG4re1xuK1x0cmV0dXJuIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCk7XG4rfVxuK1xuIGJvb2wgdGhwX2F2YWlsYWJsZSh2b2lkKTtcbiBib29sIHRocF9pc19lbmFibGVkKHZvaWQpO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuaW5kZXggZjgyNjczZjVmNmI0Ny4uMzM1Zjk0NmVjYTYxZSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5AQCAtMzEsNiArMzEsMTEgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xuIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yO1xuIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjtcbiBzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyO1xuK3N0YXRpYyBib29sIGNvbGxhcHNlX29yZGVyX3NldDtcbitzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyc1tOUl9PUkRFUlNdO1xuK3N0YXRpYyBpbnQgbnJfY29sbGFwc2Vfb3JkZXJzO1xuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZCA9IC0xO1xuIFxuICNkZWZpbmUgUElEX1NNQVBTIFwiL3Byb2Mvc2VsZi9zbWFwc1wiXG4gI2RlZmluZSBURVNUX0ZJTEUgXCJjb2xsYXBzZV90ZXN0X2ZpbGVcIlxuQEAgLTIyMCw2ICsyMjUsMjkgQEAgc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXG4gXHRyZXR1cm4gc3dhcDtcbiB9XG4gXG4rc3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0aW50IGk7XG4rXG4rXHQvKiBrZWVwIGtodWdlcGFnZWQgZnJvbSBjb2xsYXBzaW5nIHRoZSByYW5nZSBhbmQgc3dhcHBpbmcgaXQgYmFjayBpbiAqL1xuK1x0aWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9OT0hVR0VQQUdFKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX05PSFVHRVBBR0UpXCIpO1xuK1xuK1x0LypcbitcdCAqIFJldHJ5IHNldmVyYWwgdGltZXMgYmVjYXVzZSBNQURWX1BBR0VPVVQgaXMgYmVzdCBlZmZvcnQuICBTbGVlcFxuK1x0ICogYmV0d2VlbiB0aGUgcmV0cmllcyB0byBnaXZlIG91dHN0YW5kaW5nIHdyaXRlYmFjayBhIGNoYW5jZSB0b1xuK1x0ICogZmluaXNoLlxuK1x0ICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0MDsgaSsrKSB7XG4rXHRcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX1BBR0VPVVQpXCIpO1xuK1x0XHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0dXNsZWVwKDUwICogMTAwMCk7XG4rXHR9XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuIHN0YXRpYyB2b2lkICphbGxvY19tYXBwaW5nKGludCBucilcbiB7XG4gXHR2b2lkICpwO1xuQEAgLTUxMCw4ICs1MzgsOCBAQCBzdGF0aWMgYm9vbCBpc19hbm9uKHN0cnVjdCBtZW1fb3BzICpvcHMpXG4gc3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcbiBcdFx0XHQgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4ge1xuLVx0aW50IHJldDtcbiBcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdGludCByZXQsIGk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcIiVzLi4uXCIsIG1zZyk7XG4gXG5AQCAtNTI0LDkgKzU1MiwxNiBAQCBzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxuIFx0LypcbiBcdCAqIFByZXZlbnQga2h1Z2VwYWdlZCBpbnRlcmZlcmVuY2UgYW5kIHRlc3RzIHRoYXQgTUFEVl9DT0xMQVBTRVxuIFx0ICogaWdub3JlcyAvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9lbmFibGVkXG4rXHQgKlxuK1x0ICogXCJpbmhlcml0XCIgcmF0aGVyIHRoYW4gXCJuZXZlclwiIHNvIHRoYXQgTUFEVl9DT0xMQVBTRSBvbiBzaG1lbSBzdGlsbFxuK1x0ICogZmluZHMgYW4gb3JkZXIgdG8gYnVpbGQuXG4gXHQgKi9cbiBcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSO1xuIFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspIHtcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbitcdFx0c2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUO1xuK1x0fVxuIFx0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuIFxuIFx0LyogQ2xlYXIgVk1fTk9IVUdFUEFHRSAqL1xuQEAgLTU1Niw4ICs1OTEsMTEgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sXG4gXHRcdGludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBjb2xsYXBfb3JkZXI7XG4tXHRpbnQgZnVsbF9zY2Fucztcbi1cdGludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovXG4rXHR1bnNpZ25lZCBsb25nIGJ5dGVzID0gKHVuc2lnbmVkIGxvbmcpbnJfaHBhZ2VzICogaHBhZ2Vfc2l6ZTtcbitcdGludCB0aW1lb3V0LCBmdWxsX3NjYW5zO1xuK1xuK1x0LyogSGFsZi1zZWNvbmQgdGlja3M6IHRocmVlIHNlY29uZHMgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gKi9cbitcdHRpbWVvdXQgPSA2ICsgMiAqIChieXRlcyAvICgxMjhVTCBcdTAwM2NcdTAwM2MgMjApKTtcbiBcbiBcdC8qIFNhbml0eSBjaGVjayAqL1xuIFx0aWYgKCFvcHMtXHUwMDNlY2hlY2tfaHVnZShwLCBsZW4sIDAsIGhwYWdlX3NpemUpKVxuQEAgLTgyMCwxMiArODU4LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXG4gXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFxuIFx0a3NmdF9wcmludF9tc2coXCJTd2Fwb3V0IG9uZSBwYWdlLi4uXCIpO1xuLVx0aWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfUEFHRU9VVClcIik7XG4tXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XG4rXHRpZiAoc3dhcG91dF9yYW5nZShwLCBwYWdlX3NpemUpKSB7XG4gXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1x0XHRza2lwKFwiQ291bGQgbm90IHN3YXAgb3V0XCIpO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbkBAIC04NDYsMTIgKzg4MiwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbiBcdGtzZnRfcHJpbnRfbXNnKFwiU3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlwiLCBtYXhfcHRlc19zd2FwICsgMSwgaHBhZ2VfcG1kX25yKTtcbi1cdGlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICsgMSkgKiBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVwiKTtcbi1cdGlmIChjaGVja19zd2FwKHAsIChtYXhfcHRlc19zd2FwICsgMSkgKiBwYWdlX3NpemUpKSB7XG4rXHRpZiAoc3dhcG91dF9yYW5nZShwLCAobWF4X3B0ZXNfc3dhcCArIDEpICogcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwiT0tcIik7XG4gXHR9IGVsc2Uge1xuLVx0XHRmYWlsKFwiRmFpbFwiKTtcbitcdFx0c2tpcChcIkNvdWxkIG5vdCBzd2FwIG91dFwiKTtcbiBcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG5AQCAtODYzLDEyICs4OTcsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cbiBcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcdFx0a3NmdF9wcmludF9tc2coXCJTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCIsIG1heF9wdGVzX3N3YXAsXG4gXHRcdCAgICAgICBocGFnZV9wbWRfbnIpO1xuLVx0XHRpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVwiKTtcbi1cdFx0aWYgKGNoZWNrX3N3YXAocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbitcdFx0aWYgKHN3YXBvdXRfcmFuZ2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbiBcdFx0XHRzdWNjZXNzKFwiT0tcIik7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0ZmFpbChcIkZhaWxcIik7XG4rXHRcdFx0c2tpcChcIkNvdWxkIG5vdCBzd2FwIG91dFwiKTtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFxuQEAgLTkzNSw2ICs5NjcsMTYgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcbiBcdHZvaWQgKnA7XG4gXHRpbnQgaTtcbiBcbitcdC8qXG4rXHQgKiBUaGlzIG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMgaW4gYSByb3csIHdoaWNoIHRoZVxuK1x0ICogYWxsb2NhdG9yIHdpbGwgbm90IHN1cHBseSBpZiB0aGUgUE1EIGlzIHZlcnkgbGFyZ2UuXG4rXHQgKi9cbitcdGlmIChocGFnZV9wbWRfc2l6ZSBcdTAwM2UgKDMyVUwgXHUwMDNjXHUwMDNjIDIwKSkge1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxuXCIsXG4rXHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbiBcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiBcdGtzZnRfcHJpbnRfbXNnKFwiQ29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXG5cIik7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBocGFnZV9wbWRfbnI7IGkrKykge1xuQEAgLTExMjUsNiArMTE2NywxMDMgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuIH1cbiBcbisvKlxuKyAqIFRoZSBwYXJlbnQgd3JpdGVzIHRvIHRoZSBmb3JrLXNoYXJlZCByYW5nZSB0aHJvdWdob3V0IHRoZSBjaGlsZCdzXG4rICogY29sbGFwc2UuICBDb1cgbXVzdCBrZWVwIHRoZSB0d28gYXBhcnQ6IHRoZSBjaGlsZCBzZWVzIHRoZSBwcmUtZm9ya1xuKyAqIGNvbnRlbnQsIHRoZSBwYXJlbnQgb25seSBpdHMgb3duIHdyaXRlcy5cbisgKi9cbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9mb3JrX2Nvd19yYWNlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdGNvbnN0IGludCBzdHJpZGUgPSBwYWdlX3NpemUgLyBzaXplb2YoaW50KTtcbitcdGludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG47XG4rXHR1bnNpZ25lZCBsb25nIHNoYXJlZDtcbitcdHZvbGF0aWxlIGludCAqaXA7XG4rXHRwaWRfdCBjaGlsZDtcbitcdGludCBzeW5jWzJdO1xuK1x0Y2hhciBnbyA9IDE7XG4rXHR2b2lkICpwO1xuK1xuK1x0LyogQXQgYSBwYWdlIHBlciAxMCBtcywgNjQgcGFnZXMgc3ByZWFkIHRoZSB3cml0ZXMgYWNyb3NzIHRoZSBjb2xsYXBzZSAqL1xuK1x0biA9IDY0O1xuK1x0c2hhcmVkID0gbiAqIHBhZ2Vfc2l6ZTtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdC8qIFNoYXJlZCBwcmVmaXgsIHdpdGggdGhlIHByZS1mb3JrIHBhdHRlcm4gKi9cbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBzaGFyZWQpO1xuK1x0aWYgKHBpcGUoc3luYykpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcInBpcGUoKVwiKTtcbitcbitcdC8qIEEgdm9sYXRpbGUgcG9pbnRlciBzbyB0aGUgc3RvcmVzIGFyZSBub3QgbWVyZ2VkIG9yIGRyb3BwZWQgKi9cbitcdGlwID0gcDtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiRm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cIik7XG4rXHRjaGlsZCA9IGZvcmsoKTtcbitcdGlmICghY2hpbGQpIHtcbitcdFx0aW50IGNvbGxhcHNlX3N0YXR1cztcbitcbitcdFx0Y2xvc2Uoc3luY1swXSk7XG4rXHRcdC8qIFByaXZhdGUgcmVtYWluZGVyICovXG4rXHRcdG9wcy1cdTAwM2VmYXVsdChwLCBzaGFyZWQsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0LyogU3RhcnQgdGhlIHBhcmVudCB1bnNoYXJpbmcsIGFuZCBnaXZlIGl0IGEgaGVhZCBzdGFydCAqL1xuK1x0XHRpZiAod3JpdGUoc3luY1sxXSwgXHUwMDI2Z28sIDEpICE9IDEpXG4rXHRcdFx0X2V4aXQoS1NGVF9GQUlMKTtcbitcdFx0dXNsZWVwKDUwMDApO1xuK1x0XHRjLVx1MDAzZWNvbGxhcHNlKFwiQ29sbGFwc2UgYSByYW5nZSB0aGUgcGFyZW50IGlzIHdyaXRpbmcgdG9cIixcbitcdFx0XHQgICAgcCwgMSwgb3BzLCB0cnVlKTtcbitcdFx0Y29sbGFwc2Vfc3RhdHVzID0gZXhpdF9zdGF0dXM7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkrKylcbitcdFx0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSArIDB4ZGVhZDAwMDApXG4rXHRcdFx0XHRicmVhaztcbitcdFx0aWYgKGkgPT0gbilcbitcdFx0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRcdGVsc2VcbitcdFx0XHRmYWlsKFwiRmFpbDogY2hpbGQgY29udGVudFwiKTtcbitcdFx0LyogVGhlIGNvbnRlbnQgY2hlY2sgbXVzdCBub3QgYnVyeSBhIGZhaWxlZCBjb2xsYXBzZSAqL1xuK1x0XHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxuK1x0XHRcdGV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzO1xuK1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuK1x0fVxuK1xuK1x0Y2xvc2Uoc3luY1sxXSk7XG4rXHRpZiAocmVhZChzeW5jWzBdLCBcdTAwMjZnbywgMSkgIT0gMSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiY2hpbGQgbmV2ZXIgcmVhY2hlZCB0aGUgY29sbGFwc2VcXG5cIik7XG4rXG4rXHQvKlxuK1x0ICogVW5zaGFyZSBvbmUgcGFnZSBhdCBhIHRpbWU6IGEgYnVyc3Qgd291bGQgYnJlYWsgQ29XIG9uIHRoZSB3aG9sZVxuK1x0ICogcmFuZ2UgYmVmb3JlIHRoZSBjb2xsYXBzZSBzdGFydHMsIGxlYXZpbmcgbm90aGluZyBzaGFyZWQgdG8gY29sbGFwc2UuXG4rXHQgKi9cbitcdGkgPSAwO1xuK1x0Zm9yICg7Oykge1xuK1x0XHRpZiAoaSBcdTAwM2MgbilcbitcdFx0XHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xuK1x0XHRpKys7XG4rXHRcdHVzbGVlcCgxMCAqIDEwMDApO1xuK1x0XHRpZiAod2FpdHBpZChjaGlsZCwgXHUwMDI2d3N0YXR1cywgV05PSEFORykpXG4rXHRcdFx0YnJlYWs7XG4rXHR9XG4rXG4rXHQvKiBGaW5pc2ggd2hhdGV2ZXIgdGhlIHBhY2VkIHN3ZWVwIGRpZCBub3QgcmVhY2ggKi9cbitcdGZvciAoOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdGlwW2kgKiBzdHJpZGVdID0gaSArIDB4YmVlZjAwMDA7XG4rXHQvKiBBIGNoaWxkIHRoYXQgZGllZCByZWFkaW5nIHRoZSByYWNpbmcgcGFnZXMgaXMgYSBmYWlsdXJlLCBub3QgYSB6ZXJvICovXG4rXHRjaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICsgMHhiZWVmMDAwMClcbitcdFx0XHRicmVhaztcbitcdGlmIChpID09IG4pXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWw6IHBhcmVudCBjb250ZW50XCIpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHQvKiBUaGUgcGFyZW50J3MgY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQncyB2ZXJkaWN0ICovXG4rXHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxuK1x0XHRleGl0X3N0YXR1cyA9IGNoaWxkX3N0YXR1cztcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0XHRcdFx0XHQgICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuIHtcbkBAIC0xMTcwLDYgKzEzMDksMjAwIEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuIH1cbiBcbisvKiBTbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIHdpbGwgY29uc2lkZXIgZm9yIG1USFAgY29sbGFwc2UgKi9cbisjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcbitcbisvKiBUaW1lIGJ1ZGdldCBmb3Igb25lIGtodWdlcGFnZWQgcGFzcyBpbiB0aGUgY29sbGFwc2Vfb3JkZXJfKiBjYXNlcyAqL1xuKyNkZWZpbmUgTVRIUF9QQVNTX1RJTUVPVVRfUyAzMFxuK1xuK3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKVxuK3tcbitcdHJldHVybiBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcHNlX29yZGVyO1xuK31cbitcbitzdGF0aWMgdm9pZCBtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKHZvaWQpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0aW50IGk7XG4rXG4rXHQvKlxuK1x0ICogT25seSB0aGUgdGFyZ2V0IG9yZGVyLCBhbmQgb25seSBmb3IgbWFkdmlzZTogdGhlIGNhc2VzIGZhdWx0IHRoZWlyXG4rXHQgKiByZWdpb24gZmlyc3QsIHNvIHRoZSBzb3VyY2VzIHN0YXkgb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCBmb3IuXG4rXHQgKi9cbitcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0c2V0dGluZ3MuaHVnZXBhZ2VzW2NvbGxhcHNlX29yZGVyXS5lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rfVxuK1xuK3N0YXRpYyBib29sIGFsbF93aW5kb3dzX2F0X29yZGVyKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4re1xuK1x0cmV0dXJuIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihwLCBsZW4sIGNvbGxhcHNlX29yZGVyLFxuK1x0XHRcdFx0XHRwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgYW55X3dpbmRvd19hdF9vcmRlcih2b2lkICpwLCBzaXplX3QgbGVuKVxuK3tcbitcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4rXHRjaGFyICphZGRyID0gcDtcbitcbitcdGZvciAoOyBsZW4gXHUwMDNlPSB3aW5kb3c7IGFkZHIgKz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7XG4rXHRcdGlmIChhbGxfd2luZG93c19hdF9vcmRlcihhZGRyLCB3aW5kb3cpKVxuK1x0XHRcdHJldHVybiB0cnVlO1xuK1x0fVxuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuK1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuK1x0dm9pZCAqcDtcbitcbitcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuK1x0aWYgKGFueV93aW5kb3dfYXRfb3JkZXIocCwgaHBhZ2VfcG1kX3NpemUpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCIpO1xuK1xuK1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXCIpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLlwiKTtcbitcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCArIHdpbmRvdywgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0ICFhbnlfd2luZG93X2F0X29yZGVyKHAsIHdpbmRvdykgXHUwMDI2XHUwMDI2XG4rXHRcdCAhYW55X3dpbmRvd19hdF9vcmRlcihwICsgMiAqIHdpbmRvdyxcbitcdFx0XHRcdCAgICAgIGhwYWdlX3BtZF9zaXplIC0gMiAqIHdpbmRvdykpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgd2luZG93LCAyICogd2luZG93KTtcbitcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdHZvaWQgKnA7XG4rXG4rXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgcGFnZV9zaXplKTtcbitcdGlmIChhbnlfd2luZG93X2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwiKTtcbitcbitcdGlmIChtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVwiKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXCIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX2Z1bGxfcGFzcyhNVEhQX1BBU1NfVElNRU9VVF9TKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmIChhbGxfd2luZG93c19hdF9vcmRlcihwLCBtdGhwX3dpbmRvd19zaXplKCkpKVxuK1x0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRlbHNlXG4rXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1xuK1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIHBhZ2Vfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbitcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4rXHR2b2lkICpwO1xuK1xuK1x0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xuK1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IDA7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XG4rXHRpZiAoYW55X3dpbmRvd19hdF9vcmRlcihwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cIik7XG4rXG4rXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9IVUdFUEFHRSlcIik7XG4rXHRrc2Z0X3ByaW50X21zZyhcIkNvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlwiKTtcbitcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoTVRIUF9QQVNTX1RJTUVPVVRfUykpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAoYWxsX3dpbmRvd3NfYXRfb3JkZXIocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0ICFhbnlfd2luZG93X2F0X29yZGVyKHAgKyB3aW5kb3csIHdpbmRvdykpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0aW50IHNvdXJjZV9vcmRlciA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyIDogTUlOX01USFBfT1JERVI7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dm9pZCAqcDtcbitcbitcdGlmIChzb3VyY2Vfb3JkZXIgXHUwMDNlPSBjb2xsYXBzZV9vcmRlciB8fFxuK1x0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgc291cmNlX29yZGVyKSkpIHtcbitcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwiJXM6IG5vIHN1cHBvcnRlZCBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxuXCIsXG4rXHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbitcbitcdHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4rXHRzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbitcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXG4rXHQvKlxuK1x0ICogVGhlIGFsbG9jYXRvciBjYW4gZmFsbCBiYWNrIHRvIHNtYWxsZXIgZm9saW9zIHVuZGVyIGZyYWdtZW50YXRpb247XG4rXHQgKiBoYXZpbmcgbm90aGluZyB0byBjb2xsYXBzZSBmcm9tIGlzIG5vdCBhIGZhaWx1cmUuXG4rXHQgKi9cbitcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsXG4rXHRcdFx0XHQgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIk5vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi5cIiwgc291cmNlX29yZGVyKTtcbitcdFx0c2tpcChcIlNraXBcIik7XG4rXHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXCIpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi5cIixcbitcdFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XG4rXHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKE1USFBfUEFTU19USU1FT1VUX1MpKVxuK1x0XHRmYWlsKFwiVGltZW91dFwiKTtcbitcdGVsc2UgaWYgKGFsbF93aW5kb3dzX2F0X29yZGVyKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCJcXG5Vc2FnZTogLi9raHVnZXBhZ2VkIFtPUFRJT05TXSBcdTAwM2N0ZXN0IHR5cGVcdTAwM2UgW2Rpcl1cXG5cXG5cIik7XG5AQCAtMTE4NywxMSArMTUyMCwxNCBAQCBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuIFx0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdC1zOiBtVEhQIHNpemUsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxcblwiKTtcbiBcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXG5cIik7XG4gXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIERlZmF1bHRzIHRvIGV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBiZWxvdyB0aGUgUE1ELlxcblwiKTtcbitcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQgICAgLXMsIGlmIHNldCwgaXMgdGhlIHNvdXJjZSBvcmRlciBmb3IgdGhlIG1peGVkLXNvdXJjZSBjYXNlLlxcblwiKTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuK1x0Ym9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlO1xuIFx0aW50IG9wdDtcbiBcdGNoYXIgKmJ1ZjtcbiBcdGNvbnN0IGNoYXIgKnRva2VuO1xuQEAgLTEyMDMsNiArMTUzOSw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2MnOlxuIFx0XHRcdGNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpO1xuK1x0XHRcdGNvbGxhcHNlX29yZGVyX3NldCA9IHRydWU7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2gnOlxuIFx0XHRkZWZhdWx0OlxuQEAgLTEyMTAsMTIgKzE1NDcsMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0fVxuIFx0fVxuIFxuK1x0LypcbitcdCAqIEJvdGggb3JkZXJzIGVuZCB1cCBhcyBhcnJheSBpbmRpY2VzIGFuZCBzaGlmdCBjb3VudHMsIHNvIG5laXRoZXJcbitcdCAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLlxuK1x0ICovXG4rXHRpZiAoYW5vbl9vcmRlciBcdTAwM2MgMCB8fCBhbm9uX29yZGVyIFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIi1zIHRha2VzIGFuIG9yZGVyIGluIDAuLiVkLCBub3QgJWRcXG5cIixcbitcdFx0XHRcdCAgIGhwYWdlX3BtZF9vcmRlciwgYW5vbl9vcmRlcik7XG4rXHRpZiAoY29sbGFwc2Vfb3JkZXJfc2V0IFx1MDAyNlx1MDAyNlxuK1x0ICAgIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IDAgfHwgY29sbGFwc2Vfb3JkZXIgXHUwMDNlPSBocGFnZV9wbWRfb3JkZXIpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCItYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXFxuXCIsXG4rXHRcdFx0XHQgICBocGFnZV9wbWRfb3JkZXIgLSAxLCBjb2xsYXBzZV9vcmRlcik7XG4rXG4gXHRhcmd2ICs9IG9wdGluZDtcbiBcdGFyZ2MgLT0gb3B0aW5kO1xuIFxuIFx0aWYgKGFyZ2MgPT0gMCkge1xuLVx0XHQvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqL1xuK1x0XHQvKiBObyBhcmd1bWVudHM6IGFub24gdW5kZXIgZXZlcnkgY29udGV4dCAqL1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0XHRyZXR1cm47XG5AQCAtMTIyNiwxMyArMTU3NiwxNCBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFxuIFx0aWYgKCFzdHJjbXAodG9rZW4sIFwiYWxsXCIpKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbitcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dDtcbiBcdFx0bWFkdmlzZV9jb250ZXh0ID0gIFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xuK1x0XHQvKiBUaGUgbVRIUCBjb250ZXh0IGhhcyBvbmx5IGFub24gY2FzZXM7IGxldCBvdGhlciBtZW1fdHlwZXMgZHJvcCBpdCAqL1xuK1x0XHRtdGhwX2NvbnRleHRfaW1wbGllZCA9IHRydWU7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwia2h1Z2VwYWdlZFwiKSkge1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwibXRocF9raHVnZXBhZ2VkXCIpKSB7XG4gXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4tXHRcdGlmIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IDAgfHwgY29sbGFwc2Vfb3JkZXIgXHUwMDNlPSBocGFnZV9wbWRfb3JkZXIpXG4tXHRcdFx0dXNhZ2UoKTtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCJtYWR2aXNlXCIpKSB7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdH0gZWxzZSB7XG5AQCAtMTI0OCwyMCArMTU5OSwyMCBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gIFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcztcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0XHRzaG1lbV9vcHMgPSBcdTAwMjZfX3NobWVtX29wcztcbi1cdFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KVxuLVx0XHRcdHVzYWdlKCk7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcImFub25cIikpIHtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCJmaWxlXCIpKSB7XG4gXHRcdHJlYWRfb25seV9maWxlX29wcyA9ICBcdTAwMjZfX3JlYWRfb25seV9maWxlX29wcztcbiBcdFx0cmVhZF93cml0ZV9maWxlX3JlYWRfb3BzID0gIFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gIFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcztcbi1cdFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KVxuK1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuK1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9IE5VTEw7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcInNobWVtXCIpKSB7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4rXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCBcdTAwMjZcdTAwMjYgIW10aHBfY29udGV4dF9pbXBsaWVkKVxuIFx0XHRcdHVzYWdlKCk7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gTlVMTDtcbiBcdH0gZWxzZSB7XG4gXHRcdHVzYWdlKCk7XG4gXHR9XG5AQCAtMTI4Myw5ICsxNjM0LDEwIEBAIHN0cnVjdCB0ZXN0X2Nhc2Uge1xuIFx0c3RydWN0IG1lbV9vcHMgKm9wcztcbiBcdGNvbnN0IGNoYXIgKmRlc2M7XG4gXHR0ZXN0X2ZuIGZuO1xuK1x0aW50IG9yZGVyO1x0XHQvKiBtVEhQIGNvbnRleHRzOiB0aGUgY29sbGFwc2Ugb3JkZXIgKi9cbiB9O1xuIFxuLSNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgNjRcbisjZGVmaW5lIE1BWF9URVNUX0NBU0VTIDI1NlxuIHN0YXRpYyBzdHJ1Y3QgdGVzdF9jYXNlIHRlc3RfY2FzZXNbTUFYX1RFU1RfQ0FTRVNdO1xuIHN0YXRpYyBpbnQgbnJfdGVzdF9jYXNlcztcbiBcbkBAIC0xMjk4LDYgKzE2NTAsNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXHRcdFx0Lm9wc1x0PSBvLFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5kZXNjXHQ9ICN0LFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5mblx0PSB0LFx0XHRcdFx0XHRcXFxuK1x0XHRcdC5vcmRlclx0PSBjb2xsYXBzZV9vcmRlcixcdFx0XHRcXFxuIFx0XHR9O1x0XHRcdFx0XHRcdFx0XFxcbiBcdH1cdFx0XHRcdFx0XHRcdFx0XFxcbiBcdH0gd2hpbGUgKDApXG5AQCAtMTMzOCw4ICsxNjkxLDY2IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcbiBcdHBhcnNlX3Rlc3RfdHlwZShhcmdjLCBhcmd2KTtcbiBcbitcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIG9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7XG4rXG4rXHRcdGlmIChjb2xsYXBzZV9vcmRlcl9zZXQpIHtcbitcdFx0XHRpZiAoIShvcmRlcnMgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGNvbGxhcHNlX29yZGVyKSkpXG4rXHRcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIk9yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwiLFxuK1x0XHRcdFx0XHQgICAgICAgY29sbGFwc2Vfb3JkZXIpO1xuK1x0XHRcdGlmIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IGFub25fb3JkZXIpXG4rXHRcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIi1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXFxuXCIsXG4rXHRcdFx0XHRcdCAgICAgICBjb2xsYXBzZV9vcmRlciwgYW5vbl9vcmRlcik7XG4rXHRcdFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycysrXSA9IGNvbGxhcHNlX29yZGVyO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogRXZlcnkgc3VwcG9ydGVkIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2U6IC1zIG1ha2VzIHRoZVxuK1x0XHRcdCAqIGZhdWx0IHBhdGggaGFuZCBvdXQgZm9saW9zIG9mIHRoYXQgb3JkZXIsIHNvIGEgdGFyZ2V0XG4rXHRcdFx0ICogYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2UuXG4rXHRcdFx0ICovXG4rXHRcdFx0aW50IGZpcnN0ID0gYW5vbl9vcmRlciArIDE7XG4rXG4rXHRcdFx0aWYgKGZpcnN0IFx1MDAzYyBNSU5fTVRIUF9PUkRFUilcbitcdFx0XHRcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XG4rXHRcdFx0Zm9yIChpbnQgaSA9IGZpcnN0OyBpIFx1MDAzYyBocGFnZV9wbWRfb3JkZXI7IGkrKykge1xuK1x0XHRcdFx0aWYgKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpXG4rXHRcdFx0XHRcdGNvbGxhcHNlX29yZGVyc1tucl9jb2xsYXBzZV9vcmRlcnMrK10gPSBpO1xuK1x0XHRcdH1cbitcdFx0XHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcbitcdFx0XHRcdGtzZnRfcHJpbnRfbXNnKFwibVRIUCBjYXNlcyBza2lwcGVkOiBubyBvcmRlciBhYm92ZSB0aGUgc291cmNlXFxuXCIpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcbitcdFx0cGFnZW1hcF9mZCA9IG9wZW4oXCIvcHJvYy9zZWxmL3BhZ2VtYXBcIiwgT19SRE9OTFkpO1xuK1x0XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcIik7XG4rXHRcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwiL3Byb2Mva3BhZ2VmbGFnc1wiLCBPX1JET05MWSk7XG4rXHRcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm9wZW4oL3Byb2Mva3BhZ2VmbGFncylcIik7XG4rXHR9XG4rXG4gXHRzZXRidWYoc3Rkb3V0LCBOVUxMKTtcbiBcbitcdC8qXG4rXHQgKiBXaXRob3V0IGEgUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW8gdGhlIGtlcm5lbCByZWZ1c2VzIHRoZXNlXG4rXHQgKiBjb2xsYXBzZXMsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gdGVzdC5cbitcdCAqL1xuK1x0aWYgKCEodGhwX2ZpbGVfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBocGFnZV9wbWRfb3JkZXIpKSkge1xuK1x0XHRpZiAoc2htZW1fb3BzKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cXG5cIik7XG4rXHRcdFx0c2htZW1fb3BzID0gTlVMTDtcbitcdFx0fVxuK1x0XHRpZiAocmVhZF9vbmx5X2ZpbGVfb3BzKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgZmlsZVxcblwiKTtcbitcdFx0XHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xuK1x0XHRcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XG4rXHRcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7XG4rXHRcdH1cbitcdFx0aWYgKCFhbm9uX29wcyBcdTAwMjZcdTAwMjYgIXNobWVtX29wcyBcdTAwMjZcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcbitcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIk5vIG1lbV90eXBlIGxlZnQgdG8gcnVuXFxuXCIpO1xuK1x0fVxuK1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxO1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3N3YXAgPSBocGFnZV9wbWRfbnIgLyA4O1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3NoYXJlZCA9IGhwYWdlX3BtZF9uciAvIDI7XG5AQCAtMTM1Nyw3ICsxNzY4LDE3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHNobWVtX29wcyk7XG4tXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgbnJfY29sbGFwc2Vfb3JkZXJzOyBpKyspIHtcbitcdFx0Y29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07XG4rXHRcdFRFU1QoY29sbGFwc2VfZnVsbCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdH1cbitcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTEzNjUsMTEgKzE3ODYsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgc2htZW1fb3BzKTtcbiBcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuLVx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFxuLVx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbi1cbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTE0MjQsNiArMTg0Miw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbitcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuK1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTQzOSw3ICsxODYwLDE1IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBucl90ZXN0X2Nhc2VzOyBpKyspIHtcbiBcdFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFx1MDAyNnRlc3RfY2FzZXNbaV07XG4gXG4tXHRcdGtzZnRfcHJpbnRfbXNnKFwiXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwiLCB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUpO1xuK1x0XHRpZiAodC1cdTAwM2VjdHggPT0gXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuK1x0XHRcdGNvbGxhcHNlX29yZGVyID0gdC1cdTAwM2VvcmRlcjtcbitcdFx0XHRrc2Z0X3ByaW50X21zZyhcIlxcbiMgUnVuIHRlc3Q6ICVzICglczolcywgb3JkZXIgJWQpXFxuXCIsXG4rXHRcdFx0XHQgICAgICAgdC1cdTAwM2VkZXNjLCB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lLFxuK1x0XHRcdFx0ICAgICAgIHQtXHUwMDNlb3JkZXIpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwiLCB0LVx1MDAzZWRlc2MsXG4rXHRcdFx0XHQgICAgICAgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4rXHRcdH1cbiBcdFx0dC1cdTAwM2Vmbih0LVx1MDAzZWN0eCwgdC1cdTAwM2VvcHMpO1xuIFx0fVxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5jMzQ3OGI1MTIzZTIzXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xuQEAgLTAsMCArMSw1MzMgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogUmFjZSBjb2xsYXBzZSBhZ2FpbnN0IGZhdWx0cywgR1VQIHBpbnMsIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRFxuKyAqIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLiAgQSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3IgYXNcbisgKiB6ZXJvLCBuZXZlciBhbnl0aGluZyBlbHNlOyB0aGUga2VybmVsJ3Mgb3duIGFzc2VydGlvbnMgaW4gZG1lc2cgYXJlIHRoZVxuKyAqIG90aGVyIGhhbGYgb2YgdGhlIGNoZWNrLlxuKyAqL1xuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwia3NlbGZ0ZXN0LmhcIlxuKyNpbmNsdWRlIFwidm1fdXRpbC5oXCJcbisjaW5jbHVkZSBcImh1Z2VwYWdlX3NldHRpbmdzLmhcIlxuKyNpbmNsdWRlIFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFwiXG4rXG4rI2lmbmRlZiBGT0xMX1dSSVRFXG4rI2RlZmluZSBGT0xMX1dSSVRFIDB4MDFcbisjZW5kaWZcbitcbisjZGVmaW5lIEJBU0VfQUREUlx0KCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuKyNkZWZpbmUgUEFTU19USU1FT1VUX1NcdDMwXG4rXG4rLypcbisgKiBQTUQtc2l6ZWQgYXJlYXMgdGhlIHJhY2luZyB0aHJlYWRzIHNoYXJlLCBwbHVzIG9uZSBmb3IgdGhlIG1yZW1hcFxuKyAqIHRocmVhZC4gIC1hIHNocmlua3MgaXQgd2hlcmUgYSBQTUQgaXMgNTEyTS5cbisgKi9cbisjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XG4rc3RhdGljIGludCBucl9hcmVhcztcbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XG4rLyogbnJfYXJlYXMgUE1ELXNpemVkIGFyZWFzOyB0aGUgbGFzdCBvbmUgYmVsb25ncyB0byB0aGUgbXJlbWFwIHRocmVhZCAqL1xuK3N0YXRpYyBjaGFyICpyZWdpb247XG4rc3RhdGljIGNoYXIgKm1yZW1hcF9hcmVhO1xuK3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcbitzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1xuK3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplO1xuK3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4rc3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xuK3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkO1xuK1xuK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuK3tcbitcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4rXG4rXHRyZXR1cm4gdmFsID8gdmFsIDogMTtcdC8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqL1xuK31cbitcbisvKiBaZXJvIG1lYW5zIG5ldmVyIHdyaXR0ZW47IGFueXRoaW5nIGVsc2UgbXVzdCBiZSB0aGlzIHBhZ2UncyBwYXR0ZXJuICovXG4rc3RhdGljIGJvb2wgcGFnZV9pc19jb3JydXB0KHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGludCAqdmFsKVxuK3tcbitcdCp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRyZXR1cm4gKnZhbCBcdTAwMjZcdTAwMjYgKnZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY2hlY2tfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuK3tcbitcdHVuc2lnbmVkIGludCB2YWw7XG4rXG4rXHRpZiAocGFnZV9pc19jb3JydXB0KHBhZ2VfaWR4LCBcdTAwMjZ2YWwpKSB7XG4rXHRcdGNvcnJ1cHRlZCA9IDE7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiQ29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcblwiLFxuK1x0XHRcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNoYXJlZF9wYWdlcyh2b2lkKVxuK3tcbitcdHJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbit9XG4rXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcbit7XG4rXHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcmFuZF9yKHNlZWQpICUgc2hhcmVkX3BhZ2VzKCk7XG4rfVxuK1xuKy8qIENsYW1wIHNvIGEgcmFuZ2UgbmV2ZXIgcmVhY2hlcyB0aGUgbXJlbWFwIHRocmVhZCdzIGFyZWEgKi9cbitzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XG4rXG4rXHRyZXR1cm4gd2FudCBcdTAwM2MgbGVmdCA/IHdhbnQgOiBsZWZ0O1xuK31cbitcbitzdGF0aWMgdm9pZCAqZmF1bHRlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbitcbitcdFx0aWYgKHJhbmRfcihcdTAwMjZzZWVkKSBcdTAwMjYgMSlcbitcdFx0XHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPVxuK1x0XHRcdFx0cGF0dGVybihwYWdlX2lkeCk7XG4rXHRcdGVsc2VcbitcdFx0XHRjaGVja19wYWdlKHBhZ2VfaWR4KTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqZG9udG5lZWRfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1xuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgXHUwMDNjXHUwMDNjIChyYW5kX3IoXHUwMDI2c2VlZCkgJSA2KTtcdC8qIDEuLjMyIHBhZ2VzICovXG4rXG4rXHRcdC8qXG4rXHRcdCAqIE5vdyBhbmQgdGhlbiB6YXAgYSB3aG9sZSBQTUQtYWxpZ25lZCBhcmVhOiBvbmx5IGEgemFwIHRoYXRcbitcdFx0ICogY292ZXJzIHRoZSBmdWxsIHRhYmxlIGZyZWVzIHRoZSB0YWJsZSBpdHNlbGYgKENPTkZJR19QVF9SRUNMQUlNKS5cbitcdFx0ICovXG4rXHRcdGlmICghKHJhbmRfcihcdTAwMjZzZWVkKSAlIDY0KSkge1xuK1x0XHRcdHVuc2lnbmVkIGxvbmcgYXJlYSA9IHBhZ2VfaWR4IC9cbitcdFx0XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTtcbitcbitcdFx0XHRtYWR2aXNlKHJlZ2lvbiArIGFyZWEgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHRcdGhwYWdlX3BtZF9zaXplLCBNQURWX0RPTlRORUVEKTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRtYWR2aXNlKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplLFxuK1x0XHRcdFx0cm9vbV9mcm9tKHBhZ2VfaWR4LCBucikgKiBwYWdlX3NpemUsXG4rXHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbitcdFx0fVxuK1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgNTAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqcGlubmVyX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbnIgPSByb29tX2Zyb20ocGFnZV9pZHgsIDE2KTtcbitcbitcdFx0Z3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuK1x0XHRndXAuc2l6ZSA9IG5yICogcGFnZV9zaXplO1xuK1x0XHRndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjtcbitcdFx0Z3VwLmd1cF9mbGFncyA9IEZPTExfV1JJVEU7XG4rXHRcdC8qIFJhY2luZyBNQURWX0RPTlRORUVEIG1ha2VzIHRyYW5zaWVudCBmYWlsdXJlcyBleHBlY3RlZCAqL1xuK1x0XHRpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgXHUwMDI2Z3VwKTtcbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0XHRpZiAocGlkID09IDApIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsO1xuK1x0XHRcdGludCBiYWQgPSAwO1xuK1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaG9sZCBzdGRvdXQnc1xuK1x0XHRcdCAqIGxvY2sgYWNyb3NzIHRoZSBmb3JrLCBhbmQgcHJpbnRpbmcgdW5kZXIgaXQgaGFuZ3MuXG4rXHRcdFx0ICovXG4rXHRcdFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIDE2OyBpKyspXG4rXHRcdFx0XHRiYWQgfD0gcGFnZV9pc19jb3JydXB0KHJhbmRfcGFnZShcdTAwMjZzZWVkKSwgXHUwMDI2dmFsKTtcbitcdFx0XHRfZXhpdChiYWQpO1xuK1x0XHR9XG4rXHRcdGlmIChwaWQgXHUwMDNlIDApIHtcbitcdFx0XHRpbnQgd3N0YXR1cztcbitcbitcdFx0XHRpZiAod2FpdHBpZChwaWQsIFx1MDAyNndzdGF0dXMsIDApIFx1MDAzYyAwKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwid2FpdHBpZCgpXCIpO1xuK1x0XHRcdC8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28gKi9cbitcdFx0XHRpZiAoIVdJRkVYSVRFRCh3c3RhdHVzKSB8fCBXRVhJVFNUQVRVUyh3c3RhdHVzKSlcbitcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4rXHRcdH1cbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMDApO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1xuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdHZvaWQgKnA7XG4rXG4rXHRcdHAgPSBtcmVtYXAobXJlbWFwX2FyZWEsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpO1xuK1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1yZW1hcCgpIGF3YXlcIik7XG4rXHRcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyA4OyBpKyspXG4rXHRcdFx0bXJlbWFwX3NjcmF0Y2hbKHJhbmRfcihcdTAwMjZzZWVkKSAlXG4rXHRcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxO1xuK1x0XHRwID0gbXJlbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0ICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9hcmVhKTtcbitcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtcmVtYXAoKSBiYWNrXCIpO1xuK1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rLypcbisgKiBTd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBub3RoaW5nIGVsc2Ugd3JpdGVzLCBzbyBhIHBhZ2Unc1xuKyAqIHBhdHRlcm4gbXVzdCBzdXJ2aXZlIHRoZSB0cmlwIHRocm91Z2ggc3dhcCBleGFjdGx5LlxuKyAqL1xuK3N0YXRpYyB2b2lkICpwYWdlb3V0X2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSsrKVxuK1x0XHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpKyspIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICtcbitcdFx0XHRcdFx0XHRcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRcdFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKiBDb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIHdoaWxlIHRoZXkgYXJlIGJlaW5nIGdhdGhlcmVkICovXG4rc3RhdGljIHZvaWQgKmNvbXBhY3Rvcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXHRpbnQgZmQgPSBvcGVuKFwiL3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5XCIsIE9fV1JPTkxZKTtcbitcbitcdGlmIChmZCBcdTAwM2MgMCkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIk5vIGNvbXBhY3RfbWVtb3J5OyBjb21wYWN0b3IgaWRsZVxcblwiKTtcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHR9XG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0aWYgKHdyaXRlKGZkLCBcIjFcIiwgMSkgXHUwMDNjIDApXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHVzbGVlcCgxMDAwMCArIHJhbmRfcihcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XG4rXHR9XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcbit7XG4rXHRjaGFyIGxpbmVbMjU2XTtcbitcdGludCBsaW5lcyA9IDA7XG4rXHRGSUxFICpmcCA9IGZvcGVuKFwiL3Byb2Mvc3dhcHNcIiwgXCJyXCIpO1xuK1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxuK1x0XHRsaW5lcysrO1xuK1x0ZmNsb3NlKGZwKTtcbitcdHJldHVybiBsaW5lcyBcdTAwM2UgMTtcbit9XG4rXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgbm93X21zKHZvaWQpXG4re1xuK1x0c3RydWN0IHRpbWV2YWwgdHY7XG4rXG4rXHRnZXR0aW1lb2ZkYXkoXHUwMDI2dHYsIE5VTEwpO1xuK1x0cmV0dXJuIHR2LnR2X3NlYyAqIDEwMDBVTCArIHR2LnR2X3VzZWMgLyAxMDAwO1xuK31cbitcbitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuK3tcbitcdGZwcmludGYoc3RkZXJyLFxuK1x0XHRcIlVzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy1hIGFyZWFzXSBbLXQgbWFza11cXG5cIlxuK1x0XHRcIlxcdFdpdGhvdXQgLW0sIGV2ZXJ5IG1vZGUgcnVucyBpbiB0dXJuLlxcblwiXG4rXHRcdFwiXFx0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcXG5cIlxuK1x0XHRcIlxcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXFxuXCJcbitcdFx0XCJcXHQtdDogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCwgZm9yIGJpc2VjdGluZyBhIGZhaWx1cmVcXG5cIik7XG4rXHRleGl0KDEpO1xuK31cbitcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4re1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aHJlYWRfbmFtZXNbXSA9IHtcbitcdFx0XCJmYXVsdGVyXCIsIFwiZmF1bHRlcjJcIiwgXCJkb250bmVlZFwiLCBcInBpbm5lclwiLCBcImZvcmtlclwiLFxuK1x0XHRcIm1yZW1hcHBlclwiLCBcInBhZ2VvdXRcIiwgXCJjb21wYWN0b3JcIixcbitcdH07XG4rXHR2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHtcbitcdFx0ZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLFxuK1x0XHRtcmVtYXBwZXJfZm4sIHBhZ2VvdXRfZm4sIGNvbXBhY3Rvcl9mbixcbitcdH07XG4rXHRlbnVtIHsgVF9GQVVMVEVSLCBUX0ZBVUxURVIyLCBUX0RPTlRORUVELCBUX1BJTk5FUiwgVF9GT1JLRVIsXG4rXHQgICAgICAgVF9NUkVNQVBQRVIsIFRfUEFHRU9VVCwgVF9DT01QQUNUT1IgfTtcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgcGFnZW91dF9iaXQgPSAxVUwgXHUwMDNjXHUwMDNjIFRfUEFHRU9VVDtcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgY29tcGFjdG9yX2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgVF9DT01QQUNUT1I7XG4rXHRjb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTtcbitcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XG4rXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFsbF9tb2Rlc1tdID0geyBcInN0ZXBwZWRcIiwgXCJmcmVlXCIsIFwibWFkdmlzZVwiIH07XG4rXHRzdGF0aWMgY29uc3QgYm9vbCBvY2N1cGFuY2llc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1x0Lyogc3RyaWN0LCBob2xlcyAqL1xuK1x0c3RhdGljIGNvbnN0IGJvb2wgcHJlc3N1cmVzW10gPSB7IGZhbHNlLCB0cnVlIH07XHQvKiBxdWlldCwgdW5kZXIgcHJlc3N1cmUgKi9cbitcdGNvbnN0IGludCBucl9vY2N1cGFuY2llcyA9IEFSUkFZX1NJWkUob2NjdXBhbmNpZXMpO1xuK1x0Y29uc3QgaW50IG5yX3ByZXNzdXJlcyA9IEFSUkFZX1NJWkUocHJlc3N1cmVzKTtcbitcdGNvbnN0IGNoYXIgKm9uZV9tb2RlWzFdO1xuK1x0Y29uc3QgY2hhciAqIGNvbnN0ICptb2RlcyA9IGFsbF9tb2RlcztcbitcdGludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTtcbitcdGNvbnN0IGNoYXIgKm1vZGVfYXJnID0gTlVMTDtcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4rXHR1bnNpZ25lZCBsb25nIGVuZF9tcztcbitcdGludCBkdXJhdGlvbl9zID0gNTtcbitcdHVuc2lnbmVkIGxvbmcgdGhyZWFkX21hc2sgPSB+MFVMO1xuK1x0dW5zaWduZWQgbG9uZyBiYXNlX21hc2s7XG4rXHRib29sIGhhdmVfc3dhcDtcbitcdGNoYXIgbGFiZWxbNjRdO1xuK1x0aW50IG5yX2FyZWFzX2FyZyA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXHRpbnQgc3RlcHMgPSAwO1xuK1x0aW50IG9wdDtcbitcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFwiYTpkOm06dDpoXCIpKSAhPSAtMSkge1xuK1x0XHRzd2l0Y2ggKG9wdCkge1xuK1x0XHRjYXNlICdhJzpcbitcdFx0XHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ2QnOlxuK1x0XHRcdGR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ20nOlxuK1x0XHRcdG1vZGVfYXJnID0gb3B0YXJnO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd0JzpcbitcdFx0XHR0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTtcbitcdFx0XHRicmVhaztcbitcdFx0ZGVmYXVsdDpcbitcdFx0XHR1c2FnZSgpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobW9kZV9hcmcpIHtcbitcdFx0aWYgKHN0cmNtcChtb2RlX2FyZywgXCJzdGVwcGVkXCIpIFx1MDAyNlx1MDAyNiBzdHJjbXAobW9kZV9hcmcsIFwiZnJlZVwiKSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIHN0cmNtcChtb2RlX2FyZywgXCJtYWR2aXNlXCIpKVxuK1x0XHRcdHVzYWdlKCk7XG4rXHRcdG9uZV9tb2RlWzBdID0gbW9kZV9hcmc7XG4rXHRcdG1vZGVzID0gb25lX21vZGU7XG4rXHRcdG5yX21vZGVzID0gMTtcbitcdH1cbitcbitcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4rXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwiKTtcbitcbitcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XG4rXHRocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7XG4rXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXG5cIik7XG4rXG4rXHRndXBfZmQgPSBvcGVuKFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3RcIiwgT19SRFdSKTtcbitcdGlmIChndXBfZmQgXHUwMDNjIDApXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxuXCIpO1xuK1xuK1x0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XG4rXHRucl9hcmVhcyA9IG5yX3NoYXJlZF9hcmVhcyArIDE7XG4rXG4rXHQvKlxuK1x0ICogTVJFTUFQX0ZJWEVEIHVubWFwcyB3aGF0ZXZlciBpcyBpbiB0aGUgd2F5IHdpdGhvdXQgc2F5aW5nIHNvLCBzb1xuK1x0ICogY2xhaW0gdGhlIG1yZW1hcCB0aHJlYWQncyBzY3JhdGNoIGFkZHJlc3MgdXAgZnJvbnQuXG4rXHQgKi9cbitcdG1yZW1hcF9zY3JhdGNoID0gKGNoYXIgKilCQVNFX0FERFIgKyAyICogbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbitcdGlmIChtbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9OT05FLFxuK1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSxcbitcdFx0IC0xLCAwKSAhPSAodm9pZCAqKW1yZW1hcF9zY3JhdGNoKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtbWFwKCkgbXJlbWFwIHNjcmF0Y2hcIik7XG4rXG4rXHRiYXNlX21hc2sgPSB0aHJlYWRfbWFzaztcbitcdGhhdmVfc3dhcCA9IHN3YXBfYXZhaWxhYmxlKCk7XG4rXHRpZiAoIWhhdmVfc3dhcClcbitcdFx0LyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUgKi9cbitcdFx0a3NmdF9wcmludF9tc2coXCJubyBzd2FwOiB0aGUgcGFnZW91dCB0aHJlYWQgaXMgbm90IHN0YXJ0ZWRcXG5cIik7XG4rXG4rXHRrc2Z0X3NldF9wbGFuKG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xuK1xuK1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbitcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcbitcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZCAqL1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0Zm9yIChpbnQgcnVuID0gMDsgcnVuIFx1MDAzYyBucl9tb2RlcyAqIG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzOyBydW4rKykge1xuK1x0XHRpbnQgcmVtID0gcnVuICUgKG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKTtcbitcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldO1xuK1x0XHRib29sIGhvbGVzID0gb2NjdXBhbmNpZXNbcmVtIC8gbnJfcHJlc3N1cmVzXTtcbitcdFx0Ym9vbCBwcmVzc3VyZSA9IHByZXNzdXJlc1tyZW0gJSBucl9wcmVzc3VyZXNdO1xuK1xuK1x0XHRzbnByaW50ZihsYWJlbCwgc2l6ZW9mKGxhYmVsKSwgXCIlcy8lcyVzXCIsIG1vZGUsXG4rXHRcdFx0IGhvbGVzID8gXCJob2xlc1wiIDogXCJzdHJpY3RcIiwgcHJlc3N1cmUgPyBcIi9wcmVzc3VyZVwiIDogXCJcIik7XG4rXHRcdGlmIChjb3JydXB0ZWQpIHtcbitcdFx0XHQvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZyAqL1xuK1x0XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcIiVzOiBza2lwcGVkIGFmdGVyIGNvcnJ1cHRpb25cXG5cIiwgbGFiZWwpO1xuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXG4rXHRcdHRocmVhZF9tYXNrID0gYmFzZV9tYXNrO1xuK1x0XHRpZiAoIXByZXNzdXJlKVxuK1x0XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpO1xuK1x0XHRlbHNlIGlmICghaGF2ZV9zd2FwKVxuK1x0XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfnBhZ2VvdXRfYml0O1xuK1xuK1x0XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXHRcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHRcdHNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUztcbitcdFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xuK1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4rXHRcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPVxuK1x0XHRcdHN0cmNtcChtb2RlLCBcImZyZWVcIikgPyAxMDAwIDogMDtcbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSAxMDtcbitcbitcdFx0LypcbitcdFx0ICogbVRIUCBjb2xsYXBzZSBob25vdXJzIG9ubHkgMCBvciBIUEFHRV9QTURfTlIgLSAxIGhlcmUuICBUaGUgdHdvXG4rXHRcdCAqIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHM6IGEgc3RyaWN0IHdpbmRvdyBoYXMgZXZlcnkgUFRFXG4rXHRcdCAqIHByZXNlbnQsIGEgaG9sZS1oZWF2eSBvbmUgaXMgbW9zdGx5IHplcm8tZmlsbGVkLlxuK1x0XHQgKi9cbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaG9sZXMgP1xuK1x0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgLSAxIDogMDtcbitcdFx0LyogT25lIHdha2UsIG9uZSBwYXNzOiB0aGUgcGxheWdyb3VuZCBwbHVzIHRoZSBmb3JrZWQgY2hpbGRyZW4ncyBjb3BpZXMgKi9cbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cbitcdFx0XHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKykge1xuK1x0XHRcdGlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBpKSlcbitcdFx0XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4rXHRcdH1cbitcdFx0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0XHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHQgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfQU5PTllNT1VTIHxcbitcdFx0XHQgICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcbitcdFx0aWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibW1hcCgpIHBsYXlncm91bmRcIik7XG4rXHRcdG1yZW1hcF9hcmVhID0gcmVnaW9uICsgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XG4rXG4rXHRcdGlmICh0aHJlYWRfbWFzayBcdTAwMjYgcGFnZW91dF9iaXQpIHtcbitcdFx0XHQvKiBFbm91Z2ggdG8gZHJpdmUgcmVhbCByZWNsYWltIHdpdGhvdXQgc3dhbXBpbmcgYSBzbWFsbCBndWVzdCAqL1xuK1x0XHRcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcbitcdFx0XHRpZiAocGFnZW91dF9zaXplIFx1MDAzYyAxNlVMIFx1MDAzY1x1MDAzYyAyMClcbitcdFx0XHRcdHBhZ2VvdXRfc2l6ZSA9IDE2VUwgXHUwMDNjXHUwMDNjIDIwO1xuK1x0XHRcdGlmIChwYWdlb3V0X3NpemUgXHUwMDNlIDY0VUwgXHUwMDNjXHUwMDNjIDIwKVxuK1x0XHRcdFx0cGFnZW91dF9zaXplID0gNjRVTCBcdTAwM2NcdTAwM2MgMjA7XG4rXHRcdFx0cGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsXG4rXHRcdFx0XHRcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHRcdFx0XHQgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4rXHRcdFx0aWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibW1hcCgpIHBhZ2VvdXQgYXJlYVwiKTtcbitcdFx0fVxuK1xuK1x0XHQvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlICovXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpKyspXG4rXHRcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xuK1x0XHRtZW1zZXQobXJlbWFwX2FyZWEsIDEsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0aWYgKG1hZHZpc2UocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKSlcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXCIpO1xuK1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl90aHJlYWRzOyBpKyspIHtcbitcdFx0XHRpZiAoISh0aHJlYWRfbWFzayBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpKSB7XG4rXHRcdFx0XHR0aHJlYWRzW2ldID0gMDtcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbitcdFx0XHRpZiAocHRocmVhZF9jcmVhdGUoXHUwMDI2dGhyZWFkc1tpXSwgTlVMTCwgdGhyZWFkX2Zuc1tpXSxcbitcdFx0XHRcdFx0ICAgKHZvaWQgKikoaSArIDEpKSlcbitcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcih0aHJlYWRfbmFtZXNbaV0pO1xuK1x0XHR9XG4rXG4rXHRcdGVuZF9tcyA9IG5vd19tcygpICsgZHVyYXRpb25fcyAqIDEwMDBVTDtcbitcdFx0aWYgKCFzdHJjbXAobW9kZSwgXCJzdGVwcGVkXCIpKSB7XG4rXHRcdFx0d2hpbGUgKG5vd19tcygpIFx1MDAzYyBlbmRfbXMgXHUwMDI2XHUwMDI2ICFjb3JydXB0ZWQpIHtcbitcdFx0XHRcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoUEFTU19USU1FT1VUX1MpKVxuK1x0XHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XFxuXCIpO1xuK1x0XHRcdFx0c3RlcHMrKztcbitcdFx0XHR9XG4rXHRcdH0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCBcImZyZWVcIikpIHtcbitcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZClcbitcdFx0XHRcdHVzbGVlcCgxMDAgKiAxMDAwKTtcbitcdFx0fSBlbHNlIHtcdC8qIG1hZHZpc2UgKi9cbitcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuK1x0XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzOyBpKyspIHtcbitcdFx0XHRcdFx0bWFkdmlzZShyZWdpb24gKyBpICogaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfQ09MTEFQU0UpO1xuK1x0XHRcdFx0fVxuK1x0XHRcdFx0bWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbitcdFx0XHRcdHN0ZXBzKys7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXG4rXHRcdHN0b3AgPSAxO1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl90aHJlYWRzOyBpKyspIHtcbitcdFx0XHRpZiAodGhyZWFkc1tpXSlcbitcdFx0XHRcdHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTtcbitcdFx0fVxuK1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSsrKVxuK1x0XHRcdGNoZWNrX3BhZ2UoaSk7XG4rXG4rXHRcdGtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCwgXCIlczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxcblwiLFxuK1x0XHRcdFx0IGxhYmVsLCBkdXJhdGlvbl9zLCBzdGVwcyk7XG4rXG4rXHRcdC8qIFRoZSBuZXh0IG1vZGUgbWFwcyB0aGUgc2FtZSBmaXhlZCBhZGRyZXNzIHdpdGggaXRzIG93biBzZXR0aW5ncyAqL1xuK1x0XHRtdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xuK1x0XHRcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XG4rXHRcdFx0cGFnZW91dF9hcmVhID0gTlVMTDtcbitcdFx0fVxuK1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRcdHN0b3AgPSAwO1xuK1x0XHRzdGVwcyA9IDA7XG4rXHR9XG4rXG4rXHRrc2Z0X2ZpbmlzaGVkKCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xYzFiOTQyYWMzMjU4XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xuQEAgLTAsMCArMSwxNzkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogQ2hlY2sgdGhhdCBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGRyaXZlcyBraHVnZXBhZ2VkIGluIHN0ZXA6IG9uZSBiYXJyaWVyXG4rICogb3ZlciBvbmUgcHJlcGFyZWQgd2luZG93IG11c3QgY29sbGFwc2UgaXQgd2l0aCBleGFjdGx5IG9uZSBjb2xsYXBzZVxuKyAqIGF0dGVtcHQgYXR0cmlidXRlZCB0byBpdHMgc291cmNlIHBhZ2VzLCBzdGVwIGFmdGVyIHN0ZXAuXG4rICpcbisgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBhIG1pbnV0ZSBzbyB0aGF0IGEgc3RlcCB3aGljaCBzbGVwdCBpbnN0ZWFkIG9mXG4rICogYmVpbmcgd29rZW4gYmxvd3MgdGhlIGJ1ZGdldC5cbisgKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJrc2VsZnRlc3QuaFwiXG4rI2luY2x1ZGUgXCJ2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFwiXG4rXG4rI2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuKy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXG4rI2RlZmluZSBUQVJHRVRfT1JERVIgMlxuKyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1XG4rI2RlZmluZSBQQVNTX1RJTUVPVVRfUyAzMFxuK1xuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4rc3RhdGljIGludCB0cmFjZV9ldmVudHNfZmQgPSAtMTtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbitcbisvKlxuKyAqIFRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlOiBzd2l0Y2ggdGhlbSBvZmYgaG93ZXZlciB0aGUgdGVzdCBlbmRzLFxuKyAqIGluY2x1ZGluZyBmcm9tIGluc2lkZSBhIGhlbHBlciB0aGF0IGdpdmVzIHVwLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHRyYWNlX2V2ZW50c19vZmYodm9pZClcbit7XG4rXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzZT0gMClcbitcdFx0dHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpO1xuK31cbitcbisvKiBDb3VudCB0aGUgaXNvbGF0ZSBldmVudHMgd2hvc2Ugc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cncyBzb3VyY2UgUEZOcyAqL1xuK3N0YXRpYyBpbnQgY291bnRfYXR0cmlidXRlZCh1bnNpZ25lZCBsb25nICpwZm5zLCBpbnQgbnJfcGZucyxcbitcdFx0XHQgICAgdW5zaWduZWQgaW50IG9yZGVyKVxuK3tcbitcdGNoYXIgbGluZVsxMDI0XTtcbitcdGludCBjb3VudCA9IDA7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gdHJhY2luZ19vcGVuX3RyYWNlKCk7XG4rXHRpZiAoIWZwKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJDYW5ub3Qgb3BlbiB0cmFjZSBidWZmZXJcXG5cIik7XG4rXG4rXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcbitcdFx0dW5zaWduZWQgbG9uZyB2YWw7XG4rXHRcdHVuc2lnbmVkIGludCBvcmQ7XG4rXHRcdGNoYXIgKnMsICpvO1xuK1x0XHRpbnQgaTtcbitcbitcdFx0cyA9IHN0cnN0cihsaW5lLCBcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlwiKTtcbitcdFx0aWYgKCFzKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAoc3NjYW5mKHMsIFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4XCIsXG4rXHRcdFx0ICAgXHUwMDI2dmFsKSAhPSAxKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRvID0gc3Ryc3RyKHMsIFwib3JkZXI9XCIpO1xuK1x0XHRpZiAoIW8gfHwgc3NjYW5mKG8sIFwib3JkZXI9JXVcIiwgXHUwMDI2b3JkKSAhPSAxIHx8IG9yZCAhPSBvcmRlcilcbitcdFx0XHRjb250aW51ZTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGZuczsgaSsrKSB7XG4rXHRcdFx0aWYgKHZhbCA9PSBwZm5zW2ldKSB7XG4rXHRcdFx0XHRjb3VudCsrO1xuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHR9XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGNvdW50O1xuK31cbitcbitzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxuK3tcbitcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHR1bnNpZ25lZCBsb25nIHBmbnNbMSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSXTtcbitcdGJvb2wgY29sbGFwc2VkLCBwYXNzZWQ7XG4rXHRpbnQgYXR0cmlidXRlZDtcbitcdGNoYXIgKnA7XG4rXHRpbnQgaTtcbitcbitcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XG4rXHRpZiAocCAhPSBCQVNFX0FERFIpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSB3aW5kb3dcIik7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XG4rXHRcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcbitcdFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcblwiKTtcbitcdH1cbitcbitcdC8qIENsZWFyIGJlZm9yZSBlbmFibGluZyBzbyB0aGUgYnVmZmVyIGhvbGRzIG9ubHkgdGhpcyBzdGVwJ3MgZXZlbnRzICovXG4rXHRpZiAodHJhY2luZ19jbGVhcl90cmFjZSgpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxcblwiKTtcbitcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCB0cnVlKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiQ2Fubm90IGVuYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cIik7XG4rXG4rXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9IVUdFUEFHRSlcIik7XG4rXHRwYXNzZWQgPSBraHVnZXBhZ2VkX2Z1bGxfcGFzcyhQQVNTX1RJTUVPVVRfUyk7XG4rXG4rXHQvKiBPZmYgYmVmb3JlIGFueXRoaW5nIHRoYXQgY2FuIGdpdmUgdXA6IHRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlICovXG4rXHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJDYW5ub3QgZGlzYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cIik7XG4rXHRpZiAoIXBhc3NlZClcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwia2h1Z2VwYWdlZCBkaWQgbm90IGNvbXBsZXRlIGEgZnVsbCBwYXNzXFxuXCIpO1xuK1xuK1x0Y29sbGFwc2VkID0gaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLFxuK1x0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuK1x0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsIFRBUkdFVF9PUkRFUik7XG4rXG4rXHRrc2Z0X3Rlc3RfcmVzdWx0KGNvbGxhcHNlZCBcdTAwMjZcdTAwMjYgYXR0cmlidXRlZCA9PSAxLFxuK1x0XHRcdCBcInN0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXFxuXCIsXG4rXHRcdFx0IGl0ZXJhdGlvbiwgYXR0cmlidXRlZCk7XG4rXG4rXHRtdW5tYXAocCwgaHBhZ2VfcG1kX3NpemUpO1xuK31cbitcbitpbnQgbWFpbih2b2lkKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4rXHRpbnQgaTtcbitcbitcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4rXG4rXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwiKTtcbitcdGlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUikpKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIk9yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwiLFxuK1x0XHRcdCAgICAgICBUQVJHRVRfT1JERVIpO1xuK1xuK1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuK1x0aWYgKCFocGFnZV9wbWRfc2l6ZSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiUmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCIpO1xuK1x0cGFnZW1hcF9mZCA9IG9wZW4oXCIvcHJvYy9zZWxmL3BhZ2VtYXBcIiwgT19SRE9OTFkpO1xuK1x0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm9wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKVwiKTtcbitcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwiL3Byb2Mva3BhZ2VmbGFnc1wiLCBPX1JET05MWSk7XG4rXHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCJvcGVuKC9wcm9jL2twYWdlZmxhZ3MpIHJlcXVpcmVzIHJvb3RcXG5cIik7XG4rXHR0cmFjZV9ldmVudHNfZmQgPSB0cmFjaW5nX2V2ZW50c19vcGVuKFwiaHVnZV9tZW1vcnlcIik7XG4rXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcImh1Z2VfbWVtb3J5IGV2ZW50cyByZXF1aXJlIHRyYWNlZnMgYW5kIHJvb3RcXG5cIik7XG4rXHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XG4rXG4rXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xuK1xuK1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbitcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAgKiAxMDAwO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MCAqIDEwMDA7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAoaHBhZ2VfcG1kX3NpemUgLyBnZXRwYWdlc2l6ZSgpKSAtIDE7XG4rXHQvKiBPbmUgd2FrZSBtdXN0IGNvbXBsZXRlIG9uZSBmdWxsIHBhc3M7IHNlZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpICovXG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXHUwMDNjXHUwMDNjIDI0O1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0c2V0dGluZ3MuaHVnZXBhZ2VzW1RBUkdFVF9PUkRFUl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuK1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9JVEVSQVRJT05TOyBpKyspXG4rXHRcdG9uZV9zdGVwKGkpO1xuK1xuK1x0a3NmdF9maW5pc2hlZCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG5pbmRleCBmMTlkNTNjNjk1NzY0Li5mZDM1ZjhhN2I1YjgzIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG5AQCAtMjAsNyArMjAsNiBAQFxuIFxuICNkZWZpbmUgVFdPTUVHXHRcdCgyXHUwMDNjXHUwMDNjMjApXG4gI2RlZmluZSBSVU5USU1FXHRcdCgyMClcbi0jZGVmaW5lIEFMSUdOKHgsIGEpXHQoKCh4KSArIChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gXG4gSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTQwMiw2ICs0MDIsMTIgQEAgQ0FURUdPUlk9XCJwZm5tYXBcIiBydW5fdGVzdCAuL3Bmbm1hcFxuICMgQ09XIHRlc3RzXG4gQ0FURUdPUlk9XCJjb3dcIiBydW5fdGVzdCAuL2Nvd1xuIFxuK0NBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9mb2xpb19vcmRlcl9jaGVja1xuK1xuK0NBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcbitcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlXG4rXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWRcbiBcbiBDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyXG5AQCAtNDEwLDggKzQxNiw2IEBAIENBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxuIFxuIENBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDQgYWxsOnNobWVtXG4gXG4tQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLWMgNCBtdGhwX2todWdlcGFnZWQ6YW5vblxuLVxuICMgVHJ5IHRvIGNyZWF0ZSBYRlMgaWYgbm90IHByb3ZpZGVkXG4gaWYgWyAteiBcIiR7U1BMSVRfSFVHRV9QQUdFX1RFU1RfWEZTX1BBVEh9XCIgXTsgdGhlblxuICAgICBpZiB0ZXN0X3NlbGVjdGVkIFwidGhwXCI7IHRoZW5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuaW5kZXggODZhNjAzNjkyODI2MS4uMGFkZmU3ZGRlN2U1OSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcbkBAIC00Miw2OCArNDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcIi9wcm9jL2twYWdlZmxhZ3NcIjtcbiBpbnQgcGFnZW1hcF9mZDtcbiBpbnQga3BhZ2VmbGFnc19mZDtcbiBcbi1zdGF0aWMgYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4tXHRcdGludCBrcGFnZWZsYWdzX2ZkKVxuLXtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XG4tXHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xuLVx0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4tXHR1bnNpZ25lZCBsb25nIHBmbl9oZWFkO1xuLVx0dWludDY0X3QgcGZuX2ZsYWdzO1xuLVx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGk7XG4tXG4tXHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuLVxuLVx0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xuLVx0aWYgKHBmbiA9PSAtMVVMKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdGdvdG8gZmFpbDtcbi1cbi1cdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4tXHRpZiAoIW9yZGVyKSB7XG4tXHRcdGlmIChwZm5fZmxhZ3MgXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXG4tXHRcdFx0cmV0dXJuIGZhbHNlO1xuLVx0XHRyZXR1cm4gdHJ1ZTtcbi1cdH1cbi1cbi1cdC8qIG5vbiBUSFAgZm9saW8gKi9cbi1cdGlmICghKHBmbl9mbGFncyBcdTAwMjYgS1BGX1RIUCkpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdHBmbl9oZWFkID0gcGZuIFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XG4tXG4tXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cbi1cdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cbi1cdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcbi1cdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRcdGdvdG8gZmFpbDtcbi1cdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4tXHRcdFx0cmV0dXJuIGZhbHNlO1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXG4tXHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4tXHQgKi9cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcblwiKTtcbi1cdHJldHVybiBmYWxzZTtcbi19XG4tXG4gc3RhdGljIGludCBjaGVja19hZnRlcl9zcGxpdF9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sXG4gXHRcdGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKVxuIHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbmluZGV4IDQ4MjFhMzU2MzAzNjMuLmFmODMyNGUxZThmMmMgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuQEAgLTQ5MCw2ICs0OTAsMTUzIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxuK1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKVxuK3tcbitcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XG4rXHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4rXHR1bnNpZ25lZCBsb25nIHBmbl9oZWFkO1xuK1x0dWludDY0X3QgcGZuX2ZsYWdzO1xuK1x0dW5zaWduZWQgbG9uZyBwZm47XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuK1xuK1x0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xuK1x0aWYgKHBmbiA9PSAtMVVMKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4rXHRpZiAoIW9yZGVyKSB7XG4rXHRcdGlmIChwZm5fZmxhZ3MgXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcdH1cbitcbitcdC8qIG5vbiBUSFAgZm9saW8gKi9cbitcdGlmICghKHBmbl9mbGFncyBcdTAwMjYgS1BGX1RIUCkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdHBmbl9oZWFkID0gcGZuIFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XG4rXG4rXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0LyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi9cbitcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHQvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi9cbitcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcbitcdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBpLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRcdGdvdG8gZmFpbDtcbitcdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXG4rXHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4rXHQgKi9cbitcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4rXHRcdHJldHVybiB0cnVlO1xuK1xuK1x0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuK1x0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4rZmFpbDpcbitcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcblwiKTtcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rLyoqXG4rICogaXNfcmFuZ2VfYmFja2VkX2J5X29yZGVyKCkgLSBjaGVjayB0aGF0IGEgcmFuZ2UgaXMgYmFja2VkIGJ5IEBvcmRlciBmb2xpb3NcbisgKiBAc3RhcnQ6IHN0YXJ0IG9mIHRoZSByYW5nZSwgYSBtdWx0aXBsZSBvZiB0aGUgZm9saW8gc2l6ZVxuKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgcmFuZ2UgaW4gYnl0ZXMsIGEgbXVsdGlwbGUgb2YgdGhlIGZvbGlvIHNpemVcbisgKiBAb3JkZXI6IHRoZSBmb2xpbyBvcmRlciB0byBjaGVjayBmb3JcbisgKiBAcGFnZW1hcF9mZDogb3BlbiAvcHJvYy9cdTAwM2NwaWRcdTAwM2UvcGFnZW1hcCBvZiB0aGUgcmFuZ2UncyBvd25lclxuKyAqIEBrcGFnZWZsYWdzX2ZkOiBvcGVuIC9wcm9jL2twYWdlZmxhZ3NcbisgKlxuKyAqIEV2ZXJ5IGZvbGlvLXNpemVkLCBmb2xpby1hbGlnbmVkIHBhcnQgb2YgdGhlIHJhbmdlIG11c3QgbWFwIG9uZSBmb2xpbyBvZlxuKyAqIEBvcmRlciwgaGVhZCB0byB0YWlsLCB3aXRoIHRoZSBoZWFkIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFydC4gIEEgcGFydFxuKyAqIGJhY2tlZCBieSBzZXZlcmFsIHNtYWxsZXIgZm9saW9zIGZhaWxzLCBhbmQgc28gZG9lcyBhIGZvbGlvIG1hcHBlZCBvZmZcbisgKiBpdHMgbmF0dXJhbCBhbGlnbm1lbnQuXG4rICpcbisgKiBSZXR1cm5zOiB0cnVlIGlmIHRoZSB3aG9sZSByYW5nZSBpcyBiYWNrZWQgdGhhdCB3YXksIGZhbHNlIG90aGVyd2lzZS5cbisgKi9cbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxuK1x0XHRcdCAgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZClcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdGNvbnN0IHNpemVfdCBmb2xpb19zaXplID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xuK1x0Y2hhciAqdmFkZHI7XG4rXG4rXHRpZiAoKHVpbnRwdHJfdClzdGFydCAlIGZvbGlvX3NpemUgfHwgbGVuICUgZm9saW9fc2l6ZSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0Zm9yICh2YWRkciA9IHN0YXJ0OyB2YWRkciBcdTAwM2Mgc3RhcnQgKyBsZW47IHZhZGRyICs9IGZvbGlvX3NpemUpIHtcbitcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuK1x0XHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRcdC8qIE5vdCBwcmVzZW50LCBvciBhIHRhaWwgcGFnZSAqL1xuK1x0XHRpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdFx0Y2hhciAqcGFnZSA9IHZhZGRyICsgaSAqIHBzaXplKCk7XG4rXG4rXHRcdFx0aWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwYWdlKSAhPSBwZm4gKyBpKVxuK1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9XG4rXG4rXHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKyNkZWZpbmUgVFJBQ0VGU19ST09UIFwiL3N5cy9rZXJuZWwvdHJhY2luZ1wiXG4rXG4rLypcbisgKiBSZXR1cm5zIC0xIHdpdGhvdXQgdHJhY2VmcyBvciB0aGUgc3Vic3lzdGVtLiAgVGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGU6XG4rICogd2hvZXZlciBzd2l0Y2hlcyB0aGVtIG9uIGhhcyB0byBzd2l0Y2ggdGhlbSBvZmYgYWdhaW4sIG9uIGV2ZXJ5IGV4aXQgcGF0aC5cbisgKi9cbitpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpXG4re1xuK1x0Y2hhciBwYXRoWzI1Nl07XG4rXG4rXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCBcIi9ldmVudHMvJXMvZW5hYmxlXCIsXG4rXHRcdCBzdWJzeXMpO1xuK1x0cmV0dXJuIG9wZW4ocGF0aCwgT19XUk9OTFkpO1xuK31cbitcbitpbnQgdHJhY2luZ19ldmVudHNfZW5hYmxlKGludCBmZCwgYm9vbCBlbmFibGUpXG4re1xuK1x0aWYgKHB3cml0ZShmZCwgZW5hYmxlID8gXCIxXCIgOiBcIjBcIiwgMSwgMCkgIT0gMSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhciAqL1xuK2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpXG4re1xuK1x0aW50IGZkID0gb3BlbihUUkFDRUZTX1JPT1QgXCIvdHJhY2VcIiwgT19XUk9OTFkgfCBPX1RSVU5DKTtcbitcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKVxuK3tcbitcdHJldHVybiBmb3BlbihUUkFDRUZTX1JPT1QgXCIvdHJhY2VcIiwgXCJyXCIpO1xuK31cbitcbiAvKiBJZiBgaW9jdGxzJyBub24tTlVMTCwgdGhlIGFsbG93ZWQgaW9jdGxzIHdpbGwgYmUgcmV0dXJuZWQgaW50byB0aGUgdmFyICovXG4gaW50IHVmZmRfcmVnaXN0ZXJfd2l0aF9pb2N0bHMoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcbiBcdFx0XHQgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG5pbmRleCA5YTQ5YWY4ODcwMmU0Li41YTkxYjk2NzZlYzVkIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbkBAIC0xMCw2ICsxMCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuIFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXHUwMDNjXHUwMDNjIChucikpXG4rI2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSArIChhKSAtIDEpIFx1MDAyNiB+KChhKSAtIDEpKVxuK1xuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcbiAjZGVmaW5lIFBNX01NQVBfRVhDTFVTSVZFICAgICAgICAgICAgIEJJVF9VTEwoNTYpXG4gI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KVxuQEAgLTk3LDYgKzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xuIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKTtcbiBpbnQgZ2F0aGVyX2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpO1xuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxuK1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKTtcbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9vcmRlcihjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxuK1x0XHRcdCAgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XG4gXG4gaW50IHVmZmRfcmVnaXN0ZXIoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcbiBcdFx0ICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IpO1xuQEAgLTExMyw2ICsxMTksMTAgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApO1xuIGludCB3cml0ZV9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgdmFsKTtcbiBpbnQgcmVhZF9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgKnZhbCk7XG4gYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpO1xuK2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cyk7XG4raW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKTtcbitpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKTtcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XG4gXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxuIHtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA4VDE1OjE1OjQyLjc5ODQwNDEwNloiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjk2MTExOTIxMzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgdGhlIFBhdGNoIGZvciBGdXp6aW5nIEVsaWdpYmlsaXR5KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIGxvb2sgYXQgdGhlIGRpZmYgYW5kIHF1aWNrbHkgaWRlbnRpZnkgd2hpY2ggZmlsZXMgaGF2ZSBiZWVuIG1vZGlmaWVkLiBJdCdzIGFsbCB1bmRlciBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gIFJpZ2h0LCB0aGF0IG1lYW5zIHRoZXNlIGFyZSBzZWxmLXRlc3RzIHJlbGF0ZWQgdG8gbWVtb3J5IG1hbmFnZW1lbnQuIEdpdmVuIG15IGV4cGVydGlzZSwgSSBhbHJlYWR5IGtub3cgdGhhdCB0aGlzIHNlY3Rpb24gY29udGFpbnMgdGVzdHMgZm9yIHRyYW5zcGFyZW50IGh1Z2VwYWdlcyAoVEhQL2todWdlcGFnZWQpLlxuXG5Ob3csIHRoZSBjcml0aWNhbCBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoaXMgd2FycmFudHMgZnV6emluZy4gSSBoYXZlIHRvIGFwcGx5IHRoYXQgbmVnYXRpdmUgY3JpdGVyaWEgY2hlY2suIFNwZWNpZmljYWxseSwgdGhlIHJ1bGUgSSBuZWVkIHRvIGxvb2sgYXQgaXM6ICpVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLipcblxuQmluZ28uIEV2ZXJ5IHNpbmdsZSBmaWxlIGxpc3RlZOKAlGBNYWtlZmlsZWAsIHRoZSBgLmNgIGZpbGVzLCBhbmQgdGhlIGAuaGAgZmlsZXPigJRyZXNpZGVzIHByZWNpc2VseSB3aXRoaW4gdGhhdCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYCBkaXJlY3RvcnkuIFRoZXNlIGFyZSB1c2VyLXNwYWNlIHRlc3RzLCBhbmQgdGhlIG1vZGlmaWVkIGZpbGVzIHdpbGwgKm5vdCogYWZmZWN0IHRoZSBrZXJuZWwgaW1hZ2Ugb3IgbW9kdWxlcy4gSSd2ZSBkb3VibGUtY2hlY2tlZCB0aGUgZGlmZiBhbmQgdGhpcyBpcyB0aGUgZW50aXJlIHNldCBvZiBjaGFuZ2VzLlxuXG5UaGVyZWZvcmUsIGFjY29yZGluZyB0byB0aGUgXCJOZWdhdGl2ZSBDcml0ZXJpYVwiIG91dGxpbmVkLCB0aGUgYFdvcnRoRnV6emluZ2AgcGFyYW1ldGVyIGlzIGBmYWxzZWAuXG5cbkdpdmVuIHRoaXMsIEkgaGF2ZSB0byBmb3JtdWxhdGUgdGhlIGBzZXQtcmVzdWx0c2AgY2FsbDpcblxuKiAgIGBXb3J0aEZ1enppbmdgOiBgZmFsc2VgXG4qICAgYFJlYXNvbmluZ2A6IFwiTW9kaWZpZWQgZmlsZXMgYXJlIGxvY2F0ZWQgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AsIHdoaWNoIGNvbnNpc3RzIG9mIHVzZXItc3BhY2UgdGVzdHMgYW5kIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2Ugb3Iga2VybmVsIG1vZHVsZXMuXCJcbiogICBgRm9jdXNTeW1ib2xzYDogXFxbIF1cbiogICBgRW5hYmxlQ29uZmlnc2A6IFxcWyBdXG5cbkknbSByZWFkeSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgY2FzZS5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc5MDQsIk91dHB1dFRva2VucyI6OTAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDQwLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDhUMTU6MTU6NTIuNDA5NjAwMTQ3WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzg3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIkFsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3IgbW9kdWxlIGNvZGUgaXMgYWx0ZXJlZCwgbWFraW5nIHRoZSBjaGFuZ2VzIG5vbi1rZXJuZWwvbm9uLWV4ZWN1dGFibGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Yga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIkFsbCBtb2RpZmljYXRpb25zIGluIHRoaXMgcGF0Y2ggc2VyaWVzIGFyZSBzdHJpY3RseSBjb25maW5lZCB0byB1c2VyLXNwYWNlIHNlbGZ0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uIE5vIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3IgbW9kdWxlIGNvZGUgaXMgYWx0ZXJlZCwgbWFraW5nIHRoZSBjaGFuZ2VzIG5vbi1rZXJuZWwvbm9uLWV4ZWN1dGFibGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Yga2VybmVsIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOFQxNToxNTo1Mi40MDk2MzI3NjdaIiwiU2VxIjo1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzI5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+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-workflow77nkc[1] Phase: Running StartedAt: 2026-09-08 15:16:02 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow77nkc[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-08 15:16:02 +0000 UTC FinishedAt: 2026-09-08 15:16:20 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}