Name: series-workflowkbvn9 Phase: Failed StartedAt: 2026-08-12 14:39:49 +0000 UTC FinishedAt: 2026-08-12 14:59:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkbvn9[0] Phase: Succeeded StartedAt: 2026-08-12 14:39:49 +0000 UTC FinishedAt: 2026-08-12 14:59:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkbvn9[0].run-triage Phase: Succeeded StartedAt: 2026-08-12 14:39:49 +0000 UTC FinishedAt: 2026-08-12 14:59:35 +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+CgkJCTx0ZD4yMDI2LzA4LzEyIDE0OjU5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLywgd2hpY2ggZG8gbm90IGFmZmVjdCB0aGUga2VybmVsJiMzOTtzIGZ1bmN0aW9uYWwgZXhlY3V0aW9uIGZsb3cuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE0OjU5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNjdhMTllMTdhOTFiNjE1ZDAwNzFjM2Q4NDEwMzgyZTgxYzBlOTA4OFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgQXVnIDEyIDE0OjU5OjEwIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbkBAIC0xMDQsNiAmIzQzOzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBndWFyZC1yZWdpb25zXG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1lcmdlXG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IHJtYXBcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0XG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19vcmRlcl9jaGVja1xuJiM0MztURVNUX0dFTl9GSUxFUyAmIzQzOz0ga2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3JhY2VcbiBcbiBpZm5lcSAoJChBUkNIKSxhcm02NClcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gc29mdC1kaXJ0eVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uOTMwMzBhNDJjM2NjZFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xuQEAgLTAsMCAmIzQzOzEsMTM3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGRldGVjdGlvbiBoZWxwZXJzLFxuJiM0MzsgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBhbmQgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycygpLlxuJiM0MzsgKlxuJiM0MzsgKiBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHQgbWVtb3J5IGluIHdpdGggb25seVxuJiM0MzsgKiB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHZlcmlmeSB0aGUgaGVscGVycyByZXBvcnQgZXhhY3RseSB0aGF0IG9yZGVyOlxuJiM0MzsgKiBub3QgYSBuZWlnaGJvdXJpbmcgb3JkZXIsIGFuZCBwbGFpbiA0SyBtZW1vcnkgYXMgb3JkZXIgMC4gVGhlIGhlbHBlcnNcbiYjNDM7ICogYXJlIHdoYXQgdGhlIGtodWdlcGFnZWQgbVRIUCB0ZXN0cyB1c2UgdG8gZGV0ZWN0IGNvbGxhcHNlIHJlc3VsdHMsIHNvXG4mIzQzOyAqIHRoZXkgbXVzdCBhZ3JlZSB3aXRoIHRoZSBrZXJuZWwmIzM5O3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueVxuJiM0MzsgKiBjb2xsYXBzZSB0ZXN0IHJlbGllcyBvbiB0aGVtLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NlbGZ0ZXN0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1fdXRpbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcbiYjNDM7c3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuJiM0MztcbiYjNDM7LyogbW1hcCBhbiBhbm9uIFZNQSBvZiBleGFjdGx5IEBzaXplIGJ5dGVzIGF0IGEgQHNpemUtYWxpZ25lZCBhZGRyZXNzLiAqL1xuJiM0MztzdGF0aWMgY2hhciAqYWxsb2NfYWxpZ25lZChzaXplX3Qgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHNpemVfdCBsZW4gPSBzaXplICogMjtcbiYjNDM7XHR1aW50cHRyX3QgYWxpZ25lZDtcbiYjNDM7XHRjaGFyICpwO1xuJiM0MztcbiYjNDM7XHRwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4mIzQzO1x0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRhbGlnbmVkID0gQUxJR04oKHVpbnRwdHJfdClwLCBzaXplKTtcbiYjNDM7XHRpZiAoYWxpZ25lZCAhPSAodWludHB0cl90KXApXG4mIzQzO1x0XHRtdW5tYXAocCwgYWxpZ25lZCAtICh1aW50cHRyX3QpcCk7XG4mIzQzO1x0aWYgKGFsaWduZWQgJiM0Mzsgc2l6ZSAhPSAodWludHB0cl90KXAgJiM0MzsgbGVuKVxuJiM0MztcdFx0bXVubWFwKChjaGFyICopYWxpZ25lZCAmIzQzOyBzaXplLFxuJiM0MztcdFx0ICAgICAgICh1aW50cHRyX3QpcCAmIzQzOyBsZW4gLSBhbGlnbmVkIC0gc2l6ZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAoY2hhciAqKWFsaWduZWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEVuYWJsZSBvbmx5IEBvcmRlciAob3JkZXIgMDogbm90aGluZyksIGZhdWx0IG9uZSBhbGlnbmVkIHdpbmRvdyBpbiBhbmRcbiYjNDM7ICogY2hlY2sgdGhlIGhlbHBlcnMgc2VlIGV4YWN0bHkgQG9yZGVyLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfb3JkZXIoaW50IG9yZGVyKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdHNpemVfdCBzaXplID0gcHNpemUoKSBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0Ym9vbCBvayA9IHRydWU7XG4mIzQzO1x0Y2hhciAqcDtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuJiM0MztcdGlmIChvcmRlcilcbiYjNDM7XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRwID0gYWxsb2NfYWxpZ25lZChzaXplKTtcbiYjNDM7XHQqcCA9IDE7XG4mIzQzO1xuJiM0MztcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O29yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcblwmIzM0Oywgb3JkZXIpO1xuJiM0MztcdFx0b2sgPSBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEEgbG93ZXIgb3JkZXIgbXVzdCBiZSByZWplY3RlZDogdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cbiYjNDM7XHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIgLSAxLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O29yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBvcmRlciwgb3JkZXIgLSAxKTtcbiYjNDM7XHRcdG9rID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBPcmRlciAwIHBhZ2VzIG11c3Qgbm90IGxvb2sgbGlrZSBhbnkgbGFyZ2UgZm9saW8sIGFuZCB2aWNlIHZlcnNhLiAqL1xuJiM0MztcdGlmIChvcmRlciBcdTAwMjZcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCAwLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O29yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxcblwmIzM0Oywgb3JkZXIpO1xuJiM0MztcdFx0b2sgPSBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG11bm1hcChwLCBzaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHQob2ssIFwmIzM0O29yZGVyICVkIGNsYXNzaWZpZWRcXG5cJiMzNDssIG9yZGVyKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG1haW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBvcmRlcnM7XG4mIzQzO1x0aW50IG9yZGVyO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0cGFnZW1hcF9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCYjMzQ7KTtcbiYjNDM7XHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtvcGVuKFxcXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1xcXCYjMzQ7KSByZXF1aXJlcyByb290XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0b3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcbiYjNDM7XHRpZiAoIW9yZGVycylcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O05vIHN1cHBvcnRlZCBUSFAgb3JkZXJzXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9zZXRfcGxhbihfX2J1aWx0aW5fcG9wY291bnRsKG9yZGVycykgJiM0MzsgMSk7XG4mIzQzO1xuJiM0MztcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi9cbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdGNoZWNrX29yZGVyKDApO1xuJiM0MztcdGZvciAob3JkZXIgPSAxOyBvcmRlciBcdTAwM2MgTlJfT1JERVJTOyBvcmRlciYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmICghKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXIpKSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRjaGVja19vcmRlcihvcmRlcik7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xuaW5kZXggZTI2NDJlY2EwZDAyYi4uZGY0MjZmOTIxOGU3MSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xuQEAgLTY1LDcgJiM0Mzs2NSw2IEBAIGVudW0ge1xuICNkZWZpbmUgSE1NX1BBVEhfTUFYICAgIDY0XG4gI2RlZmluZSBOVElNRVNcdFx0MTBcbiBcbi0jZGVmaW5lIEFMSUdOKHgsIGEpICgoKHgpICYjNDM7IChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi9cbiBcbiAjaWZuZGVmIEZPTExfV1JJVEVcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuaW5kZXggZDc5MTdkY2UzYWJhYy4uOGFmY2RmOTc5M2JiNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbkBAIC0xODMsNiAmIzQzOzE4MywxNyBAQCB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0fVxuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogV3JpdGUgb25seSBvbiBjaGFuZ2U6IGFueSBzdG9yZSB0byBhIGtodWdlcGFnZWQgc3lzZnMga25vYiB3YWtlcyB0aGVcbiYjNDM7ICogZGFlbW9uLCBhbmQgc2V0dGluZ3MgcHVzaGVzL3BvcHMgbXVzdCBub3Qgc3RhcnQgc2NhbiBwYXNzZXMgbm9ib2R5XG4mIzQzOyAqIGFza2VkIGZvciAtLSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGlzIHRoZSBvbmx5IHNhbmN0aW9uZWQgd2FrZS5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pXG4mIzQzO3tcbiYjNDM7XHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcbiYjNDM7XHRcdHRocF93cml0ZV9udW0obmFtZSwgbnVtKTtcbiYjNDM7fVxuJiM0MztcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiB7XG4gXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFx1MDAyNnNldHRpbmdzLVx1MDAzZWtodWdlcGFnZWQ7XG5AQCAtMTk4LDE1ICYjNDM7MjA5LDE1IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0XHRcdHNobWVtX2VuYWJsZWRfc3RyaW5nc1tzZXR0aW5ncy1cdTAwM2VzaG1lbV9lbmFibGVkXSk7XG4gXHR0aHBfd3JpdGVfbnVtKFwmIzM0O3VzZV96ZXJvX3BhZ2VcJiMzNDssIHNldHRpbmdzLVx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xuIFxuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL2RlZnJhZ1wmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VkZWZyYWcpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wmIzM0Oyxcbi1cdFx0XHRraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcJiMzNDssXG4tXHRcdFx0a2h1Z2VwYWdlZC1cdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3N3YXApO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWdcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlZGVmcmFnKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX25vbmVcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3N3YXApO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9wYWdlc190b19zY2FuXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuIFxuIFx0aWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pXG4gXHRcdHdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy1cdTAwM2VyZWFkX2FoZWFkX2tiKTtcbkBAIC0yMzAsNiAmIzQzOzI0MSw0OSBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiBcdH1cbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIENvbXBsZXRpb24gYmFycmllciBmb3Iga2h1Z2VwYWdlZDogd2FpdCB1bnRpbCBhIGZ1bGwgc2NhbiBwYXNzIHRoYXRcbiYjNDM7ICogc3RhcnRlZCBhZnRlciB0aGlzIGNhbGwgaGFzIGZpbmlzaGVkLiBmdWxsX3NjYW5zIG11c3QgYWR2YW5jZSBieSB0d287XG4mIzQzOyAqIGEgJiM0MzsxIHN0ZXAgbWF5IGNvbXBsZXRlIGEgcGFzcyB0aGF0IGV4YW1pbmVkIHRoaXMgbW0gYmVmb3JlIHRoZVxuJiM0MzsgKiBjYWxsZXImIzM5O3Mgc2V0dXAgd2FzIGluIHBsYWNlLlxuJiM0MzsgKlxuJiM0MzsgKiBBbnkgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgc28gdGhlIGJhcnJpZXIgd29ya3NcbiYjNDM7ICogd2hhdGV2ZXIgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlIC0tIGJ1dCBhIHN0b3JlIGNhbiBiZSBsb3N0LlxuJiM0MzsgKiBfX3NsZWVwX21pbGxpc2Vjc19zdG9yZSgpIGNsZWFycyBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZSBhbmQgd2FrZXMgdGhlXG4mIzQzOyAqIHF1ZXVlOyBpZiB0aGUgZGFlbW9uIGlzIGJldHdlZW4gc2NhbnMgcmF0aGVyIHRoYW4gc2xlZXBpbmcsIGl0IHNldHNcbiYjNDM7ICoga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgaXRzZWxmIG9uIHRoZSB3YXkgaW50byBraHVnZXBhZ2VkX3dhaXRfd29yaygpIGFuZFxuJiM0MzsgKiB0aGVuIHNsZWVwcyBmb3IgdGhlIGZ1bGwgaW50ZXJ2YWwsIGhhdmluZyBuZXZlciBzZWVuIHRoZSBzdG9yZS4gIFNvIGtlZXBcbiYjNDM7ICogc3RvcmluZyB1bnRpbCB0aGUgcGFzcyBsYW5kczsgYSBzdG9yZSB3aGlsZSB0aGUgZGFlbW9uIGlzIGF3YWtlIGNvc3RzXG4mIzQzOyAqIG5vdGhpbmcgYW5kIGRvZXMgbm90IHF1ZXVlIGFuIGV4dHJhIHBhc3MuXG4mIzQzOyAqXG4mIzQzOyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpblxuJiM0MzsgKiBvbmUgc2NhbiBiYXRjaCwgc28gY2FsbGVycyBtdXN0IHBhaXIgdGhpcyB3aXRoIGEgbGFyZ2VcbiYjNDM7ICogcGFnZXNfdG9fc2Nhbi5cbiYjNDM7ICovXG4mIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9XG4mIzQzO1x0XHR0aHBfcmVhZF9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0Oyk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbGFwc2VkX21zID0gMDtcbiYjNDM7XHRpbnQgcGFzcztcbiYjNDM7XG4mIzQzO1x0Zm9yIChwYXNzID0gMDsgcGFzcyBcdTAwM2MgMjsgcGFzcyYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgdGFyZ2V0ID1cbiYjNDM7XHRcdFx0dGhwX3JlYWRfbnVtKFwmIzM0O2todWdlcGFnZWQvZnVsbF9zY2Fuc1wmIzM0OykgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0XHR3aGlsZSAodGhwX3JlYWRfbnVtKFwmIzM0O2todWdlcGFnZWQvZnVsbF9zY2Fuc1wmIzM0OykgXHUwMDNjIHRhcmdldCkge1xuJiM0MztcdFx0XHRpZiAoZWxhcHNlZF9tcyBcdTAwM2U9IGRlYWRsaW5lX21zKVxuJiM0MztcdFx0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdFx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIHNsZWVwX21zKTtcbiYjNDM7XHRcdFx0dXNsZWVwKDEwICogMTAwMCk7XG4mIzQzO1x0XHRcdGVsYXBzZWRfbXMgJiM0Mzs9IDEwO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiBzdHJ1Y3QgdGhwX3NldHRpbmdzICp0aHBfY3VycmVudF9zZXR0aW5ncyh2b2lkKVxuIHtcbiBcdGlmICghc2V0dGluZ3NfaW5kZXgpIHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuaW5kZXggNzI2YzczYzQzYzA1Yi4uYmE3ZDM4MzcwZDQzMyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbkBAIC03MCw2ICYjNDM7NzAsNyBAQCBpbnQgdGhwX3JlYWRfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10pO1xuIHZvaWQgdGhwX3dyaXRlX3N0cmluZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3JlYWRfbnVtKGNvbnN0IGNoYXIgKm5hbWUpO1xuIHZvaWQgdGhwX3dyaXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4mIzQzO3ZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pO1xuIFxuIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKTtcbiB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKTtcbkBAIC04Myw2ICYjNDM7ODQsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZClcbiBcdGh1Z2VwYWdlX3NhdmVfc2V0dGluZ3MoLyogdGhwID0gKi8gdHJ1ZSwgLyogaHVnZXRsYiA9ICovIGZhbHNlKTtcbiB9XG4gXG4mIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcyk7XG4mIzQzO1xuIHZvaWQgdGhwX3NldF9yZWFkX2FoZWFkX3BhdGgoY2hhciAqcGF0aCk7XG4gdW5zaWduZWQgbG9uZyB0aHBfc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuaW5kZXggMGQ2YzcxZWQyZmFlMy4uZjU3NzNkNDQ3NTQyNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5AQCAtMzEsNiAmIzQzOzMxLDExIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjtcbiBzdGF0aWMgaW50IGFub25fb3JkZXI7XG4gc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcjtcbiYjNDM7c3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfZ2l2ZW47XG4mIzQzO3N0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXJzW05SX09SREVSU107XG4mIzQzO3N0YXRpYyBpbnQgbnJfY29sbGFwc2Vfb3JkZXJzO1xuJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTtcbiYjNDM7c3RhdGljIGludCBrcGFnZWZsYWdzX2ZkID0gLTE7XG4gXG4gI2RlZmluZSBQSURfU01BUFMgXCYjMzQ7L3Byb2Mvc2VsZi9zbWFwc1wmIzM0O1xuICNkZWZpbmUgVEVTVF9GSUxFIFwmIzM0O2NvbGxhcHNlX3Rlc3RfZmlsZVwmIzM0O1xuQEAgLTI0MSw2ICYjNDM7MjQ2LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKVxuIFx0cmV0dXJuIHN3YXA7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBQYWdlIHRoZSByYW5nZSBvdXQgYW5kIHdhaXQgZm9yIHRoZSBzd2FwIGNvdW50IHRvIHNheSBzby5cbiYjNDM7ICpcbiYjNDM7ICogVHdvIHRoaW5ncyBnZXQgaW4gdGhlIHdheS4gIE1BRFZfUEFHRU9VVCBpcyBiZXN0IGVmZm9ydDpcbiYjNDM7ICogc2hyaW5rX2ZvbGlvX2xpc3QoKSBsZWF2ZXMgYSBmb2xpbyBhbG9uZSB3aGVuIGl0IGNhbm5vdCByZWNsYWltIGl0IHJpZ2h0XG4mIzQzOyAqIGF3YXksIGFuZCBvbmUgc3RpbGwgdW5kZXIgd3JpdGViYWNrIGZyb20gYW4gZWFybGllciBwYWdlb3V0IGlzIHRoZSBjb21tb25cbiYjNDM7ICogY2FzZSwgc28gdGhlIGNvdW50IHRoZSBjYWxsZXIgYXNrcyBmb3IgYXJyaXZlcyBhIG1vbWVudCBsYXRlci4gIEFuZCBhIHJhbmdlXG4mIzQzOyAqIGFuIGVhcmxpZXIgY29sbGFwc2UgbGVmdCBNQURWX0hVR0VQQUdFIGlzIG9uZSBraHVnZXBhZ2VkIGlzIHN0aWxsIHdvcmtpbmdcbiYjNDM7ICogb246IGNvbGxhcHNpbmcgYSByYW5nZSB3aXRoIHVwIHRvIG1heF9wdGVzX3N3YXAgcGFnZXMgc3dhcHBlZCBvdXQgbWVhbnNcbiYjNDM7ICogcmVhZGluZyB0aG9zZSBwYWdlcyBiYWNrIGluLCBzbyB0aGUgZGFlbW9uIHVuZG9lcyB0aGUgcGFnZW91dCBhcyBmYXN0IGFzIGl0XG4mIzQzOyAqIGlzIGFza2VkIGZvci4gIEtlZXAgdGhlIHJhbmdlIG91dCBvZiBpdHMgcmVhY2g7IHRoZSBjb2xsYXBzZSB0aGUgY2FsbGVyIHJ1bnNcbiYjNDM7ICogbmV4dCBwdXRzIE1BRFZfSFVHRVBBR0UgYmFjay5cbiYjNDM7ICpcbiYjNDM7ICogRmFpbGluZyB0byBnZXQgdGhlIHBhZ2VzIG91dCBpcyB0aGUgbWFjaGluZSYjMzk7cyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJiMzOTtzIC0tXG4mIzQzOyAqIHN3YXAgdG9vIHNtYWxsLCBzd2FwIGZ1bGwsIGEgbWVtY2cgY2FwLCBhIGZvbGlvIHN0aWxsIHVuZGVyIHdyaXRlYmFjayAtLSBzb1xuJiM0MzsgKiBjYWxsZXJzIHNraXAgcmF0aGVyIHRoYW4gZmFpbC4gIEFuIGVycm9yIGZyb20gbWFkdmlzZSgpIGlzIGRpZmZlcmVudCwgYW5kXG4mIzQzOyAqIGVuZHMgdGhlIHJ1biBoZXJlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9OT0hVR0VQQUdFKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0MDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVClcJiMzNDspO1xuJiM0MztcdFx0aWYgKGNoZWNrX3N3YXAocCwgc2l6ZSkpXG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdFx0dXNsZWVwKDUwICogMTAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCAqYWxsb2NfbWFwcGluZyhpbnQgbnIpXG4ge1xuIFx0dm9pZCAqcDtcbkBAIC01ODMsOCAmIzQzOzYyMywxMCBAQCBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IG5yX2hwYWdlcywgaW50IGNvbGxhcF9vcmRlciwgc3RydWN0IG1lbV9vcHMgKm9wcylcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGhwYWdlX3NpemUgPSBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcF9vcmRlcjtcbiYjNDM7XHQvKiBUaHJlZSBzZWNvbmRzIGFzIGEgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gdG8gY29sbGFwc2UgKi9cbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIGJ5dGVzID0gKHVuc2lnbmVkIGxvbmcpbnJfaHBhZ2VzICogaHBhZ2Vfc2l6ZTtcbiYjNDM7XHRpbnQgdGltZW91dCA9IDYgJiM0MzsgMiAqIChieXRlcyAvICgxMjhVTCBcdTAwM2NcdTAwM2MgMjApKTtcbiBcdGludCBmdWxsX3NjYW5zO1xuLVx0aW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi9cbiBcbiBcdC8qIFNhbml0eSBjaGVjayAqL1xuIFx0aWYgKCFvcHMtXHUwMDNlY2hlY2tfaHVnZShwLCBsZW4sIDAsIGhwYWdlX3NpemUpKVxuQEAgLTg1MywxMiAmIzQzOzg5NSwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9zd2FwaW5fc2luZ2xlX3B0ZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcFxuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbi1cdGlmIChtYWR2aXNlKHAsIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9QQUdFT1VUKVwmIzM0Oyk7XG4tXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XG4mIzQzO1x0aWYgKHN3YXBvdXRfcmFuZ2UocCwgcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1x0XHRza2lwKFwmIzM0O0NvdWxkIG5vdCBzd2FwIG91dFwmIzM0Oyk7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuQEAgLTg4NSwxMiAmIzQzOzkyNSwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbi1cdGlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpXCYjMzQ7KTtcbi1cdGlmIChjaGVja19zd2FwKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkge1xuJiM0MztcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1x0XHRza2lwKFwmIzM0O0NvdWxkIG5vdCBzd2FwIG91dFwmIzM0Oyk7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuQEAgLTkwMiwxMiAmIzQzOzk0MCwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCYjMzQ7LCBtYXhfcHRlc19zd2FwLFxuIFx0XHQgICAgICAgaHBhZ2VfcG1kX25yKTtcbi1cdFx0aWYgKG1hZHZpc2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpXCYjMzQ7KTtcbi1cdFx0aWYgKGNoZWNrX3N3YXAocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbiYjNDM7XHRcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUpKSB7XG4gXHRcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XHRcdFx0c2tpcChcJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXRcJiMzNDspO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gXG5AQCAtOTc0LDYgJiM0MzsxMDEwLDE2IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbXBvdW5kX2V4dHJlbWUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHR2b2lkICpwO1xuIFx0aW50IGk7XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgdGVzdCBuZWVkcyBocGFnZV9wbWRfbnIgUE1ELW9yZGVyIGFsbG9jYXRpb25zLCB3aGljaCBpcyBsaWtlbHkgdG9cbiYjNDM7XHQgKiBmYWlsIGZvciBsYXJnZSBQTUQgc2l6ZXMuICBTa2lwIGlmIHRoZSBQTUQgc2l6ZSBpcyBvdmVyIDMyTS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoaHBhZ2VfcG1kX3NpemUgXHUwMDNlICgzMlVMIFx1MDAzY1x1MDAzYyAyMCkpIHtcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDslczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXG5cJiMzNDspO1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaHBhZ2VfcG1kX25yOyBpJiM0MzsmIzQzOykge1xuQEAgLTExNjQsNiAmIzQzOzEyMTAsNzIgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBDb250ZW50IHN0YXlzIGlzb2xhdGVkIHdoaWxlIGEgY28tc2hhcmVyIHdyaXRlcyBjb25jdXJyZW50bHkuIEEgc2hhcmVkXG4mIzQzOyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlXG4mIzQzOyAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNvcHk7IGEgY28tc2hhcmVyJiMzOTtzIHdyaXRlIGdvZXMgdG8gYSBDb1cgY29weS4gVGhlXG4mIzQzOyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5XG4mIzQzOyAqIGl0cyBvd24gd3JpdGVzLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgc2hhcmVkID0gNjQgKiBwYWdlX3NpemU7XG4mIzQzO1x0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xuJiM0MztcdGludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG4gPSBzaGFyZWQgLyBwYWdlX3NpemU7XG4mIzQzO1x0Lyogdm9sYXRpbGU6IHRoZSBsb29wIGJlbG93IG11c3QgcmVhbGx5IHN0b3JlLCBvbiBldmVyeSBpdGVyYXRpb24gKi9cbiYjNDM7XHR2b2xhdGlsZSBpbnQgKmlwO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHRpcCA9IHA7XG4mIzQzO1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIHNoYXJlZCk7XHRcdC8qIHNoYXJlZCBwcmVmaXgsIHByZS1mb3JrIHBhdHRlcm4gKi9cbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Rm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cJiMzNDspO1xuJiM0MztcdGlmICghZm9yaygpKSB7XG4mIzQzO1x0XHRpbnQgY29sbGFwc2Vfc3RhdHVzO1xuJiM0MztcbiYjNDM7XHRcdG9wcy1cdTAwM2VmYXVsdChwLCBzaGFyZWQsIGhwYWdlX3BtZF9zaXplKTtcdC8qIHByaXZhdGUgcmVtYWluZGVyICovXG4mIzQzO1x0XHRjLVx1MDAzZWNvbGxhcHNlKFwmIzM0O0NvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgIHAsIDEsIG9wcywgdHJ1ZSk7XG4mIzQzO1x0XHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGRlYWQwMDAwKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0aWYgKGkgPT0gbilcbiYjNDM7XHRcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGZhaWwoXCYjMzQ7RmFpbDogY2hpbGQgY29udGVudFwmIzM0Oyk7XG4mIzQzO1x0XHQvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlLiAqL1xuJiM0MztcdFx0aWYgKGV4aXRfc3RhdHVzICE9IEtTRlRfRkFJTClcbiYjNDM7XHRcdFx0ZXhpdF9zdGF0dXMgPSBjb2xsYXBzZV9zdGF0dXM7XG4mIzQzO1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRcdF9leGl0KGV4aXRfc3RhdHVzKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEhhbW1lciB0aGUgcGFyZW50JiMzOTtzIG93biB3cml0ZXMgb3ZlciB0aGUgc2hhcmVkIHByZWZpeC4gKi9cbiYjNDM7XHRmb3IgKGludCBpdCA9IDA7IGl0IFx1MDAzYyAyMDAwMDA7IGl0JiM0MzsmIzQzOylcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRpcFtpICogc3RyaWRlXSA9IGkgJiM0MzsgMHhiZWVmMDAwMDtcbiYjNDM7XG4mIzQzO1x0d2FpdChcdTAwMjZ3c3RhdHVzKTtcbiYjNDM7XHQvKiBBIGNoaWxkIHRoYXQgZGllZCByZWFkaW5nIHRoZSByYWNpbmcgcGFnZXMgaXMgYSBmYWlsdXJlLCBub3QgYSB6ZXJvLiAqL1xuJiM0MztcdGNoaWxkX3N0YXR1cyA9IFdJRkVYSVRFRCh3c3RhdHVzKSA/IFdFWElUU1RBVFVTKHdzdGF0dXMpIDogS1NGVF9GQUlMO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDaGVjayB0aGUgcGFyZW50IHNlZXMgb25seSBpdHMgb3duIHdyaXRlcy4uLlwmIzM0Oyk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGJlZWYwMDAwKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRpZiAoaSA9PSBuKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsOiBwYXJlbnQgY29udGVudFwmIzM0Oyk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0LyogU2FtZSBhZ2Fpbjogb3VyIG93biBjaGVjayBtdXN0IG5vdCBidXJ5IHRoZSBjaGlsZCYjMzk7cyB2ZXJkaWN0LiAqL1xuJiM0MztcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXG4mIzQzO1x0XHRleGl0X3N0YXR1cyA9IGNoaWxkX3N0YXR1cztcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuQEAgLTEyMDksNiAmIzQzOzEzMjEsMjE5IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKiBTbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIHdpbGwgY29uc2lkZXIgZm9yIG1USFAgY29sbGFwc2UuICovXG4mIzQzOyNkZWZpbmUgTUlOX01USFBfT1JERVIgMlxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBmb3IgdGhlIG10aHBfa2h1Z2VwYWdlZCBjb250ZXh0LiAgV2hhdFxuJiM0MzsgKiB0aGV5IGFkZCBvdmVyIHRoZSBnZW5lcmljIGNhc2VzIHJ1biB1bmRlciB0aGF0IGNvbnRleHQgaXMgcGVyLXdpbmRvd1xuJiM0MzsgKiBkZXRlY3Rpb246IHdoaWNoIGFsaWduZWQgd2luZG93IGNvbGxhcHNlZCwgYW5kIHdoaWNoIG9mIGl0cyBuZWlnaGJvdXJzIGRpZFxuJiM0MzsgKiBub3QuICBjaGVja19odWdlKCkgYW5zd2VycyBob3cgbWFueSBmb2xpb3Mgb2YgdGhlIG9yZGVyIHRoZSByYW5nZSBob2xkcyxcbiYjNDM7ICogd2hpY2ggY2Fubm90IHRlbGwgb25lIHdpbmRvdyBmcm9tIGFub3RoZXIuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgYW5kIHRoZSB0YXJnZXQgb3JkZXIgaXMgb25seVxuJiM0MzsgKiBlbmFibGVkIGZvciBtYWR2aXNlLCBzbyB0aGUgc291cmNlcyBhcmUgYWx3YXlzIG9yZGVyIDAgYW5kIHRoZSBjb2xsYXBzZVxuJiM0MzsgKiBwcm9kdWN0IGNhbiBvbmx5IGhhdmUgY29tZSBmcm9tIGtodWdlcGFnZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgc2l6ZV90IG10aHBfd2luZG93X3NpemUodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcHNlX29yZGVyO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHRhcmdldCBvcmRlciwgZm9yIG1hZHZpc2Ugb25seSwgYW5kIG5vdGhpbmcgZWxzZSBlbmFibGVkOiB0aGVcbiYjNDM7XHQgKiBjYXNlcyBmYXVsdCB0aGVpciByZWdpb24gYmVmb3JlIE1BRFZfSFVHRVBBR0UsIHNvIHRoZSBzb3VyY2VzIGFyZVxuJiM0MztcdCAqIG9yZGVyIDAgd2hhdGV2ZXIgLXMgYXNrZWQgdGhlIGZhdWx0IHBhdGggZm9yLiAgVGhhdCBtYXR0ZXJzIGZvciB0aGVcbiYjNDM7XHQgKiBjYXNlcyBidWlsdCBhcm91bmQgYSBob2xlIC0tIGEgbGFyZ2Ugc291cmNlIGZvbGlvIHdvdWxkIGZpbGwgaXQgaW5cbiYjNDM7XHQgKiBhbmQgdGhlIHdpbmRvdyB3b3VsZCBjb2xsYXBzZSBhZnRlciBhbGwuXG4mIzQzO1x0ICogY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcyBlbmFibGVzIHRoZSBzb3VyY2Ugb3JkZXIgaXQgd2FudHMgb25cbiYjNDM7XHQgKiB0b3Agb2YgdGhpcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0c2V0dGluZ3MuaHVnZXBhZ2VzW2NvbGxhcHNlX29yZGVyXS5lbmFibGVkID0gVEhQX01BRFZJU0U7XG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCB3aW5kb3dfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBsZW4sIGNvbGxhcHNlX29yZGVyLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBObyBhbGlnbmVkIHdpbmRvdyBpbiBbcCwgcCAmIzQzOyBsZW4pIGlzIGJhY2tlZCBhdCB0aGUgdGFyZ2V0IG9yZGVyLiAqL1xuJiM0MztzdGF0aWMgYm9vbCB3aW5kb3dfbm90X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcbiYjNDM7XHRjaGFyICphZGRyID0gcDtcbiYjNDM7XG4mIzQzO1x0Zm9yICg7IGxlbiBcdTAwM2U9IHdpbmRvdzsgYWRkciAmIzQzOz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7XG4mIzQzO1x0XHRpZiAod2luZG93X2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHQvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xuJiM0MztcdHJldHVybiBraHVnZXBhZ2VkX2Z1bGxfcGFzcygzMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4mIzQzO1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xuJiM0MztcbiYjNDM7XHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4mIzQzO1x0b3BzLVx1MDAzZWZhdWx0KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XG4mIzQzO1x0aWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIG9uZSBmdWxseSBwb3B1bGF0ZWQgd2luZG93Li4uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwLCB3aW5kb3cpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgJiM0MzsgMiAqIHdpbmRvdyxcbiYjNDM7XHRcdFx0XHQgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiYjNDM7XHRcdFx0XHRcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xuJiM0MztcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb2xsYXBzZSB3aW5kb3cgd2l0aCBzaW5nbGUgUFRFIGVudHJ5IHByZXNlbnQuLi5cJiMzNDspO1xuJiM0MztcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuJiM0MztcdFx0ZmFpbChcJiMzNDtUaW1lb3V0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIG10aHBfd2luZG93X3NpemUoKSkpXG4mIzQzO1x0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRmYWlsKFwmIzM0O0ZhaWxcJiMzNDspO1xuJiM0MztcbiYjNDM7XHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4mIzQzO1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcbiYjNDM7XHR2b2lkICpwO1xuJiM0MztcbiYjNDM7XHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4mIzQzO1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbiYjNDM7XHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29sbGFwc2UgZnVsbCB3aW5kb3csIG5vdCB0aGUgb25lIG1pc3NpbmcgYSBwYWdlLi4uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCB3aW5kb3cpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgJiM0Mzsgd2luZG93LCB3aW5kb3cpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4mIzQzO1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdGludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSO1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0LyogU291cmNlcyBtdXN0IGJlIGEgc3VwcG9ydGVkIG1USFAgb3JkZXIgc3RyaWN0bHkgYmVsb3cgdGhlIHRhcmdldC4gKi9cbiYjNDM7XHRpZiAoc291cmNlX29yZGVyIFx1MDAzZT0gY29sbGFwc2Vfb3JkZXIgfHxcbiYjNDM7XHQgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBzb3VyY2Vfb3JkZXIpKSkge1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwmIzM0OyVzOiBubyBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0LyogRmF1bHQgdGhlIHdob2xlIHJlZ2lvbiBhcyBvcmRlci1Ac291cmNlX29yZGVyIGZvbGlvcy4gKi9cbiYjNDM7XHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdHNldHRpbmdzLmh1Z2VwYWdlc1tzb3VyY2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4mIzQzO1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIG9yZGVyIGlzIGVuYWJsZWQgYW5kIHN1cHBvcnRlZCwgYnV0IHRoZSBhbGxvY2F0b3IgY2FuIHN0aWxsIGZhbGxcbiYjNDM7XHQgKiBiYWNrIHVuZGVyIGZyYWdtZW50YXRpb24uICBUaGF0IGxlYXZlcyBub3RoaW5nIHRvIGNvbGxhcHNlIGZyb20sXG4mIzQzO1x0ICogd2hpY2ggaXMgdGhlIG1hY2hpbmUmIzM5O3MgYW5zd2VyIHJhdGhlciB0aGFuIGEgcmVhc29uIHRvIGVuZCB0aGUgcnVuLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxuJiM0MztcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Tm8gb3JkZXItJWQgc291cmNlcyB0byBjb2xsYXBzZS4uLlwmIzM0Oywgc291cmNlX29yZGVyKTtcbiYjNDM7XHRcdHNraXAoXCYjMzQ7U2tpcFwmIzM0Oyk7XG4mIzQzO1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4mIzQzO1x0XHRmYWlsKFwmIzM0O1RpbWVvdXRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7XFxuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gXHUwMDNjdGVzdCB0eXBlXHUwMDNlIFtkaXJdXFxuXFxuXCYjMzQ7KTtcbkBAIC0xMjI2LDExICYjNDM7MTU1MSwxNSBAQCBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQtYzogY29sbGFwc2Ugb3JkZXIgZm9yIG1USFAgY29sbGFwc2UsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgRGVmYXVsdHMgdG8gZXZlcnkgc3VwcG9ydGVkIG9yZGVyIGJlbG93IHRoZSBQTUQuXFxuXCYjMzQ7KTtcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcdFwmIzM0O1xcdFxcdCAgICBXaXRoIC1zLCAtcyBuYW1lcyB0aGUgbVRIUCBzb3VyY2Ugb3JkZXIgZm9yIHRoZVxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgbWl4ZWQtc291cmNlIGNhc2UgKHNvdXJjZSBvcmRlciBiZWxvdyB0aGUgdGFyZ2V0KS5cXG5cJiMzNDspO1xuIFx0ZXhpdCgxKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4mIzQzO1x0Ym9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlO1xuIFx0aW50IG9wdDtcbiBcdGNoYXIgKmJ1ZjtcbiBcdGNvbnN0IGNoYXIgKnRva2VuO1xuQEAgLTEyNDIsNiAmIzQzOzE1NzEsNyBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7YyYjMzk7OlxuIFx0XHRcdGNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpO1xuJiM0MztcdFx0XHRjb2xsYXBzZV9vcmRlcl9naXZlbiA9IHRydWU7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtoJiMzOTs6XG4gXHRcdGRlZmF1bHQ6XG5AQCAtMTI0OSwxMiAmIzQzOzE1NzksMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0fVxuIFx0fVxuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogQm90aCBvcmRlcnMgZW5kIHVwIGFzIGFycmF5IGluZGljZXMgYW5kIHNoaWZ0IGNvdW50cywgc28gbmVpdGhlclxuJiM0MztcdCAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChhbm9uX29yZGVyIFx1MDAzYyAwIHx8IGFub25fb3JkZXIgXHUwMDNlIGhwYWdlX3BtZF9vcmRlcilcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDstcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgIGhwYWdlX3BtZF9vcmRlciwgYW5vbl9vcmRlcik7XG4mIzQzO1x0aWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0Oy1jIHRha2VzIGFuIG9yZGVyIGluIDEuLiVkLCBub3QgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgaHBhZ2VfcG1kX29yZGVyLCBjb2xsYXBzZV9vcmRlcik7XG4mIzQzO1xuIFx0YXJndiAmIzQzOz0gb3B0aW5kO1xuIFx0YXJnYyAtPSBvcHRpbmQ7XG4gXG4gXHRpZiAoYXJnYyA9PSAwKSB7XG4tXHRcdC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovXG4mIzQzO1x0XHQvKiBFdmVyeXRoaW5nIHRoYXQgbmVlZHMgbm8gYXJndW1lbnQgb2YgaXRzIG93bjogYW5vbiwgZXZlcnkgY29udGV4dCAqL1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4mIzQzO1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0cmV0dXJuO1xuQEAgLTEyNjUsMTMgJiM0MzsxNjA4LDE5IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXG4gXHRpZiAoIXN0cmNtcCh0b2tlbiwgXCYjMzQ7YWxsXCYjMzQ7KSkge1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4mIzQzO1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFwmIzM0O2FsbFwmIzM0OyBzd2VlcHMgdGhlIG1USFAgY29udGV4dCBpbiwgYnV0IGl0IG9ubHkgaGFzIGFub25cbiYjNDM7XHRcdCAqIGNhc2VzOiBzdGVwIGl0IGFzaWRlIGZvciB0aGUgb3RoZXIgbWVtX3R5cGVzIHJhdGhlciB0aGFuXG4mIzQzO1x0XHQgKiByZWZ1c2luZyB0aGUgd2hvbGUgcnVuLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRtdGhwX2NvbnRleHRfaW1wbGllZCA9IHRydWU7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O2todWdlcGFnZWRcJiMzNDspKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCYjMzQ7bXRocF9raHVnZXBhZ2VkXCYjMzQ7KSkge1xuIFx0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuLVx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKVxuLVx0XHRcdHVzYWdlKCk7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O21hZHZpc2VcJiMzNDspKSB7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdH0gZWxzZSB7XG5AQCAtMTI4NywyMCAmIzQzOzE2MzYsMjAgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICBcdTAwMjZfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0c2htZW1fb3BzID0gXHUwMDI2X19zaG1lbV9vcHM7XG4tXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcbi1cdFx0XHR1c2FnZSgpO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7YW5vblwmIzM0OykpIHtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7ZmlsZVwmIzM0OykpIHtcbiBcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gIFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7c2htZW1cJiMzNDspKSB7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIHtcbiBcdFx0dXNhZ2UoKTtcbiBcdH1cbkBAIC0xMzIyLDkgJiM0MzsxNjcxLDE0IEBAIHN0cnVjdCB0ZXN0X2Nhc2Uge1xuIFx0c3RydWN0IG1lbV9vcHMgKm9wcztcbiBcdGNvbnN0IGNoYXIgKmRlc2M7XG4gXHR0ZXN0X2ZuIGZuO1xuJiM0MztcdGludCBvcmRlcjtcdFx0LyogbVRIUCBjb250ZXh0czogdGhlIGNvbGxhcHNlIG9yZGVyICovXG4gfTtcbiBcbi0jZGVmaW5lIE1BWF9URVNUX0NBU0VTIDY0XG4mIzQzOy8qXG4mIzQzOyAqIEVub3VnaCBmb3IgZXZlcnkgY2FzZSBhdCBldmVyeSBvcmRlciB0aGUga2VybmVsIG9mZmVyczogdGhlIG1USFAgY29udGV4dFxuJiM0MzsgKiBydW5zIGl0cyBjYXNlcyBvbmNlIHBlciBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2XG4gc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107XG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xuIFxuQEAgLTEzMzcsNiAmIzQzOzE2OTEsNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXHRcdFx0Lm9wc1x0PSBvLFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5kZXNjXHQ9ICN0LFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5mblx0PSB0LFx0XHRcdFx0XHRcXFxuJiM0MztcdFx0XHQub3JkZXJcdD0gY29sbGFwc2Vfb3JkZXIsXHRcdFx0XFxcbiBcdFx0fTtcdFx0XHRcdFx0XHRcdFxcXG4gXHR9XHRcdFx0XHRcdFx0XHRcdFxcXG4gXHR9IHdoaWxlICgwKVxuQEAgLTEzNzcsOCAmIzQzOzE3MzIsODMgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFxuIFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xuIFxuJiM0MztcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbikge1xuJiM0MztcdFx0XHQvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi9cbiYjNDM7XHRcdFx0aWYgKGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDstYyB0YWtlcyBhbiBvcmRlciBiZWxvdyB0aGUgUE1EIG9yZGVyICglZClcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHRcdCAgIGhwYWdlX3BtZF9vcmRlcik7XG4mIzQzO1x0XHRcdGlmICghKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgY29sbGFwc2Vfb3JkZXIpKSlcbiYjNDM7XHRcdFx0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgY29sbGFwc2Vfb3JkZXIpO1xuJiM0MztcdFx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSBhbm9uX29yZGVyKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0Oy1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGNvbGxhcHNlX29yZGVyLCBhbm9uX29yZGVyKTtcbiYjNDM7XHRcdFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gY29sbGFwc2Vfb3JkZXI7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBPdGhlcndpc2UgZXZlcnkgb3JkZXIgYSBjb2xsYXBzZSBjb3VsZCBwcm9kdWNlLiAgLXNcbiYjNDM7XHRcdFx0ICogbWFrZXMgdGhlIGZhdWx0IHBhdGggaGFuZCBvdXQgZm9saW9zIG9mIHRoYXQgb3JkZXIsXG4mIzQzO1x0XHRcdCAqIHNvIGEgdGFyZ2V0IGF0IG9yIGJlbG93IGl0IGhhcyBub3RoaW5nIHRvIGNvbGxhcHNlOlxuJiM0MztcdFx0XHQgKiB0aGUgc291cmNlcyBhcmUgYWxyZWFkeSB0aGUgc2l6ZSBiZWluZyBhc2tlZCBmb3IuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRpbnQgZmlyc3QgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciAmIzQzOyAxIDogTUlOX01USFBfT1JERVI7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoZmlyc3QgXHUwMDNjIE1JTl9NVEhQX09SREVSKVxuJiM0MztcdFx0XHRcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XG4mIzQzO1x0XHRcdGZvciAoaW50IGkgPSBmaXJzdDsgaSBcdTAwM2MgaHBhZ2VfcG1kX29yZGVyOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRcdGlmIChvcmRlcnMgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuJiM0MztcdFx0XHRcdFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gaTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcbiYjNDM7XHRcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDttVEhQIGNhc2VzIHNraXBwZWQ6IG5vIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2VcXG5cJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XG4mIzQzO1x0XHRwYWdlbWFwX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCYjMzQ7KTtcbiYjNDM7XHRcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9rcGFnZWZsYWdzKVwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiBcdHNldGJ1ZihzdGRvdXQsIE5VTEwpO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHBhZ2UgY2FjaGUgY2FwcyBmb2xpbyBvcmRlciBhdCBNQVhfUEFHRUNBQ0hFX09SREVSLCB3aGljaFxuJiM0MztcdCAqIHhhc19zcGxpdF9hbGxvYygpIHB1dHMgYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy5cbiYjNDM7XHQgKiBBIFBNRC1zaXplZCBwYWdlIGNhY2hlIGZvbGlvIGlzIHRoZW4gaW1wb3NzaWJsZSwgc28gdGhlIGtlcm5lbFxuJiM0MztcdCAqIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5IGRlc2lnbiBhbmQgdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LlxuJiM0MztcdCAqXG4mIzQzO1x0ICogVGhlIGNhcCBpcyBvbmUgZ2xvYmFsLCBzbyBpdCBydWxlcyBvdXQgZXZlcnkgZmlsZSBtYXBwaW5nLCBub3QganVzdFxuJiM0MztcdCAqIHNobWVtOiBzaG1lbV9odWdlX2dsb2JhbF9lbmFibGVkKCkgZHJvcHMgdGhlIFBNRCBvcmRlciBmcm9tIHdoYXQgaXRcbiYjNDM7XHQgKiBhbGxvd3MsIGFuZCBmaWxlX3RocF9lbmFibGVkKCkgcmVmdXNlcyBhIHJlZ3VsYXIgZmlsZSB3aG9zZSBtYXBwaW5nXG4mIzQzO1x0ICogY2Fubm90IGhvbGQgYSBQTUQgZm9saW8uXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBUaGUgcGVyLW9yZGVyIHNobWVtX2VuYWJsZWQgY29udHJvbCBiZWxvdyBpcyB3aGF0IG1ha2VzIHRoZSBjYXBcbiYjNDM7XHQgKiByZWFkYWJsZTogaXQgaXMgY3JlYXRlZCBmb3IgdGhlIG9yZGVycyBpbiBUSFBfT1JERVJTX0FMTF9GSUxFX0RFRkFVTFQsXG4mIzQzO1x0ICogd2hpY2ggaXMgdGhlIGNhcCBhbmQgbm90aGluZyBlbHNlLCBzbyB3aGV0aGVyIHRoZSBQTUQgb3JkZXIgaGFzIG9uZVxuJiM0MztcdCAqIGFuc3dlcnMgZm9yIGEgcmVndWxhciBmaWxlIGFzIG11Y2ggYXMgZm9yIHNobWVtLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghKHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGhwYWdlX3BtZF9vcmRlcikpKSB7XG4mIzQzO1x0XHRpZiAoc2htZW1fb3BzKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O25vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHNobWVtX29wcyA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAocmVhZF9vbmx5X2ZpbGVfb3BzKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O25vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBmaWxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gTlVMTDtcbiYjNDM7XHRcdFx0cmVhZF93cml0ZV9maWxlX3JlYWRfb3BzID0gTlVMTDtcbiYjNDM7XHRcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoIWFub25fb3BzIFx1MDAyNlx1MDAyNiAhc2htZW1fb3BzIFx1MDAyNlx1MDAyNiAhcmVhZF9vbmx5X2ZpbGVfb3BzKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtOb3RoaW5nIGxlZnQgdG8gY29sbGFwc2UgaW50b1xcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaHBhZ2VfcG1kX25yIC0gMTtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyO1xuQEAgLTEzOTYsNyAmIzQzOzE4MjYsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTtcbi1cdFRFU1QoY29sbGFwc2VfZnVsbCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgbnJfY29sbGFwc2Vfb3JkZXJzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0fVxuJiM0MztcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTE0MDQsMTAgJiM0MzsxODQ0LDggQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7XG4gXG4gXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbi1cdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbi1cdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXG4gXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG5AQCAtMTQ2Myw2ICYjNDM7MTkwMSw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbiYjNDM7XHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTQ3OCw3ICYjNDM7MTkxOSwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgbnJfdGVzdF9jYXNlczsgaSYjNDM7JiM0MzspIHtcbiBcdFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFx1MDAyNnRlc3RfY2FzZXNbaV07XG4gXG4tXHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1xcbiMgUnVuIHRlc3Q6ICVzICglczolcylcXG5cJiMzNDssIHQtXHUwMDNlZGVzYywgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4mIzQzO1x0XHRpZiAodC1cdTAwM2VjdHggPT0gXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuJiM0MztcdFx0XHRjb2xsYXBzZV9vcmRlciA9IHQtXHUwMDNlb3JkZXI7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1xcbiMgUnVuIHRlc3Q6ICVzICglczolcywgb3JkZXIgJWQpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgICB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHQtXHUwMDNlb3JkZXIpO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7XFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwmIzM0OywgdC1cdTAwM2VkZXNjLFxuJiM0MztcdFx0XHRcdCAgICAgICB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lKTtcbiYjNDM7XHRcdH1cbiBcdFx0dC1cdTAwM2Vmbih0LVx1MDAzZWN0eCwgdC1cdTAwM2VvcHMpO1xuIFx0fVxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zNjAxYzAzMGQ0M2U1XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xuQEAgLTAsMCAmIzQzOzEsNjEwIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIGtodWdlcGFnZWQgcmFjZSBoYXJuZXNzLlxuJiM0MzsgKlxuJiM0MzsgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGluc1xuJiM0MzsgKiAoZ3VwX3Rlc3QpLCBmb3JrLCBtcmVtYXAgYW5kIE1BRFZfRE9OVE5FRUQgb3ZlciB0aGUgc2FtZSByYW5nZXMsIGluXG4mIzQzOyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6XG4mIzQzOyAqXG4mIzQzOyAqICAgc3RlcHBlZFx0a2h1Z2VwYWdlZCwgb25lIGZ1bGwgcGFzcyBhdCBhIHRpbWUgdGhyb3VnaFxuJiM0MzsgKlx0XHRraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLCBzbyBhIHN0ZXAgY292ZXJzIGEga25vd24gZXh0ZW50O1xuJiM0MzsgKiAgIGZyZWVcdGtodWdlcGFnZWQgbGVmdCB0byBydW4gKHNjYW5fc2xlZXBfbWlsbGlzZWNzPTApLCBmb3Igc29haztcbiYjNDM7ICogICBtYWR2aXNlXHRNQURWX0NPTExBUFNFIGluIGEgbG9vcC5cbiYjNDM7ICpcbiYjNDM7ICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuICBPY2N1cGFuY3kgcnVucyBhdCBib3RoIGVuZHNcbiYjNDM7ICogb2Ygd2hhdCBtVEhQIGNvbGxhcHNlIHN1cHBvcnRzOiBtYXhfcHRlc19ub25lIDAsIHdoZXJlIGEgd2luZG93IG11c3QgYmVcbiYjNDM7ICogZnVsbHkgcG9wdWxhdGVkLCBhbmQgSFBBR0VfUE1EX05SIC0gMSwgd2hlcmUgYSB3aW5kb3cgZnVsbCBvZiBob2xlc1xuJiM0MzsgKiBjb2xsYXBzZXMgdG9vLiAgVGhlIGhvbGVzIGFyZSBub3QgY29waWVkIGZyb20gYW55d2hlcmUgLS0gdGhleSBhcmVcbiYjNDM7ICogemVyby1maWxsZWQsIGFuZCByZS1jaGVja2VkIHVuZGVyIHRoZSBwYWdlIHRhYmxlIGxvY2sgYXQgaW5zdGFsbCB0aW1lIGluXG4mIzQzOyAqIGNhc2UgYSByYWNpbmcgZmF1bHQgZ290IHRoZXJlIGZpcnN0LlxuJiM0MzsgKlxuJiM0MzsgKiAtcCBhZGRzIG1lbW9yeSBwcmVzc3VyZSB0byBhbnkgb2YgdGhlIGFib3ZlOiBNQURWX1BBR0VPVVQgY3ljbGluZ1xuJiM0MzsgKiBvbiBhIGRlZGljYXRlZCBuZWlnaGJvciByZWdpb24gKHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuOyBza2lwcGVkXG4mIzQzOyAqIHdpdGggYSBub3RlIHdoZW4gdGhlIGhvc3QgaGFzIG5vIHN3YXApIGFuZCBhIGNvbXBhY3RfbWVtb3J5IHRyaWdnZXJcbiYjNDM7ICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UmIzM5O3MgZnJlZXplXG4mIzQzOyAqIHdpdGggcmVmY291bnQgZWxldmF0aW9uIGFuZCBtaWdyYXRpb24gZW50cmllcyBvZiBpdHMgb3duKS5cbiYjNDM7ICpcbiYjNDM7ICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yXG4mIzQzOyAqIHplcm8gKE1BRFZfRE9OVE5FRUQpLCBuZXZlciBhbnl0aGluZyBlbHNlLiAgVGhlIGZhdWx0ZXJzIGFuZCB0aGUgZm9ya1xuJiM0MzsgKiBjaGlsZHJlbiBjaGVjayB0aGF0IGNvbnRpbnVvdXNseSwgYSBmaW5hbCBzd2VlcCBjaGVja3MgaXQgb25jZSBtb3JlLCBwbHVzXG4mIzQzOyAqIHdoYXRldmVyIERFQlVHX1ZNIC8gcGFnZV90YWJsZV9jaGVjayAvIEtBU0FOIC8gbG9ja2RlcCByZXBvcnQgaW5cbiYjNDM7ICogZG1lc2csIHdoaWNoIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaW5zcGVjdC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc2VsZnRlc3QuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bV91dGlsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDsuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJBU0VfQUREUlx0KCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2hhcmVkIHBsYXlncm91bmQgZm9yIGZhdWx0cy9waW5zL2ZvcmsvZG9udG5lZWQ6IHNldmVyYWwgUE1ELXNpemVkXG4mIzQzOyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZVxuJiM0MzsgKiBtcmVtYXAgdGhyZWFkLiBNb3JlIGFyZWFzIG1lYW5zIG1vcmUgaW5kZXBlbmRlbnQgcmVnaW9ucyBjb2xsYXBzaW5nXG4mIzQzOyAqIGF0IG9uY2U7IHRoZSBkZWZhdWx0IHN1aXRzIGEgbm9ybWFsIG1hY2hpbmUuIE9uIGEgbWVtb3J5LWNvbnN0cmFpbmVkXG4mIzQzOyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZVxuJiM0MzsgKiBkZWZhdWx0IHBsYXlncm91bmQgbXVsdGktZ2lnYWJ5dGUgLS0gcGFzcyAtYSB0byBzaHJpbmsgaXQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4mIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzO1xuJiM0MztzdGF0aWMgaW50IG5yX2FyZWFzO1xuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiYjNDM7c3RhdGljIGNoYXIgKnJlZ2lvbjtcdFx0LyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqL1xuJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX2FyZWE7XHQvKiByZWdpb24gJiM0MzsgTlJfU0hBUkVEX0FSRUFTIGFyZWFzICovXG4mIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xuJiM0MztzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1x0LyogLXA6IGRlZGljYXRlZCBwcmVzc3VyZSByZWdpb24gKi9cbiYjNDM7c3RhdGljIHNpemVfdCBwYWdlb3V0X3NpemU7XG4mIzQzO3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBjb3JydXB0ZWQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4mIzQzO1xuJiM0MztcdHJldHVybiB2YWwgPyB2YWwgOiAxO1x0LyogbmV2ZXIgY29sbGlkZXMgd2l0aCB0aGUgemVyby1maWxsICovXG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFplcm8gbWVhbnMgbmV2ZXIgd3JpdHRlbjsgYW55dGhpbmcgZWxzZSBtdXN0IGJlIHRoaXMgcGFnZSYjMzk7cyBwYXR0ZXJuICovXG4mIzQzO3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbClcbiYjNDM7e1xuJiM0MztcdCp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gKnZhbCBcdTAwMjZcdTAwMjYgKnZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHZhbDtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VfaXNfY29ycnVwdChwYWdlX2lkeCwgXHUwMDI2dmFsKSkge1xuJiM0MztcdFx0Y29ycnVwdGVkID0gMTtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUGFnZXMgbGVmdCBmcm9tIEBwYWdlX2lkeCwgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJiMzOTtzIGFyZWEgKi9cbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcm9vbV9mcm9tKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGxvbmcgd2FudClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XG4mIzQzO1xuJiM0MztcdHJldHVybiB3YW50IFx1MDAzYyBsZWZ0ID8gd2FudCA6IGxlZnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHJhbmRfcihcdTAwMjZzZWVkKSBcdTAwMjYgMSlcbiYjNDM7XHRcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKSA9XG4mIzQzO1x0XHRcdFx0cGF0dGVybihwYWdlX2lkeCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGNoZWNrX3BhZ2UocGFnZV9pZHgpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIG5yID0gMVVMIFx1MDAzY1x1MDAzYyAocmFuZF9yKFx1MDAyNnNlZWQpICUgNik7XHQvKiAxLi4zMiBwYWdlcyAqL1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBPbmNlIGluIGEgd2hpbGUgemFwIGEgd2hvbGUgUE1ELWFsaWduZWQgYXJlYTogb25seSBhIHphcFxuJiM0MztcdFx0ICogc3Bhbm5pbmcgdGhlIGZ1bGwgdGFibGUgdHJpZ2dlcnMgdGhlIGVtcHR5LXRhYmxlIHJlY2xhaW1cbiYjNDM7XHRcdCAqIChDT05GSUdfUFRfUkVDTEFJTSksIHdoaWNoIGNhbiBmcmVlIHRoZSB0YWJsZSB1bmRlciBhXG4mIzQzO1x0XHQgKiBjb2xsYXBzZSB0aGF0IGlzIG1pZHdheSB0aHJvdWdoIGl0LiAgU3ViLXRhYmxlIHphcHMgbmV2ZXJcbiYjNDM7XHRcdCAqIHJlYWNoIHRoYXQgcGF0aC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKCEocmFuZF9yKFx1MDAyNnNlZWQpICUgNjQpKSB7XG4mIzQzO1x0XHRcdHVuc2lnbmVkIGxvbmcgYXJlYSA9IHBhZ2VfaWR4IC9cbiYjNDM7XHRcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdFx0XHRtYWR2aXNlKHJlZ2lvbiAmIzQzOyBhcmVhICogaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0bWFkdmlzZShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUsXG4mIzQzO1x0XHRcdFx0cm9vbV9mcm9tKHBhZ2VfaWR4LCBucikgKiBwYWdlX3NpemUsXG4mIzQzO1x0XHRcdFx0TUFEVl9ET05UTkVFRCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgNTAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0c3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9O1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbiYjNDM7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIG5yID0gcm9vbV9mcm9tKHBhZ2VfaWR4LCAxNik7XG4mIzQzO1xuJiM0MztcdFx0Z3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcbiYjNDM7XHRcdGd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7XG4mIzQzO1x0XHRndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjtcbiYjNDM7XHRcdGd1cC5ndXBfZmxhZ3MgPSAxO1x0LyogRk9MTF9XUklURSAqL1xuJiM0MztcdFx0LyogUmFjaW5nIE1BRFZfRE9OVE5FRUQgbWFrZXMgdHJhbnNpZW50IGZhaWx1cmVzIGV4cGVjdGVkLiAqL1xuJiM0MztcdFx0aW9jdGwoZ3VwX2ZkLCBQSU5fRkFTVF9CRU5DSE1BUkssIFx1MDAyNmd1cCk7XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpmb3JrZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChwaWQgPT0gMCkge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgdmFsO1xuJiM0MztcdFx0XHRpbnQgYmFkID0gMDtcbiYjNDM7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIE5vIHN0ZGlvIGluIHRoZSBjaGlsZDogYSB0aHJlYWQgbWF5IGhhdmUgaGVsZFxuJiM0MztcdFx0XHQgKiBzdGRvdXQmIzM5O3MgbG9jayB3aGVuIHdlIGZvcmtlZCwgYW5kIHByaW50aW5nIHVuZGVyIGFuXG4mIzQzO1x0XHRcdCAqIGluaGVyaXRlZCBsb2NrIGhhbmdzLiAgVGhlIHBhcmVudCByZXBvcnRzIHdoYXQgdGhlXG4mIzQzO1x0XHRcdCAqIGV4aXQgc3RhdHVzIHNheXMuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgMTY7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRcdGJhZCB8PSBwYWdlX2lzX2NvcnJ1cHQocmFuZF9wYWdlKFx1MDAyNnNlZWQpLCBcdTAwMjZ2YWwpO1xuJiM0MztcdFx0XHRfZXhpdChiYWQpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHBpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRpbnQgd3N0YXR1cztcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh3YWl0cGlkKHBpZCwgXHUwMDI2d3N0YXR1cywgMCkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O3dhaXRwaWQoKVwmIzM0Oyk7XG4mIzQzO1x0XHRcdC8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28sIG5vdCBqdXN0IGl0cyBleGl0IGNvZGUuICovXG4mIzQzO1x0XHRcdGlmICghV0lGRVhJVEVEKHdzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHdzdGF0dXMpKVxuJiM0MztcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdFx0cCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpO1xuJiM0MztcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21yZW1hcCgpIGF3YXlcJiMzNDspO1xuJiM0MztcdFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIDg7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRtcmVtYXBfc2NyYXRjaFsocmFuZF9yKFx1MDAyNnNlZWQpICVcbiYjNDM7XHRcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxO1xuJiM0MztcdFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpO1xuJiM0MztcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21yZW1hcCgpIGJhY2tcJiMzNDspO1xuJiM0MztcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMDApO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogLXA6IHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XG4mIzQzOyAqIGNoZWNrIGlzIGV4YWN0OiBhIHBhZ2Ugb3V0IGFuZCBiYWNrIHRocm91Z2ggc3dhcCBtdXN0IHByZXNlcnZlIHRoZVxuJiM0MzsgKiBwYXR0ZXJuLCBhbmQgbm90aGluZyBlbHNlIGV2ZXIgd3JpdGVzIGhlcmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yID0gcGFnZW91dF9zaXplIC8gcGFnZV9zaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0Kih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRtYWR2aXNlKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplLCBNQURWX1BBR0VPVVQpO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7XG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICBpICogcGFnZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh2YWwgIT0gcGF0dGVybihpKSkge1xuJiM0MztcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7UGFnZW91dCBjb3JydXB0aW9uIGF0IHBhZ2UgJWx1OiAlI3ggIT0gJSN4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIC1wOiBjb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIG91dCBmcm9tIHVuZGVyIHVzLiAqL1xuJiM0MztzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcdGludCBmZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5XCYjMzQ7LCBPX1dST05MWSk7XG4mIzQzO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Tm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdGlmICh3cml0ZShmZCwgXCYjMzQ7MVwmIzM0OywgMSkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0dXNsZWVwKDEwMDAwICYjNDM7IHJhbmRfcihcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgbGluZVsyNTZdO1xuJiM0MztcdGludCBsaW5lcyA9IDA7XG4mIzQzO1x0RklMRSAqZnAgPSBmb3BlbihcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxuJiM0MztcdFx0bGluZXMmIzQzOyYjNDM7O1xuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGxpbmVzIFx1MDAzZSAxO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aW1ldmFsIHR2O1xuJiM0MztcbiYjNDM7XHRnZXR0aW1lb2ZkYXkoXHUwMDI2dHYsIE5VTEwpO1xuJiM0MztcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgJiM0MzsgdHYudHZfdXNlYyAvIDEwMDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcbiYjNDM7XHRcdFwmIzM0O1VzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy16XSBbLXBdIFstYSBhcmVhc11cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdFdpdGhvdXQgLW0sIGV2ZXJ5IG1vZGUgcnVucyBpbiB0dXJuLlxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdEJvdGggb2NjdXBhbmN5IGxpbWl0cyBydW4gdW5sZXNzIC16IGFza3MgZm9yIGhvbGVzIG9ubHkuXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHQtejogb25seSBtYXhfcHRlc19ub25lID0gSFBBR0VfUE1EX05SIC0gMSAoaG9sZS1oZWF2eSlcXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdFJ1bnMgd2l0aCBhbmQgd2l0aG91dCBtZW1vcnkgcHJlc3N1cmUgdW5sZXNzIC1wIGFza3MgZm9yXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHRwcmVzc3VyZSBvbmx5LlxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0LXA6IG9ubHkgd2l0aCB0aGUgcGFnZW91dCBhbmQgY29tcGFjdGlvbiB0aHJlYWRzXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHQtYTogbnVtYmVyIG9mIHNoYXJlZCBQTUQtc2l6ZWQgcGxheWdyb3VuZCBhcmVhcyAoZGVmYXVsdCAzKVxcblwmIzM0Oyk7XG4mIzQzO1x0ZXhpdCgxKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuJiM0Mzt7XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aHJlYWRfbmFtZXNbXSA9IHtcbiYjNDM7XHRcdFwmIzM0O2ZhdWx0ZXJcJiMzNDssIFwmIzM0O2ZhdWx0ZXIyXCYjMzQ7LCBcJiMzNDtkb250bmVlZFwmIzM0OywgXCYjMzQ7cGlubmVyXCYjMzQ7LCBcJiMzNDtmb3JrZXJcJiMzNDssXG4mIzQzO1x0XHRcJiMzNDttcmVtYXBwZXJcJiMzNDssIFwmIzM0O3BhZ2VvdXRcJiMzNDssIFwmIzM0O2NvbXBhY3RvclwmIzM0OyxcbiYjNDM7XHR9O1xuJiM0MztcdHZvaWQgKigqY29uc3QgdGhyZWFkX2Zuc1tdKSh2b2lkICopID0ge1xuJiM0MztcdFx0ZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLFxuJiM0MztcdFx0bXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sXG4mIzQzO1x0fTtcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VvdXRfYml0ID0gMVVMIFx1MDAzY1x1MDAzYyA2LCBjb21wYWN0b3JfYml0ID0gMVVMIFx1MDAzY1x1MDAzYyA3O1xuJiM0MztcdGNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpO1xuJiM0MztcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgXCYjMzQ7c3RlcHBlZFwmIzM0OywgXCYjMzQ7ZnJlZVwmIzM0OywgXCYjMzQ7bWFkdmlzZVwmIzM0OyB9O1xuJiM0MztcdHN0YXRpYyBjb25zdCBpbnQgYWxsX25vbmVzW10gPSB7IDAsIDEgfTtcdC8qIHN0cmljdCwgaG9sZXMgKi9cbiYjNDM7XHRzdGF0aWMgY29uc3QgaW50IGFsbF9wcmVzc1tdID0geyAwLCAxIH07XHQvKiBxdWlldCwgdW5kZXIgcHJlc3N1cmUgKi9cbiYjNDM7XHRjb25zdCBpbnQgKm5vbmVzID0gYWxsX25vbmVzO1xuJiM0MztcdGNvbnN0IGludCAqcHJlc3MgPSBhbGxfcHJlc3M7XG4mIzQzO1x0aW50IG5yX25vbmVzID0gQVJSQVlfU0laRShhbGxfbm9uZXMpO1xuJiM0MztcdGludCBucl9wcmVzcyA9IEFSUkFZX1NJWkUoYWxsX3ByZXNzKTtcbiYjNDM7XHRjb25zdCBjaGFyICpvbmVfbW9kZVsxXTtcbiYjNDM7XHRjb25zdCBjaGFyICogY29uc3QgKm1vZGVzID0gYWxsX21vZGVzO1xuJiM0MztcdGludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTtcbiYjNDM7XHRjb25zdCBjaGFyICptb2RlX2FyZyA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGVuZF9tcztcbiYjNDM7XHRpbnQgZHVyYXRpb25fcyA9IDU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB0aHJlYWRfbWFzayA9IH4wVUw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBiYXNlX21hc2s7XG4mIzQzO1x0aW50IG5yX2FyZWFzX2FyZyA9IDA7XG4mIzQzO1x0Ym9vbCBob2xlc19vbmx5ID0gZmFsc2U7XG4mIzQzO1x0Ym9vbCBwcmVzc3VyZV9vbmx5ID0gZmFsc2U7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcdGludCBzdGVwcyA9IDA7XG4mIzQzO1x0aW50IG9wdDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCYjMzQ7YTpkOm06dDp6cGhcJiMzNDspKSAhPSAtMSkge1xuJiM0MztcdFx0c3dpdGNoIChvcHQpIHtcbiYjNDM7XHRcdGNhc2UgJiMzOTthJiMzOTs6XG4mIzQzO1x0XHRcdG5yX2FyZWFzX2FyZyA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7ZCYjMzk7OlxuJiM0MztcdFx0XHRkdXJhdGlvbl9zID0gYXRvaShvcHRhcmcpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTttJiMzOTs6XG4mIzQzO1x0XHRcdG1vZGVfYXJnID0gb3B0YXJnO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTt0JiMzOTs6XG4mIzQzO1x0XHRcdC8qIGRlYnVnOiBiaXRtYXNrIG9mIHJhY2luZyB0aHJlYWRzIHRvIHN0YXJ0ICovXG4mIzQzO1x0XHRcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTt6JiMzOTs6XG4mIzQzO1x0XHRcdGhvbGVzX29ubHkgPSB0cnVlO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtwJiMzOTs6XG4mIzQzO1x0XHRcdHByZXNzdXJlX29ubHkgPSB0cnVlO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHVzYWdlKCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGlmIChob2xlc19vbmx5KSB7XG4mIzQzO1x0XHRub25lcyA9IGFsbF9ub25lcyAmIzQzOyAxO1xuJiM0MztcdFx0bnJfbm9uZXMgPSAxO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHByZXNzdXJlX29ubHkpIHtcbiYjNDM7XHRcdHByZXNzID0gYWxsX3ByZXNzICYjNDM7IDE7XG4mIzQzO1x0XHRucl9wcmVzcyA9IDE7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobW9kZV9hcmcpIHtcbiYjNDM7XHRcdGlmIChzdHJjbXAobW9kZV9hcmcsIFwmIzM0O3N0ZXBwZWRcJiMzNDspIFx1MDAyNlx1MDAyNiBzdHJjbXAobW9kZV9hcmcsIFwmIzM0O2ZyZWVcJiMzNDspIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIHN0cmNtcChtb2RlX2FyZywgXCYjMzQ7bWFkdmlzZVwmIzM0OykpXG4mIzQzO1x0XHRcdHVzYWdlKCk7XG4mIzQzO1x0XHRvbmVfbW9kZVswXSA9IG1vZGVfYXJnO1xuJiM0MztcdFx0bW9kZXMgPSBvbmVfbW9kZTtcbiYjNDM7XHRcdG5yX21vZGVzID0gMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XG4mIzQzO1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuJiM0MztcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0Z3VwX2ZkID0gb3BlbihcJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwmIzM0OywgT19SRFdSKTtcbiYjNDM7XHRpZiAoZ3VwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XG4mIzQzO1x0bnJfYXJlYXMgPSBucl9zaGFyZWRfYXJlYXMgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZFxuJiM0MztcdCAqIE1SRU1BUF9GSVhFRCB1bm1hcHMgd2hhdGV2ZXIgaXMgaW4gdGhlIHdheSB3aXRob3V0IHNheWluZyBzby4gIENsYWltXG4mIzQzO1x0ICogdGhlIGFkZHJlc3MgaGVyZSwgc28gYSBsYXlvdXQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGlzIGFzc3VtcHRpb25cbiYjNDM7XHQgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZVxuJiM0MztcdCAqIHByb2Nlc3MgbWFwcyB0aGlzIGxvdzogdGhyZWFkIHN0YWNrcyBhbmQgbWFsbG9jIGFyZW5hcyBjb21lIGZyb20gdGhlXG4mIzQzO1x0ICogdG9wLWRvd24gbW1hcCBhcmVhLCB3ZWxsIGFib3ZlLlxuJiM0MztcdCAqL1xuJiM0MztcdG1yZW1hcF9zY3JhdGNoID0gKGNoYXIgKilCQVNFX0FERFIgJiM0MzsgMiAqIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XG4mIzQzO1x0aWYgKG1tYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBQUk9UX05PTkUsXG4mIzQzO1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSxcbiYjNDM7XHRcdCAtMSwgMCkgIT0gKHZvaWQgKiltcmVtYXBfc2NyYXRjaClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgbXJlbWFwIHNjcmF0Y2hcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRiYXNlX21hc2sgPSB0aHJlYWRfbWFzaztcbiYjNDM7XHRpZiAoIXN3YXBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZS4gKi9cbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O25vIHN3YXA6IHRoZSBwYWdlb3V0IHRocmVhZCBzdGF5cyBpZGxlXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9zZXRfcGxhbihucl9tb2RlcyAqIG5yX25vbmVzICogbnJfcHJlc3MpO1xuJiM0MztcbiYjNDM7XHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuJiM0MztcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBBIGJhc2UgZW50cnkgZm9yIHRoZSBzdGFjaywgc28gdGhhdCB0aGUgcG9wIGF0IHRoZSBlbmQgb2YgYSBtb2RlXG4mIzQzO1x0ICogYWx3YXlzIGhhcyBzb21ldGhpbmcgdG8gd3JpdGUgYmFjazogdGhwX3BvcF9zZXR0aW5ncygpIG9uIGFuIGVtcHR5XG4mIzQzO1x0ICogc3RhY2sgaGFzIG5vIHNldHRpbmdzIHRvIGFwcGx5IGFuZCBnaXZlcyB1cC5cbiYjNDM7XHQgKi9cbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IHJ1biA9IDA7IHJ1biBcdTAwM2MgbnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzOyBydW4mIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpbnQgcmVtID0gcnVuICUgKG5yX25vbmVzICogbnJfcHJlc3MpO1xuJiM0MztcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9ub25lcyAqIG5yX3ByZXNzKV07XG4mIzQzO1x0XHRib29sIGhvbGVzID0gbm9uZXNbcmVtIC8gbnJfcHJlc3NdO1xuJiM0MztcdFx0Ym9vbCBwcmVzc3VyZSA9IHByZXNzW3JlbSAlIG5yX3ByZXNzXTtcbiYjNDM7XG4mIzQzO1x0XHR0aHJlYWRfbWFzayA9IGJhc2VfbWFzaztcbiYjNDM7XHRcdGlmICghcHJlc3N1cmUpXG4mIzQzO1x0XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpO1xuJiM0MztcdFx0ZWxzZSBpZiAoIXN3YXBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfnBhZ2VvdXRfYml0O1xuJiM0MztcbiYjNDM7XHRcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XHRcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4mIzQzO1x0XHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4mIzQzO1x0XHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XG4mIzQzO1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4mIzQzO1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID1cbiYjNDM7XHRcdFx0c3RyY21wKG1vZGUsIFwmIzM0O2ZyZWVcJiMzNDspID8gMTAwMCA6IDA7XG4mIzQzO1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBtVEhQIGNvbGxhcHNlIG9ubHkgc3VwcG9ydHMgdGhlIHR3byBlbmRzIG9mIHRoZSBvY2N1cGFuY3lcbiYjNDM7XHRcdCAqIHNjYWxlOiAwIG9yIEhQQUdFX1BNRF9OUiAtIDEgKGFueXRoaW5nIGVsc2UgY29lcmNlcyB0byAwKS5cbiYjNDM7XHRcdCAqIFN0cmljdCBuZWVkcyBhIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3csIHdoaWNoIGlzIHJhcmUgdW5kZXJcbiYjNDM7XHRcdCAqIHJhY2luZyBNQURWX0RPTlRORUVEOyBob2xlLWhlYXZ5IHdpbmRvd3MgY29sbGFwc2UgaW5zdGVhZCxcbiYjNDM7XHRcdCAqIHNvIHRoZSB0d28gZW5kcyByYWNlIGRpZmZlcmVudCBwYXRocy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaG9sZXMgP1xuJiM0MztcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpIC0gMSA6IDA7XG4mIzQzO1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPVxuJiM0MztcdFx0XHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpXG4mIzQzO1x0XHRcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdC8qIFBvcHBlZCBhdCB0aGUgZW5kIG9mIHRoaXMgbW9kZSwgYmVmb3JlIHRoZSBuZXh0IG9uZS4gKi9cbiYjNDM7XHRcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0XHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8XG4mIzQzO1x0XHRcdCAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xuJiM0MztcdFx0aWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgcGxheWdyb3VuZFwmIzM0Oyk7XG4mIzQzO1x0XHRtcmVtYXBfYXJlYSA9IHJlZ2lvbiAmIzQzOyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAodGhyZWFkX21hc2sgXHUwMDI2IHBhZ2VvdXRfYml0KSB7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIEJpZyBlbm91Z2ggdG8gY3ljbGUgcmVhbCByZWNsYWltLCBzbWFsbCBlbm91Z2ggbm90XG4mIzQzO1x0XHRcdCAqIHRvIGRvbWluYXRlIGEgVENHIGd1ZXN0OiA0IFBNRCBhcmVhcywgY2xhbXBlZCB0b1xuJiM0MztcdFx0XHQgKiBbMTZNLCA2NE1dLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0cGFnZW91dF9zaXplID0gNCAqIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcdFx0XHRwYWdlb3V0X3NpemUgPSBwYWdlb3V0X3NpemUgXHUwMDNjICgxNlVMIFx1MDAzY1x1MDAzYyAyMCkgP1xuJiM0MztcdFx0XHRcdCAgICAgICAoMTZVTCBcdTAwM2NcdTAwM2MgMjApIDpcbiYjNDM7XHRcdFx0XHQgICAgICAgcGFnZW91dF9zaXplIFx1MDAzZSAoNjRVTCBcdTAwM2NcdTAwM2MgMjApID9cbiYjNDM7XHRcdFx0XHQgICAgICAgKDY0VUwgXHUwMDNjXHUwMDNjIDIwKSA6IHBhZ2VvdXRfc2l6ZTtcbiYjNDM7XHRcdFx0cGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsXG4mIzQzO1x0XHRcdFx0XHQgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdFx0XHRcdCAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbiYjNDM7XHRcdFx0aWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgcGFnZW91dCBhcmVhXCYjMzQ7KTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHQvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqL1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xuJiM0MztcdFx0bWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0XHRtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKCEodGhyZWFkX21hc2sgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKSkge1xuJiM0MztcdFx0XHRcdHRocmVhZHNbaV0gPSAwO1xuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGlmIChwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLCB0aHJlYWRfZm5zW2ldLFxuJiM0MztcdFx0XHRcdFx0ICAgKHZvaWQgKikoaSAmIzQzOyAxKSkpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O3B0aHJlYWRfY3JlYXRlKClcJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGVuZF9tcyA9IG5vd19tcygpICYjNDM7IGR1cmF0aW9uX3MgKiAxMDAwVUw7XG4mIzQzO1x0XHRpZiAoIXN0cmNtcChtb2RlLCBcJiMzNDtzdGVwcGVkXCYjMzQ7KSkge1xuJiM0MztcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHRcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoNjAwKSlcbiYjNDM7XHRcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0XHRzdGVwcyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCBcJiMzNDtmcmVlXCYjMzQ7KSkge1xuJiM0MztcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZClcbiYjNDM7XHRcdFx0XHR1c2xlZXAoMTAwICogMTAwMCk7XG4mIzQzO1x0XHR9IGVsc2Uge1x0LyogbWFkdmlzZSAqL1xuJiM0MztcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3NoYXJlZF9hcmVhczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0XHRcdG1hZHZpc2UocmVnaW9uICYjNDM7IGkgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfQ09MTEFQU0UpO1xuJiM0MztcdFx0XHRcdH1cbiYjNDM7XHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbiYjNDM7XHRcdFx0XHRzdGVwcyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRzdG9wID0gMTtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmICh0aHJlYWRzW2ldKVxuJiM0MztcdFx0XHRcdHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHQvKiBGaW5hbCBpbnRlZ3JpdHkgc3dlZXAuICovXG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdGNoZWNrX3BhZ2UoaSk7XG4mIzQzO1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdCghY29ycnVwdGVkLFxuJiM0MztcdFx0XHRcdCBcJiMzNDslcy8lcyVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCBtb2RlLCBob2xlcyA/IFwmIzM0O2hvbGVzXCYjMzQ7IDogXCYjMzQ7c3RyaWN0XCYjMzQ7LFxuJiM0MztcdFx0XHRcdCBwcmVzc3VyZSA/IFwmIzM0Oy9wcmVzc3VyZVwmIzM0OyA6IFwmIzM0O1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgZHVyYXRpb25fcywgc3RlcHMpO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBIYW5kIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB0aGUgc2V0dGluZ3MgYmFjayBiZWZvcmUgdGhlXG4mIzQzO1x0XHQgKiBuZXh0IG1vZGU6IGl0IG1hcHMgdGhlIHJlZ2lvbiBhdCB0aGUgc2FtZSBmaXhlZCBhZGRyZXNzLFxuJiM0MztcdFx0ICogYW5kIGl0cyBzY2FuIGNhZGVuY2UgZGlmZmVycy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0bXVubWFwKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0XHRpZiAocGFnZW91dF9hcmVhKSB7XG4mIzQzO1x0XHRcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XG4mIzQzO1x0XHRcdHBhZ2VvdXRfYXJlYSA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0XHRzdG9wID0gMDtcbiYjNDM7XHRcdHN0ZXBzID0gMDtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoY29ycnVwdGVkKSB7XG4mIzQzO1x0XHRcdC8qIE1lbW9yeSBpcyBzdXNwZWN0OyB0aGUgcmVzdCB3b3VsZCBwcm92ZSBub3RoaW5nLiAqL1xuJiM0MztcdFx0XHR3aGlsZSAoJiM0MzsmIzQzO3J1biBcdTAwM2MgbnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzKSB7XG4mIzQzO1x0XHRcdFx0cmVtID0gcnVuICUgKG5yX25vbmVzICogbnJfcHJlc3MpO1xuJiM0MztcbiYjNDM7XHRcdFx0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCYjMzQ7JXMvJXMlczogc2tpcHBlZCBhZnRlciBjb3JydXB0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICBtb2Rlc1tydW4gLyAobnJfbm9uZXMgKiBucl9wcmVzcyldLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICBub25lc1tyZW0gLyBucl9wcmVzc10gP1xuJiM0MztcdFx0XHRcdFx0XHQgICAgICBcJiMzNDtob2xlc1wmIzM0OyA6IFwmIzM0O3N0cmljdFwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgcHJlc3NbcmVtICUgbnJfcHJlc3NdID9cbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgXCYjMzQ7L3ByZXNzdXJlXCYjMzQ7IDogXCYjMzQ7XCYjMzQ7KTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjMwZDNmYjUxOWZiMmNcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXG5AQCAtMCwwICYjNDM7MSwyMTcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogU3luY2hyb25vdXMga2h1Z2VwYWdlZCBkcml2aW5nIGNoZWNrLlxuJiM0MzsgKlxuJiM0MzsgKiBSYWNlIHRlc3RzIGRyaXZlIGtodWdlcGFnZWQgdGhyb3VnaCB0aGUgZXhpc3Rpbmcgc3lzZnMgY29udHJvbHM6IGFcbiYjNDM7ICogc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYW5kIGZ1bGxfc2NhbnNcbiYjNDM7ICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0XG4mIzQzOyAqIHN0YXJ0ZWQgYWZ0ZXIgc2V0dXAgKGtodWdlcGFnZWRfZnVsbF9wYXNzKCkpLiBWZXJpZnkgdGhlIHBhaXIgZ2l2ZXNcbiYjNDM7ICogZGV0ZXJtaW5pc3RpYywgYXR0cmlidXRhYmxlIHJlc3VsdHM6IG9uZSBiYXJyaWVyIHN0ZXAgb3ZlciBvbmVcbiYjNDM7ICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdFxuJiM0MzsgKiB3aW5kb3cmIzM5O3Mgc291cmNlIHBhZ2VzIChtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSBldmVudHMgZmlsdGVyZWRcbiYjNDM7ICogYnkgc291cmNlIFBGTiBhbmQgb3JkZXIpIGFuZCB0aGUgd2luZG93IGlzIGNvbGxhcHNlZFxuJiM0MzsgKiBhZnRlcndhcmRzLCByZXBlYXRhYmx5LlxuJiM0MzsgKlxuJiM0MzsgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBzZXQgdG8gNjBzIHRvIHByb3ZlIHRoZSB3YWtlIHBhdGg6IHdpdGhvdXRcbiYjNDM7ICogdGhlIHdha2UsIG9uZSBiYXJyaWVyIHN0ZXAgd291bGQgc2xlZXAgbXVsdGlwbGVzIG9mIHRoYXQgYW5kIGJsb3dcbiYjNDM7ICogdGhlIHRpbWVvdXQuIEl0IGFsc28ga2VlcHMgdGhlIGRhZW1vbiBmcm9tIGZyZWUtcnVubmluZyBiZXR3ZWVuXG4mIzQzOyAqIHN0ZXBzLCBwZXIgdGhlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZGlzY2lwbGluZS5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzZWxmdGVzdC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtX3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFx1MDAzY1x1MDAzYyAzMCkpXG4mIzQzOyNkZWZpbmUgVEFSR0VUX09SREVSIDJcdC8qIHNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXG4mIzQzOyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4mIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcbiYjNDM7c3RhdGljIGludCB0cmFjZV9ldmVudHNfZmQgPSAtMTtcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBFYWNoIHN0ZXAgc3dpdGNoZXMgdGhlIGV2ZW50cyBvZmYgYWdhaW4sIGJ1dCBhIGhlbHBlciBjYW4gc3RpbGwgZ2l2ZSB1cFxuJiM0MzsgKiBvbiB1cyBpbiBiZXR3ZWVuIChhIGZhaWxpbmcgc3lzZnMgd3JpdGUgZW5kcyB0aGUgdGVzdCBmcm9tIGluc2lkZVxuJiM0MzsgKiB0aHBfd3JpdGVfbnVtKCkpLCBhbmQgaHVnZV9tZW1vcnkgZXZlbnRzIGxlZnQgb24gYXJlIHRoZSB3aG9sZSBtYWNoaW5lJiMzOTtzXG4mIzQzOyAqIHByb2JsZW0sIG5vdCB0aGlzIHRlc3QmIzM5O3MuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCB0cmFjZV9ldmVudHNfb2ZmKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQ291bnQgY29sbGFwc2UgYXR0ZW1wdHMgYXR0cmlidXRhYmxlIHRvIG91ciB3aW5kb3c6IGxlZ2FjeS1lbmdpbmVcbiYjNDM7ICogaXNvbGF0ZSBldmVudHMgd2hvc2Ugc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cmIzM5O3Mgc291cmNlIFBGTnMsXG4mIzQzOyAqIHBsdXMgYmF0Y2gtZW5naW5lIHBlci1jYW5kaWRhdGUgaW5zdGFsbCBldmVudHMgYXQgdGhlIHdpbmRvdyYjMzk7c1xuJiM0MzsgKiBhZGRyZXNzLiBFaXRoZXIgZW5naW5lIHJlcG9ydHMgZXhhY3RseSBvbmNlIHBlciBhdHRlbXB0LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxuJiM0MztcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgb3JkZXIpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGxpbmVbMTAyNF07XG4mIzQzO1x0aW50IGNvdW50ID0gMDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSB0cmFjaW5nX29wZW5fdHJhY2UoKTtcbiYjNDM7XHRpZiAoIWZwKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O0Nhbm5vdCBvcGVuIHRyYWNlIGJ1ZmZlclxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xuJiM0MztcdFx0Y2hhciAqcztcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgdmFsO1xuJiM0MztcdFx0dW5zaWduZWQgaW50IG9yZDtcbiYjNDM7XHRcdGNoYXIgKm87XG4mIzQzO1x0XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0XHRzID0gc3Ryc3RyKGxpbmUsIFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAocykge1xuJiM0MztcdFx0XHRpZiAoc3NjYW5mKHMsIFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOiBzY2FuX3Bmbj0weCVseFwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBcdTAwMjZ2YWwpICE9IDEpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdG8gPSBzdHJzdHIocywgXCYjMzQ7b3JkZXI9XCYjMzQ7KTtcbiYjNDM7XHRcdFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcJiMzNDtvcmRlcj0ldVwmIzM0OywgXHUwMDI2b3JkKSAhPSAxIHx8XG4mIzQzO1x0XHRcdCAgICBvcmQgIT0gb3JkZXIpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BmbnM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdFx0aWYgKHZhbCA9PSBwZm5zW2ldKSB7XG4mIzQzO1x0XHRcdFx0XHRjb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0cyA9IHN0cnN0cihsaW5lLCBcJiMzNDttbV9jb2xsYXBzZV9jYW5kaWRhdGU6XCYjMzQ7KTtcbiYjNDM7XHRcdGlmIChzKSB7XG4mIzQzO1x0XHRcdGlmICghc3Ryc3RyKHMsIFwmIzM0O3Bhc3M9aW5zdGFsbFwmIzM0OykgfHxcbiYjNDM7XHRcdFx0ICAgICFzdHJzdHIocywgXCYjMzQ7cmVzdWx0PXN1Y2NlZWRlZFwmIzM0OykpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdG8gPSBzdHJzdHIocywgXCYjMzQ7YWRkcj1cJiMzNDspO1xuJiM0MztcdFx0XHRpZiAoIW8gfHwgc3NjYW5mKG8sIFwmIzM0O2FkZHI9MHglbHhcJiMzNDssIFx1MDAyNnZhbCkgIT0gMSB8fFxuJiM0MztcdFx0XHQgICAgdmFsICE9IGFkZHIpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdG8gPSBzdHJzdHIocywgXCYjMzQ7b3JkZXI9XCYjMzQ7KTtcbiYjNDM7XHRcdFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcJiMzNDtvcmRlcj0ldVwmIzM0OywgXHUwMDI2b3JkKSAhPSAxIHx8XG4mIzQzO1x0XHRcdCAgICBvcmQgIT0gb3JkZXIpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdGNvdW50JiM0MzsmIzQzOztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7XHRyZXR1cm4gY291bnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzaXplX3Qgd2luZG93ID0gZ2V0cGFnZXNpemUoKSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSO1xuJiM0MztcdGNvbnN0IGludCBucl9wYWdlcyA9IDEgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHBmbnNbMSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSXTtcbiYjNDM7XHRib29sIGNvbGxhcHNlZCwgcGFzc2VkO1xuJiM0MztcdGludCBhdHRyaWJ1dGVkO1xuJiM0MztcdGNoYXIgKnA7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xuJiM0MztcdGlmIChwICE9IEJBU0VfQUREUilcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgd2luZG93XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LyogUHJlcGFyZSBvbmUgd2luZG93OyByZWNvcmQgaXRzIHNvdXJjZSBQRk5zLiAqL1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0cFtpICogZ2V0cGFnZXNpemUoKV0gPSBpICYjNDM7IDE7XG4mIzQzO1x0XHRwZm5zW2ldID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHAgJiM0MzsgaSAqIGdldHBhZ2VzaXplKCkpO1xuJiM0MztcdFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1NvdXJjZSBwYWdlIG5vdCBwcmVzZW50XFxuXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIENsZWFyIGZpcnN0OiB3aXRoIHRoZSBldmVudHMgc3RpbGwgb2ZmIHRoZXJlIGlzIG5vdGhpbmcgdG8gdW5kby4gKi9cbiYjNDM7XHRpZiAodHJhY2luZ19jbGVhcl90cmFjZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O0Nhbm5vdCBjbGVhciB0aGUgdHJhY2UgYnVmZmVyXFxuXCYjMzQ7KTtcbiYjNDM7XHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7Q2Fubm90IGVuYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHQvKiBXYWl0IHVwIHRvIDEyMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi9cbiYjNDM7XHRwYXNzZWQgPSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygxMjApO1xuJiM0MztcbiYjNDM7XHQvKiBPZmYgYmVmb3JlIGFueXRoaW5nIHRoYXQgY2FuIGdpdmUgdXA6IHRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlLiAqL1xuJiM0MztcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7Q2Fubm90IGRpc2FibGUgaHVnZV9tZW1vcnkgZXZlbnRzXFxuXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIXBhc3NlZClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRjb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XG4mIzQzO1x0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsICh1bnNpZ25lZCBsb25nKXAsXG4mIzQzO1x0XHRcdFx0ICAgICAgVEFSR0VUX09SREVSKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXHUwMDI2XHUwMDI2IGF0dHJpYnV0ZWQgPT0gMSxcbiYjNDM7XHRcdFx0IFwmIzM0O3N0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTtcbiYjNDM7XG4mIzQzO1x0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG1haW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cJiMzNDspO1xuJiM0MztcdGlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUikpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7T3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgVEFSR0VUX09SREVSKTtcbiYjNDM7XG4mIzQzO1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuJiM0MztcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRwYWdlbWFwX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcJiMzNDspO1xuJiM0MztcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXFxcJiMzNDspIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcdHRyYWNlX2V2ZW50c19mZCA9IHRyYWNpbmdfZXZlbnRzX29wZW4oXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspO1xuJiM0MztcdGlmICh0cmFjZV9ldmVudHNfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XG4mIzQzO1xuJiM0MztcdGtzZnRfc2V0X3BsYW4oTlJfSVRFUkFUSU9OUyk7XG4mIzQzO1xuJiM0MztcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4mIzQzO1x0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAoaHBhZ2VfcG1kX3NpemUgLyBnZXRwYWdlc2l6ZSgpKSAtIDE7XG4mIzQzO1x0LyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi9cbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXHUwMDNjXHUwMDNjIDI0O1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfSVRFUkFUSU9OUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRvbmVfc3RlcChpKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuQEAgLTIwLDcgJiM0MzsyMCw2IEBAXG4gXG4gI2RlZmluZSBUV09NRUdcdFx0KDJcdTAwM2NcdTAwM2MyMClcbiAjZGVmaW5lIFJVTlRJTUVcdFx0KDIwKVxuLSNkZWZpbmUgQUxJR04oeCwgYSlcdCgoKHgpICYjNDM7IChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gXG4gSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTQwMiw2ICYjNDM7NDAyLDEyIEBAIENBVEVHT1JZPVwmIzM0O3Bmbm1hcFwmIzM0OyBydW5fdGVzdCAuL3Bmbm1hcFxuICMgQ09XIHRlc3RzXG4gQ0FURUdPUlk9XCYjMzQ7Y293XCYjMzQ7IHJ1bl90ZXN0IC4vY293XG4gXG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrXG4mIzQzO1xuJiM0MztDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZVxuJiM0MztcbiBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXG4gXG4gQ0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyXG5AQCAtNDEwLDggJiM0Mzs0MTYsNiBAQCBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxuIFxuIENBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cbiBcbi1DQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub25cbi1cbiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZFxuIGlmIFsgLXogXCYjMzQ7JHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH1cJiMzNDsgXTsgdGhlblxuICAgICBpZiB0ZXN0X3NlbGVjdGVkIFwmIzM0O3RocFwmIzM0OzsgdGhlblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5pbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuQEAgLTQyLDY4ICYjNDM7NDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7O1xuIGludCBwYWdlbWFwX2ZkO1xuIGludCBrcGFnZWZsYWdzX2ZkO1xuIFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbi1cdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4te1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4tXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4tXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4tXG4tXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4tXHRpZiAocGZuID09IC0xVUwpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbi1cdGlmICghb3JkZXIpIHtcbi1cdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0Lyogbm9uIFRIUCBmb2xpbyAqL1xuLVx0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuLVx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuLVx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbi1cdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbi1cdCAqL1xuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpXG4ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuaW5kZXggODBiYzlmNTk3YjUyMS4uZWUxMzM0Nzc4MzkxZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5AQCAtNDk0LDYgJiM0Mzs0OTQsMTUxIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuJiM0MztcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbiYjNDM7XHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm47XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcbiYjNDM7XHQvKiBub24gcHJlc2VudCBwYWdlICovXG4mIzQzO1x0aWYgKHBmbiA9PSAtMVVMKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4mIzQzO1x0aWYgKCFvcmRlcikge1xuJiM0MztcdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBub24gVEhQIGZvbGlvICovXG4mIzQzO1x0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4mIzQzO1x0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuJiM0MztcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbiYjNDM7XHRcdFx0Z290byBmYWlsO1xuJiM0MztcdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbiYjNDM7XHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuJiM0MztcdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuJiM0MztmYWlsOlxuJiM0MztcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQ2hlY2sgd2hldGhlciBldmVyeSBvcmRlci1Ab3JkZXIgd2luZG93IG9mIFtzdGFydCwgbGVuKSBtYXBzIGV4YWN0bHkgb25lXG4mIzQzOyAqIGZvbGlvIG9mIHRoYXQgb3JkZXIsIGhlYWQgdG8gdGFpbC4gIFRoZSBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5XG4mIzQzOyAqIGFsaWduZWQsIGVhY2ggd2luZG93JiMzOTtzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgYSB3aW5kb3cmIzM5O3MgZmlyc3RcbiYjNDM7ICogUEZOIG11c3QgYmUgdGhlIGZvbGlvIGhlYWQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgaXMgdGhlIGNoZWNrIFwmIzM0O2RpZCB0aGlzIHJhbmdlIGNvbGxhcHNlIGludG8gb3JkZXItQG9yZGVyIGZvbGlvc1wmIzM0OzogYVxuJiM0MzsgKiB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpbyBzaGlmdGVkXG4mIzQzOyAqIGZyb20gaXRzIG5hdHVyYWwgcG9zaXRpb24sIGZhaWxzLlxuJiM0MzsgKi9cbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiYjNDM7XHRjb25zdCBzaXplX3Qgd2luZG93ID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xuJiM0MztcdGNoYXIgKnZhZGRyO1xuJiM0MztcbiYjNDM7XHRpZiAoKHVpbnRwdHJfdClzdGFydCAlIHdpbmRvdyB8fCBsZW4gJSB3aW5kb3cpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgXHUwMDNjIHN0YXJ0ICYjNDM7IGxlbjsgdmFkZHIgJiM0Mzs9IHdpbmRvdykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRcdC8qIE5vdCBwcmVzZW50LCBvciBub3QgbWFwcGluZyB0aGUgZm9saW8gaGVhZC4gKi9cbiYjNDM7XHRcdGlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcylcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpKSAhPVxuJiM0MztcdFx0XHQgICAgcGZuICYjNDM7IGkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0XHRcdGtwYWdlZmxhZ3NfZmQpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBUUkFDRUZTX1JPT1QgXCYjMzQ7L3N5cy9rZXJuZWwvdHJhY2luZ1wmIzM0O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogT3BlbiB0aGUgZW5hYmxlIGZpbGUgb2Ygb25lIGZ0cmFjZSBldmVudCBzdWJzeXN0ZW0gKGUuZy4gXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspLlxuJiM0MzsgKiBSZXR1cm5zIGEgZGVzY3JpcHRvciBmb3IgdHJhY2luZ19ldmVudHNfZW5hYmxlKCksIG9yIC0xIGlmIHRyYWNlZnMgb3IgdGhlXG4mIzQzOyAqIHN1YnN5c3RlbSBpcyBub3QgdGhlcmUuICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSBzdGF0ZTogd2hvZXZlclxuJiM0MzsgKiBzd2l0Y2hlcyB0aGVtIG9uIG93bnMgdGhlbSB1bnRpbCBpdCBzd2l0Y2hlcyB0aGVtIG9mZiwgaW5jbHVkaW5nIG9uIHRoZVxuJiM0MzsgKiBwYXRocyB3aGVyZSB0aGUgdGVzdCBnaXZlcyB1cC5cbiYjNDM7ICovXG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFsyNTZdO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCBcJiMzNDsvZXZlbnRzLyVzL2VuYWJsZVwmIzM0OyxcbiYjNDM7XHRcdCBzdWJzeXMpO1xuJiM0MztcdHJldHVybiBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHB3cml0ZShmZCwgZW5hYmxlID8gXCYjMzQ7MVwmIzM0OyA6IFwmIzM0OzBcJiMzNDssIDEsIDApICE9IDEpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhci4gKi9cbiYjNDM7aW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCBmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgT19XUk9OTFkgfCBPX1RSVU5DKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4gLyogSWYgYGlvY3RscyYjMzk7IG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi9cbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxuIFx0XHRcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbmluZGV4IDlhNDlhZjg4NzAyZTQuLjEwYzdiZTQ2ZTQ0Y2EgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuQEAgLTEwLDYgJiM0MzsxMCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuIFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXHUwMDNjXHUwMDNjIChucikpXG4mIzQzOyNkZWZpbmUgQUxJR04oeCwgYSkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiM0MzsgKGEpIC0gMSkgXHUwMDI2IH4oKGEpIC0gMSkpXG4mIzQzO1xuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcbiAjZGVmaW5lIFBNX01NQVBfRVhDTFVTSVZFICAgICAgICAgICAgIEJJVF9VTEwoNTYpXG4gI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KVxuQEAgLTk3LDYgJiM0Mzs5OSwxMCBAQCBpbnQ2NF90IGFsbG9jYXRlX3RyYW5zaHVnZSh2b2lkICpwdHIsIGludCBwYWdlbWFwX2ZkKTtcbiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7XG4gaW50IGdhdGhlcl9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sXG4gXHRcdGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKTtcbiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4mIzQzO1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKTtcbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpO1xuIFxuIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdCAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTtcbkBAIC0xMTMsNiAmIzQzOzExOSwxMCBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cyk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7XG4mIzQzO2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpO1xuJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XG4gXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxuIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNDo1OTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLywgd2hpY2ggZG8gbm90IGFmZmVjdCB0aGUga2VybmVsJiMzOTtzIGZ1bmN0aW9uYWwgZXhlY3V0aW9uIGZsb3cuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNjdhMTllMTdhOTFiNjE1ZDAwNzFjM2Q4NDEwMzgyZTgxYzBlOTA4OApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgQXVnIDEyIDE0OjU5OjEwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQppbmRleCAyZDUzNjYxOTZlMzA5Li4zMDhiYmFkNzNjMTFhIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQpAQCAtMTA0LDYgJiM0MzsxMDQsOSBAQCBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZ3VhcmQtcmVnaW9ucwogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1lcmdlCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcm1hcAogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX3NwbGl0X3JhY2VfdGVzdAomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19vcmRlcl9jaGVjawomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3N5bmNfY2hlY2sKJiM0MztURVNUX0dFTl9GSUxFUyAmIzQzOz0ga2h1Z2VwYWdlZF9yYWNlCiAKIGlmbmVxICgkKEFSQ0gpLGFybTY0KQogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IHNvZnQtZGlydHkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjkzMDMwYTQyYzNjY2QKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jCkBAIC0wLDAgJiM0MzsxLDEzNyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBTZWxmLWNoZWNrIGZvciB0aGUgdm1fdXRpbCBmb2xpby1vcmRlciBkZXRlY3Rpb24gaGVscGVycywKJiM0MzsgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBhbmQgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycygpLgomIzQzOyAqCiYjNDM7ICogRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0IG1lbW9yeSBpbiB3aXRoIG9ubHkKJiM0MzsgKiB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHZlcmlmeSB0aGUgaGVscGVycyByZXBvcnQgZXhhY3RseSB0aGF0IG9yZGVyOgomIzQzOyAqIG5vdCBhIG5laWdoYm91cmluZyBvcmRlciwgYW5kIHBsYWluIDRLIG1lbW9yeSBhcyBvcmRlciAwLiBUaGUgaGVscGVycwomIzQzOyAqIGFyZSB3aGF0IHRoZSBraHVnZXBhZ2VkIG1USFAgdGVzdHMgdXNlIHRvIGRldGVjdCBjb2xsYXBzZSByZXN1bHRzLCBzbwomIzQzOyAqIHRoZXkgbXVzdCBhZ3JlZSB3aXRoIHRoZSBrZXJuZWwmIzM5O3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueQomIzQzOyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc2VsZnRlc3QuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaCYjMzQ7CiYjNDM7CiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkOwomIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDsKJiM0MzsKJiM0MzsvKiBtbWFwIGFuIGFub24gVk1BIG9mIGV4YWN0bHkgQHNpemUgYnl0ZXMgYXQgYSBAc2l6ZS1hbGlnbmVkIGFkZHJlc3MuICovCiYjNDM7c3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlzaXplX3QgbGVuID0gc2l6ZSAqIDI7CiYjNDM7CXVpbnRwdHJfdCBhbGlnbmVkOwomIzQzOwljaGFyICpwOwomIzQzOwomIzQzOwlwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkmIzM0Oyk7CiYjNDM7CiYjNDM7CWFsaWduZWQgPSBBTElHTigodWludHB0cl90KXAsIHNpemUpOwomIzQzOwlpZiAoYWxpZ25lZCAhPSAodWludHB0cl90KXApCiYjNDM7CQltdW5tYXAocCwgYWxpZ25lZCAtICh1aW50cHRyX3QpcCk7CiYjNDM7CWlmIChhbGlnbmVkICYjNDM7IHNpemUgIT0gKHVpbnRwdHJfdClwICYjNDM7IGxlbikKJiM0MzsJCW11bm1hcCgoY2hhciAqKWFsaWduZWQgJiM0Mzsgc2l6ZSwKJiM0MzsJCSAgICAgICAodWludHB0cl90KXAgJiM0MzsgbGVuIC0gYWxpZ25lZCAtIHNpemUpOwomIzQzOwomIzQzOwlyZXR1cm4gKGNoYXIgKilhbGlnbmVkOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEVuYWJsZSBvbmx5IEBvcmRlciAob3JkZXIgMDogbm90aGluZyksIGZhdWx0IG9uZSBhbGlnbmVkIHdpbmRvdyBpbiBhbmQKJiM0MzsgKiBjaGVjayB0aGUgaGVscGVycyBzZWUgZXhhY3RseSBAb3JkZXIuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfb3JkZXIoaW50IG9yZGVyKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlzaXplX3Qgc2l6ZSA9IHBzaXplKCkgJmx0OyZsdDsgb3JkZXI7CiYjNDM7CWJvb2wgb2sgPSB0cnVlOwomIzQzOwljaGFyICpwOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5SX09SREVSUzsgaSYjNDM7JiM0MzspCiYjNDM7CQlzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjsKJiM0MzsJaWYgKG9yZGVyKQomIzQzOwkJc2V0dGluZ3MuaHVnZXBhZ2VzW29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUzsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CXAgPSBhbGxvY19hbGlnbmVkKHNpemUpOwomIzQzOwkqcCA9IDE7CiYjNDM7CiYjNDM7CWlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlciwKJiM0MzsJCQkJCSAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7b3JkZXIgJWQgbm90IGRldGVjdGVkIGFmdGVyIGZhdWx0XG4mIzM0Oywgb3JkZXIpOwomIzQzOwkJb2sgPSBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovCiYjNDM7CWlmIChvcmRlciAmYW1wOyZhbXA7IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIgLSAxLAomIzQzOwkJCQkJCSAgICAgcGFnZW1hcF9mZCwKJiM0MzsJCQkJCQkgICAgIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O29yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgJWRcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBvcmRlciwgb3JkZXIgLSAxKTsKJiM0MzsJCW9rID0gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogT3JkZXIgMCBwYWdlcyBtdXN0IG5vdCBsb29rIGxpa2UgYW55IGxhcmdlIGZvbGlvLCBhbmQgdmljZSB2ZXJzYS4gKi8KJiM0MzsJaWYgKG9yZGVyICZhbXA7JmFtcDsgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCAwLAomIzQzOwkJCQkJCSAgICAgcGFnZW1hcF9mZCwKJiM0MzsJCQkJCQkgICAgIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O29yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxuJiMzNDssIG9yZGVyKTsKJiM0MzsJCW9rID0gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbXVubWFwKHAsIHNpemUpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHQob2ssICYjMzQ7b3JkZXIgJWQgY2xhc3NpZmllZFxuJiMzNDssIG9yZGVyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG1haW4odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7CiYjNDM7CXVuc2lnbmVkIGxvbmcgb3JkZXJzOwomIzQzOwlpbnQgb3JkZXI7CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfaGVhZGVyKCk7CiYjNDM7CiYjNDM7CWlmICghdGhwX2F2YWlsYWJsZSgpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxuJiMzNDspOwomIzQzOwomIzQzOwlwYWdlbWFwX2ZkID0gb3BlbigmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChwYWdlbWFwX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O29wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKSYjMzQ7KTsKJiM0MzsJa3BhZ2VmbGFnc19mZCA9IG9wZW4oJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGtwYWdlZmxhZ3NfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDspIHJlcXVpcmVzIHJvb3RcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJb3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTsKJiM0MzsJaWYgKCFvcmRlcnMpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O05vIHN1cHBvcnRlZCBUSFAgb3JkZXJzXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWtzZnRfc2V0X3BsYW4oX19idWlsdGluX3BvcGNvdW50bChvcmRlcnMpICYjNDM7IDEpOwomIzQzOwomIzQzOwl0aHBfc2F2ZV9zZXR0aW5ncygpOwomIzQzOwl0aHBfcmVhZF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsJLyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqLwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJY2hlY2tfb3JkZXIoMCk7CiYjNDM7CWZvciAob3JkZXIgPSAxOyBvcmRlciAmbHQ7IE5SX09SREVSUzsgb3JkZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoIShvcmRlcnMgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBvcmRlcikpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJY2hlY2tfb3JkZXIob3JkZXIpOwomIzQzOwl9CiYjNDM7CiYjNDM7CiYjNDM7CWtzZnRfZmluaXNoZWQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jCmluZGV4IGUyNjQyZWNhMGQwMmIuLmRmNDI2ZjkyMThlNzEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jCkBAIC02NSw3ICYjNDM7NjUsNiBAQCBlbnVtIHsKICNkZWZpbmUgSE1NX1BBVEhfTUFYICAgIDY0CiAjZGVmaW5lIE5USU1FUwkJMTAKIAotI2RlZmluZSBBTElHTih4LCBhKSAoKCh4KSAmIzQzOyAoYSAtIDEpKSAmYW1wOyAofigoYSkgLSAxKSkpCiAvKiBKdXN0IHRoZSBmbGFncyB3ZSBuZWVkLCBjb3BpZWQgZnJvbSBtbS5oOiAqLwogCiAjaWZuZGVmIEZPTExfV1JJVEUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jCmluZGV4IGQ3OTE3ZGNlM2FiYWMuLjhhZmNkZjk3OTNiYjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYwpAQCAtMTgzLDYgJiM0MzsxODMsMTcgQEAgdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncykKIAl9CiB9CiAKJiM0MzsvKgomIzQzOyAqIFdyaXRlIG9ubHkgb24gY2hhbmdlOiBhbnkgc3RvcmUgdG8gYSBraHVnZXBhZ2VkIHN5c2ZzIGtub2Igd2FrZXMgdGhlCiYjNDM7ICogZGFlbW9uLCBhbmQgc2V0dGluZ3MgcHVzaGVzL3BvcHMgbXVzdCBub3Qgc3RhcnQgc2NhbiBwYXNzZXMgbm9ib2R5CiYjNDM7ICogYXNrZWQgZm9yIC0tIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgaXMgdGhlIG9ubHkgc2FuY3Rpb25lZCB3YWtlLgomIzQzOyAqLwomIzQzO3ZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pCiYjNDM7ewomIzQzOwlpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSkKJiM0MzsJCXRocF93cml0ZV9udW0obmFtZSwgbnVtKTsKJiM0Mzt9CiYjNDM7CiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncykKIHsKIAlzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9ICZhbXA7c2V0dGluZ3MtJmd0O2todWdlcGFnZWQ7CkBAIC0xOTgsMTUgJiM0MzsyMDksMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpCiAJCQlzaG1lbV9lbmFibGVkX3N0cmluZ3Nbc2V0dGluZ3MtJmd0O3NobWVtX2VuYWJsZWRdKTsKIAl0aHBfd3JpdGVfbnVtKCYjMzQ7dXNlX3plcm9fcGFnZSYjMzQ7LCBzZXR0aW5ncy0mZ3Q7dXNlX3plcm9fcGFnZSk7CiAKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWcmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7ZGVmcmFnKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3MmIzM0OywKLQkJCWtodWdlcGFnZWQtJmd0O2FsbG9jX3NsZWVwX21pbGxpc2Vjcyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3MmIzM0OywKLQkJCWtodWdlcGFnZWQtJmd0O3NjYW5fc2xlZXBfbWlsbGlzZWNzKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX25vbmUpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXAmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc3dhcCk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3NoYXJlZCk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvcGFnZXNfdG9fc2NhbiYjMzQ7LCBraHVnZXBhZ2VkLSZndDtwYWdlc190b19zY2FuKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL2RlZnJhZyYjMzQ7LCBraHVnZXBhZ2VkLSZndDtkZWZyYWcpOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzJiMzNDssCiYjNDM7CQkgICAgICAga2h1Z2VwYWdlZC0mZ3Q7YWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDssCiYjNDM7CQkgICAgICAga2h1Z2VwYWdlZC0mZ3Q7c2Nhbl9zbGVlcF9taWxsaXNlY3MpOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZSYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19ub25lKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXAmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc3dhcCk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWQmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc2hhcmVkKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW4mIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7cGFnZXNfdG9fc2Nhbik7CiAKIAlpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSkKIAkJd3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLSZndDtyZWFkX2FoZWFkX2tiKTsKQEAgLTIzMCw2ICYjNDM7MjQxLDQ5IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdAomIzQzOyAqIHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZC4gZnVsbF9zY2FucyBtdXN0IGFkdmFuY2UgYnkgdHdvOwomIzQzOyAqIGEgJiM0MzsxIHN0ZXAgbWF5IGNvbXBsZXRlIGEgcGFzcyB0aGF0IGV4YW1pbmVkIHRoaXMgbW0gYmVmb3JlIHRoZQomIzQzOyAqIGNhbGxlciYjMzk7cyBzZXR1cCB3YXMgaW4gcGxhY2UuCiYjNDM7ICoKJiM0MzsgKiBBbnkgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgc28gdGhlIGJhcnJpZXIgd29ya3MKJiM0MzsgKiB3aGF0ZXZlciB0aGUgY29uZmlndXJlZCBzY2FuIGNhZGVuY2UgLS0gYnV0IGEgc3RvcmUgY2FuIGJlIGxvc3QuCiYjNDM7ICogX19zbGVlcF9taWxsaXNlY3Nfc3RvcmUoKSBjbGVhcnMga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgYW5kIHdha2VzIHRoZQomIzQzOyAqIHF1ZXVlOyBpZiB0aGUgZGFlbW9uIGlzIGJldHdlZW4gc2NhbnMgcmF0aGVyIHRoYW4gc2xlZXBpbmcsIGl0IHNldHMKJiM0MzsgKiBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZSBpdHNlbGYgb24gdGhlIHdheSBpbnRvIGtodWdlcGFnZWRfd2FpdF93b3JrKCkgYW5kCiYjNDM7ICogdGhlbiBzbGVlcHMgZm9yIHRoZSBmdWxsIGludGVydmFsLCBoYXZpbmcgbmV2ZXIgc2VlbiB0aGUgc3RvcmUuICBTbyBrZWVwCiYjNDM7ICogc3RvcmluZyB1bnRpbCB0aGUgcGFzcyBsYW5kczsgYSBzdG9yZSB3aGlsZSB0aGUgZGFlbW9uIGlzIGF3YWtlIGNvc3RzCiYjNDM7ICogbm90aGluZyBhbmQgZG9lcyBub3QgcXVldWUgYW4gZXh0cmEgcGFzcy4KJiM0MzsgKgomIzQzOyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpbgomIzQzOyAqIG9uZSBzY2FuIGJhdGNoLCBzbyBjYWxsZXJzIG11c3QgcGFpciB0aGlzIHdpdGggYSBsYXJnZQomIzQzOyAqIHBhZ2VzX3RvX3NjYW4uCiYjNDM7ICovCiYjNDM7Ym9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBkZWFkbGluZV9tcyA9IHRpbWVvdXRfcyAqIDEwMDBVTDsKJiM0MzsJdW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9CiYjNDM7CQl0aHBfcmVhZF9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDspOwomIzQzOwl1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwOwomIzQzOwlpbnQgcGFzczsKJiM0MzsKJiM0MzsJZm9yIChwYXNzID0gMDsgcGFzcyAmbHQ7IDI7IHBhc3MmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHRhcmdldCA9CiYjNDM7CQkJdGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICYjNDM7IDE7CiYjNDM7CiYjNDM7CQl3aGlsZSAodGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICZsdDsgdGFyZ2V0KSB7CiYjNDM7CQkJaWYgKGVsYXBzZWRfbXMgJmd0Oz0gZGVhZGxpbmVfbXMpCiYjNDM7CQkJCXJldHVybiBmYWxzZTsKJiM0MzsJCQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJCQkgICAgICBzbGVlcF9tcyk7CiYjNDM7CQkJdXNsZWVwKDEwICogMTAwMCk7CiYjNDM7CQkJZWxhcHNlZF9tcyAmIzQzOz0gMTA7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwogc3RydWN0IHRocF9zZXR0aW5ncyAqdGhwX2N1cnJlbnRfc2V0dGluZ3Modm9pZCkKIHsKIAlpZiAoIXNldHRpbmdzX2luZGV4KSB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaAppbmRleCA3MjZjNzNjNDNjMDViLi5iYTdkMzgzNzBkNDMzIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmgKQEAgLTcwLDYgJiM0Mzs3MCw3IEBAIGludCB0aHBfcmVhZF9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqIGNvbnN0IHN0cmluZ3NbXSk7CiB2b2lkIHRocF93cml0ZV9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3JlYWRfbnVtKGNvbnN0IGNoYXIgKm5hbWUpOwogdm9pZCB0aHBfd3JpdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTsKJiM0Mzt2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTsKIAogdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpOwogdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncyk7CkBAIC04Myw2ICYjNDM7ODQsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZCkKIAlodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7CiB9CiAKJiM0Mztib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpOwomIzQzOwogdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7CiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jCmluZGV4IDBkNmM3MWVkMmZhZTMuLmY1NzczZDQ0NzU0MjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMKQEAgLTMxLDYgJiM0MzszMSwxMSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7CiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjsKIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjsKIHN0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXI7CiYjNDM7c3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfZ2l2ZW47CiYjNDM7c3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTsKJiM0MztzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVyczsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTsKIAogI2RlZmluZSBQSURfU01BUFMgJiMzNDsvcHJvYy9zZWxmL3NtYXBzJiMzNDsKICNkZWZpbmUgVEVTVF9GSUxFICYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlJiMzNDsKQEAgLTI0MSw2ICYjNDM7MjQ2LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogCXJldHVybiBzd2FwOwogfQogCiYjNDM7LyoKJiM0MzsgKiBQYWdlIHRoZSByYW5nZSBvdXQgYW5kIHdhaXQgZm9yIHRoZSBzd2FwIGNvdW50IHRvIHNheSBzby4KJiM0MzsgKgomIzQzOyAqIFR3byB0aGluZ3MgZ2V0IGluIHRoZSB3YXkuICBNQURWX1BBR0VPVVQgaXMgYmVzdCBlZmZvcnQ6CiYjNDM7ICogc2hyaW5rX2ZvbGlvX2xpc3QoKSBsZWF2ZXMgYSBmb2xpbyBhbG9uZSB3aGVuIGl0IGNhbm5vdCByZWNsYWltIGl0IHJpZ2h0CiYjNDM7ICogYXdheSwgYW5kIG9uZSBzdGlsbCB1bmRlciB3cml0ZWJhY2sgZnJvbSBhbiBlYXJsaWVyIHBhZ2VvdXQgaXMgdGhlIGNvbW1vbgomIzQzOyAqIGNhc2UsIHNvIHRoZSBjb3VudCB0aGUgY2FsbGVyIGFza3MgZm9yIGFycml2ZXMgYSBtb21lbnQgbGF0ZXIuICBBbmQgYSByYW5nZQomIzQzOyAqIGFuIGVhcmxpZXIgY29sbGFwc2UgbGVmdCBNQURWX0hVR0VQQUdFIGlzIG9uZSBraHVnZXBhZ2VkIGlzIHN0aWxsIHdvcmtpbmcKJiM0MzsgKiBvbjogY29sbGFwc2luZyBhIHJhbmdlIHdpdGggdXAgdG8gbWF4X3B0ZXNfc3dhcCBwYWdlcyBzd2FwcGVkIG91dCBtZWFucwomIzQzOyAqIHJlYWRpbmcgdGhvc2UgcGFnZXMgYmFjayBpbiwgc28gdGhlIGRhZW1vbiB1bmRvZXMgdGhlIHBhZ2VvdXQgYXMgZmFzdCBhcyBpdAomIzQzOyAqIGlzIGFza2VkIGZvci4gIEtlZXAgdGhlIHJhbmdlIG91dCBvZiBpdHMgcmVhY2g7IHRoZSBjb2xsYXBzZSB0aGUgY2FsbGVyIHJ1bnMKJiM0MzsgKiBuZXh0IHB1dHMgTUFEVl9IVUdFUEFHRSBiYWNrLgomIzQzOyAqCiYjNDM7ICogRmFpbGluZyB0byBnZXQgdGhlIHBhZ2VzIG91dCBpcyB0aGUgbWFjaGluZSYjMzk7cyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJiMzOTtzIC0tCiYjNDM7ICogc3dhcCB0b28gc21hbGwsIHN3YXAgZnVsbCwgYSBtZW1jZyBjYXAsIGEgZm9saW8gc3RpbGwgdW5kZXIgd3JpdGViYWNrIC0tIHNvCiYjNDM7ICogY2FsbGVycyBza2lwIHJhdGhlciB0aGFuIGZhaWwuICBBbiBlcnJvciBmcm9tIG1hZHZpc2UoKSBpcyBkaWZmZXJlbnQsIGFuZAomIzQzOyAqIGVuZHMgdGhlIHJ1biBoZXJlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIHN3YXBvdXRfcmFuZ2Uodm9pZCAqcCwgdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfTk9IVUdFUEFHRSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSkmIzM0Oyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyA0MDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpJiMzNDspOwomIzQzOwkJaWYgKGNoZWNrX3N3YXAocCwgc2l6ZSkpCiYjNDM7CQkJcmV0dXJuIHRydWU7CiYjNDM7CQl1c2xlZXAoNTAgKiAxMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgKmFsbG9jX21hcHBpbmcoaW50IG5yKQogewogCXZvaWQgKnA7CkBAIC01ODMsOCAmIzQzOzYyMywxMCBAQCBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgc2l6ZV90IGxlbiwKIAkJaW50IG5yX2hwYWdlcywgaW50IGNvbGxhcF9vcmRlciwgc3RydWN0IG1lbV9vcHMgKm9wcykKIHsKIAl1bnNpZ25lZCBsb25nIGhwYWdlX3NpemUgPSBwYWdlX3NpemUgJmx0OyZsdDsgY29sbGFwX29yZGVyOwomIzQzOwkvKiBUaHJlZSBzZWNvbmRzIGFzIGEgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gdG8gY29sbGFwc2UgKi8KJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3NpemU7CiYjNDM7CWludCB0aW1lb3V0ID0gNiAmIzQzOyAyICogKGJ5dGVzIC8gKDEyOFVMICZsdDsmbHQ7IDIwKSk7CiAJaW50IGZ1bGxfc2NhbnM7Ci0JaW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi8KIAogCS8qIFNhbml0eSBjaGVjayAqLwogCWlmICghb3BzLSZndDtjaGVja19odWdlKHAsIGxlbiwgMCwgaHBhZ2Vfc2l6ZSkpCkBAIC04NTMsMTIgJiM0Mzs4OTUsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2Vfc3dhcGluX3NpbmdsZV9wdGUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3AKIAlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwogCW9wcy0mZ3Q7ZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwogCi0JaWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgcGFnZV9zaXplKSkgewomIzQzOwlpZiAoc3dhcG91dF9yYW5nZShwLCBwYWdlX3NpemUpKSB7CiAJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAl9IGVsc2UgewotCQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtODg1LDEyICYjNDM7OTI1LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvCiAJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKIAlvcHMtJmd0O2ZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKIAotCWlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgJiM0MzsgMSkgKiBwYWdlX3NpemUpKSB7CiYjNDM7CWlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkgewogCQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiAJfSBlbHNlIHsKLQkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CQlza2lwKCYjMzQ7Q291bGQgbm90IHN3YXAgb3V0JiMzNDspOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTkwMiwxMiAmIzQzOzk0MCwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqbwogCQlvcHMtJmd0O2ZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKIAkJa3NmdF9wcmludF9tc2coJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uJiMzNDssIG1heF9wdGVzX3N3YXAsCiAJCSAgICAgICBocGFnZV9wbWRfbnIpOwotCQlpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpJiMzNDspOwotCQlpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkgewomIzQzOwkJaWYgKHN3YXBvdXRfcmFuZ2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHsKIAkJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAkJfSBlbHNlIHsKLQkJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwkJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC05NzQsNiAmIzQzOzEwMTAsMTYgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMKIAl2b2lkICpwOwogCWludCBpOwogCiYjNDM7CS8qCiYjNDM7CSAqIFRoZSB0ZXN0IG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMsIHdoaWNoIGlzIGxpa2VseSB0bwomIzQzOwkgKiBmYWlsIGZvciBsYXJnZSBQTUQgc2l6ZXMuICBTa2lwIGlmIHRoZSBQTUQgc2l6ZSBpcyBvdmVyIDMyTS4KJiM0MzsJICovCiYjNDM7CWlmIChocGFnZV9wbWRfc2l6ZSAmZ3Q7ICgzMlVMICZsdDsmbHQ7IDIwKSkgewomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7JXM6IFBNRCB0b28gbGFyZ2UgZm9yIGZhdWx0LXRpbWUgVEhQIGNvbnN0cnVjdGlvblxuJiMzNDssCiYjNDM7CQkJCSAgICAgIF9fZnVuY19fKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwogCXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiAJa3NmdF9wcmludF9tc2coJiMzNDtDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xuJiMzNDspOwogCWZvciAoaSA9IDA7IGkgJmx0OyBocGFnZV9wbWRfbnI7IGkmIzQzOyYjNDM7KSB7CkBAIC0xMTY0LDYgJiM0MzsxMjEwLDcyIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMKIAlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKIH0KIAomIzQzOy8qCiYjNDM7ICogQ29udGVudCBzdGF5cyBpc29sYXRlZCB3aGlsZSBhIGNvLXNoYXJlciB3cml0ZXMgY29uY3VycmVudGx5LiBBIHNoYXJlZAomIzQzOyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlCiYjNDM7ICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXImIzM5O3Mgd3JpdGUgZ29lcyB0byBhIENvVyBjb3B5LiBUaGUKJiM0MzsgKiBjb2xsYXBzaW5nIGNoaWxkIG11c3Qgc2VlIHRoZSBwcmUtZm9yayBjb250ZW50LCB0aGUgd3JpdGluZyBwYXJlbnQgb25seQomIzQzOyAqIGl0cyBvd24gd3JpdGVzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX2ZvcmtfY293X3JhY2Uoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIHNoYXJlZCA9IDY0ICogcGFnZV9zaXplOwomIzQzOwljb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7CiYjNDM7CWludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG4gPSBzaGFyZWQgLyBwYWdlX3NpemU7CiYjNDM7CS8qIHZvbGF0aWxlOiB0aGUgbG9vcCBiZWxvdyBtdXN0IHJlYWxseSBzdG9yZSwgb24gZXZlcnkgaXRlcmF0aW9uICovCiYjNDM7CXZvbGF0aWxlIGludCAqaXA7CiYjNDM7CXZvaWQgKnA7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CWlwID0gcDsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCAwLCBzaGFyZWQpOwkJLyogc2hhcmVkIHByZWZpeCwgcHJlLWZvcmsgcGF0dGVybiAqLwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0ZvcmssIGNvbGxhcHNlIGluIHRoZSBjaGlsZCB3aGlsZSB0aGUgcGFyZW50IHJld3JpdGVzLi4uJiMzNDspOwomIzQzOwlpZiAoIWZvcmsoKSkgewomIzQzOwkJaW50IGNvbGxhcHNlX3N0YXR1czsKJiM0MzsKJiM0MzsJCW9wcy0mZ3Q7ZmF1bHQocCwgc2hhcmVkLCBocGFnZV9wbWRfc2l6ZSk7CS8qIHByaXZhdGUgcmVtYWluZGVyICovCiYjNDM7CQljLSZndDtjb2xsYXBzZSgmIzM0O0NvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlciYjMzQ7LAomIzQzOwkJCSAgICBwLCAxLCBvcHMsIHRydWUpOwomIzQzOwkJY29sbGFwc2Vfc3RhdHVzID0gZXhpdF9zdGF0dXM7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspCiYjNDM7CQkJaWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgJiM0MzsgMHhkZWFkMDAwMCkKJiM0MzsJCQkJYnJlYWs7CiYjNDM7CQlpZiAoaSA9PSBuKQomIzQzOwkJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlmYWlsKCYjMzQ7RmFpbDogY2hpbGQgY29udGVudCYjMzQ7KTsKJiM0MzsJCS8qIFRoZSBjb250ZW50IGNoZWNrIG11c3Qgbm90IGJ1cnkgYSBmYWlsZWQgY29sbGFwc2UuICovCiYjNDM7CQlpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKQomIzQzOwkJCWV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzOwomIzQzOwkJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJX2V4aXQoZXhpdF9zdGF0dXMpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEhhbW1lciB0aGUgcGFyZW50JiMzOTtzIG93biB3cml0ZXMgb3ZlciB0aGUgc2hhcmVkIHByZWZpeC4gKi8KJiM0MzsJZm9yIChpbnQgaXQgPSAwOyBpdCAmbHQ7IDIwMDAwMDsgaXQmIzQzOyYjNDM7KQomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJCWlwW2kgKiBzdHJpZGVdID0gaSAmIzQzOyAweGJlZWYwMDAwOwomIzQzOwomIzQzOwl3YWl0KCZhbXA7d3N0YXR1cyk7CiYjNDM7CS8qIEEgY2hpbGQgdGhhdCBkaWVkIHJlYWRpbmcgdGhlIHJhY2luZyBwYWdlcyBpcyBhIGZhaWx1cmUsIG5vdCBhIHplcm8uICovCiYjNDM7CWNoaWxkX3N0YXR1cyA9IFdJRkVYSVRFRCh3c3RhdHVzKSA/IFdFWElUU1RBVFVTKHdzdGF0dXMpIDogS1NGVF9GQUlMOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uJiMzNDspOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGJlZWYwMDAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwlpZiAoaSA9PSBuKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbDogcGFyZW50IGNvbnRlbnQmIzM0Oyk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJLyogU2FtZSBhZ2Fpbjogb3VyIG93biBjaGVjayBtdXN0IG5vdCBidXJ5IHRoZSBjaGlsZCYjMzk7cyB2ZXJkaWN0LiAqLwomIzQzOwlpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKQomIzQzOwkJZXhpdF9zdGF0dXMgPSBjaGlsZF9zdGF0dXM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKIAkJCQkJICAgc3RydWN0IG1lbV9vcHMgKm9wcykKIHsKQEAgLTEyMDksNiAmIzQzOzEzMjEsMjE5IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAogCWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwogfQogCiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqLwomIzQzOyNkZWZpbmUgTUlOX01USFBfT1JERVIgMgomIzQzOwomIzQzOy8qCiYjNDM7ICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBmb3IgdGhlIG10aHBfa2h1Z2VwYWdlZCBjb250ZXh0LiAgV2hhdAomIzQzOyAqIHRoZXkgYWRkIG92ZXIgdGhlIGdlbmVyaWMgY2FzZXMgcnVuIHVuZGVyIHRoYXQgY29udGV4dCBpcyBwZXItd2luZG93CiYjNDM7ICogZGV0ZWN0aW9uOiB3aGljaCBhbGlnbmVkIHdpbmRvdyBjb2xsYXBzZWQsIGFuZCB3aGljaCBvZiBpdHMgbmVpZ2hib3VycyBkaWQKJiM0MzsgKiBub3QuICBjaGVja19odWdlKCkgYW5zd2VycyBob3cgbWFueSBmb2xpb3Mgb2YgdGhlIG9yZGVyIHRoZSByYW5nZSBob2xkcywKJiM0MzsgKiB3aGljaCBjYW5ub3QgdGVsbCBvbmUgd2luZG93IGZyb20gYW5vdGhlci4KJiM0MzsgKgomIzQzOyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgYW5kIHRoZSB0YXJnZXQgb3JkZXIgaXMgb25seQomIzQzOyAqIGVuYWJsZWQgZm9yIG1hZHZpc2UsIHNvIHRoZSBzb3VyY2VzIGFyZSBhbHdheXMgb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlCiYjNDM7ICogcHJvZHVjdCBjYW4gb25seSBoYXZlIGNvbWUgZnJvbSBraHVnZXBhZ2VkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIHBhZ2Vfc2l6ZSAmbHQ7Jmx0OyBjb2xsYXBzZV9vcmRlcjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgbXRocF9wdXNoX3RhcmdldF9vcmRlcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRhcmdldCBvcmRlciwgZm9yIG1hZHZpc2Ugb25seSwgYW5kIG5vdGhpbmcgZWxzZSBlbmFibGVkOiB0aGUKJiM0MzsJICogY2FzZXMgZmF1bHQgdGhlaXIgcmVnaW9uIGJlZm9yZSBNQURWX0hVR0VQQUdFLCBzbyB0aGUgc291cmNlcyBhcmUKJiM0MzsJICogb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCB0aGUgZmF1bHQgcGF0aCBmb3IuICBUaGF0IG1hdHRlcnMgZm9yIHRoZQomIzQzOwkgKiBjYXNlcyBidWlsdCBhcm91bmQgYSBob2xlIC0tIGEgbGFyZ2Ugc291cmNlIGZvbGlvIHdvdWxkIGZpbGwgaXQgaW4KJiM0MzsJICogYW5kIHRoZSB3aW5kb3cgd291bGQgY29sbGFwc2UgYWZ0ZXIgYWxsLgomIzQzOwkgKiBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzIGVuYWJsZXMgdGhlIHNvdXJjZSBvcmRlciBpdCB3YW50cyBvbgomIzQzOwkgKiB0b3Agb2YgdGhpcy4KJiM0MzsJICovCiYjNDM7CXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbY29sbGFwc2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfTUFEVklTRTsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHdpbmRvd19jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbikKJiM0Mzt7CiYjNDM7CXJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGxlbiwgY29sbGFwc2Vfb3JkZXIsCiYjNDM7CQkJCQkgICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7CiYjNDM7fQomIzQzOwomIzQzOy8qIE5vIGFsaWduZWQgd2luZG93IGluIFtwLCBwICYjNDM7IGxlbikgaXMgYmFja2VkIGF0IHRoZSB0YXJnZXQgb3JkZXIuICovCiYjNDM7c3RhdGljIGJvb2wgd2luZG93X25vdF9jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbikKJiM0Mzt7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7CiYjNDM7CWNoYXIgKmFkZHIgPSBwOwomIzQzOwomIzQzOwlmb3IgKDsgbGVuICZndDs9IHdpbmRvdzsgYWRkciAmIzQzOz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7CiYjNDM7CQlpZiAod2luZG93X2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wga2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcyh2b2lkKQomIzQzO3sKJiM0MzsJLyogV2FpdCB1cCB0byAzMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi8KJiM0MzsJcmV0dXJuIGtodWdlcGFnZWRfZnVsbF9wYXNzKDMwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKJiM0MzsJCQkJCSBzdHJ1Y3QgbWVtX29wcyAqb3BzKQomIzQzO3sKJiM0MzsJc2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7CiYjNDM7CWlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxuJiMzNDspOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSAmYW1wOyZhbXA7CiYjNDM7CQkgd2luZG93X25vdF9jb2xsYXBzZWQocCwgd2luZG93KSAmYW1wOyZhbXA7CiYjNDM7CQkgd2luZG93X25vdF9jb2xsYXBzZWQocCAmIzQzOyAyICogd2luZG93LAomIzQzOwkJCQkgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwltdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgcGFnZV9zaXplKTsKJiM0MzsJaWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIHdpbmRvdyB3aXRoIHNpbmdsZSBQVEUgZW50cnkgcHJlc2VudC4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBtdGhwX3dpbmRvd19zaXplKCkpKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfbWVtb3J5KHAsIDAsIHBhZ2Vfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKJiM0MzsJCQkJCSBzdHJ1Y3QgbWVtX29wcyAqb3BzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJc2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwlzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwOwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTsKJiM0MzsJaWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCB3aW5kb3cpICZhbXA7JmFtcDsKJiM0MzsJCSB3aW5kb3dfbm90X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTsKJiM0MzsJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CWludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSOwomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzOwomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwkvKiBTb3VyY2VzIG11c3QgYmUgYSBzdXBwb3J0ZWQgbVRIUCBvcmRlciBzdHJpY3RseSBiZWxvdyB0aGUgdGFyZ2V0LiAqLwomIzQzOwlpZiAoc291cmNlX29yZGVyICZndDs9IGNvbGxhcHNlX29yZGVyIHx8CiYjNDM7CSAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBzb3VyY2Vfb3JkZXIpKSkgewomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7JXM6IG5vIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcbiYjMzQ7LAomIzQzOwkJCQkgICAgICBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwomIzQzOwkvKiBGYXVsdCB0aGUgd2hvbGUgcmVnaW9uIGFzIG9yZGVyLUBzb3VyY2Vfb3JkZXIgZm9saW9zLiAqLwomIzQzOwlzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUzsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBvcmRlciBpcyBlbmFibGVkIGFuZCBzdXBwb3J0ZWQsIGJ1dCB0aGUgYWxsb2NhdG9yIGNhbiBzdGlsbCBmYWxsCiYjNDM7CSAqIGJhY2sgdW5kZXIgZnJhZ21lbnRhdGlvbi4gIFRoYXQgbGVhdmVzIG5vdGhpbmcgdG8gY29sbGFwc2UgZnJvbSwKJiM0MzsJICogd2hpY2ggaXMgdGhlIG1hY2hpbmUmIzM5O3MgYW5zd2VyIHJhdGhlciB0aGFuIGEgcmVhc29uIHRvIGVuZCB0aGUgcnVuLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsCiYjNDM7CQkJCQkgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O05vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi4mIzM0Oywgc291cmNlX29yZGVyKTsKJiM0MzsJCXNraXAoJiMzNDtTa2lwJiMzNDspOwomIzQzOwkJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uJiMzNDssCiYjNDM7CQkgICAgICAgc291cmNlX29yZGVyKTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwomIzQzOwl2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKIHsKIAlmcHJpbnRmKHN0ZGVyciwgJiMzNDtcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdICZsdDt0ZXN0IHR5cGUmZ3Q7IFtkaXJdXG5cbiYjMzQ7KTsKQEAgLTEyMjYsMTEgJiM0MzsxNTUxLDE1IEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCiAJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdC1zOiBtVEhQIHNpemUsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxuJiMzNDspOwogCWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cbiYjMzQ7KTsKIAlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBEZWZhdWx0cyB0byBldmVyeSBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBXaXRoIC1zLCAtcyBuYW1lcyB0aGUgbVRIUCBzb3VyY2Ugb3JkZXIgZm9yIHRoZVxuJiMzNDspOwomIzQzOwlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXG4mIzM0Oyk7CiAJZXhpdCgxKTsKIH0KIAogc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKJiM0MzsJYm9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlOwogCWludCBvcHQ7CiAJY2hhciAqYnVmOwogCWNvbnN0IGNoYXIgKnRva2VuOwpAQCAtMTI0Miw2ICYjNDM7MTU3MSw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQlicmVhazsKIAkJY2FzZSAmIzM5O2MmIzM5OzoKIAkJCWNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpOwomIzQzOwkJCWNvbGxhcHNlX29yZGVyX2dpdmVuID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7aCYjMzk7OgogCQlkZWZhdWx0OgpAQCAtMTI0OSwxMiAmIzQzOzE1NzksMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJfQogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyCiYjNDM7CSAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGFub25fb3JkZXIgJmx0OyAwIHx8IGFub25fb3JkZXIgJmd0OyBocGFnZV9wbWRfb3JkZXIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXG4mIzM0OywKJiM0MzsJCQkJICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTsKJiM0MzsJaWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuICZhbXA7JmFtcDsKJiM0MzsJICAgIChjb2xsYXBzZV9vcmRlciAmbHQ7PSAwIHx8IGNvbGxhcHNlX29yZGVyICZndDsgaHBhZ2VfcG1kX29yZGVyKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0Oy1jIHRha2VzIGFuIG9yZGVyIGluIDEuLiVkLCBub3QgJWRcbiYjMzQ7LAomIzQzOwkJCQkgICBocGFnZV9wbWRfb3JkZXIsIGNvbGxhcHNlX29yZGVyKTsKJiM0MzsKIAlhcmd2ICYjNDM7PSBvcHRpbmQ7CiAJYXJnYyAtPSBvcHRpbmQ7CiAKIAlpZiAoYXJnYyA9PSAwKSB7Ci0JCS8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiYjNDM7CQkvKiBFdmVyeXRoaW5nIHRoYXQgbmVlZHMgbm8gYXJndW1lbnQgb2YgaXRzIG93bjogYW5vbiwgZXZlcnkgY29udGV4dCAqLwogCQlraHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX2todWdlcGFnZWRfY29udGV4dDsKJiM0MzsJCW10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gICZhbXA7X19tdGhwX2todWdlcGFnZWRfY29udGV4dDsKIAkJbWFkdmlzZV9jb250ZXh0ID0gICZhbXA7X19tYWR2aXNlX2NvbnRleHQ7CiAJCWFub25fb3BzID0gJmFtcDtfX2Fub25fb3BzOwogCQlyZXR1cm47CkBAIC0xMjY1LDEzICYjNDM7MTYwOCwxOSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCiAJaWYgKCFzdHJjbXAodG9rZW4sICYjMzQ7YWxsJiMzNDspKSB7CiAJCWtodWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fa2h1Z2VwYWdlZF9jb250ZXh0OwomIzQzOwkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0OwogCQltYWR2aXNlX2NvbnRleHQgPSAgJmFtcDtfX21hZHZpc2VfY29udGV4dDsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiAmIzM0O2FsbCYjMzQ7IHN3ZWVwcyB0aGUgbVRIUCBjb250ZXh0IGluLCBidXQgaXQgb25seSBoYXMgYW5vbgomIzQzOwkJICogY2FzZXM6IHN0ZXAgaXQgYXNpZGUgZm9yIHRoZSBvdGhlciBtZW1fdHlwZXMgcmF0aGVyIHRoYW4KJiM0MzsJCSAqIHJlZnVzaW5nIHRoZSB3aG9sZSBydW4uCiYjNDM7CQkgKi8KJiM0MzsJCW10aHBfY29udGV4dF9pbXBsaWVkID0gdHJ1ZTsKIAl9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sICYjMzQ7a2h1Z2VwYWdlZCYjMzQ7KSkgewogCQlraHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX2todWdlcGFnZWRfY29udGV4dDsKIAl9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sICYjMzQ7bXRocF9raHVnZXBhZ2VkJiMzNDspKSB7CiAJCW10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gICZhbXA7X19tdGhwX2todWdlcGFnZWRfY29udGV4dDsKLQkJaWYgKGNvbGxhcHNlX29yZGVyICZsdDs9IDAgfHwgY29sbGFwc2Vfb3JkZXIgJmd0Oz0gaHBhZ2VfcG1kX29yZGVyKQotCQkJdXNhZ2UoKTsKIAl9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sICYjMzQ7bWFkdmlzZSYjMzQ7KSkgewogCQltYWR2aXNlX2NvbnRleHQgPSAgJmFtcDtfX21hZHZpc2VfY29udGV4dDsKIAl9IGVsc2UgewpAQCAtMTI4NywyMCAmIzQzOzE2MzYsMjAgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICAmYW1wO19fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wczsKIAkJYW5vbl9vcHMgPSAmYW1wO19fYW5vbl9vcHM7CiAJCXNobWVtX29wcyA9ICZhbXA7X19zaG1lbV9vcHM7Ci0JCWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkKLQkJCXVzYWdlKCk7CiAJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDthbm9uJiMzNDspKSB7CiAJCWFub25fb3BzID0gJmFtcDtfX2Fub25fb3BzOwogCX0gZWxzZSBpZiAoIXN0cmNtcChidWYsICYjMzQ7ZmlsZSYjMzQ7KSkgewogCQlyZWFkX29ubHlfZmlsZV9vcHMgPSAgJmFtcDtfX3JlYWRfb25seV9maWxlX29wczsKIAkJcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzID0gICZhbXA7X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7CiAJCXJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgJmFtcDtfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7Ci0JCWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkKJiM0MzsJCWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCAmYW1wOyZhbXA7ICFtdGhwX2NvbnRleHRfaW1wbGllZCkKIAkJCXVzYWdlKCk7CiYjNDM7CQltdGhwX2todWdlcGFnZWRfY29udGV4dCA9IE5VTEw7CiAJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDtzaG1lbSYjMzQ7KSkgewogCQlzaG1lbV9vcHMgPSAmYW1wO19fc2htZW1fb3BzOwotCQlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpCiYjNDM7CQlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgJmFtcDsmYW1wOyAhbXRocF9jb250ZXh0X2ltcGxpZWQpCiAJCQl1c2FnZSgpOwomIzQzOwkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMOwogCX0gZWxzZSB7CiAJCXVzYWdlKCk7CiAJfQpAQCAtMTMyMiw5ICYjNDM7MTY3MSwxNCBAQCBzdHJ1Y3QgdGVzdF9jYXNlIHsKIAlzdHJ1Y3QgbWVtX29wcyAqb3BzOwogCWNvbnN0IGNoYXIgKmRlc2M7CiAJdGVzdF9mbiBmbjsKJiM0MzsJaW50IG9yZGVyOwkJLyogbVRIUCBjb250ZXh0czogdGhlIGNvbGxhcHNlIG9yZGVyICovCiB9OwogCi0jZGVmaW5lIE1BWF9URVNUX0NBU0VTIDY0CiYjNDM7LyoKJiM0MzsgKiBFbm91Z2ggZm9yIGV2ZXJ5IGNhc2UgYXQgZXZlcnkgb3JkZXIgdGhlIGtlcm5lbCBvZmZlcnM6IHRoZSBtVEhQIGNvbnRleHQKJiM0MzsgKiBydW5zIGl0cyBjYXNlcyBvbmNlIHBlciBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIE1BWF9URVNUX0NBU0VTIDI1Ngogc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107CiBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7CiAKQEAgLTEzMzcsNiAmIzQzOzE2OTEsNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7CiAJCQkub3BzCT0gbywJCQkJCVwKIAkJCS5kZXNjCT0gI3QsCQkJCQlcCiAJCQkuZm4JPSB0LAkJCQkJXAomIzQzOwkJCS5vcmRlcgk9IGNvbGxhcHNlX29yZGVyLAkJCVwKIAkJfTsJCQkJCQkJXAogCX0JCQkJCQkJCVwKIAl9IHdoaWxlICgwKQpAQCAtMTM3Nyw4ICYjNDM7MTczMiw4MyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAKIAlwYXJzZV90ZXN0X3R5cGUoYXJnYywgYXJndik7CiAKJiM0MzsJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIG9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7CiYjNDM7CiYjNDM7CQlpZiAoY29sbGFwc2Vfb3JkZXJfZ2l2ZW4pIHsKJiM0MzsJCQkvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi8KJiM0MzsJCQlpZiAoY29sbGFwc2Vfb3JkZXIgJmd0Oz0gaHBhZ2VfcG1kX29yZGVyKQomIzQzOwkJCQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstYyB0YWtlcyBhbiBvcmRlciBiZWxvdyB0aGUgUE1EIG9yZGVyICglZClcbiYjMzQ7LAomIzQzOwkJCQkJCSAgIGhwYWdlX3BtZF9vcmRlcik7CiYjNDM7CQkJaWYgKCEob3JkZXJzICZhbXA7ICgxVUwgJmx0OyZsdDsgY29sbGFwc2Vfb3JkZXIpKSkKJiM0MzsJCQkJa3NmdF9leGl0X3NraXAoJiMzNDtPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcbiYjMzQ7LAomIzQzOwkJCQkJICAgICAgIGNvbGxhcHNlX29yZGVyKTsKJiM0MzsJCQlpZiAoY29sbGFwc2Vfb3JkZXIgJmx0Oz0gYW5vbl9vcmRlcikKJiM0MzsJCQkJa3NmdF9leGl0X3NraXAoJiMzNDstYyAlZCBuZWVkcyBhIHNvdXJjZSBvcmRlciBiZWxvdyBpdCwgLXMgc2F5cyAlZFxuJiMzNDssCiYjNDM7CQkJCQkgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpOwomIzQzOwkJCWNvbGxhcHNlX29yZGVyc1tucl9jb2xsYXBzZV9vcmRlcnMmIzQzOyYjNDM7XSA9IGNvbGxhcHNlX29yZGVyOwomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQkvKgomIzQzOwkJCSAqIE90aGVyd2lzZSBldmVyeSBvcmRlciBhIGNvbGxhcHNlIGNvdWxkIHByb2R1Y2UuICAtcwomIzQzOwkJCSAqIG1ha2VzIHRoZSBmYXVsdCBwYXRoIGhhbmQgb3V0IGZvbGlvcyBvZiB0aGF0IG9yZGVyLAomIzQzOwkJCSAqIHNvIGEgdGFyZ2V0IGF0IG9yIGJlbG93IGl0IGhhcyBub3RoaW5nIHRvIGNvbGxhcHNlOgomIzQzOwkJCSAqIHRoZSBzb3VyY2VzIGFyZSBhbHJlYWR5IHRoZSBzaXplIGJlaW5nIGFza2VkIGZvci4KJiM0MzsJCQkgKi8KJiM0MzsJCQlpbnQgZmlyc3QgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciAmIzQzOyAxIDogTUlOX01USFBfT1JERVI7CiYjNDM7CiYjNDM7CQkJaWYgKGZpcnN0ICZsdDsgTUlOX01USFBfT1JERVIpCiYjNDM7CQkJCWZpcnN0ID0gTUlOX01USFBfT1JERVI7CiYjNDM7CQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpICZsdDsgaHBhZ2VfcG1kX29yZGVyOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCQlpZiAob3JkZXJzICZhbXA7ICgxVUwgJmx0OyZsdDsgaSkpCiYjNDM7CQkJCQljb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzJiM0MzsmIzQzO10gPSBpOwomIzQzOwkJCX0KJiM0MzsJCQlpZiAoIW5yX2NvbGxhcHNlX29yZGVycykKJiM0MzsJCQkJa3NmdF9wcmludF9tc2coJiMzNDttVEhQIGNhc2VzIHNraXBwZWQ6IG5vIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2VcbiYjMzQ7KTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHsKJiM0MzsJCXBhZ2VtYXBfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJCWlmIChwYWdlbWFwX2ZkICZsdDsgMCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcCkmIzM0Oyk7CiYjNDM7CQlrcGFnZWZsYWdzX2ZkID0gb3BlbigmIzM0Oy9wcm9jL2twYWdlZmxhZ3MmIzM0OywgT19SRE9OTFkpOwomIzQzOwkJaWYgKGtwYWdlZmxhZ3NfZmQgJmx0OyAwKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O29wZW4oL3Byb2Mva3BhZ2VmbGFncykmIzM0Oyk7CiYjNDM7CX0KJiM0MzsKIAlzZXRidWYoc3Rkb3V0LCBOVUxMKTsKIAomIzQzOwkvKgomIzQzOwkgKiBUaGUgcGFnZSBjYWNoZSBjYXBzIGZvbGlvIG9yZGVyIGF0IE1BWF9QQUdFQ0FDSEVfT1JERVIsIHdoaWNoCiYjNDM7CSAqIHhhc19zcGxpdF9hbGxvYygpIHB1dHMgYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy4KJiM0MzsJICogQSBQTUQtc2l6ZWQgcGFnZSBjYWNoZSBmb2xpbyBpcyB0aGVuIGltcG9zc2libGUsIHNvIHRoZSBrZXJuZWwKJiM0MzsJICogcmVmdXNlcyB0aGVzZSBjb2xsYXBzZXMgYnkgZGVzaWduIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuCiYjNDM7CSAqCiYjNDM7CSAqIFRoZSBjYXAgaXMgb25lIGdsb2JhbCwgc28gaXQgcnVsZXMgb3V0IGV2ZXJ5IGZpbGUgbWFwcGluZywgbm90IGp1c3QKJiM0MzsJICogc2htZW06IHNobWVtX2h1Z2VfZ2xvYmFsX2VuYWJsZWQoKSBkcm9wcyB0aGUgUE1EIG9yZGVyIGZyb20gd2hhdCBpdAomIzQzOwkgKiBhbGxvd3MsIGFuZCBmaWxlX3RocF9lbmFibGVkKCkgcmVmdXNlcyBhIHJlZ3VsYXIgZmlsZSB3aG9zZSBtYXBwaW5nCiYjNDM7CSAqIGNhbm5vdCBob2xkIGEgUE1EIGZvbGlvLgomIzQzOwkgKgomIzQzOwkgKiBUaGUgcGVyLW9yZGVyIHNobWVtX2VuYWJsZWQgY29udHJvbCBiZWxvdyBpcyB3aGF0IG1ha2VzIHRoZSBjYXAKJiM0MzsJICogcmVhZGFibGU6IGl0IGlzIGNyZWF0ZWQgZm9yIHRoZSBvcmRlcnMgaW4gVEhQX09SREVSU19BTExfRklMRV9ERUZBVUxULAomIzQzOwkgKiB3aGljaCBpcyB0aGUgY2FwIGFuZCBub3RoaW5nIGVsc2UsIHNvIHdoZXRoZXIgdGhlIFBNRCBvcmRlciBoYXMgb25lCiYjNDM7CSAqIGFuc3dlcnMgZm9yIGEgcmVndWxhciBmaWxlIGFzIG11Y2ggYXMgZm9yIHNobWVtLgomIzQzOwkgKi8KJiM0MzsJaWYgKCEodGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IGhwYWdlX3BtZF9vcmRlcikpKSB7CiYjNDM7CQlpZiAoc2htZW1fb3BzKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cbiYjMzQ7KTsKJiM0MzsJCQlzaG1lbV9vcHMgPSBOVUxMOwomIzQzOwkJfQomIzQzOwkJaWYgKHJlYWRfb25seV9maWxlX29wcykgewomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7bm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcbiYjMzQ7KTsKJiM0MzsJCQlyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMOwomIzQzOwkJCXJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7CiYjNDM7CQkJcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQlpZiAoIWFub25fb3BzICZhbXA7JmFtcDsgIXNobWVtX29wcyAmYW1wOyZhbXA7ICFyZWFkX29ubHlfZmlsZV9vcHMpCiYjNDM7CQkJa3NmdF9leGl0X3NraXAoJiMzNDtOb3RoaW5nIGxlZnQgdG8gY29sbGFwc2UgaW50b1xuJiMzNDspOwomIzQzOwl9CiYjNDM7CiAJZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxOwogCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODsKIAlkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjsKQEAgLTEzOTYsNyAmIzQzOzE4MjYsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgbnJfY29sbGFwc2Vfb3JkZXJzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07CiYjNDM7CQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwomIzQzOwkJVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CX0KJiM0MzsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTQwNCwxMCAmIzQzOzE4NDQsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJVEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7CiAKIAlURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCi0JVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKIAogCVRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7CkBAIC0xNDYzLDYgJiM0MzsxOTAxLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKIAlURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTQ3OCw3ICYjNDM7MTkxOSwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBucl90ZXN0X2Nhc2VzOyBpJiM0MzsmIzQzOykgewogCQlzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gJmFtcDt0ZXN0X2Nhc2VzW2ldOwogCi0JCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXG4mIzM0OywgdC0mZ3Q7ZGVzYywgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJaWYgKHQtJmd0O2N0eCA9PSAmYW1wO19fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHsKJiM0MzsJCQljb2xsYXBzZV9vcmRlciA9IHQtJmd0O29yZGVyOwomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMsIG9yZGVyICVkKVxuJiMzNDssCiYjNDM7CQkJCSAgICAgICB0LSZndDtkZXNjLCB0LSZndDtjdHgtJmd0O25hbWUsIHQtJmd0O29wcy0mZ3Q7bmFtZSwKJiM0MzsJCQkJICAgICAgIHQtJmd0O29yZGVyKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtcbiMgUnVuIHRlc3Q6ICVzICglczolcylcbiYjMzQ7LCB0LSZndDtkZXNjLAomIzQzOwkJCQkgICAgICAgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJfQogCQl0LSZndDtmbih0LSZndDtjdHgsIHQtJmd0O29wcyk7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjM2MDFjMDMwZDQzZTUKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYwpAQCAtMCwwICYjNDM7MSw2MTAgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICoga2h1Z2VwYWdlZCByYWNlIGhhcm5lc3MuCiYjNDM7ICoKJiM0MzsgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGlucwomIzQzOyAqIChndXBfdGVzdCksIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRCBvdmVyIHRoZSBzYW1lIHJhbmdlcywgaW4KJiM0MzsgKiBvbmUgb2YgdGhyZWUgZHJpdmVyIG1vZGVzOgomIzQzOyAqCiYjNDM7ICogICBzdGVwcGVkCWtodWdlcGFnZWQsIG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lIHRocm91Z2gKJiM0MzsgKgkJa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSwgc28gYSBzdGVwIGNvdmVycyBhIGtub3duIGV4dGVudDsKJiM0MzsgKiAgIGZyZWUJa2h1Z2VwYWdlZCBsZWZ0IHRvIHJ1biAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCksIGZvciBzb2FrOwomIzQzOyAqICAgbWFkdmlzZQlNQURWX0NPTExBUFNFIGluIGEgbG9vcC4KJiM0MzsgKgomIzQzOyAqIEFsbCBhbm9uIFRIUCBvcmRlcnMgYXJlIGVuYWJsZWQgKGluaGVyaXQpLiAgT2NjdXBhbmN5IHJ1bnMgYXQgYm90aCBlbmRzCiYjNDM7ICogb2Ygd2hhdCBtVEhQIGNvbGxhcHNlIHN1cHBvcnRzOiBtYXhfcHRlc19ub25lIDAsIHdoZXJlIGEgd2luZG93IG11c3QgYmUKJiM0MzsgKiBmdWxseSBwb3B1bGF0ZWQsIGFuZCBIUEFHRV9QTURfTlIgLSAxLCB3aGVyZSBhIHdpbmRvdyBmdWxsIG9mIGhvbGVzCiYjNDM7ICogY29sbGFwc2VzIHRvby4gIFRoZSBob2xlcyBhcmUgbm90IGNvcGllZCBmcm9tIGFueXdoZXJlIC0tIHRoZXkgYXJlCiYjNDM7ICogemVyby1maWxsZWQsIGFuZCByZS1jaGVja2VkIHVuZGVyIHRoZSBwYWdlIHRhYmxlIGxvY2sgYXQgaW5zdGFsbCB0aW1lIGluCiYjNDM7ICogY2FzZSBhIHJhY2luZyBmYXVsdCBnb3QgdGhlcmUgZmlyc3QuCiYjNDM7ICoKJiM0MzsgKiAtcCBhZGRzIG1lbW9yeSBwcmVzc3VyZSB0byBhbnkgb2YgdGhlIGFib3ZlOiBNQURWX1BBR0VPVVQgY3ljbGluZwomIzQzOyAqIG9uIGEgZGVkaWNhdGVkIG5laWdoYm9yIHJlZ2lvbiAoc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm47IHNraXBwZWQKJiM0MzsgKiB3aXRoIGEgbm90ZSB3aGVuIHRoZSBob3N0IGhhcyBubyBzd2FwKSBhbmQgYSBjb21wYWN0X21lbW9yeSB0cmlnZ2VyCiYjNDM7ICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UmIzM5O3MgZnJlZXplCiYjNDM7ICogd2l0aCByZWZjb3VudCBlbGV2YXRpb24gYW5kIG1pZ3JhdGlvbiBlbnRyaWVzIG9mIGl0cyBvd24pLgomIzQzOyAqCiYjNDM7ICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yCiYjNDM7ICogemVybyAoTUFEVl9ET05UTkVFRCksIG5ldmVyIGFueXRoaW5nIGVsc2UuICBUaGUgZmF1bHRlcnMgYW5kIHRoZSBmb3JrCiYjNDM7ICogY2hpbGRyZW4gY2hlY2sgdGhhdCBjb250aW51b3VzbHksIGEgZmluYWwgc3dlZXAgY2hlY2tzIGl0IG9uY2UgbW9yZSwgcGx1cwomIzQzOyAqIHdoYXRldmVyIERFQlVHX1ZNIC8gcGFnZV90YWJsZV9jaGVjayAvIEtBU0FOIC8gbG9ja2RlcCByZXBvcnQgaW4KJiM0MzsgKiBkbWVzZywgd2hpY2ggdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBpbnNwZWN0LgomIzQzOyAqLwomIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0UKJiM0MzsjaW5jbHVkZSAmbHQ7ZXJybm8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7cHRocmVhZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzZWxmdGVzdC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtX3V0aWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0Oy4uLy4uLy4uLy4uL21tL2d1cF90ZXN0LmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgQkFTRV9BRERSCSgodm9pZCAqKSgxVUwgJmx0OyZsdDsgMzApKQomIzQzOwomIzQzOy8qCiYjNDM7ICogU2hhcmVkIHBsYXlncm91bmQgZm9yIGZhdWx0cy9waW5zL2ZvcmsvZG9udG5lZWQ6IHNldmVyYWwgUE1ELXNpemVkCiYjNDM7ICogYXJlYXMgdGhlIHJhY2luZyB0aHJlYWRzIHNwcmVhZCBhY3Jvc3MsIHBsdXMgb25lIGFyZWEgb3duZWQgYnkgdGhlCiYjNDM7ICogbXJlbWFwIHRocmVhZC4gTW9yZSBhcmVhcyBtZWFucyBtb3JlIGluZGVwZW5kZW50IHJlZ2lvbnMgY29sbGFwc2luZwomIzQzOyAqIGF0IG9uY2U7IHRoZSBkZWZhdWx0IHN1aXRzIGEgbm9ybWFsIG1hY2hpbmUuIE9uIGEgbWVtb3J5LWNvbnN0cmFpbmVkCiYjNDM7ICogaG9zdCAtLSBvciB1bmRlciBlbXVsYXRpb24sIHdoZXJlIGEgNTEyTSBQTUQgKGFybTY0LzY0SykgbWFrZXMgdGhlCiYjNDM7ICogZGVmYXVsdCBwbGF5Z3JvdW5kIG11bHRpLWdpZ2FieXRlIC0tIHBhc3MgLWEgdG8gc2hyaW5rIGl0LgomIzQzOyAqLwomIzQzOyNkZWZpbmUgREVGQVVMVF9TSEFSRURfQVJFQVMJMwomIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzOwomIzQzO3N0YXRpYyBpbnQgbnJfYXJlYXM7CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplOwomIzQzO3N0YXRpYyBjaGFyICpyZWdpb247CQkvKiBOUl9BUkVBUyAqIGhwYWdlX3BtZF9zaXplICovCiYjNDM7c3RhdGljIGNoYXIgKm1yZW1hcF9hcmVhOwkvKiByZWdpb24gJiM0MzsgTlJfU0hBUkVEX0FSRUFTIGFyZWFzICovCiYjNDM7c3RhdGljIGNoYXIgKm1yZW1hcF9zY3JhdGNoOwkvKiB3ZWxsIGFib3ZlIHRoZSByZWdpb24gKi8KJiM0MztzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhOwkvKiAtcDogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqLwomIzQzO3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplOwomIzQzO3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7CiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBzdG9wOwomIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkOwomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHZhbCA9ICh1bnNpZ25lZCBpbnQpcGFnZV9pZHggKiAyNjU0NDM1NzYxVTsKJiM0MzsKJiM0MzsJcmV0dXJuIHZhbCA/IHZhbCA6IDE7CS8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqLwomIzQzO30KJiM0MzsKJiM0MzsvKiBaZXJvIG1lYW5zIG5ldmVyIHdyaXR0ZW47IGFueXRoaW5nIGVsc2UgbXVzdCBiZSB0aGlzIHBhZ2UmIzM5O3MgcGF0dGVybiAqLwomIzQzO3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbCkKJiM0Mzt7CiYjNDM7CSp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpOwomIzQzOwomIzQzOwlyZXR1cm4gKnZhbCAmYW1wOyZhbXA7ICp2YWwgIT0gcGF0dGVybihwYWdlX2lkeCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCB2YWw7CiYjNDM7CiYjNDM7CWlmIChwYWdlX2lzX2NvcnJ1cHQocGFnZV9pZHgsICZhbXA7dmFsKSkgewomIzQzOwkJY29ycnVwdGVkID0gMTsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxuJiMzNDssCiYjNDM7CQkJICAgICAgIHBhZ2VfaWR4LCB2YWwsIHBhdHRlcm4ocGFnZV9pZHgpKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUGFnZXMgbGVmdCBmcm9tIEBwYWdlX2lkeCwgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJiMzOTtzIGFyZWEgKi8KJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBsZWZ0ID0gc2hhcmVkX3BhZ2VzKCkgLSBwYWdlX2lkeDsKJiM0MzsKJiM0MzsJcmV0dXJuIHdhbnQgJmx0OyBsZWZ0ID8gd2FudCA6IGxlZnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsKJiM0MzsJCWlmIChyYW5kX3IoJmFtcDtzZWVkKSAmYW1wOyAxKQomIzQzOwkJCSoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPQomIzQzOwkJCQlwYXR0ZXJuKHBhZ2VfaWR4KTsKJiM0MzsJCWVsc2UKJiM0MzsJCQljaGVja19wYWdlKHBhZ2VfaWR4KTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgJmx0OyZsdDsgKHJhbmRfcigmYW1wO3NlZWQpICUgNik7CS8qIDEuLjMyIHBhZ2VzICovCiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYSB6YXAKJiM0MzsJCSAqIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZSByZWNsYWltCiYjNDM7CQkgKiAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSB0aGUgdGFibGUgdW5kZXIgYQomIzQzOwkJICogY29sbGFwc2UgdGhhdCBpcyBtaWR3YXkgdGhyb3VnaCBpdC4gIFN1Yi10YWJsZSB6YXBzIG5ldmVyCiYjNDM7CQkgKiByZWFjaCB0aGF0IHBhdGguCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghKHJhbmRfcigmYW1wO3NlZWQpICUgNjQpKSB7CiYjNDM7CQkJdW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggLwomIzQzOwkJCQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJCQltYWR2aXNlKHJlZ2lvbiAmIzQzOyBhcmVhICogaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJbWFkdmlzZShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUsCiYjNDM7CQkJCXJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLAomIzQzOwkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0KJiM0MzsJCXVzbGVlcChyYW5kX3IoJmFtcDtzZWVkKSAlIDUwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJc3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9OwomIzQzOwkJdW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZSgmYW1wO3NlZWQpOwomIzQzOwomIzQzOwkJdW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpOwomIzQzOwomIzQzOwkJZ3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTsKJiM0MzsJCWd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7CiYjNDM7CQlndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjsKJiM0MzsJCWd1cC5ndXBfZmxhZ3MgPSAxOwkvKiBGT0xMX1dSSVRFICovCiYjNDM7CQkvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovCiYjNDM7CQlpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgJmFtcDtndXApOwomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQlwaWRfdCBwaWQgPSBmb3JrKCk7CiYjNDM7CiYjNDM7CQlpZiAocGlkID09IDApIHsKJiM0MzsJCQl1bnNpZ25lZCBpbnQgdmFsOwomIzQzOwkJCWludCBiYWQgPSAwOwomIzQzOwomIzQzOwkJCS8qCiYjNDM7CQkJICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaGF2ZSBoZWxkCiYjNDM7CQkJICogc3Rkb3V0JiMzOTtzIGxvY2sgd2hlbiB3ZSBmb3JrZWQsIGFuZCBwcmludGluZyB1bmRlciBhbgomIzQzOwkJCSAqIGluaGVyaXRlZCBsb2NrIGhhbmdzLiAgVGhlIHBhcmVudCByZXBvcnRzIHdoYXQgdGhlCiYjNDM7CQkJICogZXhpdCBzdGF0dXMgc2F5cy4KJiM0MzsJCQkgKi8KJiM0MzsJCQlmb3IgKGludCBpID0gMDsgaSAmbHQ7IDE2OyBpJiM0MzsmIzQzOykKJiM0MzsJCQkJYmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoJmFtcDtzZWVkKSwgJmFtcDt2YWwpOwomIzQzOwkJCV9leGl0KGJhZCk7CiYjNDM7CQl9CiYjNDM7CQlpZiAocGlkICZndDsgMCkgewomIzQzOwkJCWludCB3c3RhdHVzOwomIzQzOwomIzQzOwkJCWlmICh3YWl0cGlkKHBpZCwgJmFtcDt3c3RhdHVzLCAwKSAmbHQ7IDApCiYjNDM7CQkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O3dhaXRwaWQoKSYjMzQ7KTsKJiM0MzsJCQkvKiBBIGNoaWxkIGtpbGxlZCBvbiB0aGUgcmVhZCBjb3VudHMgdG9vLCBub3QganVzdCBpdHMgZXhpdCBjb2RlLiAqLwomIzQzOwkJCWlmICghV0lGRVhJVEVEKHdzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHdzdGF0dXMpKQomIzQzOwkJCQljb3JydXB0ZWQgPSAxOwomIzQzOwkJfQomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJdm9pZCAqcDsKJiM0MzsKJiM0MzsJCXAgPSBtcmVtYXAobXJlbWFwX2FyZWEsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpOwomIzQzOwkJaWYgKHAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttcmVtYXAoKSBhd2F5JiMzNDspOwomIzQzOwkJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyA4OyBpJiM0MzsmIzQzOykKJiM0MzsJCQltcmVtYXBfc2NyYXRjaFsocmFuZF9yKCZhbXA7c2VlZCkgJQomIzQzOwkJCQkoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxOwomIzQzOwkJcCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCSAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7CiYjNDM7CQlpZiAocCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21yZW1hcCgpIGJhY2smIzM0Oyk7CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiAtcDogc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm4gb24gYSByZWdpb24gb2Ygb3VyIG93bi4gVGhlIGNvbnRlbnQKJiM0MzsgKiBjaGVjayBpcyBleGFjdDogYSBwYWdlIG91dCBhbmQgYmFjayB0aHJvdWdoIHN3YXAgbXVzdCBwcmVzZXJ2ZSB0aGUKJiM0MzsgKiBwYXR0ZXJuLCBhbmQgbm90aGluZyBlbHNlIGV2ZXIgd3JpdGVzIGhlcmUuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgKnBhZ2VvdXRfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCSoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzOyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJbWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBuciAmYW1wOyZhbXA7ICFzdG9wOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCXVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgJiM0MzsKJiM0MzsJCQkJCQkJICAgICBpICogcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJCQlpZiAodmFsICE9IHBhdHRlcm4oaSkpIHsKJiM0MzsJCQkJY29ycnVwdGVkID0gMTsKJiM0MzsJCQkJa3NmdF9wcmludF9tc2coJiMzNDtQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcbiYjMzQ7LAomIzQzOwkJCQkJICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qIC1wOiBjb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIG91dCBmcm9tIHVuZGVyIHVzLiAqLwomIzQzO3N0YXRpYyB2b2lkICpjb21wYWN0b3JfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CWludCBmZCA9IG9wZW4oJiMzNDsvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnkmIzM0OywgT19XUk9OTFkpOwomIzQzOwomIzQzOwlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O05vIGNvbXBhY3RfbWVtb3J5OyBjb21wYWN0b3IgaWRsZVxuJiMzNDspOwomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CX0KJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQlpZiAod3JpdGUoZmQsICYjMzQ7MSYjMzQ7LCAxKSAmbHQ7IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl1c2xlZXAoMTAwMDAgJiM0MzsgcmFuZF9yKCZhbXA7c2VlZCkgJSAxMDAwMDApOwomIzQzOwl9CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHN3YXBfYXZhaWxhYmxlKHZvaWQpCiYjNDM7ewomIzQzOwljaGFyIGxpbmVbMjU2XTsKJiM0MzsJaW50IGxpbmVzID0gMDsKJiM0MzsJRklMRSAqZnAgPSBmb3BlbigmIzM0Oy9wcm9jL3N3YXBzJiMzNDssICYjMzQ7ciYjMzQ7KTsKJiM0MzsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKQomIzQzOwkJbGluZXMmIzQzOyYjNDM7OwomIzQzOwlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gbGluZXMgJmd0OyAxOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aW1ldmFsIHR2OwomIzQzOwomIzQzOwlnZXR0aW1lb2ZkYXkoJmFtcDt0diwgTlVMTCk7CiYjNDM7CXJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgJiM0MzsgdHYudHZfdXNlYyAvIDEwMDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCiYjNDM7ewomIzQzOwlmcHJpbnRmKHN0ZGVyciwKJiM0MzsJCSYjMzQ7VXNhZ2U6IGtodWdlcGFnZWRfcmFjZSBbLWQgc2Vjb25kc10gWy1tIHN0ZXBwZWR8ZnJlZXxtYWR2aXNlXSBbLXpdIFstcF0gWy1hIGFyZWFzXVxuJiMzNDsKJiM0MzsJCSYjMzQ7XHRXaXRob3V0IC1tLCBldmVyeSBtb2RlIHJ1bnMgaW4gdHVybi5cbiYjMzQ7CiYjNDM7CQkmIzM0O1x0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcbiYjMzQ7CiYjNDM7CQkmIzM0O1x0Qm90aCBvY2N1cGFuY3kgbGltaXRzIHJ1biB1bmxlc3MgLXogYXNrcyBmb3IgaG9sZXMgb25seS5cbiYjMzQ7CiYjNDM7CQkmIzM0O1x0LXo6IG9ubHkgbWF4X3B0ZXNfbm9uZSA9IEhQQUdFX1BNRF9OUiAtIDEgKGhvbGUtaGVhdnkpXG4mIzM0OwomIzQzOwkJJiMzNDtcdFJ1bnMgd2l0aCBhbmQgd2l0aG91dCBtZW1vcnkgcHJlc3N1cmUgdW5sZXNzIC1wIGFza3MgZm9yXG4mIzM0OwomIzQzOwkJJiMzNDtcdHByZXNzdXJlIG9ubHkuXG4mIzM0OwomIzQzOwkJJiMzNDtcdC1wOiBvbmx5IHdpdGggdGhlIHBhZ2VvdXQgYW5kIGNvbXBhY3Rpb24gdGhyZWFkc1xuJiMzNDsKJiM0MzsJCSYjMzQ7XHQtYTogbnVtYmVyIG9mIHNoYXJlZCBQTUQtc2l6ZWQgcGxheWdyb3VuZCBhcmVhcyAoZGVmYXVsdCAzKVxuJiMzNDspOwomIzQzOwlleGl0KDEpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiYjNDM7ewomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRocmVhZF9uYW1lc1tdID0gewomIzQzOwkJJiMzNDtmYXVsdGVyJiMzNDssICYjMzQ7ZmF1bHRlcjImIzM0OywgJiMzNDtkb250bmVlZCYjMzQ7LCAmIzM0O3Bpbm5lciYjMzQ7LCAmIzM0O2ZvcmtlciYjMzQ7LAomIzQzOwkJJiMzNDttcmVtYXBwZXImIzM0OywgJiMzNDtwYWdlb3V0JiMzNDssICYjMzQ7Y29tcGFjdG9yJiMzNDssCiYjNDM7CX07CiYjNDM7CXZvaWQgKigqY29uc3QgdGhyZWFkX2Zuc1tdKSh2b2lkICopID0gewomIzQzOwkJZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLAomIzQzOwkJbXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sCiYjNDM7CX07CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgcGFnZW91dF9iaXQgPSAxVUwgJmx0OyZsdDsgNiwgY29tcGFjdG9yX2JpdCA9IDFVTCAmbHQ7Jmx0OyA3OwomIzQzOwljb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTsKJiM0MzsJcHRocmVhZF90IHRocmVhZHNbQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpXTsKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgJiMzNDtzdGVwcGVkJiMzNDssICYjMzQ7ZnJlZSYjMzQ7LCAmIzM0O21hZHZpc2UmIzM0OyB9OwomIzQzOwlzdGF0aWMgY29uc3QgaW50IGFsbF9ub25lc1tdID0geyAwLCAxIH07CS8qIHN0cmljdCwgaG9sZXMgKi8KJiM0MzsJc3RhdGljIGNvbnN0IGludCBhbGxfcHJlc3NbXSA9IHsgMCwgMSB9OwkvKiBxdWlldCwgdW5kZXIgcHJlc3N1cmUgKi8KJiM0MzsJY29uc3QgaW50ICpub25lcyA9IGFsbF9ub25lczsKJiM0MzsJY29uc3QgaW50ICpwcmVzcyA9IGFsbF9wcmVzczsKJiM0MzsJaW50IG5yX25vbmVzID0gQVJSQVlfU0laRShhbGxfbm9uZXMpOwomIzQzOwlpbnQgbnJfcHJlc3MgPSBBUlJBWV9TSVpFKGFsbF9wcmVzcyk7CiYjNDM7CWNvbnN0IGNoYXIgKm9uZV9tb2RlWzFdOwomIzQzOwljb25zdCBjaGFyICogY29uc3QgKm1vZGVzID0gYWxsX21vZGVzOwomIzQzOwlpbnQgbnJfbW9kZXMgPSBBUlJBWV9TSVpFKGFsbF9tb2Rlcyk7CiYjNDM7CWNvbnN0IGNoYXIgKm1vZGVfYXJnID0gTlVMTDsKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJdW5zaWduZWQgbG9uZyBlbmRfbXM7CiYjNDM7CWludCBkdXJhdGlvbl9zID0gNTsKJiM0MzsJdW5zaWduZWQgbG9uZyB0aHJlYWRfbWFzayA9IH4wVUw7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYmFzZV9tYXNrOwomIzQzOwlpbnQgbnJfYXJlYXNfYXJnID0gMDsKJiM0MzsJYm9vbCBob2xlc19vbmx5ID0gZmFsc2U7CiYjNDM7CWJvb2wgcHJlc3N1cmVfb25seSA9IGZhbHNlOwomIzQzOwl1bnNpZ25lZCBsb25nIGk7CiYjNDM7CWludCBzdGVwcyA9IDA7CiYjNDM7CWludCBvcHQ7CiYjNDM7CiYjNDM7CXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICYjMzQ7YTpkOm06dDp6cGgmIzM0OykpICE9IC0xKSB7CiYjNDM7CQlzd2l0Y2ggKG9wdCkgewomIzQzOwkJY2FzZSAmIzM5O2EmIzM5OzoKJiM0MzsJCQlucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7ZCYjMzk7OgomIzQzOwkJCWR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7bSYjMzk7OgomIzQzOwkJCW1vZGVfYXJnID0gb3B0YXJnOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3QmIzM5OzoKJiM0MzsJCQkvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqLwomIzQzOwkJCXRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3omIzM5OzoKJiM0MzsJCQlob2xlc19vbmx5ID0gdHJ1ZTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgJiMzOTtwJiMzOTs6CiYjNDM7CQkJcHJlc3N1cmVfb25seSA9IHRydWU7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCXVzYWdlKCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKGhvbGVzX29ubHkpIHsKJiM0MzsJCW5vbmVzID0gYWxsX25vbmVzICYjNDM7IDE7CiYjNDM7CQlucl9ub25lcyA9IDE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKHByZXNzdXJlX29ubHkpIHsKJiM0MzsJCXByZXNzID0gYWxsX3ByZXNzICYjNDM7IDE7CiYjNDM7CQlucl9wcmVzcyA9IDE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG1vZGVfYXJnKSB7CiYjNDM7CQlpZiAoc3RyY21wKG1vZGVfYXJnLCAmIzM0O3N0ZXBwZWQmIzM0OykgJmFtcDsmYW1wOyBzdHJjbXAobW9kZV9hcmcsICYjMzQ7ZnJlZSYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgc3RyY21wKG1vZGVfYXJnLCAmIzM0O21hZHZpc2UmIzM0OykpCiYjNDM7CQkJdXNhZ2UoKTsKJiM0MzsJCW9uZV9tb2RlWzBdID0gbW9kZV9hcmc7CiYjNDM7CQltb2RlcyA9IG9uZV9tb2RlOwomIzQzOwkJbnJfbW9kZXMgPSAxOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfaGVhZGVyKCk7CiYjNDM7CWlmICghdGhwX2F2YWlsYWJsZSgpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxuJiMzNDspOwomIzQzOwomIzQzOwlwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOwomIzQzOwlocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7CiYjNDM7CWlmICghaHBhZ2VfcG1kX3NpemUpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJZ3VwX2ZkID0gb3BlbigmIzM0Oy9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0JiMzNDssIE9fUkRXUik7CiYjNDM7CWlmIChndXBfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCByZXF1aXJlcyBDT05GSUdfR1VQX1RFU1QgYW5kIHJvb3RcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJbnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnICZndDsgMCA/IG5yX2FyZWFzX2FyZyA6IERFRkFVTFRfU0hBUkVEX0FSRUFTOwomIzQzOwlucl9hcmVhcyA9IG5yX3NoYXJlZF9hcmVhcyAmIzQzOyAxOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZAomIzQzOwkgKiBNUkVNQVBfRklYRUQgdW5tYXBzIHdoYXRldmVyIGlzIGluIHRoZSB3YXkgd2l0aG91dCBzYXlpbmcgc28uICBDbGFpbQomIzQzOwkgKiB0aGUgYWRkcmVzcyBoZXJlLCBzbyBhIGxheW91dCB0aGF0IGRvZXMgbm90IG1hdGNoIHRoaXMgYXNzdW1wdGlvbgomIzQzOwkgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZQomIzQzOwkgKiBwcm9jZXNzIG1hcHMgdGhpcyBsb3c6IHRocmVhZCBzdGFja3MgYW5kIG1hbGxvYyBhcmVuYXMgY29tZSBmcm9tIHRoZQomIzQzOwkgKiB0b3AtZG93biBtbWFwIGFyZWEsIHdlbGwgYWJvdmUuCiYjNDM7CSAqLwomIzQzOwltcmVtYXBfc2NyYXRjaCA9IChjaGFyICopQkFTRV9BRERSICYjNDM7IDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplOwomIzQzOwlpZiAobW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIFBST1RfTk9ORSwKJiM0MzsJCSBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLAomIzQzOwkJIC0xLCAwKSAhPSAodm9pZCAqKW1yZW1hcF9zY3JhdGNoKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bW1hcCgpIG1yZW1hcCBzY3JhdGNoJiMzNDspOwomIzQzOwomIzQzOwliYXNlX21hc2sgPSB0aHJlYWRfbWFzazsKJiM0MzsJaWYgKCFzd2FwX2F2YWlsYWJsZSgpKQomIzQzOwkJLyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUuICovCiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O25vIHN3YXA6IHRoZSBwYWdlb3V0IHRocmVhZCBzdGF5cyBpZGxlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzKTsKJiM0MzsKJiM0MzsJdGhwX3NhdmVfc2V0dGluZ3MoKTsKJiM0MzsJdGhwX3JlYWRfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEEgYmFzZSBlbnRyeSBmb3IgdGhlIHN0YWNrLCBzbyB0aGF0IHRoZSBwb3AgYXQgdGhlIGVuZCBvZiBhIG1vZGUKJiM0MzsJICogYWx3YXlzIGhhcyBzb21ldGhpbmcgdG8gd3JpdGUgYmFjazogdGhwX3BvcF9zZXR0aW5ncygpIG9uIGFuIGVtcHR5CiYjNDM7CSAqIHN0YWNrIGhhcyBubyBzZXR0aW5ncyB0byBhcHBseSBhbmQgZ2l2ZXMgdXAuCiYjNDM7CSAqLwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJZm9yIChpbnQgcnVuID0gMDsgcnVuICZsdDsgbnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzOyBydW4mIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgcmVtID0gcnVuICUgKG5yX25vbmVzICogbnJfcHJlc3MpOwomIzQzOwkJY29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9ub25lcyAqIG5yX3ByZXNzKV07CiYjNDM7CQlib29sIGhvbGVzID0gbm9uZXNbcmVtIC8gbnJfcHJlc3NdOwomIzQzOwkJYm9vbCBwcmVzc3VyZSA9IHByZXNzW3JlbSAlIG5yX3ByZXNzXTsKJiM0MzsKJiM0MzsJCXRocmVhZF9tYXNrID0gYmFzZV9tYXNrOwomIzQzOwkJaWYgKCFwcmVzc3VyZSkKJiM0MzsJCQl0aHJlYWRfbWFzayAmYW1wOz0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpOwomIzQzOwkJZWxzZSBpZiAoIXN3YXBfYXZhaWxhYmxlKCkpCiYjNDM7CQkJdGhyZWFkX21hc2sgJmFtcDs9IH5wYWdlb3V0X2JpdDsKJiM0MzsKJiM0MzsJCXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwkJc2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTsKJiM0MzsJCXNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUzsKJiM0MzsJCXNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjsKJiM0MzsJCXNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTsKJiM0MzsJCXNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPQomIzQzOwkJCXN0cmNtcChtb2RlLCAmIzM0O2ZyZWUmIzM0OykgPyAxMDAwIDogMDsKJiM0MzsJCXNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gMTA7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogbVRIUCBjb2xsYXBzZSBvbmx5IHN1cHBvcnRzIHRoZSB0d28gZW5kcyBvZiB0aGUgb2NjdXBhbmN5CiYjNDM7CQkgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuCiYjNDM7CQkgKiBTdHJpY3QgbmVlZHMgYSBmdWxseSBwb3B1bGF0ZWQgd2luZG93LCB3aGljaCBpcyByYXJlIHVuZGVyCiYjNDM7CQkgKiByYWNpbmcgTUFEVl9ET05UTkVFRDsgaG9sZS1oZWF2eSB3aW5kb3dzIGNvbGxhcHNlIGluc3RlYWQsCiYjNDM7CQkgKiBzbyB0aGUgdHdvIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHMuCiYjNDM7CQkgKi8KJiM0MzsJCXNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhvbGVzID8KJiM0MzsJCQkoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpIC0gMSA6IDA7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPQomIzQzOwkJCW5yX2FyZWFzICogKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAqIDg7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgaSkpCiYjNDM7CQkJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7CiYjNDM7CQl9CiYjNDM7CQkvKiBQb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZGUsIGJlZm9yZSB0aGUgbmV4dCBvbmUuICovCiYjNDM7CQl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJCXJlZ2lvbiA9IG1tYXAoQkFTRV9BRERSLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCSAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfAomIzQzOwkJCSAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApOwomIzQzOwkJaWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bW1hcCgpIHBsYXlncm91bmQmIzM0Oyk7CiYjNDM7CQltcmVtYXBfYXJlYSA9IHJlZ2lvbiAmIzQzOyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsKJiM0MzsJCWlmICh0aHJlYWRfbWFzayAmYW1wOyBwYWdlb3V0X2JpdCkgewomIzQzOwkJCS8qCiYjNDM7CQkJICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3QKJiM0MzsJCQkgKiB0byBkb21pbmF0ZSBhIFRDRyBndWVzdDogNCBQTUQgYXJlYXMsIGNsYW1wZWQgdG8KJiM0MzsJCQkgKiBbMTZNLCA2NE1dLgomIzQzOwkJCSAqLwomIzQzOwkJCXBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsJCQlwYWdlb3V0X3NpemUgPSBwYWdlb3V0X3NpemUgJmx0OyAoMTZVTCAmbHQ7Jmx0OyAyMCkgPwomIzQzOwkJCQkgICAgICAgKDE2VUwgJmx0OyZsdDsgMjApIDoKJiM0MzsJCQkJICAgICAgIHBhZ2VvdXRfc2l6ZSAmZ3Q7ICg2NFVMICZsdDsmbHQ7IDIwKSA/CiYjNDM7CQkJCSAgICAgICAoNjRVTCAmbHQ7Jmx0OyAyMCkgOiBwYWdlb3V0X3NpemU7CiYjNDM7CQkJcGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsCiYjNDM7CQkJCQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCQkJCSAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTsKJiM0MzsJCQlpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSBwYWdlb3V0IGFyZWEmIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqLwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCQkqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpOwomIzQzOwkJbWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CQltYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAoISh0aHJlYWRfbWFzayAmYW1wOyAoMVVMICZsdDsmbHQ7IGkpKSkgewomIzQzOwkJCQl0aHJlYWRzW2ldID0gMDsKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJfQomIzQzOwkJCWlmIChwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sCiYjNDM7CQkJCQkgICAodm9pZCAqKShpICYjNDM7IDEpKSkKJiM0MzsJCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7cHRocmVhZF9jcmVhdGUoKSYjMzQ7KTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWVuZF9tcyA9IG5vd19tcygpICYjNDM7IGR1cmF0aW9uX3MgKiAxMDAwVUw7CiYjNDM7CQlpZiAoIXN0cmNtcChtb2RlLCAmIzM0O3N0ZXBwZWQmIzM0OykpIHsKJiM0MzsJCQl3aGlsZSAobm93X21zKCkgJmx0OyBlbmRfbXMgJmFtcDsmYW1wOyAhY29ycnVwdGVkKSB7CiYjNDM7CQkJCWlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoNjAwKSkKJiM0MzsJCQkJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O2todWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcbiYjMzQ7KTsKJiM0MzsJCQkJc3RlcHMmIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCAmIzM0O2ZyZWUmIzM0OykpIHsKJiM0MzsJCQl3aGlsZSAobm93X21zKCkgJmx0OyBlbmRfbXMgJmFtcDsmYW1wOyAhY29ycnVwdGVkKQomIzQzOwkJCQl1c2xlZXAoMTAwICogMTAwMCk7CiYjNDM7CQl9IGVsc2UgewkvKiBtYWR2aXNlICovCiYjNDM7CQkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkgewomIzQzOwkJCQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfc2hhcmVkX2FyZWFzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCQkJbWFkdmlzZShyZWdpb24gJiM0MzsgaSAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0NPTExBUFNFKTsKJiM0MzsJCQkJfQomIzQzOwkJCQltYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCQkJc3RlcHMmIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsKJiM0MzsJCXN0b3AgPSAxOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaWYgKHRocmVhZHNbaV0pCiYjNDM7CQkJCXB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCS8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi8KJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSYjNDM7JiM0MzspCiYjNDM7CQkJY2hlY2tfcGFnZShpKTsKJiM0MzsKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCwKJiM0MzsJCQkJICYjMzQ7JXMvJXMlczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxuJiMzNDssCiYjNDM7CQkJCSBtb2RlLCBob2xlcyA/ICYjMzQ7aG9sZXMmIzM0OyA6ICYjMzQ7c3RyaWN0JiMzNDssCiYjNDM7CQkJCSBwcmVzc3VyZSA/ICYjMzQ7L3ByZXNzdXJlJiMzNDsgOiAmIzM0OyYjMzQ7LAomIzQzOwkJCQkgZHVyYXRpb25fcywgc3RlcHMpOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIEhhbmQgdGhlIGFkZHJlc3Mgc3BhY2UgYW5kIHRoZSBzZXR0aW5ncyBiYWNrIGJlZm9yZSB0aGUKJiM0MzsJCSAqIG5leHQgbW9kZTogaXQgbWFwcyB0aGUgcmVnaW9uIGF0IHRoZSBzYW1lIGZpeGVkIGFkZHJlc3MsCiYjNDM7CQkgKiBhbmQgaXRzIHNjYW4gY2FkZW5jZSBkaWZmZXJzLgomIzQzOwkJICovCiYjNDM7CQltdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJCWlmIChwYWdlb3V0X2FyZWEpIHsKJiM0MzsJCQltdW5tYXAocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUpOwomIzQzOwkJCXBhZ2VvdXRfYXJlYSA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CQlzdG9wID0gMDsKJiM0MzsJCXN0ZXBzID0gMDsKJiM0MzsKJiM0MzsJCWlmIChjb3JydXB0ZWQpIHsKJiM0MzsJCQkvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZy4gKi8KJiM0MzsJCQl3aGlsZSAoJiM0MzsmIzQzO3J1biAmbHQ7IG5yX21vZGVzICogbnJfbm9uZXMgKiBucl9wcmVzcykgewomIzQzOwkJCQlyZW0gPSBydW4gJSAobnJfbm9uZXMgKiBucl9wcmVzcyk7CiYjNDM7CiYjNDM7CQkJCWtzZnRfdGVzdF9yZXN1bHRfc2tpcCgmIzM0OyVzLyVzJXM6IHNraXBwZWQgYWZ0ZXIgY29ycnVwdGlvblxuJiMzNDssCiYjNDM7CQkJCQkJICAgICAgbW9kZXNbcnVuIC8gKG5yX25vbmVzICogbnJfcHJlc3MpXSwKJiM0MzsJCQkJCQkgICAgICBub25lc1tyZW0gLyBucl9wcmVzc10gPwomIzQzOwkJCQkJCSAgICAgICYjMzQ7aG9sZXMmIzM0OyA6ICYjMzQ7c3RyaWN0JiMzNDssCiYjNDM7CQkJCQkJICAgICAgcHJlc3NbcmVtICUgbnJfcHJlc3NdID8KJiM0MzsJCQkJCQkgICAgICAmIzM0Oy9wcmVzc3VyZSYjMzQ7IDogJiMzNDsmIzM0Oyk7CiYjNDM7CQkJfQomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXRocF9yZXN0b3JlX3NldHRpbmdzKCk7CiYjNDM7CWtzZnRfZmluaXNoZWQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjMwZDNmYjUxOWZiMmMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYwpAQCAtMCwwICYjNDM7MSwyMTcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogU3luY2hyb25vdXMga2h1Z2VwYWdlZCBkcml2aW5nIGNoZWNrLgomIzQzOyAqCiYjNDM7ICogUmFjZSB0ZXN0cyBkcml2ZSBraHVnZXBhZ2VkIHRocm91Z2ggdGhlIGV4aXN0aW5nIHN5c2ZzIGNvbnRyb2xzOiBhCiYjNDM7ICogc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYW5kIGZ1bGxfc2NhbnMKJiM0MzsgKiBhZHZhbmNpbmcgYnkgdHdvIGlzIGEgY29tcGxldGlvbiBiYXJyaWVyIGZvciBvbmUgZnVsbCBwYXNzIHRoYXQKJiM0MzsgKiBzdGFydGVkIGFmdGVyIHNldHVwIChraHVnZXBhZ2VkX2Z1bGxfcGFzcygpKS4gVmVyaWZ5IHRoZSBwYWlyIGdpdmVzCiYjNDM7ICogZGV0ZXJtaW5pc3RpYywgYXR0cmlidXRhYmxlIHJlc3VsdHM6IG9uZSBiYXJyaWVyIHN0ZXAgb3ZlciBvbmUKJiM0MzsgKiBwcmVwYXJlZCB3aW5kb3cgcHJvZHVjZXMgZXhhY3RseSBvbmUgY29sbGFwc2UgYXR0ZW1wdCBvbiB0aGF0CiYjNDM7ICogd2luZG93JiMzOTtzIHNvdXJjZSBwYWdlcyAobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUgZXZlbnRzIGZpbHRlcmVkCiYjNDM7ICogYnkgc291cmNlIFBGTiBhbmQgb3JkZXIpIGFuZCB0aGUgd2luZG93IGlzIGNvbGxhcHNlZAomIzQzOyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuCiYjNDM7ICoKJiM0MzsgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBzZXQgdG8gNjBzIHRvIHByb3ZlIHRoZSB3YWtlIHBhdGg6IHdpdGhvdXQKJiM0MzsgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvdwomIzQzOyAqIHRoZSB0aW1lb3V0LiBJdCBhbHNvIGtlZXBzIHRoZSBkYWVtb24gZnJvbSBmcmVlLXJ1bm5pbmcgYmV0d2VlbgomIzQzOyAqIHN0ZXBzLCBwZXIgdGhlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZGlzY2lwbGluZS4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc2VsZnRlc3QuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCAmbHQ7Jmx0OyAzMCkpCiYjNDM7I2RlZmluZSBUQVJHRVRfT1JERVIgMgkvKiBzbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIGNvbnNpZGVycyAqLwomIzQzOyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1CiYjNDM7CiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkOwomIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDsKJiM0MztzdGF0aWMgaW50IHRyYWNlX2V2ZW50c19mZCA9IC0xOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplOwomIzQzOwomIzQzOy8qCiYjNDM7ICogRWFjaCBzdGVwIHN3aXRjaGVzIHRoZSBldmVudHMgb2ZmIGFnYWluLCBidXQgYSBoZWxwZXIgY2FuIHN0aWxsIGdpdmUgdXAKJiM0MzsgKiBvbiB1cyBpbiBiZXR3ZWVuIChhIGZhaWxpbmcgc3lzZnMgd3JpdGUgZW5kcyB0aGUgdGVzdCBmcm9tIGluc2lkZQomIzQzOyAqIHRocF93cml0ZV9udW0oKSksIGFuZCBodWdlX21lbW9yeSBldmVudHMgbGVmdCBvbiBhcmUgdGhlIHdob2xlIG1hY2hpbmUmIzM5O3MKJiM0MzsgKiBwcm9ibGVtLCBub3QgdGhpcyB0ZXN0JiMzOTtzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHRyYWNlX2V2ZW50c19vZmYodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICh0cmFjZV9ldmVudHNfZmQgJmd0Oz0gMCkKJiM0MzsJCXRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBDb3VudCBjb2xsYXBzZSBhdHRlbXB0cyBhdHRyaWJ1dGFibGUgdG8gb3VyIHdpbmRvdzogbGVnYWN5LWVuZ2luZQomIzQzOyAqIGlzb2xhdGUgZXZlbnRzIHdob3NlIHNjYW5fcGZuIGlzIG9uZSBvZiB0aGUgd2luZG93JiMzOTtzIHNvdXJjZSBQRk5zLAomIzQzOyAqIHBsdXMgYmF0Y2gtZW5naW5lIHBlci1jYW5kaWRhdGUgaW5zdGFsbCBldmVudHMgYXQgdGhlIHdpbmRvdyYjMzk7cwomIzQzOyAqIGFkZHJlc3MuIEVpdGhlciBlbmdpbmUgcmVwb3J0cyBleGFjdGx5IG9uY2UgcGVyIGF0dGVtcHQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLAomIzQzOwkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBvcmRlcikKJiM0Mzt7CiYjNDM7CWNoYXIgbGluZVsxMDI0XTsKJiM0MzsJaW50IGNvdW50ID0gMDsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWZwID0gdHJhY2luZ19vcGVuX3RyYWNlKCk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3Qgb3BlbiB0cmFjZSBidWZmZXJcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7CiYjNDM7CQljaGFyICpzOwomIzQzOwkJdW5zaWduZWQgbG9uZyB2YWw7CiYjNDM7CQl1bnNpZ25lZCBpbnQgb3JkOwomIzQzOwkJY2hhciAqbzsKJiM0MzsJCWludCBpOwomIzQzOwomIzQzOwkJcyA9IHN0cnN0cihsaW5lLCAmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOiYjMzQ7KTsKJiM0MzsJCWlmIChzKSB7CiYjNDM7CQkJaWYgKHNzY2FuZihzLCAmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOiBzY2FuX3Bmbj0weCVseCYjMzQ7LAomIzQzOwkJCQkgICAmYW1wO3ZhbCkgIT0gMSkKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJbyA9IHN0cnN0cihzLCAmIzM0O29yZGVyPSYjMzQ7KTsKJiM0MzsJCQlpZiAoIW8gfHwgc3NjYW5mKG8sICYjMzQ7b3JkZXI9JXUmIzM0OywgJmFtcDtvcmQpICE9IDEgfHwKJiM0MzsJCQkgICAgb3JkICE9IG9yZGVyKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfcGZuczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQkJaWYgKHZhbCA9PSBwZm5zW2ldKSB7CiYjNDM7CQkJCQljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQkJCQlicmVhazsKJiM0MzsJCQkJfQomIzQzOwkJCX0KJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCXMgPSBzdHJzdHIobGluZSwgJiMzNDttbV9jb2xsYXBzZV9jYW5kaWRhdGU6JiMzNDspOwomIzQzOwkJaWYgKHMpIHsKJiM0MzsJCQlpZiAoIXN0cnN0cihzLCAmIzM0O3Bhc3M9aW5zdGFsbCYjMzQ7KSB8fAomIzQzOwkJCSAgICAhc3Ryc3RyKHMsICYjMzQ7cmVzdWx0PXN1Y2NlZWRlZCYjMzQ7KSkKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJbyA9IHN0cnN0cihzLCAmIzM0O2FkZHI9JiMzNDspOwomIzQzOwkJCWlmICghbyB8fCBzc2NhbmYobywgJiMzNDthZGRyPTB4JWx4JiMzNDssICZhbXA7dmFsKSAhPSAxIHx8CiYjNDM7CQkJICAgIHZhbCAhPSBhZGRyKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlvID0gc3Ryc3RyKHMsICYjMzQ7b3JkZXI9JiMzNDspOwomIzQzOwkJCWlmICghbyB8fCBzc2NhbmYobywgJiMzNDtvcmRlcj0ldSYjMzQ7LCAmYW1wO29yZCkgIT0gMSB8fAomIzQzOwkJCSAgICBvcmQgIT0gb3JkZXIpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCWNvdW50JiM0MzsmIzQzOzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pCiYjNDM7ewomIzQzOwljb25zdCBzaXplX3Qgd2luZG93ID0gZ2V0cGFnZXNpemUoKSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVI7CiYjNDM7CWNvbnN0IGludCBucl9wYWdlcyA9IDEgJmx0OyZsdDsgVEFSR0VUX09SREVSOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbnNbMSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVJdOwomIzQzOwlib29sIGNvbGxhcHNlZCwgcGFzc2VkOwomIzQzOwlpbnQgYXR0cmlidXRlZDsKJiM0MzsJY2hhciAqcDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CXAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApOwomIzQzOwlpZiAocCAhPSBCQVNFX0FERFIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkgd2luZG93JiMzNDspOwomIzQzOwomIzQzOwkvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXBbaSAqIGdldHBhZ2VzaXplKCldID0gaSAmIzQzOyAxOwomIzQzOwkJcGZuc1tpXSA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwICYjNDM7IGkgKiBnZXRwYWdlc2l6ZSgpKTsKJiM0MzsJCWlmIChwZm5zW2ldID09IC0xVUwpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7U291cmNlIHBhZ2Ugbm90IHByZXNlbnRcbiYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBDbGVhciBmaXJzdDogd2l0aCB0aGUgZXZlbnRzIHN0aWxsIG9mZiB0aGVyZSBpcyBub3RoaW5nIHRvIHVuZG8uICovCiYjNDM7CWlmICh0cmFjaW5nX2NsZWFyX3RyYWNlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxuJiMzNDspOwomIzQzOwlpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xuJiMzNDspOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJLyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovCiYjNDM7CXBhc3NlZCA9IGtodWdlcGFnZWRfZnVsbF9wYXNzKDEyMCk7CiYjNDM7CiYjNDM7CS8qIE9mZiBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZ2l2ZSB1cDogdGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUuICovCiYjNDM7CWlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgZGlzYWJsZSBodWdlX21lbW9yeSBldmVudHNcbiYjMzQ7KTsKJiM0MzsJaWYgKCFwYXNzZWQpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJY29sbGFwc2VkID0gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCB3aW5kb3csIFRBUkdFVF9PUkRFUiwKJiM0MzsJCQkJCQkgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7CiYjNDM7CWF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCAodW5zaWduZWQgbG9uZylwLAomIzQzOwkJCQkgICAgICBUQVJHRVRfT1JERVIpOwomIzQzOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0KGNvbGxhcHNlZCAmYW1wOyZhbXA7IGF0dHJpYnV0ZWQgPT0gMSwKJiM0MzsJCQkgJiMzNDtzdGVwICVkOiB3aW5kb3cgY29sbGFwc2VkLCAlZCBhdHRyaWJ1dGVkIHJlc3VsdChzKVxuJiMzNDssCiYjNDM7CQkJIGl0ZXJhdGlvbiwgYXR0cmlidXRlZCk7CiYjNDM7CiYjNDM7CW11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7fQomIzQzOwomIzQzO2ludCBtYWluKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9oZWFkZXIoKTsKJiM0MzsKJiM0MzsJaWYgKCF0aHBfYXZhaWxhYmxlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXG4mIzM0Oyk7CiYjNDM7CWlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBUQVJHRVRfT1JERVIpKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7T3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXG4mIzM0OywKJiM0MzsJCQkgICAgICAgVEFSR0VUX09SREVSKTsKJiM0MzsKJiM0MzsJaHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpOwomIzQzOwlpZiAoIWhwYWdlX3BtZF9zaXplKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CXBhZ2VtYXBfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKHBhZ2VtYXBfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApJiMzNDspOwomIzQzOwlrcGFnZWZsYWdzX2ZkID0gb3BlbigmIzM0Oy9wcm9jL2twYWdlZmxhZ3MmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAoa3BhZ2VmbGFnc19mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O29wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OykgcmVxdWlyZXMgcm9vdFxuJiMzNDspOwomIzQzOwl0cmFjZV9ldmVudHNfZmQgPSB0cmFjaW5nX2V2ZW50c19vcGVuKCYjMzQ7aHVnZV9tZW1vcnkmIzM0Oyk7CiYjNDM7CWlmICh0cmFjZV9ldmVudHNfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XG4mIzM0Oyk7CiYjNDM7CWF0ZXhpdCh0cmFjZV9ldmVudHNfb2ZmKTsKJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbihOUl9JVEVSQVRJT05TKTsKJiM0MzsKJiM0MzsJdGhwX3NhdmVfc2V0dGluZ3MoKTsKJiM0MzsJdGhwX3JlYWRfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CXNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUzsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTsKJiM0MzsJLyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi8KJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMICZsdDsmbHQ7IDI0OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7CiYjNDM7CS8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBOUl9JVEVSQVRJT05TOyBpJiM0MzsmIzQzOykKJiM0MzsJCW9uZV9zdGVwKGkpOwomIzQzOwomIzQzOwl0aHBfcmVzdG9yZV9zZXR0aW5ncygpOwomIzQzOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYwppbmRleCBmMTlkNTNjNjk1NzY0Li5mZDM1ZjhhN2I1YjgzIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYwpAQCAtMjAsNyAmIzQzOzIwLDYgQEAKIAogI2RlZmluZSBUV09NRUcJCSgyJmx0OyZsdDsyMCkKICNkZWZpbmUgUlVOVElNRQkJKDIwKQotI2RlZmluZSBBTElHTih4LCBhKQkoKCh4KSAmIzQzOyAoYSAtIDEpKSAmYW1wOyAofigoYSkgLSAxKSkpCiAKIEhVR0VUTEJfU0VUVVBfREVGQVVMVF9QQUdFUygxKQogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoCmluZGV4IGQwOWY5ZjZhMzg0ZWUuLmZjNjE5MDdhYTNiMmEgMTAwNzU1Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoCkBAIC00MDIsNiAmIzQzOzQwMiwxMiBAQCBDQVRFR09SWT0mIzM0O3Bmbm1hcCYjMzQ7IHJ1bl90ZXN0IC4vcGZubWFwCiAjIENPVyB0ZXN0cwogQ0FURUdPUlk9JiMzNDtjb3cmIzM0OyBydW5fdGVzdCAuL2NvdwogCiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrCiYjNDM7CiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfc3luY19jaGVjawomIzQzOwomIzQzO0NBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2UKJiM0MzsKIENBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkCiAKIENBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDIKQEAgLTQxMCw4ICYjNDM7NDE2LDYgQEAgQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgYWxsOnNobWVtCiAKIENBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDQgYWxsOnNobWVtCiAKLUNBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub24KLQogIyBUcnkgdG8gY3JlYXRlIFhGUyBpZiBub3QgcHJvdmlkZWQKIGlmIFsgLXogJiMzNDske1NQTElUX0hVR0VfUEFHRV9URVNUX1hGU19QQVRIfSYjMzQ7IF07IHRoZW4KICAgICBpZiB0ZXN0X3NlbGVjdGVkICYjMzQ7dGhwJiMzNDs7IHRoZW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jCmluZGV4IDg2YTYwMzY5MjgyNjEuLjBhZGZlN2RkZTdlNTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYwpAQCAtNDIsNjggJiM0Mzs0Miw2IEBAIGNvbnN0IGNoYXIgKmtwYWdlZmxhZ3NfcHJvYyA9ICYjMzQ7L3Byb2Mva3BhZ2VmbGFncyYjMzQ7OwogaW50IHBhZ2VtYXBfZmQ7CiBpbnQga3BhZ2VmbGFnc19mZDsKIAotc3RhdGljIGJvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLAotCQlpbnQga3BhZ2VmbGFnc19mZCkKLXsKLQljb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEOwotCWNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCAmbHQ7Jmx0OyBvcmRlcjsKLQl1bnNpZ25lZCBsb25nIHBmbl9oZWFkOwotCXVpbnQ2NF90IHBmbl9mbGFnczsKLQl1bnNpZ25lZCBsb25nIHBmbjsKLQl1bnNpZ25lZCBsb25nIGk7Ci0KLQlwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpOwotCi0JLyogbm9uIHByZXNlbnQgcGFnZSAqLwotCWlmIChwZm4gPT0gLTFVTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCi0JCWdvdG8gZmFpbDsKLQotCS8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovCi0JaWYgKCFvcmRlcikgewotCQlpZiAocGZuX2ZsYWdzICZhbXA7IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIG5vbiBUSFAgZm9saW8gKi8KLQlpZiAoIShwZm5fZmxhZ3MgJmFtcDsgS1BGX1RIUCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXBmbl9oZWFkID0gcGZuICZhbXA7IH4obnJfcGFnZXMgLSAxKTsKLQotCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCi0JCWdvdG8gZmFpbDsKLQotCS8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovCi0JaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncykKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovCi0JZm9yIChpID0gMTsgaSAmbHQ7IG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykgewotCQlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCAmIzQzOyBpLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCi0JCQlnb3RvIGZhaWw7Ci0JCWlmICgocGZuX2ZsYWdzICZhbXA7IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLAotCSAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXIKLQkgKi8KLQlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCAmIzQzOyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCS8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi8KLQlyZXR1cm4gKHBmbl9mbGFncyAmYW1wOyBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzOwotZmFpbDoKLQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cbiYjMzQ7KTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KIHN0YXRpYyBpbnQgY2hlY2tfYWZ0ZXJfc3BsaXRfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLAogCQlpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycykKIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYwppbmRleCA4MGJjOWY1OTdiNTIxLi5lZTEzMzQ3NzgzOTFmIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jCkBAIC00OTQsNiAmIzQzOzQ5NCwxNTEgQEAgaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpCiAJcmV0dXJuIDA7CiB9CiAKJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCwKJiM0MzsJCQlpbnQga3BhZ2VmbGFnc19mZCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7CiYjNDM7CWNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7CiYjNDM7CXVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7CiYjNDM7CXVpbnQ2NF90IHBmbl9mbGFnczsKJiM0MzsJdW5zaWduZWQgbG9uZyBwZm47CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTsKJiM0MzsKJiM0MzsJLyogbm9uIHByZXNlbnQgcGFnZSAqLwomIzQzOwlpZiAocGZuID09IC0xVUwpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqLwomIzQzOwlpZiAoIW9yZGVyKSB7CiYjNDM7CQlpZiAocGZuX2ZsYWdzICZhbXA7IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogbm9uIFRIUCBmb2xpbyAqLwomIzQzOwlpZiAoIShwZm5fZmxhZ3MgJmFtcDsgS1BGX1RIUCkpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CXBmbl9oZWFkID0gcGZuICZhbXA7IH4obnJfcGFnZXMgLSAxKTsKJiM0MzsKJiM0MzsJaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJLyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi8KJiM0MzsJaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncykKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJLyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovCiYjNDM7CWZvciAoaSA9IDE7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CQlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLAomIzQzOwkgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyCiYjNDM7CSAqLwomIzQzOwlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCAmIzQzOyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CiYjNDM7CS8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi8KJiM0MzsJcmV0dXJuIChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFnczsKJiM0MztmYWlsOgomIzQzOwlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cbiYjMzQ7KTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIENoZWNrIHdoZXRoZXIgZXZlcnkgb3JkZXItQG9yZGVyIHdpbmRvdyBvZiBbc3RhcnQsIGxlbikgbWFwcyBleGFjdGx5IG9uZQomIzQzOyAqIGZvbGlvIG9mIHRoYXQgb3JkZXIsIGhlYWQgdG8gdGFpbC4gIFRoZSBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5CiYjNDM7ICogYWxpZ25lZCwgZWFjaCB3aW5kb3cmIzM5O3MgUEZOIHJ1biBtdXN0IGJlIGNvbnRpZ3VvdXMsIGFuZCBhIHdpbmRvdyYjMzk7cyBmaXJzdAomIzQzOyAqIFBGTiBtdXN0IGJlIHRoZSBmb2xpbyBoZWFkLgomIzQzOyAqCiYjNDM7ICogVGhpcyBpcyB0aGUgY2hlY2sgJiMzNDtkaWQgdGhpcyByYW5nZSBjb2xsYXBzZSBpbnRvIG9yZGVyLUBvcmRlciBmb2xpb3MmIzM0OzogYQomIzQzOyAqIHdpbmRvdyBhc3NlbWJsZWQgZnJvbSBwYXJ0cyBvZiBzZXZlcmFsIGZvbGlvcywgb3IgbWFwcGluZyBhIGZvbGlvIHNoaWZ0ZWQKJiM0MzsgKiBmcm9tIGl0cyBuYXR1cmFsIHBvc2l0aW9uLCBmYWlscy4KJiM0MzsgKi8KJiM0Mztib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlciwKJiM0MzsJCQkJICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwomIzQzOwljb25zdCBzaXplX3Qgd2luZG93ID0gbnJfcGFnZXMgKiBwc2l6ZSgpOwomIzQzOwljaGFyICp2YWRkcjsKJiM0MzsKJiM0MzsJaWYgKCh1aW50cHRyX3Qpc3RhcnQgJSB3aW5kb3cgfHwgbGVuICUgd2luZG93KQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlmb3IgKHZhZGRyID0gc3RhcnQ7IHZhZGRyICZsdDsgc3RhcnQgJiM0MzsgbGVuOyB2YWRkciAmIzQzOz0gd2luZG93KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGk7CiYjNDM7CiYjNDM7CQkvKiBOb3QgcHJlc2VudCwgb3Igbm90IG1hcHBpbmcgdGhlIGZvbGlvIGhlYWQuICovCiYjNDM7CQlpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkJZm9yIChpID0gMTsgaSAmbHQ7IG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmIChwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIgJiM0MzsgaSAqIHBzaXplKCkpICE9CiYjNDM7CQkJICAgIHBmbiAmIzQzOyBpKQomIzQzOwkJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoIWlzX2JhY2tlZF9ieV9mb2xpbyh2YWRkciwgb3JkZXIsIHBhZ2VtYXBfZmQsCiYjNDM7CQkJCQlrcGFnZWZsYWdzX2ZkKSkKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgVFJBQ0VGU19ST09UICYjMzQ7L3N5cy9rZXJuZWwvdHJhY2luZyYjMzQ7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBPcGVuIHRoZSBlbmFibGUgZmlsZSBvZiBvbmUgZnRyYWNlIGV2ZW50IHN1YnN5c3RlbSAoZS5nLiAmIzM0O2h1Z2VfbWVtb3J5JiMzNDspLgomIzQzOyAqIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0cmFjaW5nX2V2ZW50c19lbmFibGUoKSwgb3IgLTEgaWYgdHJhY2VmcyBvciB0aGUKJiM0MzsgKiBzdWJzeXN0ZW0gaXMgbm90IHRoZXJlLiAgVGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUgc3RhdGU6IHdob2V2ZXIKJiM0MzsgKiBzd2l0Y2hlcyB0aGVtIG9uIG93bnMgdGhlbSB1bnRpbCBpdCBzd2l0Y2hlcyB0aGVtIG9mZiwgaW5jbHVkaW5nIG9uIHRoZQomIzQzOyAqIHBhdGhzIHdoZXJlIHRoZSB0ZXN0IGdpdmVzIHVwLgomIzQzOyAqLwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cykKJiM0Mzt7CiYjNDM7CWNoYXIgcGF0aFsyNTZdOwomIzQzOwomIzQzOwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCAmIzM0Oy9ldmVudHMvJXMvZW5hYmxlJiMzNDssCiYjNDM7CQkgc3Vic3lzKTsKJiM0MzsJcmV0dXJuIG9wZW4ocGF0aCwgT19XUk9OTFkpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgdHJhY2luZ19ldmVudHNfZW5hYmxlKGludCBmZCwgYm9vbCBlbmFibGUpCiYjNDM7ewomIzQzOwlpZiAocHdyaXRlKGZkLCBlbmFibGUgPyAmIzM0OzEmIzM0OyA6ICYjMzQ7MCYjMzQ7LCAxLCAwKSAhPSAxKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRHJvcCB3aGF0IHRoZSB0cmFjZSBidWZmZXIgaG9sZHMgc28gZmFyLiAqLwomIzQzO2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgZmQgPSBvcGVuKFRSQUNFRlNfUk9PVCAmIzM0Oy90cmFjZSYjMzQ7LCBPX1dST05MWSB8IE9fVFJVTkMpOwomIzQzOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBmb3BlbihUUkFDRUZTX1JPT1QgJiMzNDsvdHJhY2UmIzM0OywgJiMzNDtyJiMzNDspOwomIzQzO30KJiM0MzsKIC8qIElmIGBpb2N0bHMmIzM5OyBub24tTlVMTCwgdGhlIGFsbG93ZWQgaW9jdGxzIHdpbGwgYmUgcmV0dXJuZWQgaW50byB0aGUgdmFyICovCiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLAogCQkJICAgICAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yLCB1aW50NjRfdCAqaW9jdGxzKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oCmluZGV4IDlhNDlhZjg4NzAyZTQuLjEwYzdiZTQ2ZTQ0Y2EgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmgKQEAgLTEwLDYgJiM0MzsxMCw4IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvZnMuaCZndDsKIAogI2RlZmluZSBCSVRfVUxMKG5yKSAgICAgICAgICAgICAgICAgICAoMVVMTCAmbHQ7Jmx0OyAobnIpKQomIzQzOyNkZWZpbmUgQUxJR04oeCwgYSkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiM0MzsgKGEpIC0gMSkgJmFtcDsgfigoYSkgLSAxKSkKJiM0MzsKICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSkKICNkZWZpbmUgUE1fTU1BUF9FWENMVVNJVkUgICAgICAgICAgICAgQklUX1VMTCg1NikKICNkZWZpbmUgUE1fVUZGRF9XUCAgICAgICAgICAgICAgICAgICAgQklUX1VMTCg1NykKQEAgLTk3LDYgJiM0Mzs5OSwxMCBAQCBpbnQ2NF90IGFsbG9jYXRlX3RyYW5zaHVnZSh2b2lkICpwdHIsIGludCBwYWdlbWFwX2ZkKTsKIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKTsKIGludCBnYXRoZXJfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLAogCQlpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycyk7CiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsCiYjNDM7CQkJaW50IGtwYWdlZmxhZ3NfZmQpOwomIzQzO2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLAomIzQzOwkJCQkgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7CiAKIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sCiAJCSAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTsKQEAgLTExMyw2ICYjNDM7MTE5LDEwIEBAIGludCBjbG9zZV9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwKTsKIGludCB3cml0ZV9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgdmFsKTsKIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTsKIGJvb2wgc29mdGRpcnR5X3N1cHBvcnRlZCh2b2lkKTsKJiM0MztpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7CiYjNDM7aW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZCk7CiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIGludCBvcGVuX3NlbGZfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcF9vdXQpCiB7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE0OjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4OTI3CgkJCQkJCQlvdXRwdXQ6IDYzCgkJCQkJCQl0aG91Z2h0czogNzI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKldvcnRoRnV6emluZyBBbmFseXNpczogU2VsZnRlc3QgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgZ290IHRoaXMgcGF0Y2ggdGhhdCYjMzk7cyBhZGRpbmcgYW5kIG1vZGlmeWluZyB0ZXN0cyB3aXRoaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AuIEkmIzM5O20gZ29pbmcgdGhyb3VnaCB0aGUgZmlsZXMg4oCTIGBNYWtlZmlsZWAsIGBmb2xpb19vcmRlcl9jaGVjay5jYCwgYGhtbS10ZXN0cy5jYCwgdGhlIGh1Z2VwYWdlIHN0dWZmLCBga2h1Z2VwYWdlZGAsIG1pZ3JhdGlvbiwgYW5kIHNvIG9uLiBJdCBzZWVtcyBsaWtlIGEgcHJldHR5IGNvbXByZWhlbnNpdmUgYWRkaXRpb24gdG8gdGhlIHNlbGZ0ZXN0cyBzdWl0ZS4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBxdWlja2x5IGFzc2VzcyB3aGV0aGVyIHRoaXMgd2FycmFudHMgZnV6emluZyBhdHRlbnRpb24uIFRoZSBpbnN0cnVjdGlvbnMgSSBoYXZlIGxheSBvdXQgYSBzcGVjaWZpYyBzZXQgb2Ygc2NlbmFyaW9zIHdoZXJlIHdlIHNob3VsZCByZXR1cm4gYFdvcnRoRnV6emluZz1mYWxzZWAuIEl0IGxpc3RzIHRoaW5ncyBsaWtlIGRvY3VtZW50YXRpb24gY2hhbmdlcywgY29tbWVudCB1cGRhdGVzLCBkZWNvcmF0aXZlIGxvZ2dpbmcsIGNvbnN0YW50IGFkanVzdG1lbnRzIHRoYXQgZG9uJiMzOTt0IGNoYW5nZSBleGVjdXRpb24sIGFuZCB1bnJlYWNoYWJsZSBjb2RlIHBhdGhzLiBUaGVyZSYjMzk7cyBhbHNvIHNvbWUgaW1wb3J0YW50IGNhdmVhdHMgYWJvdXQgc3BlY2lmaWMgaGFyZHdhcmUgYW5kIGRyaXZlciBjb250ZXh0cy4KCkFoLCBidXQgd2FpdCBhIHNlY29uZC4uLiBpdCAqZG9lc24mIzM5O3QqIGV4cGxpY2l0bHkgbWVudGlvbiBzZWxmdGVzdHMgaW4gdGhhdCAmIzM0O1dvcnRoRnV6emluZz1mYWxzZSYjMzQ7IGxpc3QuIEhvd2V2ZXIsIHNlbGZ0ZXN0cyBhcmUgbm90IGtlcm5lbCBjb2RlLiBUaGV5IGxpdmUgaW4gdXNlcnNwYWNlOyB0aGV5JiMzOTtyZSAqdG9vbHMqIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGtlcm5lbCYjMzk7cyBiZWhhdmlvci4gVGhlIGtlcm5lbCBpdHNlbGYgKmlzKiB3aGF0IFN5emthbGxlciBmdXp6ZXMgdXNpbmcgc3lzY2FsbHMuIFRoZSBzZWxmdGVzdHMgYXJlIHBhcnQgb2YgaG93IHdlIG1lYXN1cmUgaXRzIHBlcmZvcm1hbmNlIGFuZCBiZWhhdmlvciwgYnV0IHRoZXkgYXJlbiYjMzk7dCBwYXJ0IG9mIHRoZSBzeXN0ZW0gY2FsbCBmbG93IHRoYXQmIzM5O3MgdGhlIHByaW1hcnkgdGFyZ2V0IG9mIGZ1enppbmcuCgpMZXQgbWUganVzdCBkbyBhIHF1aWNrLCB2ZXJ5IGV4cGxpY2l0LCBkb3VibGUtY2hlY2sgdG8gY29uZmlybS4gWWVzLCBhbGwgdGhlIGNoYW5nZXMgYXJlIHNxdWFyZWx5IHdpdGhpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gTm90aGluZyBpbiBhbnkga2VybmVsIHN1YnN5c3RlbXMgaGVyZS4KClRoZXJlZm9yZSwgYmVjYXVzZSB0aGlzIHBhdGNoICpvbmx5KiB0b3VjaGVzIHVzZXJzcGFjZSBzZWxmdGVzdHMsIGFuZCBkb2VzIG5vdCBhbHRlciB0aGUgZXhlY3V0aW9uIGZsb3cgb2YgdGhlIGtlcm5lbCBpdHNlbGYsIEkgYW0gZ29pbmcgdG8gc2V0IGBXb3J0aEZ1enppbmc9ZmFsc2VgLiBUaGUgcmVhc29uaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZDogdGhlc2UgY2hhbmdlcyBhcmUgaXNvbGF0ZWQgdG8gdGhlIHRlc3RpbmcgZnJhbWV3b3JrIGFuZCBhcmUgbm90IHBhcnQgb2YgdGhlIGtlcm5lbCBleGVjdXRpb24gcGF0aCB0aGF0IFN5emthbGxlciBmdXp6ZXMuIExldCYjMzk7cyBjYWxsIGBzZXQtcmVzdWx0c2AgdG8gY29tcGxldGUgdGhpcyB0YXNrLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE0OjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLywgd2hpY2ggZG8gbm90IGFmZmVjdCB0aGUga2VybmVsJiMzOTtzIGZ1bmN0aW9uYWwgZXhlY3V0aW9uIGZsb3cuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLCB3aGljaCBkbyBub3QgYWZmZWN0IHRoZSBrZXJuZWwmIzM5O3MgZnVuY3Rpb25hbCBleGVjdXRpb24gZmxvdy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTQ6NTk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE0OjU5OjExLjc0NTg2MjMxMloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExNDc4MDQwMDgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLywgd2hpY2ggZG8gbm90IGFmZmVjdCB0aGUga2VybmVsJ3MgZnVuY3Rpb25hbCBleGVjdXRpb24gZmxvdy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE0OjU5OjExLjc0NTg3NzYyMloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTc0ODc0MDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNjdhMTllMTdhOTFiNjE1ZDAwNzFjM2Q4NDEwMzgyZTgxYzBlOTA4OFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgV2VkIEF1ZyAxMiAxNDo1OToxMCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuaW5kZXggMmQ1MzY2MTk2ZTMwOS4uMzA4YmJhZDczYzExYSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuQEAgLTEwNCw2ICsxMDQsOSBAQCBURVNUX0dFTl9GSUxFUyArPSBndWFyZC1yZWdpb25zXFxuIFRFU1RfR0VOX0ZJTEVTICs9IG1lcmdlXFxuIFRFU1RfR0VOX0ZJTEVTICs9IHJtYXBcXG4gVEVTVF9HRU5fRklMRVMgKz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0XFxuK1RFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX29yZGVyX2NoZWNrXFxuK1RFU1RfR0VOX0ZJTEVTICs9IGtodWdlcGFnZWRfc3luY19jaGVja1xcbitURVNUX0dFTl9GSUxFUyArPSBraHVnZXBhZ2VkX3JhY2VcXG4gXFxuIGlmbmVxICgkKEFSQ0gpLGFybTY0KVxcbiBURVNUX0dFTl9GSUxFUyArPSBzb2Z0LWRpcnR5XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi45MzAzMGE0MmMzY2NkXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcXG5AQCAtMCwwICsxLDEzNyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBTZWxmLWNoZWNrIGZvciB0aGUgdm1fdXRpbCBmb2xpby1vcmRlciBkZXRlY3Rpb24gaGVscGVycyxcXG4rICogaXNfYmFja2VkX2J5X2ZvbGlvKCkgYW5kIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoKS5cXG4rICpcXG4rICogRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0IG1lbW9yeSBpbiB3aXRoIG9ubHlcXG4rICogdGhhdCBvcmRlciBlbmFibGVkIGFuZCB2ZXJpZnkgdGhlIGhlbHBlcnMgcmVwb3J0IGV4YWN0bHkgdGhhdCBvcmRlcjpcXG4rICogbm90IGEgbmVpZ2hib3VyaW5nIG9yZGVyLCBhbmQgcGxhaW4gNEsgbWVtb3J5IGFzIG9yZGVyIDAuIFRoZSBoZWxwZXJzXFxuKyAqIGFyZSB3aGF0IHRoZSBraHVnZXBhZ2VkIG1USFAgdGVzdHMgdXNlIHRvIGRldGVjdCBjb2xsYXBzZSByZXN1bHRzLCBzb1xcbisgKiB0aGV5IG11c3QgYWdyZWUgd2l0aCB0aGUga2VybmVsJ3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueVxcbisgKiBjb2xsYXBzZSB0ZXN0IHJlbGllcyBvbiB0aGVtLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJrc2VsZnRlc3QuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInZtX3V0aWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImh1Z2VwYWdlX3NldHRpbmdzLmhcXFwiXFxuK1xcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcXG4rXFxuKy8qIG1tYXAgYW4gYW5vbiBWTUEgb2YgZXhhY3RseSBAc2l6ZSBieXRlcyBhdCBhIEBzaXplLWFsaWduZWQgYWRkcmVzcy4gKi9cXG4rc3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpXFxuK3tcXG4rXFx0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xcbitcXHR1aW50cHRyX3QgYWxpZ25lZDtcXG4rXFx0Y2hhciAqcDtcXG4rXFxuK1xcdHAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xcbitcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKVxcXCIpO1xcbitcXG4rXFx0YWxpZ25lZCA9IEFMSUdOKCh1aW50cHRyX3QpcCwgc2l6ZSk7XFxuK1xcdGlmIChhbGlnbmVkICE9ICh1aW50cHRyX3QpcClcXG4rXFx0XFx0bXVubWFwKHAsIGFsaWduZWQgLSAodWludHB0cl90KXApO1xcbitcXHRpZiAoYWxpZ25lZCArIHNpemUgIT0gKHVpbnRwdHJfdClwICsgbGVuKVxcbitcXHRcXHRtdW5tYXAoKGNoYXIgKilhbGlnbmVkICsgc2l6ZSxcXG4rXFx0XFx0ICAgICAgICh1aW50cHRyX3QpcCArIGxlbiAtIGFsaWduZWQgLSBzaXplKTtcXG4rXFxuK1xcdHJldHVybiAoY2hhciAqKWFsaWduZWQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIEVuYWJsZSBvbmx5IEBvcmRlciAob3JkZXIgMDogbm90aGluZyksIGZhdWx0IG9uZSBhbGlnbmVkIHdpbmRvdyBpbiBhbmRcXG4rICogY2hlY2sgdGhlIGhlbHBlcnMgc2VlIGV4YWN0bHkgQG9yZGVyLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgY2hlY2tfb3JkZXIoaW50IG9yZGVyKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2l6ZV90IHNpemUgPSBwc2l6ZSgpIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbitcXHRib29sIG9rID0gdHJ1ZTtcXG4rXFx0Y2hhciAqcDtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRpZiAob3JkZXIpXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRwID0gYWxsb2NfYWxpZ25lZChzaXplKTtcXG4rXFx0KnAgPSAxO1xcbitcXG4rXFx0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJvcmRlciAlZCBub3QgZGV0ZWN0ZWQgYWZ0ZXIgZmF1bHRcXFxcblxcXCIsIG9yZGVyKTtcXG4rXFx0XFx0b2sgPSBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0LyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xcbitcXHRpZiAob3JkZXIgXFx1MDAyNlxcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlciAtIDEsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIG9yZGVyLCBvcmRlciAtIDEpO1xcbitcXHRcXHRvayA9IGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKiBPcmRlciAwIHBhZ2VzIG11c3Qgbm90IGxvb2sgbGlrZSBhbnkgbGFyZ2UgZm9saW8sIGFuZCB2aWNlIHZlcnNhLiAqL1xcbitcXHRpZiAob3JkZXIgXFx1MDAyNlxcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCAwLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHBhZ2VtYXBfZmQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAga3BhZ2VmbGFnc19mZCkpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm9yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxcXFxuXFxcIiwgb3JkZXIpO1xcbitcXHRcXHRvayA9IGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRtdW5tYXAocCwgc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFxuK1xcdGtzZnRfdGVzdF9yZXN1bHQob2ssIFxcXCJvcmRlciAlZCBjbGFzc2lmaWVkXFxcXG5cXFwiLCBvcmRlcik7XFxuK31cXG4rXFxuK2ludCBtYWluKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0dW5zaWduZWQgbG9uZyBvcmRlcnM7XFxuK1xcdGludCBvcmRlcjtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XFxuK1xcbitcXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcXFwiKTtcXG4rXFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChrcGFnZWZsYWdzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIm9wZW4oXFxcXFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcXFxcXCIpIHJlcXVpcmVzIHJvb3RcXFxcblxcXCIpO1xcbitcXG4rXFx0b3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcXG4rXFx0aWYgKCFvcmRlcnMpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xcXFxuXFxcIik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSArIDEpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Y2hlY2tfb3JkZXIoMCk7XFxuK1xcdGZvciAob3JkZXIgPSAxOyBvcmRlciBcXHUwMDNjIE5SX09SREVSUzsgb3JkZXIrKykge1xcbitcXHRcXHRpZiAoIShvcmRlcnMgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyKSkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRjaGVja19vcmRlcihvcmRlcik7XFxuK1xcdH1cXG4rXFxuK1xcbitcXHRrc2Z0X2ZpbmlzaGVkKCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xcbmluZGV4IGUyNjQyZWNhMGQwMmIuLmRmNDI2ZjkyMThlNzEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xcbkBAIC02NSw3ICs2NSw2IEBAIGVudW0ge1xcbiAjZGVmaW5lIEhNTV9QQVRIX01BWCAgICA2NFxcbiAjZGVmaW5lIE5USU1FU1xcdFxcdDEwXFxuIFxcbi0jZGVmaW5lIEFMSUdOKHgsIGEpICgoKHgpICsgKGEgLSAxKSkgXFx1MDAyNiAofigoYSkgLSAxKSkpXFxuIC8qIEp1c3QgdGhlIGZsYWdzIHdlIG5lZWQsIGNvcGllZCBmcm9tIG1tLmg6ICovXFxuIFxcbiAjaWZuZGVmIEZPTExfV1JJVEVcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcXG5pbmRleCBkNzkxN2RjZTNhYmFjLi44YWZjZGY5NzkzYmI3IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXFxuQEAgLTE4Myw2ICsxODMsMTcgQEAgdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4gXFx0fVxcbiB9XFxuIFxcbisvKlxcbisgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYW55IHN0b3JlIHRvIGEga2h1Z2VwYWdlZCBzeXNmcyBrbm9iIHdha2VzIHRoZVxcbisgKiBkYWVtb24sIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHlcXG4rICogYXNrZWQgZm9yIC0tIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgaXMgdGhlIG9ubHkgc2FuY3Rpb25lZCB3YWtlLlxcbisgKi9cXG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcXG4re1xcbitcXHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcXG4rXFx0XFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xcbit9XFxuK1xcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4ge1xcbiBcXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFxcdTAwMjZzZXR0aW5ncy1cXHUwMDNla2h1Z2VwYWdlZDtcXG5AQCAtMTk4LDE1ICsyMDksMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXFxuIFxcdFxcdFxcdHNobWVtX2VuYWJsZWRfc3RyaW5nc1tzZXR0aW5ncy1cXHUwMDNlc2htZW1fZW5hYmxlZF0pO1xcbiBcXHR0aHBfd3JpdGVfbnVtKFxcXCJ1c2VfemVyb19wYWdlXFxcIiwgc2V0dGluZ3MtXFx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xcbiBcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9kZWZyYWdcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VkZWZyYWcpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1xcXCIsXFxuLVxcdFxcdFxcdGtodWdlcGFnZWQtXFx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbi1cXHRcXHRcXHRraHVnZXBhZ2VkLVxcdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX25vbmUpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zd2FwKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VwYWdlc190b19zY2FuKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvZGVmcmFnXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlZGVmcmFnKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4rXFx0XFx0ICAgICAgIGtodWdlcGFnZWQtXFx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4rXFx0XFx0ICAgICAgIGtodWdlcGFnZWQtXFx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX25vbmUpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VwYWdlc190b19zY2FuKTtcXG4gXFxuIFxcdGlmIChkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoWzBdKVxcbiBcXHRcXHR3cml0ZV9udW0oZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aCwgc2V0dGluZ3MtXFx1MDAzZXJlYWRfYWhlYWRfa2IpO1xcbkBAIC0yMzAsNiArMjQxLDQ5IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxcbiBcXHR9XFxuIH1cXG4gXFxuKy8qXFxuKyAqIENvbXBsZXRpb24gYmFycmllciBmb3Iga2h1Z2VwYWdlZDogd2FpdCB1bnRpbCBhIGZ1bGwgc2NhbiBwYXNzIHRoYXRcXG4rICogc3RhcnRlZCBhZnRlciB0aGlzIGNhbGwgaGFzIGZpbmlzaGVkLiBmdWxsX3NjYW5zIG11c3QgYWR2YW5jZSBieSB0d287XFxuKyAqIGEgKzEgc3RlcCBtYXkgY29tcGxldGUgYSBwYXNzIHRoYXQgZXhhbWluZWQgdGhpcyBtbSBiZWZvcmUgdGhlXFxuKyAqIGNhbGxlcidzIHNldHVwIHdhcyBpbiBwbGFjZS5cXG4rICpcXG4rICogQW55IHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIHNvIHRoZSBiYXJyaWVyIHdvcmtzXFxuKyAqIHdoYXRldmVyIHRoZSBjb25maWd1cmVkIHNjYW4gY2FkZW5jZSAtLSBidXQgYSBzdG9yZSBjYW4gYmUgbG9zdC5cXG4rICogX19zbGVlcF9taWxsaXNlY3Nfc3RvcmUoKSBjbGVhcnMga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgYW5kIHdha2VzIHRoZVxcbisgKiBxdWV1ZTsgaWYgdGhlIGRhZW1vbiBpcyBiZXR3ZWVuIHNjYW5zIHJhdGhlciB0aGFuIHNsZWVwaW5nLCBpdCBzZXRzXFxuKyAqIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGl0c2VsZiBvbiB0aGUgd2F5IGludG8ga2h1Z2VwYWdlZF93YWl0X3dvcmsoKSBhbmRcXG4rICogdGhlbiBzbGVlcHMgZm9yIHRoZSBmdWxsIGludGVydmFsLCBoYXZpbmcgbmV2ZXIgc2VlbiB0aGUgc3RvcmUuICBTbyBrZWVwXFxuKyAqIHN0b3JpbmcgdW50aWwgdGhlIHBhc3MgbGFuZHM7IGEgc3RvcmUgd2hpbGUgdGhlIGRhZW1vbiBpcyBhd2FrZSBjb3N0c1xcbisgKiBub3RoaW5nIGFuZCBkb2VzIG5vdCBxdWV1ZSBhbiBleHRyYSBwYXNzLlxcbisgKlxcbisgKiBPbmUgd2FrZSBjb21wbGV0ZXMgb25lIGZ1bGwgcGFzcyBvbmx5IGlmIHRoZSB3aG9sZSBtbSBsaXN0IGZpdHMgaW5cXG4rICogb25lIHNjYW4gYmF0Y2gsIHNvIGNhbGxlcnMgbXVzdCBwYWlyIHRoaXMgd2l0aCBhIGxhcmdlXFxuKyAqIHBhZ2VzX3RvX3NjYW4uXFxuKyAqL1xcbitib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBkZWFkbGluZV9tcyA9IHRpbWVvdXRfcyAqIDEwMDBVTDtcXG4rXFx0dW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9XFxuK1xcdFxcdHRocF9yZWFkX251bShcXFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1xcXCIpO1xcbitcXHR1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwO1xcbitcXHRpbnQgcGFzcztcXG4rXFxuK1xcdGZvciAocGFzcyA9IDA7IHBhc3MgXFx1MDAzYyAyOyBwYXNzKyspIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxcbitcXHRcXHRcXHR0aHBfcmVhZF9udW0oXFxcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1xcXCIpICsgMTtcXG4rXFxuK1xcdFxcdHdoaWxlICh0aHBfcmVhZF9udW0oXFxcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1xcXCIpIFxcdTAwM2MgdGFyZ2V0KSB7XFxuK1xcdFxcdFxcdGlmIChlbGFwc2VkX21zIFxcdTAwM2U9IGRlYWRsaW5lX21zKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdFxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBzbGVlcF9tcyk7XFxuK1xcdFxcdFxcdHVzbGVlcCgxMCAqIDEwMDApO1xcbitcXHRcXHRcXHRlbGFwc2VkX21zICs9IDEwO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpXFxuIHtcXG4gXFx0aWYgKCFzZXR0aW5nc19pbmRleCkge1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcbmluZGV4IDcyNmM3M2M0M2MwNWIuLmJhN2QzODM3MGQ0MzMgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcXG5AQCAtNzAsNiArNzAsNyBAQCBpbnQgdGhwX3JlYWRfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10pO1xcbiB2b2lkIHRocF93cml0ZV9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKTtcXG4gdW5zaWduZWQgbG9uZyB0aHBfcmVhZF9udW0oY29uc3QgY2hhciAqbmFtZSk7XFxuIHZvaWQgdGhwX3dyaXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XFxuK3ZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pO1xcbiBcXG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xcbiB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKTtcXG5AQCAtODMsNiArODQsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZClcXG4gXFx0aHVnZXBhZ2Vfc2F2ZV9zZXR0aW5ncygvKiB0aHAgPSAqLyB0cnVlLCAvKiBodWdldGxiID0gKi8gZmFsc2UpO1xcbiB9XFxuIFxcbitib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpO1xcbitcXG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcXG4gdW5zaWduZWQgbG9uZyB0aHBfc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcXG4gdW5zaWduZWQgbG9uZyB0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXFxuaW5kZXggMGQ2YzcxZWQyZmFlMy4uZjU3NzNkNDQ3NTQyNyAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcXG5AQCAtMzEsNiArMzEsMTEgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xcbiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjtcXG4gc3RhdGljIGludCBhbm9uX29yZGVyO1xcbiBzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyO1xcbitzdGF0aWMgYm9vbCBjb2xsYXBzZV9vcmRlcl9naXZlbjtcXG4rc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTtcXG4rc3RhdGljIGludCBucl9jb2xsYXBzZV9vcmRlcnM7XFxuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcXG4gXFxuICNkZWZpbmUgUElEX1NNQVBTIFxcXCIvcHJvYy9zZWxmL3NtYXBzXFxcIlxcbiAjZGVmaW5lIFRFU1RfRklMRSBcXFwiY29sbGFwc2VfdGVzdF9maWxlXFxcIlxcbkBAIC0yNDEsNiArMjQ2LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKVxcbiBcXHRyZXR1cm4gc3dhcDtcXG4gfVxcbiBcXG4rLypcXG4rICogUGFnZSB0aGUgcmFuZ2Ugb3V0IGFuZCB3YWl0IGZvciB0aGUgc3dhcCBjb3VudCB0byBzYXkgc28uXFxuKyAqXFxuKyAqIFR3byB0aGluZ3MgZ2V0IGluIHRoZSB3YXkuICBNQURWX1BBR0VPVVQgaXMgYmVzdCBlZmZvcnQ6XFxuKyAqIHNocmlua19mb2xpb19saXN0KCkgbGVhdmVzIGEgZm9saW8gYWxvbmUgd2hlbiBpdCBjYW5ub3QgcmVjbGFpbSBpdCByaWdodFxcbisgKiBhd2F5LCBhbmQgb25lIHN0aWxsIHVuZGVyIHdyaXRlYmFjayBmcm9tIGFuIGVhcmxpZXIgcGFnZW91dCBpcyB0aGUgY29tbW9uXFxuKyAqIGNhc2UsIHNvIHRoZSBjb3VudCB0aGUgY2FsbGVyIGFza3MgZm9yIGFycml2ZXMgYSBtb21lbnQgbGF0ZXIuICBBbmQgYSByYW5nZVxcbisgKiBhbiBlYXJsaWVyIGNvbGxhcHNlIGxlZnQgTUFEVl9IVUdFUEFHRSBpcyBvbmUga2h1Z2VwYWdlZCBpcyBzdGlsbCB3b3JraW5nXFxuKyAqIG9uOiBjb2xsYXBzaW5nIGEgcmFuZ2Ugd2l0aCB1cCB0byBtYXhfcHRlc19zd2FwIHBhZ2VzIHN3YXBwZWQgb3V0IG1lYW5zXFxuKyAqIHJlYWRpbmcgdGhvc2UgcGFnZXMgYmFjayBpbiwgc28gdGhlIGRhZW1vbiB1bmRvZXMgdGhlIHBhZ2VvdXQgYXMgZmFzdCBhcyBpdFxcbisgKiBpcyBhc2tlZCBmb3IuICBLZWVwIHRoZSByYW5nZSBvdXQgb2YgaXRzIHJlYWNoOyB0aGUgY29sbGFwc2UgdGhlIGNhbGxlciBydW5zXFxuKyAqIG5leHQgcHV0cyBNQURWX0hVR0VQQUdFIGJhY2suXFxuKyAqXFxuKyAqIEZhaWxpbmcgdG8gZ2V0IHRoZSBwYWdlcyBvdXQgaXMgdGhlIG1hY2hpbmUncyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJ3MgLS1cXG4rICogc3dhcCB0b28gc21hbGwsIHN3YXAgZnVsbCwgYSBtZW1jZyBjYXAsIGEgZm9saW8gc3RpbGwgdW5kZXIgd3JpdGViYWNrIC0tIHNvXFxuKyAqIGNhbGxlcnMgc2tpcCByYXRoZXIgdGhhbiBmYWlsLiAgQW4gZXJyb3IgZnJvbSBtYWR2aXNlKCkgaXMgZGlmZmVyZW50LCBhbmRcXG4rICogZW5kcyB0aGUgcnVuIGhlcmUuXFxuKyAqL1xcbitzdGF0aWMgYm9vbCBzd2Fwb3V0X3JhbmdlKHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcXG4re1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfTk9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX05PSFVHRVBBR0UpXFxcIik7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgNDA7IGkrKykge1xcbitcXHRcXHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX1BBR0VPVVQpKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbitcXHRcXHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcXG4rXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdFxcdHVzbGVlcCg1MCAqIDEwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgKmFsbG9jX21hcHBpbmcoaW50IG5yKVxcbiB7XFxuIFxcdHZvaWQgKnA7XFxuQEAgLTU4Myw4ICs2MjMsMTAgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sXFxuIFxcdFxcdGludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplIFxcdTAwM2NcXHUwMDNjIGNvbGxhcF9vcmRlcjtcXG4rXFx0LyogVGhyZWUgc2Vjb25kcyBhcyBhIGZsb29yLCBwbHVzIGEgc2Vjb25kIHBlciAxMjhNIHRvIGNvbGxhcHNlICovXFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9zaXplO1xcbitcXHRpbnQgdGltZW91dCA9IDYgKyAyICogKGJ5dGVzIC8gKDEyOFVMIFxcdTAwM2NcXHUwMDNjIDIwKSk7XFxuIFxcdGludCBmdWxsX3NjYW5zO1xcbi1cXHRpbnQgdGltZW91dCA9IDY7IC8qIDMgc2Vjb25kcyAqL1xcbiBcXG4gXFx0LyogU2FuaXR5IGNoZWNrICovXFxuIFxcdGlmICghb3BzLVxcdTAwM2VjaGVja19odWdlKHAsIGxlbiwgMCwgaHBhZ2Vfc2l6ZSkpXFxuQEAgLTg1MywxMiArODk1LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXFxuIFxcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuIFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXG4tXFx0aWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxcbi1cXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbi1cXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XFxuK1xcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIHBhZ2Vfc2l6ZSkpIHtcXG4gXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXHRcXHRza2lwKFxcXCJDb3VsZCBub3Qgc3dhcCBvdXRcXFwiKTtcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuQEAgLTg4NSwxMiArOTI1LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXFxuIFxcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuIFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXG4tXFx0aWYgKG1hZHZpc2UocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcXG4tXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtYWR2aXNlKE1BRFZfUEFHRU9VVClcXFwiKTtcXG4tXFx0aWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcXG4rXFx0aWYgKHN3YXBvdXRfcmFuZ2UocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcXG4gXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXHRcXHRza2lwKFxcXCJDb3VsZCBub3Qgc3dhcCBvdXRcXFwiKTtcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuQEAgLTkwMiwxMiArOTQwLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXFxuIFxcdFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiU3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlxcXCIsIG1heF9wdGVzX3N3YXAsXFxuIFxcdFxcdCAgICAgICBocGFnZV9wbWRfbnIpO1xcbi1cXHRcXHRpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxcbi1cXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbi1cXHRcXHRpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xcbitcXHRcXHRpZiAoc3dhcG91dF9yYW5nZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xcbiBcXHRcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbiBcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcdFxcdFxcdHNraXAoXFxcIkNvdWxkIG5vdCBzd2FwIG91dFxcXCIpO1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbiBcXG5AQCAtOTc0LDYgKzEwMTAsMTYgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcXG4gXFx0dm9pZCAqcDtcXG4gXFx0aW50IGk7XFxuIFxcbitcXHQvKlxcbitcXHQgKiBUaGUgdGVzdCBuZWVkcyBocGFnZV9wbWRfbnIgUE1ELW9yZGVyIGFsbG9jYXRpb25zLCB3aGljaCBpcyBsaWtlbHkgdG9cXG4rXFx0ICogZmFpbCBmb3IgbGFyZ2UgUE1EIHNpemVzLiAgU2tpcCBpZiB0aGUgUE1EIHNpemUgaXMgb3ZlciAzMk0uXFxuK1xcdCAqL1xcbitcXHRpZiAoaHBhZ2VfcG1kX3NpemUgXFx1MDAzZSAoMzJVTCBcXHUwMDNjXFx1MDAzYyAyMCkpIHtcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFxcXCIlczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBfX2Z1bmNfXyk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4gXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4gXFx0a3NmdF9wcmludF9tc2coXFxcIkNvbnN0cnVjdCBQVEUgcGFnZSB0YWJsZSBmdWxsIG9mIGRpZmZlcmVudCBQVEUtbWFwcGVkIGNvbXBvdW5kIHBhZ2VzXFxcXG5cXFwiKTtcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGhwYWdlX3BtZF9ucjsgaSsrKSB7XFxuQEAgLTExNjQsNiArMTIxMCw3MiBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXFxuIFxcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4gfVxcbiBcXG4rLypcXG4rICogQ29udGVudCBzdGF5cyBpc29sYXRlZCB3aGlsZSBhIGNvLXNoYXJlciB3cml0ZXMgY29uY3VycmVudGx5LiBBIHNoYXJlZFxcbisgKiBzb3VyY2UgaXMgY29waWVkIGxpdmUgKG5vdCBmcm96ZW4pLCByZWx5aW5nIG9uIGl0IGJlaW5nIENvVyAtIGltbXV0YWJsZVxcbisgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb3B5OyBhIGNvLXNoYXJlcidzIHdyaXRlIGdvZXMgdG8gYSBDb1cgY29weS4gVGhlXFxuKyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5XFxuKyAqIGl0cyBvd24gd3JpdGVzLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRjb25zdCB1bnNpZ25lZCBsb25nIHNoYXJlZCA9IDY0ICogcGFnZV9zaXplO1xcbitcXHRjb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7XFxuK1xcdGludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG4gPSBzaGFyZWQgLyBwYWdlX3NpemU7XFxuK1xcdC8qIHZvbGF0aWxlOiB0aGUgbG9vcCBiZWxvdyBtdXN0IHJlYWxseSBzdG9yZSwgb24gZXZlcnkgaXRlcmF0aW9uICovXFxuK1xcdHZvbGF0aWxlIGludCAqaXA7XFxuK1xcdHZvaWQgKnA7XFxuK1xcbitcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHRpcCA9IHA7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgc2hhcmVkKTtcXHRcXHQvKiBzaGFyZWQgcHJlZml4LCBwcmUtZm9yayBwYXR0ZXJuICovXFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiRm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cXFwiKTtcXG4rXFx0aWYgKCFmb3JrKCkpIHtcXG4rXFx0XFx0aW50IGNvbGxhcHNlX3N0YXR1cztcXG4rXFxuK1xcdFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgc2hhcmVkLCBocGFnZV9wbWRfc2l6ZSk7XFx0LyogcHJpdmF0ZSByZW1haW5kZXIgKi9cXG4rXFx0XFx0Yy1cXHUwMDNlY29sbGFwc2UoXFxcIkNvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclxcXCIsXFxuK1xcdFxcdFxcdCAgICBwLCAxLCBvcHMsIHRydWUpO1xcbitcXHRcXHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0XFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGRlYWQwMDAwKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0aWYgKGkgPT0gbilcXG4rXFx0XFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRmYWlsKFxcXCJGYWlsOiBjaGlsZCBjb250ZW50XFxcIik7XFxuK1xcdFxcdC8qIFRoZSBjb250ZW50IGNoZWNrIG11c3Qgbm90IGJ1cnkgYSBmYWlsZWQgY29sbGFwc2UuICovXFxuK1xcdFxcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXFxuK1xcdFxcdFxcdGV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzO1xcbitcXHRcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdFxcdF9leGl0KGV4aXRfc3RhdHVzKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogSGFtbWVyIHRoZSBwYXJlbnQncyBvd24gd3JpdGVzIG92ZXIgdGhlIHNoYXJlZCBwcmVmaXguICovXFxuK1xcdGZvciAoaW50IGl0ID0gMDsgaXQgXFx1MDAzYyAyMDAwMDA7IGl0KyspXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuOyBpKyspXFxuK1xcdFxcdFxcdGlwW2kgKiBzdHJpZGVdID0gaSArIDB4YmVlZjAwMDA7XFxuK1xcbitcXHR3YWl0KFxcdTAwMjZ3c3RhdHVzKTtcXG4rXFx0LyogQSBjaGlsZCB0aGF0IGRpZWQgcmVhZGluZyB0aGUgcmFjaW5nIHBhZ2VzIGlzIGEgZmFpbHVyZSwgbm90IGEgemVyby4gKi9cXG4rXFx0Y2hpbGRfc3RhdHVzID0gV0lGRVhJVEVEKHdzdGF0dXMpID8gV0VYSVRTVEFUVVMod3N0YXR1cykgOiBLU0ZUX0ZBSUw7XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cXFwiKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGJlZWYwMDAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0aWYgKGkgPT0gbilcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsOiBwYXJlbnQgY29udGVudFxcXCIpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdC8qIFNhbWUgYWdhaW46IG91ciBvd24gY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQncyB2ZXJkaWN0LiAqL1xcbitcXHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxcbitcXHRcXHRleGl0X3N0YXR1cyA9IGNoaWxkX3N0YXR1cztcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbit9XFxuK1xcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuIFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuIHtcXG5AQCAtMTIwOSw2ICsxMzIxLDIxOSBAQCBzdGF0aWMgdm9pZCBtYWR2aXNlX3JldHJhY3RlZF9wYWdlX3RhYmxlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4gXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbiB9XFxuIFxcbisvKiBTbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIHdpbGwgY29uc2lkZXIgZm9yIG1USFAgY29sbGFwc2UuICovXFxuKyNkZWZpbmUgTUlOX01USFBfT1JERVIgMlxcbitcXG4rLypcXG4rICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBmb3IgdGhlIG10aHBfa2h1Z2VwYWdlZCBjb250ZXh0LiAgV2hhdFxcbisgKiB0aGV5IGFkZCBvdmVyIHRoZSBnZW5lcmljIGNhc2VzIHJ1biB1bmRlciB0aGF0IGNvbnRleHQgaXMgcGVyLXdpbmRvd1xcbisgKiBkZXRlY3Rpb246IHdoaWNoIGFsaWduZWQgd2luZG93IGNvbGxhcHNlZCwgYW5kIHdoaWNoIG9mIGl0cyBuZWlnaGJvdXJzIGRpZFxcbisgKiBub3QuICBjaGVja19odWdlKCkgYW5zd2VycyBob3cgbWFueSBmb2xpb3Mgb2YgdGhlIG9yZGVyIHRoZSByYW5nZSBob2xkcyxcXG4rICogd2hpY2ggY2Fubm90IHRlbGwgb25lIHdpbmRvdyBmcm9tIGFub3RoZXIuXFxuKyAqXFxuKyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgYW5kIHRoZSB0YXJnZXQgb3JkZXIgaXMgb25seVxcbisgKiBlbmFibGVkIGZvciBtYWR2aXNlLCBzbyB0aGUgc291cmNlcyBhcmUgYWx3YXlzIG9yZGVyIDAgYW5kIHRoZSBjb2xsYXBzZVxcbisgKiBwcm9kdWN0IGNhbiBvbmx5IGhhdmUgY29tZSBmcm9tIGtodWdlcGFnZWQuXFxuKyAqL1xcbitzdGF0aWMgc2l6ZV90IG10aHBfd2luZG93X3NpemUodm9pZClcXG4re1xcbitcXHRyZXR1cm4gcGFnZV9zaXplIFxcdTAwM2NcXHUwMDNjIGNvbGxhcHNlX29yZGVyO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB0YXJnZXQgb3JkZXIsIGZvciBtYWR2aXNlIG9ubHksIGFuZCBub3RoaW5nIGVsc2UgZW5hYmxlZDogdGhlXFxuK1xcdCAqIGNhc2VzIGZhdWx0IHRoZWlyIHJlZ2lvbiBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgc28gdGhlIHNvdXJjZXMgYXJlXFxuK1xcdCAqIG9yZGVyIDAgd2hhdGV2ZXIgLXMgYXNrZWQgdGhlIGZhdWx0IHBhdGggZm9yLiAgVGhhdCBtYXR0ZXJzIGZvciB0aGVcXG4rXFx0ICogY2FzZXMgYnVpbHQgYXJvdW5kIGEgaG9sZSAtLSBhIGxhcmdlIHNvdXJjZSBmb2xpbyB3b3VsZCBmaWxsIGl0IGluXFxuK1xcdCAqIGFuZCB0aGUgd2luZG93IHdvdWxkIGNvbGxhcHNlIGFmdGVyIGFsbC5cXG4rXFx0ICogY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcyBlbmFibGVzIHRoZSBzb3VyY2Ugb3JkZXIgaXQgd2FudHMgb25cXG4rXFx0ICogdG9wIG9mIHRoaXMuXFxuK1xcdCAqL1xcbitcXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9ORVZFUjtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX09SREVSUzsgaSsrKVxcbitcXHRcXHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcXG4rXFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2NvbGxhcHNlX29yZGVyXS5lbmFibGVkID0gVEhQX01BRFZJU0U7XFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHdpbmRvd19jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbilcXG4re1xcbitcXHRyZXR1cm4gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBsZW4sIGNvbGxhcHNlX29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XFxuK31cXG4rXFxuKy8qIE5vIGFsaWduZWQgd2luZG93IGluIFtwLCBwICsgbGVuKSBpcyBiYWNrZWQgYXQgdGhlIHRhcmdldCBvcmRlci4gKi9cXG4rc3RhdGljIGJvb2wgd2luZG93X25vdF9jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbilcXG4re1xcbitcXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xcbitcXHRjaGFyICphZGRyID0gcDtcXG4rXFxuK1xcdGZvciAoOyBsZW4gXFx1MDAzZT0gd2luZG93OyBhZGRyICs9IHdpbmRvdywgbGVuIC09IHdpbmRvdykge1xcbitcXHRcXHRpZiAod2luZG93X2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3Modm9pZClcXG4re1xcbitcXHQvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xcbitcXHRyZXR1cm4ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMzApO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbitcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xcbitcXHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxcXG5cXFwiKTtcXG4rXFxuK1xcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwICsgd2luZG93LCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwLCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwICsgMiAqIHdpbmRvdyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgaHBhZ2VfcG1kX3NpemUgLSAyICogd2luZG93KSlcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcbitcXHR2YWxpZGF0ZV9tZW1vcnkocCwgd2luZG93LCAyICogd2luZG93KTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xcbitcXHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxcXG5cXFwiKTtcXG4rXFxuK1xcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXFxcIik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxcbitcXHRcXHRmYWlsKFxcXCJUaW1lb3V0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCwgbXRocF93aW5kb3dfc2l6ZSgpKSlcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcbitcXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4rXFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcXG4rXFx0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDtcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XFxuK1xcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXFxcblxcXCIpO1xcbitcXG4rXFx0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwICsgd2luZG93LCB3aW5kb3cpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbitcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRpbnQgc291cmNlX29yZGVyID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgOiBNSU5fTVRIUF9PUkRFUjtcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdC8qIFNvdXJjZXMgbXVzdCBiZSBhIHN1cHBvcnRlZCBtVEhQIG9yZGVyIHN0cmljdGx5IGJlbG93IHRoZSB0YXJnZXQuICovXFxuK1xcdGlmIChzb3VyY2Vfb3JkZXIgXFx1MDAzZT0gY29sbGFwc2Vfb3JkZXIgfHxcXG4rXFx0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2Mgc291cmNlX29yZGVyKSkpIHtcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFxcXCIlczogbm8gc291cmNlIG9yZGVyIGJlbG93IHRhcmdldFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgICAgX19mdW5jX18pO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcXG4rXFxuK1xcdC8qIEZhdWx0IHRoZSB3aG9sZSByZWdpb24gYXMgb3JkZXItQHNvdXJjZV9vcmRlciBmb2xpb3MuICovXFxuK1xcdHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XFxuK1xcdHNldHRpbmdzLmh1Z2VwYWdlc1tzb3VyY2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIG9yZGVyIGlzIGVuYWJsZWQgYW5kIHN1cHBvcnRlZCwgYnV0IHRoZSBhbGxvY2F0b3IgY2FuIHN0aWxsIGZhbGxcXG4rXFx0ICogYmFjayB1bmRlciBmcmFnbWVudGF0aW9uLiAgVGhhdCBsZWF2ZXMgbm90aGluZyB0byBjb2xsYXBzZSBmcm9tLFxcbitcXHQgKiB3aGljaCBpcyB0aGUgbWFjaGluZSdzIGFuc3dlciByYXRoZXIgdGhhbiBhIHJlYXNvbiB0byBlbmQgdGhlIHJ1bi5cXG4rXFx0ICovXFxuK1xcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJObyBvcmRlci0lZCBzb3VyY2VzIHRvIGNvbGxhcHNlLi4uXFxcIiwgc291cmNlX29yZGVyKTtcXG4rXFx0XFx0c2tpcChcXFwiU2tpcFxcXCIpO1xcbitcXHRcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdFxcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXFxcIixcXG4rXFx0XFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxcbitcXHRcXHRmYWlsKFxcXCJUaW1lb3V0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdG9wcy1cXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuIHtcXG4gXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJcXFxcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdIFxcdTAwM2N0ZXN0IHR5cGVcXHUwMDNlIFtkaXJdXFxcXG5cXFxcblxcXCIpO1xcbkBAIC0xMjI2LDExICsxNTUxLDE1IEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuIFxcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0LXM6IG1USFAgc2l6ZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxcXG5cXFwiKTtcXG4gXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXFxcblxcXCIpO1xcbiBcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdC1jOiBjb2xsYXBzZSBvcmRlciBmb3IgbVRIUCBjb2xsYXBzZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxcXG5cXFwiKTtcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgRGVmYXVsdHMgdG8gZXZlcnkgc3VwcG9ydGVkIG9yZGVyIGJlbG93IHRoZSBQTUQuXFxcXG5cXFwiKTtcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgV2l0aCAtcywgLXMgbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXFxcblxcXCIpO1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBtaXhlZC1zb3VyY2UgY2FzZSAoc291cmNlIG9yZGVyIGJlbG93IHRoZSB0YXJnZXQpLlxcXFxuXFxcIik7XFxuIFxcdGV4aXQoMSk7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIHtcXG4rXFx0Ym9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlO1xcbiBcXHRpbnQgb3B0O1xcbiBcXHRjaGFyICpidWY7XFxuIFxcdGNvbnN0IGNoYXIgKnRva2VuO1xcbkBAIC0xMjQyLDYgKzE1NzEsNyBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0Y2FzZSAnYyc6XFxuIFxcdFxcdFxcdGNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpO1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcl9naXZlbiA9IHRydWU7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRjYXNlICdoJzpcXG4gXFx0XFx0ZGVmYXVsdDpcXG5AQCAtMTI0OSwxMiArMTU3OSwyNSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHR9XFxuIFxcdH1cXG4gXFxuK1xcdC8qXFxuK1xcdCAqIEJvdGggb3JkZXJzIGVuZCB1cCBhcyBhcnJheSBpbmRpY2VzIGFuZCBzaGlmdCBjb3VudHMsIHNvIG5laXRoZXJcXG4rXFx0ICogY2FuIGJlIG5lZ2F0aXZlLCBhbmQgYSB6ZXJvIGNvbGxhcHNlIG9yZGVyIGFza3MgZm9yIGJhc2UgcGFnZXMuXFxuK1xcdCAqL1xcbitcXHRpZiAoYW5vbl9vcmRlciBcXHUwMDNjIDAgfHwgYW5vbl9vcmRlciBcXHUwMDNlIGhwYWdlX3BtZF9vcmRlcilcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCItcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBocGFnZV9wbWRfb3JkZXIsIGFub25fb3JkZXIpO1xcbitcXHRpZiAoY29sbGFwc2Vfb3JkZXJfZ2l2ZW4gXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIChjb2xsYXBzZV9vcmRlciBcXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFxcdTAwM2UgaHBhZ2VfcG1kX29yZGVyKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCItYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBocGFnZV9wbWRfb3JkZXIsIGNvbGxhcHNlX29yZGVyKTtcXG4rXFxuIFxcdGFyZ3YgKz0gb3B0aW5kO1xcbiBcXHRhcmdjIC09IG9wdGluZDtcXG4gXFxuIFxcdGlmIChhcmdjID09IDApIHtcXG4tXFx0XFx0LyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi9cXG4rXFx0XFx0LyogRXZlcnl0aGluZyB0aGF0IG5lZWRzIG5vIGFyZ3VtZW50IG9mIGl0cyBvd246IGFub24sIGV2ZXJ5IGNvbnRleHQgKi9cXG4gXFx0XFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XFxuIFxcdFxcdG1hZHZpc2VfY29udGV4dCA9ICBcXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XFxuIFxcdFxcdGFub25fb3BzID0gXFx1MDAyNl9fYW5vbl9vcHM7XFxuIFxcdFxcdHJldHVybjtcXG5AQCAtMTI2NSwxMyArMTYwOCwxOSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXG4gXFx0aWYgKCFzdHJjbXAodG9rZW4sIFxcXCJhbGxcXFwiKSkge1xcbiBcXHRcXHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXFx1MDAyNl9fa2h1Z2VwYWdlZF9jb250ZXh0O1xcbitcXHRcXHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dDtcXG4gXFx0XFx0bWFkdmlzZV9jb250ZXh0ID0gIFxcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFxcXCJhbGxcXFwiIHN3ZWVwcyB0aGUgbVRIUCBjb250ZXh0IGluLCBidXQgaXQgb25seSBoYXMgYW5vblxcbitcXHRcXHQgKiBjYXNlczogc3RlcCBpdCBhc2lkZSBmb3IgdGhlIG90aGVyIG1lbV90eXBlcyByYXRoZXIgdGhhblxcbitcXHRcXHQgKiByZWZ1c2luZyB0aGUgd2hvbGUgcnVuLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0bXRocF9jb250ZXh0X2ltcGxpZWQgPSB0cnVlO1xcbiBcXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFxcXCJraHVnZXBhZ2VkXFxcIikpIHtcXG4gXFx0XFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcXFwibXRocF9raHVnZXBhZ2VkXFxcIikpIHtcXG4gXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XFxuLVxcdFxcdGlmIChjb2xsYXBzZV9vcmRlciBcXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFxcdTAwM2U9IGhwYWdlX3BtZF9vcmRlcilcXG4tXFx0XFx0XFx0dXNhZ2UoKTtcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcXFwibWFkdmlzZVxcXCIpKSB7XFxuIFxcdFxcdG1hZHZpc2VfY29udGV4dCA9ICBcXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XFxuIFxcdH0gZWxzZSB7XFxuQEAgLTEyODcsMjAgKzE2MzYsMjAgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICBcXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xcbiBcXHRcXHRhbm9uX29wcyA9IFxcdTAwMjZfX2Fub25fb3BzO1xcbiBcXHRcXHRzaG1lbV9vcHMgPSBcXHUwMDI2X19zaG1lbV9vcHM7XFxuLVxcdFxcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcXG4tXFx0XFx0XFx0dXNhZ2UoKTtcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXFxcImFub25cXFwiKSkge1xcbiBcXHRcXHRhbm9uX29wcyA9IFxcdTAwMjZfX2Fub25fb3BzO1xcbiBcXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcXFwiZmlsZVxcXCIpKSB7XFxuIFxcdFxcdHJlYWRfb25seV9maWxlX29wcyA9ICBcXHUwMDI2X19yZWFkX29ubHlfZmlsZV9vcHM7XFxuIFxcdFxcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9ICBcXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XFxuIFxcdFxcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcztcXG4tXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KVxcbitcXHRcXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXFx1MDAyNlxcdTAwMjYgIW10aHBfY29udGV4dF9pbXBsaWVkKVxcbiBcXHRcXHRcXHR1c2FnZSgpO1xcbitcXHRcXHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9IE5VTEw7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFxcXCJzaG1lbVxcXCIpKSB7XFxuIFxcdFxcdHNobWVtX29wcyA9IFxcdTAwMjZfX3NobWVtX29wcztcXG4tXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KVxcbitcXHRcXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXFx1MDAyNlxcdTAwMjYgIW10aHBfY29udGV4dF9pbXBsaWVkKVxcbiBcXHRcXHRcXHR1c2FnZSgpO1xcbitcXHRcXHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9IE5VTEw7XFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdHVzYWdlKCk7XFxuIFxcdH1cXG5AQCAtMTMyMiw5ICsxNjcxLDE0IEBAIHN0cnVjdCB0ZXN0X2Nhc2Uge1xcbiBcXHRzdHJ1Y3QgbWVtX29wcyAqb3BzO1xcbiBcXHRjb25zdCBjaGFyICpkZXNjO1xcbiBcXHR0ZXN0X2ZuIGZuO1xcbitcXHRpbnQgb3JkZXI7XFx0XFx0LyogbVRIUCBjb250ZXh0czogdGhlIGNvbGxhcHNlIG9yZGVyICovXFxuIH07XFxuIFxcbi0jZGVmaW5lIE1BWF9URVNUX0NBU0VTIDY0XFxuKy8qXFxuKyAqIEVub3VnaCBmb3IgZXZlcnkgY2FzZSBhdCBldmVyeSBvcmRlciB0aGUga2VybmVsIG9mZmVyczogdGhlIG1USFAgY29udGV4dFxcbisgKiBydW5zIGl0cyBjYXNlcyBvbmNlIHBlciBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cXG4rICovXFxuKyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2XFxuIHN0YXRpYyBzdHJ1Y3QgdGVzdF9jYXNlIHRlc3RfY2FzZXNbTUFYX1RFU1RfQ0FTRVNdO1xcbiBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XFxuIFxcbkBAIC0xMzM3LDYgKzE2OTEsNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XFxuIFxcdFxcdFxcdC5vcHNcXHQ9IG8sXFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHRcXHRcXHQuZGVzY1xcdD0gI3QsXFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHRcXHRcXHQuZm5cXHQ9IHQsXFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHRcXHRcXHQub3JkZXJcXHQ9IGNvbGxhcHNlX29yZGVyLFxcdFxcdFxcdFxcXFxcXG4gXFx0XFx0fTtcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdH1cXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdH0gd2hpbGUgKDApXFxuQEAgLTEzNzcsOCArMTczMiw4MyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcbiBcXHRwYXJzZV90ZXN0X3R5cGUoYXJnYywgYXJndik7XFxuIFxcbitcXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xcbitcXG4rXFx0XFx0aWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuKSB7XFxuK1xcdFxcdFxcdC8qIC1jIHBpbnMgb25lIG9yZGVyOyBpdCBoYXMgdG8gYmUgb25lIHdlIGNhbiBidWlsZCAqL1xcbitcXHRcXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIi1jIHRha2VzIGFuIG9yZGVyIGJlbG93IHRoZSBQTUQgb3JkZXIgKCVkKVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgaHBhZ2VfcG1kX29yZGVyKTtcXG4rXFx0XFx0XFx0aWYgKCEob3JkZXJzIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIpO1xcbitcXHRcXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzYz0gYW5vbl9vcmRlcilcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIi1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gY29sbGFwc2Vfb3JkZXI7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIE90aGVyd2lzZSBldmVyeSBvcmRlciBhIGNvbGxhcHNlIGNvdWxkIHByb2R1Y2UuICAtc1xcbitcXHRcXHRcXHQgKiBtYWtlcyB0aGUgZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlcixcXG4rXFx0XFx0XFx0ICogc28gYSB0YXJnZXQgYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2U6XFxuK1xcdFxcdFxcdCAqIHRoZSBzb3VyY2VzIGFyZSBhbHJlYWR5IHRoZSBzaXplIGJlaW5nIGFza2VkIGZvci5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGludCBmaXJzdCA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyICsgMSA6IE1JTl9NVEhQX09SREVSO1xcbitcXG4rXFx0XFx0XFx0aWYgKGZpcnN0IFxcdTAwM2MgTUlOX01USFBfT1JERVIpXFxuK1xcdFxcdFxcdFxcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XFxuK1xcdFxcdFxcdGZvciAoaW50IGkgPSBmaXJzdDsgaSBcXHUwMDNjIGhwYWdlX3BtZF9vcmRlcjsgaSsrKSB7XFxuK1xcdFxcdFxcdFxcdGlmIChvcmRlcnMgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGkpKVxcbitcXHRcXHRcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gaTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcXG4rXFx0XFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm1USFAgY2FzZXMgc2tpcHBlZDogbm8gb3JkZXIgYWJvdmUgdGhlIHNvdXJjZVxcXFxuXFxcIik7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XFxuK1xcdFxcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdFxcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcXFwiKTtcXG4rXFx0XFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiLCBPX1JET05MWSk7XFxuK1xcdFxcdGlmIChrcGFnZWZsYWdzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL2twYWdlZmxhZ3MpXFxcIik7XFxuK1xcdH1cXG4rXFxuIFxcdHNldGJ1ZihzdGRvdXQsIE5VTEwpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogVGhlIHBhZ2UgY2FjaGUgY2FwcyBmb2xpbyBvcmRlciBhdCBNQVhfUEFHRUNBQ0hFX09SREVSLCB3aGljaFxcbitcXHQgKiB4YXNfc3BsaXRfYWxsb2MoKSBwdXRzIGJlbG93IHRoZSBQTUQgb3JkZXIgb24gYXJtNjQgd2l0aCA2NEsgcGFnZXMuXFxuK1xcdCAqIEEgUE1ELXNpemVkIHBhZ2UgY2FjaGUgZm9saW8gaXMgdGhlbiBpbXBvc3NpYmxlLCBzbyB0aGUga2VybmVsXFxuK1xcdCAqIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5IGRlc2lnbiBhbmQgdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LlxcbitcXHQgKlxcbitcXHQgKiBUaGUgY2FwIGlzIG9uZSBnbG9iYWwsIHNvIGl0IHJ1bGVzIG91dCBldmVyeSBmaWxlIG1hcHBpbmcsIG5vdCBqdXN0XFxuK1xcdCAqIHNobWVtOiBzaG1lbV9odWdlX2dsb2JhbF9lbmFibGVkKCkgZHJvcHMgdGhlIFBNRCBvcmRlciBmcm9tIHdoYXQgaXRcXG4rXFx0ICogYWxsb3dzLCBhbmQgZmlsZV90aHBfZW5hYmxlZCgpIHJlZnVzZXMgYSByZWd1bGFyIGZpbGUgd2hvc2UgbWFwcGluZ1xcbitcXHQgKiBjYW5ub3QgaG9sZCBhIFBNRCBmb2xpby5cXG4rXFx0ICpcXG4rXFx0ICogVGhlIHBlci1vcmRlciBzaG1lbV9lbmFibGVkIGNvbnRyb2wgYmVsb3cgaXMgd2hhdCBtYWtlcyB0aGUgY2FwXFxuK1xcdCAqIHJlYWRhYmxlOiBpdCBpcyBjcmVhdGVkIGZvciB0aGUgb3JkZXJzIGluIFRIUF9PUkRFUlNfQUxMX0ZJTEVfREVGQVVMVCxcXG4rXFx0ICogd2hpY2ggaXMgdGhlIGNhcCBhbmQgbm90aGluZyBlbHNlLCBzbyB3aGV0aGVyIHRoZSBQTUQgb3JkZXIgaGFzIG9uZVxcbitcXHQgKiBhbnN3ZXJzIGZvciBhIHJlZ3VsYXIgZmlsZSBhcyBtdWNoIGFzIGZvciBzaG1lbS5cXG4rXFx0ICovXFxuK1xcdGlmICghKHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGhwYWdlX3BtZF9vcmRlcikpKSB7XFxuK1xcdFxcdGlmIChzaG1lbV9vcHMpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm5vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHNobWVtX29wcyA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKHJlYWRfb25seV9maWxlX29wcykge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xcbitcXHRcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSBOVUxMO1xcbitcXHRcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gTlVMTDtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoIWFub25fb3BzIFxcdTAwMjZcXHUwMDI2ICFzaG1lbV9vcHMgXFx1MDAyNlxcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcXG4rXFx0XFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIk5vdGhpbmcgbGVmdCB0byBjb2xsYXBzZSBpbnRvXFxcXG5cXFwiKTtcXG4rXFx0fVxcbitcXG4gXFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxO1xcbiBcXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc3dhcCA9IGhwYWdlX3BtZF9uciAvIDg7XFxuIFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyO1xcbkBAIC0xMzk2LDcgKzE4MjYsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTtcXG4tXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIG5yX2NvbGxhcHNlX29yZGVyczsgaSsrKSB7XFxuK1xcdFxcdGNvbGxhcHNlX29yZGVyID0gY29sbGFwc2Vfb3JkZXJzW2ldO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdH1cXG4rXFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG5AQCAtMTQwNCwxMCArMTg0NCw4IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7XFxuIFxcbiBcXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4tXFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcbi1cXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9tdGhwLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXG4gXFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxuQEAgLTE0NjMsNiArMTkwMSw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcbitcXHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXG4gXFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xcbiBcXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xcbkBAIC0xNDc4LDcgKzE5MTksMTUgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIG5yX3Rlc3RfY2FzZXM7IGkrKykge1xcbiBcXHRcXHRzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gXFx1MDAyNnRlc3RfY2FzZXNbaV07XFxuIFxcbi1cXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiXFxcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXFxcXG5cXFwiLCB0LVxcdTAwM2VkZXNjLCB0LVxcdTAwM2VjdHgtXFx1MDAzZW5hbWUsIHQtXFx1MDAzZW9wcy1cXHUwMDNlbmFtZSk7XFxuK1xcdFxcdGlmICh0LVxcdTAwM2VjdHggPT0gXFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcXG4rXFx0XFx0XFx0Y29sbGFwc2Vfb3JkZXIgPSB0LVxcdTAwM2VvcmRlcjtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIlxcXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzLCBvcmRlciAlZClcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB0LVxcdTAwM2VkZXNjLCB0LVxcdTAwM2VjdHgtXFx1MDAzZW5hbWUsIHQtXFx1MDAzZW9wcy1cXHUwMDNlbmFtZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHQtXFx1MDAzZW9yZGVyKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIlxcXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcXFxuXFxcIiwgdC1cXHUwMDNlZGVzYyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHQtXFx1MDAzZWN0eC1cXHUwMDNlbmFtZSwgdC1cXHUwMDNlb3BzLVxcdTAwM2VuYW1lKTtcXG4rXFx0XFx0fVxcbiBcXHRcXHR0LVxcdTAwM2Vmbih0LVxcdTAwM2VjdHgsIHQtXFx1MDAzZW9wcyk7XFxuIFxcdH1cXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjM2MDFjMDMwZDQzZTVcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcXG5AQCAtMCwwICsxLDYxMCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBraHVnZXBhZ2VkIHJhY2UgaGFybmVzcy5cXG4rICpcXG4rICogUnVucyBjb2xsYXBzZSBhZ2FpbnN0IGNvbmN1cnJlbnQgZmF1bHRzLCB0cmFuc2llbnQgR1VQIHBpbnNcXG4rICogKGd1cF90ZXN0KSwgZm9yaywgbXJlbWFwIGFuZCBNQURWX0RPTlRORUVEIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLCBpblxcbisgKiBvbmUgb2YgdGhyZWUgZHJpdmVyIG1vZGVzOlxcbisgKlxcbisgKiAgIHN0ZXBwZWRcXHRraHVnZXBhZ2VkLCBvbmUgZnVsbCBwYXNzIGF0IGEgdGltZSB0aHJvdWdoXFxuKyAqXFx0XFx0a2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSwgc28gYSBzdGVwIGNvdmVycyBhIGtub3duIGV4dGVudDtcXG4rICogICBmcmVlXFx0a2h1Z2VwYWdlZCBsZWZ0IHRvIHJ1biAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCksIGZvciBzb2FrO1xcbisgKiAgIG1hZHZpc2VcXHRNQURWX0NPTExBUFNFIGluIGEgbG9vcC5cXG4rICpcXG4rICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuICBPY2N1cGFuY3kgcnVucyBhdCBib3RoIGVuZHNcXG4rICogb2Ygd2hhdCBtVEhQIGNvbGxhcHNlIHN1cHBvcnRzOiBtYXhfcHRlc19ub25lIDAsIHdoZXJlIGEgd2luZG93IG11c3QgYmVcXG4rICogZnVsbHkgcG9wdWxhdGVkLCBhbmQgSFBBR0VfUE1EX05SIC0gMSwgd2hlcmUgYSB3aW5kb3cgZnVsbCBvZiBob2xlc1xcbisgKiBjb2xsYXBzZXMgdG9vLiAgVGhlIGhvbGVzIGFyZSBub3QgY29waWVkIGZyb20gYW55d2hlcmUgLS0gdGhleSBhcmVcXG4rICogemVyby1maWxsZWQsIGFuZCByZS1jaGVja2VkIHVuZGVyIHRoZSBwYWdlIHRhYmxlIGxvY2sgYXQgaW5zdGFsbCB0aW1lIGluXFxuKyAqIGNhc2UgYSByYWNpbmcgZmF1bHQgZ290IHRoZXJlIGZpcnN0LlxcbisgKlxcbisgKiAtcCBhZGRzIG1lbW9yeSBwcmVzc3VyZSB0byBhbnkgb2YgdGhlIGFib3ZlOiBNQURWX1BBR0VPVVQgY3ljbGluZ1xcbisgKiBvbiBhIGRlZGljYXRlZCBuZWlnaGJvciByZWdpb24gKHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuOyBza2lwcGVkXFxuKyAqIHdpdGggYSBub3RlIHdoZW4gdGhlIGhvc3QgaGFzIG5vIHN3YXApIGFuZCBhIGNvbXBhY3RfbWVtb3J5IHRyaWdnZXJcXG4rICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UncyBmcmVlemVcXG4rICogd2l0aCByZWZjb3VudCBlbGV2YXRpb24gYW5kIG1pZ3JhdGlvbiBlbnRyaWVzIG9mIGl0cyBvd24pLlxcbisgKlxcbisgKiBDb3JyZWN0bmVzcyBzaWduYWxzOiBldmVyeSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3JcXG4rICogemVybyAoTUFEVl9ET05UTkVFRCksIG5ldmVyIGFueXRoaW5nIGVsc2UuICBUaGUgZmF1bHRlcnMgYW5kIHRoZSBmb3JrXFxuKyAqIGNoaWxkcmVuIGNoZWNrIHRoYXQgY29udGludW91c2x5LCBhIGZpbmFsIHN3ZWVwIGNoZWNrcyBpdCBvbmNlIG1vcmUsIHBsdXNcXG4rICogd2hhdGV2ZXIgREVCVUdfVk0gLyBwYWdlX3RhYmxlX2NoZWNrIC8gS0FTQU4gLyBsb2NrZGVwIHJlcG9ydCBpblxcbisgKiBkbWVzZywgd2hpY2ggdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBpbnNwZWN0LlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZXJybm8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy90aW1lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwia3NlbGZ0ZXN0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ2bV91dGlsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJodWdlcGFnZV9zZXR0aW5ncy5oXFxcIlxcbisjaW5jbHVkZSBcXFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFxcXCJcXG4rXFxuKyNkZWZpbmUgQkFTRV9BRERSXFx0KCh2b2lkICopKDFVTCBcXHUwMDNjXFx1MDAzYyAzMCkpXFxuK1xcbisvKlxcbisgKiBTaGFyZWQgcGxheWdyb3VuZCBmb3IgZmF1bHRzL3BpbnMvZm9yay9kb250bmVlZDogc2V2ZXJhbCBQTUQtc2l6ZWRcXG4rICogYXJlYXMgdGhlIHJhY2luZyB0aHJlYWRzIHNwcmVhZCBhY3Jvc3MsIHBsdXMgb25lIGFyZWEgb3duZWQgYnkgdGhlXFxuKyAqIG1yZW1hcCB0aHJlYWQuIE1vcmUgYXJlYXMgbWVhbnMgbW9yZSBpbmRlcGVuZGVudCByZWdpb25zIGNvbGxhcHNpbmdcXG4rICogYXQgb25jZTsgdGhlIGRlZmF1bHQgc3VpdHMgYSBub3JtYWwgbWFjaGluZS4gT24gYSBtZW1vcnktY29uc3RyYWluZWRcXG4rICogaG9zdCAtLSBvciB1bmRlciBlbXVsYXRpb24sIHdoZXJlIGEgNTEyTSBQTUQgKGFybTY0LzY0SykgbWFrZXMgdGhlXFxuKyAqIGRlZmF1bHQgcGxheWdyb3VuZCBtdWx0aS1naWdhYnl0ZSAtLSBwYXNzIC1hIHRvIHNocmluayBpdC5cXG4rICovXFxuKyNkZWZpbmUgREVGQVVMVF9TSEFSRURfQVJFQVNcXHQzXFxuK3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzO1xcbitzdGF0aWMgaW50IG5yX2FyZWFzO1xcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcXG4rc3RhdGljIGNoYXIgKnJlZ2lvbjtcXHRcXHQvKiBOUl9BUkVBUyAqIGhwYWdlX3BtZF9zaXplICovXFxuK3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTtcXHQvKiByZWdpb24gKyBOUl9TSEFSRURfQVJFQVMgYXJlYXMgKi9cXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9zY3JhdGNoO1xcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xcbitzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1xcdC8qIC1wOiBkZWRpY2F0ZWQgcHJlc3N1cmUgcmVnaW9uICovXFxuK3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplO1xcbitzdGF0aWMgaW50IGd1cF9mZCA9IC0xO1xcbitzdGF0aWMgdm9sYXRpbGUgaW50IHN0b3A7XFxuK3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkO1xcbitcXG4rc3RhdGljIHVuc2lnbmVkIGludCBwYXR0ZXJuKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHZhbCA9ICh1bnNpZ25lZCBpbnQpcGFnZV9pZHggKiAyNjU0NDM1NzYxVTtcXG4rXFxuK1xcdHJldHVybiB2YWwgPyB2YWwgOiAxO1xcdC8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqL1xcbit9XFxuK1xcbisvKiBaZXJvIG1lYW5zIG5ldmVyIHdyaXR0ZW47IGFueXRoaW5nIGVsc2UgbXVzdCBiZSB0aGlzIHBhZ2UncyBwYXR0ZXJuICovXFxuK3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbClcXG4re1xcbitcXHQqdmFsID0gKih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xcbitcXG4rXFx0cmV0dXJuICp2YWwgXFx1MDAyNlxcdTAwMjYgKnZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCB2YWw7XFxuK1xcbitcXHRpZiAocGFnZV9pc19jb3JydXB0KHBhZ2VfaWR4LCBcXHUwMDI2dmFsKSkge1xcbitcXHRcXHRjb3JydXB0ZWQgPSAxO1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIHBhZ2VfaWR4LCB2YWwsIHBhdHRlcm4ocGFnZV9pZHgpKTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZClcXG4re1xcbitcXHRyZXR1cm4gbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7XFxuK31cXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRfcGFnZSh1bnNpZ25lZCBpbnQgKnNlZWQpXFxuK3tcXG4rXFx0cmV0dXJuICh1bnNpZ25lZCBsb25nKXJhbmRfcihzZWVkKSAlIHNoYXJlZF9wYWdlcygpO1xcbit9XFxuK1xcbisvKiBQYWdlcyBsZWZ0IGZyb20gQHBhZ2VfaWR4LCBzbyBhIHJhbmdlIG5ldmVyIHJlYWNoZXMgdGhlIG1yZW1hcCB0aHJlYWQncyBhcmVhICovXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJvb21fZnJvbSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBsb25nIHdhbnQpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBsZWZ0ID0gc2hhcmVkX3BhZ2VzKCkgLSBwYWdlX2lkeDtcXG4rXFxuK1xcdHJldHVybiB3YW50IFxcdTAwM2MgbGVmdCA/IHdhbnQgOiBsZWZ0O1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqZmF1bHRlcl9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcXHUwMDI2c2VlZCk7XFxuK1xcbitcXHRcXHRpZiAocmFuZF9yKFxcdTAwMjZzZWVkKSBcXHUwMDI2IDEpXFxuK1xcdFxcdFxcdCoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKSA9XFxuK1xcdFxcdFxcdFxcdHBhdHRlcm4ocGFnZV9pZHgpO1xcbitcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdGNoZWNrX3BhZ2UocGFnZV9pZHgpO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqZG9udG5lZWRfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXFx1MDAyNnNlZWQpO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIG5yID0gMVVMIFxcdTAwM2NcXHUwMDNjIChyYW5kX3IoXFx1MDAyNnNlZWQpICUgNik7XFx0LyogMS4uMzIgcGFnZXMgKi9cXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIE9uY2UgaW4gYSB3aGlsZSB6YXAgYSB3aG9sZSBQTUQtYWxpZ25lZCBhcmVhOiBvbmx5IGEgemFwXFxuK1xcdFxcdCAqIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZSByZWNsYWltXFxuK1xcdFxcdCAqIChDT05GSUdfUFRfUkVDTEFJTSksIHdoaWNoIGNhbiBmcmVlIHRoZSB0YWJsZSB1bmRlciBhXFxuK1xcdFxcdCAqIGNvbGxhcHNlIHRoYXQgaXMgbWlkd2F5IHRocm91Z2ggaXQuICBTdWItdGFibGUgemFwcyBuZXZlclxcbitcXHRcXHQgKiByZWFjaCB0aGF0IHBhdGguXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoIShyYW5kX3IoXFx1MDAyNnNlZWQpICUgNjQpKSB7XFxuK1xcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJlYSA9IHBhZ2VfaWR4IC9cXG4rXFx0XFx0XFx0XFx0XFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTtcXG4rXFxuK1xcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgYXJlYSAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUsXFxuK1xcdFxcdFxcdFxcdHJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLFxcbitcXHRcXHRcXHRcXHRNQURWX0RPTlRORUVEKTtcXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDUwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7fTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcXHUwMDI2c2VlZCk7XFxuK1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIG5yID0gcm9vbV9mcm9tKHBhZ2VfaWR4LCAxNik7XFxuK1xcbitcXHRcXHRndXAuYWRkciA9ICh1bnNpZ25lZCBsb25nKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XFxuK1xcdFxcdGd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7XFxuK1xcdFxcdGd1cC5ucl9wYWdlc19wZXJfY2FsbCA9IG5yO1xcbitcXHRcXHRndXAuZ3VwX2ZsYWdzID0gMTtcXHQvKiBGT0xMX1dSSVRFICovXFxuK1xcdFxcdC8qIFJhY2luZyBNQURWX0RPTlRORUVEIG1ha2VzIHRyYW5zaWVudCBmYWlsdXJlcyBleHBlY3RlZC4gKi9cXG4rXFx0XFx0aW9jdGwoZ3VwX2ZkLCBQSU5fRkFTVF9CRU5DSE1BUkssIFxcdTAwMjZndXApO1xcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpmb3JrZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHBpZF90IHBpZCA9IGZvcmsoKTtcXG4rXFxuK1xcdFxcdGlmIChwaWQgPT0gMCkge1xcbitcXHRcXHRcXHR1bnNpZ25lZCBpbnQgdmFsO1xcbitcXHRcXHRcXHRpbnQgYmFkID0gMDtcXG4rXFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIE5vIHN0ZGlvIGluIHRoZSBjaGlsZDogYSB0aHJlYWQgbWF5IGhhdmUgaGVsZFxcbitcXHRcXHRcXHQgKiBzdGRvdXQncyBsb2NrIHdoZW4gd2UgZm9ya2VkLCBhbmQgcHJpbnRpbmcgdW5kZXIgYW5cXG4rXFx0XFx0XFx0ICogaW5oZXJpdGVkIGxvY2sgaGFuZ3MuICBUaGUgcGFyZW50IHJlcG9ydHMgd2hhdCB0aGVcXG4rXFx0XFx0XFx0ICogZXhpdCBzdGF0dXMgc2F5cy5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgMTY7IGkrKylcXG4rXFx0XFx0XFx0XFx0YmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoXFx1MDAyNnNlZWQpLCBcXHUwMDI2dmFsKTtcXG4rXFx0XFx0XFx0X2V4aXQoYmFkKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAocGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRpbnQgd3N0YXR1cztcXG4rXFxuK1xcdFxcdFxcdGlmICh3YWl0cGlkKHBpZCwgXFx1MDAyNndzdGF0dXMsIDApIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJ3YWl0cGlkKClcXFwiKTtcXG4rXFx0XFx0XFx0LyogQSBjaGlsZCBraWxsZWQgb24gdGhlIHJlYWQgY291bnRzIHRvbywgbm90IGp1c3QgaXRzIGV4aXQgY29kZS4gKi9cXG4rXFx0XFx0XFx0aWYgKCFXSUZFWElURUQod3N0YXR1cykgfHwgV0VYSVRTVEFUVVMod3N0YXR1cykpXFxuK1xcdFxcdFxcdFxcdGNvcnJ1cHRlZCA9IDE7XFxuK1xcdFxcdH1cXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDAwKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgKm1yZW1hcHBlcl9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0dm9pZCAqcDtcXG4rXFxuK1xcdFxcdHAgPSBtcmVtYXAobXJlbWFwX2FyZWEsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0ICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9zY3JhdGNoKTtcXG4rXFx0XFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtcmVtYXAoKSBhd2F5XFxcIik7XFxuK1xcdFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgODsgaSsrKVxcbitcXHRcXHRcXHRtcmVtYXBfc2NyYXRjaFsocmFuZF9yKFxcdTAwMjZzZWVkKSAlXFxuK1xcdFxcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkpICogcGFnZV9zaXplXSA9IDE7XFxuK1xcdFxcdHAgPSBtcmVtYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0ICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9hcmVhKTtcXG4rXFx0XFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtcmVtYXAoKSBiYWNrXFxcIik7XFxuK1xcdFxcdHVzbGVlcChyYW5kX3IoXFx1MDAyNnNlZWQpICUgMjAwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuKy8qXFxuKyAqIC1wOiBzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBvZiBvdXIgb3duLiBUaGUgY29udGVudFxcbisgKiBjaGVjayBpcyBleGFjdDogYSBwYWdlIG91dCBhbmQgYmFjayB0aHJvdWdoIHN3YXAgbXVzdCBwcmVzZXJ2ZSB0aGVcXG4rICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgKnBhZ2VvdXRfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXHR1bnNpZ25lZCBsb25nIG5yID0gcGFnZW91dF9zaXplIC8gcGFnZV9zaXplO1xcbitcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnI7IGkrKylcXG4rXFx0XFx0Kih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdG1hZHZpc2UocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUsIE1BRFZfUEFHRU9VVCk7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuciBcXHUwMDI2XFx1MDAyNiAhc3RvcDsgaSsrKSB7XFxuK1xcdFxcdFxcdHVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgK1xcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGkgKiBwYWdlX3NpemUpO1xcbitcXG4rXFx0XFx0XFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XFxuK1xcdFxcdFxcdFxcdGNvcnJ1cHRlZCA9IDE7XFxuK1xcdFxcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBpLCB2YWwsIHBhdHRlcm4oaSkpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDAwKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLyogLXA6IGNvbXBhY3Rpb24gbWlncmF0ZXMgdGhlIGNvbGxhcHNlIHNvdXJjZXMgb3V0IGZyb20gdW5kZXIgdXMuICovXFxuK3N0YXRpYyB2b2lkICpjb21wYWN0b3JfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXHRpbnQgZmQgPSBvcGVuKFxcXCIvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnlcXFwiLCBPX1dST05MWSk7XFxuK1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJObyBjb21wYWN0X21lbW9yeTsgY29tcGFjdG9yIGlkbGVcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0aWYgKHdyaXRlKGZkLCBcXFwiMVxcXCIsIDEpIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHVzbGVlcCgxMDAwMCArIHJhbmRfcihcXHUwMDI2c2VlZCkgJSAxMDAwMDApO1xcbitcXHR9XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHN3YXBfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0Y2hhciBsaW5lWzI1Nl07XFxuK1xcdGludCBsaW5lcyA9IDA7XFxuK1xcdEZJTEUgKmZwID0gZm9wZW4oXFxcIi9wcm9jL3N3YXBzXFxcIiwgXFxcInJcXFwiKTtcXG4rXFxuK1xcdGlmICghZnApXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxcbitcXHRcXHRsaW5lcysrO1xcbitcXHRmY2xvc2UoZnApO1xcbitcXHRyZXR1cm4gbGluZXMgXFx1MDAzZSAxO1xcbit9XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGltZXZhbCB0djtcXG4rXFxuK1xcdGdldHRpbWVvZmRheShcXHUwMDI2dHYsIE5VTEwpO1xcbitcXHRyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICsgdHYudHZfdXNlYyAvIDEwMDA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuK3tcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFxuK1xcdFxcdFxcXCJVc2FnZToga2h1Z2VwYWdlZF9yYWNlIFstZCBzZWNvbmRzXSBbLW0gc3RlcHBlZHxmcmVlfG1hZHZpc2VdIFstel0gWy1wXSBbLWEgYXJlYXNdXFxcXG5cXFwiXFxuK1xcdFxcdFxcXCJcXFxcdFdpdGhvdXQgLW0sIGV2ZXJ5IG1vZGUgcnVucyBpbiB0dXJuLlxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtZDogc2Vjb25kcyBwZXIgbW9kZSAoZGVmYXVsdCA1KVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHRCb3RoIG9jY3VwYW5jeSBsaW1pdHMgcnVuIHVubGVzcyAteiBhc2tzIGZvciBob2xlcyBvbmx5LlxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtejogb25seSBtYXhfcHRlc19ub25lID0gSFBBR0VfUE1EX05SIC0gMSAoaG9sZS1oZWF2eSlcXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0UnVucyB3aXRoIGFuZCB3aXRob3V0IG1lbW9yeSBwcmVzc3VyZSB1bmxlc3MgLXAgYXNrcyBmb3JcXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0cHJlc3N1cmUgb25seS5cXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0LXA6IG9ubHkgd2l0aCB0aGUgcGFnZW91dCBhbmQgY29tcGFjdGlvbiB0aHJlYWRzXFxcXG5cXFwiXFxuK1xcdFxcdFxcXCJcXFxcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXFxcXG5cXFwiKTtcXG4rXFx0ZXhpdCgxKTtcXG4rfVxcbitcXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbit7XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XFxuK1xcdFxcdFxcXCJmYXVsdGVyXFxcIiwgXFxcImZhdWx0ZXIyXFxcIiwgXFxcImRvbnRuZWVkXFxcIiwgXFxcInBpbm5lclxcXCIsIFxcXCJmb3JrZXJcXFwiLFxcbitcXHRcXHRcXFwibXJlbWFwcGVyXFxcIiwgXFxcInBhZ2VvdXRcXFwiLCBcXFwiY29tcGFjdG9yXFxcIixcXG4rXFx0fTtcXG4rXFx0dm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7XFxuK1xcdFxcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcXG4rXFx0XFx0bXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sXFxuK1xcdH07XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgcGFnZW91dF9iaXQgPSAxVUwgXFx1MDAzY1xcdTAwM2MgNiwgY29tcGFjdG9yX2JpdCA9IDFVTCBcXHUwMDNjXFx1MDAzYyA3O1xcbitcXHRjb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTtcXG4rXFx0cHRocmVhZF90IHRocmVhZHNbQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpXTtcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgXFxcInN0ZXBwZWRcXFwiLCBcXFwiZnJlZVxcXCIsIFxcXCJtYWR2aXNlXFxcIiB9O1xcbitcXHRzdGF0aWMgY29uc3QgaW50IGFsbF9ub25lc1tdID0geyAwLCAxIH07XFx0Lyogc3RyaWN0LCBob2xlcyAqL1xcbitcXHRzdGF0aWMgY29uc3QgaW50IGFsbF9wcmVzc1tdID0geyAwLCAxIH07XFx0LyogcXVpZXQsIHVuZGVyIHByZXNzdXJlICovXFxuK1xcdGNvbnN0IGludCAqbm9uZXMgPSBhbGxfbm9uZXM7XFxuK1xcdGNvbnN0IGludCAqcHJlc3MgPSBhbGxfcHJlc3M7XFxuK1xcdGludCBucl9ub25lcyA9IEFSUkFZX1NJWkUoYWxsX25vbmVzKTtcXG4rXFx0aW50IG5yX3ByZXNzID0gQVJSQVlfU0laRShhbGxfcHJlc3MpO1xcbitcXHRjb25zdCBjaGFyICpvbmVfbW9kZVsxXTtcXG4rXFx0Y29uc3QgY2hhciAqIGNvbnN0ICptb2RlcyA9IGFsbF9tb2RlcztcXG4rXFx0aW50IG5yX21vZGVzID0gQVJSQVlfU0laRShhbGxfbW9kZXMpO1xcbitcXHRjb25zdCBjaGFyICptb2RlX2FyZyA9IE5VTEw7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZW5kX21zO1xcbitcXHRpbnQgZHVyYXRpb25fcyA9IDU7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdGhyZWFkX21hc2sgPSB+MFVMO1xcbitcXHR1bnNpZ25lZCBsb25nIGJhc2VfbWFzaztcXG4rXFx0aW50IG5yX2FyZWFzX2FyZyA9IDA7XFxuK1xcdGJvb2wgaG9sZXNfb25seSA9IGZhbHNlO1xcbitcXHRib29sIHByZXNzdXJlX29ubHkgPSBmYWxzZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXHRpbnQgc3RlcHMgPSAwO1xcbitcXHRpbnQgb3B0O1xcbitcXG4rXFx0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXFxcImE6ZDptOnQ6enBoXFxcIikpICE9IC0xKSB7XFxuK1xcdFxcdHN3aXRjaCAob3B0KSB7XFxuK1xcdFxcdGNhc2UgJ2EnOlxcbitcXHRcXHRcXHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdkJzpcXG4rXFx0XFx0XFx0ZHVyYXRpb25fcyA9IGF0b2kob3B0YXJnKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ20nOlxcbitcXHRcXHRcXHRtb2RlX2FyZyA9IG9wdGFyZztcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3QnOlxcbitcXHRcXHRcXHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xcbitcXHRcXHRcXHR0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3onOlxcbitcXHRcXHRcXHRob2xlc19vbmx5ID0gdHJ1ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3AnOlxcbitcXHRcXHRcXHRwcmVzc3VyZV9vbmx5ID0gdHJ1ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdHVzYWdlKCk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRpZiAoaG9sZXNfb25seSkge1xcbitcXHRcXHRub25lcyA9IGFsbF9ub25lcyArIDE7XFxuK1xcdFxcdG5yX25vbmVzID0gMTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHByZXNzdXJlX29ubHkpIHtcXG4rXFx0XFx0cHJlc3MgPSBhbGxfcHJlc3MgKyAxO1xcbitcXHRcXHRucl9wcmVzcyA9IDE7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtb2RlX2FyZykge1xcbitcXHRcXHRpZiAoc3RyY21wKG1vZGVfYXJnLCBcXFwic3RlcHBlZFxcXCIpIFxcdTAwMjZcXHUwMDI2IHN0cmNtcChtb2RlX2FyZywgXFxcImZyZWVcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgc3RyY21wKG1vZGVfYXJnLCBcXFwibWFkdmlzZVxcXCIpKVxcbitcXHRcXHRcXHR1c2FnZSgpO1xcbitcXHRcXHRvbmVfbW9kZVswXSA9IG1vZGVfYXJnO1xcbitcXHRcXHRtb2RlcyA9IG9uZV9tb2RlO1xcbitcXHRcXHRucl9tb2RlcyA9IDE7XFxuK1xcdH1cXG4rXFxuK1xcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XFxuK1xcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXFxcblxcXCIpO1xcbitcXG4rXFx0cGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTtcXG4rXFx0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xcbitcXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcbitcXHRndXBfZmQgPSBvcGVuKFxcXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFxcXCIsIE9fUkRXUik7XFxuK1xcdGlmIChndXBfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxcXG5cXFwiKTtcXG4rXFxuK1xcdG5yX3NoYXJlZF9hcmVhcyA9IG5yX2FyZWFzX2FyZyBcXHUwMDNlIDAgPyBucl9hcmVhc19hcmcgOiBERUZBVUxUX1NIQVJFRF9BUkVBUztcXG4rXFx0bnJfYXJlYXMgPSBucl9zaGFyZWRfYXJlYXMgKyAxO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIG1yZW1hcCB0aHJlYWQgbW92ZXMgaXRzIGFyZWEgdG8gdGhpcyBhZGRyZXNzIGFuZCBiYWNrLCBhbmRcXG4rXFx0ICogTVJFTUFQX0ZJWEVEIHVubWFwcyB3aGF0ZXZlciBpcyBpbiB0aGUgd2F5IHdpdGhvdXQgc2F5aW5nIHNvLiAgQ2xhaW1cXG4rXFx0ICogdGhlIGFkZHJlc3MgaGVyZSwgc28gYSBsYXlvdXQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGlzIGFzc3VtcHRpb25cXG4rXFx0ICogZmFpbHMgbm93IGluc3RlYWQgb2YgbG9zaW5nIGEgbWFwcGluZyBsYXRlci4gIE5vdGhpbmcgZWxzZSBpbiB0aGVcXG4rXFx0ICogcHJvY2VzcyBtYXBzIHRoaXMgbG93OiB0aHJlYWQgc3RhY2tzIGFuZCBtYWxsb2MgYXJlbmFzIGNvbWUgZnJvbSB0aGVcXG4rXFx0ICogdG9wLWRvd24gbW1hcCBhcmVhLCB3ZWxsIGFib3ZlLlxcbitcXHQgKi9cXG4rXFx0bXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiArIDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xcbitcXHRpZiAobW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIFBST1RfTk9ORSxcXG4rXFx0XFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsXFxuK1xcdFxcdCAtMSwgMCkgIT0gKHZvaWQgKiltcmVtYXBfc2NyYXRjaClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgbXJlbWFwIHNjcmF0Y2hcXFwiKTtcXG4rXFxuK1xcdGJhc2VfbWFzayA9IHRocmVhZF9tYXNrO1xcbitcXHRpZiAoIXN3YXBfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdC8qIE5vIHN3YXAsIG5vIGFub24gcmVjbGFpbTogY29tcGFjdGlvbi1vbmx5IHByZXNzdXJlLiAqL1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibm8gc3dhcDogdGhlIHBhZ2VvdXQgdGhyZWFkIHN0YXlzIGlkbGVcXFxcblxcXCIpO1xcbitcXG4rXFx0a3NmdF9zZXRfcGxhbihucl9tb2RlcyAqIG5yX25vbmVzICogbnJfcHJlc3MpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEEgYmFzZSBlbnRyeSBmb3IgdGhlIHN0YWNrLCBzbyB0aGF0IHRoZSBwb3AgYXQgdGhlIGVuZCBvZiBhIG1vZGVcXG4rXFx0ICogYWx3YXlzIGhhcyBzb21ldGhpbmcgdG8gd3JpdGUgYmFjazogdGhwX3BvcF9zZXR0aW5ncygpIG9uIGFuIGVtcHR5XFxuK1xcdCAqIHN0YWNrIGhhcyBubyBzZXR0aW5ncyB0byBhcHBseSBhbmQgZ2l2ZXMgdXAuXFxuK1xcdCAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Zm9yIChpbnQgcnVuID0gMDsgcnVuIFxcdTAwM2MgbnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzOyBydW4rKykge1xcbitcXHRcXHRpbnQgcmVtID0gcnVuICUgKG5yX25vbmVzICogbnJfcHJlc3MpO1xcbitcXHRcXHRjb25zdCBjaGFyICptb2RlID0gbW9kZXNbcnVuIC8gKG5yX25vbmVzICogbnJfcHJlc3MpXTtcXG4rXFx0XFx0Ym9vbCBob2xlcyA9IG5vbmVzW3JlbSAvIG5yX3ByZXNzXTtcXG4rXFx0XFx0Ym9vbCBwcmVzc3VyZSA9IHByZXNzW3JlbSAlIG5yX3ByZXNzXTtcXG4rXFxuK1xcdFxcdHRocmVhZF9tYXNrID0gYmFzZV9tYXNrO1xcbitcXHRcXHRpZiAoIXByZXNzdXJlKVxcbitcXHRcXHRcXHR0aHJlYWRfbWFzayBcXHUwMDI2PSB+KHBhZ2VvdXRfYml0IHwgY29tcGFjdG9yX2JpdCk7XFxuK1xcdFxcdGVsc2UgaWYgKCFzd2FwX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRcXHR0aHJlYWRfbWFzayBcXHUwMDI2PSB+cGFnZW91dF9iaXQ7XFxuK1xcbitcXHRcXHR0aHBfcmVhZF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXHRcXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xcbitcXHRcXHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XFxuK1xcdFxcdHNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xcbitcXHRcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID1cXG4rXFx0XFx0XFx0c3RyY21wKG1vZGUsIFxcXCJmcmVlXFxcIikgPyAxMDAwIDogMDtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSAxMDtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIG1USFAgY29sbGFwc2Ugb25seSBzdXBwb3J0cyB0aGUgdHdvIGVuZHMgb2YgdGhlIG9jY3VwYW5jeVxcbitcXHRcXHQgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuXFxuK1xcdFxcdCAqIFN0cmljdCBuZWVkcyBhIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3csIHdoaWNoIGlzIHJhcmUgdW5kZXJcXG4rXFx0XFx0ICogcmFjaW5nIE1BRFZfRE9OVE5FRUQ7IGhvbGUtaGVhdnkgd2luZG93cyBjb2xsYXBzZSBpbnN0ZWFkLFxcbitcXHRcXHQgKiBzbyB0aGUgdHdvIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/XFxuK1xcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgLSAxIDogMDtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cXG4rXFx0XFx0XFx0bnJfYXJlYXMgKiAoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpICogODtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX09SREVSUzsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSlcXG4rXFx0XFx0XFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBQb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZGUsIGJlZm9yZSB0aGUgbmV4dCBvbmUuICovXFxuK1xcdFxcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRcXHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8XFxuK1xcdFxcdFxcdCAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xcbitcXHRcXHRpZiAocmVnaW9uICE9IEJBU0VfQUREUilcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgcGxheWdyb3VuZFxcXCIpO1xcbitcXHRcXHRtcmVtYXBfYXJlYSA9IHJlZ2lvbiArIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xcbitcXG4rXFx0XFx0aWYgKHRocmVhZF9tYXNrIFxcdTAwMjYgcGFnZW91dF9iaXQpIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3RcXG4rXFx0XFx0XFx0ICogdG8gZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvXFxuK1xcdFxcdFxcdCAqIFsxNk0sIDY0TV0uXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7XFxuK1xcdFxcdFxcdHBhZ2VvdXRfc2l6ZSA9IHBhZ2VvdXRfc2l6ZSBcXHUwMDNjICgxNlVMIFxcdTAwM2NcXHUwMDNjIDIwKSA/XFxuK1xcdFxcdFxcdFxcdCAgICAgICAoMTZVTCBcXHUwMDNjXFx1MDAzYyAyMCkgOlxcbitcXHRcXHRcXHRcXHQgICAgICAgcGFnZW91dF9zaXplIFxcdTAwM2UgKDY0VUwgXFx1MDAzY1xcdTAwM2MgMjApID9cXG4rXFx0XFx0XFx0XFx0ICAgICAgICg2NFVMIFxcdTAwM2NcXHUwMDNjIDIwKSA6IHBhZ2VvdXRfc2l6ZTtcXG4rXFx0XFx0XFx0cGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XFxuK1xcdFxcdFxcdGlmIChwYWdlb3V0X2FyZWEgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgcGFnZW91dCBhcmVhXFxcIik7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdC8qIFBvcHVsYXRlIHNvIHRoZSBmaXJzdCBwYXNzIGhhcyBzb21ldGhpbmcgdG8gY29sbGFwc2UuICovXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSsrKVxcbitcXHRcXHRcXHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XFxuK1xcdFxcdG1lbXNldChtcmVtYXBfYXJlYSwgMSwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHRtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfdGhyZWFkczsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICghKHRocmVhZF9tYXNrIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSkpIHtcXG4rXFx0XFx0XFx0XFx0dGhyZWFkc1tpXSA9IDA7XFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGlmIChwdGhyZWFkX2NyZWF0ZShcXHUwMDI2dGhyZWFkc1tpXSwgTlVMTCwgdGhyZWFkX2Zuc1tpXSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgKHZvaWQgKikoaSArIDEpKSlcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJwdGhyZWFkX2NyZWF0ZSgpXFxcIik7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGVuZF9tcyA9IG5vd19tcygpICsgZHVyYXRpb25fcyAqIDEwMDBVTDtcXG4rXFx0XFx0aWYgKCFzdHJjbXAobW9kZSwgXFxcInN0ZXBwZWRcXFwiKSkge1xcbitcXHRcXHRcXHR3aGlsZSAobm93X21zKCkgXFx1MDAzYyBlbmRfbXMgXFx1MDAyNlxcdTAwMjYgIWNvcnJ1cHRlZCkge1xcbitcXHRcXHRcXHRcXHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpXFxuK1xcdFxcdFxcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwia2h1Z2VwYWdlZCBwYXNzIHRpbWVkIG91dFxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdFxcdHN0ZXBzKys7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fSBlbHNlIGlmICghc3RyY21wKG1vZGUsIFxcXCJmcmVlXFxcIikpIHtcXG4rXFx0XFx0XFx0d2hpbGUgKG5vd19tcygpIFxcdTAwM2MgZW5kX21zIFxcdTAwMjZcXHUwMDI2ICFjb3JydXB0ZWQpXFxuK1xcdFxcdFxcdFxcdHVzbGVlcCgxMDAgKiAxMDAwKTtcXG4rXFx0XFx0fSBlbHNlIHtcXHQvKiBtYWR2aXNlICovXFxuK1xcdFxcdFxcdHdoaWxlIChub3dfbXMoKSBcXHUwMDNjIGVuZF9tcyBcXHUwMDI2XFx1MDAyNiAhY29ycnVwdGVkKSB7XFxuK1xcdFxcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9zaGFyZWRfYXJlYXM7IGkrKykge1xcbitcXHRcXHRcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiArIGkgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfQ09MTEFQU0UpO1xcbitcXHRcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdFxcdG1hZHZpc2UocmVnaW9uLCBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0XFx0TUFEVl9ET05UTkVFRCk7XFxuK1xcdFxcdFxcdFxcdHN0ZXBzKys7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0c3RvcCA9IDE7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl90aHJlYWRzOyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKHRocmVhZHNbaV0pXFxuK1xcdFxcdFxcdFxcdHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LyogRmluYWwgaW50ZWdyaXR5IHN3ZWVwLiAqL1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcXG4rXFx0XFx0XFx0Y2hlY2tfcGFnZShpKTtcXG4rXFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCxcXG4rXFx0XFx0XFx0XFx0IFxcXCIlcy8lcyVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgbW9kZSwgaG9sZXMgPyBcXFwiaG9sZXNcXFwiIDogXFxcInN0cmljdFxcXCIsXFxuK1xcdFxcdFxcdFxcdCBwcmVzc3VyZSA/IFxcXCIvcHJlc3N1cmVcXFwiIDogXFxcIlxcXCIsXFxuK1xcdFxcdFxcdFxcdCBkdXJhdGlvbl9zLCBzdGVwcyk7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBIYW5kIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB0aGUgc2V0dGluZ3MgYmFjayBiZWZvcmUgdGhlXFxuK1xcdFxcdCAqIG5leHQgbW9kZTogaXQgbWFwcyB0aGUgcmVnaW9uIGF0IHRoZSBzYW1lIGZpeGVkIGFkZHJlc3MsXFxuK1xcdFxcdCAqIGFuZCBpdHMgc2NhbiBjYWRlbmNlIGRpZmZlcnMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRtdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0XFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xcbitcXHRcXHRcXHRtdW5tYXAocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUpO1xcbitcXHRcXHRcXHRwYWdlb3V0X2FyZWEgPSBOVUxMO1xcbitcXHRcXHR9XFxuK1xcdFxcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0XFx0c3RvcCA9IDA7XFxuK1xcdFxcdHN0ZXBzID0gMDtcXG4rXFxuK1xcdFxcdGlmIChjb3JydXB0ZWQpIHtcXG4rXFx0XFx0XFx0LyogTWVtb3J5IGlzIHN1c3BlY3Q7IHRoZSByZXN0IHdvdWxkIHByb3ZlIG5vdGhpbmcuICovXFxuK1xcdFxcdFxcdHdoaWxlICgrK3J1biBcXHUwMDNjIG5yX21vZGVzICogbnJfbm9uZXMgKiBucl9wcmVzcykge1xcbitcXHRcXHRcXHRcXHRyZW0gPSBydW4gJSAobnJfbm9uZXMgKiBucl9wcmVzcyk7XFxuK1xcbitcXHRcXHRcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIiVzLyVzJXM6IHNraXBwZWQgYWZ0ZXIgY29ycnVwdGlvblxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgbW9kZXNbcnVuIC8gKG5yX25vbmVzICogbnJfcHJlc3MpXSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgbm9uZXNbcmVtIC8gbnJfcHJlc3NdID9cXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgXFxcImhvbGVzXFxcIiA6IFxcXCJzdHJpY3RcXFwiLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBwcmVzc1tyZW0gJSBucl9wcmVzc10gP1xcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBcXFwiL3ByZXNzdXJlXFxcIiA6IFxcXCJcXFwiKTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xcbitcXHRrc2Z0X2ZpbmlzaGVkKCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzBkM2ZiNTE5ZmIyY1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xcbkBAIC0wLDAgKzEsMjE3IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIFN5bmNocm9ub3VzIGtodWdlcGFnZWQgZHJpdmluZyBjaGVjay5cXG4rICpcXG4rICogUmFjZSB0ZXN0cyBkcml2ZSBraHVnZXBhZ2VkIHRocm91Z2ggdGhlIGV4aXN0aW5nIHN5c2ZzIGNvbnRyb2xzOiBhXFxuKyAqIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGFuZCBmdWxsX3NjYW5zXFxuKyAqIGFkdmFuY2luZyBieSB0d28gaXMgYSBjb21wbGV0aW9uIGJhcnJpZXIgZm9yIG9uZSBmdWxsIHBhc3MgdGhhdFxcbisgKiBzdGFydGVkIGFmdGVyIHNldHVwIChraHVnZXBhZ2VkX2Z1bGxfcGFzcygpKS4gVmVyaWZ5IHRoZSBwYWlyIGdpdmVzXFxuKyAqIGRldGVybWluaXN0aWMsIGF0dHJpYnV0YWJsZSByZXN1bHRzOiBvbmUgYmFycmllciBzdGVwIG92ZXIgb25lXFxuKyAqIHByZXBhcmVkIHdpbmRvdyBwcm9kdWNlcyBleGFjdGx5IG9uZSBjb2xsYXBzZSBhdHRlbXB0IG9uIHRoYXRcXG4rICogd2luZG93J3Mgc291cmNlIHBhZ2VzIChtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSBldmVudHMgZmlsdGVyZWRcXG4rICogYnkgc291cmNlIFBGTiBhbmQgb3JkZXIpIGFuZCB0aGUgd2luZG93IGlzIGNvbGxhcHNlZFxcbisgKiBhZnRlcndhcmRzLCByZXBlYXRhYmx5LlxcbisgKlxcbisgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBzZXQgdG8gNjBzIHRvIHByb3ZlIHRoZSB3YWtlIHBhdGg6IHdpdGhvdXRcXG4rICogdGhlIHdha2UsIG9uZSBiYXJyaWVyIHN0ZXAgd291bGQgc2xlZXAgbXVsdGlwbGVzIG9mIHRoYXQgYW5kIGJsb3dcXG4rICogdGhlIHRpbWVvdXQuIEl0IGFsc28ga2VlcHMgdGhlIGRhZW1vbiBmcm9tIGZyZWUtcnVubmluZyBiZXR3ZWVuXFxuKyAqIHN0ZXBzLCBwZXIgdGhlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZGlzY2lwbGluZS5cXG4rICovXFxuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJrc2VsZnRlc3QuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInZtX3V0aWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImh1Z2VwYWdlX3NldHRpbmdzLmhcXFwiXFxuK1xcbisjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFxcdTAwM2NcXHUwMDNjIDMwKSlcXG4rI2RlZmluZSBUQVJHRVRfT1JERVIgMlxcdC8qIHNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXFxuKyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1XFxuK1xcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcXG4rc3RhdGljIGludCB0cmFjZV9ldmVudHNfZmQgPSAtMTtcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XFxuK1xcbisvKlxcbisgKiBFYWNoIHN0ZXAgc3dpdGNoZXMgdGhlIGV2ZW50cyBvZmYgYWdhaW4sIGJ1dCBhIGhlbHBlciBjYW4gc3RpbGwgZ2l2ZSB1cFxcbisgKiBvbiB1cyBpbiBiZXR3ZWVuIChhIGZhaWxpbmcgc3lzZnMgd3JpdGUgZW5kcyB0aGUgdGVzdCBmcm9tIGluc2lkZVxcbisgKiB0aHBfd3JpdGVfbnVtKCkpLCBhbmQgaHVnZV9tZW1vcnkgZXZlbnRzIGxlZnQgb24gYXJlIHRoZSB3aG9sZSBtYWNoaW5lJ3NcXG4rICogcHJvYmxlbSwgbm90IHRoaXMgdGVzdCdzLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgdHJhY2VfZXZlbnRzX29mZih2b2lkKVxcbit7XFxuK1xcdGlmICh0cmFjZV9ldmVudHNfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0dHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpO1xcbit9XFxuK1xcbisvKlxcbisgKiBDb3VudCBjb2xsYXBzZSBhdHRlbXB0cyBhdHRyaWJ1dGFibGUgdG8gb3VyIHdpbmRvdzogbGVnYWN5LWVuZ2luZVxcbisgKiBpc29sYXRlIGV2ZW50cyB3aG9zZSBzY2FuX3BmbiBpcyBvbmUgb2YgdGhlIHdpbmRvdydzIHNvdXJjZSBQRk5zLFxcbisgKiBwbHVzIGJhdGNoLWVuZ2luZSBwZXItY2FuZGlkYXRlIGluc3RhbGwgZXZlbnRzIGF0IHRoZSB3aW5kb3cnc1xcbisgKiBhZGRyZXNzLiBFaXRoZXIgZW5naW5lIHJlcG9ydHMgZXhhY3RseSBvbmNlIHBlciBhdHRlbXB0LlxcbisgKi9cXG4rc3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxcbitcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgb3JkZXIpXFxuK3tcXG4rXFx0Y2hhciBsaW5lWzEwMjRdO1xcbitcXHRpbnQgY291bnQgPSAwO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gdHJhY2luZ19vcGVuX3RyYWNlKCk7XFxuK1xcdGlmICghZnApXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiQ2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xcbitcXHRcXHRjaGFyICpzO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHZhbDtcXG4rXFx0XFx0dW5zaWduZWQgaW50IG9yZDtcXG4rXFx0XFx0Y2hhciAqbztcXG4rXFx0XFx0aW50IGk7XFxuK1xcbitcXHRcXHRzID0gc3Ryc3RyKGxpbmUsIFxcXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTpcXFwiKTtcXG4rXFx0XFx0aWYgKHMpIHtcXG4rXFx0XFx0XFx0aWYgKHNzY2FuZihzLCBcXFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4XFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgXFx1MDAyNnZhbCkgIT0gMSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdG8gPSBzdHJzdHIocywgXFxcIm9yZGVyPVxcXCIpO1xcbitcXHRcXHRcXHRpZiAoIW8gfHwgc3NjYW5mKG8sIFxcXCJvcmRlcj0ldVxcXCIsIFxcdTAwMjZvcmQpICE9IDEgfHxcXG4rXFx0XFx0XFx0ICAgIG9yZCAhPSBvcmRlcilcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wZm5zOyBpKyspIHtcXG4rXFx0XFx0XFx0XFx0aWYgKHZhbCA9PSBwZm5zW2ldKSB7XFxuK1xcdFxcdFxcdFxcdFxcdGNvdW50Kys7XFxuK1xcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdHMgPSBzdHJzdHIobGluZSwgXFxcIm1tX2NvbGxhcHNlX2NhbmRpZGF0ZTpcXFwiKTtcXG4rXFx0XFx0aWYgKHMpIHtcXG4rXFx0XFx0XFx0aWYgKCFzdHJzdHIocywgXFxcInBhc3M9aW5zdGFsbFxcXCIpIHx8XFxuK1xcdFxcdFxcdCAgICAhc3Ryc3RyKHMsIFxcXCJyZXN1bHQ9c3VjY2VlZGVkXFxcIikpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHRvID0gc3Ryc3RyKHMsIFxcXCJhZGRyPVxcXCIpO1xcbitcXHRcXHRcXHRpZiAoIW8gfHwgc3NjYW5mKG8sIFxcXCJhZGRyPTB4JWx4XFxcIiwgXFx1MDAyNnZhbCkgIT0gMSB8fFxcbitcXHRcXHRcXHQgICAgdmFsICE9IGFkZHIpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHRvID0gc3Ryc3RyKHMsIFxcXCJvcmRlcj1cXFwiKTtcXG4rXFx0XFx0XFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcXFwib3JkZXI9JXVcXFwiLCBcXHUwMDI2b3JkKSAhPSAxIHx8XFxuK1xcdFxcdFxcdCAgICBvcmQgIT0gb3JkZXIpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHRjb3VudCsrO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0ZmNsb3NlKGZwKTtcXG4rXFx0cmV0dXJuIGNvdW50O1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxcbit7XFxuK1xcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUjtcXG4rXFx0Y29uc3QgaW50IG5yX3BhZ2VzID0gMSBcXHUwMDNjXFx1MDAzYyBUQVJHRVRfT1JERVI7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuc1sxIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUl07XFxuK1xcdGJvb2wgY29sbGFwc2VkLCBwYXNzZWQ7XFxuK1xcdGludCBhdHRyaWJ1dGVkO1xcbitcXHRjaGFyICpwO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XFxuK1xcdGlmIChwICE9IEJBU0VfQUREUilcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgd2luZG93XFxcIik7XFxuK1xcbitcXHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XFxuK1xcdFxcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0XFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIENsZWFyIGZpcnN0OiB3aXRoIHRoZSBldmVudHMgc3RpbGwgb2ZmIHRoZXJlIGlzIG5vdGhpbmcgdG8gdW5kby4gKi9cXG4rXFx0aWYgKHRyYWNpbmdfY2xlYXJfdHJhY2UoKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxcXFxuXFxcIik7XFxuK1xcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCB0cnVlKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcXFxuXFxcIik7XFxuK1xcbitcXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcXG4rXFx0LyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXFxuK1xcdHBhc3NlZCA9IGtodWdlcGFnZWRfZnVsbF9wYXNzKDEyMCk7XFxuK1xcbitcXHQvKiBPZmYgYmVmb3JlIGFueXRoaW5nIHRoYXQgY2FuIGdpdmUgdXA6IHRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlLiAqL1xcbitcXHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkNhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcXFxuXFxcIik7XFxuK1xcdGlmICghcGFzc2VkKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcImtodWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xcXFxuXFxcIik7XFxuK1xcbitcXHRjb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XFxuK1xcdGF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCAodW5zaWduZWQgbG9uZylwLFxcbitcXHRcXHRcXHRcXHQgICAgICBUQVJHRVRfT1JERVIpO1xcbitcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXFx1MDAyNlxcdTAwMjYgYXR0cmlidXRlZCA9PSAxLFxcbitcXHRcXHRcXHQgXFxcInN0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTtcXG4rXFxuK1xcdG11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK31cXG4rXFxuK2ludCBtYWluKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xcbitcXG4rXFx0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcXFxuXFxcIik7XFxuK1xcdGlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUikpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgVEFSR0VUX09SREVSKTtcXG4rXFxuK1xcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcXG4rXFx0aWYgKCFocGFnZV9wbWRfc2l6ZSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRwYWdlbWFwX2ZkID0gb3BlbihcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAocGFnZW1hcF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXFxcIik7XFxuK1xcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJvcGVuKFxcXFxcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXFxcXFwiKSByZXF1aXJlcyByb290XFxcXG5cXFwiKTtcXG4rXFx0dHJhY2VfZXZlbnRzX2ZkID0gdHJhY2luZ19ldmVudHNfb3BlbihcXFwiaHVnZV9tZW1vcnlcXFwiKTtcXG4rXFx0aWYgKHRyYWNlX2V2ZW50c19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XFxcXG5cXFwiKTtcXG4rXFx0YXRleGl0KHRyYWNlX2V2ZW50c19vZmYpO1xcbitcXG4rXFx0a3NmdF9zZXRfcGxhbihOUl9JVEVSQVRJT05TKTtcXG4rXFxuK1xcdHRocF9zYXZlX3NldHRpbmdzKCk7XFxuK1xcdHRocF9yZWFkX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XFxuK1xcdHNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUztcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTtcXG4rXFx0LyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi9cXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMIFxcdTAwM2NcXHUwMDNjIDI0O1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XFxuK1xcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi9cXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9JVEVSQVRJT05TOyBpKyspXFxuK1xcdFxcdG9uZV9zdGVwKGkpO1xcbitcXG4rXFx0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcXG4rXFxuK1xcdGtzZnRfZmluaXNoZWQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXFxuaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXFxuQEAgLTIwLDcgKzIwLDYgQEBcXG4gXFxuICNkZWZpbmUgVFdPTUVHXFx0XFx0KDJcXHUwMDNjXFx1MDAzYzIwKVxcbiAjZGVmaW5lIFJVTlRJTUVcXHRcXHQoMjApXFxuLSNkZWZpbmUgQUxJR04oeCwgYSlcXHQoKCh4KSArIChhIC0gMSkpIFxcdTAwMjYgKH4oKGEpIC0gMSkpKVxcbiBcXG4gSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpXFxuIFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXFxuaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTVcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXFxuQEAgLTQwMiw2ICs0MDIsMTIgQEAgQ0FURUdPUlk9XFxcInBmbm1hcFxcXCIgcnVuX3Rlc3QgLi9wZm5tYXBcXG4gIyBDT1cgdGVzdHNcXG4gQ0FURUdPUlk9XFxcImNvd1xcXCIgcnVuX3Rlc3QgLi9jb3dcXG4gXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2tcXG4rXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9zeW5jX2NoZWNrXFxuK1xcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZVxcbitcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXFxuIFxcbiBDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMlxcbkBAIC00MTAsOCArNDE2LDYgQEAgQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxcbiBcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDQgYWxsOnNobWVtXFxuIFxcbi1DQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLWMgNCBtdGhwX2todWdlcGFnZWQ6YW5vblxcbi1cXG4gIyBUcnkgdG8gY3JlYXRlIFhGUyBpZiBub3QgcHJvdmlkZWRcXG4gaWYgWyAteiBcXFwiJHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH1cXFwiIF07IHRoZW5cXG4gICAgIGlmIHRlc3Rfc2VsZWN0ZWQgXFxcInRocFxcXCI7IHRoZW5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcXG5pbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXFxuQEAgLTQyLDY4ICs0Miw2IEBAIGNvbnN0IGNoYXIgKmtwYWdlZmxhZ3NfcHJvYyA9IFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIjtcXG4gaW50IHBhZ2VtYXBfZmQ7XFxuIGludCBrcGFnZWZsYWdzX2ZkO1xcbiBcXG4tc3RhdGljIGJvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxcbi1cXHRcXHRpbnQga3BhZ2VmbGFnc19mZClcXG4te1xcbi1cXHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xcbi1cXHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xcbi1cXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbi1cXHR1bnNpZ25lZCBsb25nIHBmbl9oZWFkO1xcbi1cXHR1aW50NjRfdCBwZm5fZmxhZ3M7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcGZuO1xcbi1cXHR1bnNpZ25lZCBsb25nIGk7XFxuLVxcbi1cXHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xcbi1cXG4tXFx0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xcbi1cXHRpZiAocGZuID09IC0xVUwpXFxuLVxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFxuLVxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuLVxcdFxcdGdvdG8gZmFpbDtcXG4tXFxuLVxcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXFxuLVxcdGlmICghb3JkZXIpIHtcXG4tXFx0XFx0aWYgKHBmbl9mbGFncyBcXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXFxuLVxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFx0XFx0cmV0dXJuIHRydWU7XFxuLVxcdH1cXG4tXFxuLVxcdC8qIG5vbiBUSFAgZm9saW8gKi9cXG4tXFx0aWYgKCEocGZuX2ZsYWdzIFxcdTAwMjYgS1BGX1RIUCkpXFxuLVxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFxuLVxcdHBmbl9oZWFkID0gcGZuIFxcdTAwMjYgfihucl9wYWdlcyAtIDEpO1xcbi1cXG4tXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbi1cXHRcXHRnb3RvIGZhaWw7XFxuLVxcbi1cXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xcbi1cXHRpZiAoKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXFxuLVxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFxuLVxcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xcbi1cXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xcbi1cXHRcXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIGksIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbi1cXHRcXHRcXHRnb3RvIGZhaWw7XFxuLVxcdFxcdGlmICgocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcXG4tXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXHR9XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLFxcbi1cXHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXFxuLVxcdCAqL1xcbi1cXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0cmV0dXJuIHRydWU7XFxuLVxcbi1cXHQvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXFxuLVxcdHJldHVybiAocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncztcXG4tZmFpbDpcXG4tXFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXFxcblxcXCIpO1xcbi1cXHRyZXR1cm4gZmFsc2U7XFxuLX1cXG4tXFxuIHN0YXRpYyBpbnQgY2hlY2tfYWZ0ZXJfc3BsaXRfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLFxcbiBcXHRcXHRpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycylcXG4ge1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcXG5pbmRleCA4MGJjOWY1OTdiNTIxLi5lZTEzMzQ3NzgzOTFmIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xcbkBAIC00OTQsNiArNDk0LDE1MSBAQCBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncylcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRpbnQga3BhZ2VmbGFnc19mZClcXG4re1xcbitcXHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xcbitcXHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xcbitcXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbitcXHR1bnNpZ25lZCBsb25nIHBmbl9oZWFkO1xcbitcXHR1aW50NjRfdCBwZm5fZmxhZ3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuO1xcbitcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xcbitcXG4rXFx0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xcbitcXHRpZiAocGZuID09IC0xVUwpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXFxuK1xcdGlmICghb3JkZXIpIHtcXG4rXFx0XFx0aWYgKHBmbl9mbGFncyBcXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIG5vbiBUSFAgZm9saW8gKi9cXG4rXFx0aWYgKCEocGZuX2ZsYWdzIFxcdTAwMjYgS1BGX1RIUCkpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdHBmbl9oZWFkID0gcGZuIFxcdTAwMjYgfihucl9wYWdlcyAtIDEpO1xcbitcXG4rXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xcbitcXHRpZiAoKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xcbitcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xcbitcXHRcXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIGksIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbitcXHRcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdFxcdGlmICgocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLFxcbitcXHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXFxuK1xcdCAqL1xcbitcXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcbitcXHQvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXFxuK1xcdHJldHVybiAocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncztcXG4rZmFpbDpcXG4rXFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXFxcblxcXCIpO1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rXFxuKy8qXFxuKyAqIENoZWNrIHdoZXRoZXIgZXZlcnkgb3JkZXItQG9yZGVyIHdpbmRvdyBvZiBbc3RhcnQsIGxlbikgbWFwcyBleGFjdGx5IG9uZVxcbisgKiBmb2xpbyBvZiB0aGF0IG9yZGVyLCBoZWFkIHRvIHRhaWwuICBUaGUgYWRkcmVzcyByYW5nZSBtdXN0IGJlIG5hdHVyYWxseVxcbisgKiBhbGlnbmVkLCBlYWNoIHdpbmRvdydzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgYSB3aW5kb3cncyBmaXJzdFxcbisgKiBQRk4gbXVzdCBiZSB0aGUgZm9saW8gaGVhZC5cXG4rICpcXG4rICogVGhpcyBpcyB0aGUgY2hlY2sgXFxcImRpZCB0aGlzIHJhbmdlIGNvbGxhcHNlIGludG8gb3JkZXItQG9yZGVyIGZvbGlvc1xcXCI6IGFcXG4rICogd2luZG93IGFzc2VtYmxlZCBmcm9tIHBhcnRzIG9mIHNldmVyYWwgZm9saW9zLCBvciBtYXBwaW5nIGEgZm9saW8gc2hpZnRlZFxcbisgKiBmcm9tIGl0cyBuYXR1cmFsIHBvc2l0aW9uLCBmYWlscy5cXG4rICovXFxuK2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZClcXG4re1xcbitcXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbitcXHRjb25zdCBzaXplX3Qgd2luZG93ID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xcbitcXHRjaGFyICp2YWRkcjtcXG4rXFxuK1xcdGlmICgodWludHB0cl90KXN0YXJ0ICUgd2luZG93IHx8IGxlbiAlIHdpbmRvdylcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0Zm9yICh2YWRkciA9IHN0YXJ0OyB2YWRkciBcXHUwMDNjIHN0YXJ0ICsgbGVuOyB2YWRkciArPSB3aW5kb3cpIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRcXHQvKiBOb3QgcHJlc2VudCwgb3Igbm90IG1hcHBpbmcgdGhlIGZvbGlvIGhlYWQuICovXFxuK1xcdFxcdGlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcylcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0XFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkciArIGkgKiBwc2l6ZSgpKSAhPVxcbitcXHRcXHRcXHQgICAgcGZuICsgaSlcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRpZiAoIWlzX2JhY2tlZF9ieV9mb2xpbyh2YWRkciwgb3JkZXIsIHBhZ2VtYXBfZmQsXFxuK1xcdFxcdFxcdFxcdFxcdGtwYWdlZmxhZ3NfZmQpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbisjZGVmaW5lIFRSQUNFRlNfUk9PVCBcXFwiL3N5cy9rZXJuZWwvdHJhY2luZ1xcXCJcXG4rXFxuKy8qXFxuKyAqIE9wZW4gdGhlIGVuYWJsZSBmaWxlIG9mIG9uZSBmdHJhY2UgZXZlbnQgc3Vic3lzdGVtIChlLmcuIFxcXCJodWdlX21lbW9yeVxcXCIpLlxcbisgKiBSZXR1cm5zIGEgZGVzY3JpcHRvciBmb3IgdHJhY2luZ19ldmVudHNfZW5hYmxlKCksIG9yIC0xIGlmIHRyYWNlZnMgb3IgdGhlXFxuKyAqIHN1YnN5c3RlbSBpcyBub3QgdGhlcmUuICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSBzdGF0ZTogd2hvZXZlclxcbisgKiBzd2l0Y2hlcyB0aGVtIG9uIG93bnMgdGhlbSB1bnRpbCBpdCBzd2l0Y2hlcyB0aGVtIG9mZiwgaW5jbHVkaW5nIG9uIHRoZVxcbisgKiBwYXRocyB3aGVyZSB0aGUgdGVzdCBnaXZlcyB1cC5cXG4rICovXFxuK2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcXG4re1xcbitcXHRjaGFyIHBhdGhbMjU2XTtcXG4rXFxuK1xcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UIFxcXCIvZXZlbnRzLyVzL2VuYWJsZVxcXCIsXFxuK1xcdFxcdCBzdWJzeXMpO1xcbitcXHRyZXR1cm4gb3BlbihwYXRoLCBPX1dST05MWSk7XFxuK31cXG4rXFxuK2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSlcXG4re1xcbitcXHRpZiAocHdyaXRlKGZkLCBlbmFibGUgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIsIDEsIDApICE9IDEpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhci4gKi9cXG4raW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZClcXG4re1xcbitcXHRpbnQgZmQgPSBvcGVuKFRSQUNFRlNfUk9PVCBcXFwiL3RyYWNlXFxcIiwgT19XUk9OTFkgfCBPX1RSVU5DKTtcXG4rXFxuK1xcdGlmIChmZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGZvcGVuKFRSQUNFRlNfUk9PVCBcXFwiL3RyYWNlXFxcIiwgXFxcInJcXFwiKTtcXG4rfVxcbitcXG4gLyogSWYgYGlvY3Rscycgbm9uLU5VTEwsIHRoZSBhbGxvd2VkIGlvY3RscyB3aWxsIGJlIHJldHVybmVkIGludG8gdGhlIHZhciAqL1xcbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxcbiBcXHRcXHRcXHQgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxcbmluZGV4IDlhNDlhZjg4NzAyZTQuLjEwYzdiZTQ2ZTQ0Y2EgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuQEAgLTEwLDYgKzEwLDggQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuIFxcbiAjZGVmaW5lIEJJVF9VTEwobnIpICAgICAgICAgICAgICAgICAgICgxVUxMIFxcdTAwM2NcXHUwMDNjIChucikpXFxuKyNkZWZpbmUgQUxJR04oeCwgYSkgICAgICAgICAgICAgICAgICAgKCgoeCkgKyAoYSkgLSAxKSBcXHUwMDI2IH4oKGEpIC0gMSkpXFxuK1xcbiAjZGVmaW5lIFBNX1NPRlRfRElSVFkgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTUpXFxuICNkZWZpbmUgUE1fTU1BUF9FWENMVVNJVkUgICAgICAgICAgICAgQklUX1VMTCg1NilcXG4gI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KVxcbkBAIC05Nyw2ICs5OSwxMCBAQCBpbnQ2NF90IGFsbG9jYXRlX3RyYW5zaHVnZSh2b2lkICpwdHIsIGludCBwYWdlbWFwX2ZkKTtcXG4gaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpO1xcbiBpbnQgZ2F0aGVyX2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcXG4gXFx0XFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpO1xcbitib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0aW50IGtwYWdlZmxhZ3NfZmQpO1xcbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcXG4rXFx0XFx0XFx0XFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpO1xcbiBcXG4gaW50IHVmZmRfcmVnaXN0ZXIoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcXG4gXFx0XFx0ICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IpO1xcbkBAIC0xMTMsNiArMTE5LDEwIEBAIGludCBjbG9zZV9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwKTtcXG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xcbiBpbnQgcmVhZF9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgKnZhbCk7XFxuIGJvb2wgc29mdGRpcnR5X3N1cHBvcnRlZCh2b2lkKTtcXG4raW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKTtcXG4raW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKTtcXG4raW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZCk7XFxuK0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKTtcXG4gXFxuIHN0YXRpYyBpbmxpbmUgaW50IG9wZW5fc2VsZl9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwX291dClcXG4ge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNDo1OToxMi4zMjIzODM4MzJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxMDkwMTUwODA3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLywgd2hpY2ggZG8gbm90IGFmZmVjdCB0aGUga2VybmVsJ3MgZnVuY3Rpb25hbCBleGVjdXRpb24gZmxvdy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDY3YTE5ZTE3YTkxYjYxNWQwMDcxYzNkODQxMDM4MmU4MWMwZTkwODhcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyAxMiAxNDo1OToxMCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbkBAIC0xMDQsNiArMTA0LDkgQEAgVEVTVF9HRU5fRklMRVMgKz0gZ3VhcmQtcmVnaW9uc1xuIFRFU1RfR0VOX0ZJTEVTICs9IG1lcmdlXG4gVEVTVF9HRU5fRklMRVMgKz0gcm1hcFxuIFRFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX3NwbGl0X3JhY2VfdGVzdFxuK1RFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX29yZGVyX2NoZWNrXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9yYWNlXG4gXG4gaWZuZXEgKCQoQVJDSCksYXJtNjQpXG4gVEVTVF9HRU5fRklMRVMgKz0gc29mdC1kaXJ0eVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uOTMwMzBhNDJjM2NjZFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xuQEAgLTAsMCArMSwxMzcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogU2VsZi1jaGVjayBmb3IgdGhlIHZtX3V0aWwgZm9saW8tb3JkZXIgZGV0ZWN0aW9uIGhlbHBlcnMsXG4rICogaXNfYmFja2VkX2J5X2ZvbGlvKCkgYW5kIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoKS5cbisgKlxuKyAqIEZvciBldmVyeSBhbm9uIFRIUCBvcmRlciB0aGUga2VybmVsIHN1cHBvcnRzLCBmYXVsdCBtZW1vcnkgaW4gd2l0aCBvbmx5XG4rICogdGhhdCBvcmRlciBlbmFibGVkIGFuZCB2ZXJpZnkgdGhlIGhlbHBlcnMgcmVwb3J0IGV4YWN0bHkgdGhhdCBvcmRlcjpcbisgKiBub3QgYSBuZWlnaGJvdXJpbmcgb3JkZXIsIGFuZCBwbGFpbiA0SyBtZW1vcnkgYXMgb3JkZXIgMC4gVGhlIGhlbHBlcnNcbisgKiBhcmUgd2hhdCB0aGUga2h1Z2VwYWdlZCBtVEhQIHRlc3RzIHVzZSB0byBkZXRlY3QgY29sbGFwc2UgcmVzdWx0cywgc29cbisgKiB0aGV5IG11c3QgYWdyZWUgd2l0aCB0aGUga2VybmVsJ3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueVxuKyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uXG4rICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImtzZWxmdGVzdC5oXCJcbisjaW5jbHVkZSBcInZtX3V0aWwuaFwiXG4rI2luY2x1ZGUgXCJodWdlcGFnZV9zZXR0aW5ncy5oXCJcbitcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuK1xuKy8qIG1tYXAgYW4gYW5vbiBWTUEgb2YgZXhhY3RseSBAc2l6ZSBieXRlcyBhdCBhIEBzaXplLWFsaWduZWQgYWRkcmVzcy4gKi9cbitzdGF0aWMgY2hhciAqYWxsb2NfYWxpZ25lZChzaXplX3Qgc2l6ZSlcbit7XG4rXHRzaXplX3QgbGVuID0gc2l6ZSAqIDI7XG4rXHR1aW50cHRyX3QgYWxpZ25lZDtcbitcdGNoYXIgKnA7XG4rXG4rXHRwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbitcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKVwiKTtcbitcbitcdGFsaWduZWQgPSBBTElHTigodWludHB0cl90KXAsIHNpemUpO1xuK1x0aWYgKGFsaWduZWQgIT0gKHVpbnRwdHJfdClwKVxuK1x0XHRtdW5tYXAocCwgYWxpZ25lZCAtICh1aW50cHRyX3QpcCk7XG4rXHRpZiAoYWxpZ25lZCArIHNpemUgIT0gKHVpbnRwdHJfdClwICsgbGVuKVxuK1x0XHRtdW5tYXAoKGNoYXIgKilhbGlnbmVkICsgc2l6ZSxcbitcdFx0ICAgICAgICh1aW50cHRyX3QpcCArIGxlbiAtIGFsaWduZWQgLSBzaXplKTtcbitcbitcdHJldHVybiAoY2hhciAqKWFsaWduZWQ7XG4rfVxuK1xuKy8qXG4rICogRW5hYmxlIG9ubHkgQG9yZGVyIChvcmRlciAwOiBub3RoaW5nKSwgZmF1bHQgb25lIGFsaWduZWQgd2luZG93IGluIGFuZFxuKyAqIGNoZWNrIHRoZSBoZWxwZXJzIHNlZSBleGFjdGx5IEBvcmRlci5cbisgKi9cbitzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0c2l6ZV90IHNpemUgPSBwc2l6ZSgpIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdGJvb2wgb2sgPSB0cnVlO1xuK1x0Y2hhciAqcDtcbitcdGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0aWYgKG9yZGVyKVxuK1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0cCA9IGFsbG9jX2FsaWduZWQoc2l6ZSk7XG4rXHQqcCA9IDE7XG4rXG4rXHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIsXG4rXHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJvcmRlciAlZCBub3QgZGV0ZWN0ZWQgYWZ0ZXIgZmF1bHRcXG5cIiwgb3JkZXIpO1xuK1x0XHRvayA9IGZhbHNlO1xuK1x0fVxuK1xuK1x0LyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuK1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyIC0gMSxcbitcdFx0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsXG4rXHRcdFx0XHRcdFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgJWRcXG5cIixcbitcdFx0XHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHQvKiBPcmRlciAwIHBhZ2VzIG11c3Qgbm90IGxvb2sgbGlrZSBhbnkgbGFyZ2UgZm9saW8sIGFuZCB2aWNlIHZlcnNhLiAqL1xuK1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIDAsXG4rXHRcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLFxuK1x0XHRcdFx0XHRcdCAgICAga3BhZ2VmbGFnc19mZCkpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyIDBcXG5cIiwgb3JkZXIpO1xuK1x0XHRvayA9IGZhbHNlO1xuK1x0fVxuK1xuK1x0bXVubWFwKHAsIHNpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1xuK1x0a3NmdF90ZXN0X3Jlc3VsdChvaywgXCJvcmRlciAlZCBjbGFzc2lmaWVkXFxuXCIsIG9yZGVyKTtcbit9XG4rXG4raW50IG1haW4odm9pZClcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dW5zaWduZWQgbG9uZyBvcmRlcnM7XG4rXHRpbnQgb3JkZXI7XG4rXG4rXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuK1xuK1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cIik7XG4rXG4rXHRwYWdlbWFwX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvcGFnZW1hcFwiLCBPX1JET05MWSk7XG4rXHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCIpO1xuK1x0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCIvcHJvYy9rcGFnZWZsYWdzXCIsIE9fUkRPTkxZKTtcbitcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIm9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiKSByZXF1aXJlcyByb290XFxuXCIpO1xuK1xuK1x0b3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcbitcdGlmICghb3JkZXJzKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIk5vIHN1cHBvcnRlZCBUSFAgb3JkZXJzXFxuXCIpO1xuK1xuK1x0a3NmdF9zZXRfcGxhbihfX2J1aWx0aW5fcG9wY291bnRsKG9yZGVycykgKyAxKTtcbitcbitcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4rXHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRjaGVja19vcmRlcigwKTtcbitcdGZvciAob3JkZXIgPSAxOyBvcmRlciBcdTAwM2MgTlJfT1JERVJTOyBvcmRlcisrKSB7XG4rXHRcdGlmICghKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXIpKSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0Y2hlY2tfb3JkZXIob3JkZXIpO1xuK1x0fVxuK1xuK1xuK1x0a3NmdF9maW5pc2hlZCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5pbmRleCBlMjY0MmVjYTBkMDJiLi5kZjQyNmY5MjE4ZTcxIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5AQCAtNjUsNyArNjUsNiBAQCBlbnVtIHtcbiAjZGVmaW5lIEhNTV9QQVRIX01BWCAgICA2NFxuICNkZWZpbmUgTlRJTUVTXHRcdDEwXG4gXG4tI2RlZmluZSBBTElHTih4LCBhKSAoKCh4KSArIChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi9cbiBcbiAjaWZuZGVmIEZPTExfV1JJVEVcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuaW5kZXggZDc5MTdkY2UzYWJhYy4uOGFmY2RmOTc5M2JiNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbkBAIC0xODMsNiArMTgzLDE3IEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuKy8qXG4rICogV3JpdGUgb25seSBvbiBjaGFuZ2U6IGFueSBzdG9yZSB0byBhIGtodWdlcGFnZWQgc3lzZnMga25vYiB3YWtlcyB0aGVcbisgKiBkYWVtb24sIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHlcbisgKiBhc2tlZCBmb3IgLS0ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBpcyB0aGUgb25seSBzYW5jdGlvbmVkIHdha2UuXG4rICovXG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcbit7XG4rXHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcbitcdFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xuK31cbitcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiB7XG4gXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFx1MDAyNnNldHRpbmdzLVx1MDAzZWtodWdlcGFnZWQ7XG5AQCAtMTk4LDE1ICsyMDksMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHRcdFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVx1MDAzZXNobWVtX2VuYWJsZWRdKTtcbiBcdHRocF93cml0ZV9udW0oXCJ1c2VfemVyb19wYWdlXCIsIHNldHRpbmdzLVx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xuIFxuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvZGVmcmFnXCIsIGtodWdlcGFnZWQtXHUwMDNlZGVmcmFnKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wiLFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCIsXG4tXHRcdFx0a2h1Z2VwYWdlZC1cdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblwiLCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL2RlZnJhZ1wiLCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCIsXG4rXHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL21heF9wdGVzX25vbmVcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9wYWdlc190b19zY2FuXCIsIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4gXG4gXHRpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSlcbiBcdFx0d3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLVx1MDAzZXJlYWRfYWhlYWRfa2IpO1xuQEAgLTIzMCw2ICsyNDEsNDkgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuKy8qXG4rICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdFxuKyAqIHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZC4gZnVsbF9zY2FucyBtdXN0IGFkdmFuY2UgYnkgdHdvO1xuKyAqIGEgKzEgc3RlcCBtYXkgY29tcGxldGUgYSBwYXNzIHRoYXQgZXhhbWluZWQgdGhpcyBtbSBiZWZvcmUgdGhlXG4rICogY2FsbGVyJ3Mgc2V0dXAgd2FzIGluIHBsYWNlLlxuKyAqXG4rICogQW55IHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIHNvIHRoZSBiYXJyaWVyIHdvcmtzXG4rICogd2hhdGV2ZXIgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlIC0tIGJ1dCBhIHN0b3JlIGNhbiBiZSBsb3N0LlxuKyAqIF9fc2xlZXBfbWlsbGlzZWNzX3N0b3JlKCkgY2xlYXJzIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGFuZCB3YWtlcyB0aGVcbisgKiBxdWV1ZTsgaWYgdGhlIGRhZW1vbiBpcyBiZXR3ZWVuIHNjYW5zIHJhdGhlciB0aGFuIHNsZWVwaW5nLCBpdCBzZXRzXG4rICoga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgaXRzZWxmIG9uIHRoZSB3YXkgaW50byBraHVnZXBhZ2VkX3dhaXRfd29yaygpIGFuZFxuKyAqIHRoZW4gc2xlZXBzIGZvciB0aGUgZnVsbCBpbnRlcnZhbCwgaGF2aW5nIG5ldmVyIHNlZW4gdGhlIHN0b3JlLiAgU28ga2VlcFxuKyAqIHN0b3JpbmcgdW50aWwgdGhlIHBhc3MgbGFuZHM7IGEgc3RvcmUgd2hpbGUgdGhlIGRhZW1vbiBpcyBhd2FrZSBjb3N0c1xuKyAqIG5vdGhpbmcgYW5kIGRvZXMgbm90IHF1ZXVlIGFuIGV4dHJhIHBhc3MuXG4rICpcbisgKiBPbmUgd2FrZSBjb21wbGV0ZXMgb25lIGZ1bGwgcGFzcyBvbmx5IGlmIHRoZSB3aG9sZSBtbSBsaXN0IGZpdHMgaW5cbisgKiBvbmUgc2NhbiBiYXRjaCwgc28gY2FsbGVycyBtdXN0IHBhaXIgdGhpcyB3aXRoIGEgbGFyZ2VcbisgKiBwYWdlc190b19zY2FuLlxuKyAqL1xuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcbit7XG4rXHR1bnNpZ25lZCBsb25nIGRlYWRsaW5lX21zID0gdGltZW91dF9zICogMTAwMFVMO1xuK1x0dW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9XG4rXHRcdHRocF9yZWFkX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIik7XG4rXHR1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwO1xuK1x0aW50IHBhc3M7XG4rXG4rXHRmb3IgKHBhc3MgPSAwOyBwYXNzIFx1MDAzYyAyOyBwYXNzKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxuK1x0XHRcdHRocF9yZWFkX251bShcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1wiKSArIDE7XG4rXG4rXHRcdHdoaWxlICh0aHBfcmVhZF9udW0oXCJraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcIikgXHUwMDNjIHRhcmdldCkge1xuK1x0XHRcdGlmIChlbGFwc2VkX21zIFx1MDAzZT0gZGVhZGxpbmVfbXMpXG4rXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdFx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0XHRcdCAgICAgIHNsZWVwX21zKTtcbitcdFx0XHR1c2xlZXAoMTAgKiAxMDAwKTtcbitcdFx0XHRlbGFwc2VkX21zICs9IDEwO1xuK1x0XHR9XG4rXHR9XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4gc3RydWN0IHRocF9zZXR0aW5ncyAqdGhwX2N1cnJlbnRfc2V0dGluZ3Modm9pZClcbiB7XG4gXHRpZiAoIXNldHRpbmdzX2luZGV4KSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbmluZGV4IDcyNmM3M2M0M2MwNWIuLmJhN2QzODM3MGQ0MzMgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5AQCAtNzAsNiArNzAsNyBAQCBpbnQgdGhwX3JlYWRfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10pO1xuIHZvaWQgdGhwX3dyaXRlX3N0cmluZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3JlYWRfbnVtKGNvbnN0IGNoYXIgKm5hbWUpO1xuIHZvaWQgdGhwX3dyaXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4gXG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuQEAgLTgzLDYgKzg0LDggQEAgc3RhdGljIGlubGluZSB2b2lkIHRocF9zYXZlX3NldHRpbmdzKHZvaWQpXG4gXHRodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7XG4gfVxuIFxuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcyk7XG4rXG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCAwZDZjNzFlZDJmYWUzLi5mNTc3M2Q0NDc1NDI3IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcbkBAIC0zMSw2ICszMSwxMSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XG4gc3RhdGljIGludCBocGFnZV9wbWRfbnI7XG4gc3RhdGljIGludCBhbm9uX29yZGVyO1xuIHN0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXI7XG4rc3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfZ2l2ZW47XG4rc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTtcbitzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVycztcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTtcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcbiBcbiAjZGVmaW5lIFBJRF9TTUFQUyBcIi9wcm9jL3NlbGYvc21hcHNcIlxuICNkZWZpbmUgVEVTVF9GSUxFIFwiY29sbGFwc2VfdGVzdF9maWxlXCJcbkBAIC0yNDEsNiArMjQ2LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKVxuIFx0cmV0dXJuIHN3YXA7XG4gfVxuIFxuKy8qXG4rICogUGFnZSB0aGUgcmFuZ2Ugb3V0IGFuZCB3YWl0IGZvciB0aGUgc3dhcCBjb3VudCB0byBzYXkgc28uXG4rICpcbisgKiBUd28gdGhpbmdzIGdldCBpbiB0aGUgd2F5LiAgTUFEVl9QQUdFT1VUIGlzIGJlc3QgZWZmb3J0OlxuKyAqIHNocmlua19mb2xpb19saXN0KCkgbGVhdmVzIGEgZm9saW8gYWxvbmUgd2hlbiBpdCBjYW5ub3QgcmVjbGFpbSBpdCByaWdodFxuKyAqIGF3YXksIGFuZCBvbmUgc3RpbGwgdW5kZXIgd3JpdGViYWNrIGZyb20gYW4gZWFybGllciBwYWdlb3V0IGlzIHRoZSBjb21tb25cbisgKiBjYXNlLCBzbyB0aGUgY291bnQgdGhlIGNhbGxlciBhc2tzIGZvciBhcnJpdmVzIGEgbW9tZW50IGxhdGVyLiAgQW5kIGEgcmFuZ2VcbisgKiBhbiBlYXJsaWVyIGNvbGxhcHNlIGxlZnQgTUFEVl9IVUdFUEFHRSBpcyBvbmUga2h1Z2VwYWdlZCBpcyBzdGlsbCB3b3JraW5nXG4rICogb246IGNvbGxhcHNpbmcgYSByYW5nZSB3aXRoIHVwIHRvIG1heF9wdGVzX3N3YXAgcGFnZXMgc3dhcHBlZCBvdXQgbWVhbnNcbisgKiByZWFkaW5nIHRob3NlIHBhZ2VzIGJhY2sgaW4sIHNvIHRoZSBkYWVtb24gdW5kb2VzIHRoZSBwYWdlb3V0IGFzIGZhc3QgYXMgaXRcbisgKiBpcyBhc2tlZCBmb3IuICBLZWVwIHRoZSByYW5nZSBvdXQgb2YgaXRzIHJlYWNoOyB0aGUgY29sbGFwc2UgdGhlIGNhbGxlciBydW5zXG4rICogbmV4dCBwdXRzIE1BRFZfSFVHRVBBR0UgYmFjay5cbisgKlxuKyAqIEZhaWxpbmcgdG8gZ2V0IHRoZSBwYWdlcyBvdXQgaXMgdGhlIG1hY2hpbmUncyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJ3MgLS1cbisgKiBzd2FwIHRvbyBzbWFsbCwgc3dhcCBmdWxsLCBhIG1lbWNnIGNhcCwgYSBmb2xpbyBzdGlsbCB1bmRlciB3cml0ZWJhY2sgLS0gc29cbisgKiBjYWxsZXJzIHNraXAgcmF0aGVyIHRoYW4gZmFpbC4gIEFuIGVycm9yIGZyb20gbWFkdmlzZSgpIGlzIGRpZmZlcmVudCwgYW5kXG4rICogZW5kcyB0aGUgcnVuIGhlcmUuXG4rICovXG4rc3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0aW50IGk7XG4rXG4rXHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX05PSFVHRVBBR0UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSlcIik7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0MDsgaSsrKSB7XG4rXHRcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX1BBR0VPVVQpXCIpO1xuK1x0XHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0dXNsZWVwKDUwICogMTAwMCk7XG4rXHR9XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuIHN0YXRpYyB2b2lkICphbGxvY19tYXBwaW5nKGludCBucilcbiB7XG4gXHR2b2lkICpwO1xuQEAgLTU4Myw4ICs2MjMsMTAgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sXG4gXHRcdGludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBjb2xsYXBfb3JkZXI7XG4rXHQvKiBUaHJlZSBzZWNvbmRzIGFzIGEgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gdG8gY29sbGFwc2UgKi9cbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9zaXplO1xuK1x0aW50IHRpbWVvdXQgPSA2ICsgMiAqIChieXRlcyAvICgxMjhVTCBcdTAwM2NcdTAwM2MgMjApKTtcbiBcdGludCBmdWxsX3NjYW5zO1xuLVx0aW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi9cbiBcbiBcdC8qIFNhbml0eSBjaGVjayAqL1xuIFx0aWYgKCFvcHMtXHUwMDNlY2hlY2tfaHVnZShwLCBsZW4sIDAsIGhwYWdlX3NpemUpKVxuQEAgLTg1MywxMiArODk1LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXG4gXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4gXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFxuLVx0aWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfUEFHRU9VVClcIik7XG4tXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XG4rXHRpZiAoc3dhcG91dF9yYW5nZShwLCBwYWdlX3NpemUpKSB7XG4gXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1x0XHRza2lwKFwiQ291bGQgbm90IHN3YXAgb3V0XCIpO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbkBAIC04ODUsMTIgKzkyNSwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbi1cdGlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICsgMSkgKiBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVwiKTtcbi1cdGlmIChjaGVja19zd2FwKHAsIChtYXhfcHRlc19zd2FwICsgMSkgKiBwYWdlX3NpemUpKSB7XG4rXHRpZiAoc3dhcG91dF9yYW5nZShwLCAobWF4X3B0ZXNfc3dhcCArIDEpICogcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwiT0tcIik7XG4gXHR9IGVsc2Uge1xuLVx0XHRmYWlsKFwiRmFpbFwiKTtcbitcdFx0c2tpcChcIkNvdWxkIG5vdCBzd2FwIG91dFwiKTtcbiBcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG5AQCAtOTAyLDEyICs5NDAsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cbiBcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcdFx0a3NmdF9wcmludF9tc2coXCJTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCIsIG1heF9wdGVzX3N3YXAsXG4gXHRcdCAgICAgICBocGFnZV9wbWRfbnIpO1xuLVx0XHRpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVwiKTtcbi1cdFx0aWYgKGNoZWNrX3N3YXAocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbitcdFx0aWYgKHN3YXBvdXRfcmFuZ2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbiBcdFx0XHRzdWNjZXNzKFwiT0tcIik7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0ZmFpbChcIkZhaWxcIik7XG4rXHRcdFx0c2tpcChcIkNvdWxkIG5vdCBzd2FwIG91dFwiKTtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFxuQEAgLTk3NCw2ICsxMDEwLDE2IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbXBvdW5kX2V4dHJlbWUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHR2b2lkICpwO1xuIFx0aW50IGk7XG4gXG4rXHQvKlxuK1x0ICogVGhlIHRlc3QgbmVlZHMgaHBhZ2VfcG1kX25yIFBNRC1vcmRlciBhbGxvY2F0aW9ucywgd2hpY2ggaXMgbGlrZWx5IHRvXG4rXHQgKiBmYWlsIGZvciBsYXJnZSBQTUQgc2l6ZXMuICBTa2lwIGlmIHRoZSBQTUQgc2l6ZSBpcyBvdmVyIDMyTS5cbitcdCAqL1xuK1x0aWYgKGhwYWdlX3BtZF9zaXplIFx1MDAzZSAoMzJVTCBcdTAwM2NcdTAwM2MgMjApKSB7XG4rXHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcIiVzOiBQTUQgdG9vIGxhcmdlIGZvciBmYXVsdC10aW1lIFRIUCBjb25zdHJ1Y3Rpb25cXG5cIixcbitcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0a3NmdF9wcmludF9tc2coXCJDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xcblwiKTtcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGhwYWdlX3BtZF9ucjsgaSsrKSB7XG5AQCAtMTE2NCw2ICsxMjEwLDcyIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcbiBcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbiB9XG4gXG4rLypcbisgKiBDb250ZW50IHN0YXlzIGlzb2xhdGVkIHdoaWxlIGEgY28tc2hhcmVyIHdyaXRlcyBjb25jdXJyZW50bHkuIEEgc2hhcmVkXG4rICogc291cmNlIGlzIGNvcGllZCBsaXZlIChub3QgZnJvemVuKSwgcmVseWluZyBvbiBpdCBiZWluZyBDb1cgLSBpbW11dGFibGVcbisgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb3B5OyBhIGNvLXNoYXJlcidzIHdyaXRlIGdvZXMgdG8gYSBDb1cgY29weS4gVGhlXG4rICogY29sbGFwc2luZyBjaGlsZCBtdXN0IHNlZSB0aGUgcHJlLWZvcmsgY29udGVudCwgdGhlIHdyaXRpbmcgcGFyZW50IG9ubHlcbisgKiBpdHMgb3duIHdyaXRlcy5cbisgKi9cbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9mb3JrX2Nvd19yYWNlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgc2hhcmVkID0gNjQgKiBwYWdlX3NpemU7XG4rXHRjb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7XG4rXHRpbnQgd3N0YXR1cywgY2hpbGRfc3RhdHVzLCBpLCBuID0gc2hhcmVkIC8gcGFnZV9zaXplO1xuK1x0Lyogdm9sYXRpbGU6IHRoZSBsb29wIGJlbG93IG11c3QgcmVhbGx5IHN0b3JlLCBvbiBldmVyeSBpdGVyYXRpb24gKi9cbitcdHZvbGF0aWxlIGludCAqaXA7XG4rXHR2b2lkICpwO1xuK1xuK1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuK1x0aXAgPSBwO1xuK1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIHNoYXJlZCk7XHRcdC8qIHNoYXJlZCBwcmVmaXgsIHByZS1mb3JrIHBhdHRlcm4gKi9cbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiRm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cIik7XG4rXHRpZiAoIWZvcmsoKSkge1xuK1x0XHRpbnQgY29sbGFwc2Vfc3RhdHVzO1xuK1xuK1x0XHRvcHMtXHUwMDNlZmF1bHQocCwgc2hhcmVkLCBocGFnZV9wbWRfc2l6ZSk7XHQvKiBwcml2YXRlIHJlbWFpbmRlciAqL1xuK1x0XHRjLVx1MDAzZWNvbGxhcHNlKFwiQ29sbGFwc2UgYSByYW5nZSBzaGFyZWQgd2l0aCBhIHdyaXRpbmcgY28tc2hhcmVyXCIsXG4rXHRcdFx0ICAgIHAsIDEsIG9wcywgdHJ1ZSk7XG4rXHRcdGNvbGxhcHNlX3N0YXR1cyA9IGV4aXRfc3RhdHVzO1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGRlYWQwMDAwKVxuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdGlmIChpID09IG4pXG4rXHRcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0XHRlbHNlXG4rXHRcdFx0ZmFpbChcIkZhaWw6IGNoaWxkIGNvbnRlbnRcIik7XG4rXHRcdC8qIFRoZSBjb250ZW50IGNoZWNrIG11c3Qgbm90IGJ1cnkgYSBmYWlsZWQgY29sbGFwc2UuICovXG4rXHRcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXG4rXHRcdFx0ZXhpdF9zdGF0dXMgPSBjb2xsYXBzZV9zdGF0dXM7XG4rXHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0XHRfZXhpdChleGl0X3N0YXR1cyk7XG4rXHR9XG4rXG4rXHQvKiBIYW1tZXIgdGhlIHBhcmVudCdzIG93biB3cml0ZXMgb3ZlciB0aGUgc2hhcmVkIHByZWZpeC4gKi9cbitcdGZvciAoaW50IGl0ID0gMDsgaXQgXHUwMDNjIDIwMDAwMDsgaXQrKylcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKVxuK1x0XHRcdGlwW2kgKiBzdHJpZGVdID0gaSArIDB4YmVlZjAwMDA7XG4rXG4rXHR3YWl0KFx1MDAyNndzdGF0dXMpO1xuK1x0LyogQSBjaGlsZCB0aGF0IGRpZWQgcmVhZGluZyB0aGUgcmFjaW5nIHBhZ2VzIGlzIGEgZmFpbHVyZSwgbm90IGEgemVyby4gKi9cbitcdGNoaWxkX3N0YXR1cyA9IFdJRkVYSVRFRCh3c3RhdHVzKSA/IFdFWElUU1RBVFVTKHdzdGF0dXMpIDogS1NGVF9GQUlMO1xuK1xuK1x0a3NmdF9wcmludF9tc2coXCJDaGVjayB0aGUgcGFyZW50IHNlZXMgb25seSBpdHMgb3duIHdyaXRlcy4uLlwiKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkrKylcbitcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGJlZWYwMDAwKVxuK1x0XHRcdGJyZWFrO1xuK1x0aWYgKGkgPT0gbilcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbDogcGFyZW50IGNvbnRlbnRcIik7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdC8qIFNhbWUgYWdhaW46IG91ciBvd24gY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQncyB2ZXJkaWN0LiAqL1xuK1x0aWYgKGV4aXRfc3RhdHVzICE9IEtTRlRfRkFJTClcbitcdFx0ZXhpdF9zdGF0dXMgPSBjaGlsZF9zdGF0dXM7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiBcdFx0XHRcdFx0ICAgc3RydWN0IG1lbV9vcHMgKm9wcylcbiB7XG5AQCAtMTIwOSw2ICsxMzIxLDIxOSBAQCBzdGF0aWMgdm9pZCBtYWR2aXNlX3JldHJhY3RlZF9wYWdlX3RhYmxlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiBcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbiB9XG4gXG4rLyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqL1xuKyNkZWZpbmUgTUlOX01USFBfT1JERVIgMlxuK1xuKy8qXG4rICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBmb3IgdGhlIG10aHBfa2h1Z2VwYWdlZCBjb250ZXh0LiAgV2hhdFxuKyAqIHRoZXkgYWRkIG92ZXIgdGhlIGdlbmVyaWMgY2FzZXMgcnVuIHVuZGVyIHRoYXQgY29udGV4dCBpcyBwZXItd2luZG93XG4rICogZGV0ZWN0aW9uOiB3aGljaCBhbGlnbmVkIHdpbmRvdyBjb2xsYXBzZWQsIGFuZCB3aGljaCBvZiBpdHMgbmVpZ2hib3VycyBkaWRcbisgKiBub3QuICBjaGVja19odWdlKCkgYW5zd2VycyBob3cgbWFueSBmb2xpb3Mgb2YgdGhlIG9yZGVyIHRoZSByYW5nZSBob2xkcyxcbisgKiB3aGljaCBjYW5ub3QgdGVsbCBvbmUgd2luZG93IGZyb20gYW5vdGhlci5cbisgKlxuKyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgYW5kIHRoZSB0YXJnZXQgb3JkZXIgaXMgb25seVxuKyAqIGVuYWJsZWQgZm9yIG1hZHZpc2UsIHNvIHRoZSBzb3VyY2VzIGFyZSBhbHdheXMgb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlXG4rICogcHJvZHVjdCBjYW4gb25seSBoYXZlIGNvbWUgZnJvbSBraHVnZXBhZ2VkLlxuKyAqL1xuK3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKVxuK3tcbitcdHJldHVybiBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcHNlX29yZGVyO1xuK31cbitcbitzdGF0aWMgdm9pZCBtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKHZvaWQpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0aW50IGk7XG4rXG4rXHQvKlxuK1x0ICogVGhlIHRhcmdldCBvcmRlciwgZm9yIG1hZHZpc2Ugb25seSwgYW5kIG5vdGhpbmcgZWxzZSBlbmFibGVkOiB0aGVcbitcdCAqIGNhc2VzIGZhdWx0IHRoZWlyIHJlZ2lvbiBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgc28gdGhlIHNvdXJjZXMgYXJlXG4rXHQgKiBvcmRlciAwIHdoYXRldmVyIC1zIGFza2VkIHRoZSBmYXVsdCBwYXRoIGZvci4gIFRoYXQgbWF0dGVycyBmb3IgdGhlXG4rXHQgKiBjYXNlcyBidWlsdCBhcm91bmQgYSBob2xlIC0tIGEgbGFyZ2Ugc291cmNlIGZvbGlvIHdvdWxkIGZpbGwgaXQgaW5cbitcdCAqIGFuZCB0aGUgd2luZG93IHdvdWxkIGNvbGxhcHNlIGFmdGVyIGFsbC5cbitcdCAqIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMgZW5hYmxlcyB0aGUgc291cmNlIG9yZGVyIGl0IHdhbnRzIG9uXG4rXHQgKiB0b3Agb2YgdGhpcy5cbitcdCAqL1xuK1x0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRzZXR0aW5ncy5odWdlcGFnZXNbY29sbGFwc2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfTUFEVklTRTtcbitcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgd2luZG93X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxuK3tcbitcdHJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGxlbiwgY29sbGFwc2Vfb3JkZXIsXG4rXHRcdFx0XHRcdCAgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbit9XG4rXG4rLyogTm8gYWxpZ25lZCB3aW5kb3cgaW4gW3AsIHAgKyBsZW4pIGlzIGJhY2tlZCBhdCB0aGUgdGFyZ2V0IG9yZGVyLiAqL1xuK3N0YXRpYyBib29sIHdpbmRvd19ub3RfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4re1xuK1x0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcbitcdGNoYXIgKmFkZHIgPSBwO1xuK1xuK1x0Zm9yICg7IGxlbiBcdTAwM2U9IHdpbmRvdzsgYWRkciArPSB3aW5kb3csIGxlbiAtPSB3aW5kb3cpIHtcbitcdFx0aWYgKHdpbmRvd19jb2xsYXBzZWQoYWRkciwgd2luZG93KSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIGJvb2wga2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcyh2b2lkKVxuK3tcbitcdC8qIFdhaXQgdXAgdG8gMzAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXG4rXHRyZXR1cm4ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMzApO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuK1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuK1x0dm9pZCAqcDtcbitcbitcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuK1x0aWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cIik7XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi5cIik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAgKyB3aW5kb3csIHdpbmRvdykgXHUwMDI2XHUwMDI2XG4rXHRcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwLCB3aW5kb3cpIFx1MDAyNlx1MDAyNlxuK1x0XHQgd2luZG93X25vdF9jb2xsYXBzZWQocCArIDIgKiB3aW5kb3csXG4rXHRcdFx0XHQgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxuK1x0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRlbHNlXG4rXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1xuK1x0dmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4rXHRcdFx0XHRcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHR2b2lkICpwO1xuK1xuK1x0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xuK1xuK1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuK1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIHBhZ2Vfc2l6ZSk7XG4rXHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSB3aW5kb3cgd2l0aCBzaW5nbGUgUFRFIGVudHJ5IHByZXNlbnQuLi5cIik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIG10aHBfd2luZG93X3NpemUoKSkpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcbitcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuK1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcbitcdHZvaWQgKnA7XG4rXG4rXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4rXHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDtcbitcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbitcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCIpO1xuK1xuK1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4rXHRrc2Z0X3ByaW50X21zZyhcIkNvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlwiKTtcbitcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuK1x0XHRmYWlsKFwiVGltZW91dFwiKTtcbitcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgKyB3aW5kb3csIHdpbmRvdykpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0aW50IHNvdXJjZV9vcmRlciA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyIDogTUlOX01USFBfT1JERVI7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dm9pZCAqcDtcbitcbitcdC8qIFNvdXJjZXMgbXVzdCBiZSBhIHN1cHBvcnRlZCBtVEhQIG9yZGVyIHN0cmljdGx5IGJlbG93IHRoZSB0YXJnZXQuICovXG4rXHRpZiAoc291cmNlX29yZGVyIFx1MDAzZT0gY29sbGFwc2Vfb3JkZXIgfHxcbitcdCAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIHNvdXJjZV9vcmRlcikpKSB7XG4rXHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcIiVzOiBubyBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxuXCIsXG4rXHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbitcbitcdC8qIEZhdWx0IHRoZSB3aG9sZSByZWdpb24gYXMgb3JkZXItQHNvdXJjZV9vcmRlciBmb2xpb3MuICovXG4rXHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0c2V0dGluZ3MuaHVnZXBhZ2VzW3NvdXJjZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1xuK1x0LypcbitcdCAqIFRoZSBvcmRlciBpcyBlbmFibGVkIGFuZCBzdXBwb3J0ZWQsIGJ1dCB0aGUgYWxsb2NhdG9yIGNhbiBzdGlsbCBmYWxsXG4rXHQgKiBiYWNrIHVuZGVyIGZyYWdtZW50YXRpb24uICBUaGF0IGxlYXZlcyBub3RoaW5nIHRvIGNvbGxhcHNlIGZyb20sXG4rXHQgKiB3aGljaCBpcyB0aGUgbWFjaGluZSdzIGFuc3dlciByYXRoZXIgdGhhbiBhIHJlYXNvbiB0byBlbmQgdGhlIHJ1bi5cbitcdCAqL1xuK1x0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsXG4rXHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJObyBvcmRlci0lZCBzb3VyY2VzIHRvIGNvbGxhcHNlLi4uXCIsIHNvdXJjZV9vcmRlcik7XG4rXHRcdHNraXAoXCJTa2lwXCIpO1xuK1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi5cIixcbitcdFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCJcXG5Vc2FnZTogLi9raHVnZXBhZ2VkIFtPUFRJT05TXSBcdTAwM2N0ZXN0IHR5cGVcdTAwM2UgW2Rpcl1cXG5cXG5cIik7XG5AQCAtMTIyNiwxMSArMTU1MSwxNSBAQCBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuIFx0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdC1zOiBtVEhQIHNpemUsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxcblwiKTtcbiBcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXG5cIik7XG4gXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIERlZmF1bHRzIHRvIGV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBiZWxvdyB0aGUgUE1ELlxcblwiKTtcbitcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQgICAgV2l0aCAtcywgLXMgbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXFxuXCIpO1xuIFx0ZXhpdCgxKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4rXHRib29sIG10aHBfY29udGV4dF9pbXBsaWVkID0gZmFsc2U7XG4gXHRpbnQgb3B0O1xuIFx0Y2hhciAqYnVmO1xuIFx0Y29uc3QgY2hhciAqdG9rZW47XG5AQCAtMTI0Miw2ICsxNTcxLDcgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAnYyc6XG4gXHRcdFx0Y29sbGFwc2Vfb3JkZXIgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0Y29sbGFwc2Vfb3JkZXJfZ2l2ZW4gPSB0cnVlO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICdoJzpcbiBcdFx0ZGVmYXVsdDpcbkBAIC0xMjQ5LDEyICsxNTc5LDI1IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdH1cbiBcdH1cbiBcbitcdC8qXG4rXHQgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyXG4rXHQgKiBjYW4gYmUgbmVnYXRpdmUsIGFuZCBhIHplcm8gY29sbGFwc2Ugb3JkZXIgYXNrcyBmb3IgYmFzZSBwYWdlcy5cbitcdCAqL1xuK1x0aWYgKGFub25fb3JkZXIgXHUwMDNjIDAgfHwgYW5vbl9vcmRlciBcdTAwM2UgaHBhZ2VfcG1kX29yZGVyKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCItcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXFxuXCIsXG4rXHRcdFx0XHQgICBocGFnZV9wbWRfb3JkZXIsIGFub25fb3JkZXIpO1xuK1x0aWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuIFx1MDAyNlx1MDAyNlxuK1x0ICAgIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IDAgfHwgY29sbGFwc2Vfb3JkZXIgXHUwMDNlIGhwYWdlX3BtZF9vcmRlcikpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIi1jIHRha2VzIGFuIG9yZGVyIGluIDEuLiVkLCBub3QgJWRcXG5cIixcbitcdFx0XHRcdCAgIGhwYWdlX3BtZF9vcmRlciwgY29sbGFwc2Vfb3JkZXIpO1xuK1xuIFx0YXJndiArPSBvcHRpbmQ7XG4gXHRhcmdjIC09IG9wdGluZDtcbiBcbiBcdGlmIChhcmdjID09IDApIHtcbi1cdFx0LyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi9cbitcdFx0LyogRXZlcnl0aGluZyB0aGF0IG5lZWRzIG5vIGFyZ3VtZW50IG9mIGl0cyBvd246IGFub24sIGV2ZXJ5IGNvbnRleHQgKi9cbiBcdFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fa2h1Z2VwYWdlZF9jb250ZXh0O1xuK1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0cmV0dXJuO1xuQEAgLTEyNjUsMTMgKzE2MDgsMTkgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcbiBcdGlmICghc3RyY21wKHRva2VuLCBcImFsbFwiKSkge1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbitcbitcdFx0LypcbitcdFx0ICogXCJhbGxcIiBzd2VlcHMgdGhlIG1USFAgY29udGV4dCBpbiwgYnV0IGl0IG9ubHkgaGFzIGFub25cbitcdFx0ICogY2FzZXM6IHN0ZXAgaXQgYXNpZGUgZm9yIHRoZSBvdGhlciBtZW1fdHlwZXMgcmF0aGVyIHRoYW5cbitcdFx0ICogcmVmdXNpbmcgdGhlIHdob2xlIHJ1bi5cbitcdFx0ICovXG4rXHRcdG10aHBfY29udGV4dF9pbXBsaWVkID0gdHJ1ZTtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCJraHVnZXBhZ2VkXCIpKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCJtdGhwX2todWdlcGFnZWRcIikpIHtcbiBcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dDtcbi1cdFx0aWYgKGNvbGxhcHNlX29yZGVyIFx1MDAzYz0gMCB8fCBjb2xsYXBzZV9vcmRlciBcdTAwM2U9IGhwYWdlX3BtZF9vcmRlcilcbi1cdFx0XHR1c2FnZSgpO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcIm1hZHZpc2VcIikpIHtcbiBcdFx0bWFkdmlzZV9jb250ZXh0ID0gIFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xuIFx0fSBlbHNlIHtcbkBAIC0xMjg3LDIwICsxNjM2LDIwIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuIFx0XHRhbm9uX29wcyA9IFx1MDAyNl9fYW5vbl9vcHM7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4tXHRcdFx0dXNhZ2UoKTtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFwiYW5vblwiKSkge1xuIFx0XHRhbm9uX29wcyA9IFx1MDAyNl9fYW5vbl9vcHM7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcImZpbGVcIikpIHtcbiBcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gIFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4rXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCBcdTAwMjZcdTAwMjYgIW10aHBfY29udGV4dF9pbXBsaWVkKVxuIFx0XHRcdHVzYWdlKCk7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gTlVMTDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFwic2htZW1cIikpIHtcbiBcdFx0c2htZW1fb3BzID0gXHUwMDI2X19zaG1lbV9vcHM7XG4tXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcbitcdFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFx1MDAyNlx1MDAyNiAhbXRocF9jb250ZXh0X2ltcGxpZWQpXG4gXHRcdFx0dXNhZ2UoKTtcbitcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIHtcbiBcdFx0dXNhZ2UoKTtcbiBcdH1cbkBAIC0xMzIyLDkgKzE2NzEsMTQgQEAgc3RydWN0IHRlc3RfY2FzZSB7XG4gXHRzdHJ1Y3QgbWVtX29wcyAqb3BzO1xuIFx0Y29uc3QgY2hhciAqZGVzYztcbiBcdHRlc3RfZm4gZm47XG4rXHRpbnQgb3JkZXI7XHRcdC8qIG1USFAgY29udGV4dHM6IHRoZSBjb2xsYXBzZSBvcmRlciAqL1xuIH07XG4gXG4tI2RlZmluZSBNQVhfVEVTVF9DQVNFUyA2NFxuKy8qXG4rICogRW5vdWdoIGZvciBldmVyeSBjYXNlIGF0IGV2ZXJ5IG9yZGVyIHRoZSBrZXJuZWwgb2ZmZXJzOiB0aGUgbVRIUCBjb250ZXh0XG4rICogcnVucyBpdHMgY2FzZXMgb25jZSBwZXIgc3VwcG9ydGVkIG9yZGVyIGJlbG93IHRoZSBQTUQuXG4rICovXG4rI2RlZmluZSBNQVhfVEVTVF9DQVNFUyAyNTZcbiBzdGF0aWMgc3RydWN0IHRlc3RfY2FzZSB0ZXN0X2Nhc2VzW01BWF9URVNUX0NBU0VTXTtcbiBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXG5AQCAtMTMzNyw2ICsxNjkxLDcgQEAgc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xuIFx0XHRcdC5vcHNcdD0gbyxcdFx0XHRcdFx0XFxcbiBcdFx0XHQuZGVzY1x0PSAjdCxcdFx0XHRcdFx0XFxcbiBcdFx0XHQuZm5cdD0gdCxcdFx0XHRcdFx0XFxcbitcdFx0XHQub3JkZXJcdD0gY29sbGFwc2Vfb3JkZXIsXHRcdFx0XFxcbiBcdFx0fTtcdFx0XHRcdFx0XHRcdFxcXG4gXHR9XHRcdFx0XHRcdFx0XHRcdFxcXG4gXHR9IHdoaWxlICgwKVxuQEAgLTEzNzcsOCArMTczMiw4MyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXG4gXHRwYXJzZV90ZXN0X3R5cGUoYXJnYywgYXJndik7XG4gXG4rXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcbitcdFx0dW5zaWduZWQgbG9uZyBvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuK1xuK1x0XHRpZiAoY29sbGFwc2Vfb3JkZXJfZ2l2ZW4pIHtcbitcdFx0XHQvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi9cbitcdFx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNlPSBocGFnZV9wbWRfb3JkZXIpXG4rXHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCItYyB0YWtlcyBhbiBvcmRlciBiZWxvdyB0aGUgUE1EIG9yZGVyICglZClcXG5cIixcbitcdFx0XHRcdFx0XHQgICBocGFnZV9wbWRfb3JkZXIpO1xuK1x0XHRcdGlmICghKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgY29sbGFwc2Vfb3JkZXIpKSlcbitcdFx0XHRcdGtzZnRfZXhpdF9za2lwKFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxuXCIsXG4rXHRcdFx0XHRcdCAgICAgICBjb2xsYXBzZV9vcmRlcik7XG4rXHRcdFx0aWYgKGNvbGxhcHNlX29yZGVyIFx1MDAzYz0gYW5vbl9vcmRlcilcbitcdFx0XHRcdGtzZnRfZXhpdF9za2lwKFwiLWMgJWQgbmVlZHMgYSBzb3VyY2Ugb3JkZXIgYmVsb3cgaXQsIC1zIHNheXMgJWRcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGNvbGxhcHNlX29yZGVyLCBhbm9uX29yZGVyKTtcbitcdFx0XHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gY29sbGFwc2Vfb3JkZXI7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBPdGhlcndpc2UgZXZlcnkgb3JkZXIgYSBjb2xsYXBzZSBjb3VsZCBwcm9kdWNlLiAgLXNcbitcdFx0XHQgKiBtYWtlcyB0aGUgZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlcixcbitcdFx0XHQgKiBzbyBhIHRhcmdldCBhdCBvciBiZWxvdyBpdCBoYXMgbm90aGluZyB0byBjb2xsYXBzZTpcbitcdFx0XHQgKiB0aGUgc291cmNlcyBhcmUgYWxyZWFkeSB0aGUgc2l6ZSBiZWluZyBhc2tlZCBmb3IuXG4rXHRcdFx0ICovXG4rXHRcdFx0aW50IGZpcnN0ID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgKyAxIDogTUlOX01USFBfT1JERVI7XG4rXG4rXHRcdFx0aWYgKGZpcnN0IFx1MDAzYyBNSU5fTVRIUF9PUkRFUilcbitcdFx0XHRcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XG4rXHRcdFx0Zm9yIChpbnQgaSA9IGZpcnN0OyBpIFx1MDAzYyBocGFnZV9wbWRfb3JkZXI7IGkrKykge1xuK1x0XHRcdFx0aWYgKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpXG4rXHRcdFx0XHRcdGNvbGxhcHNlX29yZGVyc1tucl9jb2xsYXBzZV9vcmRlcnMrK10gPSBpO1xuK1x0XHRcdH1cbitcdFx0XHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcbitcdFx0XHRcdGtzZnRfcHJpbnRfbXNnKFwibVRIUCBjYXNlcyBza2lwcGVkOiBubyBvcmRlciBhYm92ZSB0aGUgc291cmNlXFxuXCIpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcbitcdFx0cGFnZW1hcF9mZCA9IG9wZW4oXCIvcHJvYy9zZWxmL3BhZ2VtYXBcIiwgT19SRE9OTFkpO1xuK1x0XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcIik7XG4rXHRcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwiL3Byb2Mva3BhZ2VmbGFnc1wiLCBPX1JET05MWSk7XG4rXHRcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm9wZW4oL3Byb2Mva3BhZ2VmbGFncylcIik7XG4rXHR9XG4rXG4gXHRzZXRidWYoc3Rkb3V0LCBOVUxMKTtcbiBcbitcdC8qXG4rXHQgKiBUaGUgcGFnZSBjYWNoZSBjYXBzIGZvbGlvIG9yZGVyIGF0IE1BWF9QQUdFQ0FDSEVfT1JERVIsIHdoaWNoXG4rXHQgKiB4YXNfc3BsaXRfYWxsb2MoKSBwdXRzIGJlbG93IHRoZSBQTUQgb3JkZXIgb24gYXJtNjQgd2l0aCA2NEsgcGFnZXMuXG4rXHQgKiBBIFBNRC1zaXplZCBwYWdlIGNhY2hlIGZvbGlvIGlzIHRoZW4gaW1wb3NzaWJsZSwgc28gdGhlIGtlcm5lbFxuK1x0ICogcmVmdXNlcyB0aGVzZSBjb2xsYXBzZXMgYnkgZGVzaWduIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuXG4rXHQgKlxuK1x0ICogVGhlIGNhcCBpcyBvbmUgZ2xvYmFsLCBzbyBpdCBydWxlcyBvdXQgZXZlcnkgZmlsZSBtYXBwaW5nLCBub3QganVzdFxuK1x0ICogc2htZW06IHNobWVtX2h1Z2VfZ2xvYmFsX2VuYWJsZWQoKSBkcm9wcyB0aGUgUE1EIG9yZGVyIGZyb20gd2hhdCBpdFxuK1x0ICogYWxsb3dzLCBhbmQgZmlsZV90aHBfZW5hYmxlZCgpIHJlZnVzZXMgYSByZWd1bGFyIGZpbGUgd2hvc2UgbWFwcGluZ1xuK1x0ICogY2Fubm90IGhvbGQgYSBQTUQgZm9saW8uXG4rXHQgKlxuK1x0ICogVGhlIHBlci1vcmRlciBzaG1lbV9lbmFibGVkIGNvbnRyb2wgYmVsb3cgaXMgd2hhdCBtYWtlcyB0aGUgY2FwXG4rXHQgKiByZWFkYWJsZTogaXQgaXMgY3JlYXRlZCBmb3IgdGhlIG9yZGVycyBpbiBUSFBfT1JERVJTX0FMTF9GSUxFX0RFRkFVTFQsXG4rXHQgKiB3aGljaCBpcyB0aGUgY2FwIGFuZCBub3RoaW5nIGVsc2UsIHNvIHdoZXRoZXIgdGhlIFBNRCBvcmRlciBoYXMgb25lXG4rXHQgKiBhbnN3ZXJzIGZvciBhIHJlZ3VsYXIgZmlsZSBhcyBtdWNoIGFzIGZvciBzaG1lbS5cbitcdCAqL1xuK1x0aWYgKCEodGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaHBhZ2VfcG1kX29yZGVyKSkpIHtcbitcdFx0aWYgKHNobWVtX29wcykge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwibm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIHNobWVtXFxuXCIpO1xuK1x0XHRcdHNobWVtX29wcyA9IE5VTEw7XG4rXHRcdH1cbitcdFx0aWYgKHJlYWRfb25seV9maWxlX29wcykge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwibm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcXG5cIik7XG4rXHRcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gTlVMTDtcbitcdFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSBOVUxMO1xuK1x0XHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSBOVUxMO1xuK1x0XHR9XG4rXHRcdGlmICghYW5vbl9vcHMgXHUwMDI2XHUwMDI2ICFzaG1lbV9vcHMgXHUwMDI2XHUwMDI2ICFyZWFkX29ubHlfZmlsZV9vcHMpXG4rXHRcdFx0a3NmdF9leGl0X3NraXAoXCJOb3RoaW5nIGxlZnQgdG8gY29sbGFwc2UgaW50b1xcblwiKTtcbitcdH1cbitcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaHBhZ2VfcG1kX25yIC0gMTtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyO1xuQEAgLTEzOTYsNyArMTgyNiwxNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCBzaG1lbV9vcHMpO1xuLVx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIG5yX2NvbGxhcHNlX29yZGVyczsgaSsrKSB7XG4rXHRcdGNvbGxhcHNlX29yZGVyID0gY29sbGFwc2Vfb3JkZXJzW2ldO1xuK1x0XHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHR9XG4rXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbkBAIC0xNDA0LDEwICsxODQ0LDggQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7XG4gXG4gXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbi1cdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbi1cdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXG4gXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG5AQCAtMTQ2Myw2ICsxOTAxLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFxuK1x0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4rXG4gXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbkBAIC0xNDc4LDcgKzE5MTksMTUgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIG5yX3Rlc3RfY2FzZXM7IGkrKykge1xuIFx0XHRzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gXHUwMDI2dGVzdF9jYXNlc1tpXTtcbiBcbi1cdFx0a3NmdF9wcmludF9tc2coXCJcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXFxuXCIsIHQtXHUwMDNlZGVzYywgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4rXHRcdGlmICh0LVx1MDAzZWN0eCA9PSBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XG4rXHRcdFx0Y29sbGFwc2Vfb3JkZXIgPSB0LVx1MDAzZW9yZGVyO1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzLCBvcmRlciAlZClcXG5cIixcbitcdFx0XHRcdCAgICAgICB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUsXG4rXHRcdFx0XHQgICAgICAgdC1cdTAwM2VvcmRlcik7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXFxuXCIsIHQtXHUwMDNlZGVzYyxcbitcdFx0XHRcdCAgICAgICB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lKTtcbitcdFx0fVxuIFx0XHR0LVx1MDAzZWZuKHQtXHUwMDNlY3R4LCB0LVx1MDAzZW9wcyk7XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjM2MDFjMDMwZDQzZTVcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXG5AQCAtMCwwICsxLDYxMCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBraHVnZXBhZ2VkIHJhY2UgaGFybmVzcy5cbisgKlxuKyAqIFJ1bnMgY29sbGFwc2UgYWdhaW5zdCBjb25jdXJyZW50IGZhdWx0cywgdHJhbnNpZW50IEdVUCBwaW5zXG4rICogKGd1cF90ZXN0KSwgZm9yaywgbXJlbWFwIGFuZCBNQURWX0RPTlRORUVEIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLCBpblxuKyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6XG4rICpcbisgKiAgIHN0ZXBwZWRcdGtodWdlcGFnZWQsIG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lIHRocm91Z2hcbisgKlx0XHRraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLCBzbyBhIHN0ZXAgY292ZXJzIGEga25vd24gZXh0ZW50O1xuKyAqICAgZnJlZVx0a2h1Z2VwYWdlZCBsZWZ0IHRvIHJ1biAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCksIGZvciBzb2FrO1xuKyAqICAgbWFkdmlzZVx0TUFEVl9DT0xMQVBTRSBpbiBhIGxvb3AuXG4rICpcbisgKiBBbGwgYW5vbiBUSFAgb3JkZXJzIGFyZSBlbmFibGVkIChpbmhlcml0KS4gIE9jY3VwYW5jeSBydW5zIGF0IGJvdGggZW5kc1xuKyAqIG9mIHdoYXQgbVRIUCBjb2xsYXBzZSBzdXBwb3J0czogbWF4X3B0ZXNfbm9uZSAwLCB3aGVyZSBhIHdpbmRvdyBtdXN0IGJlXG4rICogZnVsbHkgcG9wdWxhdGVkLCBhbmQgSFBBR0VfUE1EX05SIC0gMSwgd2hlcmUgYSB3aW5kb3cgZnVsbCBvZiBob2xlc1xuKyAqIGNvbGxhcHNlcyB0b28uICBUaGUgaG9sZXMgYXJlIG5vdCBjb3BpZWQgZnJvbSBhbnl3aGVyZSAtLSB0aGV5IGFyZVxuKyAqIHplcm8tZmlsbGVkLCBhbmQgcmUtY2hlY2tlZCB1bmRlciB0aGUgcGFnZSB0YWJsZSBsb2NrIGF0IGluc3RhbGwgdGltZSBpblxuKyAqIGNhc2UgYSByYWNpbmcgZmF1bHQgZ290IHRoZXJlIGZpcnN0LlxuKyAqXG4rICogLXAgYWRkcyBtZW1vcnkgcHJlc3N1cmUgdG8gYW55IG9mIHRoZSBhYm92ZTogTUFEVl9QQUdFT1VUIGN5Y2xpbmdcbisgKiBvbiBhIGRlZGljYXRlZCBuZWlnaGJvciByZWdpb24gKHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuOyBza2lwcGVkXG4rICogd2l0aCBhIG5vdGUgd2hlbiB0aGUgaG9zdCBoYXMgbm8gc3dhcCkgYW5kIGEgY29tcGFjdF9tZW1vcnkgdHJpZ2dlclxuKyAqIGxvb3AgKGNvbXBhY3Rpb24gbWlncmF0ZXMgc291cmNlIGZvbGlvcywgcmFjaW5nIGNvbGxhcHNlJ3MgZnJlZXplXG4rICogd2l0aCByZWZjb3VudCBlbGV2YXRpb24gYW5kIG1pZ3JhdGlvbiBlbnRyaWVzIG9mIGl0cyBvd24pLlxuKyAqXG4rICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yXG4rICogemVybyAoTUFEVl9ET05UTkVFRCksIG5ldmVyIGFueXRoaW5nIGVsc2UuICBUaGUgZmF1bHRlcnMgYW5kIHRoZSBmb3JrXG4rICogY2hpbGRyZW4gY2hlY2sgdGhhdCBjb250aW51b3VzbHksIGEgZmluYWwgc3dlZXAgY2hlY2tzIGl0IG9uY2UgbW9yZSwgcGx1c1xuKyAqIHdoYXRldmVyIERFQlVHX1ZNIC8gcGFnZV90YWJsZV9jaGVjayAvIEtBU0FOIC8gbG9ja2RlcCByZXBvcnQgaW5cbisgKiBkbWVzZywgd2hpY2ggdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBpbnNwZWN0LlxuKyAqL1xuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwia3NlbGZ0ZXN0LmhcIlxuKyNpbmNsdWRlIFwidm1fdXRpbC5oXCJcbisjaW5jbHVkZSBcImh1Z2VwYWdlX3NldHRpbmdzLmhcIlxuKyNpbmNsdWRlIFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFwiXG4rXG4rI2RlZmluZSBCQVNFX0FERFJcdCgodm9pZCAqKSgxVUwgXHUwMDNjXHUwMDNjIDMwKSlcbitcbisvKlxuKyAqIFNoYXJlZCBwbGF5Z3JvdW5kIGZvciBmYXVsdHMvcGlucy9mb3JrL2RvbnRuZWVkOiBzZXZlcmFsIFBNRC1zaXplZFxuKyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZVxuKyAqIG1yZW1hcCB0aHJlYWQuIE1vcmUgYXJlYXMgbWVhbnMgbW9yZSBpbmRlcGVuZGVudCByZWdpb25zIGNvbGxhcHNpbmdcbisgKiBhdCBvbmNlOyB0aGUgZGVmYXVsdCBzdWl0cyBhIG5vcm1hbCBtYWNoaW5lLiBPbiBhIG1lbW9yeS1jb25zdHJhaW5lZFxuKyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZVxuKyAqIGRlZmF1bHQgcGxheWdyb3VuZCBtdWx0aS1naWdhYnl0ZSAtLSBwYXNzIC1hIHRvIHNocmluayBpdC5cbisgKi9cbisjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XG4rc3RhdGljIGludCBucl9hcmVhcztcbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XG4rc3RhdGljIGNoYXIgKnJlZ2lvbjtcdFx0LyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqL1xuK3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTtcdC8qIHJlZ2lvbiArIE5SX1NIQVJFRF9BUkVBUyBhcmVhcyAqL1xuK3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xuK3N0YXRpYyBjaGFyICpwYWdlb3V0X2FyZWE7XHQvKiAtcDogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqL1xuK3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplO1xuK3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4rc3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xuK3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkO1xuK1xuK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuK3tcbitcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4rXG4rXHRyZXR1cm4gdmFsID8gdmFsIDogMTtcdC8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqL1xuK31cbitcbisvKiBaZXJvIG1lYW5zIG5ldmVyIHdyaXR0ZW47IGFueXRoaW5nIGVsc2UgbXVzdCBiZSB0aGlzIHBhZ2UncyBwYXR0ZXJuICovXG4rc3RhdGljIGJvb2wgcGFnZV9pc19jb3JydXB0KHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGludCAqdmFsKVxuK3tcbitcdCp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRyZXR1cm4gKnZhbCBcdTAwMjZcdTAwMjYgKnZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY2hlY2tfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuK3tcbitcdHVuc2lnbmVkIGludCB2YWw7XG4rXG4rXHRpZiAocGFnZV9pc19jb3JydXB0KHBhZ2VfaWR4LCBcdTAwMjZ2YWwpKSB7XG4rXHRcdGNvcnJ1cHRlZCA9IDE7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiQ29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcblwiLFxuK1x0XHRcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNoYXJlZF9wYWdlcyh2b2lkKVxuK3tcbitcdHJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbit9XG4rXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcbit7XG4rXHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcmFuZF9yKHNlZWQpICUgc2hhcmVkX3BhZ2VzKCk7XG4rfVxuK1xuKy8qIFBhZ2VzIGxlZnQgZnJvbSBAcGFnZV9pZHgsIHNvIGEgcmFuZ2UgbmV2ZXIgcmVhY2hlcyB0aGUgbXJlbWFwIHRocmVhZCdzIGFyZWEgKi9cbitzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XG4rXG4rXHRyZXR1cm4gd2FudCBcdTAwM2MgbGVmdCA/IHdhbnQgOiBsZWZ0O1xuK31cbitcbitzdGF0aWMgdm9pZCAqZmF1bHRlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbitcbitcdFx0aWYgKHJhbmRfcihcdTAwMjZzZWVkKSBcdTAwMjYgMSlcbitcdFx0XHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPVxuK1x0XHRcdFx0cGF0dGVybihwYWdlX2lkeCk7XG4rXHRcdGVsc2VcbitcdFx0XHRjaGVja19wYWdlKHBhZ2VfaWR4KTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqZG9udG5lZWRfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1xuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgXHUwMDNjXHUwMDNjIChyYW5kX3IoXHUwMDI2c2VlZCkgJSA2KTtcdC8qIDEuLjMyIHBhZ2VzICovXG4rXG4rXHRcdC8qXG4rXHRcdCAqIE9uY2UgaW4gYSB3aGlsZSB6YXAgYSB3aG9sZSBQTUQtYWxpZ25lZCBhcmVhOiBvbmx5IGEgemFwXG4rXHRcdCAqIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZSByZWNsYWltXG4rXHRcdCAqIChDT05GSUdfUFRfUkVDTEFJTSksIHdoaWNoIGNhbiBmcmVlIHRoZSB0YWJsZSB1bmRlciBhXG4rXHRcdCAqIGNvbGxhcHNlIHRoYXQgaXMgbWlkd2F5IHRocm91Z2ggaXQuICBTdWItdGFibGUgemFwcyBuZXZlclxuK1x0XHQgKiByZWFjaCB0aGF0IHBhdGguXG4rXHRcdCAqL1xuK1x0XHRpZiAoIShyYW5kX3IoXHUwMDI2c2VlZCkgJSA2NCkpIHtcbitcdFx0XHR1bnNpZ25lZCBsb25nIGFyZWEgPSBwYWdlX2lkeCAvXG4rXHRcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRcdFx0bWFkdmlzZShyZWdpb24gKyBhcmVhICogaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0bWFkdmlzZShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSxcbitcdFx0XHRcdHJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLFxuK1x0XHRcdFx0TUFEVl9ET05UTkVFRCk7XG4rXHRcdH1cbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDUwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKnBpbm5lcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0c3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9O1xuK1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuK1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yID0gcm9vbV9mcm9tKHBhZ2VfaWR4LCAxNik7XG4rXG4rXHRcdGd1cC5hZGRyID0gKHVuc2lnbmVkIGxvbmcpKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcbitcdFx0Z3VwLnNpemUgPSBuciAqIHBhZ2Vfc2l6ZTtcbitcdFx0Z3VwLm5yX3BhZ2VzX3Blcl9jYWxsID0gbnI7XG4rXHRcdGd1cC5ndXBfZmxhZ3MgPSAxO1x0LyogRk9MTF9XUklURSAqL1xuK1x0XHQvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovXG4rXHRcdGlvY3RsKGd1cF9mZCwgUElOX0ZBU1RfQkVOQ0hNQVJLLCBcdTAwMjZndXApO1xuK1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqZm9ya2VyX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHRwaWRfdCBwaWQgPSBmb3JrKCk7XG4rXG4rXHRcdGlmIChwaWQgPT0gMCkge1xuK1x0XHRcdHVuc2lnbmVkIGludCB2YWw7XG4rXHRcdFx0aW50IGJhZCA9IDA7XG4rXG4rXHRcdFx0LypcbitcdFx0XHQgKiBObyBzdGRpbyBpbiB0aGUgY2hpbGQ6IGEgdGhyZWFkIG1heSBoYXZlIGhlbGRcbitcdFx0XHQgKiBzdGRvdXQncyBsb2NrIHdoZW4gd2UgZm9ya2VkLCBhbmQgcHJpbnRpbmcgdW5kZXIgYW5cbitcdFx0XHQgKiBpbmhlcml0ZWQgbG9jayBoYW5ncy4gIFRoZSBwYXJlbnQgcmVwb3J0cyB3aGF0IHRoZVxuK1x0XHRcdCAqIGV4aXQgc3RhdHVzIHNheXMuXG4rXHRcdFx0ICovXG4rXHRcdFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIDE2OyBpKyspXG4rXHRcdFx0XHRiYWQgfD0gcGFnZV9pc19jb3JydXB0KHJhbmRfcGFnZShcdTAwMjZzZWVkKSwgXHUwMDI2dmFsKTtcbitcdFx0XHRfZXhpdChiYWQpO1xuK1x0XHR9XG4rXHRcdGlmIChwaWQgXHUwMDNlIDApIHtcbitcdFx0XHRpbnQgd3N0YXR1cztcbitcbitcdFx0XHRpZiAod2FpdHBpZChwaWQsIFx1MDAyNndzdGF0dXMsIDApIFx1MDAzYyAwKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwid2FpdHBpZCgpXCIpO1xuK1x0XHRcdC8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28sIG5vdCBqdXN0IGl0cyBleGl0IGNvZGUuICovXG4rXHRcdFx0aWYgKCFXSUZFWElURUQod3N0YXR1cykgfHwgV0VYSVRTVEFUVVMod3N0YXR1cykpXG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHR2b2lkICpwO1xuK1xuK1x0XHRwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0ICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9zY3JhdGNoKTtcbitcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtcmVtYXAoKSBhd2F5XCIpO1xuK1x0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgODsgaSsrKVxuK1x0XHRcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXHUwMDI2c2VlZCkgJVxuK1x0XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSkgKiBwYWdlX3NpemVdID0gMTtcbitcdFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7XG4rXHRcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibXJlbWFwKCkgYmFja1wiKTtcbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMDApO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKy8qXG4rICogLXA6IHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XG4rICogY2hlY2sgaXMgZXhhY3Q6IGEgcGFnZSBvdXQgYW5kIGJhY2sgdGhyb3VnaCBzd2FwIG11c3QgcHJlc2VydmUgdGhlXG4rICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxuKyAqL1xuK3N0YXRpYyB2b2lkICpwYWdlb3V0X2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSsrKVxuK1x0XHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpKyspIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICtcbitcdFx0XHRcdFx0XHRcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRcdFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKiAtcDogY29tcGFjdGlvbiBtaWdyYXRlcyB0aGUgY29sbGFwc2Ugc291cmNlcyBvdXQgZnJvbSB1bmRlciB1cy4gKi9cbitzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdGludCBmZCA9IG9wZW4oXCIvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnlcIiwgT19XUk9OTFkpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiTm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXFxuXCIpO1xuK1x0XHRyZXR1cm4gTlVMTDtcbitcdH1cbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHRpZiAod3JpdGUoZmQsIFwiMVwiLCAxKSBcdTAwM2MgMClcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKDEwMDAwICsgcmFuZF9yKFx1MDAyNnNlZWQpICUgMTAwMDAwKTtcbitcdH1cbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgYm9vbCBzd2FwX2F2YWlsYWJsZSh2b2lkKVxuK3tcbitcdGNoYXIgbGluZVsyNTZdO1xuK1x0aW50IGxpbmVzID0gMDtcbitcdEZJTEUgKmZwID0gZm9wZW4oXCIvcHJvYy9zd2Fwc1wiLCBcInJcIik7XG4rXG4rXHRpZiAoIWZwKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXG4rXHRcdGxpbmVzKys7XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGxpbmVzIFx1MDAzZSAxO1xuK31cbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcbit7XG4rXHRzdHJ1Y3QgdGltZXZhbCB0djtcbitcbitcdGdldHRpbWVvZmRheShcdTAwMjZ0diwgTlVMTCk7XG4rXHRyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICsgdHYudHZfdXNlYyAvIDEwMDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4re1xuK1x0ZnByaW50ZihzdGRlcnIsXG4rXHRcdFwiVXNhZ2U6IGtodWdlcGFnZWRfcmFjZSBbLWQgc2Vjb25kc10gWy1tIHN0ZXBwZWR8ZnJlZXxtYWR2aXNlXSBbLXpdIFstcF0gWy1hIGFyZWFzXVxcblwiXG4rXHRcdFwiXFx0V2l0aG91dCAtbSwgZXZlcnkgbW9kZSBydW5zIGluIHR1cm4uXFxuXCJcbitcdFx0XCJcXHQtZDogc2Vjb25kcyBwZXIgbW9kZSAoZGVmYXVsdCA1KVxcblwiXG4rXHRcdFwiXFx0Qm90aCBvY2N1cGFuY3kgbGltaXRzIHJ1biB1bmxlc3MgLXogYXNrcyBmb3IgaG9sZXMgb25seS5cXG5cIlxuK1x0XHRcIlxcdC16OiBvbmx5IG1heF9wdGVzX25vbmUgPSBIUEFHRV9QTURfTlIgLSAxIChob2xlLWhlYXZ5KVxcblwiXG4rXHRcdFwiXFx0UnVucyB3aXRoIGFuZCB3aXRob3V0IG1lbW9yeSBwcmVzc3VyZSB1bmxlc3MgLXAgYXNrcyBmb3JcXG5cIlxuK1x0XHRcIlxcdHByZXNzdXJlIG9ubHkuXFxuXCJcbitcdFx0XCJcXHQtcDogb25seSB3aXRoIHRoZSBwYWdlb3V0IGFuZCBjb21wYWN0aW9uIHRocmVhZHNcXG5cIlxuK1x0XHRcIlxcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXFxuXCIpO1xuK1x0ZXhpdCgxKTtcbit9XG4rXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XG4rXHRcdFwiZmF1bHRlclwiLCBcImZhdWx0ZXIyXCIsIFwiZG9udG5lZWRcIiwgXCJwaW5uZXJcIiwgXCJmb3JrZXJcIixcbitcdFx0XCJtcmVtYXBwZXJcIiwgXCJwYWdlb3V0XCIsIFwiY29tcGFjdG9yXCIsXG4rXHR9O1xuK1x0dm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7XG4rXHRcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcbitcdFx0bXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sXG4rXHR9O1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNiwgY29tcGFjdG9yX2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNztcbitcdGNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpO1xuK1x0cHRocmVhZF90IHRocmVhZHNbQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpXTtcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxsX21vZGVzW10gPSB7IFwic3RlcHBlZFwiLCBcImZyZWVcIiwgXCJtYWR2aXNlXCIgfTtcbitcdHN0YXRpYyBjb25zdCBpbnQgYWxsX25vbmVzW10gPSB7IDAsIDEgfTtcdC8qIHN0cmljdCwgaG9sZXMgKi9cbitcdHN0YXRpYyBjb25zdCBpbnQgYWxsX3ByZXNzW10gPSB7IDAsIDEgfTtcdC8qIHF1aWV0LCB1bmRlciBwcmVzc3VyZSAqL1xuK1x0Y29uc3QgaW50ICpub25lcyA9IGFsbF9ub25lcztcbitcdGNvbnN0IGludCAqcHJlc3MgPSBhbGxfcHJlc3M7XG4rXHRpbnQgbnJfbm9uZXMgPSBBUlJBWV9TSVpFKGFsbF9ub25lcyk7XG4rXHRpbnQgbnJfcHJlc3MgPSBBUlJBWV9TSVpFKGFsbF9wcmVzcyk7XG4rXHRjb25zdCBjaGFyICpvbmVfbW9kZVsxXTtcbitcdGNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7XG4rXHRpbnQgbnJfbW9kZXMgPSBBUlJBWV9TSVpFKGFsbF9tb2Rlcyk7XG4rXHRjb25zdCBjaGFyICptb2RlX2FyZyA9IE5VTEw7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dW5zaWduZWQgbG9uZyBlbmRfbXM7XG4rXHRpbnQgZHVyYXRpb25fcyA9IDU7XG4rXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcbitcdHVuc2lnbmVkIGxvbmcgYmFzZV9tYXNrO1xuK1x0aW50IG5yX2FyZWFzX2FyZyA9IDA7XG4rXHRib29sIGhvbGVzX29ubHkgPSBmYWxzZTtcbitcdGJvb2wgcHJlc3N1cmVfb25seSA9IGZhbHNlO1xuK1x0dW5zaWduZWQgbG9uZyBpO1xuK1x0aW50IHN0ZXBzID0gMDtcbitcdGludCBvcHQ7XG4rXG4rXHR3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCBcImE6ZDptOnQ6enBoXCIpKSAhPSAtMSkge1xuK1x0XHRzd2l0Y2ggKG9wdCkge1xuK1x0XHRjYXNlICdhJzpcbitcdFx0XHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ2QnOlxuK1x0XHRcdGR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ20nOlxuK1x0XHRcdG1vZGVfYXJnID0gb3B0YXJnO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd0JzpcbitcdFx0XHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xuK1x0XHRcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd6JzpcbitcdFx0XHRob2xlc19vbmx5ID0gdHJ1ZTtcbitcdFx0XHRicmVhaztcbitcdFx0Y2FzZSAncCc6XG4rXHRcdFx0cHJlc3N1cmVfb25seSA9IHRydWU7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGRlZmF1bHQ6XG4rXHRcdFx0dXNhZ2UoKTtcbitcdFx0fVxuK1x0fVxuK1x0aWYgKGhvbGVzX29ubHkpIHtcbitcdFx0bm9uZXMgPSBhbGxfbm9uZXMgKyAxO1xuK1x0XHRucl9ub25lcyA9IDE7XG4rXHR9XG4rXG4rXHRpZiAocHJlc3N1cmVfb25seSkge1xuK1x0XHRwcmVzcyA9IGFsbF9wcmVzcyArIDE7XG4rXHRcdG5yX3ByZXNzID0gMTtcbitcdH1cbitcbitcdGlmIChtb2RlX2FyZykge1xuK1x0XHRpZiAoc3RyY21wKG1vZGVfYXJnLCBcInN0ZXBwZWRcIikgXHUwMDI2XHUwMDI2IHN0cmNtcChtb2RlX2FyZywgXCJmcmVlXCIpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgc3RyY21wKG1vZGVfYXJnLCBcIm1hZHZpc2VcIikpXG4rXHRcdFx0dXNhZ2UoKTtcbitcdFx0b25lX21vZGVbMF0gPSBtb2RlX2FyZztcbitcdFx0bW9kZXMgPSBvbmVfbW9kZTtcbitcdFx0bnJfbW9kZXMgPSAxO1xuK1x0fVxuK1xuK1x0a3NmdF9wcmludF9oZWFkZXIoKTtcbitcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCIpO1xuK1xuK1x0cGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTtcbitcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbitcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwiKTtcbitcbitcdGd1cF9mZCA9IG9wZW4oXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwiLCBPX1JEV1IpO1xuK1x0aWYgKGd1cF9mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCByZXF1aXJlcyBDT05GSUdfR1VQX1RFU1QgYW5kIHJvb3RcXG5cIik7XG4rXG4rXHRucl9zaGFyZWRfYXJlYXMgPSBucl9hcmVhc19hcmcgXHUwMDNlIDAgPyBucl9hcmVhc19hcmcgOiBERUZBVUxUX1NIQVJFRF9BUkVBUztcbitcdG5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICsgMTtcbitcbitcdC8qXG4rXHQgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZFxuK1x0ICogTVJFTUFQX0ZJWEVEIHVubWFwcyB3aGF0ZXZlciBpcyBpbiB0aGUgd2F5IHdpdGhvdXQgc2F5aW5nIHNvLiAgQ2xhaW1cbitcdCAqIHRoZSBhZGRyZXNzIGhlcmUsIHNvIGEgbGF5b3V0IHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhpcyBhc3N1bXB0aW9uXG4rXHQgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZVxuK1x0ICogcHJvY2VzcyBtYXBzIHRoaXMgbG93OiB0aHJlYWQgc3RhY2tzIGFuZCBtYWxsb2MgYXJlbmFzIGNvbWUgZnJvbSB0aGVcbitcdCAqIHRvcC1kb3duIG1tYXAgYXJlYSwgd2VsbCBhYm92ZS5cbitcdCAqL1xuK1x0bXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiArIDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xuK1x0aWYgKG1tYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBQUk9UX05PTkUsXG4rXHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLFxuK1x0XHQgLTEsIDApICE9ICh2b2lkICopbXJlbWFwX3NjcmF0Y2gpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSBtcmVtYXAgc2NyYXRjaFwiKTtcbitcbitcdGJhc2VfbWFzayA9IHRocmVhZF9tYXNrO1xuK1x0aWYgKCFzd2FwX2F2YWlsYWJsZSgpKVxuK1x0XHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZS4gKi9cbitcdFx0a3NmdF9wcmludF9tc2coXCJubyBzd2FwOiB0aGUgcGFnZW91dCB0aHJlYWQgc3RheXMgaWRsZVxcblwiKTtcbitcbitcdGtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzKTtcbitcbitcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4rXHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHQvKlxuK1x0ICogQSBiYXNlIGVudHJ5IGZvciB0aGUgc3RhY2ssIHNvIHRoYXQgdGhlIHBvcCBhdCB0aGUgZW5kIG9mIGEgbW9kZVxuK1x0ICogYWx3YXlzIGhhcyBzb21ldGhpbmcgdG8gd3JpdGUgYmFjazogdGhwX3BvcF9zZXR0aW5ncygpIG9uIGFuIGVtcHR5XG4rXHQgKiBzdGFjayBoYXMgbm8gc2V0dGluZ3MgdG8gYXBwbHkgYW5kIGdpdmVzIHVwLlxuK1x0ICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRmb3IgKGludCBydW4gPSAwOyBydW4gXHUwMDNjIG5yX21vZGVzICogbnJfbm9uZXMgKiBucl9wcmVzczsgcnVuKyspIHtcbitcdFx0aW50IHJlbSA9IHJ1biAlIChucl9ub25lcyAqIG5yX3ByZXNzKTtcbitcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9ub25lcyAqIG5yX3ByZXNzKV07XG4rXHRcdGJvb2wgaG9sZXMgPSBub25lc1tyZW0gLyBucl9wcmVzc107XG4rXHRcdGJvb2wgcHJlc3N1cmUgPSBwcmVzc1tyZW0gJSBucl9wcmVzc107XG4rXG4rXHRcdHRocmVhZF9tYXNrID0gYmFzZV9tYXNrO1xuK1x0XHRpZiAoIXByZXNzdXJlKVxuK1x0XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpO1xuK1x0XHRlbHNlIGlmICghc3dhcF9hdmFpbGFibGUoKSlcbitcdFx0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH5wYWdlb3V0X2JpdDtcbitcbitcdFx0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0XHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuK1x0XHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4rXHRcdHNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjtcbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xuK1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID1cbitcdFx0XHRzdHJjbXAobW9kZSwgXCJmcmVlXCIpID8gMTAwMCA6IDA7XG4rXHRcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gMTA7XG4rXG4rXHRcdC8qXG4rXHRcdCAqIG1USFAgY29sbGFwc2Ugb25seSBzdXBwb3J0cyB0aGUgdHdvIGVuZHMgb2YgdGhlIG9jY3VwYW5jeVxuK1x0XHQgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuXG4rXHRcdCAqIFN0cmljdCBuZWVkcyBhIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3csIHdoaWNoIGlzIHJhcmUgdW5kZXJcbitcdFx0ICogcmFjaW5nIE1BRFZfRE9OVE5FRUQ7IGhvbGUtaGVhdnkgd2luZG93cyBjb2xsYXBzZSBpbnN0ZWFkLFxuK1x0XHQgKiBzbyB0aGUgdHdvIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHMuXG4rXHRcdCAqL1xuK1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/XG4rXHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwO1xuK1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPVxuK1x0XHRcdG5yX2FyZWFzICogKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAqIDg7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSsrKSB7XG4rXHRcdFx0aWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuK1x0XHRcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbitcdFx0fVxuK1x0XHQvKiBQb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZGUsIGJlZm9yZSB0aGUgbmV4dCBvbmUuICovXG4rXHRcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcbitcdFx0cmVnaW9uID0gbW1hcChCQVNFX0FERFIsIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8XG4rXHRcdFx0ICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XG4rXHRcdGlmIChyZWdpb24gIT0gQkFTRV9BRERSKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSBwbGF5Z3JvdW5kXCIpO1xuK1x0XHRtcmVtYXBfYXJlYSA9IHJlZ2lvbiArIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xuK1xuK1x0XHRpZiAodGhyZWFkX21hc2sgXHUwMDI2IHBhZ2VvdXRfYml0KSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBCaWcgZW5vdWdoIHRvIGN5Y2xlIHJlYWwgcmVjbGFpbSwgc21hbGwgZW5vdWdoIG5vdFxuK1x0XHRcdCAqIHRvIGRvbWluYXRlIGEgVENHIGd1ZXN0OiA0IFBNRCBhcmVhcywgY2xhbXBlZCB0b1xuK1x0XHRcdCAqIFsxNk0sIDY0TV0uXG4rXHRcdFx0ICovXG4rXHRcdFx0cGFnZW91dF9zaXplID0gNCAqIGhwYWdlX3BtZF9zaXplO1xuK1x0XHRcdHBhZ2VvdXRfc2l6ZSA9IHBhZ2VvdXRfc2l6ZSBcdTAwM2MgKDE2VUwgXHUwMDNjXHUwMDNjIDIwKSA/XG4rXHRcdFx0XHQgICAgICAgKDE2VUwgXHUwMDNjXHUwMDNjIDIwKSA6XG4rXHRcdFx0XHQgICAgICAgcGFnZW91dF9zaXplIFx1MDAzZSAoNjRVTCBcdTAwM2NcdTAwM2MgMjApID9cbitcdFx0XHRcdCAgICAgICAoNjRVTCBcdTAwM2NcdTAwM2MgMjApIDogcGFnZW91dF9zaXplO1xuK1x0XHRcdHBhZ2VvdXRfYXJlYSA9IG1tYXAoTlVMTCwgcGFnZW91dF9zaXplLFxuK1x0XHRcdFx0XHQgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0XHRcdFx0ICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xuK1x0XHRcdGlmIChwYWdlb3V0X2FyZWEgPT0gTUFQX0ZBSUxFRClcbitcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSBwYWdlb3V0IGFyZWFcIik7XG4rXHRcdH1cbitcbitcdFx0LyogUG9wdWxhdGUgc28gdGhlIGZpcnN0IHBhc3MgaGFzIHNvbWV0aGluZyB0byBjb2xsYXBzZS4gKi9cbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcbitcdFx0XHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4rXHRcdG1lbXNldChtcmVtYXBfYXJlYSwgMSwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0XHRtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4rXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xuK1x0XHRcdGlmICghKHRocmVhZF9tYXNrIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBpKSkpIHtcbitcdFx0XHRcdHRocmVhZHNbaV0gPSAwO1xuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0fVxuK1x0XHRcdGlmIChwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLCB0aHJlYWRfZm5zW2ldLFxuK1x0XHRcdFx0XHQgICAodm9pZCAqKShpICsgMSkpKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwicHRocmVhZF9jcmVhdGUoKVwiKTtcbitcdFx0fVxuK1xuK1x0XHRlbmRfbXMgPSBub3dfbXMoKSArIGR1cmF0aW9uX3MgKiAxMDAwVUw7XG4rXHRcdGlmICghc3RyY21wKG1vZGUsIFwic3RlcHBlZFwiKSkge1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0XHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpXG4rXHRcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcImtodWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcXG5cIik7XG4rXHRcdFx0XHRzdGVwcysrO1xuK1x0XHRcdH1cbitcdFx0fSBlbHNlIGlmICghc3RyY21wKG1vZGUsIFwiZnJlZVwiKSkge1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKVxuK1x0XHRcdFx0dXNsZWVwKDEwMCAqIDEwMDApO1xuK1x0XHR9IGVsc2Uge1x0LyogbWFkdmlzZSAqL1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXM7IGkrKykge1xuK1x0XHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiArIGkgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XG4rXHRcdFx0XHR9XG4rXHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0XHRcdE1BRFZfRE9OVE5FRUQpO1xuK1x0XHRcdFx0c3RlcHMrKztcbitcdFx0XHR9XG4rXHRcdH1cbitcbitcdFx0c3RvcCA9IDE7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xuK1x0XHRcdGlmICh0aHJlYWRzW2ldKVxuK1x0XHRcdFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xuK1x0XHR9XG4rXG4rXHRcdC8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi9cbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcbitcdFx0XHRjaGVja19wYWdlKGkpO1xuK1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KCFjb3JydXB0ZWQsXG4rXHRcdFx0XHQgXCIlcy8lcyVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxuXCIsXG4rXHRcdFx0XHQgbW9kZSwgaG9sZXMgPyBcImhvbGVzXCIgOiBcInN0cmljdFwiLFxuK1x0XHRcdFx0IHByZXNzdXJlID8gXCIvcHJlc3N1cmVcIiA6IFwiXCIsXG4rXHRcdFx0XHQgZHVyYXRpb25fcywgc3RlcHMpO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBIYW5kIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB0aGUgc2V0dGluZ3MgYmFjayBiZWZvcmUgdGhlXG4rXHRcdCAqIG5leHQgbW9kZTogaXQgbWFwcyB0aGUgcmVnaW9uIGF0IHRoZSBzYW1lIGZpeGVkIGFkZHJlc3MsXG4rXHRcdCAqIGFuZCBpdHMgc2NhbiBjYWRlbmNlIGRpZmZlcnMuXG4rXHRcdCAqL1xuK1x0XHRtdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xuK1x0XHRcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XG4rXHRcdFx0cGFnZW91dF9hcmVhID0gTlVMTDtcbitcdFx0fVxuK1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRcdHN0b3AgPSAwO1xuK1x0XHRzdGVwcyA9IDA7XG4rXG4rXHRcdGlmIChjb3JydXB0ZWQpIHtcbitcdFx0XHQvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZy4gKi9cbitcdFx0XHR3aGlsZSAoKytydW4gXHUwMDNjIG5yX21vZGVzICogbnJfbm9uZXMgKiBucl9wcmVzcykge1xuK1x0XHRcdFx0cmVtID0gcnVuICUgKG5yX25vbmVzICogbnJfcHJlc3MpO1xuK1xuK1x0XHRcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwiJXMvJXMlczogc2tpcHBlZCBhZnRlciBjb3JydXB0aW9uXFxuXCIsXG4rXHRcdFx0XHRcdFx0ICAgICAgbW9kZXNbcnVuIC8gKG5yX25vbmVzICogbnJfcHJlc3MpXSxcbitcdFx0XHRcdFx0XHQgICAgICBub25lc1tyZW0gLyBucl9wcmVzc10gP1xuK1x0XHRcdFx0XHRcdCAgICAgIFwiaG9sZXNcIiA6IFwic3RyaWN0XCIsXG4rXHRcdFx0XHRcdFx0ICAgICAgcHJlc3NbcmVtICUgbnJfcHJlc3NdID9cbitcdFx0XHRcdFx0XHQgICAgICBcIi9wcmVzc3VyZVwiIDogXCJcIik7XG4rXHRcdFx0fVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xuK1x0a3NmdF9maW5pc2hlZCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzBkM2ZiNTE5ZmIyY1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbkBAIC0wLDAgKzEsMjE3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFN5bmNocm9ub3VzIGtodWdlcGFnZWQgZHJpdmluZyBjaGVjay5cbisgKlxuKyAqIFJhY2UgdGVzdHMgZHJpdmUga2h1Z2VwYWdlZCB0aHJvdWdoIHRoZSBleGlzdGluZyBzeXNmcyBjb250cm9sczogYVxuKyAqIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGFuZCBmdWxsX3NjYW5zXG4rICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0XG4rICogc3RhcnRlZCBhZnRlciBzZXR1cCAoa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSkuIFZlcmlmeSB0aGUgcGFpciBnaXZlc1xuKyAqIGRldGVybWluaXN0aWMsIGF0dHJpYnV0YWJsZSByZXN1bHRzOiBvbmUgYmFycmllciBzdGVwIG92ZXIgb25lXG4rICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdFxuKyAqIHdpbmRvdydzIHNvdXJjZSBwYWdlcyAobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUgZXZlbnRzIGZpbHRlcmVkXG4rICogYnkgc291cmNlIFBGTiBhbmQgb3JkZXIpIGFuZCB0aGUgd2luZG93IGlzIGNvbGxhcHNlZFxuKyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuXG4rICpcbisgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBzZXQgdG8gNjBzIHRvIHByb3ZlIHRoZSB3YWtlIHBhdGg6IHdpdGhvdXRcbisgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvd1xuKyAqIHRoZSB0aW1lb3V0LiBJdCBhbHNvIGtlZXBzIHRoZSBkYWVtb24gZnJvbSBmcmVlLXJ1bm5pbmcgYmV0d2VlblxuKyAqIHN0ZXBzLCBwZXIgdGhlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZGlzY2lwbGluZS5cbisgKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJrc2VsZnRlc3QuaFwiXG4rI2luY2x1ZGUgXCJ2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFwiXG4rXG4rI2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuKyNkZWZpbmUgVEFSR0VUX09SREVSIDJcdC8qIHNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXG4rI2RlZmluZSBOUl9JVEVSQVRJT05TIDVcbitcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuK3N0YXRpYyBpbnQgdHJhY2VfZXZlbnRzX2ZkID0gLTE7XG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4rXG4rLypcbisgKiBFYWNoIHN0ZXAgc3dpdGNoZXMgdGhlIGV2ZW50cyBvZmYgYWdhaW4sIGJ1dCBhIGhlbHBlciBjYW4gc3RpbGwgZ2l2ZSB1cFxuKyAqIG9uIHVzIGluIGJldHdlZW4gKGEgZmFpbGluZyBzeXNmcyB3cml0ZSBlbmRzIHRoZSB0ZXN0IGZyb20gaW5zaWRlXG4rICogdGhwX3dyaXRlX251bSgpKSwgYW5kIGh1Z2VfbWVtb3J5IGV2ZW50cyBsZWZ0IG9uIGFyZSB0aGUgd2hvbGUgbWFjaGluZSdzXG4rICogcHJvYmxlbSwgbm90IHRoaXMgdGVzdCdzLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHRyYWNlX2V2ZW50c19vZmYodm9pZClcbit7XG4rXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzZT0gMClcbitcdFx0dHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpO1xuK31cbitcbisvKlxuKyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBsZWdhY3ktZW5naW5lXG4rICogaXNvbGF0ZSBldmVudHMgd2hvc2Ugc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cncyBzb3VyY2UgUEZOcyxcbisgKiBwbHVzIGJhdGNoLWVuZ2luZSBwZXItY2FuZGlkYXRlIGluc3RhbGwgZXZlbnRzIGF0IHRoZSB3aW5kb3cnc1xuKyAqIGFkZHJlc3MuIEVpdGhlciBlbmdpbmUgcmVwb3J0cyBleGFjdGx5IG9uY2UgcGVyIGF0dGVtcHQuXG4rICovXG4rc3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxuK1x0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBvcmRlcilcbit7XG4rXHRjaGFyIGxpbmVbMTAyNF07XG4rXHRpbnQgY291bnQgPSAwO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpO1xuK1x0aWYgKCFmcClcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiQ2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXFxuXCIpO1xuK1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XG4rXHRcdGNoYXIgKnM7XG4rXHRcdHVuc2lnbmVkIGxvbmcgdmFsO1xuK1x0XHR1bnNpZ25lZCBpbnQgb3JkO1xuK1x0XHRjaGFyICpvO1xuK1x0XHRpbnQgaTtcbitcbitcdFx0cyA9IHN0cnN0cihsaW5lLCBcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlwiKTtcbitcdFx0aWYgKHMpIHtcbitcdFx0XHRpZiAoc3NjYW5mKHMsIFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4XCIsXG4rXHRcdFx0XHQgICBcdTAwMjZ2YWwpICE9IDEpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRvID0gc3Ryc3RyKHMsIFwib3JkZXI9XCIpO1xuK1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCJvcmRlcj0ldVwiLCBcdTAwMjZvcmQpICE9IDEgfHxcbitcdFx0XHQgICAgb3JkICE9IG9yZGVyKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGZuczsgaSsrKSB7XG4rXHRcdFx0XHRpZiAodmFsID09IHBmbnNbaV0pIHtcbitcdFx0XHRcdFx0Y291bnQrKztcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0XHR9XG4rXHRcdFx0fVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXG4rXHRcdHMgPSBzdHJzdHIobGluZSwgXCJtbV9jb2xsYXBzZV9jYW5kaWRhdGU6XCIpO1xuK1x0XHRpZiAocykge1xuK1x0XHRcdGlmICghc3Ryc3RyKHMsIFwicGFzcz1pbnN0YWxsXCIpIHx8XG4rXHRcdFx0ICAgICFzdHJzdHIocywgXCJyZXN1bHQ9c3VjY2VlZGVkXCIpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0byA9IHN0cnN0cihzLCBcImFkZHI9XCIpO1xuK1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCJhZGRyPTB4JWx4XCIsIFx1MDAyNnZhbCkgIT0gMSB8fFxuK1x0XHRcdCAgICB2YWwgIT0gYWRkcilcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdG8gPSBzdHJzdHIocywgXCJvcmRlcj1cIik7XG4rXHRcdFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcIm9yZGVyPSV1XCIsIFx1MDAyNm9yZCkgIT0gMSB8fFxuK1x0XHRcdCAgICBvcmQgIT0gb3JkZXIpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRjb3VudCsrO1xuK1x0XHR9XG4rXHR9XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGNvdW50O1xuK31cbitcbitzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxuK3tcbitcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHR1bnNpZ25lZCBsb25nIHBmbnNbMSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSXTtcbitcdGJvb2wgY29sbGFwc2VkLCBwYXNzZWQ7XG4rXHRpbnQgYXR0cmlidXRlZDtcbitcdGNoYXIgKnA7XG4rXHRpbnQgaTtcbitcbitcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XG4rXHRpZiAocCAhPSBCQVNFX0FERFIpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSB3aW5kb3dcIik7XG4rXG4rXHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XG4rXHRcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcbitcdFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcblwiKTtcbitcdH1cbitcbitcdC8qIENsZWFyIGZpcnN0OiB3aXRoIHRoZSBldmVudHMgc3RpbGwgb2ZmIHRoZXJlIGlzIG5vdGhpbmcgdG8gdW5kby4gKi9cbitcdGlmICh0cmFjaW5nX2NsZWFyX3RyYWNlKCkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkNhbm5vdCBjbGVhciB0aGUgdHJhY2UgYnVmZmVyXFxuXCIpO1xuK1x0aWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIHRydWUpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0LyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXG4rXHRwYXNzZWQgPSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygxMjApO1xuK1xuK1x0LyogT2ZmIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBnaXZlIHVwOiB0aGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZS4gKi9cbitcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkNhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcblwiKTtcbitcdGlmICghcGFzc2VkKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcXG5cIik7XG4rXG4rXHRjb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLFxuK1x0XHRcdFx0XHRcdCAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbitcdGF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCAodW5zaWduZWQgbG9uZylwLFxuK1x0XHRcdFx0ICAgICAgVEFSR0VUX09SREVSKTtcbitcbitcdGtzZnRfdGVzdF9yZXN1bHQoY29sbGFwc2VkIFx1MDAyNlx1MDAyNiBhdHRyaWJ1dGVkID09IDEsXG4rXHRcdFx0IFwic3RlcCAlZDogd2luZG93IGNvbGxhcHNlZCwgJWQgYXR0cmlidXRlZCByZXN1bHQocylcXG5cIixcbitcdFx0XHQgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTtcbitcbitcdG11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7XG4rfVxuK1xuK2ludCBtYWluKHZvaWQpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbitcdGludCBpO1xuK1xuK1x0a3NmdF9wcmludF9oZWFkZXIoKTtcbitcbitcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCIpO1xuK1x0aWYgKCEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSKSkpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxuXCIsXG4rXHRcdFx0ICAgICAgIFRBUkdFVF9PUkRFUik7XG4rXG4rXHRocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7XG4rXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXG5cIik7XG4rXHRwYWdlbWFwX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvcGFnZW1hcFwiLCBPX1JET05MWSk7XG4rXHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCIpO1xuK1x0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCIvcHJvYy9rcGFnZWZsYWdzXCIsIE9fUkRPTkxZKTtcbitcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIm9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiKSByZXF1aXJlcyByb290XFxuXCIpO1xuK1x0dHJhY2VfZXZlbnRzX2ZkID0gdHJhY2luZ19ldmVudHNfb3BlbihcImh1Z2VfbWVtb3J5XCIpO1xuK1x0aWYgKHRyYWNlX2V2ZW50c19mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCJodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XFxuXCIpO1xuK1x0YXRleGl0KHRyYWNlX2V2ZW50c19vZmYpO1xuK1xuK1x0a3NmdF9zZXRfcGxhbihOUl9JVEVSQVRJT05TKTtcbitcbitcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4rXHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuK1x0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcbitcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTtcbitcdC8qIE9uZSB3YWtlIG11c3QgY29tcGxldGUgb25lIGZ1bGwgcGFzczsgc2VlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkuICovXG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXHUwMDNjXHUwMDNjIDI0O1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0c2V0dGluZ3MuaHVnZXBhZ2VzW1RBUkdFVF9PUkRFUl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuK1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfSVRFUkFUSU9OUzsgaSsrKVxuK1x0XHRvbmVfc3RlcChpKTtcbitcbitcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XG4rXG4rXHRrc2Z0X2ZpbmlzaGVkKCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcbmluZGV4IGYxOWQ1M2M2OTU3NjQuLmZkMzVmOGE3YjViODMgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcbkBAIC0yMCw3ICsyMCw2IEBAXG4gXG4gI2RlZmluZSBUV09NRUdcdFx0KDJcdTAwM2NcdTAwM2MyMClcbiAjZGVmaW5lIFJVTlRJTUVcdFx0KDIwKVxuLSNkZWZpbmUgQUxJR04oeCwgYSlcdCgoKHgpICsgKGEgLSAxKSkgXHUwMDI2ICh+KChhKSAtIDEpKSlcbiBcbiBIVUdFVExCX1NFVFVQX0RFRkFVTFRfUEFHRVMoMSlcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG5pbmRleCBkMDlmOWY2YTM4NGVlLi5mYzYxOTA3YWEzYjJhIDEwMDc1NVxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG5AQCAtNDAyLDYgKzQwMiwxMiBAQCBDQVRFR09SWT1cInBmbm1hcFwiIHJ1bl90ZXN0IC4vcGZubWFwXG4gIyBDT1cgdGVzdHNcbiBDQVRFR09SWT1cImNvd1wiIHJ1bl90ZXN0IC4vY293XG4gXG4rQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrXG4rXG4rQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfc3luY19jaGVja1xuK1xuK0NBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2VcbitcbiBDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZFxuIFxuIENBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDJcbkBAIC00MTAsOCArNDE2LDYgQEAgQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgYWxsOnNobWVtXG4gXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cbiBcbi1DQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtYyA0IG10aHBfa2h1Z2VwYWdlZDphbm9uXG4tXG4gIyBUcnkgdG8gY3JlYXRlIFhGUyBpZiBub3QgcHJvdmlkZWRcbiBpZiBbIC16IFwiJHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH1cIiBdOyB0aGVuXG4gICAgIGlmIHRlc3Rfc2VsZWN0ZWQgXCJ0aHBcIjsgdGhlblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5pbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuQEAgLTQyLDY4ICs0Miw2IEBAIGNvbnN0IGNoYXIgKmtwYWdlZmxhZ3NfcHJvYyA9IFwiL3Byb2Mva3BhZ2VmbGFnc1wiO1xuIGludCBwYWdlbWFwX2ZkO1xuIGludCBrcGFnZWZsYWdzX2ZkO1xuIFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbi1cdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4te1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4tXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4tXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4tXG4tXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4tXHRpZiAocGZuID09IC0xVUwpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbi1cdGlmICghb3JkZXIpIHtcbi1cdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0Lyogbm9uIFRIUCBmb2xpbyAqL1xuLVx0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuLVx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuLVx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xuLVx0XHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbi1cdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbi1cdCAqL1xuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4tXG4tXHQvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXG4tXHRyZXR1cm4gKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncztcbi1mYWlsOlxuLVx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiRmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxuXCIpO1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpXG4ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuaW5kZXggODBiYzlmNTk3YjUyMS4uZWUxMzM0Nzc4MzkxZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5AQCAtNDk0LDYgKzQ5NCwxNTEgQEAgaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4rXHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4re1xuK1x0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbitcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4rXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4rXHR1bnNpZ25lZCBsb25nIHBmbjtcbitcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4rXG4rXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4rXHRpZiAocGZuID09IC0xVUwpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbitcdGlmICghb3JkZXIpIHtcbitcdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdHJldHVybiB0cnVlO1xuK1x0fVxuK1xuK1x0Lyogbm9uIFRIUCBmb2xpbyAqL1xuK1x0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbitcbitcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuK1x0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuK1x0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xuK1x0XHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4rXHRcdFx0Z290byBmYWlsO1xuK1x0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbitcdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbitcdCAqL1xuK1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbitcdFx0cmV0dXJuIHRydWU7XG4rXG4rXHQvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXG4rXHRyZXR1cm4gKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncztcbitmYWlsOlxuK1x0a3NmdF9leGl0X2ZhaWxfbXNnKFwiRmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxuXCIpO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbisvKlxuKyAqIENoZWNrIHdoZXRoZXIgZXZlcnkgb3JkZXItQG9yZGVyIHdpbmRvdyBvZiBbc3RhcnQsIGxlbikgbWFwcyBleGFjdGx5IG9uZVxuKyAqIGZvbGlvIG9mIHRoYXQgb3JkZXIsIGhlYWQgdG8gdGFpbC4gIFRoZSBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5XG4rICogYWxpZ25lZCwgZWFjaCB3aW5kb3cncyBQRk4gcnVuIG11c3QgYmUgY29udGlndW91cywgYW5kIGEgd2luZG93J3MgZmlyc3RcbisgKiBQRk4gbXVzdCBiZSB0aGUgZm9saW8gaGVhZC5cbisgKlxuKyAqIFRoaXMgaXMgdGhlIGNoZWNrIFwiZGlkIHRoaXMgcmFuZ2UgY29sbGFwc2UgaW50byBvcmRlci1Ab3JkZXIgZm9saW9zXCI6IGFcbisgKiB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpbyBzaGlmdGVkXG4rICogZnJvbSBpdHMgbmF0dXJhbCBwb3NpdGlvbiwgZmFpbHMuXG4rICovXG4rYm9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4rXHRcdFx0XHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZClcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBucl9wYWdlcyAqIHBzaXplKCk7XG4rXHRjaGFyICp2YWRkcjtcbitcbitcdGlmICgodWludHB0cl90KXN0YXJ0ICUgd2luZG93IHx8IGxlbiAlIHdpbmRvdylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0Zm9yICh2YWRkciA9IHN0YXJ0OyB2YWRkciBcdTAwM2Mgc3RhcnQgKyBsZW47IHZhZGRyICs9IHdpbmRvdykge1xuK1x0XHR1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4rXHRcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdFx0LyogTm90IHByZXNlbnQsIG9yIG5vdCBtYXBwaW5nIHRoZSBmb2xpbyBoZWFkLiAqL1xuK1x0XHRpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdFx0aWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkciArIGkgKiBwc2l6ZSgpKSAhPVxuK1x0XHRcdCAgICBwZm4gKyBpKVxuK1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9XG4rXG4rXHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcbitcdFx0XHRcdFx0a3BhZ2VmbGFnc19mZCkpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKyNkZWZpbmUgVFJBQ0VGU19ST09UIFwiL3N5cy9rZXJuZWwvdHJhY2luZ1wiXG4rXG4rLypcbisgKiBPcGVuIHRoZSBlbmFibGUgZmlsZSBvZiBvbmUgZnRyYWNlIGV2ZW50IHN1YnN5c3RlbSAoZS5nLiBcImh1Z2VfbWVtb3J5XCIpLlxuKyAqIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0cmFjaW5nX2V2ZW50c19lbmFibGUoKSwgb3IgLTEgaWYgdHJhY2VmcyBvciB0aGVcbisgKiBzdWJzeXN0ZW0gaXMgbm90IHRoZXJlLiAgVGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUgc3RhdGU6IHdob2V2ZXJcbisgKiBzd2l0Y2hlcyB0aGVtIG9uIG93bnMgdGhlbSB1bnRpbCBpdCBzd2l0Y2hlcyB0aGVtIG9mZiwgaW5jbHVkaW5nIG9uIHRoZVxuKyAqIHBhdGhzIHdoZXJlIHRoZSB0ZXN0IGdpdmVzIHVwLlxuKyAqL1xuK2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcbit7XG4rXHRjaGFyIHBhdGhbMjU2XTtcbitcbitcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UIFwiL2V2ZW50cy8lcy9lbmFibGVcIixcbitcdFx0IHN1YnN5cyk7XG4rXHRyZXR1cm4gb3BlbihwYXRoLCBPX1dST05MWSk7XG4rfVxuK1xuK2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSlcbit7XG4rXHRpZiAocHdyaXRlKGZkLCBlbmFibGUgPyBcIjFcIiA6IFwiMFwiLCAxLCAwKSAhPSAxKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyogRHJvcCB3aGF0IHRoZSB0cmFjZSBidWZmZXIgaG9sZHMgc28gZmFyLiAqL1xuK2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpXG4re1xuK1x0aW50IGZkID0gb3BlbihUUkFDRUZTX1JPT1QgXCIvdHJhY2VcIiwgT19XUk9OTFkgfCBPX1RSVU5DKTtcbitcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKVxuK3tcbitcdHJldHVybiBmb3BlbihUUkFDRUZTX1JPT1QgXCIvdHJhY2VcIiwgXCJyXCIpO1xuK31cbitcbiAvKiBJZiBgaW9jdGxzJyBub24tTlVMTCwgdGhlIGFsbG93ZWQgaW9jdGxzIHdpbGwgYmUgcmV0dXJuZWQgaW50byB0aGUgdmFyICovXG4gaW50IHVmZmRfcmVnaXN0ZXJfd2l0aF9pb2N0bHMoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcbiBcdFx0XHQgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG5pbmRleCA5YTQ5YWY4ODcwMmU0Li4xMGM3YmU0NmU0NGNhIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbkBAIC0xMCw2ICsxMCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuIFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXHUwMDNjXHUwMDNjIChucikpXG4rI2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSArIChhKSAtIDEpIFx1MDAyNiB+KChhKSAtIDEpKVxuK1xuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcbiAjZGVmaW5lIFBNX01NQVBfRVhDTFVTSVZFICAgICAgICAgICAgIEJJVF9VTEwoNTYpXG4gI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KVxuQEAgLTk3LDYgKzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xuIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKTtcbiBpbnQgZ2F0aGVyX2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpO1xuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxuK1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKTtcbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcbitcdFx0XHRcdCAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKTtcbiBcbiBpbnQgdWZmZF9yZWdpc3RlcihpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxuIFx0XHQgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vcik7XG5AQCAtMTEzLDYgKzExOSwxMCBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XG4raW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKTtcbitpbnQgdHJhY2luZ19ldmVudHNfZW5hYmxlKGludCBmZCwgYm9vbCBlbmFibGUpO1xuK2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpO1xuK0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKTtcbiBcbiBzdGF0aWMgaW5saW5lIGludCBvcGVuX3NlbGZfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcF9vdXQpXG4ge1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTQ6NTk6MTIuMzIyMzg2NTUyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTA5MDE0ODQyNzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqV29ydGhGdXp6aW5nIEFuYWx5c2lzOiBTZWxmdGVzdCBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgcGF0Y2ggdGhhdCdzIGFkZGluZyBhbmQgbW9kaWZ5aW5nIHRlc3RzIHdpdGhpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gSSdtIGdvaW5nIHRocm91Z2ggdGhlIGZpbGVzIOKAkyBgTWFrZWZpbGVgLCBgZm9saW9fb3JkZXJfY2hlY2suY2AsIGBobW0tdGVzdHMuY2AsIHRoZSBodWdlcGFnZSBzdHVmZiwgYGtodWdlcGFnZWRgLCBtaWdyYXRpb24sIGFuZCBzbyBvbi4gSXQgc2VlbXMgbGlrZSBhIHByZXR0eSBjb21wcmVoZW5zaXZlIGFkZGl0aW9uIHRvIHRoZSBzZWxmdGVzdHMgc3VpdGUuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBxdWlja2x5IGFzc2VzcyB3aGV0aGVyIHRoaXMgd2FycmFudHMgZnV6emluZyBhdHRlbnRpb24uIFRoZSBpbnN0cnVjdGlvbnMgSSBoYXZlIGxheSBvdXQgYSBzcGVjaWZpYyBzZXQgb2Ygc2NlbmFyaW9zIHdoZXJlIHdlIHNob3VsZCByZXR1cm4gYFdvcnRoRnV6emluZz1mYWxzZWAuIEl0IGxpc3RzIHRoaW5ncyBsaWtlIGRvY3VtZW50YXRpb24gY2hhbmdlcywgY29tbWVudCB1cGRhdGVzLCBkZWNvcmF0aXZlIGxvZ2dpbmcsIGNvbnN0YW50IGFkanVzdG1lbnRzIHRoYXQgZG9uJ3QgY2hhbmdlIGV4ZWN1dGlvbiwgYW5kIHVucmVhY2hhYmxlIGNvZGUgcGF0aHMuIFRoZXJlJ3MgYWxzbyBzb21lIGltcG9ydGFudCBjYXZlYXRzIGFib3V0IHNwZWNpZmljIGhhcmR3YXJlIGFuZCBkcml2ZXIgY29udGV4dHMuXG5cbkFoLCBidXQgd2FpdCBhIHNlY29uZC4uLiBpdCAqZG9lc24ndCogZXhwbGljaXRseSBtZW50aW9uIHNlbGZ0ZXN0cyBpbiB0aGF0IFwiV29ydGhGdXp6aW5nPWZhbHNlXCIgbGlzdC4gSG93ZXZlciwgc2VsZnRlc3RzIGFyZSBub3Qga2VybmVsIGNvZGUuIFRoZXkgbGl2ZSBpbiB1c2Vyc3BhY2U7IHRoZXkncmUgKnRvb2xzKiB1c2VkIHRvIHZhbGlkYXRlIHRoZSBrZXJuZWwncyBiZWhhdmlvci4gVGhlIGtlcm5lbCBpdHNlbGYgKmlzKiB3aGF0IFN5emthbGxlciBmdXp6ZXMgdXNpbmcgc3lzY2FsbHMuIFRoZSBzZWxmdGVzdHMgYXJlIHBhcnQgb2YgaG93IHdlIG1lYXN1cmUgaXRzIHBlcmZvcm1hbmNlIGFuZCBiZWhhdmlvciwgYnV0IHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlIHN5c3RlbSBjYWxsIGZsb3cgdGhhdCdzIHRoZSBwcmltYXJ5IHRhcmdldCBvZiBmdXp6aW5nLlxuXG5MZXQgbWUganVzdCBkbyBhIHF1aWNrLCB2ZXJ5IGV4cGxpY2l0LCBkb3VibGUtY2hlY2sgdG8gY29uZmlybS4gWWVzLCBhbGwgdGhlIGNoYW5nZXMgYXJlIHNxdWFyZWx5IHdpdGhpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gTm90aGluZyBpbiBhbnkga2VybmVsIHN1YnN5c3RlbXMgaGVyZS5cblxuVGhlcmVmb3JlLCBiZWNhdXNlIHRoaXMgcGF0Y2ggKm9ubHkqIHRvdWNoZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cywgYW5kIGRvZXMgbm90IGFsdGVyIHRoZSBleGVjdXRpb24gZmxvdyBvZiB0aGUga2VybmVsIGl0c2VsZiwgSSBhbSBnb2luZyB0byBzZXQgYFdvcnRoRnV6emluZz1mYWxzZWAuIFRoZSByZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkOiB0aGVzZSBjaGFuZ2VzIGFyZSBpc29sYXRlZCB0byB0aGUgdGVzdGluZyBmcmFtZXdvcmsgYW5kIGFyZSBub3QgcGFydCBvZiB0aGUga2VybmVsIGV4ZWN1dGlvbiBwYXRoIHRoYXQgU3l6a2FsbGVyIGZ1enplcy4gTGV0J3MgY2FsbCBgc2V0LXJlc3VsdHNgIHRvIGNvbXBsZXRlIHRoaXMgdGFzay5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg5MjcsIk91dHB1dFRva2VucyI6NjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MjUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNDo1OToyMy4yMjM4NzMyMTVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NDcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8sIHdoaWNoIGRvIG5vdCBhZmZlY3QgdGhlIGtlcm5lbCdzIGZ1bmN0aW9uYWwgZXhlY3V0aW9uIGZsb3cuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLCB3aGljaCBkbyBub3QgYWZmZWN0IHRoZSBrZXJuZWwncyBmdW5jdGlvbmFsIGV4ZWN1dGlvbiBmbG93LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTQ6NTk6MjMuMjIzODkzNDI1WiIsIlNlcSI6NSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowkbvn9[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-12 14:39:49 +0000 UTC FinishedAt: 2026-08-12 14:59:25 +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+CgkJCTx0ZD4yMDI2LzA4LzEyIDE0OjU5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLywgd2hpY2ggZG8gbm90IGFmZmVjdCB0aGUga2VybmVsJiMzOTtzIGZ1bmN0aW9uYWwgZXhlY3V0aW9uIGZsb3cuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE0OjU5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNjdhMTllMTdhOTFiNjE1ZDAwNzFjM2Q4NDEwMzgyZTgxYzBlOTA4OFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgQXVnIDEyIDE0OjU5OjEwIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbkBAIC0xMDQsNiAmIzQzOzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBndWFyZC1yZWdpb25zXG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1lcmdlXG4gVEVTVF9HRU5fRklMRVMgJiM0Mzs9IHJtYXBcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0XG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19vcmRlcl9jaGVja1xuJiM0MztURVNUX0dFTl9GSUxFUyAmIzQzOz0ga2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3JhY2VcbiBcbiBpZm5lcSAoJChBUkNIKSxhcm02NClcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gc29mdC1kaXJ0eVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uOTMwMzBhNDJjM2NjZFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xuQEAgLTAsMCAmIzQzOzEsMTM3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGRldGVjdGlvbiBoZWxwZXJzLFxuJiM0MzsgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBhbmQgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycygpLlxuJiM0MzsgKlxuJiM0MzsgKiBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHQgbWVtb3J5IGluIHdpdGggb25seVxuJiM0MzsgKiB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHZlcmlmeSB0aGUgaGVscGVycyByZXBvcnQgZXhhY3RseSB0aGF0IG9yZGVyOlxuJiM0MzsgKiBub3QgYSBuZWlnaGJvdXJpbmcgb3JkZXIsIGFuZCBwbGFpbiA0SyBtZW1vcnkgYXMgb3JkZXIgMC4gVGhlIGhlbHBlcnNcbiYjNDM7ICogYXJlIHdoYXQgdGhlIGtodWdlcGFnZWQgbVRIUCB0ZXN0cyB1c2UgdG8gZGV0ZWN0IGNvbGxhcHNlIHJlc3VsdHMsIHNvXG4mIzQzOyAqIHRoZXkgbXVzdCBhZ3JlZSB3aXRoIHRoZSBrZXJuZWwmIzM5O3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueVxuJiM0MzsgKiBjb2xsYXBzZSB0ZXN0IHJlbGllcyBvbiB0aGVtLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7a3NlbGZ0ZXN0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7dm1fdXRpbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcbiYjNDM7c3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuJiM0MztcbiYjNDM7LyogbW1hcCBhbiBhbm9uIFZNQSBvZiBleGFjdGx5IEBzaXplIGJ5dGVzIGF0IGEgQHNpemUtYWxpZ25lZCBhZGRyZXNzLiAqL1xuJiM0MztzdGF0aWMgY2hhciAqYWxsb2NfYWxpZ25lZChzaXplX3Qgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHNpemVfdCBsZW4gPSBzaXplICogMjtcbiYjNDM7XHR1aW50cHRyX3QgYWxpZ25lZDtcbiYjNDM7XHRjaGFyICpwO1xuJiM0MztcbiYjNDM7XHRwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4mIzQzO1x0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKClcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRhbGlnbmVkID0gQUxJR04oKHVpbnRwdHJfdClwLCBzaXplKTtcbiYjNDM7XHRpZiAoYWxpZ25lZCAhPSAodWludHB0cl90KXApXG4mIzQzO1x0XHRtdW5tYXAocCwgYWxpZ25lZCAtICh1aW50cHRyX3QpcCk7XG4mIzQzO1x0aWYgKGFsaWduZWQgJiM0Mzsgc2l6ZSAhPSAodWludHB0cl90KXAgJiM0MzsgbGVuKVxuJiM0MztcdFx0bXVubWFwKChjaGFyICopYWxpZ25lZCAmIzQzOyBzaXplLFxuJiM0MztcdFx0ICAgICAgICh1aW50cHRyX3QpcCAmIzQzOyBsZW4gLSBhbGlnbmVkIC0gc2l6ZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAoY2hhciAqKWFsaWduZWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEVuYWJsZSBvbmx5IEBvcmRlciAob3JkZXIgMDogbm90aGluZyksIGZhdWx0IG9uZSBhbGlnbmVkIHdpbmRvdyBpbiBhbmRcbiYjNDM7ICogY2hlY2sgdGhlIGhlbHBlcnMgc2VlIGV4YWN0bHkgQG9yZGVyLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfb3JkZXIoaW50IG9yZGVyKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdHNpemVfdCBzaXplID0gcHNpemUoKSBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0Ym9vbCBvayA9IHRydWU7XG4mIzQzO1x0Y2hhciAqcDtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuJiM0MztcdGlmIChvcmRlcilcbiYjNDM7XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRwID0gYWxsb2NfYWxpZ25lZChzaXplKTtcbiYjNDM7XHQqcCA9IDE7XG4mIzQzO1xuJiM0MztcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O29yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcblwmIzM0Oywgb3JkZXIpO1xuJiM0MztcdFx0b2sgPSBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEEgbG93ZXIgb3JkZXIgbXVzdCBiZSByZWplY3RlZDogdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cbiYjNDM7XHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIgLSAxLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O29yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBvcmRlciwgb3JkZXIgLSAxKTtcbiYjNDM7XHRcdG9rID0gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBPcmRlciAwIHBhZ2VzIG11c3Qgbm90IGxvb2sgbGlrZSBhbnkgbGFyZ2UgZm9saW8sIGFuZCB2aWNlIHZlcnNhLiAqL1xuJiM0MztcdGlmIChvcmRlciBcdTAwMjZcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCAwLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O29yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxcblwmIzM0Oywgb3JkZXIpO1xuJiM0MztcdFx0b2sgPSBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG11bm1hcChwLCBzaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHQob2ssIFwmIzM0O29yZGVyICVkIGNsYXNzaWZpZWRcXG5cJiMzNDssIG9yZGVyKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG1haW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBvcmRlcnM7XG4mIzQzO1x0aW50IG9yZGVyO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuJiM0MztcbiYjNDM7XHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0cGFnZW1hcF9mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCYjMzQ7KTtcbiYjNDM7XHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7LCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtvcGVuKFxcXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1xcXCYjMzQ7KSByZXF1aXJlcyByb290XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0b3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcbiYjNDM7XHRpZiAoIW9yZGVycylcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O05vIHN1cHBvcnRlZCBUSFAgb3JkZXJzXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9zZXRfcGxhbihfX2J1aWx0aW5fcG9wY291bnRsKG9yZGVycykgJiM0MzsgMSk7XG4mIzQzO1xuJiM0MztcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi9cbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdGNoZWNrX29yZGVyKDApO1xuJiM0MztcdGZvciAob3JkZXIgPSAxOyBvcmRlciBcdTAwM2MgTlJfT1JERVJTOyBvcmRlciYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmICghKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXIpKSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRjaGVja19vcmRlcihvcmRlcik7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xuaW5kZXggZTI2NDJlY2EwZDAyYi4uZGY0MjZmOTIxOGU3MSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xuQEAgLTY1LDcgJiM0Mzs2NSw2IEBAIGVudW0ge1xuICNkZWZpbmUgSE1NX1BBVEhfTUFYICAgIDY0XG4gI2RlZmluZSBOVElNRVNcdFx0MTBcbiBcbi0jZGVmaW5lIEFMSUdOKHgsIGEpICgoKHgpICYjNDM7IChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi9cbiBcbiAjaWZuZGVmIEZPTExfV1JJVEVcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuaW5kZXggZDc5MTdkY2UzYWJhYy4uOGFmY2RmOTc5M2JiNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbkBAIC0xODMsNiAmIzQzOzE4MywxNyBAQCB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0fVxuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogV3JpdGUgb25seSBvbiBjaGFuZ2U6IGFueSBzdG9yZSB0byBhIGtodWdlcGFnZWQgc3lzZnMga25vYiB3YWtlcyB0aGVcbiYjNDM7ICogZGFlbW9uLCBhbmQgc2V0dGluZ3MgcHVzaGVzL3BvcHMgbXVzdCBub3Qgc3RhcnQgc2NhbiBwYXNzZXMgbm9ib2R5XG4mIzQzOyAqIGFza2VkIGZvciAtLSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGlzIHRoZSBvbmx5IHNhbmN0aW9uZWQgd2FrZS5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pXG4mIzQzO3tcbiYjNDM7XHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcbiYjNDM7XHRcdHRocF93cml0ZV9udW0obmFtZSwgbnVtKTtcbiYjNDM7fVxuJiM0MztcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiB7XG4gXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFx1MDAyNnNldHRpbmdzLVx1MDAzZWtodWdlcGFnZWQ7XG5AQCAtMTk4LDE1ICYjNDM7MjA5LDE1IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0XHRcdHNobWVtX2VuYWJsZWRfc3RyaW5nc1tzZXR0aW5ncy1cdTAwM2VzaG1lbV9lbmFibGVkXSk7XG4gXHR0aHBfd3JpdGVfbnVtKFwmIzM0O3VzZV96ZXJvX3BhZ2VcJiMzNDssIHNldHRpbmdzLVx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xuIFxuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL2RlZnJhZ1wmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VkZWZyYWcpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wmIzM0Oyxcbi1cdFx0XHRraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcJiMzNDssXG4tXHRcdFx0a2h1Z2VwYWdlZC1cdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3N3YXApO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWdcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlZGVmcmFnKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX25vbmVcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3N3YXApO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9wYWdlc190b19zY2FuXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuIFxuIFx0aWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pXG4gXHRcdHdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy1cdTAwM2VyZWFkX2FoZWFkX2tiKTtcbkBAIC0yMzAsNiAmIzQzOzI0MSw0OSBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiBcdH1cbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIENvbXBsZXRpb24gYmFycmllciBmb3Iga2h1Z2VwYWdlZDogd2FpdCB1bnRpbCBhIGZ1bGwgc2NhbiBwYXNzIHRoYXRcbiYjNDM7ICogc3RhcnRlZCBhZnRlciB0aGlzIGNhbGwgaGFzIGZpbmlzaGVkLiBmdWxsX3NjYW5zIG11c3QgYWR2YW5jZSBieSB0d287XG4mIzQzOyAqIGEgJiM0MzsxIHN0ZXAgbWF5IGNvbXBsZXRlIGEgcGFzcyB0aGF0IGV4YW1pbmVkIHRoaXMgbW0gYmVmb3JlIHRoZVxuJiM0MzsgKiBjYWxsZXImIzM5O3Mgc2V0dXAgd2FzIGluIHBsYWNlLlxuJiM0MzsgKlxuJiM0MzsgKiBBbnkgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgc28gdGhlIGJhcnJpZXIgd29ya3NcbiYjNDM7ICogd2hhdGV2ZXIgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlIC0tIGJ1dCBhIHN0b3JlIGNhbiBiZSBsb3N0LlxuJiM0MzsgKiBfX3NsZWVwX21pbGxpc2Vjc19zdG9yZSgpIGNsZWFycyBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZSBhbmQgd2FrZXMgdGhlXG4mIzQzOyAqIHF1ZXVlOyBpZiB0aGUgZGFlbW9uIGlzIGJldHdlZW4gc2NhbnMgcmF0aGVyIHRoYW4gc2xlZXBpbmcsIGl0IHNldHNcbiYjNDM7ICoga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgaXRzZWxmIG9uIHRoZSB3YXkgaW50byBraHVnZXBhZ2VkX3dhaXRfd29yaygpIGFuZFxuJiM0MzsgKiB0aGVuIHNsZWVwcyBmb3IgdGhlIGZ1bGwgaW50ZXJ2YWwsIGhhdmluZyBuZXZlciBzZWVuIHRoZSBzdG9yZS4gIFNvIGtlZXBcbiYjNDM7ICogc3RvcmluZyB1bnRpbCB0aGUgcGFzcyBsYW5kczsgYSBzdG9yZSB3aGlsZSB0aGUgZGFlbW9uIGlzIGF3YWtlIGNvc3RzXG4mIzQzOyAqIG5vdGhpbmcgYW5kIGRvZXMgbm90IHF1ZXVlIGFuIGV4dHJhIHBhc3MuXG4mIzQzOyAqXG4mIzQzOyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpblxuJiM0MzsgKiBvbmUgc2NhbiBiYXRjaCwgc28gY2FsbGVycyBtdXN0IHBhaXIgdGhpcyB3aXRoIGEgbGFyZ2VcbiYjNDM7ICogcGFnZXNfdG9fc2Nhbi5cbiYjNDM7ICovXG4mIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZGVhZGxpbmVfbXMgPSB0aW1lb3V0X3MgKiAxMDAwVUw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9XG4mIzQzO1x0XHR0aHBfcmVhZF9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0Oyk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbGFwc2VkX21zID0gMDtcbiYjNDM7XHRpbnQgcGFzcztcbiYjNDM7XG4mIzQzO1x0Zm9yIChwYXNzID0gMDsgcGFzcyBcdTAwM2MgMjsgcGFzcyYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgdGFyZ2V0ID1cbiYjNDM7XHRcdFx0dGhwX3JlYWRfbnVtKFwmIzM0O2todWdlcGFnZWQvZnVsbF9zY2Fuc1wmIzM0OykgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0XHR3aGlsZSAodGhwX3JlYWRfbnVtKFwmIzM0O2todWdlcGFnZWQvZnVsbF9zY2Fuc1wmIzM0OykgXHUwMDNjIHRhcmdldCkge1xuJiM0MztcdFx0XHRpZiAoZWxhcHNlZF9tcyBcdTAwM2U9IGRlYWRsaW5lX21zKVxuJiM0MztcdFx0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdFx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIHNsZWVwX21zKTtcbiYjNDM7XHRcdFx0dXNsZWVwKDEwICogMTAwMCk7XG4mIzQzO1x0XHRcdGVsYXBzZWRfbXMgJiM0Mzs9IDEwO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiBzdHJ1Y3QgdGhwX3NldHRpbmdzICp0aHBfY3VycmVudF9zZXR0aW5ncyh2b2lkKVxuIHtcbiBcdGlmICghc2V0dGluZ3NfaW5kZXgpIHtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuaW5kZXggNzI2YzczYzQzYzA1Yi4uYmE3ZDM4MzcwZDQzMyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbkBAIC03MCw2ICYjNDM7NzAsNyBAQCBpbnQgdGhwX3JlYWRfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10pO1xuIHZvaWQgdGhwX3dyaXRlX3N0cmluZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3JlYWRfbnVtKGNvbnN0IGNoYXIgKm5hbWUpO1xuIHZvaWQgdGhwX3dyaXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4mIzQzO3ZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pO1xuIFxuIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKTtcbiB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKTtcbkBAIC04Myw2ICYjNDM7ODQsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZClcbiBcdGh1Z2VwYWdlX3NhdmVfc2V0dGluZ3MoLyogdGhwID0gKi8gdHJ1ZSwgLyogaHVnZXRsYiA9ICovIGZhbHNlKTtcbiB9XG4gXG4mIzQzO2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcyk7XG4mIzQzO1xuIHZvaWQgdGhwX3NldF9yZWFkX2FoZWFkX3BhdGgoY2hhciAqcGF0aCk7XG4gdW5zaWduZWQgbG9uZyB0aHBfc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuaW5kZXggMGQ2YzcxZWQyZmFlMy4uZjU3NzNkNDQ3NTQyNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5AQCAtMzEsNiAmIzQzOzMxLDExIEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjtcbiBzdGF0aWMgaW50IGFub25fb3JkZXI7XG4gc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcjtcbiYjNDM7c3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfZ2l2ZW47XG4mIzQzO3N0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXJzW05SX09SREVSU107XG4mIzQzO3N0YXRpYyBpbnQgbnJfY29sbGFwc2Vfb3JkZXJzO1xuJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTtcbiYjNDM7c3RhdGljIGludCBrcGFnZWZsYWdzX2ZkID0gLTE7XG4gXG4gI2RlZmluZSBQSURfU01BUFMgXCYjMzQ7L3Byb2Mvc2VsZi9zbWFwc1wmIzM0O1xuICNkZWZpbmUgVEVTVF9GSUxFIFwmIzM0O2NvbGxhcHNlX3Rlc3RfZmlsZVwmIzM0O1xuQEAgLTI0MSw2ICYjNDM7MjQ2LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKVxuIFx0cmV0dXJuIHN3YXA7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBQYWdlIHRoZSByYW5nZSBvdXQgYW5kIHdhaXQgZm9yIHRoZSBzd2FwIGNvdW50IHRvIHNheSBzby5cbiYjNDM7ICpcbiYjNDM7ICogVHdvIHRoaW5ncyBnZXQgaW4gdGhlIHdheS4gIE1BRFZfUEFHRU9VVCBpcyBiZXN0IGVmZm9ydDpcbiYjNDM7ICogc2hyaW5rX2ZvbGlvX2xpc3QoKSBsZWF2ZXMgYSBmb2xpbyBhbG9uZSB3aGVuIGl0IGNhbm5vdCByZWNsYWltIGl0IHJpZ2h0XG4mIzQzOyAqIGF3YXksIGFuZCBvbmUgc3RpbGwgdW5kZXIgd3JpdGViYWNrIGZyb20gYW4gZWFybGllciBwYWdlb3V0IGlzIHRoZSBjb21tb25cbiYjNDM7ICogY2FzZSwgc28gdGhlIGNvdW50IHRoZSBjYWxsZXIgYXNrcyBmb3IgYXJyaXZlcyBhIG1vbWVudCBsYXRlci4gIEFuZCBhIHJhbmdlXG4mIzQzOyAqIGFuIGVhcmxpZXIgY29sbGFwc2UgbGVmdCBNQURWX0hVR0VQQUdFIGlzIG9uZSBraHVnZXBhZ2VkIGlzIHN0aWxsIHdvcmtpbmdcbiYjNDM7ICogb246IGNvbGxhcHNpbmcgYSByYW5nZSB3aXRoIHVwIHRvIG1heF9wdGVzX3N3YXAgcGFnZXMgc3dhcHBlZCBvdXQgbWVhbnNcbiYjNDM7ICogcmVhZGluZyB0aG9zZSBwYWdlcyBiYWNrIGluLCBzbyB0aGUgZGFlbW9uIHVuZG9lcyB0aGUgcGFnZW91dCBhcyBmYXN0IGFzIGl0XG4mIzQzOyAqIGlzIGFza2VkIGZvci4gIEtlZXAgdGhlIHJhbmdlIG91dCBvZiBpdHMgcmVhY2g7IHRoZSBjb2xsYXBzZSB0aGUgY2FsbGVyIHJ1bnNcbiYjNDM7ICogbmV4dCBwdXRzIE1BRFZfSFVHRVBBR0UgYmFjay5cbiYjNDM7ICpcbiYjNDM7ICogRmFpbGluZyB0byBnZXQgdGhlIHBhZ2VzIG91dCBpcyB0aGUgbWFjaGluZSYjMzk7cyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJiMzOTtzIC0tXG4mIzQzOyAqIHN3YXAgdG9vIHNtYWxsLCBzd2FwIGZ1bGwsIGEgbWVtY2cgY2FwLCBhIGZvbGlvIHN0aWxsIHVuZGVyIHdyaXRlYmFjayAtLSBzb1xuJiM0MzsgKiBjYWxsZXJzIHNraXAgcmF0aGVyIHRoYW4gZmFpbC4gIEFuIGVycm9yIGZyb20gbWFkdmlzZSgpIGlzIGRpZmZlcmVudCwgYW5kXG4mIzQzOyAqIGVuZHMgdGhlIHJ1biBoZXJlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9OT0hVR0VQQUdFKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0MDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVClcJiMzNDspO1xuJiM0MztcdFx0aWYgKGNoZWNrX3N3YXAocCwgc2l6ZSkpXG4mIzQzO1x0XHRcdHJldHVybiB0cnVlO1xuJiM0MztcdFx0dXNsZWVwKDUwICogMTAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCAqYWxsb2NfbWFwcGluZyhpbnQgbnIpXG4ge1xuIFx0dm9pZCAqcDtcbkBAIC01ODMsOCAmIzQzOzYyMywxMCBAQCBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IG5yX2hwYWdlcywgaW50IGNvbGxhcF9vcmRlciwgc3RydWN0IG1lbV9vcHMgKm9wcylcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGhwYWdlX3NpemUgPSBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcF9vcmRlcjtcbiYjNDM7XHQvKiBUaHJlZSBzZWNvbmRzIGFzIGEgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gdG8gY29sbGFwc2UgKi9cbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIGJ5dGVzID0gKHVuc2lnbmVkIGxvbmcpbnJfaHBhZ2VzICogaHBhZ2Vfc2l6ZTtcbiYjNDM7XHRpbnQgdGltZW91dCA9IDYgJiM0MzsgMiAqIChieXRlcyAvICgxMjhVTCBcdTAwM2NcdTAwM2MgMjApKTtcbiBcdGludCBmdWxsX3NjYW5zO1xuLVx0aW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi9cbiBcbiBcdC8qIFNhbml0eSBjaGVjayAqL1xuIFx0aWYgKCFvcHMtXHUwMDNlY2hlY2tfaHVnZShwLCBsZW4sIDAsIGhwYWdlX3NpemUpKVxuQEAgLTg1MywxMiAmIzQzOzg5NSwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9zd2FwaW5fc2luZ2xlX3B0ZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcFxuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbi1cdGlmIChtYWR2aXNlKHAsIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9QQUdFT1VUKVwmIzM0Oyk7XG4tXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XG4mIzQzO1x0aWYgKHN3YXBvdXRfcmFuZ2UocCwgcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1x0XHRza2lwKFwmIzM0O0NvdWxkIG5vdCBzd2FwIG91dFwmIzM0Oyk7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuQEAgLTg4NSwxMiAmIzQzOzkyNSwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbi1cdGlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpXCYjMzQ7KTtcbi1cdGlmIChjaGVja19zd2FwKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkge1xuJiM0MztcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1x0XHRza2lwKFwmIzM0O0NvdWxkIG5vdCBzd2FwIG91dFwmIzM0Oyk7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuQEAgLTkwMiwxMiAmIzQzOzk0MCwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCYjMzQ7LCBtYXhfcHRlc19zd2FwLFxuIFx0XHQgICAgICAgaHBhZ2VfcG1kX25yKTtcbi1cdFx0aWYgKG1hZHZpc2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpXCYjMzQ7KTtcbi1cdFx0aWYgKGNoZWNrX3N3YXAocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbiYjNDM7XHRcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUpKSB7XG4gXHRcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XHRcdFx0c2tpcChcJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXRcJiMzNDspO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gXG5AQCAtOTc0LDYgJiM0MzsxMDEwLDE2IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbXBvdW5kX2V4dHJlbWUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHR2b2lkICpwO1xuIFx0aW50IGk7XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgdGVzdCBuZWVkcyBocGFnZV9wbWRfbnIgUE1ELW9yZGVyIGFsbG9jYXRpb25zLCB3aGljaCBpcyBsaWtlbHkgdG9cbiYjNDM7XHQgKiBmYWlsIGZvciBsYXJnZSBQTUQgc2l6ZXMuICBTa2lwIGlmIHRoZSBQTUQgc2l6ZSBpcyBvdmVyIDMyTS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoaHBhZ2VfcG1kX3NpemUgXHUwMDNlICgzMlVMIFx1MDAzY1x1MDAzYyAyMCkpIHtcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDslczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXG5cJiMzNDspO1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaHBhZ2VfcG1kX25yOyBpJiM0MzsmIzQzOykge1xuQEAgLTExNjQsNiAmIzQzOzEyMTAsNzIgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBDb250ZW50IHN0YXlzIGlzb2xhdGVkIHdoaWxlIGEgY28tc2hhcmVyIHdyaXRlcyBjb25jdXJyZW50bHkuIEEgc2hhcmVkXG4mIzQzOyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlXG4mIzQzOyAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNvcHk7IGEgY28tc2hhcmVyJiMzOTtzIHdyaXRlIGdvZXMgdG8gYSBDb1cgY29weS4gVGhlXG4mIzQzOyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5XG4mIzQzOyAqIGl0cyBvd24gd3JpdGVzLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgc2hhcmVkID0gNjQgKiBwYWdlX3NpemU7XG4mIzQzO1x0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xuJiM0MztcdGludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG4gPSBzaGFyZWQgLyBwYWdlX3NpemU7XG4mIzQzO1x0Lyogdm9sYXRpbGU6IHRoZSBsb29wIGJlbG93IG11c3QgcmVhbGx5IHN0b3JlLCBvbiBldmVyeSBpdGVyYXRpb24gKi9cbiYjNDM7XHR2b2xhdGlsZSBpbnQgKmlwO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHRpcCA9IHA7XG4mIzQzO1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIHNoYXJlZCk7XHRcdC8qIHNoYXJlZCBwcmVmaXgsIHByZS1mb3JrIHBhdHRlcm4gKi9cbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Rm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cJiMzNDspO1xuJiM0MztcdGlmICghZm9yaygpKSB7XG4mIzQzO1x0XHRpbnQgY29sbGFwc2Vfc3RhdHVzO1xuJiM0MztcbiYjNDM7XHRcdG9wcy1cdTAwM2VmYXVsdChwLCBzaGFyZWQsIGhwYWdlX3BtZF9zaXplKTtcdC8qIHByaXZhdGUgcmVtYWluZGVyICovXG4mIzQzO1x0XHRjLVx1MDAzZWNvbGxhcHNlKFwmIzM0O0NvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgIHAsIDEsIG9wcywgdHJ1ZSk7XG4mIzQzO1x0XHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGRlYWQwMDAwKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0aWYgKGkgPT0gbilcbiYjNDM7XHRcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGZhaWwoXCYjMzQ7RmFpbDogY2hpbGQgY29udGVudFwmIzM0Oyk7XG4mIzQzO1x0XHQvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlLiAqL1xuJiM0MztcdFx0aWYgKGV4aXRfc3RhdHVzICE9IEtTRlRfRkFJTClcbiYjNDM7XHRcdFx0ZXhpdF9zdGF0dXMgPSBjb2xsYXBzZV9zdGF0dXM7XG4mIzQzO1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRcdF9leGl0KGV4aXRfc3RhdHVzKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEhhbW1lciB0aGUgcGFyZW50JiMzOTtzIG93biB3cml0ZXMgb3ZlciB0aGUgc2hhcmVkIHByZWZpeC4gKi9cbiYjNDM7XHRmb3IgKGludCBpdCA9IDA7IGl0IFx1MDAzYyAyMDAwMDA7IGl0JiM0MzsmIzQzOylcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRpcFtpICogc3RyaWRlXSA9IGkgJiM0MzsgMHhiZWVmMDAwMDtcbiYjNDM7XG4mIzQzO1x0d2FpdChcdTAwMjZ3c3RhdHVzKTtcbiYjNDM7XHQvKiBBIGNoaWxkIHRoYXQgZGllZCByZWFkaW5nIHRoZSByYWNpbmcgcGFnZXMgaXMgYSBmYWlsdXJlLCBub3QgYSB6ZXJvLiAqL1xuJiM0MztcdGNoaWxkX3N0YXR1cyA9IFdJRkVYSVRFRCh3c3RhdHVzKSA/IFdFWElUU1RBVFVTKHdzdGF0dXMpIDogS1NGVF9GQUlMO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDaGVjayB0aGUgcGFyZW50IHNlZXMgb25seSBpdHMgb3duIHdyaXRlcy4uLlwmIzM0Oyk7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGJlZWYwMDAwKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRpZiAoaSA9PSBuKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsOiBwYXJlbnQgY29udGVudFwmIzM0Oyk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0LyogU2FtZSBhZ2Fpbjogb3VyIG93biBjaGVjayBtdXN0IG5vdCBidXJ5IHRoZSBjaGlsZCYjMzk7cyB2ZXJkaWN0LiAqL1xuJiM0MztcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXG4mIzQzO1x0XHRleGl0X3N0YXR1cyA9IGNoaWxkX3N0YXR1cztcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuQEAgLTEyMDksNiAmIzQzOzEzMjEsMjE5IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4gfVxuIFxuJiM0MzsvKiBTbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIHdpbGwgY29uc2lkZXIgZm9yIG1USFAgY29sbGFwc2UuICovXG4mIzQzOyNkZWZpbmUgTUlOX01USFBfT1JERVIgMlxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBmb3IgdGhlIG10aHBfa2h1Z2VwYWdlZCBjb250ZXh0LiAgV2hhdFxuJiM0MzsgKiB0aGV5IGFkZCBvdmVyIHRoZSBnZW5lcmljIGNhc2VzIHJ1biB1bmRlciB0aGF0IGNvbnRleHQgaXMgcGVyLXdpbmRvd1xuJiM0MzsgKiBkZXRlY3Rpb246IHdoaWNoIGFsaWduZWQgd2luZG93IGNvbGxhcHNlZCwgYW5kIHdoaWNoIG9mIGl0cyBuZWlnaGJvdXJzIGRpZFxuJiM0MzsgKiBub3QuICBjaGVja19odWdlKCkgYW5zd2VycyBob3cgbWFueSBmb2xpb3Mgb2YgdGhlIG9yZGVyIHRoZSByYW5nZSBob2xkcyxcbiYjNDM7ICogd2hpY2ggY2Fubm90IHRlbGwgb25lIHdpbmRvdyBmcm9tIGFub3RoZXIuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgYW5kIHRoZSB0YXJnZXQgb3JkZXIgaXMgb25seVxuJiM0MzsgKiBlbmFibGVkIGZvciBtYWR2aXNlLCBzbyB0aGUgc291cmNlcyBhcmUgYWx3YXlzIG9yZGVyIDAgYW5kIHRoZSBjb2xsYXBzZVxuJiM0MzsgKiBwcm9kdWN0IGNhbiBvbmx5IGhhdmUgY29tZSBmcm9tIGtodWdlcGFnZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgc2l6ZV90IG10aHBfd2luZG93X3NpemUodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcHNlX29yZGVyO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHRhcmdldCBvcmRlciwgZm9yIG1hZHZpc2Ugb25seSwgYW5kIG5vdGhpbmcgZWxzZSBlbmFibGVkOiB0aGVcbiYjNDM7XHQgKiBjYXNlcyBmYXVsdCB0aGVpciByZWdpb24gYmVmb3JlIE1BRFZfSFVHRVBBR0UsIHNvIHRoZSBzb3VyY2VzIGFyZVxuJiM0MztcdCAqIG9yZGVyIDAgd2hhdGV2ZXIgLXMgYXNrZWQgdGhlIGZhdWx0IHBhdGggZm9yLiAgVGhhdCBtYXR0ZXJzIGZvciB0aGVcbiYjNDM7XHQgKiBjYXNlcyBidWlsdCBhcm91bmQgYSBob2xlIC0tIGEgbGFyZ2Ugc291cmNlIGZvbGlvIHdvdWxkIGZpbGwgaXQgaW5cbiYjNDM7XHQgKiBhbmQgdGhlIHdpbmRvdyB3b3VsZCBjb2xsYXBzZSBhZnRlciBhbGwuXG4mIzQzO1x0ICogY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcyBlbmFibGVzIHRoZSBzb3VyY2Ugb3JkZXIgaXQgd2FudHMgb25cbiYjNDM7XHQgKiB0b3Agb2YgdGhpcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0c2V0dGluZ3MuaHVnZXBhZ2VzW2NvbGxhcHNlX29yZGVyXS5lbmFibGVkID0gVEhQX01BRFZJU0U7XG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCB3aW5kb3dfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBsZW4sIGNvbGxhcHNlX29yZGVyLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBObyBhbGlnbmVkIHdpbmRvdyBpbiBbcCwgcCAmIzQzOyBsZW4pIGlzIGJhY2tlZCBhdCB0aGUgdGFyZ2V0IG9yZGVyLiAqL1xuJiM0MztzdGF0aWMgYm9vbCB3aW5kb3dfbm90X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcbiYjNDM7XHRjaGFyICphZGRyID0gcDtcbiYjNDM7XG4mIzQzO1x0Zm9yICg7IGxlbiBcdTAwM2U9IHdpbmRvdzsgYWRkciAmIzQzOz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7XG4mIzQzO1x0XHRpZiAod2luZG93X2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHQvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xuJiM0MztcdHJldHVybiBraHVnZXBhZ2VkX2Z1bGxfcGFzcygzMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4mIzQzO1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xuJiM0MztcbiYjNDM7XHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4mIzQzO1x0b3BzLVx1MDAzZWZhdWx0KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XG4mIzQzO1x0aWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIG9uZSBmdWxseSBwb3B1bGF0ZWQgd2luZG93Li4uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwLCB3aW5kb3cpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgJiM0MzsgMiAqIHdpbmRvdyxcbiYjNDM7XHRcdFx0XHQgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiYjNDM7XHRcdFx0XHRcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xuJiM0MztcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb2xsYXBzZSB3aW5kb3cgd2l0aCBzaW5nbGUgUFRFIGVudHJ5IHByZXNlbnQuLi5cJiMzNDspO1xuJiM0MztcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuJiM0MztcdFx0ZmFpbChcJiMzNDtUaW1lb3V0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIG10aHBfd2luZG93X3NpemUoKSkpXG4mIzQzO1x0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRmYWlsKFwmIzM0O0ZhaWxcJiMzNDspO1xuJiM0MztcbiYjNDM7XHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4mIzQzO1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcbiYjNDM7XHR2b2lkICpwO1xuJiM0MztcbiYjNDM7XHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4mIzQzO1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbiYjNDM7XHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29sbGFwc2UgZnVsbCB3aW5kb3csIG5vdCB0aGUgb25lIG1pc3NpbmcgYSBwYWdlLi4uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCB3aW5kb3cpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgJiM0Mzsgd2luZG93LCB3aW5kb3cpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4mIzQzO1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbiYjNDM7e1xuJiM0MztcdGludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSO1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0LyogU291cmNlcyBtdXN0IGJlIGEgc3VwcG9ydGVkIG1USFAgb3JkZXIgc3RyaWN0bHkgYmVsb3cgdGhlIHRhcmdldC4gKi9cbiYjNDM7XHRpZiAoc291cmNlX29yZGVyIFx1MDAzZT0gY29sbGFwc2Vfb3JkZXIgfHxcbiYjNDM7XHQgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBzb3VyY2Vfb3JkZXIpKSkge1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwmIzM0OyVzOiBubyBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0LyogRmF1bHQgdGhlIHdob2xlIHJlZ2lvbiBhcyBvcmRlci1Ac291cmNlX29yZGVyIGZvbGlvcy4gKi9cbiYjNDM7XHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdHNldHRpbmdzLmh1Z2VwYWdlc1tzb3VyY2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4mIzQzO1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIG9yZGVyIGlzIGVuYWJsZWQgYW5kIHN1cHBvcnRlZCwgYnV0IHRoZSBhbGxvY2F0b3IgY2FuIHN0aWxsIGZhbGxcbiYjNDM7XHQgKiBiYWNrIHVuZGVyIGZyYWdtZW50YXRpb24uICBUaGF0IGxlYXZlcyBub3RoaW5nIHRvIGNvbGxhcHNlIGZyb20sXG4mIzQzO1x0ICogd2hpY2ggaXMgdGhlIG1hY2hpbmUmIzM5O3MgYW5zd2VyIHJhdGhlciB0aGFuIGEgcmVhc29uIHRvIGVuZCB0aGUgcnVuLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxuJiM0MztcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Tm8gb3JkZXItJWQgc291cmNlcyB0byBjb2xsYXBzZS4uLlwmIzM0Oywgc291cmNlX29yZGVyKTtcbiYjNDM7XHRcdHNraXAoXCYjMzQ7U2tpcFwmIzM0Oyk7XG4mIzQzO1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4mIzQzO1x0XHRmYWlsKFwmIzM0O1RpbWVvdXRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7XFxuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gXHUwMDNjdGVzdCB0eXBlXHUwMDNlIFtkaXJdXFxuXFxuXCYjMzQ7KTtcbkBAIC0xMjI2LDExICYjNDM7MTU1MSwxNSBAQCBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXG5cJiMzNDspO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQtYzogY29sbGFwc2Ugb3JkZXIgZm9yIG1USFAgY29sbGFwc2UsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgRGVmYXVsdHMgdG8gZXZlcnkgc3VwcG9ydGVkIG9yZGVyIGJlbG93IHRoZSBQTUQuXFxuXCYjMzQ7KTtcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcdFwmIzM0O1xcdFxcdCAgICBXaXRoIC1zLCAtcyBuYW1lcyB0aGUgbVRIUCBzb3VyY2Ugb3JkZXIgZm9yIHRoZVxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgbWl4ZWQtc291cmNlIGNhc2UgKHNvdXJjZSBvcmRlciBiZWxvdyB0aGUgdGFyZ2V0KS5cXG5cJiMzNDspO1xuIFx0ZXhpdCgxKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4mIzQzO1x0Ym9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlO1xuIFx0aW50IG9wdDtcbiBcdGNoYXIgKmJ1ZjtcbiBcdGNvbnN0IGNoYXIgKnRva2VuO1xuQEAgLTEyNDIsNiAmIzQzOzE1NzEsNyBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7YyYjMzk7OlxuIFx0XHRcdGNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpO1xuJiM0MztcdFx0XHRjb2xsYXBzZV9vcmRlcl9naXZlbiA9IHRydWU7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtoJiMzOTs6XG4gXHRcdGRlZmF1bHQ6XG5AQCAtMTI0OSwxMiAmIzQzOzE1NzksMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0fVxuIFx0fVxuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogQm90aCBvcmRlcnMgZW5kIHVwIGFzIGFycmF5IGluZGljZXMgYW5kIHNoaWZ0IGNvdW50cywgc28gbmVpdGhlclxuJiM0MztcdCAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChhbm9uX29yZGVyIFx1MDAzYyAwIHx8IGFub25fb3JkZXIgXHUwMDNlIGhwYWdlX3BtZF9vcmRlcilcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDstcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgIGhwYWdlX3BtZF9vcmRlciwgYW5vbl9vcmRlcik7XG4mIzQzO1x0aWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0Oy1jIHRha2VzIGFuIG9yZGVyIGluIDEuLiVkLCBub3QgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgaHBhZ2VfcG1kX29yZGVyLCBjb2xsYXBzZV9vcmRlcik7XG4mIzQzO1xuIFx0YXJndiAmIzQzOz0gb3B0aW5kO1xuIFx0YXJnYyAtPSBvcHRpbmQ7XG4gXG4gXHRpZiAoYXJnYyA9PSAwKSB7XG4tXHRcdC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovXG4mIzQzO1x0XHQvKiBFdmVyeXRoaW5nIHRoYXQgbmVlZHMgbm8gYXJndW1lbnQgb2YgaXRzIG93bjogYW5vbiwgZXZlcnkgY29udGV4dCAqL1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4mIzQzO1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0cmV0dXJuO1xuQEAgLTEyNjUsMTMgJiM0MzsxNjA4LDE5IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXG4gXHRpZiAoIXN0cmNtcCh0b2tlbiwgXCYjMzQ7YWxsXCYjMzQ7KSkge1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4mIzQzO1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFwmIzM0O2FsbFwmIzM0OyBzd2VlcHMgdGhlIG1USFAgY29udGV4dCBpbiwgYnV0IGl0IG9ubHkgaGFzIGFub25cbiYjNDM7XHRcdCAqIGNhc2VzOiBzdGVwIGl0IGFzaWRlIGZvciB0aGUgb3RoZXIgbWVtX3R5cGVzIHJhdGhlciB0aGFuXG4mIzQzO1x0XHQgKiByZWZ1c2luZyB0aGUgd2hvbGUgcnVuLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRtdGhwX2NvbnRleHRfaW1wbGllZCA9IHRydWU7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O2todWdlcGFnZWRcJiMzNDspKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCYjMzQ7bXRocF9raHVnZXBhZ2VkXCYjMzQ7KSkge1xuIFx0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuLVx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKVxuLVx0XHRcdHVzYWdlKCk7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O21hZHZpc2VcJiMzNDspKSB7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdH0gZWxzZSB7XG5AQCAtMTI4NywyMCAmIzQzOzE2MzYsMjAgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICBcdTAwMjZfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0c2htZW1fb3BzID0gXHUwMDI2X19zaG1lbV9vcHM7XG4tXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcbi1cdFx0XHR1c2FnZSgpO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7YW5vblwmIzM0OykpIHtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7ZmlsZVwmIzM0OykpIHtcbiBcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gIFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7c2htZW1cJiMzNDspKSB7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIHtcbiBcdFx0dXNhZ2UoKTtcbiBcdH1cbkBAIC0xMzIyLDkgJiM0MzsxNjcxLDE0IEBAIHN0cnVjdCB0ZXN0X2Nhc2Uge1xuIFx0c3RydWN0IG1lbV9vcHMgKm9wcztcbiBcdGNvbnN0IGNoYXIgKmRlc2M7XG4gXHR0ZXN0X2ZuIGZuO1xuJiM0MztcdGludCBvcmRlcjtcdFx0LyogbVRIUCBjb250ZXh0czogdGhlIGNvbGxhcHNlIG9yZGVyICovXG4gfTtcbiBcbi0jZGVmaW5lIE1BWF9URVNUX0NBU0VTIDY0XG4mIzQzOy8qXG4mIzQzOyAqIEVub3VnaCBmb3IgZXZlcnkgY2FzZSBhdCBldmVyeSBvcmRlciB0aGUga2VybmVsIG9mZmVyczogdGhlIG1USFAgY29udGV4dFxuJiM0MzsgKiBydW5zIGl0cyBjYXNlcyBvbmNlIHBlciBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2XG4gc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107XG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xuIFxuQEAgLTEzMzcsNiAmIzQzOzE2OTEsNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXHRcdFx0Lm9wc1x0PSBvLFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5kZXNjXHQ9ICN0LFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5mblx0PSB0LFx0XHRcdFx0XHRcXFxuJiM0MztcdFx0XHQub3JkZXJcdD0gY29sbGFwc2Vfb3JkZXIsXHRcdFx0XFxcbiBcdFx0fTtcdFx0XHRcdFx0XHRcdFxcXG4gXHR9XHRcdFx0XHRcdFx0XHRcdFxcXG4gXHR9IHdoaWxlICgwKVxuQEAgLTEzNzcsOCAmIzQzOzE3MzIsODMgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFxuIFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xuIFxuJiM0MztcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbikge1xuJiM0MztcdFx0XHQvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi9cbiYjNDM7XHRcdFx0aWYgKGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDstYyB0YWtlcyBhbiBvcmRlciBiZWxvdyB0aGUgUE1EIG9yZGVyICglZClcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHRcdCAgIGhwYWdlX3BtZF9vcmRlcik7XG4mIzQzO1x0XHRcdGlmICghKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgY29sbGFwc2Vfb3JkZXIpKSlcbiYjNDM7XHRcdFx0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgY29sbGFwc2Vfb3JkZXIpO1xuJiM0MztcdFx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSBhbm9uX29yZGVyKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0Oy1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGNvbGxhcHNlX29yZGVyLCBhbm9uX29yZGVyKTtcbiYjNDM7XHRcdFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gY29sbGFwc2Vfb3JkZXI7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBPdGhlcndpc2UgZXZlcnkgb3JkZXIgYSBjb2xsYXBzZSBjb3VsZCBwcm9kdWNlLiAgLXNcbiYjNDM7XHRcdFx0ICogbWFrZXMgdGhlIGZhdWx0IHBhdGggaGFuZCBvdXQgZm9saW9zIG9mIHRoYXQgb3JkZXIsXG4mIzQzO1x0XHRcdCAqIHNvIGEgdGFyZ2V0IGF0IG9yIGJlbG93IGl0IGhhcyBub3RoaW5nIHRvIGNvbGxhcHNlOlxuJiM0MztcdFx0XHQgKiB0aGUgc291cmNlcyBhcmUgYWxyZWFkeSB0aGUgc2l6ZSBiZWluZyBhc2tlZCBmb3IuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRpbnQgZmlyc3QgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciAmIzQzOyAxIDogTUlOX01USFBfT1JERVI7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoZmlyc3QgXHUwMDNjIE1JTl9NVEhQX09SREVSKVxuJiM0MztcdFx0XHRcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XG4mIzQzO1x0XHRcdGZvciAoaW50IGkgPSBmaXJzdDsgaSBcdTAwM2MgaHBhZ2VfcG1kX29yZGVyOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRcdGlmIChvcmRlcnMgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuJiM0MztcdFx0XHRcdFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gaTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcbiYjNDM7XHRcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDttVEhQIGNhc2VzIHNraXBwZWQ6IG5vIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2VcXG5cJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XG4mIzQzO1x0XHRwYWdlbWFwX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCYjMzQ7KTtcbiYjNDM7XHRcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7b3BlbigvcHJvYy9rcGFnZWZsYWdzKVwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiBcdHNldGJ1ZihzdGRvdXQsIE5VTEwpO1xuIFxuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHBhZ2UgY2FjaGUgY2FwcyBmb2xpbyBvcmRlciBhdCBNQVhfUEFHRUNBQ0hFX09SREVSLCB3aGljaFxuJiM0MztcdCAqIHhhc19zcGxpdF9hbGxvYygpIHB1dHMgYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy5cbiYjNDM7XHQgKiBBIFBNRC1zaXplZCBwYWdlIGNhY2hlIGZvbGlvIGlzIHRoZW4gaW1wb3NzaWJsZSwgc28gdGhlIGtlcm5lbFxuJiM0MztcdCAqIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5IGRlc2lnbiBhbmQgdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LlxuJiM0MztcdCAqXG4mIzQzO1x0ICogVGhlIGNhcCBpcyBvbmUgZ2xvYmFsLCBzbyBpdCBydWxlcyBvdXQgZXZlcnkgZmlsZSBtYXBwaW5nLCBub3QganVzdFxuJiM0MztcdCAqIHNobWVtOiBzaG1lbV9odWdlX2dsb2JhbF9lbmFibGVkKCkgZHJvcHMgdGhlIFBNRCBvcmRlciBmcm9tIHdoYXQgaXRcbiYjNDM7XHQgKiBhbGxvd3MsIGFuZCBmaWxlX3RocF9lbmFibGVkKCkgcmVmdXNlcyBhIHJlZ3VsYXIgZmlsZSB3aG9zZSBtYXBwaW5nXG4mIzQzO1x0ICogY2Fubm90IGhvbGQgYSBQTUQgZm9saW8uXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBUaGUgcGVyLW9yZGVyIHNobWVtX2VuYWJsZWQgY29udHJvbCBiZWxvdyBpcyB3aGF0IG1ha2VzIHRoZSBjYXBcbiYjNDM7XHQgKiByZWFkYWJsZTogaXQgaXMgY3JlYXRlZCBmb3IgdGhlIG9yZGVycyBpbiBUSFBfT1JERVJTX0FMTF9GSUxFX0RFRkFVTFQsXG4mIzQzO1x0ICogd2hpY2ggaXMgdGhlIGNhcCBhbmQgbm90aGluZyBlbHNlLCBzbyB3aGV0aGVyIHRoZSBQTUQgb3JkZXIgaGFzIG9uZVxuJiM0MztcdCAqIGFuc3dlcnMgZm9yIGEgcmVndWxhciBmaWxlIGFzIG11Y2ggYXMgZm9yIHNobWVtLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICghKHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGhwYWdlX3BtZF9vcmRlcikpKSB7XG4mIzQzO1x0XHRpZiAoc2htZW1fb3BzKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O25vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHNobWVtX29wcyA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAocmVhZF9vbmx5X2ZpbGVfb3BzKSB7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O25vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBmaWxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gTlVMTDtcbiYjNDM7XHRcdFx0cmVhZF93cml0ZV9maWxlX3JlYWRfb3BzID0gTlVMTDtcbiYjNDM7XHRcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoIWFub25fb3BzIFx1MDAyNlx1MDAyNiAhc2htZW1fb3BzIFx1MDAyNlx1MDAyNiAhcmVhZF9vbmx5X2ZpbGVfb3BzKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtOb3RoaW5nIGxlZnQgdG8gY29sbGFwc2UgaW50b1xcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaHBhZ2VfcG1kX25yIC0gMTtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyO1xuQEAgLTEzOTYsNyAmIzQzOzE4MjYsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTtcbi1cdFRFU1QoY29sbGFwc2VfZnVsbCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgbnJfY29sbGFwc2Vfb3JkZXJzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Y29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0fVxuJiM0MztcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTE0MDQsMTAgJiM0MzsxODQ0LDggQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7XG4gXG4gXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbi1cdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbi1cdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXG4gXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG5AQCAtMTQ2Myw2ICYjNDM7MTkwMSw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbiYjNDM7XHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTQ3OCw3ICYjNDM7MTkxOSwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgbnJfdGVzdF9jYXNlczsgaSYjNDM7JiM0MzspIHtcbiBcdFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFx1MDAyNnRlc3RfY2FzZXNbaV07XG4gXG4tXHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1xcbiMgUnVuIHRlc3Q6ICVzICglczolcylcXG5cJiMzNDssIHQtXHUwMDNlZGVzYywgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4mIzQzO1x0XHRpZiAodC1cdTAwM2VjdHggPT0gXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuJiM0MztcdFx0XHRjb2xsYXBzZV9vcmRlciA9IHQtXHUwMDNlb3JkZXI7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1xcbiMgUnVuIHRlc3Q6ICVzICglczolcywgb3JkZXIgJWQpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgICB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHQtXHUwMDNlb3JkZXIpO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7XFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwmIzM0OywgdC1cdTAwM2VkZXNjLFxuJiM0MztcdFx0XHRcdCAgICAgICB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lKTtcbiYjNDM7XHRcdH1cbiBcdFx0dC1cdTAwM2Vmbih0LVx1MDAzZWN0eCwgdC1cdTAwM2VvcHMpO1xuIFx0fVxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zNjAxYzAzMGQ0M2U1XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xuQEAgLTAsMCAmIzQzOzEsNjEwIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIGtodWdlcGFnZWQgcmFjZSBoYXJuZXNzLlxuJiM0MzsgKlxuJiM0MzsgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGluc1xuJiM0MzsgKiAoZ3VwX3Rlc3QpLCBmb3JrLCBtcmVtYXAgYW5kIE1BRFZfRE9OVE5FRUQgb3ZlciB0aGUgc2FtZSByYW5nZXMsIGluXG4mIzQzOyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6XG4mIzQzOyAqXG4mIzQzOyAqICAgc3RlcHBlZFx0a2h1Z2VwYWdlZCwgb25lIGZ1bGwgcGFzcyBhdCBhIHRpbWUgdGhyb3VnaFxuJiM0MzsgKlx0XHRraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLCBzbyBhIHN0ZXAgY292ZXJzIGEga25vd24gZXh0ZW50O1xuJiM0MzsgKiAgIGZyZWVcdGtodWdlcGFnZWQgbGVmdCB0byBydW4gKHNjYW5fc2xlZXBfbWlsbGlzZWNzPTApLCBmb3Igc29haztcbiYjNDM7ICogICBtYWR2aXNlXHRNQURWX0NPTExBUFNFIGluIGEgbG9vcC5cbiYjNDM7ICpcbiYjNDM7ICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuICBPY2N1cGFuY3kgcnVucyBhdCBib3RoIGVuZHNcbiYjNDM7ICogb2Ygd2hhdCBtVEhQIGNvbGxhcHNlIHN1cHBvcnRzOiBtYXhfcHRlc19ub25lIDAsIHdoZXJlIGEgd2luZG93IG11c3QgYmVcbiYjNDM7ICogZnVsbHkgcG9wdWxhdGVkLCBhbmQgSFBBR0VfUE1EX05SIC0gMSwgd2hlcmUgYSB3aW5kb3cgZnVsbCBvZiBob2xlc1xuJiM0MzsgKiBjb2xsYXBzZXMgdG9vLiAgVGhlIGhvbGVzIGFyZSBub3QgY29waWVkIGZyb20gYW55d2hlcmUgLS0gdGhleSBhcmVcbiYjNDM7ICogemVyby1maWxsZWQsIGFuZCByZS1jaGVja2VkIHVuZGVyIHRoZSBwYWdlIHRhYmxlIGxvY2sgYXQgaW5zdGFsbCB0aW1lIGluXG4mIzQzOyAqIGNhc2UgYSByYWNpbmcgZmF1bHQgZ290IHRoZXJlIGZpcnN0LlxuJiM0MzsgKlxuJiM0MzsgKiAtcCBhZGRzIG1lbW9yeSBwcmVzc3VyZSB0byBhbnkgb2YgdGhlIGFib3ZlOiBNQURWX1BBR0VPVVQgY3ljbGluZ1xuJiM0MzsgKiBvbiBhIGRlZGljYXRlZCBuZWlnaGJvciByZWdpb24gKHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuOyBza2lwcGVkXG4mIzQzOyAqIHdpdGggYSBub3RlIHdoZW4gdGhlIGhvc3QgaGFzIG5vIHN3YXApIGFuZCBhIGNvbXBhY3RfbWVtb3J5IHRyaWdnZXJcbiYjNDM7ICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UmIzM5O3MgZnJlZXplXG4mIzQzOyAqIHdpdGggcmVmY291bnQgZWxldmF0aW9uIGFuZCBtaWdyYXRpb24gZW50cmllcyBvZiBpdHMgb3duKS5cbiYjNDM7ICpcbiYjNDM7ICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yXG4mIzQzOyAqIHplcm8gKE1BRFZfRE9OVE5FRUQpLCBuZXZlciBhbnl0aGluZyBlbHNlLiAgVGhlIGZhdWx0ZXJzIGFuZCB0aGUgZm9ya1xuJiM0MzsgKiBjaGlsZHJlbiBjaGVjayB0aGF0IGNvbnRpbnVvdXNseSwgYSBmaW5hbCBzd2VlcCBjaGVja3MgaXQgb25jZSBtb3JlLCBwbHVzXG4mIzQzOyAqIHdoYXRldmVyIERFQlVHX1ZNIC8gcGFnZV90YWJsZV9jaGVjayAvIEtBU0FOIC8gbG9ja2RlcCByZXBvcnQgaW5cbiYjNDM7ICogZG1lc2csIHdoaWNoIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaW5zcGVjdC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc2VsZnRlc3QuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bV91dGlsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDsuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJBU0VfQUREUlx0KCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2hhcmVkIHBsYXlncm91bmQgZm9yIGZhdWx0cy9waW5zL2ZvcmsvZG9udG5lZWQ6IHNldmVyYWwgUE1ELXNpemVkXG4mIzQzOyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZVxuJiM0MzsgKiBtcmVtYXAgdGhyZWFkLiBNb3JlIGFyZWFzIG1lYW5zIG1vcmUgaW5kZXBlbmRlbnQgcmVnaW9ucyBjb2xsYXBzaW5nXG4mIzQzOyAqIGF0IG9uY2U7IHRoZSBkZWZhdWx0IHN1aXRzIGEgbm9ybWFsIG1hY2hpbmUuIE9uIGEgbWVtb3J5LWNvbnN0cmFpbmVkXG4mIzQzOyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZVxuJiM0MzsgKiBkZWZhdWx0IHBsYXlncm91bmQgbXVsdGktZ2lnYWJ5dGUgLS0gcGFzcyAtYSB0byBzaHJpbmsgaXQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4mIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzO1xuJiM0MztzdGF0aWMgaW50IG5yX2FyZWFzO1xuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiYjNDM7c3RhdGljIGNoYXIgKnJlZ2lvbjtcdFx0LyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqL1xuJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX2FyZWE7XHQvKiByZWdpb24gJiM0MzsgTlJfU0hBUkVEX0FSRUFTIGFyZWFzICovXG4mIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xuJiM0MztzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1x0LyogLXA6IGRlZGljYXRlZCBwcmVzc3VyZSByZWdpb24gKi9cbiYjNDM7c3RhdGljIHNpemVfdCBwYWdlb3V0X3NpemU7XG4mIzQzO3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBjb3JydXB0ZWQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4mIzQzO1xuJiM0MztcdHJldHVybiB2YWwgPyB2YWwgOiAxO1x0LyogbmV2ZXIgY29sbGlkZXMgd2l0aCB0aGUgemVyby1maWxsICovXG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFplcm8gbWVhbnMgbmV2ZXIgd3JpdHRlbjsgYW55dGhpbmcgZWxzZSBtdXN0IGJlIHRoaXMgcGFnZSYjMzk7cyBwYXR0ZXJuICovXG4mIzQzO3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbClcbiYjNDM7e1xuJiM0MztcdCp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gKnZhbCBcdTAwMjZcdTAwMjYgKnZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHZhbDtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VfaXNfY29ycnVwdChwYWdlX2lkeCwgXHUwMDI2dmFsKSkge1xuJiM0MztcdFx0Y29ycnVwdGVkID0gMTtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUGFnZXMgbGVmdCBmcm9tIEBwYWdlX2lkeCwgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJiMzOTtzIGFyZWEgKi9cbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcm9vbV9mcm9tKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGxvbmcgd2FudClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XG4mIzQzO1xuJiM0MztcdHJldHVybiB3YW50IFx1MDAzYyBsZWZ0ID8gd2FudCA6IGxlZnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHJhbmRfcihcdTAwMjZzZWVkKSBcdTAwMjYgMSlcbiYjNDM7XHRcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKSA9XG4mIzQzO1x0XHRcdFx0cGF0dGVybihwYWdlX2lkeCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGNoZWNrX3BhZ2UocGFnZV9pZHgpO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIG5yID0gMVVMIFx1MDAzY1x1MDAzYyAocmFuZF9yKFx1MDAyNnNlZWQpICUgNik7XHQvKiAxLi4zMiBwYWdlcyAqL1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBPbmNlIGluIGEgd2hpbGUgemFwIGEgd2hvbGUgUE1ELWFsaWduZWQgYXJlYTogb25seSBhIHphcFxuJiM0MztcdFx0ICogc3Bhbm5pbmcgdGhlIGZ1bGwgdGFibGUgdHJpZ2dlcnMgdGhlIGVtcHR5LXRhYmxlIHJlY2xhaW1cbiYjNDM7XHRcdCAqIChDT05GSUdfUFRfUkVDTEFJTSksIHdoaWNoIGNhbiBmcmVlIHRoZSB0YWJsZSB1bmRlciBhXG4mIzQzO1x0XHQgKiBjb2xsYXBzZSB0aGF0IGlzIG1pZHdheSB0aHJvdWdoIGl0LiAgU3ViLXRhYmxlIHphcHMgbmV2ZXJcbiYjNDM7XHRcdCAqIHJlYWNoIHRoYXQgcGF0aC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKCEocmFuZF9yKFx1MDAyNnNlZWQpICUgNjQpKSB7XG4mIzQzO1x0XHRcdHVuc2lnbmVkIGxvbmcgYXJlYSA9IHBhZ2VfaWR4IC9cbiYjNDM7XHRcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdFx0XHRtYWR2aXNlKHJlZ2lvbiAmIzQzOyBhcmVhICogaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0bWFkdmlzZShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUsXG4mIzQzO1x0XHRcdFx0cm9vbV9mcm9tKHBhZ2VfaWR4LCBucikgKiBwYWdlX3NpemUsXG4mIzQzO1x0XHRcdFx0TUFEVl9ET05UTkVFRCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgNTAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0c3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9O1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbiYjNDM7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIG5yID0gcm9vbV9mcm9tKHBhZ2VfaWR4LCAxNik7XG4mIzQzO1xuJiM0MztcdFx0Z3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcbiYjNDM7XHRcdGd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7XG4mIzQzO1x0XHRndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjtcbiYjNDM7XHRcdGd1cC5ndXBfZmxhZ3MgPSAxO1x0LyogRk9MTF9XUklURSAqL1xuJiM0MztcdFx0LyogUmFjaW5nIE1BRFZfRE9OVE5FRUQgbWFrZXMgdHJhbnNpZW50IGZhaWx1cmVzIGV4cGVjdGVkLiAqL1xuJiM0MztcdFx0aW9jdGwoZ3VwX2ZkLCBQSU5fRkFTVF9CRU5DSE1BUkssIFx1MDAyNmd1cCk7XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICpmb3JrZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChwaWQgPT0gMCkge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgdmFsO1xuJiM0MztcdFx0XHRpbnQgYmFkID0gMDtcbiYjNDM7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIE5vIHN0ZGlvIGluIHRoZSBjaGlsZDogYSB0aHJlYWQgbWF5IGhhdmUgaGVsZFxuJiM0MztcdFx0XHQgKiBzdGRvdXQmIzM5O3MgbG9jayB3aGVuIHdlIGZvcmtlZCwgYW5kIHByaW50aW5nIHVuZGVyIGFuXG4mIzQzO1x0XHRcdCAqIGluaGVyaXRlZCBsb2NrIGhhbmdzLiAgVGhlIHBhcmVudCByZXBvcnRzIHdoYXQgdGhlXG4mIzQzO1x0XHRcdCAqIGV4aXQgc3RhdHVzIHNheXMuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgMTY7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRcdGJhZCB8PSBwYWdlX2lzX2NvcnJ1cHQocmFuZF9wYWdlKFx1MDAyNnNlZWQpLCBcdTAwMjZ2YWwpO1xuJiM0MztcdFx0XHRfZXhpdChiYWQpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHBpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRpbnQgd3N0YXR1cztcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh3YWl0cGlkKHBpZCwgXHUwMDI2d3N0YXR1cywgMCkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O3dhaXRwaWQoKVwmIzM0Oyk7XG4mIzQzO1x0XHRcdC8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28sIG5vdCBqdXN0IGl0cyBleGl0IGNvZGUuICovXG4mIzQzO1x0XHRcdGlmICghV0lGRVhJVEVEKHdzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHdzdGF0dXMpKVxuJiM0MztcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdFx0cCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpO1xuJiM0MztcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21yZW1hcCgpIGF3YXlcJiMzNDspO1xuJiM0MztcdFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIDg7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRtcmVtYXBfc2NyYXRjaFsocmFuZF9yKFx1MDAyNnNlZWQpICVcbiYjNDM7XHRcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxO1xuJiM0MztcdFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpO1xuJiM0MztcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21yZW1hcCgpIGJhY2tcJiMzNDspO1xuJiM0MztcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMDApO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogLXA6IHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XG4mIzQzOyAqIGNoZWNrIGlzIGV4YWN0OiBhIHBhZ2Ugb3V0IGFuZCBiYWNrIHRocm91Z2ggc3dhcCBtdXN0IHByZXNlcnZlIHRoZVxuJiM0MzsgKiBwYXR0ZXJuLCBhbmQgbm90aGluZyBlbHNlIGV2ZXIgd3JpdGVzIGhlcmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yID0gcGFnZW91dF9zaXplIC8gcGFnZV9zaXplO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnI7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0Kih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRtYWR2aXNlKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplLCBNQURWX1BBR0VPVVQpO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7XG4mIzQzO1x0XHRcdFx0XHRcdFx0ICAgICBpICogcGFnZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmICh2YWwgIT0gcGF0dGVybihpKSkge1xuJiM0MztcdFx0XHRcdGNvcnJ1cHRlZCA9IDE7XG4mIzQzO1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7UGFnZW91dCBjb3JydXB0aW9uIGF0IHBhZ2UgJWx1OiAlI3ggIT0gJSN4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIC1wOiBjb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIG91dCBmcm9tIHVuZGVyIHVzLiAqL1xuJiM0MztzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcdGludCBmZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5XCYjMzQ7LCBPX1dST05MWSk7XG4mIzQzO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Tm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdGlmICh3cml0ZShmZCwgXCYjMzQ7MVwmIzM0OywgMSkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0dXNsZWVwKDEwMDAwICYjNDM7IHJhbmRfcihcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgbGluZVsyNTZdO1xuJiM0MztcdGludCBsaW5lcyA9IDA7XG4mIzQzO1x0RklMRSAqZnAgPSBmb3BlbihcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxuJiM0MztcdFx0bGluZXMmIzQzOyYjNDM7O1xuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGxpbmVzIFx1MDAzZSAxO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aW1ldmFsIHR2O1xuJiM0MztcbiYjNDM7XHRnZXR0aW1lb2ZkYXkoXHUwMDI2dHYsIE5VTEwpO1xuJiM0MztcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgJiM0MzsgdHYudHZfdXNlYyAvIDEwMDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcbiYjNDM7XHRcdFwmIzM0O1VzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy16XSBbLXBdIFstYSBhcmVhc11cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdFdpdGhvdXQgLW0sIGV2ZXJ5IG1vZGUgcnVucyBpbiB0dXJuLlxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdEJvdGggb2NjdXBhbmN5IGxpbWl0cyBydW4gdW5sZXNzIC16IGFza3MgZm9yIGhvbGVzIG9ubHkuXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHQtejogb25seSBtYXhfcHRlc19ub25lID0gSFBBR0VfUE1EX05SIC0gMSAoaG9sZS1oZWF2eSlcXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0O1xcdFJ1bnMgd2l0aCBhbmQgd2l0aG91dCBtZW1vcnkgcHJlc3N1cmUgdW5sZXNzIC1wIGFza3MgZm9yXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHRwcmVzc3VyZSBvbmx5LlxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0LXA6IG9ubHkgd2l0aCB0aGUgcGFnZW91dCBhbmQgY29tcGFjdGlvbiB0aHJlYWRzXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHQtYTogbnVtYmVyIG9mIHNoYXJlZCBQTUQtc2l6ZWQgcGxheWdyb3VuZCBhcmVhcyAoZGVmYXVsdCAzKVxcblwmIzM0Oyk7XG4mIzQzO1x0ZXhpdCgxKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuJiM0Mzt7XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aHJlYWRfbmFtZXNbXSA9IHtcbiYjNDM7XHRcdFwmIzM0O2ZhdWx0ZXJcJiMzNDssIFwmIzM0O2ZhdWx0ZXIyXCYjMzQ7LCBcJiMzNDtkb250bmVlZFwmIzM0OywgXCYjMzQ7cGlubmVyXCYjMzQ7LCBcJiMzNDtmb3JrZXJcJiMzNDssXG4mIzQzO1x0XHRcJiMzNDttcmVtYXBwZXJcJiMzNDssIFwmIzM0O3BhZ2VvdXRcJiMzNDssIFwmIzM0O2NvbXBhY3RvclwmIzM0OyxcbiYjNDM7XHR9O1xuJiM0MztcdHZvaWQgKigqY29uc3QgdGhyZWFkX2Zuc1tdKSh2b2lkICopID0ge1xuJiM0MztcdFx0ZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLFxuJiM0MztcdFx0bXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sXG4mIzQzO1x0fTtcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VvdXRfYml0ID0gMVVMIFx1MDAzY1x1MDAzYyA2LCBjb21wYWN0b3JfYml0ID0gMVVMIFx1MDAzY1x1MDAzYyA3O1xuJiM0MztcdGNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpO1xuJiM0MztcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgXCYjMzQ7c3RlcHBlZFwmIzM0OywgXCYjMzQ7ZnJlZVwmIzM0OywgXCYjMzQ7bWFkdmlzZVwmIzM0OyB9O1xuJiM0MztcdHN0YXRpYyBjb25zdCBpbnQgYWxsX25vbmVzW10gPSB7IDAsIDEgfTtcdC8qIHN0cmljdCwgaG9sZXMgKi9cbiYjNDM7XHRzdGF0aWMgY29uc3QgaW50IGFsbF9wcmVzc1tdID0geyAwLCAxIH07XHQvKiBxdWlldCwgdW5kZXIgcHJlc3N1cmUgKi9cbiYjNDM7XHRjb25zdCBpbnQgKm5vbmVzID0gYWxsX25vbmVzO1xuJiM0MztcdGNvbnN0IGludCAqcHJlc3MgPSBhbGxfcHJlc3M7XG4mIzQzO1x0aW50IG5yX25vbmVzID0gQVJSQVlfU0laRShhbGxfbm9uZXMpO1xuJiM0MztcdGludCBucl9wcmVzcyA9IEFSUkFZX1NJWkUoYWxsX3ByZXNzKTtcbiYjNDM7XHRjb25zdCBjaGFyICpvbmVfbW9kZVsxXTtcbiYjNDM7XHRjb25zdCBjaGFyICogY29uc3QgKm1vZGVzID0gYWxsX21vZGVzO1xuJiM0MztcdGludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTtcbiYjNDM7XHRjb25zdCBjaGFyICptb2RlX2FyZyA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGVuZF9tcztcbiYjNDM7XHRpbnQgZHVyYXRpb25fcyA9IDU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB0aHJlYWRfbWFzayA9IH4wVUw7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBiYXNlX21hc2s7XG4mIzQzO1x0aW50IG5yX2FyZWFzX2FyZyA9IDA7XG4mIzQzO1x0Ym9vbCBob2xlc19vbmx5ID0gZmFsc2U7XG4mIzQzO1x0Ym9vbCBwcmVzc3VyZV9vbmx5ID0gZmFsc2U7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcdGludCBzdGVwcyA9IDA7XG4mIzQzO1x0aW50IG9wdDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXCYjMzQ7YTpkOm06dDp6cGhcJiMzNDspKSAhPSAtMSkge1xuJiM0MztcdFx0c3dpdGNoIChvcHQpIHtcbiYjNDM7XHRcdGNhc2UgJiMzOTthJiMzOTs6XG4mIzQzO1x0XHRcdG5yX2FyZWFzX2FyZyA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7ZCYjMzk7OlxuJiM0MztcdFx0XHRkdXJhdGlvbl9zID0gYXRvaShvcHRhcmcpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTttJiMzOTs6XG4mIzQzO1x0XHRcdG1vZGVfYXJnID0gb3B0YXJnO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTt0JiMzOTs6XG4mIzQzO1x0XHRcdC8qIGRlYnVnOiBiaXRtYXNrIG9mIHJhY2luZyB0aHJlYWRzIHRvIHN0YXJ0ICovXG4mIzQzO1x0XHRcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTt6JiMzOTs6XG4mIzQzO1x0XHRcdGhvbGVzX29ubHkgPSB0cnVlO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtwJiMzOTs6XG4mIzQzO1x0XHRcdHByZXNzdXJlX29ubHkgPSB0cnVlO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHVzYWdlKCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGlmIChob2xlc19vbmx5KSB7XG4mIzQzO1x0XHRub25lcyA9IGFsbF9ub25lcyAmIzQzOyAxO1xuJiM0MztcdFx0bnJfbm9uZXMgPSAxO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHByZXNzdXJlX29ubHkpIHtcbiYjNDM7XHRcdHByZXNzID0gYWxsX3ByZXNzICYjNDM7IDE7XG4mIzQzO1x0XHRucl9wcmVzcyA9IDE7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobW9kZV9hcmcpIHtcbiYjNDM7XHRcdGlmIChzdHJjbXAobW9kZV9hcmcsIFwmIzM0O3N0ZXBwZWRcJiMzNDspIFx1MDAyNlx1MDAyNiBzdHJjbXAobW9kZV9hcmcsIFwmIzM0O2ZyZWVcJiMzNDspIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIHN0cmNtcChtb2RlX2FyZywgXCYjMzQ7bWFkdmlzZVwmIzM0OykpXG4mIzQzO1x0XHRcdHVzYWdlKCk7XG4mIzQzO1x0XHRvbmVfbW9kZVswXSA9IG1vZGVfYXJnO1xuJiM0MztcdFx0bW9kZXMgPSBvbmVfbW9kZTtcbiYjNDM7XHRcdG5yX21vZGVzID0gMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XG4mIzQzO1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuJiM0MztcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0Z3VwX2ZkID0gb3BlbihcJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwmIzM0OywgT19SRFdSKTtcbiYjNDM7XHRpZiAoZ3VwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XG4mIzQzO1x0bnJfYXJlYXMgPSBucl9zaGFyZWRfYXJlYXMgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZFxuJiM0MztcdCAqIE1SRU1BUF9GSVhFRCB1bm1hcHMgd2hhdGV2ZXIgaXMgaW4gdGhlIHdheSB3aXRob3V0IHNheWluZyBzby4gIENsYWltXG4mIzQzO1x0ICogdGhlIGFkZHJlc3MgaGVyZSwgc28gYSBsYXlvdXQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGlzIGFzc3VtcHRpb25cbiYjNDM7XHQgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZVxuJiM0MztcdCAqIHByb2Nlc3MgbWFwcyB0aGlzIGxvdzogdGhyZWFkIHN0YWNrcyBhbmQgbWFsbG9jIGFyZW5hcyBjb21lIGZyb20gdGhlXG4mIzQzO1x0ICogdG9wLWRvd24gbW1hcCBhcmVhLCB3ZWxsIGFib3ZlLlxuJiM0MztcdCAqL1xuJiM0MztcdG1yZW1hcF9zY3JhdGNoID0gKGNoYXIgKilCQVNFX0FERFIgJiM0MzsgMiAqIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XG4mIzQzO1x0aWYgKG1tYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBQUk9UX05PTkUsXG4mIzQzO1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSxcbiYjNDM7XHRcdCAtMSwgMCkgIT0gKHZvaWQgKiltcmVtYXBfc2NyYXRjaClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgbXJlbWFwIHNjcmF0Y2hcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRiYXNlX21hc2sgPSB0aHJlYWRfbWFzaztcbiYjNDM7XHRpZiAoIXN3YXBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZS4gKi9cbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O25vIHN3YXA6IHRoZSBwYWdlb3V0IHRocmVhZCBzdGF5cyBpZGxlXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9zZXRfcGxhbihucl9tb2RlcyAqIG5yX25vbmVzICogbnJfcHJlc3MpO1xuJiM0MztcbiYjNDM7XHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuJiM0MztcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBBIGJhc2UgZW50cnkgZm9yIHRoZSBzdGFjaywgc28gdGhhdCB0aGUgcG9wIGF0IHRoZSBlbmQgb2YgYSBtb2RlXG4mIzQzO1x0ICogYWx3YXlzIGhhcyBzb21ldGhpbmcgdG8gd3JpdGUgYmFjazogdGhwX3BvcF9zZXR0aW5ncygpIG9uIGFuIGVtcHR5XG4mIzQzO1x0ICogc3RhY2sgaGFzIG5vIHNldHRpbmdzIHRvIGFwcGx5IGFuZCBnaXZlcyB1cC5cbiYjNDM7XHQgKi9cbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IHJ1biA9IDA7IHJ1biBcdTAwM2MgbnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzOyBydW4mIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpbnQgcmVtID0gcnVuICUgKG5yX25vbmVzICogbnJfcHJlc3MpO1xuJiM0MztcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9ub25lcyAqIG5yX3ByZXNzKV07XG4mIzQzO1x0XHRib29sIGhvbGVzID0gbm9uZXNbcmVtIC8gbnJfcHJlc3NdO1xuJiM0MztcdFx0Ym9vbCBwcmVzc3VyZSA9IHByZXNzW3JlbSAlIG5yX3ByZXNzXTtcbiYjNDM7XG4mIzQzO1x0XHR0aHJlYWRfbWFzayA9IGJhc2VfbWFzaztcbiYjNDM7XHRcdGlmICghcHJlc3N1cmUpXG4mIzQzO1x0XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpO1xuJiM0MztcdFx0ZWxzZSBpZiAoIXN3YXBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfnBhZ2VvdXRfYml0O1xuJiM0MztcbiYjNDM7XHRcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XHRcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4mIzQzO1x0XHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4mIzQzO1x0XHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XG4mIzQzO1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4mIzQzO1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID1cbiYjNDM7XHRcdFx0c3RyY21wKG1vZGUsIFwmIzM0O2ZyZWVcJiMzNDspID8gMTAwMCA6IDA7XG4mIzQzO1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBtVEhQIGNvbGxhcHNlIG9ubHkgc3VwcG9ydHMgdGhlIHR3byBlbmRzIG9mIHRoZSBvY2N1cGFuY3lcbiYjNDM7XHRcdCAqIHNjYWxlOiAwIG9yIEhQQUdFX1BNRF9OUiAtIDEgKGFueXRoaW5nIGVsc2UgY29lcmNlcyB0byAwKS5cbiYjNDM7XHRcdCAqIFN0cmljdCBuZWVkcyBhIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3csIHdoaWNoIGlzIHJhcmUgdW5kZXJcbiYjNDM7XHRcdCAqIHJhY2luZyBNQURWX0RPTlRORUVEOyBob2xlLWhlYXZ5IHdpbmRvd3MgY29sbGFwc2UgaW5zdGVhZCxcbiYjNDM7XHRcdCAqIHNvIHRoZSB0d28gZW5kcyByYWNlIGRpZmZlcmVudCBwYXRocy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaG9sZXMgP1xuJiM0MztcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpIC0gMSA6IDA7XG4mIzQzO1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPVxuJiM0MztcdFx0XHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpXG4mIzQzO1x0XHRcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdC8qIFBvcHBlZCBhdCB0aGUgZW5kIG9mIHRoaXMgbW9kZSwgYmVmb3JlIHRoZSBuZXh0IG9uZS4gKi9cbiYjNDM7XHRcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0XHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8XG4mIzQzO1x0XHRcdCAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xuJiM0MztcdFx0aWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgcGxheWdyb3VuZFwmIzM0Oyk7XG4mIzQzO1x0XHRtcmVtYXBfYXJlYSA9IHJlZ2lvbiAmIzQzOyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAodGhyZWFkX21hc2sgXHUwMDI2IHBhZ2VvdXRfYml0KSB7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIEJpZyBlbm91Z2ggdG8gY3ljbGUgcmVhbCByZWNsYWltLCBzbWFsbCBlbm91Z2ggbm90XG4mIzQzO1x0XHRcdCAqIHRvIGRvbWluYXRlIGEgVENHIGd1ZXN0OiA0IFBNRCBhcmVhcywgY2xhbXBlZCB0b1xuJiM0MztcdFx0XHQgKiBbMTZNLCA2NE1dLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0cGFnZW91dF9zaXplID0gNCAqIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcdFx0XHRwYWdlb3V0X3NpemUgPSBwYWdlb3V0X3NpemUgXHUwMDNjICgxNlVMIFx1MDAzY1x1MDAzYyAyMCkgP1xuJiM0MztcdFx0XHRcdCAgICAgICAoMTZVTCBcdTAwM2NcdTAwM2MgMjApIDpcbiYjNDM7XHRcdFx0XHQgICAgICAgcGFnZW91dF9zaXplIFx1MDAzZSAoNjRVTCBcdTAwM2NcdTAwM2MgMjApID9cbiYjNDM7XHRcdFx0XHQgICAgICAgKDY0VUwgXHUwMDNjXHUwMDNjIDIwKSA6IHBhZ2VvdXRfc2l6ZTtcbiYjNDM7XHRcdFx0cGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsXG4mIzQzO1x0XHRcdFx0XHQgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdFx0XHRcdCAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbiYjNDM7XHRcdFx0aWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgcGFnZW91dCBhcmVhXCYjMzQ7KTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHQvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqL1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xuJiM0MztcdFx0bWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0XHRtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKCEodGhyZWFkX21hc2sgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKSkge1xuJiM0MztcdFx0XHRcdHRocmVhZHNbaV0gPSAwO1xuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGlmIChwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLCB0aHJlYWRfZm5zW2ldLFxuJiM0MztcdFx0XHRcdFx0ICAgKHZvaWQgKikoaSAmIzQzOyAxKSkpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O3B0aHJlYWRfY3JlYXRlKClcJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGVuZF9tcyA9IG5vd19tcygpICYjNDM7IGR1cmF0aW9uX3MgKiAxMDAwVUw7XG4mIzQzO1x0XHRpZiAoIXN0cmNtcChtb2RlLCBcJiMzNDtzdGVwcGVkXCYjMzQ7KSkge1xuJiM0MztcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHRcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoNjAwKSlcbiYjNDM7XHRcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0XHRzdGVwcyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCBcJiMzNDtmcmVlXCYjMzQ7KSkge1xuJiM0MztcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZClcbiYjNDM7XHRcdFx0XHR1c2xlZXAoMTAwICogMTAwMCk7XG4mIzQzO1x0XHR9IGVsc2Uge1x0LyogbWFkdmlzZSAqL1xuJiM0MztcdFx0XHR3aGlsZSAobm93X21zKCkgXHUwMDNjIGVuZF9tcyBcdTAwMjZcdTAwMjYgIWNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3NoYXJlZF9hcmVhczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0XHRcdG1hZHZpc2UocmVnaW9uICYjNDM7IGkgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfQ09MTEFQU0UpO1xuJiM0MztcdFx0XHRcdH1cbiYjNDM7XHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbiYjNDM7XHRcdFx0XHRzdGVwcyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRzdG9wID0gMTtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdGlmICh0aHJlYWRzW2ldKVxuJiM0MztcdFx0XHRcdHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHQvKiBGaW5hbCBpbnRlZ3JpdHkgc3dlZXAuICovXG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdGNoZWNrX3BhZ2UoaSk7XG4mIzQzO1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdCghY29ycnVwdGVkLFxuJiM0MztcdFx0XHRcdCBcJiMzNDslcy8lcyVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCBtb2RlLCBob2xlcyA/IFwmIzM0O2hvbGVzXCYjMzQ7IDogXCYjMzQ7c3RyaWN0XCYjMzQ7LFxuJiM0MztcdFx0XHRcdCBwcmVzc3VyZSA/IFwmIzM0Oy9wcmVzc3VyZVwmIzM0OyA6IFwmIzM0O1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgZHVyYXRpb25fcywgc3RlcHMpO1xuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBIYW5kIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB0aGUgc2V0dGluZ3MgYmFjayBiZWZvcmUgdGhlXG4mIzQzO1x0XHQgKiBuZXh0IG1vZGU6IGl0IG1hcHMgdGhlIHJlZ2lvbiBhdCB0aGUgc2FtZSBmaXhlZCBhZGRyZXNzLFxuJiM0MztcdFx0ICogYW5kIGl0cyBzY2FuIGNhZGVuY2UgZGlmZmVycy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0bXVubWFwKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0XHRpZiAocGFnZW91dF9hcmVhKSB7XG4mIzQzO1x0XHRcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XG4mIzQzO1x0XHRcdHBhZ2VvdXRfYXJlYSA9IE5VTEw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0XHRzdG9wID0gMDtcbiYjNDM7XHRcdHN0ZXBzID0gMDtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoY29ycnVwdGVkKSB7XG4mIzQzO1x0XHRcdC8qIE1lbW9yeSBpcyBzdXNwZWN0OyB0aGUgcmVzdCB3b3VsZCBwcm92ZSBub3RoaW5nLiAqL1xuJiM0MztcdFx0XHR3aGlsZSAoJiM0MzsmIzQzO3J1biBcdTAwM2MgbnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzKSB7XG4mIzQzO1x0XHRcdFx0cmVtID0gcnVuICUgKG5yX25vbmVzICogbnJfcHJlc3MpO1xuJiM0MztcbiYjNDM7XHRcdFx0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCYjMzQ7JXMvJXMlczogc2tpcHBlZCBhZnRlciBjb3JydXB0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICBtb2Rlc1tydW4gLyAobnJfbm9uZXMgKiBucl9wcmVzcyldLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICBub25lc1tyZW0gLyBucl9wcmVzc10gP1xuJiM0MztcdFx0XHRcdFx0XHQgICAgICBcJiMzNDtob2xlc1wmIzM0OyA6IFwmIzM0O3N0cmljdFwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgcHJlc3NbcmVtICUgbnJfcHJlc3NdID9cbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgXCYjMzQ7L3ByZXNzdXJlXCYjMzQ7IDogXCYjMzQ7XCYjMzQ7KTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjMwZDNmYjUxOWZiMmNcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXG5AQCAtMCwwICYjNDM7MSwyMTcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogU3luY2hyb25vdXMga2h1Z2VwYWdlZCBkcml2aW5nIGNoZWNrLlxuJiM0MzsgKlxuJiM0MzsgKiBSYWNlIHRlc3RzIGRyaXZlIGtodWdlcGFnZWQgdGhyb3VnaCB0aGUgZXhpc3Rpbmcgc3lzZnMgY29udHJvbHM6IGFcbiYjNDM7ICogc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYW5kIGZ1bGxfc2NhbnNcbiYjNDM7ICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0XG4mIzQzOyAqIHN0YXJ0ZWQgYWZ0ZXIgc2V0dXAgKGtodWdlcGFnZWRfZnVsbF9wYXNzKCkpLiBWZXJpZnkgdGhlIHBhaXIgZ2l2ZXNcbiYjNDM7ICogZGV0ZXJtaW5pc3RpYywgYXR0cmlidXRhYmxlIHJlc3VsdHM6IG9uZSBiYXJyaWVyIHN0ZXAgb3ZlciBvbmVcbiYjNDM7ICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdFxuJiM0MzsgKiB3aW5kb3cmIzM5O3Mgc291cmNlIHBhZ2VzIChtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSBldmVudHMgZmlsdGVyZWRcbiYjNDM7ICogYnkgc291cmNlIFBGTiBhbmQgb3JkZXIpIGFuZCB0aGUgd2luZG93IGlzIGNvbGxhcHNlZFxuJiM0MzsgKiBhZnRlcndhcmRzLCByZXBlYXRhYmx5LlxuJiM0MzsgKlxuJiM0MzsgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBzZXQgdG8gNjBzIHRvIHByb3ZlIHRoZSB3YWtlIHBhdGg6IHdpdGhvdXRcbiYjNDM7ICogdGhlIHdha2UsIG9uZSBiYXJyaWVyIHN0ZXAgd291bGQgc2xlZXAgbXVsdGlwbGVzIG9mIHRoYXQgYW5kIGJsb3dcbiYjNDM7ICogdGhlIHRpbWVvdXQuIEl0IGFsc28ga2VlcHMgdGhlIGRhZW1vbiBmcm9tIGZyZWUtcnVubmluZyBiZXR3ZWVuXG4mIzQzOyAqIHN0ZXBzLCBwZXIgdGhlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZGlzY2lwbGluZS5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2tzZWxmdGVzdC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtX3V0aWwuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFx1MDAzY1x1MDAzYyAzMCkpXG4mIzQzOyNkZWZpbmUgVEFSR0VUX09SREVSIDJcdC8qIHNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXG4mIzQzOyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4mIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcbiYjNDM7c3RhdGljIGludCB0cmFjZV9ldmVudHNfZmQgPSAtMTtcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBFYWNoIHN0ZXAgc3dpdGNoZXMgdGhlIGV2ZW50cyBvZmYgYWdhaW4sIGJ1dCBhIGhlbHBlciBjYW4gc3RpbGwgZ2l2ZSB1cFxuJiM0MzsgKiBvbiB1cyBpbiBiZXR3ZWVuIChhIGZhaWxpbmcgc3lzZnMgd3JpdGUgZW5kcyB0aGUgdGVzdCBmcm9tIGluc2lkZVxuJiM0MzsgKiB0aHBfd3JpdGVfbnVtKCkpLCBhbmQgaHVnZV9tZW1vcnkgZXZlbnRzIGxlZnQgb24gYXJlIHRoZSB3aG9sZSBtYWNoaW5lJiMzOTtzXG4mIzQzOyAqIHByb2JsZW0sIG5vdCB0aGlzIHRlc3QmIzM5O3MuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCB0cmFjZV9ldmVudHNfb2ZmKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQ291bnQgY29sbGFwc2UgYXR0ZW1wdHMgYXR0cmlidXRhYmxlIHRvIG91ciB3aW5kb3c6IGxlZ2FjeS1lbmdpbmVcbiYjNDM7ICogaXNvbGF0ZSBldmVudHMgd2hvc2Ugc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cmIzM5O3Mgc291cmNlIFBGTnMsXG4mIzQzOyAqIHBsdXMgYmF0Y2gtZW5naW5lIHBlci1jYW5kaWRhdGUgaW5zdGFsbCBldmVudHMgYXQgdGhlIHdpbmRvdyYjMzk7c1xuJiM0MzsgKiBhZGRyZXNzLiBFaXRoZXIgZW5naW5lIHJlcG9ydHMgZXhhY3RseSBvbmNlIHBlciBhdHRlbXB0LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxuJiM0MztcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgb3JkZXIpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGxpbmVbMTAyNF07XG4mIzQzO1x0aW50IGNvdW50ID0gMDtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSB0cmFjaW5nX29wZW5fdHJhY2UoKTtcbiYjNDM7XHRpZiAoIWZwKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O0Nhbm5vdCBvcGVuIHRyYWNlIGJ1ZmZlclxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xuJiM0MztcdFx0Y2hhciAqcztcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgdmFsO1xuJiM0MztcdFx0dW5zaWduZWQgaW50IG9yZDtcbiYjNDM7XHRcdGNoYXIgKm87XG4mIzQzO1x0XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0XHRzID0gc3Ryc3RyKGxpbmUsIFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAocykge1xuJiM0MztcdFx0XHRpZiAoc3NjYW5mKHMsIFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOiBzY2FuX3Bmbj0weCVseFwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBcdTAwMjZ2YWwpICE9IDEpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdG8gPSBzdHJzdHIocywgXCYjMzQ7b3JkZXI9XCYjMzQ7KTtcbiYjNDM7XHRcdFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcJiMzNDtvcmRlcj0ldVwmIzM0OywgXHUwMDI2b3JkKSAhPSAxIHx8XG4mIzQzO1x0XHRcdCAgICBvcmQgIT0gb3JkZXIpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BmbnM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdFx0aWYgKHZhbCA9PSBwZm5zW2ldKSB7XG4mIzQzO1x0XHRcdFx0XHRjb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0cyA9IHN0cnN0cihsaW5lLCBcJiMzNDttbV9jb2xsYXBzZV9jYW5kaWRhdGU6XCYjMzQ7KTtcbiYjNDM7XHRcdGlmIChzKSB7XG4mIzQzO1x0XHRcdGlmICghc3Ryc3RyKHMsIFwmIzM0O3Bhc3M9aW5zdGFsbFwmIzM0OykgfHxcbiYjNDM7XHRcdFx0ICAgICFzdHJzdHIocywgXCYjMzQ7cmVzdWx0PXN1Y2NlZWRlZFwmIzM0OykpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdG8gPSBzdHJzdHIocywgXCYjMzQ7YWRkcj1cJiMzNDspO1xuJiM0MztcdFx0XHRpZiAoIW8gfHwgc3NjYW5mKG8sIFwmIzM0O2FkZHI9MHglbHhcJiMzNDssIFx1MDAyNnZhbCkgIT0gMSB8fFxuJiM0MztcdFx0XHQgICAgdmFsICE9IGFkZHIpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdG8gPSBzdHJzdHIocywgXCYjMzQ7b3JkZXI9XCYjMzQ7KTtcbiYjNDM7XHRcdFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcJiMzNDtvcmRlcj0ldVwmIzM0OywgXHUwMDI2b3JkKSAhPSAxIHx8XG4mIzQzO1x0XHRcdCAgICBvcmQgIT0gb3JkZXIpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdGNvdW50JiM0MzsmIzQzOztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7XHRyZXR1cm4gY291bnQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzaXplX3Qgd2luZG93ID0gZ2V0cGFnZXNpemUoKSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSO1xuJiM0MztcdGNvbnN0IGludCBucl9wYWdlcyA9IDEgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHBmbnNbMSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSXTtcbiYjNDM7XHRib29sIGNvbGxhcHNlZCwgcGFzc2VkO1xuJiM0MztcdGludCBhdHRyaWJ1dGVkO1xuJiM0MztcdGNoYXIgKnA7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4mIzQzO1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xuJiM0MztcdGlmIChwICE9IEJBU0VfQUREUilcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgd2luZG93XCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LyogUHJlcGFyZSBvbmUgd2luZG93OyByZWNvcmQgaXRzIHNvdXJjZSBQRk5zLiAqL1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0cFtpICogZ2V0cGFnZXNpemUoKV0gPSBpICYjNDM7IDE7XG4mIzQzO1x0XHRwZm5zW2ldID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHAgJiM0MzsgaSAqIGdldHBhZ2VzaXplKCkpO1xuJiM0MztcdFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1NvdXJjZSBwYWdlIG5vdCBwcmVzZW50XFxuXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIENsZWFyIGZpcnN0OiB3aXRoIHRoZSBldmVudHMgc3RpbGwgb2ZmIHRoZXJlIGlzIG5vdGhpbmcgdG8gdW5kby4gKi9cbiYjNDM7XHRpZiAodHJhY2luZ19jbGVhcl90cmFjZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O0Nhbm5vdCBjbGVhciB0aGUgdHJhY2UgYnVmZmVyXFxuXCYjMzQ7KTtcbiYjNDM7XHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7Q2Fubm90IGVuYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHQvKiBXYWl0IHVwIHRvIDEyMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi9cbiYjNDM7XHRwYXNzZWQgPSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygxMjApO1xuJiM0MztcbiYjNDM7XHQvKiBPZmYgYmVmb3JlIGFueXRoaW5nIHRoYXQgY2FuIGdpdmUgdXA6IHRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlLiAqL1xuJiM0MztcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7Q2Fubm90IGRpc2FibGUgaHVnZV9tZW1vcnkgZXZlbnRzXFxuXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIXBhc3NlZClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRjb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XG4mIzQzO1x0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsICh1bnNpZ25lZCBsb25nKXAsXG4mIzQzO1x0XHRcdFx0ICAgICAgVEFSR0VUX09SREVSKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXHUwMDI2XHUwMDI2IGF0dHJpYnV0ZWQgPT0gMSxcbiYjNDM7XHRcdFx0IFwmIzM0O3N0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTtcbiYjNDM7XG4mIzQzO1x0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG1haW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cJiMzNDspO1xuJiM0MztcdGlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUikpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7T3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgVEFSR0VUX09SREVSKTtcbiYjNDM7XG4mIzQzO1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuJiM0MztcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRwYWdlbWFwX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcJiMzNDspO1xuJiM0MztcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXFxcJiMzNDspIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcdHRyYWNlX2V2ZW50c19mZCA9IHRyYWNpbmdfZXZlbnRzX29wZW4oXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspO1xuJiM0MztcdGlmICh0cmFjZV9ldmVudHNfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XG4mIzQzO1xuJiM0MztcdGtzZnRfc2V0X3BsYW4oTlJfSVRFUkFUSU9OUyk7XG4mIzQzO1xuJiM0MztcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4mIzQzO1x0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAoaHBhZ2VfcG1kX3NpemUgLyBnZXRwYWdlc2l6ZSgpKSAtIDE7XG4mIzQzO1x0LyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi9cbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXHUwMDNjXHUwMDNjIDI0O1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfSVRFUkFUSU9OUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRvbmVfc3RlcChpKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuQEAgLTIwLDcgJiM0MzsyMCw2IEBAXG4gXG4gI2RlZmluZSBUV09NRUdcdFx0KDJcdTAwM2NcdTAwM2MyMClcbiAjZGVmaW5lIFJVTlRJTUVcdFx0KDIwKVxuLSNkZWZpbmUgQUxJR04oeCwgYSlcdCgoKHgpICYjNDM7IChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gXG4gSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTQwMiw2ICYjNDM7NDAyLDEyIEBAIENBVEVHT1JZPVwmIzM0O3Bmbm1hcFwmIzM0OyBydW5fdGVzdCAuL3Bmbm1hcFxuICMgQ09XIHRlc3RzXG4gQ0FURUdPUlk9XCYjMzQ7Y293XCYjMzQ7IHJ1bl90ZXN0IC4vY293XG4gXG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrXG4mIzQzO1xuJiM0MztDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZVxuJiM0MztcbiBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXG4gXG4gQ0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyXG5AQCAtNDEwLDggJiM0Mzs0MTYsNiBAQCBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxuIFxuIENBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cbiBcbi1DQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub25cbi1cbiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZFxuIGlmIFsgLXogXCYjMzQ7JHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH1cJiMzNDsgXTsgdGhlblxuICAgICBpZiB0ZXN0X3NlbGVjdGVkIFwmIzM0O3RocFwmIzM0OzsgdGhlblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5pbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuQEAgLTQyLDY4ICYjNDM7NDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7O1xuIGludCBwYWdlbWFwX2ZkO1xuIGludCBrcGFnZWZsYWdzX2ZkO1xuIFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbi1cdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4te1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4tXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4tXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4tXG4tXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4tXHRpZiAocGZuID09IC0xVUwpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbi1cdGlmICghb3JkZXIpIHtcbi1cdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0Lyogbm9uIFRIUCBmb2xpbyAqL1xuLVx0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuLVx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuLVx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbi1cdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbi1cdCAqL1xuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpXG4ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuaW5kZXggODBiYzlmNTk3YjUyMS4uZWUxMzM0Nzc4MzkxZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5AQCAtNDk0LDYgJiM0Mzs0OTQsMTUxIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuJiM0MztcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbiYjNDM7XHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm47XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcbiYjNDM7XHQvKiBub24gcHJlc2VudCBwYWdlICovXG4mIzQzO1x0aWYgKHBmbiA9PSAtMVVMKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4mIzQzO1x0aWYgKCFvcmRlcikge1xuJiM0MztcdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBub24gVEhQIGZvbGlvICovXG4mIzQzO1x0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4mIzQzO1x0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuJiM0MztcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbiYjNDM7XHRcdFx0Z290byBmYWlsO1xuJiM0MztcdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbiYjNDM7XHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuJiM0MztcdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuJiM0MztmYWlsOlxuJiM0MztcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQ2hlY2sgd2hldGhlciBldmVyeSBvcmRlci1Ab3JkZXIgd2luZG93IG9mIFtzdGFydCwgbGVuKSBtYXBzIGV4YWN0bHkgb25lXG4mIzQzOyAqIGZvbGlvIG9mIHRoYXQgb3JkZXIsIGhlYWQgdG8gdGFpbC4gIFRoZSBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5XG4mIzQzOyAqIGFsaWduZWQsIGVhY2ggd2luZG93JiMzOTtzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgYSB3aW5kb3cmIzM5O3MgZmlyc3RcbiYjNDM7ICogUEZOIG11c3QgYmUgdGhlIGZvbGlvIGhlYWQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgaXMgdGhlIGNoZWNrIFwmIzM0O2RpZCB0aGlzIHJhbmdlIGNvbGxhcHNlIGludG8gb3JkZXItQG9yZGVyIGZvbGlvc1wmIzM0OzogYVxuJiM0MzsgKiB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpbyBzaGlmdGVkXG4mIzQzOyAqIGZyb20gaXRzIG5hdHVyYWwgcG9zaXRpb24sIGZhaWxzLlxuJiM0MzsgKi9cbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiYjNDM7XHRjb25zdCBzaXplX3Qgd2luZG93ID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xuJiM0MztcdGNoYXIgKnZhZGRyO1xuJiM0MztcbiYjNDM7XHRpZiAoKHVpbnRwdHJfdClzdGFydCAlIHdpbmRvdyB8fCBsZW4gJSB3aW5kb3cpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgXHUwMDNjIHN0YXJ0ICYjNDM7IGxlbjsgdmFkZHIgJiM0Mzs9IHdpbmRvdykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRcdC8qIE5vdCBwcmVzZW50LCBvciBub3QgbWFwcGluZyB0aGUgZm9saW8gaGVhZC4gKi9cbiYjNDM7XHRcdGlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcylcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpKSAhPVxuJiM0MztcdFx0XHQgICAgcGZuICYjNDM7IGkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0XHRcdGtwYWdlZmxhZ3NfZmQpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBUUkFDRUZTX1JPT1QgXCYjMzQ7L3N5cy9rZXJuZWwvdHJhY2luZ1wmIzM0O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogT3BlbiB0aGUgZW5hYmxlIGZpbGUgb2Ygb25lIGZ0cmFjZSBldmVudCBzdWJzeXN0ZW0gKGUuZy4gXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspLlxuJiM0MzsgKiBSZXR1cm5zIGEgZGVzY3JpcHRvciBmb3IgdHJhY2luZ19ldmVudHNfZW5hYmxlKCksIG9yIC0xIGlmIHRyYWNlZnMgb3IgdGhlXG4mIzQzOyAqIHN1YnN5c3RlbSBpcyBub3QgdGhlcmUuICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSBzdGF0ZTogd2hvZXZlclxuJiM0MzsgKiBzd2l0Y2hlcyB0aGVtIG9uIG93bnMgdGhlbSB1bnRpbCBpdCBzd2l0Y2hlcyB0aGVtIG9mZiwgaW5jbHVkaW5nIG9uIHRoZVxuJiM0MzsgKiBwYXRocyB3aGVyZSB0aGUgdGVzdCBnaXZlcyB1cC5cbiYjNDM7ICovXG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFsyNTZdO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCBcJiMzNDsvZXZlbnRzLyVzL2VuYWJsZVwmIzM0OyxcbiYjNDM7XHRcdCBzdWJzeXMpO1xuJiM0MztcdHJldHVybiBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHB3cml0ZShmZCwgZW5hYmxlID8gXCYjMzQ7MVwmIzM0OyA6IFwmIzM0OzBcJiMzNDssIDEsIDApICE9IDEpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhci4gKi9cbiYjNDM7aW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCBmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgT19XUk9OTFkgfCBPX1RSVU5DKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4gLyogSWYgYGlvY3RscyYjMzk7IG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi9cbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxuIFx0XHRcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbmluZGV4IDlhNDlhZjg4NzAyZTQuLjEwYzdiZTQ2ZTQ0Y2EgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuQEAgLTEwLDYgJiM0MzsxMCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuIFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXHUwMDNjXHUwMDNjIChucikpXG4mIzQzOyNkZWZpbmUgQUxJR04oeCwgYSkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiM0MzsgKGEpIC0gMSkgXHUwMDI2IH4oKGEpIC0gMSkpXG4mIzQzO1xuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcbiAjZGVmaW5lIFBNX01NQVBfRVhDTFVTSVZFICAgICAgICAgICAgIEJJVF9VTEwoNTYpXG4gI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KVxuQEAgLTk3LDYgJiM0Mzs5OSwxMCBAQCBpbnQ2NF90IGFsbG9jYXRlX3RyYW5zaHVnZSh2b2lkICpwdHIsIGludCBwYWdlbWFwX2ZkKTtcbiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7XG4gaW50IGdhdGhlcl9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sXG4gXHRcdGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKTtcbiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4mIzQzO1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKTtcbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpO1xuIFxuIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdCAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTtcbkBAIC0xMTMsNiAmIzQzOzExOSwxMCBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cyk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7XG4mIzQzO2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpO1xuJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XG4gXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxuIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xMiAxNDo1OTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLywgd2hpY2ggZG8gbm90IGFmZmVjdCB0aGUga2VybmVsJiMzOTtzIGZ1bmN0aW9uYWwgZXhlY3V0aW9uIGZsb3cuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgNjdhMTllMTdhOTFiNjE1ZDAwNzFjM2Q4NDEwMzgyZTgxYzBlOTA4OApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgQXVnIDEyIDE0OjU5OjEwIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQppbmRleCAyZDUzNjYxOTZlMzA5Li4zMDhiYmFkNzNjMTFhIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZQpAQCAtMTA0LDYgJiM0MzsxMDQsOSBAQCBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZ3VhcmQtcmVnaW9ucwogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IG1lcmdlCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcm1hcAogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX3NwbGl0X3JhY2VfdGVzdAomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19vcmRlcl9jaGVjawomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3N5bmNfY2hlY2sKJiM0MztURVNUX0dFTl9GSUxFUyAmIzQzOz0ga2h1Z2VwYWdlZF9yYWNlCiAKIGlmbmVxICgkKEFSQ0gpLGFybTY0KQogVEVTVF9HRU5fRklMRVMgJiM0Mzs9IHNvZnQtZGlydHkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjkzMDMwYTQyYzNjY2QKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jCkBAIC0wLDAgJiM0MzsxLDEzNyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBTZWxmLWNoZWNrIGZvciB0aGUgdm1fdXRpbCBmb2xpby1vcmRlciBkZXRlY3Rpb24gaGVscGVycywKJiM0MzsgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBhbmQgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycygpLgomIzQzOyAqCiYjNDM7ICogRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0IG1lbW9yeSBpbiB3aXRoIG9ubHkKJiM0MzsgKiB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHZlcmlmeSB0aGUgaGVscGVycyByZXBvcnQgZXhhY3RseSB0aGF0IG9yZGVyOgomIzQzOyAqIG5vdCBhIG5laWdoYm91cmluZyBvcmRlciwgYW5kIHBsYWluIDRLIG1lbW9yeSBhcyBvcmRlciAwLiBUaGUgaGVscGVycwomIzQzOyAqIGFyZSB3aGF0IHRoZSBraHVnZXBhZ2VkIG1USFAgdGVzdHMgdXNlIHRvIGRldGVjdCBjb2xsYXBzZSByZXN1bHRzLCBzbwomIzQzOyAqIHRoZXkgbXVzdCBhZ3JlZSB3aXRoIHRoZSBrZXJuZWwmIzM5O3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueQomIzQzOyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc2VsZnRlc3QuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaCYjMzQ7CiYjNDM7CiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkOwomIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDsKJiM0MzsKJiM0MzsvKiBtbWFwIGFuIGFub24gVk1BIG9mIGV4YWN0bHkgQHNpemUgYnl0ZXMgYXQgYSBAc2l6ZS1hbGlnbmVkIGFkZHJlc3MuICovCiYjNDM7c3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpCiYjNDM7ewomIzQzOwlzaXplX3QgbGVuID0gc2l6ZSAqIDI7CiYjNDM7CXVpbnRwdHJfdCBhbGlnbmVkOwomIzQzOwljaGFyICpwOwomIzQzOwomIzQzOwlwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkmIzM0Oyk7CiYjNDM7CiYjNDM7CWFsaWduZWQgPSBBTElHTigodWludHB0cl90KXAsIHNpemUpOwomIzQzOwlpZiAoYWxpZ25lZCAhPSAodWludHB0cl90KXApCiYjNDM7CQltdW5tYXAocCwgYWxpZ25lZCAtICh1aW50cHRyX3QpcCk7CiYjNDM7CWlmIChhbGlnbmVkICYjNDM7IHNpemUgIT0gKHVpbnRwdHJfdClwICYjNDM7IGxlbikKJiM0MzsJCW11bm1hcCgoY2hhciAqKWFsaWduZWQgJiM0Mzsgc2l6ZSwKJiM0MzsJCSAgICAgICAodWludHB0cl90KXAgJiM0MzsgbGVuIC0gYWxpZ25lZCAtIHNpemUpOwomIzQzOwomIzQzOwlyZXR1cm4gKGNoYXIgKilhbGlnbmVkOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEVuYWJsZSBvbmx5IEBvcmRlciAob3JkZXIgMDogbm90aGluZyksIGZhdWx0IG9uZSBhbGlnbmVkIHdpbmRvdyBpbiBhbmQKJiM0MzsgKiBjaGVjayB0aGUgaGVscGVycyBzZWUgZXhhY3RseSBAb3JkZXIuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfb3JkZXIoaW50IG9yZGVyKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlzaXplX3Qgc2l6ZSA9IHBzaXplKCkgJmx0OyZsdDsgb3JkZXI7CiYjNDM7CWJvb2wgb2sgPSB0cnVlOwomIzQzOwljaGFyICpwOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5SX09SREVSUzsgaSYjNDM7JiM0MzspCiYjNDM7CQlzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjsKJiM0MzsJaWYgKG9yZGVyKQomIzQzOwkJc2V0dGluZ3MuaHVnZXBhZ2VzW29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUzsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CXAgPSBhbGxvY19hbGlnbmVkKHNpemUpOwomIzQzOwkqcCA9IDE7CiYjNDM7CiYjNDM7CWlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlciwKJiM0MzsJCQkJCSAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7b3JkZXIgJWQgbm90IGRldGVjdGVkIGFmdGVyIGZhdWx0XG4mIzM0Oywgb3JkZXIpOwomIzQzOwkJb2sgPSBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovCiYjNDM7CWlmIChvcmRlciAmYW1wOyZhbXA7IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIgLSAxLAomIzQzOwkJCQkJCSAgICAgcGFnZW1hcF9mZCwKJiM0MzsJCQkJCQkgICAgIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O29yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgJWRcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBvcmRlciwgb3JkZXIgLSAxKTsKJiM0MzsJCW9rID0gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogT3JkZXIgMCBwYWdlcyBtdXN0IG5vdCBsb29rIGxpa2UgYW55IGxhcmdlIGZvbGlvLCBhbmQgdmljZSB2ZXJzYS4gKi8KJiM0MzsJaWYgKG9yZGVyICZhbXA7JmFtcDsgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCAwLAomIzQzOwkJCQkJCSAgICAgcGFnZW1hcF9mZCwKJiM0MzsJCQkJCQkgICAgIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O29yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxuJiMzNDssIG9yZGVyKTsKJiM0MzsJCW9rID0gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbXVubWFwKHAsIHNpemUpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHQob2ssICYjMzQ7b3JkZXIgJWQgY2xhc3NpZmllZFxuJiMzNDssIG9yZGVyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG1haW4odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7CiYjNDM7CXVuc2lnbmVkIGxvbmcgb3JkZXJzOwomIzQzOwlpbnQgb3JkZXI7CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfaGVhZGVyKCk7CiYjNDM7CiYjNDM7CWlmICghdGhwX2F2YWlsYWJsZSgpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxuJiMzNDspOwomIzQzOwomIzQzOwlwYWdlbWFwX2ZkID0gb3BlbigmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcCYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChwYWdlbWFwX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O29wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKSYjMzQ7KTsKJiM0MzsJa3BhZ2VmbGFnc19mZCA9IG9wZW4oJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGtwYWdlZmxhZ3NfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDspIHJlcXVpcmVzIHJvb3RcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJb3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTsKJiM0MzsJaWYgKCFvcmRlcnMpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O05vIHN1cHBvcnRlZCBUSFAgb3JkZXJzXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWtzZnRfc2V0X3BsYW4oX19idWlsdGluX3BvcGNvdW50bChvcmRlcnMpICYjNDM7IDEpOwomIzQzOwomIzQzOwl0aHBfc2F2ZV9zZXR0aW5ncygpOwomIzQzOwl0aHBfcmVhZF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsJLyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqLwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJY2hlY2tfb3JkZXIoMCk7CiYjNDM7CWZvciAob3JkZXIgPSAxOyBvcmRlciAmbHQ7IE5SX09SREVSUzsgb3JkZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoIShvcmRlcnMgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBvcmRlcikpKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJY2hlY2tfb3JkZXIob3JkZXIpOwomIzQzOwl9CiYjNDM7CiYjNDM7CiYjNDM7CWtzZnRfZmluaXNoZWQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jCmluZGV4IGUyNjQyZWNhMGQwMmIuLmRmNDI2ZjkyMThlNzEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jCkBAIC02NSw3ICYjNDM7NjUsNiBAQCBlbnVtIHsKICNkZWZpbmUgSE1NX1BBVEhfTUFYICAgIDY0CiAjZGVmaW5lIE5USU1FUwkJMTAKIAotI2RlZmluZSBBTElHTih4LCBhKSAoKCh4KSAmIzQzOyAoYSAtIDEpKSAmYW1wOyAofigoYSkgLSAxKSkpCiAvKiBKdXN0IHRoZSBmbGFncyB3ZSBuZWVkLCBjb3BpZWQgZnJvbSBtbS5oOiAqLwogCiAjaWZuZGVmIEZPTExfV1JJVEUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jCmluZGV4IGQ3OTE3ZGNlM2FiYWMuLjhhZmNkZjk3OTNiYjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYwpAQCAtMTgzLDYgJiM0MzsxODMsMTcgQEAgdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncykKIAl9CiB9CiAKJiM0MzsvKgomIzQzOyAqIFdyaXRlIG9ubHkgb24gY2hhbmdlOiBhbnkgc3RvcmUgdG8gYSBraHVnZXBhZ2VkIHN5c2ZzIGtub2Igd2FrZXMgdGhlCiYjNDM7ICogZGFlbW9uLCBhbmQgc2V0dGluZ3MgcHVzaGVzL3BvcHMgbXVzdCBub3Qgc3RhcnQgc2NhbiBwYXNzZXMgbm9ib2R5CiYjNDM7ICogYXNrZWQgZm9yIC0tIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgaXMgdGhlIG9ubHkgc2FuY3Rpb25lZCB3YWtlLgomIzQzOyAqLwomIzQzO3ZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pCiYjNDM7ewomIzQzOwlpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSkKJiM0MzsJCXRocF93cml0ZV9udW0obmFtZSwgbnVtKTsKJiM0Mzt9CiYjNDM7CiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncykKIHsKIAlzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9ICZhbXA7c2V0dGluZ3MtJmd0O2todWdlcGFnZWQ7CkBAIC0xOTgsMTUgJiM0MzsyMDksMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpCiAJCQlzaG1lbV9lbmFibGVkX3N0cmluZ3Nbc2V0dGluZ3MtJmd0O3NobWVtX2VuYWJsZWRdKTsKIAl0aHBfd3JpdGVfbnVtKCYjMzQ7dXNlX3plcm9fcGFnZSYjMzQ7LCBzZXR0aW5ncy0mZ3Q7dXNlX3plcm9fcGFnZSk7CiAKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWcmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7ZGVmcmFnKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3MmIzM0OywKLQkJCWtodWdlcGFnZWQtJmd0O2FsbG9jX3NsZWVwX21pbGxpc2Vjcyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3MmIzM0OywKLQkJCWtodWdlcGFnZWQtJmd0O3NjYW5fc2xlZXBfbWlsbGlzZWNzKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX25vbmUpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXAmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc3dhcCk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3NoYXJlZCk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvcGFnZXNfdG9fc2NhbiYjMzQ7LCBraHVnZXBhZ2VkLSZndDtwYWdlc190b19zY2FuKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL2RlZnJhZyYjMzQ7LCBraHVnZXBhZ2VkLSZndDtkZWZyYWcpOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzJiMzNDssCiYjNDM7CQkgICAgICAga2h1Z2VwYWdlZC0mZ3Q7YWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDssCiYjNDM7CQkgICAgICAga2h1Z2VwYWdlZC0mZ3Q7c2Nhbl9zbGVlcF9taWxsaXNlY3MpOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZSYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19ub25lKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXAmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc3dhcCk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWQmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc2hhcmVkKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW4mIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7cGFnZXNfdG9fc2Nhbik7CiAKIAlpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSkKIAkJd3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLSZndDtyZWFkX2FoZWFkX2tiKTsKQEAgLTIzMCw2ICYjNDM7MjQxLDQ5IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdAomIzQzOyAqIHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZC4gZnVsbF9zY2FucyBtdXN0IGFkdmFuY2UgYnkgdHdvOwomIzQzOyAqIGEgJiM0MzsxIHN0ZXAgbWF5IGNvbXBsZXRlIGEgcGFzcyB0aGF0IGV4YW1pbmVkIHRoaXMgbW0gYmVmb3JlIHRoZQomIzQzOyAqIGNhbGxlciYjMzk7cyBzZXR1cCB3YXMgaW4gcGxhY2UuCiYjNDM7ICoKJiM0MzsgKiBBbnkgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgc28gdGhlIGJhcnJpZXIgd29ya3MKJiM0MzsgKiB3aGF0ZXZlciB0aGUgY29uZmlndXJlZCBzY2FuIGNhZGVuY2UgLS0gYnV0IGEgc3RvcmUgY2FuIGJlIGxvc3QuCiYjNDM7ICogX19zbGVlcF9taWxsaXNlY3Nfc3RvcmUoKSBjbGVhcnMga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgYW5kIHdha2VzIHRoZQomIzQzOyAqIHF1ZXVlOyBpZiB0aGUgZGFlbW9uIGlzIGJldHdlZW4gc2NhbnMgcmF0aGVyIHRoYW4gc2xlZXBpbmcsIGl0IHNldHMKJiM0MzsgKiBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZSBpdHNlbGYgb24gdGhlIHdheSBpbnRvIGtodWdlcGFnZWRfd2FpdF93b3JrKCkgYW5kCiYjNDM7ICogdGhlbiBzbGVlcHMgZm9yIHRoZSBmdWxsIGludGVydmFsLCBoYXZpbmcgbmV2ZXIgc2VlbiB0aGUgc3RvcmUuICBTbyBrZWVwCiYjNDM7ICogc3RvcmluZyB1bnRpbCB0aGUgcGFzcyBsYW5kczsgYSBzdG9yZSB3aGlsZSB0aGUgZGFlbW9uIGlzIGF3YWtlIGNvc3RzCiYjNDM7ICogbm90aGluZyBhbmQgZG9lcyBub3QgcXVldWUgYW4gZXh0cmEgcGFzcy4KJiM0MzsgKgomIzQzOyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpbgomIzQzOyAqIG9uZSBzY2FuIGJhdGNoLCBzbyBjYWxsZXJzIG11c3QgcGFpciB0aGlzIHdpdGggYSBsYXJnZQomIzQzOyAqIHBhZ2VzX3RvX3NjYW4uCiYjNDM7ICovCiYjNDM7Ym9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBkZWFkbGluZV9tcyA9IHRpbWVvdXRfcyAqIDEwMDBVTDsKJiM0MzsJdW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9CiYjNDM7CQl0aHBfcmVhZF9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDspOwomIzQzOwl1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwOwomIzQzOwlpbnQgcGFzczsKJiM0MzsKJiM0MzsJZm9yIChwYXNzID0gMDsgcGFzcyAmbHQ7IDI7IHBhc3MmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHRhcmdldCA9CiYjNDM7CQkJdGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICYjNDM7IDE7CiYjNDM7CiYjNDM7CQl3aGlsZSAodGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICZsdDsgdGFyZ2V0KSB7CiYjNDM7CQkJaWYgKGVsYXBzZWRfbXMgJmd0Oz0gZGVhZGxpbmVfbXMpCiYjNDM7CQkJCXJldHVybiBmYWxzZTsKJiM0MzsJCQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJCQkgICAgICBzbGVlcF9tcyk7CiYjNDM7CQkJdXNsZWVwKDEwICogMTAwMCk7CiYjNDM7CQkJZWxhcHNlZF9tcyAmIzQzOz0gMTA7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwogc3RydWN0IHRocF9zZXR0aW5ncyAqdGhwX2N1cnJlbnRfc2V0dGluZ3Modm9pZCkKIHsKIAlpZiAoIXNldHRpbmdzX2luZGV4KSB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaAppbmRleCA3MjZjNzNjNDNjMDViLi5iYTdkMzgzNzBkNDMzIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmgKQEAgLTcwLDYgJiM0Mzs3MCw3IEBAIGludCB0aHBfcmVhZF9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqIGNvbnN0IHN0cmluZ3NbXSk7CiB2b2lkIHRocF93cml0ZV9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3JlYWRfbnVtKGNvbnN0IGNoYXIgKm5hbWUpOwogdm9pZCB0aHBfd3JpdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTsKJiM0Mzt2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTsKIAogdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpOwogdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncyk7CkBAIC04Myw2ICYjNDM7ODQsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZCkKIAlodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7CiB9CiAKJiM0Mztib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpOwomIzQzOwogdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7CiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jCmluZGV4IDBkNmM3MWVkMmZhZTMuLmY1NzczZDQ0NzU0MjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMKQEAgLTMxLDYgJiM0MzszMSwxMSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7CiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjsKIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjsKIHN0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXI7CiYjNDM7c3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfZ2l2ZW47CiYjNDM7c3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTsKJiM0MztzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVyczsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTsKIAogI2RlZmluZSBQSURfU01BUFMgJiMzNDsvcHJvYy9zZWxmL3NtYXBzJiMzNDsKICNkZWZpbmUgVEVTVF9GSUxFICYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlJiMzNDsKQEAgLTI0MSw2ICYjNDM7MjQ2LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogCXJldHVybiBzd2FwOwogfQogCiYjNDM7LyoKJiM0MzsgKiBQYWdlIHRoZSByYW5nZSBvdXQgYW5kIHdhaXQgZm9yIHRoZSBzd2FwIGNvdW50IHRvIHNheSBzby4KJiM0MzsgKgomIzQzOyAqIFR3byB0aGluZ3MgZ2V0IGluIHRoZSB3YXkuICBNQURWX1BBR0VPVVQgaXMgYmVzdCBlZmZvcnQ6CiYjNDM7ICogc2hyaW5rX2ZvbGlvX2xpc3QoKSBsZWF2ZXMgYSBmb2xpbyBhbG9uZSB3aGVuIGl0IGNhbm5vdCByZWNsYWltIGl0IHJpZ2h0CiYjNDM7ICogYXdheSwgYW5kIG9uZSBzdGlsbCB1bmRlciB3cml0ZWJhY2sgZnJvbSBhbiBlYXJsaWVyIHBhZ2VvdXQgaXMgdGhlIGNvbW1vbgomIzQzOyAqIGNhc2UsIHNvIHRoZSBjb3VudCB0aGUgY2FsbGVyIGFza3MgZm9yIGFycml2ZXMgYSBtb21lbnQgbGF0ZXIuICBBbmQgYSByYW5nZQomIzQzOyAqIGFuIGVhcmxpZXIgY29sbGFwc2UgbGVmdCBNQURWX0hVR0VQQUdFIGlzIG9uZSBraHVnZXBhZ2VkIGlzIHN0aWxsIHdvcmtpbmcKJiM0MzsgKiBvbjogY29sbGFwc2luZyBhIHJhbmdlIHdpdGggdXAgdG8gbWF4X3B0ZXNfc3dhcCBwYWdlcyBzd2FwcGVkIG91dCBtZWFucwomIzQzOyAqIHJlYWRpbmcgdGhvc2UgcGFnZXMgYmFjayBpbiwgc28gdGhlIGRhZW1vbiB1bmRvZXMgdGhlIHBhZ2VvdXQgYXMgZmFzdCBhcyBpdAomIzQzOyAqIGlzIGFza2VkIGZvci4gIEtlZXAgdGhlIHJhbmdlIG91dCBvZiBpdHMgcmVhY2g7IHRoZSBjb2xsYXBzZSB0aGUgY2FsbGVyIHJ1bnMKJiM0MzsgKiBuZXh0IHB1dHMgTUFEVl9IVUdFUEFHRSBiYWNrLgomIzQzOyAqCiYjNDM7ICogRmFpbGluZyB0byBnZXQgdGhlIHBhZ2VzIG91dCBpcyB0aGUgbWFjaGluZSYjMzk7cyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJiMzOTtzIC0tCiYjNDM7ICogc3dhcCB0b28gc21hbGwsIHN3YXAgZnVsbCwgYSBtZW1jZyBjYXAsIGEgZm9saW8gc3RpbGwgdW5kZXIgd3JpdGViYWNrIC0tIHNvCiYjNDM7ICogY2FsbGVycyBza2lwIHJhdGhlciB0aGFuIGZhaWwuICBBbiBlcnJvciBmcm9tIG1hZHZpc2UoKSBpcyBkaWZmZXJlbnQsIGFuZAomIzQzOyAqIGVuZHMgdGhlIHJ1biBoZXJlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIHN3YXBvdXRfcmFuZ2Uodm9pZCAqcCwgdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfTk9IVUdFUEFHRSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSkmIzM0Oyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyA0MDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpJiMzNDspOwomIzQzOwkJaWYgKGNoZWNrX3N3YXAocCwgc2l6ZSkpCiYjNDM7CQkJcmV0dXJuIHRydWU7CiYjNDM7CQl1c2xlZXAoNTAgKiAxMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgKmFsbG9jX21hcHBpbmcoaW50IG5yKQogewogCXZvaWQgKnA7CkBAIC01ODMsOCAmIzQzOzYyMywxMCBAQCBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgc2l6ZV90IGxlbiwKIAkJaW50IG5yX2hwYWdlcywgaW50IGNvbGxhcF9vcmRlciwgc3RydWN0IG1lbV9vcHMgKm9wcykKIHsKIAl1bnNpZ25lZCBsb25nIGhwYWdlX3NpemUgPSBwYWdlX3NpemUgJmx0OyZsdDsgY29sbGFwX29yZGVyOwomIzQzOwkvKiBUaHJlZSBzZWNvbmRzIGFzIGEgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gdG8gY29sbGFwc2UgKi8KJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3NpemU7CiYjNDM7CWludCB0aW1lb3V0ID0gNiAmIzQzOyAyICogKGJ5dGVzIC8gKDEyOFVMICZsdDsmbHQ7IDIwKSk7CiAJaW50IGZ1bGxfc2NhbnM7Ci0JaW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi8KIAogCS8qIFNhbml0eSBjaGVjayAqLwogCWlmICghb3BzLSZndDtjaGVja19odWdlKHAsIGxlbiwgMCwgaHBhZ2Vfc2l6ZSkpCkBAIC04NTMsMTIgJiM0Mzs4OTUsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2Vfc3dhcGluX3NpbmdsZV9wdGUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3AKIAlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwogCW9wcy0mZ3Q7ZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwogCi0JaWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgcGFnZV9zaXplKSkgewomIzQzOwlpZiAoc3dhcG91dF9yYW5nZShwLCBwYWdlX3NpemUpKSB7CiAJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAl9IGVsc2UgewotCQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtODg1LDEyICYjNDM7OTI1LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvCiAJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKIAlvcHMtJmd0O2ZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKIAotCWlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgJiM0MzsgMSkgKiBwYWdlX3NpemUpKSB7CiYjNDM7CWlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkgewogCQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiAJfSBlbHNlIHsKLQkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CQlza2lwKCYjMzQ7Q291bGQgbm90IHN3YXAgb3V0JiMzNDspOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTkwMiwxMiAmIzQzOzk0MCwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqbwogCQlvcHMtJmd0O2ZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKIAkJa3NmdF9wcmludF9tc2coJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uJiMzNDssIG1heF9wdGVzX3N3YXAsCiAJCSAgICAgICBocGFnZV9wbWRfbnIpOwotCQlpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpJiMzNDspOwotCQlpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkgewomIzQzOwkJaWYgKHN3YXBvdXRfcmFuZ2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHsKIAkJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAkJfSBlbHNlIHsKLQkJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwkJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC05NzQsNiAmIzQzOzEwMTAsMTYgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMKIAl2b2lkICpwOwogCWludCBpOwogCiYjNDM7CS8qCiYjNDM7CSAqIFRoZSB0ZXN0IG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMsIHdoaWNoIGlzIGxpa2VseSB0bwomIzQzOwkgKiBmYWlsIGZvciBsYXJnZSBQTUQgc2l6ZXMuICBTa2lwIGlmIHRoZSBQTUQgc2l6ZSBpcyBvdmVyIDMyTS4KJiM0MzsJICovCiYjNDM7CWlmIChocGFnZV9wbWRfc2l6ZSAmZ3Q7ICgzMlVMICZsdDsmbHQ7IDIwKSkgewomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7JXM6IFBNRCB0b28gbGFyZ2UgZm9yIGZhdWx0LXRpbWUgVEhQIGNvbnN0cnVjdGlvblxuJiMzNDssCiYjNDM7CQkJCSAgICAgIF9fZnVuY19fKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwogCXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiAJa3NmdF9wcmludF9tc2coJiMzNDtDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xuJiMzNDspOwogCWZvciAoaSA9IDA7IGkgJmx0OyBocGFnZV9wbWRfbnI7IGkmIzQzOyYjNDM7KSB7CkBAIC0xMTY0LDYgJiM0MzsxMjEwLDcyIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMKIAlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKIH0KIAomIzQzOy8qCiYjNDM7ICogQ29udGVudCBzdGF5cyBpc29sYXRlZCB3aGlsZSBhIGNvLXNoYXJlciB3cml0ZXMgY29uY3VycmVudGx5LiBBIHNoYXJlZAomIzQzOyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlCiYjNDM7ICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXImIzM5O3Mgd3JpdGUgZ29lcyB0byBhIENvVyBjb3B5LiBUaGUKJiM0MzsgKiBjb2xsYXBzaW5nIGNoaWxkIG11c3Qgc2VlIHRoZSBwcmUtZm9yayBjb250ZW50LCB0aGUgd3JpdGluZyBwYXJlbnQgb25seQomIzQzOyAqIGl0cyBvd24gd3JpdGVzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX2ZvcmtfY293X3JhY2Uoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIHNoYXJlZCA9IDY0ICogcGFnZV9zaXplOwomIzQzOwljb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7CiYjNDM7CWludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG4gPSBzaGFyZWQgLyBwYWdlX3NpemU7CiYjNDM7CS8qIHZvbGF0aWxlOiB0aGUgbG9vcCBiZWxvdyBtdXN0IHJlYWxseSBzdG9yZSwgb24gZXZlcnkgaXRlcmF0aW9uICovCiYjNDM7CXZvbGF0aWxlIGludCAqaXA7CiYjNDM7CXZvaWQgKnA7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CWlwID0gcDsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCAwLCBzaGFyZWQpOwkJLyogc2hhcmVkIHByZWZpeCwgcHJlLWZvcmsgcGF0dGVybiAqLwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0ZvcmssIGNvbGxhcHNlIGluIHRoZSBjaGlsZCB3aGlsZSB0aGUgcGFyZW50IHJld3JpdGVzLi4uJiMzNDspOwomIzQzOwlpZiAoIWZvcmsoKSkgewomIzQzOwkJaW50IGNvbGxhcHNlX3N0YXR1czsKJiM0MzsKJiM0MzsJCW9wcy0mZ3Q7ZmF1bHQocCwgc2hhcmVkLCBocGFnZV9wbWRfc2l6ZSk7CS8qIHByaXZhdGUgcmVtYWluZGVyICovCiYjNDM7CQljLSZndDtjb2xsYXBzZSgmIzM0O0NvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlciYjMzQ7LAomIzQzOwkJCSAgICBwLCAxLCBvcHMsIHRydWUpOwomIzQzOwkJY29sbGFwc2Vfc3RhdHVzID0gZXhpdF9zdGF0dXM7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspCiYjNDM7CQkJaWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgJiM0MzsgMHhkZWFkMDAwMCkKJiM0MzsJCQkJYnJlYWs7CiYjNDM7CQlpZiAoaSA9PSBuKQomIzQzOwkJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlmYWlsKCYjMzQ7RmFpbDogY2hpbGQgY29udGVudCYjMzQ7KTsKJiM0MzsJCS8qIFRoZSBjb250ZW50IGNoZWNrIG11c3Qgbm90IGJ1cnkgYSBmYWlsZWQgY29sbGFwc2UuICovCiYjNDM7CQlpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKQomIzQzOwkJCWV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzOwomIzQzOwkJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJX2V4aXQoZXhpdF9zdGF0dXMpOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEhhbW1lciB0aGUgcGFyZW50JiMzOTtzIG93biB3cml0ZXMgb3ZlciB0aGUgc2hhcmVkIHByZWZpeC4gKi8KJiM0MzsJZm9yIChpbnQgaXQgPSAwOyBpdCAmbHQ7IDIwMDAwMDsgaXQmIzQzOyYjNDM7KQomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJCWlwW2kgKiBzdHJpZGVdID0gaSAmIzQzOyAweGJlZWYwMDAwOwomIzQzOwomIzQzOwl3YWl0KCZhbXA7d3N0YXR1cyk7CiYjNDM7CS8qIEEgY2hpbGQgdGhhdCBkaWVkIHJlYWRpbmcgdGhlIHJhY2luZyBwYWdlcyBpcyBhIGZhaWx1cmUsIG5vdCBhIHplcm8uICovCiYjNDM7CWNoaWxkX3N0YXR1cyA9IFdJRkVYSVRFRCh3c3RhdHVzKSA/IFdFWElUU1RBVFVTKHdzdGF0dXMpIDogS1NGVF9GQUlMOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uJiMzNDspOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGJlZWYwMDAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwlpZiAoaSA9PSBuKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbDogcGFyZW50IGNvbnRlbnQmIzM0Oyk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJLyogU2FtZSBhZ2Fpbjogb3VyIG93biBjaGVjayBtdXN0IG5vdCBidXJ5IHRoZSBjaGlsZCYjMzk7cyB2ZXJkaWN0LiAqLwomIzQzOwlpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKQomIzQzOwkJZXhpdF9zdGF0dXMgPSBjaGlsZF9zdGF0dXM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKIAkJCQkJICAgc3RydWN0IG1lbV9vcHMgKm9wcykKIHsKQEAgLTEyMDksNiAmIzQzOzEzMjEsMjE5IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAogCWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwogfQogCiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqLwomIzQzOyNkZWZpbmUgTUlOX01USFBfT1JERVIgMgomIzQzOwomIzQzOy8qCiYjNDM7ICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBmb3IgdGhlIG10aHBfa2h1Z2VwYWdlZCBjb250ZXh0LiAgV2hhdAomIzQzOyAqIHRoZXkgYWRkIG92ZXIgdGhlIGdlbmVyaWMgY2FzZXMgcnVuIHVuZGVyIHRoYXQgY29udGV4dCBpcyBwZXItd2luZG93CiYjNDM7ICogZGV0ZWN0aW9uOiB3aGljaCBhbGlnbmVkIHdpbmRvdyBjb2xsYXBzZWQsIGFuZCB3aGljaCBvZiBpdHMgbmVpZ2hib3VycyBkaWQKJiM0MzsgKiBub3QuICBjaGVja19odWdlKCkgYW5zd2VycyBob3cgbWFueSBmb2xpb3Mgb2YgdGhlIG9yZGVyIHRoZSByYW5nZSBob2xkcywKJiM0MzsgKiB3aGljaCBjYW5ub3QgdGVsbCBvbmUgd2luZG93IGZyb20gYW5vdGhlci4KJiM0MzsgKgomIzQzOyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgYW5kIHRoZSB0YXJnZXQgb3JkZXIgaXMgb25seQomIzQzOyAqIGVuYWJsZWQgZm9yIG1hZHZpc2UsIHNvIHRoZSBzb3VyY2VzIGFyZSBhbHdheXMgb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlCiYjNDM7ICogcHJvZHVjdCBjYW4gb25seSBoYXZlIGNvbWUgZnJvbSBraHVnZXBhZ2VkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIHBhZ2Vfc2l6ZSAmbHQ7Jmx0OyBjb2xsYXBzZV9vcmRlcjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgbXRocF9wdXNoX3RhcmdldF9vcmRlcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRhcmdldCBvcmRlciwgZm9yIG1hZHZpc2Ugb25seSwgYW5kIG5vdGhpbmcgZWxzZSBlbmFibGVkOiB0aGUKJiM0MzsJICogY2FzZXMgZmF1bHQgdGhlaXIgcmVnaW9uIGJlZm9yZSBNQURWX0hVR0VQQUdFLCBzbyB0aGUgc291cmNlcyBhcmUKJiM0MzsJICogb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCB0aGUgZmF1bHQgcGF0aCBmb3IuICBUaGF0IG1hdHRlcnMgZm9yIHRoZQomIzQzOwkgKiBjYXNlcyBidWlsdCBhcm91bmQgYSBob2xlIC0tIGEgbGFyZ2Ugc291cmNlIGZvbGlvIHdvdWxkIGZpbGwgaXQgaW4KJiM0MzsJICogYW5kIHRoZSB3aW5kb3cgd291bGQgY29sbGFwc2UgYWZ0ZXIgYWxsLgomIzQzOwkgKiBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzIGVuYWJsZXMgdGhlIHNvdXJjZSBvcmRlciBpdCB3YW50cyBvbgomIzQzOwkgKiB0b3Agb2YgdGhpcy4KJiM0MzsJICovCiYjNDM7CXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbY29sbGFwc2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfTUFEVklTRTsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHdpbmRvd19jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbikKJiM0Mzt7CiYjNDM7CXJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGxlbiwgY29sbGFwc2Vfb3JkZXIsCiYjNDM7CQkJCQkgICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7CiYjNDM7fQomIzQzOwomIzQzOy8qIE5vIGFsaWduZWQgd2luZG93IGluIFtwLCBwICYjNDM7IGxlbikgaXMgYmFja2VkIGF0IHRoZSB0YXJnZXQgb3JkZXIuICovCiYjNDM7c3RhdGljIGJvb2wgd2luZG93X25vdF9jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbikKJiM0Mzt7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7CiYjNDM7CWNoYXIgKmFkZHIgPSBwOwomIzQzOwomIzQzOwlmb3IgKDsgbGVuICZndDs9IHdpbmRvdzsgYWRkciAmIzQzOz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7CiYjNDM7CQlpZiAod2luZG93X2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wga2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcyh2b2lkKQomIzQzO3sKJiM0MzsJLyogV2FpdCB1cCB0byAzMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi8KJiM0MzsJcmV0dXJuIGtodWdlcGFnZWRfZnVsbF9wYXNzKDMwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKJiM0MzsJCQkJCSBzdHJ1Y3QgbWVtX29wcyAqb3BzKQomIzQzO3sKJiM0MzsJc2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7CiYjNDM7CWlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxuJiMzNDspOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSAmYW1wOyZhbXA7CiYjNDM7CQkgd2luZG93X25vdF9jb2xsYXBzZWQocCwgd2luZG93KSAmYW1wOyZhbXA7CiYjNDM7CQkgd2luZG93X25vdF9jb2xsYXBzZWQocCAmIzQzOyAyICogd2luZG93LAomIzQzOwkJCQkgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwltdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgcGFnZV9zaXplKTsKJiM0MzsJaWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIHdpbmRvdyB3aXRoIHNpbmdsZSBQVEUgZW50cnkgcHJlc2VudC4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBtdGhwX3dpbmRvd19zaXplKCkpKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfbWVtb3J5KHAsIDAsIHBhZ2Vfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKJiM0MzsJCQkJCSBzdHJ1Y3QgbWVtX29wcyAqb3BzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJc2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwlzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwOwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTsKJiM0MzsJaWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCB3aW5kb3cpICZhbXA7JmFtcDsKJiM0MzsJCSB3aW5kb3dfbm90X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTsKJiM0MzsJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CWludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSOwomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzOwomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwkvKiBTb3VyY2VzIG11c3QgYmUgYSBzdXBwb3J0ZWQgbVRIUCBvcmRlciBzdHJpY3RseSBiZWxvdyB0aGUgdGFyZ2V0LiAqLwomIzQzOwlpZiAoc291cmNlX29yZGVyICZndDs9IGNvbGxhcHNlX29yZGVyIHx8CiYjNDM7CSAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBzb3VyY2Vfb3JkZXIpKSkgewomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7JXM6IG5vIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcbiYjMzQ7LAomIzQzOwkJCQkgICAgICBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwomIzQzOwkvKiBGYXVsdCB0aGUgd2hvbGUgcmVnaW9uIGFzIG9yZGVyLUBzb3VyY2Vfb3JkZXIgZm9saW9zLiAqLwomIzQzOwlzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUzsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBvcmRlciBpcyBlbmFibGVkIGFuZCBzdXBwb3J0ZWQsIGJ1dCB0aGUgYWxsb2NhdG9yIGNhbiBzdGlsbCBmYWxsCiYjNDM7CSAqIGJhY2sgdW5kZXIgZnJhZ21lbnRhdGlvbi4gIFRoYXQgbGVhdmVzIG5vdGhpbmcgdG8gY29sbGFwc2UgZnJvbSwKJiM0MzsJICogd2hpY2ggaXMgdGhlIG1hY2hpbmUmIzM5O3MgYW5zd2VyIHJhdGhlciB0aGFuIGEgcmVhc29uIHRvIGVuZCB0aGUgcnVuLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsCiYjNDM7CQkJCQkgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O05vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi4mIzM0Oywgc291cmNlX29yZGVyKTsKJiM0MzsJCXNraXAoJiMzNDtTa2lwJiMzNDspOwomIzQzOwkJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uJiMzNDssCiYjNDM7CQkgICAgICAgc291cmNlX29yZGVyKTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwomIzQzOwl2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKIHsKIAlmcHJpbnRmKHN0ZGVyciwgJiMzNDtcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdICZsdDt0ZXN0IHR5cGUmZ3Q7IFtkaXJdXG5cbiYjMzQ7KTsKQEAgLTEyMjYsMTEgJiM0MzsxNTUxLDE1IEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCiAJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdC1zOiBtVEhQIHNpemUsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxuJiMzNDspOwogCWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cbiYjMzQ7KTsKIAlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBEZWZhdWx0cyB0byBldmVyeSBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBXaXRoIC1zLCAtcyBuYW1lcyB0aGUgbVRIUCBzb3VyY2Ugb3JkZXIgZm9yIHRoZVxuJiMzNDspOwomIzQzOwlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXG4mIzM0Oyk7CiAJZXhpdCgxKTsKIH0KIAogc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKJiM0MzsJYm9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlOwogCWludCBvcHQ7CiAJY2hhciAqYnVmOwogCWNvbnN0IGNoYXIgKnRva2VuOwpAQCAtMTI0Miw2ICYjNDM7MTU3MSw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQlicmVhazsKIAkJY2FzZSAmIzM5O2MmIzM5OzoKIAkJCWNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpOwomIzQzOwkJCWNvbGxhcHNlX29yZGVyX2dpdmVuID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7aCYjMzk7OgogCQlkZWZhdWx0OgpAQCAtMTI0OSwxMiAmIzQzOzE1NzksMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJfQogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyCiYjNDM7CSAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGFub25fb3JkZXIgJmx0OyAwIHx8IGFub25fb3JkZXIgJmd0OyBocGFnZV9wbWRfb3JkZXIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXG4mIzM0OywKJiM0MzsJCQkJICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTsKJiM0MzsJaWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuICZhbXA7JmFtcDsKJiM0MzsJICAgIChjb2xsYXBzZV9vcmRlciAmbHQ7PSAwIHx8IGNvbGxhcHNlX29yZGVyICZndDsgaHBhZ2VfcG1kX29yZGVyKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0Oy1jIHRha2VzIGFuIG9yZGVyIGluIDEuLiVkLCBub3QgJWRcbiYjMzQ7LAomIzQzOwkJCQkgICBocGFnZV9wbWRfb3JkZXIsIGNvbGxhcHNlX29yZGVyKTsKJiM0MzsKIAlhcmd2ICYjNDM7PSBvcHRpbmQ7CiAJYXJnYyAtPSBvcHRpbmQ7CiAKIAlpZiAoYXJnYyA9PSAwKSB7Ci0JCS8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiYjNDM7CQkvKiBFdmVyeXRoaW5nIHRoYXQgbmVlZHMgbm8gYXJndW1lbnQgb2YgaXRzIG93bjogYW5vbiwgZXZlcnkgY29udGV4dCAqLwogCQlraHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX2todWdlcGFnZWRfY29udGV4dDsKJiM0MzsJCW10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gICZhbXA7X19tdGhwX2todWdlcGFnZWRfY29udGV4dDsKIAkJbWFkdmlzZV9jb250ZXh0ID0gICZhbXA7X19tYWR2aXNlX2NvbnRleHQ7CiAJCWFub25fb3BzID0gJmFtcDtfX2Fub25fb3BzOwogCQlyZXR1cm47CkBAIC0xMjY1LDEzICYjNDM7MTYwOCwxOSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCiAJaWYgKCFzdHJjbXAodG9rZW4sICYjMzQ7YWxsJiMzNDspKSB7CiAJCWtodWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fa2h1Z2VwYWdlZF9jb250ZXh0OwomIzQzOwkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0OwogCQltYWR2aXNlX2NvbnRleHQgPSAgJmFtcDtfX21hZHZpc2VfY29udGV4dDsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiAmIzM0O2FsbCYjMzQ7IHN3ZWVwcyB0aGUgbVRIUCBjb250ZXh0IGluLCBidXQgaXQgb25seSBoYXMgYW5vbgomIzQzOwkJICogY2FzZXM6IHN0ZXAgaXQgYXNpZGUgZm9yIHRoZSBvdGhlciBtZW1fdHlwZXMgcmF0aGVyIHRoYW4KJiM0MzsJCSAqIHJlZnVzaW5nIHRoZSB3aG9sZSBydW4uCiYjNDM7CQkgKi8KJiM0MzsJCW10aHBfY29udGV4dF9pbXBsaWVkID0gdHJ1ZTsKIAl9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sICYjMzQ7a2h1Z2VwYWdlZCYjMzQ7KSkgewogCQlraHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX2todWdlcGFnZWRfY29udGV4dDsKIAl9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sICYjMzQ7bXRocF9raHVnZXBhZ2VkJiMzNDspKSB7CiAJCW10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gICZhbXA7X19tdGhwX2todWdlcGFnZWRfY29udGV4dDsKLQkJaWYgKGNvbGxhcHNlX29yZGVyICZsdDs9IDAgfHwgY29sbGFwc2Vfb3JkZXIgJmd0Oz0gaHBhZ2VfcG1kX29yZGVyKQotCQkJdXNhZ2UoKTsKIAl9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sICYjMzQ7bWFkdmlzZSYjMzQ7KSkgewogCQltYWR2aXNlX2NvbnRleHQgPSAgJmFtcDtfX21hZHZpc2VfY29udGV4dDsKIAl9IGVsc2UgewpAQCAtMTI4NywyMCAmIzQzOzE2MzYsMjAgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICAmYW1wO19fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wczsKIAkJYW5vbl9vcHMgPSAmYW1wO19fYW5vbl9vcHM7CiAJCXNobWVtX29wcyA9ICZhbXA7X19zaG1lbV9vcHM7Ci0JCWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkKLQkJCXVzYWdlKCk7CiAJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDthbm9uJiMzNDspKSB7CiAJCWFub25fb3BzID0gJmFtcDtfX2Fub25fb3BzOwogCX0gZWxzZSBpZiAoIXN0cmNtcChidWYsICYjMzQ7ZmlsZSYjMzQ7KSkgewogCQlyZWFkX29ubHlfZmlsZV9vcHMgPSAgJmFtcDtfX3JlYWRfb25seV9maWxlX29wczsKIAkJcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzID0gICZhbXA7X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7CiAJCXJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgJmFtcDtfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7Ci0JCWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkKJiM0MzsJCWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCAmYW1wOyZhbXA7ICFtdGhwX2NvbnRleHRfaW1wbGllZCkKIAkJCXVzYWdlKCk7CiYjNDM7CQltdGhwX2todWdlcGFnZWRfY29udGV4dCA9IE5VTEw7CiAJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDtzaG1lbSYjMzQ7KSkgewogCQlzaG1lbV9vcHMgPSAmYW1wO19fc2htZW1fb3BzOwotCQlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpCiYjNDM7CQlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgJmFtcDsmYW1wOyAhbXRocF9jb250ZXh0X2ltcGxpZWQpCiAJCQl1c2FnZSgpOwomIzQzOwkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMOwogCX0gZWxzZSB7CiAJCXVzYWdlKCk7CiAJfQpAQCAtMTMyMiw5ICYjNDM7MTY3MSwxNCBAQCBzdHJ1Y3QgdGVzdF9jYXNlIHsKIAlzdHJ1Y3QgbWVtX29wcyAqb3BzOwogCWNvbnN0IGNoYXIgKmRlc2M7CiAJdGVzdF9mbiBmbjsKJiM0MzsJaW50IG9yZGVyOwkJLyogbVRIUCBjb250ZXh0czogdGhlIGNvbGxhcHNlIG9yZGVyICovCiB9OwogCi0jZGVmaW5lIE1BWF9URVNUX0NBU0VTIDY0CiYjNDM7LyoKJiM0MzsgKiBFbm91Z2ggZm9yIGV2ZXJ5IGNhc2UgYXQgZXZlcnkgb3JkZXIgdGhlIGtlcm5lbCBvZmZlcnM6IHRoZSBtVEhQIGNvbnRleHQKJiM0MzsgKiBydW5zIGl0cyBjYXNlcyBvbmNlIHBlciBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIE1BWF9URVNUX0NBU0VTIDI1Ngogc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107CiBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7CiAKQEAgLTEzMzcsNiAmIzQzOzE2OTEsNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7CiAJCQkub3BzCT0gbywJCQkJCVwKIAkJCS5kZXNjCT0gI3QsCQkJCQlcCiAJCQkuZm4JPSB0LAkJCQkJXAomIzQzOwkJCS5vcmRlcgk9IGNvbGxhcHNlX29yZGVyLAkJCVwKIAkJfTsJCQkJCQkJXAogCX0JCQkJCQkJCVwKIAl9IHdoaWxlICgwKQpAQCAtMTM3Nyw4ICYjNDM7MTczMiw4MyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAKIAlwYXJzZV90ZXN0X3R5cGUoYXJnYywgYXJndik7CiAKJiM0MzsJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIG9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7CiYjNDM7CiYjNDM7CQlpZiAoY29sbGFwc2Vfb3JkZXJfZ2l2ZW4pIHsKJiM0MzsJCQkvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi8KJiM0MzsJCQlpZiAoY29sbGFwc2Vfb3JkZXIgJmd0Oz0gaHBhZ2VfcG1kX29yZGVyKQomIzQzOwkJCQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstYyB0YWtlcyBhbiBvcmRlciBiZWxvdyB0aGUgUE1EIG9yZGVyICglZClcbiYjMzQ7LAomIzQzOwkJCQkJCSAgIGhwYWdlX3BtZF9vcmRlcik7CiYjNDM7CQkJaWYgKCEob3JkZXJzICZhbXA7ICgxVUwgJmx0OyZsdDsgY29sbGFwc2Vfb3JkZXIpKSkKJiM0MzsJCQkJa3NmdF9leGl0X3NraXAoJiMzNDtPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcbiYjMzQ7LAomIzQzOwkJCQkJICAgICAgIGNvbGxhcHNlX29yZGVyKTsKJiM0MzsJCQlpZiAoY29sbGFwc2Vfb3JkZXIgJmx0Oz0gYW5vbl9vcmRlcikKJiM0MzsJCQkJa3NmdF9leGl0X3NraXAoJiMzNDstYyAlZCBuZWVkcyBhIHNvdXJjZSBvcmRlciBiZWxvdyBpdCwgLXMgc2F5cyAlZFxuJiMzNDssCiYjNDM7CQkJCQkgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpOwomIzQzOwkJCWNvbGxhcHNlX29yZGVyc1tucl9jb2xsYXBzZV9vcmRlcnMmIzQzOyYjNDM7XSA9IGNvbGxhcHNlX29yZGVyOwomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQkvKgomIzQzOwkJCSAqIE90aGVyd2lzZSBldmVyeSBvcmRlciBhIGNvbGxhcHNlIGNvdWxkIHByb2R1Y2UuICAtcwomIzQzOwkJCSAqIG1ha2VzIHRoZSBmYXVsdCBwYXRoIGhhbmQgb3V0IGZvbGlvcyBvZiB0aGF0IG9yZGVyLAomIzQzOwkJCSAqIHNvIGEgdGFyZ2V0IGF0IG9yIGJlbG93IGl0IGhhcyBub3RoaW5nIHRvIGNvbGxhcHNlOgomIzQzOwkJCSAqIHRoZSBzb3VyY2VzIGFyZSBhbHJlYWR5IHRoZSBzaXplIGJlaW5nIGFza2VkIGZvci4KJiM0MzsJCQkgKi8KJiM0MzsJCQlpbnQgZmlyc3QgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciAmIzQzOyAxIDogTUlOX01USFBfT1JERVI7CiYjNDM7CiYjNDM7CQkJaWYgKGZpcnN0ICZsdDsgTUlOX01USFBfT1JERVIpCiYjNDM7CQkJCWZpcnN0ID0gTUlOX01USFBfT1JERVI7CiYjNDM7CQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpICZsdDsgaHBhZ2VfcG1kX29yZGVyOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCQlpZiAob3JkZXJzICZhbXA7ICgxVUwgJmx0OyZsdDsgaSkpCiYjNDM7CQkJCQljb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzJiM0MzsmIzQzO10gPSBpOwomIzQzOwkJCX0KJiM0MzsJCQlpZiAoIW5yX2NvbGxhcHNlX29yZGVycykKJiM0MzsJCQkJa3NmdF9wcmludF9tc2coJiMzNDttVEhQIGNhc2VzIHNraXBwZWQ6IG5vIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2VcbiYjMzQ7KTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHsKJiM0MzsJCXBhZ2VtYXBfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJCWlmIChwYWdlbWFwX2ZkICZsdDsgMCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcCkmIzM0Oyk7CiYjNDM7CQlrcGFnZWZsYWdzX2ZkID0gb3BlbigmIzM0Oy9wcm9jL2twYWdlZmxhZ3MmIzM0OywgT19SRE9OTFkpOwomIzQzOwkJaWYgKGtwYWdlZmxhZ3NfZmQgJmx0OyAwKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O29wZW4oL3Byb2Mva3BhZ2VmbGFncykmIzM0Oyk7CiYjNDM7CX0KJiM0MzsKIAlzZXRidWYoc3Rkb3V0LCBOVUxMKTsKIAomIzQzOwkvKgomIzQzOwkgKiBUaGUgcGFnZSBjYWNoZSBjYXBzIGZvbGlvIG9yZGVyIGF0IE1BWF9QQUdFQ0FDSEVfT1JERVIsIHdoaWNoCiYjNDM7CSAqIHhhc19zcGxpdF9hbGxvYygpIHB1dHMgYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy4KJiM0MzsJICogQSBQTUQtc2l6ZWQgcGFnZSBjYWNoZSBmb2xpbyBpcyB0aGVuIGltcG9zc2libGUsIHNvIHRoZSBrZXJuZWwKJiM0MzsJICogcmVmdXNlcyB0aGVzZSBjb2xsYXBzZXMgYnkgZGVzaWduIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuCiYjNDM7CSAqCiYjNDM7CSAqIFRoZSBjYXAgaXMgb25lIGdsb2JhbCwgc28gaXQgcnVsZXMgb3V0IGV2ZXJ5IGZpbGUgbWFwcGluZywgbm90IGp1c3QKJiM0MzsJICogc2htZW06IHNobWVtX2h1Z2VfZ2xvYmFsX2VuYWJsZWQoKSBkcm9wcyB0aGUgUE1EIG9yZGVyIGZyb20gd2hhdCBpdAomIzQzOwkgKiBhbGxvd3MsIGFuZCBmaWxlX3RocF9lbmFibGVkKCkgcmVmdXNlcyBhIHJlZ3VsYXIgZmlsZSB3aG9zZSBtYXBwaW5nCiYjNDM7CSAqIGNhbm5vdCBob2xkIGEgUE1EIGZvbGlvLgomIzQzOwkgKgomIzQzOwkgKiBUaGUgcGVyLW9yZGVyIHNobWVtX2VuYWJsZWQgY29udHJvbCBiZWxvdyBpcyB3aGF0IG1ha2VzIHRoZSBjYXAKJiM0MzsJICogcmVhZGFibGU6IGl0IGlzIGNyZWF0ZWQgZm9yIHRoZSBvcmRlcnMgaW4gVEhQX09SREVSU19BTExfRklMRV9ERUZBVUxULAomIzQzOwkgKiB3aGljaCBpcyB0aGUgY2FwIGFuZCBub3RoaW5nIGVsc2UsIHNvIHdoZXRoZXIgdGhlIFBNRCBvcmRlciBoYXMgb25lCiYjNDM7CSAqIGFuc3dlcnMgZm9yIGEgcmVndWxhciBmaWxlIGFzIG11Y2ggYXMgZm9yIHNobWVtLgomIzQzOwkgKi8KJiM0MzsJaWYgKCEodGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IGhwYWdlX3BtZF9vcmRlcikpKSB7CiYjNDM7CQlpZiAoc2htZW1fb3BzKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cbiYjMzQ7KTsKJiM0MzsJCQlzaG1lbV9vcHMgPSBOVUxMOwomIzQzOwkJfQomIzQzOwkJaWYgKHJlYWRfb25seV9maWxlX29wcykgewomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7bm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcbiYjMzQ7KTsKJiM0MzsJCQlyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMOwomIzQzOwkJCXJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7CiYjNDM7CQkJcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQlpZiAoIWFub25fb3BzICZhbXA7JmFtcDsgIXNobWVtX29wcyAmYW1wOyZhbXA7ICFyZWFkX29ubHlfZmlsZV9vcHMpCiYjNDM7CQkJa3NmdF9leGl0X3NraXAoJiMzNDtOb3RoaW5nIGxlZnQgdG8gY29sbGFwc2UgaW50b1xuJiMzNDspOwomIzQzOwl9CiYjNDM7CiAJZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxOwogCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODsKIAlkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjsKQEAgLTEzOTYsNyAmIzQzOzE4MjYsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgbnJfY29sbGFwc2Vfb3JkZXJzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07CiYjNDM7CQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwomIzQzOwkJVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CX0KJiM0MzsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTQwNCwxMCAmIzQzOzE4NDQsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJVEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7CiAKIAlURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCi0JVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKIAogCVRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7CkBAIC0xNDYzLDYgJiM0MzsxOTAxLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKIAlURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTQ3OCw3ICYjNDM7MTkxOSwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBucl90ZXN0X2Nhc2VzOyBpJiM0MzsmIzQzOykgewogCQlzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gJmFtcDt0ZXN0X2Nhc2VzW2ldOwogCi0JCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXG4mIzM0OywgdC0mZ3Q7ZGVzYywgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJaWYgKHQtJmd0O2N0eCA9PSAmYW1wO19fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHsKJiM0MzsJCQljb2xsYXBzZV9vcmRlciA9IHQtJmd0O29yZGVyOwomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMsIG9yZGVyICVkKVxuJiMzNDssCiYjNDM7CQkJCSAgICAgICB0LSZndDtkZXNjLCB0LSZndDtjdHgtJmd0O25hbWUsIHQtJmd0O29wcy0mZ3Q7bmFtZSwKJiM0MzsJCQkJICAgICAgIHQtJmd0O29yZGVyKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtcbiMgUnVuIHRlc3Q6ICVzICglczolcylcbiYjMzQ7LCB0LSZndDtkZXNjLAomIzQzOwkJCQkgICAgICAgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJfQogCQl0LSZndDtmbih0LSZndDtjdHgsIHQtJmd0O29wcyk7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjM2MDFjMDMwZDQzZTUKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYwpAQCAtMCwwICYjNDM7MSw2MTAgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICoga2h1Z2VwYWdlZCByYWNlIGhhcm5lc3MuCiYjNDM7ICoKJiM0MzsgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGlucwomIzQzOyAqIChndXBfdGVzdCksIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRCBvdmVyIHRoZSBzYW1lIHJhbmdlcywgaW4KJiM0MzsgKiBvbmUgb2YgdGhyZWUgZHJpdmVyIG1vZGVzOgomIzQzOyAqCiYjNDM7ICogICBzdGVwcGVkCWtodWdlcGFnZWQsIG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lIHRocm91Z2gKJiM0MzsgKgkJa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSwgc28gYSBzdGVwIGNvdmVycyBhIGtub3duIGV4dGVudDsKJiM0MzsgKiAgIGZyZWUJa2h1Z2VwYWdlZCBsZWZ0IHRvIHJ1biAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCksIGZvciBzb2FrOwomIzQzOyAqICAgbWFkdmlzZQlNQURWX0NPTExBUFNFIGluIGEgbG9vcC4KJiM0MzsgKgomIzQzOyAqIEFsbCBhbm9uIFRIUCBvcmRlcnMgYXJlIGVuYWJsZWQgKGluaGVyaXQpLiAgT2NjdXBhbmN5IHJ1bnMgYXQgYm90aCBlbmRzCiYjNDM7ICogb2Ygd2hhdCBtVEhQIGNvbGxhcHNlIHN1cHBvcnRzOiBtYXhfcHRlc19ub25lIDAsIHdoZXJlIGEgd2luZG93IG11c3QgYmUKJiM0MzsgKiBmdWxseSBwb3B1bGF0ZWQsIGFuZCBIUEFHRV9QTURfTlIgLSAxLCB3aGVyZSBhIHdpbmRvdyBmdWxsIG9mIGhvbGVzCiYjNDM7ICogY29sbGFwc2VzIHRvby4gIFRoZSBob2xlcyBhcmUgbm90IGNvcGllZCBmcm9tIGFueXdoZXJlIC0tIHRoZXkgYXJlCiYjNDM7ICogemVyby1maWxsZWQsIGFuZCByZS1jaGVja2VkIHVuZGVyIHRoZSBwYWdlIHRhYmxlIGxvY2sgYXQgaW5zdGFsbCB0aW1lIGluCiYjNDM7ICogY2FzZSBhIHJhY2luZyBmYXVsdCBnb3QgdGhlcmUgZmlyc3QuCiYjNDM7ICoKJiM0MzsgKiAtcCBhZGRzIG1lbW9yeSBwcmVzc3VyZSB0byBhbnkgb2YgdGhlIGFib3ZlOiBNQURWX1BBR0VPVVQgY3ljbGluZwomIzQzOyAqIG9uIGEgZGVkaWNhdGVkIG5laWdoYm9yIHJlZ2lvbiAoc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm47IHNraXBwZWQKJiM0MzsgKiB3aXRoIGEgbm90ZSB3aGVuIHRoZSBob3N0IGhhcyBubyBzd2FwKSBhbmQgYSBjb21wYWN0X21lbW9yeSB0cmlnZ2VyCiYjNDM7ICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UmIzM5O3MgZnJlZXplCiYjNDM7ICogd2l0aCByZWZjb3VudCBlbGV2YXRpb24gYW5kIG1pZ3JhdGlvbiBlbnRyaWVzIG9mIGl0cyBvd24pLgomIzQzOyAqCiYjNDM7ICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yCiYjNDM7ICogemVybyAoTUFEVl9ET05UTkVFRCksIG5ldmVyIGFueXRoaW5nIGVsc2UuICBUaGUgZmF1bHRlcnMgYW5kIHRoZSBmb3JrCiYjNDM7ICogY2hpbGRyZW4gY2hlY2sgdGhhdCBjb250aW51b3VzbHksIGEgZmluYWwgc3dlZXAgY2hlY2tzIGl0IG9uY2UgbW9yZSwgcGx1cwomIzQzOyAqIHdoYXRldmVyIERFQlVHX1ZNIC8gcGFnZV90YWJsZV9jaGVjayAvIEtBU0FOIC8gbG9ja2RlcCByZXBvcnQgaW4KJiM0MzsgKiBkbWVzZywgd2hpY2ggdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBpbnNwZWN0LgomIzQzOyAqLwomIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0UKJiM0MzsjaW5jbHVkZSAmbHQ7ZXJybm8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7cHRocmVhZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdGltZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvd2FpdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzZWxmdGVzdC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtX3V0aWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0Oy4uLy4uLy4uLy4uL21tL2d1cF90ZXN0LmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgQkFTRV9BRERSCSgodm9pZCAqKSgxVUwgJmx0OyZsdDsgMzApKQomIzQzOwomIzQzOy8qCiYjNDM7ICogU2hhcmVkIHBsYXlncm91bmQgZm9yIGZhdWx0cy9waW5zL2ZvcmsvZG9udG5lZWQ6IHNldmVyYWwgUE1ELXNpemVkCiYjNDM7ICogYXJlYXMgdGhlIHJhY2luZyB0aHJlYWRzIHNwcmVhZCBhY3Jvc3MsIHBsdXMgb25lIGFyZWEgb3duZWQgYnkgdGhlCiYjNDM7ICogbXJlbWFwIHRocmVhZC4gTW9yZSBhcmVhcyBtZWFucyBtb3JlIGluZGVwZW5kZW50IHJlZ2lvbnMgY29sbGFwc2luZwomIzQzOyAqIGF0IG9uY2U7IHRoZSBkZWZhdWx0IHN1aXRzIGEgbm9ybWFsIG1hY2hpbmUuIE9uIGEgbWVtb3J5LWNvbnN0cmFpbmVkCiYjNDM7ICogaG9zdCAtLSBvciB1bmRlciBlbXVsYXRpb24sIHdoZXJlIGEgNTEyTSBQTUQgKGFybTY0LzY0SykgbWFrZXMgdGhlCiYjNDM7ICogZGVmYXVsdCBwbGF5Z3JvdW5kIG11bHRpLWdpZ2FieXRlIC0tIHBhc3MgLWEgdG8gc2hyaW5rIGl0LgomIzQzOyAqLwomIzQzOyNkZWZpbmUgREVGQVVMVF9TSEFSRURfQVJFQVMJMwomIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzOwomIzQzO3N0YXRpYyBpbnQgbnJfYXJlYXM7CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplOwomIzQzO3N0YXRpYyBjaGFyICpyZWdpb247CQkvKiBOUl9BUkVBUyAqIGhwYWdlX3BtZF9zaXplICovCiYjNDM7c3RhdGljIGNoYXIgKm1yZW1hcF9hcmVhOwkvKiByZWdpb24gJiM0MzsgTlJfU0hBUkVEX0FSRUFTIGFyZWFzICovCiYjNDM7c3RhdGljIGNoYXIgKm1yZW1hcF9zY3JhdGNoOwkvKiB3ZWxsIGFib3ZlIHRoZSByZWdpb24gKi8KJiM0MztzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhOwkvKiAtcDogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqLwomIzQzO3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplOwomIzQzO3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7CiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBzdG9wOwomIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkOwomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHZhbCA9ICh1bnNpZ25lZCBpbnQpcGFnZV9pZHggKiAyNjU0NDM1NzYxVTsKJiM0MzsKJiM0MzsJcmV0dXJuIHZhbCA/IHZhbCA6IDE7CS8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqLwomIzQzO30KJiM0MzsKJiM0MzsvKiBaZXJvIG1lYW5zIG5ldmVyIHdyaXR0ZW47IGFueXRoaW5nIGVsc2UgbXVzdCBiZSB0aGlzIHBhZ2UmIzM5O3MgcGF0dGVybiAqLwomIzQzO3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbCkKJiM0Mzt7CiYjNDM7CSp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpOwomIzQzOwomIzQzOwlyZXR1cm4gKnZhbCAmYW1wOyZhbXA7ICp2YWwgIT0gcGF0dGVybihwYWdlX2lkeCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCB2YWw7CiYjNDM7CiYjNDM7CWlmIChwYWdlX2lzX2NvcnJ1cHQocGFnZV9pZHgsICZhbXA7dmFsKSkgewomIzQzOwkJY29ycnVwdGVkID0gMTsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxuJiMzNDssCiYjNDM7CQkJICAgICAgIHBhZ2VfaWR4LCB2YWwsIHBhdHRlcm4ocGFnZV9pZHgpKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUGFnZXMgbGVmdCBmcm9tIEBwYWdlX2lkeCwgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJiMzOTtzIGFyZWEgKi8KJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBsZWZ0ID0gc2hhcmVkX3BhZ2VzKCkgLSBwYWdlX2lkeDsKJiM0MzsKJiM0MzsJcmV0dXJuIHdhbnQgJmx0OyBsZWZ0ID8gd2FudCA6IGxlZnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsKJiM0MzsJCWlmIChyYW5kX3IoJmFtcDtzZWVkKSAmYW1wOyAxKQomIzQzOwkJCSoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPQomIzQzOwkJCQlwYXR0ZXJuKHBhZ2VfaWR4KTsKJiM0MzsJCWVsc2UKJiM0MzsJCQljaGVja19wYWdlKHBhZ2VfaWR4KTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgJmx0OyZsdDsgKHJhbmRfcigmYW1wO3NlZWQpICUgNik7CS8qIDEuLjMyIHBhZ2VzICovCiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYSB6YXAKJiM0MzsJCSAqIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZSByZWNsYWltCiYjNDM7CQkgKiAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSB0aGUgdGFibGUgdW5kZXIgYQomIzQzOwkJICogY29sbGFwc2UgdGhhdCBpcyBtaWR3YXkgdGhyb3VnaCBpdC4gIFN1Yi10YWJsZSB6YXBzIG5ldmVyCiYjNDM7CQkgKiByZWFjaCB0aGF0IHBhdGguCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghKHJhbmRfcigmYW1wO3NlZWQpICUgNjQpKSB7CiYjNDM7CQkJdW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggLwomIzQzOwkJCQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJCQltYWR2aXNlKHJlZ2lvbiAmIzQzOyBhcmVhICogaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJbWFkdmlzZShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUsCiYjNDM7CQkJCXJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLAomIzQzOwkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0KJiM0MzsJCXVzbGVlcChyYW5kX3IoJmFtcDtzZWVkKSAlIDUwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJc3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9OwomIzQzOwkJdW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZSgmYW1wO3NlZWQpOwomIzQzOwomIzQzOwkJdW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpOwomIzQzOwomIzQzOwkJZ3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTsKJiM0MzsJCWd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7CiYjNDM7CQlndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjsKJiM0MzsJCWd1cC5ndXBfZmxhZ3MgPSAxOwkvKiBGT0xMX1dSSVRFICovCiYjNDM7CQkvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovCiYjNDM7CQlpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgJmFtcDtndXApOwomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQlwaWRfdCBwaWQgPSBmb3JrKCk7CiYjNDM7CiYjNDM7CQlpZiAocGlkID09IDApIHsKJiM0MzsJCQl1bnNpZ25lZCBpbnQgdmFsOwomIzQzOwkJCWludCBiYWQgPSAwOwomIzQzOwomIzQzOwkJCS8qCiYjNDM7CQkJICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaGF2ZSBoZWxkCiYjNDM7CQkJICogc3Rkb3V0JiMzOTtzIGxvY2sgd2hlbiB3ZSBmb3JrZWQsIGFuZCBwcmludGluZyB1bmRlciBhbgomIzQzOwkJCSAqIGluaGVyaXRlZCBsb2NrIGhhbmdzLiAgVGhlIHBhcmVudCByZXBvcnRzIHdoYXQgdGhlCiYjNDM7CQkJICogZXhpdCBzdGF0dXMgc2F5cy4KJiM0MzsJCQkgKi8KJiM0MzsJCQlmb3IgKGludCBpID0gMDsgaSAmbHQ7IDE2OyBpJiM0MzsmIzQzOykKJiM0MzsJCQkJYmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoJmFtcDtzZWVkKSwgJmFtcDt2YWwpOwomIzQzOwkJCV9leGl0KGJhZCk7CiYjNDM7CQl9CiYjNDM7CQlpZiAocGlkICZndDsgMCkgewomIzQzOwkJCWludCB3c3RhdHVzOwomIzQzOwomIzQzOwkJCWlmICh3YWl0cGlkKHBpZCwgJmFtcDt3c3RhdHVzLCAwKSAmbHQ7IDApCiYjNDM7CQkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O3dhaXRwaWQoKSYjMzQ7KTsKJiM0MzsJCQkvKiBBIGNoaWxkIGtpbGxlZCBvbiB0aGUgcmVhZCBjb3VudHMgdG9vLCBub3QganVzdCBpdHMgZXhpdCBjb2RlLiAqLwomIzQzOwkJCWlmICghV0lGRVhJVEVEKHdzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHdzdGF0dXMpKQomIzQzOwkJCQljb3JydXB0ZWQgPSAxOwomIzQzOwkJfQomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJdm9pZCAqcDsKJiM0MzsKJiM0MzsJCXAgPSBtcmVtYXAobXJlbWFwX2FyZWEsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpOwomIzQzOwkJaWYgKHAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttcmVtYXAoKSBhd2F5JiMzNDspOwomIzQzOwkJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyA4OyBpJiM0MzsmIzQzOykKJiM0MzsJCQltcmVtYXBfc2NyYXRjaFsocmFuZF9yKCZhbXA7c2VlZCkgJQomIzQzOwkJCQkoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxOwomIzQzOwkJcCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCSAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7CiYjNDM7CQlpZiAocCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21yZW1hcCgpIGJhY2smIzM0Oyk7CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiAtcDogc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm4gb24gYSByZWdpb24gb2Ygb3VyIG93bi4gVGhlIGNvbnRlbnQKJiM0MzsgKiBjaGVjayBpcyBleGFjdDogYSBwYWdlIG91dCBhbmQgYmFjayB0aHJvdWdoIHN3YXAgbXVzdCBwcmVzZXJ2ZSB0aGUKJiM0MzsgKiBwYXR0ZXJuLCBhbmQgbm90aGluZyBlbHNlIGV2ZXIgd3JpdGVzIGhlcmUuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgKnBhZ2VvdXRfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG5yOyBpJiM0MzsmIzQzOykKJiM0MzsJCSoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzOyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJbWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBuciAmYW1wOyZhbXA7ICFzdG9wOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCXVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgJiM0MzsKJiM0MzsJCQkJCQkJICAgICBpICogcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJCQlpZiAodmFsICE9IHBhdHRlcm4oaSkpIHsKJiM0MzsJCQkJY29ycnVwdGVkID0gMTsKJiM0MzsJCQkJa3NmdF9wcmludF9tc2coJiMzNDtQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcbiYjMzQ7LAomIzQzOwkJCQkJICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzOy8qIC1wOiBjb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIG91dCBmcm9tIHVuZGVyIHVzLiAqLwomIzQzO3N0YXRpYyB2b2lkICpjb21wYWN0b3JfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CWludCBmZCA9IG9wZW4oJiMzNDsvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnkmIzM0OywgT19XUk9OTFkpOwomIzQzOwomIzQzOwlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O05vIGNvbXBhY3RfbWVtb3J5OyBjb21wYWN0b3IgaWRsZVxuJiMzNDspOwomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CX0KJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQlpZiAod3JpdGUoZmQsICYjMzQ7MSYjMzQ7LCAxKSAmbHQ7IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl1c2xlZXAoMTAwMDAgJiM0MzsgcmFuZF9yKCZhbXA7c2VlZCkgJSAxMDAwMDApOwomIzQzOwl9CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHN3YXBfYXZhaWxhYmxlKHZvaWQpCiYjNDM7ewomIzQzOwljaGFyIGxpbmVbMjU2XTsKJiM0MzsJaW50IGxpbmVzID0gMDsKJiM0MzsJRklMRSAqZnAgPSBmb3BlbigmIzM0Oy9wcm9jL3N3YXBzJiMzNDssICYjMzQ7ciYjMzQ7KTsKJiM0MzsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKQomIzQzOwkJbGluZXMmIzQzOyYjNDM7OwomIzQzOwlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gbGluZXMgJmd0OyAxOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aW1ldmFsIHR2OwomIzQzOwomIzQzOwlnZXR0aW1lb2ZkYXkoJmFtcDt0diwgTlVMTCk7CiYjNDM7CXJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgJiM0MzsgdHYudHZfdXNlYyAvIDEwMDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCiYjNDM7ewomIzQzOwlmcHJpbnRmKHN0ZGVyciwKJiM0MzsJCSYjMzQ7VXNhZ2U6IGtodWdlcGFnZWRfcmFjZSBbLWQgc2Vjb25kc10gWy1tIHN0ZXBwZWR8ZnJlZXxtYWR2aXNlXSBbLXpdIFstcF0gWy1hIGFyZWFzXVxuJiMzNDsKJiM0MzsJCSYjMzQ7XHRXaXRob3V0IC1tLCBldmVyeSBtb2RlIHJ1bnMgaW4gdHVybi5cbiYjMzQ7CiYjNDM7CQkmIzM0O1x0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcbiYjMzQ7CiYjNDM7CQkmIzM0O1x0Qm90aCBvY2N1cGFuY3kgbGltaXRzIHJ1biB1bmxlc3MgLXogYXNrcyBmb3IgaG9sZXMgb25seS5cbiYjMzQ7CiYjNDM7CQkmIzM0O1x0LXo6IG9ubHkgbWF4X3B0ZXNfbm9uZSA9IEhQQUdFX1BNRF9OUiAtIDEgKGhvbGUtaGVhdnkpXG4mIzM0OwomIzQzOwkJJiMzNDtcdFJ1bnMgd2l0aCBhbmQgd2l0aG91dCBtZW1vcnkgcHJlc3N1cmUgdW5sZXNzIC1wIGFza3MgZm9yXG4mIzM0OwomIzQzOwkJJiMzNDtcdHByZXNzdXJlIG9ubHkuXG4mIzM0OwomIzQzOwkJJiMzNDtcdC1wOiBvbmx5IHdpdGggdGhlIHBhZ2VvdXQgYW5kIGNvbXBhY3Rpb24gdGhyZWFkc1xuJiMzNDsKJiM0MzsJCSYjMzQ7XHQtYTogbnVtYmVyIG9mIHNoYXJlZCBQTUQtc2l6ZWQgcGxheWdyb3VuZCBhcmVhcyAoZGVmYXVsdCAzKVxuJiMzNDspOwomIzQzOwlleGl0KDEpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiYjNDM7ewomIzQzOwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRocmVhZF9uYW1lc1tdID0gewomIzQzOwkJJiMzNDtmYXVsdGVyJiMzNDssICYjMzQ7ZmF1bHRlcjImIzM0OywgJiMzNDtkb250bmVlZCYjMzQ7LCAmIzM0O3Bpbm5lciYjMzQ7LCAmIzM0O2ZvcmtlciYjMzQ7LAomIzQzOwkJJiMzNDttcmVtYXBwZXImIzM0OywgJiMzNDtwYWdlb3V0JiMzNDssICYjMzQ7Y29tcGFjdG9yJiMzNDssCiYjNDM7CX07CiYjNDM7CXZvaWQgKigqY29uc3QgdGhyZWFkX2Zuc1tdKSh2b2lkICopID0gewomIzQzOwkJZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLAomIzQzOwkJbXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sCiYjNDM7CX07CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgcGFnZW91dF9iaXQgPSAxVUwgJmx0OyZsdDsgNiwgY29tcGFjdG9yX2JpdCA9IDFVTCAmbHQ7Jmx0OyA3OwomIzQzOwljb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTsKJiM0MzsJcHRocmVhZF90IHRocmVhZHNbQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpXTsKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgJiMzNDtzdGVwcGVkJiMzNDssICYjMzQ7ZnJlZSYjMzQ7LCAmIzM0O21hZHZpc2UmIzM0OyB9OwomIzQzOwlzdGF0aWMgY29uc3QgaW50IGFsbF9ub25lc1tdID0geyAwLCAxIH07CS8qIHN0cmljdCwgaG9sZXMgKi8KJiM0MzsJc3RhdGljIGNvbnN0IGludCBhbGxfcHJlc3NbXSA9IHsgMCwgMSB9OwkvKiBxdWlldCwgdW5kZXIgcHJlc3N1cmUgKi8KJiM0MzsJY29uc3QgaW50ICpub25lcyA9IGFsbF9ub25lczsKJiM0MzsJY29uc3QgaW50ICpwcmVzcyA9IGFsbF9wcmVzczsKJiM0MzsJaW50IG5yX25vbmVzID0gQVJSQVlfU0laRShhbGxfbm9uZXMpOwomIzQzOwlpbnQgbnJfcHJlc3MgPSBBUlJBWV9TSVpFKGFsbF9wcmVzcyk7CiYjNDM7CWNvbnN0IGNoYXIgKm9uZV9tb2RlWzFdOwomIzQzOwljb25zdCBjaGFyICogY29uc3QgKm1vZGVzID0gYWxsX21vZGVzOwomIzQzOwlpbnQgbnJfbW9kZXMgPSBBUlJBWV9TSVpFKGFsbF9tb2Rlcyk7CiYjNDM7CWNvbnN0IGNoYXIgKm1vZGVfYXJnID0gTlVMTDsKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJdW5zaWduZWQgbG9uZyBlbmRfbXM7CiYjNDM7CWludCBkdXJhdGlvbl9zID0gNTsKJiM0MzsJdW5zaWduZWQgbG9uZyB0aHJlYWRfbWFzayA9IH4wVUw7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYmFzZV9tYXNrOwomIzQzOwlpbnQgbnJfYXJlYXNfYXJnID0gMDsKJiM0MzsJYm9vbCBob2xlc19vbmx5ID0gZmFsc2U7CiYjNDM7CWJvb2wgcHJlc3N1cmVfb25seSA9IGZhbHNlOwomIzQzOwl1bnNpZ25lZCBsb25nIGk7CiYjNDM7CWludCBzdGVwcyA9IDA7CiYjNDM7CWludCBvcHQ7CiYjNDM7CiYjNDM7CXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICYjMzQ7YTpkOm06dDp6cGgmIzM0OykpICE9IC0xKSB7CiYjNDM7CQlzd2l0Y2ggKG9wdCkgewomIzQzOwkJY2FzZSAmIzM5O2EmIzM5OzoKJiM0MzsJCQlucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7ZCYjMzk7OgomIzQzOwkJCWR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7bSYjMzk7OgomIzQzOwkJCW1vZGVfYXJnID0gb3B0YXJnOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3QmIzM5OzoKJiM0MzsJCQkvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqLwomIzQzOwkJCXRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSAmIzM5O3omIzM5OzoKJiM0MzsJCQlob2xlc19vbmx5ID0gdHJ1ZTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgJiMzOTtwJiMzOTs6CiYjNDM7CQkJcHJlc3N1cmVfb25seSA9IHRydWU7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCXVzYWdlKCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJaWYgKGhvbGVzX29ubHkpIHsKJiM0MzsJCW5vbmVzID0gYWxsX25vbmVzICYjNDM7IDE7CiYjNDM7CQlucl9ub25lcyA9IDE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKHByZXNzdXJlX29ubHkpIHsKJiM0MzsJCXByZXNzID0gYWxsX3ByZXNzICYjNDM7IDE7CiYjNDM7CQlucl9wcmVzcyA9IDE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG1vZGVfYXJnKSB7CiYjNDM7CQlpZiAoc3RyY21wKG1vZGVfYXJnLCAmIzM0O3N0ZXBwZWQmIzM0OykgJmFtcDsmYW1wOyBzdHJjbXAobW9kZV9hcmcsICYjMzQ7ZnJlZSYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgc3RyY21wKG1vZGVfYXJnLCAmIzM0O21hZHZpc2UmIzM0OykpCiYjNDM7CQkJdXNhZ2UoKTsKJiM0MzsJCW9uZV9tb2RlWzBdID0gbW9kZV9hcmc7CiYjNDM7CQltb2RlcyA9IG9uZV9tb2RlOwomIzQzOwkJbnJfbW9kZXMgPSAxOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfaGVhZGVyKCk7CiYjNDM7CWlmICghdGhwX2F2YWlsYWJsZSgpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxuJiMzNDspOwomIzQzOwomIzQzOwlwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOwomIzQzOwlocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7CiYjNDM7CWlmICghaHBhZ2VfcG1kX3NpemUpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJZ3VwX2ZkID0gb3BlbigmIzM0Oy9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0JiMzNDssIE9fUkRXUik7CiYjNDM7CWlmIChndXBfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCByZXF1aXJlcyBDT05GSUdfR1VQX1RFU1QgYW5kIHJvb3RcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJbnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnICZndDsgMCA/IG5yX2FyZWFzX2FyZyA6IERFRkFVTFRfU0hBUkVEX0FSRUFTOwomIzQzOwlucl9hcmVhcyA9IG5yX3NoYXJlZF9hcmVhcyAmIzQzOyAxOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZAomIzQzOwkgKiBNUkVNQVBfRklYRUQgdW5tYXBzIHdoYXRldmVyIGlzIGluIHRoZSB3YXkgd2l0aG91dCBzYXlpbmcgc28uICBDbGFpbQomIzQzOwkgKiB0aGUgYWRkcmVzcyBoZXJlLCBzbyBhIGxheW91dCB0aGF0IGRvZXMgbm90IG1hdGNoIHRoaXMgYXNzdW1wdGlvbgomIzQzOwkgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZQomIzQzOwkgKiBwcm9jZXNzIG1hcHMgdGhpcyBsb3c6IHRocmVhZCBzdGFja3MgYW5kIG1hbGxvYyBhcmVuYXMgY29tZSBmcm9tIHRoZQomIzQzOwkgKiB0b3AtZG93biBtbWFwIGFyZWEsIHdlbGwgYWJvdmUuCiYjNDM7CSAqLwomIzQzOwltcmVtYXBfc2NyYXRjaCA9IChjaGFyICopQkFTRV9BRERSICYjNDM7IDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplOwomIzQzOwlpZiAobW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIFBST1RfTk9ORSwKJiM0MzsJCSBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLAomIzQzOwkJIC0xLCAwKSAhPSAodm9pZCAqKW1yZW1hcF9zY3JhdGNoKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bW1hcCgpIG1yZW1hcCBzY3JhdGNoJiMzNDspOwomIzQzOwomIzQzOwliYXNlX21hc2sgPSB0aHJlYWRfbWFzazsKJiM0MzsJaWYgKCFzd2FwX2F2YWlsYWJsZSgpKQomIzQzOwkJLyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUuICovCiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O25vIHN3YXA6IHRoZSBwYWdlb3V0IHRocmVhZCBzdGF5cyBpZGxlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzKTsKJiM0MzsKJiM0MzsJdGhwX3NhdmVfc2V0dGluZ3MoKTsKJiM0MzsJdGhwX3JlYWRfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEEgYmFzZSBlbnRyeSBmb3IgdGhlIHN0YWNrLCBzbyB0aGF0IHRoZSBwb3AgYXQgdGhlIGVuZCBvZiBhIG1vZGUKJiM0MzsJICogYWx3YXlzIGhhcyBzb21ldGhpbmcgdG8gd3JpdGUgYmFjazogdGhwX3BvcF9zZXR0aW5ncygpIG9uIGFuIGVtcHR5CiYjNDM7CSAqIHN0YWNrIGhhcyBubyBzZXR0aW5ncyB0byBhcHBseSBhbmQgZ2l2ZXMgdXAuCiYjNDM7CSAqLwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJZm9yIChpbnQgcnVuID0gMDsgcnVuICZsdDsgbnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzOyBydW4mIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgcmVtID0gcnVuICUgKG5yX25vbmVzICogbnJfcHJlc3MpOwomIzQzOwkJY29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9ub25lcyAqIG5yX3ByZXNzKV07CiYjNDM7CQlib29sIGhvbGVzID0gbm9uZXNbcmVtIC8gbnJfcHJlc3NdOwomIzQzOwkJYm9vbCBwcmVzc3VyZSA9IHByZXNzW3JlbSAlIG5yX3ByZXNzXTsKJiM0MzsKJiM0MzsJCXRocmVhZF9tYXNrID0gYmFzZV9tYXNrOwomIzQzOwkJaWYgKCFwcmVzc3VyZSkKJiM0MzsJCQl0aHJlYWRfbWFzayAmYW1wOz0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpOwomIzQzOwkJZWxzZSBpZiAoIXN3YXBfYXZhaWxhYmxlKCkpCiYjNDM7CQkJdGhyZWFkX21hc2sgJmFtcDs9IH5wYWdlb3V0X2JpdDsKJiM0MzsKJiM0MzsJCXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwkJc2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTsKJiM0MzsJCXNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUzsKJiM0MzsJCXNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjsKJiM0MzsJCXNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTsKJiM0MzsJCXNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPQomIzQzOwkJCXN0cmNtcChtb2RlLCAmIzM0O2ZyZWUmIzM0OykgPyAxMDAwIDogMDsKJiM0MzsJCXNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gMTA7CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogbVRIUCBjb2xsYXBzZSBvbmx5IHN1cHBvcnRzIHRoZSB0d28gZW5kcyBvZiB0aGUgb2NjdXBhbmN5CiYjNDM7CQkgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuCiYjNDM7CQkgKiBTdHJpY3QgbmVlZHMgYSBmdWxseSBwb3B1bGF0ZWQgd2luZG93LCB3aGljaCBpcyByYXJlIHVuZGVyCiYjNDM7CQkgKiByYWNpbmcgTUFEVl9ET05UTkVFRDsgaG9sZS1oZWF2eSB3aW5kb3dzIGNvbGxhcHNlIGluc3RlYWQsCiYjNDM7CQkgKiBzbyB0aGUgdHdvIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHMuCiYjNDM7CQkgKi8KJiM0MzsJCXNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhvbGVzID8KJiM0MzsJCQkoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpIC0gMSA6IDA7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPQomIzQzOwkJCW5yX2FyZWFzICogKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAqIDg7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpICZhbXA7ICgxVUwgJmx0OyZsdDsgaSkpCiYjNDM7CQkJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7CiYjNDM7CQl9CiYjNDM7CQkvKiBQb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZGUsIGJlZm9yZSB0aGUgbmV4dCBvbmUuICovCiYjNDM7CQl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJCXJlZ2lvbiA9IG1tYXAoQkFTRV9BRERSLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCSAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfAomIzQzOwkJCSAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApOwomIzQzOwkJaWYgKHJlZ2lvbiAhPSBCQVNFX0FERFIpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bW1hcCgpIHBsYXlncm91bmQmIzM0Oyk7CiYjNDM7CQltcmVtYXBfYXJlYSA9IHJlZ2lvbiAmIzQzOyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsKJiM0MzsJCWlmICh0aHJlYWRfbWFzayAmYW1wOyBwYWdlb3V0X2JpdCkgewomIzQzOwkJCS8qCiYjNDM7CQkJICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3QKJiM0MzsJCQkgKiB0byBkb21pbmF0ZSBhIFRDRyBndWVzdDogNCBQTUQgYXJlYXMsIGNsYW1wZWQgdG8KJiM0MzsJCQkgKiBbMTZNLCA2NE1dLgomIzQzOwkJCSAqLwomIzQzOwkJCXBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTsKJiM0MzsJCQlwYWdlb3V0X3NpemUgPSBwYWdlb3V0X3NpemUgJmx0OyAoMTZVTCAmbHQ7Jmx0OyAyMCkgPwomIzQzOwkJCQkgICAgICAgKDE2VUwgJmx0OyZsdDsgMjApIDoKJiM0MzsJCQkJICAgICAgIHBhZ2VvdXRfc2l6ZSAmZ3Q7ICg2NFVMICZsdDsmbHQ7IDIwKSA/CiYjNDM7CQkJCSAgICAgICAoNjRVTCAmbHQ7Jmx0OyAyMCkgOiBwYWdlb3V0X3NpemU7CiYjNDM7CQkJcGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsCiYjNDM7CQkJCQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCQkJCSAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTsKJiM0MzsJCQlpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSBwYWdlb3V0IGFyZWEmIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqLwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCQkqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpOwomIzQzOwkJbWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CQltYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAoISh0aHJlYWRfbWFzayAmYW1wOyAoMVVMICZsdDsmbHQ7IGkpKSkgewomIzQzOwkJCQl0aHJlYWRzW2ldID0gMDsKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJfQomIzQzOwkJCWlmIChwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sCiYjNDM7CQkJCQkgICAodm9pZCAqKShpICYjNDM7IDEpKSkKJiM0MzsJCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7cHRocmVhZF9jcmVhdGUoKSYjMzQ7KTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWVuZF9tcyA9IG5vd19tcygpICYjNDM7IGR1cmF0aW9uX3MgKiAxMDAwVUw7CiYjNDM7CQlpZiAoIXN0cmNtcChtb2RlLCAmIzM0O3N0ZXBwZWQmIzM0OykpIHsKJiM0MzsJCQl3aGlsZSAobm93X21zKCkgJmx0OyBlbmRfbXMgJmFtcDsmYW1wOyAhY29ycnVwdGVkKSB7CiYjNDM7CQkJCWlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoNjAwKSkKJiM0MzsJCQkJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O2todWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcbiYjMzQ7KTsKJiM0MzsJCQkJc3RlcHMmIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0gZWxzZSBpZiAoIXN0cmNtcChtb2RlLCAmIzM0O2ZyZWUmIzM0OykpIHsKJiM0MzsJCQl3aGlsZSAobm93X21zKCkgJmx0OyBlbmRfbXMgJmFtcDsmYW1wOyAhY29ycnVwdGVkKQomIzQzOwkJCQl1c2xlZXAoMTAwICogMTAwMCk7CiYjNDM7CQl9IGVsc2UgewkvKiBtYWR2aXNlICovCiYjNDM7CQkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkgewomIzQzOwkJCQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfc2hhcmVkX2FyZWFzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCQkJbWFkdmlzZShyZWdpb24gJiM0MzsgaSAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0NPTExBUFNFKTsKJiM0MzsJCQkJfQomIzQzOwkJCQltYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCQkJc3RlcHMmIzQzOyYjNDM7OwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsKJiM0MzsJCXN0b3AgPSAxOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3RocmVhZHM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaWYgKHRocmVhZHNbaV0pCiYjNDM7CQkJCXB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCS8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi8KJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSYjNDM7JiM0MzspCiYjNDM7CQkJY2hlY2tfcGFnZShpKTsKJiM0MzsKJiM0MzsJCWtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCwKJiM0MzsJCQkJICYjMzQ7JXMvJXMlczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxuJiMzNDssCiYjNDM7CQkJCSBtb2RlLCBob2xlcyA/ICYjMzQ7aG9sZXMmIzM0OyA6ICYjMzQ7c3RyaWN0JiMzNDssCiYjNDM7CQkJCSBwcmVzc3VyZSA/ICYjMzQ7L3ByZXNzdXJlJiMzNDsgOiAmIzM0OyYjMzQ7LAomIzQzOwkJCQkgZHVyYXRpb25fcywgc3RlcHMpOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIEhhbmQgdGhlIGFkZHJlc3Mgc3BhY2UgYW5kIHRoZSBzZXR0aW5ncyBiYWNrIGJlZm9yZSB0aGUKJiM0MzsJCSAqIG5leHQgbW9kZTogaXQgbWFwcyB0aGUgcmVnaW9uIGF0IHRoZSBzYW1lIGZpeGVkIGFkZHJlc3MsCiYjNDM7CQkgKiBhbmQgaXRzIHNjYW4gY2FkZW5jZSBkaWZmZXJzLgomIzQzOwkJICovCiYjNDM7CQltdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJCWlmIChwYWdlb3V0X2FyZWEpIHsKJiM0MzsJCQltdW5tYXAocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUpOwomIzQzOwkJCXBhZ2VvdXRfYXJlYSA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CQlzdG9wID0gMDsKJiM0MzsJCXN0ZXBzID0gMDsKJiM0MzsKJiM0MzsJCWlmIChjb3JydXB0ZWQpIHsKJiM0MzsJCQkvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZy4gKi8KJiM0MzsJCQl3aGlsZSAoJiM0MzsmIzQzO3J1biAmbHQ7IG5yX21vZGVzICogbnJfbm9uZXMgKiBucl9wcmVzcykgewomIzQzOwkJCQlyZW0gPSBydW4gJSAobnJfbm9uZXMgKiBucl9wcmVzcyk7CiYjNDM7CiYjNDM7CQkJCWtzZnRfdGVzdF9yZXN1bHRfc2tpcCgmIzM0OyVzLyVzJXM6IHNraXBwZWQgYWZ0ZXIgY29ycnVwdGlvblxuJiMzNDssCiYjNDM7CQkJCQkJICAgICAgbW9kZXNbcnVuIC8gKG5yX25vbmVzICogbnJfcHJlc3MpXSwKJiM0MzsJCQkJCQkgICAgICBub25lc1tyZW0gLyBucl9wcmVzc10gPwomIzQzOwkJCQkJCSAgICAgICYjMzQ7aG9sZXMmIzM0OyA6ICYjMzQ7c3RyaWN0JiMzNDssCiYjNDM7CQkJCQkJICAgICAgcHJlc3NbcmVtICUgbnJfcHJlc3NdID8KJiM0MzsJCQkJCQkgICAgICAmIzM0Oy9wcmVzc3VyZSYjMzQ7IDogJiMzNDsmIzM0Oyk7CiYjNDM7CQkJfQomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXRocF9yZXN0b3JlX3NldHRpbmdzKCk7CiYjNDM7CWtzZnRfZmluaXNoZWQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjMwZDNmYjUxOWZiMmMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYwpAQCAtMCwwICYjNDM7MSwyMTcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogU3luY2hyb25vdXMga2h1Z2VwYWdlZCBkcml2aW5nIGNoZWNrLgomIzQzOyAqCiYjNDM7ICogUmFjZSB0ZXN0cyBkcml2ZSBraHVnZXBhZ2VkIHRocm91Z2ggdGhlIGV4aXN0aW5nIHN5c2ZzIGNvbnRyb2xzOiBhCiYjNDM7ICogc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYW5kIGZ1bGxfc2NhbnMKJiM0MzsgKiBhZHZhbmNpbmcgYnkgdHdvIGlzIGEgY29tcGxldGlvbiBiYXJyaWVyIGZvciBvbmUgZnVsbCBwYXNzIHRoYXQKJiM0MzsgKiBzdGFydGVkIGFmdGVyIHNldHVwIChraHVnZXBhZ2VkX2Z1bGxfcGFzcygpKS4gVmVyaWZ5IHRoZSBwYWlyIGdpdmVzCiYjNDM7ICogZGV0ZXJtaW5pc3RpYywgYXR0cmlidXRhYmxlIHJlc3VsdHM6IG9uZSBiYXJyaWVyIHN0ZXAgb3ZlciBvbmUKJiM0MzsgKiBwcmVwYXJlZCB3aW5kb3cgcHJvZHVjZXMgZXhhY3RseSBvbmUgY29sbGFwc2UgYXR0ZW1wdCBvbiB0aGF0CiYjNDM7ICogd2luZG93JiMzOTtzIHNvdXJjZSBwYWdlcyAobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUgZXZlbnRzIGZpbHRlcmVkCiYjNDM7ICogYnkgc291cmNlIFBGTiBhbmQgb3JkZXIpIGFuZCB0aGUgd2luZG93IGlzIGNvbGxhcHNlZAomIzQzOyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuCiYjNDM7ICoKJiM0MzsgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBzZXQgdG8gNjBzIHRvIHByb3ZlIHRoZSB3YWtlIHBhdGg6IHdpdGhvdXQKJiM0MzsgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvdwomIzQzOyAqIHRoZSB0aW1lb3V0LiBJdCBhbHNvIGtlZXBzIHRoZSBkYWVtb24gZnJvbSBmcmVlLXJ1bm5pbmcgYmV0d2VlbgomIzQzOyAqIHN0ZXBzLCBwZXIgdGhlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZGlzY2lwbGluZS4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc2VsZnRlc3QuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCAmbHQ7Jmx0OyAzMCkpCiYjNDM7I2RlZmluZSBUQVJHRVRfT1JERVIgMgkvKiBzbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIGNvbnNpZGVycyAqLwomIzQzOyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1CiYjNDM7CiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkOwomIzQzO3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDsKJiM0MztzdGF0aWMgaW50IHRyYWNlX2V2ZW50c19mZCA9IC0xOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplOwomIzQzOwomIzQzOy8qCiYjNDM7ICogRWFjaCBzdGVwIHN3aXRjaGVzIHRoZSBldmVudHMgb2ZmIGFnYWluLCBidXQgYSBoZWxwZXIgY2FuIHN0aWxsIGdpdmUgdXAKJiM0MzsgKiBvbiB1cyBpbiBiZXR3ZWVuIChhIGZhaWxpbmcgc3lzZnMgd3JpdGUgZW5kcyB0aGUgdGVzdCBmcm9tIGluc2lkZQomIzQzOyAqIHRocF93cml0ZV9udW0oKSksIGFuZCBodWdlX21lbW9yeSBldmVudHMgbGVmdCBvbiBhcmUgdGhlIHdob2xlIG1hY2hpbmUmIzM5O3MKJiM0MzsgKiBwcm9ibGVtLCBub3QgdGhpcyB0ZXN0JiMzOTtzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHRyYWNlX2V2ZW50c19vZmYodm9pZCkKJiM0Mzt7CiYjNDM7CWlmICh0cmFjZV9ldmVudHNfZmQgJmd0Oz0gMCkKJiM0MzsJCXRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBDb3VudCBjb2xsYXBzZSBhdHRlbXB0cyBhdHRyaWJ1dGFibGUgdG8gb3VyIHdpbmRvdzogbGVnYWN5LWVuZ2luZQomIzQzOyAqIGlzb2xhdGUgZXZlbnRzIHdob3NlIHNjYW5fcGZuIGlzIG9uZSBvZiB0aGUgd2luZG93JiMzOTtzIHNvdXJjZSBQRk5zLAomIzQzOyAqIHBsdXMgYmF0Y2gtZW5naW5lIHBlci1jYW5kaWRhdGUgaW5zdGFsbCBldmVudHMgYXQgdGhlIHdpbmRvdyYjMzk7cwomIzQzOyAqIGFkZHJlc3MuIEVpdGhlciBlbmdpbmUgcmVwb3J0cyBleGFjdGx5IG9uY2UgcGVyIGF0dGVtcHQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLAomIzQzOwkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBvcmRlcikKJiM0Mzt7CiYjNDM7CWNoYXIgbGluZVsxMDI0XTsKJiM0MzsJaW50IGNvdW50ID0gMDsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWZwID0gdHJhY2luZ19vcGVuX3RyYWNlKCk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3Qgb3BlbiB0cmFjZSBidWZmZXJcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7CiYjNDM7CQljaGFyICpzOwomIzQzOwkJdW5zaWduZWQgbG9uZyB2YWw7CiYjNDM7CQl1bnNpZ25lZCBpbnQgb3JkOwomIzQzOwkJY2hhciAqbzsKJiM0MzsJCWludCBpOwomIzQzOwomIzQzOwkJcyA9IHN0cnN0cihsaW5lLCAmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOiYjMzQ7KTsKJiM0MzsJCWlmIChzKSB7CiYjNDM7CQkJaWYgKHNzY2FuZihzLCAmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOiBzY2FuX3Bmbj0weCVseCYjMzQ7LAomIzQzOwkJCQkgICAmYW1wO3ZhbCkgIT0gMSkKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJbyA9IHN0cnN0cihzLCAmIzM0O29yZGVyPSYjMzQ7KTsKJiM0MzsJCQlpZiAoIW8gfHwgc3NjYW5mKG8sICYjMzQ7b3JkZXI9JXUmIzM0OywgJmFtcDtvcmQpICE9IDEgfHwKJiM0MzsJCQkgICAgb3JkICE9IG9yZGVyKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfcGZuczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQkJaWYgKHZhbCA9PSBwZm5zW2ldKSB7CiYjNDM7CQkJCQljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQkJCQlicmVhazsKJiM0MzsJCQkJfQomIzQzOwkJCX0KJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCXMgPSBzdHJzdHIobGluZSwgJiMzNDttbV9jb2xsYXBzZV9jYW5kaWRhdGU6JiMzNDspOwomIzQzOwkJaWYgKHMpIHsKJiM0MzsJCQlpZiAoIXN0cnN0cihzLCAmIzM0O3Bhc3M9aW5zdGFsbCYjMzQ7KSB8fAomIzQzOwkJCSAgICAhc3Ryc3RyKHMsICYjMzQ7cmVzdWx0PXN1Y2NlZWRlZCYjMzQ7KSkKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJbyA9IHN0cnN0cihzLCAmIzM0O2FkZHI9JiMzNDspOwomIzQzOwkJCWlmICghbyB8fCBzc2NhbmYobywgJiMzNDthZGRyPTB4JWx4JiMzNDssICZhbXA7dmFsKSAhPSAxIHx8CiYjNDM7CQkJICAgIHZhbCAhPSBhZGRyKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlvID0gc3Ryc3RyKHMsICYjMzQ7b3JkZXI9JiMzNDspOwomIzQzOwkJCWlmICghbyB8fCBzc2NhbmYobywgJiMzNDtvcmRlcj0ldSYjMzQ7LCAmYW1wO29yZCkgIT0gMSB8fAomIzQzOwkJCSAgICBvcmQgIT0gb3JkZXIpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCWNvdW50JiM0MzsmIzQzOzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pCiYjNDM7ewomIzQzOwljb25zdCBzaXplX3Qgd2luZG93ID0gZ2V0cGFnZXNpemUoKSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVI7CiYjNDM7CWNvbnN0IGludCBucl9wYWdlcyA9IDEgJmx0OyZsdDsgVEFSR0VUX09SREVSOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbnNbMSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVJdOwomIzQzOwlib29sIGNvbGxhcHNlZCwgcGFzc2VkOwomIzQzOwlpbnQgYXR0cmlidXRlZDsKJiM0MzsJY2hhciAqcDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CXAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApOwomIzQzOwlpZiAocCAhPSBCQVNFX0FERFIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkgd2luZG93JiMzNDspOwomIzQzOwomIzQzOwkvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXBbaSAqIGdldHBhZ2VzaXplKCldID0gaSAmIzQzOyAxOwomIzQzOwkJcGZuc1tpXSA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwICYjNDM7IGkgKiBnZXRwYWdlc2l6ZSgpKTsKJiM0MzsJCWlmIChwZm5zW2ldID09IC0xVUwpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7U291cmNlIHBhZ2Ugbm90IHByZXNlbnRcbiYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBDbGVhciBmaXJzdDogd2l0aCB0aGUgZXZlbnRzIHN0aWxsIG9mZiB0aGVyZSBpcyBub3RoaW5nIHRvIHVuZG8uICovCiYjNDM7CWlmICh0cmFjaW5nX2NsZWFyX3RyYWNlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxuJiMzNDspOwomIzQzOwlpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xuJiMzNDspOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJLyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovCiYjNDM7CXBhc3NlZCA9IGtodWdlcGFnZWRfZnVsbF9wYXNzKDEyMCk7CiYjNDM7CiYjNDM7CS8qIE9mZiBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZ2l2ZSB1cDogdGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUuICovCiYjNDM7CWlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgZGlzYWJsZSBodWdlX21lbW9yeSBldmVudHNcbiYjMzQ7KTsKJiM0MzsJaWYgKCFwYXNzZWQpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJY29sbGFwc2VkID0gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCB3aW5kb3csIFRBUkdFVF9PUkRFUiwKJiM0MzsJCQkJCQkgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7CiYjNDM7CWF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCAodW5zaWduZWQgbG9uZylwLAomIzQzOwkJCQkgICAgICBUQVJHRVRfT1JERVIpOwomIzQzOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0KGNvbGxhcHNlZCAmYW1wOyZhbXA7IGF0dHJpYnV0ZWQgPT0gMSwKJiM0MzsJCQkgJiMzNDtzdGVwICVkOiB3aW5kb3cgY29sbGFwc2VkLCAlZCBhdHRyaWJ1dGVkIHJlc3VsdChzKVxuJiMzNDssCiYjNDM7CQkJIGl0ZXJhdGlvbiwgYXR0cmlidXRlZCk7CiYjNDM7CiYjNDM7CW11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7fQomIzQzOwomIzQzO2ludCBtYWluKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9oZWFkZXIoKTsKJiM0MzsKJiM0MzsJaWYgKCF0aHBfYXZhaWxhYmxlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXG4mIzM0Oyk7CiYjNDM7CWlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBUQVJHRVRfT1JERVIpKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7T3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXG4mIzM0OywKJiM0MzsJCQkgICAgICAgVEFSR0VUX09SREVSKTsKJiM0MzsKJiM0MzsJaHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpOwomIzQzOwlpZiAoIWhwYWdlX3BtZF9zaXplKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CXBhZ2VtYXBfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKHBhZ2VtYXBfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApJiMzNDspOwomIzQzOwlrcGFnZWZsYWdzX2ZkID0gb3BlbigmIzM0Oy9wcm9jL2twYWdlZmxhZ3MmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAoa3BhZ2VmbGFnc19mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O29wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OykgcmVxdWlyZXMgcm9vdFxuJiMzNDspOwomIzQzOwl0cmFjZV9ldmVudHNfZmQgPSB0cmFjaW5nX2V2ZW50c19vcGVuKCYjMzQ7aHVnZV9tZW1vcnkmIzM0Oyk7CiYjNDM7CWlmICh0cmFjZV9ldmVudHNfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XG4mIzM0Oyk7CiYjNDM7CWF0ZXhpdCh0cmFjZV9ldmVudHNfb2ZmKTsKJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbihOUl9JVEVSQVRJT05TKTsKJiM0MzsKJiM0MzsJdGhwX3NhdmVfc2V0dGluZ3MoKTsKJiM0MzsJdGhwX3JlYWRfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CXNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUzsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTsKJiM0MzsJLyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi8KJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMICZsdDsmbHQ7IDI0OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7CiYjNDM7CS8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBOUl9JVEVSQVRJT05TOyBpJiM0MzsmIzQzOykKJiM0MzsJCW9uZV9zdGVwKGkpOwomIzQzOwomIzQzOwl0aHBfcmVzdG9yZV9zZXR0aW5ncygpOwomIzQzOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYwppbmRleCBmMTlkNTNjNjk1NzY0Li5mZDM1ZjhhN2I1YjgzIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYwpAQCAtMjAsNyAmIzQzOzIwLDYgQEAKIAogI2RlZmluZSBUV09NRUcJCSgyJmx0OyZsdDsyMCkKICNkZWZpbmUgUlVOVElNRQkJKDIwKQotI2RlZmluZSBBTElHTih4LCBhKQkoKCh4KSAmIzQzOyAoYSAtIDEpKSAmYW1wOyAofigoYSkgLSAxKSkpCiAKIEhVR0VUTEJfU0VUVVBfREVGQVVMVF9QQUdFUygxKQogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoCmluZGV4IGQwOWY5ZjZhMzg0ZWUuLmZjNjE5MDdhYTNiMmEgMTAwNzU1Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoCkBAIC00MDIsNiAmIzQzOzQwMiwxMiBAQCBDQVRFR09SWT0mIzM0O3Bmbm1hcCYjMzQ7IHJ1bl90ZXN0IC4vcGZubWFwCiAjIENPVyB0ZXN0cwogQ0FURUdPUlk9JiMzNDtjb3cmIzM0OyBydW5fdGVzdCAuL2NvdwogCiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrCiYjNDM7CiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfc3luY19jaGVjawomIzQzOwomIzQzO0NBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2UKJiM0MzsKIENBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkCiAKIENBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDIKQEAgLTQxMCw4ICYjNDM7NDE2LDYgQEAgQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgYWxsOnNobWVtCiAKIENBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDQgYWxsOnNobWVtCiAKLUNBVEVHT1JZPSYjMzQ7dGhwJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub24KLQogIyBUcnkgdG8gY3JlYXRlIFhGUyBpZiBub3QgcHJvdmlkZWQKIGlmIFsgLXogJiMzNDske1NQTElUX0hVR0VfUEFHRV9URVNUX1hGU19QQVRIfSYjMzQ7IF07IHRoZW4KICAgICBpZiB0ZXN0X3NlbGVjdGVkICYjMzQ7dGhwJiMzNDs7IHRoZW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jCmluZGV4IDg2YTYwMzY5MjgyNjEuLjBhZGZlN2RkZTdlNTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYwpAQCAtNDIsNjggJiM0Mzs0Miw2IEBAIGNvbnN0IGNoYXIgKmtwYWdlZmxhZ3NfcHJvYyA9ICYjMzQ7L3Byb2Mva3BhZ2VmbGFncyYjMzQ7OwogaW50IHBhZ2VtYXBfZmQ7CiBpbnQga3BhZ2VmbGFnc19mZDsKIAotc3RhdGljIGJvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLAotCQlpbnQga3BhZ2VmbGFnc19mZCkKLXsKLQljb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEOwotCWNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCAmbHQ7Jmx0OyBvcmRlcjsKLQl1bnNpZ25lZCBsb25nIHBmbl9oZWFkOwotCXVpbnQ2NF90IHBmbl9mbGFnczsKLQl1bnNpZ25lZCBsb25nIHBmbjsKLQl1bnNpZ25lZCBsb25nIGk7Ci0KLQlwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpOwotCi0JLyogbm9uIHByZXNlbnQgcGFnZSAqLwotCWlmIChwZm4gPT0gLTFVTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCi0JCWdvdG8gZmFpbDsKLQotCS8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovCi0JaWYgKCFvcmRlcikgewotCQlpZiAocGZuX2ZsYWdzICZhbXA7IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIG5vbiBUSFAgZm9saW8gKi8KLQlpZiAoIShwZm5fZmxhZ3MgJmFtcDsgS1BGX1RIUCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXBmbl9oZWFkID0gcGZuICZhbXA7IH4obnJfcGFnZXMgLSAxKTsKLQotCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCi0JCWdvdG8gZmFpbDsKLQotCS8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovCi0JaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncykKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovCi0JZm9yIChpID0gMTsgaSAmbHQ7IG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykgewotCQlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCAmIzQzOyBpLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCi0JCQlnb3RvIGZhaWw7Ci0JCWlmICgocGZuX2ZsYWdzICZhbXA7IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLAotCSAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXIKLQkgKi8KLQlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCAmIzQzOyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCS8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi8KLQlyZXR1cm4gKHBmbl9mbGFncyAmYW1wOyBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzOwotZmFpbDoKLQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cbiYjMzQ7KTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KIHN0YXRpYyBpbnQgY2hlY2tfYWZ0ZXJfc3BsaXRfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLAogCQlpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycykKIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYwppbmRleCA4MGJjOWY1OTdiNTIxLi5lZTEzMzQ3NzgzOTFmIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jCkBAIC00OTQsNiAmIzQzOzQ5NCwxNTEgQEAgaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpCiAJcmV0dXJuIDA7CiB9CiAKJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCwKJiM0MzsJCQlpbnQga3BhZ2VmbGFnc19mZCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7CiYjNDM7CWNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7CiYjNDM7CXVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7CiYjNDM7CXVpbnQ2NF90IHBmbl9mbGFnczsKJiM0MzsJdW5zaWduZWQgbG9uZyBwZm47CiYjNDM7CXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTsKJiM0MzsKJiM0MzsJLyogbm9uIHByZXNlbnQgcGFnZSAqLwomIzQzOwlpZiAocGZuID09IC0xVUwpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqLwomIzQzOwlpZiAoIW9yZGVyKSB7CiYjNDM7CQlpZiAocGZuX2ZsYWdzICZhbXA7IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogbm9uIFRIUCBmb2xpbyAqLwomIzQzOwlpZiAoIShwZm5fZmxhZ3MgJmFtcDsgS1BGX1RIUCkpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CXBmbl9oZWFkID0gcGZuICZhbXA7IH4obnJfcGFnZXMgLSAxKTsKJiM0MzsKJiM0MzsJaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJLyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi8KJiM0MzsJaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncykKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJLyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovCiYjNDM7CWZvciAoaSA9IDE7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKJiM0MzsJCQlnb3RvIGZhaWw7CiYjNDM7CQlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLAomIzQzOwkgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyCiYjNDM7CSAqLwomIzQzOwlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCAmIzQzOyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CiYjNDM7CS8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi8KJiM0MzsJcmV0dXJuIChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFnczsKJiM0MztmYWlsOgomIzQzOwlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cbiYjMzQ7KTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIENoZWNrIHdoZXRoZXIgZXZlcnkgb3JkZXItQG9yZGVyIHdpbmRvdyBvZiBbc3RhcnQsIGxlbikgbWFwcyBleGFjdGx5IG9uZQomIzQzOyAqIGZvbGlvIG9mIHRoYXQgb3JkZXIsIGhlYWQgdG8gdGFpbC4gIFRoZSBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5CiYjNDM7ICogYWxpZ25lZCwgZWFjaCB3aW5kb3cmIzM5O3MgUEZOIHJ1biBtdXN0IGJlIGNvbnRpZ3VvdXMsIGFuZCBhIHdpbmRvdyYjMzk7cyBmaXJzdAomIzQzOyAqIFBGTiBtdXN0IGJlIHRoZSBmb2xpbyBoZWFkLgomIzQzOyAqCiYjNDM7ICogVGhpcyBpcyB0aGUgY2hlY2sgJiMzNDtkaWQgdGhpcyByYW5nZSBjb2xsYXBzZSBpbnRvIG9yZGVyLUBvcmRlciBmb2xpb3MmIzM0OzogYQomIzQzOyAqIHdpbmRvdyBhc3NlbWJsZWQgZnJvbSBwYXJ0cyBvZiBzZXZlcmFsIGZvbGlvcywgb3IgbWFwcGluZyBhIGZvbGlvIHNoaWZ0ZWQKJiM0MzsgKiBmcm9tIGl0cyBuYXR1cmFsIHBvc2l0aW9uLCBmYWlscy4KJiM0MzsgKi8KJiM0Mztib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlciwKJiM0MzsJCQkJICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwomIzQzOwljb25zdCBzaXplX3Qgd2luZG93ID0gbnJfcGFnZXMgKiBwc2l6ZSgpOwomIzQzOwljaGFyICp2YWRkcjsKJiM0MzsKJiM0MzsJaWYgKCh1aW50cHRyX3Qpc3RhcnQgJSB3aW5kb3cgfHwgbGVuICUgd2luZG93KQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlmb3IgKHZhZGRyID0gc3RhcnQ7IHZhZGRyICZsdDsgc3RhcnQgJiM0MzsgbGVuOyB2YWRkciAmIzQzOz0gd2luZG93KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGk7CiYjNDM7CiYjNDM7CQkvKiBOb3QgcHJlc2VudCwgb3Igbm90IG1hcHBpbmcgdGhlIGZvbGlvIGhlYWQuICovCiYjNDM7CQlpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkJZm9yIChpID0gMTsgaSAmbHQ7IG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmIChwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIgJiM0MzsgaSAqIHBzaXplKCkpICE9CiYjNDM7CQkJICAgIHBmbiAmIzQzOyBpKQomIzQzOwkJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoIWlzX2JhY2tlZF9ieV9mb2xpbyh2YWRkciwgb3JkZXIsIHBhZ2VtYXBfZmQsCiYjNDM7CQkJCQlrcGFnZWZsYWdzX2ZkKSkKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgVFJBQ0VGU19ST09UICYjMzQ7L3N5cy9rZXJuZWwvdHJhY2luZyYjMzQ7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBPcGVuIHRoZSBlbmFibGUgZmlsZSBvZiBvbmUgZnRyYWNlIGV2ZW50IHN1YnN5c3RlbSAoZS5nLiAmIzM0O2h1Z2VfbWVtb3J5JiMzNDspLgomIzQzOyAqIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0cmFjaW5nX2V2ZW50c19lbmFibGUoKSwgb3IgLTEgaWYgdHJhY2VmcyBvciB0aGUKJiM0MzsgKiBzdWJzeXN0ZW0gaXMgbm90IHRoZXJlLiAgVGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUgc3RhdGU6IHdob2V2ZXIKJiM0MzsgKiBzd2l0Y2hlcyB0aGVtIG9uIG93bnMgdGhlbSB1bnRpbCBpdCBzd2l0Y2hlcyB0aGVtIG9mZiwgaW5jbHVkaW5nIG9uIHRoZQomIzQzOyAqIHBhdGhzIHdoZXJlIHRoZSB0ZXN0IGdpdmVzIHVwLgomIzQzOyAqLwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cykKJiM0Mzt7CiYjNDM7CWNoYXIgcGF0aFsyNTZdOwomIzQzOwomIzQzOwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCAmIzM0Oy9ldmVudHMvJXMvZW5hYmxlJiMzNDssCiYjNDM7CQkgc3Vic3lzKTsKJiM0MzsJcmV0dXJuIG9wZW4ocGF0aCwgT19XUk9OTFkpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgdHJhY2luZ19ldmVudHNfZW5hYmxlKGludCBmZCwgYm9vbCBlbmFibGUpCiYjNDM7ewomIzQzOwlpZiAocHdyaXRlKGZkLCBlbmFibGUgPyAmIzM0OzEmIzM0OyA6ICYjMzQ7MCYjMzQ7LCAxLCAwKSAhPSAxKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRHJvcCB3aGF0IHRoZSB0cmFjZSBidWZmZXIgaG9sZHMgc28gZmFyLiAqLwomIzQzO2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgZmQgPSBvcGVuKFRSQUNFRlNfUk9PVCAmIzM0Oy90cmFjZSYjMzQ7LCBPX1dST05MWSB8IE9fVFJVTkMpOwomIzQzOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBmb3BlbihUUkFDRUZTX1JPT1QgJiMzNDsvdHJhY2UmIzM0OywgJiMzNDtyJiMzNDspOwomIzQzO30KJiM0MzsKIC8qIElmIGBpb2N0bHMmIzM5OyBub24tTlVMTCwgdGhlIGFsbG93ZWQgaW9jdGxzIHdpbGwgYmUgcmV0dXJuZWQgaW50byB0aGUgdmFyICovCiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLAogCQkJICAgICAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yLCB1aW50NjRfdCAqaW9jdGxzKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oCmluZGV4IDlhNDlhZjg4NzAyZTQuLjEwYzdiZTQ2ZTQ0Y2EgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmgKQEAgLTEwLDYgJiM0MzsxMCw4IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvZnMuaCZndDsKIAogI2RlZmluZSBCSVRfVUxMKG5yKSAgICAgICAgICAgICAgICAgICAoMVVMTCAmbHQ7Jmx0OyAobnIpKQomIzQzOyNkZWZpbmUgQUxJR04oeCwgYSkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiM0MzsgKGEpIC0gMSkgJmFtcDsgfigoYSkgLSAxKSkKJiM0MzsKICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSkKICNkZWZpbmUgUE1fTU1BUF9FWENMVVNJVkUgICAgICAgICAgICAgQklUX1VMTCg1NikKICNkZWZpbmUgUE1fVUZGRF9XUCAgICAgICAgICAgICAgICAgICAgQklUX1VMTCg1NykKQEAgLTk3LDYgJiM0Mzs5OSwxMCBAQCBpbnQ2NF90IGFsbG9jYXRlX3RyYW5zaHVnZSh2b2lkICpwdHIsIGludCBwYWdlbWFwX2ZkKTsKIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKTsKIGludCBnYXRoZXJfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLAogCQlpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycyk7CiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsCiYjNDM7CQkJaW50IGtwYWdlZmxhZ3NfZmQpOwomIzQzO2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLAomIzQzOwkJCQkgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7CiAKIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sCiAJCSAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTsKQEAgLTExMyw2ICYjNDM7MTE5LDEwIEBAIGludCBjbG9zZV9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwKTsKIGludCB3cml0ZV9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgdmFsKTsKIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTsKIGJvb2wgc29mdGRpcnR5X3N1cHBvcnRlZCh2b2lkKTsKJiM0MztpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7CiYjNDM7aW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZCk7CiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIGludCBvcGVuX3NlbGZfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcF9vdXQpCiB7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE0OjU5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI4OTI3CgkJCQkJCQlvdXRwdXQ6IDYzCgkJCQkJCQl0aG91Z2h0czogNzI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKldvcnRoRnV6emluZyBBbmFseXNpczogU2VsZnRlc3QgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7dmUgZ290IHRoaXMgcGF0Y2ggdGhhdCYjMzk7cyBhZGRpbmcgYW5kIG1vZGlmeWluZyB0ZXN0cyB3aXRoaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AuIEkmIzM5O20gZ29pbmcgdGhyb3VnaCB0aGUgZmlsZXMg4oCTIGBNYWtlZmlsZWAsIGBmb2xpb19vcmRlcl9jaGVjay5jYCwgYGhtbS10ZXN0cy5jYCwgdGhlIGh1Z2VwYWdlIHN0dWZmLCBga2h1Z2VwYWdlZGAsIG1pZ3JhdGlvbiwgYW5kIHNvIG9uLiBJdCBzZWVtcyBsaWtlIGEgcHJldHR5IGNvbXByZWhlbnNpdmUgYWRkaXRpb24gdG8gdGhlIHNlbGZ0ZXN0cyBzdWl0ZS4KCk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBxdWlja2x5IGFzc2VzcyB3aGV0aGVyIHRoaXMgd2FycmFudHMgZnV6emluZyBhdHRlbnRpb24uIFRoZSBpbnN0cnVjdGlvbnMgSSBoYXZlIGxheSBvdXQgYSBzcGVjaWZpYyBzZXQgb2Ygc2NlbmFyaW9zIHdoZXJlIHdlIHNob3VsZCByZXR1cm4gYFdvcnRoRnV6emluZz1mYWxzZWAuIEl0IGxpc3RzIHRoaW5ncyBsaWtlIGRvY3VtZW50YXRpb24gY2hhbmdlcywgY29tbWVudCB1cGRhdGVzLCBkZWNvcmF0aXZlIGxvZ2dpbmcsIGNvbnN0YW50IGFkanVzdG1lbnRzIHRoYXQgZG9uJiMzOTt0IGNoYW5nZSBleGVjdXRpb24sIGFuZCB1bnJlYWNoYWJsZSBjb2RlIHBhdGhzLiBUaGVyZSYjMzk7cyBhbHNvIHNvbWUgaW1wb3J0YW50IGNhdmVhdHMgYWJvdXQgc3BlY2lmaWMgaGFyZHdhcmUgYW5kIGRyaXZlciBjb250ZXh0cy4KCkFoLCBidXQgd2FpdCBhIHNlY29uZC4uLiBpdCAqZG9lc24mIzM5O3QqIGV4cGxpY2l0bHkgbWVudGlvbiBzZWxmdGVzdHMgaW4gdGhhdCAmIzM0O1dvcnRoRnV6emluZz1mYWxzZSYjMzQ7IGxpc3QuIEhvd2V2ZXIsIHNlbGZ0ZXN0cyBhcmUgbm90IGtlcm5lbCBjb2RlLiBUaGV5IGxpdmUgaW4gdXNlcnNwYWNlOyB0aGV5JiMzOTtyZSAqdG9vbHMqIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGtlcm5lbCYjMzk7cyBiZWhhdmlvci4gVGhlIGtlcm5lbCBpdHNlbGYgKmlzKiB3aGF0IFN5emthbGxlciBmdXp6ZXMgdXNpbmcgc3lzY2FsbHMuIFRoZSBzZWxmdGVzdHMgYXJlIHBhcnQgb2YgaG93IHdlIG1lYXN1cmUgaXRzIHBlcmZvcm1hbmNlIGFuZCBiZWhhdmlvciwgYnV0IHRoZXkgYXJlbiYjMzk7dCBwYXJ0IG9mIHRoZSBzeXN0ZW0gY2FsbCBmbG93IHRoYXQmIzM5O3MgdGhlIHByaW1hcnkgdGFyZ2V0IG9mIGZ1enppbmcuCgpMZXQgbWUganVzdCBkbyBhIHF1aWNrLCB2ZXJ5IGV4cGxpY2l0LCBkb3VibGUtY2hlY2sgdG8gY29uZmlybS4gWWVzLCBhbGwgdGhlIGNoYW5nZXMgYXJlIHNxdWFyZWx5IHdpdGhpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gTm90aGluZyBpbiBhbnkga2VybmVsIHN1YnN5c3RlbXMgaGVyZS4KClRoZXJlZm9yZSwgYmVjYXVzZSB0aGlzIHBhdGNoICpvbmx5KiB0b3VjaGVzIHVzZXJzcGFjZSBzZWxmdGVzdHMsIGFuZCBkb2VzIG5vdCBhbHRlciB0aGUgZXhlY3V0aW9uIGZsb3cgb2YgdGhlIGtlcm5lbCBpdHNlbGYsIEkgYW0gZ29pbmcgdG8gc2V0IGBXb3J0aEZ1enppbmc9ZmFsc2VgLiBUaGUgcmVhc29uaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZDogdGhlc2UgY2hhbmdlcyBhcmUgaXNvbGF0ZWQgdG8gdGhlIHRlc3RpbmcgZnJhbWV3b3JrIGFuZCBhcmUgbm90IHBhcnQgb2YgdGhlIGtlcm5lbCBleGVjdXRpb24gcGF0aCB0aGF0IFN5emthbGxlciBmdXp6ZXMuIExldCYjMzk7cyBjYWxsIGBzZXQtcmVzdWx0c2AgdG8gY29tcGxldGUgdGhpcyB0YXNrLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzEyIDE0OjU5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLywgd2hpY2ggZG8gbm90IGFmZmVjdCB0aGUga2VybmVsJiMzOTtzIGZ1bmN0aW9uYWwgZXhlY3V0aW9uIGZsb3cuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLCB3aGljaCBkbyBub3QgYWZmZWN0IHRoZSBrZXJuZWwmIzM5O3MgZnVuY3Rpb25hbCBleGVjdXRpb24gZmxvdy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTIgMTQ6NTk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE0OjU5OjExLjc0NTg2MjMxMloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExNDc4MDQwMDgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLywgd2hpY2ggZG8gbm90IGFmZmVjdCB0aGUga2VybmVsJ3MgZnVuY3Rpb25hbCBleGVjdXRpb24gZmxvdy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTEyVDE0OjU5OjExLjc0NTg3NzYyMloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTc0ODc0MDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNjdhMTllMTdhOTFiNjE1ZDAwNzFjM2Q4NDEwMzgyZTgxYzBlOTA4OFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgV2VkIEF1ZyAxMiAxNDo1OToxMCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuaW5kZXggMmQ1MzY2MTk2ZTMwOS4uMzA4YmJhZDczYzExYSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuQEAgLTEwNCw2ICsxMDQsOSBAQCBURVNUX0dFTl9GSUxFUyArPSBndWFyZC1yZWdpb25zXFxuIFRFU1RfR0VOX0ZJTEVTICs9IG1lcmdlXFxuIFRFU1RfR0VOX0ZJTEVTICs9IHJtYXBcXG4gVEVTVF9HRU5fRklMRVMgKz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0XFxuK1RFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX29yZGVyX2NoZWNrXFxuK1RFU1RfR0VOX0ZJTEVTICs9IGtodWdlcGFnZWRfc3luY19jaGVja1xcbitURVNUX0dFTl9GSUxFUyArPSBraHVnZXBhZ2VkX3JhY2VcXG4gXFxuIGlmbmVxICgkKEFSQ0gpLGFybTY0KVxcbiBURVNUX0dFTl9GSUxFUyArPSBzb2Z0LWRpcnR5XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi45MzAzMGE0MmMzY2NkXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcXG5AQCAtMCwwICsxLDEzNyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBTZWxmLWNoZWNrIGZvciB0aGUgdm1fdXRpbCBmb2xpby1vcmRlciBkZXRlY3Rpb24gaGVscGVycyxcXG4rICogaXNfYmFja2VkX2J5X2ZvbGlvKCkgYW5kIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoKS5cXG4rICpcXG4rICogRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0IG1lbW9yeSBpbiB3aXRoIG9ubHlcXG4rICogdGhhdCBvcmRlciBlbmFibGVkIGFuZCB2ZXJpZnkgdGhlIGhlbHBlcnMgcmVwb3J0IGV4YWN0bHkgdGhhdCBvcmRlcjpcXG4rICogbm90IGEgbmVpZ2hib3VyaW5nIG9yZGVyLCBhbmQgcGxhaW4gNEsgbWVtb3J5IGFzIG9yZGVyIDAuIFRoZSBoZWxwZXJzXFxuKyAqIGFyZSB3aGF0IHRoZSBraHVnZXBhZ2VkIG1USFAgdGVzdHMgdXNlIHRvIGRldGVjdCBjb2xsYXBzZSByZXN1bHRzLCBzb1xcbisgKiB0aGV5IG11c3QgYWdyZWUgd2l0aCB0aGUga2VybmVsJ3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueVxcbisgKiBjb2xsYXBzZSB0ZXN0IHJlbGllcyBvbiB0aGVtLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJrc2VsZnRlc3QuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInZtX3V0aWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImh1Z2VwYWdlX3NldHRpbmdzLmhcXFwiXFxuK1xcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcXG4rXFxuKy8qIG1tYXAgYW4gYW5vbiBWTUEgb2YgZXhhY3RseSBAc2l6ZSBieXRlcyBhdCBhIEBzaXplLWFsaWduZWQgYWRkcmVzcy4gKi9cXG4rc3RhdGljIGNoYXIgKmFsbG9jX2FsaWduZWQoc2l6ZV90IHNpemUpXFxuK3tcXG4rXFx0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xcbitcXHR1aW50cHRyX3QgYWxpZ25lZDtcXG4rXFx0Y2hhciAqcDtcXG4rXFxuK1xcdHAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcXG4rXFx0XFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xcbitcXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKVxcXCIpO1xcbitcXG4rXFx0YWxpZ25lZCA9IEFMSUdOKCh1aW50cHRyX3QpcCwgc2l6ZSk7XFxuK1xcdGlmIChhbGlnbmVkICE9ICh1aW50cHRyX3QpcClcXG4rXFx0XFx0bXVubWFwKHAsIGFsaWduZWQgLSAodWludHB0cl90KXApO1xcbitcXHRpZiAoYWxpZ25lZCArIHNpemUgIT0gKHVpbnRwdHJfdClwICsgbGVuKVxcbitcXHRcXHRtdW5tYXAoKGNoYXIgKilhbGlnbmVkICsgc2l6ZSxcXG4rXFx0XFx0ICAgICAgICh1aW50cHRyX3QpcCArIGxlbiAtIGFsaWduZWQgLSBzaXplKTtcXG4rXFxuK1xcdHJldHVybiAoY2hhciAqKWFsaWduZWQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIEVuYWJsZSBvbmx5IEBvcmRlciAob3JkZXIgMDogbm90aGluZyksIGZhdWx0IG9uZSBhbGlnbmVkIHdpbmRvdyBpbiBhbmRcXG4rICogY2hlY2sgdGhlIGhlbHBlcnMgc2VlIGV4YWN0bHkgQG9yZGVyLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgY2hlY2tfb3JkZXIoaW50IG9yZGVyKVxcbit7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2l6ZV90IHNpemUgPSBwc2l6ZSgpIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbitcXHRib29sIG9rID0gdHJ1ZTtcXG4rXFx0Y2hhciAqcDtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRpZiAob3JkZXIpXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRwID0gYWxsb2NfYWxpZ25lZChzaXplKTtcXG4rXFx0KnAgPSAxO1xcbitcXG4rXFx0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJvcmRlciAlZCBub3QgZGV0ZWN0ZWQgYWZ0ZXIgZmF1bHRcXFxcblxcXCIsIG9yZGVyKTtcXG4rXFx0XFx0b2sgPSBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0LyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xcbitcXHRpZiAob3JkZXIgXFx1MDAyNlxcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlciAtIDEsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIG9yZGVyLCBvcmRlciAtIDEpO1xcbitcXHRcXHRvayA9IGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKiBPcmRlciAwIHBhZ2VzIG11c3Qgbm90IGxvb2sgbGlrZSBhbnkgbGFyZ2UgZm9saW8sIGFuZCB2aWNlIHZlcnNhLiAqL1xcbitcXHRpZiAob3JkZXIgXFx1MDAyNlxcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCAwLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHBhZ2VtYXBfZmQsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAga3BhZ2VmbGFnc19mZCkpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm9yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxcXFxuXFxcIiwgb3JkZXIpO1xcbitcXHRcXHRvayA9IGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRtdW5tYXAocCwgc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFxuK1xcdGtzZnRfdGVzdF9yZXN1bHQob2ssIFxcXCJvcmRlciAlZCBjbGFzc2lmaWVkXFxcXG5cXFwiLCBvcmRlcik7XFxuK31cXG4rXFxuK2ludCBtYWluKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0dW5zaWduZWQgbG9uZyBvcmRlcnM7XFxuK1xcdGludCBvcmRlcjtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XFxuK1xcbitcXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcXFwiKTtcXG4rXFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChrcGFnZWZsYWdzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIm9wZW4oXFxcXFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcXFxcXCIpIHJlcXVpcmVzIHJvb3RcXFxcblxcXCIpO1xcbitcXG4rXFx0b3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcXG4rXFx0aWYgKCFvcmRlcnMpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJObyBzdXBwb3J0ZWQgVEhQIG9yZGVyc1xcXFxuXFxcIik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSArIDEpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Y2hlY2tfb3JkZXIoMCk7XFxuK1xcdGZvciAob3JkZXIgPSAxOyBvcmRlciBcXHUwMDNjIE5SX09SREVSUzsgb3JkZXIrKykge1xcbitcXHRcXHRpZiAoIShvcmRlcnMgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyKSkpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRjaGVja19vcmRlcihvcmRlcik7XFxuK1xcdH1cXG4rXFxuK1xcbitcXHRrc2Z0X2ZpbmlzaGVkKCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xcbmluZGV4IGUyNjQyZWNhMGQwMmIuLmRmNDI2ZjkyMThlNzEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xcbkBAIC02NSw3ICs2NSw2IEBAIGVudW0ge1xcbiAjZGVmaW5lIEhNTV9QQVRIX01BWCAgICA2NFxcbiAjZGVmaW5lIE5USU1FU1xcdFxcdDEwXFxuIFxcbi0jZGVmaW5lIEFMSUdOKHgsIGEpICgoKHgpICsgKGEgLSAxKSkgXFx1MDAyNiAofigoYSkgLSAxKSkpXFxuIC8qIEp1c3QgdGhlIGZsYWdzIHdlIG5lZWQsIGNvcGllZCBmcm9tIG1tLmg6ICovXFxuIFxcbiAjaWZuZGVmIEZPTExfV1JJVEVcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcXG5pbmRleCBkNzkxN2RjZTNhYmFjLi44YWZjZGY5NzkzYmI3IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXFxuQEAgLTE4Myw2ICsxODMsMTcgQEAgdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4gXFx0fVxcbiB9XFxuIFxcbisvKlxcbisgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYW55IHN0b3JlIHRvIGEga2h1Z2VwYWdlZCBzeXNmcyBrbm9iIHdha2VzIHRoZVxcbisgKiBkYWVtb24sIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHlcXG4rICogYXNrZWQgZm9yIC0tIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgaXMgdGhlIG9ubHkgc2FuY3Rpb25lZCB3YWtlLlxcbisgKi9cXG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcXG4re1xcbitcXHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcXG4rXFx0XFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xcbit9XFxuK1xcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4ge1xcbiBcXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFxcdTAwMjZzZXR0aW5ncy1cXHUwMDNla2h1Z2VwYWdlZDtcXG5AQCAtMTk4LDE1ICsyMDksMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXFxuIFxcdFxcdFxcdHNobWVtX2VuYWJsZWRfc3RyaW5nc1tzZXR0aW5ncy1cXHUwMDNlc2htZW1fZW5hYmxlZF0pO1xcbiBcXHR0aHBfd3JpdGVfbnVtKFxcXCJ1c2VfemVyb19wYWdlXFxcIiwgc2V0dGluZ3MtXFx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xcbiBcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9kZWZyYWdcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VkZWZyYWcpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1xcXCIsXFxuLVxcdFxcdFxcdGtodWdlcGFnZWQtXFx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbi1cXHRcXHRcXHRraHVnZXBhZ2VkLVxcdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX25vbmUpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zd2FwKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VwYWdlc190b19zY2FuKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvZGVmcmFnXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlZGVmcmFnKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4rXFx0XFx0ICAgICAgIGtodWdlcGFnZWQtXFx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4rXFx0XFx0ICAgICAgIGtodWdlcGFnZWQtXFx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX25vbmUpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VwYWdlc190b19zY2FuKTtcXG4gXFxuIFxcdGlmIChkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoWzBdKVxcbiBcXHRcXHR3cml0ZV9udW0oZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aCwgc2V0dGluZ3MtXFx1MDAzZXJlYWRfYWhlYWRfa2IpO1xcbkBAIC0yMzAsNiArMjQxLDQ5IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxcbiBcXHR9XFxuIH1cXG4gXFxuKy8qXFxuKyAqIENvbXBsZXRpb24gYmFycmllciBmb3Iga2h1Z2VwYWdlZDogd2FpdCB1bnRpbCBhIGZ1bGwgc2NhbiBwYXNzIHRoYXRcXG4rICogc3RhcnRlZCBhZnRlciB0aGlzIGNhbGwgaGFzIGZpbmlzaGVkLiBmdWxsX3NjYW5zIG11c3QgYWR2YW5jZSBieSB0d287XFxuKyAqIGEgKzEgc3RlcCBtYXkgY29tcGxldGUgYSBwYXNzIHRoYXQgZXhhbWluZWQgdGhpcyBtbSBiZWZvcmUgdGhlXFxuKyAqIGNhbGxlcidzIHNldHVwIHdhcyBpbiBwbGFjZS5cXG4rICpcXG4rICogQW55IHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIHNvIHRoZSBiYXJyaWVyIHdvcmtzXFxuKyAqIHdoYXRldmVyIHRoZSBjb25maWd1cmVkIHNjYW4gY2FkZW5jZSAtLSBidXQgYSBzdG9yZSBjYW4gYmUgbG9zdC5cXG4rICogX19zbGVlcF9taWxsaXNlY3Nfc3RvcmUoKSBjbGVhcnMga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgYW5kIHdha2VzIHRoZVxcbisgKiBxdWV1ZTsgaWYgdGhlIGRhZW1vbiBpcyBiZXR3ZWVuIHNjYW5zIHJhdGhlciB0aGFuIHNsZWVwaW5nLCBpdCBzZXRzXFxuKyAqIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGl0c2VsZiBvbiB0aGUgd2F5IGludG8ga2h1Z2VwYWdlZF93YWl0X3dvcmsoKSBhbmRcXG4rICogdGhlbiBzbGVlcHMgZm9yIHRoZSBmdWxsIGludGVydmFsLCBoYXZpbmcgbmV2ZXIgc2VlbiB0aGUgc3RvcmUuICBTbyBrZWVwXFxuKyAqIHN0b3JpbmcgdW50aWwgdGhlIHBhc3MgbGFuZHM7IGEgc3RvcmUgd2hpbGUgdGhlIGRhZW1vbiBpcyBhd2FrZSBjb3N0c1xcbisgKiBub3RoaW5nIGFuZCBkb2VzIG5vdCBxdWV1ZSBhbiBleHRyYSBwYXNzLlxcbisgKlxcbisgKiBPbmUgd2FrZSBjb21wbGV0ZXMgb25lIGZ1bGwgcGFzcyBvbmx5IGlmIHRoZSB3aG9sZSBtbSBsaXN0IGZpdHMgaW5cXG4rICogb25lIHNjYW4gYmF0Y2gsIHNvIGNhbGxlcnMgbXVzdCBwYWlyIHRoaXMgd2l0aCBhIGxhcmdlXFxuKyAqIHBhZ2VzX3RvX3NjYW4uXFxuKyAqL1xcbitib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBkZWFkbGluZV9tcyA9IHRpbWVvdXRfcyAqIDEwMDBVTDtcXG4rXFx0dW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9XFxuK1xcdFxcdHRocF9yZWFkX251bShcXFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1xcXCIpO1xcbitcXHR1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwO1xcbitcXHRpbnQgcGFzcztcXG4rXFxuK1xcdGZvciAocGFzcyA9IDA7IHBhc3MgXFx1MDAzYyAyOyBwYXNzKyspIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxcbitcXHRcXHRcXHR0aHBfcmVhZF9udW0oXFxcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1xcXCIpICsgMTtcXG4rXFxuK1xcdFxcdHdoaWxlICh0aHBfcmVhZF9udW0oXFxcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1xcXCIpIFxcdTAwM2MgdGFyZ2V0KSB7XFxuK1xcdFxcdFxcdGlmIChlbGFwc2VkX21zIFxcdTAwM2U9IGRlYWRsaW5lX21zKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdFxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBzbGVlcF9tcyk7XFxuK1xcdFxcdFxcdHVzbGVlcCgxMCAqIDEwMDApO1xcbitcXHRcXHRcXHRlbGFwc2VkX21zICs9IDEwO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpXFxuIHtcXG4gXFx0aWYgKCFzZXR0aW5nc19pbmRleCkge1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcbmluZGV4IDcyNmM3M2M0M2MwNWIuLmJhN2QzODM3MGQ0MzMgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcXG5AQCAtNzAsNiArNzAsNyBAQCBpbnQgdGhwX3JlYWRfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10pO1xcbiB2b2lkIHRocF93cml0ZV9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKTtcXG4gdW5zaWduZWQgbG9uZyB0aHBfcmVhZF9udW0oY29uc3QgY2hhciAqbmFtZSk7XFxuIHZvaWQgdGhwX3dyaXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XFxuK3ZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pO1xcbiBcXG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xcbiB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKTtcXG5AQCAtODMsNiArODQsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZClcXG4gXFx0aHVnZXBhZ2Vfc2F2ZV9zZXR0aW5ncygvKiB0aHAgPSAqLyB0cnVlLCAvKiBodWdldGxiID0gKi8gZmFsc2UpO1xcbiB9XFxuIFxcbitib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpO1xcbitcXG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcXG4gdW5zaWduZWQgbG9uZyB0aHBfc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcXG4gdW5zaWduZWQgbG9uZyB0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycyh2b2lkKTtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXFxuaW5kZXggMGQ2YzcxZWQyZmFlMy4uZjU3NzNkNDQ3NTQyNyAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcXG5AQCAtMzEsNiArMzEsMTEgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xcbiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjtcXG4gc3RhdGljIGludCBhbm9uX29yZGVyO1xcbiBzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyO1xcbitzdGF0aWMgYm9vbCBjb2xsYXBzZV9vcmRlcl9naXZlbjtcXG4rc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTtcXG4rc3RhdGljIGludCBucl9jb2xsYXBzZV9vcmRlcnM7XFxuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcXG4gXFxuICNkZWZpbmUgUElEX1NNQVBTIFxcXCIvcHJvYy9zZWxmL3NtYXBzXFxcIlxcbiAjZGVmaW5lIFRFU1RfRklMRSBcXFwiY29sbGFwc2VfdGVzdF9maWxlXFxcIlxcbkBAIC0yNDEsNiArMjQ2LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKVxcbiBcXHRyZXR1cm4gc3dhcDtcXG4gfVxcbiBcXG4rLypcXG4rICogUGFnZSB0aGUgcmFuZ2Ugb3V0IGFuZCB3YWl0IGZvciB0aGUgc3dhcCBjb3VudCB0byBzYXkgc28uXFxuKyAqXFxuKyAqIFR3byB0aGluZ3MgZ2V0IGluIHRoZSB3YXkuICBNQURWX1BBR0VPVVQgaXMgYmVzdCBlZmZvcnQ6XFxuKyAqIHNocmlua19mb2xpb19saXN0KCkgbGVhdmVzIGEgZm9saW8gYWxvbmUgd2hlbiBpdCBjYW5ub3QgcmVjbGFpbSBpdCByaWdodFxcbisgKiBhd2F5LCBhbmQgb25lIHN0aWxsIHVuZGVyIHdyaXRlYmFjayBmcm9tIGFuIGVhcmxpZXIgcGFnZW91dCBpcyB0aGUgY29tbW9uXFxuKyAqIGNhc2UsIHNvIHRoZSBjb3VudCB0aGUgY2FsbGVyIGFza3MgZm9yIGFycml2ZXMgYSBtb21lbnQgbGF0ZXIuICBBbmQgYSByYW5nZVxcbisgKiBhbiBlYXJsaWVyIGNvbGxhcHNlIGxlZnQgTUFEVl9IVUdFUEFHRSBpcyBvbmUga2h1Z2VwYWdlZCBpcyBzdGlsbCB3b3JraW5nXFxuKyAqIG9uOiBjb2xsYXBzaW5nIGEgcmFuZ2Ugd2l0aCB1cCB0byBtYXhfcHRlc19zd2FwIHBhZ2VzIHN3YXBwZWQgb3V0IG1lYW5zXFxuKyAqIHJlYWRpbmcgdGhvc2UgcGFnZXMgYmFjayBpbiwgc28gdGhlIGRhZW1vbiB1bmRvZXMgdGhlIHBhZ2VvdXQgYXMgZmFzdCBhcyBpdFxcbisgKiBpcyBhc2tlZCBmb3IuICBLZWVwIHRoZSByYW5nZSBvdXQgb2YgaXRzIHJlYWNoOyB0aGUgY29sbGFwc2UgdGhlIGNhbGxlciBydW5zXFxuKyAqIG5leHQgcHV0cyBNQURWX0hVR0VQQUdFIGJhY2suXFxuKyAqXFxuKyAqIEZhaWxpbmcgdG8gZ2V0IHRoZSBwYWdlcyBvdXQgaXMgdGhlIG1hY2hpbmUncyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJ3MgLS1cXG4rICogc3dhcCB0b28gc21hbGwsIHN3YXAgZnVsbCwgYSBtZW1jZyBjYXAsIGEgZm9saW8gc3RpbGwgdW5kZXIgd3JpdGViYWNrIC0tIHNvXFxuKyAqIGNhbGxlcnMgc2tpcCByYXRoZXIgdGhhbiBmYWlsLiAgQW4gZXJyb3IgZnJvbSBtYWR2aXNlKCkgaXMgZGlmZmVyZW50LCBhbmRcXG4rICogZW5kcyB0aGUgcnVuIGhlcmUuXFxuKyAqL1xcbitzdGF0aWMgYm9vbCBzd2Fwb3V0X3JhbmdlKHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcXG4re1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfTk9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX05PSFVHRVBBR0UpXFxcIik7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgNDA7IGkrKykge1xcbitcXHRcXHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX1BBR0VPVVQpKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbitcXHRcXHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcXG4rXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdFxcdHVzbGVlcCg1MCAqIDEwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgKmFsbG9jX21hcHBpbmcoaW50IG5yKVxcbiB7XFxuIFxcdHZvaWQgKnA7XFxuQEAgLTU4Myw4ICs2MjMsMTAgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sXFxuIFxcdFxcdGludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplIFxcdTAwM2NcXHUwMDNjIGNvbGxhcF9vcmRlcjtcXG4rXFx0LyogVGhyZWUgc2Vjb25kcyBhcyBhIGZsb29yLCBwbHVzIGEgc2Vjb25kIHBlciAxMjhNIHRvIGNvbGxhcHNlICovXFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9zaXplO1xcbitcXHRpbnQgdGltZW91dCA9IDYgKyAyICogKGJ5dGVzIC8gKDEyOFVMIFxcdTAwM2NcXHUwMDNjIDIwKSk7XFxuIFxcdGludCBmdWxsX3NjYW5zO1xcbi1cXHRpbnQgdGltZW91dCA9IDY7IC8qIDMgc2Vjb25kcyAqL1xcbiBcXG4gXFx0LyogU2FuaXR5IGNoZWNrICovXFxuIFxcdGlmICghb3BzLVxcdTAwM2VjaGVja19odWdlKHAsIGxlbiwgMCwgaHBhZ2Vfc2l6ZSkpXFxuQEAgLTg1MywxMiArODk1LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXFxuIFxcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuIFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXG4tXFx0aWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxcbi1cXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbi1cXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XFxuK1xcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIHBhZ2Vfc2l6ZSkpIHtcXG4gXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXHRcXHRza2lwKFxcXCJDb3VsZCBub3Qgc3dhcCBvdXRcXFwiKTtcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuQEAgLTg4NSwxMiArOTI1LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXFxuIFxcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuIFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXG4tXFx0aWYgKG1hZHZpc2UocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcXG4tXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtYWR2aXNlKE1BRFZfUEFHRU9VVClcXFwiKTtcXG4tXFx0aWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcXG4rXFx0aWYgKHN3YXBvdXRfcmFuZ2UocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcXG4gXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXHRcXHRza2lwKFxcXCJDb3VsZCBub3Qgc3dhcCBvdXRcXFwiKTtcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuQEAgLTkwMiwxMiArOTQwLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXFxuIFxcdFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiU3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlxcXCIsIG1heF9wdGVzX3N3YXAsXFxuIFxcdFxcdCAgICAgICBocGFnZV9wbWRfbnIpO1xcbi1cXHRcXHRpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxcbi1cXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbi1cXHRcXHRpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xcbitcXHRcXHRpZiAoc3dhcG91dF9yYW5nZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xcbiBcXHRcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbiBcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcdFxcdFxcdHNraXAoXFxcIkNvdWxkIG5vdCBzd2FwIG91dFxcXCIpO1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbiBcXG5AQCAtOTc0LDYgKzEwMTAsMTYgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcXG4gXFx0dm9pZCAqcDtcXG4gXFx0aW50IGk7XFxuIFxcbitcXHQvKlxcbitcXHQgKiBUaGUgdGVzdCBuZWVkcyBocGFnZV9wbWRfbnIgUE1ELW9yZGVyIGFsbG9jYXRpb25zLCB3aGljaCBpcyBsaWtlbHkgdG9cXG4rXFx0ICogZmFpbCBmb3IgbGFyZ2UgUE1EIHNpemVzLiAgU2tpcCBpZiB0aGUgUE1EIHNpemUgaXMgb3ZlciAzMk0uXFxuK1xcdCAqL1xcbitcXHRpZiAoaHBhZ2VfcG1kX3NpemUgXFx1MDAzZSAoMzJVTCBcXHUwMDNjXFx1MDAzYyAyMCkpIHtcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFxcXCIlczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBfX2Z1bmNfXyk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4gXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4gXFx0a3NmdF9wcmludF9tc2coXFxcIkNvbnN0cnVjdCBQVEUgcGFnZSB0YWJsZSBmdWxsIG9mIGRpZmZlcmVudCBQVEUtbWFwcGVkIGNvbXBvdW5kIHBhZ2VzXFxcXG5cXFwiKTtcXG4gXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGhwYWdlX3BtZF9ucjsgaSsrKSB7XFxuQEAgLTExNjQsNiArMTIxMCw3MiBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXFxuIFxcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4gfVxcbiBcXG4rLypcXG4rICogQ29udGVudCBzdGF5cyBpc29sYXRlZCB3aGlsZSBhIGNvLXNoYXJlciB3cml0ZXMgY29uY3VycmVudGx5LiBBIHNoYXJlZFxcbisgKiBzb3VyY2UgaXMgY29waWVkIGxpdmUgKG5vdCBmcm96ZW4pLCByZWx5aW5nIG9uIGl0IGJlaW5nIENvVyAtIGltbXV0YWJsZVxcbisgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb3B5OyBhIGNvLXNoYXJlcidzIHdyaXRlIGdvZXMgdG8gYSBDb1cgY29weS4gVGhlXFxuKyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5XFxuKyAqIGl0cyBvd24gd3JpdGVzLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRjb25zdCB1bnNpZ25lZCBsb25nIHNoYXJlZCA9IDY0ICogcGFnZV9zaXplO1xcbitcXHRjb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7XFxuK1xcdGludCB3c3RhdHVzLCBjaGlsZF9zdGF0dXMsIGksIG4gPSBzaGFyZWQgLyBwYWdlX3NpemU7XFxuK1xcdC8qIHZvbGF0aWxlOiB0aGUgbG9vcCBiZWxvdyBtdXN0IHJlYWxseSBzdG9yZSwgb24gZXZlcnkgaXRlcmF0aW9uICovXFxuK1xcdHZvbGF0aWxlIGludCAqaXA7XFxuK1xcdHZvaWQgKnA7XFxuK1xcbitcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHRpcCA9IHA7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgc2hhcmVkKTtcXHRcXHQvKiBzaGFyZWQgcHJlZml4LCBwcmUtZm9yayBwYXR0ZXJuICovXFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiRm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cXFwiKTtcXG4rXFx0aWYgKCFmb3JrKCkpIHtcXG4rXFx0XFx0aW50IGNvbGxhcHNlX3N0YXR1cztcXG4rXFxuK1xcdFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgc2hhcmVkLCBocGFnZV9wbWRfc2l6ZSk7XFx0LyogcHJpdmF0ZSByZW1haW5kZXIgKi9cXG4rXFx0XFx0Yy1cXHUwMDNlY29sbGFwc2UoXFxcIkNvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclxcXCIsXFxuK1xcdFxcdFxcdCAgICBwLCAxLCBvcHMsIHRydWUpO1xcbitcXHRcXHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0XFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGRlYWQwMDAwKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0aWYgKGkgPT0gbilcXG4rXFx0XFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRmYWlsKFxcXCJGYWlsOiBjaGlsZCBjb250ZW50XFxcIik7XFxuK1xcdFxcdC8qIFRoZSBjb250ZW50IGNoZWNrIG11c3Qgbm90IGJ1cnkgYSBmYWlsZWQgY29sbGFwc2UuICovXFxuK1xcdFxcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXFxuK1xcdFxcdFxcdGV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzO1xcbitcXHRcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdFxcdF9leGl0KGV4aXRfc3RhdHVzKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogSGFtbWVyIHRoZSBwYXJlbnQncyBvd24gd3JpdGVzIG92ZXIgdGhlIHNoYXJlZCBwcmVmaXguICovXFxuK1xcdGZvciAoaW50IGl0ID0gMDsgaXQgXFx1MDAzYyAyMDAwMDA7IGl0KyspXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuOyBpKyspXFxuK1xcdFxcdFxcdGlwW2kgKiBzdHJpZGVdID0gaSArIDB4YmVlZjAwMDA7XFxuK1xcbitcXHR3YWl0KFxcdTAwMjZ3c3RhdHVzKTtcXG4rXFx0LyogQSBjaGlsZCB0aGF0IGRpZWQgcmVhZGluZyB0aGUgcmFjaW5nIHBhZ2VzIGlzIGEgZmFpbHVyZSwgbm90IGEgemVyby4gKi9cXG4rXFx0Y2hpbGRfc3RhdHVzID0gV0lGRVhJVEVEKHdzdGF0dXMpID8gV0VYSVRTVEFUVVMod3N0YXR1cykgOiBLU0ZUX0ZBSUw7XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cXFwiKTtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGJlZWYwMDAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0aWYgKGkgPT0gbilcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsOiBwYXJlbnQgY29udGVudFxcXCIpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdC8qIFNhbWUgYWdhaW46IG91ciBvd24gY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQncyB2ZXJkaWN0LiAqL1xcbitcXHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxcbitcXHRcXHRleGl0X3N0YXR1cyA9IGNoaWxkX3N0YXR1cztcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbit9XFxuK1xcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuIFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuIHtcXG5AQCAtMTIwOSw2ICsxMzIxLDIxOSBAQCBzdGF0aWMgdm9pZCBtYWR2aXNlX3JldHJhY3RlZF9wYWdlX3RhYmxlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4gXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbiB9XFxuIFxcbisvKiBTbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIHdpbGwgY29uc2lkZXIgZm9yIG1USFAgY29sbGFwc2UuICovXFxuKyNkZWZpbmUgTUlOX01USFBfT1JERVIgMlxcbitcXG4rLypcXG4rICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBmb3IgdGhlIG10aHBfa2h1Z2VwYWdlZCBjb250ZXh0LiAgV2hhdFxcbisgKiB0aGV5IGFkZCBvdmVyIHRoZSBnZW5lcmljIGNhc2VzIHJ1biB1bmRlciB0aGF0IGNvbnRleHQgaXMgcGVyLXdpbmRvd1xcbisgKiBkZXRlY3Rpb246IHdoaWNoIGFsaWduZWQgd2luZG93IGNvbGxhcHNlZCwgYW5kIHdoaWNoIG9mIGl0cyBuZWlnaGJvdXJzIGRpZFxcbisgKiBub3QuICBjaGVja19odWdlKCkgYW5zd2VycyBob3cgbWFueSBmb2xpb3Mgb2YgdGhlIG9yZGVyIHRoZSByYW5nZSBob2xkcyxcXG4rICogd2hpY2ggY2Fubm90IHRlbGwgb25lIHdpbmRvdyBmcm9tIGFub3RoZXIuXFxuKyAqXFxuKyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgYW5kIHRoZSB0YXJnZXQgb3JkZXIgaXMgb25seVxcbisgKiBlbmFibGVkIGZvciBtYWR2aXNlLCBzbyB0aGUgc291cmNlcyBhcmUgYWx3YXlzIG9yZGVyIDAgYW5kIHRoZSBjb2xsYXBzZVxcbisgKiBwcm9kdWN0IGNhbiBvbmx5IGhhdmUgY29tZSBmcm9tIGtodWdlcGFnZWQuXFxuKyAqL1xcbitzdGF0aWMgc2l6ZV90IG10aHBfd2luZG93X3NpemUodm9pZClcXG4re1xcbitcXHRyZXR1cm4gcGFnZV9zaXplIFxcdTAwM2NcXHUwMDNjIGNvbGxhcHNlX29yZGVyO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB0YXJnZXQgb3JkZXIsIGZvciBtYWR2aXNlIG9ubHksIGFuZCBub3RoaW5nIGVsc2UgZW5hYmxlZDogdGhlXFxuK1xcdCAqIGNhc2VzIGZhdWx0IHRoZWlyIHJlZ2lvbiBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgc28gdGhlIHNvdXJjZXMgYXJlXFxuK1xcdCAqIG9yZGVyIDAgd2hhdGV2ZXIgLXMgYXNrZWQgdGhlIGZhdWx0IHBhdGggZm9yLiAgVGhhdCBtYXR0ZXJzIGZvciB0aGVcXG4rXFx0ICogY2FzZXMgYnVpbHQgYXJvdW5kIGEgaG9sZSAtLSBhIGxhcmdlIHNvdXJjZSBmb2xpbyB3b3VsZCBmaWxsIGl0IGluXFxuK1xcdCAqIGFuZCB0aGUgd2luZG93IHdvdWxkIGNvbGxhcHNlIGFmdGVyIGFsbC5cXG4rXFx0ICogY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcyBlbmFibGVzIHRoZSBzb3VyY2Ugb3JkZXIgaXQgd2FudHMgb25cXG4rXFx0ICogdG9wIG9mIHRoaXMuXFxuK1xcdCAqL1xcbitcXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9ORVZFUjtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX09SREVSUzsgaSsrKVxcbitcXHRcXHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcXG4rXFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2NvbGxhcHNlX29yZGVyXS5lbmFibGVkID0gVEhQX01BRFZJU0U7XFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHdpbmRvd19jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbilcXG4re1xcbitcXHRyZXR1cm4gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBsZW4sIGNvbGxhcHNlX29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XFxuK31cXG4rXFxuKy8qIE5vIGFsaWduZWQgd2luZG93IGluIFtwLCBwICsgbGVuKSBpcyBiYWNrZWQgYXQgdGhlIHRhcmdldCBvcmRlci4gKi9cXG4rc3RhdGljIGJvb2wgd2luZG93X25vdF9jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbilcXG4re1xcbitcXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xcbitcXHRjaGFyICphZGRyID0gcDtcXG4rXFxuK1xcdGZvciAoOyBsZW4gXFx1MDAzZT0gd2luZG93OyBhZGRyICs9IHdpbmRvdywgbGVuIC09IHdpbmRvdykge1xcbitcXHRcXHRpZiAod2luZG93X2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3Modm9pZClcXG4re1xcbitcXHQvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xcbitcXHRyZXR1cm4ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMzApO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbitcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xcbitcXHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxcXG5cXFwiKTtcXG4rXFxuK1xcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwICsgd2luZG93LCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwLCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwICsgMiAqIHdpbmRvdyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgaHBhZ2VfcG1kX3NpemUgLSAyICogd2luZG93KSlcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcbitcXHR2YWxpZGF0ZV9tZW1vcnkocCwgd2luZG93LCAyICogd2luZG93KTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xcbitcXHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxcXG5cXFwiKTtcXG4rXFxuK1xcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXFxcIik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxcbitcXHRcXHRmYWlsKFxcXCJUaW1lb3V0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCwgbXRocF93aW5kb3dfc2l6ZSgpKSlcXG4rXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcbitcXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4rXFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcXG4rXFx0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDtcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XFxuK1xcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXFxcblxcXCIpO1xcbitcXG4rXFx0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCB3aW5kb3cpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwICsgd2luZG93LCB3aW5kb3cpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbitcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRpbnQgc291cmNlX29yZGVyID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgOiBNSU5fTVRIUF9PUkRFUjtcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdC8qIFNvdXJjZXMgbXVzdCBiZSBhIHN1cHBvcnRlZCBtVEhQIG9yZGVyIHN0cmljdGx5IGJlbG93IHRoZSB0YXJnZXQuICovXFxuK1xcdGlmIChzb3VyY2Vfb3JkZXIgXFx1MDAzZT0gY29sbGFwc2Vfb3JkZXIgfHxcXG4rXFx0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2Mgc291cmNlX29yZGVyKSkpIHtcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFxcXCIlczogbm8gc291cmNlIG9yZGVyIGJlbG93IHRhcmdldFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgICAgX19mdW5jX18pO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcXG4rXFxuK1xcdC8qIEZhdWx0IHRoZSB3aG9sZSByZWdpb24gYXMgb3JkZXItQHNvdXJjZV9vcmRlciBmb2xpb3MuICovXFxuK1xcdHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XFxuK1xcdHNldHRpbmdzLmh1Z2VwYWdlc1tzb3VyY2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIG9yZGVyIGlzIGVuYWJsZWQgYW5kIHN1cHBvcnRlZCwgYnV0IHRoZSBhbGxvY2F0b3IgY2FuIHN0aWxsIGZhbGxcXG4rXFx0ICogYmFjayB1bmRlciBmcmFnbWVudGF0aW9uLiAgVGhhdCBsZWF2ZXMgbm90aGluZyB0byBjb2xsYXBzZSBmcm9tLFxcbitcXHQgKiB3aGljaCBpcyB0aGUgbWFjaGluZSdzIGFuc3dlciByYXRoZXIgdGhhbiBhIHJlYXNvbiB0byBlbmQgdGhlIHJ1bi5cXG4rXFx0ICovXFxuK1xcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJObyBvcmRlci0lZCBzb3VyY2VzIHRvIGNvbGxhcHNlLi4uXFxcIiwgc291cmNlX29yZGVyKTtcXG4rXFx0XFx0c2tpcChcXFwiU2tpcFxcXCIpO1xcbitcXHRcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdFxcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXFxcIixcXG4rXFx0XFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XFxuK1xcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxcbitcXHRcXHRmYWlsKFxcXCJUaW1lb3V0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdG9wcy1cXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuIHtcXG4gXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJcXFxcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdIFxcdTAwM2N0ZXN0IHR5cGVcXHUwMDNlIFtkaXJdXFxcXG5cXFxcblxcXCIpO1xcbkBAIC0xMjI2LDExICsxNTUxLDE1IEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuIFxcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0LXM6IG1USFAgc2l6ZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxcXG5cXFwiKTtcXG4gXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXFxcblxcXCIpO1xcbiBcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdC1jOiBjb2xsYXBzZSBvcmRlciBmb3IgbVRIUCBjb2xsYXBzZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxcXG5cXFwiKTtcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgRGVmYXVsdHMgdG8gZXZlcnkgc3VwcG9ydGVkIG9yZGVyIGJlbG93IHRoZSBQTUQuXFxcXG5cXFwiKTtcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQgICAgV2l0aCAtcywgLXMgbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXFxcblxcXCIpO1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBtaXhlZC1zb3VyY2UgY2FzZSAoc291cmNlIG9yZGVyIGJlbG93IHRoZSB0YXJnZXQpLlxcXFxuXFxcIik7XFxuIFxcdGV4aXQoMSk7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIHtcXG4rXFx0Ym9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlO1xcbiBcXHRpbnQgb3B0O1xcbiBcXHRjaGFyICpidWY7XFxuIFxcdGNvbnN0IGNoYXIgKnRva2VuO1xcbkBAIC0xMjQyLDYgKzE1NzEsNyBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0Y2FzZSAnYyc6XFxuIFxcdFxcdFxcdGNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpO1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcl9naXZlbiA9IHRydWU7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRjYXNlICdoJzpcXG4gXFx0XFx0ZGVmYXVsdDpcXG5AQCAtMTI0OSwxMiArMTU3OSwyNSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHR9XFxuIFxcdH1cXG4gXFxuK1xcdC8qXFxuK1xcdCAqIEJvdGggb3JkZXJzIGVuZCB1cCBhcyBhcnJheSBpbmRpY2VzIGFuZCBzaGlmdCBjb3VudHMsIHNvIG5laXRoZXJcXG4rXFx0ICogY2FuIGJlIG5lZ2F0aXZlLCBhbmQgYSB6ZXJvIGNvbGxhcHNlIG9yZGVyIGFza3MgZm9yIGJhc2UgcGFnZXMuXFxuK1xcdCAqL1xcbitcXHRpZiAoYW5vbl9vcmRlciBcXHUwMDNjIDAgfHwgYW5vbl9vcmRlciBcXHUwMDNlIGhwYWdlX3BtZF9vcmRlcilcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCItcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBocGFnZV9wbWRfb3JkZXIsIGFub25fb3JkZXIpO1xcbitcXHRpZiAoY29sbGFwc2Vfb3JkZXJfZ2l2ZW4gXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIChjb2xsYXBzZV9vcmRlciBcXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFxcdTAwM2UgaHBhZ2VfcG1kX29yZGVyKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCItYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBocGFnZV9wbWRfb3JkZXIsIGNvbGxhcHNlX29yZGVyKTtcXG4rXFxuIFxcdGFyZ3YgKz0gb3B0aW5kO1xcbiBcXHRhcmdjIC09IG9wdGluZDtcXG4gXFxuIFxcdGlmIChhcmdjID09IDApIHtcXG4tXFx0XFx0LyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi9cXG4rXFx0XFx0LyogRXZlcnl0aGluZyB0aGF0IG5lZWRzIG5vIGFyZ3VtZW50IG9mIGl0cyBvd246IGFub24sIGV2ZXJ5IGNvbnRleHQgKi9cXG4gXFx0XFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XFxuIFxcdFxcdG1hZHZpc2VfY29udGV4dCA9ICBcXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XFxuIFxcdFxcdGFub25fb3BzID0gXFx1MDAyNl9fYW5vbl9vcHM7XFxuIFxcdFxcdHJldHVybjtcXG5AQCAtMTI2NSwxMyArMTYwOCwxOSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXG4gXFx0aWYgKCFzdHJjbXAodG9rZW4sIFxcXCJhbGxcXFwiKSkge1xcbiBcXHRcXHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXFx1MDAyNl9fa2h1Z2VwYWdlZF9jb250ZXh0O1xcbitcXHRcXHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dDtcXG4gXFx0XFx0bWFkdmlzZV9jb250ZXh0ID0gIFxcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIFxcXCJhbGxcXFwiIHN3ZWVwcyB0aGUgbVRIUCBjb250ZXh0IGluLCBidXQgaXQgb25seSBoYXMgYW5vblxcbitcXHRcXHQgKiBjYXNlczogc3RlcCBpdCBhc2lkZSBmb3IgdGhlIG90aGVyIG1lbV90eXBlcyByYXRoZXIgdGhhblxcbitcXHRcXHQgKiByZWZ1c2luZyB0aGUgd2hvbGUgcnVuLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0bXRocF9jb250ZXh0X2ltcGxpZWQgPSB0cnVlO1xcbiBcXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFxcXCJraHVnZXBhZ2VkXFxcIikpIHtcXG4gXFx0XFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcXFwibXRocF9raHVnZXBhZ2VkXFxcIikpIHtcXG4gXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XFxuLVxcdFxcdGlmIChjb2xsYXBzZV9vcmRlciBcXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFxcdTAwM2U9IGhwYWdlX3BtZF9vcmRlcilcXG4tXFx0XFx0XFx0dXNhZ2UoKTtcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcXFwibWFkdmlzZVxcXCIpKSB7XFxuIFxcdFxcdG1hZHZpc2VfY29udGV4dCA9ICBcXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XFxuIFxcdH0gZWxzZSB7XFxuQEAgLTEyODcsMjAgKzE2MzYsMjAgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICBcXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xcbiBcXHRcXHRhbm9uX29wcyA9IFxcdTAwMjZfX2Fub25fb3BzO1xcbiBcXHRcXHRzaG1lbV9vcHMgPSBcXHUwMDI2X19zaG1lbV9vcHM7XFxuLVxcdFxcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcXG4tXFx0XFx0XFx0dXNhZ2UoKTtcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXFxcImFub25cXFwiKSkge1xcbiBcXHRcXHRhbm9uX29wcyA9IFxcdTAwMjZfX2Fub25fb3BzO1xcbiBcXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcXFwiZmlsZVxcXCIpKSB7XFxuIFxcdFxcdHJlYWRfb25seV9maWxlX29wcyA9ICBcXHUwMDI2X19yZWFkX29ubHlfZmlsZV9vcHM7XFxuIFxcdFxcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9ICBcXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XFxuIFxcdFxcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcztcXG4tXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KVxcbitcXHRcXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXFx1MDAyNlxcdTAwMjYgIW10aHBfY29udGV4dF9pbXBsaWVkKVxcbiBcXHRcXHRcXHR1c2FnZSgpO1xcbitcXHRcXHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9IE5VTEw7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFxcXCJzaG1lbVxcXCIpKSB7XFxuIFxcdFxcdHNobWVtX29wcyA9IFxcdTAwMjZfX3NobWVtX29wcztcXG4tXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KVxcbitcXHRcXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXFx1MDAyNlxcdTAwMjYgIW10aHBfY29udGV4dF9pbXBsaWVkKVxcbiBcXHRcXHRcXHR1c2FnZSgpO1xcbitcXHRcXHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9IE5VTEw7XFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdHVzYWdlKCk7XFxuIFxcdH1cXG5AQCAtMTMyMiw5ICsxNjcxLDE0IEBAIHN0cnVjdCB0ZXN0X2Nhc2Uge1xcbiBcXHRzdHJ1Y3QgbWVtX29wcyAqb3BzO1xcbiBcXHRjb25zdCBjaGFyICpkZXNjO1xcbiBcXHR0ZXN0X2ZuIGZuO1xcbitcXHRpbnQgb3JkZXI7XFx0XFx0LyogbVRIUCBjb250ZXh0czogdGhlIGNvbGxhcHNlIG9yZGVyICovXFxuIH07XFxuIFxcbi0jZGVmaW5lIE1BWF9URVNUX0NBU0VTIDY0XFxuKy8qXFxuKyAqIEVub3VnaCBmb3IgZXZlcnkgY2FzZSBhdCBldmVyeSBvcmRlciB0aGUga2VybmVsIG9mZmVyczogdGhlIG1USFAgY29udGV4dFxcbisgKiBydW5zIGl0cyBjYXNlcyBvbmNlIHBlciBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cXG4rICovXFxuKyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2XFxuIHN0YXRpYyBzdHJ1Y3QgdGVzdF9jYXNlIHRlc3RfY2FzZXNbTUFYX1RFU1RfQ0FTRVNdO1xcbiBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XFxuIFxcbkBAIC0xMzM3LDYgKzE2OTEsNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XFxuIFxcdFxcdFxcdC5vcHNcXHQ9IG8sXFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHRcXHRcXHQuZGVzY1xcdD0gI3QsXFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHRcXHRcXHQuZm5cXHQ9IHQsXFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHRcXHRcXHQub3JkZXJcXHQ9IGNvbGxhcHNlX29yZGVyLFxcdFxcdFxcdFxcXFxcXG4gXFx0XFx0fTtcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdH1cXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdH0gd2hpbGUgKDApXFxuQEAgLTEzNzcsOCArMTczMiw4MyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcbiBcXHRwYXJzZV90ZXN0X3R5cGUoYXJnYywgYXJndik7XFxuIFxcbitcXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xcbitcXG4rXFx0XFx0aWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuKSB7XFxuK1xcdFxcdFxcdC8qIC1jIHBpbnMgb25lIG9yZGVyOyBpdCBoYXMgdG8gYmUgb25lIHdlIGNhbiBidWlsZCAqL1xcbitcXHRcXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIi1jIHRha2VzIGFuIG9yZGVyIGJlbG93IHRoZSBQTUQgb3JkZXIgKCVkKVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgaHBhZ2VfcG1kX29yZGVyKTtcXG4rXFx0XFx0XFx0aWYgKCEob3JkZXJzIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIpO1xcbitcXHRcXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzYz0gYW5vbl9vcmRlcilcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIi1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gY29sbGFwc2Vfb3JkZXI7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIE90aGVyd2lzZSBldmVyeSBvcmRlciBhIGNvbGxhcHNlIGNvdWxkIHByb2R1Y2UuICAtc1xcbitcXHRcXHRcXHQgKiBtYWtlcyB0aGUgZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlcixcXG4rXFx0XFx0XFx0ICogc28gYSB0YXJnZXQgYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2U6XFxuK1xcdFxcdFxcdCAqIHRoZSBzb3VyY2VzIGFyZSBhbHJlYWR5IHRoZSBzaXplIGJlaW5nIGFza2VkIGZvci5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGludCBmaXJzdCA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyICsgMSA6IE1JTl9NVEhQX09SREVSO1xcbitcXG4rXFx0XFx0XFx0aWYgKGZpcnN0IFxcdTAwM2MgTUlOX01USFBfT1JERVIpXFxuK1xcdFxcdFxcdFxcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XFxuK1xcdFxcdFxcdGZvciAoaW50IGkgPSBmaXJzdDsgaSBcXHUwMDNjIGhwYWdlX3BtZF9vcmRlcjsgaSsrKSB7XFxuK1xcdFxcdFxcdFxcdGlmIChvcmRlcnMgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGkpKVxcbitcXHRcXHRcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gaTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcXG4rXFx0XFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm1USFAgY2FzZXMgc2tpcHBlZDogbm8gb3JkZXIgYWJvdmUgdGhlIHNvdXJjZVxcXFxuXFxcIik7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XFxuK1xcdFxcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdFxcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcXFwiKTtcXG4rXFx0XFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiLCBPX1JET05MWSk7XFxuK1xcdFxcdGlmIChrcGFnZWZsYWdzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL2twYWdlZmxhZ3MpXFxcIik7XFxuK1xcdH1cXG4rXFxuIFxcdHNldGJ1ZihzdGRvdXQsIE5VTEwpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogVGhlIHBhZ2UgY2FjaGUgY2FwcyBmb2xpbyBvcmRlciBhdCBNQVhfUEFHRUNBQ0hFX09SREVSLCB3aGljaFxcbitcXHQgKiB4YXNfc3BsaXRfYWxsb2MoKSBwdXRzIGJlbG93IHRoZSBQTUQgb3JkZXIgb24gYXJtNjQgd2l0aCA2NEsgcGFnZXMuXFxuK1xcdCAqIEEgUE1ELXNpemVkIHBhZ2UgY2FjaGUgZm9saW8gaXMgdGhlbiBpbXBvc3NpYmxlLCBzbyB0aGUga2VybmVsXFxuK1xcdCAqIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5IGRlc2lnbiBhbmQgdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LlxcbitcXHQgKlxcbitcXHQgKiBUaGUgY2FwIGlzIG9uZSBnbG9iYWwsIHNvIGl0IHJ1bGVzIG91dCBldmVyeSBmaWxlIG1hcHBpbmcsIG5vdCBqdXN0XFxuK1xcdCAqIHNobWVtOiBzaG1lbV9odWdlX2dsb2JhbF9lbmFibGVkKCkgZHJvcHMgdGhlIFBNRCBvcmRlciBmcm9tIHdoYXQgaXRcXG4rXFx0ICogYWxsb3dzLCBhbmQgZmlsZV90aHBfZW5hYmxlZCgpIHJlZnVzZXMgYSByZWd1bGFyIGZpbGUgd2hvc2UgbWFwcGluZ1xcbitcXHQgKiBjYW5ub3QgaG9sZCBhIFBNRCBmb2xpby5cXG4rXFx0ICpcXG4rXFx0ICogVGhlIHBlci1vcmRlciBzaG1lbV9lbmFibGVkIGNvbnRyb2wgYmVsb3cgaXMgd2hhdCBtYWtlcyB0aGUgY2FwXFxuK1xcdCAqIHJlYWRhYmxlOiBpdCBpcyBjcmVhdGVkIGZvciB0aGUgb3JkZXJzIGluIFRIUF9PUkRFUlNfQUxMX0ZJTEVfREVGQVVMVCxcXG4rXFx0ICogd2hpY2ggaXMgdGhlIGNhcCBhbmQgbm90aGluZyBlbHNlLCBzbyB3aGV0aGVyIHRoZSBQTUQgb3JkZXIgaGFzIG9uZVxcbitcXHQgKiBhbnN3ZXJzIGZvciBhIHJlZ3VsYXIgZmlsZSBhcyBtdWNoIGFzIGZvciBzaG1lbS5cXG4rXFx0ICovXFxuK1xcdGlmICghKHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGhwYWdlX3BtZF9vcmRlcikpKSB7XFxuK1xcdFxcdGlmIChzaG1lbV9vcHMpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm5vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBzaG1lbVxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdHNobWVtX29wcyA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKHJlYWRfb25seV9maWxlX29wcykge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xcbitcXHRcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSBOVUxMO1xcbitcXHRcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gTlVMTDtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoIWFub25fb3BzIFxcdTAwMjZcXHUwMDI2ICFzaG1lbV9vcHMgXFx1MDAyNlxcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcXG4rXFx0XFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIk5vdGhpbmcgbGVmdCB0byBjb2xsYXBzZSBpbnRvXFxcXG5cXFwiKTtcXG4rXFx0fVxcbitcXG4gXFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxO1xcbiBcXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc3dhcCA9IGhwYWdlX3BtZF9uciAvIDg7XFxuIFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyO1xcbkBAIC0xMzk2LDcgKzE4MjYsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTtcXG4tXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIG5yX2NvbGxhcHNlX29yZGVyczsgaSsrKSB7XFxuK1xcdFxcdGNvbGxhcHNlX29yZGVyID0gY29sbGFwc2Vfb3JkZXJzW2ldO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdH1cXG4rXFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG5AQCAtMTQwNCwxMCArMTg0NCw4IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7XFxuIFxcbiBcXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4tXFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcbi1cXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9tdGhwLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXG4gXFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxuQEAgLTE0NjMsNiArMTkwMSw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcbitcXHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXG4gXFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xcbiBcXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xcbkBAIC0xNDc4LDcgKzE5MTksMTUgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIG5yX3Rlc3RfY2FzZXM7IGkrKykge1xcbiBcXHRcXHRzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gXFx1MDAyNnRlc3RfY2FzZXNbaV07XFxuIFxcbi1cXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiXFxcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXFxcXG5cXFwiLCB0LVxcdTAwM2VkZXNjLCB0LVxcdTAwM2VjdHgtXFx1MDAzZW5hbWUsIHQtXFx1MDAzZW9wcy1cXHUwMDNlbmFtZSk7XFxuK1xcdFxcdGlmICh0LVxcdTAwM2VjdHggPT0gXFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcXG4rXFx0XFx0XFx0Y29sbGFwc2Vfb3JkZXIgPSB0LVxcdTAwM2VvcmRlcjtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIlxcXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzLCBvcmRlciAlZClcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB0LVxcdTAwM2VkZXNjLCB0LVxcdTAwM2VjdHgtXFx1MDAzZW5hbWUsIHQtXFx1MDAzZW9wcy1cXHUwMDNlbmFtZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHQtXFx1MDAzZW9yZGVyKTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIlxcXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcXFxuXFxcIiwgdC1cXHUwMDNlZGVzYyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHQtXFx1MDAzZWN0eC1cXHUwMDNlbmFtZSwgdC1cXHUwMDNlb3BzLVxcdTAwM2VuYW1lKTtcXG4rXFx0XFx0fVxcbiBcXHRcXHR0LVxcdTAwM2Vmbih0LVxcdTAwM2VjdHgsIHQtXFx1MDAzZW9wcyk7XFxuIFxcdH1cXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjM2MDFjMDMwZDQzZTVcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcXG5AQCAtMCwwICsxLDYxMCBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBraHVnZXBhZ2VkIHJhY2UgaGFybmVzcy5cXG4rICpcXG4rICogUnVucyBjb2xsYXBzZSBhZ2FpbnN0IGNvbmN1cnJlbnQgZmF1bHRzLCB0cmFuc2llbnQgR1VQIHBpbnNcXG4rICogKGd1cF90ZXN0KSwgZm9yaywgbXJlbWFwIGFuZCBNQURWX0RPTlRORUVEIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLCBpblxcbisgKiBvbmUgb2YgdGhyZWUgZHJpdmVyIG1vZGVzOlxcbisgKlxcbisgKiAgIHN0ZXBwZWRcXHRraHVnZXBhZ2VkLCBvbmUgZnVsbCBwYXNzIGF0IGEgdGltZSB0aHJvdWdoXFxuKyAqXFx0XFx0a2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSwgc28gYSBzdGVwIGNvdmVycyBhIGtub3duIGV4dGVudDtcXG4rICogICBmcmVlXFx0a2h1Z2VwYWdlZCBsZWZ0IHRvIHJ1biAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCksIGZvciBzb2FrO1xcbisgKiAgIG1hZHZpc2VcXHRNQURWX0NPTExBUFNFIGluIGEgbG9vcC5cXG4rICpcXG4rICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuICBPY2N1cGFuY3kgcnVucyBhdCBib3RoIGVuZHNcXG4rICogb2Ygd2hhdCBtVEhQIGNvbGxhcHNlIHN1cHBvcnRzOiBtYXhfcHRlc19ub25lIDAsIHdoZXJlIGEgd2luZG93IG11c3QgYmVcXG4rICogZnVsbHkgcG9wdWxhdGVkLCBhbmQgSFBBR0VfUE1EX05SIC0gMSwgd2hlcmUgYSB3aW5kb3cgZnVsbCBvZiBob2xlc1xcbisgKiBjb2xsYXBzZXMgdG9vLiAgVGhlIGhvbGVzIGFyZSBub3QgY29waWVkIGZyb20gYW55d2hlcmUgLS0gdGhleSBhcmVcXG4rICogemVyby1maWxsZWQsIGFuZCByZS1jaGVja2VkIHVuZGVyIHRoZSBwYWdlIHRhYmxlIGxvY2sgYXQgaW5zdGFsbCB0aW1lIGluXFxuKyAqIGNhc2UgYSByYWNpbmcgZmF1bHQgZ290IHRoZXJlIGZpcnN0LlxcbisgKlxcbisgKiAtcCBhZGRzIG1lbW9yeSBwcmVzc3VyZSB0byBhbnkgb2YgdGhlIGFib3ZlOiBNQURWX1BBR0VPVVQgY3ljbGluZ1xcbisgKiBvbiBhIGRlZGljYXRlZCBuZWlnaGJvciByZWdpb24gKHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuOyBza2lwcGVkXFxuKyAqIHdpdGggYSBub3RlIHdoZW4gdGhlIGhvc3QgaGFzIG5vIHN3YXApIGFuZCBhIGNvbXBhY3RfbWVtb3J5IHRyaWdnZXJcXG4rICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UncyBmcmVlemVcXG4rICogd2l0aCByZWZjb3VudCBlbGV2YXRpb24gYW5kIG1pZ3JhdGlvbiBlbnRyaWVzIG9mIGl0cyBvd24pLlxcbisgKlxcbisgKiBDb3JyZWN0bmVzcyBzaWduYWxzOiBldmVyeSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3JcXG4rICogemVybyAoTUFEVl9ET05UTkVFRCksIG5ldmVyIGFueXRoaW5nIGVsc2UuICBUaGUgZmF1bHRlcnMgYW5kIHRoZSBmb3JrXFxuKyAqIGNoaWxkcmVuIGNoZWNrIHRoYXQgY29udGludW91c2x5LCBhIGZpbmFsIHN3ZWVwIGNoZWNrcyBpdCBvbmNlIG1vcmUsIHBsdXNcXG4rICogd2hhdGV2ZXIgREVCVUdfVk0gLyBwYWdlX3RhYmxlX2NoZWNrIC8gS0FTQU4gLyBsb2NrZGVwIHJlcG9ydCBpblxcbisgKiBkbWVzZywgd2hpY2ggdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBpbnNwZWN0LlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZXJybm8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9pb2N0bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy90aW1lLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwia3NlbGZ0ZXN0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ2bV91dGlsLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJodWdlcGFnZV9zZXR0aW5ncy5oXFxcIlxcbisjaW5jbHVkZSBcXFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFxcXCJcXG4rXFxuKyNkZWZpbmUgQkFTRV9BRERSXFx0KCh2b2lkICopKDFVTCBcXHUwMDNjXFx1MDAzYyAzMCkpXFxuK1xcbisvKlxcbisgKiBTaGFyZWQgcGxheWdyb3VuZCBmb3IgZmF1bHRzL3BpbnMvZm9yay9kb250bmVlZDogc2V2ZXJhbCBQTUQtc2l6ZWRcXG4rICogYXJlYXMgdGhlIHJhY2luZyB0aHJlYWRzIHNwcmVhZCBhY3Jvc3MsIHBsdXMgb25lIGFyZWEgb3duZWQgYnkgdGhlXFxuKyAqIG1yZW1hcCB0aHJlYWQuIE1vcmUgYXJlYXMgbWVhbnMgbW9yZSBpbmRlcGVuZGVudCByZWdpb25zIGNvbGxhcHNpbmdcXG4rICogYXQgb25jZTsgdGhlIGRlZmF1bHQgc3VpdHMgYSBub3JtYWwgbWFjaGluZS4gT24gYSBtZW1vcnktY29uc3RyYWluZWRcXG4rICogaG9zdCAtLSBvciB1bmRlciBlbXVsYXRpb24sIHdoZXJlIGEgNTEyTSBQTUQgKGFybTY0LzY0SykgbWFrZXMgdGhlXFxuKyAqIGRlZmF1bHQgcGxheWdyb3VuZCBtdWx0aS1naWdhYnl0ZSAtLSBwYXNzIC1hIHRvIHNocmluayBpdC5cXG4rICovXFxuKyNkZWZpbmUgREVGQVVMVF9TSEFSRURfQVJFQVNcXHQzXFxuK3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzO1xcbitzdGF0aWMgaW50IG5yX2FyZWFzO1xcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcXG4rc3RhdGljIGNoYXIgKnJlZ2lvbjtcXHRcXHQvKiBOUl9BUkVBUyAqIGhwYWdlX3BtZF9zaXplICovXFxuK3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTtcXHQvKiByZWdpb24gKyBOUl9TSEFSRURfQVJFQVMgYXJlYXMgKi9cXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9zY3JhdGNoO1xcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xcbitzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1xcdC8qIC1wOiBkZWRpY2F0ZWQgcHJlc3N1cmUgcmVnaW9uICovXFxuK3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplO1xcbitzdGF0aWMgaW50IGd1cF9mZCA9IC0xO1xcbitzdGF0aWMgdm9sYXRpbGUgaW50IHN0b3A7XFxuK3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkO1xcbitcXG4rc3RhdGljIHVuc2lnbmVkIGludCBwYXR0ZXJuKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHZhbCA9ICh1bnNpZ25lZCBpbnQpcGFnZV9pZHggKiAyNjU0NDM1NzYxVTtcXG4rXFxuK1xcdHJldHVybiB2YWwgPyB2YWwgOiAxO1xcdC8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqL1xcbit9XFxuK1xcbisvKiBaZXJvIG1lYW5zIG5ldmVyIHdyaXR0ZW47IGFueXRoaW5nIGVsc2UgbXVzdCBiZSB0aGlzIHBhZ2UncyBwYXR0ZXJuICovXFxuK3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbClcXG4re1xcbitcXHQqdmFsID0gKih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xcbitcXG4rXFx0cmV0dXJuICp2YWwgXFx1MDAyNlxcdTAwMjYgKnZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCB2YWw7XFxuK1xcbitcXHRpZiAocGFnZV9pc19jb3JydXB0KHBhZ2VfaWR4LCBcXHUwMDI2dmFsKSkge1xcbitcXHRcXHRjb3JydXB0ZWQgPSAxO1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICAgIHBhZ2VfaWR4LCB2YWwsIHBhdHRlcm4ocGFnZV9pZHgpKTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZClcXG4re1xcbitcXHRyZXR1cm4gbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7XFxuK31cXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRfcGFnZSh1bnNpZ25lZCBpbnQgKnNlZWQpXFxuK3tcXG4rXFx0cmV0dXJuICh1bnNpZ25lZCBsb25nKXJhbmRfcihzZWVkKSAlIHNoYXJlZF9wYWdlcygpO1xcbit9XFxuK1xcbisvKiBQYWdlcyBsZWZ0IGZyb20gQHBhZ2VfaWR4LCBzbyBhIHJhbmdlIG5ldmVyIHJlYWNoZXMgdGhlIG1yZW1hcCB0aHJlYWQncyBhcmVhICovXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJvb21fZnJvbSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBsb25nIHdhbnQpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBsZWZ0ID0gc2hhcmVkX3BhZ2VzKCkgLSBwYWdlX2lkeDtcXG4rXFxuK1xcdHJldHVybiB3YW50IFxcdTAwM2MgbGVmdCA/IHdhbnQgOiBsZWZ0O1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqZmF1bHRlcl9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcXHUwMDI2c2VlZCk7XFxuK1xcbitcXHRcXHRpZiAocmFuZF9yKFxcdTAwMjZzZWVkKSBcXHUwMDI2IDEpXFxuK1xcdFxcdFxcdCoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKSA9XFxuK1xcdFxcdFxcdFxcdHBhdHRlcm4ocGFnZV9pZHgpO1xcbitcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdGNoZWNrX3BhZ2UocGFnZV9pZHgpO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqZG9udG5lZWRfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXFx1MDAyNnNlZWQpO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIG5yID0gMVVMIFxcdTAwM2NcXHUwMDNjIChyYW5kX3IoXFx1MDAyNnNlZWQpICUgNik7XFx0LyogMS4uMzIgcGFnZXMgKi9cXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIE9uY2UgaW4gYSB3aGlsZSB6YXAgYSB3aG9sZSBQTUQtYWxpZ25lZCBhcmVhOiBvbmx5IGEgemFwXFxuK1xcdFxcdCAqIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZSByZWNsYWltXFxuK1xcdFxcdCAqIChDT05GSUdfUFRfUkVDTEFJTSksIHdoaWNoIGNhbiBmcmVlIHRoZSB0YWJsZSB1bmRlciBhXFxuK1xcdFxcdCAqIGNvbGxhcHNlIHRoYXQgaXMgbWlkd2F5IHRocm91Z2ggaXQuICBTdWItdGFibGUgemFwcyBuZXZlclxcbitcXHRcXHQgKiByZWFjaCB0aGF0IHBhdGguXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoIShyYW5kX3IoXFx1MDAyNnNlZWQpICUgNjQpKSB7XFxuK1xcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYXJlYSA9IHBhZ2VfaWR4IC9cXG4rXFx0XFx0XFx0XFx0XFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTtcXG4rXFxuK1xcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgYXJlYSAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUsXFxuK1xcdFxcdFxcdFxcdHJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLFxcbitcXHRcXHRcXHRcXHRNQURWX0RPTlRORUVEKTtcXG4rXFx0XFx0fVxcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDUwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7fTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcXHUwMDI2c2VlZCk7XFxuK1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIG5yID0gcm9vbV9mcm9tKHBhZ2VfaWR4LCAxNik7XFxuK1xcbitcXHRcXHRndXAuYWRkciA9ICh1bnNpZ25lZCBsb25nKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XFxuK1xcdFxcdGd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7XFxuK1xcdFxcdGd1cC5ucl9wYWdlc19wZXJfY2FsbCA9IG5yO1xcbitcXHRcXHRndXAuZ3VwX2ZsYWdzID0gMTtcXHQvKiBGT0xMX1dSSVRFICovXFxuK1xcdFxcdC8qIFJhY2luZyBNQURWX0RPTlRORUVEIG1ha2VzIHRyYW5zaWVudCBmYWlsdXJlcyBleHBlY3RlZC4gKi9cXG4rXFx0XFx0aW9jdGwoZ3VwX2ZkLCBQSU5fRkFTVF9CRU5DSE1BUkssIFxcdTAwMjZndXApO1xcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICpmb3JrZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHBpZF90IHBpZCA9IGZvcmsoKTtcXG4rXFxuK1xcdFxcdGlmIChwaWQgPT0gMCkge1xcbitcXHRcXHRcXHR1bnNpZ25lZCBpbnQgdmFsO1xcbitcXHRcXHRcXHRpbnQgYmFkID0gMDtcXG4rXFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIE5vIHN0ZGlvIGluIHRoZSBjaGlsZDogYSB0aHJlYWQgbWF5IGhhdmUgaGVsZFxcbitcXHRcXHRcXHQgKiBzdGRvdXQncyBsb2NrIHdoZW4gd2UgZm9ya2VkLCBhbmQgcHJpbnRpbmcgdW5kZXIgYW5cXG4rXFx0XFx0XFx0ICogaW5oZXJpdGVkIGxvY2sgaGFuZ3MuICBUaGUgcGFyZW50IHJlcG9ydHMgd2hhdCB0aGVcXG4rXFx0XFx0XFx0ICogZXhpdCBzdGF0dXMgc2F5cy5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgMTY7IGkrKylcXG4rXFx0XFx0XFx0XFx0YmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoXFx1MDAyNnNlZWQpLCBcXHUwMDI2dmFsKTtcXG4rXFx0XFx0XFx0X2V4aXQoYmFkKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAocGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRpbnQgd3N0YXR1cztcXG4rXFxuK1xcdFxcdFxcdGlmICh3YWl0cGlkKHBpZCwgXFx1MDAyNndzdGF0dXMsIDApIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJ3YWl0cGlkKClcXFwiKTtcXG4rXFx0XFx0XFx0LyogQSBjaGlsZCBraWxsZWQgb24gdGhlIHJlYWQgY291bnRzIHRvbywgbm90IGp1c3QgaXRzIGV4aXQgY29kZS4gKi9cXG4rXFx0XFx0XFx0aWYgKCFXSUZFWElURUQod3N0YXR1cykgfHwgV0VYSVRTVEFUVVMod3N0YXR1cykpXFxuK1xcdFxcdFxcdFxcdGNvcnJ1cHRlZCA9IDE7XFxuK1xcdFxcdH1cXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDAwKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgKm1yZW1hcHBlcl9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0dm9pZCAqcDtcXG4rXFxuK1xcdFxcdHAgPSBtcmVtYXAobXJlbWFwX2FyZWEsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0ICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9zY3JhdGNoKTtcXG4rXFx0XFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtcmVtYXAoKSBhd2F5XFxcIik7XFxuK1xcdFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgODsgaSsrKVxcbitcXHRcXHRcXHRtcmVtYXBfc2NyYXRjaFsocmFuZF9yKFxcdTAwMjZzZWVkKSAlXFxuK1xcdFxcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkpICogcGFnZV9zaXplXSA9IDE7XFxuK1xcdFxcdHAgPSBtcmVtYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0ICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9hcmVhKTtcXG4rXFx0XFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtcmVtYXAoKSBiYWNrXFxcIik7XFxuK1xcdFxcdHVzbGVlcChyYW5kX3IoXFx1MDAyNnNlZWQpICUgMjAwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuKy8qXFxuKyAqIC1wOiBzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBvZiBvdXIgb3duLiBUaGUgY29udGVudFxcbisgKiBjaGVjayBpcyBleGFjdDogYSBwYWdlIG91dCBhbmQgYmFjayB0aHJvdWdoIHN3YXAgbXVzdCBwcmVzZXJ2ZSB0aGVcXG4rICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgKnBhZ2VvdXRfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXHR1bnNpZ25lZCBsb25nIG5yID0gcGFnZW91dF9zaXplIC8gcGFnZV9zaXplO1xcbitcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnI7IGkrKylcXG4rXFx0XFx0Kih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdG1hZHZpc2UocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUsIE1BRFZfUEFHRU9VVCk7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuciBcXHUwMDI2XFx1MDAyNiAhc3RvcDsgaSsrKSB7XFxuK1xcdFxcdFxcdHVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgK1xcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGkgKiBwYWdlX3NpemUpO1xcbitcXG4rXFx0XFx0XFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XFxuK1xcdFxcdFxcdFxcdGNvcnJ1cHRlZCA9IDE7XFxuK1xcdFxcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBpLCB2YWwsIHBhdHRlcm4oaSkpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDAwKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLyogLXA6IGNvbXBhY3Rpb24gbWlncmF0ZXMgdGhlIGNvbGxhcHNlIHNvdXJjZXMgb3V0IGZyb20gdW5kZXIgdXMuICovXFxuK3N0YXRpYyB2b2lkICpjb21wYWN0b3JfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXHRpbnQgZmQgPSBvcGVuKFxcXCIvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnlcXFwiLCBPX1dST05MWSk7XFxuK1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJObyBjb21wYWN0X21lbW9yeTsgY29tcGFjdG9yIGlkbGVcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXHR3aGlsZSAoIXN0b3ApIHtcXG4rXFx0XFx0aWYgKHdyaXRlKGZkLCBcXFwiMVxcXCIsIDEpIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHVzbGVlcCgxMDAwMCArIHJhbmRfcihcXHUwMDI2c2VlZCkgJSAxMDAwMDApO1xcbitcXHR9XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHN3YXBfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0Y2hhciBsaW5lWzI1Nl07XFxuK1xcdGludCBsaW5lcyA9IDA7XFxuK1xcdEZJTEUgKmZwID0gZm9wZW4oXFxcIi9wcm9jL3N3YXBzXFxcIiwgXFxcInJcXFwiKTtcXG4rXFxuK1xcdGlmICghZnApXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxcbitcXHRcXHRsaW5lcysrO1xcbitcXHRmY2xvc2UoZnApO1xcbitcXHRyZXR1cm4gbGluZXMgXFx1MDAzZSAxO1xcbit9XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGltZXZhbCB0djtcXG4rXFxuK1xcdGdldHRpbWVvZmRheShcXHUwMDI2dHYsIE5VTEwpO1xcbitcXHRyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICsgdHYudHZfdXNlYyAvIDEwMDA7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXFxuK3tcXG4rXFx0ZnByaW50ZihzdGRlcnIsXFxuK1xcdFxcdFxcXCJVc2FnZToga2h1Z2VwYWdlZF9yYWNlIFstZCBzZWNvbmRzXSBbLW0gc3RlcHBlZHxmcmVlfG1hZHZpc2VdIFstel0gWy1wXSBbLWEgYXJlYXNdXFxcXG5cXFwiXFxuK1xcdFxcdFxcXCJcXFxcdFdpdGhvdXQgLW0sIGV2ZXJ5IG1vZGUgcnVucyBpbiB0dXJuLlxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtZDogc2Vjb25kcyBwZXIgbW9kZSAoZGVmYXVsdCA1KVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHRCb3RoIG9jY3VwYW5jeSBsaW1pdHMgcnVuIHVubGVzcyAteiBhc2tzIGZvciBob2xlcyBvbmx5LlxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHQtejogb25seSBtYXhfcHRlc19ub25lID0gSFBBR0VfUE1EX05SIC0gMSAoaG9sZS1oZWF2eSlcXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0UnVucyB3aXRoIGFuZCB3aXRob3V0IG1lbW9yeSBwcmVzc3VyZSB1bmxlc3MgLXAgYXNrcyBmb3JcXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0cHJlc3N1cmUgb25seS5cXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0LXA6IG9ubHkgd2l0aCB0aGUgcGFnZW91dCBhbmQgY29tcGFjdGlvbiB0aHJlYWRzXFxcXG5cXFwiXFxuK1xcdFxcdFxcXCJcXFxcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXFxcXG5cXFwiKTtcXG4rXFx0ZXhpdCgxKTtcXG4rfVxcbitcXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbit7XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XFxuK1xcdFxcdFxcXCJmYXVsdGVyXFxcIiwgXFxcImZhdWx0ZXIyXFxcIiwgXFxcImRvbnRuZWVkXFxcIiwgXFxcInBpbm5lclxcXCIsIFxcXCJmb3JrZXJcXFwiLFxcbitcXHRcXHRcXFwibXJlbWFwcGVyXFxcIiwgXFxcInBhZ2VvdXRcXFwiLCBcXFwiY29tcGFjdG9yXFxcIixcXG4rXFx0fTtcXG4rXFx0dm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7XFxuK1xcdFxcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcXG4rXFx0XFx0bXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sXFxuK1xcdH07XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgcGFnZW91dF9iaXQgPSAxVUwgXFx1MDAzY1xcdTAwM2MgNiwgY29tcGFjdG9yX2JpdCA9IDFVTCBcXHUwMDNjXFx1MDAzYyA3O1xcbitcXHRjb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTtcXG4rXFx0cHRocmVhZF90IHRocmVhZHNbQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpXTtcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgXFxcInN0ZXBwZWRcXFwiLCBcXFwiZnJlZVxcXCIsIFxcXCJtYWR2aXNlXFxcIiB9O1xcbitcXHRzdGF0aWMgY29uc3QgaW50IGFsbF9ub25lc1tdID0geyAwLCAxIH07XFx0Lyogc3RyaWN0LCBob2xlcyAqL1xcbitcXHRzdGF0aWMgY29uc3QgaW50IGFsbF9wcmVzc1tdID0geyAwLCAxIH07XFx0LyogcXVpZXQsIHVuZGVyIHByZXNzdXJlICovXFxuK1xcdGNvbnN0IGludCAqbm9uZXMgPSBhbGxfbm9uZXM7XFxuK1xcdGNvbnN0IGludCAqcHJlc3MgPSBhbGxfcHJlc3M7XFxuK1xcdGludCBucl9ub25lcyA9IEFSUkFZX1NJWkUoYWxsX25vbmVzKTtcXG4rXFx0aW50IG5yX3ByZXNzID0gQVJSQVlfU0laRShhbGxfcHJlc3MpO1xcbitcXHRjb25zdCBjaGFyICpvbmVfbW9kZVsxXTtcXG4rXFx0Y29uc3QgY2hhciAqIGNvbnN0ICptb2RlcyA9IGFsbF9tb2RlcztcXG4rXFx0aW50IG5yX21vZGVzID0gQVJSQVlfU0laRShhbGxfbW9kZXMpO1xcbitcXHRjb25zdCBjaGFyICptb2RlX2FyZyA9IE5VTEw7XFxuK1xcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZW5kX21zO1xcbitcXHRpbnQgZHVyYXRpb25fcyA9IDU7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdGhyZWFkX21hc2sgPSB+MFVMO1xcbitcXHR1bnNpZ25lZCBsb25nIGJhc2VfbWFzaztcXG4rXFx0aW50IG5yX2FyZWFzX2FyZyA9IDA7XFxuK1xcdGJvb2wgaG9sZXNfb25seSA9IGZhbHNlO1xcbitcXHRib29sIHByZXNzdXJlX29ubHkgPSBmYWxzZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBpO1xcbitcXHRpbnQgc3RlcHMgPSAwO1xcbitcXHRpbnQgb3B0O1xcbitcXG4rXFx0d2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgXFxcImE6ZDptOnQ6enBoXFxcIikpICE9IC0xKSB7XFxuK1xcdFxcdHN3aXRjaCAob3B0KSB7XFxuK1xcdFxcdGNhc2UgJ2EnOlxcbitcXHRcXHRcXHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdkJzpcXG4rXFx0XFx0XFx0ZHVyYXRpb25fcyA9IGF0b2kob3B0YXJnKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ20nOlxcbitcXHRcXHRcXHRtb2RlX2FyZyA9IG9wdGFyZztcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3QnOlxcbitcXHRcXHRcXHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xcbitcXHRcXHRcXHR0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3onOlxcbitcXHRcXHRcXHRob2xlc19vbmx5ID0gdHJ1ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3AnOlxcbitcXHRcXHRcXHRwcmVzc3VyZV9vbmx5ID0gdHJ1ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdHVzYWdlKCk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRpZiAoaG9sZXNfb25seSkge1xcbitcXHRcXHRub25lcyA9IGFsbF9ub25lcyArIDE7XFxuK1xcdFxcdG5yX25vbmVzID0gMTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHByZXNzdXJlX29ubHkpIHtcXG4rXFx0XFx0cHJlc3MgPSBhbGxfcHJlc3MgKyAxO1xcbitcXHRcXHRucl9wcmVzcyA9IDE7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtb2RlX2FyZykge1xcbitcXHRcXHRpZiAoc3RyY21wKG1vZGVfYXJnLCBcXFwic3RlcHBlZFxcXCIpIFxcdTAwMjZcXHUwMDI2IHN0cmNtcChtb2RlX2FyZywgXFxcImZyZWVcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgc3RyY21wKG1vZGVfYXJnLCBcXFwibWFkdmlzZVxcXCIpKVxcbitcXHRcXHRcXHR1c2FnZSgpO1xcbitcXHRcXHRvbmVfbW9kZVswXSA9IG1vZGVfYXJnO1xcbitcXHRcXHRtb2RlcyA9IG9uZV9tb2RlO1xcbitcXHRcXHRucl9tb2RlcyA9IDE7XFxuK1xcdH1cXG4rXFxuK1xcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XFxuK1xcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXFxcblxcXCIpO1xcbitcXG4rXFx0cGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTtcXG4rXFx0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xcbitcXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcbitcXHRndXBfZmQgPSBvcGVuKFxcXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFxcXCIsIE9fUkRXUik7XFxuK1xcdGlmIChndXBfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiL3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxcXG5cXFwiKTtcXG4rXFxuK1xcdG5yX3NoYXJlZF9hcmVhcyA9IG5yX2FyZWFzX2FyZyBcXHUwMDNlIDAgPyBucl9hcmVhc19hcmcgOiBERUZBVUxUX1NIQVJFRF9BUkVBUztcXG4rXFx0bnJfYXJlYXMgPSBucl9zaGFyZWRfYXJlYXMgKyAxO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIG1yZW1hcCB0aHJlYWQgbW92ZXMgaXRzIGFyZWEgdG8gdGhpcyBhZGRyZXNzIGFuZCBiYWNrLCBhbmRcXG4rXFx0ICogTVJFTUFQX0ZJWEVEIHVubWFwcyB3aGF0ZXZlciBpcyBpbiB0aGUgd2F5IHdpdGhvdXQgc2F5aW5nIHNvLiAgQ2xhaW1cXG4rXFx0ICogdGhlIGFkZHJlc3MgaGVyZSwgc28gYSBsYXlvdXQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGlzIGFzc3VtcHRpb25cXG4rXFx0ICogZmFpbHMgbm93IGluc3RlYWQgb2YgbG9zaW5nIGEgbWFwcGluZyBsYXRlci4gIE5vdGhpbmcgZWxzZSBpbiB0aGVcXG4rXFx0ICogcHJvY2VzcyBtYXBzIHRoaXMgbG93OiB0aHJlYWQgc3RhY2tzIGFuZCBtYWxsb2MgYXJlbmFzIGNvbWUgZnJvbSB0aGVcXG4rXFx0ICogdG9wLWRvd24gbW1hcCBhcmVhLCB3ZWxsIGFib3ZlLlxcbitcXHQgKi9cXG4rXFx0bXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiArIDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xcbitcXHRpZiAobW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIFBST1RfTk9ORSxcXG4rXFx0XFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsXFxuK1xcdFxcdCAtMSwgMCkgIT0gKHZvaWQgKiltcmVtYXBfc2NyYXRjaClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgbXJlbWFwIHNjcmF0Y2hcXFwiKTtcXG4rXFxuK1xcdGJhc2VfbWFzayA9IHRocmVhZF9tYXNrO1xcbitcXHRpZiAoIXN3YXBfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdC8qIE5vIHN3YXAsIG5vIGFub24gcmVjbGFpbTogY29tcGFjdGlvbi1vbmx5IHByZXNzdXJlLiAqL1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwibm8gc3dhcDogdGhlIHBhZ2VvdXQgdGhyZWFkIHN0YXlzIGlkbGVcXFxcblxcXCIpO1xcbitcXG4rXFx0a3NmdF9zZXRfcGxhbihucl9tb2RlcyAqIG5yX25vbmVzICogbnJfcHJlc3MpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEEgYmFzZSBlbnRyeSBmb3IgdGhlIHN0YWNrLCBzbyB0aGF0IHRoZSBwb3AgYXQgdGhlIGVuZCBvZiBhIG1vZGVcXG4rXFx0ICogYWx3YXlzIGhhcyBzb21ldGhpbmcgdG8gd3JpdGUgYmFjazogdGhwX3BvcF9zZXR0aW5ncygpIG9uIGFuIGVtcHR5XFxuK1xcdCAqIHN0YWNrIGhhcyBubyBzZXR0aW5ncyB0byBhcHBseSBhbmQgZ2l2ZXMgdXAuXFxuK1xcdCAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Zm9yIChpbnQgcnVuID0gMDsgcnVuIFxcdTAwM2MgbnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzOyBydW4rKykge1xcbitcXHRcXHRpbnQgcmVtID0gcnVuICUgKG5yX25vbmVzICogbnJfcHJlc3MpO1xcbitcXHRcXHRjb25zdCBjaGFyICptb2RlID0gbW9kZXNbcnVuIC8gKG5yX25vbmVzICogbnJfcHJlc3MpXTtcXG4rXFx0XFx0Ym9vbCBob2xlcyA9IG5vbmVzW3JlbSAvIG5yX3ByZXNzXTtcXG4rXFx0XFx0Ym9vbCBwcmVzc3VyZSA9IHByZXNzW3JlbSAlIG5yX3ByZXNzXTtcXG4rXFxuK1xcdFxcdHRocmVhZF9tYXNrID0gYmFzZV9tYXNrO1xcbitcXHRcXHRpZiAoIXByZXNzdXJlKVxcbitcXHRcXHRcXHR0aHJlYWRfbWFzayBcXHUwMDI2PSB+KHBhZ2VvdXRfYml0IHwgY29tcGFjdG9yX2JpdCk7XFxuK1xcdFxcdGVsc2UgaWYgKCFzd2FwX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRcXHR0aHJlYWRfbWFzayBcXHUwMDI2PSB+cGFnZW91dF9iaXQ7XFxuK1xcbitcXHRcXHR0aHBfcmVhZF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXHRcXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xcbitcXHRcXHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XFxuK1xcdFxcdHNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xcbitcXHRcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID1cXG4rXFx0XFx0XFx0c3RyY21wKG1vZGUsIFxcXCJmcmVlXFxcIikgPyAxMDAwIDogMDtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSAxMDtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIG1USFAgY29sbGFwc2Ugb25seSBzdXBwb3J0cyB0aGUgdHdvIGVuZHMgb2YgdGhlIG9jY3VwYW5jeVxcbitcXHRcXHQgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuXFxuK1xcdFxcdCAqIFN0cmljdCBuZWVkcyBhIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3csIHdoaWNoIGlzIHJhcmUgdW5kZXJcXG4rXFx0XFx0ICogcmFjaW5nIE1BRFZfRE9OVE5FRUQ7IGhvbGUtaGVhdnkgd2luZG93cyBjb2xsYXBzZSBpbnN0ZWFkLFxcbitcXHRcXHQgKiBzbyB0aGUgdHdvIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/XFxuK1xcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgLSAxIDogMDtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cXG4rXFx0XFx0XFx0bnJfYXJlYXMgKiAoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpICogODtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX09SREVSUzsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSlcXG4rXFx0XFx0XFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBQb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZGUsIGJlZm9yZSB0aGUgbmV4dCBvbmUuICovXFxuK1xcdFxcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRcXHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8XFxuK1xcdFxcdFxcdCAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xcbitcXHRcXHRpZiAocmVnaW9uICE9IEJBU0VfQUREUilcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgcGxheWdyb3VuZFxcXCIpO1xcbitcXHRcXHRtcmVtYXBfYXJlYSA9IHJlZ2lvbiArIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xcbitcXG4rXFx0XFx0aWYgKHRocmVhZF9tYXNrIFxcdTAwMjYgcGFnZW91dF9iaXQpIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3RcXG4rXFx0XFx0XFx0ICogdG8gZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvXFxuK1xcdFxcdFxcdCAqIFsxNk0sIDY0TV0uXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7XFxuK1xcdFxcdFxcdHBhZ2VvdXRfc2l6ZSA9IHBhZ2VvdXRfc2l6ZSBcXHUwMDNjICgxNlVMIFxcdTAwM2NcXHUwMDNjIDIwKSA/XFxuK1xcdFxcdFxcdFxcdCAgICAgICAoMTZVTCBcXHUwMDNjXFx1MDAzYyAyMCkgOlxcbitcXHRcXHRcXHRcXHQgICAgICAgcGFnZW91dF9zaXplIFxcdTAwM2UgKDY0VUwgXFx1MDAzY1xcdTAwM2MgMjApID9cXG4rXFx0XFx0XFx0XFx0ICAgICAgICg2NFVMIFxcdTAwM2NcXHUwMDNjIDIwKSA6IHBhZ2VvdXRfc2l6ZTtcXG4rXFx0XFx0XFx0cGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XFxuK1xcdFxcdFxcdGlmIChwYWdlb3V0X2FyZWEgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgcGFnZW91dCBhcmVhXFxcIik7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdC8qIFBvcHVsYXRlIHNvIHRoZSBmaXJzdCBwYXNzIGhhcyBzb21ldGhpbmcgdG8gY29sbGFwc2UuICovXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSsrKVxcbitcXHRcXHRcXHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XFxuK1xcdFxcdG1lbXNldChtcmVtYXBfYXJlYSwgMSwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHRtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfdGhyZWFkczsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICghKHRocmVhZF9tYXNrIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSkpIHtcXG4rXFx0XFx0XFx0XFx0dGhyZWFkc1tpXSA9IDA7XFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGlmIChwdGhyZWFkX2NyZWF0ZShcXHUwMDI2dGhyZWFkc1tpXSwgTlVMTCwgdGhyZWFkX2Zuc1tpXSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgKHZvaWQgKikoaSArIDEpKSlcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJwdGhyZWFkX2NyZWF0ZSgpXFxcIik7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGVuZF9tcyA9IG5vd19tcygpICsgZHVyYXRpb25fcyAqIDEwMDBVTDtcXG4rXFx0XFx0aWYgKCFzdHJjbXAobW9kZSwgXFxcInN0ZXBwZWRcXFwiKSkge1xcbitcXHRcXHRcXHR3aGlsZSAobm93X21zKCkgXFx1MDAzYyBlbmRfbXMgXFx1MDAyNlxcdTAwMjYgIWNvcnJ1cHRlZCkge1xcbitcXHRcXHRcXHRcXHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpXFxuK1xcdFxcdFxcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwia2h1Z2VwYWdlZCBwYXNzIHRpbWVkIG91dFxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdFxcdHN0ZXBzKys7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fSBlbHNlIGlmICghc3RyY21wKG1vZGUsIFxcXCJmcmVlXFxcIikpIHtcXG4rXFx0XFx0XFx0d2hpbGUgKG5vd19tcygpIFxcdTAwM2MgZW5kX21zIFxcdTAwMjZcXHUwMDI2ICFjb3JydXB0ZWQpXFxuK1xcdFxcdFxcdFxcdHVzbGVlcCgxMDAgKiAxMDAwKTtcXG4rXFx0XFx0fSBlbHNlIHtcXHQvKiBtYWR2aXNlICovXFxuK1xcdFxcdFxcdHdoaWxlIChub3dfbXMoKSBcXHUwMDNjIGVuZF9tcyBcXHUwMDI2XFx1MDAyNiAhY29ycnVwdGVkKSB7XFxuK1xcdFxcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9zaGFyZWRfYXJlYXM7IGkrKykge1xcbitcXHRcXHRcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiArIGkgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfQ09MTEFQU0UpO1xcbitcXHRcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdFxcdG1hZHZpc2UocmVnaW9uLCBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0XFx0TUFEVl9ET05UTkVFRCk7XFxuK1xcdFxcdFxcdFxcdHN0ZXBzKys7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0c3RvcCA9IDE7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl90aHJlYWRzOyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKHRocmVhZHNbaV0pXFxuK1xcdFxcdFxcdFxcdHB0aHJlYWRfam9pbih0aHJlYWRzW2ldLCBOVUxMKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LyogRmluYWwgaW50ZWdyaXR5IHN3ZWVwLiAqL1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcXG4rXFx0XFx0XFx0Y2hlY2tfcGFnZShpKTtcXG4rXFxuK1xcdFxcdGtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCxcXG4rXFx0XFx0XFx0XFx0IFxcXCIlcy8lcyVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgbW9kZSwgaG9sZXMgPyBcXFwiaG9sZXNcXFwiIDogXFxcInN0cmljdFxcXCIsXFxuK1xcdFxcdFxcdFxcdCBwcmVzc3VyZSA/IFxcXCIvcHJlc3N1cmVcXFwiIDogXFxcIlxcXCIsXFxuK1xcdFxcdFxcdFxcdCBkdXJhdGlvbl9zLCBzdGVwcyk7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBIYW5kIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB0aGUgc2V0dGluZ3MgYmFjayBiZWZvcmUgdGhlXFxuK1xcdFxcdCAqIG5leHQgbW9kZTogaXQgbWFwcyB0aGUgcmVnaW9uIGF0IHRoZSBzYW1lIGZpeGVkIGFkZHJlc3MsXFxuK1xcdFxcdCAqIGFuZCBpdHMgc2NhbiBjYWRlbmNlIGRpZmZlcnMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRtdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0XFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xcbitcXHRcXHRcXHRtdW5tYXAocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUpO1xcbitcXHRcXHRcXHRwYWdlb3V0X2FyZWEgPSBOVUxMO1xcbitcXHRcXHR9XFxuK1xcdFxcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0XFx0c3RvcCA9IDA7XFxuK1xcdFxcdHN0ZXBzID0gMDtcXG4rXFxuK1xcdFxcdGlmIChjb3JydXB0ZWQpIHtcXG4rXFx0XFx0XFx0LyogTWVtb3J5IGlzIHN1c3BlY3Q7IHRoZSByZXN0IHdvdWxkIHByb3ZlIG5vdGhpbmcuICovXFxuK1xcdFxcdFxcdHdoaWxlICgrK3J1biBcXHUwMDNjIG5yX21vZGVzICogbnJfbm9uZXMgKiBucl9wcmVzcykge1xcbitcXHRcXHRcXHRcXHRyZW0gPSBydW4gJSAobnJfbm9uZXMgKiBucl9wcmVzcyk7XFxuK1xcbitcXHRcXHRcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIiVzLyVzJXM6IHNraXBwZWQgYWZ0ZXIgY29ycnVwdGlvblxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgbW9kZXNbcnVuIC8gKG5yX25vbmVzICogbnJfcHJlc3MpXSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgbm9uZXNbcmVtIC8gbnJfcHJlc3NdID9cXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgXFxcImhvbGVzXFxcIiA6IFxcXCJzdHJpY3RcXFwiLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBwcmVzc1tyZW0gJSBucl9wcmVzc10gP1xcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBcXFwiL3ByZXNzdXJlXFxcIiA6IFxcXCJcXFwiKTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xcbitcXHRrc2Z0X2ZpbmlzaGVkKCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzBkM2ZiNTE5ZmIyY1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xcbkBAIC0wLDAgKzEsMjE3IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIFN5bmNocm9ub3VzIGtodWdlcGFnZWQgZHJpdmluZyBjaGVjay5cXG4rICpcXG4rICogUmFjZSB0ZXN0cyBkcml2ZSBraHVnZXBhZ2VkIHRocm91Z2ggdGhlIGV4aXN0aW5nIHN5c2ZzIGNvbnRyb2xzOiBhXFxuKyAqIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGFuZCBmdWxsX3NjYW5zXFxuKyAqIGFkdmFuY2luZyBieSB0d28gaXMgYSBjb21wbGV0aW9uIGJhcnJpZXIgZm9yIG9uZSBmdWxsIHBhc3MgdGhhdFxcbisgKiBzdGFydGVkIGFmdGVyIHNldHVwIChraHVnZXBhZ2VkX2Z1bGxfcGFzcygpKS4gVmVyaWZ5IHRoZSBwYWlyIGdpdmVzXFxuKyAqIGRldGVybWluaXN0aWMsIGF0dHJpYnV0YWJsZSByZXN1bHRzOiBvbmUgYmFycmllciBzdGVwIG92ZXIgb25lXFxuKyAqIHByZXBhcmVkIHdpbmRvdyBwcm9kdWNlcyBleGFjdGx5IG9uZSBjb2xsYXBzZSBhdHRlbXB0IG9uIHRoYXRcXG4rICogd2luZG93J3Mgc291cmNlIHBhZ2VzIChtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZSBldmVudHMgZmlsdGVyZWRcXG4rICogYnkgc291cmNlIFBGTiBhbmQgb3JkZXIpIGFuZCB0aGUgd2luZG93IGlzIGNvbGxhcHNlZFxcbisgKiBhZnRlcndhcmRzLCByZXBlYXRhYmx5LlxcbisgKlxcbisgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBzZXQgdG8gNjBzIHRvIHByb3ZlIHRoZSB3YWtlIHBhdGg6IHdpdGhvdXRcXG4rICogdGhlIHdha2UsIG9uZSBiYXJyaWVyIHN0ZXAgd291bGQgc2xlZXAgbXVsdGlwbGVzIG9mIHRoYXQgYW5kIGJsb3dcXG4rICogdGhlIHRpbWVvdXQuIEl0IGFsc28ga2VlcHMgdGhlIGRhZW1vbiBmcm9tIGZyZWUtcnVubmluZyBiZXR3ZWVuXFxuKyAqIHN0ZXBzLCBwZXIgdGhlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZGlzY2lwbGluZS5cXG4rICovXFxuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJrc2VsZnRlc3QuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInZtX3V0aWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImh1Z2VwYWdlX3NldHRpbmdzLmhcXFwiXFxuK1xcbisjZGVmaW5lIEJBU0VfQUREUiAoKHZvaWQgKikoMVVMIFxcdTAwM2NcXHUwMDNjIDMwKSlcXG4rI2RlZmluZSBUQVJHRVRfT1JERVIgMlxcdC8qIHNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXFxuKyNkZWZpbmUgTlJfSVRFUkFUSU9OUyA1XFxuK1xcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZDtcXG4rc3RhdGljIGludCB0cmFjZV9ldmVudHNfZmQgPSAtMTtcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XFxuK1xcbisvKlxcbisgKiBFYWNoIHN0ZXAgc3dpdGNoZXMgdGhlIGV2ZW50cyBvZmYgYWdhaW4sIGJ1dCBhIGhlbHBlciBjYW4gc3RpbGwgZ2l2ZSB1cFxcbisgKiBvbiB1cyBpbiBiZXR3ZWVuIChhIGZhaWxpbmcgc3lzZnMgd3JpdGUgZW5kcyB0aGUgdGVzdCBmcm9tIGluc2lkZVxcbisgKiB0aHBfd3JpdGVfbnVtKCkpLCBhbmQgaHVnZV9tZW1vcnkgZXZlbnRzIGxlZnQgb24gYXJlIHRoZSB3aG9sZSBtYWNoaW5lJ3NcXG4rICogcHJvYmxlbSwgbm90IHRoaXMgdGVzdCdzLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgdHJhY2VfZXZlbnRzX29mZih2b2lkKVxcbit7XFxuK1xcdGlmICh0cmFjZV9ldmVudHNfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0dHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpO1xcbit9XFxuK1xcbisvKlxcbisgKiBDb3VudCBjb2xsYXBzZSBhdHRlbXB0cyBhdHRyaWJ1dGFibGUgdG8gb3VyIHdpbmRvdzogbGVnYWN5LWVuZ2luZVxcbisgKiBpc29sYXRlIGV2ZW50cyB3aG9zZSBzY2FuX3BmbiBpcyBvbmUgb2YgdGhlIHdpbmRvdydzIHNvdXJjZSBQRk5zLFxcbisgKiBwbHVzIGJhdGNoLWVuZ2luZSBwZXItY2FuZGlkYXRlIGluc3RhbGwgZXZlbnRzIGF0IHRoZSB3aW5kb3cnc1xcbisgKiBhZGRyZXNzLiBFaXRoZXIgZW5naW5lIHJlcG9ydHMgZXhhY3RseSBvbmNlIHBlciBhdHRlbXB0LlxcbisgKi9cXG4rc3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxcbitcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgb3JkZXIpXFxuK3tcXG4rXFx0Y2hhciBsaW5lWzEwMjRdO1xcbitcXHRpbnQgY291bnQgPSAwO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gdHJhY2luZ19vcGVuX3RyYWNlKCk7XFxuK1xcdGlmICghZnApXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiQ2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXFxcXG5cXFwiKTtcXG4rXFxuK1xcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xcbitcXHRcXHRjaGFyICpzO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHZhbDtcXG4rXFx0XFx0dW5zaWduZWQgaW50IG9yZDtcXG4rXFx0XFx0Y2hhciAqbztcXG4rXFx0XFx0aW50IGk7XFxuK1xcbitcXHRcXHRzID0gc3Ryc3RyKGxpbmUsIFxcXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTpcXFwiKTtcXG4rXFx0XFx0aWYgKHMpIHtcXG4rXFx0XFx0XFx0aWYgKHNzY2FuZihzLCBcXFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4XFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgXFx1MDAyNnZhbCkgIT0gMSlcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdG8gPSBzdHJzdHIocywgXFxcIm9yZGVyPVxcXCIpO1xcbitcXHRcXHRcXHRpZiAoIW8gfHwgc3NjYW5mKG8sIFxcXCJvcmRlcj0ldVxcXCIsIFxcdTAwMjZvcmQpICE9IDEgfHxcXG4rXFx0XFx0XFx0ICAgIG9yZCAhPSBvcmRlcilcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wZm5zOyBpKyspIHtcXG4rXFx0XFx0XFx0XFx0aWYgKHZhbCA9PSBwZm5zW2ldKSB7XFxuK1xcdFxcdFxcdFxcdFxcdGNvdW50Kys7XFxuK1xcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdHMgPSBzdHJzdHIobGluZSwgXFxcIm1tX2NvbGxhcHNlX2NhbmRpZGF0ZTpcXFwiKTtcXG4rXFx0XFx0aWYgKHMpIHtcXG4rXFx0XFx0XFx0aWYgKCFzdHJzdHIocywgXFxcInBhc3M9aW5zdGFsbFxcXCIpIHx8XFxuK1xcdFxcdFxcdCAgICAhc3Ryc3RyKHMsIFxcXCJyZXN1bHQ9c3VjY2VlZGVkXFxcIikpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHRvID0gc3Ryc3RyKHMsIFxcXCJhZGRyPVxcXCIpO1xcbitcXHRcXHRcXHRpZiAoIW8gfHwgc3NjYW5mKG8sIFxcXCJhZGRyPTB4JWx4XFxcIiwgXFx1MDAyNnZhbCkgIT0gMSB8fFxcbitcXHRcXHRcXHQgICAgdmFsICE9IGFkZHIpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHRvID0gc3Ryc3RyKHMsIFxcXCJvcmRlcj1cXFwiKTtcXG4rXFx0XFx0XFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcXFwib3JkZXI9JXVcXFwiLCBcXHUwMDI2b3JkKSAhPSAxIHx8XFxuK1xcdFxcdFxcdCAgICBvcmQgIT0gb3JkZXIpXFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHRjb3VudCsrO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0ZmNsb3NlKGZwKTtcXG4rXFx0cmV0dXJuIGNvdW50O1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxcbit7XFxuK1xcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUjtcXG4rXFx0Y29uc3QgaW50IG5yX3BhZ2VzID0gMSBcXHUwMDNjXFx1MDAzYyBUQVJHRVRfT1JERVI7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuc1sxIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUl07XFxuK1xcdGJvb2wgY29sbGFwc2VkLCBwYXNzZWQ7XFxuK1xcdGludCBhdHRyaWJ1dGVkO1xcbitcXHRjaGFyICpwO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XFxuK1xcdGlmIChwICE9IEJBU0VfQUREUilcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgd2luZG93XFxcIik7XFxuK1xcbitcXHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XFxuK1xcdFxcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0XFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIENsZWFyIGZpcnN0OiB3aXRoIHRoZSBldmVudHMgc3RpbGwgb2ZmIHRoZXJlIGlzIG5vdGhpbmcgdG8gdW5kby4gKi9cXG4rXFx0aWYgKHRyYWNpbmdfY2xlYXJfdHJhY2UoKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxcXFxuXFxcIik7XFxuK1xcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCB0cnVlKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcXFxuXFxcIik7XFxuK1xcbitcXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcXG4rXFx0LyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXFxuK1xcdHBhc3NlZCA9IGtodWdlcGFnZWRfZnVsbF9wYXNzKDEyMCk7XFxuK1xcbitcXHQvKiBPZmYgYmVmb3JlIGFueXRoaW5nIHRoYXQgY2FuIGdpdmUgdXA6IHRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlLiAqL1xcbitcXHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkNhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcXFxuXFxcIik7XFxuK1xcdGlmICghcGFzc2VkKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcImtodWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xcXFxuXFxcIik7XFxuK1xcbitcXHRjb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XFxuK1xcdGF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCAodW5zaWduZWQgbG9uZylwLFxcbitcXHRcXHRcXHRcXHQgICAgICBUQVJHRVRfT1JERVIpO1xcbitcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXFx1MDAyNlxcdTAwMjYgYXR0cmlidXRlZCA9PSAxLFxcbitcXHRcXHRcXHQgXFxcInN0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTtcXG4rXFxuK1xcdG11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK31cXG4rXFxuK2ludCBtYWluKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xcbitcXG4rXFx0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcXFxuXFxcIik7XFxuK1xcdGlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUikpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgVEFSR0VUX09SREVSKTtcXG4rXFxuK1xcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcXG4rXFx0aWYgKCFocGFnZV9wbWRfc2l6ZSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRwYWdlbWFwX2ZkID0gb3BlbihcXFwiL3Byb2Mvc2VsZi9wYWdlbWFwXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAocGFnZW1hcF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXFxcIik7XFxuK1xcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAoa3BhZ2VmbGFnc19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJvcGVuKFxcXFxcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXFxcXFwiKSByZXF1aXJlcyByb290XFxcXG5cXFwiKTtcXG4rXFx0dHJhY2VfZXZlbnRzX2ZkID0gdHJhY2luZ19ldmVudHNfb3BlbihcXFwiaHVnZV9tZW1vcnlcXFwiKTtcXG4rXFx0aWYgKHRyYWNlX2V2ZW50c19mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XFxcXG5cXFwiKTtcXG4rXFx0YXRleGl0KHRyYWNlX2V2ZW50c19vZmYpO1xcbitcXG4rXFx0a3NmdF9zZXRfcGxhbihOUl9JVEVSQVRJT05TKTtcXG4rXFxuK1xcdHRocF9zYXZlX3NldHRpbmdzKCk7XFxuK1xcdHRocF9yZWFkX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XFxuK1xcdHNldHRpbmdzLnRocF9kZWZyYWcgPSBUSFBfREVGUkFHX0FMV0FZUztcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTtcXG4rXFx0LyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi9cXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0gMVVMIFxcdTAwM2NcXHUwMDNjIDI0O1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XFxuK1xcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi9cXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9JVEVSQVRJT05TOyBpKyspXFxuK1xcdFxcdG9uZV9zdGVwKGkpO1xcbitcXG4rXFx0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcXG4rXFxuK1xcdGtzZnRfZmluaXNoZWQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXFxuaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXFxuQEAgLTIwLDcgKzIwLDYgQEBcXG4gXFxuICNkZWZpbmUgVFdPTUVHXFx0XFx0KDJcXHUwMDNjXFx1MDAzYzIwKVxcbiAjZGVmaW5lIFJVTlRJTUVcXHRcXHQoMjApXFxuLSNkZWZpbmUgQUxJR04oeCwgYSlcXHQoKCh4KSArIChhIC0gMSkpIFxcdTAwMjYgKH4oKGEpIC0gMSkpKVxcbiBcXG4gSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpXFxuIFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXFxuaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTVcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXFxuQEAgLTQwMiw2ICs0MDIsMTIgQEAgQ0FURUdPUlk9XFxcInBmbm1hcFxcXCIgcnVuX3Rlc3QgLi9wZm5tYXBcXG4gIyBDT1cgdGVzdHNcXG4gQ0FURUdPUlk9XFxcImNvd1xcXCIgcnVuX3Rlc3QgLi9jb3dcXG4gXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2tcXG4rXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9zeW5jX2NoZWNrXFxuK1xcbitDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZVxcbitcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXFxuIFxcbiBDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMlxcbkBAIC00MTAsOCArNDE2LDYgQEAgQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxcbiBcXG4gQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDQgYWxsOnNobWVtXFxuIFxcbi1DQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLWMgNCBtdGhwX2todWdlcGFnZWQ6YW5vblxcbi1cXG4gIyBUcnkgdG8gY3JlYXRlIFhGUyBpZiBub3QgcHJvdmlkZWRcXG4gaWYgWyAteiBcXFwiJHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH1cXFwiIF07IHRoZW5cXG4gICAgIGlmIHRlc3Rfc2VsZWN0ZWQgXFxcInRocFxcXCI7IHRoZW5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcXG5pbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXFxuQEAgLTQyLDY4ICs0Miw2IEBAIGNvbnN0IGNoYXIgKmtwYWdlZmxhZ3NfcHJvYyA9IFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcIjtcXG4gaW50IHBhZ2VtYXBfZmQ7XFxuIGludCBrcGFnZWZsYWdzX2ZkO1xcbiBcXG4tc3RhdGljIGJvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxcbi1cXHRcXHRpbnQga3BhZ2VmbGFnc19mZClcXG4te1xcbi1cXHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xcbi1cXHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xcbi1cXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbi1cXHR1bnNpZ25lZCBsb25nIHBmbl9oZWFkO1xcbi1cXHR1aW50NjRfdCBwZm5fZmxhZ3M7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcGZuO1xcbi1cXHR1bnNpZ25lZCBsb25nIGk7XFxuLVxcbi1cXHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xcbi1cXG4tXFx0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xcbi1cXHRpZiAocGZuID09IC0xVUwpXFxuLVxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFxuLVxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuLVxcdFxcdGdvdG8gZmFpbDtcXG4tXFxuLVxcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXFxuLVxcdGlmICghb3JkZXIpIHtcXG4tXFx0XFx0aWYgKHBmbl9mbGFncyBcXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXFxuLVxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFx0XFx0cmV0dXJuIHRydWU7XFxuLVxcdH1cXG4tXFxuLVxcdC8qIG5vbiBUSFAgZm9saW8gKi9cXG4tXFx0aWYgKCEocGZuX2ZsYWdzIFxcdTAwMjYgS1BGX1RIUCkpXFxuLVxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFxuLVxcdHBmbl9oZWFkID0gcGZuIFxcdTAwMjYgfihucl9wYWdlcyAtIDEpO1xcbi1cXG4tXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbi1cXHRcXHRnb3RvIGZhaWw7XFxuLVxcbi1cXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xcbi1cXHRpZiAoKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXFxuLVxcdFxcdHJldHVybiBmYWxzZTtcXG4tXFxuLVxcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xcbi1cXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xcbi1cXHRcXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIGksIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbi1cXHRcXHRcXHRnb3RvIGZhaWw7XFxuLVxcdFxcdGlmICgocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcXG4tXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXHR9XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLFxcbi1cXHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXFxuLVxcdCAqL1xcbi1cXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0cmV0dXJuIHRydWU7XFxuLVxcbi1cXHQvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXFxuLVxcdHJldHVybiAocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncztcXG4tZmFpbDpcXG4tXFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXFxcblxcXCIpO1xcbi1cXHRyZXR1cm4gZmFsc2U7XFxuLX1cXG4tXFxuIHN0YXRpYyBpbnQgY2hlY2tfYWZ0ZXJfc3BsaXRfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLFxcbiBcXHRcXHRpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycylcXG4ge1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcXG5pbmRleCA4MGJjOWY1OTdiNTIxLi5lZTEzMzQ3NzgzOTFmIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xcbkBAIC00OTQsNiArNDk0LDE1MSBAQCBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncylcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRpbnQga3BhZ2VmbGFnc19mZClcXG4re1xcbitcXHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xcbitcXHRjb25zdCB1aW50NjRfdCBmb2xpb190YWlsX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9UQUlMO1xcbitcXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbitcXHR1bnNpZ25lZCBsb25nIHBmbl9oZWFkO1xcbitcXHR1aW50NjRfdCBwZm5fZmxhZ3M7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuO1xcbitcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xcbitcXG4rXFx0Lyogbm9uIHByZXNlbnQgcGFnZSAqL1xcbitcXHRpZiAocGZuID09IC0xVUwpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXFxuK1xcdGlmICghb3JkZXIpIHtcXG4rXFx0XFx0aWYgKHBmbl9mbGFncyBcXHUwMDI2IChmb2xpb19oZWFkX2ZsYWdzIHwgZm9saW9fdGFpbF9mbGFncykpXFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIG5vbiBUSFAgZm9saW8gKi9cXG4rXFx0aWYgKCEocGZuX2ZsYWdzIFxcdTAwMjYgS1BGX1RIUCkpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdHBmbl9oZWFkID0gcGZuIFxcdTAwMjYgfihucl9wYWdlcyAtIDEpO1xcbitcXG4rXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xcbitcXHRpZiAoKHBmbl9mbGFncyBcXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xcbitcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xcbitcXHRcXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIGksIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbitcXHRcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdFxcdGlmICgocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLFxcbitcXHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXFxuK1xcdCAqL1xcbitcXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4rXFx0XFx0cmV0dXJuIHRydWU7XFxuK1xcbitcXHQvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXFxuK1xcdHJldHVybiAocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncztcXG4rZmFpbDpcXG4rXFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXFxcblxcXCIpO1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rXFxuKy8qXFxuKyAqIENoZWNrIHdoZXRoZXIgZXZlcnkgb3JkZXItQG9yZGVyIHdpbmRvdyBvZiBbc3RhcnQsIGxlbikgbWFwcyBleGFjdGx5IG9uZVxcbisgKiBmb2xpbyBvZiB0aGF0IG9yZGVyLCBoZWFkIHRvIHRhaWwuICBUaGUgYWRkcmVzcyByYW5nZSBtdXN0IGJlIG5hdHVyYWxseVxcbisgKiBhbGlnbmVkLCBlYWNoIHdpbmRvdydzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgYSB3aW5kb3cncyBmaXJzdFxcbisgKiBQRk4gbXVzdCBiZSB0aGUgZm9saW8gaGVhZC5cXG4rICpcXG4rICogVGhpcyBpcyB0aGUgY2hlY2sgXFxcImRpZCB0aGlzIHJhbmdlIGNvbGxhcHNlIGludG8gb3JkZXItQG9yZGVyIGZvbGlvc1xcXCI6IGFcXG4rICogd2luZG93IGFzc2VtYmxlZCBmcm9tIHBhcnRzIG9mIHNldmVyYWwgZm9saW9zLCBvciBtYXBwaW5nIGEgZm9saW8gc2hpZnRlZFxcbisgKiBmcm9tIGl0cyBuYXR1cmFsIHBvc2l0aW9uLCBmYWlscy5cXG4rICovXFxuK2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZClcXG4re1xcbitcXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFxcdTAwM2NcXHUwMDNjIG9yZGVyO1xcbitcXHRjb25zdCBzaXplX3Qgd2luZG93ID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xcbitcXHRjaGFyICp2YWRkcjtcXG4rXFxuK1xcdGlmICgodWludHB0cl90KXN0YXJ0ICUgd2luZG93IHx8IGxlbiAlIHdpbmRvdylcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0Zm9yICh2YWRkciA9IHN0YXJ0OyB2YWRkciBcXHUwMDNjIHN0YXJ0ICsgbGVuOyB2YWRkciArPSB3aW5kb3cpIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRcXHQvKiBOb3QgcHJlc2VudCwgb3Igbm90IG1hcHBpbmcgdGhlIGZvbGlvIGhlYWQuICovXFxuK1xcdFxcdGlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcylcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0XFx0Zm9yIChpID0gMTsgaSBcXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkciArIGkgKiBwc2l6ZSgpKSAhPVxcbitcXHRcXHRcXHQgICAgcGZuICsgaSlcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRpZiAoIWlzX2JhY2tlZF9ieV9mb2xpbyh2YWRkciwgb3JkZXIsIHBhZ2VtYXBfZmQsXFxuK1xcdFxcdFxcdFxcdFxcdGtwYWdlZmxhZ3NfZmQpKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbisjZGVmaW5lIFRSQUNFRlNfUk9PVCBcXFwiL3N5cy9rZXJuZWwvdHJhY2luZ1xcXCJcXG4rXFxuKy8qXFxuKyAqIE9wZW4gdGhlIGVuYWJsZSBmaWxlIG9mIG9uZSBmdHJhY2UgZXZlbnQgc3Vic3lzdGVtIChlLmcuIFxcXCJodWdlX21lbW9yeVxcXCIpLlxcbisgKiBSZXR1cm5zIGEgZGVzY3JpcHRvciBmb3IgdHJhY2luZ19ldmVudHNfZW5hYmxlKCksIG9yIC0xIGlmIHRyYWNlZnMgb3IgdGhlXFxuKyAqIHN1YnN5c3RlbSBpcyBub3QgdGhlcmUuICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSBzdGF0ZTogd2hvZXZlclxcbisgKiBzd2l0Y2hlcyB0aGVtIG9uIG93bnMgdGhlbSB1bnRpbCBpdCBzd2l0Y2hlcyB0aGVtIG9mZiwgaW5jbHVkaW5nIG9uIHRoZVxcbisgKiBwYXRocyB3aGVyZSB0aGUgdGVzdCBnaXZlcyB1cC5cXG4rICovXFxuK2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcXG4re1xcbitcXHRjaGFyIHBhdGhbMjU2XTtcXG4rXFxuK1xcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UIFxcXCIvZXZlbnRzLyVzL2VuYWJsZVxcXCIsXFxuK1xcdFxcdCBzdWJzeXMpO1xcbitcXHRyZXR1cm4gb3BlbihwYXRoLCBPX1dST05MWSk7XFxuK31cXG4rXFxuK2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSlcXG4re1xcbitcXHRpZiAocHdyaXRlKGZkLCBlbmFibGUgPyBcXFwiMVxcXCIgOiBcXFwiMFxcXCIsIDEsIDApICE9IDEpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhci4gKi9cXG4raW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZClcXG4re1xcbitcXHRpbnQgZmQgPSBvcGVuKFRSQUNFRlNfUk9PVCBcXFwiL3RyYWNlXFxcIiwgT19XUk9OTFkgfCBPX1RSVU5DKTtcXG4rXFxuK1xcdGlmIChmZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGZvcGVuKFRSQUNFRlNfUk9PVCBcXFwiL3RyYWNlXFxcIiwgXFxcInJcXFwiKTtcXG4rfVxcbitcXG4gLyogSWYgYGlvY3Rscycgbm9uLU5VTEwsIHRoZSBhbGxvd2VkIGlvY3RscyB3aWxsIGJlIHJldHVybmVkIGludG8gdGhlIHZhciAqL1xcbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxcbiBcXHRcXHRcXHQgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxcbmluZGV4IDlhNDlhZjg4NzAyZTQuLjEwYzdiZTQ2ZTQ0Y2EgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuQEAgLTEwLDYgKzEwLDggQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuIFxcbiAjZGVmaW5lIEJJVF9VTEwobnIpICAgICAgICAgICAgICAgICAgICgxVUxMIFxcdTAwM2NcXHUwMDNjIChucikpXFxuKyNkZWZpbmUgQUxJR04oeCwgYSkgICAgICAgICAgICAgICAgICAgKCgoeCkgKyAoYSkgLSAxKSBcXHUwMDI2IH4oKGEpIC0gMSkpXFxuK1xcbiAjZGVmaW5lIFBNX1NPRlRfRElSVFkgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTUpXFxuICNkZWZpbmUgUE1fTU1BUF9FWENMVVNJVkUgICAgICAgICAgICAgQklUX1VMTCg1NilcXG4gI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KVxcbkBAIC05Nyw2ICs5OSwxMCBAQCBpbnQ2NF90IGFsbG9jYXRlX3RyYW5zaHVnZSh2b2lkICpwdHIsIGludCBwYWdlbWFwX2ZkKTtcXG4gaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpO1xcbiBpbnQgZ2F0aGVyX2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcXG4gXFx0XFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpO1xcbitib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0aW50IGtwYWdlZmxhZ3NfZmQpO1xcbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcXG4rXFx0XFx0XFx0XFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpO1xcbiBcXG4gaW50IHVmZmRfcmVnaXN0ZXIoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcXG4gXFx0XFx0ICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IpO1xcbkBAIC0xMTMsNiArMTE5LDEwIEBAIGludCBjbG9zZV9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwKTtcXG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xcbiBpbnQgcmVhZF9zeXNmcyhjb25zdCBjaGFyICpmaWxlX3BhdGgsIHVuc2lnbmVkIGxvbmcgKnZhbCk7XFxuIGJvb2wgc29mdGRpcnR5X3N1cHBvcnRlZCh2b2lkKTtcXG4raW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKTtcXG4raW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKTtcXG4raW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZCk7XFxuK0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKTtcXG4gXFxuIHN0YXRpYyBpbmxpbmUgaW50IG9wZW5fc2VsZl9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwX291dClcXG4ge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNDo1OToxMi4zMjIzODM4MzJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxMDkwMTUwODA3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLywgd2hpY2ggZG8gbm90IGFmZmVjdCB0aGUga2VybmVsJ3MgZnVuY3Rpb25hbCBleGVjdXRpb24gZmxvdy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDY3YTE5ZTE3YTkxYjYxNWQwMDcxYzNkODQxMDM4MmU4MWMwZTkwODhcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyAxMiAxNDo1OToxMCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcbkBAIC0xMDQsNiArMTA0LDkgQEAgVEVTVF9HRU5fRklMRVMgKz0gZ3VhcmQtcmVnaW9uc1xuIFRFU1RfR0VOX0ZJTEVTICs9IG1lcmdlXG4gVEVTVF9HRU5fRklMRVMgKz0gcm1hcFxuIFRFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX3NwbGl0X3JhY2VfdGVzdFxuK1RFU1RfR0VOX0ZJTEVTICs9IGZvbGlvX29yZGVyX2NoZWNrXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9yYWNlXG4gXG4gaWZuZXEgKCQoQVJDSCksYXJtNjQpXG4gVEVTVF9HRU5fRklMRVMgKz0gc29mdC1kaXJ0eVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uOTMwMzBhNDJjM2NjZFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xuQEAgLTAsMCArMSwxMzcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogU2VsZi1jaGVjayBmb3IgdGhlIHZtX3V0aWwgZm9saW8tb3JkZXIgZGV0ZWN0aW9uIGhlbHBlcnMsXG4rICogaXNfYmFja2VkX2J5X2ZvbGlvKCkgYW5kIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoKS5cbisgKlxuKyAqIEZvciBldmVyeSBhbm9uIFRIUCBvcmRlciB0aGUga2VybmVsIHN1cHBvcnRzLCBmYXVsdCBtZW1vcnkgaW4gd2l0aCBvbmx5XG4rICogdGhhdCBvcmRlciBlbmFibGVkIGFuZCB2ZXJpZnkgdGhlIGhlbHBlcnMgcmVwb3J0IGV4YWN0bHkgdGhhdCBvcmRlcjpcbisgKiBub3QgYSBuZWlnaGJvdXJpbmcgb3JkZXIsIGFuZCBwbGFpbiA0SyBtZW1vcnkgYXMgb3JkZXIgMC4gVGhlIGhlbHBlcnNcbisgKiBhcmUgd2hhdCB0aGUga2h1Z2VwYWdlZCBtVEhQIHRlc3RzIHVzZSB0byBkZXRlY3QgY29sbGFwc2UgcmVzdWx0cywgc29cbisgKiB0aGV5IG11c3QgYWdyZWUgd2l0aCB0aGUga2VybmVsJ3Mgb3duIGlkZWEgb2YgdGhlIGJhY2tpbmcgYmVmb3JlIGFueVxuKyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uXG4rICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImtzZWxmdGVzdC5oXCJcbisjaW5jbHVkZSBcInZtX3V0aWwuaFwiXG4rI2luY2x1ZGUgXCJodWdlcGFnZV9zZXR0aW5ncy5oXCJcbitcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuK1xuKy8qIG1tYXAgYW4gYW5vbiBWTUEgb2YgZXhhY3RseSBAc2l6ZSBieXRlcyBhdCBhIEBzaXplLWFsaWduZWQgYWRkcmVzcy4gKi9cbitzdGF0aWMgY2hhciAqYWxsb2NfYWxpZ25lZChzaXplX3Qgc2l6ZSlcbit7XG4rXHRzaXplX3QgbGVuID0gc2l6ZSAqIDI7XG4rXHR1aW50cHRyX3QgYWxpZ25lZDtcbitcdGNoYXIgKnA7XG4rXG4rXHRwID0gbW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbitcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKVwiKTtcbitcbitcdGFsaWduZWQgPSBBTElHTigodWludHB0cl90KXAsIHNpemUpO1xuK1x0aWYgKGFsaWduZWQgIT0gKHVpbnRwdHJfdClwKVxuK1x0XHRtdW5tYXAocCwgYWxpZ25lZCAtICh1aW50cHRyX3QpcCk7XG4rXHRpZiAoYWxpZ25lZCArIHNpemUgIT0gKHVpbnRwdHJfdClwICsgbGVuKVxuK1x0XHRtdW5tYXAoKGNoYXIgKilhbGlnbmVkICsgc2l6ZSxcbitcdFx0ICAgICAgICh1aW50cHRyX3QpcCArIGxlbiAtIGFsaWduZWQgLSBzaXplKTtcbitcbitcdHJldHVybiAoY2hhciAqKWFsaWduZWQ7XG4rfVxuK1xuKy8qXG4rICogRW5hYmxlIG9ubHkgQG9yZGVyIChvcmRlciAwOiBub3RoaW5nKSwgZmF1bHQgb25lIGFsaWduZWQgd2luZG93IGluIGFuZFxuKyAqIGNoZWNrIHRoZSBoZWxwZXJzIHNlZSBleGFjdGx5IEBvcmRlci5cbisgKi9cbitzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0c2l6ZV90IHNpemUgPSBwc2l6ZSgpIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdGJvb2wgb2sgPSB0cnVlO1xuK1x0Y2hhciAqcDtcbitcdGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0aWYgKG9yZGVyKVxuK1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0cCA9IGFsbG9jX2FsaWduZWQoc2l6ZSk7XG4rXHQqcCA9IDE7XG4rXG4rXHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIsXG4rXHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJvcmRlciAlZCBub3QgZGV0ZWN0ZWQgYWZ0ZXIgZmF1bHRcXG5cIiwgb3JkZXIpO1xuK1x0XHRvayA9IGZhbHNlO1xuK1x0fVxuK1xuK1x0LyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuK1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyIC0gMSxcbitcdFx0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsXG4rXHRcdFx0XHRcdFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgJWRcXG5cIixcbitcdFx0XHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHQvKiBPcmRlciAwIHBhZ2VzIG11c3Qgbm90IGxvb2sgbGlrZSBhbnkgbGFyZ2UgZm9saW8sIGFuZCB2aWNlIHZlcnNhLiAqL1xuK1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIDAsXG4rXHRcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLFxuK1x0XHRcdFx0XHRcdCAgICAga3BhZ2VmbGFnc19mZCkpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyIDBcXG5cIiwgb3JkZXIpO1xuK1x0XHRvayA9IGZhbHNlO1xuK1x0fVxuK1xuK1x0bXVubWFwKHAsIHNpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1xuK1x0a3NmdF90ZXN0X3Jlc3VsdChvaywgXCJvcmRlciAlZCBjbGFzc2lmaWVkXFxuXCIsIG9yZGVyKTtcbit9XG4rXG4raW50IG1haW4odm9pZClcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dW5zaWduZWQgbG9uZyBvcmRlcnM7XG4rXHRpbnQgb3JkZXI7XG4rXG4rXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuK1xuK1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cIik7XG4rXG4rXHRwYWdlbWFwX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvcGFnZW1hcFwiLCBPX1JET05MWSk7XG4rXHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCIpO1xuK1x0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCIvcHJvYy9rcGFnZWZsYWdzXCIsIE9fUkRPTkxZKTtcbitcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIm9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiKSByZXF1aXJlcyByb290XFxuXCIpO1xuK1xuK1x0b3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcbitcdGlmICghb3JkZXJzKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIk5vIHN1cHBvcnRlZCBUSFAgb3JkZXJzXFxuXCIpO1xuK1xuK1x0a3NmdF9zZXRfcGxhbihfX2J1aWx0aW5fcG9wY291bnRsKG9yZGVycykgKyAxKTtcbitcbitcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4rXHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRjaGVja19vcmRlcigwKTtcbitcdGZvciAob3JkZXIgPSAxOyBvcmRlciBcdTAwM2MgTlJfT1JERVJTOyBvcmRlcisrKSB7XG4rXHRcdGlmICghKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXIpKSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0Y2hlY2tfb3JkZXIob3JkZXIpO1xuK1x0fVxuK1xuK1xuK1x0a3NmdF9maW5pc2hlZCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5pbmRleCBlMjY0MmVjYTBkMDJiLi5kZjQyNmY5MjE4ZTcxIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5AQCAtNjUsNyArNjUsNiBAQCBlbnVtIHtcbiAjZGVmaW5lIEhNTV9QQVRIX01BWCAgICA2NFxuICNkZWZpbmUgTlRJTUVTXHRcdDEwXG4gXG4tI2RlZmluZSBBTElHTih4LCBhKSAoKCh4KSArIChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi9cbiBcbiAjaWZuZGVmIEZPTExfV1JJVEVcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuaW5kZXggZDc5MTdkY2UzYWJhYy4uOGFmY2RmOTc5M2JiNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcbkBAIC0xODMsNiArMTgzLDE3IEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuKy8qXG4rICogV3JpdGUgb25seSBvbiBjaGFuZ2U6IGFueSBzdG9yZSB0byBhIGtodWdlcGFnZWQgc3lzZnMga25vYiB3YWtlcyB0aGVcbisgKiBkYWVtb24sIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHlcbisgKiBhc2tlZCBmb3IgLS0ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBpcyB0aGUgb25seSBzYW5jdGlvbmVkIHdha2UuXG4rICovXG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcbit7XG4rXHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcbitcdFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xuK31cbitcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiB7XG4gXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFx1MDAyNnNldHRpbmdzLVx1MDAzZWtodWdlcGFnZWQ7XG5AQCAtMTk4LDE1ICsyMDksMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHRcdFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVx1MDAzZXNobWVtX2VuYWJsZWRdKTtcbiBcdHRocF93cml0ZV9udW0oXCJ1c2VfemVyb19wYWdlXCIsIHNldHRpbmdzLVx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xuIFxuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvZGVmcmFnXCIsIGtodWdlcGFnZWQtXHUwMDNlZGVmcmFnKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wiLFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCIsXG4tXHRcdFx0a2h1Z2VwYWdlZC1cdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblwiLCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL2RlZnJhZ1wiLCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCIsXG4rXHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL21heF9wdGVzX25vbmVcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9wYWdlc190b19zY2FuXCIsIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4gXG4gXHRpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSlcbiBcdFx0d3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLVx1MDAzZXJlYWRfYWhlYWRfa2IpO1xuQEAgLTIzMCw2ICsyNDEsNDkgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuKy8qXG4rICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdFxuKyAqIHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZC4gZnVsbF9zY2FucyBtdXN0IGFkdmFuY2UgYnkgdHdvO1xuKyAqIGEgKzEgc3RlcCBtYXkgY29tcGxldGUgYSBwYXNzIHRoYXQgZXhhbWluZWQgdGhpcyBtbSBiZWZvcmUgdGhlXG4rICogY2FsbGVyJ3Mgc2V0dXAgd2FzIGluIHBsYWNlLlxuKyAqXG4rICogQW55IHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIHNvIHRoZSBiYXJyaWVyIHdvcmtzXG4rICogd2hhdGV2ZXIgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlIC0tIGJ1dCBhIHN0b3JlIGNhbiBiZSBsb3N0LlxuKyAqIF9fc2xlZXBfbWlsbGlzZWNzX3N0b3JlKCkgY2xlYXJzIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGFuZCB3YWtlcyB0aGVcbisgKiBxdWV1ZTsgaWYgdGhlIGRhZW1vbiBpcyBiZXR3ZWVuIHNjYW5zIHJhdGhlciB0aGFuIHNsZWVwaW5nLCBpdCBzZXRzXG4rICoga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgaXRzZWxmIG9uIHRoZSB3YXkgaW50byBraHVnZXBhZ2VkX3dhaXRfd29yaygpIGFuZFxuKyAqIHRoZW4gc2xlZXBzIGZvciB0aGUgZnVsbCBpbnRlcnZhbCwgaGF2aW5nIG5ldmVyIHNlZW4gdGhlIHN0b3JlLiAgU28ga2VlcFxuKyAqIHN0b3JpbmcgdW50aWwgdGhlIHBhc3MgbGFuZHM7IGEgc3RvcmUgd2hpbGUgdGhlIGRhZW1vbiBpcyBhd2FrZSBjb3N0c1xuKyAqIG5vdGhpbmcgYW5kIGRvZXMgbm90IHF1ZXVlIGFuIGV4dHJhIHBhc3MuXG4rICpcbisgKiBPbmUgd2FrZSBjb21wbGV0ZXMgb25lIGZ1bGwgcGFzcyBvbmx5IGlmIHRoZSB3aG9sZSBtbSBsaXN0IGZpdHMgaW5cbisgKiBvbmUgc2NhbiBiYXRjaCwgc28gY2FsbGVycyBtdXN0IHBhaXIgdGhpcyB3aXRoIGEgbGFyZ2VcbisgKiBwYWdlc190b19zY2FuLlxuKyAqL1xuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcbit7XG4rXHR1bnNpZ25lZCBsb25nIGRlYWRsaW5lX21zID0gdGltZW91dF9zICogMTAwMFVMO1xuK1x0dW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9XG4rXHRcdHRocF9yZWFkX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIik7XG4rXHR1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwO1xuK1x0aW50IHBhc3M7XG4rXG4rXHRmb3IgKHBhc3MgPSAwOyBwYXNzIFx1MDAzYyAyOyBwYXNzKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxuK1x0XHRcdHRocF9yZWFkX251bShcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1wiKSArIDE7XG4rXG4rXHRcdHdoaWxlICh0aHBfcmVhZF9udW0oXCJraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcIikgXHUwMDNjIHRhcmdldCkge1xuK1x0XHRcdGlmIChlbGFwc2VkX21zIFx1MDAzZT0gZGVhZGxpbmVfbXMpXG4rXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdFx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0XHRcdCAgICAgIHNsZWVwX21zKTtcbitcdFx0XHR1c2xlZXAoMTAgKiAxMDAwKTtcbitcdFx0XHRlbGFwc2VkX21zICs9IDEwO1xuK1x0XHR9XG4rXHR9XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4gc3RydWN0IHRocF9zZXR0aW5ncyAqdGhwX2N1cnJlbnRfc2V0dGluZ3Modm9pZClcbiB7XG4gXHRpZiAoIXNldHRpbmdzX2luZGV4KSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbmluZGV4IDcyNmM3M2M0M2MwNWIuLmJhN2QzODM3MGQ0MzMgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5AQCAtNzAsNiArNzAsNyBAQCBpbnQgdGhwX3JlYWRfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10pO1xuIHZvaWQgdGhwX3dyaXRlX3N0cmluZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3JlYWRfbnVtKGNvbnN0IGNoYXIgKm5hbWUpO1xuIHZvaWQgdGhwX3dyaXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4gXG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuQEAgLTgzLDYgKzg0LDggQEAgc3RhdGljIGlubGluZSB2b2lkIHRocF9zYXZlX3NldHRpbmdzKHZvaWQpXG4gXHRodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7XG4gfVxuIFxuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcyk7XG4rXG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCAwZDZjNzFlZDJmYWUzLi5mNTc3M2Q0NDc1NDI3IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcbkBAIC0zMSw2ICszMSwxMSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XG4gc3RhdGljIGludCBocGFnZV9wbWRfbnI7XG4gc3RhdGljIGludCBhbm9uX29yZGVyO1xuIHN0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXI7XG4rc3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfZ2l2ZW47XG4rc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTtcbitzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVycztcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTtcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcbiBcbiAjZGVmaW5lIFBJRF9TTUFQUyBcIi9wcm9jL3NlbGYvc21hcHNcIlxuICNkZWZpbmUgVEVTVF9GSUxFIFwiY29sbGFwc2VfdGVzdF9maWxlXCJcbkBAIC0yNDEsNiArMjQ2LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKVxuIFx0cmV0dXJuIHN3YXA7XG4gfVxuIFxuKy8qXG4rICogUGFnZSB0aGUgcmFuZ2Ugb3V0IGFuZCB3YWl0IGZvciB0aGUgc3dhcCBjb3VudCB0byBzYXkgc28uXG4rICpcbisgKiBUd28gdGhpbmdzIGdldCBpbiB0aGUgd2F5LiAgTUFEVl9QQUdFT1VUIGlzIGJlc3QgZWZmb3J0OlxuKyAqIHNocmlua19mb2xpb19saXN0KCkgbGVhdmVzIGEgZm9saW8gYWxvbmUgd2hlbiBpdCBjYW5ub3QgcmVjbGFpbSBpdCByaWdodFxuKyAqIGF3YXksIGFuZCBvbmUgc3RpbGwgdW5kZXIgd3JpdGViYWNrIGZyb20gYW4gZWFybGllciBwYWdlb3V0IGlzIHRoZSBjb21tb25cbisgKiBjYXNlLCBzbyB0aGUgY291bnQgdGhlIGNhbGxlciBhc2tzIGZvciBhcnJpdmVzIGEgbW9tZW50IGxhdGVyLiAgQW5kIGEgcmFuZ2VcbisgKiBhbiBlYXJsaWVyIGNvbGxhcHNlIGxlZnQgTUFEVl9IVUdFUEFHRSBpcyBvbmUga2h1Z2VwYWdlZCBpcyBzdGlsbCB3b3JraW5nXG4rICogb246IGNvbGxhcHNpbmcgYSByYW5nZSB3aXRoIHVwIHRvIG1heF9wdGVzX3N3YXAgcGFnZXMgc3dhcHBlZCBvdXQgbWVhbnNcbisgKiByZWFkaW5nIHRob3NlIHBhZ2VzIGJhY2sgaW4sIHNvIHRoZSBkYWVtb24gdW5kb2VzIHRoZSBwYWdlb3V0IGFzIGZhc3QgYXMgaXRcbisgKiBpcyBhc2tlZCBmb3IuICBLZWVwIHRoZSByYW5nZSBvdXQgb2YgaXRzIHJlYWNoOyB0aGUgY29sbGFwc2UgdGhlIGNhbGxlciBydW5zXG4rICogbmV4dCBwdXRzIE1BRFZfSFVHRVBBR0UgYmFjay5cbisgKlxuKyAqIEZhaWxpbmcgdG8gZ2V0IHRoZSBwYWdlcyBvdXQgaXMgdGhlIG1hY2hpbmUncyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJ3MgLS1cbisgKiBzd2FwIHRvbyBzbWFsbCwgc3dhcCBmdWxsLCBhIG1lbWNnIGNhcCwgYSBmb2xpbyBzdGlsbCB1bmRlciB3cml0ZWJhY2sgLS0gc29cbisgKiBjYWxsZXJzIHNraXAgcmF0aGVyIHRoYW4gZmFpbC4gIEFuIGVycm9yIGZyb20gbWFkdmlzZSgpIGlzIGRpZmZlcmVudCwgYW5kXG4rICogZW5kcyB0aGUgcnVuIGhlcmUuXG4rICovXG4rc3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0aW50IGk7XG4rXG4rXHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX05PSFVHRVBBR0UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSlcIik7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0MDsgaSsrKSB7XG4rXHRcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX1BBR0VPVVQpXCIpO1xuK1x0XHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0dXNsZWVwKDUwICogMTAwMCk7XG4rXHR9XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuIHN0YXRpYyB2b2lkICphbGxvY19tYXBwaW5nKGludCBucilcbiB7XG4gXHR2b2lkICpwO1xuQEAgLTU4Myw4ICs2MjMsMTAgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sXG4gXHRcdGludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBjb2xsYXBfb3JkZXI7XG4rXHQvKiBUaHJlZSBzZWNvbmRzIGFzIGEgZmxvb3IsIHBsdXMgYSBzZWNvbmQgcGVyIDEyOE0gdG8gY29sbGFwc2UgKi9cbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9zaXplO1xuK1x0aW50IHRpbWVvdXQgPSA2ICsgMiAqIChieXRlcyAvICgxMjhVTCBcdTAwM2NcdTAwM2MgMjApKTtcbiBcdGludCBmdWxsX3NjYW5zO1xuLVx0aW50IHRpbWVvdXQgPSA2OyAvKiAzIHNlY29uZHMgKi9cbiBcbiBcdC8qIFNhbml0eSBjaGVjayAqL1xuIFx0aWYgKCFvcHMtXHUwMDNlY2hlY2tfaHVnZShwLCBsZW4sIDAsIGhwYWdlX3NpemUpKVxuQEAgLTg1MywxMiArODk1LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXG4gXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4gXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFxuLVx0aWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfUEFHRU9VVClcIik7XG4tXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XG4rXHRpZiAoc3dhcG91dF9yYW5nZShwLCBwYWdlX3NpemUpKSB7XG4gXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1x0XHRza2lwKFwiQ291bGQgbm90IHN3YXAgb3V0XCIpO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbkBAIC04ODUsMTIgKzkyNSwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbi1cdGlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICsgMSkgKiBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVwiKTtcbi1cdGlmIChjaGVja19zd2FwKHAsIChtYXhfcHRlc19zd2FwICsgMSkgKiBwYWdlX3NpemUpKSB7XG4rXHRpZiAoc3dhcG91dF9yYW5nZShwLCAobWF4X3B0ZXNfc3dhcCArIDEpICogcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwiT0tcIik7XG4gXHR9IGVsc2Uge1xuLVx0XHRmYWlsKFwiRmFpbFwiKTtcbitcdFx0c2tpcChcIkNvdWxkIG5vdCBzd2FwIG91dFwiKTtcbiBcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG5AQCAtOTAyLDEyICs5NDAsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc3dhcChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9cbiBcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcdFx0a3NmdF9wcmludF9tc2coXCJTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCIsIG1heF9wdGVzX3N3YXAsXG4gXHRcdCAgICAgICBocGFnZV9wbWRfbnIpO1xuLVx0XHRpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVwiKTtcbi1cdFx0aWYgKGNoZWNrX3N3YXAocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbitcdFx0aWYgKHN3YXBvdXRfcmFuZ2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbiBcdFx0XHRzdWNjZXNzKFwiT0tcIik7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0ZmFpbChcIkZhaWxcIik7XG4rXHRcdFx0c2tpcChcIkNvdWxkIG5vdCBzd2FwIG91dFwiKTtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFxuQEAgLTk3NCw2ICsxMDEwLDE2IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2NvbXBvdW5kX2V4dHJlbWUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHR2b2lkICpwO1xuIFx0aW50IGk7XG4gXG4rXHQvKlxuK1x0ICogVGhlIHRlc3QgbmVlZHMgaHBhZ2VfcG1kX25yIFBNRC1vcmRlciBhbGxvY2F0aW9ucywgd2hpY2ggaXMgbGlrZWx5IHRvXG4rXHQgKiBmYWlsIGZvciBsYXJnZSBQTUQgc2l6ZXMuICBTa2lwIGlmIHRoZSBQTUQgc2l6ZSBpcyBvdmVyIDMyTS5cbitcdCAqL1xuK1x0aWYgKGhwYWdlX3BtZF9zaXplIFx1MDAzZSAoMzJVTCBcdTAwM2NcdTAwM2MgMjApKSB7XG4rXHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcIiVzOiBQTUQgdG9vIGxhcmdlIGZvciBmYXVsdC10aW1lIFRIUCBjb25zdHJ1Y3Rpb25cXG5cIixcbitcdFx0XHRcdCAgICAgIF9fZnVuY19fKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuIFx0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuIFx0a3NmdF9wcmludF9tc2coXCJDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xcblwiKTtcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGhwYWdlX3BtZF9ucjsgaSsrKSB7XG5AQCAtMTE2NCw2ICsxMjEwLDcyIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcbiBcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbiB9XG4gXG4rLypcbisgKiBDb250ZW50IHN0YXlzIGlzb2xhdGVkIHdoaWxlIGEgY28tc2hhcmVyIHdyaXRlcyBjb25jdXJyZW50bHkuIEEgc2hhcmVkXG4rICogc291cmNlIGlzIGNvcGllZCBsaXZlIChub3QgZnJvemVuKSwgcmVseWluZyBvbiBpdCBiZWluZyBDb1cgLSBpbW11dGFibGVcbisgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb3B5OyBhIGNvLXNoYXJlcidzIHdyaXRlIGdvZXMgdG8gYSBDb1cgY29weS4gVGhlXG4rICogY29sbGFwc2luZyBjaGlsZCBtdXN0IHNlZSB0aGUgcHJlLWZvcmsgY29udGVudCwgdGhlIHdyaXRpbmcgcGFyZW50IG9ubHlcbisgKiBpdHMgb3duIHdyaXRlcy5cbisgKi9cbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9mb3JrX2Nvd19yYWNlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgc2hhcmVkID0gNjQgKiBwYWdlX3NpemU7XG4rXHRjb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7XG4rXHRpbnQgd3N0YXR1cywgY2hpbGRfc3RhdHVzLCBpLCBuID0gc2hhcmVkIC8gcGFnZV9zaXplO1xuK1x0Lyogdm9sYXRpbGU6IHRoZSBsb29wIGJlbG93IG11c3QgcmVhbGx5IHN0b3JlLCBvbiBldmVyeSBpdGVyYXRpb24gKi9cbitcdHZvbGF0aWxlIGludCAqaXA7XG4rXHR2b2lkICpwO1xuK1xuK1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuK1x0aXAgPSBwO1xuK1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIHNoYXJlZCk7XHRcdC8qIHNoYXJlZCBwcmVmaXgsIHByZS1mb3JrIHBhdHRlcm4gKi9cbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiRm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cIik7XG4rXHRpZiAoIWZvcmsoKSkge1xuK1x0XHRpbnQgY29sbGFwc2Vfc3RhdHVzO1xuK1xuK1x0XHRvcHMtXHUwMDNlZmF1bHQocCwgc2hhcmVkLCBocGFnZV9wbWRfc2l6ZSk7XHQvKiBwcml2YXRlIHJlbWFpbmRlciAqL1xuK1x0XHRjLVx1MDAzZWNvbGxhcHNlKFwiQ29sbGFwc2UgYSByYW5nZSBzaGFyZWQgd2l0aCBhIHdyaXRpbmcgY28tc2hhcmVyXCIsXG4rXHRcdFx0ICAgIHAsIDEsIG9wcywgdHJ1ZSk7XG4rXHRcdGNvbGxhcHNlX3N0YXR1cyA9IGV4aXRfc3RhdHVzO1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGRlYWQwMDAwKVxuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdGlmIChpID09IG4pXG4rXHRcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0XHRlbHNlXG4rXHRcdFx0ZmFpbChcIkZhaWw6IGNoaWxkIGNvbnRlbnRcIik7XG4rXHRcdC8qIFRoZSBjb250ZW50IGNoZWNrIG11c3Qgbm90IGJ1cnkgYSBmYWlsZWQgY29sbGFwc2UuICovXG4rXHRcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXG4rXHRcdFx0ZXhpdF9zdGF0dXMgPSBjb2xsYXBzZV9zdGF0dXM7XG4rXHRcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0XHRfZXhpdChleGl0X3N0YXR1cyk7XG4rXHR9XG4rXG4rXHQvKiBIYW1tZXIgdGhlIHBhcmVudCdzIG93biB3cml0ZXMgb3ZlciB0aGUgc2hhcmVkIHByZWZpeC4gKi9cbitcdGZvciAoaW50IGl0ID0gMDsgaXQgXHUwMDNjIDIwMDAwMDsgaXQrKylcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKVxuK1x0XHRcdGlwW2kgKiBzdHJpZGVdID0gaSArIDB4YmVlZjAwMDA7XG4rXG4rXHR3YWl0KFx1MDAyNndzdGF0dXMpO1xuK1x0LyogQSBjaGlsZCB0aGF0IGRpZWQgcmVhZGluZyB0aGUgcmFjaW5nIHBhZ2VzIGlzIGEgZmFpbHVyZSwgbm90IGEgemVyby4gKi9cbitcdGNoaWxkX3N0YXR1cyA9IFdJRkVYSVRFRCh3c3RhdHVzKSA/IFdFWElUU1RBVFVTKHdzdGF0dXMpIDogS1NGVF9GQUlMO1xuK1xuK1x0a3NmdF9wcmludF9tc2coXCJDaGVjayB0aGUgcGFyZW50IHNlZXMgb25seSBpdHMgb3duIHdyaXRlcy4uLlwiKTtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkrKylcbitcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGJlZWYwMDAwKVxuK1x0XHRcdGJyZWFrO1xuK1x0aWYgKGkgPT0gbilcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbDogcGFyZW50IGNvbnRlbnRcIik7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdC8qIFNhbWUgYWdhaW46IG91ciBvd24gY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQncyB2ZXJkaWN0LiAqL1xuK1x0aWYgKGV4aXRfc3RhdHVzICE9IEtTRlRfRkFJTClcbitcdFx0ZXhpdF9zdGF0dXMgPSBjaGlsZF9zdGF0dXM7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiBcdFx0XHRcdFx0ICAgc3RydWN0IG1lbV9vcHMgKm9wcylcbiB7XG5AQCAtMTIwOSw2ICsxMzIxLDIxOSBAQCBzdGF0aWMgdm9pZCBtYWR2aXNlX3JldHJhY3RlZF9wYWdlX3RhYmxlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiBcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbiB9XG4gXG4rLyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqL1xuKyNkZWZpbmUgTUlOX01USFBfT1JERVIgMlxuK1xuKy8qXG4rICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBmb3IgdGhlIG10aHBfa2h1Z2VwYWdlZCBjb250ZXh0LiAgV2hhdFxuKyAqIHRoZXkgYWRkIG92ZXIgdGhlIGdlbmVyaWMgY2FzZXMgcnVuIHVuZGVyIHRoYXQgY29udGV4dCBpcyBwZXItd2luZG93XG4rICogZGV0ZWN0aW9uOiB3aGljaCBhbGlnbmVkIHdpbmRvdyBjb2xsYXBzZWQsIGFuZCB3aGljaCBvZiBpdHMgbmVpZ2hib3VycyBkaWRcbisgKiBub3QuICBjaGVja19odWdlKCkgYW5zd2VycyBob3cgbWFueSBmb2xpb3Mgb2YgdGhlIG9yZGVyIHRoZSByYW5nZSBob2xkcyxcbisgKiB3aGljaCBjYW5ub3QgdGVsbCBvbmUgd2luZG93IGZyb20gYW5vdGhlci5cbisgKlxuKyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgYW5kIHRoZSB0YXJnZXQgb3JkZXIgaXMgb25seVxuKyAqIGVuYWJsZWQgZm9yIG1hZHZpc2UsIHNvIHRoZSBzb3VyY2VzIGFyZSBhbHdheXMgb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlXG4rICogcHJvZHVjdCBjYW4gb25seSBoYXZlIGNvbWUgZnJvbSBraHVnZXBhZ2VkLlxuKyAqL1xuK3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKVxuK3tcbitcdHJldHVybiBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcHNlX29yZGVyO1xuK31cbitcbitzdGF0aWMgdm9pZCBtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKHZvaWQpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0aW50IGk7XG4rXG4rXHQvKlxuK1x0ICogVGhlIHRhcmdldCBvcmRlciwgZm9yIG1hZHZpc2Ugb25seSwgYW5kIG5vdGhpbmcgZWxzZSBlbmFibGVkOiB0aGVcbitcdCAqIGNhc2VzIGZhdWx0IHRoZWlyIHJlZ2lvbiBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgc28gdGhlIHNvdXJjZXMgYXJlXG4rXHQgKiBvcmRlciAwIHdoYXRldmVyIC1zIGFza2VkIHRoZSBmYXVsdCBwYXRoIGZvci4gIFRoYXQgbWF0dGVycyBmb3IgdGhlXG4rXHQgKiBjYXNlcyBidWlsdCBhcm91bmQgYSBob2xlIC0tIGEgbGFyZ2Ugc291cmNlIGZvbGlvIHdvdWxkIGZpbGwgaXQgaW5cbitcdCAqIGFuZCB0aGUgd2luZG93IHdvdWxkIGNvbGxhcHNlIGFmdGVyIGFsbC5cbitcdCAqIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMgZW5hYmxlcyB0aGUgc291cmNlIG9yZGVyIGl0IHdhbnRzIG9uXG4rXHQgKiB0b3Agb2YgdGhpcy5cbitcdCAqL1xuK1x0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRzZXR0aW5ncy5odWdlcGFnZXNbY29sbGFwc2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfTUFEVklTRTtcbitcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgd2luZG93X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxuK3tcbitcdHJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGxlbiwgY29sbGFwc2Vfb3JkZXIsXG4rXHRcdFx0XHRcdCAgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbit9XG4rXG4rLyogTm8gYWxpZ25lZCB3aW5kb3cgaW4gW3AsIHAgKyBsZW4pIGlzIGJhY2tlZCBhdCB0aGUgdGFyZ2V0IG9yZGVyLiAqL1xuK3N0YXRpYyBib29sIHdpbmRvd19ub3RfY29sbGFwc2VkKHZvaWQgKnAsIHNpemVfdCBsZW4pXG4re1xuK1x0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcbitcdGNoYXIgKmFkZHIgPSBwO1xuK1xuK1x0Zm9yICg7IGxlbiBcdTAwM2U9IHdpbmRvdzsgYWRkciArPSB3aW5kb3csIGxlbiAtPSB3aW5kb3cpIHtcbitcdFx0aWYgKHdpbmRvd19jb2xsYXBzZWQoYWRkciwgd2luZG93KSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rc3RhdGljIGJvb2wga2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcyh2b2lkKVxuK3tcbitcdC8qIFdhaXQgdXAgdG8gMzAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXG4rXHRyZXR1cm4ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMzApO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuK1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuK1x0dm9pZCAqcDtcbitcbitcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuK1x0aWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cIik7XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2Ugb25lIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3cuLi5cIik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAgKyB3aW5kb3csIHdpbmRvdykgXHUwMDI2XHUwMDI2XG4rXHRcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwLCB3aW5kb3cpIFx1MDAyNlx1MDAyNlxuK1x0XHQgd2luZG93X25vdF9jb2xsYXBzZWQocCArIDIgKiB3aW5kb3csXG4rXHRcdFx0XHQgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxuK1x0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRlbHNlXG4rXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1xuK1x0dmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4rXHRcdFx0XHRcdCAgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHR2b2lkICpwO1xuK1xuK1x0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xuK1xuK1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuK1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIHBhZ2Vfc2l6ZSk7XG4rXHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSB3aW5kb3cgd2l0aCBzaW5nbGUgUFRFIGVudHJ5IHByZXNlbnQuLi5cIik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIG10aHBfd2luZG93X3NpemUoKSkpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgcGFnZV9zaXplKTtcbitcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuK1x0XHRcdFx0XHQgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcbitcdHZvaWQgKnA7XG4rXG4rXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4rXHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDtcbitcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbitcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCIpO1xuK1xuK1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4rXHRrc2Z0X3ByaW50X21zZyhcIkNvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlwiKTtcbitcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuK1x0XHRmYWlsKFwiVGltZW91dFwiKTtcbitcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgKyB3aW5kb3csIHdpbmRvdykpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0aW50IHNvdXJjZV9vcmRlciA9IGFub25fb3JkZXIgPyBhbm9uX29yZGVyIDogTUlOX01USFBfT1JERVI7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dm9pZCAqcDtcbitcbitcdC8qIFNvdXJjZXMgbXVzdCBiZSBhIHN1cHBvcnRlZCBtVEhQIG9yZGVyIHN0cmljdGx5IGJlbG93IHRoZSB0YXJnZXQuICovXG4rXHRpZiAoc291cmNlX29yZGVyIFx1MDAzZT0gY29sbGFwc2Vfb3JkZXIgfHxcbitcdCAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIHNvdXJjZV9vcmRlcikpKSB7XG4rXHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcIiVzOiBubyBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxuXCIsXG4rXHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbitcbitcdC8qIEZhdWx0IHRoZSB3aG9sZSByZWdpb24gYXMgb3JkZXItQHNvdXJjZV9vcmRlciBmb2xpb3MuICovXG4rXHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuK1x0c2V0dGluZ3MuaHVnZXBhZ2VzW3NvdXJjZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1xuK1x0LypcbitcdCAqIFRoZSBvcmRlciBpcyBlbmFibGVkIGFuZCBzdXBwb3J0ZWQsIGJ1dCB0aGUgYWxsb2NhdG9yIGNhbiBzdGlsbCBmYWxsXG4rXHQgKiBiYWNrIHVuZGVyIGZyYWdtZW50YXRpb24uICBUaGF0IGxlYXZlcyBub3RoaW5nIHRvIGNvbGxhcHNlIGZyb20sXG4rXHQgKiB3aGljaCBpcyB0aGUgbWFjaGluZSdzIGFuc3dlciByYXRoZXIgdGhhbiBhIHJlYXNvbiB0byBlbmQgdGhlIHJ1bi5cbitcdCAqL1xuK1x0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsXG4rXHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJObyBvcmRlci0lZCBzb3VyY2VzIHRvIGNvbGxhcHNlLi4uXCIsIHNvdXJjZV9vcmRlcik7XG4rXHRcdHNraXAoXCJTa2lwXCIpO1xuK1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0dGhwX3BvcF9zZXR0aW5ncygpO1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi5cIixcbitcdFx0ICAgICAgIHNvdXJjZV9vcmRlcik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiB7XG4gXHRmcHJpbnRmKHN0ZGVyciwgXCJcXG5Vc2FnZTogLi9raHVnZXBhZ2VkIFtPUFRJT05TXSBcdTAwM2N0ZXN0IHR5cGVcdTAwM2UgW2Rpcl1cXG5cXG5cIik7XG5AQCAtMTIyNiwxMSArMTU1MSwxNSBAQCBzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKVxuIFx0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdC1zOiBtVEhQIHNpemUsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxcblwiKTtcbiBcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cXG5cIik7XG4gXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIERlZmF1bHRzIHRvIGV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBiZWxvdyB0aGUgUE1ELlxcblwiKTtcbitcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQgICAgV2l0aCAtcywgLXMgbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXFxuXCIpO1xuIFx0ZXhpdCgxKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4rXHRib29sIG10aHBfY29udGV4dF9pbXBsaWVkID0gZmFsc2U7XG4gXHRpbnQgb3B0O1xuIFx0Y2hhciAqYnVmO1xuIFx0Y29uc3QgY2hhciAqdG9rZW47XG5AQCAtMTI0Miw2ICsxNTcxLDcgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAnYyc6XG4gXHRcdFx0Y29sbGFwc2Vfb3JkZXIgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0Y29sbGFwc2Vfb3JkZXJfZ2l2ZW4gPSB0cnVlO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICdoJzpcbiBcdFx0ZGVmYXVsdDpcbkBAIC0xMjQ5LDEyICsxNTc5LDI1IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdH1cbiBcdH1cbiBcbitcdC8qXG4rXHQgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyXG4rXHQgKiBjYW4gYmUgbmVnYXRpdmUsIGFuZCBhIHplcm8gY29sbGFwc2Ugb3JkZXIgYXNrcyBmb3IgYmFzZSBwYWdlcy5cbitcdCAqL1xuK1x0aWYgKGFub25fb3JkZXIgXHUwMDNjIDAgfHwgYW5vbl9vcmRlciBcdTAwM2UgaHBhZ2VfcG1kX29yZGVyKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCItcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXFxuXCIsXG4rXHRcdFx0XHQgICBocGFnZV9wbWRfb3JkZXIsIGFub25fb3JkZXIpO1xuK1x0aWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuIFx1MDAyNlx1MDAyNlxuK1x0ICAgIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IDAgfHwgY29sbGFwc2Vfb3JkZXIgXHUwMDNlIGhwYWdlX3BtZF9vcmRlcikpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIi1jIHRha2VzIGFuIG9yZGVyIGluIDEuLiVkLCBub3QgJWRcXG5cIixcbitcdFx0XHRcdCAgIGhwYWdlX3BtZF9vcmRlciwgY29sbGFwc2Vfb3JkZXIpO1xuK1xuIFx0YXJndiArPSBvcHRpbmQ7XG4gXHRhcmdjIC09IG9wdGluZDtcbiBcbiBcdGlmIChhcmdjID09IDApIHtcbi1cdFx0LyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi9cbitcdFx0LyogRXZlcnl0aGluZyB0aGF0IG5lZWRzIG5vIGFyZ3VtZW50IG9mIGl0cyBvd246IGFub24sIGV2ZXJ5IGNvbnRleHQgKi9cbiBcdFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fa2h1Z2VwYWdlZF9jb250ZXh0O1xuK1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0cmV0dXJuO1xuQEAgLTEyNjUsMTMgKzE2MDgsMTkgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcbiBcdGlmICghc3RyY21wKHRva2VuLCBcImFsbFwiKSkge1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbitcbitcdFx0LypcbitcdFx0ICogXCJhbGxcIiBzd2VlcHMgdGhlIG1USFAgY29udGV4dCBpbiwgYnV0IGl0IG9ubHkgaGFzIGFub25cbitcdFx0ICogY2FzZXM6IHN0ZXAgaXQgYXNpZGUgZm9yIHRoZSBvdGhlciBtZW1fdHlwZXMgcmF0aGVyIHRoYW5cbitcdFx0ICogcmVmdXNpbmcgdGhlIHdob2xlIHJ1bi5cbitcdFx0ICovXG4rXHRcdG10aHBfY29udGV4dF9pbXBsaWVkID0gdHJ1ZTtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCJraHVnZXBhZ2VkXCIpKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCJtdGhwX2todWdlcGFnZWRcIikpIHtcbiBcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dDtcbi1cdFx0aWYgKGNvbGxhcHNlX29yZGVyIFx1MDAzYz0gMCB8fCBjb2xsYXBzZV9vcmRlciBcdTAwM2U9IGhwYWdlX3BtZF9vcmRlcilcbi1cdFx0XHR1c2FnZSgpO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcIm1hZHZpc2VcIikpIHtcbiBcdFx0bWFkdmlzZV9jb250ZXh0ID0gIFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xuIFx0fSBlbHNlIHtcbkBAIC0xMjg3LDIwICsxNjM2LDIwIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuIFx0XHRhbm9uX29wcyA9IFx1MDAyNl9fYW5vbl9vcHM7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4tXHRcdFx0dXNhZ2UoKTtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFwiYW5vblwiKSkge1xuIFx0XHRhbm9uX29wcyA9IFx1MDAyNl9fYW5vbl9vcHM7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcImZpbGVcIikpIHtcbiBcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gIFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4rXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCBcdTAwMjZcdTAwMjYgIW10aHBfY29udGV4dF9pbXBsaWVkKVxuIFx0XHRcdHVzYWdlKCk7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gTlVMTDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFwic2htZW1cIikpIHtcbiBcdFx0c2htZW1fb3BzID0gXHUwMDI2X19zaG1lbV9vcHM7XG4tXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcbitcdFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFx1MDAyNlx1MDAyNiAhbXRocF9jb250ZXh0X2ltcGxpZWQpXG4gXHRcdFx0dXNhZ2UoKTtcbitcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIHtcbiBcdFx0dXNhZ2UoKTtcbiBcdH1cbkBAIC0xMzIyLDkgKzE2NzEsMTQgQEAgc3RydWN0IHRlc3RfY2FzZSB7XG4gXHRzdHJ1Y3QgbWVtX29wcyAqb3BzO1xuIFx0Y29uc3QgY2hhciAqZGVzYztcbiBcdHRlc3RfZm4gZm47XG4rXHRpbnQgb3JkZXI7XHRcdC8qIG1USFAgY29udGV4dHM6IHRoZSBjb2xsYXBzZSBvcmRlciAqL1xuIH07XG4gXG4tI2RlZmluZSBNQVhfVEVTVF9DQVNFUyA2NFxuKy8qXG4rICogRW5vdWdoIGZvciBldmVyeSBjYXNlIGF0IGV2ZXJ5IG9yZGVyIHRoZSBrZXJuZWwgb2ZmZXJzOiB0aGUgbVRIUCBjb250ZXh0XG4rICogcnVucyBpdHMgY2FzZXMgb25jZSBwZXIgc3VwcG9ydGVkIG9yZGVyIGJlbG93IHRoZSBQTUQuXG4rICovXG4rI2RlZmluZSBNQVhfVEVTVF9DQVNFUyAyNTZcbiBzdGF0aWMgc3RydWN0IHRlc3RfY2FzZSB0ZXN0X2Nhc2VzW01BWF9URVNUX0NBU0VTXTtcbiBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXG5AQCAtMTMzNyw2ICsxNjkxLDcgQEAgc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xuIFx0XHRcdC5vcHNcdD0gbyxcdFx0XHRcdFx0XFxcbiBcdFx0XHQuZGVzY1x0PSAjdCxcdFx0XHRcdFx0XFxcbiBcdFx0XHQuZm5cdD0gdCxcdFx0XHRcdFx0XFxcbitcdFx0XHQub3JkZXJcdD0gY29sbGFwc2Vfb3JkZXIsXHRcdFx0XFxcbiBcdFx0fTtcdFx0XHRcdFx0XHRcdFxcXG4gXHR9XHRcdFx0XHRcdFx0XHRcdFxcXG4gXHR9IHdoaWxlICgwKVxuQEAgLTEzNzcsOCArMTczMiw4MyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXG4gXHRwYXJzZV90ZXN0X3R5cGUoYXJnYywgYXJndik7XG4gXG4rXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcbitcdFx0dW5zaWduZWQgbG9uZyBvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuK1xuK1x0XHRpZiAoY29sbGFwc2Vfb3JkZXJfZ2l2ZW4pIHtcbitcdFx0XHQvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi9cbitcdFx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNlPSBocGFnZV9wbWRfb3JkZXIpXG4rXHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCItYyB0YWtlcyBhbiBvcmRlciBiZWxvdyB0aGUgUE1EIG9yZGVyICglZClcXG5cIixcbitcdFx0XHRcdFx0XHQgICBocGFnZV9wbWRfb3JkZXIpO1xuK1x0XHRcdGlmICghKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgY29sbGFwc2Vfb3JkZXIpKSlcbitcdFx0XHRcdGtzZnRfZXhpdF9za2lwKFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxuXCIsXG4rXHRcdFx0XHRcdCAgICAgICBjb2xsYXBzZV9vcmRlcik7XG4rXHRcdFx0aWYgKGNvbGxhcHNlX29yZGVyIFx1MDAzYz0gYW5vbl9vcmRlcilcbitcdFx0XHRcdGtzZnRfZXhpdF9za2lwKFwiLWMgJWQgbmVlZHMgYSBzb3VyY2Ugb3JkZXIgYmVsb3cgaXQsIC1zIHNheXMgJWRcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGNvbGxhcHNlX29yZGVyLCBhbm9uX29yZGVyKTtcbitcdFx0XHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gY29sbGFwc2Vfb3JkZXI7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBPdGhlcndpc2UgZXZlcnkgb3JkZXIgYSBjb2xsYXBzZSBjb3VsZCBwcm9kdWNlLiAgLXNcbitcdFx0XHQgKiBtYWtlcyB0aGUgZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlcixcbitcdFx0XHQgKiBzbyBhIHRhcmdldCBhdCBvciBiZWxvdyBpdCBoYXMgbm90aGluZyB0byBjb2xsYXBzZTpcbitcdFx0XHQgKiB0aGUgc291cmNlcyBhcmUgYWxyZWFkeSB0aGUgc2l6ZSBiZWluZyBhc2tlZCBmb3IuXG4rXHRcdFx0ICovXG4rXHRcdFx0aW50IGZpcnN0ID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgKyAxIDogTUlOX01USFBfT1JERVI7XG4rXG4rXHRcdFx0aWYgKGZpcnN0IFx1MDAzYyBNSU5fTVRIUF9PUkRFUilcbitcdFx0XHRcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XG4rXHRcdFx0Zm9yIChpbnQgaSA9IGZpcnN0OyBpIFx1MDAzYyBocGFnZV9wbWRfb3JkZXI7IGkrKykge1xuK1x0XHRcdFx0aWYgKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpXG4rXHRcdFx0XHRcdGNvbGxhcHNlX29yZGVyc1tucl9jb2xsYXBzZV9vcmRlcnMrK10gPSBpO1xuK1x0XHRcdH1cbitcdFx0XHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcbitcdFx0XHRcdGtzZnRfcHJpbnRfbXNnKFwibVRIUCBjYXNlcyBza2lwcGVkOiBubyBvcmRlciBhYm92ZSB0aGUgc291cmNlXFxuXCIpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcbitcdFx0cGFnZW1hcF9mZCA9IG9wZW4oXCIvcHJvYy9zZWxmL3BhZ2VtYXBcIiwgT19SRE9OTFkpO1xuK1x0XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcIik7XG4rXHRcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwiL3Byb2Mva3BhZ2VmbGFnc1wiLCBPX1JET05MWSk7XG4rXHRcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm9wZW4oL3Byb2Mva3BhZ2VmbGFncylcIik7XG4rXHR9XG4rXG4gXHRzZXRidWYoc3Rkb3V0LCBOVUxMKTtcbiBcbitcdC8qXG4rXHQgKiBUaGUgcGFnZSBjYWNoZSBjYXBzIGZvbGlvIG9yZGVyIGF0IE1BWF9QQUdFQ0FDSEVfT1JERVIsIHdoaWNoXG4rXHQgKiB4YXNfc3BsaXRfYWxsb2MoKSBwdXRzIGJlbG93IHRoZSBQTUQgb3JkZXIgb24gYXJtNjQgd2l0aCA2NEsgcGFnZXMuXG4rXHQgKiBBIFBNRC1zaXplZCBwYWdlIGNhY2hlIGZvbGlvIGlzIHRoZW4gaW1wb3NzaWJsZSwgc28gdGhlIGtlcm5lbFxuK1x0ICogcmVmdXNlcyB0aGVzZSBjb2xsYXBzZXMgYnkgZGVzaWduIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuXG4rXHQgKlxuK1x0ICogVGhlIGNhcCBpcyBvbmUgZ2xvYmFsLCBzbyBpdCBydWxlcyBvdXQgZXZlcnkgZmlsZSBtYXBwaW5nLCBub3QganVzdFxuK1x0ICogc2htZW06IHNobWVtX2h1Z2VfZ2xvYmFsX2VuYWJsZWQoKSBkcm9wcyB0aGUgUE1EIG9yZGVyIGZyb20gd2hhdCBpdFxuK1x0ICogYWxsb3dzLCBhbmQgZmlsZV90aHBfZW5hYmxlZCgpIHJlZnVzZXMgYSByZWd1bGFyIGZpbGUgd2hvc2UgbWFwcGluZ1xuK1x0ICogY2Fubm90IGhvbGQgYSBQTUQgZm9saW8uXG4rXHQgKlxuK1x0ICogVGhlIHBlci1vcmRlciBzaG1lbV9lbmFibGVkIGNvbnRyb2wgYmVsb3cgaXMgd2hhdCBtYWtlcyB0aGUgY2FwXG4rXHQgKiByZWFkYWJsZTogaXQgaXMgY3JlYXRlZCBmb3IgdGhlIG9yZGVycyBpbiBUSFBfT1JERVJTX0FMTF9GSUxFX0RFRkFVTFQsXG4rXHQgKiB3aGljaCBpcyB0aGUgY2FwIGFuZCBub3RoaW5nIGVsc2UsIHNvIHdoZXRoZXIgdGhlIFBNRCBvcmRlciBoYXMgb25lXG4rXHQgKiBhbnN3ZXJzIGZvciBhIHJlZ3VsYXIgZmlsZSBhcyBtdWNoIGFzIGZvciBzaG1lbS5cbitcdCAqL1xuK1x0aWYgKCEodGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaHBhZ2VfcG1kX29yZGVyKSkpIHtcbitcdFx0aWYgKHNobWVtX29wcykge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwibm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIHNobWVtXFxuXCIpO1xuK1x0XHRcdHNobWVtX29wcyA9IE5VTEw7XG4rXHRcdH1cbitcdFx0aWYgKHJlYWRfb25seV9maWxlX29wcykge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwibm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcXG5cIik7XG4rXHRcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gTlVMTDtcbitcdFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSBOVUxMO1xuK1x0XHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSBOVUxMO1xuK1x0XHR9XG4rXHRcdGlmICghYW5vbl9vcHMgXHUwMDI2XHUwMDI2ICFzaG1lbV9vcHMgXHUwMDI2XHUwMDI2ICFyZWFkX29ubHlfZmlsZV9vcHMpXG4rXHRcdFx0a3NmdF9leGl0X3NraXAoXCJOb3RoaW5nIGxlZnQgdG8gY29sbGFwc2UgaW50b1xcblwiKTtcbitcdH1cbitcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaHBhZ2VfcG1kX25yIC0gMTtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODtcbiBcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zaGFyZWQgPSBocGFnZV9wbWRfbnIgLyAyO1xuQEAgLTEzOTYsNyArMTgyNiwxNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCBzaG1lbV9vcHMpO1xuLVx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIG5yX2NvbGxhcHNlX29yZGVyczsgaSsrKSB7XG4rXHRcdGNvbGxhcHNlX29yZGVyID0gY29sbGFwc2Vfb3JkZXJzW2ldO1xuK1x0XHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHR9XG4rXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbkBAIC0xNDA0LDEwICsxODQ0LDggQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7XG4gXG4gXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbi1cdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbi1cdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXG4gXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG5AQCAtMTQ2Myw2ICsxOTAxLDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFxuK1x0VEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4rXG4gXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbkBAIC0xNDc4LDcgKzE5MTksMTUgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIG5yX3Rlc3RfY2FzZXM7IGkrKykge1xuIFx0XHRzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gXHUwMDI2dGVzdF9jYXNlc1tpXTtcbiBcbi1cdFx0a3NmdF9wcmludF9tc2coXCJcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXFxuXCIsIHQtXHUwMDNlZGVzYywgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4rXHRcdGlmICh0LVx1MDAzZWN0eCA9PSBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XG4rXHRcdFx0Y29sbGFwc2Vfb3JkZXIgPSB0LVx1MDAzZW9yZGVyO1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzLCBvcmRlciAlZClcXG5cIixcbitcdFx0XHRcdCAgICAgICB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUsXG4rXHRcdFx0XHQgICAgICAgdC1cdTAwM2VvcmRlcik7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXFxuXCIsIHQtXHUwMDNlZGVzYyxcbitcdFx0XHRcdCAgICAgICB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lKTtcbitcdFx0fVxuIFx0XHR0LVx1MDAzZWZuKHQtXHUwMDNlY3R4LCB0LVx1MDAzZW9wcyk7XG4gXHR9XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjM2MDFjMDMwZDQzZTVcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jXG5AQCAtMCwwICsxLDYxMCBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBraHVnZXBhZ2VkIHJhY2UgaGFybmVzcy5cbisgKlxuKyAqIFJ1bnMgY29sbGFwc2UgYWdhaW5zdCBjb25jdXJyZW50IGZhdWx0cywgdHJhbnNpZW50IEdVUCBwaW5zXG4rICogKGd1cF90ZXN0KSwgZm9yaywgbXJlbWFwIGFuZCBNQURWX0RPTlRORUVEIG92ZXIgdGhlIHNhbWUgcmFuZ2VzLCBpblxuKyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6XG4rICpcbisgKiAgIHN0ZXBwZWRcdGtodWdlcGFnZWQsIG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lIHRocm91Z2hcbisgKlx0XHRraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLCBzbyBhIHN0ZXAgY292ZXJzIGEga25vd24gZXh0ZW50O1xuKyAqICAgZnJlZVx0a2h1Z2VwYWdlZCBsZWZ0IHRvIHJ1biAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCksIGZvciBzb2FrO1xuKyAqICAgbWFkdmlzZVx0TUFEVl9DT0xMQVBTRSBpbiBhIGxvb3AuXG4rICpcbisgKiBBbGwgYW5vbiBUSFAgb3JkZXJzIGFyZSBlbmFibGVkIChpbmhlcml0KS4gIE9jY3VwYW5jeSBydW5zIGF0IGJvdGggZW5kc1xuKyAqIG9mIHdoYXQgbVRIUCBjb2xsYXBzZSBzdXBwb3J0czogbWF4X3B0ZXNfbm9uZSAwLCB3aGVyZSBhIHdpbmRvdyBtdXN0IGJlXG4rICogZnVsbHkgcG9wdWxhdGVkLCBhbmQgSFBBR0VfUE1EX05SIC0gMSwgd2hlcmUgYSB3aW5kb3cgZnVsbCBvZiBob2xlc1xuKyAqIGNvbGxhcHNlcyB0b28uICBUaGUgaG9sZXMgYXJlIG5vdCBjb3BpZWQgZnJvbSBhbnl3aGVyZSAtLSB0aGV5IGFyZVxuKyAqIHplcm8tZmlsbGVkLCBhbmQgcmUtY2hlY2tlZCB1bmRlciB0aGUgcGFnZSB0YWJsZSBsb2NrIGF0IGluc3RhbGwgdGltZSBpblxuKyAqIGNhc2UgYSByYWNpbmcgZmF1bHQgZ290IHRoZXJlIGZpcnN0LlxuKyAqXG4rICogLXAgYWRkcyBtZW1vcnkgcHJlc3N1cmUgdG8gYW55IG9mIHRoZSBhYm92ZTogTUFEVl9QQUdFT1VUIGN5Y2xpbmdcbisgKiBvbiBhIGRlZGljYXRlZCBuZWlnaGJvciByZWdpb24gKHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuOyBza2lwcGVkXG4rICogd2l0aCBhIG5vdGUgd2hlbiB0aGUgaG9zdCBoYXMgbm8gc3dhcCkgYW5kIGEgY29tcGFjdF9tZW1vcnkgdHJpZ2dlclxuKyAqIGxvb3AgKGNvbXBhY3Rpb24gbWlncmF0ZXMgc291cmNlIGZvbGlvcywgcmFjaW5nIGNvbGxhcHNlJ3MgZnJlZXplXG4rICogd2l0aCByZWZjb3VudCBlbGV2YXRpb24gYW5kIG1pZ3JhdGlvbiBlbnRyaWVzIG9mIGl0cyBvd24pLlxuKyAqXG4rICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yXG4rICogemVybyAoTUFEVl9ET05UTkVFRCksIG5ldmVyIGFueXRoaW5nIGVsc2UuICBUaGUgZmF1bHRlcnMgYW5kIHRoZSBmb3JrXG4rICogY2hpbGRyZW4gY2hlY2sgdGhhdCBjb250aW51b3VzbHksIGEgZmluYWwgc3dlZXAgY2hlY2tzIGl0IG9uY2UgbW9yZSwgcGx1c1xuKyAqIHdoYXRldmVyIERFQlVHX1ZNIC8gcGFnZV90YWJsZV9jaGVjayAvIEtBU0FOIC8gbG9ja2RlcCByZXBvcnQgaW5cbisgKiBkbWVzZywgd2hpY2ggdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBpbnNwZWN0LlxuKyAqL1xuKyNkZWZpbmUgX0dOVV9TT1VSQ0VcbisjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwia3NlbGZ0ZXN0LmhcIlxuKyNpbmNsdWRlIFwidm1fdXRpbC5oXCJcbisjaW5jbHVkZSBcImh1Z2VwYWdlX3NldHRpbmdzLmhcIlxuKyNpbmNsdWRlIFwiLi4vLi4vLi4vLi4vbW0vZ3VwX3Rlc3QuaFwiXG4rXG4rI2RlZmluZSBCQVNFX0FERFJcdCgodm9pZCAqKSgxVUwgXHUwMDNjXHUwMDNjIDMwKSlcbitcbisvKlxuKyAqIFNoYXJlZCBwbGF5Z3JvdW5kIGZvciBmYXVsdHMvcGlucy9mb3JrL2RvbnRuZWVkOiBzZXZlcmFsIFBNRC1zaXplZFxuKyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZVxuKyAqIG1yZW1hcCB0aHJlYWQuIE1vcmUgYXJlYXMgbWVhbnMgbW9yZSBpbmRlcGVuZGVudCByZWdpb25zIGNvbGxhcHNpbmdcbisgKiBhdCBvbmNlOyB0aGUgZGVmYXVsdCBzdWl0cyBhIG5vcm1hbCBtYWNoaW5lLiBPbiBhIG1lbW9yeS1jb25zdHJhaW5lZFxuKyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZVxuKyAqIGRlZmF1bHQgcGxheWdyb3VuZCBtdWx0aS1naWdhYnl0ZSAtLSBwYXNzIC1hIHRvIHNocmluayBpdC5cbisgKi9cbisjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XG4rc3RhdGljIGludCBucl9hcmVhcztcbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XG4rc3RhdGljIGNoYXIgKnJlZ2lvbjtcdFx0LyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqL1xuK3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTtcdC8qIHJlZ2lvbiArIE5SX1NIQVJFRF9BUkVBUyBhcmVhcyAqL1xuK3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xuK3N0YXRpYyBjaGFyICpwYWdlb3V0X2FyZWE7XHQvKiAtcDogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqL1xuK3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplO1xuK3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7XG4rc3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xuK3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkO1xuK1xuK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuK3tcbitcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XG4rXG4rXHRyZXR1cm4gdmFsID8gdmFsIDogMTtcdC8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqL1xuK31cbitcbisvKiBaZXJvIG1lYW5zIG5ldmVyIHdyaXR0ZW47IGFueXRoaW5nIGVsc2UgbXVzdCBiZSB0aGlzIHBhZ2UncyBwYXR0ZXJuICovXG4rc3RhdGljIGJvb2wgcGFnZV9pc19jb3JydXB0KHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGludCAqdmFsKVxuK3tcbitcdCp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRyZXR1cm4gKnZhbCBcdTAwMjZcdTAwMjYgKnZhbCAhPSBwYXR0ZXJuKHBhZ2VfaWR4KTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY2hlY2tfcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuK3tcbitcdHVuc2lnbmVkIGludCB2YWw7XG4rXG4rXHRpZiAocGFnZV9pc19jb3JydXB0KHBhZ2VfaWR4LCBcdTAwMjZ2YWwpKSB7XG4rXHRcdGNvcnJ1cHRlZCA9IDE7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiQ29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcblwiLFxuK1x0XHRcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNoYXJlZF9wYWdlcyh2b2lkKVxuK3tcbitcdHJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbit9XG4rXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZClcbit7XG4rXHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcmFuZF9yKHNlZWQpICUgc2hhcmVkX3BhZ2VzKCk7XG4rfVxuK1xuKy8qIFBhZ2VzIGxlZnQgZnJvbSBAcGFnZV9pZHgsIHNvIGEgcmFuZ2UgbmV2ZXIgcmVhY2hlcyB0aGUgbXJlbWFwIHRocmVhZCdzIGFyZWEgKi9cbitzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XG4rXG4rXHRyZXR1cm4gd2FudCBcdTAwM2MgbGVmdCA/IHdhbnQgOiBsZWZ0O1xuK31cbitcbitzdGF0aWMgdm9pZCAqZmF1bHRlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbitcbitcdFx0aWYgKHJhbmRfcihcdTAwMjZzZWVkKSBcdTAwMjYgMSlcbitcdFx0XHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPVxuK1x0XHRcdFx0cGF0dGVybihwYWdlX2lkeCk7XG4rXHRcdGVsc2VcbitcdFx0XHRjaGVja19wYWdlKHBhZ2VfaWR4KTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqZG9udG5lZWRfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1xuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4rXHRcdHVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgXHUwMDNjXHUwMDNjIChyYW5kX3IoXHUwMDI2c2VlZCkgJSA2KTtcdC8qIDEuLjMyIHBhZ2VzICovXG4rXG4rXHRcdC8qXG4rXHRcdCAqIE9uY2UgaW4gYSB3aGlsZSB6YXAgYSB3aG9sZSBQTUQtYWxpZ25lZCBhcmVhOiBvbmx5IGEgemFwXG4rXHRcdCAqIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZSByZWNsYWltXG4rXHRcdCAqIChDT05GSUdfUFRfUkVDTEFJTSksIHdoaWNoIGNhbiBmcmVlIHRoZSB0YWJsZSB1bmRlciBhXG4rXHRcdCAqIGNvbGxhcHNlIHRoYXQgaXMgbWlkd2F5IHRocm91Z2ggaXQuICBTdWItdGFibGUgemFwcyBuZXZlclxuK1x0XHQgKiByZWFjaCB0aGF0IHBhdGguXG4rXHRcdCAqL1xuK1x0XHRpZiAoIShyYW5kX3IoXHUwMDI2c2VlZCkgJSA2NCkpIHtcbitcdFx0XHR1bnNpZ25lZCBsb25nIGFyZWEgPSBwYWdlX2lkeCAvXG4rXHRcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRcdFx0bWFkdmlzZShyZWdpb24gKyBhcmVhICogaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0bWFkdmlzZShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSxcbitcdFx0XHRcdHJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLFxuK1x0XHRcdFx0TUFEVl9ET05UTkVFRCk7XG4rXHRcdH1cbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDUwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKnBpbm5lcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0c3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9O1xuK1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuK1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yID0gcm9vbV9mcm9tKHBhZ2VfaWR4LCAxNik7XG4rXG4rXHRcdGd1cC5hZGRyID0gKHVuc2lnbmVkIGxvbmcpKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcbitcdFx0Z3VwLnNpemUgPSBuciAqIHBhZ2Vfc2l6ZTtcbitcdFx0Z3VwLm5yX3BhZ2VzX3Blcl9jYWxsID0gbnI7XG4rXHRcdGd1cC5ndXBfZmxhZ3MgPSAxO1x0LyogRk9MTF9XUklURSAqL1xuK1x0XHQvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovXG4rXHRcdGlvY3RsKGd1cF9mZCwgUElOX0ZBU1RfQkVOQ0hNQVJLLCBcdTAwMjZndXApO1xuK1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqZm9ya2VyX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHRwaWRfdCBwaWQgPSBmb3JrKCk7XG4rXG4rXHRcdGlmIChwaWQgPT0gMCkge1xuK1x0XHRcdHVuc2lnbmVkIGludCB2YWw7XG4rXHRcdFx0aW50IGJhZCA9IDA7XG4rXG4rXHRcdFx0LypcbitcdFx0XHQgKiBObyBzdGRpbyBpbiB0aGUgY2hpbGQ6IGEgdGhyZWFkIG1heSBoYXZlIGhlbGRcbitcdFx0XHQgKiBzdGRvdXQncyBsb2NrIHdoZW4gd2UgZm9ya2VkLCBhbmQgcHJpbnRpbmcgdW5kZXIgYW5cbitcdFx0XHQgKiBpbmhlcml0ZWQgbG9jayBoYW5ncy4gIFRoZSBwYXJlbnQgcmVwb3J0cyB3aGF0IHRoZVxuK1x0XHRcdCAqIGV4aXQgc3RhdHVzIHNheXMuXG4rXHRcdFx0ICovXG4rXHRcdFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIDE2OyBpKyspXG4rXHRcdFx0XHRiYWQgfD0gcGFnZV9pc19jb3JydXB0KHJhbmRfcGFnZShcdTAwMjZzZWVkKSwgXHUwMDI2dmFsKTtcbitcdFx0XHRfZXhpdChiYWQpO1xuK1x0XHR9XG4rXHRcdGlmIChwaWQgXHUwMDNlIDApIHtcbitcdFx0XHRpbnQgd3N0YXR1cztcbitcbitcdFx0XHRpZiAod2FpdHBpZChwaWQsIFx1MDAyNndzdGF0dXMsIDApIFx1MDAzYyAwKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwid2FpdHBpZCgpXCIpO1xuK1x0XHRcdC8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28sIG5vdCBqdXN0IGl0cyBleGl0IGNvZGUuICovXG4rXHRcdFx0aWYgKCFXSUZFWElURUQod3N0YXR1cykgfHwgV0VYSVRTVEFUVVMod3N0YXR1cykpXG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqbXJlbWFwcGVyX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHR2b2lkICpwO1xuK1xuK1x0XHRwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0ICAgTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQsIG1yZW1hcF9zY3JhdGNoKTtcbitcdFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtcmVtYXAoKSBhd2F5XCIpO1xuK1x0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgODsgaSsrKVxuK1x0XHRcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXHUwMDI2c2VlZCkgJVxuK1x0XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSkgKiBwYWdlX3NpemVdID0gMTtcbitcdFx0cCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7XG4rXHRcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibXJlbWFwKCkgYmFja1wiKTtcbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMDApO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuKy8qXG4rICogLXA6IHN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XG4rICogY2hlY2sgaXMgZXhhY3Q6IGEgcGFnZSBvdXQgYW5kIGJhY2sgdGhyb3VnaCBzd2FwIG11c3QgcHJlc2VydmUgdGhlXG4rICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxuKyAqL1xuK3N0YXRpYyB2b2lkICpwYWdlb3V0X2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSsrKVxuK1x0XHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpKyspIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICtcbitcdFx0XHRcdFx0XHRcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRcdFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKiAtcDogY29tcGFjdGlvbiBtaWdyYXRlcyB0aGUgY29sbGFwc2Ugc291cmNlcyBvdXQgZnJvbSB1bmRlciB1cy4gKi9cbitzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdGludCBmZCA9IG9wZW4oXCIvcHJvYy9zeXMvdm0vY29tcGFjdF9tZW1vcnlcIiwgT19XUk9OTFkpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiTm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXFxuXCIpO1xuK1x0XHRyZXR1cm4gTlVMTDtcbitcdH1cbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHRpZiAod3JpdGUoZmQsIFwiMVwiLCAxKSBcdTAwM2MgMClcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKDEwMDAwICsgcmFuZF9yKFx1MDAyNnNlZWQpICUgMTAwMDAwKTtcbitcdH1cbitcdGNsb3NlKGZkKTtcbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgYm9vbCBzd2FwX2F2YWlsYWJsZSh2b2lkKVxuK3tcbitcdGNoYXIgbGluZVsyNTZdO1xuK1x0aW50IGxpbmVzID0gMDtcbitcdEZJTEUgKmZwID0gZm9wZW4oXCIvcHJvYy9zd2Fwc1wiLCBcInJcIik7XG4rXG4rXHRpZiAoIWZwKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXG4rXHRcdGxpbmVzKys7XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGxpbmVzIFx1MDAzZSAxO1xuK31cbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcbit7XG4rXHRzdHJ1Y3QgdGltZXZhbCB0djtcbitcbitcdGdldHRpbWVvZmRheShcdTAwMjZ0diwgTlVMTCk7XG4rXHRyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICsgdHYudHZfdXNlYyAvIDEwMDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4re1xuK1x0ZnByaW50ZihzdGRlcnIsXG4rXHRcdFwiVXNhZ2U6IGtodWdlcGFnZWRfcmFjZSBbLWQgc2Vjb25kc10gWy1tIHN0ZXBwZWR8ZnJlZXxtYWR2aXNlXSBbLXpdIFstcF0gWy1hIGFyZWFzXVxcblwiXG4rXHRcdFwiXFx0V2l0aG91dCAtbSwgZXZlcnkgbW9kZSBydW5zIGluIHR1cm4uXFxuXCJcbitcdFx0XCJcXHQtZDogc2Vjb25kcyBwZXIgbW9kZSAoZGVmYXVsdCA1KVxcblwiXG4rXHRcdFwiXFx0Qm90aCBvY2N1cGFuY3kgbGltaXRzIHJ1biB1bmxlc3MgLXogYXNrcyBmb3IgaG9sZXMgb25seS5cXG5cIlxuK1x0XHRcIlxcdC16OiBvbmx5IG1heF9wdGVzX25vbmUgPSBIUEFHRV9QTURfTlIgLSAxIChob2xlLWhlYXZ5KVxcblwiXG4rXHRcdFwiXFx0UnVucyB3aXRoIGFuZCB3aXRob3V0IG1lbW9yeSBwcmVzc3VyZSB1bmxlc3MgLXAgYXNrcyBmb3JcXG5cIlxuK1x0XHRcIlxcdHByZXNzdXJlIG9ubHkuXFxuXCJcbitcdFx0XCJcXHQtcDogb25seSB3aXRoIHRoZSBwYWdlb3V0IGFuZCBjb21wYWN0aW9uIHRocmVhZHNcXG5cIlxuK1x0XHRcIlxcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXFxuXCIpO1xuK1x0ZXhpdCgxKTtcbit9XG4rXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XG4rXHRcdFwiZmF1bHRlclwiLCBcImZhdWx0ZXIyXCIsIFwiZG9udG5lZWRcIiwgXCJwaW5uZXJcIiwgXCJmb3JrZXJcIixcbitcdFx0XCJtcmVtYXBwZXJcIiwgXCJwYWdlb3V0XCIsIFwiY29tcGFjdG9yXCIsXG4rXHR9O1xuK1x0dm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7XG4rXHRcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcbitcdFx0bXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sXG4rXHR9O1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNiwgY29tcGFjdG9yX2JpdCA9IDFVTCBcdTAwM2NcdTAwM2MgNztcbitcdGNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpO1xuK1x0cHRocmVhZF90IHRocmVhZHNbQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpXTtcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxsX21vZGVzW10gPSB7IFwic3RlcHBlZFwiLCBcImZyZWVcIiwgXCJtYWR2aXNlXCIgfTtcbitcdHN0YXRpYyBjb25zdCBpbnQgYWxsX25vbmVzW10gPSB7IDAsIDEgfTtcdC8qIHN0cmljdCwgaG9sZXMgKi9cbitcdHN0YXRpYyBjb25zdCBpbnQgYWxsX3ByZXNzW10gPSB7IDAsIDEgfTtcdC8qIHF1aWV0LCB1bmRlciBwcmVzc3VyZSAqL1xuK1x0Y29uc3QgaW50ICpub25lcyA9IGFsbF9ub25lcztcbitcdGNvbnN0IGludCAqcHJlc3MgPSBhbGxfcHJlc3M7XG4rXHRpbnQgbnJfbm9uZXMgPSBBUlJBWV9TSVpFKGFsbF9ub25lcyk7XG4rXHRpbnQgbnJfcHJlc3MgPSBBUlJBWV9TSVpFKGFsbF9wcmVzcyk7XG4rXHRjb25zdCBjaGFyICpvbmVfbW9kZVsxXTtcbitcdGNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7XG4rXHRpbnQgbnJfbW9kZXMgPSBBUlJBWV9TSVpFKGFsbF9tb2Rlcyk7XG4rXHRjb25zdCBjaGFyICptb2RlX2FyZyA9IE5VTEw7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dW5zaWduZWQgbG9uZyBlbmRfbXM7XG4rXHRpbnQgZHVyYXRpb25fcyA9IDU7XG4rXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcbitcdHVuc2lnbmVkIGxvbmcgYmFzZV9tYXNrO1xuK1x0aW50IG5yX2FyZWFzX2FyZyA9IDA7XG4rXHRib29sIGhvbGVzX29ubHkgPSBmYWxzZTtcbitcdGJvb2wgcHJlc3N1cmVfb25seSA9IGZhbHNlO1xuK1x0dW5zaWduZWQgbG9uZyBpO1xuK1x0aW50IHN0ZXBzID0gMDtcbitcdGludCBvcHQ7XG4rXG4rXHR3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCBcImE6ZDptOnQ6enBoXCIpKSAhPSAtMSkge1xuK1x0XHRzd2l0Y2ggKG9wdCkge1xuK1x0XHRjYXNlICdhJzpcbitcdFx0XHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ2QnOlxuK1x0XHRcdGR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ20nOlxuK1x0XHRcdG1vZGVfYXJnID0gb3B0YXJnO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd0JzpcbitcdFx0XHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xuK1x0XHRcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd6JzpcbitcdFx0XHRob2xlc19vbmx5ID0gdHJ1ZTtcbitcdFx0XHRicmVhaztcbitcdFx0Y2FzZSAncCc6XG4rXHRcdFx0cHJlc3N1cmVfb25seSA9IHRydWU7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGRlZmF1bHQ6XG4rXHRcdFx0dXNhZ2UoKTtcbitcdFx0fVxuK1x0fVxuK1x0aWYgKGhvbGVzX29ubHkpIHtcbitcdFx0bm9uZXMgPSBhbGxfbm9uZXMgKyAxO1xuK1x0XHRucl9ub25lcyA9IDE7XG4rXHR9XG4rXG4rXHRpZiAocHJlc3N1cmVfb25seSkge1xuK1x0XHRwcmVzcyA9IGFsbF9wcmVzcyArIDE7XG4rXHRcdG5yX3ByZXNzID0gMTtcbitcdH1cbitcbitcdGlmIChtb2RlX2FyZykge1xuK1x0XHRpZiAoc3RyY21wKG1vZGVfYXJnLCBcInN0ZXBwZWRcIikgXHUwMDI2XHUwMDI2IHN0cmNtcChtb2RlX2FyZywgXCJmcmVlXCIpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgc3RyY21wKG1vZGVfYXJnLCBcIm1hZHZpc2VcIikpXG4rXHRcdFx0dXNhZ2UoKTtcbitcdFx0b25lX21vZGVbMF0gPSBtb2RlX2FyZztcbitcdFx0bW9kZXMgPSBvbmVfbW9kZTtcbitcdFx0bnJfbW9kZXMgPSAxO1xuK1x0fVxuK1xuK1x0a3NmdF9wcmludF9oZWFkZXIoKTtcbitcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCIpO1xuK1xuK1x0cGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTtcbitcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbitcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwiKTtcbitcbitcdGd1cF9mZCA9IG9wZW4oXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwiLCBPX1JEV1IpO1xuK1x0aWYgKGd1cF9mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCByZXF1aXJlcyBDT05GSUdfR1VQX1RFU1QgYW5kIHJvb3RcXG5cIik7XG4rXG4rXHRucl9zaGFyZWRfYXJlYXMgPSBucl9hcmVhc19hcmcgXHUwMDNlIDAgPyBucl9hcmVhc19hcmcgOiBERUZBVUxUX1NIQVJFRF9BUkVBUztcbitcdG5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICsgMTtcbitcbitcdC8qXG4rXHQgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZFxuK1x0ICogTVJFTUFQX0ZJWEVEIHVubWFwcyB3aGF0ZXZlciBpcyBpbiB0aGUgd2F5IHdpdGhvdXQgc2F5aW5nIHNvLiAgQ2xhaW1cbitcdCAqIHRoZSBhZGRyZXNzIGhlcmUsIHNvIGEgbGF5b3V0IHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhpcyBhc3N1bXB0aW9uXG4rXHQgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZVxuK1x0ICogcHJvY2VzcyBtYXBzIHRoaXMgbG93OiB0aHJlYWQgc3RhY2tzIGFuZCBtYWxsb2MgYXJlbmFzIGNvbWUgZnJvbSB0aGVcbitcdCAqIHRvcC1kb3duIG1tYXAgYXJlYSwgd2VsbCBhYm92ZS5cbitcdCAqL1xuK1x0bXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiArIDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xuK1x0aWYgKG1tYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBQUk9UX05PTkUsXG4rXHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLFxuK1x0XHQgLTEsIDApICE9ICh2b2lkICopbXJlbWFwX3NjcmF0Y2gpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSBtcmVtYXAgc2NyYXRjaFwiKTtcbitcbitcdGJhc2VfbWFzayA9IHRocmVhZF9tYXNrO1xuK1x0aWYgKCFzd2FwX2F2YWlsYWJsZSgpKVxuK1x0XHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZS4gKi9cbitcdFx0a3NmdF9wcmludF9tc2coXCJubyBzd2FwOiB0aGUgcGFnZW91dCB0aHJlYWQgc3RheXMgaWRsZVxcblwiKTtcbitcbitcdGtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9ub25lcyAqIG5yX3ByZXNzKTtcbitcbitcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4rXHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHQvKlxuK1x0ICogQSBiYXNlIGVudHJ5IGZvciB0aGUgc3RhY2ssIHNvIHRoYXQgdGhlIHBvcCBhdCB0aGUgZW5kIG9mIGEgbW9kZVxuK1x0ICogYWx3YXlzIGhhcyBzb21ldGhpbmcgdG8gd3JpdGUgYmFjazogdGhwX3BvcF9zZXR0aW5ncygpIG9uIGFuIGVtcHR5XG4rXHQgKiBzdGFjayBoYXMgbm8gc2V0dGluZ3MgdG8gYXBwbHkgYW5kIGdpdmVzIHVwLlxuK1x0ICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRmb3IgKGludCBydW4gPSAwOyBydW4gXHUwMDNjIG5yX21vZGVzICogbnJfbm9uZXMgKiBucl9wcmVzczsgcnVuKyspIHtcbitcdFx0aW50IHJlbSA9IHJ1biAlIChucl9ub25lcyAqIG5yX3ByZXNzKTtcbitcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9ub25lcyAqIG5yX3ByZXNzKV07XG4rXHRcdGJvb2wgaG9sZXMgPSBub25lc1tyZW0gLyBucl9wcmVzc107XG4rXHRcdGJvb2wgcHJlc3N1cmUgPSBwcmVzc1tyZW0gJSBucl9wcmVzc107XG4rXG4rXHRcdHRocmVhZF9tYXNrID0gYmFzZV9tYXNrO1xuK1x0XHRpZiAoIXByZXNzdXJlKVxuK1x0XHRcdHRocmVhZF9tYXNrIFx1MDAyNj0gfihwYWdlb3V0X2JpdCB8IGNvbXBhY3Rvcl9iaXQpO1xuK1x0XHRlbHNlIGlmICghc3dhcF9hdmFpbGFibGUoKSlcbitcdFx0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH5wYWdlb3V0X2JpdDtcbitcbitcdFx0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0XHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuK1x0XHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4rXHRcdHNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjtcbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xuK1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID1cbitcdFx0XHRzdHJjbXAobW9kZSwgXCJmcmVlXCIpID8gMTAwMCA6IDA7XG4rXHRcdHNldHRpbmdzLmtodWdlcGFnZWQuYWxsb2Nfc2xlZXBfbWlsbGlzZWNzID0gMTA7XG4rXG4rXHRcdC8qXG4rXHRcdCAqIG1USFAgY29sbGFwc2Ugb25seSBzdXBwb3J0cyB0aGUgdHdvIGVuZHMgb2YgdGhlIG9jY3VwYW5jeVxuK1x0XHQgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuXG4rXHRcdCAqIFN0cmljdCBuZWVkcyBhIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3csIHdoaWNoIGlzIHJhcmUgdW5kZXJcbitcdFx0ICogcmFjaW5nIE1BRFZfRE9OVE5FRUQ7IGhvbGUtaGVhdnkgd2luZG93cyBjb2xsYXBzZSBpbnN0ZWFkLFxuK1x0XHQgKiBzbyB0aGUgdHdvIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHMuXG4rXHRcdCAqL1xuK1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/XG4rXHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwO1xuK1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPVxuK1x0XHRcdG5yX2FyZWFzICogKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAqIDg7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSsrKSB7XG4rXHRcdFx0aWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuK1x0XHRcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbitcdFx0fVxuK1x0XHQvKiBQb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZGUsIGJlZm9yZSB0aGUgbmV4dCBvbmUuICovXG4rXHRcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcbitcdFx0cmVnaW9uID0gbW1hcChCQVNFX0FERFIsIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8XG4rXHRcdFx0ICAgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XG4rXHRcdGlmIChyZWdpb24gIT0gQkFTRV9BRERSKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSBwbGF5Z3JvdW5kXCIpO1xuK1x0XHRtcmVtYXBfYXJlYSA9IHJlZ2lvbiArIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xuK1xuK1x0XHRpZiAodGhyZWFkX21hc2sgXHUwMDI2IHBhZ2VvdXRfYml0KSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBCaWcgZW5vdWdoIHRvIGN5Y2xlIHJlYWwgcmVjbGFpbSwgc21hbGwgZW5vdWdoIG5vdFxuK1x0XHRcdCAqIHRvIGRvbWluYXRlIGEgVENHIGd1ZXN0OiA0IFBNRCBhcmVhcywgY2xhbXBlZCB0b1xuK1x0XHRcdCAqIFsxNk0sIDY0TV0uXG4rXHRcdFx0ICovXG4rXHRcdFx0cGFnZW91dF9zaXplID0gNCAqIGhwYWdlX3BtZF9zaXplO1xuK1x0XHRcdHBhZ2VvdXRfc2l6ZSA9IHBhZ2VvdXRfc2l6ZSBcdTAwM2MgKDE2VUwgXHUwMDNjXHUwMDNjIDIwKSA/XG4rXHRcdFx0XHQgICAgICAgKDE2VUwgXHUwMDNjXHUwMDNjIDIwKSA6XG4rXHRcdFx0XHQgICAgICAgcGFnZW91dF9zaXplIFx1MDAzZSAoNjRVTCBcdTAwM2NcdTAwM2MgMjApID9cbitcdFx0XHRcdCAgICAgICAoNjRVTCBcdTAwM2NcdTAwM2MgMjApIDogcGFnZW91dF9zaXplO1xuK1x0XHRcdHBhZ2VvdXRfYXJlYSA9IG1tYXAoTlVMTCwgcGFnZW91dF9zaXplLFxuK1x0XHRcdFx0XHQgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0XHRcdFx0ICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xuK1x0XHRcdGlmIChwYWdlb3V0X2FyZWEgPT0gTUFQX0ZBSUxFRClcbitcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSBwYWdlb3V0IGFyZWFcIik7XG4rXHRcdH1cbitcbitcdFx0LyogUG9wdWxhdGUgc28gdGhlIGZpcnN0IHBhc3MgaGFzIHNvbWV0aGluZyB0byBjb2xsYXBzZS4gKi9cbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcbitcdFx0XHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4rXHRcdG1lbXNldChtcmVtYXBfYXJlYSwgMSwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0XHRtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4rXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xuK1x0XHRcdGlmICghKHRocmVhZF9tYXNrIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBpKSkpIHtcbitcdFx0XHRcdHRocmVhZHNbaV0gPSAwO1xuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0fVxuK1x0XHRcdGlmIChwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLCB0aHJlYWRfZm5zW2ldLFxuK1x0XHRcdFx0XHQgICAodm9pZCAqKShpICsgMSkpKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwicHRocmVhZF9jcmVhdGUoKVwiKTtcbitcdFx0fVxuK1xuK1x0XHRlbmRfbXMgPSBub3dfbXMoKSArIGR1cmF0aW9uX3MgKiAxMDAwVUw7XG4rXHRcdGlmICghc3RyY21wKG1vZGUsIFwic3RlcHBlZFwiKSkge1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0XHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpXG4rXHRcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcImtodWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcXG5cIik7XG4rXHRcdFx0XHRzdGVwcysrO1xuK1x0XHRcdH1cbitcdFx0fSBlbHNlIGlmICghc3RyY21wKG1vZGUsIFwiZnJlZVwiKSkge1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKVxuK1x0XHRcdFx0dXNsZWVwKDEwMCAqIDEwMDApO1xuK1x0XHR9IGVsc2Uge1x0LyogbWFkdmlzZSAqL1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXM7IGkrKykge1xuK1x0XHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiArIGkgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XG4rXHRcdFx0XHR9XG4rXHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0XHRcdE1BRFZfRE9OVE5FRUQpO1xuK1x0XHRcdFx0c3RlcHMrKztcbitcdFx0XHR9XG4rXHRcdH1cbitcbitcdFx0c3RvcCA9IDE7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xuK1x0XHRcdGlmICh0aHJlYWRzW2ldKVxuK1x0XHRcdFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xuK1x0XHR9XG4rXG4rXHRcdC8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi9cbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcbitcdFx0XHRjaGVja19wYWdlKGkpO1xuK1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KCFjb3JydXB0ZWQsXG4rXHRcdFx0XHQgXCIlcy8lcyVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxuXCIsXG4rXHRcdFx0XHQgbW9kZSwgaG9sZXMgPyBcImhvbGVzXCIgOiBcInN0cmljdFwiLFxuK1x0XHRcdFx0IHByZXNzdXJlID8gXCIvcHJlc3N1cmVcIiA6IFwiXCIsXG4rXHRcdFx0XHQgZHVyYXRpb25fcywgc3RlcHMpO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBIYW5kIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB0aGUgc2V0dGluZ3MgYmFjayBiZWZvcmUgdGhlXG4rXHRcdCAqIG5leHQgbW9kZTogaXQgbWFwcyB0aGUgcmVnaW9uIGF0IHRoZSBzYW1lIGZpeGVkIGFkZHJlc3MsXG4rXHRcdCAqIGFuZCBpdHMgc2NhbiBjYWRlbmNlIGRpZmZlcnMuXG4rXHRcdCAqL1xuK1x0XHRtdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xuK1x0XHRcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XG4rXHRcdFx0cGFnZW91dF9hcmVhID0gTlVMTDtcbitcdFx0fVxuK1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRcdHN0b3AgPSAwO1xuK1x0XHRzdGVwcyA9IDA7XG4rXG4rXHRcdGlmIChjb3JydXB0ZWQpIHtcbitcdFx0XHQvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZy4gKi9cbitcdFx0XHR3aGlsZSAoKytydW4gXHUwMDNjIG5yX21vZGVzICogbnJfbm9uZXMgKiBucl9wcmVzcykge1xuK1x0XHRcdFx0cmVtID0gcnVuICUgKG5yX25vbmVzICogbnJfcHJlc3MpO1xuK1xuK1x0XHRcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwiJXMvJXMlczogc2tpcHBlZCBhZnRlciBjb3JydXB0aW9uXFxuXCIsXG4rXHRcdFx0XHRcdFx0ICAgICAgbW9kZXNbcnVuIC8gKG5yX25vbmVzICogbnJfcHJlc3MpXSxcbitcdFx0XHRcdFx0XHQgICAgICBub25lc1tyZW0gLyBucl9wcmVzc10gP1xuK1x0XHRcdFx0XHRcdCAgICAgIFwiaG9sZXNcIiA6IFwic3RyaWN0XCIsXG4rXHRcdFx0XHRcdFx0ICAgICAgcHJlc3NbcmVtICUgbnJfcHJlc3NdID9cbitcdFx0XHRcdFx0XHQgICAgICBcIi9wcmVzc3VyZVwiIDogXCJcIik7XG4rXHRcdFx0fVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xuK1x0a3NmdF9maW5pc2hlZCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzBkM2ZiNTE5ZmIyY1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbkBAIC0wLDAgKzEsMjE3IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFN5bmNocm9ub3VzIGtodWdlcGFnZWQgZHJpdmluZyBjaGVjay5cbisgKlxuKyAqIFJhY2UgdGVzdHMgZHJpdmUga2h1Z2VwYWdlZCB0aHJvdWdoIHRoZSBleGlzdGluZyBzeXNmcyBjb250cm9sczogYVxuKyAqIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGFuZCBmdWxsX3NjYW5zXG4rICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0XG4rICogc3RhcnRlZCBhZnRlciBzZXR1cCAoa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSkuIFZlcmlmeSB0aGUgcGFpciBnaXZlc1xuKyAqIGRldGVybWluaXN0aWMsIGF0dHJpYnV0YWJsZSByZXN1bHRzOiBvbmUgYmFycmllciBzdGVwIG92ZXIgb25lXG4rICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdFxuKyAqIHdpbmRvdydzIHNvdXJjZSBwYWdlcyAobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUgZXZlbnRzIGZpbHRlcmVkXG4rICogYnkgc291cmNlIFBGTiBhbmQgb3JkZXIpIGFuZCB0aGUgd2luZG93IGlzIGNvbGxhcHNlZFxuKyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuXG4rICpcbisgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBzZXQgdG8gNjBzIHRvIHByb3ZlIHRoZSB3YWtlIHBhdGg6IHdpdGhvdXRcbisgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvd1xuKyAqIHRoZSB0aW1lb3V0LiBJdCBhbHNvIGtlZXBzIHRoZSBkYWVtb24gZnJvbSBmcmVlLXJ1bm5pbmcgYmV0d2VlblxuKyAqIHN0ZXBzLCBwZXIgdGhlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZGlzY2lwbGluZS5cbisgKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJrc2VsZnRlc3QuaFwiXG4rI2luY2x1ZGUgXCJ2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFwiXG4rXG4rI2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuKyNkZWZpbmUgVEFSR0VUX09SREVSIDJcdC8qIHNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXG4rI2RlZmluZSBOUl9JVEVSQVRJT05TIDVcbitcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuK3N0YXRpYyBpbnQgdHJhY2VfZXZlbnRzX2ZkID0gLTE7XG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4rXG4rLypcbisgKiBFYWNoIHN0ZXAgc3dpdGNoZXMgdGhlIGV2ZW50cyBvZmYgYWdhaW4sIGJ1dCBhIGhlbHBlciBjYW4gc3RpbGwgZ2l2ZSB1cFxuKyAqIG9uIHVzIGluIGJldHdlZW4gKGEgZmFpbGluZyBzeXNmcyB3cml0ZSBlbmRzIHRoZSB0ZXN0IGZyb20gaW5zaWRlXG4rICogdGhwX3dyaXRlX251bSgpKSwgYW5kIGh1Z2VfbWVtb3J5IGV2ZW50cyBsZWZ0IG9uIGFyZSB0aGUgd2hvbGUgbWFjaGluZSdzXG4rICogcHJvYmxlbSwgbm90IHRoaXMgdGVzdCdzLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHRyYWNlX2V2ZW50c19vZmYodm9pZClcbit7XG4rXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzZT0gMClcbitcdFx0dHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpO1xuK31cbitcbisvKlxuKyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBsZWdhY3ktZW5naW5lXG4rICogaXNvbGF0ZSBldmVudHMgd2hvc2Ugc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cncyBzb3VyY2UgUEZOcyxcbisgKiBwbHVzIGJhdGNoLWVuZ2luZSBwZXItY2FuZGlkYXRlIGluc3RhbGwgZXZlbnRzIGF0IHRoZSB3aW5kb3cnc1xuKyAqIGFkZHJlc3MuIEVpdGhlciBlbmdpbmUgcmVwb3J0cyBleGFjdGx5IG9uY2UgcGVyIGF0dGVtcHQuXG4rICovXG4rc3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxuK1x0XHRcdCAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBvcmRlcilcbit7XG4rXHRjaGFyIGxpbmVbMTAyNF07XG4rXHRpbnQgY291bnQgPSAwO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpO1xuK1x0aWYgKCFmcClcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiQ2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXFxuXCIpO1xuK1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XG4rXHRcdGNoYXIgKnM7XG4rXHRcdHVuc2lnbmVkIGxvbmcgdmFsO1xuK1x0XHR1bnNpZ25lZCBpbnQgb3JkO1xuK1x0XHRjaGFyICpvO1xuK1x0XHRpbnQgaTtcbitcbitcdFx0cyA9IHN0cnN0cihsaW5lLCBcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlwiKTtcbitcdFx0aWYgKHMpIHtcbitcdFx0XHRpZiAoc3NjYW5mKHMsIFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4XCIsXG4rXHRcdFx0XHQgICBcdTAwMjZ2YWwpICE9IDEpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRvID0gc3Ryc3RyKHMsIFwib3JkZXI9XCIpO1xuK1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCJvcmRlcj0ldVwiLCBcdTAwMjZvcmQpICE9IDEgfHxcbitcdFx0XHQgICAgb3JkICE9IG9yZGVyKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGZuczsgaSsrKSB7XG4rXHRcdFx0XHRpZiAodmFsID09IHBmbnNbaV0pIHtcbitcdFx0XHRcdFx0Y291bnQrKztcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0XHR9XG4rXHRcdFx0fVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXG4rXHRcdHMgPSBzdHJzdHIobGluZSwgXCJtbV9jb2xsYXBzZV9jYW5kaWRhdGU6XCIpO1xuK1x0XHRpZiAocykge1xuK1x0XHRcdGlmICghc3Ryc3RyKHMsIFwicGFzcz1pbnN0YWxsXCIpIHx8XG4rXHRcdFx0ICAgICFzdHJzdHIocywgXCJyZXN1bHQ9c3VjY2VlZGVkXCIpKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0byA9IHN0cnN0cihzLCBcImFkZHI9XCIpO1xuK1x0XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCJhZGRyPTB4JWx4XCIsIFx1MDAyNnZhbCkgIT0gMSB8fFxuK1x0XHRcdCAgICB2YWwgIT0gYWRkcilcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdG8gPSBzdHJzdHIocywgXCJvcmRlcj1cIik7XG4rXHRcdFx0aWYgKCFvIHx8IHNzY2FuZihvLCBcIm9yZGVyPSV1XCIsIFx1MDAyNm9yZCkgIT0gMSB8fFxuK1x0XHRcdCAgICBvcmQgIT0gb3JkZXIpXG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHRjb3VudCsrO1xuK1x0XHR9XG4rXHR9XG4rXHRmY2xvc2UoZnApO1xuK1x0cmV0dXJuIGNvdW50O1xuK31cbitcbitzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxuK3tcbitcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4rXHR1bnNpZ25lZCBsb25nIHBmbnNbMSBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSXTtcbitcdGJvb2wgY29sbGFwc2VkLCBwYXNzZWQ7XG4rXHRpbnQgYXR0cmlidXRlZDtcbitcdGNoYXIgKnA7XG4rXHRpbnQgaTtcbitcbitcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXG4rXHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XG4rXHRpZiAocCAhPSBCQVNFX0FERFIpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSB3aW5kb3dcIik7XG4rXG4rXHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XG4rXHRcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcbitcdFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcblwiKTtcbitcdH1cbitcbitcdC8qIENsZWFyIGZpcnN0OiB3aXRoIHRoZSBldmVudHMgc3RpbGwgb2ZmIHRoZXJlIGlzIG5vdGhpbmcgdG8gdW5kby4gKi9cbitcdGlmICh0cmFjaW5nX2NsZWFyX3RyYWNlKCkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkNhbm5vdCBjbGVhciB0aGUgdHJhY2UgYnVmZmVyXFxuXCIpO1xuK1x0aWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIHRydWUpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0LyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXG4rXHRwYXNzZWQgPSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygxMjApO1xuK1xuK1x0LyogT2ZmIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBnaXZlIHVwOiB0aGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZS4gKi9cbitcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkNhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcblwiKTtcbitcdGlmICghcGFzc2VkKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcXG5cIik7XG4rXG4rXHRjb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLFxuK1x0XHRcdFx0XHRcdCAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbitcdGF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCAodW5zaWduZWQgbG9uZylwLFxuK1x0XHRcdFx0ICAgICAgVEFSR0VUX09SREVSKTtcbitcbitcdGtzZnRfdGVzdF9yZXN1bHQoY29sbGFwc2VkIFx1MDAyNlx1MDAyNiBhdHRyaWJ1dGVkID09IDEsXG4rXHRcdFx0IFwic3RlcCAlZDogd2luZG93IGNvbGxhcHNlZCwgJWQgYXR0cmlidXRlZCByZXN1bHQocylcXG5cIixcbitcdFx0XHQgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTtcbitcbitcdG11bm1hcChwLCBocGFnZV9wbWRfc2l6ZSk7XG4rfVxuK1xuK2ludCBtYWluKHZvaWQpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbitcdGludCBpO1xuK1xuK1x0a3NmdF9wcmludF9oZWFkZXIoKTtcbitcbitcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCIpO1xuK1x0aWYgKCEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgVEFSR0VUX09SREVSKSkpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxuXCIsXG4rXHRcdFx0ICAgICAgIFRBUkdFVF9PUkRFUik7XG4rXG4rXHRocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7XG4rXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcXG5cIik7XG4rXHRwYWdlbWFwX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvcGFnZW1hcFwiLCBPX1JET05MWSk7XG4rXHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwib3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApXCIpO1xuK1x0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCIvcHJvYy9rcGFnZWZsYWdzXCIsIE9fUkRPTkxZKTtcbitcdGlmIChrcGFnZWZsYWdzX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIm9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiKSByZXF1aXJlcyByb290XFxuXCIpO1xuK1x0dHJhY2VfZXZlbnRzX2ZkID0gdHJhY2luZ19ldmVudHNfb3BlbihcImh1Z2VfbWVtb3J5XCIpO1xuK1x0aWYgKHRyYWNlX2V2ZW50c19mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCJodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XFxuXCIpO1xuK1x0YXRleGl0KHRyYWNlX2V2ZW50c19vZmYpO1xuK1xuK1x0a3NmdF9zZXRfcGxhbihOUl9JVEVSQVRJT05TKTtcbitcbitcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4rXHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuK1x0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcbitcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IChocGFnZV9wbWRfc2l6ZSAvIGdldHBhZ2VzaXplKCkpIC0gMTtcbitcdC8qIE9uZSB3YWtlIG11c3QgY29tcGxldGUgb25lIGZ1bGwgcGFzczsgc2VlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkuICovXG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXHUwMDNjXHUwMDNjIDI0O1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0c2V0dGluZ3MuaHVnZXBhZ2VzW1RBUkdFVF9PUkRFUl0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuK1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfSVRFUkFUSU9OUzsgaSsrKVxuK1x0XHRvbmVfc3RlcChpKTtcbitcbitcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XG4rXG4rXHRrc2Z0X2ZpbmlzaGVkKCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcbmluZGV4IGYxOWQ1M2M2OTU3NjQuLmZkMzVmOGE3YjViODMgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcbkBAIC0yMCw3ICsyMCw2IEBAXG4gXG4gI2RlZmluZSBUV09NRUdcdFx0KDJcdTAwM2NcdTAwM2MyMClcbiAjZGVmaW5lIFJVTlRJTUVcdFx0KDIwKVxuLSNkZWZpbmUgQUxJR04oeCwgYSlcdCgoKHgpICsgKGEgLSAxKSkgXHUwMDI2ICh+KChhKSAtIDEpKSlcbiBcbiBIVUdFVExCX1NFVFVQX0RFRkFVTFRfUEFHRVMoMSlcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG5pbmRleCBkMDlmOWY2YTM4NGVlLi5mYzYxOTA3YWEzYjJhIDEwMDc1NVxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG5AQCAtNDAyLDYgKzQwMiwxMiBAQCBDQVRFR09SWT1cInBmbm1hcFwiIHJ1bl90ZXN0IC4vcGZubWFwXG4gIyBDT1cgdGVzdHNcbiBDQVRFR09SWT1cImNvd1wiIHJ1bl90ZXN0IC4vY293XG4gXG4rQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrXG4rXG4rQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfc3luY19jaGVja1xuK1xuK0NBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3JhY2VcbitcbiBDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZFxuIFxuIENBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1zIDJcbkBAIC00MTAsOCArNDE2LDYgQEAgQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgYWxsOnNobWVtXG4gXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cbiBcbi1DQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtYyA0IG10aHBfa2h1Z2VwYWdlZDphbm9uXG4tXG4gIyBUcnkgdG8gY3JlYXRlIFhGUyBpZiBub3QgcHJvdmlkZWRcbiBpZiBbIC16IFwiJHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH1cIiBdOyB0aGVuXG4gICAgIGlmIHRlc3Rfc2VsZWN0ZWQgXCJ0aHBcIjsgdGhlblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5pbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuQEAgLTQyLDY4ICs0Miw2IEBAIGNvbnN0IGNoYXIgKmtwYWdlZmxhZ3NfcHJvYyA9IFwiL3Byb2Mva3BhZ2VmbGFnc1wiO1xuIGludCBwYWdlbWFwX2ZkO1xuIGludCBrcGFnZWZsYWdzX2ZkO1xuIFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbi1cdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4te1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4tXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4tXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4tXG4tXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4tXHRpZiAocGZuID09IC0xVUwpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbi1cdGlmICghb3JkZXIpIHtcbi1cdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0Lyogbm9uIFRIUCBmb2xpbyAqL1xuLVx0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuLVx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuLVx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xuLVx0XHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbi1cdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbi1cdCAqL1xuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0cmV0dXJuIHRydWU7XG4tXG4tXHQvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXG4tXHRyZXR1cm4gKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncztcbi1mYWlsOlxuLVx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiRmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxuXCIpO1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpXG4ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuaW5kZXggODBiYzlmNTk3YjUyMS4uZWUxMzM0Nzc4MzkxZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5AQCAtNDk0LDYgKzQ5NCwxNTEgQEAgaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4rXHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4re1xuK1x0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbitcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4rXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4rXHR1bnNpZ25lZCBsb25nIHBmbjtcbitcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4rXG4rXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4rXHRpZiAocGZuID09IC0xVUwpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbitcdGlmICghb3JkZXIpIHtcbitcdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdHJldHVybiB0cnVlO1xuK1x0fVxuK1xuK1x0Lyogbm9uIFRIUCBmb2xpbyAqL1xuK1x0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbitcbitcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuK1x0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuK1x0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xuK1x0XHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4rXHRcdFx0Z290byBmYWlsO1xuK1x0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbitcdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbitcdCAqL1xuK1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgKyBucl9wYWdlcywga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbitcdFx0cmV0dXJuIHRydWU7XG4rXG4rXHQvKiBJZiB3ZSBmaW5kIGFub3RoZXIgdGFpbCBwYWdlLCB0aGVuIHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXG4rXHRyZXR1cm4gKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncztcbitmYWlsOlxuK1x0a3NmdF9leGl0X2ZhaWxfbXNnKFwiRmFpbGVkIHRvIGdldCBmb2xpbyBpbmZvXFxuXCIpO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbisvKlxuKyAqIENoZWNrIHdoZXRoZXIgZXZlcnkgb3JkZXItQG9yZGVyIHdpbmRvdyBvZiBbc3RhcnQsIGxlbikgbWFwcyBleGFjdGx5IG9uZVxuKyAqIGZvbGlvIG9mIHRoYXQgb3JkZXIsIGhlYWQgdG8gdGFpbC4gIFRoZSBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5XG4rICogYWxpZ25lZCwgZWFjaCB3aW5kb3cncyBQRk4gcnVuIG11c3QgYmUgY29udGlndW91cywgYW5kIGEgd2luZG93J3MgZmlyc3RcbisgKiBQRk4gbXVzdCBiZSB0aGUgZm9saW8gaGVhZC5cbisgKlxuKyAqIFRoaXMgaXMgdGhlIGNoZWNrIFwiZGlkIHRoaXMgcmFuZ2UgY29sbGFwc2UgaW50byBvcmRlci1Ab3JkZXIgZm9saW9zXCI6IGFcbisgKiB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpbyBzaGlmdGVkXG4rICogZnJvbSBpdHMgbmF0dXJhbCBwb3NpdGlvbiwgZmFpbHMuXG4rICovXG4rYm9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4rXHRcdFx0XHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZClcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbitcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBucl9wYWdlcyAqIHBzaXplKCk7XG4rXHRjaGFyICp2YWRkcjtcbitcbitcdGlmICgodWludHB0cl90KXN0YXJ0ICUgd2luZG93IHx8IGxlbiAlIHdpbmRvdylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0Zm9yICh2YWRkciA9IHN0YXJ0OyB2YWRkciBcdTAwM2Mgc3RhcnQgKyBsZW47IHZhZGRyICs9IHdpbmRvdykge1xuK1x0XHR1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4rXHRcdHVuc2lnbmVkIGxvbmcgaTtcbitcbitcdFx0LyogTm90IHByZXNlbnQsIG9yIG5vdCBtYXBwaW5nIHRoZSBmb2xpbyBoZWFkLiAqL1xuK1x0XHRpZiAocGZuID09IC0xVUwgfHwgcGZuICUgbnJfcGFnZXMpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0XHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdFx0aWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkciArIGkgKiBwc2l6ZSgpKSAhPVxuK1x0XHRcdCAgICBwZm4gKyBpKVxuK1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9XG4rXG4rXHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcbitcdFx0XHRcdFx0a3BhZ2VmbGFnc19mZCkpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKyNkZWZpbmUgVFJBQ0VGU19ST09UIFwiL3N5cy9rZXJuZWwvdHJhY2luZ1wiXG4rXG4rLypcbisgKiBPcGVuIHRoZSBlbmFibGUgZmlsZSBvZiBvbmUgZnRyYWNlIGV2ZW50IHN1YnN5c3RlbSAoZS5nLiBcImh1Z2VfbWVtb3J5XCIpLlxuKyAqIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0cmFjaW5nX2V2ZW50c19lbmFibGUoKSwgb3IgLTEgaWYgdHJhY2VmcyBvciB0aGVcbisgKiBzdWJzeXN0ZW0gaXMgbm90IHRoZXJlLiAgVGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUgc3RhdGU6IHdob2V2ZXJcbisgKiBzd2l0Y2hlcyB0aGVtIG9uIG93bnMgdGhlbSB1bnRpbCBpdCBzd2l0Y2hlcyB0aGVtIG9mZiwgaW5jbHVkaW5nIG9uIHRoZVxuKyAqIHBhdGhzIHdoZXJlIHRoZSB0ZXN0IGdpdmVzIHVwLlxuKyAqL1xuK2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcbit7XG4rXHRjaGFyIHBhdGhbMjU2XTtcbitcbitcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UIFwiL2V2ZW50cy8lcy9lbmFibGVcIixcbitcdFx0IHN1YnN5cyk7XG4rXHRyZXR1cm4gb3BlbihwYXRoLCBPX1dST05MWSk7XG4rfVxuK1xuK2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSlcbit7XG4rXHRpZiAocHdyaXRlKGZkLCBlbmFibGUgPyBcIjFcIiA6IFwiMFwiLCAxLCAwKSAhPSAxKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyogRHJvcCB3aGF0IHRoZSB0cmFjZSBidWZmZXIgaG9sZHMgc28gZmFyLiAqL1xuK2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpXG4re1xuK1x0aW50IGZkID0gb3BlbihUUkFDRUZTX1JPT1QgXCIvdHJhY2VcIiwgT19XUk9OTFkgfCBPX1RSVU5DKTtcbitcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKVxuK3tcbitcdHJldHVybiBmb3BlbihUUkFDRUZTX1JPT1QgXCIvdHJhY2VcIiwgXCJyXCIpO1xuK31cbitcbiAvKiBJZiBgaW9jdGxzJyBub24tTlVMTCwgdGhlIGFsbG93ZWQgaW9jdGxzIHdpbGwgYmUgcmV0dXJuZWQgaW50byB0aGUgdmFyICovXG4gaW50IHVmZmRfcmVnaXN0ZXJfd2l0aF9pb2N0bHMoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbixcbiBcdFx0XHQgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG5pbmRleCA5YTQ5YWY4ODcwMmU0Li4xMGM3YmU0NmU0NGNhIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbkBAIC0xMCw2ICsxMCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuIFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXHUwMDNjXHUwMDNjIChucikpXG4rI2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSArIChhKSAtIDEpIFx1MDAyNiB+KChhKSAtIDEpKVxuK1xuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcbiAjZGVmaW5lIFBNX01NQVBfRVhDTFVTSVZFICAgICAgICAgICAgIEJJVF9VTEwoNTYpXG4gI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KVxuQEAgLTk3LDYgKzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xuIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKTtcbiBpbnQgZ2F0aGVyX2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpO1xuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxuK1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKTtcbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcbitcdFx0XHRcdCAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKTtcbiBcbiBpbnQgdWZmZF9yZWdpc3RlcihpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxuIFx0XHQgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vcik7XG5AQCAtMTEzLDYgKzExOSwxMCBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XG4raW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKTtcbitpbnQgdHJhY2luZ19ldmVudHNfZW5hYmxlKGludCBmZCwgYm9vbCBlbmFibGUpO1xuK2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpO1xuK0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKTtcbiBcbiBzdGF0aWMgaW5saW5lIGludCBvcGVuX3NlbGZfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcF9vdXQpXG4ge1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTQ6NTk6MTIuMzIyMzg2NTUyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTA5MDE0ODQyNzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqV29ydGhGdXp6aW5nIEFuYWx5c2lzOiBTZWxmdGVzdCBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgcGF0Y2ggdGhhdCdzIGFkZGluZyBhbmQgbW9kaWZ5aW5nIHRlc3RzIHdpdGhpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gSSdtIGdvaW5nIHRocm91Z2ggdGhlIGZpbGVzIOKAkyBgTWFrZWZpbGVgLCBgZm9saW9fb3JkZXJfY2hlY2suY2AsIGBobW0tdGVzdHMuY2AsIHRoZSBodWdlcGFnZSBzdHVmZiwgYGtodWdlcGFnZWRgLCBtaWdyYXRpb24sIGFuZCBzbyBvbi4gSXQgc2VlbXMgbGlrZSBhIHByZXR0eSBjb21wcmVoZW5zaXZlIGFkZGl0aW9uIHRvIHRoZSBzZWxmdGVzdHMgc3VpdGUuXG5cbk15IGluaXRpYWwgdGhvdWdodCBpcyB0byBxdWlja2x5IGFzc2VzcyB3aGV0aGVyIHRoaXMgd2FycmFudHMgZnV6emluZyBhdHRlbnRpb24uIFRoZSBpbnN0cnVjdGlvbnMgSSBoYXZlIGxheSBvdXQgYSBzcGVjaWZpYyBzZXQgb2Ygc2NlbmFyaW9zIHdoZXJlIHdlIHNob3VsZCByZXR1cm4gYFdvcnRoRnV6emluZz1mYWxzZWAuIEl0IGxpc3RzIHRoaW5ncyBsaWtlIGRvY3VtZW50YXRpb24gY2hhbmdlcywgY29tbWVudCB1cGRhdGVzLCBkZWNvcmF0aXZlIGxvZ2dpbmcsIGNvbnN0YW50IGFkanVzdG1lbnRzIHRoYXQgZG9uJ3QgY2hhbmdlIGV4ZWN1dGlvbiwgYW5kIHVucmVhY2hhYmxlIGNvZGUgcGF0aHMuIFRoZXJlJ3MgYWxzbyBzb21lIGltcG9ydGFudCBjYXZlYXRzIGFib3V0IHNwZWNpZmljIGhhcmR3YXJlIGFuZCBkcml2ZXIgY29udGV4dHMuXG5cbkFoLCBidXQgd2FpdCBhIHNlY29uZC4uLiBpdCAqZG9lc24ndCogZXhwbGljaXRseSBtZW50aW9uIHNlbGZ0ZXN0cyBpbiB0aGF0IFwiV29ydGhGdXp6aW5nPWZhbHNlXCIgbGlzdC4gSG93ZXZlciwgc2VsZnRlc3RzIGFyZSBub3Qga2VybmVsIGNvZGUuIFRoZXkgbGl2ZSBpbiB1c2Vyc3BhY2U7IHRoZXkncmUgKnRvb2xzKiB1c2VkIHRvIHZhbGlkYXRlIHRoZSBrZXJuZWwncyBiZWhhdmlvci4gVGhlIGtlcm5lbCBpdHNlbGYgKmlzKiB3aGF0IFN5emthbGxlciBmdXp6ZXMgdXNpbmcgc3lzY2FsbHMuIFRoZSBzZWxmdGVzdHMgYXJlIHBhcnQgb2YgaG93IHdlIG1lYXN1cmUgaXRzIHBlcmZvcm1hbmNlIGFuZCBiZWhhdmlvciwgYnV0IHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlIHN5c3RlbSBjYWxsIGZsb3cgdGhhdCdzIHRoZSBwcmltYXJ5IHRhcmdldCBvZiBmdXp6aW5nLlxuXG5MZXQgbWUganVzdCBkbyBhIHF1aWNrLCB2ZXJ5IGV4cGxpY2l0LCBkb3VibGUtY2hlY2sgdG8gY29uZmlybS4gWWVzLCBhbGwgdGhlIGNoYW5nZXMgYXJlIHNxdWFyZWx5IHdpdGhpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYC4gTm90aGluZyBpbiBhbnkga2VybmVsIHN1YnN5c3RlbXMgaGVyZS5cblxuVGhlcmVmb3JlLCBiZWNhdXNlIHRoaXMgcGF0Y2ggKm9ubHkqIHRvdWNoZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cywgYW5kIGRvZXMgbm90IGFsdGVyIHRoZSBleGVjdXRpb24gZmxvdyBvZiB0aGUga2VybmVsIGl0c2VsZiwgSSBhbSBnb2luZyB0byBzZXQgYFdvcnRoRnV6emluZz1mYWxzZWAuIFRoZSByZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkOiB0aGVzZSBjaGFuZ2VzIGFyZSBpc29sYXRlZCB0byB0aGUgdGVzdGluZyBmcmFtZXdvcmsgYW5kIGFyZSBub3QgcGFydCBvZiB0aGUga2VybmVsIGV4ZWN1dGlvbiBwYXRoIHRoYXQgU3l6a2FsbGVyIGZ1enplcy4gTGV0J3MgY2FsbCBgc2V0LXJlc3VsdHNgIHRvIGNvbXBsZXRlIHRoaXMgdGFzay5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjg5MjcsIk91dHB1dFRva2VucyI6NjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MjUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xMlQxNDo1OToyMy4yMjM4NzMyMTVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NDcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8sIHdoaWNoIGRvIG5vdCBhZmZlY3QgdGhlIGtlcm5lbCdzIGZ1bmN0aW9uYWwgZXhlY3V0aW9uIGZsb3cuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLCB3aGljaCBkbyBub3QgYWZmZWN0IHRoZSBrZXJuZWwncyBmdW5jdGlvbmFsIGV4ZWN1dGlvbiBmbG93LlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTJUMTQ6NTk6MjMuMjIzODkzNDI1WiIsIlNlcSI6NSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowkbvn9[1] Phase: Running StartedAt: 2026-08-12 14:59:35 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowkbvn9[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-08-12 14:59:35 +0000 UTC FinishedAt: 2026-08-12 14:59:39 +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,}