Skip to content
KernelIndex
Search⌘K

submission 29705

KernelBot user 87 · 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-29705?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
44.0µs
#39 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 256]
AMD Instinct MI300X
47.1µs
#47 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 1536]
AMD Instinct MI300X
61.1µs
#42 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=512 · seed=6563
AMD Instinct MI300X
95.3µs
#36 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 256]
AMD Instinct MI300X
105.3µs
#35 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 512]
AMD Instinct MI300X
110.5µs
#34 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2048]
AMD Instinct MI300X
116.1µs
#31 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 2304]
AMD Instinct MI300X
126.9µs
#34 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=1536 · seed=8135
AMD Instinct MI300X
153.5µs
#39 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=576 · seed=12346
AMD Instinct MI300X
174.2µs
#67 of 98
2025-06-01
Show all 18 measurements ›
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 1536]
AMD Instinct MI300X
175.2µs
#33 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=512 · seed=12341
AMD Instinct MI300X
195.9µs
#41 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [1024, 7168] · n=4608 · seed=7531
AMD Instinct MI300X
219.5µs
#39 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=1536 · seed=6543
AMD Instinct MI300X
324.0µs
#29 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=576 · seed=9863
AMD Instinct MI300X
348.1µs
#64 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2048]
AMD Instinct MI300X
454.6µs
#37 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 2304]
AMD Instinct MI300X
506.0µs
#39 of 98
2025-06-01
AMD FP8 blockwise GEMMfp32/fp8_e4m3fnuz · [6144, 7168] · n=4608 · seed=65436
AMD Instinct MI300X
976.1µs
#35 of 98
2025-06-01

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:448f1bfe01457955d92e2aced13e6e7b06f35981926e8ae68dbb27c6e5ec5c00
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission.py1 lines
aW1wb3J0IHRvcmNoCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgbWFrZV9tYXRjaF9yZWZlcmVuY2UKaW1wb3J0IG9zIApvcy5lbnZpcm9uWydQWVRPUkNIX1JPQ01fQVJDSCddID0gJ2dmeDk0MicKCmZyb20gdG9yY2gudXRpbHMuY3BwX2V4dGVuc2lvbiBpbXBvcnQgbG9hZF9pbmxpbmUKCmltcG9ydCB0cml0b24KaW1wb3J0IHRyaXRvbi5sYW5ndWFnZSBhcyB0bApmcm9tIHR5cGluZyBpbXBvcnQgQW55LCBEaWN0LCBMaXN0LCBPcHRpb25hbCwgVHVwbGUKCgpibG9ja19zaGFwZSA9ICgxMjgsIDEyOCkKCl9pc19oaXAgPSBUcnVlCgpAdHJpdG9uLmF1dG90dW5lKGNvbmZpZ3M9WwogICAgdHJpdG9uLkNvbmZpZyh7J0JMT0NLX1NJWkVfTSc6IDMyLCAnQkxPQ0tfU0laRV9OJzogMTI4LCAnQkxPQ0tfU0laRV9LJzoxMjgsICdHUk9VUF9TSVpFX00nOiAxNn0sIG51bV93YXJwcz00LCBudW1fc3RhZ2VzPTIpLAogICAgdHJpdG9uLkNvbmZpZyh7J0JMT0NLX1NJWkVfTSc6IDMyLCAnQkxPQ0tfU0laRV9OJzogMTI4LCAnQkxPQ0tfU0laRV9LJzoxMjgsICdHUk9VUF9TSVpFX00nOiAzMn0sIG51bV93YXJwcz00LCBudW1fc3RhZ2VzPTIpLAogICAgdHJpdG9uLkNvbmZpZyh7J0JMT0NLX1NJWkVfTSc6IDY0LCAnQkxPQ0tfU0laRV9OJzogMTI4LCAnQkxPQ0tfU0laRV9LJzoxMjgsICdHUk9VUF9TSVpFX00nOiAxNn0sIG51bV93YXJwcz00LCBudW1fc3RhZ2VzPTIpLAogICAgdHJpdG9uLkNvbmZpZyh7J0JMT0NLX1NJWkVfTSc6IDY0LCAnQkxPQ0tfU0laRV9OJzogMTI4LCAnQkxPQ0tfU0laRV9LJzoxMjgsICdHUk9VUF9TSVpFX00nOiAzMn0sIG51bV93YXJwcz00LCBudW1fc3RhZ2VzPTIpLAogICAgdHJpdG9uLkNvbmZpZyh7J0JMT0NLX1NJWkVfTSc6IDEyOCwgJ0JMT0NLX1NJWkVfTic6IDEyOCwgJ0JMT0NLX1NJWkVfSyc6NjQsICdHUk9VUF9TSVpFX00nOiAxNn0sIG51bV93YXJwcz00LCBudW1fc3RhZ2VzPTIpLAogICAgdHJpdG9uLkNvbmZpZyh7J0JMT0NLX1NJWkVfTSc6IDEyOCwgJ0JMT0NLX1NJWkVfTic6IDEyOCwgJ0JMT0NLX1NJWkVfSyc6NjQsICdHUk9VUF9TSVpFX00nOiAzMn0sIG51bV93YXJwcz00LCBudW1fc3RhZ2VzPTIpLAogIF0sCiAga2V5PVsnTScsICdOJywgJ0snXSwKICB1c2VfY3VkYV9ncmFwaD1UcnVlLAopCkB0cml0b24uaml0CmRlZiBfdzhhOF9ibG9ja19mcDhfbWF0bXVsX3Vucm9sbGVkeDQoCiAgICAjIFBvaW50ZXJzIHRvIGlucHV0cyBhbmQgb3V0cHV0CiAgICBBLAogICAgQiwKICAgIEMsCiAgICBBcywKICAgIEJzLAogICAgIyBTaGFwZSBmb3IgbWF0bXVsCiAgICBNLAogICAgTiwKICAgIEssCiAgICAjIEJsb2NrIHNpemUgZm9yIGJsb2NrLXdpc2UgcXVhbnRpemF0aW9uCiAgICBncm91cF9uLAogICAgZ3JvdXBfaywKICAgICMgU3RyaWRlIGZvciBpbnB1dHMgYW5kIG91dHB1dAogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX0FzX20sCiAgICBzdHJpZGVfQXNfaywKICAgIHN0cmlkZV9Cc19rLAogICAgc3RyaWRlX0JzX24sCiAgICAjIE1ldGEtcGFyYW1ldGVycwogICAgQkxPQ0tfU0laRV9NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfSzogdGwuY29uc3RleHByLAogICAgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiJUcml0b24tYWNjZWxlcmF0ZWQgZnVuY3Rpb24gdXNlZCB0byBwZXJmb3JtIGxpbmVhciBvcGVyYXRpb25zIChkb3QKICAgIHByb2R1Y3QpIG9uIGlucHV0IHRlbnNvcnMgYEFgIGFuZCBgQmAgd2l0aCBibG9jay13aXNlIHF1YW50aXphdGlvbiwgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gb3V0cHV0CiAgICB0ZW5zb3IgYENgLgogICAgIiIiCiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIG51bV9waWRfbSA9IHRsLmNkaXYoTSwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fcGlkX2luX2dyb3VwID0gR1JPVVBfU0laRV9NICogbnVtX3BpZF9uCiAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICBmaXJzdF9waWRfbSA9IGdyb3VwX2lkICogR1JPVVBfU0laRV9NCiAgICBncm91cF9zaXplX20gPSBtaW4obnVtX3BpZF9tIC0gZmlyc3RfcGlkX20sIEdST1VQX1NJWkVfTSkKICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgcGlkX24gPSAocGlkICUgbnVtX3BpZF9pbl9ncm91cCkgLy8gZ3JvdXBfc2l6ZV9tCgogICAgb2Zmc19hbSA9IChwaWRfbSAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pKSAlIE0KICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQogICAgYV9wdHJzID0gQSArIChvZmZzX2FtWzosIE5vbmVdICogc3RyaWRlX2FtICsgb2Zmc19rW05vbmUsIDpdICogc3RyaWRlX2FrKQogICAgYl9wdHJzID0gQiArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgIEFzX3B0cnMgPSBBcyArIG9mZnNfYW0gKiBzdHJpZGVfQXNfbQogICAgb2Zmc19ic24gPSBvZmZzX2JuIC8vIGdyb3VwX24KICAgIEJzX3B0cnMgPSBCcyArIG9mZnNfYnNuICogc3RyaWRlX0JzX24KCiAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCiAgICAjIG1hbnVhbGx5IHVucm9sbCB0byA0IGl0ZXJhdGlvbnMKICAgIFVOUk9MTF9GQUNUT1IgPSAxCiAgICBmb3IgayBpbiByYW5nZSgwLCB0bC5jZGl2KEssIEJMT0NLX1NJWkVfSyAqIFVOUk9MTF9GQUNUT1IpKToKICAgICAgICAjIDFzdCBpdGVyYXRpb24KICAgICAgICAjIGEgPSB0bC5sb2FkKAogICAgICAgICMgICAgIGFfcHRycywKICAgICAgICAjICAgICBtYXNrPW9mZnNfa1tOb25lLCA6XSA8IEsgLSAoayAqIFVOUk9MTF9GQUNUT1IpICogQkxPQ0tfU0laRV9LLAogICAgICAgICMgICAgIG90aGVyPTAuMCwKICAgICAgICAjICkKICAgICAgICAjIGIgPSB0bC5sb2FkKAogICAgICAgICMgICAgIGJfcHRycywKICAgICAgICAjICAgICBtYXNrPW9mZnNfa1s6LCBOb25lXSA8IEsgLSAoayAqIFVOUk9MTF9GQUNUT1IpICogQkxPQ0tfU0laRV9LLAogICAgICAgICMgICAgIG90aGVyPTAuMCwKICAgICAgICAjICkKCiAgICAgICAgYSA9IHRsLmxvYWQoCiAgICAgICAgICAgIGFfcHRycywKICAgICAgICApCiAgICAgICAgYiA9IHRsLmxvYWQoCiAgICAgICAgICAgIGJfcHRycywKICAgICAgICApCgogICAgICAgIGtfc3RhcnQgPSAoayAqIFVOUk9MTF9GQUNUT1IpICogQkxPQ0tfU0laRV9LCiAgICAgICAgb2Zmc19rcyA9IGtfc3RhcnQgLy8gZ3JvdXBfawogICAgICAgIGFfcyA9IHRsLmxvYWQoQXNfcHRycyArIG9mZnNfa3MgKiBzdHJpZGVfQXNfaykKICAgICAgICBiX3MgPSB0bC5sb2FkKEJzX3B0cnMgKyBvZmZzX2tzICogc3RyaWRlX0JzX2spCgogICAgICAgIGFjY3VtdWxhdG9yICs9IHRsLmRvdChhLCBiKSAqIGFfc1s6LCBOb25lXSAqIGJfc1tOb25lLCA6XQogICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICBiX3B0cnMgKz0gQkxPQ0tfU0laRV9LICogc3RyaWRlX2JrCgogICAgICAgICMgIyAybmQgaXRlcmF0aW9uCiAgICAgICAgIyBhID0gdGwubG9hZCgKICAgICAgICAjICAgICBhX3B0cnMsCiAgICAgICAgIyAgICAgbWFzaz1vZmZzX2tbTm9uZSwgOl0gPCBLIC0gKGsgKiBVTlJPTExfRkFDVE9SICsgMSkgKiBCTE9DS19TSVpFX0ssCiAgICAgICAgIyAgICAgb3RoZXI9MC4wLAogICAgICAgICMgKQogICAgICAgICMgYiA9IHRsLmxvYWQoCiAgICAgICAgIyAgICAgYl9wdHJzLAogICAgICAgICMgICAgIG1hc2s9b2Zmc19rWzosIE5vbmVdIDwgSyAtIChrICogVU5ST0xMX0ZBQ1RPUiArIDEpICogQkxPQ0tfU0laRV9LLAogICAgICAgICMgICAgIG90aGVyPTAuMCwKICAgICAgICAjICkKCiAgICAgICAgIyBrX3N0YXJ0ID0ga19zdGFydCArIEJMT0NLX1NJWkVfSwogICAgICAgICMgb2Zmc19rcyA9IGtfc3RhcnQgLy8gZ3JvdXBfawogICAgICAgICMgYV9zID0gdGwubG9hZChBc19wdHJzICsgb2Zmc19rcyAqIHN0cmlkZV9Bc19rKQogICAgICAgICMgYl9zID0gdGwubG9hZChCc19wdHJzICsgb2Zmc19rcyAqIHN0cmlkZV9Cc19rKQoKICAgICAgICAjIGFjY3VtdWxhdG9yICs9IHRsLmRvdChhLCBiKSAqIGFfc1s6LCBOb25lXSAqIGJfc1tOb25lLCA6XQogICAgICAgICMgYV9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9hawogICAgICAgICMgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICAjICMgIyAzcmQgaXRlcmF0aW9uCiAgICAgICAgIyBhID0gdGwubG9hZCgKICAgICAgICAjICAgICBhX3B0cnMsCiAgICAgICAgIyAgICAgbWFzaz1vZmZzX2tbTm9uZSwgOl0gPCBLIC0gKGsgKiBVTlJPTExfRkFDVE9SICsgMikgKiBCTE9DS19TSVpFX0ssCiAgICAgICAgIyAgICAgb3RoZXI9MC4wLAogICAgICAgICMgKQogICAgICAgICMgYiA9IHRsLmxvYWQoCiAgICAgICAgIyAgICAgYl9wdHJzLAogICAgICAgICMgICAgIG1hc2s9b2Zmc19rWzosIE5vbmVdIDwgSyAtIChrICogVU5ST0xMX0ZBQ1RPUiArIDIpICogQkxPQ0tfU0laRV9LLAogICAgICAgICMgICAgIG90aGVyPTAuMCwKICAgICAgICAjICkKCiAgICAgICAgIyBrX3N0YXJ0ID0ga19zdGFydCArIEJMT0NLX1NJWkVfSwogICAgICAgICMgb2Zmc19rcyA9IGtfc3RhcnQgLy8gZ3JvdXBfawogICAgICAgICMgYV9zID0gdGwubG9hZChBc19wdHJzICsgb2Zmc19rcyAqIHN0cmlkZV9Bc19rKQogICAgICAgICMgYl9zID0gdGwubG9hZChCc19wdHJzICsgb2Zmc19rcyAqIHN0cmlkZV9Cc19rKQoKICAgICAgICAjIGFjY3VtdWxhdG9yICs9IHRsLmRvdChhLCBiKSAqIGFfc1s6LCBOb25lXSAqIGJfc1tOb25lLCA6XQogICAgICAgICMgYV9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9hawogICAgICAgICMgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICAjICMgNHRoIGl0ZXJhdGlvbgogICAgICAgICMgYSA9IHRsLmxvYWQoCiAgICAgICAgIyAgICAgYV9wdHJzLAogICAgICAgICMgICAgIG1hc2s9b2Zmc19rW05vbmUsIDpdIDwgSyAtIChrICogVU5ST0xMX0ZBQ1RPUiArIDMpICogQkxPQ0tfU0laRV9LLAogICAgICAgICMgICAgIG90aGVyPTAuMCwKICAgICAgICAjICkKICAgICAgICAjIGIgPSB0bC5sb2FkKAogICAgICAgICMgICAgIGJfcHRycywKICAgICAgICAjICAgICBtYXNrPW9mZnNfa1s6LCBOb25lXSA8IEsgLSAoayAqIFVOUk9MTF9GQUNUT1IgKyAzKSAqIEJMT0NLX1NJWkVfSywKICAgICAgICAjICAgICBvdGhlcj0wLjAsCiAgICAgICAgIyApCgogICAgICAgICMga19zdGFydCA9IGtfc3RhcnQgKyBCTE9DS19TSVpFX0sKICAgICAgICAjIG9mZnNfa3MgPSBrX3N0YXJ0IC8vIGdyb3VwX2sKICAgICAgICAjIGFfcyA9IHRsLmxvYWQoQXNfcHRycyArIG9mZnNfa3MgKiBzdHJpZGVfQXNfaykKICAgICAgICAjIGJfcyA9IHRsLmxvYWQoQnNfcHRycyArIG9mZnNfa3MgKiBzdHJpZGVfQnNfaykKCiAgICAgICAgIyBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikgKiBhX3NbOiwgTm9uZV0gKiBiX3NbTm9uZSwgOl0KICAgICAgICAjIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAjIGJfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYmsKCiAgICBpZiBDLmR0eXBlLmVsZW1lbnRfdHkgPT0gdGwuYmZsb2F0MTY6CiAgICAgICAgYyA9IGFjY3VtdWxhdG9yLnRvKHRsLmJmbG9hdDE2KQogICAgZWxpZiBDLmR0eXBlLmVsZW1lbnRfdHkgPT0gdGwuZmxvYXQxNjoKICAgICAgICBjID0gYWNjdW11bGF0b3IudG8odGwuZmxvYXQxNikKICAgIGVsc2U6CiAgICAgICAgYyA9IGFjY3VtdWxhdG9yLnRvKHRsLmZsb2F0MzIpCgogICAgb2Zmc19jbSA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgIG9mZnNfY24gPSBwaWRfbiAqIEJMT0NLX1NJWkVfTiArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX04pCiAgICBjX3B0cnMgPSBDICsgc3RyaWRlX2NtICogb2Zmc19jbVs6LCBOb25lXSArIHN0cmlkZV9jbiAqIG9mZnNfY25bTm9uZSwgOl0KICAgIGNfbWFzayA9IChvZmZzX2NtWzosIE5vbmVdIDwgTSkgJiAob2Zmc19jbltOb25lLCA6XSA8IE4pCiAgICB0bC5zdG9yZShjX3B0cnMsIGMsIG1hc2s9Y19tYXNrKQoKZGVmIHRyaXRvbl9jdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBtYXRyaXggbXVsdGlwbGljYXRpb24gd2l0aCBibG9jay13aXNlIHF1YW50aXphdGlvbi4KCiAgICBJdCB0YWtlcyB0d28gaW5wdXQgdGVuc29ycyBgQWAgYW5kIGBCYCB3aXRoIHNjYWxlcyBgQXNgIGFuZCBgQnNgLgogICAgVGhlIG91dHB1dCBpcyByZXR1cm5lZCBpbiB0aGUgc3BlY2lmaWVkIGBvdXRwdXRfZHR5cGVgLgoKICAgIEFyZ3M6CiAgICAgICAgQTogVGhlIGlucHV0IHRlbnNvciwgZS5nLiwgYWN0aXZhdGlvbi4KICAgICAgICBCOiBUaGUgaW5wdXQgdGVuc29yLCBlLmcuLCB3ZWlnaHQuCiAgICAgICAgQXM6IFRoZSBwZXItdG9rZW4tZ3JvdXAgcXVhbnRpemF0aW9uIHNjYWxlIGZvciBgQWAuCiAgICAgICAgQnM6IFRoZSBwZXItYmxvY2sgcXVhbnRpemF0aW9uIHNjYWxlIGZvciBgQmAuCiAgICAgICAgYmxvY2tfc2l6ZTogVGhlIGJsb2NrIHNpemUgZm9yIHBlci1ibG9jayBxdWFudGl6YXRpb24uIEl0IHNob3VsZCBiZSAyLWRpbSwgZS5nLiwgWzEyOCwgMTI4XS4KICAgICAgICBvdXRwdXRfZHl0cGU6IFRoZSBkdHlwZSBvZiB0aGUgcmV0dXJuZWQgdGVuc29yLgoKICAgIFJldHVybnM6CiAgICAgICAgdG9yY2guVGVuc29yOiBUaGUgcmVzdWx0IG9mIG1hdG11bC4KICAgICIiIgogICAgQSwgQiwgQXMsIEJzLCBDID0gZGF0YQogICAgCiAgICAjIEEgPSBBLmNvbnRpZ3VvdXMoKQogICAgIyBCID0gQi5jb250aWd1b3VzKCkgCgogICAgYmxvY2tfc2l6ZSA9ICgxMjgsIDEyOCkKICAgIAogICAgYXNzZXJ0IGxlbihibG9ja19zaXplKSA9PSAyCiAgICBibG9ja19uLCBibG9ja19rID0gYmxvY2tfc2l6ZVswXSwgYmxvY2tfc2l6ZVsxXQogICAgCiAgICBNID0gQS5udW1lbCgpIC8vIEEuc2hhcGVbLTFdCgogICAgYXNzZXJ0IEIubmRpbSA9PSAyIGFuZCBCcy5uZGltID09IDIKICAgIE4sIEsgPSBCLnNoYXBlCiAgICBhc3NlcnQgdHJpdG9uLmNkaXYoTiwgYmxvY2tfbikgPT0gQnMuc2hhcGVbMF0KICAgIGFzc2VydCB0cml0b24uY2RpdihLLCBibG9ja19rKSA9PSBCcy5zaGFwZVsxXQoKCiAgICBjb25maWdzID0gTm9uZQogICAgZGVmIGdyaWQoTUVUQSk6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgdHJpdG9uLmNkaXYoTSwgTUVUQVsiQkxPQ0tfU0laRV9NIl0pICogdHJpdG9uLmNkaXYoTiwgTUVUQVsiQkxPQ0tfU0laRV9OIl0pLAogICAgICAgICkKCiAgICBrZXJuZWwgPSBfdzhhOF9ibG9ja19mcDhfbWF0bXVsX3Vucm9sbGVkeDQKCiAgICBrZXJuZWxbZ3JpZF0oCiAgICAgICAgQSwKICAgICAgICBCLAogICAgICAgIEMsCiAgICAgICAgQXMsCiAgICAgICAgQnMsCiAgICAgICAgTSwKICAgICAgICBOLAogICAgICAgIEssCiAgICAgICAgYmxvY2tfbiwKICAgICAgICBibG9ja19rLAogICAgICAgIEEuc3RyaWRlKC0yKSwKICAgICAgICBBLnN0cmlkZSgtMSksCiAgICAgICAgQi5zdHJpZGUoMSksCiAgICAgICAgQi5zdHJpZGUoMCksCiAgICAgICAgQy5zdHJpZGUoLTIpLAogICAgICAgIEMuc3RyaWRlKC0xKSwKICAgICAgICBBcy5zdHJpZGUoLTIpLAogICAgICAgIEFzLnN0cmlkZSgtMSksCiAgICAgICAgQnMuc3RyaWRlKDEpLAogICAgICAgIEJzLnN0cmlkZSgwKSwKICAgICAgICAjICoqY29uZmlnLAogICAgKQoKICAgIHJldHVybiBDCgoKCgpDUFBfV1JBUFBFUiA9ICIiIgp2b2lkIGZwOF9tbSh0b3JjaDo6VGVuc29yIGEsIHRvcmNoOjpUZW5zb3IgYiwgdG9yY2g6OlRlbnNvciBhcywgdG9yY2g6OlRlbnNvciBicywgdG9yY2g6OlRlbnNvciBjKTsKIiIiCgpDVURBX1NSQyA9ICIiIgojaW5jbHVkZSA8aGlwL2hpcF9ydW50aW1lLmg+CiNpbmNsdWRlIDxoaXAvaGlwX2ZwMTYuaD4KCiNpbmNsdWRlIDxoaXAvaGlwX2ZwOC5oPgoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCnVzaW5nIGhhbGYgPSBfX2hhbGY7CnVzaW5nIGZsb2F0MTZfdCA9IF9GbG9hdDE2OwoKdXNpbmcgZnA4X3QgPSBfX2hpcF9mcDhfZTRtM19mbnV6OwoKI2luY2x1ZGUgPHJhbmRvbT4KCiNpbmNsdWRlIDxyb2N3bW1hL3JvY3dtbWEuaHBwPgoKI2RlZmluZSBGUkFHX00gMzIKI2RlZmluZSBGUkFHX04gMzIKI2RlZmluZSBGUkFHX0sgMTYKCiNkZWZpbmUgTlVNX1JFUEVBVF9NTiAoNCkKCiNkZWZpbmUgQkxPQ0tfU0laRV9NIChGUkFHX00gKiBOVU1fUkVQRUFUX01OKQojZGVmaW5lIEJMT0NLX1NJWkVfTiAoRlJBR19OICogTlVNX1JFUEVBVF9NTikKI2RlZmluZSBCTE9DS19TSVpFX0sgKEZSQUdfSyAqIDgpCgojZGVmaW5lIFVTRV9BU00gZmFsc2UKI2RlZmluZSBBTFVfQVNZTiBmYWxzZQoKX19kZXZpY2VfXyBfX2lubGluZV9fIHZvaWQgX19zeW5jX3dhcnAodm9pZCkgeyBfX2FzbV9fIHZvbGF0aWxlKCJzX2JhcnJpZXIiIDogOiA6ICJtZW1vcnkiKTsgfQoKCmNvbnN0ZXhwciBjb25zdCBpbnQgQkxPQ0sgPSAxMjg7CgpfX2dsb2JhbF9fIHZvaWQgdl9tZm1hX2ludHJpbnNpY3NfdGVzdChjb25zdCBmcDhfdCogX19yZXN0cmljdF9fIGxocywgY29uc3QgZnA4X3QqIF9fcmVzdHJpY3RfXyByaHMsIF9faGlwX2JmbG9hdDE2KiBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtLCB1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZGEsIHVuc2lnbmVkIGludCBsZGIsIHVuc2lnbmVkIGludCBsZGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhcywgY29uc3QgZmxvYXQqIGJzKSB7CiAgICBpbnQgbGFuZV9pZCA9IHRocmVhZElkeC54ICUgd2FycFNpemU7CiAgICBjb25zdGV4cHIgdW5zaWduZWQgaW50IGVsZV9wZXJfdGhyZWFkID0gRlJBR19NICogRlJBR19OIC8gd2FycFNpemU7CgogICAgaW50IGNfcm93X2Jhc2UgPSAoYmxvY2tJZHgueCAqIEJMT0NLX1NJWkVfTSk7CiAgICBpbnQgY19jb2xfYmFzZSA9IChibG9ja0lkeC55ICogQkxPQ0tfU0laRV9OKTsKCiAgICB1c2luZyBmcDhfdCA9IF9faGlwX2ZwOF9lNG0zX2ZudXo7CgogICAgdXNpbmcgdWludF92MiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygyICogc2l6ZW9mKHVpbnQpKSkpIHVpbnQ7CgogICAgX19zaGFyZWRfXyBpbnQyIGxoc190aWxlW0JMT0NLX1NJWkVfSyAvIDhdW0JMT0NLX1NJWkVfTV07CiAgICBfX3NoYXJlZF9fIGludDIgcmhzX3RpbGVbQkxPQ0tfU0laRV9LIC8gOF1bQkxPQ0tfU0laRV9OXTsKCiAgICAvLyBmcDhfdCogbGhzX3RpbGVfZnA4X2Jhc2VfcHRyID0gJihsaHNfdGlsZV9mcDhbMF1bMF0pOwogICAgaW50MiogbGhzX3RpbGVfYmFzZV9wdHIgPSAoaW50MiopKCYobGhzX3RpbGVbMF1bMF0pKTsKICAgIGludDIqIHJoc190aWxlX2Jhc2VfcHRyID0gJihyaHNfdGlsZVswXVswXSk7CiAgICAvLyBmcDhfdCogcmhzX3RpbGVfYmFzZV9wdHIgPSAmKHJoc190aWxlWzBdWzBdKTsKCiAgICAvLyB0aGUgb3V0cHV0IGZyYWdtZW50IGlzIHN0b3JlZCBpbiA0IHggQWNjVkdQUnMgKHNlZSBDRE5BMyBJU0EpLCBlYWNoIHRocmVhZCBwcm9jZXNzIDQgZnAzMiBlbGVtZW50cwogICAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwogICAgdWludCByZXN1bHRfZnJhZ1syXVsxNl0gPSB7MH07CgogICAgaW50IHNuID0gKG4gKyBCTE9DSyAtIDEpIC8gQkxPQ0s7CiAgICBmbG9hdCBhc192WzJdW2VsZV9wZXJfdGhyZWFkXTsKCgogICAgaW50IHRocmVhZF9pZF9pbl9hX2Jsb2NrID0gdGhyZWFkSWR4LnggKyB0aHJlYWRJZHgueSAqIGJsb2NrRGltLng7CgogICAgZm9yIChpbnQgYmk9MDsgYmkgPCBrOyBiaSs9IEJMT0NLKSB7CiAgICAgICAgZmxvYXQgYnNfdiA9IGJzW2JpIC8gQkxPQ0sgKiBzbiArIGNfY29sX2Jhc2UgLyBCTE9DS107CgogICAgICAgIHVpbnQgYWNjX2ZyYWdbMl1bMTZdID0gezB9OwogICAgICAgIGZvcihpbnQgcmkgPSAwOyByaSA8IDI7ICsrcmkpIHsKICAgICAgICAgICAgZm9yIChpbnQgamo9MDsgamogPCBlbGVfcGVyX3RocmVhZCA7IGpqKyspIHsKICAgICAgICAgICAgICAgIGludCBqID0gcmkgKiBlbGVfcGVyX3RocmVhZCArIGpqOwogICAgICAgICAgICAgICAgYXV0byB4ID0gKCBsYW5lX2lkIC8gMzIgKSAlIDI7CiAgICAgICAgICAgICAgICBhdXRvIHogPSAoaiAvIDQpICogOCArIGogJSA0OwogICAgICAgICAgICAgICAgYXV0byBpbklkeCA9IGJpIC8gQkxPQ0sgKiBtICsgKHogKyB4ICogNCkgKyAodGhyZWFkSWR4LnkgLyA0ICogNjQpICsgY19yb3dfYmFzZTsKICAgICAgICAgICAgICAgIGFzX3ZbcmldW2pqXSA9IGFzW2luSWR4XTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3RleHByIGludCB0aHJfcGVyX3JvdyA9IDE2OyAvLyA2NCAvIDQgPSAxNgogICAgICAgIGlmKHRocmVhZElkeC55IDwgNCkKICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0ZXhwciBpbnQgdmVjX3NpemUgPSA4OyAvLyAxMjggLyAoNjQgLyA0KSA9IDgKICAgICAgICAgICAgaW50IHNfY29sID0gKHRocmVhZF9pZF9pbl9hX2Jsb2NrICUgdGhyX3Blcl9yb3cpOwogICAgICAgICAgICBpbnQgc19yb3cgPSAodGhyZWFkX2lkX2luX2FfYmxvY2sgLyB0aHJfcGVyX3Jvdyk7CgogICAgICAgICAgICAvLyBtIGRpbQogICAgICAgICAgICBpbnQgZ19jb2wgPSBjX3Jvd19iYXNlICsgc19jb2wgKiB2ZWNfc2l6ZTsKICAgICAgICAgICAgLy8gayBkaW0KICAgICAgICAgICAgaW50IGdfcm93ID0gYmkgKyBzX3JvdyAqIHZlY19zaXplOwoKICAgICAgICAgICAgZnA4X3QgdG1wX2ZwOFt2ZWNfc2l6ZSAqIHZlY19zaXplXTsKICAgICAgICAgICAgZnA4X3QgdG1wMl9mcDhbdmVjX3NpemUgKiB2ZWNfc2l6ZV07CgogICAgICAgICAgICBmb3IoaW50IGtrID0gMDsga2sgPCB2ZWNfc2l6ZTsgKytraykgewogICAgICAgICAgICAgICAgaW50MiogbGhzXzJpX3B0ciA9IChpbnQyICopKGxocyArIChnX3JvdyArIGtrKSAqIGxkYSArIGdfY29sKTsKICAgICAgICAgICAgICAgIGF1dG8gcHRyID0gdG1wX2ZwOCArIGtrICogdmVjX3NpemU7CiAgICAgICAgICAgICAgICBpbnQyKiBwdHJfMmlfcHRyID0gKGludDIqKXB0cjsKICAgICAgICAgICAgICAgICpwdHJfMmlfcHRyID0gKmxoc18yaV9wdHI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcihpbnQgdHIgPSAwOyB0ciA8IHZlY19zaXplOyArK3RyKSB7CiAgICAgICAgICAgICAgICBmb3IoaW50IHRjID0gMDsgdGMgPCB2ZWNfc2l6ZTsgKyt0YykgewogICAgICAgICAgICAgICAgICAgIHRtcDJfZnA4W3RjICogdmVjX3NpemUgKyB0cl0gPSB0bXBfZnA4W3RyICogdmVjX3NpemUgKyB0Y107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcihpbnQga2sgPSAwOyBrayA8IHZlY19zaXplOyArK2trKSB7CiAgICAgICAgICAgICAgICBpbnQyKiBsaHNfdGlsZV8yaV9wdHIgPSAoaW50MiAqKShsaHNfdGlsZV9iYXNlX3B0ciArIHNfcm93ICogQkxPQ0tfU0laRV9NICsgc19jb2wgKiA4ICsga2spOwogICAgICAgICAgICAgICAgKmxoc190aWxlXzJpX3B0ciA9ICooKGludDIqKSh0bXAyX2ZwOCArIGtrICogdmVjX3NpemUpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZm9yIGRlYnVnLgogICAgICAgICAgICAvLyBpZih0aHJlYWRJZHgueCA9PSAwICYmIHRocmVhZElkeC55ID09IDApIHsKICAgICAgICAgICAgLy8gICAgIGZwOF90KiBwdHIgPSAoZnA4X3QqKSgmKGxoc190aWxlWzBdWzBdKSk7CiAgICAgICAgICAgIC8vICAgICBmb3IoaW50IHBrID0gMDsgcGsgPCAxMjg7ICsrcGspeyAKICAgICAgICAgICAgLy8gICAgICAgICBmb3IoaW50IHBtID0gMDsgcG0gPCAxMjg7ICsrcG0pIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgaW50IGlkeCA9IHBrICogMTI4ICsgcG07CiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHB0cltpZHhdID0gMC41OwogICAgICAgICAgICAvLyAgICAgICAgIH0KICAgICAgICAgICAgLy8gICAgIH0KICAgICAgICAgICAgLy8gfQogICAgICAgIH0gLy8gbG9hZF90aWxlX2EKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB0aHJlYWRfaWRfaW5fYV9ibG9jayA9IHRocmVhZF9pZF9pbl9hX2Jsb2NrICUgMjU2OwogICAgICAgICAgICBjb25zdGV4cHIgaW50IHZlY19zaXplID0gODsKICAgICAgICAgICAgaW50IHNfY29sID0gKHRocmVhZF9pZF9pbl9hX2Jsb2NrICUgdGhyX3Blcl9yb3cpOwogICAgICAgICAgICBpbnQgc19yb3cgPSAodGhyZWFkX2lkX2luX2FfYmxvY2sgLyB0aHJfcGVyX3Jvdyk7CgogICAgICAgICAgICBpbnQgZ19jb2wgPSBjX2NvbF9iYXNlICsgc19jb2wgKiB2ZWNfc2l6ZTsKICAgICAgICAgICAgaW50IGdfcm93ID0gYmkgKyBzX3JvdyAqIHZlY19zaXplOwoKICAgICAgICAgICAgZnA4X3QgdG1wX2ZwOFt2ZWNfc2l6ZSAqIHZlY19zaXplXTsKICAgICAgICAgICAgZnA4X3QgdG1wMl9mcDhbdmVjX3NpemUgKiB2ZWNfc2l6ZV07CgogICAgICAgICAgICBmb3IoaW50IGtrID0gMDsga2sgPCB2ZWNfc2l6ZTsgKytraykgewogICAgICAgICAgICAgICAgaW50MiogcmhzXzJpX3B0ciA9IChpbnQyKikocmhzICsgKGdfcm93ICsga2spICogbGRiICsgZ19jb2wpOwogICAgICAgICAgICAgICAgYXV0byBwdHIgPSB0bXBfZnA4ICsga2sgKiB2ZWNfc2l6ZTsKICAgICAgICAgICAgICAgIGludDIqIHB0cl8yaV9wdHIgPSAoaW50MiopcHRyOwogICAgICAgICAgICAgICAgKnB0cl8yaV9wdHIgPSAqcmhzXzJpX3B0cjsgICAgIAogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IoaW50IHRyID0gMDsgdHIgPCB2ZWNfc2l6ZTsgKyt0cikgewogICAgICAgICAgICAgICAgZm9yKGludCB0YyA9IDA7IHRjIDwgdmVjX3NpemU7ICsrdGMpIHsKICAgICAgICAgICAgICAgICAgICB0bXAyX2ZwOFt0YyAqIHZlY19zaXplICsgdHJdID0gdG1wX2ZwOFt0ciAqIHZlY19zaXplICsgdGNdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcihpbnQga2sgPSAwOyBrayA8IHZlY19zaXplOyArK2trKSB7CiAgICAgICAgICAgICAgICBpbnQyKiByaHNfdGlsZV8yaV9wdHIgPSAoaW50MiAqKShyaHNfdGlsZV9iYXNlX3B0ciArIHNfcm93ICogQkxPQ0tfU0laRV9OICsgc19jb2wgKiA4ICsga2spOwogICAgICAgICAgICAgICAgKnJoc190aWxlXzJpX3B0ciA9ICooKGludDIqKSh0bXAyX2ZwOCArIGtrICogdmVjX3NpemUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gLy8gbG9hZF90aWxlX2IKCiAgICAgICAgX19zeW5jdGhyZWFkcygpOwoKCiAgICAgICAgZm9yKGludCBpaSA9IDA7IGlpIDwgQkxPQ0s7IGlpICs9IDE2KSB7CiAgICAgICAgICAgIGludCBpID0gYmkgKyBpaTsKCiAgICAgICAgICAgIGZwOF90IHZfYV9mcmFnWzJdWzhdID0gezB9OwogICAgICAgICAgICBmcDhfdCBiX2ZyYWdbOF0gPSB7MH07CgogICAgICAgICAgICBpbnQyKiBsaHNfdGlsZV9wdHIgPSBudWxscHRyOwogICAgICAgICAgICBpbnQyKiByaHNfdGlsZV9wdHIgPSBudWxscHRyOwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgc19yb3cgPSAobGFuZV9pZCAvIDMyKTsKICAgICAgICAgICAgICAgIGludCBzX2NvbCA9IChsYW5lX2lkICUgMzIpOwogICAgICAgICAgICAgICAgaW50IHdhcnBfY29sID0gdGhyZWFkSWR4LnkgLyA0OwogICAgICAgICAgICAgICAgbGhzX3RpbGVfcHRyID0gbGhzX3RpbGVfYmFzZV9wdHIgKyhzX3JvdyArIGlpIC8gOCkgKiBCTE9DS19TSVpFX00gKyBzX2NvbCArIHdhcnBfY29sICogNjQ7CgogICAgICAgICAgICAgICAgZm9yKGludCByaSA9IDA7IHJpIDwgMjsgKytyaSkgewogICAgICAgICAgICAgICAgICAgIGludDIgKiBwdHIgPSAoaW50MiAqKXZfYV9mcmFnW3JpXTsKICAgICAgICAgICAgICAgICAgICAqcHRyID0gbGhzX3RpbGVfcHRyW3JpICogMzJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IC8vICBjb21wdXRlIHNtZW0gd2luZG93IGZvciBjb21wdXRlCiAgICAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IHNfcm93ID0gKGxhbmVfaWQgLyAzMik7CiAgICAgICAgICAgICAgICBpbnQgc19jb2wgPSAobGFuZV9pZCAlIDMyKTsKICAgICAgICAgICAgICAgIGludCB3YXJwX2NvbCA9IHRocmVhZElkeC55ICUgNDsKICAgICAgICAgICAgICAgIHJoc190aWxlX3B0ciA9IHJoc190aWxlX2Jhc2VfcHRyICsgKHNfcm93ICsgaWkgLyA4KSAqIEJMT0NLX1NJWkVfTiArIHNfY29sICsgd2FycF9jb2wgKiAzMjsKCiAgICAgICAgICAgICAgICBpbnQyKiBiX3B0ciA9IChpbnQyICopYl9mcmFnOwogICAgICAgICAgICAgICAgKmJfcHRyID0gKiByaHNfdGlsZV9wdHI7CiAgICAgICAgICAgIH0gLy8gY29tcHV0ZSBzbWVtIHdpbmRvdyBmb3IgY29tcHV0ZQogICAgCiAgICAgICAgICAgIGZvcihpbnQgcmkgPSAwOyByaSA8IDI7ICsrcmkpIHsKICAgICAgICAgICAgICAgIC8vIGZwOF90IGFfZnJhZ1s4XSA9IHswLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNX07CiAgICAgICAgICAgICAgICAvLyBmcDhfdCBiX2ZyYWdbOF0gPSB7MC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjV9OwogICAgICAgICAgICAgICAgYXV0byBhX2ZyYWcgPSB2X2FfZnJhZ1tyaV07CgogICAgICAgICAgICAgICAgbG9uZyAqYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihhX2ZyYWcpOwogICAgICAgICAgICAgICAgbG9uZyAqYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihiX2ZyYWcpOwogICAgICAgIAogICAgICAgICAgICAgICAgLy8gZmxvYXR4MTYgKmQgPSByZWludGVycHJldF9jYXN0PGZsb2F0eDE2ICo+KHJlc3VsdF9mcmFnW3JpICogMiArIHJqXSk7CiAgICAgICAgICAgICAgICBmbG9hdHgxNiAqZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXR4MTYgKj4oYWNjX2ZyYWdbcmldKTsKICAgICAgICAgICAgICAgIF9fc3luY193YXJwKCk7CiAgICAgICAgCiAgICAgICAgICAgICAgICAqZCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICAgICAgICAgICAgICAqYSwKICAgICAgICAgICAgICAgICAgICAqYiwKICAgICAgICAgICAgICAgICAgICAqZCwgMCwgMCwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHsKICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICAgICAgZm9yKGludCByaSA9IDA7IHJpIDwgMjsgKytyaSkgewogICAgICAgICAgICAgICAgZmxvYXR4MTYgKmEgPSByZWludGVycHJldF9jYXN0PGZsb2F0eDE2ICo+KGFzX3ZbcmldKTsKICAgICAgICAgICAgICAgIGZsb2F0eDE2ICpkID0gcmVpbnRlcnByZXRfY2FzdDxmbG9hdHgxNiAqPihhY2NfZnJhZ1tyaV0pOwogICAgICAgICAgICAgICAgZmxvYXR4MTYgKnIgPSByZWludGVycHJldF9jYXN0PGZsb2F0eDE2ICo+KHJlc3VsdF9mcmFnW3JpXSk7CgogICAgICAgICAgICAgICAgYXV0byB0bXAgPSBic192ICogKCpkKSAqICgqYSk7CiAgICAgICAgICAgICAgICAoKnIpICs9IHRtcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBTYXZlIFRoZSBSZXN1bHQuCiAgICBfX2hpcF9iZmxvYXQxNiogYmFzZV9vdXRwdXRfdGlsZV9wdHIgPSBvdXRwdXQgKyBjX3Jvd19iYXNlICogbGRjICsgY19jb2xfYmFzZSArICh0aHJlYWRJZHgueSAvIDQpICogNjQgKiBsZGMgKyAodGhyZWFkSWR4LnkgJSA0KSAqIDMyOwoKICAgIGZvcihpbnQgcmkgPSAwOyByaSA8IDI7ICsrcmkpIHsKICAgICAgICBfX2hpcF9iZmxvYXQxNiogdG1wX291dHB1dF9wdHIgPSBiYXNlX291dHB1dF90aWxlX3B0ciArIHJpICogMzIgKiBsZGM7CiAgICAgICAgZm9yKGludCByaiA9IDA7IHJqIDwgMTsgKytyaikgewogICAgICAgICAgICB0bXBfb3V0cHV0X3B0ciA9IHRtcF9vdXRwdXRfcHRyICsgcmogKiAzMjsKICAgICAgICAgICAgZmxvYXR4MTYgKmQgPSByZWludGVycHJldF9jYXN0PGZsb2F0eDE2ICo+KHJlc3VsdF9mcmFnW3JpXSk7CiAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IGVsZV9wZXJfdGhyZWFkOyBqKyspIHsKICAgICAgICAgICAgICAgIGF1dG8geCA9ICggbGFuZV9pZCAvIDMyICkgJSAyOwogICAgICAgICAgICAgICAgYXV0byB5ID0gbGFuZV9pZCAlIDMyOyAvLyB5ICsgaiAqIDE2IGlzIHRoZSBvdXRwdXQgZGF0YSBsYW5lIElECiAgICAgICAgICAgICAgICBhdXRvIHogPSAoaiAvIDQpICogOCArIGogJSA0OwogICAgICAgICAgICAgICAgYXV0byBvdXRJZHggPSB5ICsgKHogKyB4ICogNCkgKiBsZGM7CiAgICAgICAgICAgICAgICB0bXBfb3V0cHV0X3B0cltvdXRJZHhdID0gKF9faGlwX2JmbG9hdDE2KSgoKmQpW2pdKTsKCiAgICAgICAgICAgICAgICAvLyB0bXBfb3V0cHV0X3B0cltvdXRJZHhdID0gdGhyZWFkX2lkX2luX2FfYmxvY2s7CiAgICAgICAgICAgICAgICAvLyB0bXBfb3V0cHV0X3B0cltvdXRJZHhdID0gdGhyZWFkSWR4Lnk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCgoKCl9fZ2xvYmFsX18gdm9pZCB2X21mbWFfaW50cmluc2ljc190ZXN0X3NwbGl0ayhjb25zdCBmcDhfdCogX19yZXN0cmljdF9fIGxocywgY29uc3QgZnA4X3QqIF9fcmVzdHJpY3RfXyByaHMsIGZsb2F0KiBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtLCB1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZGEsIHVuc2lnbmVkIGludCBsZGIsIHVuc2lnbmVkIGludCBsZGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhcywgY29uc3QgZmxvYXQqIGJzLCBpbnQgc3BsaXRrKSB7CiAgICBpbnQgbGFuZV9pZCA9IHRocmVhZElkeC54ICUgd2FycFNpemU7CiAgICBjb25zdGV4cHIgdW5zaWduZWQgaW50IGVsZV9wZXJfdGhyZWFkID0gRlJBR19NICogRlJBR19OIC8gd2FycFNpemU7CgogICAgaW50IGtfc2l6ZSA9IGsgLyBzcGxpdGs7CiAgICBpbnQgc3RhcnRfayA9IGJsb2NrSWR4LnogKiBrX3NpemU7CiAgICBpbnQgZW5kX2sgPSBzdGFydF9rICsga19zaXplOwoKICAgIGludCBjX3Jvd19iYXNlID0gKGJsb2NrSWR4LnggKiBCTE9DS19TSVpFX00pOwogICAgaW50IGNfY29sX2Jhc2UgPSAoYmxvY2tJZHgueSAqIEJMT0NLX1NJWkVfTik7CgogICAgdXNpbmcgZnA4X3QgPSBfX2hpcF9mcDhfZTRtM19mbnV6OwogICAgdXNpbmcgdWludF92MiA9IF9fYXR0cmlidXRlX18oKF9fdmVjdG9yX3NpemVfXygyICogc2l6ZW9mKHVpbnQpKSkpIHVpbnQ7CgogICAgX19zaGFyZWRfXyBpbnQyIGxoc190aWxlW0JMT0NLX1NJWkVfSyAvIDhdW0JMT0NLX1NJWkVfTV07CiAgICBfX3NoYXJlZF9fIGludDIgcmhzX3RpbGVbQkxPQ0tfU0laRV9LIC8gOF1bQkxPQ0tfU0laRV9OXTsKCiAgICBpbnQyKiBsaHNfdGlsZV9iYXNlX3B0ciA9ICYobGhzX3RpbGVbMF1bMF0pOwogICAgaW50MiogcmhzX3RpbGVfYmFzZV9wdHIgPSAmKHJoc190aWxlWzBdWzBdKTsKCiAgICAvLyB0aGUgb3V0cHV0IGZyYWdtZW50IGlzIHN0b3JlZCBpbiA0IHggQWNjVkdQUnMgKHNlZSBDRE5BMyBJU0EpLCBlYWNoIHRocmVhZCBwcm9jZXNzIDQgZnAzMiBlbGVtZW50cwogICAgdXNpbmcgZmxvYXR4MTYgPSBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMTYgKiBzaXplb2YoZmxvYXQpKSkpIGZsb2F0OwogICAgdWludCByZXN1bHRfZnJhZ1syXVsxNl0gPSB7MH07CgogICAgaW50IHNuID0gKG4gKyBCTE9DSyAtIDEpIC8gQkxPQ0s7CiAgICBmbG9hdCBhc192WzJdW2VsZV9wZXJfdGhyZWFkXTsKCgogICAgaW50IHRocmVhZF9pZF9pbl9hX2Jsb2NrID0gdGhyZWFkSWR4LnggKyB0aHJlYWRJZHgueSAqIGJsb2NrRGltLng7CgogICAgZm9yIChpbnQgYmkgPSBzdGFydF9rOyBiaSA8IGVuZF9rOyBiaSs9IEJMT0NLKSB7CiAgICAgICAgZmxvYXQgYnNfdiA9IGJzW2JpIC8gQkxPQ0sgKiBzbiArIGNfY29sX2Jhc2UgLyBCTE9DS107CgogICAgICAgIHVpbnQgYWNjX2ZyYWdbMl1bMTZdID0gezB9OwogICAgICAgIGZvcihpbnQgcmkgPSAwOyByaSA8IDI7ICsrcmkpIHsKICAgICAgICAgICAgZm9yIChpbnQgamo9MDsgamogPCBlbGVfcGVyX3RocmVhZCA7IGpqKyspIHsKICAgICAgICAgICAgICAgIGludCBqID0gcmkgKiBlbGVfcGVyX3RocmVhZCArIGpqOwogICAgICAgICAgICAgICAgYXV0byB4ID0gKCBsYW5lX2lkIC8gMzIgKSAlIDI7CiAgICAgICAgICAgICAgICBhdXRvIHogPSAoaiAvIDQpICogOCArIGogJSA0OwogICAgICAgICAgICAgICAgYXV0byBpbklkeCA9IGJpIC8gQkxPQ0sgKiBtICsgKHogKyB4ICogNCkgKyAodGhyZWFkSWR4LnkgLyA0ICogNjQpICsgY19yb3dfYmFzZTsKICAgICAgICAgICAgICAgIGFzX3ZbcmldW2pqXSA9IGFzW2luSWR4XTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3RleHByIGludCB0aHJfcGVyX3JvdyA9IDE2OyAvLyA2NCAvIDQgPSAxNgogICAgICAgIGlmKHRocmVhZElkeC55IDwgNCkKICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0ZXhwciBpbnQgdmVjX3NpemUgPSA4OyAvLyAxMjggLyAoNjQgLyA0KSA9IDgKICAgICAgICAgICAgaW50IHNfY29sID0gKHRocmVhZF9pZF9pbl9hX2Jsb2NrICUgdGhyX3Blcl9yb3cpOwogICAgICAgICAgICBpbnQgc19yb3cgPSAodGhyZWFkX2lkX2luX2FfYmxvY2sgLyB0aHJfcGVyX3Jvdyk7CgogICAgICAgICAgICAvLyBtIGRpbQogICAgICAgICAgICBpbnQgZ19jb2wgPSBjX3Jvd19iYXNlICsgc19jb2wgKiB2ZWNfc2l6ZTsKICAgICAgICAgICAgLy8gayBkaW0KICAgICAgICAgICAgaW50IGdfcm93ID0gYmkgKyBzX3JvdyAqIHZlY19zaXplOwoKICAgICAgICAgICAgZnA4X3QgdG1wX2ZwOFt2ZWNfc2l6ZSAqIHZlY19zaXplXTsKICAgICAgICAgICAgZnA4X3QgdG1wMl9mcDhbdmVjX3NpemUgKiB2ZWNfc2l6ZV07CgogICAgICAgICAgICBmb3IoaW50IGtrID0gMDsga2sgPCB2ZWNfc2l6ZTsgKytraykgewogICAgICAgICAgICAgICAgaW50MiogbGhzXzJpX3B0ciA9IChpbnQyICopKGxocyArIChnX3JvdyArIGtrKSAqIGxkYSArIGdfY29sKTsKICAgICAgICAgICAgICAgIGF1dG8gcHRyID0gdG1wX2ZwOCArIGtrICogdmVjX3NpemU7CiAgICAgICAgICAgICAgICBpbnQyKiBwdHJfMmlfcHRyID0gKGludDIqKXB0cjsKICAgICAgICAgICAgICAgICpwdHJfMmlfcHRyID0gKmxoc18yaV9wdHI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcihpbnQgdHIgPSAwOyB0ciA8IHZlY19zaXplOyArK3RyKSB7CiAgICAgICAgICAgICAgICBmb3IoaW50IHRjID0gMDsgdGMgPCB2ZWNfc2l6ZTsgKyt0YykgewogICAgICAgICAgICAgICAgICAgIHRtcDJfZnA4W3RjICogdmVjX3NpemUgKyB0cl0gPSB0bXBfZnA4W3RyICogdmVjX3NpemUgKyB0Y107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcihpbnQga2sgPSAwOyBrayA8IHZlY19zaXplOyArK2trKSB7CiAgICAgICAgICAgICAgICBpbnQyKiBsaHNfdGlsZV8yaV9wdHIgPSAoaW50MiAqKShsaHNfdGlsZV9iYXNlX3B0ciArIHNfcm93ICogQkxPQ0tfU0laRV9NICsgc19jb2wgKiA4ICsga2spOwogICAgICAgICAgICAgICAgKmxoc190aWxlXzJpX3B0ciA9ICooKGludDIqKSh0bXAyX2ZwOCArIGtrICogdmVjX3NpemUpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZm9yIGRlYnVnLgogICAgICAgICAgICAvLyBpZih0aHJlYWRJZHgueCA9PSAwICYmIHRocmVhZElkeC55ID09IDApIHsKICAgICAgICAgICAgLy8gICAgIGZwOF90KiBwdHIgPSAoZnA4X3QqKSgmKGxoc190aWxlWzBdWzBdKSk7CiAgICAgICAgICAgIC8vICAgICBmb3IoaW50IHBrID0gMDsgcGsgPCAxMjg7ICsrcGspeyAKICAgICAgICAgICAgLy8gICAgICAgICBmb3IoaW50IHBtID0gMDsgcG0gPCAxMjg7ICsrcG0pIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgaW50IGlkeCA9IHBrICogMTI4ICsgcG07CiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHB0cltpZHhdID0gMC41OwogICAgICAgICAgICAvLyAgICAgICAgIH0KICAgICAgICAgICAgLy8gICAgIH0KICAgICAgICAgICAgLy8gfQogICAgICAgIH0gLy8gbG9hZF90aWxlX2EKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICB0aHJlYWRfaWRfaW5fYV9ibG9jayA9IHRocmVhZF9pZF9pbl9hX2Jsb2NrICUgMjU2OwogICAgICAgICAgICBjb25zdGV4cHIgaW50IHZlY19zaXplID0gODsKICAgICAgICAgICAgaW50IHNfY29sID0gKHRocmVhZF9pZF9pbl9hX2Jsb2NrICUgdGhyX3Blcl9yb3cpOwogICAgICAgICAgICBpbnQgc19yb3cgPSAodGhyZWFkX2lkX2luX2FfYmxvY2sgLyB0aHJfcGVyX3Jvdyk7CgogICAgICAgICAgICBpbnQgZ19jb2wgPSBjX2NvbF9iYXNlICsgc19jb2wgKiB2ZWNfc2l6ZTsKICAgICAgICAgICAgaW50IGdfcm93ID0gYmkgKyBzX3JvdyAqIHZlY19zaXplOwoKICAgICAgICAgICAgZnA4X3QgdG1wX2ZwOFt2ZWNfc2l6ZSAqIHZlY19zaXplXTsKICAgICAgICAgICAgZnA4X3QgdG1wMl9mcDhbdmVjX3NpemUgKiB2ZWNfc2l6ZV07CgogICAgICAgICAgICBmb3IoaW50IGtrID0gMDsga2sgPCB2ZWNfc2l6ZTsgKytraykgewogICAgICAgICAgICAgICAgaW50MiogcmhzXzJpX3B0ciA9IChpbnQyKikocmhzICsgKGdfcm93ICsga2spICogbGRiICsgZ19jb2wpOwogICAgICAgICAgICAgICAgYXV0byBwdHIgPSB0bXBfZnA4ICsga2sgKiB2ZWNfc2l6ZTsKICAgICAgICAgICAgICAgIGludDIqIHB0cl8yaV9wdHIgPSAoaW50MiopcHRyOwogICAgICAgICAgICAgICAgKnB0cl8yaV9wdHIgPSAqcmhzXzJpX3B0cjsgICAgIAogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IoaW50IHRyID0gMDsgdHIgPCB2ZWNfc2l6ZTsgKyt0cikgewogICAgICAgICAgICAgICAgZm9yKGludCB0YyA9IDA7IHRjIDwgdmVjX3NpemU7ICsrdGMpIHsKICAgICAgICAgICAgICAgICAgICB0bXAyX2ZwOFt0YyAqIHZlY19zaXplICsgdHJdID0gdG1wX2ZwOFt0ciAqIHZlY19zaXplICsgdGNdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcihpbnQga2sgPSAwOyBrayA8IHZlY19zaXplOyArK2trKSB7CiAgICAgICAgICAgICAgICBpbnQyKiByaHNfdGlsZV8yaV9wdHIgPSAoaW50MiAqKShyaHNfdGlsZV9iYXNlX3B0ciArIHNfcm93ICogQkxPQ0tfU0laRV9OICsgc19jb2wgKiA4ICsga2spOwogICAgICAgICAgICAgICAgKnJoc190aWxlXzJpX3B0ciA9ICooKGludDIqKSh0bXAyX2ZwOCArIGtrICogdmVjX3NpemUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gLy8gbG9hZF90aWxlX2IKCiAgICAgICAgX19zeW5jdGhyZWFkcygpOwoKCiAgICAgICAgZm9yKGludCBpaSA9IDA7IGlpIDwgQkxPQ0s7IGlpICs9IDE2KSB7CiAgICAgICAgICAgIGludCBpID0gYmkgKyBpaTsKCiAgICAgICAgICAgIGZwOF90IHZfYV9mcmFnWzJdWzhdID0gezB9OwogICAgICAgICAgICBmcDhfdCBiX2ZyYWdbOF0gPSB7MH07CgogICAgICAgICAgICBpbnQyKiBsaHNfdGlsZV9wdHIgPSBudWxscHRyOwogICAgICAgICAgICBpbnQyKiByaHNfdGlsZV9wdHIgPSBudWxscHRyOwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgc19yb3cgPSAobGFuZV9pZCAvIDMyKTsKICAgICAgICAgICAgICAgIGludCBzX2NvbCA9IChsYW5lX2lkICUgMzIpOwogICAgICAgICAgICAgICAgaW50IHdhcnBfY29sID0gdGhyZWFkSWR4LnkgLyA0OwogICAgICAgICAgICAgICAgbGhzX3RpbGVfcHRyID0gbGhzX3RpbGVfYmFzZV9wdHIgKyhzX3JvdyArIGlpIC8gOCkgKiBCTE9DS19TSVpFX00gKyBzX2NvbCArIHdhcnBfY29sICogNjQ7CgogICAgICAgICAgICAgICAgZm9yKGludCByaSA9IDA7IHJpIDwgMjsgKytyaSkgewogICAgICAgICAgICAgICAgICAgIGludDIgKiBwdHIgPSAoaW50MiAqKXZfYV9mcmFnW3JpXTsKICAgICAgICAgICAgICAgICAgICAqcHRyID0gbGhzX3RpbGVfcHRyW3JpICogMzJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IC8vICBjb21wdXRlIHNtZW0gd2luZG93IGZvciBjb21wdXRlCiAgICAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IHNfcm93ID0gKGxhbmVfaWQgLyAzMik7CiAgICAgICAgICAgICAgICBpbnQgc19jb2wgPSAobGFuZV9pZCAlIDMyKTsKICAgICAgICAgICAgICAgIGludCB3YXJwX2NvbCA9IHRocmVhZElkeC55ICUgNDsKICAgICAgICAgICAgICAgIHJoc190aWxlX3B0ciA9IHJoc190aWxlX2Jhc2VfcHRyICsgKHNfcm93ICsgaWkgLyA4KSAqIEJMT0NLX1NJWkVfTiArIHNfY29sICsgd2FycF9jb2wgKiAzMjsKCiAgICAgICAgICAgICAgICBpbnQyKiBiX3B0ciA9IChpbnQyICopYl9mcmFnOwogICAgICAgICAgICAgICAgKmJfcHRyID0gKiByaHNfdGlsZV9wdHI7CiAgICAgICAgICAgIH0gLy8gY29tcHV0ZSBzbWVtIHdpbmRvdyBmb3IgY29tcHV0ZQogICAgCiAgICAgICAgICAgIGZvcihpbnQgcmkgPSAwOyByaSA8IDI7ICsrcmkpIHsKICAgICAgICAgICAgICAgIC8vIGZwOF90IGFfZnJhZ1s4XSA9IHswLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNX07CiAgICAgICAgICAgICAgICAvLyBmcDhfdCBiX2ZyYWdbOF0gPSB7MC41LCAwLjUsIDAuNSwgMC41LCAwLjUsIDAuNSwgMC41LCAwLjV9OwogICAgICAgICAgICAgICAgYXV0byBhX2ZyYWcgPSB2X2FfZnJhZ1tyaV07CgogICAgICAgICAgICAgICAgbG9uZyAqYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihhX2ZyYWcpOwogICAgICAgICAgICAgICAgbG9uZyAqYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyAqPihiX2ZyYWcpOwogICAgICAgIAogICAgICAgICAgICAgICAgLy8gZmxvYXR4MTYgKmQgPSByZWludGVycHJldF9jYXN0PGZsb2F0eDE2ICo+KHJlc3VsdF9mcmFnW3JpICogMiArIHJqXSk7CiAgICAgICAgICAgICAgICBmbG9hdHgxNiAqZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXR4MTYgKj4oYWNjX2ZyYWdbcmldKTsKICAgICAgICAgICAgICAgIF9fc3luY193YXJwKCk7CiAgICAgICAgCiAgICAgICAgICAgICAgICAqZCA9IF9fYnVpbHRpbl9hbWRnY25fbWZtYV9mMzJfMzJ4MzJ4MTZfZnA4X2ZwOCgKICAgICAgICAgICAgICAgICAgICAqYSwKICAgICAgICAgICAgICAgICAgICAqYiwKICAgICAgICAgICAgICAgICAgICAqZCwgMCwgMCwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHsKICAgICAgICAgICAgI3ByYWdtYSB1bnJvbGwKICAgICAgICAgICAgZm9yKGludCByaSA9IDA7IHJpIDwgMjsgKytyaSkgewogICAgICAgICAgICAgICAgZmxvYXR4MTYgKmEgPSByZWludGVycHJldF9jYXN0PGZsb2F0eDE2ICo+KGFzX3ZbcmldKTsKICAgICAgICAgICAgICAgIGZsb2F0eDE2ICpkID0gcmVpbnRlcnByZXRfY2FzdDxmbG9hdHgxNiAqPihhY2NfZnJhZ1tyaV0pOwogICAgICAgICAgICAgICAgZmxvYXR4MTYgKnIgPSByZWludGVycHJldF9jYXN0PGZsb2F0eDE2ICo+KHJlc3VsdF9mcmFnW3JpXSk7CgogICAgICAgICAgICAgICAgYXV0byB0bXAgPSBic192ICogKCpkKSAqICgqYSk7CiAgICAgICAgICAgICAgICAoKnIpICs9IHRtcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBTYXZlIFRoZSBSZXN1bHQuCiAgICBmbG9hdCogYmFzZV9vdXRwdXRfdGlsZV9wdHIgPSBvdXRwdXQgKyBjX3Jvd19iYXNlICogbGRjICsgY19jb2xfYmFzZSArICh0aHJlYWRJZHgueSAvIDQpICogNjQgKiBsZGMgKyAodGhyZWFkSWR4LnkgJSA0KSAqIDMyOwoKICAgIGZvcihpbnQgcmkgPSAwOyByaSA8IDI7ICsrcmkpIHsKICAgICAgICBmbG9hdCogdG1wX291dHB1dF9wdHIgPSBiYXNlX291dHB1dF90aWxlX3B0ciArIHJpICogMzIgKiBsZGM7CiAgICAgICAgZm9yKGludCByaiA9IDA7IHJqIDwgMTsgKytyaikgewogICAgICAgICAgICB0bXBfb3V0cHV0X3B0ciA9IHRtcF9vdXRwdXRfcHRyICsgcmogKiAzMjsKICAgICAgICAgICAgZmxvYXR4MTYgKmQgPSByZWludGVycHJldF9jYXN0PGZsb2F0eDE2ICo+KHJlc3VsdF9mcmFnW3JpXSk7CiAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IGVsZV9wZXJfdGhyZWFkOyBqKyspIHsKICAgICAgICAgICAgICAgIGF1dG8geCA9ICggbGFuZV9pZCAvIDMyICkgJSAyOwogICAgICAgICAgICAgICAgYXV0byB5ID0gbGFuZV9pZCAlIDMyOyAvLyB5ICsgaiAqIDE2IGlzIHRoZSBvdXRwdXQgZGF0YSBsYW5lIElECiAgICAgICAgICAgICAgICBhdXRvIHogPSAoaiAvIDQpICogOCArIGogJSA0OwogICAgICAgICAgICAgICAgYXV0byBvdXRJZHggPSB5ICsgKHogKyB4ICogNCkgKiBsZGM7CiAgICAgICAgICAgICAgICAvLyB0bXBfb3V0cHV0X3B0cltvdXRJZHhdID0gKCpkKVtqXTsKCiAgICAgICAgICAgICAgICBhdG9taWNBZGQoICYodG1wX291dHB1dF9wdHJbb3V0SWR4XSksICgqZClbal0pOwoKICAgICAgICAgICAgICAgIC8vIHRtcF9vdXRwdXRfcHRyW291dElkeF0gPSB0aHJlYWRfaWRfaW5fYV9ibG9jazsKICAgICAgICAgICAgICAgIC8vIHRtcF9vdXRwdXRfcHRyW291dElkeF0gPSB0aHJlYWRJZHgueTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKX19nbG9iYWxfXyB2b2lkIGNvbnZlcnRfZmxvYXQzMl90b19iZjE2KGZsb2F0ICppbnB1dF9mcDMyLCBfX2hpcF9iZmxvYXQxNiAqb3V0cHV0X2JmMTYsICBpbnQgbnVtKSB7CgogICAgaW50IHRpZCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CiAgICBpZiAodGlkIDwgbnVtKXsKICAgICAgICBvdXRwdXRfYmYxNlt0aWRdID0gKF9faGlwX2JmbG9hdDE2KWlucHV0X2ZwMzJbdGlkXTsKICAgIH0KfQoKCnZvaWQgZnA4X21tKHRvcmNoOjpUZW5zb3IgYSwgdG9yY2g6OlRlbnNvciBiLCB0b3JjaDo6VGVuc29yIGFzLCB0b3JjaDo6VGVuc29yIGJzLCB0b3JjaDo6VGVuc29yIGMpIHsKICAgIGludCBtID0gYS5zaXplKDApOwogICAgaW50IG4gPSBiLnNpemUoMCk7CiAgICBpbnQgayA9IGEuc2l6ZSgxKTsKCiAgICAjZGVmaW5lIENFSUxESVYoeCwgeSkgKCgoeCkgKyAoeSktMSkgLyAoeSkpCiAgICAKICAgIAogICAgaWYoKG0gPT0gMTAyNCAmJiBuID09IDE1MzYgJiYgayA9PSA3MTY4KSB8fCAKICAgICAgICAobSA9PSAxMDI0ICYmIG4gPT0gNTEyICYmIGsgPT0gNzE2OCkpIHsKICAgICAgICAKICAgICAgICBjb25zdCBpbnQgc3BsaXRrID0gODsKICAgICAgICBkaW0zIGdyaWQoQ0VJTERJVihtLCBCTE9DS19TSVpFX00pLCBDRUlMRElWKG4sIEJMT0NLX1NJWkVfTiksIHNwbGl0ayk7CiAgICAgICAgZGltMyBibG9jayg2NCwgOCk7CiAgICAgICAgCiAgICAgICAgZmxvYXQqIG91dHB1dF9kX2Zsb2F0ID0gbnVsbHB0cjsKICAgICAgICBoaXBNYWxsb2MoJm91dHB1dF9kX2Zsb2F0LCBzaXplb2YoZmxvYXQpICogbSAqIG4pOwogICAgICAgIGhpcE1lbXNldChvdXRwdXRfZF9mbG9hdCwgMCwgc2l6ZW9mKGZsb2F0KSAqIG0gKiBuKTsKICAgICAgICAKICAgICAgICB2X21mbWFfaW50cmluc2ljc190ZXN0X3NwbGl0azw8PGdyaWQsIGJsb2NrPj4+KChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kX2Zsb2F0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLCBuLCBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLCBuLCBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5kYXRhX3B0cjxmbG9hdD4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnMuZGF0YV9wdHI8ZmxvYXQ+KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0ayk7CgogICAgICAgIGRpbTMgY29udmVydF9ibG9jayg1MTIpOwogICAgICAgIGRpbTMgY29udmVydF9ncmlkKENFSUxESVYobSAqIG4sIDUxMikpOwoKICAgICAgICBjb252ZXJ0X2Zsb2F0MzJfdG9fYmYxNjw8PGNvbnZlcnRfZ3JpZCwgY29udmVydF9ibG9jaz4+PihvdXRwdXRfZF9mbG9hdCwgKF9faGlwX2JmbG9hdDE2KiljLmRhdGFfcHRyKCksIG0gKiBuKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGRpbTMgZ3JpZChDRUlMRElWKG0sIEJMT0NLX1NJWkVfTSksIENFSUxESVYobiwgQkxPQ0tfU0laRV9OKSk7CiAgICAgICAgZGltMyBibG9jayg2NCwgOCk7CiAgICAgICAgCiAgICAgICAgdl9tZm1hX2ludHJpbnNpY3NfdGVzdDw8PGdyaWQsIGJsb2NrPj4+KChfX2hpcF9mcDhfZTRtM19mbnV6KilhLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2hpcF9mcDhfZTRtM19mbnV6KiliLmRhdGFfcHRyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX2hpcF9iZmxvYXQxNiopYy5kYXRhX3B0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLCBuLCBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLCBuLCBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5kYXRhX3B0cjxmbG9hdD4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnMuZGF0YV9wdHI8ZmxvYXQ+KCkpOwogICAgfQoKCn0KCiIiIgoKaW1wb3J0IG9zCm9zLmVudmlyb25bIkNYWCJdID0gImNsYW5nKysiCgoKbW9kdWxlID0gbG9hZF9pbmxpbmUoCiAgICBuYW1lPSdmcDhfbW0nLAogICAgY3BwX3NvdXJjZXM9W0NQUF9XUkFQUEVSXSwKICAgIGN1ZGFfc291cmNlcz1bQ1VEQV9TUkNdLAogICAgZnVuY3Rpb25zPVsnZnA4X21tJ10sCiAgICB2ZXJib3NlPVRydWUsCiAgICBleHRyYV9jdWRhX2NmbGFncz1bIi0tb2ZmbG9hZC1hcmNoPWdmeDk0MiIsICItc3RkPWMrKzIwIl0sCikKCgoKZGVmIGhpcF9jdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKICAgIG1vZHVsZS5mcDhfbW0oYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYykKICAgIHJldHVybiBjCiAgICAKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgYSwgYiwgYV9zY2FsZSwgYl9zY2FsZSwgYyA9IGRhdGEKICAgIAogICAgTSwgSyA9IGEuc2hhcGUKICAgIE4sIEsgPSBiLnNoYXBlCiAgICAKICAgIGlmIE0gJSAxMjggPT0gMCBhbmQgTiAlIDEyOCA9PSAwIGFuZCBLICUgMTI4ID09IDA6CiAgICAgICAgcmV0dXJuIGhpcF9jdXN0b21fa2VybmVsKGRhdGEpCiAgICBlbHNlOgogICAgICAgIHJldHVybiB0cml0b25fY3VzdG9tX2tlcm5lbChkYXRhKQogICAgCg==

Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0

Best evidence level for this revision: reported

JSON