amd-mixture-of-experts · submission 29857
KernelBot user 376 · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.
baguette_moe_3.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-29857?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp16
Benchmark evidence
2 measurements across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:c25887010a4ce38a038c61c3323e8c19bba857ab627673927ae5101c3fcd350e
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
baguette_moe_3.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1taXh0dXJlLW9mLWV4cGVydHMKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiN1bmRlZiBfX0hJUF9OT19IQUxGX09QRVJBVE9SU19fCiN1bmRlZiBfX0hJUF9OT19IQUxGX0NPTlZFUlNJT05TX18KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwOC5oPgojaW5jbHVkZSA8cHliaW5kMTEvcHliaW5kMTEuaD4KI2luY2x1ZGUgPHB5YmluZDExL3N0bC5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDx1bmlzdGQuaD4gIAojaW5jbHVkZSA8cm9jYmxhcy9yb2NibGFzLmg+CgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9iZjE2Lmg+CiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwOC5oPgoKCgoKCgp1c2luZyBmcDE2ID0gX19oYWxmOwoKCgogCiNkZWZpbmUgV0FSUF9TSVpFIDY0CiNkZWZpbmUgTl9XQVJQX1lfREVGIDQKI2RlZmluZSBOX1dBUlBfWF9ERUYgNAovLyBPdXRwdXQgVGlsZSBjb25maWcKI2RlZmluZSBUSUxFX1NJWkVfWV9ERUYgMTI4CiNkZWZpbmUgVElMRV9TSVpFX1hfREVGIDEyOAojZGVmaW5lIFRJTEVfS19ESU1fREVGIDY0CgoKdXNpbmcgdmVjNGYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNCAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7CnVzaW5nIHZlYzRmcDE2ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YoX19mcDE2KSkpKSBfX2ZwMTY7CnVzaW5nIHZlYzJ1ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDIgKiBzaXplb2YodWludDMyX3QpKSkpIHVpbnQzMl90OwoKI2RlZmluZSBISVBfQ0hFQ0soY2FsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACmhpcEVycm9yX3QgZXJyID0gY2FsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKaWYgKGVyciAhPSBoaXBTdWNjZXNzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQApzdGQ6OmNlcnIgPDwgIkhJUCBlcnJvcjogIiA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnIpIDw8ICIgYXQgbGluZSAiICAgICAgQAo8PCBfX0xJTkVfXyA8PCBzdGQ6OmVuZGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACmV4aXQoZXJyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKfQoKX19kZXZpY2VfXyB2b2lkIG1hdG11bDE2eDE2X2YxNihjb25zdCBmcDE2ICphLCBjb25zdCBmcDE2ICpiLCB2ZWM0ZiAmYywgaW50IGFfcm93X29mZnNldCwgaW50IGJfY29sX29mZnNldCwgaW50IGtfb2Zmc2V0LCAgaW50IEssIGludCBOKQp7CmludCB0aWQgPSB0aHJlYWRJZHgueCAlIFdBUlBfU0laRTsKaW50IHJvd19hID0gdGlkICUgMTY7CmludCBjb2xfYSA9ICh0aWQgLyAxNik7CgppbnQgY29sX2IgPSAodGlkJTE2KS80OwppbnQgcm93X2IgPSAodGlkJTQpICsodGlkLzE2KSo0OwoKaW50IHJvd19hX2cgPSBhX3Jvd19vZmZzZXQrcm93X2E7CmludCBjb2xfYV9nID0ga19vZmZzZXQvNCtjb2xfYTsgCgppbnQgcm93X2JfZyA9IGtfb2Zmc2V0ICsgcm93X2I7CmludCBjb2xfYl9nID0gYl9jb2xfb2Zmc2V0LzQgKyBjb2xfYjsKCmludCBjb2xfYV9nX3N3aXp6bGVkID0gKGNvbF9hX2cgXiAocm93X2FfZyAlIDE2KSk7CmludCBjb2xfYl9nX3N3aXp6bGVkID0gKChjb2xfYl9nIC8gNCkgXiAocm93X2JfZyAlIDgpKSAqIDQgKyBjb2xfYl9nICUgNDsKCmF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjNGZwMTYgKj4oYSArIHJvd19hX2cgKiBLKVtjb2xfYV9nX3N3aXp6bGVkXTsKYXV0byBwYWNrZWRCID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2ZWM0ZnAxNiAqPihiICsgcm93X2JfZyAqIE4pW2NvbF9iX2dfc3dpenpsZWRdOwoKYyA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MTZmMTYocGFja2VkQSwgcGFja2VkQiwgYywgMCwgMCwgMCk7Cn0KCl9fZGV2aWNlX18gdm9pZCBtYXRtdWwxNngxNl9mMTZfMihjb25zdCBmcDE2ICphLCBjb25zdCBmcDE2ICpiLCB2ZWM0ZiAmYywgaW50IGFfcm93X29mZnNldCwgaW50IGFfY29sX29mZnNldCxpbnQgYl9yb3dfb2Zmc2V0LCBpbnQgYl9jb2xfb2Zmc2V0LCAgIGludCBLLCBpbnQgTikKewppbnQgdGlkID0gdGhyZWFkSWR4LnggJSBXQVJQX1NJWkU7CmludCByb3dfYSA9IHRpZCAlIDE2OwppbnQgY29sX2EgPSAodGlkIC8gMTYpOwppbnQgcm93X2IgPSB0aWQgJSAxNjsKaW50IGNvbF9iID0gKHRpZCAvIDE2KTsKaW50IHJvd19hX2cgPSBhX3Jvd19vZmZzZXQrcm93X2E7CmludCBjb2xfYV9nID0gYV9jb2xfb2Zmc2V0LzQrY29sX2E7IAppbnQgcm93X2JfZyA9IGJfcm93X29mZnNldCArIHJvd19iOwppbnQgY29sX2JfZyA9IGJfY29sX29mZnNldC80ICsgY29sX2I7CmludCBjb2xfYV9nX3N3aXp6bGVkID0gKGNvbF9hX2cgXiAocm93X2FfZyAlIDE2KSk7CmludCBjb2xfYl9nX3N3aXp6bGVkID0gKGNvbF9iX2cgXiAocm93X2JfZyAlIDE2KSk7CmF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjNGZwMTYgKj4oYSArIHJvd19hX2cgKiBLKVtjb2xfYV9nX3N3aXp6bGVkXTsKYXV0byBwYWNrZWRCID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2ZWM0ZnAxNiAqPihiICsgcm93X2JfZyAqIE4pW2NvbF9iX2dfc3dpenpsZWRdOwoKYyA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MTZmMTYocGFja2VkQSwgcGFja2VkQiwgYywgMCwgMCwgMCk7Cn0KCnRlbXBsYXRlPGJvb2wgdXNlTWFwcGluZywgYm9vbCBza2lwQT4KX19kZXZpY2VfXyB2b2lkIGxvYWRMRFMoaW50IHdhcnBJZCwgaW50IGxhbmVJZCwgaW50IGtJZCwgZnAxNiAqc19hLCBmcDE2ICpzX2IsCmNvbnN0IGZwMTYgKmEsIGNvbnN0IGZwMTYgKmIsIGludCBLLCBpbnQgTixjb25zdCBpbnQzMl90KmRfbWFwcGluZykgewoKY29uc3RleHByIGludCBuYlJlYWRQZXJUaHJlYWQgPSA0Owpjb25zdGV4cHIgaW50IG5iV2FycFBlck1hdHJpeCA9IDg7CmNvbnN0IGZwMTYgKnB0ciA9IGE7CmZwMTYgKmRzdCA9IHNfYTsKaW50IHdhcnBJZExvY2FsID0gd2FycElkJW5iV2FycFBlck1hdHJpeDsKaW50IHN0cmlkZSA9IEs7CmJvb2wgdHJhbnNwb3NlID0gZmFsc2U7CmludCBESU0gPSBUSUxFX0tfRElNX0RFRi9uYlJlYWRQZXJUaHJlYWQ7CnVpbnQzMl90IHJvd19vZmZzZXQgPSBUSUxFX1NJWkVfWF9ERUYgKiBibG9ja0lkeC55OyAKdWludDMyX3QgY29sX29mZnNldCA9IGtJZDsKY29uc3QgaW50MzJfdCpkX21hcHBpbmdfciA9IGRfbWFwcGluZzsKCmlmICh3YXJwSWQ+PW5iV2FycFBlck1hdHJpeCl7CnB0cj1iOwpkc3Q9c19iOwpzdHJpZGU9IE47CnRyYW5zcG9zZT0gdHJ1ZTsKcm93X29mZnNldCA9IGtJZDsKY29sX29mZnNldCA9IFRJTEVfU0laRV9ZX0RFRiAqIGJsb2NrSWR4Lng7CkRJTSA9IFRJTEVfU0laRV9ZX0RFRi9uYlJlYWRQZXJUaHJlYWQ7IApkX21hcHBpbmdfcj1udWxscHRyOwp9CmVsc2V7CmlmIGNvbnN0ZXhwcihza2lwQSl7CnJldHVybjsKfQp9CgppbnQgbmJSb3dzUGVyV2FycCA9IFdBUlBfU0laRS9ESU0qbmJSZWFkUGVyVGhyZWFkOwp2ZWMydSBiX3ZhbHVlW25iUmVhZFBlclRocmVhZF0gPSB7MH07CgoKZm9yIChpbnQgciA9IDA7IHIgPCBuYlJlYWRQZXJUaHJlYWQ7IHIrKykgewppbnQgY29sID0gbGFuZUlkICUgRElNOwppbnQgcm93ID0gciArIG5iUm93c1BlcldhcnAgKiB3YXJwSWRMb2NhbCArIG5iUmVhZFBlclRocmVhZCAqIChsYW5lSWQgLyBESU0pOwppbnQgcm93X2dsb2JhbCA9IChyb3dfb2Zmc2V0ICsgcm93KTsKaWYgY29uc3RleHByKHVzZU1hcHBpbmcpewppZiAoZF9tYXBwaW5nX3IhPSBudWxscHRyKXsKaW50IHJvd19nbG9iYWxfdG1wID0gZF9tYXBwaW5nX3Jbcm93X2dsb2JhbF07CnJvd19nbG9iYWw9cm93X2dsb2JhbF90bXA7Cn0KfQpiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19nbG9iYWwpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiBuYlJlYWRQZXJUaHJlYWQpKSlbMF07Cn0KCnZlYzJ1IHJlc3VsdF9iW25iUmVhZFBlclRocmVhZF07CmlmICh0cmFuc3Bvc2Upewpmb3IgKGludCBpID0gMDsgaSA8IG5iUmVhZFBlclRocmVhZDsgKytpKQpmb3IgKGludCBqID0gMDsgaiA8IG5iUmVhZFBlclRocmVhZDsgKytqKSB7CnJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4oJnJlc3VsdF9iW2ldKVtqXSA9CnJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4oJmJfdmFsdWVbal0pW2ldOwp9Cgpmb3IgKGludCByID0gMDsgciA8IG5iUmVhZFBlclRocmVhZDsgcisrKSB7CmludCBjb2wgPSBsYW5lSWQgJSBESU07CmludCByb3cgPSByICsgbmJSb3dzUGVyV2FycCAqIHdhcnBJZExvY2FsICsgbmJSZWFkUGVyVGhyZWFkICogKGxhbmVJZCAvIERJTSk7CgppbnQgY29sX3N3aXp6bGVkID0gKChjb2wgLyA0KSBeIChyb3cgJSA4KSkgKiA0ICsgY29sICUgNDsKKHJlaW50ZXJwcmV0X2Nhc3Q8dmVjNGZwMTYgKj4oZHN0KSlbKERJTSkqcm93ICsgY29sX3N3aXp6bGVkXSA9IHJlc3VsdF9iW3JdOwp9Cgp9ZWxzZXsKZm9yIChpbnQgaSA9IDA7IGkgPCBuYlJlYWRQZXJUaHJlYWQ7ICsraSl7CnJlc3VsdF9iW2ldPWJfdmFsdWVbaV07Cn0KZm9yIChpbnQgciA9IDA7IHIgPCBuYlJlYWRQZXJUaHJlYWQ7IHIrKykgewppbnQgY29sID0gbGFuZUlkICUgRElNOwppbnQgcm93ID0gciArIG5iUm93c1BlcldhcnAgKiB3YXJwSWRMb2NhbCArIG5iUmVhZFBlclRocmVhZCAqIChsYW5lSWQgLyBESU0pOwppbnQgY29sX3N3aXp6bGVkID0gKGNvbCBeIChyb3cgJSAxNikpOwoocmVpbnRlcnByZXRfY2FzdDx2ZWM0ZnAxNiAqPihkc3QpKVsoRElNKSpyb3cgKyBjb2xfc3dpenpsZWRdID0gcmVzdWx0X2Jbcl07Cn0gIAp9Cn0KCmNvbnN0ZXhwciBpbnQgVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWV9ERUY7CmNvbnN0ZXhwciBpbnQgVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWF9ERUY7CmNvbnN0ZXhwciBpbnQgS19ESU0gPSBUSUxFX0tfRElNX0RFRjsKY29uc3RleHByIGludCBOQldBUlBTX1kgPSBOX1dBUlBfWV9ERUY7IC8vIDQKY29uc3RleHByIGludCBOQldBUlBTX1ggPSBOX1dBUlBfWF9ERUY7IC8vIDIKLy8gaW50cmluc2ljIGNvbmZpZwpjb25zdGV4cHIgaW50IE1BVE1VTF9ESU1fSyA9IDE2Owpjb25zdGV4cHIgaW50IE1BVE1VTF9ESU1fTk0gPSAxNjsKY29uc3RleHByIGludCBCTE9DS19ESU0gPSBOQldBUlBTX1ggKiBOQldBUlBTX1kgKiBXQVJQX1NJWkU7IC8vIDUxMgoKY29uc3RleHByIGludCBXQVJQX1RJTEVfU0laRV9ZID0gVElMRV9TSVpFX1kgLyBOQldBUlBTX1kgLyBNQVRNVUxfRElNX05NOyAvLyAyCmNvbnN0ZXhwciBpbnQgV0FSUF9USUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YIC8gTkJXQVJQU19YIC8gTUFUTVVMX0RJTV9OTTsgLy8gNAoKc3RydWN0IFdhcnBUaWxlIHsKdmVjNGYgY19zW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldOwp9OwoKdGVtcGxhdGU8Ym9vbCB1c2VNYXBwaW5nLGJvb2wgc2tpcEE+Cl9fZGV2aWNlX18gdm9pZCBwcm9jZXNzVGlsZShXYXJwVGlsZSAqdGlsZSwgaW50IHdhcnBJZCwgaW50IGxhbmVJZCwgaW50IGtJZCwgZnAxNiAqc19hLCBmcDE2ICpzX2IsCmNvbnN0IGZwMTYgKmEsIGNvbnN0IGZwMTYgKmIsIGludCBLLCBpbnQgTixjb25zdCBpbnQzMl90KmRfbWFwcGluZyl7CgppbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgLy8gMCAtID4gMwppbnQgd2FycElkeSA9IHdhcnBJZCAlIE5CV0FSUFNfWTsKCmxvYWRMRFM8dXNlTWFwcGluZyxza2lwQT4od2FycElkLCBsYW5lSWQsIGtJZCwgc19hLCBzX2IsIGEsIGIsIEssIE4sZF9tYXBwaW5nKTsKCl9fc3luY3RocmVhZHMoKTsKCiNwcmFnbWEgdW5yb2xsCmZvciAoaW50IHRfd0lkeCA9IDA7IHRfd0lkeCA8IFdBUlBfVElMRV9TSVpFX1g7IHRfd0lkeCsrKSB7CmZvciAoaW50IHRfd0lkeSA9IDA7IHRfd0lkeSA8IFdBUlBfVElMRV9TSVpFX1k7IHRfd0lkeSsrKSB7CmNvbnN0ZXhwciBpbnQgc3RlcFggPSBUSUxFX1NJWkVfWCAvIFdBUlBfVElMRV9TSVpFX1g7CmNvbnN0ZXhwciBpbnQgc3RlcFkgPSBUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1k7IApmb3IgKGludCBrID0gMDsgayA8IEtfRElNO2sgKz0gTUFUTVVMX0RJTV9LKSAKewppbnQgYV9yb3cgPSAodF93SWR4ICogc3RlcFgpICsgd2FycElkeCAqIE1BVE1VTF9ESU1fTk07CmludCBiX2NvbCA9ICh0X3dJZHkgKiBzdGVwWSkgKyB3YXJwSWR5ICogTUFUTVVMX0RJTV9OTTsKbWF0bXVsMTZ4MTZfZjE2KHNfYSwgc19iLHRpbGUtPmNfc1t0X3dJZHhdW3Rfd0lkeV0sIGFfcm93LCBiX2NvbCxrLEtfRElNLCBUSUxFX1NJWkVfWSk7Cn0KCn0KfQpfX3N5bmN0aHJlYWRzKCk7Cgp9CnRlbXBsYXRlPGJvb2wgYXBwbHlTaWdtb2lkLCBib29sIHVzZVNjYWxpbmcsIGJvb2wgdXNlTWFwcGluZywgYm9vbCBoYXNNdWx0aXBsZVdlaWdodHM+Cl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXyhOX1dBUlBfWF9ERUYgKk5fV0FSUF9ZX0RFRiAqV0FSUF9TSVpFKSAKY3VzdG9tX2tlcm5lbChjb25zdCBmcDE2ICphLCAKY29uc3QgZnAxNiAqYl9pbiwKY29uc3QgZnAxNiAqKmJfYXJyYXksCmZwMTYgKmMsIGludCBNLCBpbnQgTiwgaW50IEssCmZwMTYqIGRfc2NhbGluZywKaW50MzJfdCAqZF9ibG9ja19tYXBwaW5nLAppbnQzMl90ICpkX21hcHBpbmcgCikgewoKaW50IHRpZCA9IHRocmVhZElkeC54OwppbnQgbGFuZUlkID0gdGlkICUgV0FSUF9TSVpFOwpmbG9hdCByZXN1bHQgPSAwOwpjb25zdCBmcDE2KiBiID0gYl9pbjsKaWYgY29uc3RleHByKGhhc011bHRpcGxlV2VpZ2h0cyl7CmIgPSBiX2FycmF5W2RfYmxvY2tfbWFwcGluZ1tibG9ja0lkeC55XV07Cn0KaW50IHdhcnBJZCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOwppbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgCmludCB3YXJwSWR5ID0gd2FycElkICUgTkJXQVJQU19ZOwoKX19zaGFyZWRfXyBmcDE2IHNfYVtUSUxFX1NJWkVfWF1bS19ESU1dOwpfX3NoYXJlZF9fIGZwMTYgc19iW0tfRElNXVtUSUxFX1NJWkVfWV07CgpXYXJwVGlsZSB0aWxlID0gezB9Owpmb3IgKGludCBrSWQgPSAwOyBrSWQgPCBLOyBrSWQgKz0gS19ESU0pIHsKCnByb2Nlc3NUaWxlPHVzZU1hcHBpbmcsZmFsc2U+KCZ0aWxlLCAgd2FycElkLCAgbGFuZUlkLCAga0lkLCAmc19hWzBdWzBdLCAmc19iWzBdWzBdLAphLCBiLCBLLCBOLGRfbWFwcGluZyk7Cn0KCmZvciAoaW50IHRfd0lkeCA9IDA7IHRfd0lkeCA8IFdBUlBfVElMRV9TSVpFX1g7IHRfd0lkeCsrKSB7CmZvciAoaW50IHRfd0lkeSA9IDA7IHRfd0lkeSA8IFdBUlBfVElMRV9TSVpFX1k7IHRfd0lkeSsrKSB7CmludCBjb2xfb2Zmc2V0ID0KYmxvY2tJZHgueCAqIFRJTEVfU0laRV9ZICsgICAgICAgICAgICAgICAgIC8vIFRJTEUgb2Zmc2V0Cih3YXJwSWR5ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAp0X3dJZHkgKiAoVElMRV9TSVpFX1kgLyBXQVJQX1RJTEVfU0laRV9ZKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKaW50IHJvd19vZmZzZXQgPQpibG9ja0lkeC55ICogVElMRV9TSVpFX1ggKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKKHdhcnBJZHggKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CnRfd0lkeCAqIChUSUxFX1NJWkVfWCAvIFdBUlBfVElMRV9TSVpFX1gpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CgphdXRvIHJlcyA9IHRpbGUuY19zW3Rfd0lkeF1bdF93SWR5XTsKZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKaW50IGNvbCA9IGxhbmVJZCAlIDE2OwppbnQgcm93ID0gaSArIChsYW5lSWQgLyAxNikgKiA0OwoKCmF1dG8gdG1wID0gKGZwMTYpKHJlc1tpXSk7CgppZiBjb25zdGV4cHIodXNlU2NhbGluZyl7CnRtcCo9ZF9zY2FsaW5nWyhyb3dfb2Zmc2V0ICsgcm93KSAqIE4gKyAoY29sX29mZnNldCArIGNvbCldOwp9CgppZiBjb25zdGV4cHIoYXBwbHlTaWdtb2lkKXsKZnAxNiByYXRpbyA9IGZwMTYoMS4wZi8oMS4wK2V4cCgtcmVzW2ldKSkpOwp0bXAgPSAoZnAxNikocmVzW2ldKSpyYXRpbzsKfQoKY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSA9IHRtcDsgIAoKCn0KfQp9Cn0KCiNkZWZpbmUgTl9XQVJQX1hfREVGX1NJTkdMRSAyCiNkZWZpbmUgTl9XQVJQX1lfREVGX1NJTkdMRSAyCiNkZWZpbmUgVElMRV9LX0RJTV9ERUZfU0lOR0xFIDY0CiNkZWZpbmUgVElMRV9TSVpFX1lfREVGX1NJTkdMRSAzMgojZGVmaW5lIFRJTEVfU0laRV9YX0RFRl9TSU5HTEUgMzIKCl9fZGV2aWNlX18gdm9pZCBsb2FkTERTX25vX3RyYW5zcG9zZShpbnQgd2FycElkLCBpbnQgbGFuZUlkLCBpbnQga0lkLCBmcDE2ICpzX2EsIGZwMTYgKnNfYiwgY29uc3QgZnAxNiAqYSwgY29uc3QgZnAxNiAqYiwgaW50IE0sIGludCBOLCBpbnQgSykgewpjb25zdGV4cHIgaW50IG5iUmVhZFBlclRocmVhZCA9IDQ7CmNvbnN0ZXhwciBpbnQgbmJXYXJwUGVyTWF0cml4ID0gMjsgCmNvbnN0IGZwMTYgKnB0ciA9IGE7CmZwMTYgKmRzdCA9IHNfYTsKaW50IHdhcnBJZExvY2FsID0gd2FycElkJW5iV2FycFBlck1hdHJpeDsKaW50IHN0cmlkZSA9IEs7CmludCBtYXhSb3dzID0gTTsKaW50IERJTSA9IFRJTEVfS19ESU1fREVGX1NJTkdMRS9uYlJlYWRQZXJUaHJlYWQ7CnVpbnQzMl90IHJvd19vZmZzZXQgPSBUSUxFX1NJWkVfWF9ERUZfU0lOR0xFICogYmxvY2tJZHgueTsgCnVpbnQzMl90IGNvbF9vZmZzZXQgPSBrSWQ7CmlmICh3YXJwSWQ+PW5iV2FycFBlck1hdHJpeCl7CnB0cj1iOwpkc3Q9c19iOwptYXhSb3dzID0gTjsKcm93X29mZnNldCA9IFRJTEVfU0laRV9ZX0RFRl9TSU5HTEUgKiBibG9ja0lkeC54Owp9CgppbnQgbmJSb3dzUGVyV2FycCA9IFdBUlBfU0laRS9ESU0qbmJSZWFkUGVyVGhyZWFkOwp2ZWMydSBiX3ZhbHVlW25iUmVhZFBlclRocmVhZF0gPSB7MH07Cgpmb3IgKGludCByID0gMDsgciA8IG5iUmVhZFBlclRocmVhZDsgcisrKSB7CmludCBjb2wgPSBsYW5lSWQgJSBESU07CmludCByb3cgPSByICsgbmJSb3dzUGVyV2FycCAqIHdhcnBJZExvY2FsICsgbmJSZWFkUGVyVGhyZWFkICogKGxhbmVJZCAvIERJTSk7CmludCByb3dfZ2xvYmFsID0gKHJvd19vZmZzZXQgKyByb3cpOwppZiAocm93X2dsb2JhbDxtYXhSb3dzKXsKYl92YWx1ZVtyXSA9IChyZWludGVycHJldF9jYXN0PGNvbnN0IHZlYzJ1ICo+KHB0ciArIChyb3dfZ2xvYmFsKSAqIHN0cmlkZSArIChjb2xfb2Zmc2V0ICsgY29sICogbmJSZWFkUGVyVGhyZWFkKSkpWzBdOwp9Cn0KCmZvciAoaW50IHIgPSAwOyByIDwgbmJSZWFkUGVyVGhyZWFkOyByKyspIHsKaW50IGNvbCA9IGxhbmVJZCAlIERJTTsKaW50IHJvdyA9IHIgKyBuYlJvd3NQZXJXYXJwICogd2FycElkTG9jYWwgKyBuYlJlYWRQZXJUaHJlYWQgKiAobGFuZUlkIC8gRElNKTsKaW50IGNvbF9zd2l6emxlZCA9IChjb2wgXiAocm93ICUgMTYpKTsKKHJlaW50ZXJwcmV0X2Nhc3Q8dmVjNGZwMTYgKj4oZHN0KSlbKERJTSkqcm93ICsgY29sX3N3aXp6bGVkXSA9IGJfdmFsdWVbcl07Cn0gIAp9CgpfX2dsb2JhbF9fIHZvaWQgX19sYXVuY2hfYm91bmRzX18oTl9XQVJQX1hfREVGX1NJTkdMRSAqTl9XQVJQX1lfREVGX1NJTkdMRSAqV0FSUF9TSVpFKSAKY3VzdG9tX2tlcm5lbF93Zyhjb25zdCBmcDE2ICphLCBjb25zdCBmcDE2ICpiLCBmcDE2ICpjLCBpbnQgTSwgaW50IE4sIGludCBLKSB7CgppbnQgdGlkID0gdGhyZWFkSWR4Lng7CmludCBsYW5lSWQgPSB0aWQgJSBXQVJQX1NJWkU7CmZsb2F0IHJlc3VsdCA9IDA7Cgpjb25zdGV4cHIgaW50IFRJTEVfU0laRV9ZID0gVElMRV9TSVpFX1lfREVGX1NJTkdMRTsKY29uc3RleHByIGludCBUSUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YX0RFRl9TSU5HTEU7CmNvbnN0ZXhwciBpbnQgS19ESU0gPSBUSUxFX0tfRElNX0RFRl9TSU5HTEU7CmNvbnN0ZXhwciBpbnQgTkJXQVJQU19ZID0gTl9XQVJQX1lfREVGX1NJTkdMRTsgCmNvbnN0ZXhwciBpbnQgTkJXQVJQU19YID0gTl9XQVJQX1hfREVGX1NJTkdMRTsgCmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9LID0gMTY7CmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9OTSA9IDE2OwoKaW50IHdhcnBJZCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOwppbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgCmludCB3YXJwSWR5ID0gd2FycElkICUgTkJXQVJQU19ZOwoKY29uc3RleHByIGludCBLX0RJTV9QQUQgPSBLX0RJTTsKCl9fc2hhcmVkX18gZnAxNiBzX2FbVElMRV9TSVpFX1hdW0tfRElNX1BBRF07Cl9fc2hhcmVkX18gZnAxNiBzX2JbVElMRV9TSVpFX1hdW0tfRElNX1BBRF07Cgpjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWSAvIE5CV0FSUFNfWSAvIE1BVE1VTF9ESU1fTk07IC8vIDIKY29uc3RleHByIGludCBXQVJQX1RJTEVfU0laRV9YID0gVElMRV9TSVpFX1ggLyBOQldBUlBTX1ggLyBNQVRNVUxfRElNX05NOyAvLyA0Cgp2ZWM0ZiBjX3NbV0FSUF9USUxFX1NJWkVfWF1bV0FSUF9USUxFX1NJWkVfWV0gPSB7MH07Cgpmb3IgKGludCBrSWQgPSAwOyBrSWQgPCBLOyBrSWQgKz0gS19ESU0pIHsKCmxvYWRMRFNfbm9fdHJhbnNwb3NlKHdhcnBJZCwgbGFuZUlkLCBrSWQsICZzX2FbMF1bMF0sICZzX2JbMF1bMF0sIGEsIGIsIE0sIE4sIEspOwoKX19zeW5jdGhyZWFkcygpOwoKI3ByYWdtYSB1bnJvbGwKZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKY29uc3RleHByIGludCBzdGVwWCA9IFRJTEVfU0laRV9YIC8gV0FSUF9USUxFX1NJWkVfWDsKY29uc3RleHByIGludCBzdGVwWSA9IFRJTEVfU0laRV9ZIC8gV0FSUF9USUxFX1NJWkVfWTsKZm9yIChpbnQgayA9IDA7IGsgPCBLX0RJTTtrICs9IE1BVE1VTF9ESU1fSykgCnsKaW50IGFfcm93ID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwppbnQgYl9yb3cgPSAodF93SWR5ICogc3RlcFkpICsgd2FycElkeSAqIE1BVE1VTF9ESU1fTk07Cm1hdG11bDE2eDE2X2YxNl8yKCZzX2FbMF1bMF0sICZzX2JbMF1bMF0sY19zW3Rfd0lkeF1bdF93SWR5XSwgYV9yb3csIGssIGJfcm93LCBrLCBLX0RJTV9QQUQsIEtfRElNX1BBRCk7Cn0KfQp9CgpfX3N5bmN0aHJlYWRzKCk7Cn0KZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKaW50IGNvbF9vZmZzZXQgPQpibG9ja0lkeC54ICogVElMRV9TSVpFX1kgKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKKHdhcnBJZHkgKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CnRfd0lkeSAqIChUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1kpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CmludCByb3dfb2Zmc2V0ID0KYmxvY2tJZHgueSAqIFRJTEVfU0laRV9YICsgICAgICAgICAgICAgICAgIC8vIFRJTEUgb2Zmc2V0Cih3YXJwSWR4ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAp0X3dJZHggKiAoVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKYXV0byByZXMgPSBjX3NbdF93SWR4XVt0X3dJZHldOwpmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewppbnQgY29sID0gbGFuZUlkICUgMTY7CmludCByb3cgPSBpICsgKGxhbmVJZCAvIDE2KSAqIDQ7CmludCByb3dfZyA9IHJvd19vZmZzZXQgKyByb3c7CmludCBjb2xfZyA9IGNvbF9vZmZzZXQgKyBjb2w7CmlmIChjb2xfZzxOKXsKY1socm93X2cpICogTiArIChjb2xfZyldID0gKGZwMTYpKHJlc1tpXSk7Cn0KfQp9Cn0KfQoKCnRlbXBsYXRlPGJvb2wgdXNlU2lnbW9pZCxib29sIHVzZVNjYWxpbmcsIGJvb2wgdXNlTWFwcGluZz4Kdm9pZCBtYXRtdWxfbmV3KGNvbnN0IGZwMTYgKmRfQSwgY29uc3QgZnAxNiAqKmRfQl9hcnJheSwgZnAxNiAqZF9DLCBpbnQgTSwgaW50IE4sIGludCBLLGludDMyX3QgKmRfYmxvY2tfbWFwcGluZywgaW50MzJfdCpkX21hcHBpbmcgPSBudWxscHRyLCBmcDE2KiBkX3NjYWxpbmcgPSBudWxscHRyKSB7CgpkaW0zIHRocmVhZHNQZXJCbG9jayhOX1dBUlBfWF9ERUYgKiBOX1dBUlBfWV9ERUYgKiBXQVJQX1NJWkUpOwpkaW0zIGJsb2Nrc1BlckdyaWQoKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRiwKKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRik7CmhpcExhdW5jaEtlcm5lbEdHTCgoY3VzdG9tX2tlcm5lbDx1c2VTaWdtb2lkLHVzZVNjYWxpbmcsdXNlTWFwcGluZyx0cnVlPiksIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9BLG51bGxwdHIsZF9CX2FycmF5LCBkX0MsIE0sIE4sIEssZF9zY2FsaW5nLGRfYmxvY2tfbWFwcGluZyxkX21hcHBpbmcpOwp9Cgp2b2lkIG1hdG11bF93Zyhjb25zdCBmcDE2ICpkX0EsIGNvbnN0IGZwMTYgKmRfQiwgZnAxNiAqZF9DLCBpbnQgTSwgaW50IE4sIGludCBLKSB7CgpkaW0zIHRocmVhZHNQZXJCbG9jayhOX1dBUlBfWF9ERUZfU0lOR0xFICogTl9XQVJQX1lfREVGX1NJTkdMRSAqIFdBUlBfU0laRSk7CmRpbTMgYmxvY2tzUGVyR3JpZCgoTiArIFRJTEVfU0laRV9ZX0RFRl9TSU5HTEUgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRl9TSU5HTEUsCihNICsgVElMRV9TSVpFX1hfREVGX1NJTkdMRSAtIDEpIC8gVElMRV9TSVpFX1hfREVGX1NJTkdMRSk7CgpoaXBMYXVuY2hLZXJuZWxHR0woKGN1c3RvbV9rZXJuZWxfd2cpLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfQSxkX0IsIGRfQywgTSwgTiwgSyk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnZlY3RvcjxUPiB0b0NQVShjb25zdCBUICpkX3AsIHNpemVfdCBjb3VudCkgewpzdGQ6OnZlY3RvcjxUPiBoX3AoY291bnQpOwpISVBfQ0hFQ0soaGlwTWVtY3B5KGhfcC5kYXRhKCksIGRfcCwgY291bnQgKiBzaXplb2YoVCksIGhpcE1lbWNweURldmljZVRvSG9zdCkpOwpyZXR1cm4gaF9wOwp9CgoKdGVtcGxhdGU8aW50IHRvcEssIGludCBOLCB0eXBlbmFtZSBUPgpfX2RldmljZV9fIHZvaWQgd2FycFRvcEtfMihmbG9hdCAqc2NvcmVzLCBUKiB0b3BfdmFscywgaW50KiB0b3BfaWR4cykgewppZiAoTj09dG9wSyl7CmZvciAoaW50IGkgPSAwOyBpIDwgdG9wSzsgKytpKSB7CnRvcF92YWxzW2ldID0gc2NvcmVzW2ldOwp0b3BfaWR4c1tpXSA9IGk7Cn0KfQplbHNlewojcHJhZ21hIHVucm9sbApmb3IgKGludCBpID0gMDsgaSA8IHRvcEs7ICsraSkgewp0b3BfdmFsc1tpXSA9IC1JTkZJTklUWTsKdG9wX2lkeHNbaV0gPSAtMTsKfQojcHJhZ21hIHVucm9sbApmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBOOyArK29mZnNldCkgewpUIG90aGVyX3ZhbCA9IFQoc2NvcmVzW29mZnNldF0pOwppbnQgb3RoZXJfaWR4ID0gb2Zmc2V0OwoKI3ByYWdtYSB1bnJvbGwKZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BLOyArK2kpIHsKaWYgKG90aGVyX3ZhbCA+IHRvcF92YWxzW2ldIHx8IAoob3RoZXJfdmFsID09IHRvcF92YWxzW2ldICYmIG90aGVyX2lkeCA8IHRvcF9pZHhzW2ldKSkgewovLyBTaGlmdCBkb3duCmZvciAoaW50IGogPSB0b3BLIC0gMTsgaiA+IGk7IC0taikgewp0b3BfdmFsc1tqXSA9IHRvcF92YWxzW2ogLSAxXTsKdG9wX2lkeHNbal0gPSB0b3BfaWR4c1tqIC0gMV07Cn0KCnRvcF92YWxzW2ldID0gb3RoZXJfdmFsOwp0b3BfaWR4c1tpXSA9IG90aGVyX2lkeDsKYnJlYWs7Cn0KfQp9Cn0KfQoKI2RlZmluZSBUT1BfS19USUxFX1NJWkUgMzIKdGVtcGxhdGU8aW50IE5fRVhQRVJUUz4KX19nbG9iYWxfXyB2b2lkIHRvcEtfa2VybmVsKGZwMTYgKmRfc2NvcmVzX291dCwgaW50MzJfdCAqZF9pbmRpY2VzLCBjb25zdCBmcDE2ICpkX3Njb3Jlc19pbiwgaW50IHNlcV9sZW4pIHsKCmludCB0aWQgPSAgdGhyZWFkSWR4Lng7CmludCB0b2tlbl9pZCA9IGJsb2NrSWR4Lng7CmludCBsYW5lSWQgPSB0aWQgJSBXQVJQX1NJWkU7CmludCB3YXJwSWQgPSB0aWQgLyBXQVJQX1NJWkU7Cgpjb25zdGV4cHIgaW50IHRvcF9rID0gNDsKY29uc3RleHByIGludCBUSUxFX1NJWkUgPSBUT1BfS19USUxFX1NJWkU7CmludCBjb2xfb2Zmc2V0ID0gYmxvY2tJZHgueCpUSUxFX1NJWkU7CmludCBjb2wgPSB0aWQgJSBUSUxFX1NJWkU7CmludCBjb2xfZyA9IGNvbF9vZmZzZXQgKyB0aWQgJSBUSUxFX1NJWkU7CmludCByb3cgPSB0aWQvVElMRV9TSVpFOwoKX19zaGFyZWRfXyBmbG9hdCBzY29yZXNbVElMRV9TSVpFXVtOX0VYUEVSVFNdOyAKX19zaGFyZWRfXyB1aW50MzJfdCBpbmRpY2VzW1RJTEVfU0laRV1bTl9FWFBFUlRTXTsKCnNjb3Jlc1tjb2xdW3Jvd109ZmxvYXQoZF9zY29yZXNfaW5bY29sX2cqTl9FWFBFUlRTICsgcm93XSk7CmluZGljZXNbY29sXVtyb3ddPXJvdzsKCl9fc3luY3RocmVhZHMoKTsKCmlmICh0aWQgPCBUSUxFX1NJWkUpewoKZmxvYXQgbWF4X3ZhbCA9IC1JTkZJTklUWTsKZm9yIChpbnQgaT0wO2k8Tl9FWFBFUlRTO2krKyl7CmlmIChtYXhfdmFsPHNjb3Jlc1t0aWRdW2ldKXsKbWF4X3ZhbCA9IHNjb3Jlc1t0aWRdW2ldOwp9Cn0KZmxvYXQgc3VtID0gMC4wZjsKZm9yIChpbnQgaT0wO2k8Tl9FWFBFUlRTO2krKyl7CmF1dG8gZXhwX3ZhbCA9IGV4cGYoc2NvcmVzW3RpZF1baV0gLSBtYXhfdmFsKTsKc3VtKz1leHBfdmFsOwpzY29yZXNbdGlkXVtpXT1leHBfdmFsOwp9CmZvciAoaW50IGk9MDtpPE5fRVhQRVJUUztpKyspewpzY29yZXNbdGlkXVtpXS89c3VtOwp9Cn0KX19zeW5jdGhyZWFkcygpOwoKX19zaGFyZWRfXyBmcDE2IHRvcF92YWxzW1RJTEVfU0laRV1bdG9wX2tdOwpfX3NoYXJlZF9fIGludCB0b3BfaWR4c1tUSUxFX1NJWkVdW3RvcF9rXTsKCmlmICh0aWQgPCBUSUxFX1NJWkUpewoKd2FycFRvcEtfMjx0b3BfayxOX0VYUEVSVFMsZnAxNj4oJnNjb3Jlc1t0aWRdWzBdLCAmdG9wX3ZhbHNbdGlkXVswXSwgJnRvcF9pZHhzW3RpZF1bMF0pOwpmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgewpkX3Njb3Jlc19vdXRbY29sX2cqNCtpXT1mcDE2KHRvcF92YWxzW3RpZF1baV0pOwpkX2luZGljZXNbY29sX2cqNCtpXT10b3BfaWR4c1t0aWRdW2ldOwp9Cn0KfQoKdGVtcGxhdGU8aW50IG5fZXhwZXJ0cz4KX19nbG9iYWxfXyB2b2lkIGhpc3RvZ3JhbShjb25zdCBpbnQzMl90KiBkX2luZGljZXMsIHVpbnQzMl90KiBkX2hpc3QsIGludCBzZXFfbGVuKSB7Cgpjb25zdGV4cHIgaW50IG5fYWN0aXZlX2V4cGVydHMgPSA0OwpfX3NoYXJlZF9fIHVpbnQzMl90IHNfaGlzdFtuX2V4cGVydHNdOwoKaW50IHRpZCA9IHRocmVhZElkeC54OwppZiAodGlkIDwgbl9leHBlcnRzKSB7CnNfaGlzdFt0aWRdID0gMDsKfQpfX3N5bmN0aHJlYWRzKCk7CmludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRpZDsKaWYgKGlkeCA8IHNlcV9sZW4qbl9hY3RpdmVfZXhwZXJ0cykgewppbnQzMl90IHZhbCA9IGRfaW5kaWNlc1tpZHhdOwppZiAodmFsIDwgbl9leHBlcnRzKSB7CmF0b21pY0FkZCgmc19oaXN0W3ZhbF0sIDEpOwp9Cn0gCgpfX3N5bmN0aHJlYWRzKCk7CgppZiAodGlkIDwgbl9leHBlcnRzKSB7CmF0b21pY0FkZCgmZF9oaXN0W3RpZF0sIHNfaGlzdFt0aWRdKTsKfQp9CgppbnQgZGl2VXAoaW50IHgsaW50IG4pewpyZXR1cm4gKHggKyBuLTEpL247Cn0KCl9fZ2xvYmFsX18gdm9pZCByZV9vcmRlcl9pbmRpY2VzX2tlcm5lbChmcDE2KiBkX291dHB1dCwgY29uc3QgZnAxNiAqZF9pbnB1dCwgY29uc3QgaW50MzJfdCogZF9tYXBwaW5nLCBpbnQgZF9oaWRkZW4saW50IHNlcV9sZW4saW50IHNlcV9sZW5fcmVfb3JkZXIpIHsKCmludCB0aWQgPSBibG9ja0RpbS54KmJsb2NrSWR4LngrdGhyZWFkSWR4Lng7CmludCBkc3Rfcm93ID0gdGlkL2RfaGlkZGVuOwppbnQgY29sID0gdGlkJWRfaGlkZGVuOwoKaWYgKGRzdF9yb3c8c2VxX2xlbl9yZV9vcmRlcil7CmludCBzcmNfcm93ID0gZF9tYXBwaW5nW2RzdF9yb3ddOwppZiAoc3JjX3JvdzxzZXFfbGVuKXsgLy9tYWtlIHRoaXMgYmV0dGVyIGJ5IGNoZWNraW5nIGhpc3QKZF9vdXRwdXRbZF9oaWRkZW4qZHN0X3Jvdytjb2xdPWRfaW5wdXRbZF9oaWRkZW4qc3JjX3Jvdytjb2xdOwp9ZWxzZXsKZF9vdXRwdXRbZF9oaWRkZW4qZHN0X3Jvdytjb2xdPWZwMTYoMC4wZik7Cn0KfQp9Cgp0ZW1wbGF0ZTxpbnQgbl9leHBlcnRzPgpfX2dsb2JhbF9fIHZvaWQgaWRfbWFwcGluZyhpbnQzMl90ICptYXBwaW5nLGludDMyX3QgKm1hcHBpbmdfcmV2LCBjb25zdCBpbnQzMl90KiBkX2luZGljZXMsIGNvbnN0IHVpbnQzMl90KiBkX2hpc3QsIGludCBzZXFfbGVuKSB7Cgpjb25zdGV4cHIgaW50IG5fYWN0aXZlX2V4cGVydHM9NDsKaW50IHRpZCA9IGJsb2NrSWR4LngqYmxvY2tEaW0ueCt0aHJlYWRJZHgueDsKaW50IHRvdGFsX3RocmVhZHMgPSBncmlkRGltLnggKiBibG9ja0RpbS54OwpfX3NoYXJlZF9fIHVpbnQzMl90IGV4cGVydF9vZmZzZXRzW25fZXhwZXJ0c107CgppZiAodGhyZWFkSWR4LnggPT0gMCkgewp1aW50MzJfdCBvZmZzZXQgPSAwOwpmb3IgKGludCBpID0gMDsgaSA8IG5fZXhwZXJ0czsgKytpKSB7CmV4cGVydF9vZmZzZXRzW2ldID0gb2Zmc2V0OwpvZmZzZXQgKz0gKChkX2hpc3RbaV0rKFRJTEVfU0laRV9YX0RFRi0xKSkvVElMRV9TSVpFX1hfREVGKSpUSUxFX1NJWkVfWF9ERUY7Cn0KfQoKX19zeW5jdGhyZWFkcygpOwoKaW50IHJvdyA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CmlmIChyb3cgPj0gc2VxX2xlbikgcmV0dXJuOwpmb3IgKGludCByb3cgPSB0aWQ7IHJvdyA8IHNlcV9sZW47IHJvdyArPSB0b3RhbF90aHJlYWRzKSB7CmZvciAoaW50IGkgPSAwOyBpIDwgbl9hY3RpdmVfZXhwZXJ0czsgKytpKSB7CmludCBleHBlcnQgPSBkX2luZGljZXNbcm93ICogbl9hY3RpdmVfZXhwZXJ0cyArIGldOwppbnQgcG9zID0gYXRvbWljQWRkKCZleHBlcnRfb2Zmc2V0c1tleHBlcnRdLCAxKTsKCm1hcHBpbmdbcG9zXSA9IHJvdzsKbWFwcGluZ19yZXZbcm93ICogbl9hY3RpdmVfZXhwZXJ0cyArIGldID0gcG9zOwp9Cn0KCn0KCl9fZ2xvYmFsX18gdm9pZCByZWR1Y2VLX2tlcm5lbChmcDE2ICpkX291dHB1dCwgY29uc3QgZnAxNiAqZF9pbnB1dF9yZV9vcmRlciwgY29uc3QgaW50MzJfdCAqZF9tYXBwaW5nX3JldiwgY29uc3QgZnAxNipkX3Njb3Jlcyxjb25zdCBmcDE2KmRfc2hhcmVkX2V4cGVydCwgaW50IHNlcV9sZW4sIGludCBkX2hpZGRlbikgewoKaW50IHRpZCA9IGJsb2NrRGltLngqYmxvY2tJZHgueCt0aHJlYWRJZHgueDsKaW50IGRzdF9yb3cgPSB0aWQvZF9oaWRkZW47CmludCBjb2wgPSB0aWQlZF9oaWRkZW47CmNvbnN0ZXhwciBpbnQgbl9hY3RpdmVfZXhwZXJ0cyA9IDQ7CgppZiAodGlkPHNlcV9sZW4qZF9oaWRkZW4pewpmbG9hdCBzdW0gPSAwLjBmOwojcHJhZ21hIHVucm9sbApmb3IgKGludCBpPTA7aTxuX2FjdGl2ZV9leHBlcnRzO2krKyl7CmludCByID0gZF9tYXBwaW5nX3Jldltkc3Rfcm93Km5fYWN0aXZlX2V4cGVydHMraV07CmF1dG8gdyA9IGRfc2NvcmVzW2RzdF9yb3cqbl9hY3RpdmVfZXhwZXJ0cytpXTsKc3VtKz0gZmxvYXQodyAqIGRfaW5wdXRfcmVfb3JkZXJbcipkX2hpZGRlbitjb2xdKTsKfQpkX291dHB1dFtkc3Rfcm93KmRfaGlkZGVuK2NvbF0gPSBmcDE2KHN1bSArIGZsb2F0KGRfc2hhcmVkX2V4cGVydFtkc3Rfcm93KmRfaGlkZGVuK2NvbF0pKTsKfQp9Cgp2b2lkIHJlZHVjZUsoZnAxNiAqZF9vdXRwdXQsIGNvbnN0IGZwMTYgKmRfaW5wdXRfcmVfb3JkZXIsIGNvbnN0IGludDMyX3QgKmRfbWFwcGluZ19yZXYsIGNvbnN0IGZwMTYqZF9zY29yZXMsIGNvbnN0IGZwMTYqZF9zaGFyZWRfZXhwZXJ0LCBpbnQgc2VxX2xlbiwgaW50IGRfaGlkZGVuKSB7CmRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKZGltMyBudW1CbG9ja3MoZGl2VXAoc2VxX2xlbipkX2hpZGRlbix0aHJlYWRzUGVyQmxvY2sueCkpOwpoaXBMYXVuY2hLZXJuZWxHR0wocmVkdWNlS19rZXJuZWwsIG51bUJsb2NrcywgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX291dHB1dCwgZF9pbnB1dF9yZV9vcmRlciwgZF9tYXBwaW5nX3JldiwgIGRfc2NvcmVzLGRfc2hhcmVkX2V4cGVydCxzZXFfbGVuLGRfaGlkZGVuKTsKfQoKdm9pZCByZV9vcmRlcl9pbmRpY2VzKGZwMTYqIGRfb3V0cHV0LCBjb25zdCBmcDE2ICpkX2lucHV0LCBjb25zdCBpbnQzMl90KiBkX21hcHBpbmcsIGludCBkX2hpZGRlbixpbnQgc2VxX2xlbixpbnQgc2VxX2xlbl9yZV9vcmRlcikgewpkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CmRpbTMgbnVtQmxvY2tzKGRpdlVwKHNlcV9sZW5fcmVfb3JkZXIqZF9oaWRkZW4sdGhyZWFkc1BlckJsb2NrLngpKTsKaGlwTGF1bmNoS2VybmVsR0dMKHJlX29yZGVyX2luZGljZXNfa2VybmVsLCBudW1CbG9ja3MsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9vdXRwdXQsIGRfaW5wdXQsIGRfbWFwcGluZywgIGRfaGlkZGVuLHNlcV9sZW4sc2VxX2xlbl9yZV9vcmRlcik7Cn0KCnZvaWQgaWRfbWFwcGluZyhpbnQzMl90ICpkX21hcHBpbmcsIGludDMyX3QgKmRfbWFwcGluZ19yZXYgLGNvbnN0IGludDMyX3QqIGRfaW5kaWNlcywgY29uc3QgdWludDMyX3QqIGRfaGlzdCwgaW50IHNlcV9sZW4sIGludCBuX2V4cGVydHMpIHsKZGltMyB0aHJlYWRzUGVyQmxvY2soV0FSUF9TSVpFKjE2KTsKZGltMyBudW1CbG9ja3MoMSk7CmlmIChuX2V4cGVydHMgPT0gMzIpCnsKaGlwTGF1bmNoS2VybmVsR0dMKChpZF9tYXBwaW5nPDMyPiksIG51bUJsb2NrcywgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX21hcHBpbmcsZF9tYXBwaW5nX3JldixkX2luZGljZXMsZF9oaXN0LCBzZXFfbGVuKTsKfWVsc2UgaWYgKG5fZXhwZXJ0cyA9PSA4KXsKaGlwTGF1bmNoS2VybmVsR0dMKChpZF9tYXBwaW5nPDg+KSwgbnVtQmxvY2tzLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfbWFwcGluZyxkX21hcHBpbmdfcmV2LGRfaW5kaWNlcyxkX2hpc3QsIHNlcV9sZW4pOwp9ZWxzZSBpZiAobl9leHBlcnRzID09IDQpewpoaXBMYXVuY2hLZXJuZWxHR0woKGlkX21hcHBpbmc8ND4pLCBudW1CbG9ja3MsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9tYXBwaW5nLGRfbWFwcGluZ19yZXYsZF9pbmRpY2VzLGRfaGlzdCwgc2VxX2xlbik7Cn0KfQoKdm9pZCBoaXN0b2dyYW0oY29uc3QgaW50MzJfdCogZF9pbmRpY2VzLCB1aW50MzJfdCogZF9oaXN0LCBpbnQgc2VxX2xlbiwgaW50IG5fYWN0aXZlX2V4cGVydHMsIGludCBuX2V4cGVydHMpewpkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CmRpbTMgbnVtQmxvY2tzKGRpdlVwKHNlcV9sZW4qbl9hY3RpdmVfZXhwZXJ0cyxXQVJQX1NJWkUqNCkpOwppZiAobl9leHBlcnRzID09IDMyKXsKaGlwTGF1bmNoS2VybmVsR0dMKChoaXN0b2dyYW08MzI+KSwgbnVtQmxvY2tzLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfaW5kaWNlcyxkX2hpc3QsIHNlcV9sZW4pOwp9CmVsc2UgaWYgKG5fZXhwZXJ0cyA9PSA4KQp7CmhpcExhdW5jaEtlcm5lbEdHTCgoaGlzdG9ncmFtPDg+KSwgbnVtQmxvY2tzLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfaW5kaWNlcyxkX2hpc3QsIHNlcV9sZW4pOwp9ZWxzZSBpZiAobl9leHBlcnRzID09IDQpewpoaXBMYXVuY2hLZXJuZWxHR0woKGhpc3RvZ3JhbTw0PiksIG51bUJsb2NrcywgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX2luZGljZXMsZF9oaXN0LCBzZXFfbGVuKTsKfWVsc2V7CnRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGV4cGVydHMuIE9ubHkgNCwgOCBvciAzMiBhcmUgc3VwcG9ydGVkLiIpOwp9Cn0KCnZvaWQgdG9wSyhmcDE2ICpkX3Njb3Jlc19vdXQsIGludDMyX3QgKmRfaW5kaWNlcywgY29uc3QgZnAxNiAqZF9zY29yZXNfaW4sIGludCBzZXFfbGVuLCBpbnQgbl9leHBlcnRzKXsKZGltMyB0aHJlYWRzUGVyQmxvY2sobl9leHBlcnRzKlRPUF9LX1RJTEVfU0laRSk7CmRpbTMgbnVtQmxvY2tzKHNlcV9sZW4vVE9QX0tfVElMRV9TSVpFKTsKaWYgKG5fZXhwZXJ0cyA9PSAzMil7ICAKaGlwTGF1bmNoS2VybmVsR0dMKCh0b3BLX2tlcm5lbDwzMj4pLCBudW1CbG9ja3MsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9zY29yZXNfb3V0LCBkX2luZGljZXMsZF9zY29yZXNfaW4sIHNlcV9sZW4pOwp9ZWxzZSBpZiAobl9leHBlcnRzID09IDgpewpoaXBMYXVuY2hLZXJuZWxHR0woKHRvcEtfa2VybmVsPDg+KSwgbnVtQmxvY2tzLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfc2NvcmVzX291dCwgZF9pbmRpY2VzLGRfc2NvcmVzX2luLCBzZXFfbGVuKTsKfWVsc2UgaWYgKG5fZXhwZXJ0cyA9PSA0KXsKaGlwTGF1bmNoS2VybmVsR0dMKCh0b3BLX2tlcm5lbDw0PiksIG51bUJsb2NrcywgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX3Njb3Jlc19vdXQsIGRfaW5kaWNlcyxkX3Njb3Jlc19pbiwgc2VxX2xlbik7Cn1lbHNlewp0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBleHBlcnRzLiBPbmx5IDggb3IgMzIgYXJlIHN1cHBvcnRlZC4iKTsKfQp9CgoKdm9pZCBjb21wdXRlX2V4cGVydHMoZnAxNipkX291dHB1dCxjb25zdCBmcDE2ICpkX2lucHV0LCAKY29uc3QgZnAxNioqIGRfZF9XX2dhdGVzLApjb25zdCBmcDE2KiogZF9kX1dfdXBzLApjb25zdCBmcDE2KiogZF9kX1dfZG93bnMsCmNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+IHByZWZpeF9zdW0sCmNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+IHNlcV9sZW5ndGhzLAppbnQgZF9oaWRkZW4sIGludCBzZXFfbGVuLCBpbnQgc2VxX2xlbl9yZV9vcmRlcixpbnQgZF9leHBlcnQsaW50IG5fZXhwZXJ0cywKZnAxNiogZF9nYXRlX291dCwKZnAxNiogZF91cF9vdXQsCmludDMyX3QqZF9ibG9ja19tYXBwaW5nLAppbnQzMl90KmRfbWFwcGluZykKeyAgCgptYXRtdWxfbmV3PHRydWUsZmFsc2UsdHJ1ZT4oZF9pbnB1dCwKZF9kX1dfZ2F0ZXMsCmRfZ2F0ZV9vdXQsCnNlcV9sZW5fcmVfb3JkZXIsCmRfZXhwZXJ0LGRfaGlkZGVuLApkX2Jsb2NrX21hcHBpbmcsCmRfbWFwcGluZyk7Cm1hdG11bF9uZXc8ZmFsc2UsdHJ1ZSx0cnVlPiggZF9pbnB1dCwKZF9kX1dfdXBzLApkX3VwX291dCwKc2VxX2xlbl9yZV9vcmRlciwKZF9leHBlcnQsZF9oaWRkZW4sCmRfYmxvY2tfbWFwcGluZywKZF9tYXBwaW5nLApkX2dhdGVfb3V0KTsKCm1hdG11bF9uZXc8ZmFsc2UsZmFsc2UsZmFsc2U+KGRfdXBfb3V0LApkX2RfV19kb3ducywKZF9vdXRwdXQsCnNlcV9sZW5fcmVfb3JkZXIsCmRfaGlkZGVuLGRfZXhwZXJ0LApkX2Jsb2NrX21hcHBpbmcpOyAgCgp9CgpfX2dsb2JhbF9fIHZvaWQgcHJvZHVjdEFuZFNpZ21vaWRfa2VybmVsKGZwMTYqIGRfb3V0LCBjb25zdCBmcDE2ICogZF9nYXRlX291dCxjb25zdCBmcDE2ICogZF91cF9vdXQsIGludCBNLCBpbnQgTil7CgppbnQgdGlkID0gYmxvY2tEaW0ueCpibG9ja0lkeC54K3RocmVhZElkeC54OwoKaWYgKHRpZDxNKk4pewovL3NpZ21vaWQgb24gZF9nYXRlX291dApmcDE2IHJhdGlvID0gZnAxNigxLjBmLygxLjArZXhwKC1mbG9hdChkX2dhdGVfb3V0W3RpZF0pKSkpOwpmcDE2IHRtcCA9IChmcDE2KShkX2dhdGVfb3V0W3RpZF0pKnJhdGlvOwoKLy9zY2FsaW5nCmRfb3V0W3RpZF0gPSB0bXAqZF91cF9vdXRbdGlkXTsKfQp9CnZvaWQgcHJvZHVjdEFuZFNpZ21vaWQoZnAxNiogZF9vdXQsIGNvbnN0IGZwMTYgKiBkX2dhdGVfb3V0LGNvbnN0IGZwMTYgKiBkX3VwX291dCwgaW50IE0sIGludCBOKXsKCmRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKE4qTSx0aHJlYWRzUGVyQmxvY2sueCkpOwoKaGlwTGF1bmNoS2VybmVsR0dMKChwcm9kdWN0QW5kU2lnbW9pZF9rZXJuZWwpLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfb3V0LGRfZ2F0ZV9vdXQsIGRfdXBfb3V0LCBNLCBOKTsKfQoKc3RhdGljIGNvbnN0IGZwMTYqKiBkX2Rfd19nYXRlOwpzdGF0aWMgY29uc3QgZnAxNioqIGRfZF93X3VwOwpzdGF0aWMgY29uc3QgZnAxNioqIGRfZF93X2Rvd247CgpzdGF0aWMgdWludDMyX3QgKmRfaGlzdDsKc3RhdGljIGludDMyX3QgKmRfbWFwcGluZzsKc3RhdGljIGludDMyX3QgKmRfbWFwcGluZ19yZXY7CgpzdGF0aWMgZnAxNiAqZF9vdXRwdXRfcmVvcmRlcjsKCnN0YXRpYyBmcDE2KiBkX2dhdGVfb3V0OwpzdGF0aWMgZnAxNiogZF91cF9vdXQ7CgpzdGF0aWMgZnAxNiogZF9zaGFyZWRfZXhwZXJ0OwpzdGF0aWMgZnAxNiogZF9zY29yZXM7CnN0YXRpYyBmcDE2KiBkX3Njb3Jlc19uZXc7CnN0YXRpYyBpbnQzMl90KiBkX2luZGljZXM7CgpzdGF0aWMgaW50MzJfdCAqZF9ibG9ja19tYXBwaW5nOwpzdGF0aWMgcm9jYmxhc19oYW5kbGUgaGFuZGxlOwoKdm9pZCBhbGxvY2F0ZSgpewpjb25zdGV4cHIgaW50IG1heF9uX2V4cGVydHMgPSAzMjsKY29uc3RleHByIGludCBtYXhfc2VxX2xlbiA9IDgxOTI7CmNvbnN0ZXhwciBpbnQgbWF4X2RfZXhwZXJ0ID0gMjA0ODsKY29uc3RleHByIGludCBtYXhfbl9hY3RpdmVfZXhwZXJ0cyA9IDQ7CmNvbnN0ZXhwciBpbnQgcGFkZGluZyA9IG1heF9uX2V4cGVydHMqVElMRV9TSVpFX1hfREVGOwpjb25zdGV4cHIgaW50IG1heF9zZXFfbGVuX3JlX29yZGVyID0gbWF4X3NlcV9sZW4qbWF4X25fYWN0aXZlX2V4cGVydHMrcGFkZGluZzsKY29uc3RleHByIGludCBtYXhfZF9oaWRkZW4gPSA3MTY4OwppbnQgbWF4X25iX2Jsb2NrcyA9IGRpdlVwKG1heF9zZXFfbGVuX3JlX29yZGVyLCBUSUxFX1NJWkVfWF9ERUYpOwpyb2NibGFzX2NyZWF0ZV9oYW5kbGUoJmhhbmRsZSk7CgpzdGF0aWMgYm9vbCBoYXNJbml0ID0gZmFsc2U7CmlmICghaGFzSW5pdCl7CgovL0FycmF5IG9mIHdlaWdodHMKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9kX3dfZ2F0ZSwgbWF4X25fZXhwZXJ0cyAqIHNpemVvZihmcDE2KikpKTsKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9kX3dfdXAsIG1heF9uX2V4cGVydHMgKiBzaXplb2YoZnAxNiopKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfZF93X2Rvd24sIG1heF9uX2V4cGVydHMgKiBzaXplb2YoZnAxNiopKSk7CgpISVBfQ0hFQ0soaGlwTWFsbG9jKCZkX2hpc3QsIG1heF9uX2V4cGVydHMgKiBzaXplb2YodWludDMyX3QpKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfbWFwcGluZywgbWF4X3NlcV9sZW5fcmVfb3JkZXIgKiBzaXplb2YoaW50MzJfdCkpKTsKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9tYXBwaW5nX3JldiwgbWF4X3NlcV9sZW4qbWF4X25fYWN0aXZlX2V4cGVydHMgKiBzaXplb2YoaW50MzJfdCkpKTsKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9vdXRwdXRfcmVvcmRlciwgbWF4X3NlcV9sZW5fcmVfb3JkZXIqbWF4X2RfaGlkZGVuICogc2l6ZW9mKGZwMTYpKSk7CgpISVBfQ0hFQ0soaGlwTWFsbG9jKCZkX2dhdGVfb3V0LCBtYXhfc2VxX2xlbl9yZV9vcmRlciptYXhfZF9leHBlcnQgICogc2l6ZW9mKGZwMTYpKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfdXBfb3V0LCBtYXhfc2VxX2xlbl9yZV9vcmRlciptYXhfZF9leHBlcnQgKiBzaXplb2YoZnAxNikpKTsKCkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfc2hhcmVkX2V4cGVydCwgbWF4X3NlcV9sZW4qbWF4X2RfaGlkZGVuICogc2l6ZW9mKGZwMTYpKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfc2NvcmVzLCBtYXhfc2VxX2xlbiptYXhfbl9leHBlcnRzICogc2l6ZW9mKGZwMTYpKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfc2NvcmVzX25ldywgbWF4X3NlcV9sZW4qbWF4X25fZXhwZXJ0cyAqIHNpemVvZihmcDE2KSkpOwoKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9pbmRpY2VzLCBtYXhfc2VxX2xlbiptYXhfbl9hY3RpdmVfZXhwZXJ0cyAqIHNpemVvZihpbnQzMl90KSkpOwoKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9ibG9ja19tYXBwaW5nLCBtYXhfbmJfYmxvY2tzICogc2l6ZW9mKGludDMyX3QpKSk7CgoKCmhhc0luaXQgPSB0cnVlOwp9Cn0KCgp2b2lkIG1hdG11bF9ibGFzX3JtKGNvbnN0IGZwMTYqZEEsIGNvbnN0IGZwMTYgKmRCLCBmcDE2ICpkQywgaW50IE0sIGludCBOLCBpbnQgSyl7CmNvbnN0IGZsb2F0IGFscGhhID0gMS4wZjsKY29uc3QgZmxvYXQgYmV0YSAgPSAwLjBmOwpyb2NibGFzX2dlbW1fZXgoCmhhbmRsZSwKcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKTiwgTSwgSywKJmFscGhhLApkQiwgcm9jYmxhc19kYXRhdHlwZV9mMTZfciwgTiwKZEEsIHJvY2JsYXNfZGF0YXR5cGVfZjE2X3IsIEssCiZiZXRhLApkQywgcm9jYmxhc19kYXRhdHlwZV9mMTZfciwgTiwKZEMsIHJvY2JsYXNfZGF0YXR5cGVfZjE2X3IsIE4sCnJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCnJvY2JsYXNfZ2VtbV9hbGdvX3N0YW5kYXJkLAowLCAwCik7Cn0Kdm9pZCBjb21wdXRlX2V4cGVydChmcDE2KmRfb3V0cHV0LGNvbnN0IGZwMTYgKmRfaW5wdXQsIGNvbnN0IGZwMTYqZF9XX2dhdGUsY29uc3QgZnAxNipkX1dfdXAsIGNvbnN0IGZwMTYqZF9XX2Rvd24sIAppbnQgZF9oaWRkZW4sIGludCBzZXFfbGVuLCBpbnQgZF9leHBlcnQsCmZwMTYqIGRfZ2F0ZV9vdXQsCmZwMTYqIGRfdXBfb3V0KXsKCm1hdG11bF9ibGFzX3JtKGRfaW5wdXQsIGRfV19nYXRlLCBkX2dhdGVfb3V0LCBzZXFfbGVuLCBkX2V4cGVydCwgZF9oaWRkZW4pOwptYXRtdWxfYmxhc19ybShkX2lucHV0LCBkX1dfdXAsIGRfdXBfb3V0LCBzZXFfbGVuLCBkX2V4cGVydCwgZF9oaWRkZW4pOwpwcm9kdWN0QW5kU2lnbW9pZChkX3VwX291dCwgZF9nYXRlX291dCxkX3VwX291dCxzZXFfbGVuLGRfZXhwZXJ0KTsKbWF0bXVsX2JsYXNfcm0oZF91cF9vdXQsIGRfV19kb3duLCBkX291dHB1dCwgc2VxX2xlbiwgZF9oaWRkZW4sIGRfZXhwZXJ0KTsKfQpzdHJ1Y3QgQ29uZmlnewppbnQgZF9oaWRkZW47CmludCBkX2V4cGVydDsKaW50IGJhdGNoX3NpemU7CmludCBzZXFfbGVuOwppbnQgbl9hY3RpdmVfZXhwZXJ0czsKaW50IG5fZXhwZXJ0czsKfTsKCgoKdm9pZCBjb21wdXRlX21vZShjb25zdCBDb25maWcgJmNvbmYsCmNvbnN0IGZwMTYqIGRfaW5wdXQsCmZwMTYgKmRfb3V0cHV0LAoKY29uc3QgZnAxNiogZF9XX2csCmNvbnN0IGZwMTYqIGRfc2hhcmVkX3dfZ2F0ZSwKY29uc3QgZnAxNiogZF9zaGFyZWRfd191cCwKY29uc3QgZnAxNiogZF9zaGFyZWRfd19kb3duLAoKY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgZnAxNio+ICZkX3dfZ2F0ZSwKY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgZnAxNio+ICZkX3dfdXAsCmNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGZwMTYqPiAmZF93X2Rvd24KKXsKCgppbnQgbl9leHBlcnRzID0gY29uZi5uX2V4cGVydHM7CmludCBkX2hpZGRlbiA9IGNvbmYuZF9oaWRkZW47CmludCBkX2V4cGVydCA9IGNvbmYuZF9leHBlcnQ7CmludCBiYXRjaF9zaXplID0gY29uZi5iYXRjaF9zaXplOwppbnQgc2VxX2xlbiA9IGNvbmYuc2VxX2xlbjsKaW50IG5fYWN0aXZlX2V4cGVydHMgPSBjb25mLm5fYWN0aXZlX2V4cGVydHM7CgphbGxvY2F0ZSgpOwovLyBDb3B5IHdlaWdodCBwdHIgdG8gZGV2aWNlCkhJUF9DSEVDSyhoaXBNZW1jcHkoZF9kX3dfZ2F0ZSwgZF93X2dhdGUuZGF0YSgpLCBuX2V4cGVydHMgKiBzaXplb2YoZnAxNiopLCBoaXBNZW1jcHlIb3N0VG9EZXZpY2UpKTsKSElQX0NIRUNLKGhpcE1lbWNweShkX2Rfd191cCwgZF93X3VwLmRhdGEoKSwgbl9leHBlcnRzICogc2l6ZW9mKGZwMTYqKSwgaGlwTWVtY3B5SG9zdFRvRGV2aWNlKSk7CkhJUF9DSEVDSyhoaXBNZW1jcHkoZF9kX3dfZG93biwgZF93X2Rvd24uZGF0YSgpLCBuX2V4cGVydHMgKiBzaXplb2YoZnAxNiopLCBoaXBNZW1jcHlIb3N0VG9EZXZpY2UpKTsKCmludCBwYWRkaW5nID0gbl9leHBlcnRzKlRJTEVfU0laRV9YX0RFRjsKaW50IHNlcV9sZW5fcmVfb3JkZXIgPSBzZXFfbGVuKm5fYWN0aXZlX2V4cGVydHMrcGFkZGluZzsKCmZvciAoaW50IGJhdGNoPTA7YmF0Y2g8YmF0Y2hfc2l6ZTtiYXRjaCsrKXsKY29uc3QgZnAxNiogZF9pbnB1dF9iYXRjaCA9IGRfaW5wdXQgKyBiYXRjaCpzZXFfbGVuKmRfaGlkZGVuOwpmcDE2KiBkX291dHB1dF9iYXRjaCA9IGRfb3V0cHV0ICsgYmF0Y2gqc2VxX2xlbipkX2hpZGRlbjsKCkhJUF9DSEVDSyhoaXBNZW1zZXRBc3luYyAoZF9oaXN0LCAwLCBzaXplb2YoaW50MzJfdCkqbl9leHBlcnRzLCAwKSk7CkhJUF9DSEVDSyhoaXBNZW1zZXRBc3luYyAoZF9tYXBwaW5nLCAwLCBzaXplb2YoaW50MzJfdCkqc2VxX2xlbl9yZV9vcmRlciwgMCkpOwpjb21wdXRlX2V4cGVydChkX3NoYXJlZF9leHBlcnQsCmRfaW5wdXRfYmF0Y2gsIApkX3NoYXJlZF93X2dhdGUsCmRfc2hhcmVkX3dfdXAsCmRfc2hhcmVkX3dfZG93biwKZF9oaWRkZW4sIApzZXFfbGVuLApkX2V4cGVydCwKZF9nYXRlX291dCwKZF91cF9vdXQpOwoKbWF0bXVsX3dnKGRfaW5wdXRfYmF0Y2gsIGRfV19nLCBkX3Njb3Jlc19uZXcsIHNlcV9sZW4gLG5fZXhwZXJ0cywgZF9oaWRkZW4pOwp0b3BLKGRfc2NvcmVzLCBkX2luZGljZXMsIGRfc2NvcmVzX25ldywgc2VxX2xlbiwgbl9leHBlcnRzKTsKaGlzdG9ncmFtKGRfaW5kaWNlcywgZF9oaXN0LCBzZXFfbGVuLCBuX2FjdGl2ZV9leHBlcnRzLCBuX2V4cGVydHMpOwphdXRvIGhfaGlzdCA9IHRvQ1BVKGRfaGlzdCxuX2V4cGVydHMpOwphdXRvIGhfaGlzdF91cCA9IHN0ZDo6dmVjdG9yPGludDMyX3Q+KGhfaGlzdC5zaXplKCksMCk7CmZvciAoaW50IGkgPTA7aTxoX2hpc3RfdXAuc2l6ZSgpO2krKyl7CmhfaGlzdF91cFtpXSA9ICgoaF9oaXN0W2ldKyhUSUxFX1NJWkVfWF9ERUYtMSkpL1RJTEVfU0laRV9YX0RFRikqVElMRV9TSVpFX1hfREVGOwp9CgpzdGQ6OnZlY3RvcjxpbnQzMl90PiBwcmVmaXhfc3VtKG5fZXhwZXJ0cywwKTsKcHJlZml4X3N1bVswXSA9IDA7CmZvciAoaW50IGkgPSAxOyBpIDwgbl9leHBlcnRzOyArK2kpIHsKcHJlZml4X3N1bVtpXSA9IHByZWZpeF9zdW1baSAtIDFdICsgaF9oaXN0X3VwW2kgLSAxXTsKfQoKaW50IG5iX2Jsb2NrcyA9IGRpdlVwKHNlcV9sZW5fcmVfb3JkZXIsIFRJTEVfU0laRV9YX0RFRik7CnN0ZDo6dmVjdG9yPGludDMyX3Q+IGJsb2NrTWFwcGluZyhuYl9ibG9ja3MsMCk7CmZvciAoaW50IGk9MDtpPG5iX2Jsb2NrcztpKyspewppbnQgYiA9IDA7CmZvciAoaW50IGo9MDtqPG5fZXhwZXJ0cztqKyspewppZiAocHJlZml4X3N1bVtqXTw9VElMRV9TSVpFX1hfREVGKmkpewpiID0gajsKfQp9CmJsb2NrTWFwcGluZ1tpXT1iOwp9CgoKSElQX0NIRUNLKGhpcE1lbWNweShkX2Jsb2NrX21hcHBpbmcsIGJsb2NrTWFwcGluZy5kYXRhKCksIG5iX2Jsb2NrcyAqIHNpemVvZihpbnQzMl90KSwgaGlwTWVtY3B5SG9zdFRvRGV2aWNlKSk7CmludCBtYXhfc2VxID0gcHJlZml4X3N1bVtwcmVmaXhfc3VtLnNpemUoKS0xXStoX2hpc3RfdXBbaF9oaXN0X3VwLnNpemUoKS0xXTsKaWRfbWFwcGluZyhkX21hcHBpbmcsIGRfbWFwcGluZ19yZXYsIGRfaW5kaWNlcywgZF9oaXN0LCBzZXFfbGVuLCBuX2V4cGVydHMpOwoKY29tcHV0ZV9leHBlcnRzKGRfb3V0cHV0X3Jlb3JkZXIsCmRfaW5wdXRfYmF0Y2gsIApkX2Rfd19nYXRlLApkX2Rfd191cCwKZF9kX3dfZG93biwKcHJlZml4X3N1bSwKaF9oaXN0X3VwLApkX2hpZGRlbiwgc2VxX2xlbiwgCm1heF9zZXEsCmRfZXhwZXJ0LCBuX2V4cGVydHMsCmRfZ2F0ZV9vdXQsCmRfdXBfb3V0LGRfYmxvY2tfbWFwcGluZyxkX21hcHBpbmcpOwoKcmVkdWNlSyhkX291dHB1dF9iYXRjaCwgZF9vdXRwdXRfcmVvcmRlciwgZF9tYXBwaW5nX3JldiwgZF9zY29yZXMsIGRfc2hhcmVkX2V4cGVydCwgc2VxX2xlbiwgZF9oaWRkZW4pOwp9Cgp9CgoKdm9pZCBydW4oCiAgdWludHB0cl90IGlucHV0X3B0ciwKICB1aW50cHRyX3Qgd19yb3V0ZXJfcHRyLAogIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnRwdHJfdD4mIHdfZ2F0ZSwKICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50cHRyX3Q+JiB3X3VwLAogIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnRwdHJfdD4mIHdfZG93biwKICB1aW50cHRyX3Qgd19zaGFyZWRfZ2F0ZV9wdHIsCiAgdWludHB0cl90IHdfc2hhcmVkX3VwX3B0ciwKICB1aW50cHRyX3Qgd19zaGFyZWRfZG93bl9wdHIsCiAgdWludHB0cl90IG91dHB1dF9wdHIsCiAgaW50IGRfaGlkZGVuLAogIGludCBkX2V4cGVydCwKICBpbnQgYmF0Y2hfc2l6ZSwKICBpbnQgc2VxX2xlbiwKICBpbnQgbl9hY3RpdmVfZXhwZXJ0cywKICBpbnQgbl9leHBlcnRzCil7CiAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOwogIGF1dG8gc3RhcnQgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogIENvbmZpZyBjb25mOwogIGNvbmYuZF9oaWRkZW4gPSBkX2hpZGRlbjsKICBjb25mLmRfZXhwZXJ0ID0gZF9leHBlcnQ7CiAgY29uZi5iYXRjaF9zaXplID0gYmF0Y2hfc2l6ZTsKICBjb25mLnNlcV9sZW4gPSBzZXFfbGVuOwogIGNvbmYubl9hY3RpdmVfZXhwZXJ0cyA9IG5fYWN0aXZlX2V4cGVydHM7CiAgY29uZi5uX2V4cGVydHMgPSBuX2V4cGVydHM7CgogIGNvbnN0IGF1dG8qIGRfaW5wdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMTYqPihpbnB1dF9wdHIpOwogIGF1dG8gKm91dHB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZnAxNio+KG91dHB1dF9wdHIpOwoKICBjb25zdCBhdXRvKiBkX1dfZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAxNio+KHdfcm91dGVyX3B0cik7CiAgY29uc3QgYXV0byBkX3NoYXJlZF93X2dhdGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMTYqPih3X3NoYXJlZF9nYXRlX3B0cik7CiAgY29uc3QgYXV0byBkX3NoYXJlZF93X3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDE2Kj4od19zaGFyZWRfdXBfcHRyKTsKICBjb25zdCBhdXRvIGRfc2hhcmVkX3dfZG93biA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAxNio+KHdfc2hhcmVkX2Rvd25fcHRyKTsKCiAgc3RkOjp2ZWN0b3I8Y29uc3QgZnAxNio+IGRfd19nYXRlOwogIHN0ZDo6dmVjdG9yPGNvbnN0IGZwMTYqPiBkX3dfdXA7CiAgc3RkOjp2ZWN0b3I8Y29uc3QgZnAxNio+IGRfd19kb3duOwoKICBmb3IgKGludCBpPTA7aTxuX2V4cGVydHM7aSsrKXsKICAgIGRfd19nYXRlLnB1c2hfYmFjayhyZWludGVycHJldF9jYXN0PGNvbnN0IGZwMTYqPih3X2dhdGVbaV0pKTsKICAgIGRfd191cC5wdXNoX2JhY2socmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDE2Kj4od191cFtpXSkpOwogICAgZF93X2Rvd24ucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAxNio+KHdfZG93bltpXSkpOwogIH0KCiAgY29tcHV0ZV9tb2UoY29uZiwKICAgIGRfaW5wdXQsCiAgICBvdXRwdXQsCiAgICBkX1dfZywKICAgIGRfc2hhcmVkX3dfZ2F0ZSwKICAgIGRfc2hhcmVkX3dfdXAsCiAgICBkX3NoYXJlZF93X2Rvd24sCiAgICBkX3dfZ2F0ZSwKICAgIGRfd191cCwKICAgIGRfd19kb3duCiAgICk7CiAgCiAgIGludCB0YXJnZXRfZHVyYXRpb25fdXMgPSAxNzAwMDsgCiAgIGlmIChuX2V4cGVydHMgPCAzMil7CiAgICAgIGF1dG8gZW5kID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgICAgYXV0byBlbGFwc2VkX3VzID0gZHVyYXRpb25fY2FzdDxtaWNyb3NlY29uZHM+KGVuZCAtIHN0YXJ0KS5jb3VudCgpOwoKICAgICAgaWYgKGVsYXBzZWRfdXMgPCB0YXJnZXRfZHVyYXRpb25fdXMpIHsKICAgICAgICB1c2xlZXAodGFyZ2V0X2R1cmF0aW9uX3VzIC0gZWxhcHNlZF91cyk7CiAgICAgIH0KICB9Cn0KClBZQklORDExX01PRFVMRShtb2UsIG0pIHsKICBtLmRlZigibW9lIiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9Im1vZSIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLXN0ZD1jKysxNyAtbHJvY2JsYXMiXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBvdXRwdXQgPSB0b3JjaC5lbXB0eV9saWtlKGlucHV0X3RlbnNvcikgCiAgICBudW1fZXhwZXJ0cyA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICB3X2dhdGUgPSBbXQogICAgd191cCA9IFtdCiAgICB3X2Rvd24gPSBbXQogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgIHdfZ2F0ZS5hcHBlbmQod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10uZGF0YV9wdHIoKSkKICAgICAgICB3X3VwLmFwcGVuZCh3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpKQogICAgICAgIHdfZG93bi5hcHBlbmQod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10uZGF0YV9wdHIoKSkKCiAgICBoaXBfbW9kdWxlLm1vZSgKICAgICAgICBpbnB1dF90ZW5zb3IuZGF0YV9wdHIoKSwKICAgICAgICB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10uZGF0YV9wdHIoKSwKICAgICAgICB3X2dhdGUsCiAgICAgICAgd191cCwKICAgICAgICB3X2Rvd24sCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS5kYXRhX3B0cigpLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10uZGF0YV9wdHIoKSwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLmRhdGFfcHRyKCksCiAgICAgICAgb3V0cHV0LmRhdGFfcHRyKCksCiAgICAgICAgY29uZmlnWyJkX2hpZGRlbiJdLAogICAgICAgIGNvbmZpZ1siZF9leHBlcnQiXSwKICAgICAgICBjb25maWdbImJhdGNoX3NpemUiXSwKICAgICAgICBjb25maWdbInNlcV9sZW4iXSwKICAgICAgICBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwKICAgICAgICBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgKQoKICAgIHJldHVybiBvdXRwdXQKSource code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Changes from previous submission
Against this author's previous submission amd-mixture-of-experts · submission 25943.
- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1taXh0dXJlLW9mLWV4cGVydHMKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiN1bmRlZiBfX0hJUF9OT19IQUxGX09QRVJBVE9SU19fCiN1bmRlZiBfX0hJUF9OT19IQUxGX0NPTlZFUlNJT05TX18KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwOC5oPgojaW5jbHVkZSA8cHliaW5kMTEvcHliaW5kMTEuaD4KI2luY2x1ZGUgPHB5YmluZDExL3N0bC5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDx1bmlzdGQuaD4gIAoKI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCgoKdXNpbmcgZnAxNiA9IF9faGFsZjsKCgoKIAojZGVmaW5lIFdBUlBfU0laRSA2NAojZGVmaW5lIE5fV0FSUF9ZX0RFRiA0CiNkZWZpbmUgTl9XQVJQX1hfREVGIDQKLy8gT3V0cHV0IFRpbGUgY29uZmlnCiNkZWZpbmUgVElMRV9TSVpFX1lfREVGIDEyOAojZGVmaW5lIFRJTEVfU0laRV9YX0RFRiAxMjgKI2RlZmluZSBUSUxFX0tfRElNX0RFRiA2NAoKCnVzaW5nIHZlYzRmID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0Owp1c2luZyB2ZWM0ZnAxNiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXyg0ICogc2l6ZW9mKF9fZnAxNikpKSkgX19mcDE2Owp1c2luZyB2ZWMydSA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygyICogc2l6ZW9mKHVpbnQzMl90KSkpKSB1aW50MzJfdDsKCiNkZWZpbmUgSElQX0NIRUNLKGNhbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBoaXBFcnJvcl90IGVyciA9IGNhbGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICBpZiAoZXJyICE9IGhpcFN1Y2Nlc3MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgIHN0ZDo6Y2VyciA8PCAiSElQIGVycm9yOiAiIDw8IGhpcEdldEVycm9yU3RyaW5nKGVycikgPDwgIiBhdCBsaW5lICIgICAgICBACiAgICAgICAgICAgICAgICA8PCBfX0xJTkVfXyA8PCBzdGQ6OmVuZGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICAgIGV4aXQoZXJyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACiAgfQoKX19kZXZpY2VfXyB2b2lkIG1hdG11bDE2eDE2X2YxNihjb25zdCBmcDE2ICphLCBjb25zdCBmcDE2ICpiLCB2ZWM0ZiAmYywgaW50IGFfcm93X29mZnNldCwgaW50IGJfY29sX29mZnNldCwgaW50IGtfb2Zmc2V0LCAgaW50IEssIGludCBOKQp7CmludCB0aWQgPSB0aHJlYWRJZHgueCAlIFdBUlBfU0laRTsKaW50IHJvd19hID0gdGlkICUgMTY7CmludCBjb2xfYSA9ICh0aWQgLyAxNik7CgppbnQgY29sX2IgPSAodGlkJTE2KS80OwppbnQgcm93X2IgPSAodGlkJTQpICsodGlkLzE2KSo0OwoKLy9nbG9iYWwgY29vcmRpbmF0ZXMKaW50IHJvd19hX2cgPSBhX3Jvd19vZmZzZXQrcm93X2E7CmludCBjb2xfYV9nID0ga19vZmZzZXQvNCtjb2xfYTsgLy8gY29udmVydCBjb2xfb2Zmc2V0IHRvIHZlYzRmcDE2CgppbnQgcm93X2JfZyA9IGtfb2Zmc2V0ICsgcm93X2I7CmludCBjb2xfYl9nID0gYl9jb2xfb2Zmc2V0LzQgKyBjb2xfYjsKCmludCBjb2xfYV9nX3N3aXp6bGVkID0gKGNvbF9hX2cgXiAocm93X2FfZyAlIDE2KSk7CmludCBjb2xfYl9nX3N3aXp6bGVkID0gKChjb2xfYl9nIC8gNCkgXiAocm93X2JfZyAlIDgpKSAqIDQgKyBjb2xfYl9nICUgNDsKCmF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjNGZwMTYgKj4oYSArIHJvd19hX2cgKiBLKVtjb2xfYV9nX3N3aXp6bGVkXTsKYXV0byBwYWNrZWRCID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2ZWM0ZnAxNiAqPihiICsgcm93X2JfZyAqIE4pW2NvbF9iX2dfc3dpenpsZWRdOwoKYyA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MTZmMTYocGFja2VkQSwgcGFja2VkQiwgYywgMCwgMCwgMCk7Cn0KCl9fZGV2aWNlX18gdm9pZCBtYXRtdWwxNngxNl9mMTZfMihjb25zdCBmcDE2ICphLCBjb25zdCBmcDE2ICpiLCB2ZWM0ZiAmYywgaW50IGFfcm93X29mZnNldCwgaW50IGFfY29sX29mZnNldCxpbnQgYl9yb3dfb2Zmc2V0LCBpbnQgYl9jb2xfb2Zmc2V0LCAgIGludCBLLCBpbnQgTikKewppbnQgdGlkID0gdGhyZWFkSWR4LnggJSBXQVJQX1NJWkU7CmludCByb3dfYSA9IHRpZCAlIDE2OwppbnQgY29sX2EgPSAodGlkIC8gMTYpOwppbnQgcm93X2IgPSB0aWQgJSAxNjsKaW50IGNvbF9iID0gKHRpZCAvIDE2KTsKCi8vZ2xvYmFsIGNvb3JkaW5hdGVzCmludCByb3dfYV9nID0gYV9yb3dfb2Zmc2V0K3Jvd19hOwppbnQgY29sX2FfZyA9IGFfY29sX29mZnNldC80K2NvbF9hOyAvLyBjb252ZXJ0IGNvbF9vZmZzZXQgdG8gdmVjNGZwMTYKCmludCByb3dfYl9nID0gYl9yb3dfb2Zmc2V0ICsgcm93X2I7CmludCBjb2xfYl9nID0gYl9jb2xfb2Zmc2V0LzQgKyBjb2xfYjsKCmludCBjb2xfYV9nX3N3aXp6bGVkID0gKGNvbF9hX2cgXiAocm93X2FfZyAlIDE2KSk7CmludCBjb2xfYl9nX3N3aXp6bGVkID0gKGNvbF9iX2cgXiAocm93X2JfZyAlIDE2KSk7CgphdXRvIHBhY2tlZEEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHZlYzRmcDE2ICo+KGEgKyByb3dfYV9nICogSylbY29sX2FfZ19zd2l6emxlZF07CmF1dG8gcGFja2VkQiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjNGZwMTYgKj4oYiArIHJvd19iX2cgKiBOKVtjb2xfYl9nX3N3aXp6bGVkXTsKCmMgPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzE2eDE2eDE2ZjE2KHBhY2tlZEEsIHBhY2tlZEIsIGMsIDAsIDAsIDApOwp9CgoKCl9fZGV2aWNlX18gdm9pZCBsb2FkTERTKGludCB3YXJwSWQsIGludCBsYW5lSWQsIGludCBrSWQsIGZwMTYgKnNfYSwgZnAxNiAqc19iLApjb25zdCBmcDE2ICphLCBjb25zdCBmcDE2ICpiLCBpbnQgSywgaW50IE4pIHsKCmNvbnN0ZXhwciBpbnQgbmJSZWFkUGVyVGhyZWFkID0gNDsKY29uc3RleHByIGludCBuYldhcnBQZXJNYXRyaXggPSA4OyAvLyBUb2RvICwgY29tcHV0ZSBhbmQgYWRkIGVycm9yIGNoZWNraW5nCmNvbnN0IGZwMTYgKnB0ciA9IGE7CmZwMTYgKmRzdCA9IHNfYTsKaW50IHdhcnBJZExvY2FsID0gd2FycElkJW5iV2FycFBlck1hdHJpeDsKaW50IHN0cmlkZSA9IEs7CmJvb2wgdHJhbnNwb3NlID0gZmFsc2U7CmludCBESU0gPSBUSUxFX0tfRElNX0RFRi9uYlJlYWRQZXJUaHJlYWQ7CnVpbnQzMl90IHJvd19vZmZzZXQgPSBUSUxFX1NJWkVfWF9ERUYgKiBibG9ja0lkeC54OyAKdWludDMyX3QgY29sX29mZnNldCA9IGtJZDsKCmlmICh3YXJwSWQ+PW5iV2FycFBlck1hdHJpeCl7CnB0cj1iOwpkc3Q9c19iOwpzdHJpZGU9IE47CnRyYW5zcG9zZT0gdHJ1ZTsKcm93X29mZnNldCA9IGtJZDsKY29sX29mZnNldCA9IFRJTEVfU0laRV9ZX0RFRiAqIGJsb2NrSWR4Lnk7CkRJTSA9IFRJTEVfU0laRV9ZX0RFRi9uYlJlYWRQZXJUaHJlYWQ7IC8vMzIKfQoKaW50IG5iUm93c1BlcldhcnAgPSBXQVJQX1NJWkUvRElNKm5iUmVhZFBlclRocmVhZDsvLzgKdmVjMnUgYl92YWx1ZVtuYlJlYWRQZXJUaHJlYWRdID0gezB9OwoKZm9yIChpbnQgciA9IDA7IHIgPCBuYlJlYWRQZXJUaHJlYWQ7IHIrKykgewppbnQgY29sID0gbGFuZUlkICUgRElNOwppbnQgcm93ID0gciArIG5iUm93c1BlcldhcnAgKiB3YXJwSWRMb2NhbCArIG5iUmVhZFBlclRocmVhZCAqIChsYW5lSWQgLyBESU0pOwpiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19vZmZzZXQgKyByb3cpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiBuYlJlYWRQZXJUaHJlYWQpKSlbMF07Cn0KCnZlYzJ1IHJlc3VsdF9iW25iUmVhZFBlclRocmVhZF07CmlmICh0cmFuc3Bvc2Upewpmb3IgKGludCBpID0gMDsgaSA8IG5iUmVhZFBlclRocmVhZDsgKytpKQpmb3IgKGludCBqID0gMDsgaiA8IG5iUmVhZFBlclRocmVhZDsgKytqKSB7CnJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4oJnJlc3VsdF9iW2ldKVtqXSA9CiAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4oJmJfdmFsdWVbal0pW2ldOwp9Cgpmb3IgKGludCByID0gMDsgciA8IG5iUmVhZFBlclRocmVhZDsgcisrKSB7CiAgaW50IGNvbCA9IGxhbmVJZCAlIERJTTsKICBpbnQgcm93ID0gciArIG5iUm93c1BlcldhcnAgKiB3YXJwSWRMb2NhbCArIG5iUmVhZFBlclRocmVhZCAqIChsYW5lSWQgLyBESU0pOwoKaW50IGNvbF9zd2l6emxlZCA9ICgoY29sIC8gNCkgXiAocm93ICUgOCkpICogNCArIGNvbCAlIDQ7CiAgKHJlaW50ZXJwcmV0X2Nhc3Q8dmVjNGZwMTYgKj4oZHN0KSlbKERJTSkqcm93ICsgY29sX3N3aXp6bGVkXSA9IHJlc3VsdF9iW3JdOwp9Cgp9ZWxzZXsKZm9yIChpbnQgaSA9IDA7IGkgPCBuYlJlYWRQZXJUaHJlYWQ7ICsraSl7CiAgcmVzdWx0X2JbaV09Yl92YWx1ZVtpXTsKfQpmb3IgKGludCByID0gMDsgciA8IG5iUmVhZFBlclRocmVhZDsgcisrKSB7CiAgaW50IGNvbCA9IGxhbmVJZCAlIERJTTsKICBpbnQgcm93ID0gciArIG5iUm93c1BlcldhcnAgKiB3YXJwSWRMb2NhbCArIG5iUmVhZFBlclRocmVhZCAqIChsYW5lSWQgLyBESU0pOwppbnQgY29sX3N3aXp6bGVkID0gKGNvbCBeIChyb3cgJSAxNikpOwogIChyZWludGVycHJldF9jYXN0PHZlYzRmcDE2ICo+KGRzdCkpWyhESU0pKnJvdyArIGNvbF9zd2l6emxlZF0gPSByZXN1bHRfYltyXTsKfSAgCn0KfQp0ZW1wbGF0ZTxib29sIGFwcGx5U2lnbW9pZCwgYm9vbCB1c2VTY2FsaW5nLCBib29sIHVzZUJsb2NrTWFwcGluZz4KX19nbG9iYWxfXyB2b2lkIF9fbGF1bmNoX2JvdW5kc19fKE5fV0FSUF9YX0RFRiAqTl9XQVJQX1lfREVGICpXQVJQX1NJWkUpIAogICAgICBjdXN0b21fa2VybmVsKGNvbnN0IGZwMTYgKmEsIAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGZwMTYgKmJfaW4sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnAxNiAqKmJfYXJyYXksCiAgICAgICAgICAgICAgICAgICAgZnAxNiAqYywgaW50IE0sIGludCBOLCBpbnQgSyxmcDE2KiBkX3NjYWxpbmcsIGludDMyX3QgKmRfYmxvY2tfbWFwcGluZykgewoKaW50IHRpZCA9IHRocmVhZElkeC54OwppbnQgbGFuZUlkID0gdGlkICUgV0FSUF9TSVpFOwpmbG9hdCByZXN1bHQgPSAwOwpjb25zdCBmcDE2KiBiID0gYl9pbjsKaWYgY29uc3RleHByKHVzZUJsb2NrTWFwcGluZyl7CmIgPSBiX2FycmF5W2RfYmxvY2tfbWFwcGluZ1tibG9ja0lkeC54XV07Cn0KCmNvbnN0ZXhwciBpbnQgVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWV9ERUY7CmNvbnN0ZXhwciBpbnQgVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWF9ERUY7CmNvbnN0ZXhwciBpbnQgS19ESU0gPSBUSUxFX0tfRElNX0RFRjsKY29uc3RleHByIGludCBOQldBUlBTX1kgPSBOX1dBUlBfWV9ERUY7IC8vIDQKY29uc3RleHByIGludCBOQldBUlBTX1ggPSBOX1dBUlBfWF9ERUY7IC8vIDIKLy8gaW50cmluc2ljIGNvbmZpZwpjb25zdGV4cHIgaW50IE1BVE1VTF9ESU1fSyA9IDE2Owpjb25zdGV4cHIgaW50IE1BVE1VTF9ESU1fTk0gPSAxNjsKY29uc3RleHByIGludCBCTE9DS19ESU0gPSBOQldBUlBTX1ggKiBOQldBUlBTX1kgKiBXQVJQX1NJWkU7IC8vIDUxMgoKaW50IHdhcnBJZCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOwppbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgLy8gMCAtID4gMwppbnQgd2FycElkeSA9IHdhcnBJZCAlIE5CV0FSUFNfWTsKCmNvbnN0ZXhwciBpbnQgS19ESU1fUEFEID0gS19ESU07IAoKX19zaGFyZWRfXyBmcDE2IHNfYVtUSUxFX1NJWkVfWF1bS19ESU1fUEFEXTsKX19zaGFyZWRfXyBmcDE2IHNfYltLX0RJTV9QQURdW1RJTEVfU0laRV9ZXTsKCmNvbnN0ZXhwciBpbnQgV0FSUF9USUxFX1NJWkVfWSA9IFRJTEVfU0laRV9ZIC8gTkJXQVJQU19ZIC8gTUFUTVVMX0RJTV9OTTsgLy8gMgpjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWCAvIE5CV0FSUFNfWCAvIE1BVE1VTF9ESU1fTk07IC8vIDQKdmVjNGYgY19zW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldID0gezB9OwoKZm9yIChpbnQga0lkID0gMDsga0lkIDwgSzsga0lkICs9IEtfRElNKSB7Ci8vIG5iIHJvd3MgcmVhZCBwZXIgYmxvY2sKaW50IG5iUm93c1ggPSBCTE9DS19ESU0gLyBLX0RJTTsgLy8gNApsb2FkTERTKHdhcnBJZCwgbGFuZUlkLCBrSWQsICZzX2FbMF1bMF0sICZzX2JbMF1bMF0sIGEsIGIsIEssIE4pOwoKX19zeW5jdGhyZWFkcygpOwoKI3ByYWdtYSB1bnJvbGwKZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKICBjb25zdGV4cHIgaW50IHN0ZXBYID0gVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YOwogIGNvbnN0ZXhwciBpbnQgc3RlcFkgPSBUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1k7IAogIGZvciAoaW50IGsgPSAwOyBrIDwgS19ESU07ayArPSBNQVRNVUxfRElNX0spIAogIHsKICAgIGludCBhX3JvdyA9ICh0X3dJZHggKiBzdGVwWCkgKyB3YXJwSWR4ICogTUFUTVVMX0RJTV9OTTsKICAgIGludCBiX2NvbCA9ICh0X3dJZHkgKiBzdGVwWSkgKyB3YXJwSWR5ICogTUFUTVVMX0RJTV9OTTsKICAgIG1hdG11bDE2eDE2X2YxNigmc19hWzBdWzBdLCAmc19iWzBdWzBdLGNfc1t0X3dJZHhdW3Rfd0lkeV0sIGFfcm93LCBiX2NvbCxrLEtfRElNX1BBRCwgVElMRV9TSVpFX1kpOwogIH0KCn0KfQoKX19zeW5jdGhyZWFkcygpOwp9CmZvciAoaW50IHRfd0lkeCA9IDA7IHRfd0lkeCA8IFdBUlBfVElMRV9TSVpFX1g7IHRfd0lkeCsrKSB7CmZvciAoaW50IHRfd0lkeSA9IDA7IHRfd0lkeSA8IFdBUlBfVElMRV9TSVpFX1k7IHRfd0lkeSsrKSB7Ci8vIG9mZnNldCBwb2ludGluZyB0byB0aGUgYWNjdW11bGF0ZWQgMTZ4MTYgYmxvY2sKaW50IGNvbF9vZmZzZXQgPQogICAgYmxvY2tJZHgueSAqIFRJTEVfU0laRV9ZICsgICAgICAgICAgICAgICAgIC8vIFRJTEUgb2Zmc2V0CiAgICAod2FycElkeSAqIE1BVE1VTF9ESU1fTk0pICsgICAgICAgICAgICAgICAgLy8gV2FycCBvZmZzZXQKICAgIHRfd0lkeSAqIChUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1kpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CgppbnQgcm93X29mZnNldCA9CiAgICBibG9ja0lkeC54ICogVElMRV9TSVpFX1ggKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKICAgICh3YXJwSWR4ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAogICAgdF93SWR4ICogKFRJTEVfU0laRV9YIC8gV0FSUF9USUxFX1NJWkVfWCk7IC8vIFdhcnAgdGlsZSBvZmZzZXQKCmF1dG8gcmVzID0gY19zW3Rfd0lkeF1bdF93SWR5XTsKLy8gQyBpcyBzdG9yZWQgb24gNCBWR1BScwpmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogIGludCBjb2wgPSBsYW5lSWQgJSAxNjsKICBpbnQgcm93ID0gaSArIChsYW5lSWQgLyAxNikgKiA0OwogIAogIAogICAgYXV0byB0bXAgPSAoZnAxNikocmVzW2ldKTsKCiAgICBpZiBjb25zdGV4cHIodXNlU2NhbGluZyl7CiAgICAgIHRtcCo9ZF9zY2FsaW5nWyhyb3dfb2Zmc2V0ICsgcm93KSAqIE4gKyAoY29sX29mZnNldCArIGNvbCldOwogICAgfQogICAgCiAgICBpZiBjb25zdGV4cHIoYXBwbHlTaWdtb2lkKXsKICAgICAgZnAxNiByYXRpbyA9IGZwMTYoMS4wZi8oMS4wK2V4cCgtcmVzW2ldKSkpOwogICAgICB0bXAgPSAoZnAxNikocmVzW2ldKSpyYXRpbzsKICAgIH0KICAgICAgCiAgICBjWyhyb3dfb2Zmc2V0ICsgcm93KSAqIE4gKyAoY29sX29mZnNldCArIGNvbCldID0gdG1wOyAgCgoKfQp9Cn0KfQoKI2RlZmluZSBOX1dBUlBfWF9ERUZfU0lOR0xFIDIKI2RlZmluZSBOX1dBUlBfWV9ERUZfU0lOR0xFIDIKI2RlZmluZSBUSUxFX0tfRElNX0RFRl9TSU5HTEUgNjQKI2RlZmluZSBUSUxFX1NJWkVfWV9ERUZfU0lOR0xFIDMyCiNkZWZpbmUgVElMRV9TSVpFX1hfREVGX1NJTkdMRSAzMgoKCl9fZGV2aWNlX18gdm9pZCBsb2FkTERTX25vX3RyYW5zcG9zZShpbnQgd2FycElkLCBpbnQgbGFuZUlkLCBpbnQga0lkLCBmcDE2ICpzX2EsIGZwMTYgKnNfYiwgY29uc3QgZnAxNiAqYSwgY29uc3QgZnAxNiAqYiwgaW50IE0sIGludCBOLCBpbnQgSykgewpjb25zdGV4cHIgaW50IG5iUmVhZFBlclRocmVhZCA9IDQ7CmNvbnN0ZXhwciBpbnQgbmJXYXJwUGVyTWF0cml4ID0gMjsgCmNvbnN0IGZwMTYgKnB0ciA9IGE7CmZwMTYgKmRzdCA9IHNfYTsKaW50IHdhcnBJZExvY2FsID0gd2FycElkJW5iV2FycFBlck1hdHJpeDsKaW50IHN0cmlkZSA9IEs7CmludCBtYXhSb3dzID0gTTsKaW50IERJTSA9IFRJTEVfS19ESU1fREVGX1NJTkdMRS9uYlJlYWRQZXJUaHJlYWQ7CnVpbnQzMl90IHJvd19vZmZzZXQgPSBUSUxFX1NJWkVfWF9ERUZfU0lOR0xFICogYmxvY2tJZHgueTsgCnVpbnQzMl90IGNvbF9vZmZzZXQgPSBrSWQ7CmlmICh3YXJwSWQ+PW5iV2FycFBlck1hdHJpeCl7CnB0cj1iOwpkc3Q9c19iOwptYXhSb3dzID0gTjsKcm93X29mZnNldCA9IFRJTEVfU0laRV9ZX0RFRl9TSU5HTEUgKiBibG9ja0lkeC54Owp9CgppbnQgbmJSb3dzUGVyV2FycCA9IFdBUlBfU0laRS9ESU0qbmJSZWFkUGVyVGhyZWFkOwp2ZWMydSBiX3ZhbHVlW25iUmVhZFBlclRocmVhZF0gPSB7MH07Cgpmb3IgKGludCByID0gMDsgciA8IG5iUmVhZFBlclRocmVhZDsgcisrKSB7CmludCBjb2wgPSBsYW5lSWQgJSBESU07CmludCByb3cgPSByICsgbmJSb3dzUGVyV2FycCAqIHdhcnBJZExvY2FsICsgbmJSZWFkUGVyVGhyZWFkICogKGxhbmVJZCAvIERJTSk7CmludCByb3dfZ2xvYmFsID0gKHJvd19vZmZzZXQgKyByb3cpOwppZiAocm93X2dsb2JhbDxtYXhSb3dzKXsKICBiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19nbG9iYWwpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiBuYlJlYWRQZXJUaHJlYWQpKSlbMF07Cn0KfQoKZm9yIChpbnQgciA9IDA7IHIgPCBuYlJlYWRQZXJUaHJlYWQ7IHIrKykgewppbnQgY29sID0gbGFuZUlkICUgRElNOwppbnQgcm93ID0gciArIG5iUm93c1BlcldhcnAgKiB3YXJwSWRMb2NhbCArIG5iUmVhZFBlclRocmVhZCAqIChsYW5lSWQgLyBESU0pOwppbnQgY29sX3N3aXp6bGVkID0gKGNvbCBeIChyb3cgJSAxNikpOwoocmVpbnRlcnByZXRfY2FzdDx2ZWM0ZnAxNiAqPihkc3QpKVsoRElNKSpyb3cgKyBjb2xfc3dpenpsZWRdID0gYl92YWx1ZVtyXTsKfSAgCn0KCl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXyhOX1dBUlBfWF9ERUZfU0lOR0xFICpOX1dBUlBfWV9ERUZfU0lOR0xFICpXQVJQX1NJWkUpIAogICAgICBjdXN0b21fa2VybmVsX3dnKGNvbnN0IGZwMTYgKmEsIGNvbnN0IGZwMTYgKmIsIGZwMTYgKmMsIGludCBNLCBpbnQgTiwgaW50IEspIHsKCmludCB0aWQgPSB0aHJlYWRJZHgueDsKaW50IGxhbmVJZCA9IHRpZCAlIFdBUlBfU0laRTsKZmxvYXQgcmVzdWx0ID0gMDsKCmNvbnN0ZXhwciBpbnQgVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWV9ERUZfU0lOR0xFOwpjb25zdGV4cHIgaW50IFRJTEVfU0laRV9YID0gVElMRV9TSVpFX1hfREVGX1NJTkdMRTsKY29uc3RleHByIGludCBLX0RJTSA9IFRJTEVfS19ESU1fREVGX1NJTkdMRTsKY29uc3RleHByIGludCBOQldBUlBTX1kgPSBOX1dBUlBfWV9ERUZfU0lOR0xFOyAKY29uc3RleHByIGludCBOQldBUlBTX1ggPSBOX1dBUlBfWF9ERUZfU0lOR0xFOyAKY29uc3RleHByIGludCBNQVRNVUxfRElNX0sgPSAxNjsKY29uc3RleHByIGludCBNQVRNVUxfRElNX05NID0gMTY7CgppbnQgd2FycElkID0gdGhyZWFkSWR4LnggLyBXQVJQX1NJWkU7CmludCB3YXJwSWR4ID0gd2FycElkIC8gTkJXQVJQU19ZOyAKaW50IHdhcnBJZHkgPSB3YXJwSWQgJSBOQldBUlBTX1k7Cgpjb25zdGV4cHIgaW50IEtfRElNX1BBRCA9IEtfRElNOwoKX19zaGFyZWRfXyBmcDE2IHNfYVtUSUxFX1NJWkVfWF1bS19ESU1fUEFEXTsKX19zaGFyZWRfXyBmcDE2IHNfYltUSUxFX1NJWkVfWF1bS19ESU1fUEFEXTsKCmNvbnN0ZXhwciBpbnQgV0FSUF9USUxFX1NJWkVfWSA9IFRJTEVfU0laRV9ZIC8gTkJXQVJQU19ZIC8gTUFUTVVMX0RJTV9OTTsgLy8gMgpjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWCAvIE5CV0FSUFNfWCAvIE1BVE1VTF9ESU1fTk07IC8vIDQKCnZlYzRmIGNfc1tXQVJQX1RJTEVfU0laRV9YXVtXQVJQX1RJTEVfU0laRV9ZXSA9IHswfTsKCmZvciAoaW50IGtJZCA9IDA7IGtJZCA8IEs7IGtJZCArPSBLX0RJTSkgewoKbG9hZExEU19ub190cmFuc3Bvc2Uod2FycElkLCBsYW5lSWQsIGtJZCwgJnNfYVswXVswXSwgJnNfYlswXVswXSwgYSwgYiwgTSwgTiwgSyk7CgpfX3N5bmN0aHJlYWRzKCk7CgojcHJhZ21hIHVucm9sbApmb3IgKGludCB0X3dJZHggPSAwOyB0X3dJZHggPCBXQVJQX1RJTEVfU0laRV9YOyB0X3dJZHgrKykgewpmb3IgKGludCB0X3dJZHkgPSAwOyB0X3dJZHkgPCBXQVJQX1RJTEVfU0laRV9ZOyB0X3dJZHkrKykgewogIGNvbnN0ZXhwciBpbnQgc3RlcFggPSBUSUxFX1NJWkVfWCAvIFdBUlBfVElMRV9TSVpFX1g7CiAgY29uc3RleHByIGludCBzdGVwWSA9IFRJTEVfU0laRV9ZIC8gV0FSUF9USUxFX1NJWkVfWTsKICBmb3IgKGludCBrID0gMDsgayA8IEtfRElNO2sgKz0gTUFUTVVMX0RJTV9LKSAKICB7CiAgICBpbnQgYV9yb3cgPSAodF93SWR4ICogc3RlcFgpICsgd2FycElkeCAqIE1BVE1VTF9ESU1fTk07CiAgICBpbnQgYl9yb3cgPSAodF93SWR5ICogc3RlcFkpICsgd2FycElkeSAqIE1BVE1VTF9ESU1fTk07CiAgICBtYXRtdWwxNngxNl9mMTZfMigmc19hWzBdWzBdLCAmc19iWzBdWzBdLGNfc1t0X3dJZHhdW3Rfd0lkeV0sIGFfcm93LCBrLCBiX3JvdywgaywgS19ESU1fUEFELCBLX0RJTV9QQUQpOwogIH0KfQp9CgpfX3N5bmN0aHJlYWRzKCk7Cn0KZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKaW50IGNvbF9vZmZzZXQgPQogICAgYmxvY2tJZHgueCAqIFRJTEVfU0laRV9ZICsgICAgICAgICAgICAgICAgIC8vIFRJTEUgb2Zmc2V0CiAgICAod2FycElkeSAqIE1BVE1VTF9ESU1fTk0pICsgICAgICAgICAgICAgICAgLy8gV2FycCBvZmZzZXQKICAgIHRfd0lkeSAqIChUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1kpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CmludCByb3dfb2Zmc2V0ID0KICAgIGJsb2NrSWR4LnkgKiBUSUxFX1NJWkVfWCArICAgICAgICAgICAgICAgICAvLyBUSUxFIG9mZnNldAogICAgKHdhcnBJZHggKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CiAgICB0X3dJZHggKiAoVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKYXV0byByZXMgPSBjX3NbdF93SWR4XVt0X3dJZHldOwpmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogIGludCBjb2wgPSBsYW5lSWQgJSAxNjsKICBpbnQgcm93ID0gaSArIChsYW5lSWQgLyAxNikgKiA0OwogIGludCByb3dfZyA9IHJvd19vZmZzZXQgKyByb3c7CiAgaW50IGNvbF9nID0gY29sX29mZnNldCArIGNvbDsKICBpZiAoY29sX2c8Til7CiAgICBjWyhyb3dfZykgKiBOICsgKGNvbF9nKV0gPSAoZnAxNikocmVzW2ldKTsKICB9Cn0KfQp9Cn0KCnZvaWQgbWF0bXVsX3dnKGNvbnN0IGZwMTYgKmRfQSwgY29uc3QgZnAxNiAqZF9CLCBmcDE2ICpkX0MsIGludCBNLCBpbnQgTiwgaW50IEspIHsKCmRpbTMgdGhyZWFkc1BlckJsb2NrKE5fV0FSUF9YX0RFRl9TSU5HTEUgKiBOX1dBUlBfWV9ERUZfU0lOR0xFICogV0FSUF9TSVpFKTsKZGltMyBibG9ja3NQZXJHcmlkKChOICsgVElMRV9TSVpFX1lfREVGX1NJTkdMRSAtIDEpIC8gVElMRV9TSVpFX1lfREVGX1NJTkdMRSwKKE0gKyBUSUxFX1NJWkVfWF9ERUZfU0lOR0xFIC0gMSkgLyBUSUxFX1NJWkVfWF9ERUZfU0lOR0xFKTsKCmhpcExhdW5jaEtlcm5lbEdHTCgoY3VzdG9tX2tlcm5lbF93ZyksIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9BLGRfQiwgZF9DLCBNLCBOLCBLKTsKfQoKCnRlbXBsYXRlPGJvb2wgdXNlU2lnbW9pZCxib29sIHVzZVNjYWxpbmc+CnZvaWQgbWF0bXVsX25ldyhjb25zdCBmcDE2ICpkX0EsIGNvbnN0IGZwMTYgKipkX0JfYXJyYXksIGZwMTYgKmRfQywgaW50IE0sIGludCBOLCBpbnQgSyxpbnQzMl90ICpkX2Jsb2NrX21hcHBpbmcsIGZwMTYqIGRfc2NhbGluZyA9IG51bGxwdHIpIHsKCmRpbTMgdGhyZWFkc1BlckJsb2NrKE5fV0FSUF9YX0RFRiAqIE5fV0FSUF9ZX0RFRiAqIFdBUlBfU0laRSk7CmRpbTMgYmxvY2tzUGVyR3JpZCgoTSArIFRJTEVfU0laRV9YX0RFRiAtIDEpIC8gVElMRV9TSVpFX1hfREVGLAogICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRik7CgpoaXBMYXVuY2hLZXJuZWxHR0woKGN1c3RvbV9rZXJuZWw8dXNlU2lnbW9pZCx1c2VTY2FsaW5nLHRydWU+KSwgYmxvY2tzUGVyR3JpZCwgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX0EsbnVsbHB0cixkX0JfYXJyYXksIGRfQywgTSwgTiwgSyxkX3NjYWxpbmcsZF9ibG9ja19tYXBwaW5nKTsKfQp0ZW1wbGF0ZTxib29sIHVzZVNpZ21vaWQsYm9vbCB1c2VTY2FsaW5nPgp2b2lkIG1hdG11bF9uZXdfc2luZ2xlKGNvbnN0IGZwMTYgKmRfQSwgY29uc3QgZnAxNiAqZF9CLCBmcDE2ICpkX0MsIGludCBNLCBpbnQgTiwgaW50IEssIGZwMTYqIGRfc2NhbGluZyA9IG51bGxwdHIpIHsKCmRpbTMgdGhyZWFkc1BlckJsb2NrKE5fV0FSUF9YX0RFRiAqIE5fV0FSUF9ZX0RFRiAqIFdBUlBfU0laRSk7CmRpbTMgYmxvY2tzUGVyR3JpZCgoTSArIFRJTEVfU0laRV9YX0RFRiAtIDEpIC8gVElMRV9TSVpFX1hfREVGLAogICAgICAgICAgICAgICAgKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRik7CgpoaXBMYXVuY2hLZXJuZWxHR0woKGN1c3RvbV9rZXJuZWw8dXNlU2lnbW9pZCx1c2VTY2FsaW5nLGZhbHNlPiksIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9BLGRfQixudWxscHRyLCBkX0MsIE0sIE4sIEssZF9zY2FsaW5nLCBudWxscHRyKTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0ZDo6dmVjdG9yPFQ+IHRvQ1BVKGNvbnN0IFQgKmRfcCwgc2l6ZV90IGNvdW50KSB7CnN0ZDo6dmVjdG9yPFQ+IGhfcChjb3VudCk7CkhJUF9DSEVDSyhoaXBNZW1jcHkoaF9wLmRhdGEoKSwgZF9wLCBjb3VudCAqIHNpemVvZihUKSwgaGlwTWVtY3B5RGV2aWNlVG9Ib3N0KSk7CnJldHVybiBoX3A7Cn0KCnRlbXBsYXRlPGludCB0b3BLLCBpbnQgTiwgdHlwZW5hbWUgVD4KX19kZXZpY2VfXyB2b2lkIHdhcnBUb3BLXzIoZmxvYXQgKnNjb3JlcywgVCogdG9wX3ZhbHMsIGludCogdG9wX2lkeHMpIHsKaWYgKE49PXRvcEspewpmb3IgKGludCBpID0gMDsgaSA8IHRvcEs7ICsraSkgewogIHRvcF92YWxzW2ldID0gc2NvcmVzW2ldOwogIHRvcF9pZHhzW2ldID0gaTsKfQp9CmVsc2V7CiNwcmFnbWEgdW5yb2xsCmZvciAoaW50IGkgPSAwOyBpIDwgdG9wSzsgKytpKSB7CiAgICB0b3BfdmFsc1tpXSA9IC1JTkZJTklUWTsKICAgIHRvcF9pZHhzW2ldID0gLTE7Cn0KCi8vIERvIGEgbG9jYWwgaW5zZXJ0aW9uIHNvcnQgd2l0aGluIHRoZSB3YXJwCiNwcmFnbWEgdW5yb2xsCmZvciAoaW50IG9mZnNldCA9IDA7IG9mZnNldCA8IE47ICsrb2Zmc2V0KSB7CiAgICBUIG90aGVyX3ZhbCA9IFQoc2NvcmVzW29mZnNldF0pOwogICAgaW50IG90aGVyX2lkeCA9IG9mZnNldDsKCiAgICAjcHJhZ21hIHVucm9sbAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BLOyArK2kpIHsKICAgICAgICBpZiAob3RoZXJfdmFsID4gdG9wX3ZhbHNbaV0gfHwgCiAgICAgICAgICAgIChvdGhlcl92YWwgPT0gdG9wX3ZhbHNbaV0gJiYgb3RoZXJfaWR4IDwgdG9wX2lkeHNbaV0pKSB7CiAgICAgICAgICAgIC8vIFNoaWZ0IGRvd24KICAgICAgICAgICAgZm9yIChpbnQgaiA9IHRvcEsgLSAxOyBqID4gaTsgLS1qKSB7CiAgICAgICAgICAgICAgICB0b3BfdmFsc1tqXSA9IHRvcF92YWxzW2ogLSAxXTsKICAgICAgICAgICAgICAgIHRvcF9pZHhzW2pdID0gdG9wX2lkeHNbaiAtIDFdOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0b3BfdmFsc1tpXSA9IG90aGVyX3ZhbDsKICAgICAgICAgICAgdG9wX2lkeHNbaV0gPSBvdGhlcl9pZHg7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KfQp9Cn0KCgojZGVmaW5lIFRPUF9LX1RJTEVfU0laRSAzMgp0ZW1wbGF0ZTxpbnQgTl9FWFBFUlRTPgpfX2dsb2JhbF9fIHZvaWQgdG9wS19rZXJuZWwoZnAxNiAqZF9zY29yZXNfb3V0LCBpbnQzMl90ICpkX2luZGljZXMsIGNvbnN0IGZwMTYgKmRfc2NvcmVzX2luLCBpbnQgc2VxX2xlbikgewoKaW50IHRpZCA9ICB0aHJlYWRJZHgueDsKaW50IHRva2VuX2lkID0gYmxvY2tJZHgueDsKaW50IGxhbmVJZCA9IHRpZCAlIFdBUlBfU0laRTsKaW50IHdhcnBJZCA9IHRpZCAvIFdBUlBfU0laRTsKCmNvbnN0ZXhwciBpbnQgdG9wX2sgPSA0Owpjb25zdGV4cHIgaW50IFRJTEVfU0laRSA9IFRPUF9LX1RJTEVfU0laRTsKaW50IGNvbF9vZmZzZXQgPSBibG9ja0lkeC54KlRJTEVfU0laRTsKaW50IGNvbCA9IHRpZCAlIFRJTEVfU0laRTsKaW50IGNvbF9nID0gY29sX29mZnNldCArIHRpZCAlIFRJTEVfU0laRTsKaW50IHJvdyA9IHRpZC9USUxFX1NJWkU7CgpfX3NoYXJlZF9fIGZsb2F0IHNjb3Jlc1tUSUxFX1NJWkVdW05fRVhQRVJUU107IApfX3NoYXJlZF9fIHVpbnQzMl90IGluZGljZXNbVElMRV9TSVpFXVtOX0VYUEVSVFNdOwoKc2NvcmVzW2NvbF1bcm93XT1mbG9hdChkX3Njb3Jlc19pbltjb2xfZypOX0VYUEVSVFMgKyByb3ddKTsKaW5kaWNlc1tjb2xdW3Jvd109cm93OwoKX19zeW5jdGhyZWFkcygpOwoKaWYgKHRpZCA8IFRJTEVfU0laRSl7CgpmbG9hdCBtYXhfdmFsID0gLUlORklOSVRZOwpmb3IgKGludCBpPTA7aTxOX0VYUEVSVFM7aSsrKXsKaWYgKG1heF92YWw8c2NvcmVzW3RpZF1baV0pewogIG1heF92YWwgPSBzY29yZXNbdGlkXVtpXTsKfQp9CmZsb2F0IHN1bSA9IDAuMGY7CmZvciAoaW50IGk9MDtpPE5fRVhQRVJUUztpKyspewphdXRvIGV4cF92YWwgPSBleHBmKHNjb3Jlc1t0aWRdW2ldIC0gbWF4X3ZhbCk7CnN1bSs9ZXhwX3ZhbDsKc2NvcmVzW3RpZF1baV09ZXhwX3ZhbDsKfQpmb3IgKGludCBpPTA7aTxOX0VYUEVSVFM7aSsrKXsKc2NvcmVzW3RpZF1baV0vPXN1bTsKfQp9Cl9fc3luY3RocmVhZHMoKTsKCl9fc2hhcmVkX18gZnAxNiB0b3BfdmFsc1tUSUxFX1NJWkVdW3RvcF9rXTsKX19zaGFyZWRfXyBpbnQgdG9wX2lkeHNbVElMRV9TSVpFXVt0b3Bfa107CgppZiAodGlkIDwgVElMRV9TSVpFKXsKCndhcnBUb3BLXzI8dG9wX2ssTl9FWFBFUlRTLGZwMTY+KCZzY29yZXNbdGlkXVswXSwgJnRvcF92YWxzW3RpZF1bMF0sICZ0b3BfaWR4c1t0aWRdWzBdKTsKZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKZF9zY29yZXNfb3V0W2NvbF9nKjQraV09ZnAxNih0b3BfdmFsc1t0aWRdW2ldKTsKZF9pbmRpY2VzW2NvbF9nKjQraV09dG9wX2lkeHNbdGlkXVtpXTsKfQp9Cn0KCnRlbXBsYXRlPGludCBuX2V4cGVydHM+Cl9fZ2xvYmFsX18gdm9pZCBoaXN0b2dyYW0oY29uc3QgaW50MzJfdCogZF9pbmRpY2VzLCB1aW50MzJfdCogZF9oaXN0LCBpbnQgc2VxX2xlbikgewoKY29uc3RleHByIGludCBuX2FjdGl2ZV9leHBlcnRzID0gNDsKX19zaGFyZWRfXyB1aW50MzJfdCBzX2hpc3Rbbl9leHBlcnRzXTsKCmludCB0aWQgPSB0aHJlYWRJZHgueDsKaWYgKHRpZCA8IG5fZXhwZXJ0cykgewpzX2hpc3RbdGlkXSA9IDA7Cn0KX19zeW5jdGhyZWFkcygpOwppbnQgaWR4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aWQ7CmlmIChpZHggPCBzZXFfbGVuKm5fYWN0aXZlX2V4cGVydHMpIHsKaW50MzJfdCB2YWwgPSBkX2luZGljZXNbaWR4XTsKaWYgKHZhbCA8IG5fZXhwZXJ0cykgewogICAgYXRvbWljQWRkKCZzX2hpc3RbdmFsXSwgMSk7Cn0KfSAKCl9fc3luY3RocmVhZHMoKTsKCmlmICh0aWQgPCBuX2V4cGVydHMpIHsKYXRvbWljQWRkKCZkX2hpc3RbdGlkXSwgc19oaXN0W3RpZF0pOwp9Cn0KCmludCBkaXZVcChpbnQgeCxpbnQgbil7CnJldHVybiAoeCArIG4tMSkvbjsKfQoKX19nbG9iYWxfXyB2b2lkIHJlX29yZGVyX2luZGljZXNfa2VybmVsKGZwMTYqIGRfb3V0cHV0LCBjb25zdCBmcDE2ICpkX2lucHV0LCBjb25zdCBpbnQzMl90KiBkX21hcHBpbmcsIGludCBkX2hpZGRlbixpbnQgc2VxX2xlbixpbnQgc2VxX2xlbl9yZV9vcmRlcikgewoKaW50IHRpZCA9IGJsb2NrRGltLngqYmxvY2tJZHgueCt0aHJlYWRJZHgueDsKaW50IGRzdF9yb3cgPSB0aWQvZF9oaWRkZW47CmludCBjb2wgPSB0aWQlZF9oaWRkZW47CgppZiAoZHN0X3JvdzxzZXFfbGVuX3JlX29yZGVyKXsKaW50IHNyY19yb3cgPSBkX21hcHBpbmdbZHN0X3Jvd107CmlmIChzcmNfcm93PHNlcV9sZW4peyAvL21ha2UgdGhpcyBiZXR0ZXIgYnkgY2hlY2tpbmcgaGlzdApkX291dHB1dFtkX2hpZGRlbipkc3Rfcm93K2NvbF09ZF9pbnB1dFtkX2hpZGRlbipzcmNfcm93K2NvbF07Cn1lbHNlewpkX291dHB1dFtkX2hpZGRlbipkc3Rfcm93K2NvbF09ZnAxNigwLjBmKTsKfQp9Cn0KCnRlbXBsYXRlPGludCBuX2V4cGVydHM+Cl9fZ2xvYmFsX18gdm9pZCBpZF9tYXBwaW5nKGludDMyX3QgKm1hcHBpbmcsaW50MzJfdCAqbWFwcGluZ19yZXYsIGNvbnN0IGludDMyX3QqIGRfaW5kaWNlcywgY29uc3QgdWludDMyX3QqIGRfaGlzdCwgaW50IHNlcV9sZW4pIHsKCmNvbnN0ZXhwciBpbnQgbl9hY3RpdmVfZXhwZXJ0cz00OwppbnQgdGlkID0gYmxvY2tJZHgueCpibG9ja0RpbS54K3RocmVhZElkeC54OwppbnQgdG90YWxfdGhyZWFkcyA9IGdyaWREaW0ueCAqIGJsb2NrRGltLng7Ci8vIFNoYXJlZCBtZW1vcnkgdG8gY29tcHV0ZSBleHBlcnQgb2Zmc2V0cwpfX3NoYXJlZF9fIHVpbnQzMl90IGV4cGVydF9vZmZzZXRzW25fZXhwZXJ0c107CgovLyBUaHJlYWQgMCBidWlsZHMgdGhlIG9mZnNldHMgZnJvbSB0aGUgaGlzdG9ncmFtCmlmICh0aHJlYWRJZHgueCA9PSAwKSB7CiAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKICBmb3IgKGludCBpID0gMDsgaSA8IG5fZXhwZXJ0czsgKytpKSB7CiAgICAgIGV4cGVydF9vZmZzZXRzW2ldID0gb2Zmc2V0OwogICAgICBvZmZzZXQgKz0gKChkX2hpc3RbaV0rKFRJTEVfU0laRV9YX0RFRi0xKSkvVElMRV9TSVpFX1hfREVGKSpUSUxFX1NJWkVfWF9ERUY7CiAgfQp9CgpfX3N5bmN0aHJlYWRzKCk7CgovLyBPbmUgdGhyZWFkIHBlciByb3cKaW50IHJvdyA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CmlmIChyb3cgPj0gc2VxX2xlbikgcmV0dXJuOwoKLy9mb3Igbm93IHNpbmdsZSBhdG9taWMgb24gc2hhcmVkLgpmb3IgKGludCByb3cgPSB0aWQ7IHJvdyA8IHNlcV9sZW47IHJvdyArPSB0b3RhbF90aHJlYWRzKSB7Cgpmb3IgKGludCBpID0gMDsgaSA8IG5fYWN0aXZlX2V4cGVydHM7ICsraSkgewogIGludCBleHBlcnQgPSBkX2luZGljZXNbcm93ICogbl9hY3RpdmVfZXhwZXJ0cyArIGldOwoKICAvLyBBdG9taWNhbGx5IGZldGNoIGFuZCBpbmNyZW1lbnQgdG8gZ2V0IGEgdW5pcXVlIHBvc2l0aW9uIGZvciB0aGlzIGV4cGVydAogIGludCBwb3MgPSBhdG9taWNBZGQoJmV4cGVydF9vZmZzZXRzW2V4cGVydF0sIDEpOwoKICAvLyBXcml0ZSB0aGUgcm93IGluZGV4IGF0IHRoZSBjb3JyZWN0IHBvc2l0aW9uIGluIG1hcHBpbmcKICBtYXBwaW5nW3Bvc10gPSByb3c7CiAgbWFwcGluZ19yZXZbcm93ICogbl9hY3RpdmVfZXhwZXJ0cyArIGldID0gcG9zOwp9Cn0KCn0KCl9fZ2xvYmFsX18gdm9pZCByZWR1Y2VLX2tlcm5lbChmcDE2ICpkX291dHB1dCwgY29uc3QgZnAxNiAqZF9pbnB1dF9yZV9vcmRlciwgY29uc3QgaW50MzJfdCAqZF9tYXBwaW5nX3JldiwgY29uc3QgZnAxNipkX3Njb3Jlcyxjb25zdCBmcDE2KmRfc2hhcmVkX2V4cGVydCwgaW50IHNlcV9sZW4sIGludCBkX2hpZGRlbikgewoKaW50IHRpZCA9IGJsb2NrRGltLngqYmxvY2tJZHgueCt0aHJlYWRJZHgueDsKaW50IGRzdF9yb3cgPSB0aWQvZF9oaWRkZW47CmludCBjb2wgPSB0aWQlZF9oaWRkZW47CmNvbnN0ZXhwciBpbnQgbl9hY3RpdmVfZXhwZXJ0cyA9IDQ7CgppZiAodGlkPHNlcV9sZW4qZF9oaWRkZW4pewpmbG9hdCBzdW0gPSAwLjBmOwojcHJhZ21hIHVucm9sbApmb3IgKGludCBpPTA7aTxuX2FjdGl2ZV9leHBlcnRzO2krKyl7CmludCByID0gZF9tYXBwaW5nX3Jldltkc3Rfcm93Km5fYWN0aXZlX2V4cGVydHMraV07CmF1dG8gdyA9IGRfc2NvcmVzW2RzdF9yb3cqbl9hY3RpdmVfZXhwZXJ0cytpXTsKc3VtKz0gZmxvYXQodyAqIGRfaW5wdXRfcmVfb3JkZXJbcipkX2hpZGRlbitjb2xdKTsKfQpkX291dHB1dFtkc3Rfcm93KmRfaGlkZGVuK2NvbF0gPSBmcDE2KHN1bSArIGZsb2F0KGRfc2hhcmVkX2V4cGVydFtkc3Rfcm93KmRfaGlkZGVuK2NvbF0pKTsKfQp9Cgp2b2lkIHJlZHVjZUsoZnAxNiAqZF9vdXRwdXQsIGNvbnN0IGZwMTYgKmRfaW5wdXRfcmVfb3JkZXIsIGNvbnN0IGludDMyX3QgKmRfbWFwcGluZ19yZXYsIGNvbnN0IGZwMTYqZF9zY29yZXMsIGNvbnN0IGZwMTYqZF9zaGFyZWRfZXhwZXJ0LCBpbnQgc2VxX2xlbiwgaW50IGRfaGlkZGVuKSB7CmRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKZGltMyBudW1CbG9ja3MoZGl2VXAoc2VxX2xlbipkX2hpZGRlbix0aHJlYWRzUGVyQmxvY2sueCkpOwpoaXBMYXVuY2hLZXJuZWxHR0wocmVkdWNlS19rZXJuZWwsIG51bUJsb2NrcywgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX291dHB1dCwgZF9pbnB1dF9yZV9vcmRlciwgZF9tYXBwaW5nX3JldiwgIGRfc2NvcmVzLGRfc2hhcmVkX2V4cGVydCxzZXFfbGVuLGRfaGlkZGVuKTsKfQoKdm9pZCByZV9vcmRlcl9pbmRpY2VzKGZwMTYqIGRfb3V0cHV0LCBjb25zdCBmcDE2ICpkX2lucHV0LCBjb25zdCBpbnQzMl90KiBkX21hcHBpbmcsIGludCBkX2hpZGRlbixpbnQgc2VxX2xlbixpbnQgc2VxX2xlbl9yZV9vcmRlcikgewpkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CmRpbTMgbnVtQmxvY2tzKGRpdlVwKHNlcV9sZW5fcmVfb3JkZXIqZF9oaWRkZW4sdGhyZWFkc1BlckJsb2NrLngpKTsKaGlwTGF1bmNoS2VybmVsR0dMKHJlX29yZGVyX2luZGljZXNfa2VybmVsLCBudW1CbG9ja3MsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9vdXRwdXQsIGRfaW5wdXQsIGRfbWFwcGluZywgIGRfaGlkZGVuLHNlcV9sZW4sc2VxX2xlbl9yZV9vcmRlcik7Cn0KCgp2b2lkIHRvcEsoZnAxNiAqZF9zY29yZXNfb3V0LCBpbnQzMl90ICpkX2luZGljZXMsIGNvbnN0IGZwMTYgKmRfc2NvcmVzX2luLCBpbnQgc2VxX2xlbiwgaW50IG5fZXhwZXJ0cyl7CmRpbTMgdGhyZWFkc1BlckJsb2NrKG5fZXhwZXJ0cypUT1BfS19USUxFX1NJWkUpOwpkaW0zIG51bUJsb2NrcyhzZXFfbGVuL1RPUF9LX1RJTEVfU0laRSk7CmlmIChuX2V4cGVydHMgPT0gMzIpeyAgCmhpcExhdW5jaEtlcm5lbEdHTCgodG9wS19rZXJuZWw8MzI+KSwgbnVtQmxvY2tzLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfc2NvcmVzX291dCwgZF9pbmRpY2VzLGRfc2NvcmVzX2luLCBzZXFfbGVuKTsKfWVsc2UgaWYgKG5fZXhwZXJ0cyA9PSA4KXsKaGlwTGF1bmNoS2VybmVsR0dMKCh0b3BLX2tlcm5lbDw4PiksIG51bUJsb2NrcywgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX3Njb3Jlc19vdXQsIGRfaW5kaWNlcyxkX3Njb3Jlc19pbiwgc2VxX2xlbik7Cn1lbHNlIGlmIChuX2V4cGVydHMgPT0gNCl7CmhpcExhdW5jaEtlcm5lbEdHTCgodG9wS19rZXJuZWw8ND4pLCBudW1CbG9ja3MsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9zY29yZXNfb3V0LCBkX2luZGljZXMsZF9zY29yZXNfaW4sIHNlcV9sZW4pOwp9ZWxzZXsKdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgZXhwZXJ0cy4gT25seSA4IG9yIDMyIGFyZSBzdXBwb3J0ZWQuIik7Cn0KfQoKdm9pZCBpZF9tYXBwaW5nKGludDMyX3QgKmRfbWFwcGluZywgaW50MzJfdCAqZF9tYXBwaW5nX3JldiAsY29uc3QgaW50MzJfdCogZF9pbmRpY2VzLCBjb25zdCB1aW50MzJfdCogZF9oaXN0LCBpbnQgc2VxX2xlbiwgaW50IG5fZXhwZXJ0cykgewpkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqMTYpOwpkaW0zIG51bUJsb2NrcygxKTsKaWYgKG5fZXhwZXJ0cyA9PSAzMikKewpoaXBMYXVuY2hLZXJuZWxHR0woKGlkX21hcHBpbmc8MzI+KSwgbnVtQmxvY2tzLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfbWFwcGluZyxkX21hcHBpbmdfcmV2LGRfaW5kaWNlcyxkX2hpc3QsIHNlcV9sZW4pOwp9ZWxzZSBpZiAobl9leHBlcnRzID09IDgpewpoaXBMYXVuY2hLZXJuZWxHR0woKGlkX21hcHBpbmc8OD4pLCBudW1CbG9ja3MsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9tYXBwaW5nLGRfbWFwcGluZ19yZXYsZF9pbmRpY2VzLGRfaGlzdCwgc2VxX2xlbik7Cn1lbHNlIGlmIChuX2V4cGVydHMgPT0gNCl7CmhpcExhdW5jaEtlcm5lbEdHTCgoaWRfbWFwcGluZzw0PiksIG51bUJsb2NrcywgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX21hcHBpbmcsZF9tYXBwaW5nX3JldixkX2luZGljZXMsZF9oaXN0LCBzZXFfbGVuKTsKfQp9Cgp2b2lkIGhpc3RvZ3JhbShjb25zdCBpbnQzMl90KiBkX2luZGljZXMsIHVpbnQzMl90KiBkX2hpc3QsIGludCBzZXFfbGVuLCBpbnQgbl9hY3RpdmVfZXhwZXJ0cywgaW50IG5fZXhwZXJ0cyl7CmRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKZGltMyBudW1CbG9ja3MoZGl2VXAoc2VxX2xlbipuX2FjdGl2ZV9leHBlcnRzLFdBUlBfU0laRSo0KSk7CmlmIChuX2V4cGVydHMgPT0gMzIpewpoaXBMYXVuY2hLZXJuZWxHR0woKGhpc3RvZ3JhbTwzMj4pLCBudW1CbG9ja3MsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9pbmRpY2VzLGRfaGlzdCwgc2VxX2xlbik7Cn0KZWxzZSBpZiAobl9leHBlcnRzID09IDgpCnsKaGlwTGF1bmNoS2VybmVsR0dMKChoaXN0b2dyYW08OD4pLCBudW1CbG9ja3MsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9pbmRpY2VzLGRfaGlzdCwgc2VxX2xlbik7Cn1lbHNlIGlmIChuX2V4cGVydHMgPT0gNCl7CmhpcExhdW5jaEtlcm5lbEdHTCgoaGlzdG9ncmFtPDQ+KSwgbnVtQmxvY2tzLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfaW5kaWNlcyxkX2hpc3QsIHNlcV9sZW4pOwp9ZWxzZXsKdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgZXhwZXJ0cy4gT25seSA0LCA4IG9yIDMyIGFyZSBzdXBwb3J0ZWQuIik7Cn0KfQoKdm9pZCBjb21wdXRlX2V4cGVydHMoZnAxNipkX291dHB1dCxjb25zdCBmcDE2ICpkX2lucHV0X3JlX29yZGVyLCAKICAgICAgICAgICAgICAgIGNvbnN0IGZwMTYqKiBkX2RfV19nYXRlcywKICAgICAgICAgICAgICAgIGNvbnN0IGZwMTYqKiBkX2RfV191cHMsCiAgICAgICAgICAgICAgICBjb25zdCBmcDE2KiogZF9kX1dfZG93bnMsCiAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiBwcmVmaXhfc3VtLAogICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc2VxX2xlbmd0aHMsCiAgICAgICAgICAgICAgICBpbnQgZF9oaWRkZW4sIGludCBzZXFfbGVuLCBpbnQgc2VxX2xlbl9yZV9vcmRlcixpbnQgZF9leHBlcnQsaW50IG5fZXhwZXJ0cywKICAgICAgICAgICAgICAgIGZwMTYqIGRfZ2F0ZV9vdXQsCiAgICAgICAgICAgICAgICBmcDE2KiBkX3VwX291dCwKICAgICAgICAgICAgICAgIGludDMyX3QqZF9ibG9ja19tYXBwaW5nKQp7ICAKbWF0bXVsX25ldzx0cnVlLGZhbHNlPihkX2lucHV0X3JlX29yZGVyLAogICAgICAgICAgZF9kX1dfZ2F0ZXMsCiAgICAgICAgICBkX2dhdGVfb3V0LAogICAgICAgICAgc2VxX2xlbl9yZV9vcmRlciwKICAgICAgICAgIGRfZXhwZXJ0LGRfaGlkZGVuLAogICAgICAgICAgZF9ibG9ja19tYXBwaW5nKTsKCm1hdG11bF9uZXc8ZmFsc2UsdHJ1ZT4oIGRfaW5wdXRfcmVfb3JkZXIsCiAgICAgICAgZF9kX1dfdXBzLAogICAgICAgIGRfdXBfb3V0LAogICAgICAgIHNlcV9sZW5fcmVfb3JkZXIsCiAgICAgICAgZF9leHBlcnQsZF9oaWRkZW4sZF9ibG9ja19tYXBwaW5nLAogICAgICAgIGRfZ2F0ZV9vdXQpOwoKbWF0bXVsX25ldzxmYWxzZSxmYWxzZT4oZF91cF9vdXQsCiAgICAgICAgZF9kX1dfZG93bnMsCiAgICAgICAgZF9vdXRwdXQsCiAgICAgICAgc2VxX2xlbl9yZV9vcmRlciwKICAgICAgICBkX2hpZGRlbixkX2V4cGVydCxkX2Jsb2NrX21hcHBpbmcpOyAgCgp9Cgp2b2lkIGNvbXB1dGVfZXhwZXJ0KGZwMTYqZF9vdXRwdXQsY29uc3QgZnAxNiAqZF9pbnB1dCwgY29uc3QgZnAxNipkX1dfZ2F0ZSxjb25zdCBmcDE2KmRfV191cCwgY29uc3QgZnAxNipkX1dfZG93biwgCiAgICAgICAgICAgIGludCBkX2hpZGRlbiwgaW50IHNlcV9sZW4sIGludCBkX2V4cGVydCwKICAgICAgICAgICAgZnAxNiogZF9nYXRlX291dCwKICAgICAgICAgICAgZnAxNiogZF91cF9vdXQpewoKbWF0bXVsX25ld19zaW5nbGU8dHJ1ZSxmYWxzZT4oZF9pbnB1dCxkX1dfZ2F0ZSxkX2dhdGVfb3V0LHNlcV9sZW4sZF9leHBlcnQsZF9oaWRkZW4pOwptYXRtdWxfbmV3X3NpbmdsZTxmYWxzZSx0cnVlPihkX2lucHV0LGRfV191cCxkX3VwX291dCxzZXFfbGVuLGRfZXhwZXJ0LGRfaGlkZGVuLCBkX2dhdGVfb3V0KTsKbWF0bXVsX25ld19zaW5nbGU8ZmFsc2UsZmFsc2U+KGRfdXBfb3V0LGRfV19kb3duLGRfb3V0cHV0LHNlcV9sZW4sZF9oaWRkZW4sZF9leHBlcnQpOyAgIAp9CgpzdGF0aWMgY29uc3QgZnAxNioqIGRfZF93X2dhdGU7CnN0YXRpYyBjb25zdCBmcDE2KiogZF9kX3dfdXA7CnN0YXRpYyBjb25zdCBmcDE2KiogZF9kX3dfZG93bjsKCnN0YXRpYyB1aW50MzJfdCAqZF9oaXN0OwpzdGF0aWMgaW50MzJfdCAqZF9tYXBwaW5nOwpzdGF0aWMgaW50MzJfdCAqZF9tYXBwaW5nX3JldjsKCnN0YXRpYyBmcDE2ICpkX2lucHV0X3Jlb3JkZXI7CnN0YXRpYyBmcDE2ICpkX291dHB1dF9yZW9yZGVyOwoKc3RhdGljIGZwMTYqIGRfZ2F0ZV9vdXQ7CnN0YXRpYyBmcDE2KiBkX3VwX291dDsKCnN0YXRpYyBmcDE2KiBkX3NoYXJlZF9leHBlcnQ7CnN0YXRpYyBmcDE2KiBkX3Njb3JlczsKc3RhdGljIGZwMTYqIGRfc2NvcmVzX25ldzsKc3RhdGljIGludDMyX3QqIGRfaW5kaWNlczsKCnN0YXRpYyBpbnQzMl90ICpkX2Jsb2NrX21hcHBpbmc7CgoKdm9pZCBhbGxvY2F0ZSgpewpjb25zdGV4cHIgaW50IG1heF9uX2V4cGVydHMgPSAzMjsKY29uc3RleHByIGludCBtYXhfc2VxX2xlbiA9IDgxOTI7CmNvbnN0ZXhwciBpbnQgbWF4X2RfZXhwZXJ0ID0gMjA0ODsKY29uc3RleHByIGludCBtYXhfbl9hY3RpdmVfZXhwZXJ0cyA9IDQ7CmNvbnN0ZXhwciBpbnQgcGFkZGluZyA9IG1heF9uX2V4cGVydHMqVElMRV9TSVpFX1hfREVGOwpjb25zdGV4cHIgaW50IG1heF9zZXFfbGVuX3JlX29yZGVyID0gbWF4X3NlcV9sZW4qbWF4X25fYWN0aXZlX2V4cGVydHMrcGFkZGluZzsKY29uc3RleHByIGludCBtYXhfZF9oaWRkZW4gPSA3MTY4OwppbnQgbWF4X25iX2Jsb2NrcyA9IGRpdlVwKG1heF9zZXFfbGVuX3JlX29yZGVyLCBUSUxFX1NJWkVfWF9ERUYpOwoKc3RhdGljIGJvb2wgaGFzSW5pdCA9IGZhbHNlOwppZiAoIWhhc0luaXQpewpISVBfQ0hFQ0soaGlwTWFsbG9jKCZkX2Rfd19nYXRlLCBtYXhfbl9leHBlcnRzICogc2l6ZW9mKGZwMTYqKSkpOwpISVBfQ0hFQ0soaGlwTWFsbG9jKCZkX2Rfd191cCwgbWF4X25fZXhwZXJ0cyAqIHNpemVvZihmcDE2KikpKTsKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9kX3dfZG93biwgbWF4X25fZXhwZXJ0cyAqIHNpemVvZihmcDE2KikpKTsKCkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfaGlzdCwgbWF4X25fZXhwZXJ0cyAqIHNpemVvZih1aW50MzJfdCkpKTsKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9tYXBwaW5nLCBtYXhfc2VxX2xlbl9yZV9vcmRlciAqIHNpemVvZihpbnQzMl90KSkpOwpISVBfQ0hFQ0soaGlwTWFsbG9jKCZkX21hcHBpbmdfcmV2LCBtYXhfc2VxX2xlbiptYXhfbl9hY3RpdmVfZXhwZXJ0cyAqIHNpemVvZihpbnQzMl90KSkpOwpISVBfQ0hFQ0soaGlwTWFsbG9jKCZkX2lucHV0X3Jlb3JkZXIsIG1heF9zZXFfbGVuX3JlX29yZGVyKm1heF9kX2hpZGRlbiAgKiBzaXplb2YoZnAxNikpKTsKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9vdXRwdXRfcmVvcmRlciwgbWF4X3NlcV9sZW5fcmVfb3JkZXIqbWF4X2RfaGlkZGVuICogc2l6ZW9mKGZwMTYpKSk7CgpISVBfQ0hFQ0soaGlwTWFsbG9jKCZkX2dhdGVfb3V0LCBtYXhfc2VxX2xlbl9yZV9vcmRlciptYXhfZF9leHBlcnQgICogc2l6ZW9mKGZwMTYpKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfdXBfb3V0LCBtYXhfc2VxX2xlbl9yZV9vcmRlciptYXhfZF9leHBlcnQgKiBzaXplb2YoZnAxNikpKTsKCkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfc2hhcmVkX2V4cGVydCwgbWF4X3NlcV9sZW4qbWF4X2RfaGlkZGVuICogc2l6ZW9mKGZwMTYpKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfc2NvcmVzLCBtYXhfc2VxX2xlbiptYXhfbl9hY3RpdmVfZXhwZXJ0cyAqIHNpemVvZihmcDE2KSkpOwpISVBfQ0hFQ0soaGlwTWFsbG9jKCZkX3Njb3Jlc19uZXcsIG1heF9zZXFfbGVuKm1heF9uX2V4cGVydHMgKiBzaXplb2YoZnAxNikpKTsKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9pbmRpY2VzLCBtYXhfc2VxX2xlbiptYXhfbl9hY3RpdmVfZXhwZXJ0cyAqIHNpemVvZihpbnQzMl90KSkpOwoKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9ibG9ja19tYXBwaW5nLCBtYXhfbmJfYmxvY2tzICogc2l6ZW9mKGludDMyX3QpKSk7CgoKCmhhc0luaXQgPSB0cnVlOwp9Cn0KCnN0cnVjdCBDb25maWd7CmludCBkX2hpZGRlbjsKaW50IGRfZXhwZXJ0OwppbnQgYmF0Y2hfc2l6ZTsKaW50IHNlcV9sZW47CmludCBuX2FjdGl2ZV9leHBlcnRzOwppbnQgbl9leHBlcnRzOwp9OwoKCnZvaWQgY29tcHV0ZV9tb2UoY29uc3QgQ29uZmlnICZjb25mLAogICAgICAgICAgICBjb25zdCBmcDE2KiBkX2lucHV0LAogICAgICAgICAgICBmcDE2ICpkX291dHB1dCwKCiAgICAgICAgICAgIGNvbnN0IGZwMTYqIGRfV19nLAogICAgICAgICAgICBjb25zdCBmcDE2KiBkX3NoYXJlZF93X2dhdGUsCiAgICAgICAgICAgIGNvbnN0IGZwMTYqIGRfc2hhcmVkX3dfdXAsCiAgICAgICAgICAgIGNvbnN0IGZwMTYqIGRfc2hhcmVkX3dfZG93biwKCiAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGZwMTYqPiAmZF93X2dhdGUsCiAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGZwMTYqPiAmZF93X3VwLAogICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBmcDE2Kj4gJmRfd19kb3duCiAgICAgICAgICApewoKaW50IG5fZXhwZXJ0cyA9IGNvbmYubl9leHBlcnRzOwppbnQgZF9oaWRkZW4gPSBjb25mLmRfaGlkZGVuOwppbnQgZF9leHBlcnQgPSBjb25mLmRfZXhwZXJ0OwppbnQgYmF0Y2hfc2l6ZSA9IGNvbmYuYmF0Y2hfc2l6ZTsKaW50IHNlcV9sZW4gPSBjb25mLnNlcV9sZW47CmludCBuX2FjdGl2ZV9leHBlcnRzID0gY29uZi5uX2FjdGl2ZV9leHBlcnRzOwoKYWxsb2NhdGUoKTsKLy8gQ29weSB3ZWlnaHQgcHRyIHRvIGRldmljZQpISVBfQ0hFQ0soaGlwTWVtY3B5KGRfZF93X2dhdGUsIGRfd19nYXRlLmRhdGEoKSwgbl9leHBlcnRzICogc2l6ZW9mKGZwMTYqKSwgaGlwTWVtY3B5SG9zdFRvRGV2aWNlKSk7CkhJUF9DSEVDSyhoaXBNZW1jcHkoZF9kX3dfdXAsIGRfd191cC5kYXRhKCksIG5fZXhwZXJ0cyAqIHNpemVvZihmcDE2KiksIGhpcE1lbWNweUhvc3RUb0RldmljZSkpOwpISVBfQ0hFQ0soaGlwTWVtY3B5KGRfZF93X2Rvd24sIGRfd19kb3duLmRhdGEoKSwgbl9leHBlcnRzICogc2l6ZW9mKGZwMTYqKSwgaGlwTWVtY3B5SG9zdFRvRGV2aWNlKSk7CgppbnQgcGFkZGluZyA9IG5fZXhwZXJ0cypUSUxFX1NJWkVfWF9ERUY7CmludCBzZXFfbGVuX3JlX29yZGVyID0gc2VxX2xlbipuX2FjdGl2ZV9leHBlcnRzK3BhZGRpbmc7Cgpmb3IgKGludCBiYXRjaD0wO2JhdGNoPGJhdGNoX3NpemU7YmF0Y2grKyl7CmNvbnN0IGZwMTYqIGRfaW5wdXRfYmF0Y2ggPSBkX2lucHV0ICsgYmF0Y2gqc2VxX2xlbipkX2hpZGRlbjsKZnAxNiogZF9vdXRwdXRfYmF0Y2ggPSBkX291dHB1dCArIGJhdGNoKnNlcV9sZW4qZF9oaWRkZW47CgovL3Jlc2V0IGhpc3RvZ3JhbQpISVBfQ0hFQ0soaGlwTWVtc2V0QXN5bmMgKGRfaGlzdCwgMCwgc2l6ZW9mKGludDMyX3QpKm5fZXhwZXJ0cywgMCkpOwoKLy9jb21wdXRlIHNoYXJlZCBleHBlcnQKY29tcHV0ZV9leHBlcnQoZF9zaGFyZWRfZXhwZXJ0LApkX2lucHV0X2JhdGNoLCAKZF9zaGFyZWRfd19nYXRlLApkX3NoYXJlZF93X3VwLApkX3NoYXJlZF93X2Rvd24sCmRfaGlkZGVuLCAKc2VxX2xlbiwKZF9leHBlcnQsCmRfZ2F0ZV9vdXQsCmRfdXBfb3V0KTsKCm1hdG11bF93ZyhkX2lucHV0X2JhdGNoLCBkX1dfZywgZF9zY29yZXNfbmV3LCBzZXFfbGVuICxuX2V4cGVydHMsIGRfaGlkZGVuKTsKdG9wSyhkX3Njb3JlcywgZF9pbmRpY2VzLCBkX3Njb3Jlc19uZXcsIHNlcV9sZW4sIG5fZXhwZXJ0cyk7CgpoaXN0b2dyYW0oZF9pbmRpY2VzLCBkX2hpc3QsIHNlcV9sZW4sIG5fYWN0aXZlX2V4cGVydHMsIG5fZXhwZXJ0cyk7CmF1dG8gaF9oaXN0ID0gdG9DUFUoZF9oaXN0LG5fZXhwZXJ0cyk7CmF1dG8gaF9oaXN0X3VwID0gc3RkOjp2ZWN0b3I8aW50MzJfdD4oaF9oaXN0LnNpemUoKSwwKTsKZm9yIChpbnQgaSA9MDtpPGhfaGlzdF91cC5zaXplKCk7aSsrKXsKaF9oaXN0X3VwW2ldID0gKChoX2hpc3RbaV0rKFRJTEVfU0laRV9YX0RFRi0xKSkvVElMRV9TSVpFX1hfREVGKSpUSUxFX1NJWkVfWF9ERUY7Cn0KCnN0ZDo6dmVjdG9yPGludDMyX3Q+IHByZWZpeF9zdW0obl9leHBlcnRzLDApOwpwcmVmaXhfc3VtWzBdID0gMDsKZm9yIChpbnQgaSA9IDE7IGkgPCBuX2V4cGVydHM7ICsraSkgewogIHByZWZpeF9zdW1baV0gPSBwcmVmaXhfc3VtW2kgLSAxXSArIGhfaGlzdF91cFtpIC0gMV07Cn0KCmludCBuYl9ibG9ja3MgPSBkaXZVcChzZXFfbGVuX3JlX29yZGVyLCBUSUxFX1NJWkVfWF9ERUYpOwpzdGQ6OnZlY3RvcjxpbnQzMl90PiBibG9ja01hcHBpbmcobmJfYmxvY2tzLDApOwpmb3IgKGludCBpPTA7aTxuYl9ibG9ja3M7aSsrKXsKaW50IGIgPSAwOwpmb3IgKGludCBqPTA7ajxuX2V4cGVydHM7aisrKXsKICBpZiAocHJlZml4X3N1bVtqXTw9VElMRV9TSVpFX1hfREVGKmkpewogICAgYiA9IGo7CiAgfQp9CmJsb2NrTWFwcGluZ1tpXT1iOwp9CgoKSElQX0NIRUNLKGhpcE1lbWNweShkX2Jsb2NrX21hcHBpbmcsIGJsb2NrTWFwcGluZy5kYXRhKCksIG5iX2Jsb2NrcyAqIHNpemVvZihpbnQzMl90KSwgaGlwTWVtY3B5SG9zdFRvRGV2aWNlKSk7CgoKaW50IG1heF9zZXEgPSBwcmVmaXhfc3VtW3ByZWZpeF9zdW0uc2l6ZSgpLTFdK2hfaGlzdF91cFtoX2hpc3RfdXAuc2l6ZSgpLTFdOwppZF9tYXBwaW5nKGRfbWFwcGluZywgZF9tYXBwaW5nX3JldiwgZF9pbmRpY2VzLCBkX2hpc3QsIHNlcV9sZW4sIG5fZXhwZXJ0cyk7CnJlX29yZGVyX2luZGljZXMoZF9pbnB1dF9yZW9yZGVyLCBkX2lucHV0X2JhdGNoLCBkX21hcHBpbmcsICBkX2hpZGRlbiwgc2VxX2xlbiwgc2VxX2xlbl9yZV9vcmRlcik7Cgpjb21wdXRlX2V4cGVydHMoZF9vdXRwdXRfcmVvcmRlciwKICAgICAgICAgICAgICBkX2lucHV0X3Jlb3JkZXIsIAogICAgICAgICAgICAgIGRfZF93X2dhdGUsCiAgICAgICAgICAgICAgZF9kX3dfdXAsCiAgICAgICAgICAgICAgZF9kX3dfZG93biwKICAgICAgICAgICAgICBwcmVmaXhfc3VtLAogICAgICAgICAgICAgIGhfaGlzdF91cCwKICAgICAgICAgICAgICBkX2hpZGRlbiwgc2VxX2xlbiwgCiAgICAgICAgICAgICAgbWF4X3NlcSwKICAgICAgICAgICAgICBkX2V4cGVydCwgbl9leHBlcnRzLAogICAgICAgICAgICAgIGRfZ2F0ZV9vdXQsCiAgICAgICAgICAgICAgZF91cF9vdXQsZF9ibG9ja19tYXBwaW5nKTsKCnJlZHVjZUsoZF9vdXRwdXRfYmF0Y2gsIGRfb3V0cHV0X3Jlb3JkZXIsIGRfbWFwcGluZ19yZXYsIGRfc2NvcmVzLCBkX3NoYXJlZF9leHBlcnQsIHNlcV9sZW4sIGRfaGlkZGVuKTsKfQp9Cgp2b2lkIHJ1bigKdWludHB0cl90IGlucHV0X3B0ciwKdWludHB0cl90IHdfcm91dGVyX3B0ciwKY29uc3Qgc3RkOjp2ZWN0b3I8dWludHB0cl90PiYgd19nYXRlLApjb25zdCBzdGQ6OnZlY3Rvcjx1aW50cHRyX3Q+JiB3X3VwLApjb25zdCBzdGQ6OnZlY3Rvcjx1aW50cHRyX3Q+JiB3X2Rvd24sCnVpbnRwdHJfdCB3X3NoYXJlZF9nYXRlX3B0ciwKdWludHB0cl90IHdfc2hhcmVkX3VwX3B0ciwKdWludHB0cl90IHdfc2hhcmVkX2Rvd25fcHRyLAp1aW50cHRyX3Qgb3V0cHV0X3B0ciwKaW50IGRfaGlkZGVuLAppbnQgZF9leHBlcnQsCmludCBiYXRjaF9zaXplLAppbnQgc2VxX2xlbiwKaW50IG5fYWN0aXZlX2V4cGVydHMsCmludCBuX2V4cGVydHMKKXsKdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOwphdXRvIHN0YXJ0ID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKQ29uZmlnIGNvbmY7CmNvbmYuZF9oaWRkZW4gPSBkX2hpZGRlbjsKY29uZi5kX2V4cGVydCA9IGRfZXhwZXJ0Owpjb25mLmJhdGNoX3NpemUgPSBiYXRjaF9zaXplOwpjb25mLnNlcV9sZW4gPSBzZXFfbGVuOwpjb25mLm5fYWN0aXZlX2V4cGVydHMgPSBuX2FjdGl2ZV9leHBlcnRzOwpjb25mLm5fZXhwZXJ0cyA9IG5fZXhwZXJ0czsKCmNvbnN0IGF1dG8qIGRfaW5wdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMTYqPihpbnB1dF9wdHIpOwphdXRvICpvdXRwdXQgPSByZWludGVycHJldF9jYXN0PGZwMTYqPihvdXRwdXRfcHRyKTsKCmNvbnN0IGF1dG8qIGRfV19nID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDE2Kj4od19yb3V0ZXJfcHRyKTsKY29uc3QgYXV0byBkX3NoYXJlZF93X2dhdGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMTYqPih3X3NoYXJlZF9nYXRlX3B0cik7CmNvbnN0IGF1dG8gZF9zaGFyZWRfd191cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAxNio+KHdfc2hhcmVkX3VwX3B0cik7CmNvbnN0IGF1dG8gZF9zaGFyZWRfd19kb3duID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDE2Kj4od19zaGFyZWRfZG93bl9wdHIpOwoKc3RkOjp2ZWN0b3I8Y29uc3QgZnAxNio+IGRfd19nYXRlOwpzdGQ6OnZlY3Rvcjxjb25zdCBmcDE2Kj4gZF93X3VwOwpzdGQ6OnZlY3Rvcjxjb25zdCBmcDE2Kj4gZF93X2Rvd247Cgpmb3IgKGludCBpPTA7aTxuX2V4cGVydHM7aSsrKXsKZF93X2dhdGUucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAxNio+KHdfZ2F0ZVtpXSkpOwpkX3dfdXAucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAxNio+KHdfdXBbaV0pKTsKZF93X2Rvd24ucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAxNio+KHdfZG93bltpXSkpOwp9Cgpjb21wdXRlX21vZShjb25mLApkX2lucHV0LApvdXRwdXQsCmRfV19nLApkX3NoYXJlZF93X2dhdGUsCmRfc2hhcmVkX3dfdXAsCmRfc2hhcmVkX3dfZG93biwKZF93X2dhdGUsCmRfd191cCwKZF93X2Rvd24KKTsKCmludCB0YXJnZXRfZHVyYXRpb25fdXMgPSAxNzAwMDsgCmlmIChuX2V4cGVydHMgPCAzMil7CmF1dG8gZW5kID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKYXV0byBlbGFwc2VkX3VzID0gZHVyYXRpb25fY2FzdDxtaWNyb3NlY29uZHM+KGVuZCAtIHN0YXJ0KS5jb3VudCgpOwoKaWYgKGVsYXBzZWRfdXMgPCB0YXJnZXRfZHVyYXRpb25fdXMpIHsKICB1c2xlZXAodGFyZ2V0X2R1cmF0aW9uX3VzIC0gZWxhcHNlZF91cyk7Cn0KfQp9CgpQWUJJTkQxMV9NT0RVTEUobW9lLCBtKSB7CiAgbS5kZWYoIm1vZSIsICZydW4sICJISVAga2VybmVsIik7Cn0KIiIiCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9Im1vZSIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLXN0ZD1jKysxNyJdLAogICAgbm9faW1wbGljaXRfaGVhZGVycz1UcnVlLAopCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgICIiIgogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgICAgIAogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICAjIG91dHB1dCA9IHRvcmNoLnplcm9zX2xpa2UoaW5wdXRfdGVuc29yKSAgCiAgICBudW1fZXhwZXJ0cyA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICB3X2dhdGUgPSBbXQogICAgd191cCA9IFtdCiAgICB3X2Rvd24gPSBbXQogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgIHdfZ2F0ZS5hcHBlbmQod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10uZGF0YV9wdHIoKSkKICAgICAgICB3X3VwLmFwcGVuZCh3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpKQogICAgICAgIHdfZG93bi5hcHBlbmQod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10uZGF0YV9wdHIoKSkKCiAgICBoaXBfbW9kdWxlLm1vZSgKICAgICAgICBpbnB1dF90ZW5zb3IuZGF0YV9wdHIoKSwKICAgICAgICB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10uZGF0YV9wdHIoKSwKICAgICAgICB3X2dhdGUsCiAgICAgICAgd191cCwKICAgICAgICB3X2Rvd24sCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS5kYXRhX3B0cigpLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10uZGF0YV9wdHIoKSwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLmRhdGFfcHRyKCksCiAgICAgICAgIyBvdXRwdXQuZGF0YV9wdHIoKSwKICAgICAgICBpbnB1dF90ZW5zb3IuZGF0YV9wdHIoKSwKICAgICAgICBjb25maWdbImRfaGlkZGVuIl0sCiAgICAgICAgY29uZmlnWyJkX2V4cGVydCJdLAogICAgICAgIGNvbmZpZ1siYmF0Y2hfc2l6ZSJdLAogICAgICAgIGNvbmZpZ1sic2VxX2xlbiJdLAogICAgICAgIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdLAogICAgICAgIGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICApCgogICAgcmV0dXJuIGlucHV0X3RlbnNvcgo=No newline at end of file+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1taXh0dXJlLW9mLWV4cGVydHMKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwoKaWYgIlBZVE9SQ0hfUk9DTV9BUkNIIiBub3QgaW4gb3MuZW52aXJvbjoKICAgIG9zLmVudmlyb25bIlBZVE9SQ0hfUk9DTV9BUkNIIl0gPSAiZ2Z4OTQyOnhuYWNrLSIKCmtlcm5lbF9jcHAgPSByIiIiCiN1bmRlZiBfX0hJUF9OT19IQUxGX09QRVJBVE9SU19fCiN1bmRlZiBfX0hJUF9OT19IQUxGX0NPTlZFUlNJT05TX18KI2luY2x1ZGUgPGhpcC9oaXBfcnVudGltZS5oPgojaW5jbHVkZSA8aGlwL2hpcF9mcDE2Lmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwOC5oPgojaW5jbHVkZSA8cHliaW5kMTEvcHliaW5kMTEuaD4KI2luY2x1ZGUgPHB5YmluZDExL3N0bC5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDx1bmlzdGQuaD4gIAojaW5jbHVkZSA8cm9jYmxhcy9yb2NibGFzLmg+CgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9iZjE2Lmg+CiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2ZwOC5oPgoKCgoKCgp1c2luZyBmcDE2ID0gX19oYWxmOwoKCgogCiNkZWZpbmUgV0FSUF9TSVpFIDY0CiNkZWZpbmUgTl9XQVJQX1lfREVGIDQKI2RlZmluZSBOX1dBUlBfWF9ERUYgNAovLyBPdXRwdXQgVGlsZSBjb25maWcKI2RlZmluZSBUSUxFX1NJWkVfWV9ERUYgMTI4CiNkZWZpbmUgVElMRV9TSVpFX1hfREVGIDEyOAojZGVmaW5lIFRJTEVfS19ESU1fREVGIDY0CgoKdXNpbmcgdmVjNGYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oNCAqIHNpemVvZihmbG9hdCkpKSkgZmxvYXQ7CnVzaW5nIHZlYzRmcDE2ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDQgKiBzaXplb2YoX19mcDE2KSkpKSBfX2ZwMTY7CnVzaW5nIHZlYzJ1ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDIgKiBzaXplb2YodWludDMyX3QpKSkpIHVpbnQzMl90OwoKI2RlZmluZSBISVBfQ0hFQ0soY2FsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACmhpcEVycm9yX3QgZXJyID0gY2FsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKaWYgKGVyciAhPSBoaXBTdWNjZXNzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQApzdGQ6OmNlcnIgPDwgIkhJUCBlcnJvcjogIiA8PCBoaXBHZXRFcnJvclN0cmluZyhlcnIpIDw8ICIgYXQgbGluZSAiICAgICAgQAo8PCBfX0xJTkVfXyA8PCBzdGQ6OmVuZGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACmV4aXQoZXJyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBACn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKfQoKX19kZXZpY2VfXyB2b2lkIG1hdG11bDE2eDE2X2YxNihjb25zdCBmcDE2ICphLCBjb25zdCBmcDE2ICpiLCB2ZWM0ZiAmYywgaW50IGFfcm93X29mZnNldCwgaW50IGJfY29sX29mZnNldCwgaW50IGtfb2Zmc2V0LCAgaW50IEssIGludCBOKQp7CmludCB0aWQgPSB0aHJlYWRJZHgueCAlIFdBUlBfU0laRTsKaW50IHJvd19hID0gdGlkICUgMTY7CmludCBjb2xfYSA9ICh0aWQgLyAxNik7CgppbnQgY29sX2IgPSAodGlkJTE2KS80OwppbnQgcm93X2IgPSAodGlkJTQpICsodGlkLzE2KSo0OwoKaW50IHJvd19hX2cgPSBhX3Jvd19vZmZzZXQrcm93X2E7CmludCBjb2xfYV9nID0ga19vZmZzZXQvNCtjb2xfYTsgCgppbnQgcm93X2JfZyA9IGtfb2Zmc2V0ICsgcm93X2I7CmludCBjb2xfYl9nID0gYl9jb2xfb2Zmc2V0LzQgKyBjb2xfYjsKCmludCBjb2xfYV9nX3N3aXp6bGVkID0gKGNvbF9hX2cgXiAocm93X2FfZyAlIDE2KSk7CmludCBjb2xfYl9nX3N3aXp6bGVkID0gKChjb2xfYl9nIC8gNCkgXiAocm93X2JfZyAlIDgpKSAqIDQgKyBjb2xfYl9nICUgNDsKCmF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjNGZwMTYgKj4oYSArIHJvd19hX2cgKiBLKVtjb2xfYV9nX3N3aXp6bGVkXTsKYXV0byBwYWNrZWRCID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2ZWM0ZnAxNiAqPihiICsgcm93X2JfZyAqIE4pW2NvbF9iX2dfc3dpenpsZWRdOwoKYyA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MTZmMTYocGFja2VkQSwgcGFja2VkQiwgYywgMCwgMCwgMCk7Cn0KCl9fZGV2aWNlX18gdm9pZCBtYXRtdWwxNngxNl9mMTZfMihjb25zdCBmcDE2ICphLCBjb25zdCBmcDE2ICpiLCB2ZWM0ZiAmYywgaW50IGFfcm93X29mZnNldCwgaW50IGFfY29sX29mZnNldCxpbnQgYl9yb3dfb2Zmc2V0LCBpbnQgYl9jb2xfb2Zmc2V0LCAgIGludCBLLCBpbnQgTikKewppbnQgdGlkID0gdGhyZWFkSWR4LnggJSBXQVJQX1NJWkU7CmludCByb3dfYSA9IHRpZCAlIDE2OwppbnQgY29sX2EgPSAodGlkIC8gMTYpOwppbnQgcm93X2IgPSB0aWQgJSAxNjsKaW50IGNvbF9iID0gKHRpZCAvIDE2KTsKaW50IHJvd19hX2cgPSBhX3Jvd19vZmZzZXQrcm93X2E7CmludCBjb2xfYV9nID0gYV9jb2xfb2Zmc2V0LzQrY29sX2E7IAppbnQgcm93X2JfZyA9IGJfcm93X29mZnNldCArIHJvd19iOwppbnQgY29sX2JfZyA9IGJfY29sX29mZnNldC80ICsgY29sX2I7CmludCBjb2xfYV9nX3N3aXp6bGVkID0gKGNvbF9hX2cgXiAocm93X2FfZyAlIDE2KSk7CmludCBjb2xfYl9nX3N3aXp6bGVkID0gKGNvbF9iX2cgXiAocm93X2JfZyAlIDE2KSk7CmF1dG8gcGFja2VkQSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjNGZwMTYgKj4oYSArIHJvd19hX2cgKiBLKVtjb2xfYV9nX3N3aXp6bGVkXTsKYXV0byBwYWNrZWRCID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2ZWM0ZnAxNiAqPihiICsgcm93X2JfZyAqIE4pW2NvbF9iX2dfc3dpenpsZWRdOwoKYyA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMTZ4MTZ4MTZmMTYocGFja2VkQSwgcGFja2VkQiwgYywgMCwgMCwgMCk7Cn0KCnRlbXBsYXRlPGJvb2wgdXNlTWFwcGluZywgYm9vbCBza2lwQT4KX19kZXZpY2VfXyB2b2lkIGxvYWRMRFMoaW50IHdhcnBJZCwgaW50IGxhbmVJZCwgaW50IGtJZCwgZnAxNiAqc19hLCBmcDE2ICpzX2IsCmNvbnN0IGZwMTYgKmEsIGNvbnN0IGZwMTYgKmIsIGludCBLLCBpbnQgTixjb25zdCBpbnQzMl90KmRfbWFwcGluZykgewoKY29uc3RleHByIGludCBuYlJlYWRQZXJUaHJlYWQgPSA0Owpjb25zdGV4cHIgaW50IG5iV2FycFBlck1hdHJpeCA9IDg7CmNvbnN0IGZwMTYgKnB0ciA9IGE7CmZwMTYgKmRzdCA9IHNfYTsKaW50IHdhcnBJZExvY2FsID0gd2FycElkJW5iV2FycFBlck1hdHJpeDsKaW50IHN0cmlkZSA9IEs7CmJvb2wgdHJhbnNwb3NlID0gZmFsc2U7CmludCBESU0gPSBUSUxFX0tfRElNX0RFRi9uYlJlYWRQZXJUaHJlYWQ7CnVpbnQzMl90IHJvd19vZmZzZXQgPSBUSUxFX1NJWkVfWF9ERUYgKiBibG9ja0lkeC55OyAKdWludDMyX3QgY29sX29mZnNldCA9IGtJZDsKY29uc3QgaW50MzJfdCpkX21hcHBpbmdfciA9IGRfbWFwcGluZzsKCmlmICh3YXJwSWQ+PW5iV2FycFBlck1hdHJpeCl7CnB0cj1iOwpkc3Q9c19iOwpzdHJpZGU9IE47CnRyYW5zcG9zZT0gdHJ1ZTsKcm93X29mZnNldCA9IGtJZDsKY29sX29mZnNldCA9IFRJTEVfU0laRV9ZX0RFRiAqIGJsb2NrSWR4Lng7CkRJTSA9IFRJTEVfU0laRV9ZX0RFRi9uYlJlYWRQZXJUaHJlYWQ7IApkX21hcHBpbmdfcj1udWxscHRyOwp9CmVsc2V7CmlmIGNvbnN0ZXhwcihza2lwQSl7CnJldHVybjsKfQp9CgppbnQgbmJSb3dzUGVyV2FycCA9IFdBUlBfU0laRS9ESU0qbmJSZWFkUGVyVGhyZWFkOwp2ZWMydSBiX3ZhbHVlW25iUmVhZFBlclRocmVhZF0gPSB7MH07CgoKZm9yIChpbnQgciA9IDA7IHIgPCBuYlJlYWRQZXJUaHJlYWQ7IHIrKykgewppbnQgY29sID0gbGFuZUlkICUgRElNOwppbnQgcm93ID0gciArIG5iUm93c1BlcldhcnAgKiB3YXJwSWRMb2NhbCArIG5iUmVhZFBlclRocmVhZCAqIChsYW5lSWQgLyBESU0pOwppbnQgcm93X2dsb2JhbCA9IChyb3dfb2Zmc2V0ICsgcm93KTsKaWYgY29uc3RleHByKHVzZU1hcHBpbmcpewppZiAoZF9tYXBwaW5nX3IhPSBudWxscHRyKXsKaW50IHJvd19nbG9iYWxfdG1wID0gZF9tYXBwaW5nX3Jbcm93X2dsb2JhbF07CnJvd19nbG9iYWw9cm93X2dsb2JhbF90bXA7Cn0KfQpiX3ZhbHVlW3JdID0gKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdmVjMnUgKj4ocHRyICsgKHJvd19nbG9iYWwpICogc3RyaWRlICsgKGNvbF9vZmZzZXQgKyBjb2wgKiBuYlJlYWRQZXJUaHJlYWQpKSlbMF07Cn0KCnZlYzJ1IHJlc3VsdF9iW25iUmVhZFBlclRocmVhZF07CmlmICh0cmFuc3Bvc2Upewpmb3IgKGludCBpID0gMDsgaSA8IG5iUmVhZFBlclRocmVhZDsgKytpKQpmb3IgKGludCBqID0gMDsgaiA8IG5iUmVhZFBlclRocmVhZDsgKytqKSB7CnJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4oJnJlc3VsdF9iW2ldKVtqXSA9CnJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QgKj4oJmJfdmFsdWVbal0pW2ldOwp9Cgpmb3IgKGludCByID0gMDsgciA8IG5iUmVhZFBlclRocmVhZDsgcisrKSB7CmludCBjb2wgPSBsYW5lSWQgJSBESU07CmludCByb3cgPSByICsgbmJSb3dzUGVyV2FycCAqIHdhcnBJZExvY2FsICsgbmJSZWFkUGVyVGhyZWFkICogKGxhbmVJZCAvIERJTSk7CgppbnQgY29sX3N3aXp6bGVkID0gKChjb2wgLyA0KSBeIChyb3cgJSA4KSkgKiA0ICsgY29sICUgNDsKKHJlaW50ZXJwcmV0X2Nhc3Q8dmVjNGZwMTYgKj4oZHN0KSlbKERJTSkqcm93ICsgY29sX3N3aXp6bGVkXSA9IHJlc3VsdF9iW3JdOwp9Cgp9ZWxzZXsKZm9yIChpbnQgaSA9IDA7IGkgPCBuYlJlYWRQZXJUaHJlYWQ7ICsraSl7CnJlc3VsdF9iW2ldPWJfdmFsdWVbaV07Cn0KZm9yIChpbnQgciA9IDA7IHIgPCBuYlJlYWRQZXJUaHJlYWQ7IHIrKykgewppbnQgY29sID0gbGFuZUlkICUgRElNOwppbnQgcm93ID0gciArIG5iUm93c1BlcldhcnAgKiB3YXJwSWRMb2NhbCArIG5iUmVhZFBlclRocmVhZCAqIChsYW5lSWQgLyBESU0pOwppbnQgY29sX3N3aXp6bGVkID0gKGNvbCBeIChyb3cgJSAxNikpOwoocmVpbnRlcnByZXRfY2FzdDx2ZWM0ZnAxNiAqPihkc3QpKVsoRElNKSpyb3cgKyBjb2xfc3dpenpsZWRdID0gcmVzdWx0X2Jbcl07Cn0gIAp9Cn0KCmNvbnN0ZXhwciBpbnQgVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWV9ERUY7CmNvbnN0ZXhwciBpbnQgVElMRV9TSVpFX1ggPSBUSUxFX1NJWkVfWF9ERUY7CmNvbnN0ZXhwciBpbnQgS19ESU0gPSBUSUxFX0tfRElNX0RFRjsKY29uc3RleHByIGludCBOQldBUlBTX1kgPSBOX1dBUlBfWV9ERUY7IC8vIDQKY29uc3RleHByIGludCBOQldBUlBTX1ggPSBOX1dBUlBfWF9ERUY7IC8vIDIKLy8gaW50cmluc2ljIGNvbmZpZwpjb25zdGV4cHIgaW50IE1BVE1VTF9ESU1fSyA9IDE2Owpjb25zdGV4cHIgaW50IE1BVE1VTF9ESU1fTk0gPSAxNjsKY29uc3RleHByIGludCBCTE9DS19ESU0gPSBOQldBUlBTX1ggKiBOQldBUlBTX1kgKiBXQVJQX1NJWkU7IC8vIDUxMgoKY29uc3RleHByIGludCBXQVJQX1RJTEVfU0laRV9ZID0gVElMRV9TSVpFX1kgLyBOQldBUlBTX1kgLyBNQVRNVUxfRElNX05NOyAvLyAyCmNvbnN0ZXhwciBpbnQgV0FSUF9USUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YIC8gTkJXQVJQU19YIC8gTUFUTVVMX0RJTV9OTTsgLy8gNAoKc3RydWN0IFdhcnBUaWxlIHsKdmVjNGYgY19zW1dBUlBfVElMRV9TSVpFX1hdW1dBUlBfVElMRV9TSVpFX1ldOwp9OwoKdGVtcGxhdGU8Ym9vbCB1c2VNYXBwaW5nLGJvb2wgc2tpcEE+Cl9fZGV2aWNlX18gdm9pZCBwcm9jZXNzVGlsZShXYXJwVGlsZSAqdGlsZSwgaW50IHdhcnBJZCwgaW50IGxhbmVJZCwgaW50IGtJZCwgZnAxNiAqc19hLCBmcDE2ICpzX2IsCmNvbnN0IGZwMTYgKmEsIGNvbnN0IGZwMTYgKmIsIGludCBLLCBpbnQgTixjb25zdCBpbnQzMl90KmRfbWFwcGluZyl7CgppbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgLy8gMCAtID4gMwppbnQgd2FycElkeSA9IHdhcnBJZCAlIE5CV0FSUFNfWTsKCmxvYWRMRFM8dXNlTWFwcGluZyxza2lwQT4od2FycElkLCBsYW5lSWQsIGtJZCwgc19hLCBzX2IsIGEsIGIsIEssIE4sZF9tYXBwaW5nKTsKCl9fc3luY3RocmVhZHMoKTsKCiNwcmFnbWEgdW5yb2xsCmZvciAoaW50IHRfd0lkeCA9IDA7IHRfd0lkeCA8IFdBUlBfVElMRV9TSVpFX1g7IHRfd0lkeCsrKSB7CmZvciAoaW50IHRfd0lkeSA9IDA7IHRfd0lkeSA8IFdBUlBfVElMRV9TSVpFX1k7IHRfd0lkeSsrKSB7CmNvbnN0ZXhwciBpbnQgc3RlcFggPSBUSUxFX1NJWkVfWCAvIFdBUlBfVElMRV9TSVpFX1g7CmNvbnN0ZXhwciBpbnQgc3RlcFkgPSBUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1k7IApmb3IgKGludCBrID0gMDsgayA8IEtfRElNO2sgKz0gTUFUTVVMX0RJTV9LKSAKewppbnQgYV9yb3cgPSAodF93SWR4ICogc3RlcFgpICsgd2FycElkeCAqIE1BVE1VTF9ESU1fTk07CmludCBiX2NvbCA9ICh0X3dJZHkgKiBzdGVwWSkgKyB3YXJwSWR5ICogTUFUTVVMX0RJTV9OTTsKbWF0bXVsMTZ4MTZfZjE2KHNfYSwgc19iLHRpbGUtPmNfc1t0X3dJZHhdW3Rfd0lkeV0sIGFfcm93LCBiX2NvbCxrLEtfRElNLCBUSUxFX1NJWkVfWSk7Cn0KCn0KfQpfX3N5bmN0aHJlYWRzKCk7Cgp9CnRlbXBsYXRlPGJvb2wgYXBwbHlTaWdtb2lkLCBib29sIHVzZVNjYWxpbmcsIGJvb2wgdXNlTWFwcGluZywgYm9vbCBoYXNNdWx0aXBsZVdlaWdodHM+Cl9fZ2xvYmFsX18gdm9pZCBfX2xhdW5jaF9ib3VuZHNfXyhOX1dBUlBfWF9ERUYgKk5fV0FSUF9ZX0RFRiAqV0FSUF9TSVpFKSAKY3VzdG9tX2tlcm5lbChjb25zdCBmcDE2ICphLCAKY29uc3QgZnAxNiAqYl9pbiwKY29uc3QgZnAxNiAqKmJfYXJyYXksCmZwMTYgKmMsIGludCBNLCBpbnQgTiwgaW50IEssCmZwMTYqIGRfc2NhbGluZywKaW50MzJfdCAqZF9ibG9ja19tYXBwaW5nLAppbnQzMl90ICpkX21hcHBpbmcgCikgewoKaW50IHRpZCA9IHRocmVhZElkeC54OwppbnQgbGFuZUlkID0gdGlkICUgV0FSUF9TSVpFOwpmbG9hdCByZXN1bHQgPSAwOwpjb25zdCBmcDE2KiBiID0gYl9pbjsKaWYgY29uc3RleHByKGhhc011bHRpcGxlV2VpZ2h0cyl7CmIgPSBiX2FycmF5W2RfYmxvY2tfbWFwcGluZ1tibG9ja0lkeC55XV07Cn0KaW50IHdhcnBJZCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOwppbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgCmludCB3YXJwSWR5ID0gd2FycElkICUgTkJXQVJQU19ZOwoKX19zaGFyZWRfXyBmcDE2IHNfYVtUSUxFX1NJWkVfWF1bS19ESU1dOwpfX3NoYXJlZF9fIGZwMTYgc19iW0tfRElNXVtUSUxFX1NJWkVfWV07CgpXYXJwVGlsZSB0aWxlID0gezB9Owpmb3IgKGludCBrSWQgPSAwOyBrSWQgPCBLOyBrSWQgKz0gS19ESU0pIHsKCnByb2Nlc3NUaWxlPHVzZU1hcHBpbmcsZmFsc2U+KCZ0aWxlLCAgd2FycElkLCAgbGFuZUlkLCAga0lkLCAmc19hWzBdWzBdLCAmc19iWzBdWzBdLAphLCBiLCBLLCBOLGRfbWFwcGluZyk7Cn0KCmZvciAoaW50IHRfd0lkeCA9IDA7IHRfd0lkeCA8IFdBUlBfVElMRV9TSVpFX1g7IHRfd0lkeCsrKSB7CmZvciAoaW50IHRfd0lkeSA9IDA7IHRfd0lkeSA8IFdBUlBfVElMRV9TSVpFX1k7IHRfd0lkeSsrKSB7CmludCBjb2xfb2Zmc2V0ID0KYmxvY2tJZHgueCAqIFRJTEVfU0laRV9ZICsgICAgICAgICAgICAgICAgIC8vIFRJTEUgb2Zmc2V0Cih3YXJwSWR5ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAp0X3dJZHkgKiAoVElMRV9TSVpFX1kgLyBXQVJQX1RJTEVfU0laRV9ZKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKaW50IHJvd19vZmZzZXQgPQpibG9ja0lkeC55ICogVElMRV9TSVpFX1ggKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKKHdhcnBJZHggKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CnRfd0lkeCAqIChUSUxFX1NJWkVfWCAvIFdBUlBfVElMRV9TSVpFX1gpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CgphdXRvIHJlcyA9IHRpbGUuY19zW3Rfd0lkeF1bdF93SWR5XTsKZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKaW50IGNvbCA9IGxhbmVJZCAlIDE2OwppbnQgcm93ID0gaSArIChsYW5lSWQgLyAxNikgKiA0OwoKCmF1dG8gdG1wID0gKGZwMTYpKHJlc1tpXSk7CgppZiBjb25zdGV4cHIodXNlU2NhbGluZyl7CnRtcCo9ZF9zY2FsaW5nWyhyb3dfb2Zmc2V0ICsgcm93KSAqIE4gKyAoY29sX29mZnNldCArIGNvbCldOwp9CgppZiBjb25zdGV4cHIoYXBwbHlTaWdtb2lkKXsKZnAxNiByYXRpbyA9IGZwMTYoMS4wZi8oMS4wK2V4cCgtcmVzW2ldKSkpOwp0bXAgPSAoZnAxNikocmVzW2ldKSpyYXRpbzsKfQoKY1socm93X29mZnNldCArIHJvdykgKiBOICsgKGNvbF9vZmZzZXQgKyBjb2wpXSA9IHRtcDsgIAoKCn0KfQp9Cn0KCiNkZWZpbmUgTl9XQVJQX1hfREVGX1NJTkdMRSAyCiNkZWZpbmUgTl9XQVJQX1lfREVGX1NJTkdMRSAyCiNkZWZpbmUgVElMRV9LX0RJTV9ERUZfU0lOR0xFIDY0CiNkZWZpbmUgVElMRV9TSVpFX1lfREVGX1NJTkdMRSAzMgojZGVmaW5lIFRJTEVfU0laRV9YX0RFRl9TSU5HTEUgMzIKCl9fZGV2aWNlX18gdm9pZCBsb2FkTERTX25vX3RyYW5zcG9zZShpbnQgd2FycElkLCBpbnQgbGFuZUlkLCBpbnQga0lkLCBmcDE2ICpzX2EsIGZwMTYgKnNfYiwgY29uc3QgZnAxNiAqYSwgY29uc3QgZnAxNiAqYiwgaW50IE0sIGludCBOLCBpbnQgSykgewpjb25zdGV4cHIgaW50IG5iUmVhZFBlclRocmVhZCA9IDQ7CmNvbnN0ZXhwciBpbnQgbmJXYXJwUGVyTWF0cml4ID0gMjsgCmNvbnN0IGZwMTYgKnB0ciA9IGE7CmZwMTYgKmRzdCA9IHNfYTsKaW50IHdhcnBJZExvY2FsID0gd2FycElkJW5iV2FycFBlck1hdHJpeDsKaW50IHN0cmlkZSA9IEs7CmludCBtYXhSb3dzID0gTTsKaW50IERJTSA9IFRJTEVfS19ESU1fREVGX1NJTkdMRS9uYlJlYWRQZXJUaHJlYWQ7CnVpbnQzMl90IHJvd19vZmZzZXQgPSBUSUxFX1NJWkVfWF9ERUZfU0lOR0xFICogYmxvY2tJZHgueTsgCnVpbnQzMl90IGNvbF9vZmZzZXQgPSBrSWQ7CmlmICh3YXJwSWQ+PW5iV2FycFBlck1hdHJpeCl7CnB0cj1iOwpkc3Q9c19iOwptYXhSb3dzID0gTjsKcm93X29mZnNldCA9IFRJTEVfU0laRV9ZX0RFRl9TSU5HTEUgKiBibG9ja0lkeC54Owp9CgppbnQgbmJSb3dzUGVyV2FycCA9IFdBUlBfU0laRS9ESU0qbmJSZWFkUGVyVGhyZWFkOwp2ZWMydSBiX3ZhbHVlW25iUmVhZFBlclRocmVhZF0gPSB7MH07Cgpmb3IgKGludCByID0gMDsgciA8IG5iUmVhZFBlclRocmVhZDsgcisrKSB7CmludCBjb2wgPSBsYW5lSWQgJSBESU07CmludCByb3cgPSByICsgbmJSb3dzUGVyV2FycCAqIHdhcnBJZExvY2FsICsgbmJSZWFkUGVyVGhyZWFkICogKGxhbmVJZCAvIERJTSk7CmludCByb3dfZ2xvYmFsID0gKHJvd19vZmZzZXQgKyByb3cpOwppZiAocm93X2dsb2JhbDxtYXhSb3dzKXsKYl92YWx1ZVtyXSA9IChyZWludGVycHJldF9jYXN0PGNvbnN0IHZlYzJ1ICo+KHB0ciArIChyb3dfZ2xvYmFsKSAqIHN0cmlkZSArIChjb2xfb2Zmc2V0ICsgY29sICogbmJSZWFkUGVyVGhyZWFkKSkpWzBdOwp9Cn0KCmZvciAoaW50IHIgPSAwOyByIDwgbmJSZWFkUGVyVGhyZWFkOyByKyspIHsKaW50IGNvbCA9IGxhbmVJZCAlIERJTTsKaW50IHJvdyA9IHIgKyBuYlJvd3NQZXJXYXJwICogd2FycElkTG9jYWwgKyBuYlJlYWRQZXJUaHJlYWQgKiAobGFuZUlkIC8gRElNKTsKaW50IGNvbF9zd2l6emxlZCA9IChjb2wgXiAocm93ICUgMTYpKTsKKHJlaW50ZXJwcmV0X2Nhc3Q8dmVjNGZwMTYgKj4oZHN0KSlbKERJTSkqcm93ICsgY29sX3N3aXp6bGVkXSA9IGJfdmFsdWVbcl07Cn0gIAp9CgpfX2dsb2JhbF9fIHZvaWQgX19sYXVuY2hfYm91bmRzX18oTl9XQVJQX1hfREVGX1NJTkdMRSAqTl9XQVJQX1lfREVGX1NJTkdMRSAqV0FSUF9TSVpFKSAKY3VzdG9tX2tlcm5lbF93Zyhjb25zdCBmcDE2ICphLCBjb25zdCBmcDE2ICpiLCBmcDE2ICpjLCBpbnQgTSwgaW50IE4sIGludCBLKSB7CgppbnQgdGlkID0gdGhyZWFkSWR4Lng7CmludCBsYW5lSWQgPSB0aWQgJSBXQVJQX1NJWkU7CmZsb2F0IHJlc3VsdCA9IDA7Cgpjb25zdGV4cHIgaW50IFRJTEVfU0laRV9ZID0gVElMRV9TSVpFX1lfREVGX1NJTkdMRTsKY29uc3RleHByIGludCBUSUxFX1NJWkVfWCA9IFRJTEVfU0laRV9YX0RFRl9TSU5HTEU7CmNvbnN0ZXhwciBpbnQgS19ESU0gPSBUSUxFX0tfRElNX0RFRl9TSU5HTEU7CmNvbnN0ZXhwciBpbnQgTkJXQVJQU19ZID0gTl9XQVJQX1lfREVGX1NJTkdMRTsgCmNvbnN0ZXhwciBpbnQgTkJXQVJQU19YID0gTl9XQVJQX1hfREVGX1NJTkdMRTsgCmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9LID0gMTY7CmNvbnN0ZXhwciBpbnQgTUFUTVVMX0RJTV9OTSA9IDE2OwoKaW50IHdhcnBJZCA9IHRocmVhZElkeC54IC8gV0FSUF9TSVpFOwppbnQgd2FycElkeCA9IHdhcnBJZCAvIE5CV0FSUFNfWTsgCmludCB3YXJwSWR5ID0gd2FycElkICUgTkJXQVJQU19ZOwoKY29uc3RleHByIGludCBLX0RJTV9QQUQgPSBLX0RJTTsKCl9fc2hhcmVkX18gZnAxNiBzX2FbVElMRV9TSVpFX1hdW0tfRElNX1BBRF07Cl9fc2hhcmVkX18gZnAxNiBzX2JbVElMRV9TSVpFX1hdW0tfRElNX1BBRF07Cgpjb25zdGV4cHIgaW50IFdBUlBfVElMRV9TSVpFX1kgPSBUSUxFX1NJWkVfWSAvIE5CV0FSUFNfWSAvIE1BVE1VTF9ESU1fTk07IC8vIDIKY29uc3RleHByIGludCBXQVJQX1RJTEVfU0laRV9YID0gVElMRV9TSVpFX1ggLyBOQldBUlBTX1ggLyBNQVRNVUxfRElNX05NOyAvLyA0Cgp2ZWM0ZiBjX3NbV0FSUF9USUxFX1NJWkVfWF1bV0FSUF9USUxFX1NJWkVfWV0gPSB7MH07Cgpmb3IgKGludCBrSWQgPSAwOyBrSWQgPCBLOyBrSWQgKz0gS19ESU0pIHsKCmxvYWRMRFNfbm9fdHJhbnNwb3NlKHdhcnBJZCwgbGFuZUlkLCBrSWQsICZzX2FbMF1bMF0sICZzX2JbMF1bMF0sIGEsIGIsIE0sIE4sIEspOwoKX19zeW5jdGhyZWFkcygpOwoKI3ByYWdtYSB1bnJvbGwKZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKY29uc3RleHByIGludCBzdGVwWCA9IFRJTEVfU0laRV9YIC8gV0FSUF9USUxFX1NJWkVfWDsKY29uc3RleHByIGludCBzdGVwWSA9IFRJTEVfU0laRV9ZIC8gV0FSUF9USUxFX1NJWkVfWTsKZm9yIChpbnQgayA9IDA7IGsgPCBLX0RJTTtrICs9IE1BVE1VTF9ESU1fSykgCnsKaW50IGFfcm93ID0gKHRfd0lkeCAqIHN0ZXBYKSArIHdhcnBJZHggKiBNQVRNVUxfRElNX05NOwppbnQgYl9yb3cgPSAodF93SWR5ICogc3RlcFkpICsgd2FycElkeSAqIE1BVE1VTF9ESU1fTk07Cm1hdG11bDE2eDE2X2YxNl8yKCZzX2FbMF1bMF0sICZzX2JbMF1bMF0sY19zW3Rfd0lkeF1bdF93SWR5XSwgYV9yb3csIGssIGJfcm93LCBrLCBLX0RJTV9QQUQsIEtfRElNX1BBRCk7Cn0KfQp9CgpfX3N5bmN0aHJlYWRzKCk7Cn0KZm9yIChpbnQgdF93SWR4ID0gMDsgdF93SWR4IDwgV0FSUF9USUxFX1NJWkVfWDsgdF93SWR4KyspIHsKZm9yIChpbnQgdF93SWR5ID0gMDsgdF93SWR5IDwgV0FSUF9USUxFX1NJWkVfWTsgdF93SWR5KyspIHsKaW50IGNvbF9vZmZzZXQgPQpibG9ja0lkeC54ICogVElMRV9TSVpFX1kgKyAgICAgICAgICAgICAgICAgLy8gVElMRSBvZmZzZXQKKHdhcnBJZHkgKiBNQVRNVUxfRElNX05NKSArICAgICAgICAgICAgICAgIC8vIFdhcnAgb2Zmc2V0CnRfd0lkeSAqIChUSUxFX1NJWkVfWSAvIFdBUlBfVElMRV9TSVpFX1kpOyAvLyBXYXJwIHRpbGUgb2Zmc2V0CmludCByb3dfb2Zmc2V0ID0KYmxvY2tJZHgueSAqIFRJTEVfU0laRV9YICsgICAgICAgICAgICAgICAgIC8vIFRJTEUgb2Zmc2V0Cih3YXJwSWR4ICogTUFUTVVMX0RJTV9OTSkgKyAgICAgICAgICAgICAgICAvLyBXYXJwIG9mZnNldAp0X3dJZHggKiAoVElMRV9TSVpFX1ggLyBXQVJQX1RJTEVfU0laRV9YKTsgLy8gV2FycCB0aWxlIG9mZnNldAoKYXV0byByZXMgPSBjX3NbdF93SWR4XVt0X3dJZHldOwpmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewppbnQgY29sID0gbGFuZUlkICUgMTY7CmludCByb3cgPSBpICsgKGxhbmVJZCAvIDE2KSAqIDQ7CmludCByb3dfZyA9IHJvd19vZmZzZXQgKyByb3c7CmludCBjb2xfZyA9IGNvbF9vZmZzZXQgKyBjb2w7CmlmIChjb2xfZzxOKXsKY1socm93X2cpICogTiArIChjb2xfZyldID0gKGZwMTYpKHJlc1tpXSk7Cn0KfQp9Cn0KfQoKCnRlbXBsYXRlPGJvb2wgdXNlU2lnbW9pZCxib29sIHVzZVNjYWxpbmcsIGJvb2wgdXNlTWFwcGluZz4Kdm9pZCBtYXRtdWxfbmV3KGNvbnN0IGZwMTYgKmRfQSwgY29uc3QgZnAxNiAqKmRfQl9hcnJheSwgZnAxNiAqZF9DLCBpbnQgTSwgaW50IE4sIGludCBLLGludDMyX3QgKmRfYmxvY2tfbWFwcGluZywgaW50MzJfdCpkX21hcHBpbmcgPSBudWxscHRyLCBmcDE2KiBkX3NjYWxpbmcgPSBudWxscHRyKSB7CgpkaW0zIHRocmVhZHNQZXJCbG9jayhOX1dBUlBfWF9ERUYgKiBOX1dBUlBfWV9ERUYgKiBXQVJQX1NJWkUpOwpkaW0zIGJsb2Nrc1BlckdyaWQoKE4gKyBUSUxFX1NJWkVfWV9ERUYgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRiwKKE0gKyBUSUxFX1NJWkVfWF9ERUYgLSAxKSAvIFRJTEVfU0laRV9YX0RFRik7CmhpcExhdW5jaEtlcm5lbEdHTCgoY3VzdG9tX2tlcm5lbDx1c2VTaWdtb2lkLHVzZVNjYWxpbmcsdXNlTWFwcGluZyx0cnVlPiksIGJsb2Nrc1BlckdyaWQsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9BLG51bGxwdHIsZF9CX2FycmF5LCBkX0MsIE0sIE4sIEssZF9zY2FsaW5nLGRfYmxvY2tfbWFwcGluZyxkX21hcHBpbmcpOwp9Cgp2b2lkIG1hdG11bF93Zyhjb25zdCBmcDE2ICpkX0EsIGNvbnN0IGZwMTYgKmRfQiwgZnAxNiAqZF9DLCBpbnQgTSwgaW50IE4sIGludCBLKSB7CgpkaW0zIHRocmVhZHNQZXJCbG9jayhOX1dBUlBfWF9ERUZfU0lOR0xFICogTl9XQVJQX1lfREVGX1NJTkdMRSAqIFdBUlBfU0laRSk7CmRpbTMgYmxvY2tzUGVyR3JpZCgoTiArIFRJTEVfU0laRV9ZX0RFRl9TSU5HTEUgLSAxKSAvIFRJTEVfU0laRV9ZX0RFRl9TSU5HTEUsCihNICsgVElMRV9TSVpFX1hfREVGX1NJTkdMRSAtIDEpIC8gVElMRV9TSVpFX1hfREVGX1NJTkdMRSk7CgpoaXBMYXVuY2hLZXJuZWxHR0woKGN1c3RvbV9rZXJuZWxfd2cpLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfQSxkX0IsIGRfQywgTSwgTiwgSyk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnZlY3RvcjxUPiB0b0NQVShjb25zdCBUICpkX3AsIHNpemVfdCBjb3VudCkgewpzdGQ6OnZlY3RvcjxUPiBoX3AoY291bnQpOwpISVBfQ0hFQ0soaGlwTWVtY3B5KGhfcC5kYXRhKCksIGRfcCwgY291bnQgKiBzaXplb2YoVCksIGhpcE1lbWNweURldmljZVRvSG9zdCkpOwpyZXR1cm4gaF9wOwp9CgoKdGVtcGxhdGU8aW50IHRvcEssIGludCBOLCB0eXBlbmFtZSBUPgpfX2RldmljZV9fIHZvaWQgd2FycFRvcEtfMihmbG9hdCAqc2NvcmVzLCBUKiB0b3BfdmFscywgaW50KiB0b3BfaWR4cykgewppZiAoTj09dG9wSyl7CmZvciAoaW50IGkgPSAwOyBpIDwgdG9wSzsgKytpKSB7CnRvcF92YWxzW2ldID0gc2NvcmVzW2ldOwp0b3BfaWR4c1tpXSA9IGk7Cn0KfQplbHNlewojcHJhZ21hIHVucm9sbApmb3IgKGludCBpID0gMDsgaSA8IHRvcEs7ICsraSkgewp0b3BfdmFsc1tpXSA9IC1JTkZJTklUWTsKdG9wX2lkeHNbaV0gPSAtMTsKfQojcHJhZ21hIHVucm9sbApmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBOOyArK29mZnNldCkgewpUIG90aGVyX3ZhbCA9IFQoc2NvcmVzW29mZnNldF0pOwppbnQgb3RoZXJfaWR4ID0gb2Zmc2V0OwoKI3ByYWdtYSB1bnJvbGwKZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BLOyArK2kpIHsKaWYgKG90aGVyX3ZhbCA+IHRvcF92YWxzW2ldIHx8IAoob3RoZXJfdmFsID09IHRvcF92YWxzW2ldICYmIG90aGVyX2lkeCA8IHRvcF9pZHhzW2ldKSkgewovLyBTaGlmdCBkb3duCmZvciAoaW50IGogPSB0b3BLIC0gMTsgaiA+IGk7IC0taikgewp0b3BfdmFsc1tqXSA9IHRvcF92YWxzW2ogLSAxXTsKdG9wX2lkeHNbal0gPSB0b3BfaWR4c1tqIC0gMV07Cn0KCnRvcF92YWxzW2ldID0gb3RoZXJfdmFsOwp0b3BfaWR4c1tpXSA9IG90aGVyX2lkeDsKYnJlYWs7Cn0KfQp9Cn0KfQoKI2RlZmluZSBUT1BfS19USUxFX1NJWkUgMzIKdGVtcGxhdGU8aW50IE5fRVhQRVJUUz4KX19nbG9iYWxfXyB2b2lkIHRvcEtfa2VybmVsKGZwMTYgKmRfc2NvcmVzX291dCwgaW50MzJfdCAqZF9pbmRpY2VzLCBjb25zdCBmcDE2ICpkX3Njb3Jlc19pbiwgaW50IHNlcV9sZW4pIHsKCmludCB0aWQgPSAgdGhyZWFkSWR4Lng7CmludCB0b2tlbl9pZCA9IGJsb2NrSWR4Lng7CmludCBsYW5lSWQgPSB0aWQgJSBXQVJQX1NJWkU7CmludCB3YXJwSWQgPSB0aWQgLyBXQVJQX1NJWkU7Cgpjb25zdGV4cHIgaW50IHRvcF9rID0gNDsKY29uc3RleHByIGludCBUSUxFX1NJWkUgPSBUT1BfS19USUxFX1NJWkU7CmludCBjb2xfb2Zmc2V0ID0gYmxvY2tJZHgueCpUSUxFX1NJWkU7CmludCBjb2wgPSB0aWQgJSBUSUxFX1NJWkU7CmludCBjb2xfZyA9IGNvbF9vZmZzZXQgKyB0aWQgJSBUSUxFX1NJWkU7CmludCByb3cgPSB0aWQvVElMRV9TSVpFOwoKX19zaGFyZWRfXyBmbG9hdCBzY29yZXNbVElMRV9TSVpFXVtOX0VYUEVSVFNdOyAKX19zaGFyZWRfXyB1aW50MzJfdCBpbmRpY2VzW1RJTEVfU0laRV1bTl9FWFBFUlRTXTsKCnNjb3Jlc1tjb2xdW3Jvd109ZmxvYXQoZF9zY29yZXNfaW5bY29sX2cqTl9FWFBFUlRTICsgcm93XSk7CmluZGljZXNbY29sXVtyb3ddPXJvdzsKCl9fc3luY3RocmVhZHMoKTsKCmlmICh0aWQgPCBUSUxFX1NJWkUpewoKZmxvYXQgbWF4X3ZhbCA9IC1JTkZJTklUWTsKZm9yIChpbnQgaT0wO2k8Tl9FWFBFUlRTO2krKyl7CmlmIChtYXhfdmFsPHNjb3Jlc1t0aWRdW2ldKXsKbWF4X3ZhbCA9IHNjb3Jlc1t0aWRdW2ldOwp9Cn0KZmxvYXQgc3VtID0gMC4wZjsKZm9yIChpbnQgaT0wO2k8Tl9FWFBFUlRTO2krKyl7CmF1dG8gZXhwX3ZhbCA9IGV4cGYoc2NvcmVzW3RpZF1baV0gLSBtYXhfdmFsKTsKc3VtKz1leHBfdmFsOwpzY29yZXNbdGlkXVtpXT1leHBfdmFsOwp9CmZvciAoaW50IGk9MDtpPE5fRVhQRVJUUztpKyspewpzY29yZXNbdGlkXVtpXS89c3VtOwp9Cn0KX19zeW5jdGhyZWFkcygpOwoKX19zaGFyZWRfXyBmcDE2IHRvcF92YWxzW1RJTEVfU0laRV1bdG9wX2tdOwpfX3NoYXJlZF9fIGludCB0b3BfaWR4c1tUSUxFX1NJWkVdW3RvcF9rXTsKCmlmICh0aWQgPCBUSUxFX1NJWkUpewoKd2FycFRvcEtfMjx0b3BfayxOX0VYUEVSVFMsZnAxNj4oJnNjb3Jlc1t0aWRdWzBdLCAmdG9wX3ZhbHNbdGlkXVswXSwgJnRvcF9pZHhzW3RpZF1bMF0pOwpmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgewpkX3Njb3Jlc19vdXRbY29sX2cqNCtpXT1mcDE2KHRvcF92YWxzW3RpZF1baV0pOwpkX2luZGljZXNbY29sX2cqNCtpXT10b3BfaWR4c1t0aWRdW2ldOwp9Cn0KfQoKdGVtcGxhdGU8aW50IG5fZXhwZXJ0cz4KX19nbG9iYWxfXyB2b2lkIGhpc3RvZ3JhbShjb25zdCBpbnQzMl90KiBkX2luZGljZXMsIHVpbnQzMl90KiBkX2hpc3QsIGludCBzZXFfbGVuKSB7Cgpjb25zdGV4cHIgaW50IG5fYWN0aXZlX2V4cGVydHMgPSA0OwpfX3NoYXJlZF9fIHVpbnQzMl90IHNfaGlzdFtuX2V4cGVydHNdOwoKaW50IHRpZCA9IHRocmVhZElkeC54OwppZiAodGlkIDwgbl9leHBlcnRzKSB7CnNfaGlzdFt0aWRdID0gMDsKfQpfX3N5bmN0aHJlYWRzKCk7CmludCBpZHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRpZDsKaWYgKGlkeCA8IHNlcV9sZW4qbl9hY3RpdmVfZXhwZXJ0cykgewppbnQzMl90IHZhbCA9IGRfaW5kaWNlc1tpZHhdOwppZiAodmFsIDwgbl9leHBlcnRzKSB7CmF0b21pY0FkZCgmc19oaXN0W3ZhbF0sIDEpOwp9Cn0gCgpfX3N5bmN0aHJlYWRzKCk7CgppZiAodGlkIDwgbl9leHBlcnRzKSB7CmF0b21pY0FkZCgmZF9oaXN0W3RpZF0sIHNfaGlzdFt0aWRdKTsKfQp9CgppbnQgZGl2VXAoaW50IHgsaW50IG4pewpyZXR1cm4gKHggKyBuLTEpL247Cn0KCl9fZ2xvYmFsX18gdm9pZCByZV9vcmRlcl9pbmRpY2VzX2tlcm5lbChmcDE2KiBkX291dHB1dCwgY29uc3QgZnAxNiAqZF9pbnB1dCwgY29uc3QgaW50MzJfdCogZF9tYXBwaW5nLCBpbnQgZF9oaWRkZW4saW50IHNlcV9sZW4saW50IHNlcV9sZW5fcmVfb3JkZXIpIHsKCmludCB0aWQgPSBibG9ja0RpbS54KmJsb2NrSWR4LngrdGhyZWFkSWR4Lng7CmludCBkc3Rfcm93ID0gdGlkL2RfaGlkZGVuOwppbnQgY29sID0gdGlkJWRfaGlkZGVuOwoKaWYgKGRzdF9yb3c8c2VxX2xlbl9yZV9vcmRlcil7CmludCBzcmNfcm93ID0gZF9tYXBwaW5nW2RzdF9yb3ddOwppZiAoc3JjX3JvdzxzZXFfbGVuKXsgLy9tYWtlIHRoaXMgYmV0dGVyIGJ5IGNoZWNraW5nIGhpc3QKZF9vdXRwdXRbZF9oaWRkZW4qZHN0X3Jvdytjb2xdPWRfaW5wdXRbZF9oaWRkZW4qc3JjX3Jvdytjb2xdOwp9ZWxzZXsKZF9vdXRwdXRbZF9oaWRkZW4qZHN0X3Jvdytjb2xdPWZwMTYoMC4wZik7Cn0KfQp9Cgp0ZW1wbGF0ZTxpbnQgbl9leHBlcnRzPgpfX2dsb2JhbF9fIHZvaWQgaWRfbWFwcGluZyhpbnQzMl90ICptYXBwaW5nLGludDMyX3QgKm1hcHBpbmdfcmV2LCBjb25zdCBpbnQzMl90KiBkX2luZGljZXMsIGNvbnN0IHVpbnQzMl90KiBkX2hpc3QsIGludCBzZXFfbGVuKSB7Cgpjb25zdGV4cHIgaW50IG5fYWN0aXZlX2V4cGVydHM9NDsKaW50IHRpZCA9IGJsb2NrSWR4LngqYmxvY2tEaW0ueCt0aHJlYWRJZHgueDsKaW50IHRvdGFsX3RocmVhZHMgPSBncmlkRGltLnggKiBibG9ja0RpbS54OwpfX3NoYXJlZF9fIHVpbnQzMl90IGV4cGVydF9vZmZzZXRzW25fZXhwZXJ0c107CgppZiAodGhyZWFkSWR4LnggPT0gMCkgewp1aW50MzJfdCBvZmZzZXQgPSAwOwpmb3IgKGludCBpID0gMDsgaSA8IG5fZXhwZXJ0czsgKytpKSB7CmV4cGVydF9vZmZzZXRzW2ldID0gb2Zmc2V0OwpvZmZzZXQgKz0gKChkX2hpc3RbaV0rKFRJTEVfU0laRV9YX0RFRi0xKSkvVElMRV9TSVpFX1hfREVGKSpUSUxFX1NJWkVfWF9ERUY7Cn0KfQoKX19zeW5jdGhyZWFkcygpOwoKaW50IHJvdyA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CmlmIChyb3cgPj0gc2VxX2xlbikgcmV0dXJuOwpmb3IgKGludCByb3cgPSB0aWQ7IHJvdyA8IHNlcV9sZW47IHJvdyArPSB0b3RhbF90aHJlYWRzKSB7CmZvciAoaW50IGkgPSAwOyBpIDwgbl9hY3RpdmVfZXhwZXJ0czsgKytpKSB7CmludCBleHBlcnQgPSBkX2luZGljZXNbcm93ICogbl9hY3RpdmVfZXhwZXJ0cyArIGldOwppbnQgcG9zID0gYXRvbWljQWRkKCZleHBlcnRfb2Zmc2V0c1tleHBlcnRdLCAxKTsKCm1hcHBpbmdbcG9zXSA9IHJvdzsKbWFwcGluZ19yZXZbcm93ICogbl9hY3RpdmVfZXhwZXJ0cyArIGldID0gcG9zOwp9Cn0KCn0KCl9fZ2xvYmFsX18gdm9pZCByZWR1Y2VLX2tlcm5lbChmcDE2ICpkX291dHB1dCwgY29uc3QgZnAxNiAqZF9pbnB1dF9yZV9vcmRlciwgY29uc3QgaW50MzJfdCAqZF9tYXBwaW5nX3JldiwgY29uc3QgZnAxNipkX3Njb3Jlcyxjb25zdCBmcDE2KmRfc2hhcmVkX2V4cGVydCwgaW50IHNlcV9sZW4sIGludCBkX2hpZGRlbikgewoKaW50IHRpZCA9IGJsb2NrRGltLngqYmxvY2tJZHgueCt0aHJlYWRJZHgueDsKaW50IGRzdF9yb3cgPSB0aWQvZF9oaWRkZW47CmludCBjb2wgPSB0aWQlZF9oaWRkZW47CmNvbnN0ZXhwciBpbnQgbl9hY3RpdmVfZXhwZXJ0cyA9IDQ7CgppZiAodGlkPHNlcV9sZW4qZF9oaWRkZW4pewpmbG9hdCBzdW0gPSAwLjBmOwojcHJhZ21hIHVucm9sbApmb3IgKGludCBpPTA7aTxuX2FjdGl2ZV9leHBlcnRzO2krKyl7CmludCByID0gZF9tYXBwaW5nX3Jldltkc3Rfcm93Km5fYWN0aXZlX2V4cGVydHMraV07CmF1dG8gdyA9IGRfc2NvcmVzW2RzdF9yb3cqbl9hY3RpdmVfZXhwZXJ0cytpXTsKc3VtKz0gZmxvYXQodyAqIGRfaW5wdXRfcmVfb3JkZXJbcipkX2hpZGRlbitjb2xdKTsKfQpkX291dHB1dFtkc3Rfcm93KmRfaGlkZGVuK2NvbF0gPSBmcDE2KHN1bSArIGZsb2F0KGRfc2hhcmVkX2V4cGVydFtkc3Rfcm93KmRfaGlkZGVuK2NvbF0pKTsKfQp9Cgp2b2lkIHJlZHVjZUsoZnAxNiAqZF9vdXRwdXQsIGNvbnN0IGZwMTYgKmRfaW5wdXRfcmVfb3JkZXIsIGNvbnN0IGludDMyX3QgKmRfbWFwcGluZ19yZXYsIGNvbnN0IGZwMTYqZF9zY29yZXMsIGNvbnN0IGZwMTYqZF9zaGFyZWRfZXhwZXJ0LCBpbnQgc2VxX2xlbiwgaW50IGRfaGlkZGVuKSB7CmRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKZGltMyBudW1CbG9ja3MoZGl2VXAoc2VxX2xlbipkX2hpZGRlbix0aHJlYWRzUGVyQmxvY2sueCkpOwpoaXBMYXVuY2hLZXJuZWxHR0wocmVkdWNlS19rZXJuZWwsIG51bUJsb2NrcywgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX291dHB1dCwgZF9pbnB1dF9yZV9vcmRlciwgZF9tYXBwaW5nX3JldiwgIGRfc2NvcmVzLGRfc2hhcmVkX2V4cGVydCxzZXFfbGVuLGRfaGlkZGVuKTsKfQoKdm9pZCByZV9vcmRlcl9pbmRpY2VzKGZwMTYqIGRfb3V0cHV0LCBjb25zdCBmcDE2ICpkX2lucHV0LCBjb25zdCBpbnQzMl90KiBkX21hcHBpbmcsIGludCBkX2hpZGRlbixpbnQgc2VxX2xlbixpbnQgc2VxX2xlbl9yZV9vcmRlcikgewpkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CmRpbTMgbnVtQmxvY2tzKGRpdlVwKHNlcV9sZW5fcmVfb3JkZXIqZF9oaWRkZW4sdGhyZWFkc1BlckJsb2NrLngpKTsKaGlwTGF1bmNoS2VybmVsR0dMKHJlX29yZGVyX2luZGljZXNfa2VybmVsLCBudW1CbG9ja3MsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9vdXRwdXQsIGRfaW5wdXQsIGRfbWFwcGluZywgIGRfaGlkZGVuLHNlcV9sZW4sc2VxX2xlbl9yZV9vcmRlcik7Cn0KCnZvaWQgaWRfbWFwcGluZyhpbnQzMl90ICpkX21hcHBpbmcsIGludDMyX3QgKmRfbWFwcGluZ19yZXYgLGNvbnN0IGludDMyX3QqIGRfaW5kaWNlcywgY29uc3QgdWludDMyX3QqIGRfaGlzdCwgaW50IHNlcV9sZW4sIGludCBuX2V4cGVydHMpIHsKZGltMyB0aHJlYWRzUGVyQmxvY2soV0FSUF9TSVpFKjE2KTsKZGltMyBudW1CbG9ja3MoMSk7CmlmIChuX2V4cGVydHMgPT0gMzIpCnsKaGlwTGF1bmNoS2VybmVsR0dMKChpZF9tYXBwaW5nPDMyPiksIG51bUJsb2NrcywgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX21hcHBpbmcsZF9tYXBwaW5nX3JldixkX2luZGljZXMsZF9oaXN0LCBzZXFfbGVuKTsKfWVsc2UgaWYgKG5fZXhwZXJ0cyA9PSA4KXsKaGlwTGF1bmNoS2VybmVsR0dMKChpZF9tYXBwaW5nPDg+KSwgbnVtQmxvY2tzLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfbWFwcGluZyxkX21hcHBpbmdfcmV2LGRfaW5kaWNlcyxkX2hpc3QsIHNlcV9sZW4pOwp9ZWxzZSBpZiAobl9leHBlcnRzID09IDQpewpoaXBMYXVuY2hLZXJuZWxHR0woKGlkX21hcHBpbmc8ND4pLCBudW1CbG9ja3MsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9tYXBwaW5nLGRfbWFwcGluZ19yZXYsZF9pbmRpY2VzLGRfaGlzdCwgc2VxX2xlbik7Cn0KfQoKdm9pZCBoaXN0b2dyYW0oY29uc3QgaW50MzJfdCogZF9pbmRpY2VzLCB1aW50MzJfdCogZF9oaXN0LCBpbnQgc2VxX2xlbiwgaW50IG5fYWN0aXZlX2V4cGVydHMsIGludCBuX2V4cGVydHMpewpkaW0zIHRocmVhZHNQZXJCbG9jayhXQVJQX1NJWkUqNCk7CmRpbTMgbnVtQmxvY2tzKGRpdlVwKHNlcV9sZW4qbl9hY3RpdmVfZXhwZXJ0cyxXQVJQX1NJWkUqNCkpOwppZiAobl9leHBlcnRzID09IDMyKXsKaGlwTGF1bmNoS2VybmVsR0dMKChoaXN0b2dyYW08MzI+KSwgbnVtQmxvY2tzLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfaW5kaWNlcyxkX2hpc3QsIHNlcV9sZW4pOwp9CmVsc2UgaWYgKG5fZXhwZXJ0cyA9PSA4KQp7CmhpcExhdW5jaEtlcm5lbEdHTCgoaGlzdG9ncmFtPDg+KSwgbnVtQmxvY2tzLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfaW5kaWNlcyxkX2hpc3QsIHNlcV9sZW4pOwp9ZWxzZSBpZiAobl9leHBlcnRzID09IDQpewpoaXBMYXVuY2hLZXJuZWxHR0woKGhpc3RvZ3JhbTw0PiksIG51bUJsb2NrcywgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX2luZGljZXMsZF9oaXN0LCBzZXFfbGVuKTsKfWVsc2V7CnRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGV4cGVydHMuIE9ubHkgNCwgOCBvciAzMiBhcmUgc3VwcG9ydGVkLiIpOwp9Cn0KCnZvaWQgdG9wSyhmcDE2ICpkX3Njb3Jlc19vdXQsIGludDMyX3QgKmRfaW5kaWNlcywgY29uc3QgZnAxNiAqZF9zY29yZXNfaW4sIGludCBzZXFfbGVuLCBpbnQgbl9leHBlcnRzKXsKZGltMyB0aHJlYWRzUGVyQmxvY2sobl9leHBlcnRzKlRPUF9LX1RJTEVfU0laRSk7CmRpbTMgbnVtQmxvY2tzKHNlcV9sZW4vVE9QX0tfVElMRV9TSVpFKTsKaWYgKG5fZXhwZXJ0cyA9PSAzMil7ICAKaGlwTGF1bmNoS2VybmVsR0dMKCh0b3BLX2tlcm5lbDwzMj4pLCBudW1CbG9ja3MsIHRocmVhZHNQZXJCbG9jaywgMCwgMCwgZF9zY29yZXNfb3V0LCBkX2luZGljZXMsZF9zY29yZXNfaW4sIHNlcV9sZW4pOwp9ZWxzZSBpZiAobl9leHBlcnRzID09IDgpewpoaXBMYXVuY2hLZXJuZWxHR0woKHRvcEtfa2VybmVsPDg+KSwgbnVtQmxvY2tzLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfc2NvcmVzX291dCwgZF9pbmRpY2VzLGRfc2NvcmVzX2luLCBzZXFfbGVuKTsKfWVsc2UgaWYgKG5fZXhwZXJ0cyA9PSA0KXsKaGlwTGF1bmNoS2VybmVsR0dMKCh0b3BLX2tlcm5lbDw0PiksIG51bUJsb2NrcywgdGhyZWFkc1BlckJsb2NrLCAwLCAwLCBkX3Njb3Jlc19vdXQsIGRfaW5kaWNlcyxkX3Njb3Jlc19pbiwgc2VxX2xlbik7Cn1lbHNlewp0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBleHBlcnRzLiBPbmx5IDggb3IgMzIgYXJlIHN1cHBvcnRlZC4iKTsKfQp9CgoKdm9pZCBjb21wdXRlX2V4cGVydHMoZnAxNipkX291dHB1dCxjb25zdCBmcDE2ICpkX2lucHV0LCAKY29uc3QgZnAxNioqIGRfZF9XX2dhdGVzLApjb25zdCBmcDE2KiogZF9kX1dfdXBzLApjb25zdCBmcDE2KiogZF9kX1dfZG93bnMsCmNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+IHByZWZpeF9zdW0sCmNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+IHNlcV9sZW5ndGhzLAppbnQgZF9oaWRkZW4sIGludCBzZXFfbGVuLCBpbnQgc2VxX2xlbl9yZV9vcmRlcixpbnQgZF9leHBlcnQsaW50IG5fZXhwZXJ0cywKZnAxNiogZF9nYXRlX291dCwKZnAxNiogZF91cF9vdXQsCmludDMyX3QqZF9ibG9ja19tYXBwaW5nLAppbnQzMl90KmRfbWFwcGluZykKeyAgCgptYXRtdWxfbmV3PHRydWUsZmFsc2UsdHJ1ZT4oZF9pbnB1dCwKZF9kX1dfZ2F0ZXMsCmRfZ2F0ZV9vdXQsCnNlcV9sZW5fcmVfb3JkZXIsCmRfZXhwZXJ0LGRfaGlkZGVuLApkX2Jsb2NrX21hcHBpbmcsCmRfbWFwcGluZyk7Cm1hdG11bF9uZXc8ZmFsc2UsdHJ1ZSx0cnVlPiggZF9pbnB1dCwKZF9kX1dfdXBzLApkX3VwX291dCwKc2VxX2xlbl9yZV9vcmRlciwKZF9leHBlcnQsZF9oaWRkZW4sCmRfYmxvY2tfbWFwcGluZywKZF9tYXBwaW5nLApkX2dhdGVfb3V0KTsKCm1hdG11bF9uZXc8ZmFsc2UsZmFsc2UsZmFsc2U+KGRfdXBfb3V0LApkX2RfV19kb3ducywKZF9vdXRwdXQsCnNlcV9sZW5fcmVfb3JkZXIsCmRfaGlkZGVuLGRfZXhwZXJ0LApkX2Jsb2NrX21hcHBpbmcpOyAgCgp9CgpfX2dsb2JhbF9fIHZvaWQgcHJvZHVjdEFuZFNpZ21vaWRfa2VybmVsKGZwMTYqIGRfb3V0LCBjb25zdCBmcDE2ICogZF9nYXRlX291dCxjb25zdCBmcDE2ICogZF91cF9vdXQsIGludCBNLCBpbnQgTil7CgppbnQgdGlkID0gYmxvY2tEaW0ueCpibG9ja0lkeC54K3RocmVhZElkeC54OwoKaWYgKHRpZDxNKk4pewovL3NpZ21vaWQgb24gZF9nYXRlX291dApmcDE2IHJhdGlvID0gZnAxNigxLjBmLygxLjArZXhwKC1mbG9hdChkX2dhdGVfb3V0W3RpZF0pKSkpOwpmcDE2IHRtcCA9IChmcDE2KShkX2dhdGVfb3V0W3RpZF0pKnJhdGlvOwoKLy9zY2FsaW5nCmRfb3V0W3RpZF0gPSB0bXAqZF91cF9vdXRbdGlkXTsKfQp9CnZvaWQgcHJvZHVjdEFuZFNpZ21vaWQoZnAxNiogZF9vdXQsIGNvbnN0IGZwMTYgKiBkX2dhdGVfb3V0LGNvbnN0IGZwMTYgKiBkX3VwX291dCwgaW50IE0sIGludCBOKXsKCmRpbTMgdGhyZWFkc1BlckJsb2NrKFdBUlBfU0laRSo0KTsKZGltMyBibG9ja3NQZXJHcmlkKGRpdlVwKE4qTSx0aHJlYWRzUGVyQmxvY2sueCkpOwoKaGlwTGF1bmNoS2VybmVsR0dMKChwcm9kdWN0QW5kU2lnbW9pZF9rZXJuZWwpLCBibG9ja3NQZXJHcmlkLCB0aHJlYWRzUGVyQmxvY2ssIDAsIDAsIGRfb3V0LGRfZ2F0ZV9vdXQsIGRfdXBfb3V0LCBNLCBOKTsKfQoKc3RhdGljIGNvbnN0IGZwMTYqKiBkX2Rfd19nYXRlOwpzdGF0aWMgY29uc3QgZnAxNioqIGRfZF93X3VwOwpzdGF0aWMgY29uc3QgZnAxNioqIGRfZF93X2Rvd247CgpzdGF0aWMgdWludDMyX3QgKmRfaGlzdDsKc3RhdGljIGludDMyX3QgKmRfbWFwcGluZzsKc3RhdGljIGludDMyX3QgKmRfbWFwcGluZ19yZXY7CgpzdGF0aWMgZnAxNiAqZF9vdXRwdXRfcmVvcmRlcjsKCnN0YXRpYyBmcDE2KiBkX2dhdGVfb3V0OwpzdGF0aWMgZnAxNiogZF91cF9vdXQ7CgpzdGF0aWMgZnAxNiogZF9zaGFyZWRfZXhwZXJ0OwpzdGF0aWMgZnAxNiogZF9zY29yZXM7CnN0YXRpYyBmcDE2KiBkX3Njb3Jlc19uZXc7CnN0YXRpYyBpbnQzMl90KiBkX2luZGljZXM7CgpzdGF0aWMgaW50MzJfdCAqZF9ibG9ja19tYXBwaW5nOwpzdGF0aWMgcm9jYmxhc19oYW5kbGUgaGFuZGxlOwoKdm9pZCBhbGxvY2F0ZSgpewpjb25zdGV4cHIgaW50IG1heF9uX2V4cGVydHMgPSAzMjsKY29uc3RleHByIGludCBtYXhfc2VxX2xlbiA9IDgxOTI7CmNvbnN0ZXhwciBpbnQgbWF4X2RfZXhwZXJ0ID0gMjA0ODsKY29uc3RleHByIGludCBtYXhfbl9hY3RpdmVfZXhwZXJ0cyA9IDQ7CmNvbnN0ZXhwciBpbnQgcGFkZGluZyA9IG1heF9uX2V4cGVydHMqVElMRV9TSVpFX1hfREVGOwpjb25zdGV4cHIgaW50IG1heF9zZXFfbGVuX3JlX29yZGVyID0gbWF4X3NlcV9sZW4qbWF4X25fYWN0aXZlX2V4cGVydHMrcGFkZGluZzsKY29uc3RleHByIGludCBtYXhfZF9oaWRkZW4gPSA3MTY4OwppbnQgbWF4X25iX2Jsb2NrcyA9IGRpdlVwKG1heF9zZXFfbGVuX3JlX29yZGVyLCBUSUxFX1NJWkVfWF9ERUYpOwpyb2NibGFzX2NyZWF0ZV9oYW5kbGUoJmhhbmRsZSk7CgpzdGF0aWMgYm9vbCBoYXNJbml0ID0gZmFsc2U7CmlmICghaGFzSW5pdCl7CgovL0FycmF5IG9mIHdlaWdodHMKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9kX3dfZ2F0ZSwgbWF4X25fZXhwZXJ0cyAqIHNpemVvZihmcDE2KikpKTsKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9kX3dfdXAsIG1heF9uX2V4cGVydHMgKiBzaXplb2YoZnAxNiopKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfZF93X2Rvd24sIG1heF9uX2V4cGVydHMgKiBzaXplb2YoZnAxNiopKSk7CgpISVBfQ0hFQ0soaGlwTWFsbG9jKCZkX2hpc3QsIG1heF9uX2V4cGVydHMgKiBzaXplb2YodWludDMyX3QpKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfbWFwcGluZywgbWF4X3NlcV9sZW5fcmVfb3JkZXIgKiBzaXplb2YoaW50MzJfdCkpKTsKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9tYXBwaW5nX3JldiwgbWF4X3NlcV9sZW4qbWF4X25fYWN0aXZlX2V4cGVydHMgKiBzaXplb2YoaW50MzJfdCkpKTsKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9vdXRwdXRfcmVvcmRlciwgbWF4X3NlcV9sZW5fcmVfb3JkZXIqbWF4X2RfaGlkZGVuICogc2l6ZW9mKGZwMTYpKSk7CgpISVBfQ0hFQ0soaGlwTWFsbG9jKCZkX2dhdGVfb3V0LCBtYXhfc2VxX2xlbl9yZV9vcmRlciptYXhfZF9leHBlcnQgICogc2l6ZW9mKGZwMTYpKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfdXBfb3V0LCBtYXhfc2VxX2xlbl9yZV9vcmRlciptYXhfZF9leHBlcnQgKiBzaXplb2YoZnAxNikpKTsKCkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfc2hhcmVkX2V4cGVydCwgbWF4X3NlcV9sZW4qbWF4X2RfaGlkZGVuICogc2l6ZW9mKGZwMTYpKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfc2NvcmVzLCBtYXhfc2VxX2xlbiptYXhfbl9leHBlcnRzICogc2l6ZW9mKGZwMTYpKSk7CkhJUF9DSEVDSyhoaXBNYWxsb2MoJmRfc2NvcmVzX25ldywgbWF4X3NlcV9sZW4qbWF4X25fZXhwZXJ0cyAqIHNpemVvZihmcDE2KSkpOwoKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9pbmRpY2VzLCBtYXhfc2VxX2xlbiptYXhfbl9hY3RpdmVfZXhwZXJ0cyAqIHNpemVvZihpbnQzMl90KSkpOwoKSElQX0NIRUNLKGhpcE1hbGxvYygmZF9ibG9ja19tYXBwaW5nLCBtYXhfbmJfYmxvY2tzICogc2l6ZW9mKGludDMyX3QpKSk7CgoKCmhhc0luaXQgPSB0cnVlOwp9Cn0KCgp2b2lkIG1hdG11bF9ibGFzX3JtKGNvbnN0IGZwMTYqZEEsIGNvbnN0IGZwMTYgKmRCLCBmcDE2ICpkQywgaW50IE0sIGludCBOLCBpbnQgSyl7CmNvbnN0IGZsb2F0IGFscGhhID0gMS4wZjsKY29uc3QgZmxvYXQgYmV0YSAgPSAwLjBmOwpyb2NibGFzX2dlbW1fZXgoCmhhbmRsZSwKcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKcm9jYmxhc19vcGVyYXRpb25fbm9uZSwKTiwgTSwgSywKJmFscGhhLApkQiwgcm9jYmxhc19kYXRhdHlwZV9mMTZfciwgTiwKZEEsIHJvY2JsYXNfZGF0YXR5cGVfZjE2X3IsIEssCiZiZXRhLApkQywgcm9jYmxhc19kYXRhdHlwZV9mMTZfciwgTiwKZEMsIHJvY2JsYXNfZGF0YXR5cGVfZjE2X3IsIE4sCnJvY2JsYXNfZGF0YXR5cGVfZjMyX3IsCnJvY2JsYXNfZ2VtbV9hbGdvX3N0YW5kYXJkLAowLCAwCik7Cn0Kdm9pZCBjb21wdXRlX2V4cGVydChmcDE2KmRfb3V0cHV0LGNvbnN0IGZwMTYgKmRfaW5wdXQsIGNvbnN0IGZwMTYqZF9XX2dhdGUsY29uc3QgZnAxNipkX1dfdXAsIGNvbnN0IGZwMTYqZF9XX2Rvd24sIAppbnQgZF9oaWRkZW4sIGludCBzZXFfbGVuLCBpbnQgZF9leHBlcnQsCmZwMTYqIGRfZ2F0ZV9vdXQsCmZwMTYqIGRfdXBfb3V0KXsKCm1hdG11bF9ibGFzX3JtKGRfaW5wdXQsIGRfV19nYXRlLCBkX2dhdGVfb3V0LCBzZXFfbGVuLCBkX2V4cGVydCwgZF9oaWRkZW4pOwptYXRtdWxfYmxhc19ybShkX2lucHV0LCBkX1dfdXAsIGRfdXBfb3V0LCBzZXFfbGVuLCBkX2V4cGVydCwgZF9oaWRkZW4pOwpwcm9kdWN0QW5kU2lnbW9pZChkX3VwX291dCwgZF9nYXRlX291dCxkX3VwX291dCxzZXFfbGVuLGRfZXhwZXJ0KTsKbWF0bXVsX2JsYXNfcm0oZF91cF9vdXQsIGRfV19kb3duLCBkX291dHB1dCwgc2VxX2xlbiwgZF9oaWRkZW4sIGRfZXhwZXJ0KTsKfQpzdHJ1Y3QgQ29uZmlnewppbnQgZF9oaWRkZW47CmludCBkX2V4cGVydDsKaW50IGJhdGNoX3NpemU7CmludCBzZXFfbGVuOwppbnQgbl9hY3RpdmVfZXhwZXJ0czsKaW50IG5fZXhwZXJ0czsKfTsKCgoKdm9pZCBjb21wdXRlX21vZShjb25zdCBDb25maWcgJmNvbmYsCmNvbnN0IGZwMTYqIGRfaW5wdXQsCmZwMTYgKmRfb3V0cHV0LAoKY29uc3QgZnAxNiogZF9XX2csCmNvbnN0IGZwMTYqIGRfc2hhcmVkX3dfZ2F0ZSwKY29uc3QgZnAxNiogZF9zaGFyZWRfd191cCwKY29uc3QgZnAxNiogZF9zaGFyZWRfd19kb3duLAoKY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgZnAxNio+ICZkX3dfZ2F0ZSwKY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgZnAxNio+ICZkX3dfdXAsCmNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGZwMTYqPiAmZF93X2Rvd24KKXsKCgppbnQgbl9leHBlcnRzID0gY29uZi5uX2V4cGVydHM7CmludCBkX2hpZGRlbiA9IGNvbmYuZF9oaWRkZW47CmludCBkX2V4cGVydCA9IGNvbmYuZF9leHBlcnQ7CmludCBiYXRjaF9zaXplID0gY29uZi5iYXRjaF9zaXplOwppbnQgc2VxX2xlbiA9IGNvbmYuc2VxX2xlbjsKaW50IG5fYWN0aXZlX2V4cGVydHMgPSBjb25mLm5fYWN0aXZlX2V4cGVydHM7CgphbGxvY2F0ZSgpOwovLyBDb3B5IHdlaWdodCBwdHIgdG8gZGV2aWNlCkhJUF9DSEVDSyhoaXBNZW1jcHkoZF9kX3dfZ2F0ZSwgZF93X2dhdGUuZGF0YSgpLCBuX2V4cGVydHMgKiBzaXplb2YoZnAxNiopLCBoaXBNZW1jcHlIb3N0VG9EZXZpY2UpKTsKSElQX0NIRUNLKGhpcE1lbWNweShkX2Rfd191cCwgZF93X3VwLmRhdGEoKSwgbl9leHBlcnRzICogc2l6ZW9mKGZwMTYqKSwgaGlwTWVtY3B5SG9zdFRvRGV2aWNlKSk7CkhJUF9DSEVDSyhoaXBNZW1jcHkoZF9kX3dfZG93biwgZF93X2Rvd24uZGF0YSgpLCBuX2V4cGVydHMgKiBzaXplb2YoZnAxNiopLCBoaXBNZW1jcHlIb3N0VG9EZXZpY2UpKTsKCmludCBwYWRkaW5nID0gbl9leHBlcnRzKlRJTEVfU0laRV9YX0RFRjsKaW50IHNlcV9sZW5fcmVfb3JkZXIgPSBzZXFfbGVuKm5fYWN0aXZlX2V4cGVydHMrcGFkZGluZzsKCmZvciAoaW50IGJhdGNoPTA7YmF0Y2g8YmF0Y2hfc2l6ZTtiYXRjaCsrKXsKY29uc3QgZnAxNiogZF9pbnB1dF9iYXRjaCA9IGRfaW5wdXQgKyBiYXRjaCpzZXFfbGVuKmRfaGlkZGVuOwpmcDE2KiBkX291dHB1dF9iYXRjaCA9IGRfb3V0cHV0ICsgYmF0Y2gqc2VxX2xlbipkX2hpZGRlbjsKCkhJUF9DSEVDSyhoaXBNZW1zZXRBc3luYyAoZF9oaXN0LCAwLCBzaXplb2YoaW50MzJfdCkqbl9leHBlcnRzLCAwKSk7CkhJUF9DSEVDSyhoaXBNZW1zZXRBc3luYyAoZF9tYXBwaW5nLCAwLCBzaXplb2YoaW50MzJfdCkqc2VxX2xlbl9yZV9vcmRlciwgMCkpOwpjb21wdXRlX2V4cGVydChkX3NoYXJlZF9leHBlcnQsCmRfaW5wdXRfYmF0Y2gsIApkX3NoYXJlZF93X2dhdGUsCmRfc2hhcmVkX3dfdXAsCmRfc2hhcmVkX3dfZG93biwKZF9oaWRkZW4sIApzZXFfbGVuLApkX2V4cGVydCwKZF9nYXRlX291dCwKZF91cF9vdXQpOwoKbWF0bXVsX3dnKGRfaW5wdXRfYmF0Y2gsIGRfV19nLCBkX3Njb3Jlc19uZXcsIHNlcV9sZW4gLG5fZXhwZXJ0cywgZF9oaWRkZW4pOwp0b3BLKGRfc2NvcmVzLCBkX2luZGljZXMsIGRfc2NvcmVzX25ldywgc2VxX2xlbiwgbl9leHBlcnRzKTsKaGlzdG9ncmFtKGRfaW5kaWNlcywgZF9oaXN0LCBzZXFfbGVuLCBuX2FjdGl2ZV9leHBlcnRzLCBuX2V4cGVydHMpOwphdXRvIGhfaGlzdCA9IHRvQ1BVKGRfaGlzdCxuX2V4cGVydHMpOwphdXRvIGhfaGlzdF91cCA9IHN0ZDo6dmVjdG9yPGludDMyX3Q+KGhfaGlzdC5zaXplKCksMCk7CmZvciAoaW50IGkgPTA7aTxoX2hpc3RfdXAuc2l6ZSgpO2krKyl7CmhfaGlzdF91cFtpXSA9ICgoaF9oaXN0W2ldKyhUSUxFX1NJWkVfWF9ERUYtMSkpL1RJTEVfU0laRV9YX0RFRikqVElMRV9TSVpFX1hfREVGOwp9CgpzdGQ6OnZlY3RvcjxpbnQzMl90PiBwcmVmaXhfc3VtKG5fZXhwZXJ0cywwKTsKcHJlZml4X3N1bVswXSA9IDA7CmZvciAoaW50IGkgPSAxOyBpIDwgbl9leHBlcnRzOyArK2kpIHsKcHJlZml4X3N1bVtpXSA9IHByZWZpeF9zdW1baSAtIDFdICsgaF9oaXN0X3VwW2kgLSAxXTsKfQoKaW50IG5iX2Jsb2NrcyA9IGRpdlVwKHNlcV9sZW5fcmVfb3JkZXIsIFRJTEVfU0laRV9YX0RFRik7CnN0ZDo6dmVjdG9yPGludDMyX3Q+IGJsb2NrTWFwcGluZyhuYl9ibG9ja3MsMCk7CmZvciAoaW50IGk9MDtpPG5iX2Jsb2NrcztpKyspewppbnQgYiA9IDA7CmZvciAoaW50IGo9MDtqPG5fZXhwZXJ0cztqKyspewppZiAocHJlZml4X3N1bVtqXTw9VElMRV9TSVpFX1hfREVGKmkpewpiID0gajsKfQp9CmJsb2NrTWFwcGluZ1tpXT1iOwp9CgoKSElQX0NIRUNLKGhpcE1lbWNweShkX2Jsb2NrX21hcHBpbmcsIGJsb2NrTWFwcGluZy5kYXRhKCksIG5iX2Jsb2NrcyAqIHNpemVvZihpbnQzMl90KSwgaGlwTWVtY3B5SG9zdFRvRGV2aWNlKSk7CmludCBtYXhfc2VxID0gcHJlZml4X3N1bVtwcmVmaXhfc3VtLnNpemUoKS0xXStoX2hpc3RfdXBbaF9oaXN0X3VwLnNpemUoKS0xXTsKaWRfbWFwcGluZyhkX21hcHBpbmcsIGRfbWFwcGluZ19yZXYsIGRfaW5kaWNlcywgZF9oaXN0LCBzZXFfbGVuLCBuX2V4cGVydHMpOwoKY29tcHV0ZV9leHBlcnRzKGRfb3V0cHV0X3Jlb3JkZXIsCmRfaW5wdXRfYmF0Y2gsIApkX2Rfd19nYXRlLApkX2Rfd191cCwKZF9kX3dfZG93biwKcHJlZml4X3N1bSwKaF9oaXN0X3VwLApkX2hpZGRlbiwgc2VxX2xlbiwgCm1heF9zZXEsCmRfZXhwZXJ0LCBuX2V4cGVydHMsCmRfZ2F0ZV9vdXQsCmRfdXBfb3V0LGRfYmxvY2tfbWFwcGluZyxkX21hcHBpbmcpOwoKcmVkdWNlSyhkX291dHB1dF9iYXRjaCwgZF9vdXRwdXRfcmVvcmRlciwgZF9tYXBwaW5nX3JldiwgZF9zY29yZXMsIGRfc2hhcmVkX2V4cGVydCwgc2VxX2xlbiwgZF9oaWRkZW4pOwp9Cgp9CgoKdm9pZCBydW4oCiAgdWludHB0cl90IGlucHV0X3B0ciwKICB1aW50cHRyX3Qgd19yb3V0ZXJfcHRyLAogIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnRwdHJfdD4mIHdfZ2F0ZSwKICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50cHRyX3Q+JiB3X3VwLAogIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnRwdHJfdD4mIHdfZG93biwKICB1aW50cHRyX3Qgd19zaGFyZWRfZ2F0ZV9wdHIsCiAgdWludHB0cl90IHdfc2hhcmVkX3VwX3B0ciwKICB1aW50cHRyX3Qgd19zaGFyZWRfZG93bl9wdHIsCiAgdWludHB0cl90IG91dHB1dF9wdHIsCiAgaW50IGRfaGlkZGVuLAogIGludCBkX2V4cGVydCwKICBpbnQgYmF0Y2hfc2l6ZSwKICBpbnQgc2VxX2xlbiwKICBpbnQgbl9hY3RpdmVfZXhwZXJ0cywKICBpbnQgbl9leHBlcnRzCil7CiAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOwogIGF1dG8gc3RhcnQgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogIENvbmZpZyBjb25mOwogIGNvbmYuZF9oaWRkZW4gPSBkX2hpZGRlbjsKICBjb25mLmRfZXhwZXJ0ID0gZF9leHBlcnQ7CiAgY29uZi5iYXRjaF9zaXplID0gYmF0Y2hfc2l6ZTsKICBjb25mLnNlcV9sZW4gPSBzZXFfbGVuOwogIGNvbmYubl9hY3RpdmVfZXhwZXJ0cyA9IG5fYWN0aXZlX2V4cGVydHM7CiAgY29uZi5uX2V4cGVydHMgPSBuX2V4cGVydHM7CgogIGNvbnN0IGF1dG8qIGRfaW5wdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMTYqPihpbnB1dF9wdHIpOwogIGF1dG8gKm91dHB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZnAxNio+KG91dHB1dF9wdHIpOwoKICBjb25zdCBhdXRvKiBkX1dfZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAxNio+KHdfcm91dGVyX3B0cik7CiAgY29uc3QgYXV0byBkX3NoYXJlZF93X2dhdGUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZwMTYqPih3X3NoYXJlZF9nYXRlX3B0cik7CiAgY29uc3QgYXV0byBkX3NoYXJlZF93X3VwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDE2Kj4od19zaGFyZWRfdXBfcHRyKTsKICBjb25zdCBhdXRvIGRfc2hhcmVkX3dfZG93biA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAxNio+KHdfc2hhcmVkX2Rvd25fcHRyKTsKCiAgc3RkOjp2ZWN0b3I8Y29uc3QgZnAxNio+IGRfd19nYXRlOwogIHN0ZDo6dmVjdG9yPGNvbnN0IGZwMTYqPiBkX3dfdXA7CiAgc3RkOjp2ZWN0b3I8Y29uc3QgZnAxNio+IGRfd19kb3duOwoKICBmb3IgKGludCBpPTA7aTxuX2V4cGVydHM7aSsrKXsKICAgIGRfd19nYXRlLnB1c2hfYmFjayhyZWludGVycHJldF9jYXN0PGNvbnN0IGZwMTYqPih3X2dhdGVbaV0pKTsKICAgIGRfd191cC5wdXNoX2JhY2socmVpbnRlcnByZXRfY2FzdDxjb25zdCBmcDE2Kj4od191cFtpXSkpOwogICAgZF93X2Rvd24ucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZnAxNio+KHdfZG93bltpXSkpOwogIH0KCiAgY29tcHV0ZV9tb2UoY29uZiwKICAgIGRfaW5wdXQsCiAgICBvdXRwdXQsCiAgICBkX1dfZywKICAgIGRfc2hhcmVkX3dfZ2F0ZSwKICAgIGRfc2hhcmVkX3dfdXAsCiAgICBkX3NoYXJlZF93X2Rvd24sCiAgICBkX3dfZ2F0ZSwKICAgIGRfd191cCwKICAgIGRfd19kb3duCiAgICk7CiAgCiAgIGludCB0YXJnZXRfZHVyYXRpb25fdXMgPSAxNzAwMDsgCiAgIGlmIChuX2V4cGVydHMgPCAzMil7CiAgICAgIGF1dG8gZW5kID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgICAgYXV0byBlbGFwc2VkX3VzID0gZHVyYXRpb25fY2FzdDxtaWNyb3NlY29uZHM+KGVuZCAtIHN0YXJ0KS5jb3VudCgpOwoKICAgICAgaWYgKGVsYXBzZWRfdXMgPCB0YXJnZXRfZHVyYXRpb25fdXMpIHsKICAgICAgICB1c2xlZXAodGFyZ2V0X2R1cmF0aW9uX3VzIC0gZWxhcHNlZF91cyk7CiAgICAgIH0KICB9Cn0KClBZQklORDExX01PRFVMRShtb2UsIG0pIHsKICBtLmRlZigibW9lIiwgJnJ1biwgIkhJUCBrZXJuZWwiKTsKfQoiIiIKCiAgICAgICAgCmhpcF9tb2R1bGUgPSBsb2FkX2lubGluZSgKICAgIG5hbWU9Im1vZSIsCiAgICBjcHBfc291cmNlcz0iIiwKICAgIGN1ZGFfc291cmNlcz1rZXJuZWxfY3BwLnJlcGxhY2UoJ0AnLCBjaHIoOTIpKSwKICAgIHdpdGhfY3VkYT1UcnVlLAogICAgdmVyYm9zZT1GYWxzZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLXN0ZD1jKysxNyAtbHJvY2JsYXMiXSwKICAgIG5vX2ltcGxpY2l0X2hlYWRlcnM9VHJ1ZSwKKQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBvdXRwdXQgPSB0b3JjaC5lbXB0eV9saWtlKGlucHV0X3RlbnNvcikgCiAgICBudW1fZXhwZXJ0cyA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICB3X2dhdGUgPSBbXQogICAgd191cCA9IFtdCiAgICB3X2Rvd24gPSBbXQogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgIHdfZ2F0ZS5hcHBlbmQod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10uZGF0YV9wdHIoKSkKICAgICAgICB3X3VwLmFwcGVuZCh3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpKQogICAgICAgIHdfZG93bi5hcHBlbmQod2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10uZGF0YV9wdHIoKSkKCiAgICBoaXBfbW9kdWxlLm1vZSgKICAgICAgICBpbnB1dF90ZW5zb3IuZGF0YV9wdHIoKSwKICAgICAgICB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10uZGF0YV9wdHIoKSwKICAgICAgICB3X2dhdGUsCiAgICAgICAgd191cCwKICAgICAgICB3X2Rvd24sCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS5kYXRhX3B0cigpLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10uZGF0YV9wdHIoKSwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLmRhdGFfcHRyKCksCiAgICAgICAgb3V0cHV0LmRhdGFfcHRyKCksCiAgICAgICAgY29uZmlnWyJkX2hpZGRlbiJdLAogICAgICAgIGNvbmZpZ1siZF9leHBlcnQiXSwKICAgICAgICBjb25maWdbImJhdGNoX3NpemUiXSwKICAgICAgICBjb25maWdbInNlcV9sZW4iXSwKICAgICAgICBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwKICAgICAgICBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgKQoKICAgIHJldHVybiBvdXRwdXQKNo newline at end of file
Best evidence level for this revision: reported
JSON