Name: series-workflowx628w Phase: Failed StartedAt: 2026-09-11 03:59:28 +0000 UTC FinishedAt: 2026-09-11 04:03:32 +0000 UTC Input: nil Output: nil --------- Name: series-workflowx628w[0] Phase: Succeeded StartedAt: 2026-09-11 03:59:28 +0000 UTC FinishedAt: 2026-09-11 04:03:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflowx628w[0].run-triage Phase: Succeeded StartedAt: 2026-09-11 03:59:28 +0000 UTC FinishedAt: 2026-09-11 04:03:22 +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+CgkJCTx0ZD4yMDI2LzA5LzExIDA0OjAzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHV0aWxpdGllcyBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlICh2bWxpbnV4IG9yIGtlcm5lbCBtb2R1bGVzKSwgc28gaXQgaXMgbm90IGZ1enphYmxlIGJ5IHN5emthbGxlci4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDQ6MDM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA4ODE3MDRlZTBhM2NmMTUzYTVjMWRhYzdjOTQ0NThmNjdhODcwYTBlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDQ6MDM6MDEgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuaW5kZXggNjg0YThmYjcyNDE0Ni4uOTcxZGExNzM2MDBhNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuQEAgLTc0MCwxNSAmIzQzOzc0MCwxMCBAQCBzdGF0aWMgaW50IGRvX3Nob3coaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0cmV0dXJuIGVycm5vID09IEVOT0VOVCA/IDAgOiAtMTtcbiB9XG4gXG4tc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbi1cdFx0XHQgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0Zixcbi1cdFx0XHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcbiYjNDM7c3RhdGljIHZvaWQgcHJpbnRfbWFwX2VsZW0odm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiYjNDM7XHRcdFx0ICAgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcbiYjNDM7XHRcdFx0ICAganNvbl93cml0ZXJfdCAqYnRmX3d0cilcbiB7XG4tXHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcbi1cdFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xuLVx0XHRyZXR1cm4gLTE7XG4tXHR9XG4tXG4gXHRpZiAoanNvbl9vdXRwdXQpIHtcbiBcdFx0cHJpbnRfZW50cnlfanNvbihtYXBfaW5mbywga2V5LCB2YWx1ZSwgYnRmKTtcbiBcdH0gZWxzZSBpZiAoYnRmKSB7XG5AQCAtNzYyLDEwICYjNDM7NzU3LDExMiBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0fSBlbHNlIHtcbiBcdFx0cHJpbnRfZW50cnlfcGxhaW4obWFwX2luZm8sIGtleSwgdmFsdWUpO1xuIFx0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuJiM0MztcdFx0XHQgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcbiYjNDM7XHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4mIzQzO3tcbiYjNDM7XHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcbiYjNDM7XHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4gXG4mIzQzO1x0cHJpbnRfbWFwX2VsZW0oa2V5LCB2YWx1ZSwgbWFwX2luZm8sIGJ0ZiwgYnRmX3d0cik7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4mIzQzOyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgMVxuJiM0MzsjZGVmaW5lIE1BUF9EVU1QX0JBVENIX1NJWkUgMjU2VVxuJiM0MzsjZGVmaW5lIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAoNCAqIDEwMjQgKiAxMDI0KVxuJiM0MztcbiYjNDM7LyogUmV0dXJuIE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLIG9ubHkgYmVmb3JlIGJhdGNoIHRyYXZlcnNhbCBzdGFydHMuICovXG4mIzQzO3N0YXRpYyBpbnQgZHVtcF9tYXBfYmF0Y2goaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuJiM0MztcdFx0XHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcbiYjNDM7XHRcdFx0ICBqc29uX3dyaXRlcl90ICp3dHIsIHVuc2lnbmVkIGludCAqbnVtX2VsZW1zKVxuJiM0Mzt7XG4mIzQzO1x0X191MzIgY2FwYWNpdHksIGNvdW50LCBiYXRjaCA9IDAsIG5leHRfYmF0Y2ggPSAwLCBpO1xuJiM0MztcdHZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjtcbiYjNDM7XHRib29sIGZpcnN0ID0gdHJ1ZSwgY2FuX2ZhbGxiYWNrID0gdHJ1ZTtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlXG4mIzQzO1x0ICogb3B0aW1pemF0aW9uIHRvIG1hcHMgd2hvc2Ugd29yc3QtY2FzZSBidWNrZXQgZml0cyB0aGUgbWVtb3J5IGJ1ZGdldCxcbiYjNDM7XHQgKiBzbyBhIGxhdGVyIEVOT1NQQyBuZXZlciBmb3JjZXMgYSByZXN0YXJ0IGFmdGVyIHByaW50aW5nIHNvbWUgZW50cmllcy5cbiYjNDM7XHQgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChpbmZvLVx1MDAzZXR5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tXHUwMDNlbWF4X2VudHJpZXMgfHxcbiYjNDM7XHQgICAgKF9fdTY0KWluZm8tXHUwMDNla2V5X3NpemUgJiM0MzsgaW5mby1cdTAwM2V2YWx1ZV9zaXplIFx1MDAzZVxuJiM0MztcdCAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLVx1MDAzZW1heF9lbnRyaWVzKVxuJiM0MztcdFx0cmV0dXJuIE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLO1xuJiM0MztcbiYjNDM7XHRjYXBhY2l0eSA9IG1pbihpbmZvLVx1MDAzZW1heF9lbnRyaWVzLCBNQVBfRFVNUF9CQVRDSF9TSVpFKTtcbiYjNDM7cmVzaXplOlxuJiM0MztcdGJ1ZiA9IHJlYWxsb2Moa2V5cywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdGlmICghYnVmKSB7XG4mIzQzO1x0XHRlcnIgPSBFTk9NRU07XG4mIzQzO1x0XHRnb3RvIGVycm9yO1xuJiM0MztcdH1cbiYjNDM7XHRrZXlzID0gYnVmO1xuJiM0MztcdGJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbiYjNDM7XHRpZiAoIWJ1Zikge1xuJiM0MztcdFx0ZXJyID0gRU5PTUVNO1xuJiM0MztcdFx0Z290byBlcnJvcjtcbiYjNDM7XHR9XG4mIzQzO1x0dmFsdWVzID0gYnVmO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAodHJ1ZSkge1xuJiM0MztcdFx0Y291bnQgPSBjYXBhY2l0eTtcbiYjNDM7XHRcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcdTAwMjZiYXRjaCxcbiYjNDM7XHRcdFx0XHRcdCAgIFx1MDAyNm5leHRfYmF0Y2gsIGtleXMsIHZhbHVlcywgXHUwMDI2Y291bnQsIE5VTEwpO1xuJiM0MztcdFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIE9sZGVyIGtlcm5lbHMgcmVqZWN0IHRoZSBjb21tYW5kIGJlZm9yZSB1cGRhdGluZyBjb3VudC4gRG8gbm90XG4mIzQzO1x0XHQgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoY2FuX2ZhbGxiYWNrIFx1MDAyNlx1MDAyNiAoZXJyID09IEVJTlZBTCB8fCBlcnIgPT0gRU9QTk9UU1VQUCB8fFxuJiM0MztcdFx0XHRcdCAgICAgZXJyID09IDUyNCAvKiBFTk9UU1VQUCAqLykpIHtcbiYjNDM7XHRcdFx0ZXJyID0gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0s7XG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0Y2FuX2ZhbGxiYWNrID0gZmFsc2U7XG4mIzQzO1x0XHRpZiAoZXJyID09IEVOT1NQQykge1xuJiM0MztcdFx0XHRpZiAoY2FwYWNpdHkgPT0gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbiYjNDM7XHRcdFx0XHRnb3RvIGVycm9yO1xuJiM0MztcdFx0XHRjYXBhY2l0eSAmIzQzOz0gbWluKGNhcGFjaXR5LCBpbmZvLVx1MDAzZW1heF9lbnRyaWVzIC0gY2FwYWNpdHkpO1xuJiM0MztcdFx0XHQvKiBQcmVzZXJ2ZSB0aGUgaW5wdXQgY3Vyc29yOiB0aGUgb3ZlcnNpemVkIGJ1Y2tldCB3YXMgbm90IHJlYWQuICovXG4mIzQzO1x0XHRcdGdvdG8gcmVzaXplO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0LyogSW4gcGFydGljdWxhciwgRUZBVUxUIGNhbiBsZWF2ZSBjb3VudCBhbmQgdGhlIGJ1ZmZlcnMgaW52YWxpZC4gKi9cbiYjNDM7XHRcdGlmIChlcnIgXHUwMDI2XHUwMDI2IGVyciAhPSBFTk9FTlQpXG4mIzQzO1x0XHRcdGdvdG8gZXJyb3I7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogS2VlcCB0aGUgYWxpZ25tZW50IHByb3ZpZGVkIGJ5IGluZGl2aWR1YWwgbG9va3VwcywgaW5jbHVkaW5nXG4mIzQzO1x0XHRcdCAqIGZvciBCVEYgdHlwZXMgd2hvc2UgbWFwIGtleS92YWx1ZSBzaXplIGlzIG5vdCBhbGlnbmVkLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0bWVtY3B5KGtleSwga2V5cyAmIzQzOyAoc2l6ZV90KWkgKiBpbmZvLVx1MDAzZWtleV9zaXplLCBpbmZvLVx1MDAzZWtleV9zaXplKTtcbiYjNDM7XHRcdFx0bWVtY3B5KHZhbHVlLCB2YWx1ZXMgJiM0MzsgKHNpemVfdClpICogaW5mby1cdTAwM2V2YWx1ZV9zaXplLCBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xuJiM0MztcdFx0XHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7XG4mIzQzO1x0XHRcdCgqbnVtX2VsZW1zKSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoZXJyID09IEVOT0VOVCkge1xuJiM0MztcdFx0XHRlcnIgPSAwO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGZpcnN0ID0gZmFsc2U7XG4mIzQzO1x0XHRiYXRjaCA9IG5leHRfYmF0Y2g7XG4mIzQzO1x0fVxuJiM0MztlcnJvcjpcbiYjNDM7XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7RXJyb3I6IGNhbiYjMzk7dCBsb29rdXAgbWFwIGJhdGNoOiAlc1xcblwmIzM0Oywgc3RyZXJyb3IoZXJyKSk7XG4mIzQzO1x0ZXJyID0gLTE7XG4mIzQzO291dDpcbiYjNDM7XHRmcmVlKGtleXMpO1xuJiM0MztcdGZyZWUodmFsdWVzKTtcbiYjNDM7XHRyZXR1cm4gZXJyO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcylcbiB7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbkBAIC04NjksNiAmIzQzOzk2Niw5IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRwX2luZm8oXCYjMzQ7V2FybmluZzogY2Fubm90IHJlYWQgdmFsdWVzIGZyb20gJXMgbWFwIHdpdGggdmFsdWVfc2l6ZSAhPSA4XCYjMzQ7LFxuIFx0XHQgICAgICAgbWFwX3R5cGVfc3RyKTtcbiBcdH1cbiYjNDM7XHRlcnIgPSBkdW1wX21hcF9iYXRjaChmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIsIFx1MDAyNm51bV9lbGVtcyk7XG4mIzQzO1x0aWYgKGVyciAhPSBNQVBfRFVNUF9CQVRDSF9GQUxMQkFDSylcbiYjNDM7XHRcdGdvdG8gZW5kX2R1bXA7XG4gXHR3aGlsZSAodHJ1ZSkge1xuIFx0XHRlcnIgPSBicGZfbWFwX2dldF9uZXh0X2tleShmZCwgcHJldl9rZXksIGtleSk7XG4gXHRcdGlmIChlcnIpIHtcbkBAIC04ODEsNiAmIzQzOzk4MSw3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRwcmV2X2tleSA9IGtleTtcbiBcdH1cbiBcbiYjNDM7ZW5kX2R1bXA6XG4gXHRpZiAod3RyKSB7XG4gXHRcdGpzb253X2VuZF9hcnJheSh3dHIpO1x0LyogZWxlbWVudHMgKi9cbiBcdFx0aWYgKHNob3dfaGVhZGVyKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjQyMTZlZDc3OGVmOVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xuQEAgLTAsMCAmIzQzOzEsMTg3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBNQVhfRU5UUklFUyAxMDI1XG4mIzQzOyNkZWZpbmUgUkVDT1JEX1NJWkUgMjU2XG4mIzQzOyNkZWZpbmUgT1VUUFVUX1NJWkUgKE1BWF9FTlRSSUVTICogUkVDT1JEX1NJWkUgJiM0MzsgMTAyNClcbiYjNDM7XG4mIzQzO3N0cnVjdCBkdW1wX2Nhc2Uge1xuJiM0MztcdGNvbnN0IGNoYXIgKm5hbWU7XG4mIzQzO1x0dW5zaWduZWQgaW50IGNvdW50O1xuJiM0MztcdHVuc2lnbmVkIGludCBrZXlfc2l6ZTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZTtcbiYjNDM7XHRib29sIGJ0ZjtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IGRhdGE7XG4mIzQzO1x0dW5zaWduZWQgaW50IGk7XG4mIzQzO1xuJiM0MztcdGlmIChqc29uKVxuJiM0MztcdFx0Km91dCYjNDM7JiM0MzsgPSAmIzM5O1smIzM5OztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKGpzb24gXHUwMDI2XHUwMDI2IGkpXG4mIzQzO1x0XHRcdCpvdXQmIzQzOyYjNDM7ID0gJiMzOTssJiMzOTs7XG4mIzQzO1x0XHRvdXQgJiM0Mzs9IHNwcmludGYob3V0LCBqc29uID8gXCYjMzQ7XFxcJiMzNDsweCUwMnhcXFwmIzM0O1wmIzM0OyA6IFwmIzM0OyUwMnhcJiMzNDssIGJ5dGVzW2ldKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGpzb24pXG4mIzQzO1x0XHQqb3V0JiM0MzsmIzQzOyA9ICYjMzk7XSYjMzk7O1xuJiM0MztcdCpvdXQgPSAmIzM5O1xcMCYjMzk7O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBleHBlY3RlZF9yZWNvcmQoY2hhciAqcmVjb3JkLCBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LFxuJiM0MztcdFx0XHQgICAgdW5zaWduZWQgaW50IGluZGV4LCBib29sIGpzb24pXG4mIzQzO3tcbiYjNDM7XHRfX3UzMiBrZXkgPSBpbmRleCwgdmFsdWUgPSBpbmRleCAqIDM3ICYjNDM7IDExO1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7XG4mIzQzO1x0Y2hhciBrZXlfaGV4WzY0XSwgdmFsdWVfaGV4WzY0XSwgZm9ybWF0dGVkWzk2XTtcbiYjNDM7XG4mIzQzO1x0aGV4X2J5dGVzKGtleV9oZXgsIHRlc3QtXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXHUwMDI2c2hvcnRfa2V5IDogXHUwMDI2a2V5LFxuJiM0MztcdFx0ICB0ZXN0LVx1MDAzZWtleV9zaXplLCBqc29uKTtcbiYjNDM7XHRoZXhfYnl0ZXModmFsdWVfaGV4LCBcdTAwMjZ2YWx1ZSwgdGVzdC1cdTAwM2V2YWx1ZV9zaXplLCBqc29uKTtcbiYjNDM7XHRzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCBcJiMzNDt7XFxcJiMzNDtrZXlcXFwmIzM0OzoldSxcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6JXV9XCYjMzQ7LFxuJiM0MztcdFx0IGtleSwgdmFsdWUpO1xuJiM0MztcdGlmIChqc29uIFx1MDAyNlx1MDAyNiB0ZXN0LVx1MDAzZWJ0ZilcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsXG4mIzQzO1x0XHRcdCBcJiMzNDt7XFxcJiMzNDtrZXlcXFwmIzM0OzolcyxcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6JXMsXFxcJiMzNDtmb3JtYXR0ZWRcXFwmIzM0Ozolc31cJiMzNDssXG4mIzQzO1x0XHRcdCBrZXlfaGV4LCB2YWx1ZV9oZXgsIGZvcm1hdHRlZCk7XG4mIzQzO1x0ZWxzZSBpZiAoanNvbilcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwmIzM0O3tcXFwmIzM0O2tleVxcXCYjMzQ7OiVzLFxcXCYjMzQ7dmFsdWVcXFwmIzM0Ozolc31cJiMzNDssXG4mIzQzO1x0XHRcdCBrZXlfaGV4LCB2YWx1ZV9oZXgpO1xuJiM0MztcdGVsc2UgaWYgKHRlc3QtXHUwMDNlYnRmKVxuJiM0MztcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXCYjMzQ7JXNcJiMzNDssIGZvcm1hdHRlZCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXCYjMzQ7a2V5OiVzdmFsdWU6JXNcJiMzNDssIGtleV9oZXgsIHZhbHVlX2hleCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX2R1bXAoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCwgX191MzIgaWQsIGJvb2wganNvbiwgYm9vbCBwcmV0dHkpXG4mIzQzO3tcbiYjNDM7XHRib29sIGFycmF5ID0ganNvbiB8fCB0ZXN0LVx1MDAzZWJ0ZjtcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGV4cGVjdGVkW1JFQ09SRF9TSVpFXSwgZm9vdGVyWzY0XTtcbiYjNDM7XHRib29sIHNlZW5bTUFYX0VOVFJJRVNdID0ge307XG4mIzQzO1x0Y2hhciAqb3V0cHV0LCAqc3JjLCAqZHN0LCAqY3Vyc29yO1xuJiM0MztcdHVuc2lnbmVkIGludCBpLCBuO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdG91dHB1dCA9IGNhbGxvYygxLCBPVVRQVVRfU0laRSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKG91dHB1dCwgXCYjMzQ7YWxsb2Nfb3V0cHV0XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0OyVzbWFwIGR1bXAgaWQgJXVcJiMzNDssXG4mIzQzO1x0XHQgcHJldHR5ID8gXCYjMzQ7LXAgXCYjMzQ7IDoganNvbiA/IFwmIzM0Oy1qIFwmIzM0OyA6IFwmIzM0O1wmIzM0OywgaWQpO1xuJiM0MztcdGVyciA9IGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7bWFwX2R1bXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBJZ25vcmUgcHJlc2VudGF0aW9uIHdoaXRlc3BhY2UsIGJ1dCBjb21wYXJlIGNvbXBsZXRlIHJlY29yZHMgYW5kIGFsbFxuJiM0MztcdCAqIHB1bmN0dWF0aW9uLiBFeHBlY3RlZCBjb250ZW50cyBjb21lIG9ubHkgZnJvbSB0aGUgaW5wdXQgZGF0YSwgbmV2ZXJcbiYjNDM7XHQgKiBmcm9tIGFub3RoZXIgbWFwIHdhbGsgb3IgYnBmdG9vbCBpbnZvY2F0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvciAoc3JjID0gb3V0cHV0LCBkc3QgPSBvdXRwdXQ7ICpzcmM7IHNyYyYjNDM7JiM0MzspXG4mIzQzO1x0XHRpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpXG4mIzQzO1x0XHRcdCpkc3QmIzQzOyYjNDM7ID0gKnNyYztcbiYjNDM7XHQqZHN0ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRjdXJzb3IgPSBvdXRwdXQ7XG4mIzQzO1x0aWYgKGFycmF5KSB7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAmIzM5O1smIzM5OywgXCYjMzQ7YXJyYXlfc3RhcnRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGN1cnNvciYjNDM7JiM0Mzs7XG4mIzQzO1x0fVxuJiM0MztcdGZvciAobiA9IDA7IG4gXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IG4mIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoYXJyYXkgXHUwMDI2XHUwMDI2IG4pIHtcbiYjNDM7XHRcdFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJiMzOTssJiMzOTssIFwmIzM0O3JlY29yZF9zZXBhcmF0b3JcJiMzNDspKVxuJiM0MztcdFx0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0XHRjdXJzb3ImIzQzOyYjNDM7O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgdGVzdC1cdTAwM2Vjb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKHNlZW5baV0pXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdGV4cGVjdGVkX3JlY29yZChleHBlY3RlZCwgdGVzdCwgaSwganNvbik7XG4mIzQzO1x0XHRcdGlmICghc3RybmNtcChjdXJzb3IsIGV4cGVjdGVkLCBzdHJsZW4oZXhwZWN0ZWQpKSlcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmICghQVNTRVJUX0xUKGksIHRlc3QtXHUwMDNlY291bnQsIFwmIzM0O3VuaXF1ZV9leHBlY3RlZF9yZWNvcmRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHNlZW5baV0gPSB0cnVlO1xuJiM0MztcdFx0Y3Vyc29yICYjNDM7PSBzdHJsZW4oZXhwZWN0ZWQpO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoYXJyYXkpIHtcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShjdXJzb3IsIFwmIzM0O11cJiMzNDssIFwmIzM0O2FycmF5X2VuZF9hbmRfY291bnRcJiMzNDspO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzbnByaW50Zihmb290ZXIsIHNpemVvZihmb290ZXIpLCBcJiMzNDtGb3VuZCV1ZWxlbWVudCVzXCYjMzQ7LCB0ZXN0LVx1MDAzZWNvdW50LFxuJiM0MztcdFx0XHQgdGVzdC1cdTAwM2Vjb3VudCA9PSAxID8gXCYjMzQ7XCYjMzQ7IDogXCYjMzQ7c1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBmb290ZXIsIFwmIzM0O3BsYWluX2NvdW50XCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO291dDpcbiYjNDM7XHRmcmVlKG91dHB1dCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJ1bl9kdW1wX2Nhc2UoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuJiM0MztcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdF9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pO1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4mIzQzO1x0dW5zaWduZWQgaW50IGk7XG4mIzQzO1x0aW50IGZkID0gLTE7XG4mIzQzO1xuJiM0MztcdGlmICh0ZXN0LVx1MDAzZWJ0Zikge1xuJiM0MztcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2J0Zl9uZXdcJiMzNDspKVxuJiM0MztcdFx0XHRyZXR1cm47XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcJiMzNDt1bnNpZ25lZCBpbnRcJiMzNDssIDQsIDApLCAxLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7YnRmX2ludFwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcJiMzNDtidGZfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0b3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7XG4mIzQzO1x0XHRvcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XG4mIzQzO1x0XHRvcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcbiYjNDM7XHR9XG4mIzQzO1x0ZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCYjMzQ7ZHVtcF9iYXRjaFwmIzM0OywgdGVzdC1cdTAwM2VrZXlfc2l6ZSxcbiYjNDM7XHRcdFx0ICAgIHRlc3QtXHUwMDNldmFsdWVfc2l6ZSwgdGVzdC1cdTAwM2Vjb3VudCA/OiAxLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCYjMzQ7bWFwX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0X191MzIga2V5ID0gaSwgdmFsdWUgPSBpICogMzcgJiM0MzsgMTE7XG4mIzQzO1x0XHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGk7XG4mIzQzO1x0XHR2b2lkICprZXlfcHRyID0gdGVzdC1cdTAwM2VrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKilcdTAwMjZzaG9ydF9rZXkgOiBcdTAwMjZrZXk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7bWFwX3VwZGF0ZVwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZpbmZvX2xlbiksIFwmIzM0O21hcF9pbmZvXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIGZhbHNlKTtcbiYjNDM7XHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIHRydWUpO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKGZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGZkKTtcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2JhdGNoKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSBjYXNlc1tdID0ge1xuJiM0MztcdFx0eyBcJiMzNDtlbXB0eVwmIzM0OywgMCwgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDtzaW5nbGVcJiMzNDssIDEsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7YmVsb3dfYmF0Y2hcJiMzNDssIDI1NSwgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDtleGFjdF9iYXRjaFwmIzM0OywgMjU2LCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O2Fib3ZlX2JhdGNoXCYjMzQ7LCAyNTcsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7bXVsdGlwbGVfYmF0Y2hlc1wmIzM0OywgMTAyNSwgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDtvbmVfYnl0ZV9rZXlcJiMzNDssIDI1NiwgMSwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDtvZGRfdmFsdWVfc2l6ZVwmIzM0OywgMjU3LCA0LCAzIH0sXG4mIzQzO1x0XHR7IFwmIzM0O2J0Zl9lbXB0eVwmIzM0OywgMCwgNCwgNCwgdHJ1ZSB9LFxuJiM0MztcdFx0eyBcJiMzNDtidGZfc2luZ2xlXCYjMzQ7LCAxLCA0LCA0LCB0cnVlIH0sXG4mIzQzO1x0XHR7IFwmIzM0O2J0Zl9tdWx0aXBsZV9iYXRjaGVzXCYjMzQ7LCAxMDI1LCA0LCA0LCB0cnVlIH0sXG4mIzQzO1x0fTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShjYXNlcyk7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoY2FzZXNbaV0ubmFtZSkpXG4mIzQzO1x0XHRcdHJ1bl9kdW1wX2Nhc2UoXHUwMDI2Y2FzZXNbaV0pO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDQ6MDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHV0aWxpdGllcyBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlICh2bWxpbnV4IG9yIGtlcm5lbCBtb2R1bGVzKSwgc28gaXQgaXMgbm90IGZ1enphYmxlIGJ5IHN5emthbGxlci4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA4ODE3MDRlZTBhM2NmMTUzYTVjMWRhYzdjOTQ0NThmNjdhODcwYTBlCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBTZXAgMTEgMDQ6MDM6MDEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCmluZGV4IDY4NGE4ZmI3MjQxNDYuLjk3MWRhMTczNjAwYTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCkBAIC03NDAsMTUgJiM0Mzs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKIAlyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xOwogfQogCi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAotCQkJIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCi0JCQkganNvbl93cml0ZXJfdCAqYnRmX3d0cikKJiM0MztzdGF0aWMgdm9pZCBwcmludF9tYXBfZWxlbSh2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJICAganNvbl93cml0ZXJfdCAqYnRmX3d0cikKIHsKLQlpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHsKLQkJcHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pOwotCQlyZXR1cm4gLTE7Ci0JfQotCiAJaWYgKGpzb25fb3V0cHV0KSB7CiAJCXByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7CiAJfSBlbHNlIGlmIChidGYpIHsKQEAgLTc2MiwxMCAmIzQzOzc1NywxMTIgQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKIAl9IGVsc2UgewogCQlwcmludF9lbnRyeV9wbGFpbihtYXBfaW5mbywga2V5LCB2YWx1ZSk7CiAJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLAomIzQzOwkJCSBqc29uX3dyaXRlcl90ICpidGZfd3RyKQomIzQzO3sKJiM0MzsJaWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7CiYjNDM7CQlwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KIAomIzQzOwlwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTsKIAlyZXR1cm4gMDsKIH0KIAomIzQzOyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgMQomIzQzOyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfU0laRSAyNTZVCiYjNDM7I2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNCkKJiM0MzsKJiM0MzsvKiBSZXR1cm4gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgb25seSBiZWZvcmUgYmF0Y2ggdHJhdmVyc2FsIHN0YXJ0cy4gKi8KJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKJiM0MzsJCQkgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZiwKJiM0MzsJCQkgIGpzb25fd3JpdGVyX3QgKnd0ciwgdW5zaWduZWQgaW50ICpudW1fZWxlbXMpCiYjNDM7ewomIzQzOwlfX3UzMiBjYXBhY2l0eSwgY291bnQsIGJhdGNoID0gMCwgbmV4dF9iYXRjaCA9IDAsIGk7CiYjNDM7CXZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjsKJiM0MzsJYm9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlCiYjNDM7CSAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsCiYjNDM7CSAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLgomIzQzOwkgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGluZm8tJmd0O3R5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tJmd0O21heF9lbnRyaWVzIHx8CiYjNDM7CSAgICAoX191NjQpaW5mby0mZ3Q7a2V5X3NpemUgJiM0MzsgaW5mby0mZ3Q7dmFsdWVfc2l6ZSAmZ3Q7CiYjNDM7CSAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLSZndDttYXhfZW50cmllcykKJiM0MzsJCXJldHVybiBNQVBfRFVNUF9CQVRDSF9GQUxMQkFDSzsKJiM0MzsKJiM0MzsJY2FwYWNpdHkgPSBtaW4oaW5mby0mZ3Q7bWF4X2VudHJpZXMsIE1BUF9EVU1QX0JBVENIX1NJWkUpOwomIzQzO3Jlc2l6ZToKJiM0MzsJYnVmID0gcmVhbGxvYyhrZXlzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby0mZ3Q7a2V5X3NpemUpOwomIzQzOwlpZiAoIWJ1ZikgewomIzQzOwkJZXJyID0gRU5PTUVNOwomIzQzOwkJZ290byBlcnJvcjsKJiM0MzsJfQomIzQzOwlrZXlzID0gYnVmOwomIzQzOwlidWYgPSByZWFsbG9jKHZhbHVlcywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tJmd0O3ZhbHVlX3NpemUpOwomIzQzOwlpZiAoIWJ1ZikgewomIzQzOwkJZXJyID0gRU5PTUVNOwomIzQzOwkJZ290byBlcnJvcjsKJiM0MzsJfQomIzQzOwl2YWx1ZXMgPSBidWY7CiYjNDM7CiYjNDM7CXdoaWxlICh0cnVlKSB7CiYjNDM7CQljb3VudCA9IGNhcGFjaXR5OwomIzQzOwkJZXJyID0gYnBmX21hcF9sb29rdXBfYmF0Y2goZmQsIGZpcnN0ID8gTlVMTCA6ICZhbXA7YmF0Y2gsCiYjNDM7CQkJCQkgICAmYW1wO25leHRfYmF0Y2gsIGtleXMsIHZhbHVlcywgJmFtcDtjb3VudCwgTlVMTCk7CiYjNDM7CQllcnIgPSBlcnIgPyBlcnJubyA6IDA7CiYjNDM7CQkvKgomIzQzOwkJICogT2xkZXIga2VybmVscyByZWplY3QgdGhlIGNvbW1hbmQgYmVmb3JlIHVwZGF0aW5nIGNvdW50LiBEbyBub3QKJiM0MzsJCSAqIGluc3BlY3QgdGhlIGJ1ZmZlcnMgb24gdGhlc2UgZXJyb3JzLCBvciBmYWxsIGJhY2sgYWZ0ZXIgcHJvZ3Jlc3MuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChjYW5fZmFsbGJhY2sgJmFtcDsmYW1wOyAoZXJyID09IEVJTlZBTCB8fCBlcnIgPT0gRU9QTk9UU1VQUCB8fAomIzQzOwkJCQkgICAgIGVyciA9PSA1MjQgLyogRU5PVFNVUFAgKi8pKSB7CiYjNDM7CQkJZXJyID0gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0s7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CQljYW5fZmFsbGJhY2sgPSBmYWxzZTsKJiM0MzsJCWlmIChlcnIgPT0gRU5PU1BDKSB7CiYjNDM7CQkJaWYgKGNhcGFjaXR5ID09IGluZm8tJmd0O21heF9lbnRyaWVzKQomIzQzOwkJCQlnb3RvIGVycm9yOwomIzQzOwkJCWNhcGFjaXR5ICYjNDM7PSBtaW4oY2FwYWNpdHksIGluZm8tJmd0O21heF9lbnRyaWVzIC0gY2FwYWNpdHkpOwomIzQzOwkJCS8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi8KJiM0MzsJCQlnb3RvIHJlc2l6ZTsKJiM0MzsJCX0KJiM0MzsJCS8qIEluIHBhcnRpY3VsYXIsIEVGQVVMVCBjYW4gbGVhdmUgY291bnQgYW5kIHRoZSBidWZmZXJzIGludmFsaWQuICovCiYjNDM7CQlpZiAoZXJyICZhbXA7JmFtcDsgZXJyICE9IEVOT0VOVCkKJiM0MzsJCQlnb3RvIGVycm9yOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IGNvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJCS8qCiYjNDM7CQkJICogS2VlcCB0aGUgYWxpZ25tZW50IHByb3ZpZGVkIGJ5IGluZGl2aWR1YWwgbG9va3VwcywgaW5jbHVkaW5nCiYjNDM7CQkJICogZm9yIEJURiB0eXBlcyB3aG9zZSBtYXAga2V5L3ZhbHVlIHNpemUgaXMgbm90IGFsaWduZWQuCiYjNDM7CQkJICovCiYjNDM7CQkJbWVtY3B5KGtleSwga2V5cyAmIzQzOyAoc2l6ZV90KWkgKiBpbmZvLSZndDtrZXlfc2l6ZSwgaW5mby0mZ3Q7a2V5X3NpemUpOwomIzQzOwkJCW1lbWNweSh2YWx1ZSwgdmFsdWVzICYjNDM7IChzaXplX3QpaSAqIGluZm8tJmd0O3ZhbHVlX3NpemUsIGluZm8tJmd0O3ZhbHVlX3NpemUpOwomIzQzOwkJCXByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTsKJiM0MzsJCQkoKm51bV9lbGVtcykmIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJaWYgKGVyciA9PSBFTk9FTlQpIHsKJiM0MzsJCQllcnIgPSAwOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwkJZmlyc3QgPSBmYWxzZTsKJiM0MzsJCWJhdGNoID0gbmV4dF9iYXRjaDsKJiM0MzsJfQomIzQzO2Vycm9yOgomIzQzOwlmcHJpbnRmKHN0ZGVyciwgJiMzNDtFcnJvcjogY2FuJiMzOTt0IGxvb2t1cCBtYXAgYmF0Y2g6ICVzXG4mIzM0Oywgc3RyZXJyb3IoZXJyKSk7CiYjNDM7CWVyciA9IC0xOwomIzQzO291dDoKJiM0MzsJZnJlZShrZXlzKTsKJiM0MzsJZnJlZSh2YWx1ZXMpOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcykKIHsKIAlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKQEAgLTg2OSw2ICYjNDM7OTY2LDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCXBfaW5mbygmIzM0O1dhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOCYjMzQ7LAogCQkgICAgICAgbWFwX3R5cGVfc3RyKTsKIAl9CiYjNDM7CWVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgJmFtcDtudW1fZWxlbXMpOwomIzQzOwlpZiAoZXJyICE9IE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLKQomIzQzOwkJZ290byBlbmRfZHVtcDsKIAl3aGlsZSAodHJ1ZSkgewogCQllcnIgPSBicGZfbWFwX2dldF9uZXh0X2tleShmZCwgcHJldl9rZXksIGtleSk7CiAJCWlmIChlcnIpIHsKQEAgLTg4MSw2ICYjNDM7OTgxLDcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCXByZXZfa2V5ID0ga2V5OwogCX0KIAomIzQzO2VuZF9kdW1wOgogCWlmICh3dHIpIHsKIAkJanNvbndfZW5kX2FycmF5KHd0cik7CS8qIGVsZW1lbnRzICovCiAJCWlmIChzaG93X2hlYWRlcikKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmI0MjE2ZWQ3NzhlZjkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jCkBAIC0wLDAgJiM0MzsxLDE4NyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmdG9vbF9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9idGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7Y3R5cGUuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIE1BWF9FTlRSSUVTIDEwMjUKJiM0MzsjZGVmaW5lIFJFQ09SRF9TSVpFIDI1NgomIzQzOyNkZWZpbmUgT1VUUFVUX1NJWkUgKE1BWF9FTlRSSUVTICogUkVDT1JEX1NJWkUgJiM0MzsgMTAyNCkKJiM0MzsKJiM0MztzdHJ1Y3QgZHVtcF9jYXNlIHsKJiM0MzsJY29uc3QgY2hhciAqbmFtZTsKJiM0MzsJdW5zaWduZWQgaW50IGNvdW50OwomIzQzOwl1bnNpZ25lZCBpbnQga2V5X3NpemU7CiYjNDM7CXVuc2lnbmVkIGludCB2YWx1ZV9zaXplOwomIzQzOwlib29sIGJ0ZjsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IGRhdGE7CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwomIzQzOwlpZiAoanNvbikKJiM0MzsJCSpvdXQmIzQzOyYjNDM7ID0gJiMzOTtbJiMzOTs7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBzaXplOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKGpzb24gJmFtcDsmYW1wOyBpKQomIzQzOwkJCSpvdXQmIzQzOyYjNDM7ID0gJiMzOTssJiMzOTs7CiYjNDM7CQlvdXQgJiM0Mzs9IHNwcmludGYob3V0LCBqc29uID8gJiMzNDtcJiMzNDsweCUwMnhcJiMzNDsmIzM0OyA6ICYjMzQ7JTAyeCYjMzQ7LCBieXRlc1tpXSk7CiYjNDM7CX0KJiM0MzsJaWYgKGpzb24pCiYjNDM7CQkqb3V0JiM0MzsmIzQzOyA9ICYjMzk7XSYjMzk7OwomIzQzOwkqb3V0ID0gJiMzOTtcMCYjMzk7OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBleHBlY3RlZF9yZWNvcmQoY2hhciAqcmVjb3JkLCBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LAomIzQzOwkJCSAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIGJvb2wganNvbikKJiM0Mzt7CiYjNDM7CV9fdTMyIGtleSA9IGluZGV4LCB2YWx1ZSA9IGluZGV4ICogMzcgJiM0MzsgMTE7CiYjNDM7CXVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7CiYjNDM7CWNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07CiYjNDM7CiYjNDM7CWhleF9ieXRlcyhrZXlfaGV4LCB0ZXN0LSZndDtrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKikmYW1wO3Nob3J0X2tleSA6ICZhbXA7a2V5LAomIzQzOwkJICB0ZXN0LSZndDtrZXlfc2l6ZSwganNvbik7CiYjNDM7CWhleF9ieXRlcyh2YWx1ZV9oZXgsICZhbXA7dmFsdWUsIHRlc3QtJmd0O3ZhbHVlX3NpemUsIGpzb24pOwomIzQzOwlzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCAmIzM0O3tcJiMzNDtrZXlcJiMzNDs6JXUsXCYjMzQ7dmFsdWVcJiMzNDs6JXV9JiMzNDssCiYjNDM7CQkga2V5LCB2YWx1ZSk7CiYjNDM7CWlmIChqc29uICZhbXA7JmFtcDsgdGVzdC0mZ3Q7YnRmKQomIzQzOwkJc25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwKJiM0MzsJCQkgJiMzNDt7XCYjMzQ7a2V5XCYjMzQ7OiVzLFwmIzM0O3ZhbHVlXCYjMzQ7OiVzLFwmIzM0O2Zvcm1hdHRlZFwmIzM0Ozolc30mIzM0OywKJiM0MzsJCQkga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpOwomIzQzOwllbHNlIGlmIChqc29uKQomIzQzOwkJc25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgJiMzNDt7XCYjMzQ7a2V5XCYjMzQ7OiVzLFwmIzM0O3ZhbHVlXCYjMzQ7OiVzfSYjMzQ7LAomIzQzOwkJCSBrZXlfaGV4LCB2YWx1ZV9oZXgpOwomIzQzOwllbHNlIGlmICh0ZXN0LSZndDtidGYpCiYjNDM7CQlzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCAmIzM0OyVzJiMzNDssIGZvcm1hdHRlZCk7CiYjNDM7CWVsc2UKJiM0MzsJCXNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsICYjMzQ7a2V5OiVzdmFsdWU6JXMmIzM0Oywga2V5X2hleCwgdmFsdWVfaGV4KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfZHVtcChjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LCBfX3UzMiBpZCwgYm9vbCBqc29uLCBib29sIHByZXR0eSkKJiM0Mzt7CiYjNDM7CWJvb2wgYXJyYXkgPSBqc29uIHx8IHRlc3QtJmd0O2J0ZjsKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBleHBlY3RlZFtSRUNPUkRfU0laRV0sIGZvb3Rlcls2NF07CiYjNDM7CWJvb2wgc2VlbltNQVhfRU5UUklFU10gPSB7fTsKJiM0MzsJY2hhciAqb3V0cHV0LCAqc3JjLCAqZHN0LCAqY3Vyc29yOwomIzQzOwl1bnNpZ25lZCBpbnQgaSwgbjsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJb3V0cHV0ID0gY2FsbG9jKDEsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG91dHB1dCwgJiMzNDthbGxvY19vdXRwdXQmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDslc21hcCBkdW1wIGlkICV1JiMzNDssCiYjNDM7CQkgcHJldHR5ID8gJiMzNDstcCAmIzM0OyA6IGpzb24gPyAmIzM0Oy1qICYjMzQ7IDogJiMzNDsmIzM0OywgaWQpOwomIzQzOwllcnIgPSBnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O21hcF9kdW1wJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qCiYjNDM7CSAqIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsCiYjNDM7CSAqIHB1bmN0dWF0aW9uLiBFeHBlY3RlZCBjb250ZW50cyBjb21lIG9ubHkgZnJvbSB0aGUgaW5wdXQgZGF0YSwgbmV2ZXIKJiM0MzsJICogZnJvbSBhbm90aGVyIG1hcCB3YWxrIG9yIGJwZnRvb2wgaW52b2NhdGlvbi4KJiM0MzsJICovCiYjNDM7CWZvciAoc3JjID0gb3V0cHV0LCBkc3QgPSBvdXRwdXQ7ICpzcmM7IHNyYyYjNDM7JiM0MzspCiYjNDM7CQlpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpCiYjNDM7CQkJKmRzdCYjNDM7JiM0MzsgPSAqc3JjOwomIzQzOwkqZHN0ID0gJiMzOTtcMCYjMzk7OwomIzQzOwljdXJzb3IgPSBvdXRwdXQ7CiYjNDM7CWlmIChhcnJheSkgewomIzQzOwkJaWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJiMzOTtbJiMzOTssICYjMzQ7YXJyYXlfc3RhcnQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQljdXJzb3ImIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWZvciAobiA9IDA7IG4gJmx0OyB0ZXN0LSZndDtjb3VudDsgbiYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChhcnJheSAmYW1wOyZhbXA7IG4pIHsKJiM0MzsJCQlpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAmIzM5OywmIzM5OywgJiMzNDtyZWNvcmRfc2VwYXJhdG9yJiMzNDspKQomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQljdXJzb3ImIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IHRlc3QtJmd0O2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmIChzZWVuW2ldKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlleHBlY3RlZF9yZWNvcmQoZXhwZWN0ZWQsIHRlc3QsIGksIGpzb24pOwomIzQzOwkJCWlmICghc3RybmNtcChjdXJzb3IsIGV4cGVjdGVkLCBzdHJsZW4oZXhwZWN0ZWQpKSkKJiM0MzsJCQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQlpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LSZndDtjb3VudCwgJiMzNDt1bmlxdWVfZXhwZWN0ZWRfcmVjb3JkJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJc2VlbltpXSA9IHRydWU7CiYjNDM7CQljdXJzb3IgJiM0Mzs9IHN0cmxlbihleHBlY3RlZCk7CiYjNDM7CX0KJiM0MzsJaWYgKGFycmF5KSB7CiYjNDM7CQlBU1NFUlRfU1RSRVEoY3Vyc29yLCAmIzM0O10mIzM0OywgJiMzNDthcnJheV9lbmRfYW5kX2NvdW50JiMzNDspOwomIzQzOwl9IGVsc2UgewomIzQzOwkJc25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgJiMzNDtGb3VuZCV1ZWxlbWVudCVzJiMzNDssIHRlc3QtJmd0O2NvdW50LAomIzQzOwkJCSB0ZXN0LSZndDtjb3VudCA9PSAxID8gJiMzNDsmIzM0OyA6ICYjMzQ7cyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgJiMzNDtwbGFpbl9jb3VudCYjMzQ7KTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJZnJlZShvdXRwdXQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBydW5fZHVtcF9jYXNlKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CiYjNDM7CV9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pOwomIzQzOwlzdHJ1Y3QgYnRmICpidGYgPSBOVUxMOwomIzQzOwl1bnNpZ25lZCBpbnQgaTsKJiM0MzsJaW50IGZkID0gLTE7CiYjNDM7CiYjNDM7CWlmICh0ZXN0LSZndDtidGYpIHsKJiM0MzsJCWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2J0Zl9uZXcmIzM0OykpCiYjNDM7CQkJcmV0dXJuOwomIzQzOwkJaWYgKCFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDt1bnNpZ25lZCBpbnQmIzM0OywgNCwgMCksIDEsCiYjNDM7CQkJICAgICAgICYjMzQ7YnRmX2ludCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksICYjMzQ7YnRmX2xvYWQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTsKJiM0MzsJCW9wdHMuYnRmX2tleV90eXBlX2lkID0gMTsKJiM0MzsJCW9wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxOwomIzQzOwl9CiYjNDM7CWZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9iYXRjaCYjMzQ7LCB0ZXN0LSZndDtrZXlfc2l6ZSwKJiM0MzsJCQkgICAgdGVzdC0mZ3Q7dmFsdWVfc2l6ZSwgdGVzdC0mZ3Q7Y291bnQgPzogMSwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmQsICYjMzQ7bWFwX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdGVzdC0mZ3Q7Y291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyAmIzQzOyAxMTsKJiM0MzsJCXVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaTsKJiM0MzsJCXZvaWQgKmtleV9wdHIgPSB0ZXN0LSZndDtrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKikmYW1wO3Nob3J0X2tleSA6ICZhbXA7a2V5OwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgJmFtcDt2YWx1ZSwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7bWFwX3VwZGF0ZSYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCAmYW1wO2luZm8sICZhbXA7aW5mb19sZW4pLCAmIzM0O21hcF9pbmZvJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgZmFsc2UsIGZhbHNlKTsKJiM0MzsJY2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7CiYjNDM7CWNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgdHJ1ZSk7CiYjNDM7b3V0OgomIzQzOwlpZiAoZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9iYXRjaCh2b2lkKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgY2FzZXNbXSA9IHsKJiM0MzsJCXsgJiMzNDtlbXB0eSYjMzQ7LCAwLCA0LCA0IH0sCiYjNDM7CQl7ICYjMzQ7c2luZ2xlJiMzNDssIDEsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtiZWxvd19iYXRjaCYjMzQ7LCAyNTUsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtleGFjdF9iYXRjaCYjMzQ7LCAyNTYsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDthYm92ZV9iYXRjaCYjMzQ7LCAyNTcsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDttdWx0aXBsZV9iYXRjaGVzJiMzNDssIDEwMjUsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtvbmVfYnl0ZV9rZXkmIzM0OywgMjU2LCAxLCA0IH0sCiYjNDM7CQl7ICYjMzQ7b2RkX3ZhbHVlX3NpemUmIzM0OywgMjU3LCA0LCAzIH0sCiYjNDM7CQl7ICYjMzQ7YnRmX2VtcHR5JiMzNDssIDAsIDQsIDQsIHRydWUgfSwKJiM0MzsJCXsgJiMzNDtidGZfc2luZ2xlJiMzNDssIDEsIDQsIDQsIHRydWUgfSwKJiM0MzsJCXsgJiMzNDtidGZfbXVsdGlwbGVfYmF0Y2hlcyYjMzQ7LCAxMDI1LCA0LCA0LCB0cnVlIH0sCiYjNDM7CX07CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShjYXNlcyk7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoY2FzZXNbaV0ubmFtZSkpCiYjNDM7CQkJcnVuX2R1bXBfY2FzZSgmYW1wO2Nhc2VzW2ldKTsKJiM0Mzt9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDA0OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcwMzcKCQkJCQkJCW91dHB1dDogOTAKCQkJCQkJCXRob3VnaHRzOiA1NDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqVHJpYWdlIERlY2lzaW9uOiBXb3J0aEZ1enppbmcgPSBGYWxzZSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGUgcGF0Y2ggZGlmZiBpbmRpY2F0ZXMgY2hhbmdlcyB0byBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY2AuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoZXNlIGFyZSBsaWtlbHkgbm9uLWtlcm5lbCBhbmQgdXNlci1zcGFjZSBjaGFuZ2VzLCBidXQgbGV0JiMzOTtzIGJlIHRob3JvdWdoLgoKRmlyc3QsIEkmIzM5O2xsIHF1aWNrbHkgY29uc3VsdCB0aGUgdHJpYWdlIHJ1bGVzLiBXZSYjMzk7cmUgbG9va2luZyBmb3IgbW9kaWZpY2F0aW9ucyB0aGF0IGZhbGwgdW5kZXIgdGhlICYjMzQ7Tm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlcyYjMzQ7IGNhdGVnb3J5LiBUaGlzIG1lYW5zIGZvY3VzaW5nIG9uIGNoYW5nZXMgdG8gZG9jdW1lbnRhdGlvbiwgY29tbWVudHMsIHNwZWxsaW5nLCBvciB1c2VyLXNwYWNlIGRpcmVjdG9yaWVzIGxpa2UgYHRvb2xzL2AsIGBzYW1wbGVzL2AsIGBzY3JpcHRzL2AsIGFuZCBgdXNyL2AgKnRoYXQqIGRvbiYjMzk7dCBpbXBhY3QgdGhlIGtlcm5lbCBpbWFnZSBvciBtb2R1bGVzLgoKSSYjMzk7dmUgZ290IGJvdGggZmlsZXMgaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeS4gR2l2ZW4gbXkgZXhwZXJpZW5jZSwgSSYjMzk7bSBjb25maWRlbnQgdGhleSYjMzk7cmUgdXNlci1zcGFjZS4gSnVzdCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4sIEkmIzM5O2xsIG1lbnRhbGx5IGRvdWJsZS1jaGVjayB0aGUgZGlmZiBhZ2FpbiB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIHVuZXhwZWN0ZWQgZmlsZXMgaW4gdGhlIGNoYW5nZSBzZXQuIE5vcGUsIHRoZSBkaWZmIGNvbmZpcm1zIGl0JiMzOTtzIG9ubHkgdGhlc2UgdHdvIGZpbGVzLgoKTm93LCBsZXQmIzM5O3MgbWF0Y2ggdGhpcyB1cCB3aXRoIHRoZSBjcml0ZXJpYS4gVGhlIHJlcXVpcmVtZW50cyBzcGVjaWZpY2FsbHkgc2F5ICYjMzQ7UmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllcy4uLiYjMzQ7IGFuZCBpdCBwZXJmZWN0bHkgZGVzY3JpYmVzIHRoZSBjaGFuZ2VzOiB1c2VyLXNwYWNlIGB0b29scy9gIGRpcmVjdG9yeSBmaWxlcyBhbmQgc2VsZnRlc3RzIHdoaWNoIGhhdmUgemVybyBlZmZlY3Qgb24gdGhlIGtlcm5lbC4KClRoZXJlZm9yZSwgZ2l2ZW4gdGhhdCBhbGwgY2hhbmdlcyBhcmUgY29uZmluZWQgdG8gdXNlci1zcGFjZSB0b29scyBhbmQgdGVzdHMsIGBXb3J0aEZ1enppbmdgIHNob3VsZCBkZWZpbml0ZWx5IGJlIGBmYWxzZWAuIGBGb2N1c1N5bWJvbHNgIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBhcyB0aGVyZSYjMzk7cyBub3RoaW5nIGtlcm5lbC1yZWxhdGVkIGhlcmUsIGFuZCBsaWtld2lzZSwgYEVuYWJsZUNvbmZpZ3NgIHdpbGwgYWxzbyBiZSBlbXB0eS4KClRoZSBjb25jaXNlIHJlYXNvbmluZyBpczogJiMzNDtUaGUgcGF0Y2ggb25seSB0b3VjaGVzIHVzZXItc3BhY2UgdG9vbHMgKGB0b29scy9icGYvYnBmdG9vbC9tYXAuY2ApIGFuZCBzZWxmdGVzdHMgKGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jYCksIHdoaWNoIGRvIG5vdCBtb2RpZnkgdGhlIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDsKCkFscmlnaHQsIHRpbWUgdG8gc2V0IHRoZSByZXN1bHRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDA0OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHV0aWxpdGllcyBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlICh2bWxpbnV4IG9yIGtlcm5lbCBtb2R1bGVzKSwgc28gaXQgaXMgbm90IGZ1enphYmxlIGJ5IHN5emthbGxlci4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlci1zcGFjZSB1dGlsaXRpZXMgaW4gdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwgY29kZSAodm1saW51eCBvciBrZXJuZWwgbW9kdWxlcyksIHNvIGl0IGlzIG5vdCBmdXp6YWJsZSBieSBzeXprYWxsZXIuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDA0OjAzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwNDowMzowMy4zNTU2MjA3MTVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDY0ODY4NDA0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHV0aWxpdGllcyBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlICh2bWxpbnV4IG9yIGtlcm5lbCBtb2R1bGVzKSwgc28gaXQgaXMgbm90IGZ1enphYmxlIGJ5IHN5emthbGxlci5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDA0OjAzOjAzLjM1NTYyNTExNVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQzNTQwOTQ2OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDg4MTcwNGVlMGEzY2YxNTNhNWMxZGFjN2M5NDQ1OGY2N2E4NzBhMGVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDQ6MDM6MDEgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLjk3MWRhMTczNjAwYTcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbkBAIC03NDAsMTUgKzc0MCwxMCBAQCBzdGF0aWMgaW50IGRvX3Nob3coaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbi1cXHRcXHRcXHQgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcXG4tXFx0XFx0XFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXFxuK3N0YXRpYyB2b2lkIHByaW50X21hcF9lbGVtKHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuK1xcdFxcdFxcdCAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXFxuK1xcdFxcdFxcdCAgIGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXFxuIHtcXG4tXFx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XFxuLVxcdFxcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcXG4tXFx0XFx0cmV0dXJuIC0xO1xcbi1cXHR9XFxuLVxcbiBcXHRpZiAoanNvbl9vdXRwdXQpIHtcXG4gXFx0XFx0cHJpbnRfZW50cnlfanNvbihtYXBfaW5mbywga2V5LCB2YWx1ZSwgYnRmKTtcXG4gXFx0fSBlbHNlIGlmIChidGYpIHtcXG5AQCAtNzYyLDEwICs3NTcsMTEyIEBAIHN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdHByaW50X2VudHJ5X3BsYWluKG1hcF9pbmZvLCBrZXksIHZhbHVlKTtcXG4gXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbitcXHRcXHRcXHQgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXFxuK3tcXG4rXFx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XFxuK1xcdFxcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuIFxcbitcXHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTtcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuKyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgMVxcbisjZGVmaW5lIE1BUF9EVU1QX0JBVENIX1NJWkUgMjU2VVxcbisjZGVmaW5lIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAoNCAqIDEwMjQgKiAxMDI0KVxcbitcXG4rLyogUmV0dXJuIE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLIG9ubHkgYmVmb3JlIGJhdGNoIHRyYXZlcnNhbCBzdGFydHMuICovXFxuK3N0YXRpYyBpbnQgZHVtcF9tYXBfYmF0Y2goaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbitcXHRcXHRcXHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0ICBqc29uX3dyaXRlcl90ICp3dHIsIHVuc2lnbmVkIGludCAqbnVtX2VsZW1zKVxcbit7XFxuK1xcdF9fdTMyIGNhcGFjaXR5LCBjb3VudCwgYmF0Y2ggPSAwLCBuZXh0X2JhdGNoID0gMCwgaTtcXG4rXFx0dm9pZCAqa2V5cyA9IE5VTEwsICp2YWx1ZXMgPSBOVUxMLCAqYnVmO1xcbitcXHRib29sIGZpcnN0ID0gdHJ1ZSwgY2FuX2ZhbGxiYWNrID0gdHJ1ZTtcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlXFxuK1xcdCAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsXFxuK1xcdCAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLlxcbitcXHQgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGluZm8tXFx1MDAzZXR5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tXFx1MDAzZW1heF9lbnRyaWVzIHx8XFxuK1xcdCAgICAoX191NjQpaW5mby1cXHUwMDNla2V5X3NpemUgKyBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplIFxcdTAwM2VcXG4rXFx0ICAgIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAvIGluZm8tXFx1MDAzZW1heF9lbnRyaWVzKVxcbitcXHRcXHRyZXR1cm4gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0s7XFxuK1xcbitcXHRjYXBhY2l0eSA9IG1pbihpbmZvLVxcdTAwM2VtYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7XFxuK3Jlc2l6ZTpcXG4rXFx0YnVmID0gcmVhbGxvYyhrZXlzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRpZiAoIWJ1Zikge1xcbitcXHRcXHRlcnIgPSBFTk9NRU07XFxuK1xcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdH1cXG4rXFx0a2V5cyA9IGJ1ZjtcXG4rXFx0YnVmID0gcmVhbGxvYyh2YWx1ZXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplKTtcXG4rXFx0aWYgKCFidWYpIHtcXG4rXFx0XFx0ZXJyID0gRU5PTUVNO1xcbitcXHRcXHRnb3RvIGVycm9yO1xcbitcXHR9XFxuK1xcdHZhbHVlcyA9IGJ1ZjtcXG4rXFxuK1xcdHdoaWxlICh0cnVlKSB7XFxuK1xcdFxcdGNvdW50ID0gY2FwYWNpdHk7XFxuK1xcdFxcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcXHUwMDI2YmF0Y2gsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIFxcdTAwMjZuZXh0X2JhdGNoLCBrZXlzLCB2YWx1ZXMsIFxcdTAwMjZjb3VudCwgTlVMTCk7XFxuK1xcdFxcdGVyciA9IGVyciA/IGVycm5vIDogMDtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogT2xkZXIga2VybmVscyByZWplY3QgdGhlIGNvbW1hbmQgYmVmb3JlIHVwZGF0aW5nIGNvdW50LiBEbyBub3RcXG4rXFx0XFx0ICogaW5zcGVjdCB0aGUgYnVmZmVycyBvbiB0aGVzZSBlcnJvcnMsIG9yIGZhbGwgYmFjayBhZnRlciBwcm9ncmVzcy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChjYW5fZmFsbGJhY2sgXFx1MDAyNlxcdTAwMjYgKGVyciA9PSBFSU5WQUwgfHwgZXJyID09IEVPUE5PVFNVUFAgfHxcXG4rXFx0XFx0XFx0XFx0ICAgICBlcnIgPT0gNTI0IC8qIEVOT1RTVVBQICovKSkge1xcbitcXHRcXHRcXHRlcnIgPSBNQVBfRFVNUF9CQVRDSF9GQUxMQkFDSztcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y2FuX2ZhbGxiYWNrID0gZmFsc2U7XFxuK1xcdFxcdGlmIChlcnIgPT0gRU5PU1BDKSB7XFxuK1xcdFxcdFxcdGlmIChjYXBhY2l0eSA9PSBpbmZvLVxcdTAwM2VtYXhfZW50cmllcylcXG4rXFx0XFx0XFx0XFx0Z290byBlcnJvcjtcXG4rXFx0XFx0XFx0Y2FwYWNpdHkgKz0gbWluKGNhcGFjaXR5LCBpbmZvLVxcdTAwM2VtYXhfZW50cmllcyAtIGNhcGFjaXR5KTtcXG4rXFx0XFx0XFx0LyogUHJlc2VydmUgdGhlIGlucHV0IGN1cnNvcjogdGhlIG92ZXJzaXplZCBidWNrZXQgd2FzIG5vdCByZWFkLiAqL1xcbitcXHRcXHRcXHRnb3RvIHJlc2l6ZTtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBJbiBwYXJ0aWN1bGFyLCBFRkFVTFQgY2FuIGxlYXZlIGNvdW50IGFuZCB0aGUgYnVmZmVycyBpbnZhbGlkLiAqL1xcbitcXHRcXHRpZiAoZXJyIFxcdTAwMjZcXHUwMDI2IGVyciAhPSBFTk9FTlQpXFxuK1xcdFxcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBjb3VudDsgaSsrKSB7XFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIEtlZXAgdGhlIGFsaWdubWVudCBwcm92aWRlZCBieSBpbmRpdmlkdWFsIGxvb2t1cHMsIGluY2x1ZGluZ1xcbitcXHRcXHRcXHQgKiBmb3IgQlRGIHR5cGVzIHdob3NlIG1hcCBrZXkvdmFsdWUgc2l6ZSBpcyBub3QgYWxpZ25lZC5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdG1lbWNweShrZXksIGtleXMgKyAoc2l6ZV90KWkgKiBpbmZvLVxcdTAwM2VrZXlfc2l6ZSwgaW5mby1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRcXHRcXHRtZW1jcHkodmFsdWUsIHZhbHVlcyArIChzaXplX3QpaSAqIGluZm8tXFx1MDAzZXZhbHVlX3NpemUsIGluZm8tXFx1MDAzZXZhbHVlX3NpemUpO1xcbitcXHRcXHRcXHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7XFxuK1xcdFxcdFxcdCgqbnVtX2VsZW1zKSsrO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChlcnIgPT0gRU5PRU5UKSB7XFxuK1xcdFxcdFxcdGVyciA9IDA7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdFxcdGZpcnN0ID0gZmFsc2U7XFxuK1xcdFxcdGJhdGNoID0gbmV4dF9iYXRjaDtcXG4rXFx0fVxcbitlcnJvcjpcXG4rXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJFcnJvcjogY2FuJ3QgbG9va3VwIG1hcCBiYXRjaDogJXNcXFxcblxcXCIsIHN0cmVycm9yKGVycikpO1xcbitcXHRlcnIgPSAtMTtcXG4rb3V0OlxcbitcXHRmcmVlKGtleXMpO1xcbitcXHRmcmVlKHZhbHVlcyk7XFxuK1xcdHJldHVybiBlcnI7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcylcXG4ge1xcbiBcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG5AQCAtODY5LDYgKzk2Niw5IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxcbiBcXHRcXHRwX2luZm8oXFxcIldhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOFxcXCIsXFxuIFxcdFxcdCAgICAgICBtYXBfdHlwZV9zdHIpO1xcbiBcXHR9XFxuK1xcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXFx1MDAyNm51bV9lbGVtcyk7XFxuK1xcdGlmIChlcnIgIT0gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0spXFxuK1xcdFxcdGdvdG8gZW5kX2R1bXA7XFxuIFxcdHdoaWxlICh0cnVlKSB7XFxuIFxcdFxcdGVyciA9IGJwZl9tYXBfZ2V0X25leHRfa2V5KGZkLCBwcmV2X2tleSwga2V5KTtcXG4gXFx0XFx0aWYgKGVycikge1xcbkBAIC04ODEsNiArOTgxLDcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcdFxcdHByZXZfa2V5ID0ga2V5O1xcbiBcXHR9XFxuIFxcbitlbmRfZHVtcDpcXG4gXFx0aWYgKHd0cikge1xcbiBcXHRcXHRqc29ud19lbmRfYXJyYXkod3RyKTtcXHQvKiBlbGVtZW50cyAqL1xcbiBcXHRcXHRpZiAoc2hvd19oZWFkZXIpXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iNDIxNmVkNzc4ZWY5XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmNcXG5AQCAtMCwwICsxLDE4NyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisjaW5jbHVkZSBcXHUwMDNjdGVzdF9wcm9ncy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmdG9vbF9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnRmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NjdHlwZS5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBNQVhfRU5UUklFUyAxMDI1XFxuKyNkZWZpbmUgUkVDT1JEX1NJWkUgMjU2XFxuKyNkZWZpbmUgT1VUUFVUX1NJWkUgKE1BWF9FTlRSSUVTICogUkVDT1JEX1NJWkUgKyAxMDI0KVxcbitcXG4rc3RydWN0IGR1bXBfY2FzZSB7XFxuK1xcdGNvbnN0IGNoYXIgKm5hbWU7XFxuK1xcdHVuc2lnbmVkIGludCBjb3VudDtcXG4rXFx0dW5zaWduZWQgaW50IGtleV9zaXplO1xcbitcXHR1bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZTtcXG4rXFx0Ym9vbCBidGY7XFxuK307XFxuK1xcbitzdGF0aWMgdm9pZCBoZXhfYnl0ZXMoY2hhciAqb3V0LCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBqc29uKVxcbit7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gZGF0YTtcXG4rXFx0dW5zaWduZWQgaW50IGk7XFxuK1xcbitcXHRpZiAoanNvbilcXG4rXFx0XFx0Km91dCsrID0gJ1snO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2Mgc2l6ZTsgaSsrKSB7XFxuK1xcdFxcdGlmIChqc29uIFxcdTAwMjZcXHUwMDI2IGkpXFxuK1xcdFxcdFxcdCpvdXQrKyA9ICcsJztcXG4rXFx0XFx0b3V0ICs9IHNwcmludGYob3V0LCBqc29uID8gXFxcIlxcXFxcXFwiMHglMDJ4XFxcXFxcXCJcXFwiIDogXFxcIiUwMnhcXFwiLCBieXRlc1tpXSk7XFxuK1xcdH1cXG4rXFx0aWYgKGpzb24pXFxuK1xcdFxcdCpvdXQrKyA9ICddJztcXG4rXFx0Km91dCA9ICdcXFxcMCc7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGV4cGVjdGVkX3JlY29yZChjaGFyICpyZWNvcmQsIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsXFxuK1xcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIGJvb2wganNvbilcXG4re1xcbitcXHRfX3UzMiBrZXkgPSBpbmRleCwgdmFsdWUgPSBpbmRleCAqIDM3ICsgMTE7XFxuK1xcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7XFxuK1xcdGNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07XFxuK1xcbitcXHRoZXhfYnl0ZXMoa2V5X2hleCwgdGVzdC1cXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXFx1MDAyNnNob3J0X2tleSA6IFxcdTAwMjZrZXksXFxuK1xcdFxcdCAgdGVzdC1cXHUwMDNla2V5X3NpemUsIGpzb24pO1xcbitcXHRoZXhfYnl0ZXModmFsdWVfaGV4LCBcXHUwMDI2dmFsdWUsIHRlc3QtXFx1MDAzZXZhbHVlX3NpemUsIGpzb24pO1xcbitcXHRzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCBcXFwie1xcXFxcXFwia2V5XFxcXFxcXCI6JXUsXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOiV1fVxcXCIsXFxuK1xcdFxcdCBrZXksIHZhbHVlKTtcXG4rXFx0aWYgKGpzb24gXFx1MDAyNlxcdTAwMjYgdGVzdC1cXHUwMDNlYnRmKVxcbitcXHRcXHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLFxcbitcXHRcXHRcXHQgXFxcIntcXFxcXFxcImtleVxcXFxcXFwiOiVzLFxcXFxcXFwidmFsdWVcXFxcXFxcIjolcyxcXFxcXFxcImZvcm1hdHRlZFxcXFxcXFwiOiVzfVxcXCIsXFxuK1xcdFxcdFxcdCBrZXlfaGV4LCB2YWx1ZV9oZXgsIGZvcm1hdHRlZCk7XFxuK1xcdGVsc2UgaWYgKGpzb24pXFxuK1xcdFxcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFxcXCJ7XFxcXFxcXCJrZXlcXFxcXFxcIjolcyxcXFxcXFxcInZhbHVlXFxcXFxcXCI6JXN9XFxcIixcXG4rXFx0XFx0XFx0IGtleV9oZXgsIHZhbHVlX2hleCk7XFxuK1xcdGVsc2UgaWYgKHRlc3QtXFx1MDAzZWJ0ZilcXG4rXFx0XFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXFxcIiVzXFxcIiwgZm9ybWF0dGVkKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcXFwia2V5OiVzdmFsdWU6JXNcXFwiLCBrZXlfaGV4LCB2YWx1ZV9oZXgpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjaGVja19kdW1wKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsIF9fdTMyIGlkLCBib29sIGpzb24sIGJvb2wgcHJldHR5KVxcbit7XFxuK1xcdGJvb2wgYXJyYXkgPSBqc29uIHx8IHRlc3QtXFx1MDAzZWJ0ZjtcXG4rXFx0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBleHBlY3RlZFtSRUNPUkRfU0laRV0sIGZvb3Rlcls2NF07XFxuK1xcdGJvb2wgc2VlbltNQVhfRU5UUklFU10gPSB7fTtcXG4rXFx0Y2hhciAqb3V0cHV0LCAqc3JjLCAqZHN0LCAqY3Vyc29yO1xcbitcXHR1bnNpZ25lZCBpbnQgaSwgbjtcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdG91dHB1dCA9IGNhbGxvYygxLCBPVVRQVVRfU0laRSk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihvdXRwdXQsIFxcXCJhbGxvY19vdXRwdXRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCIlc21hcCBkdW1wIGlkICV1XFxcIixcXG4rXFx0XFx0IHByZXR0eSA/IFxcXCItcCBcXFwiIDoganNvbiA/IFxcXCItaiBcXFwiIDogXFxcIlxcXCIsIGlkKTtcXG4rXFx0ZXJyID0gZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcIm1hcF9kdW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHQvKlxcbitcXHQgKiBJZ25vcmUgcHJlc2VudGF0aW9uIHdoaXRlc3BhY2UsIGJ1dCBjb21wYXJlIGNvbXBsZXRlIHJlY29yZHMgYW5kIGFsbFxcbitcXHQgKiBwdW5jdHVhdGlvbi4gRXhwZWN0ZWQgY29udGVudHMgY29tZSBvbmx5IGZyb20gdGhlIGlucHV0IGRhdGEsIG5ldmVyXFxuK1xcdCAqIGZyb20gYW5vdGhlciBtYXAgd2FsayBvciBicGZ0b29sIGludm9jYXRpb24uXFxuK1xcdCAqL1xcbitcXHRmb3IgKHNyYyA9IG91dHB1dCwgZHN0ID0gb3V0cHV0OyAqc3JjOyBzcmMrKylcXG4rXFx0XFx0aWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxcbitcXHRcXHRcXHQqZHN0KysgPSAqc3JjO1xcbitcXHQqZHN0ID0gJ1xcXFwwJztcXG4rXFx0Y3Vyc29yID0gb3V0cHV0O1xcbitcXHRpZiAoYXJyYXkpIHtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJ1snLCBcXFwiYXJyYXlfc3RhcnRcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGN1cnNvcisrO1xcbitcXHR9XFxuK1xcdGZvciAobiA9IDA7IG4gXFx1MDAzYyB0ZXN0LVxcdTAwM2Vjb3VudDsgbisrKSB7XFxuK1xcdFxcdGlmIChhcnJheSBcXHUwMDI2XFx1MDAyNiBuKSB7XFxuK1xcdFxcdFxcdGlmICghQVNTRVJUX0VRKCpjdXJzb3IsICcsJywgXFxcInJlY29yZF9zZXBhcmF0b3JcXFwiKSlcXG4rXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdFxcdGN1cnNvcisrO1xcbitcXHRcXHR9XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyB0ZXN0LVxcdTAwM2Vjb3VudDsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmIChzZWVuW2ldKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0ZXhwZWN0ZWRfcmVjb3JkKGV4cGVjdGVkLCB0ZXN0LCBpLCBqc29uKTtcXG4rXFx0XFx0XFx0aWYgKCFzdHJuY21wKGN1cnNvciwgZXhwZWN0ZWQsIHN0cmxlbihleHBlY3RlZCkpKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LVxcdTAwM2Vjb3VudCwgXFxcInVuaXF1ZV9leHBlY3RlZF9yZWNvcmRcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHNlZW5baV0gPSB0cnVlO1xcbitcXHRcXHRjdXJzb3IgKz0gc3RybGVuKGV4cGVjdGVkKTtcXG4rXFx0fVxcbitcXHRpZiAoYXJyYXkpIHtcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKGN1cnNvciwgXFxcIl1cXFwiLCBcXFwiYXJyYXlfZW5kX2FuZF9jb3VudFxcXCIpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRzbnByaW50Zihmb290ZXIsIHNpemVvZihmb290ZXIpLCBcXFwiRm91bmQldWVsZW1lbnQlc1xcXCIsIHRlc3QtXFx1MDAzZWNvdW50LFxcbitcXHRcXHRcXHQgdGVzdC1cXHUwMDNlY291bnQgPT0gMSA/IFxcXCJcXFwiIDogXFxcInNcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKGN1cnNvciwgZm9vdGVyLCBcXFwicGxhaW5fY291bnRcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGZyZWUob3V0cHV0KTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcnVuX2R1bXBfY2FzZShjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0KVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xcbitcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0X191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XFxuK1xcdHVuc2lnbmVkIGludCBpO1xcbitcXHRpbnQgZmQgPSAtMTtcXG4rXFxuK1xcdGlmICh0ZXN0LVxcdTAwM2VidGYpIHtcXG4rXFx0XFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImJ0Zl9uZXdcXFwiKSlcXG4rXFx0XFx0XFx0cmV0dXJuO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcXFwidW5zaWduZWQgaW50XFxcIiwgNCwgMCksIDEsXFxuK1xcdFxcdFxcdCAgICAgICBcXFwiYnRmX2ludFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcXFwiYnRmX2xvYWRcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdG9wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xcbitcXHRcXHRvcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XFxuK1xcdFxcdG9wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xcbitcXHR9XFxuK1xcdGZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2JhdGNoXFxcIiwgdGVzdC1cXHUwMDNla2V5X3NpemUsXFxuK1xcdFxcdFxcdCAgICB0ZXN0LVxcdTAwM2V2YWx1ZV9zaXplLCB0ZXN0LVxcdTAwM2Vjb3VudCA/OiAxLCBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkLCBcXFwibWFwX2NyZWF0ZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRlc3QtXFx1MDAzZWNvdW50OyBpKyspIHtcXG4rXFx0XFx0X191MzIga2V5ID0gaSwgdmFsdWUgPSBpICogMzcgKyAxMTtcXG4rXFx0XFx0dW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpO1xcbitcXHRcXHR2b2lkICprZXlfcHRyID0gdGVzdC1cXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXFx1MDAyNnNob3J0X2tleSA6IFxcdTAwMjZrZXk7XFxuK1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkLCBrZXlfcHRyLCBcXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxcbitcXHRcXHRcXHQgICAgICAgXFxcIm1hcF91cGRhdGVcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXFx1MDAyNmluZm8sIFxcdTAwMjZpbmZvX2xlbiksIFxcXCJtYXBfaW5mb1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIGZhbHNlKTtcXG4rXFx0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCB0cnVlKTtcXG4rb3V0OlxcbitcXHRpZiAoZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoZmQpO1xcbitcXHRidGZfX2ZyZWUoYnRmKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2JhdGNoKHZvaWQpXFxuK3tcXG4rXFx0c3RhdGljIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgY2FzZXNbXSA9IHtcXG4rXFx0XFx0eyBcXFwiZW1wdHlcXFwiLCAwLCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcInNpbmdsZVxcXCIsIDEsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwiYmVsb3dfYmF0Y2hcXFwiLCAyNTUsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwiZXhhY3RfYmF0Y2hcXFwiLCAyNTYsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwiYWJvdmVfYmF0Y2hcXFwiLCAyNTcsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwibXVsdGlwbGVfYmF0Y2hlc1xcXCIsIDEwMjUsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwib25lX2J5dGVfa2V5XFxcIiwgMjU2LCAxLCA0IH0sXFxuK1xcdFxcdHsgXFxcIm9kZF92YWx1ZV9zaXplXFxcIiwgMjU3LCA0LCAzIH0sXFxuK1xcdFxcdHsgXFxcImJ0Zl9lbXB0eVxcXCIsIDAsIDQsIDQsIHRydWUgfSxcXG4rXFx0XFx0eyBcXFwiYnRmX3NpbmdsZVxcXCIsIDEsIDQsIDQsIHRydWUgfSxcXG4rXFx0XFx0eyBcXFwiYnRmX211bHRpcGxlX2JhdGNoZXNcXFwiLCAxMDI1LCA0LCA0LCB0cnVlIH0sXFxuK1xcdH07XFxuK1xcdHVuc2lnbmVkIGludCBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoY2FzZXMpOyBpKyspXFxuK1xcdFxcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KGNhc2VzW2ldLm5hbWUpKVxcbitcXHRcXHRcXHRydW5fZHVtcF9jYXNlKFxcdTAwMjZjYXNlc1tpXSk7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDQ6MDM6MDQuNzkxNjQ3ODE0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo3MDI4ODI1Njg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2UgdXRpbGl0aWVzIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCBzZWxmdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgKHZtbGludXggb3Iga2VybmVsIG1vZHVsZXMpLCBzbyBpdCBpcyBub3QgZnV6emFibGUgYnkgc3l6a2FsbGVyLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA4ODE3MDRlZTBhM2NmMTUzYTVjMWRhYzdjOTQ0NThmNjdhODcwYTBlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDQ6MDM6MDEgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li45NzFkYTE3MzYwMGE3IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5AQCAtNzQwLDE1ICs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdHJldHVybiBlcnJubyA9PSBFTk9FTlQgPyAwIDogLTE7XG4gfVxuIFxuLXN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4tXHRcdFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4tXHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4rc3RhdGljIHZvaWQgcHJpbnRfbWFwX2VsZW0odm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbitcdFx0XHQgICBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCAgIGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4ge1xuLVx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4tXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbi1cdFx0cmV0dXJuIC0xO1xuLVx0fVxuLVxuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7XG4gXHR9IGVsc2UgaWYgKGJ0Zikge1xuQEAgLTc2MiwxMCArNzU3LDExMiBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0fSBlbHNlIHtcbiBcdFx0cHJpbnRfZW50cnlfcGxhaW4obWFwX2luZm8sIGtleSwgdmFsdWUpO1xuIFx0fVxuK31cbitcbitzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuK1x0XHRcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuK3tcbitcdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xuK1x0XHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbiBcbitcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIG1hcF9pbmZvLCBidGYsIGJ0Zl93dHIpO1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuKyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgMVxuKyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfU0laRSAyNTZVXG4rI2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNClcbitcbisvKiBSZXR1cm4gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgb25seSBiZWZvcmUgYmF0Y2ggdHJhdmVyc2FsIHN0YXJ0cy4gKi9cbitzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbitcdFx0XHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHQgIGpzb25fd3JpdGVyX3QgKnd0ciwgdW5zaWduZWQgaW50ICpudW1fZWxlbXMpXG4re1xuK1x0X191MzIgY2FwYWNpdHksIGNvdW50LCBiYXRjaCA9IDAsIG5leHRfYmF0Y2ggPSAwLCBpO1xuK1x0dm9pZCAqa2V5cyA9IE5VTEwsICp2YWx1ZXMgPSBOVUxMLCAqYnVmO1xuK1x0Ym9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7XG4rXHRpbnQgZXJyO1xuK1xuK1x0LypcbitcdCAqIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlXG4rXHQgKiBvcHRpbWl6YXRpb24gdG8gbWFwcyB3aG9zZSB3b3JzdC1jYXNlIGJ1Y2tldCBmaXRzIHRoZSBtZW1vcnkgYnVkZ2V0LFxuK1x0ICogc28gYSBsYXRlciBFTk9TUEMgbmV2ZXIgZm9yY2VzIGEgcmVzdGFydCBhZnRlciBwcmludGluZyBzb21lIGVudHJpZXMuXG4rXHQgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLlxuK1x0ICovXG4rXHRpZiAoaW5mby1cdTAwM2V0eXBlICE9IEJQRl9NQVBfVFlQRV9IQVNIIHx8ICFpbmZvLVx1MDAzZW1heF9lbnRyaWVzIHx8XG4rXHQgICAgKF9fdTY0KWluZm8tXHUwMDNla2V5X3NpemUgKyBpbmZvLVx1MDAzZXZhbHVlX3NpemUgXHUwMDNlXG4rXHQgICAgTUFQX0RVTVBfQkFUQ0hfTUFYX0JZVEVTIC8gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbitcdFx0cmV0dXJuIE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLO1xuK1xuK1x0Y2FwYWNpdHkgPSBtaW4oaW5mby1cdTAwM2VtYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7XG4rcmVzaXplOlxuK1x0YnVmID0gcmVhbGxvYyhrZXlzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRpZiAoIWJ1Zikge1xuK1x0XHRlcnIgPSBFTk9NRU07XG4rXHRcdGdvdG8gZXJyb3I7XG4rXHR9XG4rXHRrZXlzID0gYnVmO1xuK1x0YnVmID0gcmVhbGxvYyh2YWx1ZXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xuK1x0aWYgKCFidWYpIHtcbitcdFx0ZXJyID0gRU5PTUVNO1xuK1x0XHRnb3RvIGVycm9yO1xuK1x0fVxuK1x0dmFsdWVzID0gYnVmO1xuK1xuK1x0d2hpbGUgKHRydWUpIHtcbitcdFx0Y291bnQgPSBjYXBhY2l0eTtcbitcdFx0ZXJyID0gYnBmX21hcF9sb29rdXBfYmF0Y2goZmQsIGZpcnN0ID8gTlVMTCA6IFx1MDAyNmJhdGNoLFxuK1x0XHRcdFx0XHQgICBcdTAwMjZuZXh0X2JhdGNoLCBrZXlzLCB2YWx1ZXMsIFx1MDAyNmNvdW50LCBOVUxMKTtcbitcdFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xuK1x0XHQvKlxuK1x0XHQgKiBPbGRlciBrZXJuZWxzIHJlamVjdCB0aGUgY29tbWFuZCBiZWZvcmUgdXBkYXRpbmcgY291bnQuIERvIG5vdFxuK1x0XHQgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLlxuK1x0XHQgKi9cbitcdFx0aWYgKGNhbl9mYWxsYmFjayBcdTAwMjZcdTAwMjYgKGVyciA9PSBFSU5WQUwgfHwgZXJyID09IEVPUE5PVFNVUFAgfHxcbitcdFx0XHRcdCAgICAgZXJyID09IDUyNCAvKiBFTk9UU1VQUCAqLykpIHtcbitcdFx0XHRlcnIgPSBNQVBfRFVNUF9CQVRDSF9GQUxMQkFDSztcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRjYW5fZmFsbGJhY2sgPSBmYWxzZTtcbitcdFx0aWYgKGVyciA9PSBFTk9TUEMpIHtcbitcdFx0XHRpZiAoY2FwYWNpdHkgPT0gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbitcdFx0XHRcdGdvdG8gZXJyb3I7XG4rXHRcdFx0Y2FwYWNpdHkgKz0gbWluKGNhcGFjaXR5LCBpbmZvLVx1MDAzZW1heF9lbnRyaWVzIC0gY2FwYWNpdHkpO1xuK1x0XHRcdC8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi9cbitcdFx0XHRnb3RvIHJlc2l6ZTtcbitcdFx0fVxuK1x0XHQvKiBJbiBwYXJ0aWN1bGFyLCBFRkFVTFQgY2FuIGxlYXZlIGNvdW50IGFuZCB0aGUgYnVmZmVycyBpbnZhbGlkLiAqL1xuK1x0XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gRU5PRU5UKVxuK1x0XHRcdGdvdG8gZXJyb3I7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNvdW50OyBpKyspIHtcbitcdFx0XHQvKlxuK1x0XHRcdCAqIEtlZXAgdGhlIGFsaWdubWVudCBwcm92aWRlZCBieSBpbmRpdmlkdWFsIGxvb2t1cHMsIGluY2x1ZGluZ1xuK1x0XHRcdCAqIGZvciBCVEYgdHlwZXMgd2hvc2UgbWFwIGtleS92YWx1ZSBzaXplIGlzIG5vdCBhbGlnbmVkLlxuK1x0XHRcdCAqL1xuK1x0XHRcdG1lbWNweShrZXksIGtleXMgKyAoc2l6ZV90KWkgKiBpbmZvLVx1MDAzZWtleV9zaXplLCBpbmZvLVx1MDAzZWtleV9zaXplKTtcbitcdFx0XHRtZW1jcHkodmFsdWUsIHZhbHVlcyArIChzaXplX3QpaSAqIGluZm8tXHUwMDNldmFsdWVfc2l6ZSwgaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbitcdFx0XHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7XG4rXHRcdFx0KCpudW1fZWxlbXMpKys7XG4rXHRcdH1cbitcdFx0aWYgKGVyciA9PSBFTk9FTlQpIHtcbitcdFx0XHRlcnIgPSAwO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXHRcdGZpcnN0ID0gZmFsc2U7XG4rXHRcdGJhdGNoID0gbmV4dF9iYXRjaDtcbitcdH1cbitlcnJvcjpcbitcdGZwcmludGYoc3RkZXJyLCBcIkVycm9yOiBjYW4ndCBsb29rdXAgbWFwIGJhdGNoOiAlc1xcblwiLCBzdHJlcnJvcihlcnIpKTtcbitcdGVyciA9IC0xO1xuK291dDpcbitcdGZyZWUoa2V5cyk7XG4rXHRmcmVlKHZhbHVlcyk7XG4rXHRyZXR1cm4gZXJyO1xuK31cbitcbiBzdGF0aWMgaW50IG1hcHNfaGF2ZV9idGYoaW50ICpmZHMsIGludCBuYl9mZHMpXG4ge1xuIFx0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG5AQCAtODY5LDYgKzk2Niw5IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRwX2luZm8oXCJXYXJuaW5nOiBjYW5ub3QgcmVhZCB2YWx1ZXMgZnJvbSAlcyBtYXAgd2l0aCB2YWx1ZV9zaXplICE9IDhcIixcbiBcdFx0ICAgICAgIG1hcF90eXBlX3N0cik7XG4gXHR9XG4rXHRlcnIgPSBkdW1wX21hcF9iYXRjaChmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIsIFx1MDAyNm51bV9lbGVtcyk7XG4rXHRpZiAoZXJyICE9IE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLKVxuK1x0XHRnb3RvIGVuZF9kdW1wO1xuIFx0d2hpbGUgKHRydWUpIHtcbiBcdFx0ZXJyID0gYnBmX21hcF9nZXRfbmV4dF9rZXkoZmQsIHByZXZfa2V5LCBrZXkpO1xuIFx0XHRpZiAoZXJyKSB7XG5AQCAtODgxLDYgKzk4MSw3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRwcmV2X2tleSA9IGtleTtcbiBcdH1cbiBcbitlbmRfZHVtcDpcbiBcdGlmICh3dHIpIHtcbiBcdFx0anNvbndfZW5kX2FycmF5KHd0cik7XHQvKiBlbGVtZW50cyAqL1xuIFx0XHRpZiAoc2hvd19oZWFkZXIpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iNDIxNmVkNzc4ZWY5XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXG5AQCAtMCwwICsxLDE4NyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmdG9vbF9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NjdHlwZS5oXHUwMDNlXG4rXG4rI2RlZmluZSBNQVhfRU5UUklFUyAxMDI1XG4rI2RlZmluZSBSRUNPUkRfU0laRSAyNTZcbisjZGVmaW5lIE9VVFBVVF9TSVpFIChNQVhfRU5UUklFUyAqIFJFQ09SRF9TSVpFICsgMTAyNClcbitcbitzdHJ1Y3QgZHVtcF9jYXNlIHtcbitcdGNvbnN0IGNoYXIgKm5hbWU7XG4rXHR1bnNpZ25lZCBpbnQgY291bnQ7XG4rXHR1bnNpZ25lZCBpbnQga2V5X3NpemU7XG4rXHR1bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZTtcbitcdGJvb2wgYnRmO1xuK307XG4rXG4rc3RhdGljIHZvaWQgaGV4X2J5dGVzKGNoYXIgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wganNvbilcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IGRhdGE7XG4rXHR1bnNpZ25lZCBpbnQgaTtcbitcbitcdGlmIChqc29uKVxuK1x0XHQqb3V0KysgPSAnWyc7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplOyBpKyspIHtcbitcdFx0aWYgKGpzb24gXHUwMDI2XHUwMDI2IGkpXG4rXHRcdFx0Km91dCsrID0gJywnO1xuK1x0XHRvdXQgKz0gc3ByaW50ZihvdXQsIGpzb24gPyBcIlxcXCIweCUwMnhcXFwiXCIgOiBcIiUwMnhcIiwgYnl0ZXNbaV0pO1xuK1x0fVxuK1x0aWYgKGpzb24pXG4rXHRcdCpvdXQrKyA9ICddJztcbitcdCpvdXQgPSAnXFwwJztcbit9XG4rXG4rc3RhdGljIHZvaWQgZXhwZWN0ZWRfcmVjb3JkKGNoYXIgKnJlY29yZCwgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCxcbitcdFx0XHQgICAgdW5zaWduZWQgaW50IGluZGV4LCBib29sIGpzb24pXG4re1xuK1x0X191MzIga2V5ID0gaW5kZXgsIHZhbHVlID0gaW5kZXggKiAzNyArIDExO1xuK1x0dW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpbmRleDtcbitcdGNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07XG4rXG4rXHRoZXhfYnl0ZXMoa2V5X2hleCwgdGVzdC1cdTAwM2VrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKilcdTAwMjZzaG9ydF9rZXkgOiBcdTAwMjZrZXksXG4rXHRcdCAgdGVzdC1cdTAwM2VrZXlfc2l6ZSwganNvbik7XG4rXHRoZXhfYnl0ZXModmFsdWVfaGV4LCBcdTAwMjZ2YWx1ZSwgdGVzdC1cdTAwM2V2YWx1ZV9zaXplLCBqc29uKTtcbitcdHNucHJpbnRmKGZvcm1hdHRlZCwgc2l6ZW9mKGZvcm1hdHRlZCksIFwie1xcXCJrZXlcXFwiOiV1LFxcXCJ2YWx1ZVxcXCI6JXV9XCIsXG4rXHRcdCBrZXksIHZhbHVlKTtcbitcdGlmIChqc29uIFx1MDAyNlx1MDAyNiB0ZXN0LVx1MDAzZWJ0ZilcbitcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSxcbitcdFx0XHQgXCJ7XFxcImtleVxcXCI6JXMsXFxcInZhbHVlXFxcIjolcyxcXFwiZm9ybWF0dGVkXFxcIjolc31cIixcbitcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpO1xuK1x0ZWxzZSBpZiAoanNvbilcbitcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXCJ7XFxcImtleVxcXCI6JXMsXFxcInZhbHVlXFxcIjolc31cIixcbitcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4KTtcbitcdGVsc2UgaWYgKHRlc3QtXHUwMDNlYnRmKVxuK1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcIiVzXCIsIGZvcm1hdHRlZCk7XG4rXHRlbHNlXG4rXHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwia2V5OiVzdmFsdWU6JXNcIiwga2V5X2hleCwgdmFsdWVfaGV4KTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY2hlY2tfZHVtcChjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LCBfX3UzMiBpZCwgYm9vbCBqc29uLCBib29sIHByZXR0eSlcbit7XG4rXHRib29sIGFycmF5ID0ganNvbiB8fCB0ZXN0LVx1MDAzZWJ0ZjtcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgZXhwZWN0ZWRbUkVDT1JEX1NJWkVdLCBmb290ZXJbNjRdO1xuK1x0Ym9vbCBzZWVuW01BWF9FTlRSSUVTXSA9IHt9O1xuK1x0Y2hhciAqb3V0cHV0LCAqc3JjLCAqZHN0LCAqY3Vyc29yO1xuK1x0dW5zaWduZWQgaW50IGksIG47XG4rXHRpbnQgZXJyO1xuK1xuK1x0b3V0cHV0ID0gY2FsbG9jKDEsIE9VVFBVVF9TSVpFKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihvdXRwdXQsIFwiYWxsb2Nfb3V0cHV0XCIpKVxuK1x0XHRyZXR1cm47XG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiJXNtYXAgZHVtcCBpZCAldVwiLFxuK1x0XHQgcHJldHR5ID8gXCItcCBcIiA6IGpzb24gPyBcIi1qIFwiIDogXCJcIiwgaWQpO1xuK1x0ZXJyID0gZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwibWFwX2R1bXBcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0LypcbitcdCAqIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsXG4rXHQgKiBwdW5jdHVhdGlvbi4gRXhwZWN0ZWQgY29udGVudHMgY29tZSBvbmx5IGZyb20gdGhlIGlucHV0IGRhdGEsIG5ldmVyXG4rXHQgKiBmcm9tIGFub3RoZXIgbWFwIHdhbGsgb3IgYnBmdG9vbCBpbnZvY2F0aW9uLlxuK1x0ICovXG4rXHRmb3IgKHNyYyA9IG91dHB1dCwgZHN0ID0gb3V0cHV0OyAqc3JjOyBzcmMrKylcbitcdFx0aWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuK1x0XHRcdCpkc3QrKyA9ICpzcmM7XG4rXHQqZHN0ID0gJ1xcMCc7XG4rXHRjdXJzb3IgPSBvdXRwdXQ7XG4rXHRpZiAoYXJyYXkpIHtcbitcdFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJ1snLCBcImFycmF5X3N0YXJ0XCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRjdXJzb3IrKztcbitcdH1cbitcdGZvciAobiA9IDA7IG4gXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IG4rKykge1xuK1x0XHRpZiAoYXJyYXkgXHUwMDI2XHUwMDI2IG4pIHtcbitcdFx0XHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAnLCcsIFwicmVjb3JkX3NlcGFyYXRvclwiKSlcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdGN1cnNvcisrO1xuK1x0XHR9XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRcdGlmIChzZWVuW2ldKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0ZXhwZWN0ZWRfcmVjb3JkKGV4cGVjdGVkLCB0ZXN0LCBpLCBqc29uKTtcbitcdFx0XHRpZiAoIXN0cm5jbXAoY3Vyc29yLCBleHBlY3RlZCwgc3RybGVuKGV4cGVjdGVkKSkpXG4rXHRcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LVx1MDAzZWNvdW50LCBcInVuaXF1ZV9leHBlY3RlZF9yZWNvcmRcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHNlZW5baV0gPSB0cnVlO1xuK1x0XHRjdXJzb3IgKz0gc3RybGVuKGV4cGVjdGVkKTtcbitcdH1cbitcdGlmIChhcnJheSkge1xuK1x0XHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBcIl1cIiwgXCJhcnJheV9lbmRfYW5kX2NvdW50XCIpO1xuK1x0fSBlbHNlIHtcbitcdFx0c25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgXCJGb3VuZCV1ZWxlbWVudCVzXCIsIHRlc3QtXHUwMDNlY291bnQsXG4rXHRcdFx0IHRlc3QtXHUwMDNlY291bnQgPT0gMSA/IFwiXCIgOiBcInNcIik7XG4rXHRcdEFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgXCJwbGFpbl9jb3VudFwiKTtcbitcdH1cbitvdXQ6XG4rXHRmcmVlKG91dHB1dCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJ1bl9kdW1wX2Nhc2UoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuK1x0X191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7XG4rXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXHRpbnQgZmQgPSAtMTtcbitcbitcdGlmICh0ZXN0LVx1MDAzZWJ0Zikge1xuK1x0XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImJ0Zl9uZXdcIikpXG4rXHRcdFx0cmV0dXJuO1xuK1x0XHRpZiAoIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcInVuc2lnbmVkIGludFwiLCA0LCAwKSwgMSxcbitcdFx0XHQgICAgICAgXCJidGZfaW50XCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcImJ0Zl9sb2FkXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbitcdFx0b3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xuK1x0XHRvcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcbitcdH1cbitcdGZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwiZHVtcF9iYXRjaFwiLCB0ZXN0LVx1MDAzZWtleV9zaXplLFxuK1x0XHRcdCAgICB0ZXN0LVx1MDAzZXZhbHVlX3NpemUsIHRlc3QtXHUwMDNlY291bnQgPzogMSwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCJtYXBfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyArIDExO1xuK1x0XHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGk7XG4rXHRcdHZvaWQgKmtleV9wdHIgPSB0ZXN0LVx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVx1MDAyNnNob3J0X2tleSA6IFx1MDAyNmtleTtcbitcbitcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcIm1hcF91cGRhdGVcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZpbmZvX2xlbiksIFwibWFwX2luZm9cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCBmYWxzZSwgZmFsc2UpO1xuK1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7XG4rXHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIHRydWUpO1xuK291dDpcbitcdGlmIChmZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkKTtcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbit2b2lkIHRlc3RfYnBmdG9vbF9tYXBfYmF0Y2godm9pZClcbit7XG4rXHRzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSBjYXNlc1tdID0ge1xuK1x0XHR7IFwiZW1wdHlcIiwgMCwgNCwgNCB9LFxuK1x0XHR7IFwic2luZ2xlXCIsIDEsIDQsIDQgfSxcbitcdFx0eyBcImJlbG93X2JhdGNoXCIsIDI1NSwgNCwgNCB9LFxuK1x0XHR7IFwiZXhhY3RfYmF0Y2hcIiwgMjU2LCA0LCA0IH0sXG4rXHRcdHsgXCJhYm92ZV9iYXRjaFwiLCAyNTcsIDQsIDQgfSxcbitcdFx0eyBcIm11bHRpcGxlX2JhdGNoZXNcIiwgMTAyNSwgNCwgNCB9LFxuK1x0XHR7IFwib25lX2J5dGVfa2V5XCIsIDI1NiwgMSwgNCB9LFxuK1x0XHR7IFwib2RkX3ZhbHVlX3NpemVcIiwgMjU3LCA0LCAzIH0sXG4rXHRcdHsgXCJidGZfZW1wdHlcIiwgMCwgNCwgNCwgdHJ1ZSB9LFxuK1x0XHR7IFwiYnRmX3NpbmdsZVwiLCAxLCA0LCA0LCB0cnVlIH0sXG4rXHRcdHsgXCJidGZfbXVsdGlwbGVfYmF0Y2hlc1wiLCAxMDI1LCA0LCA0LCB0cnVlIH0sXG4rXHR9O1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGNhc2VzKTsgaSsrKVxuK1x0XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChjYXNlc1tpXS5uYW1lKSlcbitcdFx0XHRydW5fZHVtcF9jYXNlKFx1MDAyNmNhc2VzW2ldKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwNDowMzowNC43OTE2NDk0MDRaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3MDI4ODAzMjU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlRyaWFnZSBEZWNpc2lvbjogV29ydGhGdXp6aW5nID0gRmFsc2UqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoZSBwYXRjaCBkaWZmIGluZGljYXRlcyBjaGFuZ2VzIHRvIGB0b29scy9icGYvYnBmdG9vbC9tYXAuY2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhlc2UgYXJlIGxpa2VseSBub24ta2VybmVsIGFuZCB1c2VyLXNwYWNlIGNoYW5nZXMsIGJ1dCBsZXQncyBiZSB0aG9yb3VnaC5cblxuRmlyc3QsIEknbGwgcXVpY2tseSBjb25zdWx0IHRoZSB0cmlhZ2UgcnVsZXMuIFdlJ3JlIGxvb2tpbmcgZm9yIG1vZGlmaWNhdGlvbnMgdGhhdCBmYWxsIHVuZGVyIHRoZSBcIk5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXNcIiBjYXRlZ29yeS4gVGhpcyBtZWFucyBmb2N1c2luZyBvbiBjaGFuZ2VzIHRvIGRvY3VtZW50YXRpb24sIGNvbW1lbnRzLCBzcGVsbGluZywgb3IgdXNlci1zcGFjZSBkaXJlY3RvcmllcyBsaWtlIGB0b29scy9gLCBgc2FtcGxlcy9gLCBgc2NyaXB0cy9gLCBhbmQgYHVzci9gICp0aGF0KiBkb24ndCBpbXBhY3QgdGhlIGtlcm5lbCBpbWFnZSBvciBtb2R1bGVzLlxuXG5JJ3ZlIGdvdCBib3RoIGZpbGVzIGluIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnkuIEdpdmVuIG15IGV4cGVyaWVuY2UsIEknbSBjb25maWRlbnQgdGhleSdyZSB1c2VyLXNwYWNlLiBKdXN0IHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiwgSSdsbCBtZW50YWxseSBkb3VibGUtY2hlY2sgdGhlIGRpZmYgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBvdGhlciB1bmV4cGVjdGVkIGZpbGVzIGluIHRoZSBjaGFuZ2Ugc2V0LiBOb3BlLCB0aGUgZGlmZiBjb25maXJtcyBpdCdzIG9ubHkgdGhlc2UgdHdvIGZpbGVzLlxuXG5Ob3csIGxldCdzIG1hdGNoIHRoaXMgdXAgd2l0aCB0aGUgY3JpdGVyaWEuIFRoZSByZXF1aXJlbWVudHMgc3BlY2lmaWNhbGx5IHNheSBcIlJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXMuLi5cIiBhbmQgaXQgcGVyZmVjdGx5IGRlc2NyaWJlcyB0aGUgY2hhbmdlczogdXNlci1zcGFjZSBgdG9vbHMvYCBkaXJlY3RvcnkgZmlsZXMgYW5kIHNlbGZ0ZXN0cyB3aGljaCBoYXZlIHplcm8gZWZmZWN0IG9uIHRoZSBrZXJuZWwuXG5cblRoZXJlZm9yZSwgZ2l2ZW4gdGhhdCBhbGwgY2hhbmdlcyBhcmUgY29uZmluZWQgdG8gdXNlci1zcGFjZSB0b29scyBhbmQgdGVzdHMsIGBXb3J0aEZ1enppbmdgIHNob3VsZCBkZWZpbml0ZWx5IGJlIGBmYWxzZWAuIGBGb2N1c1N5bWJvbHNgIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBhcyB0aGVyZSdzIG5vdGhpbmcga2VybmVsLXJlbGF0ZWQgaGVyZSwgYW5kIGxpa2V3aXNlLCBgRW5hYmxlQ29uZmlnc2Agd2lsbCBhbHNvIGJlIGVtcHR5LlxuXG5UaGUgY29uY2lzZSByZWFzb25pbmcgaXM6IFwiVGhlIHBhdGNoIG9ubHkgdG91Y2hlcyB1c2VyLXNwYWNlIHRvb2xzIChgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgKSBhbmQgc2VsZnRlc3RzIChgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY2ApLCB3aGljaCBkbyBub3QgbW9kaWZ5IHRoZSBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiXG5cbkFscmlnaHQsIHRpbWUgdG8gc2V0IHRoZSByZXN1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MDM3LCJPdXRwdXRUb2tlbnMiOjkwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTQ3LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDQ6MDM6MTEuODIwNDU0ODg5WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjU5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2UgdXRpbGl0aWVzIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCBzZWxmdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgKHZtbGludXggb3Iga2VybmVsIG1vZHVsZXMpLCBzbyBpdCBpcyBub3QgZnV6emFibGUgYnkgc3l6a2FsbGVyLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHV0aWxpdGllcyBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlICh2bWxpbnV4IG9yIGtlcm5lbCBtb2R1bGVzKSwgc28gaXQgaXMgbm90IGZ1enphYmxlIGJ5IHN5emthbGxlci5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDA0OjAzOjExLjgyMDQ3NTU5OVoiLCJTZXEiOjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowx628w[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-11 03:59:28 +0000 UTC FinishedAt: 2026-09-11 04:03:12 +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+CgkJCTx0ZD4yMDI2LzA5LzExIDA0OjAzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHV0aWxpdGllcyBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlICh2bWxpbnV4IG9yIGtlcm5lbCBtb2R1bGVzKSwgc28gaXQgaXMgbm90IGZ1enphYmxlIGJ5IHN5emthbGxlci4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDQ6MDM8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA4ODE3MDRlZTBhM2NmMTUzYTVjMWRhYzdjOTQ0NThmNjdhODcwYTBlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDQ6MDM6MDEgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuaW5kZXggNjg0YThmYjcyNDE0Ni4uOTcxZGExNzM2MDBhNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuQEAgLTc0MCwxNSAmIzQzOzc0MCwxMCBAQCBzdGF0aWMgaW50IGRvX3Nob3coaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0cmV0dXJuIGVycm5vID09IEVOT0VOVCA/IDAgOiAtMTtcbiB9XG4gXG4tc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbi1cdFx0XHQgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0Zixcbi1cdFx0XHQganNvbl93cml0ZXJfdCAqYnRmX3d0cilcbiYjNDM7c3RhdGljIHZvaWQgcHJpbnRfbWFwX2VsZW0odm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiYjNDM7XHRcdFx0ICAgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcbiYjNDM7XHRcdFx0ICAganNvbl93cml0ZXJfdCAqYnRmX3d0cilcbiB7XG4tXHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcbi1cdFx0cHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pO1xuLVx0XHRyZXR1cm4gLTE7XG4tXHR9XG4tXG4gXHRpZiAoanNvbl9vdXRwdXQpIHtcbiBcdFx0cHJpbnRfZW50cnlfanNvbihtYXBfaW5mbywga2V5LCB2YWx1ZSwgYnRmKTtcbiBcdH0gZWxzZSBpZiAoYnRmKSB7XG5AQCAtNzYyLDEwICYjNDM7NzU3LDExMiBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0fSBlbHNlIHtcbiBcdFx0cHJpbnRfZW50cnlfcGxhaW4obWFwX2luZm8sIGtleSwgdmFsdWUpO1xuIFx0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuJiM0MztcdFx0XHQgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcbiYjNDM7XHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4mIzQzO3tcbiYjNDM7XHRpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHtcbiYjNDM7XHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4gXG4mIzQzO1x0cHJpbnRfbWFwX2VsZW0oa2V5LCB2YWx1ZSwgbWFwX2luZm8sIGJ0ZiwgYnRmX3d0cik7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4mIzQzOyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgMVxuJiM0MzsjZGVmaW5lIE1BUF9EVU1QX0JBVENIX1NJWkUgMjU2VVxuJiM0MzsjZGVmaW5lIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAoNCAqIDEwMjQgKiAxMDI0KVxuJiM0MztcbiYjNDM7LyogUmV0dXJuIE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLIG9ubHkgYmVmb3JlIGJhdGNoIHRyYXZlcnNhbCBzdGFydHMuICovXG4mIzQzO3N0YXRpYyBpbnQgZHVtcF9tYXBfYmF0Y2goaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuJiM0MztcdFx0XHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcbiYjNDM7XHRcdFx0ICBqc29uX3dyaXRlcl90ICp3dHIsIHVuc2lnbmVkIGludCAqbnVtX2VsZW1zKVxuJiM0Mzt7XG4mIzQzO1x0X191MzIgY2FwYWNpdHksIGNvdW50LCBiYXRjaCA9IDAsIG5leHRfYmF0Y2ggPSAwLCBpO1xuJiM0MztcdHZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjtcbiYjNDM7XHRib29sIGZpcnN0ID0gdHJ1ZSwgY2FuX2ZhbGxiYWNrID0gdHJ1ZTtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlXG4mIzQzO1x0ICogb3B0aW1pemF0aW9uIHRvIG1hcHMgd2hvc2Ugd29yc3QtY2FzZSBidWNrZXQgZml0cyB0aGUgbWVtb3J5IGJ1ZGdldCxcbiYjNDM7XHQgKiBzbyBhIGxhdGVyIEVOT1NQQyBuZXZlciBmb3JjZXMgYSByZXN0YXJ0IGFmdGVyIHByaW50aW5nIHNvbWUgZW50cmllcy5cbiYjNDM7XHQgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChpbmZvLVx1MDAzZXR5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tXHUwMDNlbWF4X2VudHJpZXMgfHxcbiYjNDM7XHQgICAgKF9fdTY0KWluZm8tXHUwMDNla2V5X3NpemUgJiM0MzsgaW5mby1cdTAwM2V2YWx1ZV9zaXplIFx1MDAzZVxuJiM0MztcdCAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLVx1MDAzZW1heF9lbnRyaWVzKVxuJiM0MztcdFx0cmV0dXJuIE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLO1xuJiM0MztcbiYjNDM7XHRjYXBhY2l0eSA9IG1pbihpbmZvLVx1MDAzZW1heF9lbnRyaWVzLCBNQVBfRFVNUF9CQVRDSF9TSVpFKTtcbiYjNDM7cmVzaXplOlxuJiM0MztcdGJ1ZiA9IHJlYWxsb2Moa2V5cywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdGlmICghYnVmKSB7XG4mIzQzO1x0XHRlcnIgPSBFTk9NRU07XG4mIzQzO1x0XHRnb3RvIGVycm9yO1xuJiM0MztcdH1cbiYjNDM7XHRrZXlzID0gYnVmO1xuJiM0MztcdGJ1ZiA9IHJlYWxsb2ModmFsdWVzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbiYjNDM7XHRpZiAoIWJ1Zikge1xuJiM0MztcdFx0ZXJyID0gRU5PTUVNO1xuJiM0MztcdFx0Z290byBlcnJvcjtcbiYjNDM7XHR9XG4mIzQzO1x0dmFsdWVzID0gYnVmO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAodHJ1ZSkge1xuJiM0MztcdFx0Y291bnQgPSBjYXBhY2l0eTtcbiYjNDM7XHRcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcdTAwMjZiYXRjaCxcbiYjNDM7XHRcdFx0XHRcdCAgIFx1MDAyNm5leHRfYmF0Y2gsIGtleXMsIHZhbHVlcywgXHUwMDI2Y291bnQsIE5VTEwpO1xuJiM0MztcdFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIE9sZGVyIGtlcm5lbHMgcmVqZWN0IHRoZSBjb21tYW5kIGJlZm9yZSB1cGRhdGluZyBjb3VudC4gRG8gbm90XG4mIzQzO1x0XHQgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoY2FuX2ZhbGxiYWNrIFx1MDAyNlx1MDAyNiAoZXJyID09IEVJTlZBTCB8fCBlcnIgPT0gRU9QTk9UU1VQUCB8fFxuJiM0MztcdFx0XHRcdCAgICAgZXJyID09IDUyNCAvKiBFTk9UU1VQUCAqLykpIHtcbiYjNDM7XHRcdFx0ZXJyID0gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0s7XG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0Y2FuX2ZhbGxiYWNrID0gZmFsc2U7XG4mIzQzO1x0XHRpZiAoZXJyID09IEVOT1NQQykge1xuJiM0MztcdFx0XHRpZiAoY2FwYWNpdHkgPT0gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbiYjNDM7XHRcdFx0XHRnb3RvIGVycm9yO1xuJiM0MztcdFx0XHRjYXBhY2l0eSAmIzQzOz0gbWluKGNhcGFjaXR5LCBpbmZvLVx1MDAzZW1heF9lbnRyaWVzIC0gY2FwYWNpdHkpO1xuJiM0MztcdFx0XHQvKiBQcmVzZXJ2ZSB0aGUgaW5wdXQgY3Vyc29yOiB0aGUgb3ZlcnNpemVkIGJ1Y2tldCB3YXMgbm90IHJlYWQuICovXG4mIzQzO1x0XHRcdGdvdG8gcmVzaXplO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0LyogSW4gcGFydGljdWxhciwgRUZBVUxUIGNhbiBsZWF2ZSBjb3VudCBhbmQgdGhlIGJ1ZmZlcnMgaW52YWxpZC4gKi9cbiYjNDM7XHRcdGlmIChlcnIgXHUwMDI2XHUwMDI2IGVyciAhPSBFTk9FTlQpXG4mIzQzO1x0XHRcdGdvdG8gZXJyb3I7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogS2VlcCB0aGUgYWxpZ25tZW50IHByb3ZpZGVkIGJ5IGluZGl2aWR1YWwgbG9va3VwcywgaW5jbHVkaW5nXG4mIzQzO1x0XHRcdCAqIGZvciBCVEYgdHlwZXMgd2hvc2UgbWFwIGtleS92YWx1ZSBzaXplIGlzIG5vdCBhbGlnbmVkLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0bWVtY3B5KGtleSwga2V5cyAmIzQzOyAoc2l6ZV90KWkgKiBpbmZvLVx1MDAzZWtleV9zaXplLCBpbmZvLVx1MDAzZWtleV9zaXplKTtcbiYjNDM7XHRcdFx0bWVtY3B5KHZhbHVlLCB2YWx1ZXMgJiM0MzsgKHNpemVfdClpICogaW5mby1cdTAwM2V2YWx1ZV9zaXplLCBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xuJiM0MztcdFx0XHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7XG4mIzQzO1x0XHRcdCgqbnVtX2VsZW1zKSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoZXJyID09IEVOT0VOVCkge1xuJiM0MztcdFx0XHRlcnIgPSAwO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGZpcnN0ID0gZmFsc2U7XG4mIzQzO1x0XHRiYXRjaCA9IG5leHRfYmF0Y2g7XG4mIzQzO1x0fVxuJiM0MztlcnJvcjpcbiYjNDM7XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7RXJyb3I6IGNhbiYjMzk7dCBsb29rdXAgbWFwIGJhdGNoOiAlc1xcblwmIzM0Oywgc3RyZXJyb3IoZXJyKSk7XG4mIzQzO1x0ZXJyID0gLTE7XG4mIzQzO291dDpcbiYjNDM7XHRmcmVlKGtleXMpO1xuJiM0MztcdGZyZWUodmFsdWVzKTtcbiYjNDM7XHRyZXR1cm4gZXJyO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcylcbiB7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbkBAIC04NjksNiAmIzQzOzk2Niw5IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRwX2luZm8oXCYjMzQ7V2FybmluZzogY2Fubm90IHJlYWQgdmFsdWVzIGZyb20gJXMgbWFwIHdpdGggdmFsdWVfc2l6ZSAhPSA4XCYjMzQ7LFxuIFx0XHQgICAgICAgbWFwX3R5cGVfc3RyKTtcbiBcdH1cbiYjNDM7XHRlcnIgPSBkdW1wX21hcF9iYXRjaChmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIsIFx1MDAyNm51bV9lbGVtcyk7XG4mIzQzO1x0aWYgKGVyciAhPSBNQVBfRFVNUF9CQVRDSF9GQUxMQkFDSylcbiYjNDM7XHRcdGdvdG8gZW5kX2R1bXA7XG4gXHR3aGlsZSAodHJ1ZSkge1xuIFx0XHRlcnIgPSBicGZfbWFwX2dldF9uZXh0X2tleShmZCwgcHJldl9rZXksIGtleSk7XG4gXHRcdGlmIChlcnIpIHtcbkBAIC04ODEsNiAmIzQzOzk4MSw3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRwcmV2X2tleSA9IGtleTtcbiBcdH1cbiBcbiYjNDM7ZW5kX2R1bXA6XG4gXHRpZiAod3RyKSB7XG4gXHRcdGpzb253X2VuZF9hcnJheSh3dHIpO1x0LyogZWxlbWVudHMgKi9cbiBcdFx0aWYgKHNob3dfaGVhZGVyKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYjQyMTZlZDc3OGVmOVxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY1xuQEAgLTAsMCAmIzQzOzEsMTg3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3R5cGUuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBNQVhfRU5UUklFUyAxMDI1XG4mIzQzOyNkZWZpbmUgUkVDT1JEX1NJWkUgMjU2XG4mIzQzOyNkZWZpbmUgT1VUUFVUX1NJWkUgKE1BWF9FTlRSSUVTICogUkVDT1JEX1NJWkUgJiM0MzsgMTAyNClcbiYjNDM7XG4mIzQzO3N0cnVjdCBkdW1wX2Nhc2Uge1xuJiM0MztcdGNvbnN0IGNoYXIgKm5hbWU7XG4mIzQzO1x0dW5zaWduZWQgaW50IGNvdW50O1xuJiM0MztcdHVuc2lnbmVkIGludCBrZXlfc2l6ZTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZTtcbiYjNDM7XHRib29sIGJ0ZjtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IGRhdGE7XG4mIzQzO1x0dW5zaWduZWQgaW50IGk7XG4mIzQzO1xuJiM0MztcdGlmIChqc29uKVxuJiM0MztcdFx0Km91dCYjNDM7JiM0MzsgPSAmIzM5O1smIzM5OztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKGpzb24gXHUwMDI2XHUwMDI2IGkpXG4mIzQzO1x0XHRcdCpvdXQmIzQzOyYjNDM7ID0gJiMzOTssJiMzOTs7XG4mIzQzO1x0XHRvdXQgJiM0Mzs9IHNwcmludGYob3V0LCBqc29uID8gXCYjMzQ7XFxcJiMzNDsweCUwMnhcXFwmIzM0O1wmIzM0OyA6IFwmIzM0OyUwMnhcJiMzNDssIGJ5dGVzW2ldKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGpzb24pXG4mIzQzO1x0XHQqb3V0JiM0MzsmIzQzOyA9ICYjMzk7XSYjMzk7O1xuJiM0MztcdCpvdXQgPSAmIzM5O1xcMCYjMzk7O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBleHBlY3RlZF9yZWNvcmQoY2hhciAqcmVjb3JkLCBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LFxuJiM0MztcdFx0XHQgICAgdW5zaWduZWQgaW50IGluZGV4LCBib29sIGpzb24pXG4mIzQzO3tcbiYjNDM7XHRfX3UzMiBrZXkgPSBpbmRleCwgdmFsdWUgPSBpbmRleCAqIDM3ICYjNDM7IDExO1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7XG4mIzQzO1x0Y2hhciBrZXlfaGV4WzY0XSwgdmFsdWVfaGV4WzY0XSwgZm9ybWF0dGVkWzk2XTtcbiYjNDM7XG4mIzQzO1x0aGV4X2J5dGVzKGtleV9oZXgsIHRlc3QtXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXHUwMDI2c2hvcnRfa2V5IDogXHUwMDI2a2V5LFxuJiM0MztcdFx0ICB0ZXN0LVx1MDAzZWtleV9zaXplLCBqc29uKTtcbiYjNDM7XHRoZXhfYnl0ZXModmFsdWVfaGV4LCBcdTAwMjZ2YWx1ZSwgdGVzdC1cdTAwM2V2YWx1ZV9zaXplLCBqc29uKTtcbiYjNDM7XHRzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCBcJiMzNDt7XFxcJiMzNDtrZXlcXFwmIzM0OzoldSxcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6JXV9XCYjMzQ7LFxuJiM0MztcdFx0IGtleSwgdmFsdWUpO1xuJiM0MztcdGlmIChqc29uIFx1MDAyNlx1MDAyNiB0ZXN0LVx1MDAzZWJ0ZilcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsXG4mIzQzO1x0XHRcdCBcJiMzNDt7XFxcJiMzNDtrZXlcXFwmIzM0OzolcyxcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6JXMsXFxcJiMzNDtmb3JtYXR0ZWRcXFwmIzM0Ozolc31cJiMzNDssXG4mIzQzO1x0XHRcdCBrZXlfaGV4LCB2YWx1ZV9oZXgsIGZvcm1hdHRlZCk7XG4mIzQzO1x0ZWxzZSBpZiAoanNvbilcbiYjNDM7XHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwmIzM0O3tcXFwmIzM0O2tleVxcXCYjMzQ7OiVzLFxcXCYjMzQ7dmFsdWVcXFwmIzM0Ozolc31cJiMzNDssXG4mIzQzO1x0XHRcdCBrZXlfaGV4LCB2YWx1ZV9oZXgpO1xuJiM0MztcdGVsc2UgaWYgKHRlc3QtXHUwMDNlYnRmKVxuJiM0MztcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXCYjMzQ7JXNcJiMzNDssIGZvcm1hdHRlZCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXCYjMzQ7a2V5OiVzdmFsdWU6JXNcJiMzNDssIGtleV9oZXgsIHZhbHVlX2hleCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGNoZWNrX2R1bXAoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCwgX191MzIgaWQsIGJvb2wganNvbiwgYm9vbCBwcmV0dHkpXG4mIzQzO3tcbiYjNDM7XHRib29sIGFycmF5ID0ganNvbiB8fCB0ZXN0LVx1MDAzZWJ0ZjtcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGV4cGVjdGVkW1JFQ09SRF9TSVpFXSwgZm9vdGVyWzY0XTtcbiYjNDM7XHRib29sIHNlZW5bTUFYX0VOVFJJRVNdID0ge307XG4mIzQzO1x0Y2hhciAqb3V0cHV0LCAqc3JjLCAqZHN0LCAqY3Vyc29yO1xuJiM0MztcdHVuc2lnbmVkIGludCBpLCBuO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdG91dHB1dCA9IGNhbGxvYygxLCBPVVRQVVRfU0laRSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKG91dHB1dCwgXCYjMzQ7YWxsb2Nfb3V0cHV0XCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0OyVzbWFwIGR1bXAgaWQgJXVcJiMzNDssXG4mIzQzO1x0XHQgcHJldHR5ID8gXCYjMzQ7LXAgXCYjMzQ7IDoganNvbiA/IFwmIzM0Oy1qIFwmIzM0OyA6IFwmIzM0O1wmIzM0OywgaWQpO1xuJiM0MztcdGVyciA9IGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7bWFwX2R1bXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBJZ25vcmUgcHJlc2VudGF0aW9uIHdoaXRlc3BhY2UsIGJ1dCBjb21wYXJlIGNvbXBsZXRlIHJlY29yZHMgYW5kIGFsbFxuJiM0MztcdCAqIHB1bmN0dWF0aW9uLiBFeHBlY3RlZCBjb250ZW50cyBjb21lIG9ubHkgZnJvbSB0aGUgaW5wdXQgZGF0YSwgbmV2ZXJcbiYjNDM7XHQgKiBmcm9tIGFub3RoZXIgbWFwIHdhbGsgb3IgYnBmdG9vbCBpbnZvY2F0aW9uLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvciAoc3JjID0gb3V0cHV0LCBkc3QgPSBvdXRwdXQ7ICpzcmM7IHNyYyYjNDM7JiM0MzspXG4mIzQzO1x0XHRpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpXG4mIzQzO1x0XHRcdCpkc3QmIzQzOyYjNDM7ID0gKnNyYztcbiYjNDM7XHQqZHN0ID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRjdXJzb3IgPSBvdXRwdXQ7XG4mIzQzO1x0aWYgKGFycmF5KSB7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAmIzM5O1smIzM5OywgXCYjMzQ7YXJyYXlfc3RhcnRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGN1cnNvciYjNDM7JiM0Mzs7XG4mIzQzO1x0fVxuJiM0MztcdGZvciAobiA9IDA7IG4gXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IG4mIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoYXJyYXkgXHUwMDI2XHUwMDI2IG4pIHtcbiYjNDM7XHRcdFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJiMzOTssJiMzOTssIFwmIzM0O3JlY29yZF9zZXBhcmF0b3JcJiMzNDspKVxuJiM0MztcdFx0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0XHRjdXJzb3ImIzQzOyYjNDM7O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgdGVzdC1cdTAwM2Vjb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKHNlZW5baV0pXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdGV4cGVjdGVkX3JlY29yZChleHBlY3RlZCwgdGVzdCwgaSwganNvbik7XG4mIzQzO1x0XHRcdGlmICghc3RybmNtcChjdXJzb3IsIGV4cGVjdGVkLCBzdHJsZW4oZXhwZWN0ZWQpKSlcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmICghQVNTRVJUX0xUKGksIHRlc3QtXHUwMDNlY291bnQsIFwmIzM0O3VuaXF1ZV9leHBlY3RlZF9yZWNvcmRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdHNlZW5baV0gPSB0cnVlO1xuJiM0MztcdFx0Y3Vyc29yICYjNDM7PSBzdHJsZW4oZXhwZWN0ZWQpO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoYXJyYXkpIHtcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShjdXJzb3IsIFwmIzM0O11cJiMzNDssIFwmIzM0O2FycmF5X2VuZF9hbmRfY291bnRcJiMzNDspO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzbnByaW50Zihmb290ZXIsIHNpemVvZihmb290ZXIpLCBcJiMzNDtGb3VuZCV1ZWxlbWVudCVzXCYjMzQ7LCB0ZXN0LVx1MDAzZWNvdW50LFxuJiM0MztcdFx0XHQgdGVzdC1cdTAwM2Vjb3VudCA9PSAxID8gXCYjMzQ7XCYjMzQ7IDogXCYjMzQ7c1wmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBmb290ZXIsIFwmIzM0O3BsYWluX2NvdW50XCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO291dDpcbiYjNDM7XHRmcmVlKG91dHB1dCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJ1bl9kdW1wX2Nhc2UoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuJiM0MztcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdF9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pO1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4mIzQzO1x0dW5zaWduZWQgaW50IGk7XG4mIzQzO1x0aW50IGZkID0gLTE7XG4mIzQzO1xuJiM0MztcdGlmICh0ZXN0LVx1MDAzZWJ0Zikge1xuJiM0MztcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2J0Zl9uZXdcJiMzNDspKVxuJiM0MztcdFx0XHRyZXR1cm47XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcJiMzNDt1bnNpZ25lZCBpbnRcJiMzNDssIDQsIDApLCAxLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7YnRmX2ludFwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcJiMzNDtidGZfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0b3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7XG4mIzQzO1x0XHRvcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XG4mIzQzO1x0XHRvcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcbiYjNDM7XHR9XG4mIzQzO1x0ZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCYjMzQ7ZHVtcF9iYXRjaFwmIzM0OywgdGVzdC1cdTAwM2VrZXlfc2l6ZSxcbiYjNDM7XHRcdFx0ICAgIHRlc3QtXHUwMDNldmFsdWVfc2l6ZSwgdGVzdC1cdTAwM2Vjb3VudCA/OiAxLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCYjMzQ7bWFwX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyB0ZXN0LVx1MDAzZWNvdW50OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0X191MzIga2V5ID0gaSwgdmFsdWUgPSBpICogMzcgJiM0MzsgMTE7XG4mIzQzO1x0XHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGk7XG4mIzQzO1x0XHR2b2lkICprZXlfcHRyID0gdGVzdC1cdTAwM2VrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKilcdTAwMjZzaG9ydF9rZXkgOiBcdTAwMjZrZXk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7bWFwX3VwZGF0ZVwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZpbmZvX2xlbiksIFwmIzM0O21hcF9pbmZvXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgZmFsc2UsIGZhbHNlKTtcbiYjNDM7XHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIGZhbHNlKTtcbiYjNDM7XHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIHRydWUpO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKGZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGZkKTtcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2JhdGNoKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSBjYXNlc1tdID0ge1xuJiM0MztcdFx0eyBcJiMzNDtlbXB0eVwmIzM0OywgMCwgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDtzaW5nbGVcJiMzNDssIDEsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7YmVsb3dfYmF0Y2hcJiMzNDssIDI1NSwgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDtleGFjdF9iYXRjaFwmIzM0OywgMjU2LCA0LCA0IH0sXG4mIzQzO1x0XHR7IFwmIzM0O2Fib3ZlX2JhdGNoXCYjMzQ7LCAyNTcsIDQsIDQgfSxcbiYjNDM7XHRcdHsgXCYjMzQ7bXVsdGlwbGVfYmF0Y2hlc1wmIzM0OywgMTAyNSwgNCwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDtvbmVfYnl0ZV9rZXlcJiMzNDssIDI1NiwgMSwgNCB9LFxuJiM0MztcdFx0eyBcJiMzNDtvZGRfdmFsdWVfc2l6ZVwmIzM0OywgMjU3LCA0LCAzIH0sXG4mIzQzO1x0XHR7IFwmIzM0O2J0Zl9lbXB0eVwmIzM0OywgMCwgNCwgNCwgdHJ1ZSB9LFxuJiM0MztcdFx0eyBcJiMzNDtidGZfc2luZ2xlXCYjMzQ7LCAxLCA0LCA0LCB0cnVlIH0sXG4mIzQzO1x0XHR7IFwmIzM0O2J0Zl9tdWx0aXBsZV9iYXRjaGVzXCYjMzQ7LCAxMDI1LCA0LCA0LCB0cnVlIH0sXG4mIzQzO1x0fTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShjYXNlcyk7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoY2FzZXNbaV0ubmFtZSkpXG4mIzQzO1x0XHRcdHJ1bl9kdW1wX2Nhc2UoXHUwMDI2Y2FzZXNbaV0pO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDQ6MDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHV0aWxpdGllcyBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlICh2bWxpbnV4IG9yIGtlcm5lbCBtb2R1bGVzKSwgc28gaXQgaXMgbm90IGZ1enphYmxlIGJ5IHN5emthbGxlci4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA4ODE3MDRlZTBhM2NmMTUzYTVjMWRhYzdjOTQ0NThmNjdhODcwYTBlCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBTZXAgMTEgMDQ6MDM6MDEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCmluZGV4IDY4NGE4ZmI3MjQxNDYuLjk3MWRhMTczNjAwYTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jCkBAIC03NDAsMTUgJiM0Mzs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndikKIAlyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xOwogfQogCi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAotCQkJIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCi0JCQkganNvbl93cml0ZXJfdCAqYnRmX3d0cikKJiM0MztzdGF0aWMgdm9pZCBwcmludF9tYXBfZWxlbSh2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsCiYjNDM7CQkJICAganNvbl93cml0ZXJfdCAqYnRmX3d0cikKIHsKLQlpZiAoYnBmX21hcF9sb29rdXBfZWxlbShmZCwga2V5LCB2YWx1ZSkpIHsKLQkJcHJpbnRfZW50cnlfZXJyb3IobWFwX2luZm8sIGtleSwgZXJybm8pOwotCQlyZXR1cm4gLTE7Ci0JfQotCiAJaWYgKGpzb25fb3V0cHV0KSB7CiAJCXByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7CiAJfSBlbHNlIGlmIChidGYpIHsKQEAgLTc2MiwxMCAmIzQzOzc1NywxMTIgQEAgc3RhdGljIGludCBkdW1wX21hcF9lbGVtKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKIAl9IGVsc2UgewogCQlwcmludF9lbnRyeV9wbGFpbihtYXBfaW5mbywga2V5LCB2YWx1ZSk7CiAJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAomIzQzOwkJCSBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLAomIzQzOwkJCSBqc29uX3dyaXRlcl90ICpidGZfd3RyKQomIzQzO3sKJiM0MzsJaWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7CiYjNDM7CQlwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KIAomIzQzOwlwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTsKIAlyZXR1cm4gMDsKIH0KIAomIzQzOyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgMQomIzQzOyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfU0laRSAyNTZVCiYjNDM7I2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNCkKJiM0MzsKJiM0MzsvKiBSZXR1cm4gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgb25seSBiZWZvcmUgYmF0Y2ggdHJhdmVyc2FsIHN0YXJ0cy4gKi8KJiM0MztzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKJiM0MzsJCQkgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZiwKJiM0MzsJCQkgIGpzb25fd3JpdGVyX3QgKnd0ciwgdW5zaWduZWQgaW50ICpudW1fZWxlbXMpCiYjNDM7ewomIzQzOwlfX3UzMiBjYXBhY2l0eSwgY291bnQsIGJhdGNoID0gMCwgbmV4dF9iYXRjaCA9IDAsIGk7CiYjNDM7CXZvaWQgKmtleXMgPSBOVUxMLCAqdmFsdWVzID0gTlVMTCwgKmJ1ZjsKJiM0MzsJYm9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7CiYjNDM7CWludCBlcnI7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlCiYjNDM7CSAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsCiYjNDM7CSAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLgomIzQzOwkgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGluZm8tJmd0O3R5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tJmd0O21heF9lbnRyaWVzIHx8CiYjNDM7CSAgICAoX191NjQpaW5mby0mZ3Q7a2V5X3NpemUgJiM0MzsgaW5mby0mZ3Q7dmFsdWVfc2l6ZSAmZ3Q7CiYjNDM7CSAgICBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgLyBpbmZvLSZndDttYXhfZW50cmllcykKJiM0MzsJCXJldHVybiBNQVBfRFVNUF9CQVRDSF9GQUxMQkFDSzsKJiM0MzsKJiM0MzsJY2FwYWNpdHkgPSBtaW4oaW5mby0mZ3Q7bWF4X2VudHJpZXMsIE1BUF9EVU1QX0JBVENIX1NJWkUpOwomIzQzO3Jlc2l6ZToKJiM0MzsJYnVmID0gcmVhbGxvYyhrZXlzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby0mZ3Q7a2V5X3NpemUpOwomIzQzOwlpZiAoIWJ1ZikgewomIzQzOwkJZXJyID0gRU5PTUVNOwomIzQzOwkJZ290byBlcnJvcjsKJiM0MzsJfQomIzQzOwlrZXlzID0gYnVmOwomIzQzOwlidWYgPSByZWFsbG9jKHZhbHVlcywgKHNpemVfdCljYXBhY2l0eSAqIGluZm8tJmd0O3ZhbHVlX3NpemUpOwomIzQzOwlpZiAoIWJ1ZikgewomIzQzOwkJZXJyID0gRU5PTUVNOwomIzQzOwkJZ290byBlcnJvcjsKJiM0MzsJfQomIzQzOwl2YWx1ZXMgPSBidWY7CiYjNDM7CiYjNDM7CXdoaWxlICh0cnVlKSB7CiYjNDM7CQljb3VudCA9IGNhcGFjaXR5OwomIzQzOwkJZXJyID0gYnBmX21hcF9sb29rdXBfYmF0Y2goZmQsIGZpcnN0ID8gTlVMTCA6ICZhbXA7YmF0Y2gsCiYjNDM7CQkJCQkgICAmYW1wO25leHRfYmF0Y2gsIGtleXMsIHZhbHVlcywgJmFtcDtjb3VudCwgTlVMTCk7CiYjNDM7CQllcnIgPSBlcnIgPyBlcnJubyA6IDA7CiYjNDM7CQkvKgomIzQzOwkJICogT2xkZXIga2VybmVscyByZWplY3QgdGhlIGNvbW1hbmQgYmVmb3JlIHVwZGF0aW5nIGNvdW50LiBEbyBub3QKJiM0MzsJCSAqIGluc3BlY3QgdGhlIGJ1ZmZlcnMgb24gdGhlc2UgZXJyb3JzLCBvciBmYWxsIGJhY2sgYWZ0ZXIgcHJvZ3Jlc3MuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChjYW5fZmFsbGJhY2sgJmFtcDsmYW1wOyAoZXJyID09IEVJTlZBTCB8fCBlcnIgPT0gRU9QTk9UU1VQUCB8fAomIzQzOwkJCQkgICAgIGVyciA9PSA1MjQgLyogRU5PVFNVUFAgKi8pKSB7CiYjNDM7CQkJZXJyID0gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0s7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CQljYW5fZmFsbGJhY2sgPSBmYWxzZTsKJiM0MzsJCWlmIChlcnIgPT0gRU5PU1BDKSB7CiYjNDM7CQkJaWYgKGNhcGFjaXR5ID09IGluZm8tJmd0O21heF9lbnRyaWVzKQomIzQzOwkJCQlnb3RvIGVycm9yOwomIzQzOwkJCWNhcGFjaXR5ICYjNDM7PSBtaW4oY2FwYWNpdHksIGluZm8tJmd0O21heF9lbnRyaWVzIC0gY2FwYWNpdHkpOwomIzQzOwkJCS8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi8KJiM0MzsJCQlnb3RvIHJlc2l6ZTsKJiM0MzsJCX0KJiM0MzsJCS8qIEluIHBhcnRpY3VsYXIsIEVGQVVMVCBjYW4gbGVhdmUgY291bnQgYW5kIHRoZSBidWZmZXJzIGludmFsaWQuICovCiYjNDM7CQlpZiAoZXJyICZhbXA7JmFtcDsgZXJyICE9IEVOT0VOVCkKJiM0MzsJCQlnb3RvIGVycm9yOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IGNvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJCS8qCiYjNDM7CQkJICogS2VlcCB0aGUgYWxpZ25tZW50IHByb3ZpZGVkIGJ5IGluZGl2aWR1YWwgbG9va3VwcywgaW5jbHVkaW5nCiYjNDM7CQkJICogZm9yIEJURiB0eXBlcyB3aG9zZSBtYXAga2V5L3ZhbHVlIHNpemUgaXMgbm90IGFsaWduZWQuCiYjNDM7CQkJICovCiYjNDM7CQkJbWVtY3B5KGtleSwga2V5cyAmIzQzOyAoc2l6ZV90KWkgKiBpbmZvLSZndDtrZXlfc2l6ZSwgaW5mby0mZ3Q7a2V5X3NpemUpOwomIzQzOwkJCW1lbWNweSh2YWx1ZSwgdmFsdWVzICYjNDM7IChzaXplX3QpaSAqIGluZm8tJmd0O3ZhbHVlX3NpemUsIGluZm8tJmd0O3ZhbHVlX3NpemUpOwomIzQzOwkJCXByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTsKJiM0MzsJCQkoKm51bV9lbGVtcykmIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJaWYgKGVyciA9PSBFTk9FTlQpIHsKJiM0MzsJCQllcnIgPSAwOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwkJZmlyc3QgPSBmYWxzZTsKJiM0MzsJCWJhdGNoID0gbmV4dF9iYXRjaDsKJiM0MzsJfQomIzQzO2Vycm9yOgomIzQzOwlmcHJpbnRmKHN0ZGVyciwgJiMzNDtFcnJvcjogY2FuJiMzOTt0IGxvb2t1cCBtYXAgYmF0Y2g6ICVzXG4mIzM0Oywgc3RyZXJyb3IoZXJyKSk7CiYjNDM7CWVyciA9IC0xOwomIzQzO291dDoKJiM0MzsJZnJlZShrZXlzKTsKJiM0MzsJZnJlZSh2YWx1ZXMpOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcykKIHsKIAlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKQEAgLTg2OSw2ICYjNDM7OTY2LDkgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCXBfaW5mbygmIzM0O1dhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOCYjMzQ7LAogCQkgICAgICAgbWFwX3R5cGVfc3RyKTsKIAl9CiYjNDM7CWVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgJmFtcDtudW1fZWxlbXMpOwomIzQzOwlpZiAoZXJyICE9IE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLKQomIzQzOwkJZ290byBlbmRfZHVtcDsKIAl3aGlsZSAodHJ1ZSkgewogCQllcnIgPSBicGZfbWFwX2dldF9uZXh0X2tleShmZCwgcHJldl9rZXksIGtleSk7CiAJCWlmIChlcnIpIHsKQEAgLTg4MSw2ICYjNDM7OTgxLDcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAJCXByZXZfa2V5ID0ga2V5OwogCX0KIAomIzQzO2VuZF9kdW1wOgogCWlmICh3dHIpIHsKIAkJanNvbndfZW5kX2FycmF5KHd0cik7CS8qIGVsZW1lbnRzICovCiAJCWlmIChzaG93X2hlYWRlcikKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmI0MjE2ZWQ3NzhlZjkKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jCkBAIC0wLDAgJiM0MzsxLDE4NyBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmdG9vbF9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9idGYuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7Y3R5cGUuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIE1BWF9FTlRSSUVTIDEwMjUKJiM0MzsjZGVmaW5lIFJFQ09SRF9TSVpFIDI1NgomIzQzOyNkZWZpbmUgT1VUUFVUX1NJWkUgKE1BWF9FTlRSSUVTICogUkVDT1JEX1NJWkUgJiM0MzsgMTAyNCkKJiM0MzsKJiM0MztzdHJ1Y3QgZHVtcF9jYXNlIHsKJiM0MzsJY29uc3QgY2hhciAqbmFtZTsKJiM0MzsJdW5zaWduZWQgaW50IGNvdW50OwomIzQzOwl1bnNpZ25lZCBpbnQga2V5X3NpemU7CiYjNDM7CXVuc2lnbmVkIGludCB2YWx1ZV9zaXplOwomIzQzOwlib29sIGJ0ZjsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGhleF9ieXRlcyhjaGFyICpvdXQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGpzb24pCiYjNDM7ewomIzQzOwljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IGRhdGE7CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwomIzQzOwlpZiAoanNvbikKJiM0MzsJCSpvdXQmIzQzOyYjNDM7ID0gJiMzOTtbJiMzOTs7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBzaXplOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKGpzb24gJmFtcDsmYW1wOyBpKQomIzQzOwkJCSpvdXQmIzQzOyYjNDM7ID0gJiMzOTssJiMzOTs7CiYjNDM7CQlvdXQgJiM0Mzs9IHNwcmludGYob3V0LCBqc29uID8gJiMzNDtcJiMzNDsweCUwMnhcJiMzNDsmIzM0OyA6ICYjMzQ7JTAyeCYjMzQ7LCBieXRlc1tpXSk7CiYjNDM7CX0KJiM0MzsJaWYgKGpzb24pCiYjNDM7CQkqb3V0JiM0MzsmIzQzOyA9ICYjMzk7XSYjMzk7OwomIzQzOwkqb3V0ID0gJiMzOTtcMCYjMzk7OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBleHBlY3RlZF9yZWNvcmQoY2hhciAqcmVjb3JkLCBjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LAomIzQzOwkJCSAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIGJvb2wganNvbikKJiM0Mzt7CiYjNDM7CV9fdTMyIGtleSA9IGluZGV4LCB2YWx1ZSA9IGluZGV4ICogMzcgJiM0MzsgMTE7CiYjNDM7CXVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7CiYjNDM7CWNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07CiYjNDM7CiYjNDM7CWhleF9ieXRlcyhrZXlfaGV4LCB0ZXN0LSZndDtrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKikmYW1wO3Nob3J0X2tleSA6ICZhbXA7a2V5LAomIzQzOwkJICB0ZXN0LSZndDtrZXlfc2l6ZSwganNvbik7CiYjNDM7CWhleF9ieXRlcyh2YWx1ZV9oZXgsICZhbXA7dmFsdWUsIHRlc3QtJmd0O3ZhbHVlX3NpemUsIGpzb24pOwomIzQzOwlzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCAmIzM0O3tcJiMzNDtrZXlcJiMzNDs6JXUsXCYjMzQ7dmFsdWVcJiMzNDs6JXV9JiMzNDssCiYjNDM7CQkga2V5LCB2YWx1ZSk7CiYjNDM7CWlmIChqc29uICZhbXA7JmFtcDsgdGVzdC0mZ3Q7YnRmKQomIzQzOwkJc25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwKJiM0MzsJCQkgJiMzNDt7XCYjMzQ7a2V5XCYjMzQ7OiVzLFwmIzM0O3ZhbHVlXCYjMzQ7OiVzLFwmIzM0O2Zvcm1hdHRlZFwmIzM0Ozolc30mIzM0OywKJiM0MzsJCQkga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpOwomIzQzOwllbHNlIGlmIChqc29uKQomIzQzOwkJc25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgJiMzNDt7XCYjMzQ7a2V5XCYjMzQ7OiVzLFwmIzM0O3ZhbHVlXCYjMzQ7OiVzfSYjMzQ7LAomIzQzOwkJCSBrZXlfaGV4LCB2YWx1ZV9oZXgpOwomIzQzOwllbHNlIGlmICh0ZXN0LSZndDtidGYpCiYjNDM7CQlzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCAmIzM0OyVzJiMzNDssIGZvcm1hdHRlZCk7CiYjNDM7CWVsc2UKJiM0MzsJCXNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsICYjMzQ7a2V5OiVzdmFsdWU6JXMmIzM0Oywga2V5X2hleCwgdmFsdWVfaGV4KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY2hlY2tfZHVtcChjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LCBfX3UzMiBpZCwgYm9vbCBqc29uLCBib29sIHByZXR0eSkKJiM0Mzt7CiYjNDM7CWJvb2wgYXJyYXkgPSBqc29uIHx8IHRlc3QtJmd0O2J0ZjsKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBleHBlY3RlZFtSRUNPUkRfU0laRV0sIGZvb3Rlcls2NF07CiYjNDM7CWJvb2wgc2VlbltNQVhfRU5UUklFU10gPSB7fTsKJiM0MzsJY2hhciAqb3V0cHV0LCAqc3JjLCAqZHN0LCAqY3Vyc29yOwomIzQzOwl1bnNpZ25lZCBpbnQgaSwgbjsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJb3V0cHV0ID0gY2FsbG9jKDEsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKG91dHB1dCwgJiMzNDthbGxvY19vdXRwdXQmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDslc21hcCBkdW1wIGlkICV1JiMzNDssCiYjNDM7CQkgcHJldHR5ID8gJiMzNDstcCAmIzM0OyA6IGpzb24gPyAmIzM0Oy1qICYjMzQ7IDogJiMzNDsmIzM0OywgaWQpOwomIzQzOwllcnIgPSBnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O21hcF9kdW1wJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CS8qCiYjNDM7CSAqIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsCiYjNDM7CSAqIHB1bmN0dWF0aW9uLiBFeHBlY3RlZCBjb250ZW50cyBjb21lIG9ubHkgZnJvbSB0aGUgaW5wdXQgZGF0YSwgbmV2ZXIKJiM0MzsJICogZnJvbSBhbm90aGVyIG1hcCB3YWxrIG9yIGJwZnRvb2wgaW52b2NhdGlvbi4KJiM0MzsJICovCiYjNDM7CWZvciAoc3JjID0gb3V0cHV0LCBkc3QgPSBvdXRwdXQ7ICpzcmM7IHNyYyYjNDM7JiM0MzspCiYjNDM7CQlpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnNyYykpCiYjNDM7CQkJKmRzdCYjNDM7JiM0MzsgPSAqc3JjOwomIzQzOwkqZHN0ID0gJiMzOTtcMCYjMzk7OwomIzQzOwljdXJzb3IgPSBvdXRwdXQ7CiYjNDM7CWlmIChhcnJheSkgewomIzQzOwkJaWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJiMzOTtbJiMzOTssICYjMzQ7YXJyYXlfc3RhcnQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQljdXJzb3ImIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWZvciAobiA9IDA7IG4gJmx0OyB0ZXN0LSZndDtjb3VudDsgbiYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChhcnJheSAmYW1wOyZhbXA7IG4pIHsKJiM0MzsJCQlpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAmIzM5OywmIzM5OywgJiMzNDtyZWNvcmRfc2VwYXJhdG9yJiMzNDspKQomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQljdXJzb3ImIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IHRlc3QtJmd0O2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmIChzZWVuW2ldKQomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQlleHBlY3RlZF9yZWNvcmQoZXhwZWN0ZWQsIHRlc3QsIGksIGpzb24pOwomIzQzOwkJCWlmICghc3RybmNtcChjdXJzb3IsIGV4cGVjdGVkLCBzdHJsZW4oZXhwZWN0ZWQpKSkKJiM0MzsJCQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQlpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LSZndDtjb3VudCwgJiMzNDt1bmlxdWVfZXhwZWN0ZWRfcmVjb3JkJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJc2VlbltpXSA9IHRydWU7CiYjNDM7CQljdXJzb3IgJiM0Mzs9IHN0cmxlbihleHBlY3RlZCk7CiYjNDM7CX0KJiM0MzsJaWYgKGFycmF5KSB7CiYjNDM7CQlBU1NFUlRfU1RSRVEoY3Vyc29yLCAmIzM0O10mIzM0OywgJiMzNDthcnJheV9lbmRfYW5kX2NvdW50JiMzNDspOwomIzQzOwl9IGVsc2UgewomIzQzOwkJc25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgJiMzNDtGb3VuZCV1ZWxlbWVudCVzJiMzNDssIHRlc3QtJmd0O2NvdW50LAomIzQzOwkJCSB0ZXN0LSZndDtjb3VudCA9PSAxID8gJiMzNDsmIzM0OyA6ICYjMzQ7cyYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgJiMzNDtwbGFpbl9jb3VudCYjMzQ7KTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJZnJlZShvdXRwdXQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBydW5fZHVtcF9jYXNlKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QpCiYjNDM7ewomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTsKJiM0MzsJc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307CiYjNDM7CV9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pOwomIzQzOwlzdHJ1Y3QgYnRmICpidGYgPSBOVUxMOwomIzQzOwl1bnNpZ25lZCBpbnQgaTsKJiM0MzsJaW50IGZkID0gLTE7CiYjNDM7CiYjNDM7CWlmICh0ZXN0LSZndDtidGYpIHsKJiM0MzsJCWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2J0Zl9uZXcmIzM0OykpCiYjNDM7CQkJcmV0dXJuOwomIzQzOwkJaWYgKCFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDt1bnNpZ25lZCBpbnQmIzM0OywgNCwgMCksIDEsCiYjNDM7CQkJICAgICAgICYjMzQ7YnRmX2ludCYjMzQ7KSB8fAomIzQzOwkJICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksICYjMzQ7YnRmX2xvYWQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTsKJiM0MzsJCW9wdHMuYnRmX2tleV90eXBlX2lkID0gMTsKJiM0MzsJCW9wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxOwomIzQzOwl9CiYjNDM7CWZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsICYjMzQ7ZHVtcF9iYXRjaCYjMzQ7LCB0ZXN0LSZndDtrZXlfc2l6ZSwKJiM0MzsJCQkgICAgdGVzdC0mZ3Q7dmFsdWVfc2l6ZSwgdGVzdC0mZ3Q7Y291bnQgPzogMSwgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmQsICYjMzQ7bWFwX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgdGVzdC0mZ3Q7Y291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyAmIzQzOyAxMTsKJiM0MzsJCXVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaTsKJiM0MzsJCXZvaWQgKmtleV9wdHIgPSB0ZXN0LSZndDtrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKikmYW1wO3Nob3J0X2tleSA6ICZhbXA7a2V5OwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgJmFtcDt2YWx1ZSwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7bWFwX3VwZGF0ZSYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCAmYW1wO2luZm8sICZhbXA7aW5mb19sZW4pLCAmIzM0O21hcF9pbmZvJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgZmFsc2UsIGZhbHNlKTsKJiM0MzsJY2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7CiYjNDM7CWNoZWNrX2R1bXAodGVzdCwgaW5mby5pZCwgdHJ1ZSwgdHJ1ZSk7CiYjNDM7b3V0OgomIzQzOwlpZiAoZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9iYXRjaCh2b2lkKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgY2FzZXNbXSA9IHsKJiM0MzsJCXsgJiMzNDtlbXB0eSYjMzQ7LCAwLCA0LCA0IH0sCiYjNDM7CQl7ICYjMzQ7c2luZ2xlJiMzNDssIDEsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtiZWxvd19iYXRjaCYjMzQ7LCAyNTUsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtleGFjdF9iYXRjaCYjMzQ7LCAyNTYsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDthYm92ZV9iYXRjaCYjMzQ7LCAyNTcsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDttdWx0aXBsZV9iYXRjaGVzJiMzNDssIDEwMjUsIDQsIDQgfSwKJiM0MzsJCXsgJiMzNDtvbmVfYnl0ZV9rZXkmIzM0OywgMjU2LCAxLCA0IH0sCiYjNDM7CQl7ICYjMzQ7b2RkX3ZhbHVlX3NpemUmIzM0OywgMjU3LCA0LCAzIH0sCiYjNDM7CQl7ICYjMzQ7YnRmX2VtcHR5JiMzNDssIDAsIDQsIDQsIHRydWUgfSwKJiM0MzsJCXsgJiMzNDtidGZfc2luZ2xlJiMzNDssIDEsIDQsIDQsIHRydWUgfSwKJiM0MzsJCXsgJiMzNDtidGZfbXVsdGlwbGVfYmF0Y2hlcyYjMzQ7LCAxMDI1LCA0LCA0LCB0cnVlIH0sCiYjNDM7CX07CiYjNDM7CXVuc2lnbmVkIGludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShjYXNlcyk7IGkmIzQzOyYjNDM7KQomIzQzOwkJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoY2FzZXNbaV0ubmFtZSkpCiYjNDM7CQkJcnVuX2R1bXBfY2FzZSgmYW1wO2Nhc2VzW2ldKTsKJiM0Mzt9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDA0OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDcwMzcKCQkJCQkJCW91dHB1dDogOTAKCQkJCQkJCXRob3VnaHRzOiA1NDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqVHJpYWdlIERlY2lzaW9uOiBXb3J0aEZ1enppbmcgPSBGYWxzZSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGUgcGF0Y2ggZGlmZiBpbmRpY2F0ZXMgY2hhbmdlcyB0byBgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY2AuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoZXNlIGFyZSBsaWtlbHkgbm9uLWtlcm5lbCBhbmQgdXNlci1zcGFjZSBjaGFuZ2VzLCBidXQgbGV0JiMzOTtzIGJlIHRob3JvdWdoLgoKRmlyc3QsIEkmIzM5O2xsIHF1aWNrbHkgY29uc3VsdCB0aGUgdHJpYWdlIHJ1bGVzLiBXZSYjMzk7cmUgbG9va2luZyBmb3IgbW9kaWZpY2F0aW9ucyB0aGF0IGZhbGwgdW5kZXIgdGhlICYjMzQ7Tm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlcyYjMzQ7IGNhdGVnb3J5LiBUaGlzIG1lYW5zIGZvY3VzaW5nIG9uIGNoYW5nZXMgdG8gZG9jdW1lbnRhdGlvbiwgY29tbWVudHMsIHNwZWxsaW5nLCBvciB1c2VyLXNwYWNlIGRpcmVjdG9yaWVzIGxpa2UgYHRvb2xzL2AsIGBzYW1wbGVzL2AsIGBzY3JpcHRzL2AsIGFuZCBgdXNyL2AgKnRoYXQqIGRvbiYjMzk7dCBpbXBhY3QgdGhlIGtlcm5lbCBpbWFnZSBvciBtb2R1bGVzLgoKSSYjMzk7dmUgZ290IGJvdGggZmlsZXMgaW4gdGhlIGB0b29scy9gIGRpcmVjdG9yeS4gR2l2ZW4gbXkgZXhwZXJpZW5jZSwgSSYjMzk7bSBjb25maWRlbnQgdGhleSYjMzk7cmUgdXNlci1zcGFjZS4gSnVzdCB0byBiZSBhYnNvbHV0ZWx5IGNlcnRhaW4sIEkmIzM5O2xsIG1lbnRhbGx5IGRvdWJsZS1jaGVjayB0aGUgZGlmZiBhZ2FpbiB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIHVuZXhwZWN0ZWQgZmlsZXMgaW4gdGhlIGNoYW5nZSBzZXQuIE5vcGUsIHRoZSBkaWZmIGNvbmZpcm1zIGl0JiMzOTtzIG9ubHkgdGhlc2UgdHdvIGZpbGVzLgoKTm93LCBsZXQmIzM5O3MgbWF0Y2ggdGhpcyB1cCB3aXRoIHRoZSBjcml0ZXJpYS4gVGhlIHJlcXVpcmVtZW50cyBzcGVjaWZpY2FsbHkgc2F5ICYjMzQ7UmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllcy4uLiYjMzQ7IGFuZCBpdCBwZXJmZWN0bHkgZGVzY3JpYmVzIHRoZSBjaGFuZ2VzOiB1c2VyLXNwYWNlIGB0b29scy9gIGRpcmVjdG9yeSBmaWxlcyBhbmQgc2VsZnRlc3RzIHdoaWNoIGhhdmUgemVybyBlZmZlY3Qgb24gdGhlIGtlcm5lbC4KClRoZXJlZm9yZSwgZ2l2ZW4gdGhhdCBhbGwgY2hhbmdlcyBhcmUgY29uZmluZWQgdG8gdXNlci1zcGFjZSB0b29scyBhbmQgdGVzdHMsIGBXb3J0aEZ1enppbmdgIHNob3VsZCBkZWZpbml0ZWx5IGJlIGBmYWxzZWAuIGBGb2N1c1N5bWJvbHNgIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBhcyB0aGVyZSYjMzk7cyBub3RoaW5nIGtlcm5lbC1yZWxhdGVkIGhlcmUsIGFuZCBsaWtld2lzZSwgYEVuYWJsZUNvbmZpZ3NgIHdpbGwgYWxzbyBiZSBlbXB0eS4KClRoZSBjb25jaXNlIHJlYXNvbmluZyBpczogJiMzNDtUaGUgcGF0Y2ggb25seSB0b3VjaGVzIHVzZXItc3BhY2UgdG9vbHMgKGB0b29scy9icGYvYnBmdG9vbC9tYXAuY2ApIGFuZCBzZWxmdGVzdHMgKGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jYCksIHdoaWNoIGRvIG5vdCBtb2RpZnkgdGhlIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDsKCkFscmlnaHQsIHRpbWUgdG8gc2V0IHRoZSByZXN1bHRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDA0OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHV0aWxpdGllcyBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlICh2bWxpbnV4IG9yIGtlcm5lbCBtb2R1bGVzKSwgc28gaXQgaXMgbm90IGZ1enphYmxlIGJ5IHN5emthbGxlci4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlci1zcGFjZSB1dGlsaXRpZXMgaW4gdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHNlbGZ0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwgY29kZSAodm1saW51eCBvciBrZXJuZWwgbW9kdWxlcyksIHNvIGl0IGlzIG5vdCBmdXp6YWJsZSBieSBzeXprYWxsZXIuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDA0OjAzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwNDowMzowMy4zNTU2MjA3MTVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDY0ODY4NDA0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHV0aWxpdGllcyBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlICh2bWxpbnV4IG9yIGtlcm5lbCBtb2R1bGVzKSwgc28gaXQgaXMgbm90IGZ1enphYmxlIGJ5IHN5emthbGxlci5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDA0OjAzOjAzLjM1NTYyNTExNVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQzNTQwOTQ2OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDg4MTcwNGVlMGEzY2YxNTNhNWMxZGFjN2M5NDQ1OGY2N2E4NzBhMGVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDQ6MDM6MDEgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLjk3MWRhMTczNjAwYTcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbkBAIC03NDAsMTUgKzc0MCwxMCBAQCBzdGF0aWMgaW50IGRvX3Nob3coaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRyZXR1cm4gZXJybm8gPT0gRU5PRU5UID8gMCA6IC0xO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbi1cXHRcXHRcXHQgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcXG4tXFx0XFx0XFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXFxuK3N0YXRpYyB2b2lkIHByaW50X21hcF9lbGVtKHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuK1xcdFxcdFxcdCAgIHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXFxuK1xcdFxcdFxcdCAgIGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXFxuIHtcXG4tXFx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XFxuLVxcdFxcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcXG4tXFx0XFx0cmV0dXJuIC0xO1xcbi1cXHR9XFxuLVxcbiBcXHRpZiAoanNvbl9vdXRwdXQpIHtcXG4gXFx0XFx0cHJpbnRfZW50cnlfanNvbihtYXBfaW5mbywga2V5LCB2YWx1ZSwgYnRmKTtcXG4gXFx0fSBlbHNlIGlmIChidGYpIHtcXG5AQCAtNzYyLDEwICs3NTcsMTEyIEBAIHN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdHByaW50X2VudHJ5X3BsYWluKG1hcF9pbmZvLCBrZXksIHZhbHVlKTtcXG4gXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbitcXHRcXHRcXHQgc3RydWN0IGJwZl9tYXBfaW5mbyAqbWFwX2luZm8sIHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXFxuK3tcXG4rXFx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XFxuK1xcdFxcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuIFxcbitcXHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBtYXBfaW5mbywgYnRmLCBidGZfd3RyKTtcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuKyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgMVxcbisjZGVmaW5lIE1BUF9EVU1QX0JBVENIX1NJWkUgMjU2VVxcbisjZGVmaW5lIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAoNCAqIDEwMjQgKiAxMDI0KVxcbitcXG4rLyogUmV0dXJuIE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLIG9ubHkgYmVmb3JlIGJhdGNoIHRyYXZlcnNhbCBzdGFydHMuICovXFxuK3N0YXRpYyBpbnQgZHVtcF9tYXBfYmF0Y2goaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbitcXHRcXHRcXHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcXG4rXFx0XFx0XFx0ICBqc29uX3dyaXRlcl90ICp3dHIsIHVuc2lnbmVkIGludCAqbnVtX2VsZW1zKVxcbit7XFxuK1xcdF9fdTMyIGNhcGFjaXR5LCBjb3VudCwgYmF0Y2ggPSAwLCBuZXh0X2JhdGNoID0gMCwgaTtcXG4rXFx0dm9pZCAqa2V5cyA9IE5VTEwsICp2YWx1ZXMgPSBOVUxMLCAqYnVmO1xcbitcXHRib29sIGZpcnN0ID0gdHJ1ZSwgY2FuX2ZhbGxiYWNrID0gdHJ1ZTtcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlXFxuK1xcdCAqIG9wdGltaXphdGlvbiB0byBtYXBzIHdob3NlIHdvcnN0LWNhc2UgYnVja2V0IGZpdHMgdGhlIG1lbW9yeSBidWRnZXQsXFxuK1xcdCAqIHNvIGEgbGF0ZXIgRU5PU1BDIG5ldmVyIGZvcmNlcyBhIHJlc3RhcnQgYWZ0ZXIgcHJpbnRpbmcgc29tZSBlbnRyaWVzLlxcbitcXHQgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLlxcbitcXHQgKi9cXG4rXFx0aWYgKGluZm8tXFx1MDAzZXR5cGUgIT0gQlBGX01BUF9UWVBFX0hBU0ggfHwgIWluZm8tXFx1MDAzZW1heF9lbnRyaWVzIHx8XFxuK1xcdCAgICAoX191NjQpaW5mby1cXHUwMDNla2V5X3NpemUgKyBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplIFxcdTAwM2VcXG4rXFx0ICAgIE1BUF9EVU1QX0JBVENIX01BWF9CWVRFUyAvIGluZm8tXFx1MDAzZW1heF9lbnRyaWVzKVxcbitcXHRcXHRyZXR1cm4gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0s7XFxuK1xcbitcXHRjYXBhY2l0eSA9IG1pbihpbmZvLVxcdTAwM2VtYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7XFxuK3Jlc2l6ZTpcXG4rXFx0YnVmID0gcmVhbGxvYyhrZXlzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRpZiAoIWJ1Zikge1xcbitcXHRcXHRlcnIgPSBFTk9NRU07XFxuK1xcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdH1cXG4rXFx0a2V5cyA9IGJ1ZjtcXG4rXFx0YnVmID0gcmVhbGxvYyh2YWx1ZXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLVxcdTAwM2V2YWx1ZV9zaXplKTtcXG4rXFx0aWYgKCFidWYpIHtcXG4rXFx0XFx0ZXJyID0gRU5PTUVNO1xcbitcXHRcXHRnb3RvIGVycm9yO1xcbitcXHR9XFxuK1xcdHZhbHVlcyA9IGJ1ZjtcXG4rXFxuK1xcdHdoaWxlICh0cnVlKSB7XFxuK1xcdFxcdGNvdW50ID0gY2FwYWNpdHk7XFxuK1xcdFxcdGVyciA9IGJwZl9tYXBfbG9va3VwX2JhdGNoKGZkLCBmaXJzdCA/IE5VTEwgOiBcXHUwMDI2YmF0Y2gsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIFxcdTAwMjZuZXh0X2JhdGNoLCBrZXlzLCB2YWx1ZXMsIFxcdTAwMjZjb3VudCwgTlVMTCk7XFxuK1xcdFxcdGVyciA9IGVyciA/IGVycm5vIDogMDtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogT2xkZXIga2VybmVscyByZWplY3QgdGhlIGNvbW1hbmQgYmVmb3JlIHVwZGF0aW5nIGNvdW50LiBEbyBub3RcXG4rXFx0XFx0ICogaW5zcGVjdCB0aGUgYnVmZmVycyBvbiB0aGVzZSBlcnJvcnMsIG9yIGZhbGwgYmFjayBhZnRlciBwcm9ncmVzcy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChjYW5fZmFsbGJhY2sgXFx1MDAyNlxcdTAwMjYgKGVyciA9PSBFSU5WQUwgfHwgZXJyID09IEVPUE5PVFNVUFAgfHxcXG4rXFx0XFx0XFx0XFx0ICAgICBlcnIgPT0gNTI0IC8qIEVOT1RTVVBQICovKSkge1xcbitcXHRcXHRcXHRlcnIgPSBNQVBfRFVNUF9CQVRDSF9GQUxMQkFDSztcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y2FuX2ZhbGxiYWNrID0gZmFsc2U7XFxuK1xcdFxcdGlmIChlcnIgPT0gRU5PU1BDKSB7XFxuK1xcdFxcdFxcdGlmIChjYXBhY2l0eSA9PSBpbmZvLVxcdTAwM2VtYXhfZW50cmllcylcXG4rXFx0XFx0XFx0XFx0Z290byBlcnJvcjtcXG4rXFx0XFx0XFx0Y2FwYWNpdHkgKz0gbWluKGNhcGFjaXR5LCBpbmZvLVxcdTAwM2VtYXhfZW50cmllcyAtIGNhcGFjaXR5KTtcXG4rXFx0XFx0XFx0LyogUHJlc2VydmUgdGhlIGlucHV0IGN1cnNvcjogdGhlIG92ZXJzaXplZCBidWNrZXQgd2FzIG5vdCByZWFkLiAqL1xcbitcXHRcXHRcXHRnb3RvIHJlc2l6ZTtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBJbiBwYXJ0aWN1bGFyLCBFRkFVTFQgY2FuIGxlYXZlIGNvdW50IGFuZCB0aGUgYnVmZmVycyBpbnZhbGlkLiAqL1xcbitcXHRcXHRpZiAoZXJyIFxcdTAwMjZcXHUwMDI2IGVyciAhPSBFTk9FTlQpXFxuK1xcdFxcdFxcdGdvdG8gZXJyb3I7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBjb3VudDsgaSsrKSB7XFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIEtlZXAgdGhlIGFsaWdubWVudCBwcm92aWRlZCBieSBpbmRpdmlkdWFsIGxvb2t1cHMsIGluY2x1ZGluZ1xcbitcXHRcXHRcXHQgKiBmb3IgQlRGIHR5cGVzIHdob3NlIG1hcCBrZXkvdmFsdWUgc2l6ZSBpcyBub3QgYWxpZ25lZC5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdG1lbWNweShrZXksIGtleXMgKyAoc2l6ZV90KWkgKiBpbmZvLVxcdTAwM2VrZXlfc2l6ZSwgaW5mby1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRcXHRcXHRtZW1jcHkodmFsdWUsIHZhbHVlcyArIChzaXplX3QpaSAqIGluZm8tXFx1MDAzZXZhbHVlX3NpemUsIGluZm8tXFx1MDAzZXZhbHVlX3NpemUpO1xcbitcXHRcXHRcXHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7XFxuK1xcdFxcdFxcdCgqbnVtX2VsZW1zKSsrO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChlcnIgPT0gRU5PRU5UKSB7XFxuK1xcdFxcdFxcdGVyciA9IDA7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdFxcdGZpcnN0ID0gZmFsc2U7XFxuK1xcdFxcdGJhdGNoID0gbmV4dF9iYXRjaDtcXG4rXFx0fVxcbitlcnJvcjpcXG4rXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJFcnJvcjogY2FuJ3QgbG9va3VwIG1hcCBiYXRjaDogJXNcXFxcblxcXCIsIHN0cmVycm9yKGVycikpO1xcbitcXHRlcnIgPSAtMTtcXG4rb3V0OlxcbitcXHRmcmVlKGtleXMpO1xcbitcXHRmcmVlKHZhbHVlcyk7XFxuK1xcdHJldHVybiBlcnI7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnQgbWFwc19oYXZlX2J0ZihpbnQgKmZkcywgaW50IG5iX2ZkcylcXG4ge1xcbiBcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG5AQCAtODY5LDYgKzk2Niw5IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxcbiBcXHRcXHRwX2luZm8oXFxcIldhcm5pbmc6IGNhbm5vdCByZWFkIHZhbHVlcyBmcm9tICVzIG1hcCB3aXRoIHZhbHVlX3NpemUgIT0gOFxcXCIsXFxuIFxcdFxcdCAgICAgICBtYXBfdHlwZV9zdHIpO1xcbiBcXHR9XFxuK1xcdGVyciA9IGR1bXBfbWFwX2JhdGNoKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0ciwgXFx1MDAyNm51bV9lbGVtcyk7XFxuK1xcdGlmIChlcnIgIT0gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0spXFxuK1xcdFxcdGdvdG8gZW5kX2R1bXA7XFxuIFxcdHdoaWxlICh0cnVlKSB7XFxuIFxcdFxcdGVyciA9IGJwZl9tYXBfZ2V0X25leHRfa2V5KGZkLCBwcmV2X2tleSwga2V5KTtcXG4gXFx0XFx0aWYgKGVycikge1xcbkBAIC04ODEsNiArOTgxLDcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcdFxcdHByZXZfa2V5ID0ga2V5O1xcbiBcXHR9XFxuIFxcbitlbmRfZHVtcDpcXG4gXFx0aWYgKHd0cikge1xcbiBcXHRcXHRqc29ud19lbmRfYXJyYXkod3RyKTtcXHQvKiBlbGVtZW50cyAqL1xcbiBcXHRcXHRpZiAoc2hvd19oZWFkZXIpXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iNDIxNmVkNzc4ZWY5XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmNcXG5AQCAtMCwwICsxLDE4NyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisjaW5jbHVkZSBcXHUwMDNjdGVzdF9wcm9ncy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmdG9vbF9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnRmLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NjdHlwZS5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBNQVhfRU5UUklFUyAxMDI1XFxuKyNkZWZpbmUgUkVDT1JEX1NJWkUgMjU2XFxuKyNkZWZpbmUgT1VUUFVUX1NJWkUgKE1BWF9FTlRSSUVTICogUkVDT1JEX1NJWkUgKyAxMDI0KVxcbitcXG4rc3RydWN0IGR1bXBfY2FzZSB7XFxuK1xcdGNvbnN0IGNoYXIgKm5hbWU7XFxuK1xcdHVuc2lnbmVkIGludCBjb3VudDtcXG4rXFx0dW5zaWduZWQgaW50IGtleV9zaXplO1xcbitcXHR1bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZTtcXG4rXFx0Ym9vbCBidGY7XFxuK307XFxuK1xcbitzdGF0aWMgdm9pZCBoZXhfYnl0ZXMoY2hhciAqb3V0LCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBqc29uKVxcbit7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gZGF0YTtcXG4rXFx0dW5zaWduZWQgaW50IGk7XFxuK1xcbitcXHRpZiAoanNvbilcXG4rXFx0XFx0Km91dCsrID0gJ1snO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2Mgc2l6ZTsgaSsrKSB7XFxuK1xcdFxcdGlmIChqc29uIFxcdTAwMjZcXHUwMDI2IGkpXFxuK1xcdFxcdFxcdCpvdXQrKyA9ICcsJztcXG4rXFx0XFx0b3V0ICs9IHNwcmludGYob3V0LCBqc29uID8gXFxcIlxcXFxcXFwiMHglMDJ4XFxcXFxcXCJcXFwiIDogXFxcIiUwMnhcXFwiLCBieXRlc1tpXSk7XFxuK1xcdH1cXG4rXFx0aWYgKGpzb24pXFxuK1xcdFxcdCpvdXQrKyA9ICddJztcXG4rXFx0Km91dCA9ICdcXFxcMCc7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGV4cGVjdGVkX3JlY29yZChjaGFyICpyZWNvcmQsIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsXFxuK1xcdFxcdFxcdCAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIGJvb2wganNvbilcXG4re1xcbitcXHRfX3UzMiBrZXkgPSBpbmRleCwgdmFsdWUgPSBpbmRleCAqIDM3ICsgMTE7XFxuK1xcdHVuc2lnbmVkIGNoYXIgc2hvcnRfa2V5ID0gaW5kZXg7XFxuK1xcdGNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07XFxuK1xcbitcXHRoZXhfYnl0ZXMoa2V5X2hleCwgdGVzdC1cXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXFx1MDAyNnNob3J0X2tleSA6IFxcdTAwMjZrZXksXFxuK1xcdFxcdCAgdGVzdC1cXHUwMDNla2V5X3NpemUsIGpzb24pO1xcbitcXHRoZXhfYnl0ZXModmFsdWVfaGV4LCBcXHUwMDI2dmFsdWUsIHRlc3QtXFx1MDAzZXZhbHVlX3NpemUsIGpzb24pO1xcbitcXHRzbnByaW50Zihmb3JtYXR0ZWQsIHNpemVvZihmb3JtYXR0ZWQpLCBcXFwie1xcXFxcXFwia2V5XFxcXFxcXCI6JXUsXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOiV1fVxcXCIsXFxuK1xcdFxcdCBrZXksIHZhbHVlKTtcXG4rXFx0aWYgKGpzb24gXFx1MDAyNlxcdTAwMjYgdGVzdC1cXHUwMDNlYnRmKVxcbitcXHRcXHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLFxcbitcXHRcXHRcXHQgXFxcIntcXFxcXFxcImtleVxcXFxcXFwiOiVzLFxcXFxcXFwidmFsdWVcXFxcXFxcIjolcyxcXFxcXFxcImZvcm1hdHRlZFxcXFxcXFwiOiVzfVxcXCIsXFxuK1xcdFxcdFxcdCBrZXlfaGV4LCB2YWx1ZV9oZXgsIGZvcm1hdHRlZCk7XFxuK1xcdGVsc2UgaWYgKGpzb24pXFxuK1xcdFxcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFxcXCJ7XFxcXFxcXCJrZXlcXFxcXFxcIjolcyxcXFxcXFxcInZhbHVlXFxcXFxcXCI6JXN9XFxcIixcXG4rXFx0XFx0XFx0IGtleV9oZXgsIHZhbHVlX2hleCk7XFxuK1xcdGVsc2UgaWYgKHRlc3QtXFx1MDAzZWJ0ZilcXG4rXFx0XFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXFxcIiVzXFxcIiwgZm9ybWF0dGVkKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcXFwia2V5OiVzdmFsdWU6JXNcXFwiLCBrZXlfaGV4LCB2YWx1ZV9oZXgpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjaGVja19kdW1wKGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgKnRlc3QsIF9fdTMyIGlkLCBib29sIGpzb24sIGJvb2wgcHJldHR5KVxcbit7XFxuK1xcdGJvb2wgYXJyYXkgPSBqc29uIHx8IHRlc3QtXFx1MDAzZWJ0ZjtcXG4rXFx0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBleHBlY3RlZFtSRUNPUkRfU0laRV0sIGZvb3Rlcls2NF07XFxuK1xcdGJvb2wgc2VlbltNQVhfRU5UUklFU10gPSB7fTtcXG4rXFx0Y2hhciAqb3V0cHV0LCAqc3JjLCAqZHN0LCAqY3Vyc29yO1xcbitcXHR1bnNpZ25lZCBpbnQgaSwgbjtcXG4rXFx0aW50IGVycjtcXG4rXFxuK1xcdG91dHB1dCA9IGNhbGxvYygxLCBPVVRQVVRfU0laRSk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihvdXRwdXQsIFxcXCJhbGxvY19vdXRwdXRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCIlc21hcCBkdW1wIGlkICV1XFxcIixcXG4rXFx0XFx0IHByZXR0eSA/IFxcXCItcCBcXFwiIDoganNvbiA/IFxcXCItaiBcXFwiIDogXFxcIlxcXCIsIGlkKTtcXG4rXFx0ZXJyID0gZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcIm1hcF9kdW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHQvKlxcbitcXHQgKiBJZ25vcmUgcHJlc2VudGF0aW9uIHdoaXRlc3BhY2UsIGJ1dCBjb21wYXJlIGNvbXBsZXRlIHJlY29yZHMgYW5kIGFsbFxcbitcXHQgKiBwdW5jdHVhdGlvbi4gRXhwZWN0ZWQgY29udGVudHMgY29tZSBvbmx5IGZyb20gdGhlIGlucHV0IGRhdGEsIG5ldmVyXFxuK1xcdCAqIGZyb20gYW5vdGhlciBtYXAgd2FsayBvciBicGZ0b29sIGludm9jYXRpb24uXFxuK1xcdCAqL1xcbitcXHRmb3IgKHNyYyA9IG91dHB1dCwgZHN0ID0gb3V0cHV0OyAqc3JjOyBzcmMrKylcXG4rXFx0XFx0aWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxcbitcXHRcXHRcXHQqZHN0KysgPSAqc3JjO1xcbitcXHQqZHN0ID0gJ1xcXFwwJztcXG4rXFx0Y3Vyc29yID0gb3V0cHV0O1xcbitcXHRpZiAoYXJyYXkpIHtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJ1snLCBcXFwiYXJyYXlfc3RhcnRcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGN1cnNvcisrO1xcbitcXHR9XFxuK1xcdGZvciAobiA9IDA7IG4gXFx1MDAzYyB0ZXN0LVxcdTAwM2Vjb3VudDsgbisrKSB7XFxuK1xcdFxcdGlmIChhcnJheSBcXHUwMDI2XFx1MDAyNiBuKSB7XFxuK1xcdFxcdFxcdGlmICghQVNTRVJUX0VRKCpjdXJzb3IsICcsJywgXFxcInJlY29yZF9zZXBhcmF0b3JcXFwiKSlcXG4rXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdFxcdGN1cnNvcisrO1xcbitcXHRcXHR9XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyB0ZXN0LVxcdTAwM2Vjb3VudDsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmIChzZWVuW2ldKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0ZXhwZWN0ZWRfcmVjb3JkKGV4cGVjdGVkLCB0ZXN0LCBpLCBqc29uKTtcXG4rXFx0XFx0XFx0aWYgKCFzdHJuY21wKGN1cnNvciwgZXhwZWN0ZWQsIHN0cmxlbihleHBlY3RlZCkpKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LVxcdTAwM2Vjb3VudCwgXFxcInVuaXF1ZV9leHBlY3RlZF9yZWNvcmRcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHNlZW5baV0gPSB0cnVlO1xcbitcXHRcXHRjdXJzb3IgKz0gc3RybGVuKGV4cGVjdGVkKTtcXG4rXFx0fVxcbitcXHRpZiAoYXJyYXkpIHtcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKGN1cnNvciwgXFxcIl1cXFwiLCBcXFwiYXJyYXlfZW5kX2FuZF9jb3VudFxcXCIpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRzbnByaW50Zihmb290ZXIsIHNpemVvZihmb290ZXIpLCBcXFwiRm91bmQldWVsZW1lbnQlc1xcXCIsIHRlc3QtXFx1MDAzZWNvdW50LFxcbitcXHRcXHRcXHQgdGVzdC1cXHUwMDNlY291bnQgPT0gMSA/IFxcXCJcXFwiIDogXFxcInNcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKGN1cnNvciwgZm9vdGVyLCBcXFwicGxhaW5fY291bnRcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGZyZWUob3V0cHV0KTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcnVuX2R1bXBfY2FzZShjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0KVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xcbitcXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0X191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XFxuK1xcdHVuc2lnbmVkIGludCBpO1xcbitcXHRpbnQgZmQgPSAtMTtcXG4rXFxuK1xcdGlmICh0ZXN0LVxcdTAwM2VidGYpIHtcXG4rXFx0XFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImJ0Zl9uZXdcXFwiKSlcXG4rXFx0XFx0XFx0cmV0dXJuO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcXFwidW5zaWduZWQgaW50XFxcIiwgNCwgMCksIDEsXFxuK1xcdFxcdFxcdCAgICAgICBcXFwiYnRmX2ludFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcXFwiYnRmX2xvYWRcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdG9wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xcbitcXHRcXHRvcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XFxuK1xcdFxcdG9wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xcbitcXHR9XFxuK1xcdGZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2JhdGNoXFxcIiwgdGVzdC1cXHUwMDNla2V5X3NpemUsXFxuK1xcdFxcdFxcdCAgICB0ZXN0LVxcdTAwM2V2YWx1ZV9zaXplLCB0ZXN0LVxcdTAwM2Vjb3VudCA/OiAxLCBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkLCBcXFwibWFwX2NyZWF0ZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHRlc3QtXFx1MDAzZWNvdW50OyBpKyspIHtcXG4rXFx0XFx0X191MzIga2V5ID0gaSwgdmFsdWUgPSBpICogMzcgKyAxMTtcXG4rXFx0XFx0dW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpO1xcbitcXHRcXHR2b2lkICprZXlfcHRyID0gdGVzdC1cXHUwMDNla2V5X3NpemUgPT0gMSA/ICh2b2lkICopXFx1MDAyNnNob3J0X2tleSA6IFxcdTAwMjZrZXk7XFxuK1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkLCBrZXlfcHRyLCBcXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxcbitcXHRcXHRcXHQgICAgICAgXFxcIm1hcF91cGRhdGVcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXFx1MDAyNmluZm8sIFxcdTAwMjZpbmZvX2xlbiksIFxcXCJtYXBfaW5mb1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIGZhbHNlKTtcXG4rXFx0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCB0cnVlKTtcXG4rb3V0OlxcbitcXHRpZiAoZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UoZmQpO1xcbitcXHRidGZfX2ZyZWUoYnRmKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2JhdGNoKHZvaWQpXFxuK3tcXG4rXFx0c3RhdGljIGNvbnN0IHN0cnVjdCBkdW1wX2Nhc2UgY2FzZXNbXSA9IHtcXG4rXFx0XFx0eyBcXFwiZW1wdHlcXFwiLCAwLCA0LCA0IH0sXFxuK1xcdFxcdHsgXFxcInNpbmdsZVxcXCIsIDEsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwiYmVsb3dfYmF0Y2hcXFwiLCAyNTUsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwiZXhhY3RfYmF0Y2hcXFwiLCAyNTYsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwiYWJvdmVfYmF0Y2hcXFwiLCAyNTcsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwibXVsdGlwbGVfYmF0Y2hlc1xcXCIsIDEwMjUsIDQsIDQgfSxcXG4rXFx0XFx0eyBcXFwib25lX2J5dGVfa2V5XFxcIiwgMjU2LCAxLCA0IH0sXFxuK1xcdFxcdHsgXFxcIm9kZF92YWx1ZV9zaXplXFxcIiwgMjU3LCA0LCAzIH0sXFxuK1xcdFxcdHsgXFxcImJ0Zl9lbXB0eVxcXCIsIDAsIDQsIDQsIHRydWUgfSxcXG4rXFx0XFx0eyBcXFwiYnRmX3NpbmdsZVxcXCIsIDEsIDQsIDQsIHRydWUgfSxcXG4rXFx0XFx0eyBcXFwiYnRmX211bHRpcGxlX2JhdGNoZXNcXFwiLCAxMDI1LCA0LCA0LCB0cnVlIH0sXFxuK1xcdH07XFxuK1xcdHVuc2lnbmVkIGludCBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoY2FzZXMpOyBpKyspXFxuK1xcdFxcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KGNhc2VzW2ldLm5hbWUpKVxcbitcXHRcXHRcXHRydW5fZHVtcF9jYXNlKFxcdTAwMjZjYXNlc1tpXSk7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDQ6MDM6MDQuNzkxNjQ3ODE0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo3MDI4ODI1Njg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2UgdXRpbGl0aWVzIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCBzZWxmdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgKHZtbGludXggb3Iga2VybmVsIG1vZHVsZXMpLCBzbyBpdCBpcyBub3QgZnV6emFibGUgYnkgc3l6a2FsbGVyLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA4ODE3MDRlZTBhM2NmMTUzYTVjMWRhYzdjOTQ0NThmNjdhODcwYTBlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDQ6MDM6MDEgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYXAuYyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5pbmRleCA2ODRhOGZiNzI0MTQ2Li45NzFkYTE3MzYwMGE3IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG5AQCAtNzQwLDE1ICs3NDAsMTAgQEAgc3RhdGljIGludCBkb19zaG93KGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdHJldHVybiBlcnJubyA9PSBFTk9FTlQgPyAwIDogLTE7XG4gfVxuIFxuLXN0YXRpYyBpbnQgZHVtcF9tYXBfZWxlbShpbnQgZmQsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4tXHRcdFx0IHN0cnVjdCBicGZfbWFwX2luZm8gKm1hcF9pbmZvLCBzdHJ1Y3QgYnRmICpidGYsXG4tXHRcdFx0IGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4rc3RhdGljIHZvaWQgcHJpbnRfbWFwX2VsZW0odm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbitcdFx0XHQgICBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCAgIGpzb25fd3JpdGVyX3QgKmJ0Zl93dHIpXG4ge1xuLVx0aWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oZmQsIGtleSwgdmFsdWUpKSB7XG4tXHRcdHByaW50X2VudHJ5X2Vycm9yKG1hcF9pbmZvLCBrZXksIGVycm5vKTtcbi1cdFx0cmV0dXJuIC0xO1xuLVx0fVxuLVxuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHByaW50X2VudHJ5X2pzb24obWFwX2luZm8sIGtleSwgdmFsdWUsIGJ0Zik7XG4gXHR9IGVsc2UgaWYgKGJ0Zikge1xuQEAgLTc2MiwxMCArNzU3LDExMiBAQCBzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0fSBlbHNlIHtcbiBcdFx0cHJpbnRfZW50cnlfcGxhaW4obWFwX2luZm8sIGtleSwgdmFsdWUpO1xuIFx0fVxuK31cbitcbitzdGF0aWMgaW50IGR1bXBfbWFwX2VsZW0oaW50IGZkLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuK1x0XHRcdCBzdHJ1Y3QgYnBmX21hcF9pbmZvICptYXBfaW5mbywgc3RydWN0IGJ0ZiAqYnRmLFxuK1x0XHRcdCBqc29uX3dyaXRlcl90ICpidGZfd3RyKVxuK3tcbitcdGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKGZkLCBrZXksIHZhbHVlKSkge1xuK1x0XHRwcmludF9lbnRyeV9lcnJvcihtYXBfaW5mbywga2V5LCBlcnJubyk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbiBcbitcdHByaW50X21hcF9lbGVtKGtleSwgdmFsdWUsIG1hcF9pbmZvLCBidGYsIGJ0Zl93dHIpO1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuKyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgMVxuKyNkZWZpbmUgTUFQX0RVTVBfQkFUQ0hfU0laRSAyNTZVXG4rI2RlZmluZSBNQVBfRFVNUF9CQVRDSF9NQVhfQllURVMgKDQgKiAxMDI0ICogMTAyNClcbitcbisvKiBSZXR1cm4gTUFQX0RVTVBfQkFUQ0hfRkFMTEJBQ0sgb25seSBiZWZvcmUgYmF0Y2ggdHJhdmVyc2FsIHN0YXJ0cy4gKi9cbitzdGF0aWMgaW50IGR1bXBfbWFwX2JhdGNoKGludCBmZCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbitcdFx0XHQgIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIHN0cnVjdCBidGYgKmJ0ZixcbitcdFx0XHQgIGpzb25fd3JpdGVyX3QgKnd0ciwgdW5zaWduZWQgaW50ICpudW1fZWxlbXMpXG4re1xuK1x0X191MzIgY2FwYWNpdHksIGNvdW50LCBiYXRjaCA9IDAsIG5leHRfYmF0Y2ggPSAwLCBpO1xuK1x0dm9pZCAqa2V5cyA9IE5VTEwsICp2YWx1ZXMgPSBOVUxMLCAqYnVmO1xuK1x0Ym9vbCBmaXJzdCA9IHRydWUsIGNhbl9mYWxsYmFjayA9IHRydWU7XG4rXHRpbnQgZXJyO1xuK1xuK1x0LypcbitcdCAqIEhhc2ggbG9va3VwIGJhdGNoZXMgbXVzdCBhY2NvbW1vZGF0ZSBhIHdob2xlIGJ1Y2tldC4gUmVzdHJpY3QgdGhlXG4rXHQgKiBvcHRpbWl6YXRpb24gdG8gbWFwcyB3aG9zZSB3b3JzdC1jYXNlIGJ1Y2tldCBmaXRzIHRoZSBtZW1vcnkgYnVkZ2V0LFxuK1x0ICogc28gYSBsYXRlciBFTk9TUEMgbmV2ZXIgZm9yY2VzIGEgcmVzdGFydCBhZnRlciBwcmludGluZyBzb21lIGVudHJpZXMuXG4rXHQgKiBEaXZpc2lvbiBhbHNvIGJvdW5kcyB0aGUgYWxsb2NhdGlvbiBtdWx0aXBsaWNhdGlvbnMgb24gMzItYml0IGhvc3RzLlxuK1x0ICovXG4rXHRpZiAoaW5mby1cdTAwM2V0eXBlICE9IEJQRl9NQVBfVFlQRV9IQVNIIHx8ICFpbmZvLVx1MDAzZW1heF9lbnRyaWVzIHx8XG4rXHQgICAgKF9fdTY0KWluZm8tXHUwMDNla2V5X3NpemUgKyBpbmZvLVx1MDAzZXZhbHVlX3NpemUgXHUwMDNlXG4rXHQgICAgTUFQX0RVTVBfQkFUQ0hfTUFYX0JZVEVTIC8gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbitcdFx0cmV0dXJuIE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLO1xuK1xuK1x0Y2FwYWNpdHkgPSBtaW4oaW5mby1cdTAwM2VtYXhfZW50cmllcywgTUFQX0RVTVBfQkFUQ0hfU0laRSk7XG4rcmVzaXplOlxuK1x0YnVmID0gcmVhbGxvYyhrZXlzLCAoc2l6ZV90KWNhcGFjaXR5ICogaW5mby1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRpZiAoIWJ1Zikge1xuK1x0XHRlcnIgPSBFTk9NRU07XG4rXHRcdGdvdG8gZXJyb3I7XG4rXHR9XG4rXHRrZXlzID0gYnVmO1xuK1x0YnVmID0gcmVhbGxvYyh2YWx1ZXMsIChzaXplX3QpY2FwYWNpdHkgKiBpbmZvLVx1MDAzZXZhbHVlX3NpemUpO1xuK1x0aWYgKCFidWYpIHtcbitcdFx0ZXJyID0gRU5PTUVNO1xuK1x0XHRnb3RvIGVycm9yO1xuK1x0fVxuK1x0dmFsdWVzID0gYnVmO1xuK1xuK1x0d2hpbGUgKHRydWUpIHtcbitcdFx0Y291bnQgPSBjYXBhY2l0eTtcbitcdFx0ZXJyID0gYnBmX21hcF9sb29rdXBfYmF0Y2goZmQsIGZpcnN0ID8gTlVMTCA6IFx1MDAyNmJhdGNoLFxuK1x0XHRcdFx0XHQgICBcdTAwMjZuZXh0X2JhdGNoLCBrZXlzLCB2YWx1ZXMsIFx1MDAyNmNvdW50LCBOVUxMKTtcbitcdFx0ZXJyID0gZXJyID8gZXJybm8gOiAwO1xuK1x0XHQvKlxuK1x0XHQgKiBPbGRlciBrZXJuZWxzIHJlamVjdCB0aGUgY29tbWFuZCBiZWZvcmUgdXBkYXRpbmcgY291bnQuIERvIG5vdFxuK1x0XHQgKiBpbnNwZWN0IHRoZSBidWZmZXJzIG9uIHRoZXNlIGVycm9ycywgb3IgZmFsbCBiYWNrIGFmdGVyIHByb2dyZXNzLlxuK1x0XHQgKi9cbitcdFx0aWYgKGNhbl9mYWxsYmFjayBcdTAwMjZcdTAwMjYgKGVyciA9PSBFSU5WQUwgfHwgZXJyID09IEVPUE5PVFNVUFAgfHxcbitcdFx0XHRcdCAgICAgZXJyID09IDUyNCAvKiBFTk9UU1VQUCAqLykpIHtcbitcdFx0XHRlcnIgPSBNQVBfRFVNUF9CQVRDSF9GQUxMQkFDSztcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRjYW5fZmFsbGJhY2sgPSBmYWxzZTtcbitcdFx0aWYgKGVyciA9PSBFTk9TUEMpIHtcbitcdFx0XHRpZiAoY2FwYWNpdHkgPT0gaW5mby1cdTAwM2VtYXhfZW50cmllcylcbitcdFx0XHRcdGdvdG8gZXJyb3I7XG4rXHRcdFx0Y2FwYWNpdHkgKz0gbWluKGNhcGFjaXR5LCBpbmZvLVx1MDAzZW1heF9lbnRyaWVzIC0gY2FwYWNpdHkpO1xuK1x0XHRcdC8qIFByZXNlcnZlIHRoZSBpbnB1dCBjdXJzb3I6IHRoZSBvdmVyc2l6ZWQgYnVja2V0IHdhcyBub3QgcmVhZC4gKi9cbitcdFx0XHRnb3RvIHJlc2l6ZTtcbitcdFx0fVxuK1x0XHQvKiBJbiBwYXJ0aWN1bGFyLCBFRkFVTFQgY2FuIGxlYXZlIGNvdW50IGFuZCB0aGUgYnVmZmVycyBpbnZhbGlkLiAqL1xuK1x0XHRpZiAoZXJyIFx1MDAyNlx1MDAyNiBlcnIgIT0gRU5PRU5UKVxuK1x0XHRcdGdvdG8gZXJyb3I7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNvdW50OyBpKyspIHtcbitcdFx0XHQvKlxuK1x0XHRcdCAqIEtlZXAgdGhlIGFsaWdubWVudCBwcm92aWRlZCBieSBpbmRpdmlkdWFsIGxvb2t1cHMsIGluY2x1ZGluZ1xuK1x0XHRcdCAqIGZvciBCVEYgdHlwZXMgd2hvc2UgbWFwIGtleS92YWx1ZSBzaXplIGlzIG5vdCBhbGlnbmVkLlxuK1x0XHRcdCAqL1xuK1x0XHRcdG1lbWNweShrZXksIGtleXMgKyAoc2l6ZV90KWkgKiBpbmZvLVx1MDAzZWtleV9zaXplLCBpbmZvLVx1MDAzZWtleV9zaXplKTtcbitcdFx0XHRtZW1jcHkodmFsdWUsIHZhbHVlcyArIChzaXplX3QpaSAqIGluZm8tXHUwMDNldmFsdWVfc2l6ZSwgaW5mby1cdTAwM2V2YWx1ZV9zaXplKTtcbitcdFx0XHRwcmludF9tYXBfZWxlbShrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cik7XG4rXHRcdFx0KCpudW1fZWxlbXMpKys7XG4rXHRcdH1cbitcdFx0aWYgKGVyciA9PSBFTk9FTlQpIHtcbitcdFx0XHRlcnIgPSAwO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXHRcdGZpcnN0ID0gZmFsc2U7XG4rXHRcdGJhdGNoID0gbmV4dF9iYXRjaDtcbitcdH1cbitlcnJvcjpcbitcdGZwcmludGYoc3RkZXJyLCBcIkVycm9yOiBjYW4ndCBsb29rdXAgbWFwIGJhdGNoOiAlc1xcblwiLCBzdHJlcnJvcihlcnIpKTtcbitcdGVyciA9IC0xO1xuK291dDpcbitcdGZyZWUoa2V5cyk7XG4rXHRmcmVlKHZhbHVlcyk7XG4rXHRyZXR1cm4gZXJyO1xuK31cbitcbiBzdGF0aWMgaW50IG1hcHNfaGF2ZV9idGYoaW50ICpmZHMsIGludCBuYl9mZHMpXG4ge1xuIFx0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvID0ge307XG5AQCAtODY5LDYgKzk2Niw5IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRwX2luZm8oXCJXYXJuaW5nOiBjYW5ub3QgcmVhZCB2YWx1ZXMgZnJvbSAlcyBtYXAgd2l0aCB2YWx1ZV9zaXplICE9IDhcIixcbiBcdFx0ICAgICAgIG1hcF90eXBlX3N0cik7XG4gXHR9XG4rXHRlcnIgPSBkdW1wX21hcF9iYXRjaChmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIsIFx1MDAyNm51bV9lbGVtcyk7XG4rXHRpZiAoZXJyICE9IE1BUF9EVU1QX0JBVENIX0ZBTExCQUNLKVxuK1x0XHRnb3RvIGVuZF9kdW1wO1xuIFx0d2hpbGUgKHRydWUpIHtcbiBcdFx0ZXJyID0gYnBmX21hcF9nZXRfbmV4dF9rZXkoZmQsIHByZXZfa2V5LCBrZXkpO1xuIFx0XHRpZiAoZXJyKSB7XG5AQCAtODgxLDYgKzk4MSw3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRwcmV2X2tleSA9IGtleTtcbiBcdH1cbiBcbitlbmRfZHVtcDpcbiBcdGlmICh3dHIpIHtcbiBcdFx0anNvbndfZW5kX2FycmF5KHd0cik7XHQvKiBlbGVtZW50cyAqL1xuIFx0XHRpZiAoc2hvd19oZWFkZXIpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2JhdGNoLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5iNDIxNmVkNzc4ZWY5XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jXG5AQCAtMCwwICsxLDE4NyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmdG9vbF9oZWxwZXJzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NjdHlwZS5oXHUwMDNlXG4rXG4rI2RlZmluZSBNQVhfRU5UUklFUyAxMDI1XG4rI2RlZmluZSBSRUNPUkRfU0laRSAyNTZcbisjZGVmaW5lIE9VVFBVVF9TSVpFIChNQVhfRU5UUklFUyAqIFJFQ09SRF9TSVpFICsgMTAyNClcbitcbitzdHJ1Y3QgZHVtcF9jYXNlIHtcbitcdGNvbnN0IGNoYXIgKm5hbWU7XG4rXHR1bnNpZ25lZCBpbnQgY291bnQ7XG4rXHR1bnNpZ25lZCBpbnQga2V5X3NpemU7XG4rXHR1bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZTtcbitcdGJvb2wgYnRmO1xuK307XG4rXG4rc3RhdGljIHZvaWQgaGV4X2J5dGVzKGNoYXIgKm91dCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wganNvbilcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IGRhdGE7XG4rXHR1bnNpZ25lZCBpbnQgaTtcbitcbitcdGlmIChqc29uKVxuK1x0XHQqb3V0KysgPSAnWyc7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzaXplOyBpKyspIHtcbitcdFx0aWYgKGpzb24gXHUwMDI2XHUwMDI2IGkpXG4rXHRcdFx0Km91dCsrID0gJywnO1xuK1x0XHRvdXQgKz0gc3ByaW50ZihvdXQsIGpzb24gPyBcIlxcXCIweCUwMnhcXFwiXCIgOiBcIiUwMnhcIiwgYnl0ZXNbaV0pO1xuK1x0fVxuK1x0aWYgKGpzb24pXG4rXHRcdCpvdXQrKyA9ICddJztcbitcdCpvdXQgPSAnXFwwJztcbit9XG4rXG4rc3RhdGljIHZvaWQgZXhwZWN0ZWRfcmVjb3JkKGNoYXIgKnJlY29yZCwgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdCxcbitcdFx0XHQgICAgdW5zaWduZWQgaW50IGluZGV4LCBib29sIGpzb24pXG4re1xuK1x0X191MzIga2V5ID0gaW5kZXgsIHZhbHVlID0gaW5kZXggKiAzNyArIDExO1xuK1x0dW5zaWduZWQgY2hhciBzaG9ydF9rZXkgPSBpbmRleDtcbitcdGNoYXIga2V5X2hleFs2NF0sIHZhbHVlX2hleFs2NF0sIGZvcm1hdHRlZFs5Nl07XG4rXG4rXHRoZXhfYnl0ZXMoa2V5X2hleCwgdGVzdC1cdTAwM2VrZXlfc2l6ZSA9PSAxID8gKHZvaWQgKilcdTAwMjZzaG9ydF9rZXkgOiBcdTAwMjZrZXksXG4rXHRcdCAgdGVzdC1cdTAwM2VrZXlfc2l6ZSwganNvbik7XG4rXHRoZXhfYnl0ZXModmFsdWVfaGV4LCBcdTAwMjZ2YWx1ZSwgdGVzdC1cdTAwM2V2YWx1ZV9zaXplLCBqc29uKTtcbitcdHNucHJpbnRmKGZvcm1hdHRlZCwgc2l6ZW9mKGZvcm1hdHRlZCksIFwie1xcXCJrZXlcXFwiOiV1LFxcXCJ2YWx1ZVxcXCI6JXV9XCIsXG4rXHRcdCBrZXksIHZhbHVlKTtcbitcdGlmIChqc29uIFx1MDAyNlx1MDAyNiB0ZXN0LVx1MDAzZWJ0ZilcbitcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSxcbitcdFx0XHQgXCJ7XFxcImtleVxcXCI6JXMsXFxcInZhbHVlXFxcIjolcyxcXFwiZm9ybWF0dGVkXFxcIjolc31cIixcbitcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4LCBmb3JtYXR0ZWQpO1xuK1x0ZWxzZSBpZiAoanNvbilcbitcdFx0c25wcmludGYocmVjb3JkLCBSRUNPUkRfU0laRSwgXCJ7XFxcImtleVxcXCI6JXMsXFxcInZhbHVlXFxcIjolc31cIixcbitcdFx0XHQga2V5X2hleCwgdmFsdWVfaGV4KTtcbitcdGVsc2UgaWYgKHRlc3QtXHUwMDNlYnRmKVxuK1x0XHRzbnByaW50ZihyZWNvcmQsIFJFQ09SRF9TSVpFLCBcIiVzXCIsIGZvcm1hdHRlZCk7XG4rXHRlbHNlXG4rXHRcdHNucHJpbnRmKHJlY29yZCwgUkVDT1JEX1NJWkUsIFwia2V5OiVzdmFsdWU6JXNcIiwga2V5X2hleCwgdmFsdWVfaGV4KTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY2hlY2tfZHVtcChjb25zdCBzdHJ1Y3QgZHVtcF9jYXNlICp0ZXN0LCBfX3UzMiBpZCwgYm9vbCBqc29uLCBib29sIHByZXR0eSlcbit7XG4rXHRib29sIGFycmF5ID0ganNvbiB8fCB0ZXN0LVx1MDAzZWJ0ZjtcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgZXhwZWN0ZWRbUkVDT1JEX1NJWkVdLCBmb290ZXJbNjRdO1xuK1x0Ym9vbCBzZWVuW01BWF9FTlRSSUVTXSA9IHt9O1xuK1x0Y2hhciAqb3V0cHV0LCAqc3JjLCAqZHN0LCAqY3Vyc29yO1xuK1x0dW5zaWduZWQgaW50IGksIG47XG4rXHRpbnQgZXJyO1xuK1xuK1x0b3V0cHV0ID0gY2FsbG9jKDEsIE9VVFBVVF9TSVpFKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihvdXRwdXQsIFwiYWxsb2Nfb3V0cHV0XCIpKVxuK1x0XHRyZXR1cm47XG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwiJXNtYXAgZHVtcCBpZCAldVwiLFxuK1x0XHQgcHJldHR5ID8gXCItcCBcIiA6IGpzb24gPyBcIi1qIFwiIDogXCJcIiwgaWQpO1xuK1x0ZXJyID0gZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBPVVRQVVRfU0laRSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwibWFwX2R1bXBcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0LypcbitcdCAqIElnbm9yZSBwcmVzZW50YXRpb24gd2hpdGVzcGFjZSwgYnV0IGNvbXBhcmUgY29tcGxldGUgcmVjb3JkcyBhbmQgYWxsXG4rXHQgKiBwdW5jdHVhdGlvbi4gRXhwZWN0ZWQgY29udGVudHMgY29tZSBvbmx5IGZyb20gdGhlIGlucHV0IGRhdGEsIG5ldmVyXG4rXHQgKiBmcm9tIGFub3RoZXIgbWFwIHdhbGsgb3IgYnBmdG9vbCBpbnZvY2F0aW9uLlxuK1x0ICovXG4rXHRmb3IgKHNyYyA9IG91dHB1dCwgZHN0ID0gb3V0cHV0OyAqc3JjOyBzcmMrKylcbitcdFx0aWYgKCFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpzcmMpKVxuK1x0XHRcdCpkc3QrKyA9ICpzcmM7XG4rXHQqZHN0ID0gJ1xcMCc7XG4rXHRjdXJzb3IgPSBvdXRwdXQ7XG4rXHRpZiAoYXJyYXkpIHtcbitcdFx0aWYgKCFBU1NFUlRfRVEoKmN1cnNvciwgJ1snLCBcImFycmF5X3N0YXJ0XCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRjdXJzb3IrKztcbitcdH1cbitcdGZvciAobiA9IDA7IG4gXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IG4rKykge1xuK1x0XHRpZiAoYXJyYXkgXHUwMDI2XHUwMDI2IG4pIHtcbitcdFx0XHRpZiAoIUFTU0VSVF9FUSgqY3Vyc29yLCAnLCcsIFwicmVjb3JkX3NlcGFyYXRvclwiKSlcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdGN1cnNvcisrO1xuK1x0XHR9XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRcdGlmIChzZWVuW2ldKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXHRcdFx0ZXhwZWN0ZWRfcmVjb3JkKGV4cGVjdGVkLCB0ZXN0LCBpLCBqc29uKTtcbitcdFx0XHRpZiAoIXN0cm5jbXAoY3Vyc29yLCBleHBlY3RlZCwgc3RybGVuKGV4cGVjdGVkKSkpXG4rXHRcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRpZiAoIUFTU0VSVF9MVChpLCB0ZXN0LVx1MDAzZWNvdW50LCBcInVuaXF1ZV9leHBlY3RlZF9yZWNvcmRcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdHNlZW5baV0gPSB0cnVlO1xuK1x0XHRjdXJzb3IgKz0gc3RybGVuKGV4cGVjdGVkKTtcbitcdH1cbitcdGlmIChhcnJheSkge1xuK1x0XHRBU1NFUlRfU1RSRVEoY3Vyc29yLCBcIl1cIiwgXCJhcnJheV9lbmRfYW5kX2NvdW50XCIpO1xuK1x0fSBlbHNlIHtcbitcdFx0c25wcmludGYoZm9vdGVyLCBzaXplb2YoZm9vdGVyKSwgXCJGb3VuZCV1ZWxlbWVudCVzXCIsIHRlc3QtXHUwMDNlY291bnQsXG4rXHRcdFx0IHRlc3QtXHUwMDNlY291bnQgPT0gMSA/IFwiXCIgOiBcInNcIik7XG4rXHRcdEFTU0VSVF9TVFJFUShjdXJzb3IsIGZvb3RlciwgXCJwbGFpbl9jb3VudFwiKTtcbitcdH1cbitvdXQ6XG4rXHRmcmVlKG91dHB1dCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJ1bl9kdW1wX2Nhc2UoY29uc3Qgc3RydWN0IGR1bXBfY2FzZSAqdGVzdClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuK1x0X191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7XG4rXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXHRpbnQgZmQgPSAtMTtcbitcbitcdGlmICh0ZXN0LVx1MDAzZWJ0Zikge1xuK1x0XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuK1x0XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImJ0Zl9uZXdcIikpXG4rXHRcdFx0cmV0dXJuO1xuK1x0XHRpZiAoIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcInVuc2lnbmVkIGludFwiLCA0LCAwKSwgMSxcbitcdFx0XHQgICAgICAgXCJidGZfaW50XCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcImJ0Zl9sb2FkXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRvcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbitcdFx0b3B0cy5idGZfa2V5X3R5cGVfaWQgPSAxO1xuK1x0XHRvcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTtcbitcdH1cbitcdGZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwiZHVtcF9iYXRjaFwiLCB0ZXN0LVx1MDAzZWtleV9zaXplLFxuK1x0XHRcdCAgICB0ZXN0LVx1MDAzZXZhbHVlX3NpemUsIHRlc3QtXHUwMDNlY291bnQgPzogMSwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCJtYXBfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIHRlc3QtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRfX3UzMiBrZXkgPSBpLCB2YWx1ZSA9IGkgKiAzNyArIDExO1xuK1x0XHR1bnNpZ25lZCBjaGFyIHNob3J0X2tleSA9IGk7XG4rXHRcdHZvaWQgKmtleV9wdHIgPSB0ZXN0LVx1MDAzZWtleV9zaXplID09IDEgPyAodm9pZCAqKVx1MDAyNnNob3J0X2tleSA6IFx1MDAyNmtleTtcbitcbitcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZCwga2V5X3B0ciwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcIm1hcF91cGRhdGVcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZpbmZvX2xlbiksIFwibWFwX2luZm9cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCBmYWxzZSwgZmFsc2UpO1xuK1x0Y2hlY2tfZHVtcCh0ZXN0LCBpbmZvLmlkLCB0cnVlLCBmYWxzZSk7XG4rXHRjaGVja19kdW1wKHRlc3QsIGluZm8uaWQsIHRydWUsIHRydWUpO1xuK291dDpcbitcdGlmIChmZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkKTtcbitcdGJ0Zl9fZnJlZShidGYpO1xuK31cbitcbit2b2lkIHRlc3RfYnBmdG9vbF9tYXBfYmF0Y2godm9pZClcbit7XG4rXHRzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBfY2FzZSBjYXNlc1tdID0ge1xuK1x0XHR7IFwiZW1wdHlcIiwgMCwgNCwgNCB9LFxuK1x0XHR7IFwic2luZ2xlXCIsIDEsIDQsIDQgfSxcbitcdFx0eyBcImJlbG93X2JhdGNoXCIsIDI1NSwgNCwgNCB9LFxuK1x0XHR7IFwiZXhhY3RfYmF0Y2hcIiwgMjU2LCA0LCA0IH0sXG4rXHRcdHsgXCJhYm92ZV9iYXRjaFwiLCAyNTcsIDQsIDQgfSxcbitcdFx0eyBcIm11bHRpcGxlX2JhdGNoZXNcIiwgMTAyNSwgNCwgNCB9LFxuK1x0XHR7IFwib25lX2J5dGVfa2V5XCIsIDI1NiwgMSwgNCB9LFxuK1x0XHR7IFwib2RkX3ZhbHVlX3NpemVcIiwgMjU3LCA0LCAzIH0sXG4rXHRcdHsgXCJidGZfZW1wdHlcIiwgMCwgNCwgNCwgdHJ1ZSB9LFxuK1x0XHR7IFwiYnRmX3NpbmdsZVwiLCAxLCA0LCA0LCB0cnVlIH0sXG4rXHRcdHsgXCJidGZfbXVsdGlwbGVfYmF0Y2hlc1wiLCAxMDI1LCA0LCA0LCB0cnVlIH0sXG4rXHR9O1xuK1x0dW5zaWduZWQgaW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGNhc2VzKTsgaSsrKVxuK1x0XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChjYXNlc1tpXS5uYW1lKSlcbitcdFx0XHRydW5fZHVtcF9jYXNlKFx1MDAyNmNhc2VzW2ldKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwNDowMzowNC43OTE2NDk0MDRaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3MDI4ODAzMjU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlRyaWFnZSBEZWNpc2lvbjogV29ydGhGdXp6aW5nID0gRmFsc2UqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFRoZSBwYXRjaCBkaWZmIGluZGljYXRlcyBjaGFuZ2VzIHRvIGB0b29scy9icGYvYnBmdG9vbC9tYXAuY2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9iYXRjaC5jYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdGhlc2UgYXJlIGxpa2VseSBub24ta2VybmVsIGFuZCB1c2VyLXNwYWNlIGNoYW5nZXMsIGJ1dCBsZXQncyBiZSB0aG9yb3VnaC5cblxuRmlyc3QsIEknbGwgcXVpY2tseSBjb25zdWx0IHRoZSB0cmlhZ2UgcnVsZXMuIFdlJ3JlIGxvb2tpbmcgZm9yIG1vZGlmaWNhdGlvbnMgdGhhdCBmYWxsIHVuZGVyIHRoZSBcIk5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXNcIiBjYXRlZ29yeS4gVGhpcyBtZWFucyBmb2N1c2luZyBvbiBjaGFuZ2VzIHRvIGRvY3VtZW50YXRpb24sIGNvbW1lbnRzLCBzcGVsbGluZywgb3IgdXNlci1zcGFjZSBkaXJlY3RvcmllcyBsaWtlIGB0b29scy9gLCBgc2FtcGxlcy9gLCBgc2NyaXB0cy9gLCBhbmQgYHVzci9gICp0aGF0KiBkb24ndCBpbXBhY3QgdGhlIGtlcm5lbCBpbWFnZSBvciBtb2R1bGVzLlxuXG5JJ3ZlIGdvdCBib3RoIGZpbGVzIGluIHRoZSBgdG9vbHMvYCBkaXJlY3RvcnkuIEdpdmVuIG15IGV4cGVyaWVuY2UsIEknbSBjb25maWRlbnQgdGhleSdyZSB1c2VyLXNwYWNlLiBKdXN0IHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiwgSSdsbCBtZW50YWxseSBkb3VibGUtY2hlY2sgdGhlIGRpZmYgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBvdGhlciB1bmV4cGVjdGVkIGZpbGVzIGluIHRoZSBjaGFuZ2Ugc2V0LiBOb3BlLCB0aGUgZGlmZiBjb25maXJtcyBpdCdzIG9ubHkgdGhlc2UgdHdvIGZpbGVzLlxuXG5Ob3csIGxldCdzIG1hdGNoIHRoaXMgdXAgd2l0aCB0aGUgY3JpdGVyaWEuIFRoZSByZXF1aXJlbWVudHMgc3BlY2lmaWNhbGx5IHNheSBcIlJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXMuLi5cIiBhbmQgaXQgcGVyZmVjdGx5IGRlc2NyaWJlcyB0aGUgY2hhbmdlczogdXNlci1zcGFjZSBgdG9vbHMvYCBkaXJlY3RvcnkgZmlsZXMgYW5kIHNlbGZ0ZXN0cyB3aGljaCBoYXZlIHplcm8gZWZmZWN0IG9uIHRoZSBrZXJuZWwuXG5cblRoZXJlZm9yZSwgZ2l2ZW4gdGhhdCBhbGwgY2hhbmdlcyBhcmUgY29uZmluZWQgdG8gdXNlci1zcGFjZSB0b29scyBhbmQgdGVzdHMsIGBXb3J0aEZ1enppbmdgIHNob3VsZCBkZWZpbml0ZWx5IGJlIGBmYWxzZWAuIGBGb2N1c1N5bWJvbHNgIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBhcyB0aGVyZSdzIG5vdGhpbmcga2VybmVsLXJlbGF0ZWQgaGVyZSwgYW5kIGxpa2V3aXNlLCBgRW5hYmxlQ29uZmlnc2Agd2lsbCBhbHNvIGJlIGVtcHR5LlxuXG5UaGUgY29uY2lzZSByZWFzb25pbmcgaXM6IFwiVGhlIHBhdGNoIG9ubHkgdG91Y2hlcyB1c2VyLXNwYWNlIHRvb2xzIChgdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNgKSBhbmQgc2VsZnRlc3RzIChgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfYmF0Y2guY2ApLCB3aGljaCBkbyBub3QgbW9kaWZ5IHRoZSBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiXG5cbkFscmlnaHQsIHRpbWUgdG8gc2V0IHRoZSByZXN1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MDM3LCJPdXRwdXRUb2tlbnMiOjkwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTQ3LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDQ6MDM6MTEuODIwNDU0ODg5WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjU5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXItc3BhY2UgdXRpbGl0aWVzIGluIHRvb2xzL2JwZi9icGZ0b29sIGFuZCBzZWxmdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsIGNvZGUgKHZtbGludXggb3Iga2VybmVsIG1vZHVsZXMpLCBzbyBpdCBpcyBub3QgZnV6emFibGUgYnkgc3l6a2FsbGVyLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHV0aWxpdGllcyBpbiB0b29scy9icGYvYnBmdG9vbCBhbmQgc2VsZnRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbCBjb2RlICh2bWxpbnV4IG9yIGtlcm5lbCBtb2R1bGVzKSwgc28gaXQgaXMgbm90IGZ1enphYmxlIGJ5IHN5emthbGxlci5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDA0OjAzOjExLjgyMDQ3NTU5OVoiLCJTZXEiOjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNzcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowx628w[1] Phase: Running StartedAt: 2026-09-11 04:03:22 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowx628w[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-11 04:03:22 +0000 UTC FinishedAt: 2026-09-11 04:03:25 +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,}