Skip to content
KernelIndex
Search⌘K

submission 18398

KernelBot user 160 · 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.

submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-18398?include=source"
interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp32, fp8_e4m3fnuz

Benchmark evidence

18 measurements across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 512]
AMD Instinct MI300X
46.3µs
#49 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 256]
AMD Instinct MI300X
47.3µs
#49 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
75.7µs
#57 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
130.4µs
#59 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
141.3µs
#66 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
165.1µs
#69 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
183.1µs
#67 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
238.4µs
#78 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
242.3µs
#70 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
244.7µs
#78 of 98
2025-05-08
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
248.9µs
#71 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
250.1µs
#51 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
252.2µs
#58 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
273.9µs
#57 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
553.4µs
#64 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
705.3µs
#72 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
787.0µs
#69 of 98
2025-05-08
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
1.60ms
#70 of 98
2025-05-08

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:3bf1ea392d2ad9cd7cbc14bed2ed98a912aac14e532f17a4b2dd06194ce68fca
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKCmN1ZGFfc3JjID0gciIiIgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fIGludCBjZGl2KGludCBhLCBpbnQgYikgewogIHJldHVybiAoYSArIGIgLSAxKSAvIGI7Cn0KCiNkZWZpbmUgQkxPQ0tfRElNIDEyOAoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX00oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IChudW1UaHJlYWRzIC8gQk4pICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gKG51bVRocmVhZHMgLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk4gPT0gMCwgIkJOIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTSA9PSAwLCAiQk0gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQoQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwgIlJhbmdlIGFib3ZlIDEyOCBpcyBub3Qgc3VwcG9ydGVkIik7CgogIHVpbnQzMl90IG51bVRpbGVzID0gY2RpdihOLCBCTikgKiBjZGl2KE0sIEJNKTsKCiAgZm9yICh1aW50MzJfdCB0aWxlSWR4ID0gYmxvY2tJZHgueDsgdGlsZUlkeCA8IG51bVRpbGVzOyB0aWxlSWR4ICs9IFNNX0NPVU5UKSB7CiAgICB1aW50MzJfdCByb3dPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE0sIEJNKSkgKiBCTjsKICAgIHVpbnQzMl90IGNvbE9mZnNldEMgPSAodGlsZUlkeCAlIGNkaXYoTSwgQk0pKSAqIEJNOwogICAgdWludDMyX3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgICB1aW50MzJfdCBjb2xPZmZzZXRCID0gY29sT2Zmc2V0QzsKICAgIHVpbnQzMl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogICAgdWludDMyX3QgaW5uZXJDb2xBID0gdGhyZWFkSWR4LnggJSBCTjsKICAgIHVpbnQzMl90IGlubmVyUm93QSA9ICh0aHJlYWRJZHgueCAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9ICh0aHJlYWRJZHgueCAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1tCTl1bQksgKyA0XSwgQnNbQk1dW0JLICsgNF07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzW0JOICsgMV07CgogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgZm9yICh1aW50MzJfdCB0aWxlT2Zmc2V0ID0gMDsgdGlsZU9mZnNldCA8IEs7IHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgLy8gbG9hZCBmcm9tIGdsb2JhbCB0byBzaGFyZWQgbWVtb3J5IGluIGNvYWxlc2NlZCBtYW5uZXIKICAgICAgZm9yICh1aW50MzJfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDIpICogTiArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKCiAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9ICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICB9CiAgICAgIGZvciAodWludDMyX3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgSyAmJgogICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKCiAgICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMikgKiBNICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwoKICAgICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0gKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgV3NbQk5dID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICAgIGxvbmcgYVtXSVRFUk5dLCBiW1dJVEVSTV07CiAgICAgIGZsb2F0IGJfc2NhbGUgPSBXc1tCTl07CiAgICAgIGZsb2F0eDE2IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgICAgZm9yICh1aW50MzJfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkFzW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZCc1t3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgICAgZFt3bl1bd21dW2kgKyBqICogNF0gKz0KICAgICAgICAgICAgICAgICAgY1t3bl1bd21dW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgICBXc1t3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaV0gKiBiX3NjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICB9CgogICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgaWYgKChyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpIDwKICAgICAgICAgICAgICAgICAgICBOICYmCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpIDwgTSkKICAgICAgICAgICAgICBDWyhyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpICoKICAgICAgICAgICAgICAgICAgICBNICsKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCldID0KICAgICAgICAgICAgICAgICAgKF9faGlwX2JmbG9hdDE2KWRbd25dW3dtXVtpICsgaiAqIDRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX04oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IChudW1UaHJlYWRzIC8gQk4pICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gKG51bVRocmVhZHMgLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk4gPT0gMCwgIkJOIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTSA9PSAwLCAiQk0gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQoQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwgIlJhbmdlIGFib3ZlIDEyOCBpcyBub3Qgc3VwcG9ydGVkIik7CgogIHVpbnQzMl90IG51bVRpbGVzID0gY2RpdihOLCBCTikgKiBjZGl2KE0sIEJNKTsKCiAgZm9yICh1aW50MzJfdCB0aWxlSWR4ID0gYmxvY2tJZHgueDsgdGlsZUlkeCA8IG51bVRpbGVzOyB0aWxlSWR4ICs9IFNNX0NPVU5UKSB7CiAgICB1aW50MzJfdCByb3dPZmZzZXRDID0gKHRpbGVJZHggJSBjZGl2KE4sIEJOKSkgKiBCTjsKICAgIHVpbnQzMl90IGNvbE9mZnNldEMgPSAodGlsZUlkeCAvIGNkaXYoTiwgQk4pKSAqIEJNOwogICAgdWludDMyX3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgICB1aW50MzJfdCBjb2xPZmZzZXRCID0gY29sT2Zmc2V0QzsKICAgIHVpbnQzMl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogICAgdWludDMyX3QgaW5uZXJDb2xBID0gdGhyZWFkSWR4LnggJSBCTjsKICAgIHVpbnQzMl90IGlubmVyUm93QSA9ICh0aHJlYWRJZHgueCAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9ICh0aHJlYWRJZHgueCAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1tCTl1bQksgKyA0XSwgQnNbQk1dW0JLICsgNF07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzW0JOICsgMV07CgogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgZm9yICh1aW50MzJfdCB0aWxlT2Zmc2V0ID0gMDsgdGlsZU9mZnNldCA8IEs7IHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgLy8gbG9hZCBmcm9tIGdsb2JhbCB0byBzaGFyZWQgbWVtb3J5IGluIGNvYWxlc2NlZCBtYW5uZXIKICAgICAgZm9yICh1aW50MzJfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDIpICogTiArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKCiAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9ICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICB9CiAgICAgIGZvciAodWludDMyX3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgSyAmJgogICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKCiAgICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMikgKiBNICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwoKICAgICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0gKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgV3NbQk5dID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICAgIGxvbmcgYVtXSVRFUk5dLCBiW1dJVEVSTV07CiAgICAgIGZsb2F0IGJfc2NhbGUgPSBXc1tCTl07CiAgICAgIGZsb2F0eDE2IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgICAgZm9yICh1aW50MzJfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkFzW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZCc1t3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgICAgZFt3bl1bd21dW2kgKyBqICogNF0gKz0KICAgICAgICAgICAgICAgICAgY1t3bl1bd21dW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgICBXc1t3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaV0gKiBiX3NjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICB9CgogICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgaWYgKChyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpIDwKICAgICAgICAgICAgICAgICAgICBOICYmCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpIDwgTSkKICAgICAgICAgICAgICBDWyhyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpICoKICAgICAgICAgICAgICAgICAgICBNICsKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCldID0KICAgICAgICAgICAgICAgICAgKF9faGlwX2JmbG9hdDE2KWRbd25dW3dtXVtpICsgaiAqIDRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpIHsKICBpbnQgTiA9IEEuc2l6ZSgwKSwgSyA9IEEuc2l6ZSgxKSwgTSA9IEIuc2l6ZSgwKTsKCiAgY29uc3QgaW50IEJLID0gMTI4OwogIGNvbnN0IGludCBCTiA9IDEyODsKICBjb25zdCBpbnQgQk0gPSAxMjg7CiAgY29uc3QgaW50IFdJVEVSTiA9IDE7CiAgY29uc3QgaW50IFdJVEVSTSA9IDE7CiAgY29uc3QgaW50IFNNX0NPVU5UID0gMzA0OwogIGRpbTMgbnVtVGhyZWFkcygoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pKTsKICBkaW0zIG51bUJsb2NrcyhTTV9DT1VOVCk7CiAgLy9kaW0zIG51bUJsb2NrcyhjZGl2KE0sIEJNKSwgY2RpdihOLCBCTikpOwogIGlmIChOID4gTSkgewogICAgICBmcDhfbW1fa2VybmVsX048Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5UPjw8PG51bUJsb2NrcywgbnVtVGhyZWFkcz4+PigKICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUIuZGF0YV9wdHIoKSwKICAgICAgICAgIEFfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgICAgICAoX19oaXBfYmZsb2F0MTYgKilDLmRhdGFfcHRyKCksIE4sIEssIE0pOwogIH0gZWxzZSB7CiAgICAgIGZwOF9tbV9rZXJuZWxfTTxCTiwgQkssIEJNLCBXSVRFUk4sIFdJVEVSTSwgU01fQ09VTlQ+PDw8bnVtQmxvY2tzLCBudW1UaHJlYWRzPj4+KAogICAgICAgICAgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilBLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQi5kYXRhX3B0cigpLAogICAgICAgICAgQV9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwgQl9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwKICAgICAgICAgIChfX2hpcF9iZmxvYXQxNiAqKUMuZGF0YV9wdHIoKSwgTiwgSywgTSk7CiAgfQogIHJldHVybiBDOwp9CiIiIgoKY3BwX3NyYyA9IHIiIiIKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpOwoiIiIKCmlmIHN5cy5zdGRvdXQgaXMgTm9uZToKICAgIHN5cy5zdGRvdXQgPSBvcGVuKCIvZGV2L3N0ZG91dCIsICJ3IikKaWYgc3lzLnN0ZGVyciBpcyBOb25lOgogICAgc3lzLnN0ZGVyciA9IG9wZW4oIi9kZXYvc3RkZXJyIiwgInciKQoKbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDhfbW0iLAogICAgY3BwX3NvdXJjZXM9W2NwcF9zcmNdLAogICAgY3VkYV9zb3VyY2VzPVtjdWRhX3NyY10sCiAgICBmdW5jdGlvbnM9WyJmcDhfbW0iXSwKICAgIHZlcmJvc2U9VHJ1ZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsKICAgICAgICAiLU9mYXN0IiwKICAgICAgICAiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwKICAgICAgICAiLXN0ZD1jKysyMCIsCiAgICAgICAgIi1mZnAtY29udHJhY3Q9ZmFzdCIsCiAgICAgICAgIi1saGlwX2hjYyIsCiAgICAgICAgICItbWN1bW9kZSIsCiAgICBdLAopCgoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKICAgIHJldHVybiBtb2R1bGUuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpCg==

Source 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 submission 13557.

- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKCmN1ZGFfc3JjID0gciIiIgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fIGludCBjZGl2KGludCBhLCBpbnQgYikgewogIHJldHVybiAoYSArIGIgLSAxKSAvIGI7Cn0KCiNkZWZpbmUgQkxPQ0tfRElNIDEyOAoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX04oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgU1VCQk4gPSBCTiAvIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgU1VCQk0gPSBCTSAvIFZFQ1RPUl9TSVpFOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IG51bVRocmVhZHMgLyBTVUJCTjsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUIgPSBudW1UaHJlYWRzIC8gU1VCQk07CgogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJOID09IDAsICJCTiBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk0gPT0gMCwgIkJNIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KEJLIDw9IDEyOCAmJiBCTSA8PSAxMjgsICJSYW5nZSBhYm92ZSAxMjggaXMgbm90IHN1cHBvcnRlZCIpOwoKICB1aW50MzJfdCBudW1UaWxlcyA9IGNkaXYoTiwgQk4pICogY2RpdihNLCBCTSk7CgogIGZvciAodWludDMyX3QgdGlsZUlkeCA9IGJsb2NrSWR4Lng7IHRpbGVJZHggPCBudW1UaWxlczsgdGlsZUlkeCArPSBTTV9DT1VOVCkgewogICAgdWludDMyX3Qgcm93T2Zmc2V0QyA9ICh0aWxlSWR4ICUgY2RpdihOLCBCTikpICogQk47CiAgICB1aW50MzJfdCBjb2xPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE4sIEJOKSkgKiBCTTsKICAgIHVpbnQzMl90IGNvbE9mZnNldEEgPSByb3dPZmZzZXRDOwogICAgdWludDMyX3QgY29sT2Zmc2V0QiA9IGNvbE9mZnNldEM7CiAgICB1aW50MzJfdCBNX3NjYWxlID0gY2RpdihNLCBCTE9DS19ESU0pOwoKICAgIHVpbnQzMl90IGlubmVyQ29sQSA9IHRocmVhZElkeC54ICUgU1VCQk47CiAgICB1aW50MzJfdCBpbm5lclJvd0EgPSB0aHJlYWRJZHgueCAvIFNVQkJOOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBTVUJCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9IHRocmVhZElkeC54IC8gU1VCQk07CgogICAgdWludDMyX3QgbGFuZUlkeCA9IHRocmVhZElkeC54ICUgV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwSWR4ID0gdGhyZWFkSWR4LnggLyBXQVJQU0laRTsKICAgIHVpbnQzMl90IHdhcnBDb2xPZmZzZXQgPSAod2FycElkeCAlIChCTSAvIFdNKSkgKiBXTTsKICAgIHVpbnQzMl90IHdhcnBSb3dPZmZzZXQgPSAod2FycElkeCAvIChCTSAvIFdNKSkgKiBXTjsKICAgIHVpbnQzMl90IHdhcnBYID0gbGFuZUlkeCAlIDMyOwogICAgdWludDMyX3Qgd2FycFkgPSBsYW5lSWR4IC8gMzI7CgogICAgX19zaGFyZWRfXyBfX2hpcF9mcDhfZTRtM19mbnV6IEFzW0JLXVtCTl0sIEJzW0JLXVtCTV07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzW0JOICsgMV07CgogICAgX19oaXBfZnA4X2U0bTNfZm51eiBhW1dJVEVSTl1bOF0sIGJbV0lURVJNXVs4XTsKICAgIGZsb2F0eDE2IGRbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgIGZvciAodWludDMyX3QgdGlsZU9mZnNldCA9IDA7IHRpbGVPZmZzZXQgPCBLOyB0aWxlT2Zmc2V0ICs9IEJLKSB7CiAgICAgIC8vIGxvYWQgZnJvbSBnbG9iYWwgdG8gc2hhcmVkIG1lbW9yeSBpbiBjb2FsZXNjZWQgbWFubmVyCiAgICAgIGZvciAodWludDMyX3QgaW5uZXJSb3dPZmZzZXQgPSAwOyBpbm5lclJvd09mZnNldCA8IEJLOwogICAgICAgICAgIGlubmVyUm93T2Zmc2V0ICs9IHN0cmlkZUEpIHsKICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldCArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBICogVkVDVE9SX1NJWkUpIDwgTiAmJgogICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICZBc1tpbm5lclJvd09mZnNldCArIGlubmVyUm93QV1baW5uZXJDb2xBICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpICogTiArCiAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBICogVkVDVE9SX1NJWkUpXSk7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpIDwgQkspIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICZBc1tpbm5lclJvd09mZnNldCArIGlubmVyUm93QV1baW5uZXJDb2xBICogVkVDVE9SX1NJWkVdKSA9IDAuMGY7CiAgICAgICAgfQogICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dCKSA8IEsgJiYKICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIgKiBWRUNUT1JfU0laRSkgPCBNICYmCiAgICAgICAgICAgIChpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgPCBCSykgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkJzW2lubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dCXVtpbm5lckNvbEIgKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCAqPigKICAgICAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgKiBNICsKICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIgKiBWRUNUT1JfU0laRSldKTsKICAgICAgICB9IGVsc2UgaWYgKChpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgPCBCSyAmJgogICAgICAgICAgICAgICAgICAgKGlubmVyQ29sQiAqIFZFQ1RPUl9TSVpFKSA8IEJNKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0JdW2lubmVyQ29sQiAqIFZFQ1RPUl9TSVpFXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhyZWFkSWR4LnggPCBTVUJCTikgewogICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0NCAqPigmV3NbdGhyZWFkSWR4LnggKiBWRUNUT1JfU0laRV0pID0KICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQ0ICo+KAogICAgICAgICAgICAgICAgJkFfc2NhbGVbKHRpbGVPZmZzZXQgLyBCTE9DS19ESU0pICogTiArCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIHRocmVhZElkeC54ICogVkVDVE9SX1NJWkUpXSk7CiAgICAgIH0KICAgICAgaWYgKHRocmVhZElkeC54ID09IG51bVRocmVhZHMgLSAxKSB7IC8vIGxvYWQgdXNpbmcgZGlmZmVyZW50IHdhcnAKICAgICAgICBXc1tCTl0gPSBCX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE1fc2NhbGUgKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgLyBCTE9DS19ESU0pXTsKICAgICAgfQogICAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgICBmbG9hdCBiX3NjYWxlID0gV3NbQk5dOwogICAgICBmbG9hdHgxNiBjW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKICAgICAgZm9yICh1aW50MzJfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgODsgKytpKSB7CiAgICAgICAgICAgIGFbd25dW2ldID0KICAgICAgICAgICAgICAgIEFzW0JLT2Zmc2V0ICsgd2FycFkgKiA4ICsgaV1bd2FycFJvd09mZnNldCArIHduICogMzIgKyB3YXJwWF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDg7ICsraSkgewogICAgICAgICAgICBiW3dtXVtpXSA9CiAgICAgICAgICAgICAgICBCc1tCS09mZnNldCArIHdhcnBZICogOCArIGldW3dhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KGFbd25dKSwKICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oYlt3bV0pLCBjW3duXVt3bV0sIDAsIDAsIDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICAgIGRbd25dW3dtXVtpICsgaiAqIDRdICs9CiAgICAgICAgICAgICAgICAgIGNbd25dW3dtXVtpICsgaiAqIDRdICoKICAgICAgICAgICAgICAgICAgV3Nbd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGldICogYl9zY2FsZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19zeW5jdGhyZWFkcygpOwogICAgfQoKICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgIGlmICgocm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSA8CiAgICAgICAgICAgICAgICAgICAgTiAmJgogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKSA8IE0pCiAgICAgICAgICAgICAgQ1socm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSAqCiAgICAgICAgICAgICAgICAgICAgTSArCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpXSA9CiAgICAgICAgICAgICAgICAgIChfX2hpcF9iZmxvYXQxNilkW3duXVt3bV1baSArIGogKiA0XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KCnRlbXBsYXRlIDxjb25zdCB1aW50MzJfdCBCTiwgY29uc3QgdWludDMyX3QgQkssIGNvbnN0IHVpbnQzMl90IEJNLAogICAgICAgICAgY29uc3QgdWludDMyX3QgV0lURVJOLCBjb25zdCB1aW50MzJfdCBXSVRFUk0sIGNvbnN0IHVpbnQzMl90IFNNX0NPVU5UPgpfX2dsb2JhbF9fIHZvaWQKZnA4X21tX2tlcm5lbF9NKGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkEsIGNvbnN0IF9faGlwX2ZwOF9lNG0zX2ZudXogKkIsCiAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsIF9faGlwX2JmbG9hdDE2ICpDLAogICAgICAgICAgICAgICAgdWludDMyX3QgTiwgdWludDMyX3QgSywgdWludDMyX3QgTSkgewogIHVzaW5nIGZsb2F0eDE2ID0gX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDE2ICogc2l6ZW9mKGZsb2F0KSkpKSBmbG9hdDsKCiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBWRUNUT1JfU0laRSA9IDQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXQVJQU0laRSA9IDY0OwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV04gPSAzMiAqIFdJVEVSTjsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdNID0gMzIgKiBXSVRFUk07CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBudW1UaHJlYWRzID0gKEJOICogQk0pIC8gKDE2ICogV0lURVJOICogV0lURVJNKTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFNVQkJOID0gQk4gLyBWRUNUT1JfU0laRTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFNVQkJNID0gQk0gLyBWRUNUT1JfU0laRTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IHN0cmlkZUEgPSBudW1UaHJlYWRzIC8gU1VCQk47CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gbnVtVGhyZWFkcyAvIFNVQkJNOwoKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTiA9PSAwLCAiQk4gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJNID09IDAsICJCTSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChCSyA8PSAxMjggJiYgQk0gPD0gMTI4LCAiUmFuZ2UgYWJvdmUgMTI4IGlzIG5vdCBzdXBwb3J0ZWQiKTsKCiAgdWludDMyX3QgbnVtVGlsZXMgPSBjZGl2KE4sIEJOKSAqIGNkaXYoTSwgQk0pOwoKICBmb3IgKHVpbnQzMl90IHRpbGVJZHggPSBibG9ja0lkeC54OyB0aWxlSWR4IDwgbnVtVGlsZXM7IHRpbGVJZHggKz0gU01fQ09VTlQpIHsKICAgIHVpbnQzMl90IHJvd09mZnNldEMgPSAodGlsZUlkeCAvIGNkaXYoTSwgQk0pKSAqIEJOOwogICAgdWludDMyX3QgY29sT2Zmc2V0QyA9ICh0aWxlSWR4ICUgY2RpdihNLCBCTSkpICogQk07CiAgICB1aW50MzJfdCBjb2xPZmZzZXRBID0gcm93T2Zmc2V0QzsKICAgIHVpbnQzMl90IGNvbE9mZnNldEIgPSBjb2xPZmZzZXRDOwogICAgdWludDMyX3QgTV9zY2FsZSA9IGNkaXYoTSwgQkxPQ0tfRElNKTsKCiAgICB1aW50MzJfdCBpbm5lckNvbEEgPSB0aHJlYWRJZHgueCAlIFNVQkJOOwogICAgdWludDMyX3QgaW5uZXJSb3dBID0gdGhyZWFkSWR4LnggLyBTVUJCTjsKICAgIHVpbnQzMl90IGlubmVyQ29sQiA9IHRocmVhZElkeC54ICUgU1VCQk07CiAgICB1aW50MzJfdCBpbm5lclJvd0IgPSB0aHJlYWRJZHgueCAvIFNVQkJNOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1tCS11bQk5dLCBCc1tCS11bQk1dOwogICAgX19zaGFyZWRfXyBmbG9hdCBXc1tCTiArIDFdOwoKICAgIF9faGlwX2ZwOF9lNG0zX2ZudXogYVtXSVRFUk5dWzhdLCBiW1dJVEVSTV1bOF07CiAgICBmbG9hdHgxNiBkW1dJVEVSTl1bV0lURVJNXSA9IHswfTsKCiAgICBmb3IgKHVpbnQzMl90IHRpbGVPZmZzZXQgPSAwOyB0aWxlT2Zmc2V0IDwgSzsgdGlsZU9mZnNldCArPSBCSykgewogICAgICAvLyBsb2FkIGZyb20gZ2xvYmFsIHRvIHNoYXJlZCBtZW1vcnkgaW4gY29hbGVzY2VkIG1hbm5lcgogICAgICBmb3IgKHVpbnQzMl90IGlubmVyUm93T2Zmc2V0ID0gMDsgaW5uZXJSb3dPZmZzZXQgPCBCSzsKICAgICAgICAgICBpbm5lclJvd09mZnNldCArPSBzdHJpZGVBKSB7CiAgICAgICAgaWYgKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSAqIFZFQ1RPUl9TSVpFKSA8IE4gJiYKICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQXNbaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0FdW2lubmVyQ29sQSAqIFZFQ1RPUl9TSVpFXSkgPQogICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KAogICAgICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dBKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dBKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQXNbaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0FdW2lubmVyQ29sQSAqIFZFQ1RPUl9TSVpFXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldCArIGlubmVyUm93QikgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCICogVkVDVE9SX1NJWkUpIDwgTSAmJgogICAgICAgICAgICAoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0IpIDwgQkspIHsKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0ICo+KAogICAgICAgICAgICAgICZCc1tpbm5lclJvd09mZnNldCArIGlubmVyUm93Ql1baW5uZXJDb2xCICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oCiAgICAgICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0IpICogTSArCiAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCICogVkVDVE9SX1NJWkUpXSk7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXQgKyBpbm5lclJvd0IpIDwgQksgJiYKICAgICAgICAgICAgICAgICAgIChpbm5lckNvbEIgKiBWRUNUT1JfU0laRSkgPCBCTSkgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkJzW2lubmVyUm93T2Zmc2V0ICsgaW5uZXJSb3dCXVtpbm5lckNvbEIgKiBWRUNUT1JfU0laRV0pID0gMC4wZjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHRocmVhZElkeC54IDwgU1VCQk4pIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICB9CiAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgV3NbQk5dID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICAgIH0KICAgICAgX19zeW5jdGhyZWFkcygpOwoKICAgICAgZmxvYXQgYl9zY2FsZSA9IFdzW0JOXTsKICAgICAgZmxvYXR4MTYgY1tXSVRFUk5dW1dJVEVSTV0gPSB7MH07CiAgICAgIGZvciAodWludDMyX3QgQktPZmZzZXQgPSAwOyBCS09mZnNldCA8IEJLOyBCS09mZnNldCArPSAxNikgewogICAgICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDg7ICsraSkgewogICAgICAgICAgICBhW3duXVtpXSA9CiAgICAgICAgICAgICAgICBBc1tCS09mZnNldCArIHdhcnBZICogOCArIGldW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA4OyArK2kpIHsKICAgICAgICAgICAgYlt3bV1baV0gPQogICAgICAgICAgICAgICAgQnNbQktPZmZzZXQgKyB3YXJwWSAqIDggKyBpXVt3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IHdtID0gMDsgd20gPCBXSVRFUk07ICsrd20pIHsKICAgICAgICAgICAgY1t3bl1bd21dID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8zMngzMngxNl9mcDhfZnA4KAogICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihhW3duXSksCiAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KGJbd21dKSwgY1t3bl1bd21dLCAwLCAwLCAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICBkW3duXVt3bV1baSArIGogKiA0XSArPQogICAgICAgICAgICAgICAgICBjW3duXVt3bV1baSArIGogKiA0XSAqCiAgICAgICAgICAgICAgICAgIFdzW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpXSAqIGJfc2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKICAgIH0KCiAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgZm9yICh1aW50MzJfdCB3bSA9IDA7IHdtIDwgV0lURVJNOyArK3dtKSB7CiAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgICBpZiAoKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgPAogICAgICAgICAgICAgICAgICAgIE4gJiYKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCkgPCBNKQogICAgICAgICAgICAgIENbKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaSkgKgogICAgICAgICAgICAgICAgICAgIE0gKwogICAgICAgICAgICAgICAgKGNvbE9mZnNldEMgKyB3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYKV0gPQogICAgICAgICAgICAgICAgICAoX19oaXBfYmZsb2F0MTYpZFt3bl1bd21dW2kgKyBqICogNF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgphdDo6VGVuc29yIGZwOF9tbShhdDo6VGVuc29yIEEsIGF0OjpUZW5zb3IgQiwgYXQ6OlRlbnNvciBBX3NjYWxlLAogICAgICAgICAgICAgICAgICBhdDo6VGVuc29yIEJfc2NhbGUsIGF0OjpUZW5zb3IgQykgewogIGludCBOID0gQS5zaXplKDApLCBLID0gQS5zaXplKDEpLCBNID0gQi5zaXplKDApOwoKICBjb25zdCBpbnQgQksgPSAxMjg7CiAgY29uc3QgaW50IEJOID0gMTI4OwogIGNvbnN0IGludCBCTSA9IDEyODsKICBjb25zdCBpbnQgV0lURVJOID0gMTsKICBjb25zdCBpbnQgV0lURVJNID0gMTsKICBjb25zdCBpbnQgU01fQ09VTlQgPSAzMDQ7CiAgZGltMyBudW1UaHJlYWRzKChCTiAqIEJNKSAvICgxNiAqIFdJVEVSTiAqIFdJVEVSTSkpOwogIGRpbTMgbnVtQmxvY2tzKFNNX0NPVU5UKTsKICBpZiAoTiA+IE0pIHsKICAgICAgZnA4X21tX2tlcm5lbF9OPEJOLCBCSywgQk0sIFdJVEVSTiwgV0lURVJNLCBTTV9DT1VOVD48PDxudW1CbG9ja3MsIG51bVRocmVhZHM+Pj4oCiAgICAgICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilCLmRhdGFfcHRyKCksCiAgICAgICAgICBBX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLCBCX3NjYWxlLmRhdGFfcHRyPGZsb2F0PigpLAogICAgICAgICAgKF9faGlwX2JmbG9hdDE2ICopQy5kYXRhX3B0cigpLCBOLCBLLCBNKTsKICB9IGVsc2UgewogICAgICBmcDhfbW1fa2VybmVsX008Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5UPjw8PG51bUJsb2NrcywgbnVtVGhyZWFkcz4+PigKICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUIuZGF0YV9wdHIoKSwKICAgICAgICAgIEFfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgICAgICAoX19oaXBfYmZsb2F0MTYgKilDLmRhdGFfcHRyKCksIE4sIEssIE0pOwogIH0KICByZXR1cm4gQzsKfQoiIiIKCmNwcF9zcmMgPSByIiIiCmF0OjpUZW5zb3IgZnA4X21tKGF0OjpUZW5zb3IgQSwgYXQ6OlRlbnNvciBCLCBhdDo6VGVuc29yIEFfc2NhbGUsCiAgICAgICAgICAgICAgICAgIGF0OjpUZW5zb3IgQl9zY2FsZSwgYXQ6OlRlbnNvciBDKTsKIiIiCgppZiBzeXMuc3Rkb3V0IGlzIE5vbmU6CiAgICBzeXMuc3Rkb3V0ID0gb3BlbigiL2Rldi9zdGRvdXQiLCAidyIpCmlmIHN5cy5zdGRlcnIgaXMgTm9uZToKICAgIHN5cy5zdGRlcnIgPSBvcGVuKCIvZGV2L3N0ZGVyciIsICJ3IikKCm1vZHVsZSA9IGxvYWRfaW5saW5lKAogICAgbmFtZT0iZnA4X21tIiwKICAgIGNwcF9zb3VyY2VzPVtjcHBfc3JjXSwKICAgIGN1ZGFfc291cmNlcz1bY3VkYV9zcmNdLAogICAgZnVuY3Rpb25zPVsiZnA4X21tIl0sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi1PMyIsICItLW9mZmxvYWQtYXJjaD1nZng5NDIiLCAiLXN0ZD1jKysyMCJdLAopCgoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjID0gZGF0YQogICAgcmV0dXJuIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykK
No newline at end of file
+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwppbXBvcnQgc3lzCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0b3JjaC51dGlscy5jcHBfZXh0ZW5zaW9uIGltcG9ydCBsb2FkX2lubGluZQoKb3MuZW52aXJvblsiQ1hYIl0gPSAiY2xhbmcrKyIKCmN1ZGFfc3JjID0gciIiIgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxoaXAvaGlwX3J1bnRpbWUuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfYmYxNi5oPgojaW5jbHVkZSA8aGlwL2FtZF9kZXRhaWwvYW1kX2hpcF9mcDguaD4KCl9faG9zdF9fIF9fZGV2aWNlX18gX19mb3JjZWlubGluZV9fIGludCBjZGl2KGludCBhLCBpbnQgYikgewogIHJldHVybiAoYSArIGIgLSAxKSAvIGI7Cn0KCiNkZWZpbmUgQkxPQ0tfRElNIDEyOAoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX00oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IChudW1UaHJlYWRzIC8gQk4pICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gKG51bVRocmVhZHMgLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk4gPT0gMCwgIkJOIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTSA9PSAwLCAiQk0gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQoQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwgIlJhbmdlIGFib3ZlIDEyOCBpcyBub3Qgc3VwcG9ydGVkIik7CgogIHVpbnQzMl90IG51bVRpbGVzID0gY2RpdihOLCBCTikgKiBjZGl2KE0sIEJNKTsKCiAgZm9yICh1aW50MzJfdCB0aWxlSWR4ID0gYmxvY2tJZHgueDsgdGlsZUlkeCA8IG51bVRpbGVzOyB0aWxlSWR4ICs9IFNNX0NPVU5UKSB7CiAgICB1aW50MzJfdCByb3dPZmZzZXRDID0gKHRpbGVJZHggLyBjZGl2KE0sIEJNKSkgKiBCTjsKICAgIHVpbnQzMl90IGNvbE9mZnNldEMgPSAodGlsZUlkeCAlIGNkaXYoTSwgQk0pKSAqIEJNOwogICAgdWludDMyX3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgICB1aW50MzJfdCBjb2xPZmZzZXRCID0gY29sT2Zmc2V0QzsKICAgIHVpbnQzMl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogICAgdWludDMyX3QgaW5uZXJDb2xBID0gdGhyZWFkSWR4LnggJSBCTjsKICAgIHVpbnQzMl90IGlubmVyUm93QSA9ICh0aHJlYWRJZHgueCAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9ICh0aHJlYWRJZHgueCAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1tCTl1bQksgKyA0XSwgQnNbQk1dW0JLICsgNF07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzW0JOICsgMV07CgogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgZm9yICh1aW50MzJfdCB0aWxlT2Zmc2V0ID0gMDsgdGlsZU9mZnNldCA8IEs7IHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgLy8gbG9hZCBmcm9tIGdsb2JhbCB0byBzaGFyZWQgbWVtb3J5IGluIGNvYWxlc2NlZCBtYW5uZXIKICAgICAgZm9yICh1aW50MzJfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDIpICogTiArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKCiAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9ICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICB9CiAgICAgIGZvciAodWludDMyX3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgSyAmJgogICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKCiAgICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMikgKiBNICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwoKICAgICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0gKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgV3NbQk5dID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICAgIGxvbmcgYVtXSVRFUk5dLCBiW1dJVEVSTV07CiAgICAgIGZsb2F0IGJfc2NhbGUgPSBXc1tCTl07CiAgICAgIGZsb2F0eDE2IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgICAgZm9yICh1aW50MzJfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkFzW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZCc1t3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgICAgZFt3bl1bd21dW2kgKyBqICogNF0gKz0KICAgICAgICAgICAgICAgICAgY1t3bl1bd21dW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgICBXc1t3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaV0gKiBiX3NjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICB9CgogICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgaWYgKChyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpIDwKICAgICAgICAgICAgICAgICAgICBOICYmCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpIDwgTSkKICAgICAgICAgICAgICBDWyhyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpICoKICAgICAgICAgICAgICAgICAgICBNICsKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCldID0KICAgICAgICAgICAgICAgICAgKF9faGlwX2JmbG9hdDE2KWRbd25dW3dtXVtpICsgaiAqIDRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKdGVtcGxhdGUgPGNvbnN0IHVpbnQzMl90IEJOLCBjb25zdCB1aW50MzJfdCBCSywgY29uc3QgdWludDMyX3QgQk0sCiAgICAgICAgICBjb25zdCB1aW50MzJfdCBXSVRFUk4sIGNvbnN0IHVpbnQzMl90IFdJVEVSTSwgY29uc3QgdWludDMyX3QgU01fQ09VTlQ+Cl9fZ2xvYmFsX18gdm9pZApmcDhfbW1fa2VybmVsX04oY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQSwgY29uc3QgX19oaXBfZnA4X2U0bTNfZm51eiAqQiwKICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpBX3NjYWxlLCBjb25zdCBmbG9hdCAqQl9zY2FsZSwgX19oaXBfYmZsb2F0MTYgKkMsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBOLCB1aW50MzJfdCBLLCB1aW50MzJfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFZFQ1RPUl9TSVpFID0gNDsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFdBUlBTSVpFID0gNjQ7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBXTiA9IDMyICogV0lURVJOOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgV00gPSAzMiAqIFdJVEVSTTsKICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IG51bVRocmVhZHMgPSAoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pOwogIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qgc3RyaWRlQSA9IChudW1UaHJlYWRzIC8gQk4pICogVkVDVE9SX1NJWkU7CiAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBzdHJpZGVCID0gKG51bVRocmVhZHMgLyBCTSkgKiBWRUNUT1JfU0laRTsKCiAgc3RhdGljX2Fzc2VydChudW1UaHJlYWRzICUgQk4gPT0gMCwgIkJOIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIG51bVRocmVhZHMiKTsKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTSA9PSAwLCAiQk0gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQoQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwgIlJhbmdlIGFib3ZlIDEyOCBpcyBub3Qgc3VwcG9ydGVkIik7CgogIHVpbnQzMl90IG51bVRpbGVzID0gY2RpdihOLCBCTikgKiBjZGl2KE0sIEJNKTsKCiAgZm9yICh1aW50MzJfdCB0aWxlSWR4ID0gYmxvY2tJZHgueDsgdGlsZUlkeCA8IG51bVRpbGVzOyB0aWxlSWR4ICs9IFNNX0NPVU5UKSB7CiAgICB1aW50MzJfdCByb3dPZmZzZXRDID0gKHRpbGVJZHggJSBjZGl2KE4sIEJOKSkgKiBCTjsKICAgIHVpbnQzMl90IGNvbE9mZnNldEMgPSAodGlsZUlkeCAvIGNkaXYoTiwgQk4pKSAqIEJNOwogICAgdWludDMyX3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgICB1aW50MzJfdCBjb2xPZmZzZXRCID0gY29sT2Zmc2V0QzsKICAgIHVpbnQzMl90IE1fc2NhbGUgPSBjZGl2KE0sIEJMT0NLX0RJTSk7CgogICAgdWludDMyX3QgaW5uZXJDb2xBID0gdGhyZWFkSWR4LnggJSBCTjsKICAgIHVpbnQzMl90IGlubmVyUm93QSA9ICh0aHJlYWRJZHgueCAvIEJOKSAqIFZFQ1RPUl9TSVpFOwogICAgdWludDMyX3QgaW5uZXJDb2xCID0gdGhyZWFkSWR4LnggJSBCTTsKICAgIHVpbnQzMl90IGlubmVyUm93QiA9ICh0aHJlYWRJZHgueCAvIEJNKSAqIFZFQ1RPUl9TSVpFOwoKICAgIHVpbnQzMl90IGxhbmVJZHggPSB0aHJlYWRJZHgueCAlIFdBUlBTSVpFOwogICAgdWludDMyX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgICB1aW50MzJfdCB3YXJwQ29sT2Zmc2V0ID0gKHdhcnBJZHggJSAoQk0gLyBXTSkpICogV007CiAgICB1aW50MzJfdCB3YXJwUm93T2Zmc2V0ID0gKHdhcnBJZHggLyAoQk0gLyBXTSkpICogV047CiAgICB1aW50MzJfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICAgIHVpbnQzMl90IHdhcnBZID0gbGFuZUlkeCAvIDMyOwoKICAgIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1tCTl1bQksgKyA0XSwgQnNbQk1dW0JLICsgNF07CiAgICBfX3NoYXJlZF9fIGZsb2F0IFdzW0JOICsgMV07CgogICAgZmxvYXR4MTYgZFtXSVRFUk5dW1dJVEVSTV0gPSB7MH07CgogICAgZm9yICh1aW50MzJfdCB0aWxlT2Zmc2V0ID0gMDsgdGlsZU9mZnNldCA8IEs7IHRpbGVPZmZzZXQgKz0gQkspIHsKICAgICAgLy8gbG9hZCBmcm9tIGdsb2JhbCB0byBzaGFyZWQgbWVtb3J5IGluIGNvYWxlc2NlZCBtYW5uZXIKICAgICAgZm9yICh1aW50MzJfdCBpbm5lclJvd09mZnNldEEgPSAwOyBpbm5lclJvd09mZnNldEEgPCBCSzsKICAgICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICAgIGlmICgodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBLICYmCiAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKSA8IE4gJiYKICAgICAgICAgICAgKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgdWludDhfdCB4ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKICAgICAgICAgIHVpbnQ4X3QgeSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkFbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EgKyAxKSAqIE4gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRBICsgaW5uZXJDb2xBKV0pOwogICAgICAgICAgdWludDhfdCB6ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSArIDIpICogTiArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEpXSk7CiAgICAgICAgICB1aW50OF90IHcgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZBWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBICsgMykgKiBOICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSldKTsKCiAgICAgICAgICB1bnNpZ25lZCBpbnQgcGFjayA9ICh3ICYgMHhmZikgPDwgMjQgfCAoeiAmIDB4ZmYpIDw8IDE2IHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgJiAweGZmKSA8PCA4IHwgKHggJiAweGZmKTsKCiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBpbnQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSBwYWNrOwogICAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSykgewogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oCiAgICAgICAgICAgICAgJkFzW2lubmVyQ29sQV1baW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXSkgPSAwLjBmOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdDQgKj4oJldzW3RocmVhZElkeC54ICogVkVDVE9SX1NJWkVdKSA9CiAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0NCAqPigKICAgICAgICAgICAgICAgICZBX3NjYWxlWyh0aWxlT2Zmc2V0IC8gQkxPQ0tfRElNKSAqIE4gKwogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEEgKyB0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFKV0pOwogICAgICB9CiAgICAgIGZvciAodWludDMyX3QgaW5uZXJSb3dPZmZzZXRCID0gMDsgaW5uZXJSb3dPZmZzZXRCIDwgQks7CiAgICAgICAgICAgaW5uZXJSb3dPZmZzZXRCICs9IHN0cmlkZUIpIHsKICAgICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgSyAmJgogICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgPCBNICYmCiAgICAgICAgICAgIChpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgQkspIHsKCiAgICAgICAgICB1aW50OF90IHggPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwogICAgICAgICAgdWludDhfdCB5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigKICAgICAgICAgICAgICAmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QiArIDEpICogTSArCiAgICAgICAgICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpXSk7CiAgICAgICAgICB1aW50OF90IHogPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KAogICAgICAgICAgICAgICZCWyh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCICsgMikgKiBNICsKICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQildKTsKICAgICAgICAgIHVpbnQ4X3QgdyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oCiAgICAgICAgICAgICAgJkJbKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IgKyAzKSAqIE0gKwogICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCICsgaW5uZXJDb2xCKV0pOwoKICAgICAgICAgIHVuc2lnbmVkIGludCBwYWNrID0gKHcgJiAweGZmKSA8PCAyNCB8ICh6ICYgMHhmZikgPDwgMTYgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSAmIDB4ZmYpIDw8IDggfCAoeCAmIDB4ZmYpOwoKICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGludCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IHBhY2s7CiAgICAgICAgfSBlbHNlIGlmICgoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLKSB7CiAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPigKICAgICAgICAgICAgICAmQnNbaW5uZXJDb2xCXVtpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0JdKSA9IDAuMGY7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0aHJlYWRJZHgueCA9PSBudW1UaHJlYWRzIC0gMSkgeyAvLyBsb2FkIHVzaW5nIGRpZmZlcmVudCB3YXJwCiAgICAgICAgV3NbQk5dID0gQl9zY2FsZVsodGlsZU9mZnNldCAvIEJMT0NLX0RJTSkgKiBNX3NjYWxlICsKICAgICAgICAgICAgICAgICAgICAgICAgIChjb2xPZmZzZXRCIC8gQkxPQ0tfRElNKV07CiAgICAgIH0KCiAgICAgIF9fc3luY3RocmVhZHMoKTsKCiAgICAgIGxvbmcgYVtXSVRFUk5dLCBiW1dJVEVSTV07CiAgICAgIGZsb2F0IGJfc2NhbGUgPSBXc1tCTl07CiAgICAgIGZsb2F0eDE2IGNbV0lURVJOXVtXSVRFUk1dID0gezB9OwoKICAgICAgZm9yICh1aW50MzJfdCBCS09mZnNldCA9IDA7IEJLT2Zmc2V0IDwgQks7IEJLT2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgICAgICBhW3duXSA9ICpyZWludGVycHJldF9jYXN0PGxvbmcgKj4oCiAgICAgICAgICAgICAgJkFzW3dhcnBSb3dPZmZzZXQgKyB3biAqIDMyICsgd2FycFhdW0JLT2Zmc2V0ICsgd2FycFkgKiA4XSk7CiAgICAgICAgfQogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgYlt3bV0gPSAqcmVpbnRlcnByZXRfY2FzdDxsb25nICo+KAogICAgICAgICAgICAgICZCc1t3YXJwQ29sT2Zmc2V0ICsgd20gKiAzMiArIHdhcnBYXVtCS09mZnNldCArIHdhcnBZICogOF0pOwogICAgICAgIH0KICAgICAgICBmb3IgKHVpbnQzMl90IHduID0gMDsgd24gPCBXSVRFUk47ICsrd24pIHsKICAgICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgICBjW3duXVt3bV0gPSBfX2J1aWx0aW5fYW1kZ2NuX21mbWFfZjMyXzMyeDMyeDE2X2ZwOF9mcDgoCiAgICAgICAgICAgICAgICBhW3duXSwgYlt3bV0sIGNbd25dW3dtXSwgMCwgMCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodWludDMyX3Qgd24gPSAwOyB3biA8IFdJVEVSTjsgKyt3bikgewogICAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IDQ7ICsraikgewogICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgICAgZFt3bl1bd21dW2kgKyBqICogNF0gKz0KICAgICAgICAgICAgICAgICAgY1t3bl1bd21dW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgICBXc1t3YXJwUm93T2Zmc2V0ICsgd24gKiAzMiArIGogKiA4ICsgd2FycFkgKiA0ICsgaV0gKiBiX3NjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3N5bmN0aHJlYWRzKCk7CiAgICB9CgogICAgZm9yICh1aW50MzJfdCB3biA9IDA7IHduIDwgV0lURVJOOyArK3duKSB7CiAgICAgIGZvciAodWludDMyX3Qgd20gPSAwOyB3bSA8IFdJVEVSTTsgKyt3bSkgewogICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCA0OyArK2opIHsKICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgaWYgKChyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpIDwKICAgICAgICAgICAgICAgICAgICBOICYmCiAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3bSAqIDMyICsgd2FycFgpIDwgTSkKICAgICAgICAgICAgICBDWyhyb3dPZmZzZXRDICsgd2FycFJvd09mZnNldCArIHduICogMzIgKyBqICogOCArIHdhcnBZICogNCArIGkpICoKICAgICAgICAgICAgICAgICAgICBNICsKICAgICAgICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdtICogMzIgKyB3YXJwWCldID0KICAgICAgICAgICAgICAgICAgKF9faGlwX2JmbG9hdDE2KWRbd25dW3dtXVtpICsgaiAqIDRdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQoKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpIHsKICBpbnQgTiA9IEEuc2l6ZSgwKSwgSyA9IEEuc2l6ZSgxKSwgTSA9IEIuc2l6ZSgwKTsKCiAgY29uc3QgaW50IEJLID0gMTI4OwogIGNvbnN0IGludCBCTiA9IDEyODsKICBjb25zdCBpbnQgQk0gPSAxMjg7CiAgY29uc3QgaW50IFdJVEVSTiA9IDE7CiAgY29uc3QgaW50IFdJVEVSTSA9IDE7CiAgY29uc3QgaW50IFNNX0NPVU5UID0gMzA0OwogIGRpbTMgbnVtVGhyZWFkcygoQk4gKiBCTSkgLyAoMTYgKiBXSVRFUk4gKiBXSVRFUk0pKTsKICBkaW0zIG51bUJsb2NrcyhTTV9DT1VOVCk7CiAgLy9kaW0zIG51bUJsb2NrcyhjZGl2KE0sIEJNKSwgY2RpdihOLCBCTikpOwogIGlmIChOID4gTSkgewogICAgICBmcDhfbW1fa2VybmVsX048Qk4sIEJLLCBCTSwgV0lURVJOLCBXSVRFUk0sIFNNX0NPVU5UPjw8PG51bUJsb2NrcywgbnVtVGhyZWFkcz4+PigKICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQS5kYXRhX3B0cigpLCAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUIuZGF0YV9wdHIoKSwKICAgICAgICAgIEFfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgICAgICAoX19oaXBfYmZsb2F0MTYgKilDLmRhdGFfcHRyKCksIE4sIEssIE0pOwogIH0gZWxzZSB7CiAgICAgIGZwOF9tbV9rZXJuZWxfTTxCTiwgQkssIEJNLCBXSVRFUk4sIFdJVEVSTSwgU01fQ09VTlQ+PDw8bnVtQmxvY2tzLCBudW1UaHJlYWRzPj4+KAogICAgICAgICAgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilBLmRhdGFfcHRyKCksIChfX2hpcF9mcDhfZTRtM19mbnV6ICopQi5kYXRhX3B0cigpLAogICAgICAgICAgQV9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwgQl9zY2FsZS5kYXRhX3B0cjxmbG9hdD4oKSwKICAgICAgICAgIChfX2hpcF9iZmxvYXQxNiAqKUMuZGF0YV9wdHIoKSwgTiwgSywgTSk7CiAgfQogIHJldHVybiBDOwp9CiIiIgoKY3BwX3NyYyA9IHIiIiIKYXQ6OlRlbnNvciBmcDhfbW0oYXQ6OlRlbnNvciBBLCBhdDo6VGVuc29yIEIsIGF0OjpUZW5zb3IgQV9zY2FsZSwKICAgICAgICAgICAgICAgICAgYXQ6OlRlbnNvciBCX3NjYWxlLCBhdDo6VGVuc29yIEMpOwoiIiIKCmlmIHN5cy5zdGRvdXQgaXMgTm9uZToKICAgIHN5cy5zdGRvdXQgPSBvcGVuKCIvZGV2L3N0ZG91dCIsICJ3IikKaWYgc3lzLnN0ZGVyciBpcyBOb25lOgogICAgc3lzLnN0ZGVyciA9IG9wZW4oIi9kZXYvc3RkZXJyIiwgInciKQoKbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDhfbW0iLAogICAgY3BwX3NvdXJjZXM9W2NwcF9zcmNdLAogICAgY3VkYV9zb3VyY2VzPVtjdWRhX3NyY10sCiAgICBmdW5jdGlvbnM9WyJmcDhfbW0iXSwKICAgIHZlcmJvc2U9VHJ1ZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsKICAgICAgICAiLU9mYXN0IiwKICAgICAgICAiLS1vZmZsb2FkLWFyY2g9Z2Z4OTQyIiwKICAgICAgICAiLXN0ZD1jKysyMCIsCiAgICAgICAgIi1mZnAtY29udHJhY3Q9ZmFzdCIsCiAgICAgICAgIi1saGlwX2hjYyIsCiAgICAgICAgICItbWN1bW9kZSIsCiAgICBdLAopCgoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKICAgIHJldHVybiBtb2R1bGUuZnA4X21tKGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMpCg==
No newline at end of file

Best evidence level for this revision: reported

JSON