Name: series-workflow2gwds Phase: Failed StartedAt: 2026-09-07 05:49:03 +0000 UTC FinishedAt: 2026-09-07 06:35:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2gwds[0] Phase: Succeeded StartedAt: 2026-09-07 05:49:03 +0000 UTC FinishedAt: 2026-09-07 06:34:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2gwds[0].run-triage Phase: Succeeded StartedAt: 2026-09-07 05:49:03 +0000 UTC FinishedAt: 2026-09-07 06:34:57 +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+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjM0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdXNlci1zcGFjZSB0b29scyAoYnBmdG9vbCkgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRlc3RzIHVuZGVyIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbC1zcGFjZSBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDY6MzQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA3OGY3NmJhNzQ3MzFjMzI5NmNmZDdkN2Y3NjllYTJjODczNmYwMWY2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwNjozNDozOCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5pbmRleCA1ZGFmM2RlNWM3NDQ2Li4yM2ZhYTY3MjY4NTg3IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5AQCAtMTYsNyAmIzQzOzE2LDggQEAgU1lOT1BTSVNcbiBcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxuIFxuLSpPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB9XG4mIzQzOypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfFxuJiM0Mzt7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB8IHsgKiotcioqIHwgKiotLXJlY3Vyc2l2ZSoqIH0gfVxuIFxuICpDT01NQU5EUyogOj1cbiB7ICoqc2hvdyoqIHwgKipsaXN0KiogfCAqKmNyZWF0ZSoqIHwgKipkdW1wKiogfCAqKnVwZGF0ZSoqIHwgKipsb29rdXAqKiB8ICoqZ2V0bmV4dCoqIHxcbkBAIC0xNzAsNiAmIzQzOzE3MSwyNSBAQCBPUFRJT05TXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcbiAgICAgdHJhY2VmcyBvciBCUEYgdmlydHVhbCBmaWxlIHN5c3RlbSkgd2hlbiBuZWNlc3NhcnkuXG4gXG4mIzQzOy1yLCAtLXJlY3Vyc2l2ZVxuJiM0MzsgICAgQWxzbyBkdW1wIHRoZSBpbm5lciBtYXBzIHJlZmVyZW5jZWQgYnkgKiphcnJheV9vZl9tYXBzKiogYW5kICoqaGFzaF9vZl9tYXBzKipcbiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmXG4mIzQzOyAgICBzZXZlcmFsIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4mIzQzO1xuJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dFxuJiM0MzsgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuJiM0MzsgICAgKiplbGVtZW50cyoqIGFycmF5LCBpbmNsdWRpbmcgd2hlbiBvbmx5IG9uZSBtYXAgaXMgZHVtcGVkLiBPdXRlciBtYXAgZW50cmllc1xuJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXJcbiYjNDM7ICAgIG1hcCBvYmplY3QuXG4mIzQzO1xuJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuXG4mIzQzOyAgICBhdG9taWMgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cyBvciByZW1vdmUgYVxuJiM0MzsgICAgcmVmZXJlbmNlZCBpbm5lciBtYXAgYmVmb3JlIGl0IGlzIHZpc2l0ZWQuIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWRcbiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXlcbiYjNDM7ICAgIGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cbiYjNDM7XG4mIzQzOyAgICBJbiBKU09OIG1vZGUsIHRoZSBlbmNsb3NpbmcgYXJyYXlzIGFuZCBvYmplY3RzIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZy5cbiYjNDM7XG4gRVhBTVBMRVNcbiA9PT09PT09PVxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpXG4gXG4gICAgICMgRGVhbCB3aXRoIG9wdGlvbnNcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXG4tICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiAgICAgICAgICAgICAtLXVzZS1sb2FkZXIgLS1iYXNlLWJ0ZiAtLXNpZ24gLWkgLWsmIzM5O1xuICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyBcJiMzNDskY1wmIzM0OyAtLSBcJiMzNDskY3VyXCYjMzQ7ICkgKVxuICAgICAgICAgcmV0dXJuIDBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbmluZGV4IGM5MWUxYTZlMWExZWMuLjQyNGFmNGE0OTZhNWMgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuQEAgLTI2LDYgJiM0MzsyNiw3IEBAIHN0YXRpYyBpbnQgKCpsYXN0X2RvX2hlbHApKGludCBhcmdjLCBjaGFyICoqYXJndik7XG4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xuIGJvb2wganNvbl9vdXRwdXQ7XG4mIzQzO2Jvb2wgcmVjdXJzaXZlX2R1bXA7XG4gYm9vbCBzaG93X3Bpbm5lZDtcbiBib29sIGJsb2NrX21vdW50O1xuIGJvb2wgdmVyaWZpZXJfbG9ncztcbkBAIC00NTIsNiAmIzQzOzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcJiMzNDtqc29uXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtqJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtoZWxwXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtoJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtwcmV0dHlcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3AmIzM5OyB9LFxuJiM0MztcdFx0eyBcJiMzNDtyZWN1cnNpdmVcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3ImIzM5OyB9LFxuIFx0XHR7IFwmIzM0O3ZlcnNpb25cJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O1YmIzM5OyB9LFxuIFx0XHR7IFwmIzM0O2JwZmZzXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtmJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDttYXBjb21wYXRcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O20mIzM5OyB9LFxuQEAgLTQ4NSw3ICYjNDM7NDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcJiMzNDticGZ0b29sXCYjMzQ7O1xuIFxuIFx0b3B0ZXJyID0gMDtcbi1cdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCYjMzQ7VmhwamZMbW5kU2k6azpCOmxcJiMzNDssXG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcJiMzNDtWaHBqcmZMbW5kU2k6azpCOmxcJiMzNDssXG4gXHRcdFx0XHQgIG9wdGlvbnMsIE5VTEwpKSBcdTAwM2U9IDApIHtcbiBcdFx0c3dpdGNoIChvcHQpIHtcbiBcdFx0Y2FzZSAmIzM5O1YmIzM5OzpcbkBAIC01MDcsNiAmIzQzOzUwOSw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHR9XG4gXHRcdFx0anNvbndfcHJldHR5KGpzb25fd3RyLCBwcmV0dHlfb3V0cHV0KTtcbiBcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtyJiMzOTs6XG4mIzQzO1x0XHRcdHJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtmJiMzOTs6XG4gXHRcdFx0c2hvd19waW5uZWQgPSB0cnVlO1xuIFx0XHRcdGJyZWFrO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaCBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuaW5kZXggNzhiNmUwZWJiODVkOC4uNzY2MjY2NDJlOTRjYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG5AQCAtODMsNiAmIzQzOzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xuIFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcbiYjNDM7ZXh0ZXJuIGJvb2wgcmVjdXJzaXZlX2R1bXA7XG4gZXh0ZXJuIGJvb2wgc2hvd19waW5uZWQ7XG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xuIGV4dGVybiBib29sIGJsb2NrX21vdW50O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmM0MDBiMTVmMTZkZDIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbkBAIC0xNyw2ICYjNDM7MTcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2JwZi9icGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9oYXNobWFwLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7anNvbl93cml0ZXIuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O21haW4uaFwmIzM0O1xuQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiB9XG4gXG4mIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuJiM0MztcdHN0cnVjdCBoYXNobWFwICpzZWVuO1xuJiM0MztcdF9fdTMyICpwZW5kaW5nX2lkcztcbiYjNDM7XHRzaXplX3QgcGVuZGluZ19jbnQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXG4mIzQzO3tcbiYjNDM7XHRfX3UzMiAqaWRzO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGlmIChoYXNobWFwX19maW5kKGN0eC1cdTAwM2VzZWVuLCBpZCwgTlVMTCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0aWRzID0gbGliYnBmX3JlYWxsb2NhcnJheShjdHgtXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cdTAwM2VwZW5kaW5nX2NudCAmIzQzOyAxLFxuJiM0MztcdFx0XHRcdCAgc2l6ZW9mKCppZHMpKTtcbiYjNDM7XHRpZiAoIWlkcykge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7bWVtIGFsbG9jIGZhaWxlZFwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGN0eC1cdTAwM2VwZW5kaW5nX2lkcyA9IGlkcztcbiYjNDM7XG4mIzQzO1x0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cdTAwM2VzZWVuLCBpZCwgMCk7XG4mIzQzO1x0aWYgKGVycikge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBpbm5lciBtYXAgaWQgJXU6ICVzXCYjMzQ7LCBpZCwgc3RyZXJyb3IoLWVycikpO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XHRpZHNbY3R4LVx1MDAzZXBlbmRpbmdfY250JiM0MzsmIzQzO10gPSBpZDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW50XG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4tXHQgYm9vbCBzaG93X2hlYWRlcilcbiYjNDM7XHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxuIHtcbiBcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XG4gXHR1bnNpZ25lZCBpbnQgbnVtX2VsZW1zID0gMDtcbiYjNDM7XHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICYjNDM7ODc4LDE3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFxuIFx0cHJldl9rZXkgPSBOVUxMO1xuIFxuJiM0MztcdGlmIChjdHggXHUwMDI2XHUwMDI2ICF3dHIgXHUwMDI2XHUwMDI2IChpbmZvLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XG4mIzQzO1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4mIzQzO1x0XHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcbiYjNDM7XHRcdGlmIChwbGFpbl9idGZfd3RyKSB7XG4mIzQzO1x0XHRcdGlmIChzaG93X2hlYWRlcilcbiYjNDM7XHRcdFx0XHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XG4mIzQzO1x0XHRcdHNob3dfaGVhZGVyID0gZmFsc2U7XG4mIzQzO1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCAmIzQzOzkxOCwyMCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGlmIChlcnJubyA9PSBFTk9FTlQpXG4gXHRcdFx0XHRlcnIgPSAwO1xuJiM0MztcdFx0XHRlbHNlIGlmIChjdHgpXG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICBpbmZvLVx1MDAzZWlkLCBzdHJlcnJvcihlcnJubykpO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKVxuJiM0MztcdFx0ZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xuJiM0MztcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuJiM0MztcdFx0XHRcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcbiYjNDM7XHRcdFx0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG5AQCAtODk0LDE4ICYjNDM7OTQ4LDI1IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0ZnJlZShrZXkpO1xuIFx0ZnJlZSh2YWx1ZSk7XG4gXHRmcmVlX21hcF9rdl9idGYoYnRmKTtcbiYjNDM7XHRpZiAocGxhaW5fYnRmX3d0cilcbiYjNDM7XHRcdGpzb253X2Rlc3Ryb3koXHUwMDI2cGxhaW5fYnRmX3d0cik7XG4gXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXG4mIzQzO1x0XHQgICAgLm9wZW5fZmxhZ3MgPSBCUEZfRl9SRE9OTFksXG4mIzQzO1x0KTtcbiBcdGpzb25fd3JpdGVyX3QgKnd0ciA9IE5VTEwsICpidGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbiBcdGludCBlcnIgPSAtMTtcbiYjNDM7XHRzaXplX3QgajtcbiBcbiBcdGlmIChhcmdjICE9IDIpXG4gXHRcdHVzYWdlKCk7XG5AQCAtOTE5LDkgJiM0Mzs5ODAsMzQgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGlmIChuYl9mZHMgXHUwMDNjIDEpXG4gXHRcdGdvdG8gZXhpdF9mcmVlO1xuIFxuJiM0MztcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xuJiM0MztcdFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxuJiM0MztcdFx0XHRcdFx0ZXF1YWxfZm5fZm9yX2tleV9hc19pZCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xuJiM0MztcdFx0XHRjdHguc2VlbiA9IE5VTEw7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcJiMzNDspO1xuJiM0MztcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbmJfZmRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0XHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuJiM0MztcdFx0XHRcdHBfZXJyKFwmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzXCYjMzQ7LCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0XHRcdGVyciA9IC0xO1xuJiM0MztcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LnNlZW4sIGluZm8uaWQsIDApO1xuJiM0MztcdFx0XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzXCYjMzQ7LCBpbmZvLmlkLFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cmVycm9yKC1lcnIpKTtcbiYjNDM7XHRcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHd0ciA9IGpzb25fd3RyO1xuLVx0fSBlbHNlIHtcbiYjNDM7XHR9IGVsc2UgaWYgKCFyZWN1cnNpdmVfZHVtcCkge1xuIFx0XHRpbnQgZG9fcGxhaW5fYnRmO1xuIFxuIFx0XHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcbkBAIC05MzYsNyAmIzQzOzEwMjIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmVfZHVtcCkpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuQEAgLTk0NCwyMiAmIzQzOzEwMzAsNTAgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRlcnIgPSAtMTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxKTtcbiYjNDM7XHRcdGVyciA9IG1hcF9kdW1wKGZkc1tpXSwgXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXAsXG4mIzQzO1x0XHRcdCAgICAgICByZWN1cnNpdmVfZHVtcCA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xuIFxuIFx0XHRpZiAoZXJyKVxuIFx0XHRcdGJyZWFrO1xuLVx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXG4mIzQzO1x0XHRpZiAoIXJlY3Vyc2l2ZV9kdW1wKVxuJiM0MztcdFx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdH1cbiYjNDM7XHRmb3IgKGogPSAwOyAhZXJyIFx1MDAyNlx1MDAyNiBqIFx1MDAzYyBjdHgucGVuZGluZ19jbnQ7IGomIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpbnQgZmQ7XG4mIzQzO1xuJiM0MztcdFx0ZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlc1wmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgY3R4LnBlbmRpbmdfaWRzW2pdLCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0XHRlcnIgPSAtMTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuJiM0MztcdFx0XHRwX2VycihcJiMzNDtjYW4mIzM5O3QgZ2V0IG1hcCBpbmZvOiAlc1wmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XHRcdFx0ZXJyID0gLTE7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRpZiAoIXd0cilcbiYjNDM7XHRcdFx0XHRwcmludGYoXCYjMzQ7XFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0ZXJyID0gbWFwX2R1bXAoZmQsIFx1MDAyNmluZm8sIHd0ciwgdHJ1ZSwgXHUwMDI2Y3R4KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGNsb3NlKGZkKTtcbiBcdH1cbi1cdGlmICh3dHIgXHUwMDI2XHUwMDI2IG5iX2ZkcyBcdTAwM2UgMSlcbiYjNDM7XHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSlcbiBcdFx0anNvbndfZW5kX2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXG4gXHRpZiAoYnRmX3d0cilcbiBcdFx0anNvbndfZGVzdHJveShcdTAwMjZidGZfd3RyKTtcbiBleGl0X2Nsb3NlOlxuJiM0MztcdGlmIChyZWN1cnNpdmVfZHVtcClcbiYjNDM7XHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSYjNDM7JiM0MzspXG4gXHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4mIzQzO1x0ZnJlZShjdHgucGVuZGluZ19pZHMpO1xuIGV4aXRfZnJlZTpcbiBcdGZyZWUoZmRzKTtcbiBcdGZyZWVfYnRmX3ZtbGludXgoKTtcbkBAIC0xNDg0LDcgJiM0MzsxNTk4LDcgQEAgc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XCYjMzQ7ICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxuXCYjMzQ7XG4gXHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgaW5zbl9hcnJheSB8IHJoYXNoIH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7ICAgICAgIFwmIzM0OyBIRUxQX1NQRUNfT1BUSU9OUyBcJiMzNDsgfFxcblwmIzM0O1xuLVx0XHRcJiMzNDsgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IH1cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfCB7LXJ8LS1yZWN1cnNpdmV9IH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7XCYjMzQ7LFxuIFx0XHRiaW5fbmFtZSwgYXJndlstMl0pO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjljODg3NDNhOGY4NDJcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xuQEAgLTAsMCAmIzQzOzEsNDY1IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvcmVzb3VyY2UuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NkaXJlbnQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBPVVRQVVRfU0laRSA4MTkyXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuJiM0MztcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0OyVzIG1hcCBkdW1wIGlkICV1XCYjMzQ7LCBvcHRpb25zLCBpZCk7XG4mIzQzO1x0bWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtkdW1wX21hcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0LyogVGhlIGhlbHBlciBkb2VzbiYjMzk7dCB0ZXJtaW5hdGUgb3Igc3RyaXAgdGhlIG91dHB1dC4gKi9cbiYjNDM7XHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwmIzM0O1xcblwmIzM0OyldID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIF9fdTMyIG1hcF9pZChpbnQgZmQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbiksIFwmIzM0O21hcF9pbmZvXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdHJldHVybiBpbmZvLmlkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pXG4mIzQzO3tcbiYjNDM7XHRpbnQgY291bnQgPSAwO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHtcbiYjNDM7XHRcdGNvdW50JiM0MzsmIzQzOztcbiYjNDM7XHRcdG91dHB1dCAmIzQzOz0gc3RybGVuKHRva2VuKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIGNvdW50O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19wbGFpbihfX3UzMiByb290X2lkLCBfX3UzMiBpbm5lcl9pZCwgY29uc3QgY2hhciAqdHlwZSxcbiYjNDM7XHRcdFx0aW50IGVudHJpZXMsIGJvb2wgdHlwZWQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGhlYWRlclsxMjhdO1xuJiM0MztcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xuJiM0MztcdGNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDstLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVwmIzM0Oywgcm9vdF9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3BsYWluX2R1bXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFwmIzM0OyV1OiAlcyAgbmFtZSBkdW1wX291dGVyICBcJiMzNDssIHJvb3RfaWQsIHR5cGUpO1xuJiM0MztcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihyb290LCBcJiMzNDtwbGFpbl9yb290X2hlYWRlclwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFwmIzM0O3BsYWluX3Jvb3RfZmlyc3RcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwmIzM0O2lubmVyX21hcF9pZDpcJiMzNDspLCBlbnRyaWVzLCBcJiMzNDtwbGFpbl9yZWZlcmVuY2VzXCYjMzQ7KTtcbiYjNDM7XHRpZiAoZW50cmllcykge1xuJiM0MztcdFx0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCYjMzQ7JXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCYjMzQ7LCBpbm5lcl9pZCk7XG4mIzQzO1x0XHRpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4mIzQzO1x0XHRpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgXCYjMzQ7cGxhaW5faW5uZXJfaGVhZGVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXCYjMzQ7cGxhaW5faW5uZXJfYWZ0ZXJfcm9vdFwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBoZWFkZXIpLCAxLCBcJiMzNDtwbGFpbl9pbm5lcl9vbmNlXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCYjMzQ7Rm91bmQgXCYjMzQ7KSwgZW50cmllcyBcdTAwMjZcdTAwMjYgIXR5cGVkID8gMiA6IDEsXG4mIzQzO1x0XHQgIFwmIzM0O3BsYWluX21hcF9jb3VudFwmIzM0Oyk7XG4mIzQzO1x0aWYgKHR5cGVkKSB7XG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwmIzM0O1xcXCYjMzQ7a2V5XFxcJiMzNDs6IDBcJiMzNDssIFwmIzM0O3BsYWluX2J0Zl9rZXlcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcJiMzNDtcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6IDE2ODQzMDA5XCYjMzQ7LCBcJiMzNDtwbGFpbl9idGZfdmFsdWVcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcbiYjNDM7XHRcdCAgICAgICBib29sIHR5cGVkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbiYjNDM7XHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xuJiM0MztcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTtcbiYjNDM7XHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBsaWJicGZfYnBmX21hcF90eXBlX3N0cih0eXBlKTtcbiYjNDM7XHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcbiYjNDM7XHRfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7XG4mIzQzO1xuJiM0MztcdGlmICh0eXBlZCkge1xuJiM0MztcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2NyZWF0ZV9idGZcJiMzNDspIHx8XG4mIzQzO1x0XHQgICAgIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcJiMzNDt1bnNpZ25lZCBpbnRcJiMzNDssIDQsIDApLCAxLCBcJiMzNDtidGZfaW50XCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwmIzM0O2xvYWRfYnRmXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbiYjNDM7XHRcdGlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcbiYjNDM7XHRcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xuJiM0MztcdH1cbiYjNDM7XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcJiMzNDtkdW1wX2lubmVyXCYjMzQ7LCBzaXplb2Yoa2V5KSxcbiYjNDM7XHRcdFx0XHQgIHNpemVvZih2YWx1ZSksIDIsIFx1MDAyNmlubmVyX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0a2V5ID0gMDtcbiYjNDM7XHRpZiAoIWVtcHR5X2lubmVyIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3BvcHVsYXRlX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4mIzQzO1x0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCBzaXplb2Yoa2V5KSwgc2l6ZW9mKF9fdTMyKSxcbiYjNDM7XHRcdFx0XHQgIDMsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcJiMzNDtjcmVhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0LyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqL1xuJiM0MztcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBlbnRyaWVzOyBrZXkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtwb3B1bGF0ZV9vdXRlclwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuJiM0MztcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcbiYjNDM7XHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcJiMzNDstalwmIzM0Oywgb3V0ZXIpIHx8XG4mIzQzO1x0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXCYjMzQ7LWpcJiMzNDssIGlubmVyKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEob3V0ZXJbMF0sICYjMzk7WyYjMzk7LCBcJiMzNDtkZWZhdWx0X2FycmF5XCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwmIzM0O1xcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0OzpcJiMzNDspLCAwLCBcJiMzNDtkZWZhdWx0X25vX3dyYXBwZXJcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXCYjMzQ7XFxcJiMzNDtpZFxcXCYjMzQ7OlwmIzM0OyksIDAsIFwmIzM0O2RlZmF1bHRfbm9faGVhZGVyXCYjMzQ7KTtcbiYjNDM7XHRzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCBcJiMzNDtcXFwmIzM0O2lubmVyX21hcF9pZFxcXCYjMzQ7OiV1XCYjMzQ7LCBpbm5lcl9pZCk7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCByZWZlcmVuY2UpLCBlbnRyaWVzLCBcJiMzNDtkZWZhdWx0X3JlZmVyZW5jZXNcJiMzNDspO1xuJiM0MztcdGlmICghZW50cmllcylcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRlciwgXCYjMzQ7W11cJiMzNDssIFwmIzM0O2VtcHR5X291dGVyX2RlZmF1bHRcJiMzNDspO1xuJiM0MztcdGlmIChlbXB0eV9pbm5lcilcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShpbm5lciwgXCYjMzQ7W11cJiMzNDssIFwmIzM0O2VtcHR5X2lubmVyX2RlZmF1bHRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHR5cGVkKVxuJiM0MztcdFx0QVNTRVJUX0hBU19TVUJTVFIoaW5uZXIsIFwmIzM0O1xcXCYjMzQ7Zm9ybWF0dGVkXFxcJiMzNDs6e1xcXCYjMzQ7a2V5XFxcJiMzNDs6MCxcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6MTY4NDMwMDl9XCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgXCYjMzQ7dHlwZWRfaW5uZXJcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShpbm5lcixcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtbe1xcXCYjMzQ7a2V5XFxcJiMzNDs6W1xcXCYjMzQ7MHgwMFxcXCYjMzQ7LFxcXCYjMzQ7MHgwMFxcXCYjMzQ7LFxcXCYjMzQ7MHgwMFxcXCYjMzQ7LFxcXCYjMzQ7MHgwMFxcXCYjMzQ7XSxcJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6W1xcXCYjMzQ7MHgwMVxcXCYjMzQ7LFxcXCYjMzQ7MHgwMVxcXCYjMzQ7LFxcXCYjMzQ7MHgwMVxcXCYjMzQ7LFxcXCYjMzQ7MHgwMVxcXCYjMzQ7XX1dXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgIFwmIzM0O29yZGluYXJ5X2RlZmF1bHRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxuJiM0MztcdCAqIG9uZSBjb3B5IG9mIHRoZSBzaGFyZWQgaW5uZXIgbWFwLCBhbmQgdW5jaGFuZ2VkIGVudHJ5IHJlcHJlc2VudGF0aW9ucy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoZW50cmllcylcbiYjNDM7XHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0XHQgXCYjMzQ7W3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9vdXRlclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfSx7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7aGFzaFxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX2lubmVyXFxcJiMzNDssXFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfV1cJiMzNDssXG4mIzQzO1x0XHRcdCByb290X2lkLCB0eXBlX25hbWUsIG91dGVyLCBpbm5lcl9pZCwgaW5uZXIpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0XHQgXCYjMzQ7W3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9vdXRlclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OltdfV1cJiMzNDssIHJvb3RfaWQsIHR5cGVfbmFtZSk7XG4mIzQzO1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwmIzM0Oy1qIC1yXCYjMzQ7LCBvdXRwdXQpKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3JlY3Vyc2l2ZV9qc29uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LS1qc29uIC0tcmVjdXJzaXZlXCYjMzQ7LCBvdXRwdXQpKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3JlY3Vyc2l2ZV9sb25nX29wdGlvbnNcJiMzNDspO1xuJiM0MztcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcbiYjNDM7XG4mIzQzO1x0LyogUmVjdXJzaW9uIG9uIGFuIG9yZGluYXJ5IG1hcCBzdGlsbCBlbWl0cyBhIHNpbmdsZSBtYXAgb2JqZWN0LiAqL1xuJiM0MztcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7aGFzaFxcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9pbm5lclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc31dXCYjMzQ7LCBpbm5lcl9pZCwgaW5uZXIpO1xuJiM0MztcdGlmIChkdW1wX21hcChpbm5lcl9pZCwgXCYjMzQ7LWogLXJcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7b3JkaW5hcnlfcmVjdXJzaXZlXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShvdXRlcl9mZCk7XG4mIzQzO1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tdWx0aXBsZV9yb290cyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBuYW1lW0JQRl9PQkpfTkFNRV9MRU5dO1xuJiM0MztcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9LCBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDRdLCBlbGVtZW50c1tPVVRQVVRfU0laRV07XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcJiMzNDtoYXNoXCYjMzQ7LCBcJiMzNDthcnJheV9vZl9tYXBzXCYjMzQ7LCBcJiMzNDtoYXNoX29mX21hcHNcJiMzNDssIFwmIzM0O2hhc2hcJiMzNDsgfTtcbiYjNDM7XHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XG4mIzQzO1x0X191MzIgaWRzWzRdLCBrZXk7XG4mIzQzO1x0aW50IGksIGxlbiA9IDA7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXJcbiYjNDM7XHQgKiBtYXAgbXVzdCBiZSBhcHBlbmRlZCBhZnRlciBhbGwgdGhyZWUgcm9vdHMsIGV2ZW4gdGhvdWdoIGl0IGlzIGZvdW5kXG4mIzQzO1x0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxuJiM0MztcdCAqIHRlc3RzJiMzOTsgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcJiMzNDtkdW1wXyV1XCYjMzQ7LCBnZXRwaWQoKSk7XG4mIzQzO1x0ZmRzWzBdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIG5hbWUsIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXCYjMzQ7Y3JlYXRlX3NlbGVjdGVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkc1szXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcJiMzNDtkdW1wX2Rpc2NvdmVyZWRcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1szXSwgXCYjMzQ7Y3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07XG4mIzQzO1x0ZmRzWzFdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1sxXSwgXCYjMzQ7Y3JlYXRlX2FycmF5X3Jvb3RcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzJdLCBcJiMzNDtjcmVhdGVfaGFzaF9yb290XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZvciAoaSA9IDE7IGkgXHUwMDNjPSAyOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0a2V5ID0gMDtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcdTAwMjZrZXksIFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtyZWZlcmVuY2Vfc2VsZWN0ZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGtleSA9IDE7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbM10sIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7XG4mIzQzO1x0XHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcJiMzNDstalwmIzM0OywgZWxlbWVudHMpKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGxlbiAmIzQzOz0gc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgbGVuLCBzaXplb2YoZXhwZWN0ZWQpIC0gbGVuLFxuJiM0MztcdFx0XHRcdFwmIzM0OyVze1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0OyVzXFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHRcdFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc30lc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHRpID8gXCYjMzQ7LFwmIzM0OyA6IFwmIzM0O1tcJiMzNDssIGlkc1tpXSwgdHlwZXNbaV0sXG4mIzQzO1x0XHRcdFx0aSA9PSAzID8gXCYjMzQ7ZHVtcF9kaXNjb3ZlcmVkXCYjMzQ7IDogbmFtZSwgZWxlbWVudHMsIGkgPT0gMyA/IFwmIzM0O11cJiMzNDsgOiBcJiMzNDtcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0Oy1qIC1yIG1hcCBkdW1wIG5hbWUgJXNcJiMzNDssIG5hbWUpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgXCYjMzQ7ZHVtcF9tdWx0aXBsZV9yb290c1wmIzM0OykpIHtcbiYjNDM7XHRcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCYjMzQ7XFxuXCYjMzQ7KV0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3Jvb3RzX2ZpcnN0X2FuZF9zZWVkX2RlZHVwXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO291dDpcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKGZkc1tpXSBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfdW5yZWFkYWJsZShib29sIG91dGVyKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0Y2hhciBlbGVtZW50c1tPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV0sIHJvb3RbT1VUUFVUX1NJWkVdO1xuJiM0MztcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcGxhaW5bT1VUUFVUX1NJWkVdID0ge307XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuJiM0MztcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBsb29rdXBfZXJybm87XG4mIzQzO1x0X191MzIgaW5uZXJfaWQsIHJvb3RfaWQsIGtleSA9IDAsIHZhbHVlO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJuc1xuJiM0MztcdCAqIEVOT1RTVVBQICh0aGUga2VybmVsLWludGVybmFsIGVycm5vKS4gQ2hlY2sgYm90aCBlbnRyaWVzIHNvIGFuXG4mIzQzO1x0ICogZWFybHkgZXhpdCBvbiB0aGUgZmlyc3QgbG9va3VwIGZhaWx1cmUgY2Fubm90IHBhc3MuXG4mIzQzO1x0ICovXG4mIzQzO1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSwgXCYjMzQ7ZHVtcF91bnJlYWRhYmxlXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDIsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfdW5yZWFkYWJsZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9MVChicGZfbWFwX2xvb2t1cF9lbGVtKGlubmVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNnZhbHVlKSwgMCxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDt1bnJlYWRhYmxlX2xvb2t1cFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRsb29rdXBfZXJybm8gPSBlcnJubztcbiYjNDM7XHRpZiAoIUFTU0VSVF9ORVEobG9va3VwX2Vycm5vLCBFTk9FTlQsIFwmIzM0O3VucmVhZGFibGVfbm90X21pc3NpbmdcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xuJiM0MztcdGlmICghaW5uZXJfaWQgfHwgIWR1bXBfbWFwKGlubmVyX2lkLCBcJiMzNDstalwmIzM0OywgZWxlbWVudHMpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKGVsZW1lbnRzLCBcJiMzNDtcXFwmIzM0O2Vycm9yXFxcJiMzNDs6XCYjMzQ7KSwgMiwgXCYjMzQ7ZGVmYXVsdF9qc29uX2Vycm9yc1wmIzM0Oyk7XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDttYXAgZHVtcCBpZCAldVwmIzM0OywgaW5uZXJfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7ZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihwbGFpbiwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsIFwmIzM0O2RlZmF1bHRfcGxhaW5fZXJyb3JzXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfSEFTX1NVQlNUUihwbGFpbiwgXCYjMzQ7Rm91bmQgMCBlbGVtZW50c1wmIzM0OywgXCYjMzQ7ZGVmYXVsdF9wbGFpbl9jb3VudFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHJvb3RfaWQgPSBpbm5lcl9pZDtcbiYjNDM7XHRpZiAob3V0ZXIpIHtcbiYjNDM7XHRcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4mIzQzO1x0XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCYjMzQ7Y3JlYXRlX291dGVyXCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtwb3B1bGF0ZV9vdXRlclwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4mIzQzO1x0XHRpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFwmIzM0Oy1qXCYjMzQ7LCByb290KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbiYjNDM7XHRcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7YXJyYXlfb2ZfbWFwc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9vdXRlclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfSx7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDtwZXJmX2V2ZW50X2FycmF5XFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX3VucmVhZGFibGVcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc31dXCYjMzQ7LCByb290X2lkLCByb290LCBpbm5lcl9pZCwgZWxlbWVudHMpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbiYjNDM7XHRcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7cGVyZl9ldmVudF9hcnJheVxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX3VucmVhZGFibGVcXFwmIzM0OyxcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9XVwmIzM0OyxcbiYjNDM7XHRcdFx0IGlubmVyX2lkLCBlbGVtZW50cyk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChkdW1wX21hcChyb290X2lkLCBcJiMzNDstaiAtclwmIzM0Oywgb3V0cHV0KSlcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtyZWN1cnNpdmVfdW5yZWFkYWJsZV9qc29uXCYjMzQ7KTtcbiYjNDM7XHRtZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDstciBtYXAgZHVtcCBpZCAldVwmIzM0Oywgcm9vdF9pZCk7XG4mIzQzO1x0aWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXG4mIzQzO1x0XHQgICAgICBcJiMzNDtyZWN1cnNpdmVfdW5yZWFkYWJsZV9wbGFpblwmIzM0OykpIHtcbiYjNDM7XHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgcGxhaW4sIFwmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLFxuJiM0MztcdFx0XHQgIFwmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9lcnJvcnNcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCYjMzQ7Rm91bmQgXCYjMzQ7KSwgb3V0ZXIgPyAyIDogMSxcbiYjNDM7XHRcdFx0ICBcJiMzNDtyZWN1cnNpdmVfcGxhaW5fbWFwc1wmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKG91dGVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKG91dGVyX2ZkKTtcbiYjNDM7XHRpZiAoaW5uZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21hbnlfaW5uZXJfbWFwcyhib29sIGpzb24pXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0geyAucmxpbV9jdXIgPSAzMiwgLnJsaW1fbWF4ID0gMzIgfTtcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTtcbiYjNDM7XHRfX3UzMiBpZHNbNjRdLCByb290X2lkLCBrZXk7XG4mIzQzO1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIHN0YXR1cztcbiYjNDM7XHRpbnQgaW5oZXJpdGVkX2Zkc1szMl0sIG5yX2luaGVyaXRlZCA9IDAsIGk7XG4mIzQzO1x0Y2hhciAqb3V0cHV0ID0gTlVMTDtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1xuJiM0MztcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfdGVtcGxhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbiYjNDM7XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCA0LCA0LFxuJiM0MztcdFx0XHRcdCAgQVJSQVlfU0laRShpZHMpLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRjbG9zZShpbm5lcl9mZCk7XG4mIzQzO1x0aW5uZXJfZmQgPSAtMTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCYjMzQ7Y3JlYXRlX291dGVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwmIzM0O2NyZWF0ZV9pbm5lclwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGlkc1trZXldID0gbWFwX2lkKGlubmVyX2ZkKTtcbiYjNDM7XHRcdGlmICghaWRzW2tleV0pXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0LyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi9cbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7XHRcdGlubmVyX2ZkID0gLTE7XG4mIzQzO1x0fVxuJiM0MztcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuJiM0MztcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XG4mIzQzO1x0aWYgKCFyb290X2lkIHx8ICFBU1NFUlRfT0tfUFRSKG91dHB1dCwgXCYjMzQ7YWxsb2NhdGVfb3V0cHV0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHQvKiBGaWxsIHRoZSBsb3cgRkQgc2xvdHMgdG8gZXhlcmNpc2UgaW5oZXJpdGVkIGRlc2NyaXB0b3IgY2xlYW51cC4gKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGluaGVyaXRlZF9mZHMpOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IGZkID0gb3BlbihcJiMzNDsvZGV2L251bGxcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCYjMzQ7b3Blbl9pbmhlcml0ZWRfZmRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGluaGVyaXRlZF9mZHNbbnJfaW5oZXJpdGVkJiM0MzsmIzQzO10gPSBmZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxuJiM0MztcdCAqIHJ1bm5lciYjMzk7cyBsaW1pdCB1bmNoYW5nZWQuIFJldGFpbmluZyBldmVyeSBkaXNjb3ZlcmVkIEZEIHdvdWxkIGV4Y2VlZFxuJiM0MztcdCAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRwaWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocGlkLCAwLCBcJiMzNDtmb3JrXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghcGlkKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgZGlyZW50ICplbnRyeTtcbiYjNDM7XHRcdERJUiAqZGlyO1xuJiM0MztcbiYjNDM7XHRcdC8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqL1xuJiM0MztcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7XG4mIzQzO1x0XHRkaXIgPSBvcGVuZGlyKFwmIzM0Oy9wcm9jL3NlbGYvZmRcJiMzNDspO1xuJiM0MztcdFx0aWYgKCFkaXIpXG4mIzQzO1x0XHRcdF9leGl0KDYpO1xuJiM0MztcdFx0LyogVGhlIHBhcmVudCBrZWVwcyB0aGUgb3V0ZXIgbWFwIGFuZCBpdHMgaW5uZXIgbWFwcyBhbGl2ZS4gKi9cbiYjNDM7XHRcdGZvciAoOzspIHtcbiYjNDM7XHRcdFx0Y2hhciAqZW5kO1xuJiM0MztcdFx0XHRsb25nIGZkO1xuJiM0MztcbiYjNDM7XHRcdFx0ZXJybm8gPSAwO1xuJiM0MztcdFx0XHRlbnRyeSA9IHJlYWRkaXIoZGlyKTtcbiYjNDM7XHRcdFx0aWYgKCFlbnRyeSkge1xuJiM0MztcdFx0XHRcdGlmIChlcnJubylcbiYjNDM7XHRcdFx0XHRcdF9leGl0KDYpO1xuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGZkID0gc3RydG9sKGVudHJ5LVx1MDAzZWRfbmFtZSwgXHUwMDI2ZW5kLCAxMCk7XG4mIzQzO1x0XHRcdGlmICgqZW5kIHx8IGZkIFx1MDAzYyAzIHx8IGZkID09IGRpcmZkKGRpcikpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdGNsb3NlKGZkKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChjbG9zZWRpcihkaXIpKVxuJiM0MztcdFx0XHRfZXhpdCg2KTtcbiYjNDM7XHRcdGlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgXHUwMDI2bGltaXQpKVxuJiM0MztcdFx0XHRfZXhpdCgxKTtcbiYjNDM7XHRcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7JXMgLXIgbWFwIGR1bXAgaWQgJXVcJiMzNDssXG4mIzQzO1x0XHRcdCBqc29uID8gXCYjMzQ7LWpcJiMzNDsgOiBcJiMzNDtcJiMzNDssIHJvb3RfaWQpO1xuJiM0MztcdFx0aWYgKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgNjU1MzUpKVxuJiM0MztcdFx0XHRfZXhpdCgyKTtcbiYjNDM7XHRcdGlmIChjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcJiMzNDtcXFwmIzM0O2lkXFxcJiMzNDs6XCYjMzQ7IDogXCYjMzQ7Rm91bmQgXCYjMzQ7KSAhPSBBUlJBWV9TSVpFKGlkcykgJiM0MzsgMSB8fFxuJiM0MztcdFx0ICAgIGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFwmIzM0O1xcXCYjMzQ7aW5uZXJfbWFwX2lkXFxcJiMzNDs6XCYjMzQ7IDogXCYjMzQ7aW5uZXJfbWFwX2lkOlwmIzM0OykgIT1cbiYjNDM7XHRcdCAgICBBUlJBWV9TSVpFKGlkcykpXG4mIzQzO1x0XHRcdF9leGl0KDMpO1xuJiM0MztcdFx0Zm9yIChrZXkgPSAwOyBrZXkgXHUwMDNjIEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAoanNvbilcbiYjNDM7XHRcdFx0XHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXCYjMzQ7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFwmIzM0OywgaWRzW2tleV0pO1xuJiM0MztcdFx0XHRlbHNlXG4mIzQzO1x0XHRcdFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFwmIzM0O1xcbiV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgIFwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCBpZHNba2V5XSk7XG4mIzQzO1x0XHRcdGlmIChjb3VudF90b2tlbihvdXRwdXQsIHRva2VuKSAhPSAxKVxuJiM0MztcdFx0XHRcdF9leGl0KDQpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGpzb24gXHUwMDI2XHUwMDI2IChvdXRwdXRbMF0gIT0gJiMzOTtbJiMzOTsgfHxcbiYjNDM7XHRcdFx0ICAgICBzdHJjbXAob3V0cHV0ICYjNDM7IHN0cmxlbihvdXRwdXQpIC0gMiwgXCYjMzQ7XVxcblwmIzM0OykpKVxuJiM0MztcdFx0XHRfZXhpdCg1KTtcbiYjNDM7XHRcdF9leGl0KDApO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoQVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQsIFwmIzM0O3dhaXRwaWRcJiMzNDspIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7Y2hpbGRfZXhpdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcJiMzNDtkdW1wX3dpdGhfbG93X2ZkX2xpbWl0XCYjMzQ7KTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcJiMzNDtwYXJlbnRfZmRfcHJlc2VydmVkXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXCYjMzQ7cGFyZW50X291dGVyX3ByZXNlcnZlZFwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHR3aGlsZSAobnJfaW5oZXJpdGVkKVxuJiM0MztcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1stLW5yX2luaGVyaXRlZF0pO1xuJiM0MztcdGZyZWUob3V0cHV0KTtcbiYjNDM7XHRpZiAob3V0ZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuJiM0MztcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShpbm5lcl9mZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt1bnJlYWRhYmxlX29yZGluYXJ5XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfdW5yZWFkYWJsZShmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dW5yZWFkYWJsZV9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3VucmVhZGFibGUodHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWFueV9pbm5lcl9tYXBzX2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9tYW55X2lubmVyX21hcHModHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWFueV9pbm5lcl9tYXBzX3BsYWluXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttdWx0aXBsZV9yb290c1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X211bHRpcGxlX3Jvb3RzKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2hhcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YnRmX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDY6MzQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdXNlci1zcGFjZSB0b29scyAoYnBmdG9vbCkgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRlc3RzIHVuZGVyIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbC1zcGFjZSBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA3OGY3NmJhNzQ3MzFjMzI5NmNmZDdkN2Y3NjllYTJjODczNmYwMWY2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBTZXAgNyAwNjozNDozOCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKaW5kZXggNWRhZjNkZTVjNzQ0Ni4uMjNmYWE2NzI2ODU4NyAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKQEAgLTE2LDcgJiM0MzsxNiw4IEBAIFNZTk9QU0lTCiAKICoqYnBmdG9vbCoqIFsqT1BUSU9OUypdICoqbWFwKiogKkNPTU1BTkQqCiAKLSpPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB9CiYjNDM7Kk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8CiYjNDM7eyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfCB7ICoqLXIqKiB8ICoqLS1yZWN1cnNpdmUqKiB9IH0KIAogKkNPTU1BTkRTKiA6PQogeyAqKnNob3cqKiB8ICoqbGlzdCoqIHwgKipjcmVhdGUqKiB8ICoqZHVtcCoqIHwgKip1cGRhdGUqKiB8ICoqbG9va3VwKiogfCAqKmdldG5leHQqKiB8CkBAIC0xNzAsNiAmIzQzOzE3MSwyNSBAQCBPUFRJT05TCiAgICAgRG8gbm90IGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0byBtb3VudCBhbnkgdmlydHVhbCBmaWxlIHN5c3RlbSAoc3VjaCBhcwogICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LgogCiYjNDM7LXIsIC0tcmVjdXJzaXZlCiYjNDM7ICAgIEFsc28gZHVtcCB0aGUgaW5uZXIgbWFwcyByZWZlcmVuY2VkIGJ5ICoqYXJyYXlfb2ZfbWFwcyoqIGFuZCAqKmhhc2hfb2ZfbWFwcyoqCiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmCiYjNDM7ICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy4KJiM0MzsKJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dAomIzQzOyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuCiYjNDM7ICAgICoqZWxlbWVudHMqKiBhcnJheSwgaW5jbHVkaW5nIHdoZW4gb25seSBvbmUgbWFwIGlzIGR1bXBlZC4gT3V0ZXIgbWFwIGVudHJpZXMKJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXIKJiM0MzsgICAgbWFwIG9iamVjdC4KJiM0MzsKJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuCiYjNDM7ICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhCiYjNDM7ICAgIHJlZmVyZW5jZWQgaW5uZXIgbWFwIGJlZm9yZSBpdCBpcyB2aXNpdGVkLiBGYWlsdXJlIHRvIG9wZW4gYSByZWZlcmVuY2VkCiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXkKJiM0MzsgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLgomIzQzOwomIzQzOyAgICBJbiBKU09OIG1vZGUsIHRoZSBlbmNsb3NpbmcgYXJyYXlzIGFuZCBvYmplY3RzIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZy4KJiM0MzsKIEVYQU1QTEVTCiA9PT09PT09PQogKiojIGJwZnRvb2wgbWFwIHNob3cqKgpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAppbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbApAQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpCiAKICAgICAjIERlYWwgd2l0aCBvcHRpb25zCiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuCi0gICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcCiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXAogICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJiMzOTsKICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyAmIzM0OyRjJiMzNDsgLS0gJiMzNDskY3VyJiMzNDsgKSApCiAgICAgICAgIHJldHVybiAwCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmMKaW5kZXggYzkxZTFhNmUxYTFlYy4uNDI0YWY0YTQ5NmE1YyAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYwpAQCAtMjYsNiAmIzQzOzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyOwogYm9vbCBwcmV0dHlfb3V0cHV0OwogYm9vbCBqc29uX291dHB1dDsKJiM0Mztib29sIHJlY3Vyc2l2ZV9kdW1wOwogYm9vbCBzaG93X3Bpbm5lZDsKIGJvb2wgYmxvY2tfbW91bnQ7CiBib29sIHZlcmlmaWVyX2xvZ3M7CkBAIC00NTIsNiAmIzQzOzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJeyAmIzM0O2pzb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7aiYjMzk7IH0sCiAJCXsgJiMzNDtoZWxwJiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O2gmIzM5OyB9LAogCQl7ICYjMzQ7cHJldHR5JiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O3AmIzM5OyB9LAomIzQzOwkJeyAmIzM0O3JlY3Vyc2l2ZSYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtyJiMzOTsgfSwKIAkJeyAmIzM0O3ZlcnNpb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7ViYjMzk7IH0sCiAJCXsgJiMzNDticGZmcyYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtmJiMzOTsgfSwKIAkJeyAmIzM0O21hcGNvbXBhdCYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTttJiMzOTsgfSwKQEAgLTQ4NSw3ICYjNDM7NDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWJpbl9uYW1lID0gJiMzNDticGZ0b29sJiMzNDs7CiAKIAlvcHRlcnIgPSAwOwotCXdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgJiMzNDtWaHBqZkxtbmRTaTprOkI6bCYjMzQ7LAomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICYjMzQ7VmhwanJmTG1uZFNpOms6QjpsJiMzNDssCiAJCQkJICBvcHRpb25zLCBOVUxMKSkgJmd0Oz0gMCkgewogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlICYjMzk7ViYjMzk7OgpAQCAtNTA3LDYgJiM0Mzs1MDksOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQl9CiAJCQlqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpOwogCQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7ciYjMzk7OgomIzQzOwkJCXJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTsKJiM0MzsJCQlicmVhazsKIAkJY2FzZSAmIzM5O2YmIzM5OzoKIAkJCXNob3dfcGlubmVkID0gdHJ1ZTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oCmluZGV4IDc4YjZlMGViYjg1ZDguLjc2NjI2NjQyZTk0Y2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmgKQEAgLTgzLDYgJiM0Mzs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTsKIAogZXh0ZXJuIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyOwogZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7CiYjNDM7ZXh0ZXJuIGJvb2wgcmVjdXJzaXZlX2R1bXA7CiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDsKIGV4dGVybiBib29sIHNob3dfcGlkczsKIGV4dGVybiBib29sIGJsb2NrX21vdW50OwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwppbmRleCA2ODRhOGZiNzI0MTQ2Li5jNDAwYjE1ZjE2ZGQyIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwpAQCAtMTcsNiAmIzQzOzE3LDcgQEAKICNpbmNsdWRlICZsdDticGYvYnBmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwogI2luY2x1ZGUgJmx0O2JwZi9oYXNobWFwLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9saWJicGZfaW50ZXJuYWwuaCZndDsKIAogI2luY2x1ZGUgJiMzNDtqc29uX3dyaXRlci5oJiMzNDsKICNpbmNsdWRlICYjMzQ7bWFpbi5oJiMzNDsKQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKQogCQlidGZfX2ZyZWUoYnRmKTsKIH0KIAomIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHggewomIzQzOwlzdHJ1Y3QgaGFzaG1hcCAqc2VlbjsKJiM0MzsJX191MzIgKnBlbmRpbmdfaWRzOwomIzQzOwlzaXplX3QgcGVuZGluZ19jbnQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpCiYjNDM7ewomIzQzOwlfX3UzMiAqaWRzOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoaGFzaG1hcF9fZmluZChjdHgtJmd0O3NlZW4sIGlkLCBOVUxMKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC0mZ3Q7cGVuZGluZ19pZHMsIGN0eC0mZ3Q7cGVuZGluZ19jbnQgJiM0MzsgMSwKJiM0MzsJCQkJICBzaXplb2YoKmlkcykpOwomIzQzOwlpZiAoIWlkcykgewomIzQzOwkJcF9lcnIoJiMzNDttZW0gYWxsb2MgZmFpbGVkJiMzNDspOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CWN0eC0mZ3Q7cGVuZGluZ19pZHMgPSBpZHM7CiYjNDM7CiYjNDM7CWVyciA9IGhhc2htYXBfX2FkZChjdHgtJmd0O3NlZW4sIGlkLCAwKTsKJiM0MzsJaWYgKGVycikgewomIzQzOwkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXMmIzM0OywgaWQsIHN0cmVycm9yKC1lcnIpKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZHNbY3R4LSZndDtwZW5kaW5nX2NudCYjNDM7JiM0MztdID0gaWQ7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQKIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAotCSBib29sIHNob3dfaGVhZGVyKQomIzQzOwkgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KQogewogCXZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7CiAJdW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7CiYjNDM7CWpzb25fd3JpdGVyX3QgKnBsYWluX2J0Zl93dHIgPSBOVUxMOwogCXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiAJaW50IGVycjsKIApAQCAtODQ1LDYgJiM0Mzs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAKIAlwcmV2X2tleSA9IE5VTEw7CiAKJiM0MzsJaWYgKGN0eCAmYW1wOyZhbXA7ICF3dHIgJmFtcDsmYW1wOyAoaW5mby0mZ3Q7YnRmX3ZhbHVlX3R5cGVfaWQgfHwKJiM0MzsJCQkgICAgaW5mby0mZ3Q7YnRmX3ZtbGludXhfdmFsdWVfdHlwZV9pZCkpIHsKJiM0MzsJCXBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpOwomIzQzOwkJaWYgKHBsYWluX2J0Zl93dHIpIHsKJiM0MzsJCQlpZiAoc2hvd19oZWFkZXIpCiYjNDM7CQkJCXNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTsKJiM0MzsJCQlzaG93X2hlYWRlciA9IGZhbHNlOwomIzQzOwkJCXd0ciA9IHBsYWluX2J0Zl93dHI7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKIAlpZiAod3RyKSB7CiAJCWVyciA9IGdldF9tYXBfa3ZfYnRmKGluZm8sICZhbXA7YnRmKTsKIAkJaWYgKGVycikgewpAQCAtODc0LDEwICYjNDM7OTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAogCQlpZiAoZXJyKSB7CiAJCQlpZiAoZXJybm8gPT0gRU5PRU5UKQogCQkJCWVyciA9IDA7CiYjNDM7CQkJZWxzZSBpZiAoY3R4KQomIzQzOwkJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXMmIzM0OywKJiM0MzsJCQkJICAgICAgaW5mby0mZ3Q7aWQsIHN0cmVycm9yKGVycm5vKSk7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoIWR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKSkKJiM0MzsJCWVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTsKJiM0MzsJCWlmICghZXJyKSB7CiAJCQludW1fZWxlbXMmIzQzOyYjNDM7OwomIzQzOwkJCWlmIChjdHggJmFtcDsmYW1wOyBtYXBfaXNfbWFwX29mX21hcHMoaW5mby0mZ3Q7dHlwZSkpIHsKJiM0MzsJCQkJZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpOwomIzQzOwkJCQlpZiAoZXJyKQomIzQzOwkJCQkJYnJlYWs7CiYjNDM7CQkJfQomIzQzOwkJfQogCQlwcmV2X2tleSA9IGtleTsKIAl9CiAKQEAgLTg5NCwxOCAmIzQzOzk0OCwyNSBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAlmcmVlKGtleSk7CiAJZnJlZSh2YWx1ZSk7CiAJZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7CiYjNDM7CWlmIChwbGFpbl9idGZfd3RyKQomIzQzOwkJanNvbndfZGVzdHJveSgmYW1wO3BsYWluX2J0Zl93dHIpOwogCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKJiM0MzsJTElCQlBGX09QVFMoYnBmX2dldF9mZF9ieV9pZF9vcHRzLCBvcHRzLAomIzQzOwkJICAgIC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLAomIzQzOwkpOwogCWpzb25fd3JpdGVyX3QgKnd0ciA9IE5VTEwsICpidGZfd3RyID0gTlVMTDsKIAlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKJiM0MzsJc3RydWN0IG1hcF9kdW1wX2N0eCBjdHggPSB7fTsKIAlpbnQgbmJfZmRzLCBpID0gMDsKIAlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiAJaW50ICpmZHMgPSBOVUxMOwogCWludCBlcnIgPSAtMTsKJiM0MzsJc2l6ZV90IGo7CiAKIAlpZiAoYXJnYyAhPSAyKQogCQl1c2FnZSgpOwpAQCAtOTE5LDkgJiM0Mzs5ODAsMzQgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIAlpZiAobmJfZmRzICZsdDsgMSkKIAkJZ290byBleGl0X2ZyZWU7CiAKJiM0MzsJaWYgKHJlY3Vyc2l2ZV9kdW1wKSB7CiYjNDM7CQljdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsCiYjNDM7CQkJCQllcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTsKJiM0MzsJCWlmIChJU19FUlIoY3R4LnNlZW4pKSB7CiYjNDM7CQkJY3R4LnNlZW4gPSBOVUxMOwomIzQzOwkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBoYXNobWFwIGZvciByZWN1cnNpdmUgZHVtcCYjMzQ7KTsKJiM0MzsJCQlnb3RvIGV4aXRfY2xvc2U7CiYjNDM7CQl9CiYjNDM7CQkvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqLwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5iX2ZkczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CQkJaWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmRzW2ldLCAmYW1wO2luZm8sICZhbXA7bGVuKSkgewomIzQzOwkJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJCWVyciA9IC0xOwomIzQzOwkJCQlnb3RvIGV4aXRfY2xvc2U7CiYjNDM7CQkJfQomIzQzOwkJCWVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7CiYjNDM7CQkJaWYgKGVycikgewomIzQzOwkJCQlwX2VycigmIzM0O2ZhaWxlZCB0byByZWNvcmQgbWFwIGlkICV1OiAlcyYjMzQ7LCBpbmZvLmlkLAomIzQzOwkJCQkgICAgICBzdHJlcnJvcigtZXJyKSk7CiYjNDM7CQkJCWdvdG8gZXhpdF9jbG9zZTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKIAlpZiAoanNvbl9vdXRwdXQpIHsKIAkJd3RyID0ganNvbl93dHI7Ci0JfSBlbHNlIHsKJiM0MzsJfSBlbHNlIGlmICghcmVjdXJzaXZlX2R1bXApIHsKIAkJaW50IGRvX3BsYWluX2J0ZjsKIAogCQlkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTsKQEAgLTkzNiw3ICYjNDM7MTAyMiw3IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCX0KIAl9CiAKLQlpZiAod3RyICZhbXA7JmFtcDsgbmJfZmRzICZndDsgMSkKJiM0MzsJaWYgKHd0ciAmYW1wOyZhbXA7IChuYl9mZHMgJmd0OyAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSkKIAkJanNvbndfc3RhcnRfYXJyYXkod3RyKTsJLyogcm9vdCBhcnJheSAqLwogCWZvciAoaSA9IDA7IGkgJmx0OyBuYl9mZHM7IGkmIzQzOyYjNDM7KSB7CiAJCWlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgJmFtcDtpbmZvLCAmYW1wO2xlbikpIHsKQEAgLTk0NCwyMiAmIzQzOzEwMzAsNTAgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJCWVyciA9IC0xOwogCQkJYnJlYWs7CiAJCX0KLQkJZXJyID0gbWFwX2R1bXAoZmRzW2ldLCAmYW1wO2luZm8sIHd0ciwgbmJfZmRzICZndDsgMSk7CiYjNDM7CQllcnIgPSBtYXBfZHVtcChmZHNbaV0sICZhbXA7aW5mbywgd3RyLCBuYl9mZHMgJmd0OyAxIHx8IHJlY3Vyc2l2ZV9kdW1wLAomIzQzOwkJCSAgICAgICByZWN1cnNpdmVfZHVtcCA/ICZhbXA7Y3R4IDogTlVMTCk7CiAJCWlmICghd3RyICZhbXA7JmFtcDsgaSAhPSBuYl9mZHMgLSAxKQogCQkJcHJpbnRmKCYjMzQ7XG4mIzM0Oyk7CiAKIAkJaWYgKGVycikKIAkJCWJyZWFrOwotCQljbG9zZShmZHNbaV0pOwomIzQzOwkJLyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovCiYjNDM7CQlpZiAoIXJlY3Vyc2l2ZV9kdW1wKQomIzQzOwkJCWNsb3NlKGZkc1tpXSk7CiYjNDM7CX0KJiM0MzsJZm9yIChqID0gMDsgIWVyciAmYW1wOyZhbXA7IGogJmx0OyBjdHgucGVuZGluZ19jbnQ7IGomIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgZmQ7CiYjNDM7CiYjNDM7CQlmZCA9IGJwZl9tYXBfZ2V0X2ZkX2J5X2lkX29wdHMoY3R4LnBlbmRpbmdfaWRzW2pdLCAmYW1wO29wdHMpOwomIzQzOwkJaWYgKGZkICZsdDsgMCkgewomIzQzOwkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlcyYjMzQ7LAomIzQzOwkJCSAgICAgIGN0eC5wZW5kaW5nX2lkc1tqXSwgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCQllcnIgPSAtMTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJCWxlbiA9IHNpemVvZihpbmZvKTsKJiM0MzsJCWlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCAmYW1wO2luZm8sICZhbXA7bGVuKSkgewomIzQzOwkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCQllcnIgPSAtMTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJaWYgKCF3dHIpCiYjNDM7CQkJCXByaW50ZigmIzM0O1xuJiMzNDspOwomIzQzOwkJCWVyciA9IG1hcF9kdW1wKGZkLCAmYW1wO2luZm8sIHd0ciwgdHJ1ZSwgJmFtcDtjdHgpOwomIzQzOwkJfQomIzQzOwkJY2xvc2UoZmQpOwogCX0KLQlpZiAod3RyICZhbXA7JmFtcDsgbmJfZmRzICZndDsgMSkKJiM0MzsJaWYgKHd0ciAmYW1wOyZhbXA7IChuYl9mZHMgJmd0OyAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSkKIAkJanNvbndfZW5kX2FycmF5KHd0cik7CS8qIHJvb3QgYXJyYXkgKi8KIAogCWlmIChidGZfd3RyKQogCQlqc29ud19kZXN0cm95KCZhbXA7YnRmX3d0cik7CiBleGl0X2Nsb3NlOgomIzQzOwlpZiAocmVjdXJzaXZlX2R1bXApCiYjNDM7CQlpID0gMDsKIAlmb3IgKDsgaSAmbHQ7IG5iX2ZkczsgaSYjNDM7JiM0MzspCiAJCWNsb3NlKGZkc1tpXSk7CiYjNDM7CWhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pOwomIzQzOwlmcmVlKGN0eC5wZW5kaW5nX2lkcyk7CiBleGl0X2ZyZWU6CiAJZnJlZShmZHMpOwogCWZyZWVfYnRmX3ZtbGludXgoKTsKQEAgLTE0ODQsNyAmIzQzOzE1OTgsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQkmIzM0OyAgICAgICAgICAgICAgICAgdGFza19zdG9yYWdlIHwgYmxvb21fZmlsdGVyIHwgdXNlcl9yaW5nYnVmIHwgY2dycF9zdG9yYWdlIHwgYXJlbmEgfFxuJiMzNDsKIAkJJiMzNDsgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XG4mIzM0OwogCQkmIzM0OyAgICAgICAmIzM0OyBIRUxQX1NQRUNfT1BUSU9OUyAmIzM0OyB8XG4mIzM0OwotCQkmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxuJiMzNDsKJiM0MzsJCSYjMzQ7ICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxuJiMzNDsKIAkJJiMzNDsmIzM0OywKIAkJYmluX25hbWUsIGFyZ3ZbLTJdKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjljODg3NDNhOGY4NDIKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmMKQEAgLTAsMCAmIzQzOzEsNDY1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZnRvb2xfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9yZXNvdXJjZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtkaXJlbnQuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTIKJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KQomIzQzO3sKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dOwomIzQzOwomIzQzOwlzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICYjMzQ7JXMgbWFwIGR1bXAgaWQgJXUmIzM0Oywgb3B0aW9ucywgaWQpOwomIzQzOwltZW1zZXQob3V0cHV0LCAwLCBPVVRQVVRfU0laRSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSwKJiM0MzsJCSAgICAgICAmIzM0O2R1bXBfbWFwJiMzNDspKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwkvKiBUaGUgaGVscGVyIGRvZXNuJiMzOTt0IHRlcm1pbmF0ZSBvciBzdHJpcCB0aGUgb3V0cHV0LiAqLwomIzQzOwlvdXRwdXRbc3RyY3NwbihvdXRwdXQsICYjMzQ7XG4mIzM0OyldID0gJiMzOTtcMCYjMzk7OwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIF9fdTMyIG1hcF9pZChpbnQgZmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKJiM0MzsJX191MzIgbGVuID0gc2l6ZW9mKGluZm8pOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCAmYW1wO2luZm8sICZhbXA7bGVuKSwgJiMzNDttYXBfaW5mbyYjMzQ7KSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlyZXR1cm4gaW5mby5pZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBjb3VudF90b2tlbihjb25zdCBjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKnRva2VuKQomIzQzO3sKJiM0MzsJaW50IGNvdW50ID0gMDsKJiM0MzsKJiM0MzsJd2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7CiYjNDM7CQljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQlvdXRwdXQgJiM0Mzs9IHN0cmxlbih0b2tlbik7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIGNvdW50OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjaGVja19wbGFpbihfX3UzMiByb290X2lkLCBfX3UzMiBpbm5lcl9pZCwgY29uc3QgY2hhciAqdHlwZSwKJiM0MzsJCQlpbnQgZW50cmllcywgYm9vbCB0eXBlZCkKJiM0Mzt7CiYjNDM7CWNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07CiYjNDM7CWNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9OwomIzQzOwljb25zdCBjaGFyICpyb290LCAqaW5uZXI7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDstLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldSYjMzQ7LCByb290X2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLAomIzQzOwkJICAgICAgICYjMzQ7cGxhaW5fZHVtcCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJc25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgJiMzNDsldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgJiMzNDssIHJvb3RfaWQsIHR5cGUpOwomIzQzOwlyb290ID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHJvb3QsICYjMzQ7cGxhaW5fcm9vdF9oZWFkZXImIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CUFTU0VSVF9FUShyb290IC0gb3V0cHV0LCAwLCAmIzM0O3BsYWluX3Jvb3RfZmlyc3QmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsICYjMzQ7aW5uZXJfbWFwX2lkOiYjMzQ7KSwgZW50cmllcywgJiMzNDtwbGFpbl9yZWZlcmVuY2VzJiMzNDspOwomIzQzOwlpZiAoZW50cmllcykgewomIzQzOwkJc25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgJiMzNDsldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICAmIzM0OywgaW5uZXJfaWQpOwomIzQzOwkJaW5uZXIgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpOwomIzQzOwkJaWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsICYjMzQ7cGxhaW5faW5uZXJfaGVhZGVyJiMzNDspKQomIzQzOwkJCUFTU0VSVF9HVChpbm5lciAtIHJvb3QsIDAsICYjMzQ7cGxhaW5faW5uZXJfYWZ0ZXJfcm9vdCYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIGhlYWRlciksIDEsICYjMzQ7cGxhaW5faW5uZXJfb25jZSYjMzQ7KTsKJiM0MzsJfQomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCAmIzM0O0ZvdW5kICYjMzQ7KSwgZW50cmllcyAmYW1wOyZhbXA7ICF0eXBlZCA/IDIgOiAxLAomIzQzOwkJICAmIzM0O3BsYWluX21hcF9jb3VudCYjMzQ7KTsKJiM0MzsJaWYgKHR5cGVkKSB7CiYjNDM7CQlBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsICYjMzQ7XCYjMzQ7a2V5XCYjMzQ7OiAwJiMzNDssICYjMzQ7cGxhaW5fYnRmX2tleSYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgJiMzNDtcJiMzNDt2YWx1ZVwmIzM0OzogMTY4NDMwMDkmIzM0OywgJiMzNDtwbGFpbl9idGZfdmFsdWUmIzM0Oyk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lciwKJiM0MzsJCSAgICAgICBib29sIHR5cGVkKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpOwomIzQzOwlzdHJ1Y3QgYnRmICpidGYgPSBOVUxMOwomIzQzOwljaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdOwomIzQzOwljaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07CiYjNDM7CWNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpOwomIzQzOwlpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTsKJiM0MzsJX191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxOwomIzQzOwomIzQzOwlpZiAodHlwZWQpIHsKJiM0MzsJCWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2NyZWF0ZV9idGYmIzM0OykgfHwKJiM0MzsJCSAgICAhQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsICYjMzQ7dW5zaWduZWQgaW50JiMzNDssIDQsIDApLCAxLCAmIzM0O2J0Zl9pbnQmIzM0OykgfHwKJiM0MzsJCSAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCAmIzM0O2xvYWRfYnRmJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJaW5uZXJfb3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7CiYjNDM7CQlpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7CiYjNDM7CQlpbm5lcl9vcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTsKJiM0MzsJfQomIzQzOwlpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCAmIzM0O2R1bXBfaW5uZXImIzM0Oywgc2l6ZW9mKGtleSksCiYjNDM7CQkJCSAgc2l6ZW9mKHZhbHVlKSwgMiwgJmFtcDtpbm5lcl9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWtleSA9IDA7CiYjNDM7CWlmICghZW1wdHlfaW5uZXIgJmFtcDsmYW1wOwomIzQzOwkgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCAmYW1wO2tleSwgJmFtcDt2YWx1ZSwgQlBGX0FOWSksCiYjNDM7CQkgICAgICAgJiMzNDtwb3B1bGF0ZV9pbm5lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkOwomIzQzOwlvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsICYjMzQ7ZHVtcF9vdXRlciYjMzQ7LCBzaXplb2Yoa2V5KSwgc2l6ZW9mKF9fdTMyKSwKJiM0MzsJCQkJICAzLCAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgJiMzNDtjcmVhdGVfb3V0ZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJLyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqLwomIzQzOwlmb3IgKGtleSA9IDA7IGtleSAmbHQ7IGVudHJpZXM7IGtleSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCAmYW1wO2tleSwgJmFtcDtpbm5lcl9mZCwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cG9wdWxhdGVfb3V0ZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CXJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpOwomIzQzOwlpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7CiYjNDM7CWlmICghcm9vdF9pZCB8fCAhaW5uZXJfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsICYjMzQ7LWomIzM0Oywgb3V0ZXIpIHx8CiYjNDM7CSAgICAhZHVtcF9tYXAoaW5uZXJfaWQsICYjMzQ7LWomIzM0OywgaW5uZXIpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUShvdXRlclswXSwgJiMzOTtbJiMzOTssICYjMzQ7ZGVmYXVsdF9hcnJheSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCAmIzM0O1wmIzM0O2VsZW1lbnRzXCYjMzQ7OiYjMzQ7KSwgMCwgJiMzNDtkZWZhdWx0X25vX3dyYXBwZXImIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgJiMzNDtcJiMzNDtpZFwmIzM0OzomIzM0OyksIDAsICYjMzQ7ZGVmYXVsdF9ub19oZWFkZXImIzM0Oyk7CiYjNDM7CXNucHJpbnRmKHJlZmVyZW5jZSwgc2l6ZW9mKHJlZmVyZW5jZSksICYjMzQ7XCYjMzQ7aW5uZXJfbWFwX2lkXCYjMzQ7OiV1JiMzNDssIGlubmVyX2lkKTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCByZWZlcmVuY2UpLCBlbnRyaWVzLCAmIzM0O2RlZmF1bHRfcmVmZXJlbmNlcyYjMzQ7KTsKJiM0MzsJaWYgKCFlbnRyaWVzKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dGVyLCAmIzM0O1tdJiMzNDssICYjMzQ7ZW1wdHlfb3V0ZXJfZGVmYXVsdCYjMzQ7KTsKJiM0MzsJaWYgKGVtcHR5X2lubmVyKQomIzQzOwkJQVNTRVJUX1NUUkVRKGlubmVyLCAmIzM0O1tdJiMzNDssICYjMzQ7ZW1wdHlfaW5uZXJfZGVmYXVsdCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAodHlwZWQpCiYjNDM7CQlBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgJiMzNDtcJiMzNDtmb3JtYXR0ZWRcJiMzNDs6e1wmIzM0O2tleVwmIzM0OzowLFwmIzM0O3ZhbHVlXCYjMzQ7OjE2ODQzMDA5fSYjMzQ7LAomIzQzOwkJCQkgICYjMzQ7dHlwZWRfaW5uZXImIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCUFTU0VSVF9TVFJFUShpbm5lciwKJiM0MzsJCQkgICAgICYjMzQ7W3tcJiMzNDtrZXlcJiMzNDs6W1wmIzM0OzB4MDBcJiMzNDssXCYjMzQ7MHgwMFwmIzM0OyxcJiMzNDsweDAwXCYjMzQ7LFwmIzM0OzB4MDBcJiMzNDtdLCYjMzQ7CiYjNDM7CQkJICAgICAmIzM0O1wmIzM0O3ZhbHVlXCYjMzQ7OltcJiMzNDsweDAxXCYjMzQ7LFwmIzM0OzB4MDFcJiMzNDssXCYjMzQ7MHgwMVwmIzM0OyxcJiMzNDsweDAxXCYjMzQ7XX1dJiMzNDssCiYjNDM7CQkJICAgICAmIzM0O29yZGluYXJ5X2RlZmF1bHQmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LAomIzQzOwkgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuCiYjNDM7CSAqLwomIzQzOwlpZiAoZW50cmllcykKJiM0MzsJCXNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLAomIzQzOwkJCSAmIzM0O1t7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDslc1wmIzM0OyxcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0O2R1bXBfb3V0ZXJcJiMzNDssJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfSx7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDtoYXNoXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX2lubmVyXCYjMzQ7LFwmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9XSYjMzQ7LAomIzQzOwkJCSByb290X2lkLCB0eXBlX25hbWUsIG91dGVyLCBpbm5lcl9pZCwgaW5uZXIpOwomIzQzOwllbHNlCiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0OzpbXX1dJiMzNDssIHJvb3RfaWQsIHR5cGVfbmFtZSk7CiYjNDM7CWlmIChkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qIC1yJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyZWN1cnNpdmVfanNvbiYjMzQ7KTsKJiM0MzsJaWYgKGR1bXBfbWFwKHJvb3RfaWQsICYjMzQ7LS1qc29uIC0tcmVjdXJzaXZlJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyZWN1cnNpdmVfbG9uZ19vcHRpb25zJiMzNDspOwomIzQzOwljaGVja19wbGFpbihyb290X2lkLCBpbm5lcl9pZCwgdHlwZV9uYW1lLCBlbnRyaWVzLCB0eXBlZCk7CiYjNDM7CiYjNDM7CS8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi8KJiM0MzsJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7aGFzaFwmIzM0OyxcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0O2R1bXBfaW5uZXJcJiMzNDssJiMzNDsKJiM0MzsJCSAmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9XSYjMzQ7LCBpbm5lcl9pZCwgaW5uZXIpOwomIzQzOwlpZiAoZHVtcF9tYXAoaW5uZXJfaWQsICYjMzQ7LWogLXImIzM0Oywgb3V0cHV0KSkKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O29yZGluYXJ5X3JlY3Vyc2l2ZSYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWlmIChvdXRlcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2Uob3V0ZXJfZmQpOwomIzQzOwlpZiAoaW5uZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfbXVsdGlwbGVfcm9vdHModm9pZCkKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpOwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIG5hbWVbQlBGX09CSl9OQU1FX0xFTl07CiYjNDM7CWNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9LCBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDRdLCBlbGVtZW50c1tPVVRQVVRfU0laRV07CiYjNDM7CXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHlwZXNbXSA9IHsgJiMzNDtoYXNoJiMzNDssICYjMzQ7YXJyYXlfb2ZfbWFwcyYjMzQ7LCAmIzM0O2hhc2hfb2ZfbWFwcyYjMzQ7LCAmIzM0O2hhc2gmIzM0OyB9OwomIzQzOwlpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07CiYjNDM7CV9fdTMyIGlkc1s0XSwga2V5OwomIzQzOwlpbnQgaSwgbGVuID0gMDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXIKJiM0MzsJICogbWFwIG11c3QgYmUgYXBwZW5kZWQgYWZ0ZXIgYWxsIHRocmVlIHJvb3RzLCBldmVuIHRob3VnaCBpdCBpcyBmb3VuZAomIzQzOwkgKiB3aGlsZSBkdW1waW5nIHRoZSBmaXJzdCBvdXRlci4gQSBwcm9jZXNzLXNwZWNpZmljIG5hbWUgYXZvaWRzIG90aGVyCiYjNDM7CSAqIHRlc3RzJiMzOTsgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uCiYjNDM7CSAqLwomIzQzOwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICYjMzQ7ZHVtcF8ldSYjMzQ7LCBnZXRwaWQoKSk7CiYjNDM7CWZkc1swXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBuYW1lLCA0LCA0LCAxLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmRzWzBdLCAmIzM0O2NyZWF0ZV9zZWxlY3RlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2Rpc2NvdmVyZWQmIzM0OywgNCwgNCwgMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkc1szXSwgJiMzNDtjcmVhdGVfZGlzY292ZXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlvcHRzLmlubmVyX21hcF9mZCA9IGZkc1swXTsKJiM0MzsJZmRzWzFdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkc1sxXSwgJiMzNDtjcmVhdGVfYXJyYXlfcm9vdCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmZHNbMl0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sICYjMzQ7Y3JlYXRlX2hhc2hfcm9vdCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGkgPSAxOyBpICZsdDs9IDI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlrZXkgPSAwOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sICZhbXA7a2V5LCAmYW1wO2Zkc1swXSwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJa2V5ID0gMTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCAmYW1wO2tleSwgJmFtcDtmZHNbM10sIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3JlZmVyZW5jZV9kaXNjb3ZlcmVkX2lubmVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKGZkcyk7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZHNbaV0gPSBtYXBfaWQoZmRzW2ldKTsKJiM0MzsJCWlmICghaWRzW2ldIHx8ICFkdW1wX21hcChpZHNbaV0sICYjMzQ7LWomIzM0OywgZWxlbWVudHMpKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJbGVuICYjNDM7PSBzbnByaW50ZihleHBlY3RlZCAmIzQzOyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sCiYjNDM7CQkJCSYjMzQ7JXN7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDslc1wmIzM0OyxcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0OyVzXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJCSYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc30lcyYjMzQ7LAomIzQzOwkJCQlpID8gJiMzNDssJiMzNDsgOiAmIzM0O1smIzM0OywgaWRzW2ldLCB0eXBlc1tpXSwKJiM0MzsJCQkJaSA9PSAzID8gJiMzNDtkdW1wX2Rpc2NvdmVyZWQmIzM0OyA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyAmIzM0O10mIzM0OyA6ICYjMzQ7JiMzNDspOwomIzQzOwl9CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDstaiAtciBtYXAgZHVtcCBuYW1lICVzJiMzNDssIG5hbWUpOwomIzQzOwlpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSwKJiM0MzsJCSAgICAgICYjMzQ7ZHVtcF9tdWx0aXBsZV9yb290cyYjMzQ7KSkgewomIzQzOwkJb3V0cHV0W3N0cmNzcG4ob3V0cHV0LCAmIzM0O1xuJiMzNDspXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O3Jvb3RzX2ZpcnN0X2FuZF9zZWVkX2RlZHVwJiMzNDspOwomIzQzOwl9CiYjNDM7b3V0OgomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOykKJiM0MzsJCWlmIChmZHNbaV0gJmd0Oz0gMCkKJiM0MzsJCQljbG9zZShmZHNbaV0pOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcikKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpOwomIzQzOwljaGFyIGVsZW1lbnRzW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXSwgcm9vdFtPVVRQVVRfU0laRV07CiYjNDM7CWNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcGxhaW5bT1VUUFVUX1NJWkVdID0ge307CiYjNDM7CWNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTsKJiM0MzsJaW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIGxvb2t1cF9lcnJubzsKJiM0MzsJX191MzIgaW5uZXJfaWQsIHJvb3RfaWQsIGtleSA9IDAsIHZhbHVlOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBFdmVyeSBrZXkgaXMgZW51bWVyYWJsZSwgYnV0IFBFUkZfRVZFTlRfQVJSQVkgbG9va3VwIHJldHVybnMKJiM0MzsJICogRU5PVFNVUFAgKHRoZSBrZXJuZWwtaW50ZXJuYWwgZXJybm8pLiBDaGVjayBib3RoIGVudHJpZXMgc28gYW4KJiM0MzsJICogZWFybHkgZXhpdCBvbiB0aGUgZmlyc3QgbG9va3VwIGZhaWx1cmUgY2Fubm90IHBhc3MuCiYjNDM7CSAqLwomIzQzOwlpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZLCAmIzM0O2R1bXBfdW5yZWFkYWJsZSYjMzQ7LAomIzQzOwkJCQkgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX3VucmVhZGFibGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgJmFtcDtrZXksICZhbXA7dmFsdWUpLCAwLAomIzQzOwkJICAgICAgICYjMzQ7dW5yZWFkYWJsZV9sb29rdXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJbG9va3VwX2Vycm5vID0gZXJybm87CiYjNDM7CWlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgJiMzNDt1bnJlYWRhYmxlX25vdF9taXNzaW5nJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTsKJiM0MzsJaWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsICYjMzQ7LWomIzM0OywgZWxlbWVudHMpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgJiMzNDtcJiMzNDtlcnJvclwmIzM0OzomIzM0OyksIDIsICYjMzQ7ZGVmYXVsdF9qc29uX2Vycm9ycyYjMzQ7KTsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0O21hcCBkdW1wIGlkICV1JiMzNDssIGlubmVyX2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgcGxhaW4sIHNpemVvZihwbGFpbikgLSAxKSwKJiM0MzsJCSAgICAgICAmIzM0O2RlZmF1bHRfcGxhaW5fdW5yZWFkYWJsZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCAmIzM0O2RlZmF1bHRfcGxhaW5fZXJyb3JzJiMzNDspOwomIzQzOwlBU1NFUlRfSEFTX1NVQlNUUihwbGFpbiwgJiMzNDtGb3VuZCAwIGVsZW1lbnRzJiMzNDssICYjMzQ7ZGVmYXVsdF9wbGFpbl9jb3VudCYjMzQ7KTsKJiM0MzsKJiM0MzsJcm9vdF9pZCA9IGlubmVyX2lkOwomIzQzOwlpZiAob3V0ZXIpIHsKJiM0MzsJCW9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7CiYjNDM7CQlvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAmIzM0O2R1bXBfb3V0ZXImIzM0OywKJiM0MzsJCQkJCSAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsICZhbXA7b3B0cyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgJiMzNDtjcmVhdGVfb3V0ZXImIzM0OykgfHwKJiM0MzsJCSAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsICZhbXA7a2V5LCAmYW1wO2lubmVyX2ZkLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtwb3B1bGF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCXJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpOwomIzQzOwkJaWYgKCFyb290X2lkIHx8ICFkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qJiMzNDssIHJvb3QpKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O2FycmF5X29mX21hcHNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc30se1wmIzM0O2lkXCYjMzQ7OiV1LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDtwZXJmX2V2ZW50X2FycmF5XCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF91bnJlYWRhYmxlXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc31dJiMzNDssIHJvb3RfaWQsIHJvb3QsIGlubmVyX2lkLCBlbGVtZW50cyk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7cGVyZl9ldmVudF9hcnJheVwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF91bnJlYWRhYmxlXCYjMzQ7LFwmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9XSYjMzQ7LAomIzQzOwkJCSBpbm5lcl9pZCwgZWxlbWVudHMpOwomIzQzOwl9CiYjNDM7CWlmIChkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qIC1yJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyZWN1cnNpdmVfdW5yZWFkYWJsZV9qc29uJiMzNDspOwomIzQzOwltZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDstciBtYXAgZHVtcCBpZCAldSYjMzQ7LCByb290X2lkKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAmIzM0O3JlY3Vyc2l2ZV91bnJlYWRhYmxlX3BsYWluJiMzNDspKSB7CiYjNDM7CQlBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCAmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsCiYjNDM7CQkJICAmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9lcnJvcnMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCAmIzM0O0ZvdW5kICYjMzQ7KSwgb3V0ZXIgPyAyIDogMSwKJiM0MzsJCQkgICYjMzQ7cmVjdXJzaXZlX3BsYWluX21hcHMmIzM0Oyk7CiYjNDM7CX0KJiM0MztvdXQ6CiYjNDM7CWlmIChvdXRlcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2Uob3V0ZXJfZmQpOwomIzQzOwlpZiAoaW5uZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CWNvbnN0IHN0cnVjdCBybGltaXQgbGltaXQgPSB7IC5ybGltX2N1ciA9IDMyLCAucmxpbV9tYXggPSAzMiB9OwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTsKJiM0MzsJX191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5OwomIzQzOwlpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgc3RhdHVzOwomIzQzOwlpbnQgaW5oZXJpdGVkX2Zkc1szMl0sIG5yX2luaGVyaXRlZCA9IDAsIGk7CiYjNDM7CWNoYXIgKm91dHB1dCA9IE5VTEw7CiYjNDM7CXBpZF90IHBpZDsKJiM0MzsKJiM0MzsJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2lubmVyJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfdGVtcGxhdGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJb3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDsKJiM0MzsJb3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgJiMzNDtkdW1wX291dGVyJiMzNDssIDQsIDQsCiYjNDM7CQkJCSAgQVJSQVlfU0laRShpZHMpLCAmYW1wO29wdHMpOwomIzQzOwljbG9zZShpbm5lcl9mZCk7CiYjNDM7CWlubmVyX2ZkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCAmIzM0O2NyZWF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGtleSA9IDA7IGtleSAmbHQ7IEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykgewomIzQzOwkJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2lubmVyJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX2lubmVyJiMzNDspIHx8CiYjNDM7CQkgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCAmYW1wO2tleSwgJmFtcDtpbm5lcl9mZCwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cG9wdWxhdGVfb3V0ZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpZHNba2V5XSA9IG1hcF9pZChpbm5lcl9mZCk7CiYjNDM7CQlpZiAoIWlkc1trZXldKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJLyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi8KJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0MzsJCWlubmVyX2ZkID0gLTE7CiYjNDM7CX0KJiM0MzsJcm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7CiYjNDM7CW91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7CiYjNDM7CWlmICghcm9vdF9pZCB8fCAhQVNTRVJUX09LX1BUUihvdXRwdXQsICYjMzQ7YWxsb2NhdGVfb3V0cHV0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qIEZpbGwgdGhlIGxvdyBGRCBzbG90cyB0byBleGVyY2lzZSBpbmhlcml0ZWQgZGVzY3JpcHRvciBjbGVhbnVwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShpbmhlcml0ZWRfZmRzKTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWludCBmZCA9IG9wZW4oJiMzNDsvZGV2L251bGwmIzM0OywgT19SRE9OTFkpOwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfRkQoZmQsICYjMzQ7b3Blbl9pbmhlcml0ZWRfZmQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpbmhlcml0ZWRfZmRzW25yX2luaGVyaXRlZCYjNDM7JiM0MztdID0gZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdAomIzQzOwkgKiBydW5uZXImIzM5O3MgbGltaXQgdW5jaGFuZ2VkLiBSZXRhaW5pbmcgZXZlcnkgZGlzY292ZXJlZCBGRCB3b3VsZCBleGNlZWQKJiM0MzsJICogdGhpcyBsaW1pdCBiZWZvcmUgdGhlIHJlY3Vyc2l2ZSBkdW1wIGNvdWxkIHZpc2l0IGFsbCBpbm5lciBtYXBzLgomIzQzOwkgKi8KJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShwaWQsIDAsICYjMzQ7Zm9yayYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIXBpZCkgewomIzQzOwkJc3RydWN0IGRpcmVudCAqZW50cnk7CiYjNDM7CQlESVIgKmRpcjsKJiM0MzsKJiM0MzsJCS8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqLwomIzQzOwkJY2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7CiYjNDM7CQlkaXIgPSBvcGVuZGlyKCYjMzQ7L3Byb2Mvc2VsZi9mZCYjMzQ7KTsKJiM0MzsJCWlmICghZGlyKQomIzQzOwkJCV9leGl0KDYpOwomIzQzOwkJLyogVGhlIHBhcmVudCBrZWVwcyB0aGUgb3V0ZXIgbWFwIGFuZCBpdHMgaW5uZXIgbWFwcyBhbGl2ZS4gKi8KJiM0MzsJCWZvciAoOzspIHsKJiM0MzsJCQljaGFyICplbmQ7CiYjNDM7CQkJbG9uZyBmZDsKJiM0MzsKJiM0MzsJCQllcnJubyA9IDA7CiYjNDM7CQkJZW50cnkgPSByZWFkZGlyKGRpcik7CiYjNDM7CQkJaWYgKCFlbnRyeSkgewomIzQzOwkJCQlpZiAoZXJybm8pCiYjNDM7CQkJCQlfZXhpdCg2KTsKJiM0MzsJCQkJYnJlYWs7CiYjNDM7CQkJfQomIzQzOwkJCWZkID0gc3RydG9sKGVudHJ5LSZndDtkX25hbWUsICZhbXA7ZW5kLCAxMCk7CiYjNDM7CQkJaWYgKCplbmQgfHwgZmQgJmx0OyAzIHx8IGZkID09IGRpcmZkKGRpcikpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCWNsb3NlKGZkKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChjbG9zZWRpcihkaXIpKQomIzQzOwkJCV9leGl0KDYpOwomIzQzOwkJaWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmYW1wO2xpbWl0KSkKJiM0MzsJCQlfZXhpdCgxKTsKJiM0MzsJCXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDslcyAtciBtYXAgZHVtcCBpZCAldSYjMzQ7LAomIzQzOwkJCSBqc29uID8gJiMzNDstaiYjMzQ7IDogJiMzNDsmIzM0Oywgcm9vdF9pZCk7CiYjNDM7CQlpZiAoZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCA2NTUzNSkpCiYjNDM7CQkJX2V4aXQoMik7CiYjNDM7CQlpZiAoY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gJiMzNDtcJiMzNDtpZFwmIzM0OzomIzM0OyA6ICYjMzQ7Rm91bmQgJiMzNDspICE9IEFSUkFZX1NJWkUoaWRzKSAmIzQzOyAxIHx8CiYjNDM7CQkgICAgY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gJiMzNDtcJiMzNDtpbm5lcl9tYXBfaWRcJiMzNDs6JiMzNDsgOiAmIzM0O2lubmVyX21hcF9pZDomIzM0OykgIT0KJiM0MzsJCSAgICBBUlJBWV9TSVpFKGlkcykpCiYjNDM7CQkJX2V4aXQoMyk7CiYjNDM7CQlmb3IgKGtleSA9IDA7IGtleSAmbHQ7IEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykgewomIzQzOwkJCWlmIChqc29uKQomIzQzOwkJCQlzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgJiMzNDtcJiMzNDtpZFwmIzM0OzoldSwmIzM0OywgaWRzW2tleV0pOwomIzQzOwkJCWVsc2UKJiM0MzsJCQkJc25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksICYjMzQ7XG4ldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICAmIzM0OywKJiM0MzsJCQkJCSBpZHNba2V5XSk7CiYjNDM7CQkJaWYgKGNvdW50X3Rva2VuKG91dHB1dCwgdG9rZW4pICE9IDEpCiYjNDM7CQkJCV9leGl0KDQpOwomIzQzOwkJfQomIzQzOwkJaWYgKGpzb24gJmFtcDsmYW1wOyAob3V0cHV0WzBdICE9ICYjMzk7WyYjMzk7IHx8CiYjNDM7CQkJICAgICBzdHJjbXAob3V0cHV0ICYjNDM7IHN0cmxlbihvdXRwdXQpIC0gMiwgJiMzNDtdXG4mIzM0OykpKQomIzQzOwkJCV9leGl0KDUpOwomIzQzOwkJX2V4aXQoMCk7CiYjNDM7CX0KJiM0MzsJaWYgKEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQsICYjMzQ7d2FpdHBpZCYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CSAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtjaGlsZF9leGl0ZWQmIzM0OykpCiYjNDM7CQlBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgJiMzNDtkdW1wX3dpdGhfbG93X2ZkX2xpbWl0JiMzNDspOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnJfaW5oZXJpdGVkOyBpJiM0MzsmIzQzOykKJiM0MzsJCUFTU0VSVF9HRShmY250bChpbmhlcml0ZWRfZmRzW2ldLCBGX0dFVEZEKSwgMCwgJiMzNDtwYXJlbnRfZmRfcHJlc2VydmVkJiMzNDspOwomIzQzOwlBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgJiMzNDtwYXJlbnRfb3V0ZXJfcHJlc2VydmVkJiMzNDspOwomIzQzO291dDoKJiM0MzsJd2hpbGUgKG5yX2luaGVyaXRlZCkKJiM0MzsJCWNsb3NlKGluaGVyaXRlZF9mZHNbLS1ucl9pbmhlcml0ZWRdKTsKJiM0MzsJZnJlZShvdXRwdXQpOwomIzQzOwlpZiAob3V0ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKG91dGVyX2ZkKTsKJiM0MzsJaWYgKGlubmVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShpbm5lcl9mZCk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpCiYjNDM7ewomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VucmVhZGFibGVfb3JkaW5hcnkmIzM0OykpCiYjNDM7CQl0ZXN0X3VucmVhZGFibGUoZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VucmVhZGFibGVfaW5uZXImIzM0OykpCiYjNDM7CQl0ZXN0X3VucmVhZGFibGUodHJ1ZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWFueV9pbm5lcl9tYXBzX2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X21hbnlfaW5uZXJfbWFwcyh0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttYW55X2lubmVyX21hcHNfcGxhaW4mIzM0OykpCiYjNDM7CQl0ZXN0X21hbnlfaW5uZXJfbWFwcyhmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bXVsdGlwbGVfcm9vdHMmIzM0OykpCiYjNDM7CQl0ZXN0X211bHRpcGxlX3Jvb3RzKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7YXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NoYXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfaGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2J0Zl9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2VtcHR5X2lubmVyJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwNjozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzk4NQoJCQkJCQkJb3V0cHV0OiA5MAoJCQkJCQkJdGhvdWdodHM6IDU1MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipQYXRjaCBBbmFseXNpczogV29ydGhGdXp6aW5nIERldGVybWluYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCBzY2FuIG9mIHRoZSBkaWZmIHJldmVhbHMgY2hhbmdlcyBzY2F0dGVyZWQgYWNyb3NzIHNldmVyYWwgZmlsZXMsIHNwZWNpZmljYWxseSB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC4gSSBzZWUgdXBkYXRlcyB0byBkb2N1bWVudGF0aW9uLCBiYXNoIGNvbXBsZXRpb24sIHRoZSBtYWluIHByb2dyYW0sIG1hcCBmdW5jdGlvbmFsaXR5LCBhbmQgYSBzZWxmdGVzdC4KCk5vdywgbGV0JiMzOTtzIHF1aWNrbHkgY3Jvc3MtcmVmZXJlbmNlIHRoYXQgd2l0aCB0aGUgZGVmaW5lZCBjcml0ZXJpYSBmb3IgYFdvcnRoRnV6emluZ2AuIFRoZSBuZWdhdGl2ZSBjcml0ZXJpYSAod2hlbiB0byAqbm90KiBmdXp6KSBpcyB3aGF0IEkgbmVlZCB0byBmb2N1cyBvbi4gU3BlY2lmaWNhbGx5LCBpdCBzdGF0ZXMgdGhhdCBtb2RpZmljYXRpb25zIGNvbmZpbmVkIHRvICYjMzQ7Tm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlcyYjMzQ7IG9yICYjMzQ7VXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cy4uLiB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMmIzM0OyB3YXJyYW50IGEgYFdvcnRoRnV6emluZz1mYWxzZWAgdmVyZGljdC4KCkZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgc2NvcGUuIE15IGFuYWx5c2lzIGNvbmZpcm1zIHRoZSBhYnNlbmNlIG9mIGNoYW5nZXMgb3V0c2lkZSB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5LiBObyB0b3VjaGluZyBvZiBjcml0aWNhbCBrZXJuZWwgY29tcG9uZW50cyBsaWtlIGBrZXJuZWwvYCwgYG5ldC9gLCBgZHJpdmVycy9gLCBgaW5jbHVkZS9gLCBgYXJjaC9gLCBgZnMvYCwgb3IgYG1tL2AgaXMgcHJlc2VudC4gQWxsIG1vZGlmaWNhdGlvbnMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC4KCkdpdmVuIHRoaXMsIHRoZSBwYXRjaCBleGNsdXNpdmVseSBhbHRlcnMgdXNlci1zcGFjZSB0b29scyBhbmQgYXNzb2NpYXRlZCBzZWxmdGVzdHMuIEFjY29yZGluZyB0byB0aGUgY3JpdGVyaWEsIHRoaXMgZGVmaW5pdGl2ZWx5IGZhbGxzIHVuZGVyIHRoZSAmIzM0O1dvcnRoRnV6emluZz1mYWxzZSYjMzQ7IGNhdGVnb3J5LiBUaGVyZWZvcmUsIEkmIzM5O20gZ29pbmcgdG8gc2V0IGBXb3J0aEZ1enppbmdgIHRvIGBmYWxzZWAuCgpUaGUgcmVhc29uaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZDogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xzIChgdG9vbHMvYnBmL2JwZnRvb2wvYCkgYW5kIHNlbGZ0ZXN0cyAoYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ApLCBhbmQgZG9lcyBub3QgYWx0ZXIgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDsgTm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZsYWdzIGFyZSBuZWVkZWQsIHNvIGBFbmFibGVDb25maWdzYCBhbmQgYEZvY3VzU3ltYm9sc2Agd2lsbCBiZSBlbXB0eS4gSSYjMzk7bSByZWFkeSB0byBwcm9jZWVkIHdpdGggdGhlIGBzZXQtcmVzdWx0c2AgY2FsbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwNjozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHVzZXItc3BhY2UgdG9vbHMgKGJwZnRvb2wpIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwtc3BhY2UgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsLXNwYWNlIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwNjozNDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDdUMDY6MzQ6NDAuNTU5MzIxOTU1WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjI4MTQ1MjUyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHVzZXItc3BhY2UgdG9vbHMgKGJwZnRvb2wpIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwtc3BhY2UgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjozNDo0MC41NTkzMzkwODVaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzODQ0OTQ0ODcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA3OGY3NmJhNzQ3MzFjMzI5NmNmZDdkN2Y3NjllYTJjODczNmYwMWY2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMDY6MzQ6MzggMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLjIzZmFhNjcyNjg1ODcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xNiw3ICsxNiw4IEBAIFNZTk9QU0lTXFxuIFxcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxcbiBcXG4tKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH1cXG4rKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8XFxuK3sgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XFxuIFxcbiAqQ09NTUFORFMqIDo9XFxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxcbkBAIC0xNzAsNiArMTcxLDI1IEBAIE9QVElPTlNcXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxcbiBcXG4rLXIsIC0tcmVjdXJzaXZlXFxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxcbisgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBJRCBpcyB2aXNpdGVkIG9uY2UsIGV2ZW4gaWZcXG4rICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy5cXG4rXFxuKyAgICBQbGFpbiBvdXRwdXQgaW5jbHVkZXMgYSBoZWFkZXIgaWRlbnRpZnlpbmcgZWFjaCBtYXAuIE9uIHN1Y2Nlc3MsIEpTT04gb3V0cHV0XFxuKyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuXFxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXFxuKyAgICByZXRhaW4gdGhlaXIgKippbm5lcl9tYXBfaWQqKiBmaWVsZCwgd2hpY2ggaWRlbnRpZmllcyB0aGUgY29ycmVzcG9uZGluZyBpbm5lclxcbisgICAgbWFwIG9iamVjdC5cXG4rXFxuKyAgICBJbm5lciBtYXAgSURzIGFyZSByZXNvbHZlZCB3aGVuIHRoZSBtYXBzIGFyZSB2aXNpdGVkLiBUaGUgZHVtcCBpcyBub3QgYW5cXG4rICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhXFxuKyAgICByZWZlcmVuY2VkIGlubmVyIG1hcCBiZWZvcmUgaXQgaXMgdmlzaXRlZC4gRmFpbHVyZSB0byBvcGVuIGEgcmVmZXJlbmNlZFxcbisgICAgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVybyBleGl0IHN0YXR1cy4gT3V0cHV0IG1heVxcbisgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLlxcbitcXG4rICAgIEluIEpTT04gbW9kZSwgdGhlIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZCBiZWZvcmUgcmV0dXJuaW5nLlxcbitcXG4gRVhBTVBMRVNcXG4gPT09PT09PT1cXG4gKiojIGJwZnRvb2wgbWFwIHNob3cqKlxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uNDVjMzM2ZDYzYmUwYSAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuQEAgLTI2MSw3ICsyNjEsNyBAQCBfYnBmdG9vbCgpXFxuIFxcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXFxuLSAgICAgICAgbG9jYWwgYz0nLS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcXFxcbisgICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1yZWN1cnNpdmUgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXFxcXG4gICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJ1xcbiAgICAgICAgIENPTVBSRVBMWT0oICQoIGNvbXBnZW4gLVcgXFxcIiRjXFxcIiAtLSBcXFwiJGN1clxcXCIgKSApXFxuICAgICAgICAgcmV0dXJuIDBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXFxuaW5kZXggYzkxZTFhNmUxYTFlYy4uNDI0YWY0YTQ5NmE1YyAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG5AQCAtMjYsNiArMjYsNyBAQCBzdGF0aWMgaW50ICgqbGFzdF9kb19oZWxwKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpO1xcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xcbiBib29sIGpzb25fb3V0cHV0O1xcbitib29sIHJlY3Vyc2l2ZV9kdW1wO1xcbiBib29sIHNob3dfcGlubmVkO1xcbiBib29sIGJsb2NrX21vdW50O1xcbiBib29sIHZlcmlmaWVyX2xvZ3M7XFxuQEAgLTQ1Miw2ICs0NTMsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdHsgXFxcImpzb25cXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J2onIH0sXFxuIFxcdFxcdHsgXFxcImhlbHBcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J2gnIH0sXFxuIFxcdFxcdHsgXFxcInByZXR0eVxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQncCcgfSxcXG4rXFx0XFx0eyBcXFwicmVjdXJzaXZlXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdyJyB9LFxcbiBcXHRcXHR7IFxcXCJ2ZXJzaW9uXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdWJyB9LFxcbiBcXHRcXHR7IFxcXCJicGZmc1xcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnZicgfSxcXG4gXFx0XFx0eyBcXFwibWFwY29tcGF0XFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdtJyB9LFxcbkBAIC00ODUsNyArNDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRiaW5fbmFtZSA9IFxcXCJicGZ0b29sXFxcIjtcXG4gXFxuIFxcdG9wdGVyciA9IDA7XFxuLVxcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXFxcIlZocGpmTG1uZFNpOms6QjpsXFxcIixcXG4rXFx0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcXFwiVmhwanJmTG1uZFNpOms6QjpsXFxcIixcXG4gXFx0XFx0XFx0XFx0ICBvcHRpb25zLCBOVUxMKSkgXFx1MDAzZT0gMCkge1xcbiBcXHRcXHRzd2l0Y2ggKG9wdCkge1xcbiBcXHRcXHRjYXNlICdWJzpcXG5AQCAtNTA3LDYgKzUwOSw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0XFx0fVxcbiBcXHRcXHRcXHRqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAncic6XFxuK1xcdFxcdFxcdHJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ2YnOlxcbiBcXHRcXHRcXHRzaG93X3Bpbm5lZCA9IHRydWU7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcXG5pbmRleCA3OGI2ZTBlYmI4NWQ4Li43NjYyNjY0MmU5NGNiIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbkBAIC04Myw2ICs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTtcXG4gXFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7XFxuK2V4dGVybiBib29sIHJlY3Vyc2l2ZV9kdW1wO1xcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcXG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xcbiBleHRlcm4gYm9vbCBibG9ja19tb3VudDtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmM0MDBiMTVmMTZkZDIgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbkBAIC0xNyw2ICsxNyw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnBmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnRmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvaGFzaG1hcC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcImpzb25fd3JpdGVyLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJtYWluLmhcXFwiXFxuQEAgLTgyNiwxMiArODI3LDQ0IEBAIHN0YXRpYyB2b2lkIGZyZWVfbWFwX2t2X2J0ZihzdHJ1Y3QgYnRmICpidGYpXFxuIFxcdFxcdGJ0Zl9fZnJlZShidGYpO1xcbiB9XFxuIFxcbitzdHJ1Y3QgbWFwX2R1bXBfY3R4IHtcXG4rXFx0c3RydWN0IGhhc2htYXAgKnNlZW47XFxuK1xcdF9fdTMyICpwZW5kaW5nX2lkcztcXG4rXFx0c2l6ZV90IHBlbmRpbmdfY250O1xcbit9O1xcbitcXG4rc3RhdGljIGludCBjb2xsZWN0X2lubmVyX21hcChzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgsIF9fdTMyIGlkKVxcbit7XFxuK1xcdF9fdTMyICppZHM7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRpZiAoaGFzaG1hcF9fZmluZChjdHgtXFx1MDAzZXNlZW4sIGlkLCBOVUxMKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC1cXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cXHUwMDNlcGVuZGluZ19jbnQgKyAxLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZigqaWRzKSk7XFxuK1xcdGlmICghaWRzKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJtZW0gYWxsb2MgZmFpbGVkXFxcIik7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRjdHgtXFx1MDAzZXBlbmRpbmdfaWRzID0gaWRzO1xcbitcXG4rXFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cXHUwMDNlc2VlbiwgaWQsIDApO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcXFwiLCBpZCwgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFx0aWRzW2N0eC1cXHUwMDNlcGVuZGluZ19jbnQrK10gPSBpZDtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnRcXG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuLVxcdCBib29sIHNob3dfaGVhZGVyKVxcbitcXHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxcbiB7XFxuIFxcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XFxuIFxcdHVuc2lnbmVkIGludCBudW1fZWxlbXMgPSAwO1xcbitcXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcXG4gXFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcXG4gXFx0aW50IGVycjtcXG4gXFxuQEAgLTg0NSw2ICs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcbiBcXHRwcmV2X2tleSA9IE5VTEw7XFxuIFxcbitcXHRpZiAoY3R4IFxcdTAwMjZcXHUwMDI2ICF3dHIgXFx1MDAyNlxcdTAwMjYgKGluZm8tXFx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XFxuK1xcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkge1xcbitcXHRcXHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcXG4rXFx0XFx0aWYgKHBsYWluX2J0Zl93dHIpIHtcXG4rXFx0XFx0XFx0aWYgKHNob3dfaGVhZGVyKVxcbitcXHRcXHRcXHRcXHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XFxuK1xcdFxcdFxcdHNob3dfaGVhZGVyID0gZmFsc2U7XFxuK1xcdFxcdFxcdHd0ciA9IHBsYWluX2J0Zl93dHI7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4gXFx0aWYgKHd0cikge1xcbiBcXHRcXHRlcnIgPSBnZXRfbWFwX2t2X2J0ZihpbmZvLCBcXHUwMDI2YnRmKTtcXG4gXFx0XFx0aWYgKGVycikge1xcbkBAIC04NzQsMTAgKzkxOCwyMCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0XFx0aWYgKGVycikge1xcbiBcXHRcXHRcXHRpZiAoZXJybm8gPT0gRU5PRU5UKVxcbiBcXHRcXHRcXHRcXHRlcnIgPSAwO1xcbitcXHRcXHRcXHRlbHNlIGlmIChjdHgpXFxuK1xcdFxcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBpbmZvLVxcdTAwM2VpZCwgc3RyZXJyb3IoZXJybm8pKTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXFxuK1xcdFxcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcXG4rXFx0XFx0aWYgKCFlcnIpIHtcXG4gXFx0XFx0XFx0bnVtX2VsZW1zKys7XFxuK1xcdFxcdFxcdGlmIChjdHggXFx1MDAyNlxcdTAwMjYgbWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXFx1MDAzZXR5cGUpKSB7XFxuK1xcdFxcdFxcdFxcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcXG4rXFx0XFx0XFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbiBcXHRcXHRwcmV2X2tleSA9IGtleTtcXG4gXFx0fVxcbiBcXG5AQCAtODk0LDE4ICs5NDgsMjUgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcdGZyZWUoa2V5KTtcXG4gXFx0ZnJlZSh2YWx1ZSk7XFxuIFxcdGZyZWVfbWFwX2t2X2J0ZihidGYpO1xcbitcXHRpZiAocGxhaW5fYnRmX3d0cilcXG4rXFx0XFx0anNvbndfZGVzdHJveShcXHUwMDI2cGxhaW5fYnRmX3d0cik7XFxuIFxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9nZXRfZmRfYnlfaWRfb3B0cywgb3B0cyxcXG4rXFx0XFx0ICAgIC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxcbitcXHQpO1xcbiBcXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XFxuIFxcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRzdHJ1Y3QgbWFwX2R1bXBfY3R4IGN0eCA9IHt9O1xcbiBcXHRpbnQgbmJfZmRzLCBpID0gMDtcXG4gXFx0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xcbiBcXHRpbnQgKmZkcyA9IE5VTEw7XFxuIFxcdGludCBlcnIgPSAtMTtcXG4rXFx0c2l6ZV90IGo7XFxuIFxcbiBcXHRpZiAoYXJnYyAhPSAyKVxcbiBcXHRcXHR1c2FnZSgpO1xcbkBAIC05MTksOSArOTgwLDM0IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGlmIChuYl9mZHMgXFx1MDAzYyAxKVxcbiBcXHRcXHRnb3RvIGV4aXRfZnJlZTtcXG4gXFxuK1xcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xcbitcXHRcXHRjdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsXFxuK1xcdFxcdFxcdFxcdFxcdGVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpO1xcbitcXHRcXHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xcbitcXHRcXHRcXHRjdHguc2VlbiA9IE5VTEw7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wXFxcIik7XFxuK1xcdFxcdFxcdGdvdG8gZXhpdF9jbG9zZTtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspIHtcXG4rXFx0XFx0XFx0bGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFxcdTAwMjZpbmZvLCBcXHUwMDI2bGVuKSkge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiY2FuJ3QgZ2V0IG1hcCBpbmZvOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdFxcdFxcdGVyciA9IC0xO1xcbitcXHRcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTtcXG4rXFx0XFx0XFx0aWYgKGVycikge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzXFxcIiwgaW5mby5pZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbiBcXHRpZiAoanNvbl9vdXRwdXQpIHtcXG4gXFx0XFx0d3RyID0ganNvbl93dHI7XFxuLVxcdH0gZWxzZSB7XFxuK1xcdH0gZWxzZSBpZiAoIXJlY3Vyc2l2ZV9kdW1wKSB7XFxuIFxcdFxcdGludCBkb19wbGFpbl9idGY7XFxuIFxcbiBcXHRcXHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcXG5AQCAtOTM2LDcgKzEwMjIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHR9XFxuIFxcdH1cXG4gXFxuLVxcdGlmICh3dHIgXFx1MDAyNlxcdTAwMjYgbmJfZmRzIFxcdTAwM2UgMSlcXG4rXFx0aWYgKHd0ciBcXHUwMDI2XFx1MDAyNiAobmJfZmRzIFxcdTAwM2UgMSB8fCByZWN1cnNpdmVfZHVtcCkpXFxuIFxcdFxcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XFx0Lyogcm9vdCBhcnJheSAqL1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspIHtcXG4gXFx0XFx0aWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmRzW2ldLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbikpIHtcXG5AQCAtOTQ0LDIyICsxMDMwLDUwIEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdFxcdGVyciA9IC0xO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbi1cXHRcXHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFxcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcXHUwMDNlIDEpO1xcbitcXHRcXHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFxcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXAsXFxuK1xcdFxcdFxcdCAgICAgICByZWN1cnNpdmVfZHVtcCA/IFxcdTAwMjZjdHggOiBOVUxMKTtcXG4gXFx0XFx0aWYgKCF3dHIgXFx1MDAyNlxcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxcbiBcXHRcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxuIFxcbiBcXHRcXHRpZiAoZXJyKVxcbiBcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0Y2xvc2UoZmRzW2ldKTtcXG4rXFx0XFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXFxuK1xcdFxcdGlmICghcmVjdXJzaXZlX2R1bXApXFxuK1xcdFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdH1cXG4rXFx0Zm9yIChqID0gMDsgIWVyciBcXHUwMDI2XFx1MDAyNiBqIFxcdTAwM2MgY3R4LnBlbmRpbmdfY250OyBqKyspIHtcXG4rXFx0XFx0aW50IGZkO1xcbitcXG4rXFx0XFx0ZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXNcXFwiLFxcbitcXHRcXHRcXHQgICAgICBjdHgucGVuZGluZ19pZHNbal0sIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdFxcdGVyciA9IC0xO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHRcXHRsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcdFxcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbikpIHtcXG4rXFx0XFx0XFx0cF9lcnIoXFxcImNhbid0IGdldCBtYXAgaW5mbzogJXNcXFwiLCBzdHJlcnJvcihlcnJubykpO1xcbitcXHRcXHRcXHRlcnIgPSAtMTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0aWYgKCF3dHIpXFxuK1xcdFxcdFxcdFxcdHByaW50ZihcXFwiXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0ZXJyID0gbWFwX2R1bXAoZmQsIFxcdTAwMjZpbmZvLCB3dHIsIHRydWUsIFxcdTAwMjZjdHgpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGNsb3NlKGZkKTtcXG4gXFx0fVxcbi1cXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IG5iX2ZkcyBcXHUwMDNlIDEpXFxuK1xcdGlmICh3dHIgXFx1MDAyNlxcdTAwMjYgKG5iX2ZkcyBcXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXApKVxcbiBcXHRcXHRqc29ud19lbmRfYXJyYXkod3RyKTtcXHQvKiByb290IGFycmF5ICovXFxuIFxcbiBcXHRpZiAoYnRmX3d0cilcXG4gXFx0XFx0anNvbndfZGVzdHJveShcXHUwMDI2YnRmX3d0cik7XFxuIGV4aXRfY2xvc2U6XFxuK1xcdGlmIChyZWN1cnNpdmVfZHVtcClcXG4rXFx0XFx0aSA9IDA7XFxuIFxcdGZvciAoOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspXFxuIFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdGhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pO1xcbitcXHRmcmVlKGN0eC5wZW5kaW5nX2lkcyk7XFxuIGV4aXRfZnJlZTpcXG4gXFx0ZnJlZShmZHMpO1xcbiBcXHRmcmVlX2J0Zl92bWxpbnV4KCk7XFxuQEAgLTE0ODQsNyArMTU5OCw3IEBAIHN0YXRpYyBpbnQgZG9faGVscChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdFxcXCIgICAgICAgICAgICAgICAgIHRhc2tfc3RvcmFnZSB8IGJsb29tX2ZpbHRlciB8IHVzZXJfcmluZ2J1ZiB8IGNncnBfc3RvcmFnZSB8IGFyZW5hIHxcXFxcblxcXCJcXG4gXFx0XFx0XFxcIiAgICAgICAgICAgICAgICAgaW5zbl9hcnJheSB8IHJoYXNoIH1cXFxcblxcXCJcXG4gXFx0XFx0XFxcIiAgICAgICBcXFwiIEhFTFBfU1BFQ19PUFRJT05TIFxcXCIgfFxcXFxuXFxcIlxcbi1cXHRcXHRcXFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB9XFxcXG5cXFwiXFxuK1xcdFxcdFxcXCIgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IHwgey1yfC0tcmVjdXJzaXZlfSB9XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCJcXFwiLFxcbiBcXHRcXHRiaW5fbmFtZSwgYXJndlstMl0pO1xcbiBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi45Yzg4NzQzYThmODQyXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xcbkBAIC0wLDAgKzEsNDY1IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3Jlc291cmNlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NkaXJlbnQuaFxcdTAwM2VcXG4rXFxuKyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MlxcbitcXG4rc3RhdGljIGJvb2wgZHVtcF9tYXAoX191MzIgaWQsIGNvbnN0IGNoYXIgKm9wdGlvbnMsIGNoYXIgKm91dHB1dClcXG4re1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XFxuK1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCIlcyBtYXAgZHVtcCBpZCAldVxcXCIsIG9wdGlvbnMsIGlkKTtcXG4rXFx0bWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwiZHVtcF9tYXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHQvKiBUaGUgaGVscGVyIGRvZXNuJ3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovXFxuK1xcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXFxcIlxcXFxuXFxcIildID0gJ1xcXFwwJztcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbiksIFxcXCJtYXBfaW5mb1xcXCIpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0cmV0dXJuIGluZm8uaWQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY291bnRfdG9rZW4oY29uc3QgY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICp0b2tlbilcXG4re1xcbitcXHRpbnQgY291bnQgPSAwO1xcbitcXG4rXFx0d2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7XFxuK1xcdFxcdGNvdW50Kys7XFxuK1xcdFxcdG91dHB1dCArPSBzdHJsZW4odG9rZW4pO1xcbitcXHR9XFxuK1xcdHJldHVybiBjb3VudDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfcGxhaW4oX191MzIgcm9vdF9pZCwgX191MzIgaW5uZXJfaWQsIGNvbnN0IGNoYXIgKnR5cGUsXFxuK1xcdFxcdFxcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxcbit7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XFxuK1xcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjb25zdCBjaGFyICpyb290LCAqaW5uZXI7XFxuK1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVxcXCIsIHJvb3RfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwicGxhaW5fZHVtcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXFxcIiwgcm9vdF9pZCwgdHlwZSk7XFxuK1xcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXFxcInBsYWluX3Jvb3RfaGVhZGVyXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFxcXCJwbGFpbl9yb290X2ZpcnN0XFxcIik7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFxcXCJpbm5lcl9tYXBfaWQ6XFxcIiksIGVudHJpZXMsIFxcXCJwbGFpbl9yZWZlcmVuY2VzXFxcIik7XFxuK1xcdGlmIChlbnRyaWVzKSB7XFxuK1xcdFxcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdFxcdGlubmVyID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcXG4rXFx0XFx0aWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsIFxcXCJwbGFpbl9pbm5lcl9oZWFkZXJcXFwiKSlcXG4rXFx0XFx0XFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXFxcInBsYWluX2lubmVyX2FmdGVyX3Jvb3RcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgXFxcInBsYWluX2lubmVyX29uY2VcXFwiKTtcXG4rXFx0fVxcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcXFwiRm91bmQgXFxcIiksIGVudHJpZXMgXFx1MDAyNlxcdTAwMjYgIXR5cGVkID8gMiA6IDEsXFxuK1xcdFxcdCAgXFxcInBsYWluX21hcF9jb3VudFxcXCIpO1xcbitcXHRpZiAodHlwZWQpIHtcXG4rXFx0XFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcXFwiXFxcXFxcXCJrZXlcXFxcXFxcIjogMFxcXCIsIFxcXCJwbGFpbl9idGZfa2V5XFxcIik7XFxuK1xcdFxcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXFxcIlxcXFxcXFwidmFsdWVcXFxcXFxcIjogMTY4NDMwMDlcXFwiLCBcXFwicGxhaW5fYnRmX3ZhbHVlXFxcIik7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcXG4rXFx0XFx0ICAgICAgIGJvb2wgdHlwZWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpO1xcbitcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbitcXHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07XFxuK1xcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xcbitcXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcXG4rXFx0X191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxO1xcbitcXG4rXFx0aWYgKHR5cGVkKSB7XFxuK1xcdFxcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJjcmVhdGVfYnRmXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXFxcInVuc2lnbmVkIGludFxcXCIsIDQsIDApLCAxLCBcXFwiYnRmX2ludFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcXFwibG9hZF9idGZcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xcbitcXHRcXHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xcbitcXHR9XFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2lubmVyXFxcIiwgc2l6ZW9mKGtleSksXFxuK1xcdFxcdFxcdFxcdCAgc2l6ZW9mKHZhbHVlKSwgMiwgXFx1MDAyNmlubmVyX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXFxcImNyZWF0ZV9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0a2V5ID0gMDtcXG4rXFx0aWYgKCFlbXB0eV9pbm5lciBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxcbitcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX2lubmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xcbitcXHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIFxcXCJkdW1wX291dGVyXFxcIiwgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXFxuK1xcdFxcdFxcdFxcdCAgMywgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0LyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqL1xcbitcXHRmb3IgKGtleSA9IDA7IGtleSBcXHUwMDNjIGVudHJpZXM7IGtleSsrKVxcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcXG4rXFx0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xcbitcXHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcXFwiLWpcXFwiLCBvdXRlcikgfHxcXG4rXFx0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXFxcIi1qXFxcIiwgaW5uZXIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9FUShvdXRlclswXSwgJ1snLCBcXFwiZGVmYXVsdF9hcnJheVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFxcXCJcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6XFxcIiksIDAsIFxcXCJkZWZhdWx0X25vX3dyYXBwZXJcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcXFwiXFxcXFxcXCJpZFxcXFxcXFwiOlxcXCIpLCAwLCBcXFwiZGVmYXVsdF9ub19oZWFkZXJcXFwiKTtcXG4rXFx0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXFxcIlxcXFxcXFwiaW5uZXJfbWFwX2lkXFxcXFxcXCI6JXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXFxcImRlZmF1bHRfcmVmZXJlbmNlc1xcXCIpO1xcbitcXHRpZiAoIWVudHJpZXMpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRlciwgXFxcIltdXFxcIiwgXFxcImVtcHR5X291dGVyX2RlZmF1bHRcXFwiKTtcXG4rXFx0aWYgKGVtcHR5X2lubmVyKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsIFxcXCJbXVxcXCIsIFxcXCJlbXB0eV9pbm5lcl9kZWZhdWx0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHR5cGVkKVxcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgXFxcIlxcXFxcXFwiZm9ybWF0dGVkXFxcXFxcXCI6e1xcXFxcXFwia2V5XFxcXFxcXCI6MCxcXFxcXFxcInZhbHVlXFxcXFxcXCI6MTY4NDMwMDl9XFxcIixcXG4rXFx0XFx0XFx0XFx0ICBcXFwidHlwZWRfaW5uZXJcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIlt7XFxcXFxcXCJrZXlcXFxcXFxcIjpbXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCJdLFxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOltcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIl19XVxcXCIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIm9yZGluYXJ5X2RlZmF1bHRcXFwiKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxcbitcXHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXFxuK1xcdCAqL1xcbitcXHRpZiAoZW50cmllcylcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9LHtcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9pbm5lclxcXFxcXFwiLFxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIixcXG4rXFx0XFx0XFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6W119XVxcXCIsIHJvb3RfaWQsIHR5cGVfbmFtZSk7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV9qc29uXFxcIik7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLS1qc29uIC0tcmVjdXJzaXZlXFxcIiwgb3V0cHV0KSlcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJyZWN1cnNpdmVfbG9uZ19vcHRpb25zXFxcIik7XFxuK1xcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcXG4rXFxuK1xcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cXG4rXFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX2lubmVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIiwgaW5uZXJfaWQsIGlubmVyKTtcXG4rXFx0aWYgKGR1bXBfbWFwKGlubmVyX2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcIm9yZGluYXJ5X3JlY3Vyc2l2ZVxcXCIpO1xcbitvdXQ6XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcXG4rXFx0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge30sIGV4cGVjdGVkW09VVFBVVF9TSVpFICogNF0sIGVsZW1lbnRzW09VVFBVVF9TSVpFXTtcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcXFwiaGFzaFxcXCIsIFxcXCJhcnJheV9vZl9tYXBzXFxcIiwgXFxcImhhc2hfb2ZfbWFwc1xcXCIsIFxcXCJoYXNoXFxcIiB9O1xcbitcXHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XFxuK1xcdF9fdTMyIGlkc1s0XSwga2V5O1xcbitcXHRpbnQgaSwgbGVuID0gMDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXFxuK1xcdCAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmRcXG4rXFx0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxcbitcXHQgKiB0ZXN0cycgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXFxuK1xcdCAqL1xcbitcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJkdW1wXyV1XFxcIiwgZ2V0cGlkKCkpO1xcbitcXHRmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXFxcImNyZWF0ZV9zZWxlY3RlZF9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2Rpc2NvdmVyZWRcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzNdLCBcXFwiY3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xcbitcXHRmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFxcXCJjcmVhdGVfYXJyYXlfcm9vdFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sIFxcXCJjcmVhdGVfaGFzaF9yb290XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2M9IDI7IGkrKykge1xcbitcXHRcXHRrZXkgPSAwO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRrZXkgPSAxO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1szXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKSB7XFxuK1xcdFxcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xcbitcXHRcXHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcXFwiLWpcXFwiLCBlbGVtZW50cykpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRsZW4gKz0gc25wcmludGYoZXhwZWN0ZWQgKyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sXFxuK1xcdFxcdFxcdFxcdFxcXCIlc3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiJXNcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdFxcdFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9JXNcXFwiLFxcbitcXHRcXHRcXHRcXHRpID8gXFxcIixcXFwiIDogXFxcIltcXFwiLCBpZHNbaV0sIHR5cGVzW2ldLFxcbitcXHRcXHRcXHRcXHRpID09IDMgPyBcXFwiZHVtcF9kaXNjb3ZlcmVkXFxcIiA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcXFwiXVxcXCIgOiBcXFwiXFxcIik7XFxuK1xcdH1cXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiLWogLXIgbWFwIGR1bXAgbmFtZSAlc1xcXCIsIG5hbWUpO1xcbitcXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcXG4rXFx0XFx0ICAgICAgXFxcImR1bXBfbXVsdGlwbGVfcm9vdHNcXFwiKSkge1xcbitcXHRcXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFxcXCJcXFxcblxcXCIpXSA9ICdcXFxcMCc7XFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwicm9vdHNfZmlyc3RfYW5kX3NlZWRfZGVkdXBcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkrKylcXG4rXFx0XFx0aWYgKGZkc1tpXSBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRjbG9zZShmZHNbaV0pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y2hhciBlbGVtZW50c1tPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV0sIHJvb3RbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XFxuK1xcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBsb29rdXBfZXJybm87XFxuK1xcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJuc1xcbitcXHQgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhblxcbitcXHQgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy5cXG4rXFx0ICovXFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksIFxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdW5yZWFkYWJsZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNnZhbHVlKSwgMCxcXG4rXFx0XFx0ICAgICAgIFxcXCJ1bnJlYWRhYmxlX2xvb2t1cFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0bG9va3VwX2Vycm5vID0gZXJybm87XFxuK1xcdGlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgXFxcInVucmVhZGFibGVfbm90X21pc3NpbmdcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcXG4rXFx0aWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsIFxcXCItalxcXCIsIGVsZW1lbnRzKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgXFxcIlxcXFxcXFwiZXJyb3JcXFxcXFxcIjpcXFwiKSwgMiwgXFxcImRlZmF1bHRfanNvbl9lcnJvcnNcXFwiKTtcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwibWFwIGR1bXAgaWQgJXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwiZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCBcXFwiZGVmYXVsdF9wbGFpbl9lcnJvcnNcXFwiKTtcXG4rXFx0QVNTRVJUX0hBU19TVUJTVFIocGxhaW4sIFxcXCJGb3VuZCAwIGVsZW1lbnRzXFxcIiwgXFxcImRlZmF1bHRfcGxhaW5fY291bnRcXFwiKTtcXG4rXFxuK1xcdHJvb3RfaWQgPSBpbm5lcl9pZDtcXG4rXFx0aWYgKG91dGVyKSB7XFxuK1xcdFxcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdFxcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMSwgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFxcdTAwMjZrZXksIFxcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicG9wdWxhdGVfb3V0ZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xcbitcXHRcXHRpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFxcXCItalxcXCIsIHJvb3QpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJhcnJheV9vZl9tYXBzXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX291dGVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc30se1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJwZXJmX2V2ZW50X2FycmF5XFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX3VucmVhZGFibGVcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJmbGFnc1xcXFxcXFwiOjAsXFxcXFxcXCJlbGVtZW50c1xcXFxcXFwiOiVzfV1cXFwiLCByb290X2lkLCByb290LCBpbm5lcl9pZCwgZWxlbWVudHMpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcInBlcmZfZXZlbnRfYXJyYXlcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX3VucmVhZGFibGVcXFxcXFxcIixcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9XVxcXCIsXFxuK1xcdFxcdFxcdCBpbm5lcl9pZCwgZWxlbWVudHMpO1xcbitcXHR9XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX2pzb25cXFwiKTtcXG4rXFx0bWVtc2V0KG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpO1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItciBtYXAgZHVtcCBpZCAldVxcXCIsIHJvb3RfaWQpO1xcbitcXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcXG4rXFx0XFx0ICAgICAgXFxcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX3BsYWluXFxcIikpIHtcXG4rXFx0XFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBwbGFpbiwgXFxcInJlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLFxcbitcXHRcXHRcXHQgIFxcXCJyZWN1cnNpdmVfcGxhaW5fZXJyb3JzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFxcXCJGb3VuZCBcXFwiKSwgb3V0ZXIgPyAyIDogMSxcXG4rXFx0XFx0XFx0ICBcXFwicmVjdXJzaXZlX3BsYWluX21hcHNcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfbWFueV9pbm5lcl9tYXBzKGJvb2wganNvbilcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y29uc3Qgc3RydWN0IHJsaW1pdCBsaW1pdCA9IHsgLnJsaW1fY3VyID0gMzIsIC5ybGltX21heCA9IDMyIH07XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgdG9rZW5bNjRdO1xcbitcXHRfX3UzMiBpZHNbNjRdLCByb290X2lkLCBrZXk7XFxuK1xcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBzdGF0dXM7XFxuK1xcdGludCBpbmhlcml0ZWRfZmRzWzMyXSwgbnJfaW5oZXJpdGVkID0gMCwgaTtcXG4rXFx0Y2hhciAqb3V0cHV0ID0gTlVMTDtcXG4rXFx0cGlkX3QgcGlkO1xcbitcXG4rXFx0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfaW5uZXJcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdGVtcGxhdGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIiwgNCwgNCxcXG4rXFx0XFx0XFx0XFx0ICBBUlJBWV9TSVpFKGlkcyksIFxcdTAwMjZvcHRzKTtcXG4rXFx0Y2xvc2UoaW5uZXJfZmQpO1xcbitcXHRpbm5lcl9mZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0Zm9yIChrZXkgPSAwOyBrZXkgXFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSsrKSB7XFxuK1xcdFxcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2lubmVyXFxcIiwgNCwgNCwgMSwgTlVMTCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcXFwiY3JlYXRlX2lubmVyXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJwb3B1bGF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xcbitcXHRcXHRpZiAoIWlkc1trZXldKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0LyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi9cXG4rXFx0XFx0Y2xvc2UoaW5uZXJfZmQpO1xcbitcXHRcXHRpbm5lcl9mZCA9IC0xO1xcbitcXHR9XFxuK1xcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xcbitcXHRvdXRwdXQgPSBjYWxsb2MoMSwgNjU1MzYpO1xcbitcXHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcXFwiYWxsb2NhdGVfb3V0cHV0XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0LyogRmlsbCB0aGUgbG93IEZEIHNsb3RzIHRvIGV4ZXJjaXNlIGluaGVyaXRlZCBkZXNjcmlwdG9yIGNsZWFudXAuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGluaGVyaXRlZF9mZHMpOyBpKyspIHtcXG4rXFx0XFx0aW50IGZkID0gb3BlbihcXFwiL2Rldi9udWxsXFxcIiwgT19SRE9OTFkpO1xcbitcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFxcXCJvcGVuX2luaGVyaXRlZF9mZFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQrK10gPSBmZDtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxcbitcXHQgKiBydW5uZXIncyBsaW1pdCB1bmNoYW5nZWQuIFJldGFpbmluZyBldmVyeSBkaXNjb3ZlcmVkIEZEIHdvdWxkIGV4Y2VlZFxcbitcXHQgKiB0aGlzIGxpbWl0IGJlZm9yZSB0aGUgcmVjdXJzaXZlIGR1bXAgY291bGQgdmlzaXQgYWxsIGlubmVyIG1hcHMuXFxuK1xcdCAqL1xcbitcXHRwaWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKHBpZCwgMCwgXFxcImZvcmtcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghcGlkKSB7XFxuK1xcdFxcdHN0cnVjdCBkaXJlbnQgKmVudHJ5O1xcbitcXHRcXHRESVIgKmRpcjtcXG4rXFxuK1xcdFxcdC8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqL1xcbitcXHRcXHRjbG9zZShpbmhlcml0ZWRfZmRzW25yX2luaGVyaXRlZCAtIDFdKTtcXG4rXFx0XFx0ZGlyID0gb3BlbmRpcihcXFwiL3Byb2Mvc2VsZi9mZFxcXCIpO1xcbitcXHRcXHRpZiAoIWRpcilcXG4rXFx0XFx0XFx0X2V4aXQoNik7XFxuK1xcdFxcdC8qIFRoZSBwYXJlbnQga2VlcHMgdGhlIG91dGVyIG1hcCBhbmQgaXRzIGlubmVyIG1hcHMgYWxpdmUuICovXFxuK1xcdFxcdGZvciAoOzspIHtcXG4rXFx0XFx0XFx0Y2hhciAqZW5kO1xcbitcXHRcXHRcXHRsb25nIGZkO1xcbitcXG4rXFx0XFx0XFx0ZXJybm8gPSAwO1xcbitcXHRcXHRcXHRlbnRyeSA9IHJlYWRkaXIoZGlyKTtcXG4rXFx0XFx0XFx0aWYgKCFlbnRyeSkge1xcbitcXHRcXHRcXHRcXHRpZiAoZXJybm8pXFxuK1xcdFxcdFxcdFxcdFxcdF9leGl0KDYpO1xcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRmZCA9IHN0cnRvbChlbnRyeS1cXHUwMDNlZF9uYW1lLCBcXHUwMDI2ZW5kLCAxMCk7XFxuK1xcdFxcdFxcdGlmICgqZW5kIHx8IGZkIFxcdTAwM2MgMyB8fCBmZCA9PSBkaXJmZChkaXIpKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0Y2xvc2UoZmQpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChjbG9zZWRpcihkaXIpKVxcbitcXHRcXHRcXHRfZXhpdCg2KTtcXG4rXFx0XFx0aWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCBcXHUwMDI2bGltaXQpKVxcbitcXHRcXHRcXHRfZXhpdCgxKTtcXG4rXFx0XFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiJXMgLXIgbWFwIGR1bXAgaWQgJXVcXFwiLFxcbitcXHRcXHRcXHQganNvbiA/IFxcXCItalxcXCIgOiBcXFwiXFxcIiwgcm9vdF9pZCk7XFxuK1xcdFxcdGlmIChnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIDY1NTM1KSlcXG4rXFx0XFx0XFx0X2V4aXQoMik7XFxuK1xcdFxcdGlmIChjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcXFwiXFxcXFxcXCJpZFxcXFxcXFwiOlxcXCIgOiBcXFwiRm91bmQgXFxcIikgIT0gQVJSQVlfU0laRShpZHMpICsgMSB8fFxcbitcXHRcXHQgICAgY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gXFxcIlxcXFxcXFwiaW5uZXJfbWFwX2lkXFxcXFxcXCI6XFxcIiA6IFxcXCJpbm5lcl9tYXBfaWQ6XFxcIikgIT1cXG4rXFx0XFx0ICAgIEFSUkFZX1NJWkUoaWRzKSlcXG4rXFx0XFx0XFx0X2V4aXQoMyk7XFxuK1xcdFxcdGZvciAoa2V5ID0gMDsga2V5IFxcdTAwM2MgQVJSQVlfU0laRShpZHMpOyBrZXkrKykge1xcbitcXHRcXHRcXHRpZiAoanNvbilcXG4rXFx0XFx0XFx0XFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFxcXCJcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcIiwgaWRzW2tleV0pO1xcbitcXHRcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdFxcdHNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCBcXFwiXFxcXG4ldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgaWRzW2tleV0pO1xcbitcXHRcXHRcXHRpZiAoY291bnRfdG9rZW4ob3V0cHV0LCB0b2tlbikgIT0gMSlcXG4rXFx0XFx0XFx0XFx0X2V4aXQoNCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKGpzb24gXFx1MDAyNlxcdTAwMjYgKG91dHB1dFswXSAhPSAnWycgfHxcXG4rXFx0XFx0XFx0ICAgICBzdHJjbXAob3V0cHV0ICsgc3RybGVuKG91dHB1dCkgLSAyLCBcXFwiXVxcXFxuXFxcIikpKVxcbitcXHRcXHRcXHRfZXhpdCg1KTtcXG4rXFx0XFx0X2V4aXQoMCk7XFxuK1xcdH1cXG4rXFx0aWYgKEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXFx1MDAyNnN0YXR1cywgMCksIHBpZCwgXFxcIndhaXRwaWRcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJjaGlsZF9leGl0ZWRcXFwiKSlcXG4rXFx0XFx0QVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFxcXCJkdW1wX3dpdGhfbG93X2ZkX2xpbWl0XFxcIik7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkrKylcXG4rXFx0XFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcXFwicGFyZW50X2ZkX3ByZXNlcnZlZFxcXCIpO1xcbitcXHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXFxcInBhcmVudF9vdXRlcl9wcmVzZXJ2ZWRcXFwiKTtcXG4rb3V0OlxcbitcXHR3aGlsZSAobnJfaW5oZXJpdGVkKVxcbitcXHRcXHRjbG9zZShpbmhlcml0ZWRfZmRzWy0tbnJfaW5oZXJpdGVkXSk7XFxuK1xcdGZyZWUob3V0cHV0KTtcXG4rXFx0aWYgKG91dGVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKG91dGVyX2ZkKTtcXG4rXFx0aWYgKGlubmVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGlubmVyX2ZkKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcXG4re1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwidW5yZWFkYWJsZV9vcmRpbmFyeVxcXCIpKVxcbitcXHRcXHR0ZXN0X3VucmVhZGFibGUoZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwidW5yZWFkYWJsZV9pbm5lclxcXCIpKVxcbitcXHRcXHR0ZXN0X3VucmVhZGFibGUodHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtYW55X2lubmVyX21hcHNfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X21hbnlfaW5uZXJfbWFwcyh0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm1hbnlfaW5uZXJfbWFwc19wbGFpblxcXCIpKVxcbitcXHRcXHR0ZXN0X21hbnlfaW5uZXJfbWFwcyhmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtdWx0aXBsZV9yb290c1xcXCIpKVxcbitcXHRcXHR0ZXN0X211bHRpcGxlX3Jvb3RzKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJhcnJheV9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJoYXNoX29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2hhcmVkX2lubmVyXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJlbXB0eV9hcnJheV9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJlbXB0eV9oYXNoX29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiYnRmX2lubmVyXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiZW1wdHlfaW5uZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDY6MzQ6NDEuOTQ0NjIyMTgxWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo0ODk2MTQxODUyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsLXNwYWNlIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA3OGY3NmJhNzQ3MzFjMzI5NmNmZDdkN2Y3NjllYTJjODczNmYwMWY2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwNjozNDozOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLjIzZmFhNjcyNjg1ODcgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbkBAIC0xNiw3ICsxNiw4IEBAIFNZTk9QU0lTXG4gXG4gKipicGZ0b29sKiogWypPUFRJT05TKl0gKiptYXAqKiAqQ09NTUFORCpcbiBcbi0qT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfVxuKypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfFxuK3sgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XG4gXG4gKkNPTU1BTkRTKiA6PVxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxuQEAgLTE3MCw2ICsxNzEsMjUgQEAgT1BUSU9OU1xuICAgICBEbyBub3QgYXV0b21hdGljYWxseSBhdHRlbXB0IHRvIG1vdW50IGFueSB2aXJ0dWFsIGZpbGUgc3lzdGVtIChzdWNoIGFzXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxuIFxuKy1yLCAtLXJlY3Vyc2l2ZVxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxuKyAgICBlbnRyaWVzIHdoZW4gcnVubmluZyAqKm1hcCBkdW1wKiouIEVhY2ggbWFwIElEIGlzIHZpc2l0ZWQgb25jZSwgZXZlbiBpZlxuKyAgICBzZXZlcmFsIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4rXG4rICAgIFBsYWluIG91dHB1dCBpbmNsdWRlcyBhIGhlYWRlciBpZGVudGlmeWluZyBlYWNoIG1hcC4gT24gc3VjY2VzcywgSlNPTiBvdXRwdXRcbisgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXG4rICAgIHJldGFpbiB0aGVpciAqKmlubmVyX21hcF9pZCoqIGZpZWxkLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIGlubmVyXG4rICAgIG1hcCBvYmplY3QuXG4rXG4rICAgIElubmVyIG1hcCBJRHMgYXJlIHJlc29sdmVkIHdoZW4gdGhlIG1hcHMgYXJlIHZpc2l0ZWQuIFRoZSBkdW1wIGlzIG5vdCBhblxuKyAgICBhdG9taWMgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cyBvciByZW1vdmUgYVxuKyAgICByZWZlcmVuY2VkIGlubmVyIG1hcCBiZWZvcmUgaXQgaXMgdmlzaXRlZC4gRmFpbHVyZSB0byBvcGVuIGEgcmVmZXJlbmNlZFxuKyAgICBpbm5lciBtYXAgc3RvcHMgdGhlIGR1bXAgYW5kIHJldHVybnMgYSBub256ZXJvIGV4aXQgc3RhdHVzLiBPdXRwdXQgbWF5XG4rICAgIGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cbitcbisgICAgSW4gSlNPTiBtb2RlLCB0aGUgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkIGJlZm9yZSByZXR1cm5pbmcuXG4rXG4gRVhBTVBMRVNcbiA9PT09PT09PVxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtMjYxLDcgKzI2MSw3IEBAIF9icGZ0b29sKClcbiBcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xuICAgICBpZiBbWyAke3dvcmRzW2N3b3JkXX0gPT0gLSogXV07IHRoZW5cbi0gICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXG4rICAgICAgICBsb2NhbCBjPSctLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tcmVjdXJzaXZlIC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxuICAgICAgICAgICAgIC0tdXNlLWxvYWRlciAtLWJhc2UtYnRmIC0tc2lnbiAtaSAtaydcbiAgICAgICAgIENPTVBSRVBMWT0oICQoIGNvbXBnZW4gLVcgXCIkY1wiIC0tIFwiJGN1clwiICkgKVxuICAgICAgICAgcmV0dXJuIDBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbmluZGV4IGM5MWUxYTZlMWExZWMuLjQyNGFmNGE0OTZhNWMgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuQEAgLTI2LDYgKzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTtcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBib29sIHByZXR0eV9vdXRwdXQ7XG4gYm9vbCBqc29uX291dHB1dDtcbitib29sIHJlY3Vyc2l2ZV9kdW1wO1xuIGJvb2wgc2hvd19waW5uZWQ7XG4gYm9vbCBibG9ja19tb3VudDtcbiBib29sIHZlcmlmaWVyX2xvZ3M7XG5AQCAtNDUyLDYgKzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcImpzb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdqJyB9LFxuIFx0XHR7IFwiaGVscFwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J2gnIH0sXG4gXHRcdHsgXCJwcmV0dHlcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdwJyB9LFxuK1x0XHR7IFwicmVjdXJzaXZlXCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQncicgfSxcbiBcdFx0eyBcInZlcnNpb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdWJyB9LFxuIFx0XHR7IFwiYnBmZnNcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdmJyB9LFxuIFx0XHR7IFwibWFwY29tcGF0XCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQnbScgfSxcbkBAIC00ODUsNyArNDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcImJwZnRvb2xcIjtcbiBcbiBcdG9wdGVyciA9IDA7XG4tXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFwiVmhwamZMbW5kU2k6azpCOmxcIixcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCJWaHBqcmZMbW5kU2k6azpCOmxcIixcbiBcdFx0XHRcdCAgb3B0aW9ucywgTlVMTCkpIFx1MDAzZT0gMCkge1xuIFx0XHRzd2l0Y2ggKG9wdCkge1xuIFx0XHRjYXNlICdWJzpcbkBAIC01MDcsNiArNTA5LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcdH1cbiBcdFx0XHRqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpO1xuIFx0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdyJzpcbitcdFx0XHRyZWN1cnNpdmVfZHVtcCA9IHRydWU7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2YnOlxuIFx0XHRcdHNob3dfcGlubmVkID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbmluZGV4IDc4YjZlMGViYjg1ZDguLjc2NjI2NjQyZTk0Y2IgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuQEAgLTgzLDYgKzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xuIFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcbitleHRlcm4gYm9vbCByZWN1cnNpdmVfZHVtcDtcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcbiBleHRlcm4gYm9vbCBzaG93X3BpZHM7XG4gZXh0ZXJuIGJvb2wgYmxvY2tfbW91bnQ7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuaW5kZXggNjg0YThmYjcyNDE0Ni4uYzQwMGIxNWYxNmRkMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuQEAgLTE3LDYgKzE3LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NicGYvYnBmLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NicGYvaGFzaG1hcC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCJqc29uX3dyaXRlci5oXCJcbiAjaW5jbHVkZSBcIm1haW4uaFwiXG5AQCAtODI2LDEyICs4MjcsNDQgQEAgc3RhdGljIHZvaWQgZnJlZV9tYXBfa3ZfYnRmKHN0cnVjdCBidGYgKmJ0ZilcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gfVxuIFxuK3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuK1x0c3RydWN0IGhhc2htYXAgKnNlZW47XG4rXHRfX3UzMiAqcGVuZGluZ19pZHM7XG4rXHRzaXplX3QgcGVuZGluZ19jbnQ7XG4rfTtcbitcbitzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXG4re1xuK1x0X191MzIgKmlkcztcbitcdGludCBlcnI7XG4rXG4rXHRpZiAoaGFzaG1hcF9fZmluZChjdHgtXHUwMDNlc2VlbiwgaWQsIE5VTEwpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGlkcyA9IGxpYmJwZl9yZWFsbG9jYXJyYXkoY3R4LVx1MDAzZXBlbmRpbmdfaWRzLCBjdHgtXHUwMDNlcGVuZGluZ19jbnQgKyAxLFxuK1x0XHRcdFx0ICBzaXplb2YoKmlkcykpO1xuK1x0aWYgKCFpZHMpIHtcbitcdFx0cF9lcnIoXCJtZW0gYWxsb2MgZmFpbGVkXCIpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRjdHgtXHUwMDNlcGVuZGluZ19pZHMgPSBpZHM7XG4rXG4rXHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVx1MDAzZXNlZW4sIGlkLCAwKTtcbitcdGlmIChlcnIpIHtcbitcdFx0cF9lcnIoXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcIiwgaWQsIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0aWRzW2N0eC1cdTAwM2VwZW5kaW5nX2NudCsrXSA9IGlkO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuIHN0YXRpYyBpbnRcbiBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbi1cdCBib29sIHNob3dfaGVhZGVyKVxuK1x0IGJvb2wgc2hvd19oZWFkZXIsIHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eClcbiB7XG4gXHR2b2lkICprZXksICp2YWx1ZSwgKnByZXZfa2V5O1xuIFx0dW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7XG4rXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXG4gXHRwcmV2X2tleSA9IE5VTEw7XG4gXG4rXHRpZiAoY3R4IFx1MDAyNlx1MDAyNiAhd3RyIFx1MDAyNlx1MDAyNiAoaW5mby1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZCB8fFxuK1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4rXHRcdHBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpO1xuK1x0XHRpZiAocGxhaW5fYnRmX3d0cikge1xuK1x0XHRcdGlmIChzaG93X2hlYWRlcilcbitcdFx0XHRcdHNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTtcbitcdFx0XHRzaG93X2hlYWRlciA9IGZhbHNlO1xuK1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4rXHRcdH1cbitcdH1cbitcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCArOTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRpZiAoZXJyKSB7XG4gXHRcdFx0aWYgKGVycm5vID09IEVOT0VOVClcbiBcdFx0XHRcdGVyciA9IDA7XG4rXHRcdFx0ZWxzZSBpZiAoY3R4KVxuK1x0XHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcIixcbitcdFx0XHRcdCAgICAgIGluZm8tXHUwMDNlaWQsIHN0cmVycm9yKGVycm5vKSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXG4rXHRcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcbitcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMrKztcbitcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuK1x0XHRcdFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xuK1x0XHRcdFx0aWYgKGVycilcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0fVxuK1x0XHR9XG4gXHRcdHByZXZfa2V5ID0ga2V5O1xuIFx0fVxuIFxuQEAgLTg5NCwxOCArOTQ4LDI1IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0ZnJlZShrZXkpO1xuIFx0ZnJlZSh2YWx1ZSk7XG4gXHRmcmVlX21hcF9rdl9idGYoYnRmKTtcbitcdGlmIChwbGFpbl9idGZfd3RyKVxuK1x0XHRqc29ud19kZXN0cm95KFx1MDAyNnBsYWluX2J0Zl93dHIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG4gc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4rXHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXG4rXHRcdCAgICAub3Blbl9mbGFncyA9IEJQRl9GX1JET05MWSxcbitcdCk7XG4gXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbiBcdGludCBlcnIgPSAtMTtcbitcdHNpemVfdCBqO1xuIFxuIFx0aWYgKGFyZ2MgIT0gMilcbiBcdFx0dXNhZ2UoKTtcbkBAIC05MTksOSArOTgwLDM0IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAobmJfZmRzIFx1MDAzYyAxKVxuIFx0XHRnb3RvIGV4aXRfZnJlZTtcbiBcbitcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xuK1x0XHRjdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsXG4rXHRcdFx0XHRcdGVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpO1xuK1x0XHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xuK1x0XHRcdGN0eC5zZWVuID0gTlVMTDtcbitcdFx0XHRwX2VycihcImZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcIik7XG4rXHRcdFx0Z290byBleGl0X2Nsb3NlO1xuK1x0XHR9XG4rXHRcdC8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5iX2ZkczsgaSsrKSB7XG4rXHRcdFx0bGVuID0gc2l6ZW9mKGluZm8pO1xuK1x0XHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuK1x0XHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdFx0XHRlcnIgPSAtMTtcbitcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0XHR9XG4rXHRcdFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTtcbitcdFx0XHRpZiAoZXJyKSB7XG4rXHRcdFx0XHRwX2VycihcImZhaWxlZCB0byByZWNvcmQgbWFwIGlkICV1OiAlc1wiLCBpbmZvLmlkLFxuK1x0XHRcdFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xuK1x0XHRcdFx0Z290byBleGl0X2Nsb3NlO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0fVxuK1xuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHd0ciA9IGpzb25fd3RyO1xuLVx0fSBlbHNlIHtcbitcdH0gZWxzZSBpZiAoIXJlY3Vyc2l2ZV9kdW1wKSB7XG4gXHRcdGludCBkb19wbGFpbl9idGY7XG4gXG4gXHRcdGRvX3BsYWluX2J0ZiA9IG1hcHNfaGF2ZV9idGYoZmRzLCBuYl9mZHMpO1xuQEAgLTkzNiw3ICsxMDIyLDcgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0fVxuIFx0fVxuIFxuLVx0aWYgKHd0ciBcdTAwMjZcdTAwMjYgbmJfZmRzIFx1MDAzZSAxKVxuK1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmVfZHVtcCkpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkrKykge1xuIFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbkBAIC05NDQsMjIgKzEwMzAsNTAgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRlcnIgPSAtMTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxKTtcbitcdFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmVfZHVtcCxcbitcdFx0XHQgICAgICAgcmVjdXJzaXZlX2R1bXAgPyBcdTAwMjZjdHggOiBOVUxMKTtcbiBcdFx0aWYgKCF3dHIgXHUwMDI2XHUwMDI2IGkgIT0gbmJfZmRzIC0gMSlcbiBcdFx0XHRwcmludGYoXCJcXG5cIik7XG4gXG4gXHRcdGlmIChlcnIpXG4gXHRcdFx0YnJlYWs7XG4tXHRcdGNsb3NlKGZkc1tpXSk7XG4rXHRcdC8qIEtlZXAgc2VsZWN0ZWQgbWFwcyBhbGl2ZSB3aGlsZSB2aXNpdGluZyB0aGVpciBpbm5lciBtYXBzLiAqL1xuK1x0XHRpZiAoIXJlY3Vyc2l2ZV9kdW1wKVxuK1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4rXHR9XG4rXHRmb3IgKGogPSAwOyAhZXJyIFx1MDAyNlx1MDAyNiBqIFx1MDAzYyBjdHgucGVuZGluZ19jbnQ7IGorKykge1xuK1x0XHRpbnQgZmQ7XG4rXG4rXHRcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhjdHgucGVuZGluZ19pZHNbal0sIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoZmQgXHUwMDNjIDApIHtcbitcdFx0XHRwX2VycihcImNhbid0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlc1wiLFxuK1x0XHRcdCAgICAgIGN0eC5wZW5kaW5nX2lkc1tqXSwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0XHRlcnIgPSAtMTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4rXHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pKSB7XG4rXHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdFx0ZXJyID0gLTE7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0aWYgKCF3dHIpXG4rXHRcdFx0XHRwcmludGYoXCJcXG5cIik7XG4rXHRcdFx0ZXJyID0gbWFwX2R1bXAoZmQsIFx1MDAyNmluZm8sIHd0ciwgdHJ1ZSwgXHUwMDI2Y3R4KTtcbitcdFx0fVxuK1x0XHRjbG9zZShmZCk7XG4gXHR9XG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4rXHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSlcbiBcdFx0anNvbndfZW5kX2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXG4gXHRpZiAoYnRmX3d0cilcbiBcdFx0anNvbndfZGVzdHJveShcdTAwMjZidGZfd3RyKTtcbiBleGl0X2Nsb3NlOlxuK1x0aWYgKHJlY3Vyc2l2ZV9kdW1wKVxuK1x0XHRpID0gMDtcbiBcdGZvciAoOyBpIFx1MDAzYyBuYl9mZHM7IGkrKylcbiBcdFx0Y2xvc2UoZmRzW2ldKTtcbitcdGhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pO1xuK1x0ZnJlZShjdHgucGVuZGluZ19pZHMpO1xuIGV4aXRfZnJlZTpcbiBcdGZyZWUoZmRzKTtcbiBcdGZyZWVfYnRmX3ZtbGludXgoKTtcbkBAIC0xNDg0LDcgKzE1OTgsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcIiAgICAgICAgICAgICAgICAgdGFza19zdG9yYWdlIHwgYmxvb21fZmlsdGVyIHwgdXNlcl9yaW5nYnVmIHwgY2dycF9zdG9yYWdlIHwgYXJlbmEgfFxcblwiXG4gXHRcdFwiICAgICAgICAgICAgICAgICBpbnNuX2FycmF5IHwgcmhhc2ggfVxcblwiXG4gXHRcdFwiICAgICAgIFwiIEhFTFBfU1BFQ19PUFRJT05TIFwiIHxcXG5cIlxuLVx0XHRcIiAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxcblwiXG4rXHRcdFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxcblwiXG4gXHRcdFwiXCIsXG4gXHRcdGJpbl9uYW1lLCBhcmd2Wy0yXSk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uOWM4ODc0M2E4Zjg0MlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5AQCAtMCwwICsxLDQ2NSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9yZXNvdXJjZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZGlyZW50LmhcdTAwM2VcbitcbisjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTJcbitcbitzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KVxuK3tcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTtcbitcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCIlcyBtYXAgZHVtcCBpZCAldVwiLCBvcHRpb25zLCBpZCk7XG4rXHRtZW1zZXQob3V0cHV0LCAwLCBPVVRQVVRfU0laRSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFIC0gMSksXG4rXHRcdCAgICAgICBcImR1bXBfbWFwXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHQvKiBUaGUgaGVscGVyIGRvZXNuJ3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovXG4rXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwiXFxuXCIpXSA9ICdcXDAnO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxuK3tcbitcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuK1x0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSwgXCJtYXBfaW5mb1wiKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRyZXR1cm4gaW5mby5pZDtcbit9XG4rXG4rc3RhdGljIGludCBjb3VudF90b2tlbihjb25zdCBjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKnRva2VuKVxuK3tcbitcdGludCBjb3VudCA9IDA7XG4rXG4rXHR3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHtcbitcdFx0Y291bnQrKztcbitcdFx0b3V0cHV0ICs9IHN0cmxlbih0b2tlbik7XG4rXHR9XG4rXHRyZXR1cm4gY291bnQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLFxuK1x0XHRcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxuK3tcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XG4rXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fTtcbitcdGNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjtcbitcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCItLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVwiLCByb290X2lkKTtcbitcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgIFwicGxhaW5fZHVtcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCIldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXCIsIHJvb3RfaWQsIHR5cGUpO1xuK1x0cm9vdCA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXCJwbGFpbl9yb290X2hlYWRlclwiKSlcbitcdFx0cmV0dXJuO1xuK1x0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFwicGxhaW5fcm9vdF9maXJzdFwiKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwiaW5uZXJfbWFwX2lkOlwiKSwgZW50cmllcywgXCJwbGFpbl9yZWZlcmVuY2VzXCIpO1xuK1x0aWYgKGVudHJpZXMpIHtcbitcdFx0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCIldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcIiwgaW5uZXJfaWQpO1xuK1x0XHRpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4rXHRcdGlmIChBU1NFUlRfT0tfUFRSKGlubmVyLCBcInBsYWluX2lubmVyX2hlYWRlclwiKSlcbitcdFx0XHRBU1NFUlRfR1QoaW5uZXIgLSByb290LCAwLCBcInBsYWluX2lubmVyX2FmdGVyX3Jvb3RcIik7XG4rXHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIGhlYWRlciksIDEsIFwicGxhaW5faW5uZXJfb25jZVwiKTtcbitcdH1cbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwiRm91bmQgXCIpLCBlbnRyaWVzIFx1MDAyNlx1MDAyNiAhdHlwZWQgPyAyIDogMSxcbitcdFx0ICBcInBsYWluX21hcF9jb3VudFwiKTtcbitcdGlmICh0eXBlZCkge1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwiXFxcImtleVxcXCI6IDBcIiwgXCJwbGFpbl9idGZfa2V5XCIpO1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwiXFxcInZhbHVlXFxcIjogMTY4NDMwMDlcIiwgXCJwbGFpbl9idGZfdmFsdWVcIik7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3Rfb3V0ZXIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgaW50IGVudHJpZXMsIGJvb2wgZW1wdHlfaW5uZXIsXG4rXHRcdCAgICAgICBib29sIHR5cGVkKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7XG4rXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuK1x0Y2hhciBvdXRlcltPVVRQVVRfU0laRV0sIGlubmVyW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXTtcbitcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTtcbitcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xuK1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTE7XG4rXHRfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7XG4rXG4rXHRpZiAodHlwZWQpIHtcbitcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJjcmVhdGVfYnRmXCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFwidW5zaWduZWQgaW50XCIsIDQsIDApLCAxLCBcImJ0Zl9pbnRcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwibG9hZF9idGZcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xuK1x0XHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XG4rXHRcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xuK1x0fVxuK1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCJkdW1wX2lubmVyXCIsIHNpemVvZihrZXkpLFxuK1x0XHRcdFx0ICBzaXplb2YodmFsdWUpLCAyLCBcdTAwMjZpbm5lcl9vcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRrZXkgPSAwO1xuK1x0aWYgKCFlbXB0eV9pbm5lciBcdTAwMjZcdTAwMjZcbitcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuK1x0XHQgICAgICAgXCJwb3B1bGF0ZV9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xuK1x0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBcImR1bXBfb3V0ZXJcIiwgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXG4rXHRcdFx0XHQgIDMsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsIFwiY3JlYXRlX291dGVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdC8qIFRoZSB1bnVzZWQgdGhpcmQgYXJyYXkgc2xvdCBhbHNvIGV4ZXJjaXNlcyBmYWlsZWQgbG9va3Vwcy4gKi9cbitcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBlbnRyaWVzOyBrZXkrKylcbitcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicG9wdWxhdGVfb3V0ZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbitcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcbitcdGlmICghcm9vdF9pZCB8fCAhaW5uZXJfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFwiLWpcIiwgb3V0ZXIpIHx8XG4rXHQgICAgIWR1bXBfbWFwKGlubmVyX2lkLCBcIi1qXCIsIGlubmVyKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRBU1NFUlRfRVEob3V0ZXJbMF0sICdbJywgXCJkZWZhdWx0X2FycmF5XCIpO1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcIlxcXCJlbGVtZW50c1xcXCI6XCIpLCAwLCBcImRlZmF1bHRfbm9fd3JhcHBlclwiKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXCJcXFwiaWRcXFwiOlwiKSwgMCwgXCJkZWZhdWx0X25vX2hlYWRlclwiKTtcbitcdHNucHJpbnRmKHJlZmVyZW5jZSwgc2l6ZW9mKHJlZmVyZW5jZSksIFwiXFxcImlubmVyX21hcF9pZFxcXCI6JXVcIiwgaW5uZXJfaWQpO1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCByZWZlcmVuY2UpLCBlbnRyaWVzLCBcImRlZmF1bHRfcmVmZXJlbmNlc1wiKTtcbitcdGlmICghZW50cmllcylcbitcdFx0QVNTRVJUX1NUUkVRKG91dGVyLCBcIltdXCIsIFwiZW1wdHlfb3V0ZXJfZGVmYXVsdFwiKTtcbitcdGlmIChlbXB0eV9pbm5lcilcbitcdFx0QVNTRVJUX1NUUkVRKGlubmVyLCBcIltdXCIsIFwiZW1wdHlfaW5uZXJfZGVmYXVsdFwiKTtcbitcdGVsc2UgaWYgKHR5cGVkKVxuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgXCJcXFwiZm9ybWF0dGVkXFxcIjp7XFxcImtleVxcXCI6MCxcXFwidmFsdWVcXFwiOjE2ODQzMDA5fVwiLFxuK1x0XHRcdFx0ICBcInR5cGVkX2lubmVyXCIpO1xuK1x0ZWxzZVxuK1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsXG4rXHRcdFx0ICAgICBcIlt7XFxcImtleVxcXCI6W1xcXCIweDAwXFxcIixcXFwiMHgwMFxcXCIsXFxcIjB4MDBcXFwiLFxcXCIweDAwXFxcIl0sXCJcbitcdFx0XHQgICAgIFwiXFxcInZhbHVlXFxcIjpbXFxcIjB4MDFcXFwiLFxcXCIweDAxXFxcIixcXFwiMHgwMVxcXCIsXFxcIjB4MDFcXFwiXX1dXCIsXG4rXHRcdFx0ICAgICBcIm9yZGluYXJ5X2RlZmF1bHRcIik7XG4rXG4rXHQvKlxuK1x0ICogQ29tcGFyZSB0aGUgY29tcGxldGUgSlNPTiBkb2N1bWVudDogYSBmbGF0IGFycmF5IHdpdGggdGhlIHJvb3QgZmlyc3QsXG4rXHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXG4rXHQgKi9cbitcdGlmIChlbnRyaWVzKVxuK1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX291dGVyXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfSx7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcImhhc2hcXFwiLFwiXG4rXHRcdFx0IFwiXFxcIm5hbWVcXFwiOlxcXCJkdW1wX2lubmVyXFxcIixcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc31dXCIsXG4rXHRcdFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XG4rXHRlbHNlXG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcIiVzXFxcIixcXFwibmFtZVxcXCI6XFxcImR1bXBfb3V0ZXJcXFwiLFwiXG4rXHRcdFx0IFwiXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6W119XVwiLCByb290X2lkLCB0eXBlX25hbWUpO1xuK1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwiLWogLXJcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicmVjdXJzaXZlX2pzb25cIik7XG4rXHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCItLWpzb24gLS1yZWN1cnNpdmVcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicmVjdXJzaXZlX2xvbmdfb3B0aW9uc1wiKTtcbitcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcbitcbitcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cbitcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCJoYXNoXFxcIixcXFwibmFtZVxcXCI6XFxcImR1bXBfaW5uZXJcXFwiLFwiXG4rXHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIiwgaW5uZXJfaWQsIGlubmVyKTtcbitcdGlmIChkdW1wX21hcChpbm5lcl9pZCwgXCItaiAtclwiLCBvdXRwdXQpKVxuK1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCJvcmRpbmFyeV9yZWN1cnNpdmVcIik7XG4rb3V0OlxuK1x0aWYgKG91dGVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuK1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfbXVsdGlwbGVfcm9vdHModm9pZClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcbitcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9LCBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDRdLCBlbGVtZW50c1tPVVRQVVRfU0laRV07XG4rXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7IFwiaGFzaFwiLCBcImFycmF5X29mX21hcHNcIiwgXCJoYXNoX29mX21hcHNcIiwgXCJoYXNoXCIgfTtcbitcdGludCBmZHNbXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTtcbitcdF9fdTMyIGlkc1s0XSwga2V5O1xuK1x0aW50IGksIGxlbiA9IDA7XG4rXG4rXHQvKlxuK1x0ICogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXJcbitcdCAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmRcbitcdCAqIHdoaWxlIGR1bXBpbmcgdGhlIGZpcnN0IG91dGVyLiBBIHByb2Nlc3Mtc3BlY2lmaWMgbmFtZSBhdm9pZHMgb3RoZXJcbitcdCAqIHRlc3RzJyBtYXBzIGpvaW5pbmcgdGhlIHNlbGVjdGlvbi5cbitcdCAqL1xuK1x0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcImR1bXBfJXVcIiwgZ2V0cGlkKCkpO1xuK1x0ZmRzWzBdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIG5hbWUsIDQsIDQsIDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzBdLCBcImNyZWF0ZV9zZWxlY3RlZF9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCJkdW1wX2Rpc2NvdmVyZWRcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sIFwiY3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07XG4rXHRmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFwiY3JlYXRlX2FycmF5X3Jvb3RcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sIFwiY3JlYXRlX2hhc2hfcm9vdFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGkgPSAxOyBpIFx1MDAzYz0gMjsgaSsrKSB7XG4rXHRcdGtleSA9IDA7XG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcdTAwMjZrZXksIFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRrZXkgPSAxO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbM10sIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcInJlZmVyZW5jZV9kaXNjb3ZlcmVkX2lubmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpKyspIHtcbitcdFx0aWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7XG4rXHRcdGlmICghaWRzW2ldIHx8ICFkdW1wX21hcChpZHNbaV0sIFwiLWpcIiwgZWxlbWVudHMpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRsZW4gKz0gc25wcmludGYoZXhwZWN0ZWQgKyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sXG4rXHRcdFx0XHRcIiVze1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIlc1xcXCIsXCJcbitcdFx0XHRcdFwiXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9JXNcIixcbitcdFx0XHRcdGkgPyBcIixcIiA6IFwiW1wiLCBpZHNbaV0sIHR5cGVzW2ldLFxuK1x0XHRcdFx0aSA9PSAzID8gXCJkdW1wX2Rpc2NvdmVyZWRcIiA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcIl1cIiA6IFwiXCIpO1xuK1x0fVxuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIi1qIC1yIG1hcCBkdW1wIG5hbWUgJXNcIiwgbmFtZSk7XG4rXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgXCJkdW1wX211bHRpcGxlX3Jvb3RzXCIpKSB7XG4rXHRcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCJcXG5cIildID0gJ1xcMCc7XG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJvb3RzX2ZpcnN0X2FuZF9zZWVkX2RlZHVwXCIpO1xuK1x0fVxuK291dDpcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKVxuK1x0XHRpZiAoZmRzW2ldIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZHNbaV0pO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdGNoYXIgZWxlbWVudHNbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdLCByb290W09VVFBVVF9TSVpFXTtcbitcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcGxhaW5bT1VUUFVUX1NJWkVdID0ge307XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XG4rXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgbG9va3VwX2Vycm5vO1xuK1x0X191MzIgaW5uZXJfaWQsIHJvb3RfaWQsIGtleSA9IDAsIHZhbHVlO1xuK1xuK1x0LypcbitcdCAqIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJuc1xuK1x0ICogRU5PVFNVUFAgKHRoZSBrZXJuZWwtaW50ZXJuYWwgZXJybm8pLiBDaGVjayBib3RoIGVudHJpZXMgc28gYW5cbitcdCAqIGVhcmx5IGV4aXQgb24gdGhlIGZpcnN0IGxvb2t1cCBmYWlsdXJlIGNhbm5vdCBwYXNzLlxuK1x0ICovXG4rXHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZLCBcImR1bXBfdW5yZWFkYWJsZVwiLFxuK1x0XHRcdFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMiwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCJjcmVhdGVfdW5yZWFkYWJsZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9MVChicGZfbWFwX2xvb2t1cF9lbGVtKGlubmVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNnZhbHVlKSwgMCxcbitcdFx0ICAgICAgIFwidW5yZWFkYWJsZV9sb29rdXBcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0bG9va3VwX2Vycm5vID0gZXJybm87XG4rXHRpZiAoIUFTU0VSVF9ORVEobG9va3VwX2Vycm5vLCBFTk9FTlQsIFwidW5yZWFkYWJsZV9ub3RfbWlzc2luZ1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4rXHRpZiAoIWlubmVyX2lkIHx8ICFkdW1wX21hcChpbm5lcl9pZCwgXCItalwiLCBlbGVtZW50cykpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKGVsZW1lbnRzLCBcIlxcXCJlcnJvclxcXCI6XCIpLCAyLCBcImRlZmF1bHRfanNvbl9lcnJvcnNcIik7XG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwibWFwIGR1bXAgaWQgJXVcIiwgaW5uZXJfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgcGxhaW4sIHNpemVvZihwbGFpbikgLSAxKSxcbitcdFx0ICAgICAgIFwiZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihwbGFpbiwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsIFwiZGVmYXVsdF9wbGFpbl9lcnJvcnNcIik7XG4rXHRBU1NFUlRfSEFTX1NVQlNUUihwbGFpbiwgXCJGb3VuZCAwIGVsZW1lbnRzXCIsIFwiZGVmYXVsdF9wbGFpbl9jb3VudFwiKTtcbitcbitcdHJvb3RfaWQgPSBpbm5lcl9pZDtcbitcdGlmIChvdXRlcikge1xuK1x0XHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xuK1x0XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcImR1bXBfb3V0ZXJcIixcbitcdFx0XHRcdFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMSwgXHUwMDI2b3B0cyk7XG4rXHRcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJwb3B1bGF0ZV9vdXRlclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4rXHRcdGlmICghcm9vdF9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgXCItalwiLCByb290KSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4rXHRcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiYXJyYXlfb2ZfbWFwc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX291dGVyXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfSx7XFxcImlkXFxcIjoldSxcIlxuK1x0XHRcdCBcIlxcXCJ0eXBlXFxcIjpcXFwicGVyZl9ldmVudF9hcnJheVxcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFwiXG4rXHRcdFx0IFwiXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9XVwiLCByb290X2lkLCByb290LCBpbm5lcl9pZCwgZWxlbWVudHMpO1xuK1x0fSBlbHNlIHtcbitcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4rXHRcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwicGVyZl9ldmVudF9hcnJheVxcXCIsXCJcbitcdFx0XHQgXCJcXFwibmFtZVxcXCI6XFxcImR1bXBfdW5yZWFkYWJsZVxcXCIsXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9XVwiLFxuK1x0XHRcdCBpbm5lcl9pZCwgZWxlbWVudHMpO1xuK1x0fVxuK1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwiLWogLXJcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicmVjdXJzaXZlX3VucmVhZGFibGVfanNvblwiKTtcbitcdG1lbXNldChvdXRwdXQsIDAsIHNpemVvZihvdXRwdXQpKTtcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCItciBtYXAgZHVtcCBpZCAldVwiLCByb290X2lkKTtcbitcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuK1x0XHQgICAgICBcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX3BsYWluXCIpKSB7XG4rXHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgcGxhaW4sIFwicmVjdXJzaXZlX3BsYWluX3ByZXNlcnZlc19lcnJvcnNcIik7XG4rXHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLFxuK1x0XHRcdCAgXCJyZWN1cnNpdmVfcGxhaW5fZXJyb3JzXCIpO1xuK1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcIkZvdW5kIFwiKSwgb3V0ZXIgPyAyIDogMSxcbitcdFx0XHQgIFwicmVjdXJzaXZlX3BsYWluX21hcHNcIik7XG4rXHR9XG4rb3V0OlxuK1x0aWYgKG91dGVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuK1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X21hbnlfaW5uZXJfbWFwcyhib29sIGpzb24pXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRjb25zdCBzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0geyAucmxpbV9jdXIgPSAzMiwgLnJsaW1fbWF4ID0gMzIgfTtcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgdG9rZW5bNjRdO1xuK1x0X191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5O1xuK1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIHN0YXR1cztcbitcdGludCBpbmhlcml0ZWRfZmRzWzMyXSwgbnJfaW5oZXJpdGVkID0gMCwgaTtcbitcdGNoYXIgKm91dHB1dCA9IE5VTEw7XG4rXHRwaWRfdCBwaWQ7XG4rXG4rXHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCJjcmVhdGVfdGVtcGxhdGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbitcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFwiZHVtcF9vdXRlclwiLCA0LCA0LFxuK1x0XHRcdFx0ICBBUlJBWV9TSVpFKGlkcyksIFx1MDAyNm9wdHMpO1xuK1x0Y2xvc2UoaW5uZXJfZmQpO1xuK1x0aW5uZXJfZmQgPSAtMTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgQVJSQVlfU0laRShpZHMpOyBrZXkrKykge1xuK1x0XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV9pbm5lclwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJwb3B1bGF0ZV9vdXRlclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xuK1x0XHRpZiAoIWlkc1trZXldKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHQvKiBUaGUgb3V0ZXIgbWFwIGtlZXBzIGVhY2ggZGlzdGluY3QgaW5uZXIgbWFwIGFsaXZlLiAqL1xuK1x0XHRjbG9zZShpbm5lcl9mZCk7XG4rXHRcdGlubmVyX2ZkID0gLTE7XG4rXHR9XG4rXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbitcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XG4rXHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcImFsbG9jYXRlX291dHB1dFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBGaWxsIHRoZSBsb3cgRkQgc2xvdHMgdG8gZXhlcmNpc2UgaW5oZXJpdGVkIGRlc2NyaXB0b3IgY2xlYW51cC4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoaW5oZXJpdGVkX2Zkcyk7IGkrKykge1xuK1x0XHRpbnQgZmQgPSBvcGVuKFwiL2Rldi9udWxsXCIsIE9fUkRPTkxZKTtcbitcbitcdFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFwib3Blbl9pbmhlcml0ZWRfZmRcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGluaGVyaXRlZF9mZHNbbnJfaW5oZXJpdGVkKytdID0gZmQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxuK1x0ICogcnVubmVyJ3MgbGltaXQgdW5jaGFuZ2VkLiBSZXRhaW5pbmcgZXZlcnkgZGlzY292ZXJlZCBGRCB3b3VsZCBleGNlZWRcbitcdCAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy5cbitcdCAqL1xuK1x0cGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UocGlkLCAwLCBcImZvcmtcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFwaWQpIHtcbitcdFx0c3RydWN0IGRpcmVudCAqZW50cnk7XG4rXHRcdERJUiAqZGlyO1xuK1xuK1x0XHQvKiBSZXNlcnZlIGEgc2xvdCBmb3IgdGhlIGRpcmVjdG9yeSBldmVuIGlmIHRoZSBwYXJlbnQgaXMgZnVsbC4gKi9cbitcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7XG4rXHRcdGRpciA9IG9wZW5kaXIoXCIvcHJvYy9zZWxmL2ZkXCIpO1xuK1x0XHRpZiAoIWRpcilcbitcdFx0XHRfZXhpdCg2KTtcbitcdFx0LyogVGhlIHBhcmVudCBrZWVwcyB0aGUgb3V0ZXIgbWFwIGFuZCBpdHMgaW5uZXIgbWFwcyBhbGl2ZS4gKi9cbitcdFx0Zm9yICg7Oykge1xuK1x0XHRcdGNoYXIgKmVuZDtcbitcdFx0XHRsb25nIGZkO1xuK1xuK1x0XHRcdGVycm5vID0gMDtcbitcdFx0XHRlbnRyeSA9IHJlYWRkaXIoZGlyKTtcbitcdFx0XHRpZiAoIWVudHJ5KSB7XG4rXHRcdFx0XHRpZiAoZXJybm8pXG4rXHRcdFx0XHRcdF9leGl0KDYpO1xuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdFx0fVxuK1x0XHRcdGZkID0gc3RydG9sKGVudHJ5LVx1MDAzZWRfbmFtZSwgXHUwMDI2ZW5kLCAxMCk7XG4rXHRcdFx0aWYgKCplbmQgfHwgZmQgXHUwMDNjIDMgfHwgZmQgPT0gZGlyZmQoZGlyKSlcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdGNsb3NlKGZkKTtcbitcdFx0fVxuK1x0XHRpZiAoY2xvc2VkaXIoZGlyKSlcbitcdFx0XHRfZXhpdCg2KTtcbitcdFx0aWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCBcdTAwMjZsaW1pdCkpXG4rXHRcdFx0X2V4aXQoMSk7XG4rXHRcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCIlcyAtciBtYXAgZHVtcCBpZCAldVwiLFxuK1x0XHRcdCBqc29uID8gXCItalwiIDogXCJcIiwgcm9vdF9pZCk7XG4rXHRcdGlmIChnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIDY1NTM1KSlcbitcdFx0XHRfZXhpdCgyKTtcbitcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFwiXFxcImlkXFxcIjpcIiA6IFwiRm91bmQgXCIpICE9IEFSUkFZX1NJWkUoaWRzKSArIDEgfHxcbitcdFx0ICAgIGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFwiXFxcImlubmVyX21hcF9pZFxcXCI6XCIgOiBcImlubmVyX21hcF9pZDpcIikgIT1cbitcdFx0ICAgIEFSUkFZX1NJWkUoaWRzKSlcbitcdFx0XHRfZXhpdCgzKTtcbitcdFx0Zm9yIChrZXkgPSAwOyBrZXkgXHUwMDNjIEFSUkFZX1NJWkUoaWRzKTsga2V5KyspIHtcbitcdFx0XHRpZiAoanNvbilcbitcdFx0XHRcdHNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCBcIlxcXCJpZFxcXCI6JXUsXCIsIGlkc1trZXldKTtcbitcdFx0XHRlbHNlXG4rXHRcdFx0XHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXCJcXG4ldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcIixcbitcdFx0XHRcdFx0IGlkc1trZXldKTtcbitcdFx0XHRpZiAoY291bnRfdG9rZW4ob3V0cHV0LCB0b2tlbikgIT0gMSlcbitcdFx0XHRcdF9leGl0KDQpO1xuK1x0XHR9XG4rXHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiAob3V0cHV0WzBdICE9ICdbJyB8fFxuK1x0XHRcdCAgICAgc3RyY21wKG91dHB1dCArIHN0cmxlbihvdXRwdXQpIC0gMiwgXCJdXFxuXCIpKSlcbitcdFx0XHRfZXhpdCg1KTtcbitcdFx0X2V4aXQoMCk7XG4rXHR9XG4rXHRpZiAoQVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQsIFwid2FpdHBpZFwiKSBcdTAwMjZcdTAwMjZcbitcdCAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJjaGlsZF9leGl0ZWRcIikpXG4rXHRcdEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcImR1bXBfd2l0aF9sb3dfZmRfbGltaXRcIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkrKylcbitcdFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcInBhcmVudF9mZF9wcmVzZXJ2ZWRcIik7XG4rXHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXCJwYXJlbnRfb3V0ZXJfcHJlc2VydmVkXCIpO1xuK291dDpcbitcdHdoaWxlIChucl9pbmhlcml0ZWQpXG4rXHRcdGNsb3NlKGluaGVyaXRlZF9mZHNbLS1ucl9pbmhlcml0ZWRdKTtcbitcdGZyZWUob3V0cHV0KTtcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcbit7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfb3JkaW5hcnlcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZShmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfaW5uZXJcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZSh0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWFueV9pbm5lcl9tYXBzX2pzb25cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKHRydWUpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYW55X2lubmVyX21hcHNfcGxhaW5cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibXVsdGlwbGVfcm9vdHNcIikpXG4rXHRcdHRlc3RfbXVsdGlwbGVfcm9vdHMoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNoYXJlZF9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMiwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImJ0Zl9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImVtcHR5X2lubmVyXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIHRydWUsIGZhbHNlKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjozNDo0MS45NDQ2MjM4MjFaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0ODk2MTE4MzMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlBhdGNoIEFuYWx5c2lzOiBXb3J0aEZ1enppbmcgRGV0ZXJtaW5hdGlvbioqXG5cbk9rYXksIGxldCdzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCBzY2FuIG9mIHRoZSBkaWZmIHJldmVhbHMgY2hhbmdlcyBzY2F0dGVyZWQgYWNyb3NzIHNldmVyYWwgZmlsZXMsIHNwZWNpZmljYWxseSB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC4gSSBzZWUgdXBkYXRlcyB0byBkb2N1bWVudGF0aW9uLCBiYXNoIGNvbXBsZXRpb24sIHRoZSBtYWluIHByb2dyYW0sIG1hcCBmdW5jdGlvbmFsaXR5LCBhbmQgYSBzZWxmdGVzdC5cblxuTm93LCBsZXQncyBxdWlja2x5IGNyb3NzLXJlZmVyZW5jZSB0aGF0IHdpdGggdGhlIGRlZmluZWQgY3JpdGVyaWEgZm9yIGBXb3J0aEZ1enppbmdgLiBUaGUgbmVnYXRpdmUgY3JpdGVyaWEgKHdoZW4gdG8gKm5vdCogZnV6eikgaXMgd2hhdCBJIG5lZWQgdG8gZm9jdXMgb24uIFNwZWNpZmljYWxseSwgaXQgc3RhdGVzIHRoYXQgbW9kaWZpY2F0aW9ucyBjb25maW5lZCB0byBcIk5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXNcIiBvciBcIlVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMuLi4gdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzXCIgd2FycmFudCBhIGBXb3J0aEZ1enppbmc9ZmFsc2VgIHZlcmRpY3QuXG5cbkZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgc2NvcGUuIE15IGFuYWx5c2lzIGNvbmZpcm1zIHRoZSBhYnNlbmNlIG9mIGNoYW5nZXMgb3V0c2lkZSB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5LiBObyB0b3VjaGluZyBvZiBjcml0aWNhbCBrZXJuZWwgY29tcG9uZW50cyBsaWtlIGBrZXJuZWwvYCwgYG5ldC9gLCBgZHJpdmVycy9gLCBgaW5jbHVkZS9gLCBgYXJjaC9gLCBgZnMvYCwgb3IgYG1tL2AgaXMgcHJlc2VudC4gQWxsIG1vZGlmaWNhdGlvbnMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC5cblxuR2l2ZW4gdGhpcywgdGhlIHBhdGNoIGV4Y2x1c2l2ZWx5IGFsdGVycyB1c2VyLXNwYWNlIHRvb2xzIGFuZCBhc3NvY2lhdGVkIHNlbGZ0ZXN0cy4gQWNjb3JkaW5nIHRvIHRoZSBjcml0ZXJpYSwgdGhpcyBkZWZpbml0aXZlbHkgZmFsbHMgdW5kZXIgdGhlIFwiV29ydGhGdXp6aW5nPWZhbHNlXCIgY2F0ZWdvcnkuIFRoZXJlZm9yZSwgSSdtIGdvaW5nIHRvIHNldCBgV29ydGhGdXp6aW5nYCB0byBgZmFsc2VgLlxuXG5UaGUgcmVhc29uaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZDogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xzIChgdG9vbHMvYnBmL2JwZnRvb2wvYCkgYW5kIHNlbGZ0ZXN0cyAoYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ApLCBhbmQgZG9lcyBub3QgYWx0ZXIgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIgTm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZsYWdzIGFyZSBuZWVkZWQsIHNvIGBFbmFibGVDb25maWdzYCBhbmQgYEZvY3VzU3ltYm9sc2Agd2lsbCBiZSBlbXB0eS4gSSdtIHJlYWR5IHRvIHByb2NlZWQgd2l0aCB0aGUgYHNldC1yZXN1bHRzYCBjYWxsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzk4NSwiT3V0cHV0VG9rZW5zIjo5MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU1MSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjM0OjQ2Ljg0MDc0NTA0NFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcxODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdXNlci1zcGFjZSB0b29scyAoYnBmdG9vbCkgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRlc3RzIHVuZGVyIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbC1zcGFjZSBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHVzZXItc3BhY2UgdG9vbHMgKGJwZnRvb2wpIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwtc3BhY2UgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjozNDo0Ni44NDA3NjU3OTNaIiwiU2VxIjo1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTczMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow2gwds[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-07 05:49:03 +0000 UTC FinishedAt: 2026-09-07 06:34:47 +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+CgkJCTx0ZD4yMDI2LzA5LzA3IDA2OjM0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdXNlci1zcGFjZSB0b29scyAoYnBmdG9vbCkgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRlc3RzIHVuZGVyIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbC1zcGFjZSBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDY6MzQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA3OGY3NmJhNzQ3MzFjMzI5NmNmZDdkN2Y3NjllYTJjODczNmYwMWY2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwNjozNDozOCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdCBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5pbmRleCA1ZGFmM2RlNWM3NDQ2Li4yM2ZhYTY3MjY4NTg3IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0XG5AQCAtMTYsNyAmIzQzOzE2LDggQEAgU1lOT1BTSVNcbiBcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxuIFxuLSpPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB9XG4mIzQzOypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfFxuJiM0Mzt7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB8IHsgKiotcioqIHwgKiotLXJlY3Vyc2l2ZSoqIH0gfVxuIFxuICpDT01NQU5EUyogOj1cbiB7ICoqc2hvdyoqIHwgKipsaXN0KiogfCAqKmNyZWF0ZSoqIHwgKipkdW1wKiogfCAqKnVwZGF0ZSoqIHwgKipsb29rdXAqKiB8ICoqZ2V0bmV4dCoqIHxcbkBAIC0xNzAsNiAmIzQzOzE3MSwyNSBAQCBPUFRJT05TXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcbiAgICAgdHJhY2VmcyBvciBCUEYgdmlydHVhbCBmaWxlIHN5c3RlbSkgd2hlbiBuZWNlc3NhcnkuXG4gXG4mIzQzOy1yLCAtLXJlY3Vyc2l2ZVxuJiM0MzsgICAgQWxzbyBkdW1wIHRoZSBpbm5lciBtYXBzIHJlZmVyZW5jZWQgYnkgKiphcnJheV9vZl9tYXBzKiogYW5kICoqaGFzaF9vZl9tYXBzKipcbiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmXG4mIzQzOyAgICBzZXZlcmFsIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4mIzQzO1xuJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dFxuJiM0MzsgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuJiM0MzsgICAgKiplbGVtZW50cyoqIGFycmF5LCBpbmNsdWRpbmcgd2hlbiBvbmx5IG9uZSBtYXAgaXMgZHVtcGVkLiBPdXRlciBtYXAgZW50cmllc1xuJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXJcbiYjNDM7ICAgIG1hcCBvYmplY3QuXG4mIzQzO1xuJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuXG4mIzQzOyAgICBhdG9taWMgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cyBvciByZW1vdmUgYVxuJiM0MzsgICAgcmVmZXJlbmNlZCBpbm5lciBtYXAgYmVmb3JlIGl0IGlzIHZpc2l0ZWQuIEZhaWx1cmUgdG8gb3BlbiBhIHJlZmVyZW5jZWRcbiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXlcbiYjNDM7ICAgIGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cbiYjNDM7XG4mIzQzOyAgICBJbiBKU09OIG1vZGUsIHRoZSBlbmNsb3NpbmcgYXJyYXlzIGFuZCBvYmplY3RzIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZy5cbiYjNDM7XG4gRVhBTVBMRVNcbiA9PT09PT09PVxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpXG4gXG4gICAgICMgRGVhbCB3aXRoIG9wdGlvbnNcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXG4tICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcbiAgICAgICAgICAgICAtLXVzZS1sb2FkZXIgLS1iYXNlLWJ0ZiAtLXNpZ24gLWkgLWsmIzM5O1xuICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyBcJiMzNDskY1wmIzM0OyAtLSBcJiMzNDskY3VyXCYjMzQ7ICkgKVxuICAgICAgICAgcmV0dXJuIDBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbmluZGV4IGM5MWUxYTZlMWExZWMuLjQyNGFmNGE0OTZhNWMgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuQEAgLTI2LDYgJiM0MzsyNiw3IEBAIHN0YXRpYyBpbnQgKCpsYXN0X2RvX2hlbHApKGludCBhcmdjLCBjaGFyICoqYXJndik7XG4ganNvbl93cml0ZXJfdCAqanNvbl93dHI7XG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xuIGJvb2wganNvbl9vdXRwdXQ7XG4mIzQzO2Jvb2wgcmVjdXJzaXZlX2R1bXA7XG4gYm9vbCBzaG93X3Bpbm5lZDtcbiBib29sIGJsb2NrX21vdW50O1xuIGJvb2wgdmVyaWZpZXJfbG9ncztcbkBAIC00NTIsNiAmIzQzOzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcJiMzNDtqc29uXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtqJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtoZWxwXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtoJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDtwcmV0dHlcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3AmIzM5OyB9LFxuJiM0MztcdFx0eyBcJiMzNDtyZWN1cnNpdmVcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O3ImIzM5OyB9LFxuIFx0XHR7IFwmIzM0O3ZlcnNpb25cJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O1YmIzM5OyB9LFxuIFx0XHR7IFwmIzM0O2JwZmZzXCYjMzQ7LFx0bm9fYXJndW1lbnQsXHROVUxMLFx0JiMzOTtmJiMzOTsgfSxcbiBcdFx0eyBcJiMzNDttYXBjb21wYXRcJiMzNDssXHRub19hcmd1bWVudCxcdE5VTEwsXHQmIzM5O20mIzM5OyB9LFxuQEAgLTQ4NSw3ICYjNDM7NDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcJiMzNDticGZ0b29sXCYjMzQ7O1xuIFxuIFx0b3B0ZXJyID0gMDtcbi1cdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCYjMzQ7VmhwamZMbW5kU2k6azpCOmxcJiMzNDssXG4mIzQzO1x0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcJiMzNDtWaHBqcmZMbW5kU2k6azpCOmxcJiMzNDssXG4gXHRcdFx0XHQgIG9wdGlvbnMsIE5VTEwpKSBcdTAwM2U9IDApIHtcbiBcdFx0c3dpdGNoIChvcHQpIHtcbiBcdFx0Y2FzZSAmIzM5O1YmIzM5OzpcbkBAIC01MDcsNiAmIzQzOzUwOSw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHR9XG4gXHRcdFx0anNvbndfcHJldHR5KGpzb25fd3RyLCBwcmV0dHlfb3V0cHV0KTtcbiBcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTtyJiMzOTs6XG4mIzQzO1x0XHRcdHJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJiMzOTtmJiMzOTs6XG4gXHRcdFx0c2hvd19waW5uZWQgPSB0cnVlO1xuIFx0XHRcdGJyZWFrO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaCBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuaW5kZXggNzhiNmUwZWJiODVkOC4uNzY2MjY2NDJlOTRjYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG5AQCAtODMsNiAmIzQzOzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xuIFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcbiYjNDM7ZXh0ZXJuIGJvb2wgcmVjdXJzaXZlX2R1bXA7XG4gZXh0ZXJuIGJvb2wgc2hvd19waW5uZWQ7XG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xuIGV4dGVybiBib29sIGJsb2NrX21vdW50O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmM0MDBiMTVmMTZkZDIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcbkBAIC0xNyw2ICYjNDM7MTcsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2JwZi9icGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2JwZi9oYXNobWFwLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7anNvbl93cml0ZXIuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O21haW4uaFwmIzM0O1xuQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRidGZfX2ZyZWUoYnRmKTtcbiB9XG4gXG4mIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuJiM0MztcdHN0cnVjdCBoYXNobWFwICpzZWVuO1xuJiM0MztcdF9fdTMyICpwZW5kaW5nX2lkcztcbiYjNDM7XHRzaXplX3QgcGVuZGluZ19jbnQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXG4mIzQzO3tcbiYjNDM7XHRfX3UzMiAqaWRzO1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdGlmIChoYXNobWFwX19maW5kKGN0eC1cdTAwM2VzZWVuLCBpZCwgTlVMTCkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0aWRzID0gbGliYnBmX3JlYWxsb2NhcnJheShjdHgtXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cdTAwM2VwZW5kaW5nX2NudCAmIzQzOyAxLFxuJiM0MztcdFx0XHRcdCAgc2l6ZW9mKCppZHMpKTtcbiYjNDM7XHRpZiAoIWlkcykge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7bWVtIGFsbG9jIGZhaWxlZFwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGN0eC1cdTAwM2VwZW5kaW5nX2lkcyA9IGlkcztcbiYjNDM7XG4mIzQzO1x0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cdTAwM2VzZWVuLCBpZCwgMCk7XG4mIzQzO1x0aWYgKGVycikge1xuJiM0MztcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBpbm5lciBtYXAgaWQgJXU6ICVzXCYjMzQ7LCBpZCwgc3RyZXJyb3IoLWVycikpO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XHRpZHNbY3R4LVx1MDAzZXBlbmRpbmdfY250JiM0MzsmIzQzO10gPSBpZDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW50XG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4tXHQgYm9vbCBzaG93X2hlYWRlcilcbiYjNDM7XHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxuIHtcbiBcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XG4gXHR1bnNpZ25lZCBpbnQgbnVtX2VsZW1zID0gMDtcbiYjNDM7XHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICYjNDM7ODc4LDE3IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFxuIFx0cHJldl9rZXkgPSBOVUxMO1xuIFxuJiM0MztcdGlmIChjdHggXHUwMDI2XHUwMDI2ICF3dHIgXHUwMDI2XHUwMDI2IChpbmZvLVx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XG4mIzQzO1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4mIzQzO1x0XHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcbiYjNDM7XHRcdGlmIChwbGFpbl9idGZfd3RyKSB7XG4mIzQzO1x0XHRcdGlmIChzaG93X2hlYWRlcilcbiYjNDM7XHRcdFx0XHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XG4mIzQzO1x0XHRcdHNob3dfaGVhZGVyID0gZmFsc2U7XG4mIzQzO1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCAmIzQzOzkxOCwyMCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdGlmIChlcnJubyA9PSBFTk9FTlQpXG4gXHRcdFx0XHRlcnIgPSAwO1xuJiM0MztcdFx0XHRlbHNlIGlmIChjdHgpXG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IGdldCBuZXh0IGtleSBmb3IgbWFwIGlkICV1OiAlc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICBpbmZvLVx1MDAzZWlkLCBzdHJlcnJvcihlcnJubykpO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGlmICghZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpKVxuJiM0MztcdFx0ZXJyID0gZHVtcF9tYXBfZWxlbShmZCwga2V5LCB2YWx1ZSwgaW5mbywgYnRmLCB3dHIpO1xuJiM0MztcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuJiM0MztcdFx0XHRcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcbiYjNDM7XHRcdFx0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiBcdFx0cHJldl9rZXkgPSBrZXk7XG4gXHR9XG4gXG5AQCAtODk0LDE4ICYjNDM7OTQ4LDI1IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0ZnJlZShrZXkpO1xuIFx0ZnJlZSh2YWx1ZSk7XG4gXHRmcmVlX21hcF9rdl9idGYoYnRmKTtcbiYjNDM7XHRpZiAocGxhaW5fYnRmX3d0cilcbiYjNDM7XHRcdGpzb253X2Rlc3Ryb3koXHUwMDI2cGxhaW5fYnRmX3d0cik7XG4gXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIHtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXG4mIzQzO1x0XHQgICAgLm9wZW5fZmxhZ3MgPSBCUEZfRl9SRE9OTFksXG4mIzQzO1x0KTtcbiBcdGpzb25fd3JpdGVyX3QgKnd0ciA9IE5VTEwsICpidGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuJiM0MztcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbiBcdGludCBlcnIgPSAtMTtcbiYjNDM7XHRzaXplX3QgajtcbiBcbiBcdGlmIChhcmdjICE9IDIpXG4gXHRcdHVzYWdlKCk7XG5AQCAtOTE5LDkgJiM0Mzs5ODAsMzQgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGlmIChuYl9mZHMgXHUwMDNjIDEpXG4gXHRcdGdvdG8gZXhpdF9mcmVlO1xuIFxuJiM0MztcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xuJiM0MztcdFx0Y3R4LnNlZW4gPSBoYXNobWFwX19uZXcoaGFzaF9mbl9mb3Jfa2V5X2FzX2lkLFxuJiM0MztcdFx0XHRcdFx0ZXF1YWxfZm5fZm9yX2tleV9hc19pZCwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xuJiM0MztcdFx0XHRjdHguc2VlbiA9IE5VTEw7XG4mIzQzO1x0XHRcdHBfZXJyKFwmIzM0O2ZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcJiMzNDspO1xuJiM0MztcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbmJfZmRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0XHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuJiM0MztcdFx0XHRcdHBfZXJyKFwmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzXCYjMzQ7LCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0XHRcdGVyciA9IC0xO1xuJiM0MztcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LnNlZW4sIGluZm8uaWQsIDApO1xuJiM0MztcdFx0XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRcdFx0cF9lcnIoXCYjMzQ7ZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzXCYjMzQ7LCBpbmZvLmlkLFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cmVycm9yKC1lcnIpKTtcbiYjNDM7XHRcdFx0XHRnb3RvIGV4aXRfY2xvc2U7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHd0ciA9IGpzb25fd3RyO1xuLVx0fSBlbHNlIHtcbiYjNDM7XHR9IGVsc2UgaWYgKCFyZWN1cnNpdmVfZHVtcCkge1xuIFx0XHRpbnQgZG9fcGxhaW5fYnRmO1xuIFxuIFx0XHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcbkBAIC05MzYsNyAmIzQzOzEwMjIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4mIzQzO1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmVfZHVtcCkpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuQEAgLTk0NCwyMiAmIzQzOzEwMzAsNTAgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRlcnIgPSAtMTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxKTtcbiYjNDM7XHRcdGVyciA9IG1hcF9kdW1wKGZkc1tpXSwgXHUwMDI2aW5mbywgd3RyLCBuYl9mZHMgXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXAsXG4mIzQzO1x0XHRcdCAgICAgICByZWN1cnNpdmVfZHVtcCA/IFx1MDAyNmN0eCA6IE5VTEwpO1xuIFx0XHRpZiAoIXd0ciBcdTAwMjZcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxuIFx0XHRcdHByaW50ZihcJiMzNDtcXG5cJiMzNDspO1xuIFxuIFx0XHRpZiAoZXJyKVxuIFx0XHRcdGJyZWFrO1xuLVx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXG4mIzQzO1x0XHRpZiAoIXJlY3Vyc2l2ZV9kdW1wKVxuJiM0MztcdFx0XHRjbG9zZShmZHNbaV0pO1xuJiM0MztcdH1cbiYjNDM7XHRmb3IgKGogPSAwOyAhZXJyIFx1MDAyNlx1MDAyNiBqIFx1MDAzYyBjdHgucGVuZGluZ19jbnQ7IGomIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpbnQgZmQ7XG4mIzQzO1xuJiM0MztcdFx0ZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0cF9lcnIoXCYjMzQ7Y2FuJiMzOTt0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlc1wmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgY3R4LnBlbmRpbmdfaWRzW2pdLCBzdHJlcnJvcihlcnJubykpO1xuJiM0MztcdFx0XHRlcnIgPSAtMTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1x0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuJiM0MztcdFx0XHRwX2VycihcJiMzNDtjYW4mIzM5O3QgZ2V0IG1hcCBpbmZvOiAlc1wmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTtcbiYjNDM7XHRcdFx0ZXJyID0gLTE7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRpZiAoIXd0cilcbiYjNDM7XHRcdFx0XHRwcmludGYoXCYjMzQ7XFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0ZXJyID0gbWFwX2R1bXAoZmQsIFx1MDAyNmluZm8sIHd0ciwgdHJ1ZSwgXHUwMDI2Y3R4KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGNsb3NlKGZkKTtcbiBcdH1cbi1cdGlmICh3dHIgXHUwMDI2XHUwMDI2IG5iX2ZkcyBcdTAwM2UgMSlcbiYjNDM7XHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSlcbiBcdFx0anNvbndfZW5kX2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXG4gXHRpZiAoYnRmX3d0cilcbiBcdFx0anNvbndfZGVzdHJveShcdTAwMjZidGZfd3RyKTtcbiBleGl0X2Nsb3NlOlxuJiM0MztcdGlmIChyZWN1cnNpdmVfZHVtcClcbiYjNDM7XHRcdGkgPSAwO1xuIFx0Zm9yICg7IGkgXHUwMDNjIG5iX2ZkczsgaSYjNDM7JiM0MzspXG4gXHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO1x0aGFzaG1hcF9fZnJlZShjdHguc2Vlbik7XG4mIzQzO1x0ZnJlZShjdHgucGVuZGluZ19pZHMpO1xuIGV4aXRfZnJlZTpcbiBcdGZyZWUoZmRzKTtcbiBcdGZyZWVfYnRmX3ZtbGludXgoKTtcbkBAIC0xNDg0LDcgJiM0MzsxNTk4LDcgQEAgc3RhdGljIGludCBkb19oZWxwKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XCYjMzQ7ICAgICAgICAgICAgICAgICB0YXNrX3N0b3JhZ2UgfCBibG9vbV9maWx0ZXIgfCB1c2VyX3JpbmdidWYgfCBjZ3JwX3N0b3JhZ2UgfCBhcmVuYSB8XFxuXCYjMzQ7XG4gXHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgaW5zbl9hcnJheSB8IHJoYXNoIH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7ICAgICAgIFwmIzM0OyBIRUxQX1NQRUNfT1BUSU9OUyBcJiMzNDsgfFxcblwmIzM0O1xuLVx0XHRcJiMzNDsgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IH1cXG5cJiMzNDtcbiYjNDM7XHRcdFwmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfCB7LXJ8LS1yZWN1cnNpdmV9IH1cXG5cJiMzNDtcbiBcdFx0XCYjMzQ7XCYjMzQ7LFxuIFx0XHRiaW5fbmFtZSwgYXJndlstMl0pO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjljODg3NDNhOGY4NDJcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xuQEAgLTAsMCAmIzQzOzEsNDY1IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvcmVzb3VyY2UuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NkaXJlbnQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBPVVRQVVRfU0laRSA4MTkyXG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuJiM0MztcbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0OyVzIG1hcCBkdW1wIGlkICV1XCYjMzQ7LCBvcHRpb25zLCBpZCk7XG4mIzQzO1x0bWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtkdW1wX21hcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0LyogVGhlIGhlbHBlciBkb2VzbiYjMzk7dCB0ZXJtaW5hdGUgb3Igc3RyaXAgdGhlIG91dHB1dC4gKi9cbiYjNDM7XHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwmIzM0O1xcblwmIzM0OyldID0gJiMzOTtcXDAmIzM5OztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIF9fdTMyIG1hcF9pZChpbnQgZmQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmQsIFx1MDAyNmluZm8sIFx1MDAyNmxlbiksIFwmIzM0O21hcF9pbmZvXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdHJldHVybiBpbmZvLmlkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGNvdW50X3Rva2VuKGNvbnN0IGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqdG9rZW4pXG4mIzQzO3tcbiYjNDM7XHRpbnQgY291bnQgPSAwO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHtcbiYjNDM7XHRcdGNvdW50JiM0MzsmIzQzOztcbiYjNDM7XHRcdG91dHB1dCAmIzQzOz0gc3RybGVuKHRva2VuKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIGNvdW50O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19wbGFpbihfX3UzMiByb290X2lkLCBfX3UzMiBpbm5lcl9pZCwgY29uc3QgY2hhciAqdHlwZSxcbiYjNDM7XHRcdFx0aW50IGVudHJpZXMsIGJvb2wgdHlwZWQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIGhlYWRlclsxMjhdO1xuJiM0MztcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xuJiM0MztcdGNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDstLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVwmIzM0Oywgcm9vdF9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3BsYWluX2R1bXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFwmIzM0OyV1OiAlcyAgbmFtZSBkdW1wX291dGVyICBcJiMzNDssIHJvb3RfaWQsIHR5cGUpO1xuJiM0MztcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihyb290LCBcJiMzNDtwbGFpbl9yb290X2hlYWRlclwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFwmIzM0O3BsYWluX3Jvb3RfZmlyc3RcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwmIzM0O2lubmVyX21hcF9pZDpcJiMzNDspLCBlbnRyaWVzLCBcJiMzNDtwbGFpbl9yZWZlcmVuY2VzXCYjMzQ7KTtcbiYjNDM7XHRpZiAoZW50cmllcykge1xuJiM0MztcdFx0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCYjMzQ7JXU6IGhhc2ggIG5hbWUgZHVtcF9pbm5lciAgXCYjMzQ7LCBpbm5lcl9pZCk7XG4mIzQzO1x0XHRpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4mIzQzO1x0XHRpZiAoQVNTRVJUX09LX1BUUihpbm5lciwgXCYjMzQ7cGxhaW5faW5uZXJfaGVhZGVyXCYjMzQ7KSlcbiYjNDM7XHRcdFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXCYjMzQ7cGxhaW5faW5uZXJfYWZ0ZXJfcm9vdFwmIzM0Oyk7XG4mIzQzO1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBoZWFkZXIpLCAxLCBcJiMzNDtwbGFpbl9pbm5lcl9vbmNlXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCYjMzQ7Rm91bmQgXCYjMzQ7KSwgZW50cmllcyBcdTAwMjZcdTAwMjYgIXR5cGVkID8gMiA6IDEsXG4mIzQzO1x0XHQgIFwmIzM0O3BsYWluX21hcF9jb3VudFwmIzM0Oyk7XG4mIzQzO1x0aWYgKHR5cGVkKSB7XG4mIzQzO1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwmIzM0O1xcXCYjMzQ7a2V5XFxcJiMzNDs6IDBcJiMzNDssIFwmIzM0O3BsYWluX2J0Zl9rZXlcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcJiMzNDtcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6IDE2ODQzMDA5XCYjMzQ7LCBcJiMzNDtwbGFpbl9idGZfdmFsdWVcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcbiYjNDM7XHRcdCAgICAgICBib29sIHR5cGVkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbiYjNDM7XHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xuJiM0MztcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTtcbiYjNDM7XHRjb25zdCBjaGFyICp0eXBlX25hbWUgPSBsaWJicGZfYnBmX21hcF90eXBlX3N0cih0eXBlKTtcbiYjNDM7XHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcbiYjNDM7XHRfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7XG4mIzQzO1xuJiM0MztcdGlmICh0eXBlZCkge1xuJiM0MztcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2NyZWF0ZV9idGZcJiMzNDspIHx8XG4mIzQzO1x0XHQgICAgIUFTU0VSVF9FUShidGZfX2FkZF9pbnQoYnRmLCBcJiMzNDt1bnNpZ25lZCBpbnRcJiMzNDssIDQsIDApLCAxLCBcJiMzNDtidGZfaW50XCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwmIzM0O2xvYWRfYnRmXCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRpbm5lcl9vcHRzLmJ0Zl9mZCA9IGJ0Zl9fZmQoYnRmKTtcbiYjNDM7XHRcdGlubmVyX29wdHMuYnRmX2tleV90eXBlX2lkID0gMTtcbiYjNDM7XHRcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xuJiM0MztcdH1cbiYjNDM7XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcJiMzNDtkdW1wX2lubmVyXCYjMzQ7LCBzaXplb2Yoa2V5KSxcbiYjNDM7XHRcdFx0XHQgIHNpemVvZih2YWx1ZSksIDIsIFx1MDAyNmlubmVyX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0a2V5ID0gMDtcbiYjNDM7XHRpZiAoIWVtcHR5X2lubmVyIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3BvcHVsYXRlX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4mIzQzO1x0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCBzaXplb2Yoa2V5KSwgc2l6ZW9mKF9fdTMyKSxcbiYjNDM7XHRcdFx0XHQgIDMsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcJiMzNDtjcmVhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0LyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqL1xuJiM0MztcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBlbnRyaWVzOyBrZXkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtwb3B1bGF0ZV9vdXRlclwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuJiM0MztcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcbiYjNDM7XHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcJiMzNDstalwmIzM0Oywgb3V0ZXIpIHx8XG4mIzQzO1x0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXCYjMzQ7LWpcJiMzNDssIGlubmVyKSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEob3V0ZXJbMF0sICYjMzk7WyYjMzk7LCBcJiMzNDtkZWZhdWx0X2FycmF5XCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFwmIzM0O1xcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0OzpcJiMzNDspLCAwLCBcJiMzNDtkZWZhdWx0X25vX3dyYXBwZXJcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXCYjMzQ7XFxcJiMzNDtpZFxcXCYjMzQ7OlwmIzM0OyksIDAsIFwmIzM0O2RlZmF1bHRfbm9faGVhZGVyXCYjMzQ7KTtcbiYjNDM7XHRzbnByaW50ZihyZWZlcmVuY2UsIHNpemVvZihyZWZlcmVuY2UpLCBcJiMzNDtcXFwmIzM0O2lubmVyX21hcF9pZFxcXCYjMzQ7OiV1XCYjMzQ7LCBpbm5lcl9pZCk7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCByZWZlcmVuY2UpLCBlbnRyaWVzLCBcJiMzNDtkZWZhdWx0X3JlZmVyZW5jZXNcJiMzNDspO1xuJiM0MztcdGlmICghZW50cmllcylcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRlciwgXCYjMzQ7W11cJiMzNDssIFwmIzM0O2VtcHR5X291dGVyX2RlZmF1bHRcJiMzNDspO1xuJiM0MztcdGlmIChlbXB0eV9pbm5lcilcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShpbm5lciwgXCYjMzQ7W11cJiMzNDssIFwmIzM0O2VtcHR5X2lubmVyX2RlZmF1bHRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHR5cGVkKVxuJiM0MztcdFx0QVNTRVJUX0hBU19TVUJTVFIoaW5uZXIsIFwmIzM0O1xcXCYjMzQ7Zm9ybWF0dGVkXFxcJiMzNDs6e1xcXCYjMzQ7a2V5XFxcJiMzNDs6MCxcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6MTY4NDMwMDl9XCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgXCYjMzQ7dHlwZWRfaW5uZXJcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShpbm5lcixcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtbe1xcXCYjMzQ7a2V5XFxcJiMzNDs6W1xcXCYjMzQ7MHgwMFxcXCYjMzQ7LFxcXCYjMzQ7MHgwMFxcXCYjMzQ7LFxcXCYjMzQ7MHgwMFxcXCYjMzQ7LFxcXCYjMzQ7MHgwMFxcXCYjMzQ7XSxcJiMzNDtcbiYjNDM7XHRcdFx0ICAgICBcJiMzNDtcXFwmIzM0O3ZhbHVlXFxcJiMzNDs6W1xcXCYjMzQ7MHgwMVxcXCYjMzQ7LFxcXCYjMzQ7MHgwMVxcXCYjMzQ7LFxcXCYjMzQ7MHgwMVxcXCYjMzQ7LFxcXCYjMzQ7MHgwMVxcXCYjMzQ7XX1dXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgIFwmIzM0O29yZGluYXJ5X2RlZmF1bHRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxuJiM0MztcdCAqIG9uZSBjb3B5IG9mIHRoZSBzaGFyZWQgaW5uZXIgbWFwLCBhbmQgdW5jaGFuZ2VkIGVudHJ5IHJlcHJlc2VudGF0aW9ucy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoZW50cmllcylcbiYjNDM7XHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0XHQgXCYjMzQ7W3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9vdXRlclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfSx7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7aGFzaFxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX2lubmVyXFxcJiMzNDssXFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfV1cJiMzNDssXG4mIzQzO1x0XHRcdCByb290X2lkLCB0eXBlX25hbWUsIG91dGVyLCBpbm5lcl9pZCwgaW5uZXIpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0XHQgXCYjMzQ7W3tcXFwmIzM0O2lkXFxcJiMzNDs6JXUsXFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9vdXRlclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OltdfV1cJiMzNDssIHJvb3RfaWQsIHR5cGVfbmFtZSk7XG4mIzQzO1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwmIzM0Oy1qIC1yXCYjMzQ7LCBvdXRwdXQpKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3JlY3Vyc2l2ZV9qc29uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCYjMzQ7LS1qc29uIC0tcmVjdXJzaXZlXCYjMzQ7LCBvdXRwdXQpKVxuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3JlY3Vyc2l2ZV9sb25nX29wdGlvbnNcJiMzNDspO1xuJiM0MztcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcbiYjNDM7XG4mIzQzO1x0LyogUmVjdXJzaW9uIG9uIGFuIG9yZGluYXJ5IG1hcCBzdGlsbCBlbWl0cyBhIHNpbmdsZSBtYXAgb2JqZWN0LiAqL1xuJiM0MztcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuJiM0MztcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7aGFzaFxcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9pbm5lclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc31dXCYjMzQ7LCBpbm5lcl9pZCwgaW5uZXIpO1xuJiM0MztcdGlmIChkdW1wX21hcChpbm5lcl9pZCwgXCYjMzQ7LWogLXJcJiMzNDssIG91dHB1dCkpXG4mIzQzO1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCYjMzQ7b3JkaW5hcnlfcmVjdXJzaXZlXCYjMzQ7KTtcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShvdXRlcl9mZCk7XG4mIzQzO1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tdWx0aXBsZV9yb290cyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dLCBuYW1lW0JQRl9PQkpfTkFNRV9MRU5dO1xuJiM0MztcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9LCBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDRdLCBlbGVtZW50c1tPVVRQVVRfU0laRV07XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcJiMzNDtoYXNoXCYjMzQ7LCBcJiMzNDthcnJheV9vZl9tYXBzXCYjMzQ7LCBcJiMzNDtoYXNoX29mX21hcHNcJiMzNDssIFwmIzM0O2hhc2hcJiMzNDsgfTtcbiYjNDM7XHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XG4mIzQzO1x0X191MzIgaWRzWzRdLCBrZXk7XG4mIzQzO1x0aW50IGksIGxlbiA9IDA7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXJcbiYjNDM7XHQgKiBtYXAgbXVzdCBiZSBhcHBlbmRlZCBhZnRlciBhbGwgdGhyZWUgcm9vdHMsIGV2ZW4gdGhvdWdoIGl0IGlzIGZvdW5kXG4mIzQzO1x0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxuJiM0MztcdCAqIHRlc3RzJiMzOTsgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXG4mIzQzO1x0ICovXG4mIzQzO1x0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcJiMzNDtkdW1wXyV1XCYjMzQ7LCBnZXRwaWQoKSk7XG4mIzQzO1x0ZmRzWzBdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIG5hbWUsIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXCYjMzQ7Y3JlYXRlX3NlbGVjdGVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZkc1szXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcJiMzNDtkdW1wX2Rpc2NvdmVyZWRcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1szXSwgXCYjMzQ7Y3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07XG4mIzQzO1x0ZmRzWzFdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsIFx1MDAyNm9wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGZkc1sxXSwgXCYjMzQ7Y3JlYXRlX2FycmF5X3Jvb3RcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzJdLCBcJiMzNDtjcmVhdGVfaGFzaF9yb290XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZvciAoaSA9IDE7IGkgXHUwMDNjPSAyOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0a2V5ID0gMDtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcdTAwMjZrZXksIFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtyZWZlcmVuY2Vfc2VsZWN0ZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGtleSA9IDE7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbM10sIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7XG4mIzQzO1x0XHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcJiMzNDstalwmIzM0OywgZWxlbWVudHMpKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGxlbiAmIzQzOz0gc25wcmludGYoZXhwZWN0ZWQgJiM0MzsgbGVuLCBzaXplb2YoZXhwZWN0ZWQpIC0gbGVuLFxuJiM0MztcdFx0XHRcdFwmIzM0OyVze1xcXCYjMzQ7aWRcXFwmIzM0OzoldSxcXFwmIzM0O3R5cGVcXFwmIzM0OzpcXFwmIzM0OyVzXFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDslc1xcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHRcdFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc30lc1wmIzM0OyxcbiYjNDM7XHRcdFx0XHRpID8gXCYjMzQ7LFwmIzM0OyA6IFwmIzM0O1tcJiMzNDssIGlkc1tpXSwgdHlwZXNbaV0sXG4mIzQzO1x0XHRcdFx0aSA9PSAzID8gXCYjMzQ7ZHVtcF9kaXNjb3ZlcmVkXCYjMzQ7IDogbmFtZSwgZWxlbWVudHMsIGkgPT0gMyA/IFwmIzM0O11cJiMzNDsgOiBcJiMzNDtcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwmIzM0Oy1qIC1yIG1hcCBkdW1wIG5hbWUgJXNcJiMzNDssIG5hbWUpO1xuJiM0MztcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuJiM0MztcdFx0ICAgICAgXCYjMzQ7ZHVtcF9tdWx0aXBsZV9yb290c1wmIzM0OykpIHtcbiYjNDM7XHRcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCYjMzQ7XFxuXCYjMzQ7KV0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwmIzM0O3Jvb3RzX2ZpcnN0X2FuZF9zZWVkX2RlZHVwXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO291dDpcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKGZkc1tpXSBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHRlc3RfdW5yZWFkYWJsZShib29sIG91dGVyKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4mIzQzO1x0Y2hhciBlbGVtZW50c1tPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV0sIHJvb3RbT1VUUFVUX1NJWkVdO1xuJiM0MztcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcGxhaW5bT1VUUFVUX1NJWkVdID0ge307XG4mIzQzO1x0Y2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dO1xuJiM0MztcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBsb29rdXBfZXJybm87XG4mIzQzO1x0X191MzIgaW5uZXJfaWQsIHJvb3RfaWQsIGtleSA9IDAsIHZhbHVlO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJuc1xuJiM0MztcdCAqIEVOT1RTVVBQICh0aGUga2VybmVsLWludGVybmFsIGVycm5vKS4gQ2hlY2sgYm90aCBlbnRyaWVzIHNvIGFuXG4mIzQzO1x0ICogZWFybHkgZXhpdCBvbiB0aGUgZmlyc3QgbG9va3VwIGZhaWx1cmUgY2Fubm90IHBhc3MuXG4mIzQzO1x0ICovXG4mIzQzO1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfUEVSRl9FVkVOVF9BUlJBWSwgXCYjMzQ7ZHVtcF91bnJlYWRhYmxlXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDIsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfdW5yZWFkYWJsZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9MVChicGZfbWFwX2xvb2t1cF9lbGVtKGlubmVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNnZhbHVlKSwgMCxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDt1bnJlYWRhYmxlX2xvb2t1cFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRsb29rdXBfZXJybm8gPSBlcnJubztcbiYjNDM7XHRpZiAoIUFTU0VSVF9ORVEobG9va3VwX2Vycm5vLCBFTk9FTlQsIFwmIzM0O3VucmVhZGFibGVfbm90X21pc3NpbmdcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xuJiM0MztcdGlmICghaW5uZXJfaWQgfHwgIWR1bXBfbWFwKGlubmVyX2lkLCBcJiMzNDstalwmIzM0OywgZWxlbWVudHMpKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKGVsZW1lbnRzLCBcJiMzNDtcXFwmIzM0O2Vycm9yXFxcJiMzNDs6XCYjMzQ7KSwgMiwgXCYjMzQ7ZGVmYXVsdF9qc29uX2Vycm9yc1wmIzM0Oyk7XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDttYXAgZHVtcCBpZCAldVwmIzM0OywgaW5uZXJfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7ZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdEFTU0VSVF9FUShjb3VudF90b2tlbihwbGFpbiwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsIFwmIzM0O2RlZmF1bHRfcGxhaW5fZXJyb3JzXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfSEFTX1NVQlNUUihwbGFpbiwgXCYjMzQ7Rm91bmQgMCBlbGVtZW50c1wmIzM0OywgXCYjMzQ7ZGVmYXVsdF9wbGFpbl9jb3VudFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHJvb3RfaWQgPSBpbm5lcl9pZDtcbiYjNDM7XHRpZiAob3V0ZXIpIHtcbiYjNDM7XHRcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XG4mIzQzO1x0XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMSwgXHUwMDI2b3B0cyk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCYjMzQ7Y3JlYXRlX291dGVyXCYjMzQ7KSB8fFxuJiM0MztcdFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4mIzQzO1x0XHRcdCAgICAgICBcJiMzNDtwb3B1bGF0ZV9vdXRlclwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4mIzQzO1x0XHRpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFwmIzM0Oy1qXCYjMzQ7LCByb290KSlcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbiYjNDM7XHRcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7YXJyYXlfb2ZfbWFwc1xcXCYjMzQ7LFxcXCYjMzQ7bmFtZVxcXCYjMzQ7OlxcXCYjMzQ7ZHVtcF9vdXRlclxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtmbGFnc1xcXCYjMzQ7OjAsXFxcJiMzNDtlbGVtZW50c1xcXCYjMzQ7OiVzfSx7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDt0eXBlXFxcJiMzNDs6XFxcJiMzNDtwZXJmX2V2ZW50X2FycmF5XFxcJiMzNDssXFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX3VucmVhZGFibGVcXFwmIzM0OyxcJiMzNDtcbiYjNDM7XHRcdFx0IFwmIzM0O1xcXCYjMzQ7ZmxhZ3NcXFwmIzM0OzowLFxcXCYjMzQ7ZWxlbWVudHNcXFwmIzM0Ozolc31dXCYjMzQ7LCByb290X2lkLCByb290LCBpbm5lcl9pZCwgZWxlbWVudHMpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbiYjNDM7XHRcdFx0IFwmIzM0O1t7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFxcXCYjMzQ7dHlwZVxcXCYjMzQ7OlxcXCYjMzQ7cGVyZl9ldmVudF9hcnJheVxcXCYjMzQ7LFwmIzM0O1xuJiM0MztcdFx0XHQgXCYjMzQ7XFxcJiMzNDtuYW1lXFxcJiMzNDs6XFxcJiMzNDtkdW1wX3VucmVhZGFibGVcXFwmIzM0OyxcXFwmIzM0O2ZsYWdzXFxcJiMzNDs6MCxcXFwmIzM0O2VsZW1lbnRzXFxcJiMzNDs6JXN9XVwmIzM0OyxcbiYjNDM7XHRcdFx0IGlubmVyX2lkLCBlbGVtZW50cyk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChkdW1wX21hcChyb290X2lkLCBcJiMzNDstaiAtclwmIzM0Oywgb3V0cHV0KSlcbiYjNDM7XHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcJiMzNDtyZWN1cnNpdmVfdW5yZWFkYWJsZV9qc29uXCYjMzQ7KTtcbiYjNDM7XHRtZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7XG4mIzQzO1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcJiMzNDstciBtYXAgZHVtcCBpZCAldVwmIzM0Oywgcm9vdF9pZCk7XG4mIzQzO1x0aWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXG4mIzQzO1x0XHQgICAgICBcJiMzNDtyZWN1cnNpdmVfdW5yZWFkYWJsZV9wbGFpblwmIzM0OykpIHtcbiYjNDM7XHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgcGxhaW4sIFwmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzXCYjMzQ7KTtcbiYjNDM7XHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLFxuJiM0MztcdFx0XHQgIFwmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9lcnJvcnNcJiMzNDspO1xuJiM0MztcdFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgXCYjMzQ7Rm91bmQgXCYjMzQ7KSwgb3V0ZXIgPyAyIDogMSxcbiYjNDM7XHRcdFx0ICBcJiMzNDtyZWN1cnNpdmVfcGxhaW5fbWFwc1wmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKG91dGVyX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKG91dGVyX2ZkKTtcbiYjNDM7XHRpZiAoaW5uZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0ZXN0X21hbnlfaW5uZXJfbWFwcyhib29sIGpzb24pXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0geyAucmxpbV9jdXIgPSAzMiwgLnJsaW1fbWF4ID0gMzIgfTtcbiYjNDM7XHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTtcbiYjNDM7XHRfX3UzMiBpZHNbNjRdLCByb290X2lkLCBrZXk7XG4mIzQzO1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIHN0YXR1cztcbiYjNDM7XHRpbnQgaW5oZXJpdGVkX2Zkc1szMl0sIG5yX2luaGVyaXRlZCA9IDAsIGk7XG4mIzQzO1x0Y2hhciAqb3V0cHV0ID0gTlVMTDtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1xuJiM0MztcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcJiMzNDtjcmVhdGVfdGVtcGxhdGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbiYjNDM7XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCA0LCA0LFxuJiM0MztcdFx0XHRcdCAgQVJSQVlfU0laRShpZHMpLCBcdTAwMjZvcHRzKTtcbiYjNDM7XHRjbG9zZShpbm5lcl9mZCk7XG4mIzQzO1x0aW5uZXJfZmQgPSAtMTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXCYjMzQ7Y3JlYXRlX291dGVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwmIzM0O2R1bXBfaW5uZXJcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFwmIzM0O2NyZWF0ZV9pbm5lclwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxuJiM0MztcdFx0XHQgICAgICAgXCYjMzQ7cG9wdWxhdGVfb3V0ZXJcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGlkc1trZXldID0gbWFwX2lkKGlubmVyX2ZkKTtcbiYjNDM7XHRcdGlmICghaWRzW2tleV0pXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0LyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi9cbiYjNDM7XHRcdGNsb3NlKGlubmVyX2ZkKTtcbiYjNDM7XHRcdGlubmVyX2ZkID0gLTE7XG4mIzQzO1x0fVxuJiM0MztcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xuJiM0MztcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XG4mIzQzO1x0aWYgKCFyb290X2lkIHx8ICFBU1NFUlRfT0tfUFRSKG91dHB1dCwgXCYjMzQ7YWxsb2NhdGVfb3V0cHV0XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHQvKiBGaWxsIHRoZSBsb3cgRkQgc2xvdHMgdG8gZXhlcmNpc2UgaW5oZXJpdGVkIGRlc2NyaXB0b3IgY2xlYW51cC4gKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBBUlJBWV9TSVpFKGluaGVyaXRlZF9mZHMpOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IGZkID0gb3BlbihcJiMzNDsvZGV2L251bGxcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PS19GRChmZCwgXCYjMzQ7b3Blbl9pbmhlcml0ZWRfZmRcJiMzNDspKVxuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdGluaGVyaXRlZF9mZHNbbnJfaW5oZXJpdGVkJiM0MzsmIzQzO10gPSBmZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxuJiM0MztcdCAqIHJ1bm5lciYjMzk7cyBsaW1pdCB1bmNoYW5nZWQuIFJldGFpbmluZyBldmVyeSBkaXNjb3ZlcmVkIEZEIHdvdWxkIGV4Y2VlZFxuJiM0MztcdCAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRwaWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocGlkLCAwLCBcJiMzNDtmb3JrXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghcGlkKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgZGlyZW50ICplbnRyeTtcbiYjNDM7XHRcdERJUiAqZGlyO1xuJiM0MztcbiYjNDM7XHRcdC8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqL1xuJiM0MztcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7XG4mIzQzO1x0XHRkaXIgPSBvcGVuZGlyKFwmIzM0Oy9wcm9jL3NlbGYvZmRcJiMzNDspO1xuJiM0MztcdFx0aWYgKCFkaXIpXG4mIzQzO1x0XHRcdF9leGl0KDYpO1xuJiM0MztcdFx0LyogVGhlIHBhcmVudCBrZWVwcyB0aGUgb3V0ZXIgbWFwIGFuZCBpdHMgaW5uZXIgbWFwcyBhbGl2ZS4gKi9cbiYjNDM7XHRcdGZvciAoOzspIHtcbiYjNDM7XHRcdFx0Y2hhciAqZW5kO1xuJiM0MztcdFx0XHRsb25nIGZkO1xuJiM0MztcbiYjNDM7XHRcdFx0ZXJybm8gPSAwO1xuJiM0MztcdFx0XHRlbnRyeSA9IHJlYWRkaXIoZGlyKTtcbiYjNDM7XHRcdFx0aWYgKCFlbnRyeSkge1xuJiM0MztcdFx0XHRcdGlmIChlcnJubylcbiYjNDM7XHRcdFx0XHRcdF9leGl0KDYpO1xuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGZkID0gc3RydG9sKGVudHJ5LVx1MDAzZWRfbmFtZSwgXHUwMDI2ZW5kLCAxMCk7XG4mIzQzO1x0XHRcdGlmICgqZW5kIHx8IGZkIFx1MDAzYyAzIHx8IGZkID09IGRpcmZkKGRpcikpXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdGNsb3NlKGZkKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmIChjbG9zZWRpcihkaXIpKVxuJiM0MztcdFx0XHRfZXhpdCg2KTtcbiYjNDM7XHRcdGlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgXHUwMDI2bGltaXQpKVxuJiM0MztcdFx0XHRfZXhpdCgxKTtcbiYjNDM7XHRcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCYjMzQ7JXMgLXIgbWFwIGR1bXAgaWQgJXVcJiMzNDssXG4mIzQzO1x0XHRcdCBqc29uID8gXCYjMzQ7LWpcJiMzNDsgOiBcJiMzNDtcJiMzNDssIHJvb3RfaWQpO1xuJiM0MztcdFx0aWYgKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgNjU1MzUpKVxuJiM0MztcdFx0XHRfZXhpdCgyKTtcbiYjNDM7XHRcdGlmIChjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcJiMzNDtcXFwmIzM0O2lkXFxcJiMzNDs6XCYjMzQ7IDogXCYjMzQ7Rm91bmQgXCYjMzQ7KSAhPSBBUlJBWV9TSVpFKGlkcykgJiM0MzsgMSB8fFxuJiM0MztcdFx0ICAgIGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFwmIzM0O1xcXCYjMzQ7aW5uZXJfbWFwX2lkXFxcJiMzNDs6XCYjMzQ7IDogXCYjMzQ7aW5uZXJfbWFwX2lkOlwmIzM0OykgIT1cbiYjNDM7XHRcdCAgICBBUlJBWV9TSVpFKGlkcykpXG4mIzQzO1x0XHRcdF9leGl0KDMpO1xuJiM0MztcdFx0Zm9yIChrZXkgPSAwOyBrZXkgXHUwMDNjIEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAoanNvbilcbiYjNDM7XHRcdFx0XHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXCYjMzQ7XFxcJiMzNDtpZFxcXCYjMzQ7OiV1LFwmIzM0OywgaWRzW2tleV0pO1xuJiM0MztcdFx0XHRlbHNlXG4mIzQzO1x0XHRcdFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFwmIzM0O1xcbiV1OiBoYXNoICBuYW1lIGR1bXBfaW5uZXIgIFwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCBpZHNba2V5XSk7XG4mIzQzO1x0XHRcdGlmIChjb3VudF90b2tlbihvdXRwdXQsIHRva2VuKSAhPSAxKVxuJiM0MztcdFx0XHRcdF9leGl0KDQpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGpzb24gXHUwMDI2XHUwMDI2IChvdXRwdXRbMF0gIT0gJiMzOTtbJiMzOTsgfHxcbiYjNDM7XHRcdFx0ICAgICBzdHJjbXAob3V0cHV0ICYjNDM7IHN0cmxlbihvdXRwdXQpIC0gMiwgXCYjMzQ7XVxcblwmIzM0OykpKVxuJiM0MztcdFx0XHRfZXhpdCg1KTtcbiYjNDM7XHRcdF9leGl0KDApO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoQVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQsIFwmIzM0O3dhaXRwaWRcJiMzNDspIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7Y2hpbGRfZXhpdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcJiMzNDtkdW1wX3dpdGhfbG93X2ZkX2xpbWl0XCYjMzQ7KTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcJiMzNDtwYXJlbnRfZmRfcHJlc2VydmVkXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXCYjMzQ7cGFyZW50X291dGVyX3ByZXNlcnZlZFwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHR3aGlsZSAobnJfaW5oZXJpdGVkKVxuJiM0MztcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1stLW5yX2luaGVyaXRlZF0pO1xuJiM0MztcdGZyZWUob3V0cHV0KTtcbiYjNDM7XHRpZiAob3V0ZXJfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuJiM0MztcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShpbm5lcl9mZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDt1bnJlYWRhYmxlX29yZGluYXJ5XCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfdW5yZWFkYWJsZShmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7dW5yZWFkYWJsZV9pbm5lclwmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X3VucmVhZGFibGUodHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWFueV9pbm5lcl9tYXBzX2pzb25cJiMzNDspKVxuJiM0MztcdFx0dGVzdF9tYW55X2lubmVyX21hcHModHJ1ZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWFueV9pbm5lcl9tYXBzX3BsYWluXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKGZhbHNlKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDttdWx0aXBsZV9yb290c1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X211bHRpcGxlX3Jvb3RzKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2hhcmVkX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2hhc2hfb2ZfbWFwc1wmIzM0OykpXG4mIzQzO1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7YnRmX2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2VtcHR5X2lubmVyXCYjMzQ7KSlcbiYjNDM7XHRcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgdHJ1ZSwgZmFsc2UpO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMDY6MzQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdXNlci1zcGFjZSB0b29scyAoYnBmdG9vbCkgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRlc3RzIHVuZGVyIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbC1zcGFjZSBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA3OGY3NmJhNzQ3MzFjMzI5NmNmZDdkN2Y3NjllYTJjODczNmYwMWY2CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBTZXAgNyAwNjozNDozOCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKaW5kZXggNWRhZjNkZTVjNzQ0Ni4uMjNmYWE2NzI2ODU4NyAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QKQEAgLTE2LDcgJiM0MzsxNiw4IEBAIFNZTk9QU0lTCiAKICoqYnBmdG9vbCoqIFsqT1BUSU9OUypdICoqbWFwKiogKkNPTU1BTkQqCiAKLSpPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfCB7ICoqLW4qKiB8ICoqLS1ub21vdW50KiogfSB9CiYjNDM7Kk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8CiYjNDM7eyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfCB7ICoqLXIqKiB8ICoqLS1yZWN1cnNpdmUqKiB9IH0KIAogKkNPTU1BTkRTKiA6PQogeyAqKnNob3cqKiB8ICoqbGlzdCoqIHwgKipjcmVhdGUqKiB8ICoqZHVtcCoqIHwgKip1cGRhdGUqKiB8ICoqbG9va3VwKiogfCAqKmdldG5leHQqKiB8CkBAIC0xNzAsNiAmIzQzOzE3MSwyNSBAQCBPUFRJT05TCiAgICAgRG8gbm90IGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0byBtb3VudCBhbnkgdmlydHVhbCBmaWxlIHN5c3RlbSAoc3VjaCBhcwogICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LgogCiYjNDM7LXIsIC0tcmVjdXJzaXZlCiYjNDM7ICAgIEFsc28gZHVtcCB0aGUgaW5uZXIgbWFwcyByZWZlcmVuY2VkIGJ5ICoqYXJyYXlfb2ZfbWFwcyoqIGFuZCAqKmhhc2hfb2ZfbWFwcyoqCiYjNDM7ICAgIGVudHJpZXMgd2hlbiBydW5uaW5nICoqbWFwIGR1bXAqKi4gRWFjaCBtYXAgSUQgaXMgdmlzaXRlZCBvbmNlLCBldmVuIGlmCiYjNDM7ICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy4KJiM0MzsKJiM0MzsgICAgUGxhaW4gb3V0cHV0IGluY2x1ZGVzIGEgaGVhZGVyIGlkZW50aWZ5aW5nIGVhY2ggbWFwLiBPbiBzdWNjZXNzLCBKU09OIG91dHB1dAomIzQzOyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuCiYjNDM7ICAgICoqZWxlbWVudHMqKiBhcnJheSwgaW5jbHVkaW5nIHdoZW4gb25seSBvbmUgbWFwIGlzIGR1bXBlZC4gT3V0ZXIgbWFwIGVudHJpZXMKJiM0MzsgICAgcmV0YWluIHRoZWlyICoqaW5uZXJfbWFwX2lkKiogZmllbGQsIHdoaWNoIGlkZW50aWZpZXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5uZXIKJiM0MzsgICAgbWFwIG9iamVjdC4KJiM0MzsKJiM0MzsgICAgSW5uZXIgbWFwIElEcyBhcmUgcmVzb2x2ZWQgd2hlbiB0aGUgbWFwcyBhcmUgdmlzaXRlZC4gVGhlIGR1bXAgaXMgbm90IGFuCiYjNDM7ICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhCiYjNDM7ICAgIHJlZmVyZW5jZWQgaW5uZXIgbWFwIGJlZm9yZSBpdCBpcyB2aXNpdGVkLiBGYWlsdXJlIHRvIG9wZW4gYSByZWZlcmVuY2VkCiYjNDM7ICAgIGlubmVyIG1hcCBzdG9wcyB0aGUgZHVtcCBhbmQgcmV0dXJucyBhIG5vbnplcm8gZXhpdCBzdGF0dXMuIE91dHB1dCBtYXkKJiM0MzsgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLgomIzQzOwomIzQzOyAgICBJbiBKU09OIG1vZGUsIHRoZSBlbmNsb3NpbmcgYXJyYXlzIGFuZCBvYmplY3RzIGFyZSBjbG9zZWQgYmVmb3JlIHJldHVybmluZy4KJiM0MzsKIEVYQU1QTEVTCiA9PT09PT09PQogKiojIGJwZnRvb2wgbWFwIHNob3cqKgpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2wgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAppbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbApAQCAtMjYxLDcgJiM0MzsyNjEsNyBAQCBfYnBmdG9vbCgpCiAKICAgICAjIERlYWwgd2l0aCBvcHRpb25zCiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuCi0gICAgICAgIGxvY2FsIGM9JiMzOTstLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcCiYjNDM7ICAgICAgICBsb2NhbCBjPSYjMzk7LS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLXJlY3Vyc2l2ZSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXAogICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJiMzOTsKICAgICAgICAgQ09NUFJFUExZPSggJCggY29tcGdlbiAtVyAmIzM0OyRjJiMzNDsgLS0gJiMzNDskY3VyJiMzNDsgKSApCiAgICAgICAgIHJldHVybiAwCmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmMKaW5kZXggYzkxZTFhNmUxYTFlYy4uNDI0YWY0YTQ5NmE1YyAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uYwpAQCAtMjYsNiAmIzQzOzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyOwogYm9vbCBwcmV0dHlfb3V0cHV0OwogYm9vbCBqc29uX291dHB1dDsKJiM0Mztib29sIHJlY3Vyc2l2ZV9kdW1wOwogYm9vbCBzaG93X3Bpbm5lZDsKIGJvb2wgYmxvY2tfbW91bnQ7CiBib29sIHZlcmlmaWVyX2xvZ3M7CkBAIC00NTIsNiAmIzQzOzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJeyAmIzM0O2pzb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7aiYjMzk7IH0sCiAJCXsgJiMzNDtoZWxwJiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O2gmIzM5OyB9LAogCQl7ICYjMzQ7cHJldHR5JiMzNDssCW5vX2FyZ3VtZW50LAlOVUxMLAkmIzM5O3AmIzM5OyB9LAomIzQzOwkJeyAmIzM0O3JlY3Vyc2l2ZSYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtyJiMzOTsgfSwKIAkJeyAmIzM0O3ZlcnNpb24mIzM0OywJbm9fYXJndW1lbnQsCU5VTEwsCSYjMzk7ViYjMzk7IH0sCiAJCXsgJiMzNDticGZmcyYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTtmJiMzOTsgfSwKIAkJeyAmIzM0O21hcGNvbXBhdCYjMzQ7LAlub19hcmd1bWVudCwJTlVMTCwJJiMzOTttJiMzOTsgfSwKQEAgLTQ4NSw3ICYjNDM7NDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCWJpbl9uYW1lID0gJiMzNDticGZ0b29sJiMzNDs7CiAKIAlvcHRlcnIgPSAwOwotCXdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgJiMzNDtWaHBqZkxtbmRTaTprOkI6bCYjMzQ7LAomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICYjMzQ7VmhwanJmTG1uZFNpOms6QjpsJiMzNDssCiAJCQkJICBvcHRpb25zLCBOVUxMKSkgJmd0Oz0gMCkgewogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlICYjMzk7ViYjMzk7OgpAQCAtNTA3LDYgJiM0Mzs1MDksOSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQl9CiAJCQlqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpOwogCQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7ciYjMzk7OgomIzQzOwkJCXJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTsKJiM0MzsJCQlicmVhazsKIAkJY2FzZSAmIzM5O2YmIzM5OzoKIAkJCXNob3dfcGlubmVkID0gdHJ1ZTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oCmluZGV4IDc4YjZlMGViYjg1ZDguLjc2NjI2NjQyZTk0Y2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmgKQEAgLTgzLDYgJiM0Mzs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTsKIAogZXh0ZXJuIGpzb25fd3JpdGVyX3QgKmpzb25fd3RyOwogZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7CiYjNDM7ZXh0ZXJuIGJvb2wgcmVjdXJzaXZlX2R1bXA7CiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDsKIGV4dGVybiBib29sIHNob3dfcGlkczsKIGV4dGVybiBib29sIGJsb2NrX21vdW50OwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwppbmRleCA2ODRhOGZiNzI0MTQ2Li5jNDAwYjE1ZjE2ZGQyIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9tYXAuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYXAuYwpAQCAtMTcsNiAmIzQzOzE3LDcgQEAKICNpbmNsdWRlICZsdDticGYvYnBmLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwogI2luY2x1ZGUgJmx0O2JwZi9oYXNobWFwLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9saWJicGZfaW50ZXJuYWwuaCZndDsKIAogI2luY2x1ZGUgJiMzNDtqc29uX3dyaXRlci5oJiMzNDsKICNpbmNsdWRlICYjMzQ7bWFpbi5oJiMzNDsKQEAgLTgyNiwxMiAmIzQzOzgyNyw0NCBAQCBzdGF0aWMgdm9pZCBmcmVlX21hcF9rdl9idGYoc3RydWN0IGJ0ZiAqYnRmKQogCQlidGZfX2ZyZWUoYnRmKTsKIH0KIAomIzQzO3N0cnVjdCBtYXBfZHVtcF9jdHggewomIzQzOwlzdHJ1Y3QgaGFzaG1hcCAqc2VlbjsKJiM0MzsJX191MzIgKnBlbmRpbmdfaWRzOwomIzQzOwlzaXplX3QgcGVuZGluZ19jbnQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpCiYjNDM7ewomIzQzOwlfX3UzMiAqaWRzOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAoaGFzaG1hcF9fZmluZChjdHgtJmd0O3NlZW4sIGlkLCBOVUxMKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC0mZ3Q7cGVuZGluZ19pZHMsIGN0eC0mZ3Q7cGVuZGluZ19jbnQgJiM0MzsgMSwKJiM0MzsJCQkJICBzaXplb2YoKmlkcykpOwomIzQzOwlpZiAoIWlkcykgewomIzQzOwkJcF9lcnIoJiMzNDttZW0gYWxsb2MgZmFpbGVkJiMzNDspOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CWN0eC0mZ3Q7cGVuZGluZ19pZHMgPSBpZHM7CiYjNDM7CiYjNDM7CWVyciA9IGhhc2htYXBfX2FkZChjdHgtJmd0O3NlZW4sIGlkLCAwKTsKJiM0MzsJaWYgKGVycikgewomIzQzOwkJcF9lcnIoJiMzNDtmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXMmIzM0OywgaWQsIHN0cmVycm9yKC1lcnIpKTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwlpZHNbY3R4LSZndDtwZW5kaW5nX2NudCYjNDM7JiM0MztdID0gaWQ7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQKIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAotCSBib29sIHNob3dfaGVhZGVyKQomIzQzOwkgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KQogewogCXZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7CiAJdW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7CiYjNDM7CWpzb25fd3JpdGVyX3QgKnBsYWluX2J0Zl93dHIgPSBOVUxMOwogCXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiAJaW50IGVycjsKIApAQCAtODQ1LDYgJiM0Mzs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsCiAKIAlwcmV2X2tleSA9IE5VTEw7CiAKJiM0MzsJaWYgKGN0eCAmYW1wOyZhbXA7ICF3dHIgJmFtcDsmYW1wOyAoaW5mby0mZ3Q7YnRmX3ZhbHVlX3R5cGVfaWQgfHwKJiM0MzsJCQkgICAgaW5mby0mZ3Q7YnRmX3ZtbGludXhfdmFsdWVfdHlwZV9pZCkpIHsKJiM0MzsJCXBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpOwomIzQzOwkJaWYgKHBsYWluX2J0Zl93dHIpIHsKJiM0MzsJCQlpZiAoc2hvd19oZWFkZXIpCiYjNDM7CQkJCXNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTsKJiM0MzsJCQlzaG93X2hlYWRlciA9IGZhbHNlOwomIzQzOwkJCXd0ciA9IHBsYWluX2J0Zl93dHI7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKIAlpZiAod3RyKSB7CiAJCWVyciA9IGdldF9tYXBfa3ZfYnRmKGluZm8sICZhbXA7YnRmKTsKIAkJaWYgKGVycikgewpAQCAtODc0LDEwICYjNDM7OTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLAogCQlpZiAoZXJyKSB7CiAJCQlpZiAoZXJybm8gPT0gRU5PRU5UKQogCQkJCWVyciA9IDA7CiYjNDM7CQkJZWxzZSBpZiAoY3R4KQomIzQzOwkJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXMmIzM0OywKJiM0MzsJCQkJICAgICAgaW5mby0mZ3Q7aWQsIHN0cmVycm9yKGVycm5vKSk7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoIWR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKSkKJiM0MzsJCWVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTsKJiM0MzsJCWlmICghZXJyKSB7CiAJCQludW1fZWxlbXMmIzQzOyYjNDM7OwomIzQzOwkJCWlmIChjdHggJmFtcDsmYW1wOyBtYXBfaXNfbWFwX29mX21hcHMoaW5mby0mZ3Q7dHlwZSkpIHsKJiM0MzsJCQkJZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpOwomIzQzOwkJCQlpZiAoZXJyKQomIzQzOwkJCQkJYnJlYWs7CiYjNDM7CQkJfQomIzQzOwkJfQogCQlwcmV2X2tleSA9IGtleTsKIAl9CiAKQEAgLTg5NCwxOCAmIzQzOzk0OCwyNSBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0ciwKIAlmcmVlKGtleSk7CiAJZnJlZSh2YWx1ZSk7CiAJZnJlZV9tYXBfa3ZfYnRmKGJ0Zik7CiYjNDM7CWlmIChwbGFpbl9idGZfd3RyKQomIzQzOwkJanNvbndfZGVzdHJveSgmYW1wO3BsYWluX2J0Zl93dHIpOwogCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKJiM0MzsJTElCQlBGX09QVFMoYnBmX2dldF9mZF9ieV9pZF9vcHRzLCBvcHRzLAomIzQzOwkJICAgIC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLAomIzQzOwkpOwogCWpzb25fd3JpdGVyX3QgKnd0ciA9IE5VTEwsICpidGZfd3RyID0gTlVMTDsKIAlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKJiM0MzsJc3RydWN0IG1hcF9kdW1wX2N0eCBjdHggPSB7fTsKIAlpbnQgbmJfZmRzLCBpID0gMDsKIAlfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7CiAJaW50ICpmZHMgPSBOVUxMOwogCWludCBlcnIgPSAtMTsKJiM0MzsJc2l6ZV90IGo7CiAKIAlpZiAoYXJnYyAhPSAyKQogCQl1c2FnZSgpOwpAQCAtOTE5LDkgJiM0Mzs5ODAsMzQgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIAlpZiAobmJfZmRzICZsdDsgMSkKIAkJZ290byBleGl0X2ZyZWU7CiAKJiM0MzsJaWYgKHJlY3Vyc2l2ZV9kdW1wKSB7CiYjNDM7CQljdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsCiYjNDM7CQkJCQllcXVhbF9mbl9mb3Jfa2V5X2FzX2lkLCBOVUxMKTsKJiM0MzsJCWlmIChJU19FUlIoY3R4LnNlZW4pKSB7CiYjNDM7CQkJY3R4LnNlZW4gPSBOVUxMOwomIzQzOwkJCXBfZXJyKCYjMzQ7ZmFpbGVkIHRvIGNyZWF0ZSBoYXNobWFwIGZvciByZWN1cnNpdmUgZHVtcCYjMzQ7KTsKJiM0MzsJCQlnb3RvIGV4aXRfY2xvc2U7CiYjNDM7CQl9CiYjNDM7CQkvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqLwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5iX2ZkczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlsZW4gPSBzaXplb2YoaW5mbyk7CiYjNDM7CQkJaWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmRzW2ldLCAmYW1wO2luZm8sICZhbXA7bGVuKSkgewomIzQzOwkJCQlwX2VycigmIzM0O2NhbiYjMzk7dCBnZXQgbWFwIGluZm86ICVzJiMzNDssIHN0cmVycm9yKGVycm5vKSk7CiYjNDM7CQkJCWVyciA9IC0xOwomIzQzOwkJCQlnb3RvIGV4aXRfY2xvc2U7CiYjNDM7CQkJfQomIzQzOwkJCWVyciA9IGhhc2htYXBfX2FkZChjdHguc2VlbiwgaW5mby5pZCwgMCk7CiYjNDM7CQkJaWYgKGVycikgewomIzQzOwkJCQlwX2VycigmIzM0O2ZhaWxlZCB0byByZWNvcmQgbWFwIGlkICV1OiAlcyYjMzQ7LCBpbmZvLmlkLAomIzQzOwkJCQkgICAgICBzdHJlcnJvcigtZXJyKSk7CiYjNDM7CQkJCWdvdG8gZXhpdF9jbG9zZTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKIAlpZiAoanNvbl9vdXRwdXQpIHsKIAkJd3RyID0ganNvbl93dHI7Ci0JfSBlbHNlIHsKJiM0MzsJfSBlbHNlIGlmICghcmVjdXJzaXZlX2R1bXApIHsKIAkJaW50IGRvX3BsYWluX2J0ZjsKIAogCQlkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTsKQEAgLTkzNiw3ICYjNDM7MTAyMiw3IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCX0KIAl9CiAKLQlpZiAod3RyICZhbXA7JmFtcDsgbmJfZmRzICZndDsgMSkKJiM0MzsJaWYgKHd0ciAmYW1wOyZhbXA7IChuYl9mZHMgJmd0OyAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSkKIAkJanNvbndfc3RhcnRfYXJyYXkod3RyKTsJLyogcm9vdCBhcnJheSAqLwogCWZvciAoaSA9IDA7IGkgJmx0OyBuYl9mZHM7IGkmIzQzOyYjNDM7KSB7CiAJCWlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgJmFtcDtpbmZvLCAmYW1wO2xlbikpIHsKQEAgLTk0NCwyMiAmIzQzOzEwMzAsNTAgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJCWVyciA9IC0xOwogCQkJYnJlYWs7CiAJCX0KLQkJZXJyID0gbWFwX2R1bXAoZmRzW2ldLCAmYW1wO2luZm8sIHd0ciwgbmJfZmRzICZndDsgMSk7CiYjNDM7CQllcnIgPSBtYXBfZHVtcChmZHNbaV0sICZhbXA7aW5mbywgd3RyLCBuYl9mZHMgJmd0OyAxIHx8IHJlY3Vyc2l2ZV9kdW1wLAomIzQzOwkJCSAgICAgICByZWN1cnNpdmVfZHVtcCA/ICZhbXA7Y3R4IDogTlVMTCk7CiAJCWlmICghd3RyICZhbXA7JmFtcDsgaSAhPSBuYl9mZHMgLSAxKQogCQkJcHJpbnRmKCYjMzQ7XG4mIzM0Oyk7CiAKIAkJaWYgKGVycikKIAkJCWJyZWFrOwotCQljbG9zZShmZHNbaV0pOwomIzQzOwkJLyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovCiYjNDM7CQlpZiAoIXJlY3Vyc2l2ZV9kdW1wKQomIzQzOwkJCWNsb3NlKGZkc1tpXSk7CiYjNDM7CX0KJiM0MzsJZm9yIChqID0gMDsgIWVyciAmYW1wOyZhbXA7IGogJmx0OyBjdHgucGVuZGluZ19jbnQ7IGomIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgZmQ7CiYjNDM7CiYjNDM7CQlmZCA9IGJwZl9tYXBfZ2V0X2ZkX2J5X2lkX29wdHMoY3R4LnBlbmRpbmdfaWRzW2pdLCAmYW1wO29wdHMpOwomIzQzOwkJaWYgKGZkICZsdDsgMCkgewomIzQzOwkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlcyYjMzQ7LAomIzQzOwkJCSAgICAgIGN0eC5wZW5kaW5nX2lkc1tqXSwgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCQllcnIgPSAtMTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJCWxlbiA9IHNpemVvZihpbmZvKTsKJiM0MzsJCWlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCAmYW1wO2luZm8sICZhbXA7bGVuKSkgewomIzQzOwkJCXBfZXJyKCYjMzQ7Y2FuJiMzOTt0IGdldCBtYXAgaW5mbzogJXMmIzM0Oywgc3RyZXJyb3IoZXJybm8pKTsKJiM0MzsJCQllcnIgPSAtMTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJaWYgKCF3dHIpCiYjNDM7CQkJCXByaW50ZigmIzM0O1xuJiMzNDspOwomIzQzOwkJCWVyciA9IG1hcF9kdW1wKGZkLCAmYW1wO2luZm8sIHd0ciwgdHJ1ZSwgJmFtcDtjdHgpOwomIzQzOwkJfQomIzQzOwkJY2xvc2UoZmQpOwogCX0KLQlpZiAod3RyICZhbXA7JmFtcDsgbmJfZmRzICZndDsgMSkKJiM0MzsJaWYgKHd0ciAmYW1wOyZhbXA7IChuYl9mZHMgJmd0OyAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSkKIAkJanNvbndfZW5kX2FycmF5KHd0cik7CS8qIHJvb3QgYXJyYXkgKi8KIAogCWlmIChidGZfd3RyKQogCQlqc29ud19kZXN0cm95KCZhbXA7YnRmX3d0cik7CiBleGl0X2Nsb3NlOgomIzQzOwlpZiAocmVjdXJzaXZlX2R1bXApCiYjNDM7CQlpID0gMDsKIAlmb3IgKDsgaSAmbHQ7IG5iX2ZkczsgaSYjNDM7JiM0MzspCiAJCWNsb3NlKGZkc1tpXSk7CiYjNDM7CWhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pOwomIzQzOwlmcmVlKGN0eC5wZW5kaW5nX2lkcyk7CiBleGl0X2ZyZWU6CiAJZnJlZShmZHMpOwogCWZyZWVfYnRmX3ZtbGludXgoKTsKQEAgLTE0ODQsNyAmIzQzOzE1OTgsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQkmIzM0OyAgICAgICAgICAgICAgICAgdGFza19zdG9yYWdlIHwgYmxvb21fZmlsdGVyIHwgdXNlcl9yaW5nYnVmIHwgY2dycF9zdG9yYWdlIHwgYXJlbmEgfFxuJiMzNDsKIAkJJiMzNDsgICAgICAgICAgICAgICAgIGluc25fYXJyYXkgfCByaGFzaCB9XG4mIzM0OwogCQkmIzM0OyAgICAgICAmIzM0OyBIRUxQX1NQRUNfT1BUSU9OUyAmIzM0OyB8XG4mIzM0OwotCQkmIzM0OyAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxuJiMzNDsKJiM0MzsJCSYjMzQ7ICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxuJiMzNDsKIAkJJiMzNDsmIzM0OywKIAkJYmluX25hbWUsIGFyZ3ZbLTJdKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjljODg3NDNhOGY4NDIKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9icGZ0b29sX21hcF9kdW1wLmMKQEAgLTAsMCAmIzQzOzEsNDY1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZnRvb2xfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnRmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9yZXNvdXJjZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtkaXJlbnQuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTIKJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KQomIzQzO3sKJiM0MzsJY2hhciBjb21tYW5kW01BWF9CUEZUT09MX0NNRF9MRU5dOwomIzQzOwomIzQzOwlzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICYjMzQ7JXMgbWFwIGR1bXAgaWQgJXUmIzM0Oywgb3B0aW9ucywgaWQpOwomIzQzOwltZW1zZXQob3V0cHV0LCAwLCBPVVRQVVRfU0laRSk7CiYjNDM7CWlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgT1VUUFVUX1NJWkUgLSAxKSwKJiM0MzsJCSAgICAgICAmIzM0O2R1bXBfbWFwJiMzNDspKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwkvKiBUaGUgaGVscGVyIGRvZXNuJiMzOTt0IHRlcm1pbmF0ZSBvciBzdHJpcCB0aGUgb3V0cHV0LiAqLwomIzQzOwlvdXRwdXRbc3RyY3NwbihvdXRwdXQsICYjMzQ7XG4mIzM0OyldID0gJiMzOTtcMCYjMzk7OwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIF9fdTMyIG1hcF9pZChpbnQgZmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTsKJiM0MzsJX191MzIgbGVuID0gc2l6ZW9mKGluZm8pOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCAmYW1wO2luZm8sICZhbXA7bGVuKSwgJiMzNDttYXBfaW5mbyYjMzQ7KSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlyZXR1cm4gaW5mby5pZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBjb3VudF90b2tlbihjb25zdCBjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKnRva2VuKQomIzQzO3sKJiM0MzsJaW50IGNvdW50ID0gMDsKJiM0MzsKJiM0MzsJd2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7CiYjNDM7CQljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQlvdXRwdXQgJiM0Mzs9IHN0cmxlbih0b2tlbik7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIGNvdW50OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBjaGVja19wbGFpbihfX3UzMiByb290X2lkLCBfX3UzMiBpbm5lcl9pZCwgY29uc3QgY2hhciAqdHlwZSwKJiM0MzsJCQlpbnQgZW50cmllcywgYm9vbCB0eXBlZCkKJiM0Mzt7CiYjNDM7CWNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07CiYjNDM7CWNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9OwomIzQzOwljb25zdCBjaGFyICpyb290LCAqaW5uZXI7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDstLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldSYjMzQ7LCByb290X2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLAomIzQzOwkJICAgICAgICYjMzQ7cGxhaW5fZHVtcCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJc25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgJiMzNDsldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgJiMzNDssIHJvb3RfaWQsIHR5cGUpOwomIzQzOwlyb290ID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHJvb3QsICYjMzQ7cGxhaW5fcm9vdF9oZWFkZXImIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CUFTU0VSVF9FUShyb290IC0gb3V0cHV0LCAwLCAmIzM0O3BsYWluX3Jvb3RfZmlyc3QmIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsICYjMzQ7aW5uZXJfbWFwX2lkOiYjMzQ7KSwgZW50cmllcywgJiMzNDtwbGFpbl9yZWZlcmVuY2VzJiMzNDspOwomIzQzOwlpZiAoZW50cmllcykgewomIzQzOwkJc25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgJiMzNDsldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICAmIzM0OywgaW5uZXJfaWQpOwomIzQzOwkJaW5uZXIgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpOwomIzQzOwkJaWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsICYjMzQ7cGxhaW5faW5uZXJfaGVhZGVyJiMzNDspKQomIzQzOwkJCUFTU0VSVF9HVChpbm5lciAtIHJvb3QsIDAsICYjMzQ7cGxhaW5faW5uZXJfYWZ0ZXJfcm9vdCYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIGhlYWRlciksIDEsICYjMzQ7cGxhaW5faW5uZXJfb25jZSYjMzQ7KTsKJiM0MzsJfQomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCAmIzM0O0ZvdW5kICYjMzQ7KSwgZW50cmllcyAmYW1wOyZhbXA7ICF0eXBlZCA/IDIgOiAxLAomIzQzOwkJICAmIzM0O3BsYWluX21hcF9jb3VudCYjMzQ7KTsKJiM0MzsJaWYgKHR5cGVkKSB7CiYjNDM7CQlBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsICYjMzQ7XCYjMzQ7a2V5XCYjMzQ7OiAwJiMzNDssICYjMzQ7cGxhaW5fYnRmX2tleSYjMzQ7KTsKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgJiMzNDtcJiMzNDt2YWx1ZVwmIzM0OzogMTY4NDMwMDkmIzM0OywgJiMzNDtwbGFpbl9idGZfdmFsdWUmIzM0Oyk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lciwKJiM0MzsJCSAgICAgICBib29sIHR5cGVkKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpOwomIzQzOwlzdHJ1Y3QgYnRmICpidGYgPSBOVUxMOwomIzQzOwljaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdOwomIzQzOwljaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07CiYjNDM7CWNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpOwomIzQzOwlpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTsKJiM0MzsJX191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxOwomIzQzOwomIzQzOwlpZiAodHlwZWQpIHsKJiM0MzsJCWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCAmIzM0O2NyZWF0ZV9idGYmIzM0OykgfHwKJiM0MzsJCSAgICAhQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsICYjMzQ7dW5zaWduZWQgaW50JiMzNDssIDQsIDApLCAxLCAmIzM0O2J0Zl9pbnQmIzM0OykgfHwKJiM0MzsJCSAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCAmIzM0O2xvYWRfYnRmJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJaW5uZXJfb3B0cy5idGZfZmQgPSBidGZfX2ZkKGJ0Zik7CiYjNDM7CQlpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7CiYjNDM7CQlpbm5lcl9vcHRzLmJ0Zl92YWx1ZV90eXBlX2lkID0gMTsKJiM0MzsJfQomIzQzOwlpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCAmIzM0O2R1bXBfaW5uZXImIzM0Oywgc2l6ZW9mKGtleSksCiYjNDM7CQkJCSAgc2l6ZW9mKHZhbHVlKSwgMiwgJmFtcDtpbm5lcl9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX2lubmVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWtleSA9IDA7CiYjNDM7CWlmICghZW1wdHlfaW5uZXIgJmFtcDsmYW1wOwomIzQzOwkgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCAmYW1wO2tleSwgJmFtcDt2YWx1ZSwgQlBGX0FOWSksCiYjNDM7CQkgICAgICAgJiMzNDtwb3B1bGF0ZV9pbm5lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkOwomIzQzOwlvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsICYjMzQ7ZHVtcF9vdXRlciYjMzQ7LCBzaXplb2Yoa2V5KSwgc2l6ZW9mKF9fdTMyKSwKJiM0MzsJCQkJICAzLCAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgJiMzNDtjcmVhdGVfb3V0ZXImIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJLyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqLwomIzQzOwlmb3IgKGtleSA9IDA7IGtleSAmbHQ7IGVudHJpZXM7IGtleSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCAmYW1wO2tleSwgJmFtcDtpbm5lcl9mZCwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cG9wdWxhdGVfb3V0ZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CXJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpOwomIzQzOwlpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7CiYjNDM7CWlmICghcm9vdF9pZCB8fCAhaW5uZXJfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsICYjMzQ7LWomIzM0Oywgb3V0ZXIpIHx8CiYjNDM7CSAgICAhZHVtcF9tYXAoaW5uZXJfaWQsICYjMzQ7LWomIzM0OywgaW5uZXIpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUShvdXRlclswXSwgJiMzOTtbJiMzOTssICYjMzQ7ZGVmYXVsdF9hcnJheSYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCAmIzM0O1wmIzM0O2VsZW1lbnRzXCYjMzQ7OiYjMzQ7KSwgMCwgJiMzNDtkZWZhdWx0X25vX3dyYXBwZXImIzM0Oyk7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgJiMzNDtcJiMzNDtpZFwmIzM0OzomIzM0OyksIDAsICYjMzQ7ZGVmYXVsdF9ub19oZWFkZXImIzM0Oyk7CiYjNDM7CXNucHJpbnRmKHJlZmVyZW5jZSwgc2l6ZW9mKHJlZmVyZW5jZSksICYjMzQ7XCYjMzQ7aW5uZXJfbWFwX2lkXCYjMzQ7OiV1JiMzNDssIGlubmVyX2lkKTsKJiM0MzsJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCByZWZlcmVuY2UpLCBlbnRyaWVzLCAmIzM0O2RlZmF1bHRfcmVmZXJlbmNlcyYjMzQ7KTsKJiM0MzsJaWYgKCFlbnRyaWVzKQomIzQzOwkJQVNTRVJUX1NUUkVRKG91dGVyLCAmIzM0O1tdJiMzNDssICYjMzQ7ZW1wdHlfb3V0ZXJfZGVmYXVsdCYjMzQ7KTsKJiM0MzsJaWYgKGVtcHR5X2lubmVyKQomIzQzOwkJQVNTRVJUX1NUUkVRKGlubmVyLCAmIzM0O1tdJiMzNDssICYjMzQ7ZW1wdHlfaW5uZXJfZGVmYXVsdCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAodHlwZWQpCiYjNDM7CQlBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgJiMzNDtcJiMzNDtmb3JtYXR0ZWRcJiMzNDs6e1wmIzM0O2tleVwmIzM0OzowLFwmIzM0O3ZhbHVlXCYjMzQ7OjE2ODQzMDA5fSYjMzQ7LAomIzQzOwkJCQkgICYjMzQ7dHlwZWRfaW5uZXImIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCUFTU0VSVF9TVFJFUShpbm5lciwKJiM0MzsJCQkgICAgICYjMzQ7W3tcJiMzNDtrZXlcJiMzNDs6W1wmIzM0OzB4MDBcJiMzNDssXCYjMzQ7MHgwMFwmIzM0OyxcJiMzNDsweDAwXCYjMzQ7LFwmIzM0OzB4MDBcJiMzNDtdLCYjMzQ7CiYjNDM7CQkJICAgICAmIzM0O1wmIzM0O3ZhbHVlXCYjMzQ7OltcJiMzNDsweDAxXCYjMzQ7LFwmIzM0OzB4MDFcJiMzNDssXCYjMzQ7MHgwMVwmIzM0OyxcJiMzNDsweDAxXCYjMzQ7XX1dJiMzNDssCiYjNDM7CQkJICAgICAmIzM0O29yZGluYXJ5X2RlZmF1bHQmIzM0Oyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LAomIzQzOwkgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuCiYjNDM7CSAqLwomIzQzOwlpZiAoZW50cmllcykKJiM0MzsJCXNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLAomIzQzOwkJCSAmIzM0O1t7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDslc1wmIzM0OyxcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0O2R1bXBfb3V0ZXJcJiMzNDssJiMzNDsKJiM0MzsJCQkgJiMzNDtcJiMzNDtmbGFnc1wmIzM0OzowLFwmIzM0O2VsZW1lbnRzXCYjMzQ7OiVzfSx7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDtoYXNoXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX2lubmVyXCYjMzQ7LFwmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9XSYjMzQ7LAomIzQzOwkJCSByb290X2lkLCB0eXBlX25hbWUsIG91dGVyLCBpbm5lcl9pZCwgaW5uZXIpOwomIzQzOwllbHNlCiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7JXNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0OzpbXX1dJiMzNDssIHJvb3RfaWQsIHR5cGVfbmFtZSk7CiYjNDM7CWlmIChkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qIC1yJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyZWN1cnNpdmVfanNvbiYjMzQ7KTsKJiM0MzsJaWYgKGR1bXBfbWFwKHJvb3RfaWQsICYjMzQ7LS1qc29uIC0tcmVjdXJzaXZlJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyZWN1cnNpdmVfbG9uZ19vcHRpb25zJiMzNDspOwomIzQzOwljaGVja19wbGFpbihyb290X2lkLCBpbm5lcl9pZCwgdHlwZV9uYW1lLCBlbnRyaWVzLCB0eXBlZCk7CiYjNDM7CiYjNDM7CS8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi8KJiM0MzsJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7aGFzaFwmIzM0OyxcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0O2R1bXBfaW5uZXJcJiMzNDssJiMzNDsKJiM0MzsJCSAmIzM0O1wmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9XSYjMzQ7LCBpbm5lcl9pZCwgaW5uZXIpOwomIzQzOwlpZiAoZHVtcF9tYXAoaW5uZXJfaWQsICYjMzQ7LWogLXImIzM0Oywgb3V0cHV0KSkKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O29yZGluYXJ5X3JlY3Vyc2l2ZSYjMzQ7KTsKJiM0MztvdXQ6CiYjNDM7CWlmIChvdXRlcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2Uob3V0ZXJfZmQpOwomIzQzOwlpZiAoaW5uZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0MzsJYnRmX19mcmVlKGJ0Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHRlc3RfbXVsdGlwbGVfcm9vdHModm9pZCkKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpOwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIG5hbWVbQlBGX09CSl9OQU1FX0xFTl07CiYjNDM7CWNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9LCBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDRdLCBlbGVtZW50c1tPVVRQVVRfU0laRV07CiYjNDM7CXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHlwZXNbXSA9IHsgJiMzNDtoYXNoJiMzNDssICYjMzQ7YXJyYXlfb2ZfbWFwcyYjMzQ7LCAmIzM0O2hhc2hfb2ZfbWFwcyYjMzQ7LCAmIzM0O2hhc2gmIzM0OyB9OwomIzQzOwlpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07CiYjNDM7CV9fdTMyIGlkc1s0XSwga2V5OwomIzQzOwlpbnQgaSwgbGVuID0gMDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXIKJiM0MzsJICogbWFwIG11c3QgYmUgYXBwZW5kZWQgYWZ0ZXIgYWxsIHRocmVlIHJvb3RzLCBldmVuIHRob3VnaCBpdCBpcyBmb3VuZAomIzQzOwkgKiB3aGlsZSBkdW1waW5nIHRoZSBmaXJzdCBvdXRlci4gQSBwcm9jZXNzLXNwZWNpZmljIG5hbWUgYXZvaWRzIG90aGVyCiYjNDM7CSAqIHRlc3RzJiMzOTsgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uCiYjNDM7CSAqLwomIzQzOwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICYjMzQ7ZHVtcF8ldSYjMzQ7LCBnZXRwaWQoKSk7CiYjNDM7CWZkc1swXSA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBuYW1lLCA0LCA0LCAxLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZmRzWzBdLCAmIzM0O2NyZWF0ZV9zZWxlY3RlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2Rpc2NvdmVyZWQmIzM0OywgNCwgNCwgMSwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkc1szXSwgJiMzNDtjcmVhdGVfZGlzY292ZXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlvcHRzLmlubmVyX21hcF9mZCA9IGZkc1swXTsKJiM0MzsJZmRzWzFdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIG5hbWUsIDQsIDQsIDIsICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKGZkc1sxXSwgJiMzNDtjcmVhdGVfYXJyYXlfcm9vdCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmZHNbMl0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCBuYW1lLCA0LCA0LCAyLCAmYW1wO29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sICYjMzQ7Y3JlYXRlX2hhc2hfcm9vdCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGkgPSAxOyBpICZsdDs9IDI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlrZXkgPSAwOwomIzQzOwkJaWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShmZHNbaV0sICZhbXA7a2V5LCAmYW1wO2Zkc1swXSwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJa2V5ID0gMTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCAmYW1wO2tleSwgJmFtcDtmZHNbM10sIEJQRl9BTlkpLAomIzQzOwkJCSAgICAgICAmIzM0O3JlZmVyZW5jZV9kaXNjb3ZlcmVkX2lubmVyJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKGZkcyk7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZHNbaV0gPSBtYXBfaWQoZmRzW2ldKTsKJiM0MzsJCWlmICghaWRzW2ldIHx8ICFkdW1wX21hcChpZHNbaV0sICYjMzQ7LWomIzM0OywgZWxlbWVudHMpKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJbGVuICYjNDM7PSBzbnByaW50ZihleHBlY3RlZCAmIzQzOyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sCiYjNDM7CQkJCSYjMzQ7JXN7XCYjMzQ7aWRcJiMzNDs6JXUsXCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDslc1wmIzM0OyxcJiMzNDtuYW1lXCYjMzQ7OlwmIzM0OyVzXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJCSYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc30lcyYjMzQ7LAomIzQzOwkJCQlpID8gJiMzNDssJiMzNDsgOiAmIzM0O1smIzM0OywgaWRzW2ldLCB0eXBlc1tpXSwKJiM0MzsJCQkJaSA9PSAzID8gJiMzNDtkdW1wX2Rpc2NvdmVyZWQmIzM0OyA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyAmIzM0O10mIzM0OyA6ICYjMzQ7JiMzNDspOwomIzQzOwl9CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDstaiAtciBtYXAgZHVtcCBuYW1lICVzJiMzNDssIG5hbWUpOwomIzQzOwlpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSwKJiM0MzsJCSAgICAgICYjMzQ7ZHVtcF9tdWx0aXBsZV9yb290cyYjMzQ7KSkgewomIzQzOwkJb3V0cHV0W3N0cmNzcG4ob3V0cHV0LCAmIzM0O1xuJiMzNDspXSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJCUFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCAmIzM0O3Jvb3RzX2ZpcnN0X2FuZF9zZWVkX2RlZHVwJiMzNDspOwomIzQzOwl9CiYjNDM7b3V0OgomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShmZHMpOyBpJiM0MzsmIzQzOykKJiM0MzsJCWlmIChmZHNbaV0gJmd0Oz0gMCkKJiM0MzsJCQljbG9zZShmZHNbaV0pOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcikKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpOwomIzQzOwljaGFyIGVsZW1lbnRzW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXSwgcm9vdFtPVVRQVVRfU0laRV07CiYjNDM7CWNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcGxhaW5bT1VUUFVUX1NJWkVdID0ge307CiYjNDM7CWNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTsKJiM0MzsJaW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIGxvb2t1cF9lcnJubzsKJiM0MzsJX191MzIgaW5uZXJfaWQsIHJvb3RfaWQsIGtleSA9IDAsIHZhbHVlOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBFdmVyeSBrZXkgaXMgZW51bWVyYWJsZSwgYnV0IFBFUkZfRVZFTlRfQVJSQVkgbG9va3VwIHJldHVybnMKJiM0MzsJICogRU5PVFNVUFAgKHRoZSBrZXJuZWwtaW50ZXJuYWwgZXJybm8pLiBDaGVjayBib3RoIGVudHJpZXMgc28gYW4KJiM0MzsJICogZWFybHkgZXhpdCBvbiB0aGUgZmlyc3QgbG9va3VwIGZhaWx1cmUgY2Fubm90IHBhc3MuCiYjNDM7CSAqLwomIzQzOwlpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZLCAmIzM0O2R1bXBfdW5yZWFkYWJsZSYjMzQ7LAomIzQzOwkJCQkgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX3VucmVhZGFibGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgJmFtcDtrZXksICZhbXA7dmFsdWUpLCAwLAomIzQzOwkJICAgICAgICYjMzQ7dW5yZWFkYWJsZV9sb29rdXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJbG9va3VwX2Vycm5vID0gZXJybm87CiYjNDM7CWlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgJiMzNDt1bnJlYWRhYmxlX25vdF9taXNzaW5nJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTsKJiM0MzsJaWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsICYjMzQ7LWomIzM0OywgZWxlbWVudHMpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CUFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgJiMzNDtcJiMzNDtlcnJvclwmIzM0OzomIzM0OyksIDIsICYjMzQ7ZGVmYXVsdF9qc29uX2Vycm9ycyYjMzQ7KTsKJiM0MzsJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAmIzM0O21hcCBkdW1wIGlkICV1JiMzNDssIGlubmVyX2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgcGxhaW4sIHNpemVvZihwbGFpbikgLSAxKSwKJiM0MzsJCSAgICAgICAmIzM0O2RlZmF1bHRfcGxhaW5fdW5yZWFkYWJsZSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCAmIzM0O2RlZmF1bHRfcGxhaW5fZXJyb3JzJiMzNDspOwomIzQzOwlBU1NFUlRfSEFTX1NVQlNUUihwbGFpbiwgJiMzNDtGb3VuZCAwIGVsZW1lbnRzJiMzNDssICYjMzQ7ZGVmYXVsdF9wbGFpbl9jb3VudCYjMzQ7KTsKJiM0MzsKJiM0MzsJcm9vdF9pZCA9IGlubmVyX2lkOwomIzQzOwlpZiAob3V0ZXIpIHsKJiM0MzsJCW9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7CiYjNDM7CQlvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCAmIzM0O2R1bXBfb3V0ZXImIzM0OywKJiM0MzsJCQkJCSAgc2l6ZW9mKGtleSksIHNpemVvZih2YWx1ZSksIDEsICZhbXA7b3B0cyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgJiMzNDtjcmVhdGVfb3V0ZXImIzM0OykgfHwKJiM0MzsJCSAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsICZhbXA7a2V5LCAmYW1wO2lubmVyX2ZkLCBCUEZfQU5ZKSwKJiM0MzsJCQkgICAgICAgJiMzNDtwb3B1bGF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCXJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpOwomIzQzOwkJaWYgKCFyb290X2lkIHx8ICFkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qJiMzNDssIHJvb3QpKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJc25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksCiYjNDM7CQkJICYjMzQ7W3tcJiMzNDtpZFwmIzM0OzoldSxcJiMzNDt0eXBlXCYjMzQ7OlwmIzM0O2FycmF5X29mX21hcHNcJiMzNDssXCYjMzQ7bmFtZVwmIzM0OzpcJiMzNDtkdW1wX291dGVyXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc30se1wmIzM0O2lkXCYjMzQ7OiV1LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7dHlwZVwmIzM0OzpcJiMzNDtwZXJmX2V2ZW50X2FycmF5XCYjMzQ7LFwmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF91bnJlYWRhYmxlXCYjMzQ7LCYjMzQ7CiYjNDM7CQkJICYjMzQ7XCYjMzQ7ZmxhZ3NcJiMzNDs6MCxcJiMzNDtlbGVtZW50c1wmIzM0Ozolc31dJiMzNDssIHJvb3RfaWQsIHJvb3QsIGlubmVyX2lkLCBlbGVtZW50cyk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSwKJiM0MzsJCQkgJiMzNDtbe1wmIzM0O2lkXCYjMzQ7OiV1LFwmIzM0O3R5cGVcJiMzNDs6XCYjMzQ7cGVyZl9ldmVudF9hcnJheVwmIzM0OywmIzM0OwomIzQzOwkJCSAmIzM0O1wmIzM0O25hbWVcJiMzNDs6XCYjMzQ7ZHVtcF91bnJlYWRhYmxlXCYjMzQ7LFwmIzM0O2ZsYWdzXCYjMzQ7OjAsXCYjMzQ7ZWxlbWVudHNcJiMzNDs6JXN9XSYjMzQ7LAomIzQzOwkJCSBpbm5lcl9pZCwgZWxlbWVudHMpOwomIzQzOwl9CiYjNDM7CWlmIChkdW1wX21hcChyb290X2lkLCAmIzM0Oy1qIC1yJiMzNDssIG91dHB1dCkpCiYjNDM7CQlBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgJiMzNDtyZWN1cnNpdmVfdW5yZWFkYWJsZV9qc29uJiMzNDspOwomIzQzOwltZW1zZXQob3V0cHV0LCAwLCBzaXplb2Yob3V0cHV0KSk7CiYjNDM7CXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDstciBtYXAgZHVtcCBpZCAldSYjMzQ7LCByb290X2lkKTsKJiM0MzsJaWYgKEFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksCiYjNDM7CQkgICAgICAmIzM0O3JlY3Vyc2l2ZV91bnJlYWRhYmxlX3BsYWluJiMzNDspKSB7CiYjNDM7CQlBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIHBsYWluLCAmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzJiMzNDspOwomIzQzOwkJQVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsCiYjNDM7CQkJICAmIzM0O3JlY3Vyc2l2ZV9wbGFpbl9lcnJvcnMmIzM0Oyk7CiYjNDM7CQlBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCAmIzM0O0ZvdW5kICYjMzQ7KSwgb3V0ZXIgPyAyIDogMSwKJiM0MzsJCQkgICYjMzQ7cmVjdXJzaXZlX3BsYWluX21hcHMmIzM0Oyk7CiYjNDM7CX0KJiM0MztvdXQ6CiYjNDM7CWlmIChvdXRlcl9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2Uob3V0ZXJfZmQpOwomIzQzOwlpZiAoaW5uZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgdGVzdF9tYW55X2lubmVyX21hcHMoYm9vbCBqc29uKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7CiYjNDM7CWNvbnN0IHN0cnVjdCBybGltaXQgbGltaXQgPSB7IC5ybGltX2N1ciA9IDMyLCAucmxpbV9tYXggPSAzMiB9OwomIzQzOwljaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl0sIHRva2VuWzY0XTsKJiM0MzsJX191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5OwomIzQzOwlpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgc3RhdHVzOwomIzQzOwlpbnQgaW5oZXJpdGVkX2Zkc1szMl0sIG5yX2luaGVyaXRlZCA9IDAsIGk7CiYjNDM7CWNoYXIgKm91dHB1dCA9IE5VTEw7CiYjNDM7CXBpZF90IHBpZDsKJiM0MzsKJiM0MzsJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2lubmVyJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgJiMzNDtjcmVhdGVfdGVtcGxhdGUmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJb3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDsKJiM0MzsJb3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgJiMzNDtkdW1wX291dGVyJiMzNDssIDQsIDQsCiYjNDM7CQkJCSAgQVJSQVlfU0laRShpZHMpLCAmYW1wO29wdHMpOwomIzQzOwljbG9zZShpbm5lcl9mZCk7CiYjNDM7CWlubmVyX2ZkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCAmIzM0O2NyZWF0ZV9vdXRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlmb3IgKGtleSA9IDA7IGtleSAmbHQ7IEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykgewomIzQzOwkJaW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtkdW1wX2lubmVyJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsICYjMzQ7Y3JlYXRlX2lubmVyJiMzNDspIHx8CiYjNDM7CQkgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCAmYW1wO2tleSwgJmFtcDtpbm5lcl9mZCwgQlBGX0FOWSksCiYjNDM7CQkJICAgICAgICYjMzQ7cG9wdWxhdGVfb3V0ZXImIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpZHNba2V5XSA9IG1hcF9pZChpbm5lcl9mZCk7CiYjNDM7CQlpZiAoIWlkc1trZXldKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJLyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi8KJiM0MzsJCWNsb3NlKGlubmVyX2ZkKTsKJiM0MzsJCWlubmVyX2ZkID0gLTE7CiYjNDM7CX0KJiM0MzsJcm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7CiYjNDM7CW91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7CiYjNDM7CWlmICghcm9vdF9pZCB8fCAhQVNTRVJUX09LX1BUUihvdXRwdXQsICYjMzQ7YWxsb2NhdGVfb3V0cHV0JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qIEZpbGwgdGhlIGxvdyBGRCBzbG90cyB0byBleGVyY2lzZSBpbmhlcml0ZWQgZGVzY3JpcHRvciBjbGVhbnVwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShpbmhlcml0ZWRfZmRzKTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWludCBmZCA9IG9wZW4oJiMzNDsvZGV2L251bGwmIzM0OywgT19SRE9OTFkpOwomIzQzOwomIzQzOwkJaWYgKCFBU1NFUlRfT0tfRkQoZmQsICYjMzQ7b3Blbl9pbmhlcml0ZWRfZmQmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQlpbmhlcml0ZWRfZmRzW25yX2luaGVyaXRlZCYjNDM7JiM0MztdID0gZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdAomIzQzOwkgKiBydW5uZXImIzM5O3MgbGltaXQgdW5jaGFuZ2VkLiBSZXRhaW5pbmcgZXZlcnkgZGlzY292ZXJlZCBGRCB3b3VsZCBleGNlZWQKJiM0MzsJICogdGhpcyBsaW1pdCBiZWZvcmUgdGhlIHJlY3Vyc2l2ZSBkdW1wIGNvdWxkIHZpc2l0IGFsbCBpbm5lciBtYXBzLgomIzQzOwkgKi8KJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShwaWQsIDAsICYjMzQ7Zm9yayYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIXBpZCkgewomIzQzOwkJc3RydWN0IGRpcmVudCAqZW50cnk7CiYjNDM7CQlESVIgKmRpcjsKJiM0MzsKJiM0MzsJCS8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqLwomIzQzOwkJY2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7CiYjNDM7CQlkaXIgPSBvcGVuZGlyKCYjMzQ7L3Byb2Mvc2VsZi9mZCYjMzQ7KTsKJiM0MzsJCWlmICghZGlyKQomIzQzOwkJCV9leGl0KDYpOwomIzQzOwkJLyogVGhlIHBhcmVudCBrZWVwcyB0aGUgb3V0ZXIgbWFwIGFuZCBpdHMgaW5uZXIgbWFwcyBhbGl2ZS4gKi8KJiM0MzsJCWZvciAoOzspIHsKJiM0MzsJCQljaGFyICplbmQ7CiYjNDM7CQkJbG9uZyBmZDsKJiM0MzsKJiM0MzsJCQllcnJubyA9IDA7CiYjNDM7CQkJZW50cnkgPSByZWFkZGlyKGRpcik7CiYjNDM7CQkJaWYgKCFlbnRyeSkgewomIzQzOwkJCQlpZiAoZXJybm8pCiYjNDM7CQkJCQlfZXhpdCg2KTsKJiM0MzsJCQkJYnJlYWs7CiYjNDM7CQkJfQomIzQzOwkJCWZkID0gc3RydG9sKGVudHJ5LSZndDtkX25hbWUsICZhbXA7ZW5kLCAxMCk7CiYjNDM7CQkJaWYgKCplbmQgfHwgZmQgJmx0OyAzIHx8IGZkID09IGRpcmZkKGRpcikpCiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCWNsb3NlKGZkKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChjbG9zZWRpcihkaXIpKQomIzQzOwkJCV9leGl0KDYpOwomIzQzOwkJaWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmYW1wO2xpbWl0KSkKJiM0MzsJCQlfZXhpdCgxKTsKJiM0MzsJCXNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgJiMzNDslcyAtciBtYXAgZHVtcCBpZCAldSYjMzQ7LAomIzQzOwkJCSBqc29uID8gJiMzNDstaiYjMzQ7IDogJiMzNDsmIzM0Oywgcm9vdF9pZCk7CiYjNDM7CQlpZiAoZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCA2NTUzNSkpCiYjNDM7CQkJX2V4aXQoMik7CiYjNDM7CQlpZiAoY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gJiMzNDtcJiMzNDtpZFwmIzM0OzomIzM0OyA6ICYjMzQ7Rm91bmQgJiMzNDspICE9IEFSUkFZX1NJWkUoaWRzKSAmIzQzOyAxIHx8CiYjNDM7CQkgICAgY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gJiMzNDtcJiMzNDtpbm5lcl9tYXBfaWRcJiMzNDs6JiMzNDsgOiAmIzM0O2lubmVyX21hcF9pZDomIzM0OykgIT0KJiM0MzsJCSAgICBBUlJBWV9TSVpFKGlkcykpCiYjNDM7CQkJX2V4aXQoMyk7CiYjNDM7CQlmb3IgKGtleSA9IDA7IGtleSAmbHQ7IEFSUkFZX1NJWkUoaWRzKTsga2V5JiM0MzsmIzQzOykgewomIzQzOwkJCWlmIChqc29uKQomIzQzOwkJCQlzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgJiMzNDtcJiMzNDtpZFwmIzM0OzoldSwmIzM0OywgaWRzW2tleV0pOwomIzQzOwkJCWVsc2UKJiM0MzsJCQkJc25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksICYjMzQ7XG4ldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICAmIzM0OywKJiM0MzsJCQkJCSBpZHNba2V5XSk7CiYjNDM7CQkJaWYgKGNvdW50X3Rva2VuKG91dHB1dCwgdG9rZW4pICE9IDEpCiYjNDM7CQkJCV9leGl0KDQpOwomIzQzOwkJfQomIzQzOwkJaWYgKGpzb24gJmFtcDsmYW1wOyAob3V0cHV0WzBdICE9ICYjMzk7WyYjMzk7IHx8CiYjNDM7CQkJICAgICBzdHJjbXAob3V0cHV0ICYjNDM7IHN0cmxlbihvdXRwdXQpIC0gMiwgJiMzNDtdXG4mIzM0OykpKQomIzQzOwkJCV9leGl0KDUpOwomIzQzOwkJX2V4aXQoMCk7CiYjNDM7CX0KJiM0MzsJaWYgKEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgJmFtcDtzdGF0dXMsIDApLCBwaWQsICYjMzQ7d2FpdHBpZCYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CSAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtjaGlsZF9leGl0ZWQmIzM0OykpCiYjNDM7CQlBU1NFUlRfRVEoV0VYSVRTVEFUVVMoc3RhdHVzKSwgMCwgJiMzNDtkdW1wX3dpdGhfbG93X2ZkX2xpbWl0JiMzNDspOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnJfaW5oZXJpdGVkOyBpJiM0MzsmIzQzOykKJiM0MzsJCUFTU0VSVF9HRShmY250bChpbmhlcml0ZWRfZmRzW2ldLCBGX0dFVEZEKSwgMCwgJiMzNDtwYXJlbnRfZmRfcHJlc2VydmVkJiMzNDspOwomIzQzOwlBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgJiMzNDtwYXJlbnRfb3V0ZXJfcHJlc2VydmVkJiMzNDspOwomIzQzO291dDoKJiM0MzsJd2hpbGUgKG5yX2luaGVyaXRlZCkKJiM0MzsJCWNsb3NlKGluaGVyaXRlZF9mZHNbLS1ucl9pbmhlcml0ZWRdKTsKJiM0MzsJZnJlZShvdXRwdXQpOwomIzQzOwlpZiAob3V0ZXJfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKG91dGVyX2ZkKTsKJiM0MzsJaWYgKGlubmVyX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShpbm5lcl9mZCk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgdGVzdF9icGZ0b29sX21hcF9kdW1wKHZvaWQpCiYjNDM7ewomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VucmVhZGFibGVfb3JkaW5hcnkmIzM0OykpCiYjNDM7CQl0ZXN0X3VucmVhZGFibGUoZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3VucmVhZGFibGVfaW5uZXImIzM0OykpCiYjNDM7CQl0ZXN0X3VucmVhZGFibGUodHJ1ZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWFueV9pbm5lcl9tYXBzX2pzb24mIzM0OykpCiYjNDM7CQl0ZXN0X21hbnlfaW5uZXJfbWFwcyh0cnVlKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttYW55X2lubmVyX21hcHNfcGxhaW4mIzM0OykpCiYjNDM7CQl0ZXN0X21hbnlfaW5uZXJfbWFwcyhmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bXVsdGlwbGVfcm9vdHMmIzM0OykpCiYjNDM7CQl0ZXN0X211bHRpcGxlX3Jvb3RzKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7YXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7aGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NoYXJlZF9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfYXJyYXlfb2ZfbWFwcyYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7ZW1wdHlfaGFzaF9vZl9tYXBzJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2J0Zl9pbm5lciYjMzQ7KSkKJiM0MzsJCXRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2VtcHR5X2lubmVyJiMzNDspKQomIzQzOwkJdGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7CiYjNDM7fQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwNjozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzk4NQoJCQkJCQkJb3V0cHV0OiA5MAoJCQkJCQkJdGhvdWdodHM6IDU1MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipQYXRjaCBBbmFseXNpczogV29ydGhGdXp6aW5nIERldGVybWluYXRpb24qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCBzY2FuIG9mIHRoZSBkaWZmIHJldmVhbHMgY2hhbmdlcyBzY2F0dGVyZWQgYWNyb3NzIHNldmVyYWwgZmlsZXMsIHNwZWNpZmljYWxseSB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC4gSSBzZWUgdXBkYXRlcyB0byBkb2N1bWVudGF0aW9uLCBiYXNoIGNvbXBsZXRpb24sIHRoZSBtYWluIHByb2dyYW0sIG1hcCBmdW5jdGlvbmFsaXR5LCBhbmQgYSBzZWxmdGVzdC4KCk5vdywgbGV0JiMzOTtzIHF1aWNrbHkgY3Jvc3MtcmVmZXJlbmNlIHRoYXQgd2l0aCB0aGUgZGVmaW5lZCBjcml0ZXJpYSBmb3IgYFdvcnRoRnV6emluZ2AuIFRoZSBuZWdhdGl2ZSBjcml0ZXJpYSAod2hlbiB0byAqbm90KiBmdXp6KSBpcyB3aGF0IEkgbmVlZCB0byBmb2N1cyBvbi4gU3BlY2lmaWNhbGx5LCBpdCBzdGF0ZXMgdGhhdCBtb2RpZmljYXRpb25zIGNvbmZpbmVkIHRvICYjMzQ7Tm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlcyYjMzQ7IG9yICYjMzQ7VXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cy4uLiB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMmIzM0OyB3YXJyYW50IGEgYFdvcnRoRnV6emluZz1mYWxzZWAgdmVyZGljdC4KCkZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgc2NvcGUuIE15IGFuYWx5c2lzIGNvbmZpcm1zIHRoZSBhYnNlbmNlIG9mIGNoYW5nZXMgb3V0c2lkZSB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5LiBObyB0b3VjaGluZyBvZiBjcml0aWNhbCBrZXJuZWwgY29tcG9uZW50cyBsaWtlIGBrZXJuZWwvYCwgYG5ldC9gLCBgZHJpdmVycy9gLCBgaW5jbHVkZS9gLCBgYXJjaC9gLCBgZnMvYCwgb3IgYG1tL2AgaXMgcHJlc2VudC4gQWxsIG1vZGlmaWNhdGlvbnMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC4KCkdpdmVuIHRoaXMsIHRoZSBwYXRjaCBleGNsdXNpdmVseSBhbHRlcnMgdXNlci1zcGFjZSB0b29scyBhbmQgYXNzb2NpYXRlZCBzZWxmdGVzdHMuIEFjY29yZGluZyB0byB0aGUgY3JpdGVyaWEsIHRoaXMgZGVmaW5pdGl2ZWx5IGZhbGxzIHVuZGVyIHRoZSAmIzM0O1dvcnRoRnV6emluZz1mYWxzZSYjMzQ7IGNhdGVnb3J5LiBUaGVyZWZvcmUsIEkmIzM5O20gZ29pbmcgdG8gc2V0IGBXb3J0aEZ1enppbmdgIHRvIGBmYWxzZWAuCgpUaGUgcmVhc29uaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZDogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xzIChgdG9vbHMvYnBmL2JwZnRvb2wvYCkgYW5kIHNlbGZ0ZXN0cyAoYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ApLCBhbmQgZG9lcyBub3QgYWx0ZXIgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDsgTm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZsYWdzIGFyZSBuZWVkZWQsIHNvIGBFbmFibGVDb25maWdzYCBhbmQgYEZvY3VzU3ltYm9sc2Agd2lsbCBiZSBlbXB0eS4gSSYjMzk7bSByZWFkeSB0byBwcm9jZWVkIHdpdGggdGhlIGBzZXQtcmVzdWx0c2AgY2FsbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwNjozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFtdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHVzZXItc3BhY2UgdG9vbHMgKGJwZnRvb2wpIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwtc3BhY2UgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsLXNwYWNlIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAwNjozNDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDdUMDY6MzQ6NDAuNTU5MzIxOTU1WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjI4MTQ1MjUyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHVzZXItc3BhY2UgdG9vbHMgKGJwZnRvb2wpIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwtc3BhY2UgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjozNDo0MC41NTkzMzkwODVaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzODQ0OTQ0ODcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA3OGY3NmJhNzQ3MzFjMzI5NmNmZDdkN2Y3NjllYTJjODczNmYwMWY2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMDY6MzQ6MzggMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3QgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLjIzZmFhNjcyNjg1ODcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxcbkBAIC0xNiw3ICsxNiw4IEBAIFNZTk9QU0lTXFxuIFxcbiAqKmJwZnRvb2wqKiBbKk9QVElPTlMqXSAqKm1hcCoqICpDT01NQU5EKlxcbiBcXG4tKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8IHsgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IH1cXG4rKk9QVElPTlMqIDo9IHsgfENPTU1PTl9PUFRJT05TfCB8IHsgKiotZioqIHwgKiotLWJwZmZzKiogfSB8XFxuK3sgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XFxuIFxcbiAqQ09NTUFORFMqIDo9XFxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxcbkBAIC0xNzAsNiArMTcxLDI1IEBAIE9QVElPTlNcXG4gICAgIERvIG5vdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gbW91bnQgYW55IHZpcnR1YWwgZmlsZSBzeXN0ZW0gKHN1Y2ggYXNcXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxcbiBcXG4rLXIsIC0tcmVjdXJzaXZlXFxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxcbisgICAgZW50cmllcyB3aGVuIHJ1bm5pbmcgKiptYXAgZHVtcCoqLiBFYWNoIG1hcCBJRCBpcyB2aXNpdGVkIG9uY2UsIGV2ZW4gaWZcXG4rICAgIHNldmVyYWwgZW50cmllcyByZWZlciB0byBpdC4gU2VsZWN0ZWQgbWFwcyBhcmUgZm9sbG93ZWQgYnkgdGhlaXIgaW5uZXIgbWFwcy5cXG4rXFxuKyAgICBQbGFpbiBvdXRwdXQgaW5jbHVkZXMgYSBoZWFkZXIgaWRlbnRpZnlpbmcgZWFjaCBtYXAuIE9uIHN1Y2Nlc3MsIEpTT04gb3V0cHV0XFxuKyAgICBpcyBhbHdheXMgYW4gYXJyYXkgb2YgbWFwIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyBhbiAqKmlkKiogYW5kIGFuXFxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXFxuKyAgICByZXRhaW4gdGhlaXIgKippbm5lcl9tYXBfaWQqKiBmaWVsZCwgd2hpY2ggaWRlbnRpZmllcyB0aGUgY29ycmVzcG9uZGluZyBpbm5lclxcbisgICAgbWFwIG9iamVjdC5cXG4rXFxuKyAgICBJbm5lciBtYXAgSURzIGFyZSByZXNvbHZlZCB3aGVuIHRoZSBtYXBzIGFyZSB2aXNpdGVkLiBUaGUgZHVtcCBpcyBub3QgYW5cXG4rICAgIGF0b21pYyBzbmFwc2hvdDogY29uY3VycmVudCB1cGRhdGVzIGNhbiBjaGFuZ2UgbWFwIGNvbnRlbnRzIG9yIHJlbW92ZSBhXFxuKyAgICByZWZlcmVuY2VkIGlubmVyIG1hcCBiZWZvcmUgaXQgaXMgdmlzaXRlZC4gRmFpbHVyZSB0byBvcGVuIGEgcmVmZXJlbmNlZFxcbisgICAgaW5uZXIgbWFwIHN0b3BzIHRoZSBkdW1wIGFuZCByZXR1cm5zIGEgbm9uemVybyBleGl0IHN0YXR1cy4gT3V0cHV0IG1heVxcbisgICAgY29udGFpbiBtYXBzIG9yIGVudHJpZXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yLlxcbitcXG4rICAgIEluIEpTT04gbW9kZSwgdGhlIGVuY2xvc2luZyBhcnJheXMgYW5kIG9iamVjdHMgYXJlIGNsb3NlZCBiZWZvcmUgcmV0dXJuaW5nLlxcbitcXG4gRVhBTVBMRVNcXG4gPT09PT09PT1cXG4gKiojIGJwZnRvb2wgbWFwIHNob3cqKlxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuaW5kZXggNzVjYmNiNTEyZWJhZS4uNDVjMzM2ZDYzYmUwYSAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXFxuQEAgLTI2MSw3ICsyNjEsNyBAQCBfYnBmdG9vbCgpXFxuIFxcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xcbiAgICAgaWYgW1sgJHt3b3Jkc1tjd29yZF19ID09IC0qIF1dOyB0aGVuXFxuLSAgICAgICAgbG9jYWwgYz0nLS12ZXJzaW9uIC0tanNvbiAtLXByZXR0eSAtLWJwZmZzIC0tbWFwY29tcGF0IC0tZGVidWcgXFxcXFxcbisgICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1yZWN1cnNpdmUgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXFxcXG4gICAgICAgICAgICAgLS11c2UtbG9hZGVyIC0tYmFzZS1idGYgLS1zaWduIC1pIC1rJ1xcbiAgICAgICAgIENPTVBSRVBMWT0oICQoIGNvbXBnZW4gLVcgXFxcIiRjXFxcIiAtLSBcXFwiJGN1clxcXCIgKSApXFxuICAgICAgICAgcmV0dXJuIDBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5jXFxuaW5kZXggYzkxZTFhNmUxYTFlYy4uNDI0YWY0YTQ5NmE1YyAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcXG5AQCAtMjYsNiArMjYsNyBAQCBzdGF0aWMgaW50ICgqbGFzdF9kb19oZWxwKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpO1xcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gYm9vbCBwcmV0dHlfb3V0cHV0O1xcbiBib29sIGpzb25fb3V0cHV0O1xcbitib29sIHJlY3Vyc2l2ZV9kdW1wO1xcbiBib29sIHNob3dfcGlubmVkO1xcbiBib29sIGJsb2NrX21vdW50O1xcbiBib29sIHZlcmlmaWVyX2xvZ3M7XFxuQEAgLTQ1Miw2ICs0NTMsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdHsgXFxcImpzb25cXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J2onIH0sXFxuIFxcdFxcdHsgXFxcImhlbHBcXFwiLFxcdG5vX2FyZ3VtZW50LFxcdE5VTEwsXFx0J2gnIH0sXFxuIFxcdFxcdHsgXFxcInByZXR0eVxcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQncCcgfSxcXG4rXFx0XFx0eyBcXFwicmVjdXJzaXZlXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdyJyB9LFxcbiBcXHRcXHR7IFxcXCJ2ZXJzaW9uXFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdWJyB9LFxcbiBcXHRcXHR7IFxcXCJicGZmc1xcXCIsXFx0bm9fYXJndW1lbnQsXFx0TlVMTCxcXHQnZicgfSxcXG4gXFx0XFx0eyBcXFwibWFwY29tcGF0XFxcIixcXHRub19hcmd1bWVudCxcXHROVUxMLFxcdCdtJyB9LFxcbkBAIC00ODUsNyArNDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRiaW5fbmFtZSA9IFxcXCJicGZ0b29sXFxcIjtcXG4gXFxuIFxcdG9wdGVyciA9IDA7XFxuLVxcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXFxcIlZocGpmTG1uZFNpOms6QjpsXFxcIixcXG4rXFx0d2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCBcXFwiVmhwanJmTG1uZFNpOms6QjpsXFxcIixcXG4gXFx0XFx0XFx0XFx0ICBvcHRpb25zLCBOVUxMKSkgXFx1MDAzZT0gMCkge1xcbiBcXHRcXHRzd2l0Y2ggKG9wdCkge1xcbiBcXHRcXHRjYXNlICdWJzpcXG5AQCAtNTA3LDYgKzUwOSw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0XFx0XFx0fVxcbiBcXHRcXHRcXHRqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpO1xcbiBcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y2FzZSAncic6XFxuK1xcdFxcdFxcdHJlY3Vyc2l2ZV9kdW1wID0gdHJ1ZTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ2YnOlxcbiBcXHRcXHRcXHRzaG93X3Bpbm5lZCA9IHRydWU7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcXG5pbmRleCA3OGI2ZTBlYmI4NWQ4Li43NjYyNjY0MmU5NGNiIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbkBAIC04Myw2ICs4Myw3IEBAIGV4dGVybiBjb25zdCBjaGFyICpiaW5fbmFtZTtcXG4gXFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcXG4gZXh0ZXJuIGJvb2wganNvbl9vdXRwdXQ7XFxuK2V4dGVybiBib29sIHJlY3Vyc2l2ZV9kdW1wO1xcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcXG4gZXh0ZXJuIGJvb2wgc2hvd19waWRzO1xcbiBleHRlcm4gYm9vbCBibG9ja19tb3VudDtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbmluZGV4IDY4NGE4ZmI3MjQxNDYuLmM0MDBiMTVmMTZkZDIgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xcbkBAIC0xNyw2ICsxNyw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnBmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvYnRmLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NicGYvaGFzaG1hcC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcImpzb25fd3JpdGVyLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJtYWluLmhcXFwiXFxuQEAgLTgyNiwxMiArODI3LDQ0IEBAIHN0YXRpYyB2b2lkIGZyZWVfbWFwX2t2X2J0ZihzdHJ1Y3QgYnRmICpidGYpXFxuIFxcdFxcdGJ0Zl9fZnJlZShidGYpO1xcbiB9XFxuIFxcbitzdHJ1Y3QgbWFwX2R1bXBfY3R4IHtcXG4rXFx0c3RydWN0IGhhc2htYXAgKnNlZW47XFxuK1xcdF9fdTMyICpwZW5kaW5nX2lkcztcXG4rXFx0c2l6ZV90IHBlbmRpbmdfY250O1xcbit9O1xcbitcXG4rc3RhdGljIGludCBjb2xsZWN0X2lubmVyX21hcChzdHJ1Y3QgbWFwX2R1bXBfY3R4ICpjdHgsIF9fdTMyIGlkKVxcbit7XFxuK1xcdF9fdTMyICppZHM7XFxuK1xcdGludCBlcnI7XFxuK1xcbitcXHRpZiAoaGFzaG1hcF9fZmluZChjdHgtXFx1MDAzZXNlZW4sIGlkLCBOVUxMKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRpZHMgPSBsaWJicGZfcmVhbGxvY2FycmF5KGN0eC1cXHUwMDNlcGVuZGluZ19pZHMsIGN0eC1cXHUwMDNlcGVuZGluZ19jbnQgKyAxLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZigqaWRzKSk7XFxuK1xcdGlmICghaWRzKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJtZW0gYWxsb2MgZmFpbGVkXFxcIik7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXHRjdHgtXFx1MDAzZXBlbmRpbmdfaWRzID0gaWRzO1xcbitcXG4rXFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC1cXHUwMDNlc2VlbiwgaWQsIDApO1xcbitcXHRpZiAoZXJyKSB7XFxuK1xcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcXFwiLCBpZCwgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFx0aWRzW2N0eC1cXHUwMDNlcGVuZGluZ19jbnQrK10gPSBpZDtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnRcXG4gbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuLVxcdCBib29sIHNob3dfaGVhZGVyKVxcbitcXHQgYm9vbCBzaG93X2hlYWRlciwgc3RydWN0IG1hcF9kdW1wX2N0eCAqY3R4KVxcbiB7XFxuIFxcdHZvaWQgKmtleSwgKnZhbHVlLCAqcHJldl9rZXk7XFxuIFxcdHVuc2lnbmVkIGludCBudW1fZWxlbXMgPSAwO1xcbitcXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcXG4gXFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcXG4gXFx0aW50IGVycjtcXG4gXFxuQEAgLTg0NSw2ICs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcbiBcXHRwcmV2X2tleSA9IE5VTEw7XFxuIFxcbitcXHRpZiAoY3R4IFxcdTAwMjZcXHUwMDI2ICF3dHIgXFx1MDAyNlxcdTAwMjYgKGluZm8tXFx1MDAzZWJ0Zl92YWx1ZV90eXBlX2lkIHx8XFxuK1xcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VidGZfdm1saW51eF92YWx1ZV90eXBlX2lkKSkge1xcbitcXHRcXHRwbGFpbl9idGZfd3RyID0gZ2V0X2J0Zl93cml0ZXIoKTtcXG4rXFx0XFx0aWYgKHBsYWluX2J0Zl93dHIpIHtcXG4rXFx0XFx0XFx0aWYgKHNob3dfaGVhZGVyKVxcbitcXHRcXHRcXHRcXHRzaG93X21hcF9oZWFkZXJfcGxhaW4oaW5mbyk7XFxuK1xcdFxcdFxcdHNob3dfaGVhZGVyID0gZmFsc2U7XFxuK1xcdFxcdFxcdHd0ciA9IHBsYWluX2J0Zl93dHI7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4gXFx0aWYgKHd0cikge1xcbiBcXHRcXHRlcnIgPSBnZXRfbWFwX2t2X2J0ZihpbmZvLCBcXHUwMDI2YnRmKTtcXG4gXFx0XFx0aWYgKGVycikge1xcbkBAIC04NzQsMTAgKzkxOCwyMCBAQCBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcXG4gXFx0XFx0aWYgKGVycikge1xcbiBcXHRcXHRcXHRpZiAoZXJybm8gPT0gRU5PRU5UKVxcbiBcXHRcXHRcXHRcXHRlcnIgPSAwO1xcbitcXHRcXHRcXHRlbHNlIGlmIChjdHgpXFxuK1xcdFxcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBpbmZvLVxcdTAwM2VpZCwgc3RyZXJyb3IoZXJybm8pKTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH1cXG4tXFx0XFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXFxuK1xcdFxcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcXG4rXFx0XFx0aWYgKCFlcnIpIHtcXG4gXFx0XFx0XFx0bnVtX2VsZW1zKys7XFxuK1xcdFxcdFxcdGlmIChjdHggXFx1MDAyNlxcdTAwMjYgbWFwX2lzX21hcF9vZl9tYXBzKGluZm8tXFx1MDAzZXR5cGUpKSB7XFxuK1xcdFxcdFxcdFxcdGVyciA9IGNvbGxlY3RfaW5uZXJfbWFwKGN0eCwgKihfX3UzMiAqKXZhbHVlKTtcXG4rXFx0XFx0XFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbiBcXHRcXHRwcmV2X2tleSA9IGtleTtcXG4gXFx0fVxcbiBcXG5AQCAtODk0LDE4ICs5NDgsMjUgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXFxuIFxcdGZyZWUoa2V5KTtcXG4gXFx0ZnJlZSh2YWx1ZSk7XFxuIFxcdGZyZWVfbWFwX2t2X2J0ZihidGYpO1xcbitcXHRpZiAocGxhaW5fYnRmX3d0cilcXG4rXFx0XFx0anNvbndfZGVzdHJveShcXHUwMDI2cGxhaW5fYnRmX3d0cik7XFxuIFxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiB7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9nZXRfZmRfYnlfaWRfb3B0cywgb3B0cyxcXG4rXFx0XFx0ICAgIC5vcGVuX2ZsYWdzID0gQlBGX0ZfUkRPTkxZLFxcbitcXHQpO1xcbiBcXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XFxuIFxcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRzdHJ1Y3QgbWFwX2R1bXBfY3R4IGN0eCA9IHt9O1xcbiBcXHRpbnQgbmJfZmRzLCBpID0gMDtcXG4gXFx0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xcbiBcXHRpbnQgKmZkcyA9IE5VTEw7XFxuIFxcdGludCBlcnIgPSAtMTtcXG4rXFx0c2l6ZV90IGo7XFxuIFxcbiBcXHRpZiAoYXJnYyAhPSAyKVxcbiBcXHRcXHR1c2FnZSgpO1xcbkBAIC05MTksOSArOTgwLDM0IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGlmIChuYl9mZHMgXFx1MDAzYyAxKVxcbiBcXHRcXHRnb3RvIGV4aXRfZnJlZTtcXG4gXFxuK1xcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xcbitcXHRcXHRjdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsXFxuK1xcdFxcdFxcdFxcdFxcdGVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpO1xcbitcXHRcXHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xcbitcXHRcXHRcXHRjdHguc2VlbiA9IE5VTEw7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJmYWlsZWQgdG8gY3JlYXRlIGhhc2htYXAgZm9yIHJlY3Vyc2l2ZSBkdW1wXFxcIik7XFxuK1xcdFxcdFxcdGdvdG8gZXhpdF9jbG9zZTtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBSZWNvcmQgdGhlIHNlbGVjdGVkIG1hcHMgYmVmb3JlIGRpc2NvdmVyaW5nIGFueSBpbm5lciBtYXBzLiAqL1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspIHtcXG4rXFx0XFx0XFx0bGVuID0gc2l6ZW9mKGluZm8pO1xcbitcXHRcXHRcXHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFxcdTAwMjZpbmZvLCBcXHUwMDI2bGVuKSkge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiY2FuJ3QgZ2V0IG1hcCBpbmZvOiAlc1xcXCIsIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdFxcdFxcdGVyciA9IC0xO1xcbitcXHRcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTtcXG4rXFx0XFx0XFx0aWYgKGVycikge1xcbitcXHRcXHRcXHRcXHRwX2VycihcXFwiZmFpbGVkIHRvIHJlY29yZCBtYXAgaWQgJXU6ICVzXFxcIiwgaW5mby5pZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xcbitcXHRcXHRcXHRcXHRnb3RvIGV4aXRfY2xvc2U7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbiBcXHRpZiAoanNvbl9vdXRwdXQpIHtcXG4gXFx0XFx0d3RyID0ganNvbl93dHI7XFxuLVxcdH0gZWxzZSB7XFxuK1xcdH0gZWxzZSBpZiAoIXJlY3Vyc2l2ZV9kdW1wKSB7XFxuIFxcdFxcdGludCBkb19wbGFpbl9idGY7XFxuIFxcbiBcXHRcXHRkb19wbGFpbl9idGYgPSBtYXBzX2hhdmVfYnRmKGZkcywgbmJfZmRzKTtcXG5AQCAtOTM2LDcgKzEwMjIsNyBAQCBzdGF0aWMgaW50IGRvX2R1bXAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRcXHR9XFxuIFxcdH1cXG4gXFxuLVxcdGlmICh3dHIgXFx1MDAyNlxcdTAwMjYgbmJfZmRzIFxcdTAwM2UgMSlcXG4rXFx0aWYgKHd0ciBcXHUwMDI2XFx1MDAyNiAobmJfZmRzIFxcdTAwM2UgMSB8fCByZWN1cnNpdmVfZHVtcCkpXFxuIFxcdFxcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XFx0Lyogcm9vdCBhcnJheSAqL1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspIHtcXG4gXFx0XFx0aWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQoZmRzW2ldLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbikpIHtcXG5AQCAtOTQ0LDIyICsxMDMwLDUwIEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdFxcdGVyciA9IC0xO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbi1cXHRcXHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFxcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcXHUwMDNlIDEpO1xcbitcXHRcXHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFxcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXAsXFxuK1xcdFxcdFxcdCAgICAgICByZWN1cnNpdmVfZHVtcCA/IFxcdTAwMjZjdHggOiBOVUxMKTtcXG4gXFx0XFx0aWYgKCF3dHIgXFx1MDAyNlxcdTAwMjYgaSAhPSBuYl9mZHMgLSAxKVxcbiBcXHRcXHRcXHRwcmludGYoXFxcIlxcXFxuXFxcIik7XFxuIFxcbiBcXHRcXHRpZiAoZXJyKVxcbiBcXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0Y2xvc2UoZmRzW2ldKTtcXG4rXFx0XFx0LyogS2VlcCBzZWxlY3RlZCBtYXBzIGFsaXZlIHdoaWxlIHZpc2l0aW5nIHRoZWlyIGlubmVyIG1hcHMuICovXFxuK1xcdFxcdGlmICghcmVjdXJzaXZlX2R1bXApXFxuK1xcdFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdH1cXG4rXFx0Zm9yIChqID0gMDsgIWVyciBcXHUwMDI2XFx1MDAyNiBqIFxcdTAwM2MgY3R4LnBlbmRpbmdfY250OyBqKyspIHtcXG4rXFx0XFx0aW50IGZkO1xcbitcXG4rXFx0XFx0ZmQgPSBicGZfbWFwX2dldF9mZF9ieV9pZF9vcHRzKGN0eC5wZW5kaW5nX2lkc1tqXSwgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdHBfZXJyKFxcXCJjYW4ndCBvcGVuIGlubmVyIG1hcCBpZCAldTogJXNcXFwiLFxcbitcXHRcXHRcXHQgICAgICBjdHgucGVuZGluZ19pZHNbal0sIHN0cmVycm9yKGVycm5vKSk7XFxuK1xcdFxcdFxcdGVyciA9IC0xO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXHRcXHRsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcdFxcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbikpIHtcXG4rXFx0XFx0XFx0cF9lcnIoXFxcImNhbid0IGdldCBtYXAgaW5mbzogJXNcXFwiLCBzdHJlcnJvcihlcnJubykpO1xcbitcXHRcXHRcXHRlcnIgPSAtMTtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0aWYgKCF3dHIpXFxuK1xcdFxcdFxcdFxcdHByaW50ZihcXFwiXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0ZXJyID0gbWFwX2R1bXAoZmQsIFxcdTAwMjZpbmZvLCB3dHIsIHRydWUsIFxcdTAwMjZjdHgpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGNsb3NlKGZkKTtcXG4gXFx0fVxcbi1cXHRpZiAod3RyIFxcdTAwMjZcXHUwMDI2IG5iX2ZkcyBcXHUwMDNlIDEpXFxuK1xcdGlmICh3dHIgXFx1MDAyNlxcdTAwMjYgKG5iX2ZkcyBcXHUwMDNlIDEgfHwgcmVjdXJzaXZlX2R1bXApKVxcbiBcXHRcXHRqc29ud19lbmRfYXJyYXkod3RyKTtcXHQvKiByb290IGFycmF5ICovXFxuIFxcbiBcXHRpZiAoYnRmX3d0cilcXG4gXFx0XFx0anNvbndfZGVzdHJveShcXHUwMDI2YnRmX3d0cik7XFxuIGV4aXRfY2xvc2U6XFxuK1xcdGlmIChyZWN1cnNpdmVfZHVtcClcXG4rXFx0XFx0aSA9IDA7XFxuIFxcdGZvciAoOyBpIFxcdTAwM2MgbmJfZmRzOyBpKyspXFxuIFxcdFxcdGNsb3NlKGZkc1tpXSk7XFxuK1xcdGhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pO1xcbitcXHRmcmVlKGN0eC5wZW5kaW5nX2lkcyk7XFxuIGV4aXRfZnJlZTpcXG4gXFx0ZnJlZShmZHMpO1xcbiBcXHRmcmVlX2J0Zl92bWxpbnV4KCk7XFxuQEAgLTE0ODQsNyArMTU5OCw3IEBAIHN0YXRpYyBpbnQgZG9faGVscChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdFxcXCIgICAgICAgICAgICAgICAgIHRhc2tfc3RvcmFnZSB8IGJsb29tX2ZpbHRlciB8IHVzZXJfcmluZ2J1ZiB8IGNncnBfc3RvcmFnZSB8IGFyZW5hIHxcXFxcblxcXCJcXG4gXFx0XFx0XFxcIiAgICAgICAgICAgICAgICAgaW5zbl9hcnJheSB8IHJoYXNoIH1cXFxcblxcXCJcXG4gXFx0XFx0XFxcIiAgICAgICBcXFwiIEhFTFBfU1BFQ19PUFRJT05TIFxcXCIgfFxcXFxuXFxcIlxcbi1cXHRcXHRcXFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB9XFxcXG5cXFwiXFxuK1xcdFxcdFxcXCIgICAgICAgICAgICAgICAgICAgIHstZnwtLWJwZmZzfSB8IHstbnwtLW5vbW91bnR9IHwgey1yfC0tcmVjdXJzaXZlfSB9XFxcXG5cXFwiXFxuIFxcdFxcdFxcXCJcXFwiLFxcbiBcXHRcXHRiaW5fbmFtZSwgYXJndlstMl0pO1xcbiBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi45Yzg4NzQzYThmODQyXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2JwZnRvb2xfbWFwX2R1bXAuY1xcbkBAIC0wLDAgKzEsNDY1IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZnRvb2xfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2J0Zi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3Jlc291cmNlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NkaXJlbnQuaFxcdTAwM2VcXG4rXFxuKyNkZWZpbmUgT1VUUFVUX1NJWkUgODE5MlxcbitcXG4rc3RhdGljIGJvb2wgZHVtcF9tYXAoX191MzIgaWQsIGNvbnN0IGNoYXIgKm9wdGlvbnMsIGNoYXIgKm91dHB1dClcXG4re1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XFxuK1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCIlcyBtYXAgZHVtcCBpZCAldVxcXCIsIG9wdGlvbnMsIGlkKTtcXG4rXFx0bWVtc2V0KG91dHB1dCwgMCwgT1VUUFVUX1NJWkUpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwiZHVtcF9tYXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHQvKiBUaGUgaGVscGVyIGRvZXNuJ3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovXFxuK1xcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXFxcIlxcXFxuXFxcIildID0gJ1xcXFwwJztcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuK3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xcbitcXHRfX3UzMiBsZW4gPSBzaXplb2YoaW5mbyk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmxlbiksIFxcXCJtYXBfaW5mb1xcXCIpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0cmV0dXJuIGluZm8uaWQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgY291bnRfdG9rZW4oY29uc3QgY2hhciAqb3V0cHV0LCBjb25zdCBjaGFyICp0b2tlbilcXG4re1xcbitcXHRpbnQgY291bnQgPSAwO1xcbitcXG4rXFx0d2hpbGUgKChvdXRwdXQgPSBzdHJzdHIob3V0cHV0LCB0b2tlbikpKSB7XFxuK1xcdFxcdGNvdW50Kys7XFxuK1xcdFxcdG91dHB1dCArPSBzdHJsZW4odG9rZW4pO1xcbitcXHR9XFxuK1xcdHJldHVybiBjb3VudDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgY2hlY2tfcGxhaW4oX191MzIgcm9vdF9pZCwgX191MzIgaW5uZXJfaWQsIGNvbnN0IGNoYXIgKnR5cGUsXFxuK1xcdFxcdFxcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxcbit7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XFxuK1xcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjb25zdCBjaGFyICpyb290LCAqaW5uZXI7XFxuK1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVxcXCIsIHJvb3RfaWQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIHNpemVvZihvdXRwdXQpIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwicGxhaW5fZHVtcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXFxcIiwgcm9vdF9pZCwgdHlwZSk7XFxuK1xcdHJvb3QgPSBzdHJzdHIob3V0cHV0LCBoZWFkZXIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXFxcInBsYWluX3Jvb3RfaGVhZGVyXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFxcXCJwbGFpbl9yb290X2ZpcnN0XFxcIik7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFxcXCJpbm5lcl9tYXBfaWQ6XFxcIiksIGVudHJpZXMsIFxcXCJwbGFpbl9yZWZlcmVuY2VzXFxcIik7XFxuK1xcdGlmIChlbnRyaWVzKSB7XFxuK1xcdFxcdHNucHJpbnRmKGhlYWRlciwgc2l6ZW9mKGhlYWRlciksIFxcXCIldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdFxcdGlubmVyID0gc3Ryc3RyKG91dHB1dCwgaGVhZGVyKTtcXG4rXFx0XFx0aWYgKEFTU0VSVF9PS19QVFIoaW5uZXIsIFxcXCJwbGFpbl9pbm5lcl9oZWFkZXJcXFwiKSlcXG4rXFx0XFx0XFx0QVNTRVJUX0dUKGlubmVyIC0gcm9vdCwgMCwgXFxcInBsYWluX2lubmVyX2FmdGVyX3Jvb3RcXFwiKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dHB1dCwgaGVhZGVyKSwgMSwgXFxcInBsYWluX2lubmVyX29uY2VcXFwiKTtcXG4rXFx0fVxcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcXFwiRm91bmQgXFxcIiksIGVudHJpZXMgXFx1MDAyNlxcdTAwMjYgIXR5cGVkID8gMiA6IDEsXFxuK1xcdFxcdCAgXFxcInBsYWluX21hcF9jb3VudFxcXCIpO1xcbitcXHRpZiAodHlwZWQpIHtcXG4rXFx0XFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBcXFwiXFxcXFxcXCJrZXlcXFxcXFxcIjogMFxcXCIsIFxcXCJwbGFpbl9idGZfa2V5XFxcIik7XFxuK1xcdFxcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgXFxcIlxcXFxcXFwidmFsdWVcXFxcXFxcIjogMTY4NDMwMDlcXFwiLCBcXFwicGxhaW5fYnRmX3ZhbHVlXFxcIik7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdGVzdF9vdXRlcihlbnVtIGJwZl9tYXBfdHlwZSB0eXBlLCBpbnQgZW50cmllcywgYm9vbCBlbXB0eV9pbm5lcixcXG4rXFx0XFx0ICAgICAgIGJvb2wgdHlwZWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIGlubmVyX29wdHMpO1xcbitcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbitcXHRjaGFyIG91dGVyW09VVFBVVF9TSVpFXSwgaW5uZXJbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHJlZmVyZW5jZVs2NF07XFxuK1xcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xcbitcXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMTtcXG4rXFx0X191MzIgcm9vdF9pZCwgaW5uZXJfaWQsIGtleSwgdmFsdWUgPSAweDAxMDEwMTAxO1xcbitcXG4rXFx0aWYgKHR5cGVkKSB7XFxuK1xcdFxcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFxcXCJjcmVhdGVfYnRmXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfRVEoYnRmX19hZGRfaW50KGJ0ZiwgXFxcInVuc2lnbmVkIGludFxcXCIsIDQsIDApLCAxLCBcXFwiYnRmX2ludFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcXFwibG9hZF9idGZcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xcbitcXHRcXHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XFxuK1xcdFxcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xcbitcXHR9XFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2lubmVyXFxcIiwgc2l6ZW9mKGtleSksXFxuK1xcdFxcdFxcdFxcdCAgc2l6ZW9mKHZhbHVlKSwgMiwgXFx1MDAyNmlubmVyX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXFxcImNyZWF0ZV9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0a2V5ID0gMDtcXG4rXFx0aWYgKCFlbXB0eV9pbm5lciBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGlubmVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxcbitcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX2lubmVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xcbitcXHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKHR5cGUsIFxcXCJkdW1wX291dGVyXFxcIiwgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXFxuK1xcdFxcdFxcdFxcdCAgMywgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0LyogVGhlIHVudXNlZCB0aGlyZCBhcnJheSBzbG90IGFsc28gZXhlcmNpc2VzIGZhaWxlZCBsb29rdXBzLiAqL1xcbitcXHRmb3IgKGtleSA9IDA7IGtleSBcXHUwMDNjIGVudHJpZXM7IGtleSsrKVxcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcXHUwMDI2a2V5LCBcXHUwMDI2aW5uZXJfZmQsIEJQRl9BTlkpLFxcbitcXHRcXHRcXHQgICAgICAgXFxcInBvcHVsYXRlX291dGVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcXG4rXFx0aW5uZXJfaWQgPSBtYXBfaWQoaW5uZXJfZmQpO1xcbitcXHRpZiAoIXJvb3RfaWQgfHwgIWlubmVyX2lkIHx8ICFkdW1wX21hcChyb290X2lkLCBcXFwiLWpcXFwiLCBvdXRlcikgfHxcXG4rXFx0ICAgICFkdW1wX21hcChpbm5lcl9pZCwgXFxcIi1qXFxcIiwgaW5uZXIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9FUShvdXRlclswXSwgJ1snLCBcXFwiZGVmYXVsdF9hcnJheVxcXCIpO1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0ZXIsIFxcXCJcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6XFxcIiksIDAsIFxcXCJkZWZhdWx0X25vX3dyYXBwZXJcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcXFwiXFxcXFxcXCJpZFxcXFxcXFwiOlxcXCIpLCAwLCBcXFwiZGVmYXVsdF9ub19oZWFkZXJcXFwiKTtcXG4rXFx0c25wcmludGYocmVmZXJlbmNlLCBzaXplb2YocmVmZXJlbmNlKSwgXFxcIlxcXFxcXFwiaW5uZXJfbWFwX2lkXFxcXFxcXCI6JXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgcmVmZXJlbmNlKSwgZW50cmllcywgXFxcImRlZmF1bHRfcmVmZXJlbmNlc1xcXCIpO1xcbitcXHRpZiAoIWVudHJpZXMpXFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRlciwgXFxcIltdXFxcIiwgXFxcImVtcHR5X291dGVyX2RlZmF1bHRcXFwiKTtcXG4rXFx0aWYgKGVtcHR5X2lubmVyKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsIFxcXCJbXVxcXCIsIFxcXCJlbXB0eV9pbm5lcl9kZWZhdWx0XFxcIik7XFxuK1xcdGVsc2UgaWYgKHR5cGVkKVxcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgXFxcIlxcXFxcXFwiZm9ybWF0dGVkXFxcXFxcXCI6e1xcXFxcXFwia2V5XFxcXFxcXCI6MCxcXFxcXFxcInZhbHVlXFxcXFxcXCI6MTY4NDMwMDl9XFxcIixcXG4rXFx0XFx0XFx0XFx0ICBcXFwidHlwZWRfaW5uZXJcXFwiKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRBU1NFUlRfU1RSRVEoaW5uZXIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIlt7XFxcXFxcXCJrZXlcXFxcXFxcIjpbXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCIsXFxcXFxcXCIweDAwXFxcXFxcXCJdLFxcXCJcXG4rXFx0XFx0XFx0ICAgICBcXFwiXFxcXFxcXCJ2YWx1ZVxcXFxcXFwiOltcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIixcXFxcXFxcIjB4MDFcXFxcXFxcIl19XVxcXCIsXFxuK1xcdFxcdFxcdCAgICAgXFxcIm9yZGluYXJ5X2RlZmF1bHRcXFwiKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIENvbXBhcmUgdGhlIGNvbXBsZXRlIEpTT04gZG9jdW1lbnQ6IGEgZmxhdCBhcnJheSB3aXRoIHRoZSByb290IGZpcnN0LFxcbitcXHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXFxuK1xcdCAqL1xcbitcXHRpZiAoZW50cmllcylcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9LHtcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9pbm5lclxcXFxcXFwiLFxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIixcXG4rXFx0XFx0XFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiZHVtcF9vdXRlclxcXFxcXFwiLFxcXCJcXG4rXFx0XFx0XFx0IFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6W119XVxcXCIsIHJvb3RfaWQsIHR5cGVfbmFtZSk7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV9qc29uXFxcIik7XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLS1qc29uIC0tcmVjdXJzaXZlXFxcIiwgb3V0cHV0KSlcXG4rXFx0XFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFxcXCJyZWN1cnNpdmVfbG9uZ19vcHRpb25zXFxcIik7XFxuK1xcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcXG4rXFxuK1xcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cXG4rXFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJoYXNoXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX2lubmVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc31dXFxcIiwgaW5uZXJfaWQsIGlubmVyKTtcXG4rXFx0aWYgKGR1bXBfbWFwKGlubmVyX2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcIm9yZGluYXJ5X3JlY3Vyc2l2ZVxcXCIpO1xcbitvdXQ6XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK1xcdGJ0Zl9fZnJlZShidGYpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X211bHRpcGxlX3Jvb3RzKHZvaWQpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcXG4rXFx0Y2hhciBvdXRwdXRbT1VUUFVUX1NJWkVdID0ge30sIGV4cGVjdGVkW09VVFBVVF9TSVpFICogNF0sIGVsZW1lbnRzW09VVFBVVF9TSVpFXTtcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0eXBlc1tdID0geyBcXFwiaGFzaFxcXCIsIFxcXCJhcnJheV9vZl9tYXBzXFxcIiwgXFxcImhhc2hfb2ZfbWFwc1xcXCIsIFxcXCJoYXNoXFxcIiB9O1xcbitcXHRpbnQgZmRzW10gPSB7IC0xLCAtMSwgLTEsIC0xIH07XFxuK1xcdF9fdTMyIGlkc1s0XSwga2V5O1xcbitcXHRpbnQgaSwgbGVuID0gMDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFNlbGVjdCB0aGUgZmlyc3QgaW5uZXIgbWFwIGFuZCBib3RoIG91dGVycyBhcyByb290cy4gVGhlIG90aGVyIGlubmVyXFxuK1xcdCAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmRcXG4rXFx0ICogd2hpbGUgZHVtcGluZyB0aGUgZmlyc3Qgb3V0ZXIuIEEgcHJvY2Vzcy1zcGVjaWZpYyBuYW1lIGF2b2lkcyBvdGhlclxcbitcXHQgKiB0ZXN0cycgbWFwcyBqb2luaW5nIHRoZSBzZWxlY3Rpb24uXFxuK1xcdCAqL1xcbitcXHRzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksIFxcXCJkdW1wXyV1XFxcIiwgZ2V0cGlkKCkpO1xcbitcXHRmZHNbMF0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgbmFtZSwgNCwgNCwgMSwgTlVMTCk7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKGZkc1swXSwgXFxcImNyZWF0ZV9zZWxlY3RlZF9pbm5lclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzNdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2Rpc2NvdmVyZWRcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzNdLCBcXFwiY3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gZmRzWzBdO1xcbitcXHRmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFxcXCJjcmVhdGVfYXJyYXlfcm9vdFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sIFxcXCJjcmVhdGVfaGFzaF9yb290XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2M9IDI7IGkrKykge1xcbitcXHRcXHRrZXkgPSAwO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRrZXkgPSAxO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXFx1MDAyNmtleSwgXFx1MDAyNmZkc1szXSwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicmVmZXJlbmNlX2Rpc2NvdmVyZWRfaW5uZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKSB7XFxuK1xcdFxcdGlkc1tpXSA9IG1hcF9pZChmZHNbaV0pO1xcbitcXHRcXHRpZiAoIWlkc1tpXSB8fCAhZHVtcF9tYXAoaWRzW2ldLCBcXFwiLWpcXFwiLCBlbGVtZW50cykpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRsZW4gKz0gc25wcmludGYoZXhwZWN0ZWQgKyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sXFxuK1xcdFxcdFxcdFxcdFxcXCIlc3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCIlc1xcXFxcXFwiLFxcXFxcXFwibmFtZVxcXFxcXFwiOlxcXFxcXFwiJXNcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdFxcdFxcXCJcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9JXNcXFwiLFxcbitcXHRcXHRcXHRcXHRpID8gXFxcIixcXFwiIDogXFxcIltcXFwiLCBpZHNbaV0sIHR5cGVzW2ldLFxcbitcXHRcXHRcXHRcXHRpID09IDMgPyBcXFwiZHVtcF9kaXNjb3ZlcmVkXFxcIiA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcXFwiXVxcXCIgOiBcXFwiXFxcIik7XFxuK1xcdH1cXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiLWogLXIgbWFwIGR1bXAgbmFtZSAlc1xcXCIsIG5hbWUpO1xcbitcXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcXG4rXFx0XFx0ICAgICAgXFxcImR1bXBfbXVsdGlwbGVfcm9vdHNcXFwiKSkge1xcbitcXHRcXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFxcXCJcXFxcblxcXCIpXSA9ICdcXFxcMCc7XFxuK1xcdFxcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcXFwicm9vdHNfZmlyc3RfYW5kX3NlZWRfZGVkdXBcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGZkcyk7IGkrKylcXG4rXFx0XFx0aWYgKGZkc1tpXSBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRjbG9zZShmZHNbaV0pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y2hhciBlbGVtZW50c1tPVVRQVVRfU0laRV0sIG91dHB1dFtPVVRQVVRfU0laRV0sIHJvb3RbT1VUUFVUX1NJWkVdO1xcbitcXHRjaGFyIGV4cGVjdGVkW09VVFBVVF9TSVpFICogM10sIHBsYWluW09VVFBVVF9TSVpFXSA9IHt9O1xcbitcXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XFxuK1xcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBsb29rdXBfZXJybm87XFxuK1xcdF9fdTMyIGlubmVyX2lkLCByb290X2lkLCBrZXkgPSAwLCB2YWx1ZTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJuc1xcbitcXHQgKiBFTk9UU1VQUCAodGhlIGtlcm5lbC1pbnRlcm5hbCBlcnJubykuIENoZWNrIGJvdGggZW50cmllcyBzbyBhblxcbitcXHQgKiBlYXJseSBleGl0IG9uIHRoZSBmaXJzdCBsb29rdXAgZmFpbHVyZSBjYW5ub3QgcGFzcy5cXG4rXFx0ICovXFxuK1xcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX1BFUkZfRVZFTlRfQVJSQVksIFxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFxcbitcXHRcXHRcXHRcXHQgIHNpemVvZihrZXkpLCBzaXplb2YodmFsdWUpLCAyLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdW5yZWFkYWJsZVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFBU1NFUlRfTFQoYnBmX21hcF9sb29rdXBfZWxlbShpbm5lcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNnZhbHVlKSwgMCxcXG4rXFx0XFx0ICAgICAgIFxcXCJ1bnJlYWRhYmxlX2xvb2t1cFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0bG9va3VwX2Vycm5vID0gZXJybm87XFxuK1xcdGlmICghQVNTRVJUX05FUShsb29rdXBfZXJybm8sIEVOT0VOVCwgXFxcInVucmVhZGFibGVfbm90X21pc3NpbmdcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcXG4rXFx0aWYgKCFpbm5lcl9pZCB8fCAhZHVtcF9tYXAoaW5uZXJfaWQsIFxcXCItalxcXCIsIGVsZW1lbnRzKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdEFTU0VSVF9FUShjb3VudF90b2tlbihlbGVtZW50cywgXFxcIlxcXFxcXFwiZXJyb3JcXFxcXFxcIjpcXFwiKSwgMiwgXFxcImRlZmF1bHRfanNvbl9lcnJvcnNcXFwiKTtcXG4rXFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwibWFwIGR1bXAgaWQgJXVcXFwiLCBpbm5lcl9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIHBsYWluLCBzaXplb2YocGxhaW4pIC0gMSksXFxuK1xcdFxcdCAgICAgICBcXFwiZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRBU1NFUlRfRVEoY291bnRfdG9rZW4ocGxhaW4sIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLCBcXFwiZGVmYXVsdF9wbGFpbl9lcnJvcnNcXFwiKTtcXG4rXFx0QVNTRVJUX0hBU19TVUJTVFIocGxhaW4sIFxcXCJGb3VuZCAwIGVsZW1lbnRzXFxcIiwgXFxcImRlZmF1bHRfcGxhaW5fY291bnRcXFwiKTtcXG4rXFxuK1xcdHJvb3RfaWQgPSBpbm5lcl9pZDtcXG4rXFx0aWYgKG91dGVyKSB7XFxuK1xcdFxcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdFxcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIixcXG4rXFx0XFx0XFx0XFx0XFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMSwgXFx1MDAyNm9wdHMpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpIHx8XFxuK1xcdFxcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0ob3V0ZXJfZmQsIFxcdTAwMjZrZXksIFxcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXFxuK1xcdFxcdFxcdCAgICAgICBcXFwicG9wdWxhdGVfb3V0ZXJcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xcbitcXHRcXHRpZiAoIXJvb3RfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFxcXCItalxcXCIsIHJvb3QpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXFxuK1xcdFxcdFxcdCBcXFwiW3tcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJhcnJheV9vZl9tYXBzXFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX291dGVyXFxcXFxcXCIsXFxcIlxcbitcXHRcXHRcXHQgXFxcIlxcXFxcXFwiZmxhZ3NcXFxcXFxcIjowLFxcXFxcXFwiZWxlbWVudHNcXFxcXFxcIjolc30se1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJ0eXBlXFxcXFxcXCI6XFxcXFxcXCJwZXJmX2V2ZW50X2FycmF5XFxcXFxcXCIsXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX3VucmVhZGFibGVcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJmbGFnc1xcXFxcXFwiOjAsXFxcXFxcXCJlbGVtZW50c1xcXFxcXFwiOiVzfV1cXFwiLCByb290X2lkLCByb290LCBpbm5lcl9pZCwgZWxlbWVudHMpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcXG4rXFx0XFx0XFx0IFxcXCJbe1xcXFxcXFwiaWRcXFxcXFxcIjoldSxcXFxcXFxcInR5cGVcXFxcXFxcIjpcXFxcXFxcInBlcmZfZXZlbnRfYXJyYXlcXFxcXFxcIixcXFwiXFxuK1xcdFxcdFxcdCBcXFwiXFxcXFxcXCJuYW1lXFxcXFxcXCI6XFxcXFxcXCJkdW1wX3VucmVhZGFibGVcXFxcXFxcIixcXFxcXFxcImZsYWdzXFxcXFxcXCI6MCxcXFxcXFxcImVsZW1lbnRzXFxcXFxcXCI6JXN9XVxcXCIsXFxuK1xcdFxcdFxcdCBpbm5lcl9pZCwgZWxlbWVudHMpO1xcbitcXHR9XFxuK1xcdGlmIChkdW1wX21hcChyb290X2lkLCBcXFwiLWogLXJcXFwiLCBvdXRwdXQpKVxcbitcXHRcXHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXFxcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX2pzb25cXFwiKTtcXG4rXFx0bWVtc2V0KG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpO1xcbitcXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFxcXCItciBtYXAgZHVtcCBpZCAldVxcXCIsIHJvb3RfaWQpO1xcbitcXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcXG4rXFx0XFx0ICAgICAgXFxcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX3BsYWluXFxcIikpIHtcXG4rXFx0XFx0QVNTRVJUX0hBU19TVUJTVFIob3V0cHV0LCBwbGFpbiwgXFxcInJlY3Vyc2l2ZV9wbGFpbl9wcmVzZXJ2ZXNfZXJyb3JzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLFxcbitcXHRcXHRcXHQgIFxcXCJyZWN1cnNpdmVfcGxhaW5fZXJyb3JzXFxcIik7XFxuK1xcdFxcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFxcXCJGb3VuZCBcXFwiKSwgb3V0ZXIgPyAyIDogMSxcXG4rXFx0XFx0XFx0ICBcXFwicmVjdXJzaXZlX3BsYWluX21hcHNcXFwiKTtcXG4rXFx0fVxcbitvdXQ6XFxuK1xcdGlmIChvdXRlcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShvdXRlcl9mZCk7XFxuK1xcdGlmIChpbm5lcl9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShpbm5lcl9mZCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRlc3RfbWFueV9pbm5lcl9tYXBzKGJvb2wganNvbilcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcXG4rXFx0Y29uc3Qgc3RydWN0IHJsaW1pdCBsaW1pdCA9IHsgLnJsaW1fY3VyID0gMzIsIC5ybGltX21heCA9IDMyIH07XFxuK1xcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgdG9rZW5bNjRdO1xcbitcXHRfX3UzMiBpZHNbNjRdLCByb290X2lkLCBrZXk7XFxuK1xcdGludCBpbm5lcl9mZCA9IC0xLCBvdXRlcl9mZCA9IC0xLCBzdGF0dXM7XFxuK1xcdGludCBpbmhlcml0ZWRfZmRzWzMyXSwgbnJfaW5oZXJpdGVkID0gMCwgaTtcXG4rXFx0Y2hhciAqb3V0cHV0ID0gTlVMTDtcXG4rXFx0cGlkX3QgcGlkO1xcbitcXG4rXFx0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImR1bXBfaW5uZXJcXFwiLCA0LCA0LCAxLCBOVUxMKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoaW5uZXJfZmQsIFxcXCJjcmVhdGVfdGVtcGxhdGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG9wdHMuaW5uZXJfbWFwX2ZkID0gaW5uZXJfZmQ7XFxuK1xcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFxcXCJkdW1wX291dGVyXFxcIiwgNCwgNCxcXG4rXFx0XFx0XFx0XFx0ICBBUlJBWV9TSVpFKGlkcyksIFxcdTAwMjZvcHRzKTtcXG4rXFx0Y2xvc2UoaW5uZXJfZmQpO1xcbitcXHRpbm5lcl9mZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChvdXRlcl9mZCwgXFxcImNyZWF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0Zm9yIChrZXkgPSAwOyBrZXkgXFx1MDAzYyBBUlJBWV9TSVpFKGlkcyk7IGtleSsrKSB7XFxuK1xcdFxcdGlubmVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFxcXCJkdW1wX2lubmVyXFxcIiwgNCwgNCwgMSwgTlVMTCk7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcXFwiY3JlYXRlX2lubmVyXFxcIikgfHxcXG4rXFx0XFx0ICAgICFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXFx1MDAyNmtleSwgXFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcXG4rXFx0XFx0XFx0ICAgICAgIFxcXCJwb3B1bGF0ZV9vdXRlclxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xcbitcXHRcXHRpZiAoIWlkc1trZXldKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0LyogVGhlIG91dGVyIG1hcCBrZWVwcyBlYWNoIGRpc3RpbmN0IGlubmVyIG1hcCBhbGl2ZS4gKi9cXG4rXFx0XFx0Y2xvc2UoaW5uZXJfZmQpO1xcbitcXHRcXHRpbm5lcl9mZCA9IC0xO1xcbitcXHR9XFxuK1xcdHJvb3RfaWQgPSBtYXBfaWQob3V0ZXJfZmQpO1xcbitcXHRvdXRwdXQgPSBjYWxsb2MoMSwgNjU1MzYpO1xcbitcXHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcXFwiYWxsb2NhdGVfb3V0cHV0XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0LyogRmlsbCB0aGUgbG93IEZEIHNsb3RzIHRvIGV4ZXJjaXNlIGluaGVyaXRlZCBkZXNjcmlwdG9yIGNsZWFudXAuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGluaGVyaXRlZF9mZHMpOyBpKyspIHtcXG4rXFx0XFx0aW50IGZkID0gb3BlbihcXFwiL2Rldi9udWxsXFxcIiwgT19SRE9OTFkpO1xcbitcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFxcXCJvcGVuX2luaGVyaXRlZF9mZFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0aW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQrK10gPSBmZDtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxcbitcXHQgKiBydW5uZXIncyBsaW1pdCB1bmNoYW5nZWQuIFJldGFpbmluZyBldmVyeSBkaXNjb3ZlcmVkIEZEIHdvdWxkIGV4Y2VlZFxcbitcXHQgKiB0aGlzIGxpbWl0IGJlZm9yZSB0aGUgcmVjdXJzaXZlIGR1bXAgY291bGQgdmlzaXQgYWxsIGlubmVyIG1hcHMuXFxuK1xcdCAqL1xcbitcXHRwaWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKHBpZCwgMCwgXFxcImZvcmtcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghcGlkKSB7XFxuK1xcdFxcdHN0cnVjdCBkaXJlbnQgKmVudHJ5O1xcbitcXHRcXHRESVIgKmRpcjtcXG4rXFxuK1xcdFxcdC8qIFJlc2VydmUgYSBzbG90IGZvciB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgdGhlIHBhcmVudCBpcyBmdWxsLiAqL1xcbitcXHRcXHRjbG9zZShpbmhlcml0ZWRfZmRzW25yX2luaGVyaXRlZCAtIDFdKTtcXG4rXFx0XFx0ZGlyID0gb3BlbmRpcihcXFwiL3Byb2Mvc2VsZi9mZFxcXCIpO1xcbitcXHRcXHRpZiAoIWRpcilcXG4rXFx0XFx0XFx0X2V4aXQoNik7XFxuK1xcdFxcdC8qIFRoZSBwYXJlbnQga2VlcHMgdGhlIG91dGVyIG1hcCBhbmQgaXRzIGlubmVyIG1hcHMgYWxpdmUuICovXFxuK1xcdFxcdGZvciAoOzspIHtcXG4rXFx0XFx0XFx0Y2hhciAqZW5kO1xcbitcXHRcXHRcXHRsb25nIGZkO1xcbitcXG4rXFx0XFx0XFx0ZXJybm8gPSAwO1xcbitcXHRcXHRcXHRlbnRyeSA9IHJlYWRkaXIoZGlyKTtcXG4rXFx0XFx0XFx0aWYgKCFlbnRyeSkge1xcbitcXHRcXHRcXHRcXHRpZiAoZXJybm8pXFxuK1xcdFxcdFxcdFxcdFxcdF9leGl0KDYpO1xcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRmZCA9IHN0cnRvbChlbnRyeS1cXHUwMDNlZF9uYW1lLCBcXHUwMDI2ZW5kLCAxMCk7XFxuK1xcdFxcdFxcdGlmICgqZW5kIHx8IGZkIFxcdTAwM2MgMyB8fCBmZCA9PSBkaXJmZChkaXIpKVxcbitcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0XFx0Y2xvc2UoZmQpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChjbG9zZWRpcihkaXIpKVxcbitcXHRcXHRcXHRfZXhpdCg2KTtcXG4rXFx0XFx0aWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCBcXHUwMDI2bGltaXQpKVxcbitcXHRcXHRcXHRfZXhpdCgxKTtcXG4rXFx0XFx0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcXFwiJXMgLXIgbWFwIGR1bXAgaWQgJXVcXFwiLFxcbitcXHRcXHRcXHQganNvbiA/IFxcXCItalxcXCIgOiBcXFwiXFxcIiwgcm9vdF9pZCk7XFxuK1xcdFxcdGlmIChnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIDY1NTM1KSlcXG4rXFx0XFx0XFx0X2V4aXQoMik7XFxuK1xcdFxcdGlmIChjb3VudF90b2tlbihvdXRwdXQsIGpzb24gPyBcXFwiXFxcXFxcXCJpZFxcXFxcXFwiOlxcXCIgOiBcXFwiRm91bmQgXFxcIikgIT0gQVJSQVlfU0laRShpZHMpICsgMSB8fFxcbitcXHRcXHQgICAgY291bnRfdG9rZW4ob3V0cHV0LCBqc29uID8gXFxcIlxcXFxcXFwiaW5uZXJfbWFwX2lkXFxcXFxcXCI6XFxcIiA6IFxcXCJpbm5lcl9tYXBfaWQ6XFxcIikgIT1cXG4rXFx0XFx0ICAgIEFSUkFZX1NJWkUoaWRzKSlcXG4rXFx0XFx0XFx0X2V4aXQoMyk7XFxuK1xcdFxcdGZvciAoa2V5ID0gMDsga2V5IFxcdTAwM2MgQVJSQVlfU0laRShpZHMpOyBrZXkrKykge1xcbitcXHRcXHRcXHRpZiAoanNvbilcXG4rXFx0XFx0XFx0XFx0c25wcmludGYodG9rZW4sIHNpemVvZih0b2tlbiksIFxcXCJcXFxcXFxcImlkXFxcXFxcXCI6JXUsXFxcIiwgaWRzW2tleV0pO1xcbitcXHRcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdFxcdHNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCBcXFwiXFxcXG4ldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgaWRzW2tleV0pO1xcbitcXHRcXHRcXHRpZiAoY291bnRfdG9rZW4ob3V0cHV0LCB0b2tlbikgIT0gMSlcXG4rXFx0XFx0XFx0XFx0X2V4aXQoNCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKGpzb24gXFx1MDAyNlxcdTAwMjYgKG91dHB1dFswXSAhPSAnWycgfHxcXG4rXFx0XFx0XFx0ICAgICBzdHJjbXAob3V0cHV0ICsgc3RybGVuKG91dHB1dCkgLSAyLCBcXFwiXVxcXFxuXFxcIikpKVxcbitcXHRcXHRcXHRfZXhpdCg1KTtcXG4rXFx0XFx0X2V4aXQoMCk7XFxuK1xcdH1cXG4rXFx0aWYgKEFTU0VSVF9FUSh3YWl0cGlkKHBpZCwgXFx1MDAyNnN0YXR1cywgMCksIHBpZCwgXFxcIndhaXRwaWRcXFwiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJjaGlsZF9leGl0ZWRcXFwiKSlcXG4rXFx0XFx0QVNTRVJUX0VRKFdFWElUU1RBVFVTKHN0YXR1cyksIDAsIFxcXCJkdW1wX3dpdGhfbG93X2ZkX2xpbWl0XFxcIik7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkrKylcXG4rXFx0XFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcXFwicGFyZW50X2ZkX3ByZXNlcnZlZFxcXCIpO1xcbitcXHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXFxcInBhcmVudF9vdXRlcl9wcmVzZXJ2ZWRcXFwiKTtcXG4rb3V0OlxcbitcXHR3aGlsZSAobnJfaW5oZXJpdGVkKVxcbitcXHRcXHRjbG9zZShpbmhlcml0ZWRfZmRzWy0tbnJfaW5oZXJpdGVkXSk7XFxuK1xcdGZyZWUob3V0cHV0KTtcXG4rXFx0aWYgKG91dGVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKG91dGVyX2ZkKTtcXG4rXFx0aWYgKGlubmVyX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGlubmVyX2ZkKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcXG4re1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwidW5yZWFkYWJsZV9vcmRpbmFyeVxcXCIpKVxcbitcXHRcXHR0ZXN0X3VucmVhZGFibGUoZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwidW5yZWFkYWJsZV9pbm5lclxcXCIpKVxcbitcXHRcXHR0ZXN0X3VucmVhZGFibGUodHJ1ZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtYW55X2lubmVyX21hcHNfanNvblxcXCIpKVxcbitcXHRcXHR0ZXN0X21hbnlfaW5uZXJfbWFwcyh0cnVlKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm1hbnlfaW5uZXJfbWFwc19wbGFpblxcXCIpKVxcbitcXHRcXHR0ZXN0X21hbnlfaW5uZXJfbWFwcyhmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtdWx0aXBsZV9yb290c1xcXCIpKVxcbitcXHRcXHR0ZXN0X211bHRpcGxlX3Jvb3RzKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJhcnJheV9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJoYXNoX29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2hhcmVkX2lubmVyXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDIsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJlbXB0eV9hcnJheV9vZl9tYXBzXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJlbXB0eV9oYXNoX29mX21hcHNcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAwLCBmYWxzZSwgZmFsc2UpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiYnRmX2lubmVyXFxcIikpXFxuK1xcdFxcdHRlc3Rfb3V0ZXIoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgMSwgZmFsc2UsIHRydWUpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiZW1wdHlfaW5uZXJcXFwiKSlcXG4rXFx0XFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCB0cnVlLCBmYWxzZSk7XFxuK31cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMDY6MzQ6NDEuOTQ0NjIyMTgxWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo0ODk2MTQxODUyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xzIChicGZ0b29sKSB1bmRlciB0b29scy9icGYvYnBmdG9vbCBhbmQgdGVzdHMgdW5kZXIgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmLiBJdCBkb2VzIG5vdCB0b3VjaCBhbnkga2VybmVsLXNwYWNlIGNvZGUgb3IgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA3OGY3NmJhNzQ3MzFjMzI5NmNmZDdkN2Y3NjllYTJjODczNmYwMWY2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAwNjozNDozOCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL0RvY3VtZW50YXRpb24vYnBmdG9vbC1tYXAucnN0IGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbmluZGV4IDVkYWYzZGU1Yzc0NDYuLjIzZmFhNjcyNjg1ODcgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9Eb2N1bWVudGF0aW9uL2JwZnRvb2wtbWFwLnJzdFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvRG9jdW1lbnRhdGlvbi9icGZ0b29sLW1hcC5yc3RcbkBAIC0xNiw3ICsxNiw4IEBAIFNZTk9QU0lTXG4gXG4gKipicGZ0b29sKiogWypPUFRJT05TKl0gKiptYXAqKiAqQ09NTUFORCpcbiBcbi0qT1BUSU9OUyogOj0geyB8Q09NTU9OX09QVElPTlN8IHwgeyAqKi1mKiogfCAqKi0tYnBmZnMqKiB9IHwgeyAqKi1uKiogfCAqKi0tbm9tb3VudCoqIH0gfVxuKypPUFRJT05TKiA6PSB7IHxDT01NT05fT1BUSU9OU3wgfCB7ICoqLWYqKiB8ICoqLS1icGZmcyoqIH0gfFxuK3sgKiotbioqIHwgKiotLW5vbW91bnQqKiB9IHwgeyAqKi1yKiogfCAqKi0tcmVjdXJzaXZlKiogfSB9XG4gXG4gKkNPTU1BTkRTKiA6PVxuIHsgKipzaG93KiogfCAqKmxpc3QqKiB8ICoqY3JlYXRlKiogfCAqKmR1bXAqKiB8ICoqdXBkYXRlKiogfCAqKmxvb2t1cCoqIHwgKipnZXRuZXh0KiogfFxuQEAgLTE3MCw2ICsxNzEsMjUgQEAgT1BUSU9OU1xuICAgICBEbyBub3QgYXV0b21hdGljYWxseSBhdHRlbXB0IHRvIG1vdW50IGFueSB2aXJ0dWFsIGZpbGUgc3lzdGVtIChzdWNoIGFzXG4gICAgIHRyYWNlZnMgb3IgQlBGIHZpcnR1YWwgZmlsZSBzeXN0ZW0pIHdoZW4gbmVjZXNzYXJ5LlxuIFxuKy1yLCAtLXJlY3Vyc2l2ZVxuKyAgICBBbHNvIGR1bXAgdGhlIGlubmVyIG1hcHMgcmVmZXJlbmNlZCBieSAqKmFycmF5X29mX21hcHMqKiBhbmQgKipoYXNoX29mX21hcHMqKlxuKyAgICBlbnRyaWVzIHdoZW4gcnVubmluZyAqKm1hcCBkdW1wKiouIEVhY2ggbWFwIElEIGlzIHZpc2l0ZWQgb25jZSwgZXZlbiBpZlxuKyAgICBzZXZlcmFsIGVudHJpZXMgcmVmZXIgdG8gaXQuIFNlbGVjdGVkIG1hcHMgYXJlIGZvbGxvd2VkIGJ5IHRoZWlyIGlubmVyIG1hcHMuXG4rXG4rICAgIFBsYWluIG91dHB1dCBpbmNsdWRlcyBhIGhlYWRlciBpZGVudGlmeWluZyBlYWNoIG1hcC4gT24gc3VjY2VzcywgSlNPTiBvdXRwdXRcbisgICAgaXMgYWx3YXlzIGFuIGFycmF5IG9mIG1hcCBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYW4gKippZCoqIGFuZCBhblxuKyAgICAqKmVsZW1lbnRzKiogYXJyYXksIGluY2x1ZGluZyB3aGVuIG9ubHkgb25lIG1hcCBpcyBkdW1wZWQuIE91dGVyIG1hcCBlbnRyaWVzXG4rICAgIHJldGFpbiB0aGVpciAqKmlubmVyX21hcF9pZCoqIGZpZWxkLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjb3JyZXNwb25kaW5nIGlubmVyXG4rICAgIG1hcCBvYmplY3QuXG4rXG4rICAgIElubmVyIG1hcCBJRHMgYXJlIHJlc29sdmVkIHdoZW4gdGhlIG1hcHMgYXJlIHZpc2l0ZWQuIFRoZSBkdW1wIGlzIG5vdCBhblxuKyAgICBhdG9taWMgc25hcHNob3Q6IGNvbmN1cnJlbnQgdXBkYXRlcyBjYW4gY2hhbmdlIG1hcCBjb250ZW50cyBvciByZW1vdmUgYVxuKyAgICByZWZlcmVuY2VkIGlubmVyIG1hcCBiZWZvcmUgaXQgaXMgdmlzaXRlZC4gRmFpbHVyZSB0byBvcGVuIGEgcmVmZXJlbmNlZFxuKyAgICBpbm5lciBtYXAgc3RvcHMgdGhlIGR1bXAgYW5kIHJldHVybnMgYSBub256ZXJvIGV4aXQgc3RhdHVzLiBPdXRwdXQgbWF5XG4rICAgIGNvbnRhaW4gbWFwcyBvciBlbnRyaWVzIHByaW50ZWQgYmVmb3JlIHRoZSBlcnJvci5cbitcbisgICAgSW4gSlNPTiBtb2RlLCB0aGUgZW5jbG9zaW5nIGFycmF5cyBhbmQgb2JqZWN0cyBhcmUgY2xvc2VkIGJlZm9yZSByZXR1cm5pbmcuXG4rXG4gRVhBTVBMRVNcbiA9PT09PT09PVxuICoqIyBicGZ0b29sIG1hcCBzaG93KipcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9iYXNoLWNvbXBsZXRpb24vYnBmdG9vbCBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5pbmRleCA3NWNiY2I1MTJlYmFlLi40NWMzMzZkNjNiZTBhIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvYmFzaC1jb21wbGV0aW9uL2JwZnRvb2xcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2Jhc2gtY29tcGxldGlvbi9icGZ0b29sXG5AQCAtMjYxLDcgKzI2MSw3IEBAIF9icGZ0b29sKClcbiBcbiAgICAgIyBEZWFsIHdpdGggb3B0aW9uc1xuICAgICBpZiBbWyAke3dvcmRzW2N3b3JkXX0gPT0gLSogXV07IHRoZW5cbi0gICAgICAgIGxvY2FsIGM9Jy0tdmVyc2lvbiAtLWpzb24gLS1wcmV0dHkgLS1icGZmcyAtLW1hcGNvbXBhdCAtLWRlYnVnIFxcXG4rICAgICAgICBsb2NhbCBjPSctLXZlcnNpb24gLS1qc29uIC0tcHJldHR5IC0tcmVjdXJzaXZlIC0tYnBmZnMgLS1tYXBjb21wYXQgLS1kZWJ1ZyBcXFxuICAgICAgICAgICAgIC0tdXNlLWxvYWRlciAtLWJhc2UtYnRmIC0tc2lnbiAtaSAtaydcbiAgICAgICAgIENPTVBSRVBMWT0oICQoIGNvbXBnZW4gLVcgXCIkY1wiIC0tIFwiJGN1clwiICkgKVxuICAgICAgICAgcmV0dXJuIDBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmMgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbmluZGV4IGM5MWUxYTZlMWExZWMuLjQyNGFmNGE0OTZhNWMgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uY1xuQEAgLTI2LDYgKzI2LDcgQEAgc3RhdGljIGludCAoKmxhc3RfZG9faGVscCkoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTtcbiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBib29sIHByZXR0eV9vdXRwdXQ7XG4gYm9vbCBqc29uX291dHB1dDtcbitib29sIHJlY3Vyc2l2ZV9kdW1wO1xuIGJvb2wgc2hvd19waW5uZWQ7XG4gYm9vbCBibG9ja19tb3VudDtcbiBib29sIHZlcmlmaWVyX2xvZ3M7XG5AQCAtNDUyLDYgKzQ1Myw3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0eyBcImpzb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdqJyB9LFxuIFx0XHR7IFwiaGVscFwiLFx0bm9fYXJndW1lbnQsXHROVUxMLFx0J2gnIH0sXG4gXHRcdHsgXCJwcmV0dHlcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdwJyB9LFxuK1x0XHR7IFwicmVjdXJzaXZlXCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQncicgfSxcbiBcdFx0eyBcInZlcnNpb25cIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdWJyB9LFxuIFx0XHR7IFwiYnBmZnNcIixcdG5vX2FyZ3VtZW50LFx0TlVMTCxcdCdmJyB9LFxuIFx0XHR7IFwibWFwY29tcGF0XCIsXHRub19hcmd1bWVudCxcdE5VTEwsXHQnbScgfSxcbkBAIC00ODUsNyArNDg3LDcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0YmluX25hbWUgPSBcImJwZnRvb2xcIjtcbiBcbiBcdG9wdGVyciA9IDA7XG4tXHR3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIFwiVmhwamZMbW5kU2k6azpCOmxcIixcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgXCJWaHBqcmZMbW5kU2k6azpCOmxcIixcbiBcdFx0XHRcdCAgb3B0aW9ucywgTlVMTCkpIFx1MDAzZT0gMCkge1xuIFx0XHRzd2l0Y2ggKG9wdCkge1xuIFx0XHRjYXNlICdWJzpcbkBAIC01MDcsNiArNTA5LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcdH1cbiBcdFx0XHRqc29ud19wcmV0dHkoanNvbl93dHIsIHByZXR0eV9vdXRwdXQpO1xuIFx0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICdyJzpcbitcdFx0XHRyZWN1cnNpdmVfZHVtcCA9IHRydWU7XG4rXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2YnOlxuIFx0XHRcdHNob3dfcGlubmVkID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbmluZGV4IDc4YjZlMGViYjg1ZDguLjc2NjI2NjQyZTk0Y2IgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuQEAgLTgzLDYgKzgzLDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIgKmJpbl9uYW1lO1xuIFxuIGV4dGVybiBqc29uX3dyaXRlcl90ICpqc29uX3d0cjtcbiBleHRlcm4gYm9vbCBqc29uX291dHB1dDtcbitleHRlcm4gYm9vbCByZWN1cnNpdmVfZHVtcDtcbiBleHRlcm4gYm9vbCBzaG93X3Bpbm5lZDtcbiBleHRlcm4gYm9vbCBzaG93X3BpZHM7XG4gZXh0ZXJuIGJvb2wgYmxvY2tfbW91bnQ7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFwLmMgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuaW5kZXggNjg0YThmYjcyNDE0Ni4uYzQwMGIxNWYxNmRkMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21hcC5jXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYXAuY1xuQEAgLTE3LDYgKzE3LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NicGYvYnBmLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NicGYvaGFzaG1hcC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2xpYmJwZl9pbnRlcm5hbC5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCJqc29uX3dyaXRlci5oXCJcbiAjaW5jbHVkZSBcIm1haW4uaFwiXG5AQCAtODI2LDEyICs4MjcsNDQgQEAgc3RhdGljIHZvaWQgZnJlZV9tYXBfa3ZfYnRmKHN0cnVjdCBidGYgKmJ0ZilcbiBcdFx0YnRmX19mcmVlKGJ0Zik7XG4gfVxuIFxuK3N0cnVjdCBtYXBfZHVtcF9jdHgge1xuK1x0c3RydWN0IGhhc2htYXAgKnNlZW47XG4rXHRfX3UzMiAqcGVuZGluZ19pZHM7XG4rXHRzaXplX3QgcGVuZGluZ19jbnQ7XG4rfTtcbitcbitzdGF0aWMgaW50IGNvbGxlY3RfaW5uZXJfbWFwKHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eCwgX191MzIgaWQpXG4re1xuK1x0X191MzIgKmlkcztcbitcdGludCBlcnI7XG4rXG4rXHRpZiAoaGFzaG1hcF9fZmluZChjdHgtXHUwMDNlc2VlbiwgaWQsIE5VTEwpKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGlkcyA9IGxpYmJwZl9yZWFsbG9jYXJyYXkoY3R4LVx1MDAzZXBlbmRpbmdfaWRzLCBjdHgtXHUwMDNlcGVuZGluZ19jbnQgKyAxLFxuK1x0XHRcdFx0ICBzaXplb2YoKmlkcykpO1xuK1x0aWYgKCFpZHMpIHtcbitcdFx0cF9lcnIoXCJtZW0gYWxsb2MgZmFpbGVkXCIpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRjdHgtXHUwMDNlcGVuZGluZ19pZHMgPSBpZHM7XG4rXG4rXHRlcnIgPSBoYXNobWFwX19hZGQoY3R4LVx1MDAzZXNlZW4sIGlkLCAwKTtcbitcdGlmIChlcnIpIHtcbitcdFx0cF9lcnIoXCJmYWlsZWQgdG8gcmVjb3JkIGlubmVyIG1hcCBpZCAldTogJXNcIiwgaWQsIHN0cmVycm9yKC1lcnIpKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0aWRzW2N0eC1cdTAwM2VwZW5kaW5nX2NudCsrXSA9IGlkO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuIHN0YXRpYyBpbnRcbiBtYXBfZHVtcChpbnQgZmQsIHN0cnVjdCBicGZfbWFwX2luZm8gKmluZm8sIGpzb25fd3JpdGVyX3QgKnd0cixcbi1cdCBib29sIHNob3dfaGVhZGVyKVxuK1x0IGJvb2wgc2hvd19oZWFkZXIsIHN0cnVjdCBtYXBfZHVtcF9jdHggKmN0eClcbiB7XG4gXHR2b2lkICprZXksICp2YWx1ZSwgKnByZXZfa2V5O1xuIFx0dW5zaWduZWQgaW50IG51bV9lbGVtcyA9IDA7XG4rXHRqc29uX3dyaXRlcl90ICpwbGFpbl9idGZfd3RyID0gTlVMTDtcbiBcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4gXHRpbnQgZXJyO1xuIFxuQEAgLTg0NSw2ICs4NzgsMTcgQEAgbWFwX2R1bXAoaW50IGZkLCBzdHJ1Y3QgYnBmX21hcF9pbmZvICppbmZvLCBqc29uX3dyaXRlcl90ICp3dHIsXG4gXG4gXHRwcmV2X2tleSA9IE5VTEw7XG4gXG4rXHRpZiAoY3R4IFx1MDAyNlx1MDAyNiAhd3RyIFx1MDAyNlx1MDAyNiAoaW5mby1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZCB8fFxuK1x0XHRcdCAgICBpbmZvLVx1MDAzZWJ0Zl92bWxpbnV4X3ZhbHVlX3R5cGVfaWQpKSB7XG4rXHRcdHBsYWluX2J0Zl93dHIgPSBnZXRfYnRmX3dyaXRlcigpO1xuK1x0XHRpZiAocGxhaW5fYnRmX3d0cikge1xuK1x0XHRcdGlmIChzaG93X2hlYWRlcilcbitcdFx0XHRcdHNob3dfbWFwX2hlYWRlcl9wbGFpbihpbmZvKTtcbitcdFx0XHRzaG93X2hlYWRlciA9IGZhbHNlO1xuK1x0XHRcdHd0ciA9IHBsYWluX2J0Zl93dHI7XG4rXHRcdH1cbitcdH1cbitcbiBcdGlmICh3dHIpIHtcbiBcdFx0ZXJyID0gZ2V0X21hcF9rdl9idGYoaW5mbywgXHUwMDI2YnRmKTtcbiBcdFx0aWYgKGVycikge1xuQEAgLTg3NCwxMCArOTE4LDIwIEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0XHRpZiAoZXJyKSB7XG4gXHRcdFx0aWYgKGVycm5vID09IEVOT0VOVClcbiBcdFx0XHRcdGVyciA9IDA7XG4rXHRcdFx0ZWxzZSBpZiAoY3R4KVxuK1x0XHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbmV4dCBrZXkgZm9yIG1hcCBpZCAldTogJXNcIixcbitcdFx0XHRcdCAgICAgIGluZm8tXHUwMDNlaWQsIHN0cmVycm9yKGVycm5vKSk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0aWYgKCFkdW1wX21hcF9lbGVtKGZkLCBrZXksIHZhbHVlLCBpbmZvLCBidGYsIHd0cikpXG4rXHRcdGVyciA9IGR1bXBfbWFwX2VsZW0oZmQsIGtleSwgdmFsdWUsIGluZm8sIGJ0Ziwgd3RyKTtcbitcdFx0aWYgKCFlcnIpIHtcbiBcdFx0XHRudW1fZWxlbXMrKztcbitcdFx0XHRpZiAoY3R4IFx1MDAyNlx1MDAyNiBtYXBfaXNfbWFwX29mX21hcHMoaW5mby1cdTAwM2V0eXBlKSkge1xuK1x0XHRcdFx0ZXJyID0gY29sbGVjdF9pbm5lcl9tYXAoY3R4LCAqKF9fdTMyICopdmFsdWUpO1xuK1x0XHRcdFx0aWYgKGVycilcbitcdFx0XHRcdFx0YnJlYWs7XG4rXHRcdFx0fVxuK1x0XHR9XG4gXHRcdHByZXZfa2V5ID0ga2V5O1xuIFx0fVxuIFxuQEAgLTg5NCwxOCArOTQ4LDI1IEBAIG1hcF9kdW1wKGludCBmZCwgc3RydWN0IGJwZl9tYXBfaW5mbyAqaW5mbywganNvbl93cml0ZXJfdCAqd3RyLFxuIFx0ZnJlZShrZXkpO1xuIFx0ZnJlZSh2YWx1ZSk7XG4gXHRmcmVlX21hcF9rdl9idGYoYnRmKTtcbitcdGlmIChwbGFpbl9idGZfd3RyKVxuK1x0XHRqc29ud19kZXN0cm95KFx1MDAyNnBsYWluX2J0Zl93dHIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG4gc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiB7XG4rXHRMSUJCUEZfT1BUUyhicGZfZ2V0X2ZkX2J5X2lkX29wdHMsIG9wdHMsXG4rXHRcdCAgICAub3Blbl9mbGFncyA9IEJQRl9GX1JET05MWSxcbitcdCk7XG4gXHRqc29uX3dyaXRlcl90ICp3dHIgPSBOVUxMLCAqYnRmX3d0ciA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm8gPSB7fTtcbitcdHN0cnVjdCBtYXBfZHVtcF9jdHggY3R4ID0ge307XG4gXHRpbnQgbmJfZmRzLCBpID0gMDtcbiBcdF9fdTMyIGxlbiA9IHNpemVvZihpbmZvKTtcbiBcdGludCAqZmRzID0gTlVMTDtcbiBcdGludCBlcnIgPSAtMTtcbitcdHNpemVfdCBqO1xuIFxuIFx0aWYgKGFyZ2MgIT0gMilcbiBcdFx0dXNhZ2UoKTtcbkBAIC05MTksOSArOTgwLDM0IEBAIHN0YXRpYyBpbnQgZG9fZHVtcChpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRpZiAobmJfZmRzIFx1MDAzYyAxKVxuIFx0XHRnb3RvIGV4aXRfZnJlZTtcbiBcbitcdGlmIChyZWN1cnNpdmVfZHVtcCkge1xuK1x0XHRjdHguc2VlbiA9IGhhc2htYXBfX25ldyhoYXNoX2ZuX2Zvcl9rZXlfYXNfaWQsXG4rXHRcdFx0XHRcdGVxdWFsX2ZuX2Zvcl9rZXlfYXNfaWQsIE5VTEwpO1xuK1x0XHRpZiAoSVNfRVJSKGN0eC5zZWVuKSkge1xuK1x0XHRcdGN0eC5zZWVuID0gTlVMTDtcbitcdFx0XHRwX2VycihcImZhaWxlZCB0byBjcmVhdGUgaGFzaG1hcCBmb3IgcmVjdXJzaXZlIGR1bXBcIik7XG4rXHRcdFx0Z290byBleGl0X2Nsb3NlO1xuK1x0XHR9XG4rXHRcdC8qIFJlY29yZCB0aGUgc2VsZWN0ZWQgbWFwcyBiZWZvcmUgZGlzY292ZXJpbmcgYW55IGlubmVyIG1hcHMuICovXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5iX2ZkczsgaSsrKSB7XG4rXHRcdFx0bGVuID0gc2l6ZW9mKGluZm8pO1xuK1x0XHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkc1tpXSwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSkge1xuK1x0XHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdFx0XHRlcnIgPSAtMTtcbitcdFx0XHRcdGdvdG8gZXhpdF9jbG9zZTtcbitcdFx0XHR9XG4rXHRcdFx0ZXJyID0gaGFzaG1hcF9fYWRkKGN0eC5zZWVuLCBpbmZvLmlkLCAwKTtcbitcdFx0XHRpZiAoZXJyKSB7XG4rXHRcdFx0XHRwX2VycihcImZhaWxlZCB0byByZWNvcmQgbWFwIGlkICV1OiAlc1wiLCBpbmZvLmlkLFxuK1x0XHRcdFx0ICAgICAgc3RyZXJyb3IoLWVycikpO1xuK1x0XHRcdFx0Z290byBleGl0X2Nsb3NlO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0fVxuK1xuIFx0aWYgKGpzb25fb3V0cHV0KSB7XG4gXHRcdHd0ciA9IGpzb25fd3RyO1xuLVx0fSBlbHNlIHtcbitcdH0gZWxzZSBpZiAoIXJlY3Vyc2l2ZV9kdW1wKSB7XG4gXHRcdGludCBkb19wbGFpbl9idGY7XG4gXG4gXHRcdGRvX3BsYWluX2J0ZiA9IG1hcHNfaGF2ZV9idGYoZmRzLCBuYl9mZHMpO1xuQEAgLTkzNiw3ICsxMDIyLDcgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0fVxuIFx0fVxuIFxuLVx0aWYgKHd0ciBcdTAwMjZcdTAwMjYgbmJfZmRzIFx1MDAzZSAxKVxuK1x0aWYgKHd0ciBcdTAwMjZcdTAwMjYgKG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmVfZHVtcCkpXG4gXHRcdGpzb253X3N0YXJ0X2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYl9mZHM7IGkrKykge1xuIFx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZHNbaV0sIFx1MDAyNmluZm8sIFx1MDAyNmxlbikpIHtcbkBAIC05NDQsMjIgKzEwMzAsNTAgQEAgc3RhdGljIGludCBkb19kdW1wKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRlcnIgPSAtMTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuLVx0XHRlcnIgPSBtYXBfZHVtcChmZHNbaV0sIFx1MDAyNmluZm8sIHd0ciwgbmJfZmRzIFx1MDAzZSAxKTtcbitcdFx0ZXJyID0gbWFwX2R1bXAoZmRzW2ldLCBcdTAwMjZpbmZvLCB3dHIsIG5iX2ZkcyBcdTAwM2UgMSB8fCByZWN1cnNpdmVfZHVtcCxcbitcdFx0XHQgICAgICAgcmVjdXJzaXZlX2R1bXAgPyBcdTAwMjZjdHggOiBOVUxMKTtcbiBcdFx0aWYgKCF3dHIgXHUwMDI2XHUwMDI2IGkgIT0gbmJfZmRzIC0gMSlcbiBcdFx0XHRwcmludGYoXCJcXG5cIik7XG4gXG4gXHRcdGlmIChlcnIpXG4gXHRcdFx0YnJlYWs7XG4tXHRcdGNsb3NlKGZkc1tpXSk7XG4rXHRcdC8qIEtlZXAgc2VsZWN0ZWQgbWFwcyBhbGl2ZSB3aGlsZSB2aXNpdGluZyB0aGVpciBpbm5lciBtYXBzLiAqL1xuK1x0XHRpZiAoIXJlY3Vyc2l2ZV9kdW1wKVxuK1x0XHRcdGNsb3NlKGZkc1tpXSk7XG4rXHR9XG4rXHRmb3IgKGogPSAwOyAhZXJyIFx1MDAyNlx1MDAyNiBqIFx1MDAzYyBjdHgucGVuZGluZ19jbnQ7IGorKykge1xuK1x0XHRpbnQgZmQ7XG4rXG4rXHRcdGZkID0gYnBmX21hcF9nZXRfZmRfYnlfaWRfb3B0cyhjdHgucGVuZGluZ19pZHNbal0sIFx1MDAyNm9wdHMpO1xuK1x0XHRpZiAoZmQgXHUwMDNjIDApIHtcbitcdFx0XHRwX2VycihcImNhbid0IG9wZW4gaW5uZXIgbWFwIGlkICV1OiAlc1wiLFxuK1x0XHRcdCAgICAgIGN0eC5wZW5kaW5nX2lkc1tqXSwgc3RyZXJyb3IoZXJybm8pKTtcbitcdFx0XHRlcnIgPSAtMTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1x0XHRsZW4gPSBzaXplb2YoaW5mbyk7XG4rXHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKGZkLCBcdTAwMjZpbmZvLCBcdTAwMjZsZW4pKSB7XG4rXHRcdFx0cF9lcnIoXCJjYW4ndCBnZXQgbWFwIGluZm86ICVzXCIsIHN0cmVycm9yKGVycm5vKSk7XG4rXHRcdFx0ZXJyID0gLTE7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0aWYgKCF3dHIpXG4rXHRcdFx0XHRwcmludGYoXCJcXG5cIik7XG4rXHRcdFx0ZXJyID0gbWFwX2R1bXAoZmQsIFx1MDAyNmluZm8sIHd0ciwgdHJ1ZSwgXHUwMDI2Y3R4KTtcbitcdFx0fVxuK1x0XHRjbG9zZShmZCk7XG4gXHR9XG4tXHRpZiAod3RyIFx1MDAyNlx1MDAyNiBuYl9mZHMgXHUwMDNlIDEpXG4rXHRpZiAod3RyIFx1MDAyNlx1MDAyNiAobmJfZmRzIFx1MDAzZSAxIHx8IHJlY3Vyc2l2ZV9kdW1wKSlcbiBcdFx0anNvbndfZW5kX2FycmF5KHd0cik7XHQvKiByb290IGFycmF5ICovXG4gXG4gXHRpZiAoYnRmX3d0cilcbiBcdFx0anNvbndfZGVzdHJveShcdTAwMjZidGZfd3RyKTtcbiBleGl0X2Nsb3NlOlxuK1x0aWYgKHJlY3Vyc2l2ZV9kdW1wKVxuK1x0XHRpID0gMDtcbiBcdGZvciAoOyBpIFx1MDAzYyBuYl9mZHM7IGkrKylcbiBcdFx0Y2xvc2UoZmRzW2ldKTtcbitcdGhhc2htYXBfX2ZyZWUoY3R4LnNlZW4pO1xuK1x0ZnJlZShjdHgucGVuZGluZ19pZHMpO1xuIGV4aXRfZnJlZTpcbiBcdGZyZWUoZmRzKTtcbiBcdGZyZWVfYnRmX3ZtbGludXgoKTtcbkBAIC0xNDg0LDcgKzE1OTgsNyBAQCBzdGF0aWMgaW50IGRvX2hlbHAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHRcIiAgICAgICAgICAgICAgICAgdGFza19zdG9yYWdlIHwgYmxvb21fZmlsdGVyIHwgdXNlcl9yaW5nYnVmIHwgY2dycF9zdG9yYWdlIHwgYXJlbmEgfFxcblwiXG4gXHRcdFwiICAgICAgICAgICAgICAgICBpbnNuX2FycmF5IHwgcmhhc2ggfVxcblwiXG4gXHRcdFwiICAgICAgIFwiIEhFTFBfU1BFQ19PUFRJT05TIFwiIHxcXG5cIlxuLVx0XHRcIiAgICAgICAgICAgICAgICAgICAgey1mfC0tYnBmZnN9IHwgey1ufC0tbm9tb3VudH0gfVxcblwiXG4rXHRcdFwiICAgICAgICAgICAgICAgICAgICB7LWZ8LS1icGZmc30gfCB7LW58LS1ub21vdW50fSB8IHstcnwtLXJlY3Vyc2l2ZX0gfVxcblwiXG4gXHRcdFwiXCIsXG4gXHRcdGJpbl9uYW1lLCBhcmd2Wy0yXSk7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uOWM4ODc0M2E4Zjg0MlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvYnBmdG9vbF9tYXBfZHVtcC5jXG5AQCAtMCwwICsxLDQ2NSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGZ0b29sX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9idGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9yZXNvdXJjZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjZGlyZW50LmhcdTAwM2VcbitcbisjZGVmaW5lIE9VVFBVVF9TSVpFIDgxOTJcbitcbitzdGF0aWMgYm9vbCBkdW1wX21hcChfX3UzMiBpZCwgY29uc3QgY2hhciAqb3B0aW9ucywgY2hhciAqb3V0cHV0KVxuK3tcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXTtcbitcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCIlcyBtYXAgZHVtcCBpZCAldVwiLCBvcHRpb25zLCBpZCk7XG4rXHRtZW1zZXQob3V0cHV0LCAwLCBPVVRQVVRfU0laRSk7XG4rXHRpZiAoIUFTU0VSVF9PSyhnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIE9VVFBVVF9TSVpFIC0gMSksXG4rXHRcdCAgICAgICBcImR1bXBfbWFwXCIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHQvKiBUaGUgaGVscGVyIGRvZXNuJ3QgdGVybWluYXRlIG9yIHN0cmlwIHRoZSBvdXRwdXQuICovXG4rXHRvdXRwdXRbc3RyY3NwbihvdXRwdXQsIFwiXFxuXCIpXSA9ICdcXDAnO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBfX3UzMiBtYXBfaWQoaW50IGZkKVxuK3tcbitcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbyA9IHt9O1xuK1x0X191MzIgbGVuID0gc2l6ZW9mKGluZm8pO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmX21hcF9nZXRfaW5mb19ieV9mZChmZCwgXHUwMDI2aW5mbywgXHUwMDI2bGVuKSwgXCJtYXBfaW5mb1wiKSlcbitcdFx0cmV0dXJuIDA7XG4rXHRyZXR1cm4gaW5mby5pZDtcbit9XG4rXG4rc3RhdGljIGludCBjb3VudF90b2tlbihjb25zdCBjaGFyICpvdXRwdXQsIGNvbnN0IGNoYXIgKnRva2VuKVxuK3tcbitcdGludCBjb3VudCA9IDA7XG4rXG4rXHR3aGlsZSAoKG91dHB1dCA9IHN0cnN0cihvdXRwdXQsIHRva2VuKSkpIHtcbitcdFx0Y291bnQrKztcbitcdFx0b3V0cHV0ICs9IHN0cmxlbih0b2tlbik7XG4rXHR9XG4rXHRyZXR1cm4gY291bnQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX3BsYWluKF9fdTMyIHJvb3RfaWQsIF9fdTMyIGlubmVyX2lkLCBjb25zdCBjaGFyICp0eXBlLFxuK1x0XHRcdGludCBlbnRyaWVzLCBib29sIHR5cGVkKVxuK3tcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgaGVhZGVyWzEyOF07XG4rXHRjaGFyIG91dHB1dFtPVVRQVVRfU0laRV0gPSB7fTtcbitcdGNvbnN0IGNoYXIgKnJvb3QsICppbm5lcjtcbitcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCItLXJlY3Vyc2l2ZSBtYXAgZHVtcCBpZCAldVwiLCByb290X2lkKTtcbitcdGlmICghQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgIFwicGxhaW5fZHVtcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCIldTogJXMgIG5hbWUgZHVtcF9vdXRlciAgXCIsIHJvb3RfaWQsIHR5cGUpO1xuK1x0cm9vdCA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIocm9vdCwgXCJwbGFpbl9yb290X2hlYWRlclwiKSlcbitcdFx0cmV0dXJuO1xuK1x0QVNTRVJUX0VRKHJvb3QgLSBvdXRwdXQsIDAsIFwicGxhaW5fcm9vdF9maXJzdFwiKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwiaW5uZXJfbWFwX2lkOlwiKSwgZW50cmllcywgXCJwbGFpbl9yZWZlcmVuY2VzXCIpO1xuK1x0aWYgKGVudHJpZXMpIHtcbitcdFx0c25wcmludGYoaGVhZGVyLCBzaXplb2YoaGVhZGVyKSwgXCIldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcIiwgaW5uZXJfaWQpO1xuK1x0XHRpbm5lciA9IHN0cnN0cihvdXRwdXQsIGhlYWRlcik7XG4rXHRcdGlmIChBU1NFUlRfT0tfUFRSKGlubmVyLCBcInBsYWluX2lubmVyX2hlYWRlclwiKSlcbitcdFx0XHRBU1NFUlRfR1QoaW5uZXIgLSByb290LCAwLCBcInBsYWluX2lubmVyX2FmdGVyX3Jvb3RcIik7XG4rXHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIGhlYWRlciksIDEsIFwicGxhaW5faW5uZXJfb25jZVwiKTtcbitcdH1cbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIFwiRm91bmQgXCIpLCBlbnRyaWVzIFx1MDAyNlx1MDAyNiAhdHlwZWQgPyAyIDogMSxcbitcdFx0ICBcInBsYWluX21hcF9jb3VudFwiKTtcbitcdGlmICh0eXBlZCkge1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwiXFxcImtleVxcXCI6IDBcIiwgXCJwbGFpbl9idGZfa2V5XCIpO1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihvdXRwdXQsIFwiXFxcInZhbHVlXFxcIjogMTY4NDMwMDlcIiwgXCJwbGFpbl9idGZfdmFsdWVcIik7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3Rfb3V0ZXIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSwgaW50IGVudHJpZXMsIGJvb2wgZW1wdHlfaW5uZXIsXG4rXHRcdCAgICAgICBib29sIHR5cGVkKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG9wdHMpO1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgaW5uZXJfb3B0cyk7XG4rXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuK1x0Y2hhciBvdXRlcltPVVRQVVRfU0laRV0sIGlubmVyW09VVFBVVF9TSVpFXSwgb3V0cHV0W09VVFBVVF9TSVpFXTtcbitcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcmVmZXJlbmNlWzY0XTtcbitcdGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGxpYmJwZl9icGZfbWFwX3R5cGVfc3RyKHR5cGUpO1xuK1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTE7XG4rXHRfX3UzMiByb290X2lkLCBpbm5lcl9pZCwga2V5LCB2YWx1ZSA9IDB4MDEwMTAxMDE7XG4rXG4rXHRpZiAodHlwZWQpIHtcbitcdFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJjcmVhdGVfYnRmXCIpIHx8XG4rXHRcdCAgICAhQVNTRVJUX0VRKGJ0Zl9fYWRkX2ludChidGYsIFwidW5zaWduZWQgaW50XCIsIDQsIDApLCAxLCBcImJ0Zl9pbnRcIikgfHxcbitcdFx0ICAgICFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwibG9hZF9idGZcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGlubmVyX29wdHMuYnRmX2ZkID0gYnRmX19mZChidGYpO1xuK1x0XHRpbm5lcl9vcHRzLmJ0Zl9rZXlfdHlwZV9pZCA9IDE7XG4rXHRcdGlubmVyX29wdHMuYnRmX3ZhbHVlX3R5cGVfaWQgPSAxO1xuK1x0fVxuK1x0aW5uZXJfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCJkdW1wX2lubmVyXCIsIHNpemVvZihrZXkpLFxuK1x0XHRcdFx0ICBzaXplb2YodmFsdWUpLCAyLCBcdTAwMjZpbm5lcl9vcHRzKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRrZXkgPSAwO1xuK1x0aWYgKCFlbXB0eV9pbm5lciBcdTAwMjZcdTAwMjZcbitcdCAgICAhQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oaW5uZXJfZmQsIFx1MDAyNmtleSwgXHUwMDI2dmFsdWUsIEJQRl9BTlkpLFxuK1x0XHQgICAgICAgXCJwb3B1bGF0ZV9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xuK1x0b3V0ZXJfZmQgPSBicGZfbWFwX2NyZWF0ZSh0eXBlLCBcImR1bXBfb3V0ZXJcIiwgc2l6ZW9mKGtleSksIHNpemVvZihfX3UzMiksXG4rXHRcdFx0XHQgIDMsIFx1MDAyNm9wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQob3V0ZXJfZmQsIFwiY3JlYXRlX291dGVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdC8qIFRoZSB1bnVzZWQgdGhpcmQgYXJyYXkgc2xvdCBhbHNvIGV4ZXJjaXNlcyBmYWlsZWQgbG9va3Vwcy4gKi9cbitcdGZvciAoa2V5ID0gMDsga2V5IFx1MDAzYyBlbnRyaWVzOyBrZXkrKylcbitcdFx0aWYgKCFBU1NFUlRfT0soYnBmX21hcF91cGRhdGVfZWxlbShvdXRlcl9mZCwgXHUwMDI2a2V5LCBcdTAwMjZpbm5lcl9mZCwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicG9wdWxhdGVfb3V0ZXJcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbitcdGlubmVyX2lkID0gbWFwX2lkKGlubmVyX2ZkKTtcbitcdGlmICghcm9vdF9pZCB8fCAhaW5uZXJfaWQgfHwgIWR1bXBfbWFwKHJvb3RfaWQsIFwiLWpcIiwgb3V0ZXIpIHx8XG4rXHQgICAgIWR1bXBfbWFwKGlubmVyX2lkLCBcIi1qXCIsIGlubmVyKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRBU1NFUlRfRVEob3V0ZXJbMF0sICdbJywgXCJkZWZhdWx0X2FycmF5XCIpO1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCBcIlxcXCJlbGVtZW50c1xcXCI6XCIpLCAwLCBcImRlZmF1bHRfbm9fd3JhcHBlclwiKTtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRlciwgXCJcXFwiaWRcXFwiOlwiKSwgMCwgXCJkZWZhdWx0X25vX2hlYWRlclwiKTtcbitcdHNucHJpbnRmKHJlZmVyZW5jZSwgc2l6ZW9mKHJlZmVyZW5jZSksIFwiXFxcImlubmVyX21hcF9pZFxcXCI6JXVcIiwgaW5uZXJfaWQpO1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKG91dGVyLCByZWZlcmVuY2UpLCBlbnRyaWVzLCBcImRlZmF1bHRfcmVmZXJlbmNlc1wiKTtcbitcdGlmICghZW50cmllcylcbitcdFx0QVNTRVJUX1NUUkVRKG91dGVyLCBcIltdXCIsIFwiZW1wdHlfb3V0ZXJfZGVmYXVsdFwiKTtcbitcdGlmIChlbXB0eV9pbm5lcilcbitcdFx0QVNTRVJUX1NUUkVRKGlubmVyLCBcIltdXCIsIFwiZW1wdHlfaW5uZXJfZGVmYXVsdFwiKTtcbitcdGVsc2UgaWYgKHR5cGVkKVxuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihpbm5lciwgXCJcXFwiZm9ybWF0dGVkXFxcIjp7XFxcImtleVxcXCI6MCxcXFwidmFsdWVcXFwiOjE2ODQzMDA5fVwiLFxuK1x0XHRcdFx0ICBcInR5cGVkX2lubmVyXCIpO1xuK1x0ZWxzZVxuK1x0XHRBU1NFUlRfU1RSRVEoaW5uZXIsXG4rXHRcdFx0ICAgICBcIlt7XFxcImtleVxcXCI6W1xcXCIweDAwXFxcIixcXFwiMHgwMFxcXCIsXFxcIjB4MDBcXFwiLFxcXCIweDAwXFxcIl0sXCJcbitcdFx0XHQgICAgIFwiXFxcInZhbHVlXFxcIjpbXFxcIjB4MDFcXFwiLFxcXCIweDAxXFxcIixcXFwiMHgwMVxcXCIsXFxcIjB4MDFcXFwiXX1dXCIsXG4rXHRcdFx0ICAgICBcIm9yZGluYXJ5X2RlZmF1bHRcIik7XG4rXG4rXHQvKlxuK1x0ICogQ29tcGFyZSB0aGUgY29tcGxldGUgSlNPTiBkb2N1bWVudDogYSBmbGF0IGFycmF5IHdpdGggdGhlIHJvb3QgZmlyc3QsXG4rXHQgKiBvbmUgY29weSBvZiB0aGUgc2hhcmVkIGlubmVyIG1hcCwgYW5kIHVuY2hhbmdlZCBlbnRyeSByZXByZXNlbnRhdGlvbnMuXG4rXHQgKi9cbitcdGlmIChlbnRyaWVzKVxuK1x0XHRzbnByaW50ZihleHBlY3RlZCwgc2l6ZW9mKGV4cGVjdGVkKSxcbitcdFx0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX291dGVyXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfSx7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcImhhc2hcXFwiLFwiXG4rXHRcdFx0IFwiXFxcIm5hbWVcXFwiOlxcXCJkdW1wX2lubmVyXFxcIixcXFwiZmxhZ3NcXFwiOjAsXFxcImVsZW1lbnRzXFxcIjolc31dXCIsXG4rXHRcdFx0IHJvb3RfaWQsIHR5cGVfbmFtZSwgb3V0ZXIsIGlubmVyX2lkLCBpbm5lcik7XG4rXHRlbHNlXG4rXHRcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHRcdCBcIlt7XFxcImlkXFxcIjoldSxcXFwidHlwZVxcXCI6XFxcIiVzXFxcIixcXFwibmFtZVxcXCI6XFxcImR1bXBfb3V0ZXJcXFwiLFwiXG4rXHRcdFx0IFwiXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6W119XVwiLCByb290X2lkLCB0eXBlX25hbWUpO1xuK1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwiLWogLXJcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicmVjdXJzaXZlX2pzb25cIik7XG4rXHRpZiAoZHVtcF9tYXAocm9vdF9pZCwgXCItLWpzb24gLS1yZWN1cnNpdmVcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicmVjdXJzaXZlX2xvbmdfb3B0aW9uc1wiKTtcbitcdGNoZWNrX3BsYWluKHJvb3RfaWQsIGlubmVyX2lkLCB0eXBlX25hbWUsIGVudHJpZXMsIHR5cGVkKTtcbitcbitcdC8qIFJlY3Vyc2lvbiBvbiBhbiBvcmRpbmFyeSBtYXAgc3RpbGwgZW1pdHMgYSBzaW5nbGUgbWFwIG9iamVjdC4gKi9cbitcdHNucHJpbnRmKGV4cGVjdGVkLCBzaXplb2YoZXhwZWN0ZWQpLFxuK1x0XHQgXCJbe1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCJoYXNoXFxcIixcXFwibmFtZVxcXCI6XFxcImR1bXBfaW5uZXJcXFwiLFwiXG4rXHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfV1cIiwgaW5uZXJfaWQsIGlubmVyKTtcbitcdGlmIChkdW1wX21hcChpbm5lcl9pZCwgXCItaiAtclwiLCBvdXRwdXQpKVxuK1x0XHRBU1NFUlRfU1RSRVEob3V0cHV0LCBleHBlY3RlZCwgXCJvcmRpbmFyeV9yZWN1cnNpdmVcIik7XG4rb3V0OlxuK1x0aWYgKG91dGVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuK1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuK1x0YnRmX19mcmVlKGJ0Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRlc3RfbXVsdGlwbGVfcm9vdHModm9pZClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgbmFtZVtCUEZfT0JKX05BTUVfTEVOXTtcbitcdGNoYXIgb3V0cHV0W09VVFBVVF9TSVpFXSA9IHt9LCBleHBlY3RlZFtPVVRQVVRfU0laRSAqIDRdLCBlbGVtZW50c1tPVVRQVVRfU0laRV07XG4rXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7IFwiaGFzaFwiLCBcImFycmF5X29mX21hcHNcIiwgXCJoYXNoX29mX21hcHNcIiwgXCJoYXNoXCIgfTtcbitcdGludCBmZHNbXSA9IHsgLTEsIC0xLCAtMSwgLTEgfTtcbitcdF9fdTMyIGlkc1s0XSwga2V5O1xuK1x0aW50IGksIGxlbiA9IDA7XG4rXG4rXHQvKlxuK1x0ICogU2VsZWN0IHRoZSBmaXJzdCBpbm5lciBtYXAgYW5kIGJvdGggb3V0ZXJzIGFzIHJvb3RzLiBUaGUgb3RoZXIgaW5uZXJcbitcdCAqIG1hcCBtdXN0IGJlIGFwcGVuZGVkIGFmdGVyIGFsbCB0aHJlZSByb290cywgZXZlbiB0aG91Z2ggaXQgaXMgZm91bmRcbitcdCAqIHdoaWxlIGR1bXBpbmcgdGhlIGZpcnN0IG91dGVyLiBBIHByb2Nlc3Mtc3BlY2lmaWMgbmFtZSBhdm9pZHMgb3RoZXJcbitcdCAqIHRlc3RzJyBtYXBzIGpvaW5pbmcgdGhlIHNlbGVjdGlvbi5cbitcdCAqL1xuK1x0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcImR1bXBfJXVcIiwgZ2V0cGlkKCkpO1xuK1x0ZmRzWzBdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIG5hbWUsIDQsIDQsIDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQoZmRzWzBdLCBcImNyZWF0ZV9zZWxlY3RlZF9pbm5lclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmZHNbM10gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCJkdW1wX2Rpc2NvdmVyZWRcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbM10sIFwiY3JlYXRlX2Rpc2NvdmVyZWRfaW5uZXJcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBmZHNbMF07XG4rXHRmZHNbMV0gPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMV0sIFwiY3JlYXRlX2FycmF5X3Jvb3RcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0ZmRzWzJdID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUywgbmFtZSwgNCwgNCwgMiwgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChmZHNbMl0sIFwiY3JlYXRlX2hhc2hfcm9vdFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGkgPSAxOyBpIFx1MDAzYz0gMjsgaSsrKSB7XG4rXHRcdGtleSA9IDA7XG4rXHRcdGlmICghQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0oZmRzW2ldLCBcdTAwMjZrZXksIFx1MDAyNmZkc1swXSwgQlBGX0FOWSksXG4rXHRcdFx0ICAgICAgIFwicmVmZXJlbmNlX3NlbGVjdGVkX2lubmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRrZXkgPSAxO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKGZkc1tpXSwgXHUwMDI2a2V5LCBcdTAwMjZmZHNbM10sIEJQRl9BTlkpLFxuK1x0XHRcdCAgICAgICBcInJlZmVyZW5jZV9kaXNjb3ZlcmVkX2lubmVyXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmZHMpOyBpKyspIHtcbitcdFx0aWRzW2ldID0gbWFwX2lkKGZkc1tpXSk7XG4rXHRcdGlmICghaWRzW2ldIHx8ICFkdW1wX21hcChpZHNbaV0sIFwiLWpcIiwgZWxlbWVudHMpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHRsZW4gKz0gc25wcmludGYoZXhwZWN0ZWQgKyBsZW4sIHNpemVvZihleHBlY3RlZCkgLSBsZW4sXG4rXHRcdFx0XHRcIiVze1xcXCJpZFxcXCI6JXUsXFxcInR5cGVcXFwiOlxcXCIlc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCIlc1xcXCIsXCJcbitcdFx0XHRcdFwiXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9JXNcIixcbitcdFx0XHRcdGkgPyBcIixcIiA6IFwiW1wiLCBpZHNbaV0sIHR5cGVzW2ldLFxuK1x0XHRcdFx0aSA9PSAzID8gXCJkdW1wX2Rpc2NvdmVyZWRcIiA6IG5hbWUsIGVsZW1lbnRzLCBpID09IDMgPyBcIl1cIiA6IFwiXCIpO1xuK1x0fVxuK1x0c25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCBcIi1qIC1yIG1hcCBkdW1wIG5hbWUgJXNcIiwgbmFtZSk7XG4rXHRpZiAoQVNTRVJUX09LKGdldF9icGZ0b29sX2NvbW1hbmRfb3V0cHV0KGNvbW1hbmQsIG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLSAxKSxcbitcdFx0ICAgICAgXCJkdW1wX211bHRpcGxlX3Jvb3RzXCIpKSB7XG4rXHRcdG91dHB1dFtzdHJjc3BuKG91dHB1dCwgXCJcXG5cIildID0gJ1xcMCc7XG4rXHRcdEFTU0VSVF9TVFJFUShvdXRwdXQsIGV4cGVjdGVkLCBcInJvb3RzX2ZpcnN0X2FuZF9zZWVkX2RlZHVwXCIpO1xuK1x0fVxuK291dDpcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoZmRzKTsgaSsrKVxuK1x0XHRpZiAoZmRzW2ldIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZHNbaV0pO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X3VucmVhZGFibGUoYm9vbCBvdXRlcilcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBvcHRzKTtcbitcdGNoYXIgZWxlbWVudHNbT1VUUFVUX1NJWkVdLCBvdXRwdXRbT1VUUFVUX1NJWkVdLCByb290W09VVFBVVF9TSVpFXTtcbitcdGNoYXIgZXhwZWN0ZWRbT1VUUFVUX1NJWkUgKiAzXSwgcGxhaW5bT1VUUFVUX1NJWkVdID0ge307XG4rXHRjaGFyIGNvbW1hbmRbTUFYX0JQRlRPT0xfQ01EX0xFTl07XG4rXHRpbnQgaW5uZXJfZmQgPSAtMSwgb3V0ZXJfZmQgPSAtMSwgbG9va3VwX2Vycm5vO1xuK1x0X191MzIgaW5uZXJfaWQsIHJvb3RfaWQsIGtleSA9IDAsIHZhbHVlO1xuK1xuK1x0LypcbitcdCAqIEV2ZXJ5IGtleSBpcyBlbnVtZXJhYmxlLCBidXQgUEVSRl9FVkVOVF9BUlJBWSBsb29rdXAgcmV0dXJuc1xuK1x0ICogRU5PVFNVUFAgKHRoZSBrZXJuZWwtaW50ZXJuYWwgZXJybm8pLiBDaGVjayBib3RoIGVudHJpZXMgc28gYW5cbitcdCAqIGVhcmx5IGV4aXQgb24gdGhlIGZpcnN0IGxvb2t1cCBmYWlsdXJlIGNhbm5vdCBwYXNzLlxuK1x0ICovXG4rXHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9QRVJGX0VWRU5UX0FSUkFZLCBcImR1bXBfdW5yZWFkYWJsZVwiLFxuK1x0XHRcdFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMiwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCJjcmVhdGVfdW5yZWFkYWJsZVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9MVChicGZfbWFwX2xvb2t1cF9lbGVtKGlubmVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNnZhbHVlKSwgMCxcbitcdFx0ICAgICAgIFwidW5yZWFkYWJsZV9sb29rdXBcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0bG9va3VwX2Vycm5vID0gZXJybm87XG4rXHRpZiAoIUFTU0VSVF9ORVEobG9va3VwX2Vycm5vLCBFTk9FTlQsIFwidW5yZWFkYWJsZV9ub3RfbWlzc2luZ1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpbm5lcl9pZCA9IG1hcF9pZChpbm5lcl9mZCk7XG4rXHRpZiAoIWlubmVyX2lkIHx8ICFkdW1wX21hcChpbm5lcl9pZCwgXCItalwiLCBlbGVtZW50cykpXG4rXHRcdGdvdG8gb3V0O1xuK1x0QVNTRVJUX0VRKGNvdW50X3Rva2VuKGVsZW1lbnRzLCBcIlxcXCJlcnJvclxcXCI6XCIpLCAyLCBcImRlZmF1bHRfanNvbl9lcnJvcnNcIik7XG4rXHRzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIFwibWFwIGR1bXAgaWQgJXVcIiwgaW5uZXJfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgcGxhaW4sIHNpemVvZihwbGFpbikgLSAxKSxcbitcdFx0ICAgICAgIFwiZGVmYXVsdF9wbGFpbl91bnJlYWRhYmxlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdEFTU0VSVF9FUShjb3VudF90b2tlbihwbGFpbiwgc3RyZXJyb3IobG9va3VwX2Vycm5vKSksIDIsIFwiZGVmYXVsdF9wbGFpbl9lcnJvcnNcIik7XG4rXHRBU1NFUlRfSEFTX1NVQlNUUihwbGFpbiwgXCJGb3VuZCAwIGVsZW1lbnRzXCIsIFwiZGVmYXVsdF9wbGFpbl9jb3VudFwiKTtcbitcbitcdHJvb3RfaWQgPSBpbm5lcl9pZDtcbitcdGlmIChvdXRlcikge1xuK1x0XHRvcHRzLmlubmVyX21hcF9mZCA9IGlubmVyX2ZkO1xuK1x0XHRvdXRlcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWV9PRl9NQVBTLCBcImR1bXBfb3V0ZXJcIixcbitcdFx0XHRcdFx0ICBzaXplb2Yoa2V5KSwgc2l6ZW9mKHZhbHVlKSwgMSwgXHUwMDI2b3B0cyk7XG4rXHRcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJwb3B1bGF0ZV9vdXRlclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0cm9vdF9pZCA9IG1hcF9pZChvdXRlcl9mZCk7XG4rXHRcdGlmICghcm9vdF9pZCB8fCAhZHVtcF9tYXAocm9vdF9pZCwgXCItalwiLCByb290KSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4rXHRcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwiYXJyYXlfb2ZfbWFwc1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX291dGVyXFxcIixcIlxuK1x0XHRcdCBcIlxcXCJmbGFnc1xcXCI6MCxcXFwiZWxlbWVudHNcXFwiOiVzfSx7XFxcImlkXFxcIjoldSxcIlxuK1x0XHRcdCBcIlxcXCJ0eXBlXFxcIjpcXFwicGVyZl9ldmVudF9hcnJheVxcXCIsXFxcIm5hbWVcXFwiOlxcXCJkdW1wX3VucmVhZGFibGVcXFwiLFwiXG4rXHRcdFx0IFwiXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9XVwiLCByb290X2lkLCByb290LCBpbm5lcl9pZCwgZWxlbWVudHMpO1xuK1x0fSBlbHNlIHtcbitcdFx0c25wcmludGYoZXhwZWN0ZWQsIHNpemVvZihleHBlY3RlZCksXG4rXHRcdFx0IFwiW3tcXFwiaWRcXFwiOiV1LFxcXCJ0eXBlXFxcIjpcXFwicGVyZl9ldmVudF9hcnJheVxcXCIsXCJcbitcdFx0XHQgXCJcXFwibmFtZVxcXCI6XFxcImR1bXBfdW5yZWFkYWJsZVxcXCIsXFxcImZsYWdzXFxcIjowLFxcXCJlbGVtZW50c1xcXCI6JXN9XVwiLFxuK1x0XHRcdCBpbm5lcl9pZCwgZWxlbWVudHMpO1xuK1x0fVxuK1x0aWYgKGR1bXBfbWFwKHJvb3RfaWQsIFwiLWogLXJcIiwgb3V0cHV0KSlcbitcdFx0QVNTRVJUX1NUUkVRKG91dHB1dCwgZXhwZWN0ZWQsIFwicmVjdXJzaXZlX3VucmVhZGFibGVfanNvblwiKTtcbitcdG1lbXNldChvdXRwdXQsIDAsIHNpemVvZihvdXRwdXQpKTtcbitcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCItciBtYXAgZHVtcCBpZCAldVwiLCByb290X2lkKTtcbitcdGlmIChBU1NFUlRfT0soZ2V0X2JwZnRvb2xfY29tbWFuZF9vdXRwdXQoY29tbWFuZCwgb3V0cHV0LCBzaXplb2Yob3V0cHV0KSAtIDEpLFxuK1x0XHQgICAgICBcInJlY3Vyc2l2ZV91bnJlYWRhYmxlX3BsYWluXCIpKSB7XG4rXHRcdEFTU0VSVF9IQVNfU1VCU1RSKG91dHB1dCwgcGxhaW4sIFwicmVjdXJzaXZlX3BsYWluX3ByZXNlcnZlc19lcnJvcnNcIik7XG4rXHRcdEFTU0VSVF9FUShjb3VudF90b2tlbihvdXRwdXQsIHN0cmVycm9yKGxvb2t1cF9lcnJubykpLCAyLFxuK1x0XHRcdCAgXCJyZWN1cnNpdmVfcGxhaW5fZXJyb3JzXCIpO1xuK1x0XHRBU1NFUlRfRVEoY291bnRfdG9rZW4ob3V0cHV0LCBcIkZvdW5kIFwiKSwgb3V0ZXIgPyAyIDogMSxcbitcdFx0XHQgIFwicmVjdXJzaXZlX3BsYWluX21hcHNcIik7XG4rXHR9XG4rb3V0OlxuK1x0aWYgKG91dGVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2Uob3V0ZXJfZmQpO1xuK1x0aWYgKGlubmVyX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoaW5uZXJfZmQpO1xuK31cbitcbitzdGF0aWMgdm9pZCB0ZXN0X21hbnlfaW5uZXJfbWFwcyhib29sIGpzb24pXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgb3B0cyk7XG4rXHRjb25zdCBzdHJ1Y3QgcmxpbWl0IGxpbWl0ID0geyAucmxpbV9jdXIgPSAzMiwgLnJsaW1fbWF4ID0gMzIgfTtcbitcdGNoYXIgY29tbWFuZFtNQVhfQlBGVE9PTF9DTURfTEVOXSwgdG9rZW5bNjRdO1xuK1x0X191MzIgaWRzWzY0XSwgcm9vdF9pZCwga2V5O1xuK1x0aW50IGlubmVyX2ZkID0gLTEsIG91dGVyX2ZkID0gLTEsIHN0YXR1cztcbitcdGludCBpbmhlcml0ZWRfZmRzWzMyXSwgbnJfaW5oZXJpdGVkID0gMCwgaTtcbitcdGNoYXIgKm91dHB1dCA9IE5VTEw7XG4rXHRwaWRfdCBwaWQ7XG4rXG4rXHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChpbm5lcl9mZCwgXCJjcmVhdGVfdGVtcGxhdGVcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0b3B0cy5pbm5lcl9tYXBfZmQgPSBpbm5lcl9mZDtcbitcdG91dGVyX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZX09GX01BUFMsIFwiZHVtcF9vdXRlclwiLCA0LCA0LFxuK1x0XHRcdFx0ICBBUlJBWV9TSVpFKGlkcyksIFx1MDAyNm9wdHMpO1xuK1x0Y2xvc2UoaW5uZXJfZmQpO1xuK1x0aW5uZXJfZmQgPSAtMTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG91dGVyX2ZkLCBcImNyZWF0ZV9vdXRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRmb3IgKGtleSA9IDA7IGtleSBcdTAwM2MgQVJSQVlfU0laRShpZHMpOyBrZXkrKykge1xuK1x0XHRpbm5lcl9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcImR1bXBfaW5uZXJcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRcdGlmICghQVNTRVJUX09LX0ZEKGlubmVyX2ZkLCBcImNyZWF0ZV9pbm5lclwiKSB8fFxuK1x0XHQgICAgIUFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG91dGVyX2ZkLCBcdTAwMjZrZXksIFx1MDAyNmlubmVyX2ZkLCBCUEZfQU5ZKSxcbitcdFx0XHQgICAgICAgXCJwb3B1bGF0ZV9vdXRlclwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0aWRzW2tleV0gPSBtYXBfaWQoaW5uZXJfZmQpO1xuK1x0XHRpZiAoIWlkc1trZXldKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHQvKiBUaGUgb3V0ZXIgbWFwIGtlZXBzIGVhY2ggZGlzdGluY3QgaW5uZXIgbWFwIGFsaXZlLiAqL1xuK1x0XHRjbG9zZShpbm5lcl9mZCk7XG4rXHRcdGlubmVyX2ZkID0gLTE7XG4rXHR9XG4rXHRyb290X2lkID0gbWFwX2lkKG91dGVyX2ZkKTtcbitcdG91dHB1dCA9IGNhbGxvYygxLCA2NTUzNik7XG4rXHRpZiAoIXJvb3RfaWQgfHwgIUFTU0VSVF9PS19QVFIob3V0cHV0LCBcImFsbG9jYXRlX291dHB1dFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBGaWxsIHRoZSBsb3cgRkQgc2xvdHMgdG8gZXhlcmNpc2UgaW5oZXJpdGVkIGRlc2NyaXB0b3IgY2xlYW51cC4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoaW5oZXJpdGVkX2Zkcyk7IGkrKykge1xuK1x0XHRpbnQgZmQgPSBvcGVuKFwiL2Rldi9udWxsXCIsIE9fUkRPTkxZKTtcbitcbitcdFx0aWYgKCFBU1NFUlRfT0tfRkQoZmQsIFwib3Blbl9pbmhlcml0ZWRfZmRcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdGluaGVyaXRlZF9mZHNbbnJfaW5oZXJpdGVkKytdID0gZmQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogQ3JlYXRlIGFsbCBmaXh0dXJlcyBiZWZvcmUgbG93ZXJpbmcgdGhlIGxpbWl0LCBhbmQga2VlcCB0aGUgdGVzdFxuK1x0ICogcnVubmVyJ3MgbGltaXQgdW5jaGFuZ2VkLiBSZXRhaW5pbmcgZXZlcnkgZGlzY292ZXJlZCBGRCB3b3VsZCBleGNlZWRcbitcdCAqIHRoaXMgbGltaXQgYmVmb3JlIHRoZSByZWN1cnNpdmUgZHVtcCBjb3VsZCB2aXNpdCBhbGwgaW5uZXIgbWFwcy5cbitcdCAqL1xuK1x0cGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UocGlkLCAwLCBcImZvcmtcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFwaWQpIHtcbitcdFx0c3RydWN0IGRpcmVudCAqZW50cnk7XG4rXHRcdERJUiAqZGlyO1xuK1xuK1x0XHQvKiBSZXNlcnZlIGEgc2xvdCBmb3IgdGhlIGRpcmVjdG9yeSBldmVuIGlmIHRoZSBwYXJlbnQgaXMgZnVsbC4gKi9cbitcdFx0Y2xvc2UoaW5oZXJpdGVkX2Zkc1tucl9pbmhlcml0ZWQgLSAxXSk7XG4rXHRcdGRpciA9IG9wZW5kaXIoXCIvcHJvYy9zZWxmL2ZkXCIpO1xuK1x0XHRpZiAoIWRpcilcbitcdFx0XHRfZXhpdCg2KTtcbitcdFx0LyogVGhlIHBhcmVudCBrZWVwcyB0aGUgb3V0ZXIgbWFwIGFuZCBpdHMgaW5uZXIgbWFwcyBhbGl2ZS4gKi9cbitcdFx0Zm9yICg7Oykge1xuK1x0XHRcdGNoYXIgKmVuZDtcbitcdFx0XHRsb25nIGZkO1xuK1xuK1x0XHRcdGVycm5vID0gMDtcbitcdFx0XHRlbnRyeSA9IHJlYWRkaXIoZGlyKTtcbitcdFx0XHRpZiAoIWVudHJ5KSB7XG4rXHRcdFx0XHRpZiAoZXJybm8pXG4rXHRcdFx0XHRcdF9leGl0KDYpO1xuK1x0XHRcdFx0YnJlYWs7XG4rXHRcdFx0fVxuK1x0XHRcdGZkID0gc3RydG9sKGVudHJ5LVx1MDAzZWRfbmFtZSwgXHUwMDI2ZW5kLCAxMCk7XG4rXHRcdFx0aWYgKCplbmQgfHwgZmQgXHUwMDNjIDMgfHwgZmQgPT0gZGlyZmQoZGlyKSlcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdGNsb3NlKGZkKTtcbitcdFx0fVxuK1x0XHRpZiAoY2xvc2VkaXIoZGlyKSlcbitcdFx0XHRfZXhpdCg2KTtcbitcdFx0aWYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCBcdTAwMjZsaW1pdCkpXG4rXHRcdFx0X2V4aXQoMSk7XG4rXHRcdHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgXCIlcyAtciBtYXAgZHVtcCBpZCAldVwiLFxuK1x0XHRcdCBqc29uID8gXCItalwiIDogXCJcIiwgcm9vdF9pZCk7XG4rXHRcdGlmIChnZXRfYnBmdG9vbF9jb21tYW5kX291dHB1dChjb21tYW5kLCBvdXRwdXQsIDY1NTM1KSlcbitcdFx0XHRfZXhpdCgyKTtcbitcdFx0aWYgKGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFwiXFxcImlkXFxcIjpcIiA6IFwiRm91bmQgXCIpICE9IEFSUkFZX1NJWkUoaWRzKSArIDEgfHxcbitcdFx0ICAgIGNvdW50X3Rva2VuKG91dHB1dCwganNvbiA/IFwiXFxcImlubmVyX21hcF9pZFxcXCI6XCIgOiBcImlubmVyX21hcF9pZDpcIikgIT1cbitcdFx0ICAgIEFSUkFZX1NJWkUoaWRzKSlcbitcdFx0XHRfZXhpdCgzKTtcbitcdFx0Zm9yIChrZXkgPSAwOyBrZXkgXHUwMDNjIEFSUkFZX1NJWkUoaWRzKTsga2V5KyspIHtcbitcdFx0XHRpZiAoanNvbilcbitcdFx0XHRcdHNucHJpbnRmKHRva2VuLCBzaXplb2YodG9rZW4pLCBcIlxcXCJpZFxcXCI6JXUsXCIsIGlkc1trZXldKTtcbitcdFx0XHRlbHNlXG4rXHRcdFx0XHRzbnByaW50Zih0b2tlbiwgc2l6ZW9mKHRva2VuKSwgXCJcXG4ldTogaGFzaCAgbmFtZSBkdW1wX2lubmVyICBcIixcbitcdFx0XHRcdFx0IGlkc1trZXldKTtcbitcdFx0XHRpZiAoY291bnRfdG9rZW4ob3V0cHV0LCB0b2tlbikgIT0gMSlcbitcdFx0XHRcdF9leGl0KDQpO1xuK1x0XHR9XG4rXHRcdGlmIChqc29uIFx1MDAyNlx1MDAyNiAob3V0cHV0WzBdICE9ICdbJyB8fFxuK1x0XHRcdCAgICAgc3RyY21wKG91dHB1dCArIHN0cmxlbihvdXRwdXQpIC0gMiwgXCJdXFxuXCIpKSlcbitcdFx0XHRfZXhpdCg1KTtcbitcdFx0X2V4aXQoMCk7XG4rXHR9XG4rXHRpZiAoQVNTRVJUX0VRKHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApLCBwaWQsIFwid2FpdHBpZFwiKSBcdTAwMjZcdTAwMjZcbitcdCAgICBBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCJjaGlsZF9leGl0ZWRcIikpXG4rXHRcdEFTU0VSVF9FUShXRVhJVFNUQVRVUyhzdGF0dXMpLCAwLCBcImR1bXBfd2l0aF9sb3dfZmRfbGltaXRcIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9pbmhlcml0ZWQ7IGkrKylcbitcdFx0QVNTRVJUX0dFKGZjbnRsKGluaGVyaXRlZF9mZHNbaV0sIEZfR0VURkQpLCAwLCBcInBhcmVudF9mZF9wcmVzZXJ2ZWRcIik7XG4rXHRBU1NFUlRfRVEobWFwX2lkKG91dGVyX2ZkKSwgcm9vdF9pZCwgXCJwYXJlbnRfb3V0ZXJfcHJlc2VydmVkXCIpO1xuK291dDpcbitcdHdoaWxlIChucl9pbmhlcml0ZWQpXG4rXHRcdGNsb3NlKGluaGVyaXRlZF9mZHNbLS1ucl9pbmhlcml0ZWRdKTtcbitcdGZyZWUob3V0cHV0KTtcbitcdGlmIChvdXRlcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG91dGVyX2ZkKTtcbitcdGlmIChpbm5lcl9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGlubmVyX2ZkKTtcbit9XG4rXG4rdm9pZCB0ZXN0X2JwZnRvb2xfbWFwX2R1bXAodm9pZClcbit7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfb3JkaW5hcnlcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZShmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInVucmVhZGFibGVfaW5uZXJcIikpXG4rXHRcdHRlc3RfdW5yZWFkYWJsZSh0cnVlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWFueV9pbm5lcl9tYXBzX2pzb25cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKHRydWUpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtYW55X2lubmVyX21hcHNfcGxhaW5cIikpXG4rXHRcdHRlc3RfbWFueV9pbm5lcl9tYXBzKGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibXVsdGlwbGVfcm9vdHNcIikpXG4rXHRcdHRlc3RfbXVsdGlwbGVfcm9vdHMoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMSwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNoYXJlZF9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMiwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfYXJyYXlfb2ZfbWFwc1wiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfQVJSQVlfT0ZfTUFQUywgMCwgZmFsc2UsIGZhbHNlKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiZW1wdHlfaGFzaF9vZl9tYXBzXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDAsIGZhbHNlLCBmYWxzZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImJ0Zl9pbm5lclwiKSlcbitcdFx0dGVzdF9vdXRlcihCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTLCAxLCBmYWxzZSwgdHJ1ZSk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImVtcHR5X2lubmVyXCIpKVxuK1x0XHR0ZXN0X291dGVyKEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFMsIDEsIHRydWUsIGZhbHNlKTtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjozNDo0MS45NDQ2MjM4MjFaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0ODk2MTE4MzMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlBhdGNoIEFuYWx5c2lzOiBXb3J0aEZ1enppbmcgRGV0ZXJtaW5hdGlvbioqXG5cbk9rYXksIGxldCdzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCBzY2FuIG9mIHRoZSBkaWZmIHJldmVhbHMgY2hhbmdlcyBzY2F0dGVyZWQgYWNyb3NzIHNldmVyYWwgZmlsZXMsIHNwZWNpZmljYWxseSB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC4gSSBzZWUgdXBkYXRlcyB0byBkb2N1bWVudGF0aW9uLCBiYXNoIGNvbXBsZXRpb24sIHRoZSBtYWluIHByb2dyYW0sIG1hcCBmdW5jdGlvbmFsaXR5LCBhbmQgYSBzZWxmdGVzdC5cblxuTm93LCBsZXQncyBxdWlja2x5IGNyb3NzLXJlZmVyZW5jZSB0aGF0IHdpdGggdGhlIGRlZmluZWQgY3JpdGVyaWEgZm9yIGBXb3J0aEZ1enppbmdgLiBUaGUgbmVnYXRpdmUgY3JpdGVyaWEgKHdoZW4gdG8gKm5vdCogZnV6eikgaXMgd2hhdCBJIG5lZWQgdG8gZm9jdXMgb24uIFNwZWNpZmljYWxseSwgaXQgc3RhdGVzIHRoYXQgbW9kaWZpY2F0aW9ucyBjb25maW5lZCB0byBcIk5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXNcIiBvciBcIlVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMuLi4gdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzXCIgd2FycmFudCBhIGBXb3J0aEZ1enppbmc9ZmFsc2VgIHZlcmRpY3QuXG5cbkZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgc2NvcGUuIE15IGFuYWx5c2lzIGNvbmZpcm1zIHRoZSBhYnNlbmNlIG9mIGNoYW5nZXMgb3V0c2lkZSB0aGUgYHRvb2xzL2AgZGlyZWN0b3J5LiBObyB0b3VjaGluZyBvZiBjcml0aWNhbCBrZXJuZWwgY29tcG9uZW50cyBsaWtlIGBrZXJuZWwvYCwgYG5ldC9gLCBgZHJpdmVycy9gLCBgaW5jbHVkZS9gLCBgYXJjaC9gLCBgZnMvYCwgb3IgYG1tL2AgaXMgcHJlc2VudC4gQWxsIG1vZGlmaWNhdGlvbnMgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYHRvb2xzL2JwZi9icGZ0b29sL2AgYW5kIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYC5cblxuR2l2ZW4gdGhpcywgdGhlIHBhdGNoIGV4Y2x1c2l2ZWx5IGFsdGVycyB1c2VyLXNwYWNlIHRvb2xzIGFuZCBhc3NvY2lhdGVkIHNlbGZ0ZXN0cy4gQWNjb3JkaW5nIHRvIHRoZSBjcml0ZXJpYSwgdGhpcyBkZWZpbml0aXZlbHkgZmFsbHMgdW5kZXIgdGhlIFwiV29ydGhGdXp6aW5nPWZhbHNlXCIgY2F0ZWdvcnkuIFRoZXJlZm9yZSwgSSdtIGdvaW5nIHRvIHNldCBgV29ydGhGdXp6aW5nYCB0byBgZmFsc2VgLlxuXG5UaGUgcmVhc29uaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZDogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2VyLXNwYWNlIHRvb2xzIChgdG9vbHMvYnBmL2JwZnRvb2wvYCkgYW5kIHNlbGZ0ZXN0cyAoYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ApLCBhbmQgZG9lcyBub3QgYWx0ZXIgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIgTm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZsYWdzIGFyZSBuZWVkZWQsIHNvIGBFbmFibGVDb25maWdzYCBhbmQgYEZvY3VzU3ltYm9sc2Agd2lsbCBiZSBlbXB0eS4gSSdtIHJlYWR5IHRvIHByb2NlZWQgd2l0aCB0aGUgYHNldC1yZXN1bHRzYCBjYWxsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzk4NSwiT3V0cHV0VG9rZW5zIjo5MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU1MSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDA2OjM0OjQ2Ljg0MDc0NTA0NFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcxODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdXNlci1zcGFjZSB0b29scyAoYnBmdG9vbCkgdW5kZXIgdG9vbHMvYnBmL2JwZnRvb2wgYW5kIHRlc3RzIHVuZGVyIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi4gSXQgZG9lcyBub3QgdG91Y2ggYW55IGtlcm5lbC1zcGFjZSBjb2RlIG9yIGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHVzZXItc3BhY2UgdG9vbHMgKGJwZnRvb2wpIHVuZGVyIHRvb2xzL2JwZi9icGZ0b29sIGFuZCB0ZXN0cyB1bmRlciB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYuIEl0IGRvZXMgbm90IHRvdWNoIGFueSBrZXJuZWwtc3BhY2UgY29kZSBvciBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QwNjozNDo0Ni44NDA3NjU3OTNaIiwiU2VxIjo1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTczMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow2gwds[1] Phase: Running StartedAt: 2026-09-07 06:34:57 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow2gwds[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-07 06:34:57 +0000 UTC FinishedAt: 2026-09-07 06:35:02 +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,}