submission 5109
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.
bt_tt_wt_vec_smem_mfma.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-fp8-mm-5109?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, 7168] · n=512 · seed=6563
AMD Instinct MI300X
649.9µs
#96 of 98
2025-04-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
656.6µs
#91 of 98
2025-04-19
Show all 18 measurements ›Showing all 18 measurements ⌄
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
679.2µs
#96 of 98
2025-04-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
768.7µs
#84 of 98
2025-04-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
788.5µs
#84 of 98
2025-04-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
911.4µs
#85 of 98
2025-04-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
1.61ms
#84 of 98
2025-04-19
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
4.25ms
#86 of 98
2025-04-19
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:e204ada0f19868d0f1c6e040f45a183442a96d1097b4aa708ff5c953859dbcbe
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
bt_tt_wt_vec_smem_mfma.py1 lines
IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUKCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiCgpjdWRhX3NyYyA9IHIiIiIKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXyBzaXplX3QgY2RpdihzaXplX3QgYSwgc2l6ZV90IGIpIHsKICByZXR1cm4gKGEgKyBiIC0gMSkgLyBiOwp9CgojZGVmaW5lIEJMT0NLX0RJTSAxMjgKCnRlbXBsYXRlIDxjb25zdCBzaXplX3QgQk4sIGNvbnN0IHNpemVfdCBCSywgY29uc3Qgc2l6ZV90IEJNPgpfX2dsb2JhbF9fIHZvaWQgZnA4X21tX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faGlwX2JmbG9hdDE2ICpDLCBzaXplX3QgTiwgc2l6ZV90IEssIHNpemVfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBWRUNUT1JfU0laRSA9IDQ7CiAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgV0FSUFNJWkUgPSA2NDsKICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBudW1UaHJlYWRzID0gKEJOICogQk0pIC8gMTY7CiAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qgc3RyaWRlQSA9IChudW1UaHJlYWRzIC8gKEJOIC8gVkVDVE9SX1NJWkUpKTsKICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBzdHJpZGVCID0gKG51bVRocmVhZHMgLyAoQk0gLyBWRUNUT1JfU0laRSkpOwoKICBzaXplX3Qgcm93T2Zmc2V0QyA9IGJsb2NrSWR4LnkgKiBCTjsKICBzaXplX3QgY29sT2Zmc2V0QyA9IGJsb2NrSWR4LnggKiBCTTsKICBzaXplX3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgc2l6ZV90IGNvbE9mZnNldEIgPSBjb2xPZmZzZXRDOwoKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTiA9PSAwLCAiQk4gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJOID09IDAsICJCTSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChCTiA8PSAxMjggJiYgQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwKICAgICAgICAgICAgICAgICJSYW5nZSBhYm92ZSAxMjggaXMgbm90IHN1cHBvcnRlZCIpOwoKICBzaXplX3QgaW5uZXJDb2xBID0gdGhyZWFkSWR4LnggJSAoQk4gLyBWRUNUT1JfU0laRSk7CiAgc2l6ZV90IGlubmVyUm93QSA9IHRocmVhZElkeC54IC8gKEJOIC8gVkVDVE9SX1NJWkUpOwogIHNpemVfdCBpbm5lckNvbEIgPSB0aHJlYWRJZHgueCAlIChCTSAvIFZFQ1RPUl9TSVpFKTsKICBzaXplX3QgaW5uZXJSb3dCID0gdGhyZWFkSWR4LnggLyAoQk0gLyBWRUNUT1JfU0laRSk7CgogIHNpemVfdCBsYW5lSWR4ID0gdGhyZWFkSWR4LnggJSBXQVJQU0laRTsKICBzaXplX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgc2l6ZV90IHdhcnBDb2xPZmZzZXQgPSAod2FycElkeCAlIChCTSAvIDMyKSkgKiAzMjsKICBzaXplX3Qgd2FycFJvd09mZnNldCA9ICh3YXJwSWR4IC8gKEJNIC8gMzIpKSAqIDMyOwogIHNpemVfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICBzaXplX3Qgd2FycFkgPSBsYW5lSWR4IC8gMzI7CgogIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1tCS11bQk5dLCBCc1tCS11bQk1dOwogIF9fc2hhcmVkX18gZmxvYXQgV3NbQk4gKyAxXTsKCiAgX19oaXBfZnA4X2U0bTNfZm51eiBhWzhdLCBiWzhdOwogIGZsb2F0eDE2IGQgPSB7MH07CgogIGZvciAoc2l6ZV90IHRpbGVPZmZzZXQgPSAwOyB0aWxlT2Zmc2V0IDwgSzsgdGlsZU9mZnNldCArPSBCSykgewogICAgLy8gbG9hZCBmcm9tIGdsb2JhbCB0byBzaGFyZWQgbWVtb3J5IGluIGNvYWxlc2NlZCBtYW5uZXIKICAgIGZvciAoc2l6ZV90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEgKiBWRUNUT1JfU0laRSkgPCBOICYmCiAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLICYmCiAgICAgICAgICAoaW5uZXJDb2xBICogVkVDVE9SX1NJWkUpIDwgQk4pIHsKICAgICAgICBfX2hpcF9mcDh4NF9lNG0zX2ZudXogdG1wID0KICAgICAgICAgICAgKihfX2hpcF9mcDh4NF9lNG0zX2ZudXoKICAgICAgICAgICAgICAgICAgKikmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSAqIFZFQ1RPUl9TSVpFKV07CiAgICAgICAgKihfX2hpcF9mcDh4NF9lNG0zX2ZudXogKikmQXNbaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVyQ29sQSAqIFZFQ1RPUl9TSVpFXSA9IHRtcDsKICAgICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAgIGZsb2F0NCB0bXAgPQogICAgICAgICAgICAgICooZmxvYXQ0ICopJkFfc2NhbGVbKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfRElNKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSAqIFZFQ1RPUl9TSVpFKV07CiAgICAgICAgICAqKGZsb2F0NCAqKSZXc1t0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFXSA9IHRtcDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSyAmJgogICAgICAgICAgICAgICAgIChpbm5lckNvbEEgKiBWRUNUT1JfU0laRSkgPCBCTikgewogICAgICAgICooX19oaXBfZnA4eDRfZTRtM19mbnV6ICopJkFzW2lubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckNvbEEgKiBWRUNUT1JfU0laRV0gPQogICAgICAgICAgICBmbG9hdDR7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn07CiAgICAgIH0KICAgIH0KICAgIGZvciAoc2l6ZV90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgSyAmJgogICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJiAoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLICYmCiAgICAgICAgICAoaW5uZXJDb2xCICogVkVDVE9SX1NJWkUpIDwgQk0pIHsKICAgICAgICBfX2hpcF9mcDh4NF9lNG0zX2ZudXogdG1wID0KICAgICAgICAgICAgKihfX2hpcF9mcDh4NF9lNG0zX2ZudXoKICAgICAgICAgICAgICAgICAgKikmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgKiBNICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQiAqIFZFQ1RPUl9TSVpFKV07CiAgICAgICAgKihfX2hpcF9mcDh4NF9lNG0zX2ZudXogKikmQnNbaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVyQ29sQiAqIFZFQ1RPUl9TSVpFXSA9IHRtcDsKICAgICAgICBpZiAodGhyZWFkSWR4LnggPT0gQk4pIHsKICAgICAgICAgIFdzW0JOXSA9CiAgICAgICAgICAgICAgQl9zY2FsZVsoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIC8gQkxPQ0tfRElNKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2RpdihNLCBCTE9DS19ESU0pICsKICAgICAgICAgICAgICAgICAgICAgICgoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgLyBCTE9DS19ESU0pXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSyAmJgogICAgICAgICAgICAgICAgIChpbm5lckNvbEIgKiBWRUNUT1JfU0laRSkgPCBCTSkgewogICAgICAgICooX19oaXBfZnA4eDRfZTRtM19mbnV6ICopJkJzW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckNvbEIgKiBWRUNUT1JfU0laRV0gPQogICAgICAgICAgICBmbG9hdDR7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn07CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgZm9yIChzaXplX3QgQktPZmZzZXQgPSAwOyBCS09mZnNldCA8IEJLOyBCS09mZnNldCArPSAxNikgewogICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDg7ICsraSkgewogICAgICAgIGFbaV0gPSBBc1tCS09mZnNldCArIHdhcnBZICogOCArIGldW3dhcnBSb3dPZmZzZXQgKyB3YXJwWF07CiAgICAgICAgYltpXSA9IEJzW0JLT2Zmc2V0ICsgd2FycFkgKiA4ICsgaV1bd2FycENvbE9mZnNldCArIHdhcnBYXTsKICAgICAgfQogICAgICBmbG9hdHgxNiBjID0gezB9OwogICAgICBjID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8zMngzMngxNl9mcDhfZnA4KAogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihhKSwgKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihiKSwgYywgMCwgMCwKICAgICAgICAgIDApOwogICAgICBmbG9hdCBiX3NjYWxlID0gV3NbQk5dOwojcHJhZ21hIHVucm9sbCAyCiAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgIGRbaSArIGogKiA0XSArPSBjW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgICAgICAgICAgIFdzW3dhcnBSb3dPZmZzZXQgKyBqICogOCArIHdhcnBZICogNCArIGldICogYl9zY2FsZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgfQoKI3ByYWdtYSB1bnJvbGwgMgogIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICBpZiAoKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSA8IE4gJiYKICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdhcnBYKSA8IE0pCiAgICAgICAgQ1socm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyBqICogOCArIHdhcnBZICogNCArIGkpICogTSArCiAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3YXJwWCldID0gKF9faGlwX2JmbG9hdDE2KWRbaSArIGogKiA0XTsKICAgIH0KICB9Cn0KCmF0OjpUZW5zb3IgZnA4X21tKGF0OjpUZW5zb3IgQSwgYXQ6OlRlbnNvciBCLCBhdDo6VGVuc29yIEFfc2NhbGUsCiAgICAgICAgICAgICAgICAgIGF0OjpUZW5zb3IgQl9zY2FsZSwgYXQ6OlRlbnNvciBDKSB7CiAgc2l6ZV90IE4gPSBBLnNpemUoMCksIEsgPSBBLnNpemUoMSksIE0gPSBCLnNpemUoMCk7CgogIGNvbnN0IHNpemVfdCBCSyA9IDE2OwogIGNvbnN0IHNpemVfdCBCTiA9IDY0OwogIGNvbnN0IHNpemVfdCBCTSA9IDY0OwogIGRpbTMgbnVtVGhyZWFkcygoQk4gKiBCTSkgLyAxNik7CiAgZGltMyBudW1CbG9ja3MoY2RpdihNLCBCTSksIGNkaXYoTiwgQk4pKTsKICBmcDhfbW1fa2VybmVsPEJOLCBCSywgQk0+PDw8bnVtQmxvY2tzLCBudW1UaHJlYWRzPj4+KAogICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilCLmRhdGFfcHRyKCksCiAgICAgIEFfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgIChfX2hpcF9iZmxvYXQxNiAqKUMuZGF0YV9wdHIoKSwgTiwgSywgTSk7CiAgcmV0dXJuIEM7Cn0KIiIiCgpjcHBfc3JjID0gciIiIgphdDo6VGVuc29yIGZwOF9tbShhdDo6VGVuc29yIEEsIGF0OjpUZW5zb3IgQiwgYXQ6OlRlbnNvciBBX3NjYWxlLAogICAgICAgICAgICAgICAgICBhdDo6VGVuc29yIEJfc2NhbGUsIGF0OjpUZW5zb3IgQyk7CiIiIgoKbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDhfbW0iLAogICAgY3BwX3NvdXJjZXM9W2NwcF9zcmNdLAogICAgY3VkYV9zb3VyY2VzPVtjdWRhX3NyY10sCiAgICBmdW5jdGlvbnM9WyJmcDhfbW0iXSwKICAgIHZlcmJvc2U9VHJ1ZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLU8zIiwgIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIl0sCikKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCiAgICByZXR1cm4gbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQo=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 3803.
- IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KCiMgVGhpcyBpcyBhIHN1Ym1pc3Npb24gdGVtcGxhdGUgZm9yIHBvcGNvcm4gbGVhZGVyYm9hcmQgJ2FtZC1mcDgtbW0nLgojIFlvdXIgdGFzayBpcyBhcyBmb2xsb3dzOgojID4gCgojID4gWW91IHdpbGwgaW1wbGVtZW50IGEgY3VzdG9tIGZwOC1ibG9ja3dpc2UgbWF0bXVsIGtlcm5lbCBvcHRpbWl6ZWQgZm9yIE1JMzAwLgoKIyA+IFlvdSB3aWxsIGJlIGdpdmVuIHNpbmdsZS1wcmVjaXNpb24gc2NhbGluZyBmYWN0b3JzIGZvciB5b3VyIG1hdHJpY2VzLgoKIyA+IFRoZSBzaGFwZXMgb2YgYWxsIG91dGVyIGFuZCBpbm5lciBkaW1lbnNpb25zIG9mIHRlbnNvcnMgYXJlIGZyb20gRGVlcFNlZWstUjEuCgojID4gVG8gYmUgZXhwbGljaXQsIHlvdSB3aWxsIGJlIGdpdmVuIGEgdHVwbGUgb2YgdGVuc29yczoKCiMgPiBgYGAKCiMgPiAoYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykKCiMgPiBgYGAKCiMgPiB3aGVyZSBgYWAgYW5kIGBiYCBhcmUgdGhlIGlucHV0IG1hdHJpY2VzLCBgYV9zY2FsZWAgYW5kIGBiX3NjYWxlYCBhcmUgdGhlIHNjYWxpbmcgZmFjdG9ycyBmb3IgYGFgIGFuZCBgYmAgcmVzcGVjdGl2ZWx5LAoKIyA+IGFuZCBgY2AgaXMgdGhlIG91dHB1dCBtYXRyaXg6CgojID4gKiBgYWAgaXMgTSB4IEsgaW4gY29sdW1uLW1ham9yIG9yZGVyIGluIGU0bTNmbnV6CgojID4gKiBgYmAgaXMgTiB4IEsgaW4gY29sdW1uLW1ham9yIG9yZGVyIGluIGU0bTNmbnV6CgojID4gKiBgYV9zY2FsZWAgaXMgTSB4IEsgaW4gY29sdW1uLW1ham9yIG9yZGVyIGluIGZwMzIKCiMgPiAqIGBiX3NjYWxlYCBpcyBOIHggSyBpbiBjb2x1bW4tbWFqb3Igb3JkZXIgaW4gZnAzMgoKIyA+ICogYGNgIGlzIE0geCBOIGluIFJPVy1tYWpvciBvcmRlciBpbiBiZjE2CgojID4gCgojID4gVGhlIHJhbmtpbmcgY3JpdGVyaWEgaXMgdGhlIGdlb21ldHJpYyBtZWFuIG9mIHRoZSBiZW5jaG1hcmsgcmVzdWx0cy4KCiMgPiAKCiMgPiBGb3IgdGhlIGdyYW5kIHByaWNlLCB5b3VyIGtlcm5lbCB3aWxsIGJlIGV2YWx1YXRlZCBhZ2FpbnN0IHRoZSBzcGVlZCBvZiBsaWdodCBhbmFseXNpcwoKIyA+IGFuZCB0aGUgc29sdXRpb24gY2xvc2VzdCB0byB0aGUgc3BlZWQgb2YgbGlnaHQgd2lsbCBiZSBhd2FyZGVkIHRoZSBncmFuZCBwcmljZS4KCiMgPiBgYGAKCiMgPiBUaGUgc3BlZWQgb2YgbGlnaHQgYW5hbHlzaXMgaXM6CgojID4gIE0gICAgICAgTiAgICAgICBLICAgICB0aW1lW3VzXQoKIyA+IDEwMjQgICAgMTUzNiAgICA3MTY4ICAgICAgOC42MwoKIyA+IDEwMjQgICAgNDYwOCAgICA3MTY4ICAgICAyNS44OQoKIyA+IDYxNDQgICAgMTUzNiAgICA3MTY4ICAgICA1MS43OAoKIyA+IDYxNDQgICAgNDYwOCAgICA3MTY4ICAgIDE1NS4zMAoKIyA+IDEwMjQgICAgNzE2OCAgICAgMjU2ICAgICAgMy4xNwoKIyA+IDYxNDQgICAgNzE2OCAgICAgMjU2ICAgICAxNy4yNwoKIyA+IGBgYAoKIyBUaGUgZGVhZGxpbmUgZm9yIHRoaXMgbGVhZGVyYm9hcmQgaXMgMjAyNS0wNS0yNyAwMDowMDowMCswMDowMAoKIyBZb3UgY2FuIGF1dG9tYXRpY2FsbHkgcm91dGUgdGhpcyBmaWxlIHRvIHNwZWNpZmljIEdQVXMgYnkgYWRkaW5nIGEgbGluZQojIGAjIVBPUENPUk4gZ3B1cyA8R1BVcz5gIHRvIHRoZSBoZWFkZXIgb2YgdGhpcyBmaWxlLgojIEhhcHB5IGhhY2tpbmchCgppbXBvcnQgdG9yY2gKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBIaWdobHkgaW5lZmZpY2llbnQgdG9yY2ggcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIEZQOCBHRU1NLgogICAgWW91IGNhbiB1c2UgdGhpcyBhcyBhIHJlZmVyZW5jZSAvIHN0YXJ0aW5nIHRlbXBsYXRlIGZvciB5b3VyIGltcGxlbWVudGF0aW9uLgogICAgIiIiCiAgICAjIGM6IFttLCBuXSBpcyBwcmUtYWxsb2NhdGVkIG1lbW9yeSB0byBoZWxwIHJlbW92ZSBhbGxvY2F0aW9uIG92ZXJoZWFkLgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKCiAgICAjIGEgaXMgTSB4IEsgaW4gY29sdW1uLW1ham9yIG9yZGVyLCB3ZSBjb252ZXJ0IGhlcmUgZm9yIHNpbXBsaWNpdHkuCiAgICBhID0gYS5jb250aWd1b3VzKCkKICAgIGFfc2NhbGUgPSBhX3NjYWxlLmNvbnRpZ3VvdXMoKQogICAgYl9zY2FsZSA9IGJfc2NhbGUuY29udGlndW91cygpCgogICAgIyBjb25zdGFudHMKICAgIG0gPSBhLnNoYXBlWzBdCiAgICBuID0gYi5zaGFwZVswXQogICAgayA9IGEuc2hhcGVbMV0KICAgIGJsb2NrX3NoYXBlX24gPSAxMjgKICAgIGJsb2NrX3NoYXBlX2sgPSAxMjgKICAgIHNjYWxlX24gPSBiX3NjYWxlLnNoYXBlWzBdCiAgICBzY2FsZV9rID0gYl9zY2FsZS5zaGFwZVsxXQoKICAgICMgQXBwbHkgYmxvY2t3aXNlIHNjYWxpbmcgdG8gaW5wdXQgJ2EnCiAgICBhX3NjYWxlID0gYV9zY2FsZS51bnNxdWVlemUoLTEpLnJlcGVhdCgxLCAxLCBibG9ja19zaGFwZV9rKSAgIyBTaGFwZTogW20sIHNjYWxlX2ssIGJsb2NrX3NoYXBlX2tdCiAgICBhX3NjYWxlID0gYV9zY2FsZS5yZXNoYXBlKG0sIHNjYWxlX2sgKiBibG9ja19zaGFwZV9rKSAKICAgIGFfc2NhbGUgPSBhX3NjYWxlWzosIDprXQoKICAgICMgRGVxdWFudGl6ZSAnYScsIGluIHlvdXIgaW1wbGVtZW50YXRpb24geW91IHNob3VsZCBkbyB0aGlzIGF0IHRoZSBlbmQuCiAgICBhID0gYS50byhhX3NjYWxlLmR0eXBlKSAqIGFfc2NhbGUgCgogICAgIyBBcHBseSBibG9ja3dpc2Ugc2NhbGluZyB0byBpbnB1dCAnYicKICAgIGJfc2NhbGUgPSAoCiAgICAgICAgYl9zY2FsZS52aWV3KC0xLCAxKQogICAgICAgIC5yZXBlYXQoMSwgYmxvY2tfc2hhcGVfbiAqIGJsb2NrX3NoYXBlX2spCiAgICAgICAgLnZpZXcoc2NhbGVfbiwgc2NhbGVfaywgYmxvY2tfc2hhcGVfbiwgYmxvY2tfc2hhcGVfaykKICAgICAgICAucGVybXV0ZSgwLCAyLCAxLCAzKSAgIyBSZW9yZGVyIGRpbWVuc2lvbnM6IFtzY2FsZV9uLCBibGtfbiwgc2NhbGVfaywgYmxrX2tdCiAgICAgICAgLnJlc2hhcGUoc2NhbGVfbiAqIGJsb2NrX3NoYXBlX24sIHNjYWxlX2sgKiBibG9ja19zaGFwZV9rKQogICAgKQogICAgYl9zY2FsZSA9IGJfc2NhbGVbOm4sIDprXQoKICAgICMgRGVxdWFudGl6ZSAnYicsIGluIHlvdXIgaW1wbGVtZW50YXRpb24geW91IHNob3VsZCBkbyB0aGlzIGF0IHRoZSBlbmQuCiAgICBiID0gYi50byhiX3NjYWxlLmR0eXBlKSAqIGJfc2NhbGUgCgogICAgIyBDb21wdXRlIEZQOCBHRU1NIGFuZCB3cml0ZSB0byAnYycuIAogICAgY1suLi5dID0gKGEgQCBiLlQpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgcmV0dXJuIGMKNo newline at end of file+ IyFQT1BDT1JOIGxlYWRlcmJvYXJkIGFtZC1mcDgtbW0KIyFQT1BDT1JOIGdwdXMgTUkzMDAKCmltcG9ydCBvcwpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUKCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiCgpjdWRhX3NyYyA9IHIiIiIKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvYW1kX2RldGFpbC9hbWRfaGlwX2JmMTYuaD4KI2luY2x1ZGUgPGhpcC9hbWRfZGV0YWlsL2FtZF9oaXBfZnA4Lmg+CgpfX2hvc3RfXyBfX2RldmljZV9fIF9fZm9yY2VpbmxpbmVfXyBzaXplX3QgY2RpdihzaXplX3QgYSwgc2l6ZV90IGIpIHsKICByZXR1cm4gKGEgKyBiIC0gMSkgLyBiOwp9CgojZGVmaW5lIEJMT0NLX0RJTSAxMjgKCnRlbXBsYXRlIDxjb25zdCBzaXplX3QgQk4sIGNvbnN0IHNpemVfdCBCSywgY29uc3Qgc2l6ZV90IEJNPgpfX2dsb2JhbF9fIHZvaWQgZnA4X21tX2tlcm5lbChjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2hpcF9mcDhfZTRtM19mbnV6ICpCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqQV9zY2FsZSwgY29uc3QgZmxvYXQgKkJfc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faGlwX2JmbG9hdDE2ICpDLCBzaXplX3QgTiwgc2l6ZV90IEssIHNpemVfdCBNKSB7CiAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwoKICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBWRUNUT1JfU0laRSA9IDQ7CiAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgV0FSUFNJWkUgPSA2NDsKICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBudW1UaHJlYWRzID0gKEJOICogQk0pIC8gMTY7CiAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qgc3RyaWRlQSA9IChudW1UaHJlYWRzIC8gKEJOIC8gVkVDVE9SX1NJWkUpKTsKICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBzdHJpZGVCID0gKG51bVRocmVhZHMgLyAoQk0gLyBWRUNUT1JfU0laRSkpOwoKICBzaXplX3Qgcm93T2Zmc2V0QyA9IGJsb2NrSWR4LnkgKiBCTjsKICBzaXplX3QgY29sT2Zmc2V0QyA9IGJsb2NrSWR4LnggKiBCTTsKICBzaXplX3QgY29sT2Zmc2V0QSA9IHJvd09mZnNldEM7CiAgc2l6ZV90IGNvbE9mZnNldEIgPSBjb2xPZmZzZXRDOwoKICBzdGF0aWNfYXNzZXJ0KG51bVRocmVhZHMgJSBCTiA9PSAwLCAiQk4gc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgbnVtVGhyZWFkcyIpOwogIHN0YXRpY19hc3NlcnQobnVtVGhyZWFkcyAlIEJOID09IDAsICJCTSBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiBudW1UaHJlYWRzIik7CiAgc3RhdGljX2Fzc2VydChCTiA8PSAxMjggJiYgQksgPD0gMTI4ICYmIEJNIDw9IDEyOCwKICAgICAgICAgICAgICAgICJSYW5nZSBhYm92ZSAxMjggaXMgbm90IHN1cHBvcnRlZCIpOwoKICBzaXplX3QgaW5uZXJDb2xBID0gdGhyZWFkSWR4LnggJSAoQk4gLyBWRUNUT1JfU0laRSk7CiAgc2l6ZV90IGlubmVyUm93QSA9IHRocmVhZElkeC54IC8gKEJOIC8gVkVDVE9SX1NJWkUpOwogIHNpemVfdCBpbm5lckNvbEIgPSB0aHJlYWRJZHgueCAlIChCTSAvIFZFQ1RPUl9TSVpFKTsKICBzaXplX3QgaW5uZXJSb3dCID0gdGhyZWFkSWR4LnggLyAoQk0gLyBWRUNUT1JfU0laRSk7CgogIHNpemVfdCBsYW5lSWR4ID0gdGhyZWFkSWR4LnggJSBXQVJQU0laRTsKICBzaXplX3Qgd2FycElkeCA9IHRocmVhZElkeC54IC8gV0FSUFNJWkU7CiAgc2l6ZV90IHdhcnBDb2xPZmZzZXQgPSAod2FycElkeCAlIChCTSAvIDMyKSkgKiAzMjsKICBzaXplX3Qgd2FycFJvd09mZnNldCA9ICh3YXJwSWR4IC8gKEJNIC8gMzIpKSAqIDMyOwogIHNpemVfdCB3YXJwWCA9IGxhbmVJZHggJSAzMjsKICBzaXplX3Qgd2FycFkgPSBsYW5lSWR4IC8gMzI7CgogIF9fc2hhcmVkX18gX19oaXBfZnA4X2U0bTNfZm51eiBBc1tCS11bQk5dLCBCc1tCS11bQk1dOwogIF9fc2hhcmVkX18gZmxvYXQgV3NbQk4gKyAxXTsKCiAgX19oaXBfZnA4X2U0bTNfZm51eiBhWzhdLCBiWzhdOwogIGZsb2F0eDE2IGQgPSB7MH07CgogIGZvciAoc2l6ZV90IHRpbGVPZmZzZXQgPSAwOyB0aWxlT2Zmc2V0IDwgSzsgdGlsZU9mZnNldCArPSBCSykgewogICAgLy8gbG9hZCBmcm9tIGdsb2JhbCB0byBzaGFyZWQgbWVtb3J5IGluIGNvYWxlc2NlZCBtYW5uZXIKICAgIGZvciAoc2l6ZV90IGlubmVyUm93T2Zmc2V0QSA9IDA7IGlubmVyUm93T2Zmc2V0QSA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEEgKz0gc3RyaWRlQSkgewogICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEEgKyBpbm5lclJvd0EpIDwgSyAmJgogICAgICAgICAgKGNvbE9mZnNldEEgKyBpbm5lckNvbEEgKiBWRUNUT1JfU0laRSkgPCBOICYmCiAgICAgICAgICAoaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSA8IEJLICYmCiAgICAgICAgICAoaW5uZXJDb2xBICogVkVDVE9SX1NJWkUpIDwgQk4pIHsKICAgICAgICBfX2hpcF9mcDh4NF9lNG0zX2ZudXogdG1wID0KICAgICAgICAgICAgKihfX2hpcF9mcDh4NF9lNG0zX2ZudXoKICAgICAgICAgICAgICAgICAgKikmQVsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgKiBOICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSAqIFZFQ1RPUl9TSVpFKV07CiAgICAgICAgKihfX2hpcF9mcDh4NF9lNG0zX2ZudXogKikmQXNbaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVyQ29sQSAqIFZFQ1RPUl9TSVpFXSA9IHRtcDsKICAgICAgICBpZiAodGhyZWFkSWR4LnggPCAoQk4gLyBWRUNUT1JfU0laRSkpIHsKICAgICAgICAgIGZsb2F0NCB0bXAgPQogICAgICAgICAgICAgICooZmxvYXQ0ICopJkFfc2NhbGVbKCh0aWxlT2Zmc2V0ICsgaW5uZXJSb3dPZmZzZXRBICsgaW5uZXJSb3dBKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxPQ0tfRElNKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QSArIGlubmVyQ29sQSAqIFZFQ1RPUl9TSVpFKV07CiAgICAgICAgICAqKGZsb2F0NCAqKSZXc1t0aHJlYWRJZHgueCAqIFZFQ1RPUl9TSVpFXSA9IHRtcDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QSkgPCBCSyAmJgogICAgICAgICAgICAgICAgIChpbm5lckNvbEEgKiBWRUNUT1JfU0laRSkgPCBCTikgewogICAgICAgICooX19oaXBfZnA4eDRfZTRtM19mbnV6ICopJkFzW2lubmVyUm93T2Zmc2V0QSArIGlubmVyUm93QV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckNvbEEgKiBWRUNUT1JfU0laRV0gPQogICAgICAgICAgICBmbG9hdDR7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn07CiAgICAgIH0KICAgIH0KICAgIGZvciAoc2l6ZV90IGlubmVyUm93T2Zmc2V0QiA9IDA7IGlubmVyUm93T2Zmc2V0QiA8IEJLOwogICAgICAgICBpbm5lclJvd09mZnNldEIgKz0gc3RyaWRlQikgewogICAgICBpZiAoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIDwgSyAmJgogICAgICAgICAgKGNvbE9mZnNldEIgKyBpbm5lckNvbEIpIDwgTSAmJiAoaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCKSA8IEJLICYmCiAgICAgICAgICAoaW5uZXJDb2xCICogVkVDVE9SX1NJWkUpIDwgQk0pIHsKICAgICAgICBfX2hpcF9mcDh4NF9lNG0zX2ZudXogdG1wID0KICAgICAgICAgICAgKihfX2hpcF9mcDh4NF9lNG0zX2ZudXoKICAgICAgICAgICAgICAgICAgKikmQlsodGlsZU9mZnNldCArIGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgKiBNICsKICAgICAgICAgICAgICAgICAgICAgICAoY29sT2Zmc2V0QiArIGlubmVyQ29sQiAqIFZFQ1RPUl9TSVpFKV07CiAgICAgICAgKihfX2hpcF9mcDh4NF9lNG0zX2ZudXogKikmQnNbaW5uZXJSb3dPZmZzZXRCICsgaW5uZXJSb3dCXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVyQ29sQiAqIFZFQ1RPUl9TSVpFXSA9IHRtcDsKICAgICAgICBpZiAodGhyZWFkSWR4LnggPT0gQk4pIHsKICAgICAgICAgIFdzW0JOXSA9CiAgICAgICAgICAgICAgQl9zY2FsZVsoKHRpbGVPZmZzZXQgKyBpbm5lclJvd09mZnNldEIgKyBpbm5lclJvd0IpIC8gQkxPQ0tfRElNKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2RpdihNLCBCTE9DS19ESU0pICsKICAgICAgICAgICAgICAgICAgICAgICgoY29sT2Zmc2V0QiArIGlubmVyQ29sQikgLyBCTE9DS19ESU0pXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKGlubmVyUm93T2Zmc2V0QiArIGlubmVyUm93QikgPCBCSyAmJgogICAgICAgICAgICAgICAgIChpbm5lckNvbEIgKiBWRUNUT1JfU0laRSkgPCBCTSkgewogICAgICAgICooX19oaXBfZnA4eDRfZTRtM19mbnV6ICopJkJzW2lubmVyUm93T2Zmc2V0QiArIGlubmVyUm93Ql0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckNvbEIgKiBWRUNUT1JfU0laRV0gPQogICAgICAgICAgICBmbG9hdDR7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn07CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CgogICAgZm9yIChzaXplX3QgQktPZmZzZXQgPSAwOyBCS09mZnNldCA8IEJLOyBCS09mZnNldCArPSAxNikgewogICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDg7ICsraSkgewogICAgICAgIGFbaV0gPSBBc1tCS09mZnNldCArIHdhcnBZICogOCArIGldW3dhcnBSb3dPZmZzZXQgKyB3YXJwWF07CiAgICAgICAgYltpXSA9IEJzW0JLT2Zmc2V0ICsgd2FycFkgKiA4ICsgaV1bd2FycENvbE9mZnNldCArIHdhcnBYXTsKICAgICAgfQogICAgICBmbG9hdHgxNiBjID0gezB9OwogICAgICBjID0gX19idWlsdGluX2FtZGdjbl9tZm1hX2YzMl8zMngzMngxNl9mcDhfZnA4KAogICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihhKSwgKnJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihiKSwgYywgMCwgMCwKICAgICAgICAgIDApOwogICAgICBmbG9hdCBiX3NjYWxlID0gV3NbQk5dOwojcHJhZ21hIHVucm9sbCAyCiAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgIGRbaSArIGogKiA0XSArPSBjW2kgKyBqICogNF0gKgogICAgICAgICAgICAgICAgICAgICAgICAgIFdzW3dhcnBSb3dPZmZzZXQgKyBqICogOCArIHdhcnBZICogNCArIGldICogYl9zY2FsZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBfX3N5bmN0aHJlYWRzKCk7CiAgfQoKI3ByYWdtYSB1bnJvbGwgMgogIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgNDsgKytqKSB7CiAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICBpZiAoKHJvd09mZnNldEMgKyB3YXJwUm93T2Zmc2V0ICsgaiAqIDggKyB3YXJwWSAqIDQgKyBpKSA8IE4gJiYKICAgICAgICAgIChjb2xPZmZzZXRDICsgd2FycENvbE9mZnNldCArIHdhcnBYKSA8IE0pCiAgICAgICAgQ1socm93T2Zmc2V0QyArIHdhcnBSb3dPZmZzZXQgKyBqICogOCArIHdhcnBZICogNCArIGkpICogTSArCiAgICAgICAgICAoY29sT2Zmc2V0QyArIHdhcnBDb2xPZmZzZXQgKyB3YXJwWCldID0gKF9faGlwX2JmbG9hdDE2KWRbaSArIGogKiA0XTsKICAgIH0KICB9Cn0KCmF0OjpUZW5zb3IgZnA4X21tKGF0OjpUZW5zb3IgQSwgYXQ6OlRlbnNvciBCLCBhdDo6VGVuc29yIEFfc2NhbGUsCiAgICAgICAgICAgICAgICAgIGF0OjpUZW5zb3IgQl9zY2FsZSwgYXQ6OlRlbnNvciBDKSB7CiAgc2l6ZV90IE4gPSBBLnNpemUoMCksIEsgPSBBLnNpemUoMSksIE0gPSBCLnNpemUoMCk7CgogIGNvbnN0IHNpemVfdCBCSyA9IDE2OwogIGNvbnN0IHNpemVfdCBCTiA9IDY0OwogIGNvbnN0IHNpemVfdCBCTSA9IDY0OwogIGRpbTMgbnVtVGhyZWFkcygoQk4gKiBCTSkgLyAxNik7CiAgZGltMyBudW1CbG9ja3MoY2RpdihNLCBCTSksIGNkaXYoTiwgQk4pKTsKICBmcDhfbW1fa2VybmVsPEJOLCBCSywgQk0+PDw8bnVtQmxvY2tzLCBudW1UaHJlYWRzPj4+KAogICAgICAoX19oaXBfZnA4X2U0bTNfZm51eiAqKUEuZGF0YV9wdHIoKSwgKF9faGlwX2ZwOF9lNG0zX2ZudXogKilCLmRhdGFfcHRyKCksCiAgICAgIEFfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksIEJfc2NhbGUuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgIChfX2hpcF9iZmxvYXQxNiAqKUMuZGF0YV9wdHIoKSwgTiwgSywgTSk7CiAgcmV0dXJuIEM7Cn0KIiIiCgpjcHBfc3JjID0gciIiIgphdDo6VGVuc29yIGZwOF9tbShhdDo6VGVuc29yIEEsIGF0OjpUZW5zb3IgQiwgYXQ6OlRlbnNvciBBX3NjYWxlLAogICAgICAgICAgICAgICAgICBhdDo6VGVuc29yIEJfc2NhbGUsIGF0OjpUZW5zb3IgQyk7CiIiIgoKbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSJmcDhfbW0iLAogICAgY3BwX3NvdXJjZXM9W2NwcF9zcmNdLAogICAgY3VkYV9zb3VyY2VzPVtjdWRhX3NyY10sCiAgICBmdW5jdGlvbnM9WyJmcDhfbW0iXSwKICAgIHZlcmJvc2U9VHJ1ZSwKICAgIGV4dHJhX2N1ZGFfY2ZsYWdzPVsiLU8zIiwgIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIl0sCikKCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhOiBpbnB1dF90KSAtPiBvdXRwdXRfdDoKICAgIGEsIGIsIGFfc2NhbGUsIGJfc2NhbGUsIGMgPSBkYXRhCiAgICByZXR1cm4gbW9kdWxlLmZwOF9tbShhLCBiLCBhX3NjYWxlLCBiX3NjYWxlLCBjKQo=No newline at end of file
Best evidence level for this revision: reported
JSON