Skip to content
KernelIndex
Search⌘K

submission 30208

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

mla_decode_v1_clean.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mla-decode-30208?include=source"
interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesbf16

Benchmark evidence

1 measurement across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD MLA decodebf16 · [128, 1, 7168]
AMD Instinct MI300X
2.12ms
#21 of 79
2025-06-01

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:6147b1fff3bb39b0757726d19a2901fe03d24f17aa28a1c00cb33b57f33de461
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

mla_decode_v1_clean.py1 lines
aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCmltcG9ydCB0aW1lCmltcG9ydCB0cml0b24KaW1wb3J0IHRyaXRvbi5sYW5ndWFnZSBhcyB0bAppbXBvcnQgYWl0ZXIKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCmNsYXNzIEtWQ2FjaGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jYWNoZV9zaGFwZTogdHVwbGUsICoqa3dhcmdzKSAtPiBOb25lOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ2RhdGEnLCB0b3JjaC56ZXJvcyhrdl9jYWNoZV9zaGFwZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpKQogICAgICAgIHNlbGYuc2VxX2xlbiA9IDAKICAgICAgICBzZWxmLnplcm8oKQoKICAgIGRlZiB6ZXJvKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5kYXRhLnplcm9fKCkKICAgIAogICAgZGVmIGdldF9kYXRhKHNlbGYpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhCgogICAgZGVmIGZvcndhcmQoc2VsZiwgY19rdjogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgYXNzZXJ0IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSA8PSBzZWxmLmRhdGEuc2l6ZSgxKSwgIktWIENhY2hlIEV4Y2VlZGVkIgoKICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEudG8oY19rdi5kdHlwZSkKICAgICAgICBzZWxmLmRhdGFbCiAgICAgICAgICAgIDosIHNlbGYuc2VxX2xlbiA6IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSwgOgogICAgICAgIF0gPSBjX2t2CiAgICAgICAgc2VsZi5zZXFfbGVuICs9IGNfa3Yuc2l6ZSgxKQoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhWzosIDpzZWxmLnNlcV9sZW5dLCBzZWxmLnNlcV9sZW4KCmRlZiB0b3JjaF9yb3BlKAogICAgdGhldGE6IHRvcmNoLlRlbnNvciwKICAgIHg6IHRvcmNoLlRlbnNvciwKICAgIHN0YXJ0X3BvczogaW50ID0gMCwKKToKICAgICMgeDogKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgIGRfbW9kZWwgPSB4LnNpemUoLTEpCiAgICBvbGRfc2hhcGUgPSB4LnNoYXBlCiAgICB4ID0geC5yZXNoYXBlKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgc2VxX2lkeCA9IHRvcmNoLmFyYW5nZShzdGFydF9wb3MsIHN0YXJ0X3BvcyArIHNlcV9sZW4sIGRldmljZT14LmRldmljZSkgIyAoc2VxX2xlbiwpCiAgICBpZHhfdGhldGEgPSB0b3JjaC5laW5zdW0oJ3MsZC0+c2QnLCBzZXFfaWR4LCB0aGV0YSkgIyAoc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgIAogICAgY29zID0gaWR4X3RoZXRhLmNvcygpCiAgICBzaW4gPSBpZHhfdGhldGEuc2luKCkKICAgIHgwID0geFs6LCA6LCA6ZF9tb2RlbC8vMl0gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICB4MSA9IHhbOiwgOiwgZF9tb2RlbC8vMjpdICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgbmV3X3gwID0geDAgKiBjb3MgLSB4MSAqIHNpbiAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgIG5ld194MSA9IHgwICogc2luICsgeDEgKiBjb3MgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICBuZXdfeCA9IHRvcmNoLmNhdChbbmV3X3gwLCBuZXdfeDFdLCBkaW09LTEpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgbmV3X3ggPSBuZXdfeC52aWV3KG9sZF9zaGFwZSkgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgIHJldHVybiBuZXdfeApAdHJpdG9uLmppdApkZWYgcV9yb3BlX2tlcm5lbCgKICAgIHgsCiAgICB5LAogICAgdGhldGEsCiAgICBzdGFydF9wb3NpdGlvbiwKICAgIGJhdGNoc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2hlYWRzLAogICAgcm9wZV9oZWFkX2RpbTogdGwuY29uc3RleHByLAogICAgeF9iYXRjaF9zdHJpZGUsCiAgICB4X3NlcV9zdHJpZGUsCiAgICB4X2hlYWRfc3RyaWRlLAogICAgeV9iYXRjaF9zdHJpZGUsCiAgICB5X3NlcV9zdHJpZGUsCiAgICB5X2hlYWRfc3RyaWRlLAogICAgaGVhZF9ibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIHg6ICAoYmF0Y2hzaXplLCBzZXFfbGVuLCBuX2hlYWRzLCByb3BlX2hlYWRfZGltKSAKICAgICMgeTogIChiYXRjaHNpemUsIHNlcV9sZW4sIG5faGVhZHMsIHJvcGVfaGVhZF9kaW0pCiAgICAjIHRoZXRhOiAocm9wZV9oZWFkX2RpbSAvLyAyLCApCiAgICAjIGdyaWQ6IChjZGl2KG5faGVhZHMsIGhlYWRfYmxvY2tfc2l6ZSksIHNlcV9sZW4sIGJhdGNoc2l6ZSkKICAgIAogICAgYmF0Y2hfaWR4ID0gdGwucHJvZ3JhbV9pZCgyKQogICAgc2VxX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIGhlYWRfYmVnaW4gPSB0bC5wcm9ncmFtX2lkKDApICogaGVhZF9ibG9ja19zaXplCiAgICAKICAgIHgwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9pZHggKiB4X2JhdGNoX3N0cmlkZSArIHNlcV9pZHggKiB4X3NlcV9zdHJpZGUgKyBoZWFkX2JlZ2luICogeF9oZWFkX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeDFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeCArIGJhdGNoX2lkeCAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB4X2hlYWRfc3RyaWRlICsgcm9wZV9oZWFkX2RpbS8vMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeTBfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeSArIGJhdGNoX2lkeCAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB5X2hlYWRfc3RyaWRlLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB5MV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB5ICsgYmF0Y2hfaWR4ICogeV9iYXRjaF9zdHJpZGUgKyBzZXFfaWR4ICogeV9zZXFfc3RyaWRlICsgaGVhZF9iZWdpbiAqIHlfaGVhZF9zdHJpZGUgKyByb3BlX2hlYWRfZGltLy8yLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB0aGV0YV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB0aGV0YSwKICAgICAgICBzaGFwZT0oMSwgcm9wZV9oZWFkX2RpbS8vMiwgKSwKICAgICAgICBzdHJpZGVzPSgwLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oMSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeDAgPSB0bC5sb2FkKHgwX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChoZWFkX2Jsb2NrX3NpemUsIHJvcGVfaGVhZF9kaW0vLzIpCiAgICB4MSA9IHRsLmxvYWQoeDFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRoZXRhID0gdGwubG9hZCh0aGV0YV9ibG9ja19wdHIpICMgKDEsIHJvcGVfaGVhZF9kaW0vLzIpCiAgICBwb3NpdGlvbiA9IChzdGFydF9wb3NpdGlvbiArIHNlcV9pZHgpICMgKDEsICkKICAgICMgcHJlY2lzaW9uISEhIQogICAgdGhldGEgPSAodGhldGEgKiBwb3NpdGlvbikgIyAoMSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIGNvcyA9IHRsLmNvcyh0aGV0YSkudG8odGwuYmZsb2F0MTYpICMgKDEsIHJvcGVfaGVhZF9kaW0vLzIpCiAgICBzaW4gPSB0bC5zaW4odGhldGEpLnRvKHRsLmJmbG9hdDE2KSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgCiAgICB5MCA9ICh4MCAqIGNvcykgLSAoeDEgKiBzaW4pICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHkxID0gKHgwICogc2luKSArICh4MSAqIGNvcykgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgIyBjb252ZXJ0IHRvIHRoZSB0eXBlIG9mIHkKICAgIHkwID0geTAudG8oeS5kdHlwZS5lbGVtZW50X3R5KQogICAgeTEgPSB5MS50byh5LmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZSh5MF9ibG9ja19wdHIsIHkwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRsLnN0b3JlKHkxX2Jsb2NrX3B0ciwgeTEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQoKCkB0cml0b24uaml0CmRlZiBxX3JvcGVfY29zX3Npbl9rZXJuZWwoCiAgICB4LAogICAgeSwKICAgIGNvcywKICAgIHNpbiwKICAgIHN0YXJ0X3Bvc2l0aW9uLAogICAgYmF0Y2hzaXplLAogICAgc2VxX2xlbiwKICAgIG5faGVhZHMsCiAgICByb3BlX2hlYWRfZGltOiB0bC5jb25zdGV4cHIsCiAgICB4X2JhdGNoX3N0cmlkZSwKICAgIHhfc2VxX3N0cmlkZSwKICAgIHhfaGVhZF9zdHJpZGUsCiAgICB5X2JhdGNoX3N0cmlkZSwKICAgIHlfc2VxX3N0cmlkZSwKICAgIHlfaGVhZF9zdHJpZGUsCiAgICBoZWFkX2Jsb2NrX3NpemU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgeDogIChiYXRjaHNpemUsIHNlcV9sZW4sIG5faGVhZHMsIHJvcGVfaGVhZF9kaW0pIAogICAgIyB5OiAgKGJhdGNoc2l6ZSwgc2VxX2xlbiwgbl9oZWFkcywgcm9wZV9oZWFkX2RpbSkKICAgICMgY29zOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgc2luOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgc3RhcnRfcG9zaXRpb246ICgxLCApCiAgICAjIGdyaWQ6IChjZGl2KG5faGVhZHMsIGhlYWRfYmxvY2tfc2l6ZSksIHNlcV9sZW4sIGJhdGNoc2l6ZSkKICAgIAogICAgYmF0Y2hfaWR4ID0gdGwucHJvZ3JhbV9pZCgyKQogICAgc2VxX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIGhlYWRfYmVnaW4gPSB0bC5wcm9ncmFtX2lkKDApICogaGVhZF9ibG9ja19zaXplCiAgICAKICAgIHgwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9pZHggKiB4X2JhdGNoX3N0cmlkZSArIHNlcV9pZHggKiB4X3NlcV9zdHJpZGUgKyBoZWFkX2JlZ2luICogeF9oZWFkX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeDFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeCArIGJhdGNoX2lkeCAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB4X2hlYWRfc3RyaWRlICsgcm9wZV9oZWFkX2RpbS8vMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeTBfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeSArIGJhdGNoX2lkeCAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB5X2hlYWRfc3RyaWRlLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB5MV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB5ICsgYmF0Y2hfaWR4ICogeV9iYXRjaF9zdHJpZGUgKyBzZXFfaWR4ICogeV9zZXFfc3RyaWRlICsgaGVhZF9iZWdpbiAqIHlfaGVhZF9zdHJpZGUgKyByb3BlX2hlYWRfZGltLy8yLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjb3NfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgY29zICsgKHN0YXJ0X3Bvc2l0aW9uICsgc2VxX2lkeCkgKiAocm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIHN0cmlkZXM9KDAsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPSgxLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBzaW5fYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgc2luICsgKHN0YXJ0X3Bvc2l0aW9uICsgc2VxX2lkeCkgKiAocm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIHN0cmlkZXM9KDAsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPSgxLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB4MCA9IHRsLmxvYWQoeDBfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHgxID0gdGwubG9hZCh4MV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgY29zID0gdGwubG9hZChjb3NfYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgc2luID0gdGwubG9hZChzaW5fYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgCiAgICB5MCA9ICh4MCAqIGNvcykgLSAoeDEgKiBzaW4pICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHkxID0gKHgwICogc2luKSArICh4MSAqIGNvcykgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgIyBjb252ZXJ0IHRvIHRoZSB0eXBlIG9mIHkKICAgIHkwID0geTAudG8oeS5kdHlwZS5lbGVtZW50X3R5KQogICAgeTEgPSB5MS50byh5LmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZSh5MF9ibG9ja19wdHIsIHkwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRsLnN0b3JlKHkxX2Jsb2NrX3B0ciwgeTEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQoKQHRyaXRvbi5qaXQKZGVmIGtfcm9wZV9jb3Nfc2luX2tlcm5lbCgKICAgIHgsCiAgICB5LAogICAgY29zLAogICAgc2luLAogICAgYmF0Y2hzaXplLAogICAgc2VxX2xlbiwKICAgIHJvcGVfaGVhZF9kaW06IHRsLmNvbnN0ZXhwciwKICAgIHhfYmF0Y2hfc3RyaWRlLAogICAgeF9zZXFfc3RyaWRlLAogICAgeV9iYXRjaF9zdHJpZGUsCiAgICB5X3NlcV9zdHJpZGUsCiAgICBiYXRjaF9ibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIHg6ICAoYmF0Y2hzaXplLCBzZXFfbGVuLCByb3BlX2hlYWRfZGltKQogICAgIyB5OiAgKGJhdGNoc2l6ZSwgc2VxX2xlbiwgcm9wZV9oZWFkX2RpbSkKICAgICMgY29zOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgc2luOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgZ3JpZDogKHNlcV9sZW4sIGNkaXYoYmF0Y2hzaXplLCBiYXRjaF9ibG9ja19zaXplKSkKICAgIGJhdGNoX2JlZ2luID0gdGwucHJvZ3JhbV9pZCgxKSAqIGJhdGNoX2Jsb2NrX3NpemUKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDApCiAgICAKICAgIHgwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9iZWdpbiAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeF9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHgxX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9iZWdpbiAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSArIHJvcGVfaGVhZF9kaW0gLy8gMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeF9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHkwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHkgKyBiYXRjaF9iZWdpbiAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeV9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHkxX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHkgKyBiYXRjaF9iZWdpbiAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSArIHJvcGVfaGVhZF9kaW0gLy8gMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeV9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGNvc19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBjb3MgKyBzZXFfaWR4ICogKHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oMCwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgc2luX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHNpbiArIHNlcV9pZHggKiAocm9wZV9oZWFkX2RpbSAvLyAyKSwKICAgICAgICBzaGFwZT0oMSwgcm9wZV9oZWFkX2RpbSAvLyAyKSwKICAgICAgICBzdHJpZGVzPSgwLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oMSwgcm9wZV9oZWFkX2RpbSAvLyAyKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB4MCA9IHRsLmxvYWQoeDBfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoYmF0Y2hfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHgxID0gdGwubG9hZCh4MV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCApKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgY29zID0gdGwubG9hZChjb3NfYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgc2luID0gdGwubG9hZChzaW5fYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgeTAgPSAoeDAgKiBjb3MpIC0gKHgxICogc2luKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgeTEgPSAoeDAgKiBzaW4pICsgKHgxICogY29zKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgIyBjb252ZXJ0IHRvIHRoZSB0eXBlIG9mIHkKICAgIHkwID0geTAudG8oeS5kdHlwZS5lbGVtZW50X3R5KQogICAgeTEgPSB5MS50byh5LmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZSh5MF9ibG9ja19wdHIsIHkwLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoYmF0Y2hfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRsLnN0b3JlKHkxX2Jsb2NrX3B0ciwgeTEsIGJvdW5kYXJ5X2NoZWNrPSgwLCApKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgCnRoZXRhcyA9IHsKICAgIGRfbW9kZWw6IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKSBmb3IgZF9tb2RlbCBpbiBbNjQsXQp9CnRoZXRhcyA9IHsKICAgIGRfbW9kZWw6IHRoZXRhLmN1ZGEoKSBmb3IgZF9tb2RlbCwgdGhldGEgaW4gdGhldGFzLml0ZW1zKCkKfQptYXhfc2VxbGVuID0gODE5Mgpjb3NfdGVuc29ycyA9IHsKICAgIGRfbW9kZWw6IAogICAgICAgIHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHRvcmNoLmFyYW5nZSgwLCBtYXhfc2VxbGVuLCkuY3VkYSgpLCB0aGV0YSkuY29zKCkKICAgIGZvciBkX21vZGVsLCB0aGV0YSBpbiB0aGV0YXMuaXRlbXMoKQp9CnNpbl90ZW5zb3JzID0gewogICAgZF9tb2RlbDogCiAgICAgICAgdG9yY2guZWluc3VtKCdzLGQtPnNkJywgdG9yY2guYXJhbmdlKDAsIG1heF9zZXFsZW4sKS5jdWRhKCksIHRoZXRhKS5zaW4oKQogICAgZm9yIGRfbW9kZWwsIHRoZXRhIGluIHRoZXRhcy5pdGVtcygpCn0KY2xhc3MgVGltZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWw6IHN0cik6CiAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCiAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQogICAgICAgIHNlbGYuZW5kX3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcnZhbCA9IE5vbmUKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIyBzZWxmLnN0YXJ0ID0gdGltZS50aW1lKCkKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgICMgc2VsZi5lbmQgPSB0aW1lLnRpbWUoKQogICAgICAgICMgc2VsZi5pbnRlcnZhbCA9IChzZWxmLmVuZCAtIHNlbGYuc3RhcnQpICogMTAwMCAjIGluIG1zCiAgICAgICAgIyBwcmludChmIntzZWxmLmxhYmVsfToge3NlbGYuaW50ZXJ2YWw6LjRmfSBtcyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAKQHRyaXRvbi5qaXQKZGVmIG1sYV9kZWNvZGVfa2VybmVsKAogICAgcV9ub3BlLCBrdl9ub3BlLCAKICAgIHFfcm9wZSwga19yb3BlLAogICAgb3V0LAogICAgc2NhbGUsCiAgICBiYXRjaF9zaXplLAogICAga3ZfbGVuLAogICAgcV9ub3BlX2JhdGNoX3N0cmlkZSwKICAgIHFfbm9wZV9oZWFkX3N0cmlkZSwKICAgIGt2X25vcGVfYmF0Y2hfc3RyaWRlLAogICAga3Zfbm9wZV9zZXFfc3RyaWRlLAogICAgbl9oZWFkczogdGwuY29uc3RleHByLAogICAgcWtfcm9wZV9oZWFkX2RpbTogdGwuY29uc3RleHByLAogICAga3ZfbG9yYV9yYW5rOiB0bC5jb25zdGV4cHIsCiAgICBIRUFEX0JMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciA9IDE2LAogICAgU0VRX0JMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciA9IDMyLAopOgogICAgIyBxX25vcGU6IChiYXRjaF9zaXplLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspIDogKHFfbm9wZV9iYXRjaF9zdHJpZGUsIHFfbm9wZV9oZWFkX3N0cmlkZSwgMSkKICAgICMga3Zfbm9wZTogKGJhdGNoX3NpemUsIGt2X2xlbiwga3ZfbG9yYV9yYW5rKSA6IChrdl9ub3BlX2JhdGNoX3N0cmlkZSwga3Zfbm9wZV9zZXFfc3RyaWRlLCAxKQogICAgIyBxX3JvcGU6IChiYXRjaF9zaXplLCBuX2hlYWRzLCBxa19yb3BlX2hlYWRfZGltKSA6IChuX2hlYWRzICogcWtfcm9wZV9oZWFkX2RpbSwgcWtfcm9wZV9oZWFkX2RpbSwgMSkKICAgICMga19yb3BlOiAoYmF0Y2hfc2l6ZSwga3ZfbGVuLCBxa19yb3BlX2hlYWRfZGltKSA6IChrdl9sZW4gKiBxa19yb3BlX2hlYWRfZGltLCBxa19yb3BlX2hlYWRfZGltLCAxKQogICAgIyBvdXQ6IChiYXRjaF9zaXplLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspIDogKG5faGVhZHMgKiBrdl9sb3JhX3JhbmssIGt2X2xvcmFfcmFuaywgMSkKICAgICMgZ3JpZDogKGNkaXYobl9oZWFkcywgSEVBRF9CTE9DS19TSVpFKSwgYmF0Y2hfc2l6ZSkKICAgIGhlYWRfYmVnaW4gPSB0bC5wcm9ncmFtX2lkKDApICogSEVBRF9CTE9DS19TSVpFCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIHFfcm9wZV9oZWFkX3N0cmlkZSA9IHFrX3JvcGVfaGVhZF9kaW0KICAgIHFfcm9wZV9iYXRjaF9zdHJpZGUgPSBuX2hlYWRzICogcWtfcm9wZV9oZWFkX2RpbQogICAgcV9yb3BlX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHFfcm9wZSArIGJhdGNoX2lkeCAqIHFfcm9wZV9iYXRjaF9zdHJpZGUgKyBoZWFkX2JlZ2luICogcV9yb3BlX2hlYWRfc3RyaWRlLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKEhFQURfQkxPQ0tfU0laRSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCBxa19yb3BlX2hlYWRfZGltKSwKICAgICAgICBzdHJpZGVzPShxX3JvcGVfaGVhZF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShIRUFEX0JMT0NLX1NJWkUsIHFrX3JvcGVfaGVhZF9kaW0pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoSEVBRF9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICBrX3JvcGVfc2VxX3N0cmlkZSA9IHFrX3JvcGVfaGVhZF9kaW0KICAgIGtfcm9wZV9iYXRjaF9zdHJpZGUgPSBrdl9sZW4gKiBxa19yb3BlX2hlYWRfZGltCiAgICBrX3JvcGVfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAga19yb3BlICsgYmF0Y2hfaWR4ICoga19yb3BlX2JhdGNoX3N0cmlkZSwKICAgICAgICBzaGFwZT0oa3ZfbGVuLCBxa19yb3BlX2hlYWRfZGltKSwKICAgICAgICBzdHJpZGVzPShrX3JvcGVfc2VxX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KFNFUV9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApICMgKFNFUV9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICBxX25vcGVfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgcV9ub3BlICsgYmF0Y2hfaWR4ICogcV9ub3BlX2JhdGNoX3N0cmlkZSArIGhlYWRfYmVnaW4gKiBxX25vcGVfaGVhZF9zdHJpZGUsCiAgICAgICAgc2hhcGU9KHRsLm1pbmltdW0oSEVBRF9CTE9DS19TSVpFLCBuX2hlYWRzIC0gaGVhZF9iZWdpbiksIGt2X2xvcmFfcmFuayksCiAgICAgICAgc3RyaWRlcz0ocV9ub3BlX2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspCiAgICBrdl9ub3BlX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGt2X25vcGUgKyBiYXRjaF9pZHggKiBrdl9ub3BlX2JhdGNoX3N0cmlkZSwKICAgICAgICBzaGFwZT0oa3ZfbGVuLCBrdl9sb3JhX3JhbmspLAogICAgICAgIHN0cmlkZXM9KGt2X25vcGVfc2VxX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KFNFUV9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoU0VRX0JMT0NLX1NJWkUsIGt2X2xvcmFfcmFuaykKICAgIAogICAgb3V0X2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIG91dCArIGJhdGNoX2lkeCAqIChuX2hlYWRzICoga3ZfbG9yYV9yYW5rKSArIGhlYWRfYmVnaW4gKiBrdl9sb3JhX3JhbmssCiAgICAgICAgc2hhcGU9KHRsLm1pbmltdW0oSEVBRF9CTE9DS19TSVpFLCBuX2hlYWRzIC0gaGVhZF9iZWdpbiksIGt2X2xvcmFfcmFuayksCiAgICAgICAgc3RyaWRlcz0oa3ZfbG9yYV9yYW5rLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspCiAgICAKICAgICMgCiAgICBxa19zY2FsZSA9IHNjYWxlICogMS40NDI2OTUwNAogICAgIyBpbml0aWFsaXplIHBvaW50ZXIgdG8gbSBhbmQgbAogICAgbV9pID0gdGwuemVyb3MoW0hFQURfQkxPQ0tfU0laRV0sIGR0eXBlPXRsLmZsb2F0MzIpIC0gZmxvYXQoImluZiIpICMoSEVBRF9CTE9DS19TSVpFLCApCiAgICBsX2kgPSB0bC56ZXJvcyhbSEVBRF9CTE9DS19TSVpFXSwgZHR5cGU9dGwuZmxvYXQzMikgKyAxLjAgIyhIRUFEX0JMT0NLX1NJWkUsICkKICAgIGFjYyA9IHRsLnplcm9zKFtIRUFEX0JMT0NLX1NJWkUsIGt2X2xvcmFfcmFua10sIGR0eXBlPXRsLmZsb2F0MzIpICMgKEhFQURfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQogICAgCiAgICAjIFRPRE86IHJlbW92ZSBib3VuZGFyeSBjaGVjawogICAgcV9yb3BlID0gdGwubG9hZChxX3JvcGVfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKSAjIChIRUFEX0JMT0NLX1NJWkUsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBxX25vcGUgPSB0bC5sb2FkKHFfbm9wZV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCkpICMgKEhFQURfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQogICAgZm9yIHNlcV9iZWdpbiBpbiByYW5nZSgwLCBrdl9sZW4sIFNFUV9CTE9DS19TSVpFKToKICAgICAgICBrX3JvcGVfYmxvY2sgPSB0bC5sb2FkKGtfcm9wZV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCkpICMgKFNFUV9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKQogICAgICAgIHFrID0gdGwuZG90KHFfcm9wZSwga19yb3BlX2Jsb2NrLlQpICMgKEhFQURfQkxPQ0tfU0laRSwgU0VRX0JMT0NLX1NJWkUpCgogICAgICAgIGt2X25vcGVfYmxvY2sgPSB0bC5sb2FkKGt2X25vcGVfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKSAjIChTRVFfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQogICAgICAgIHFrICs9IHRsLmRvdChxX25vcGUsIGt2X25vcGVfYmxvY2suVCkgIyAoSEVBRF9CTE9DS19TSVpFLCBTRVFfQkxPQ0tfU0laRSkKICAgICAgICAKICAgICAgICBtX2lqID0gdGwubWF4aW11bShtX2ksIHRsLm1heChxaywgMSkgKiBxa19zY2FsZSkKICAgICAgICBxayA9IHFrICogcWtfc2NhbGUgLSBtX2lqWzosIE5vbmVdCiAgICAgICAgICAgICAgICAKICAgICAgICBwID0gdGwubWF0aC5leHAyKHFrKQogICAgICAgIAogICAgICAgICMgLS0gY29tcHV0ZSBjb3JyZWN0aW9uIGZhY3RvcgogICAgICAgIGFscGhhID0gdGwubWF0aC5leHAyKG1faSAtIG1faWopCiAgICAgICAgbF9paiA9IHRsLnN1bShwLCAxKQogICAgICAgICMgLS0gdXBkYXRlIG91dHB1dCBhY2N1bXVsYXRvciAtLQogICAgICAgIGFjYyA9IGFjYyAqIGFscGhhWzosIE5vbmVdCiAgICAgICAgIyBwcmVwYXJlIHAgYW5kIHYgZm9yIHRoZSBkb3QKICAgICAgICBwID0gcC50byh0bC5iZmxvYXQxNikgIyBjb252ZXJ0IHAgdG8gdGhlIHNhbWUgdHlwZSBhcyBrdl9ub3BlCiAgICAgICAgCiAgICAgICAgYWNjID0gdGwuZG90KHAsIGt2X25vcGVfYmxvY2ssIGFjYykgIyAoSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspCiAgICAgICAgIyB1cGRhdGUgbV9pIGFuZCBsX2kKICAgICAgICAjIHBsYWNlIHRoaXMgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUKICAgICAgICBsX2kgPSBsX2kgKiBhbHBoYSArIGxfaWoKICAgICAgICBtX2kgPSBtX2lqCiAgICAgICAgCiAgICAgICAga19yb3BlX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2Uoa19yb3BlX2Jsb2NrX3B0ciwgKFNFUV9CTE9DS19TSVpFLCAwKSkgCiAgICAgICAga3Zfbm9wZV9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGt2X25vcGVfYmxvY2tfcHRyLCAoU0VRX0JMT0NLX1NJWkUsIDApKSAKICAgIGFjYyA9IGFjYyAvIGxfaVs6LCBOb25lXSAjIChIRUFEX0JMT0NLX1NJWkUsIGt2X2xvcmFfcmFuaykKICAgIHRsLnN0b3JlKG91dF9ibG9ja19wdHIsIGFjYy50byh0bC5iZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCkpICMgKEhFQURfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQpkZWYgbWxhX2RlY29kZV92MCgKICAgIGNvbmZpZzogQ29uZmlnLAogICAgeDogdG9yY2guVGVuc29yLAogICAga3ZfY2FjaGU6IEtWQ2FjaGUsCikgOgogICAgIyBkaW06ICAgICAgICAgICAgICAgIDcxNjgKICAgICMgbl9oZWFkczogICAgICAgICAgICAgMTI4CiAgICAjIHFfbG9yYV9yYW5rOiAgICAgICAgMTUzNgogICAgIyBrdl9sb3JhX3Jhbms6ICAgICAgIDUxMgogICAgIyBxa19ub3BlX2hlYWRfZGltOiAgIDEyOAogICAgIyBxa19yb3BlX2hlYWRfZGltOiAgIDY0CiAgICAjIHZfaGVhZF9kaW06ICAgICAgICAxMjgKICAgICMgUV9wcm9qX2Rvd25fd2VpZ2h0OiAgICgxNTM2LCA3MTY4KQogICAgIyBRX3Byb2pfdXBfd2VpZ2h0OiAgICAgKCgxMjggKyA2NCkgKiAxMjgsIDE1MzYpID0gKDI0NTc2LCAxNTM2KQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKDUxMiArIDY0LCA3MTY4KSA9ICg1NzYsIDcxNjgpCiAgICAjIEtWX3Byb2pfdXBfd2VpZ2h0OiAgICAoKDEyOCArIDEyOCkgKiAxMjgsIDUxMikgPSAoMzI3NjgsIDUxMikKICAgICMgd29fd2VpZ2h0OiAgICAgICAgICAgICg3MTY4LCAxMjggKiAxMjgpID0gKDcxNjgsIDE2Mzg0KQogICAgIyBrdl9jYWNoZV9zaGFwZTogICAgIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKHFfbG9yYV9yYW5rLCBkaW0pCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSAqIG5faGVhZHMsIHFfbG9yYV9yYW5rKQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0sIGRpbSkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pICogbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKGRpbSwgdl9oZWFkX2RpbSAqIG5faGVhZHMpCiAgICAjIHg6ICAgICAgICAgICAgICAgIChiYXRjaHNpemUsIDEsIGRpbSkKICAgICMgd2l0aCBUaW1lcihmImt2IGxlbmd0aDoge2t2X2NhY2hlLnNlcV9sZW4gKyAxfSBkb3duIHByb2plY3Rpb24iKToKICAgIHFfbG9yYSA9IHggQCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBxX2xvcmFfcmFuaykKICAgIGN1cl9rdl9sb3JhID0geCBAIGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICAjIHdpdGggVGltZXIoZiJrdiBsZW5ndGg6IHtrdl9jYWNoZS5zZXFfbGVuICsgMX0gc3RvcmUga3ZfbG9yYSIpOgogICAgIyBzdG9yZSBrdl9sb3JhIGluIGNhY2hlIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgY2FjaGUKICAgIGt2X2NhY2hlX2RhdGEgPSBrdl9jYWNoZS5nZXRfZGF0YSgpICMgKGJhdGNoc2l6ZSwgbWF4X3NlcV9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBrdl9jYWNoZS5zZXFfbGVuICs9IDEKICAgICMgVE9ETzogdXNlIHRyaXRvbiB0byB3cml0ZSB0aGUga3ZfbG9yYSB0byB0aGUgY2FjaGUKICAgIGt2X2NhY2hlX2RhdGFbOiwga3ZfY2FjaGUuc2VxX2xlbiAtIDEsIDpdID0gY3VyX2t2X2xvcmEuc3F1ZWV6ZSgxKSAKICAgIGt2X2xlbiA9IGt2X2NhY2hlLnNlcV9sZW4gIyAoYmF0Y2hzaXplLCBrdl9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBrdl9jYWNoZV9kYXRhID0ga3ZfY2FjaGUuZ2V0X2RhdGEoKSAjIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAga3ZfbG9yYSA9IGt2X2NhY2hlX2RhdGFbOiwgOmt2X2NhY2hlLnNlcV9sZW4sIDpdICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKSA6IChtYXhfc2VxX2xlbiAqIChrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKSwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSAsMSkKICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEgIwogICAgICAgIAogICAgIyB3aXRoIFRpbWVyKGYia3YgbGVuZ3RoOiB7a3ZfY2FjaGUuc2VxX2xlbn0gdXAgcHJvamVjdGlvbiIpOgogICAgcV9ub3BlX2FuZF9yb3BlID0gcV9sb3JhIEAgY29uZmlnLlFfcHJval91cF93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkgKiBuX2hlYWRzKQogICAgcV9ub3BlX2FuZF9yb3BlID0gcV9ub3BlX2FuZF9yb3BlLnZpZXcoY29uZmlnLmJhdGNoX3NpemUsIDEsIGNvbmZpZy5uX2hlYWRzLCBjb25maWcucWtfbm9wZV9oZWFkX2RpbSArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICBxX25vcGUsIHFfcm9wZSA9IHRvcmNoLnNwbGl0KHFfbm9wZV9hbmRfcm9wZSwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgCiAgICAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0pIDogKG5faGVhZHMgKiAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCBuX2hlYWRzICogKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSwgKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSwgMSkgCiAgICAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX3JvcGVfaGVhZF9kaW0pIDogKG5faGVhZHMgKiAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCBuX2hlYWRzICogKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSwgKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSwgMSkKICAgICMgcHJpbnQoZiJxX25vcGUgc2hhcGU6IHtxX25vcGUuc2hhcGV9IHN0cmlkZToge3Ffbm9wZS5zdHJpZGUoKX0gaXNfY29udGlndW91czoge3Ffbm9wZS5pc19jb250aWd1b3VzKCl9IikKICAgICMgcHJpbnQoZiJxX3JvcGUgc2hhcGU6IHtxX3JvcGUuc2hhcGV9IHN0cmlkZToge3Ffcm9wZS5zdHJpZGUoKX0gaXNfY29udGlndW91czoge3Ffcm9wZS5pc19jb250aWd1b3VzKCl9IikKICAgICMgVE9ETzogaW5wbGFjZSByb3BlIGZvciBxX3JvcGUKICAgICMgd2l0aCBUaW1lcihmImt2IGxlbmd0aDoge2t2X2NhY2hlLnNlcV9sZW59IHFfcm9wZSB0cml0b24ga2VybmVsIik6CiAgICBxX3JvcGVfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT1xX3JvcGUuc2hhcGUsIGR0eXBlPXFfcm9wZS5kdHlwZSwgZGV2aWNlPXFfcm9wZS5kZXZpY2UpICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGhlYWRfYmxvY2tfc2l6ZSA9IDE2CiAgICBxX3JvcGVfY29zX3Npbl9rZXJuZWxbdHJpdG9uLmNkaXYoY29uZmlnLm5faGVhZHMsIGhlYWRfYmxvY2tfc2l6ZSksIDEsIGNvbmZpZy5iYXRjaF9zaXplXSgKICAgICAgICB4ID0gcV9yb3BlLAogICAgICAgIHkgPSBxX3JvcGVfb3V0LAogICAgICAgIGNvcyA9IGNvc190ZW5zb3JzW2NvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwKICAgICAgICBzaW4gPSBzaW5fdGVuc29yc1tjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sCiAgICAgICAgc3RhcnRfcG9zaXRpb249cXVlcnlfcG9zLAogICAgICAgIGJhdGNoc2l6ZT1jb25maWcuYmF0Y2hfc2l6ZSwKICAgICAgICBzZXFfbGVuPTEsCiAgICAgICAgbl9oZWFkcz1jb25maWcubl9oZWFkcywKICAgICAgICByb3BlX2hlYWRfZGltPWNvbmZpZy5xa19yb3BlX2hlYWRfZGltLAogICAgICAgIHhfYmF0Y2hfc3RyaWRlPXFfcm9wZS5zdHJpZGUoMCksCiAgICAgICAgeF9zZXFfc3RyaWRlPXFfcm9wZS5zdHJpZGUoMSksCiAgICAgICAgeF9oZWFkX3N0cmlkZT1xX3JvcGUuc3RyaWRlKDIpLAogICAgICAgIHlfYmF0Y2hfc3RyaWRlPXFfcm9wZV9vdXQuc3RyaWRlKDApLAogICAgICAgIHlfc2VxX3N0cmlkZT1xX3JvcGVfb3V0LnN0cmlkZSgxKSwKICAgICAgICB5X2hlYWRfc3RyaWRlPXFfcm9wZV9vdXQuc3RyaWRlKDIpLAogICAgICAgIGhlYWRfYmxvY2tfc2l6ZT1oZWFkX2Jsb2NrX3NpemUsCiAgICApCiAgICAKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LnZpZXcoY29uZmlnLm5faGVhZHMsIGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnZfaGVhZF9kaW0sIGNvbmZpZy5rdl9sb3JhX3JhbmspICMgKG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltLCBrdl9sb3JhX3JhbmspCiAgICBrX25vcGVfcHJval91cF93ZWlnaHQsIHZfcHJval91cF93ZWlnaHQgPSB0b3JjaC5zcGxpdChLVl9wcm9qX3VwX3dlaWdodCwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcudl9oZWFkX2RpbV0sIGRpbT0tMikgCiAgICAjIChuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltLCBrdl9sb3JhX3JhbmspIDogKChxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSkgKiBrdl9sb3JhX3JhbmssIGt2X2xvcmFfcmFuaywgMSkKICAgICMgKG5faGVhZHMsIHZfaGVhZF9kaW0sIGt2X2xvcmFfcmFuaykgOiAoKHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKSAqIGt2X2xvcmFfcmFuaywga3ZfbG9yYV9yYW5rLCAxKQogICAgIyBwcmludChmImtfbm9wZV9wcm9qX3VwX3dlaWdodCBzaGFwZToge2tfbm9wZV9wcm9qX3VwX3dlaWdodC5zaGFwZX0gc3RyaWRlOiB7a19ub3BlX3Byb2pfdXBfd2VpZ2h0LnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7a19ub3BlX3Byb2pfdXBfd2VpZ2h0LmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBwcmludChmInZfcHJval91cF93ZWlnaHQgc2hhcGU6IHt2X3Byb2pfdXBfd2VpZ2h0LnNoYXBlfSBzdHJpZGU6IHt2X3Byb2pfdXBfd2VpZ2h0LnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7dl9wcm9qX3VwX3dlaWdodC5pc19jb250aWd1b3VzKCl9IikKICAgICMgVE9ETzogY2hlY2sgaWYgY29udGlndW91cyBpcyBjYWxsZWQgb3Igbm90CiAgICAjIHdpdGggVGltZXIoZiJrdiBsZW5ndGg6IHtrdl9jYWNoZS5zZXFfbGVufSBxIGtub3BlIHByb2plY3Rpb24iKToKICAgICAgICAKICAgICMgYjFoZCAtPiBiaGQKICAgIHFfbm9wZSA9IHFfbm9wZS5zcXVlZXplKDEpICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSkKICAgICMgYmhkIC0+IGhiZAogICAgcV9ub3BlID0gcV9ub3BlLnRyYW5zcG9zZSgwLCAxKSAjIChuX2hlYWRzLCBiYXRjaHNpemUsIHFrX25vcGVfaGVhZF9kaW0pCiAgICAKICAgIHFfbm9wZV9wcm9qZWQgPSB0b3JjaC5ibW0ocV9ub3BlLCBrX25vcGVfcHJval91cF93ZWlnaHQpICMgKG5faGVhZHMsIGJhdGNoc2l6ZSwga3ZfbG9yYV9yYW5rKQogICAgcV9ub3BlX3Byb2plZCA9IHFfbm9wZV9wcm9qZWQudHJhbnNwb3NlKDAsIDEpICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgcV9ub3BlX3Byb2plZCA9IHFfbm9wZV9wcm9qZWQudW5zcXVlZXplKDEpICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgCiAgICBrdl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbY29uZmlnLmt2X2xvcmFfcmFuaywgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW1dLCBkaW09LTEpIAogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIGt2X2xvcmFfcmFuaykgOiAobWF4X3NlcV9sZW4gKiAoa3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSksIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0gLDEpCiAgICAjIChiYXRjaHNpemUsIGt2X2xlbiwgcWtfcm9wZV9oZWFkX2RpbSkgOiAobWF4X3NlcV9sZW4gKiAoa3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSksIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0gLDEpCiAgICAjIHByaW50KGYia3Zfbm9wZSBzaGFwZToge2t2X25vcGUuc2hhcGV9IHN0cmlkZToge2t2X25vcGUuc3RyaWRlKCl9IGlzX2NvbnRpZ3VvdXM6IHtrdl9ub3BlLmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBwcmludChmImtfcm9wZSBzaGFwZToge2tfcm9wZS5zaGFwZX0gc3RyaWRlOiB7a19yb3BlLnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7a19yb3BlLmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBUT0RPOiBvdXQgb2YgcGxhY2Ugcm9wZSBmb3Iga19yb3BlCiAgICAjIHdpdGggVGltZXIoZiJrdiBsZW5ndGg6IHtrdl9jYWNoZS5zZXFfbGVufSBrX3JvcGUgdHJpdG9uIGtlcm5lbCIpOgogICAga19yb3BlX291dCA9IHRvcmNoLmVtcHR5KHNpemU9a19yb3BlLnNoYXBlLCBkdHlwZT1rX3JvcGUuZHR5cGUsIGRldmljZT1rX3JvcGUuZGV2aWNlKSAjIChiYXRjaHNpemUsIGt2X2xlbiwgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGJhdGNoX2Jsb2NrX3NpemUgPSAzMgogICAga19yb3BlX2Nvc19zaW5fa2VybmVsW2t2X2xlbiwgdHJpdG9uLmNkaXYoY29uZmlnLmJhdGNoX3NpemUsIGJhdGNoX2Jsb2NrX3NpemUpXSgKICAgICAgICB4ID0ga19yb3BlLAogICAgICAgIHkgPSBrX3JvcGVfb3V0LAogICAgICAgIGNvcyA9IGNvc190ZW5zb3JzW2NvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwKICAgICAgICBzaW4gPSBzaW5fdGVuc29yc1tjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sCiAgICAgICAgYmF0Y2hzaXplPWNvbmZpZy5iYXRjaF9zaXplLAogICAgICAgIHNlcV9sZW49a3ZfbGVuLAogICAgICAgIHJvcGVfaGVhZF9kaW09Y29uZmlnLnFrX3JvcGVfaGVhZF9kaW0sCiAgICAgICAgeF9iYXRjaF9zdHJpZGU9a19yb3BlLnN0cmlkZSgwKSwKICAgICAgICB4X3NlcV9zdHJpZGU9a19yb3BlLnN0cmlkZSgxKSwKICAgICAgICB5X2JhdGNoX3N0cmlkZT1rX3JvcGVfb3V0LnN0cmlkZSgwKSwKICAgICAgICB5X3NlcV9zdHJpZGU9a19yb3BlX291dC5zdHJpZGUoMSksCiAgICAgICAgYmF0Y2hfYmxvY2tfc2l6ZT1iYXRjaF9ibG9ja19zaXplLAogICAgICAgIG51bV93YXJwcz04LCAjIFRPRE86IGNoZWNrIGlmIHRoaXMgaXMgbmVlZGVkCiAgICAgICAgbnVtX3N0YWdlcz0xLCAjIFRPRE86IGNoZWNrIGlmIHRoaXMgaXMgbmVlZGVkCiAgICApCiAgICAKICAgICMgd2l0aCBUaW1lcihmImt2IGxlbmd0aDoge2t2X2NhY2hlLnNlcV9sZW59IG1sYSBkZWNvZGUiKToKICAgICMgVE9ETzogTUxBCiAgICAjIHkgPSB0b3JjaC56ZXJvcyhzaXplPShjb25maWcuYmF0Y2hfc2l6ZSwgY29uZmlnLm5faGVhZHMsIGNvbmZpZy5rdl9sb3JhX3JhbmspLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAjIE1MQV9IRUFEX0JMT0NLX1NJWkUgPSAxNgogICAgIyBNTEFfU0VRX0JMT0NLX1NJWkUgPSAzMgogICAgIyBtbGFfZGVjb2RlX2tlcm5lbFt0cml0b24uY2Rpdihjb25maWcubl9oZWFkcywgTUxBX0hFQURfQkxPQ0tfU0laRSksIGNvbmZpZy5iYXRjaF9zaXplXSgKICAgICMgICAgIHFfbm9wZT1xX25vcGVfcHJvamVkLCAKICAgICMgICAgIGt2X25vcGU9a3Zfbm9wZSwgCiAgICAjICAgICBxX3JvcGU9cV9yb3BlX291dCwgCiAgICAjICAgICBrX3JvcGU9a19yb3BlX291dCwKICAgICMgICAgIG91dD15LAogICAgIyAgICAgc2NhbGU9MS4wIC8gbWF0aC5zcXJ0KGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pLAogICAgIyAgICAgYmF0Y2hfc2l6ZT1jb25maWcuYmF0Y2hfc2l6ZSwKICAgICMgICAgIGt2X2xlbj1rdl9sZW4sCiAgICAjICAgICBxX25vcGVfYmF0Y2hfc3RyaWRlPXFfbm9wZV9wcm9qZWQuc3RyaWRlKDApLAogICAgIyAgICAgcV9ub3BlX2hlYWRfc3RyaWRlPXFfbm9wZV9wcm9qZWQuc3RyaWRlKDIpLAogICAgIyAgICAga3Zfbm9wZV9iYXRjaF9zdHJpZGU9a3Zfbm9wZS5zdHJpZGUoMCksCiAgICAjICAgICBrdl9ub3BlX3NlcV9zdHJpZGU9a3Zfbm9wZS5zdHJpZGUoMSksCiAgICAjICAgICBuX2hlYWRzPWNvbmZpZy5uX2hlYWRzLAogICAgIyAgICAgcWtfcm9wZV9oZWFkX2RpbT1jb25maWcucWtfcm9wZV9oZWFkX2RpbSwKICAgICMgICAgIGt2X2xvcmFfcmFuaz1jb25maWcua3ZfbG9yYV9yYW5rLAogICAgIyAgICAgSEVBRF9CTE9DS19TSVpFPU1MQV9IRUFEX0JMT0NLX1NJWkUsCiAgICAjICAgICBTRVFfQkxPQ0tfU0laRT1NTEFfU0VRX0JMT0NLX1NJWkUsCiAgICAjICAgICBudW1fc3RhZ2VzPTEsICMKICAgICMgICAgIG51bV93YXJwcz00LCAjCiAgICAjICAgICB3YXZlc19wZXJfZXUgPSAxLCBtYXRyaXhfaW5zdHJfbm9ua2RpbSA9IDE2LCBrcGFjayA9IDIKICAgICMgKQogICAgIyB5ID0geS51bnNxdWVlemUoMSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAjIHByaW50KGYicV9ub3BlX3Byb2plZCBpcyBjb250aWd1b3VzOiB7cV9ub3BlX3Byb2plZC5pc19jb250aWd1b3VzKCl9IHNoYXBlOiB7cV9ub3BlX3Byb2plZC5zaGFwZX0gc3RyaWRlOiB7cV9ub3BlX3Byb2plZC5zdHJpZGUoKX0iKQogICAgIyBwcmludChmImt2X25vcGUgaXMgY29udGlndW91czoge2t2X25vcGUuaXNfY29udGlndW91cygpfSBzaGFwZToge2t2X25vcGUuc2hhcGV9IHN0cmlkZToge2t2X25vcGUuc3RyaWRlKCl9IikKICAgICMgcHJpbnQoZiJxX3JvcGVfb3V0IGlzIGNvbnRpZ3VvdXM6IHtxX3JvcGVfb3V0LmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBwcmludChmImtfcm9wZV9vdXQgaXMgY29udGlndW91czoge2tfcm9wZV9vdXQuaXNfY29udGlndW91cygpfSIpCiAgICBzY29yZSA9IHRvcmNoLmVpbnN1bSgnYnNoYyxidmMtPmJzaHYnLCBxX25vcGVfcHJvamVkLCBrdl9ub3BlKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xlbikKICAgIHNjb3JlICs9IHRvcmNoLmVpbnN1bSgnYnNoZCxidmQtPmJzaHYnLCBxX3JvcGVfb3V0LCBrX3JvcGVfb3V0KSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xlbikKICAgIHNjb3JlID0gc2NvcmUgLyBtYXRoLnNxcnQoY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sZW4pCiAgICBhdHRuID0gRi5zb2Z0bWF4KHNjb3JlLCBkaW09LTEpICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywga3ZfbGVuKQogICAgeSA9IHRvcmNoLmVpbnN1bSgnYnNodixidmMtPmJzaGMnLCBhdHRuLCBrdl9ub3BlKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xvcmFfcmFuaykKICAgICAgICAKICAgIAogICAgIyB3aXRoIFRpbWVyKGYia3YgbGVuZ3RoOiB7a3ZfY2FjaGUuc2VxX2xlbn0gdiBwcm9qZWN0aW9uIik6CiAgICB5ID0geS5zcXVlZXplKDEpICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgeSA9IHkudHJhbnNwb3NlKDAsIDEpICMgKG5faGVhZHMsIGJhdGNoc2l6ZSwga3ZfbG9yYV9yYW5rKQogICAgdl9wcm9qX3VwX3dlaWdodCA9IHZfcHJval91cF93ZWlnaHQudHJhbnNwb3NlKDEsIDIpICMgKG5faGVhZHMsIGt2X2xvcmFfcmFuaywgdl9oZWFkX2RpbSkKICAgIHkgPSB0b3JjaC5ibW0oeSwgdl9wcm9qX3VwX3dlaWdodCkgIyAobl9oZWFkcywgYmF0Y2hzaXplLCB2X2hlYWRfZGltKQogICAgeSA9IHkudHJhbnNwb3NlKDAsIDEpICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywgdl9oZWFkX2RpbSkKICAgIHkgPSB5LnJlc2hhcGUoY29uZmlnLmJhdGNoX3NpemUsIC0xKSAjIChiYXRjaHNpemUsIG5faGVhZHMgKiB2X2hlYWRfZGltKQogICAgeSA9IHRvcmNoLm1hdG11bCh5LCBjb25maWcud29fd2VpZ2h0LlQpICMgKGJhdGNoc2l6ZSwgZGltKQogICAgeSA9IHkudmlldyhjb25maWcuYmF0Y2hfc2l6ZSwgMSwgY29uZmlnLmRpbSkgIyAoYmF0Y2hzaXplLCAxLCBkaW0pCiAgICByZXR1cm4geSwga3ZfY2FjaGVfZGF0YQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpOgogICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgIG91dCA9IG1sYV9kZWNvZGVfdjAoCiAgICAgICAgY29uZmlnLAogICAgICAgIHgsCiAgICAgICAga3ZfY2FjaGUsCiAgICApCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyB0aW1lLnNsZWVwKDAuMDA4KQogICAgcmV0dXJuIG91dAogICAgCgpkZWYgZ2VuZXJhdGVfaW5wdXQoYmF0Y2hzaXplLCBkaW0sIGRxLCBwcmVmaWxsLCBzZWVkKToKICAgICMgU2l6ZXMgZGVyaXZlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vZGVlcHNlZWstYWkvRGVlcFNlZWstVjMvYmxvYi9tYWluL2luZmVyZW5jZS9tb2RlbC5weQogICAgZ2VuID0gdG9yY2guR2VuZXJhdG9yKGRldmljZT0nY3VkYScpCiAgICBnZW4ubWFudWFsX3NlZWQoc2VlZCkKICAgIAogICAgIyBHZW5lcmF0ZSB3ZWlnaHRzIGZvciBsaW5lYXIgbGF5ZXJzCiAgICBRX3Byb2pfZG93bl93ZWlnaHQgPSB0b3JjaC5yYW5kbigoZHEsIGRpbSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKSAvIG1hdGguc3FydChkaW0pCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKDUxMiArIDY0LCBkaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykgLyBtYXRoLnNxcnQoZGltKQogICAgUV9wcm9qX3VwX3dlaWdodCA9IHRvcmNoLnJhbmRuKCgoMTI4ICsgNjQpICogMTI4LCBkcSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKSAvIG1hdGguc3FydChkcSkKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gdG9yY2gucmFuZG4oKCgxMjggKyAxMjgpICogMTI4LCA1MTIpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykgLyBtYXRoLnNxcnQoNTEyKQogICAgd29fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKGRpbSwgMTI4ICogMTI4KSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpIC8gbWF0aC5zcXJ0KDEyOCAqIDEyOCkKCiAgICBjb25maWcgPSBDb25maWcoCiAgICAgICAgYmF0Y2hfc2l6ZT1iYXRjaHNpemUsCiAgICAgICAgZGltPWRpbSwKICAgICAgICBxX2xvcmFfcmFuaz1kcSwKICAgICAgICBuX2hlYWRzPTEyOCwKICAgICAgICBrdl9sb3JhX3Jhbms9NTEyLAogICAgICAgIHFrX25vcGVfaGVhZF9kaW09MTI4LAogICAgICAgIHFrX3JvcGVfaGVhZF9kaW09NjQsCiAgICAgICAgdl9oZWFkX2RpbT0xMjgsCiAgICAgICAgc2VxX2xlbj0xLAogICAgICAgIG1heF9zZXFfbGVuPTgxOTIsCiAgICAgICAga3ZfY2FjaGVfc2hhcGU9KGJhdGNoc2l6ZSwgODE5MiwgNTEyICsgNjQpLAogICAgICAgIFFfcHJval9kb3duX3dlaWdodD1RX3Byb2pfZG93bl93ZWlnaHQsCiAgICAgICAgUV9wcm9qX3VwX3dlaWdodD1RX3Byb2pfdXBfd2VpZ2h0LAogICAgICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ9S1ZfcHJval9kb3duX3dlaWdodCwKICAgICAgICBLVl9wcm9qX3VwX3dlaWdodD1LVl9wcm9qX3VwX3dlaWdodCwKICAgICAgICB3b193ZWlnaHQ9d29fd2VpZ2h0LAogICAgKQogICAgeCA9IHRvcmNoLnJhbmRuKChjb25maWcuYmF0Y2hfc2l6ZSwgMSwgY29uZmlnLmRpbSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgCiAgICAjIFByZS1maWxsIEtWIGNhY2hlCiAgICBrdl9jYWNoZSA9IEtWQ2FjaGUoKGNvbmZpZy5iYXRjaF9zaXplLCBjb25maWcubWF4X3NlcV9sZW4sIGNvbmZpZy5rdl9sb3JhX3JhbmsgKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkpLnRvKCdjdWRhJykKICAgIHByZV9maWxsZWRfY2FjaGUgPSB0b3JjaC5yYW5kbigoY29uZmlnLmJhdGNoX3NpemUsIHByZWZpbGwsIGNvbmZpZy5rdl9sb3JhX3JhbmsgKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIGt2X2NhY2hlKHByZV9maWxsZWRfY2FjaGUpCgogICAgcmV0dXJuIGNvbmZpZywgeCwga3ZfY2FjaGUKCiMgd2FybSB1cApjb25maWcsIHgsIGt2X2NhY2hlID0gZ2VuZXJhdGVfaW5wdXQoCiAgICBiYXRjaHNpemU9MTI4LAogICAgZGltPTcxNjgsCiAgICBkcT0xNTM2LAogICAgcHJlZmlsbD00MDk2LAogICAgc2VlZD00MiwKKQpjdXN0b21fa2VybmVsKChjb25maWcsIHgsIGt2X2NhY2hlKSkKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIyBFeGFtcGxlIHVzYWdlCiAgICBiYXRjaHNpemUgPSAxMjgKICAgIGRpbSA9IDcxNjgKICAgIGRxID0gMTUzNgogICAgcHJlZmlsbCA9IDQwOTYKICAgIHNlZWQgPSA5ODE3CiAgICB3aXRoIHRvcmNoLnByb2ZpbGVyLnByb2ZpbGUoCiAgICAgICAgYWN0aXZpdGllcz1bdG9yY2gucHJvZmlsZXIuUHJvZmlsZXJBY3Rpdml0eS5DUFUsIHRvcmNoLnByb2ZpbGVyLlByb2ZpbGVyQWN0aXZpdHkuQ1VEQV0sCiAgICAgICAgIyBzY2hlZHVsZT10b3JjaC5wcm9maWxlci5zY2hlZHVsZSh3YWl0PTEsIHdhcm11cD0xLCBhY3RpdmU9MyksICAjIOaOp+WItuWIhuaekOatpemqpAogICAgICAgIHJlY29yZF9zaGFwZXM9VHJ1ZSwKICAgICAgICBwcm9maWxlX21lbW9yeT1UcnVlLAogICAgICAgIHdpdGhfc3RhY2s9VHJ1ZSwKICAgICkgYXMgcHJvZjoKICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CiAgICAgICAgICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBnZW5lcmF0ZV9pbnB1dChiYXRjaHNpemUsIGRpbSwgZHEsIHByZWZpbGwsIHNlZWQpCiAgICAgICAgICAgIGN1c3RvbV9rZXJuZWwoKGNvbmZpZywgeCwga3ZfY2FjaGUpKQogICAgIyBwcm9mLmV4cG9ydF9jaHJvbWVfdHJhY2UoIm1sYV90cmFjZS5qc29uIikKICAgICMgcHJpbnQocHJvZi5rZXlfYXZlcmFnZXMoKS50YWJsZShzb3J0X2J5PSJjdWRhX3RpbWVfdG90YWwiLCByb3dfbGltaXQ9NSkpCgoKIyBodHRwczovL2dpdGh1Yi5jb20vdmxsbS1wcm9qZWN0L3ZsbG0vYmxvYi81ODczODc3MjQxMGM1ZTBkNjBiNjFkYjM5NTM4YTliMzEzZDJkN2FkL3ZsbG0vYXR0ZW50aW9uL29wcy9yb2NtX2FpdGVyX21sYS5weSNMMjcKIyBodHRwczovL2dpdGh1Yi5jb20vWnlwaHJhL3ZsbG0vYmxvYi8wYzBmZGFlODRmMWRhNWU0NTUxOGFhZmM3YjMyZTgxMzkwNTVhZGFlL3ZsbG0vdjEvYXR0ZW50aW9uL2JhY2tlbmRzL21sYS9yb2NtX2FpdGVyX21sYS5weSNMMTg5CiMgaHR0cHM6Ly9naXRodWIuY29tL1JPQ20vcm9jbS1ibG9ncy9ibG9iL2JjZWEyMDJjOWMyYTQ3MWUyNGMzMmYwZjY1YTk4Y2VhNDY2YzVjYTIvYmxvZ3MvYXJ0aWZpY2lhbC1pbnRlbGxpZ2VuY2UvYWl0ZXItaW50ZXJncmF0aW9uLXMvUkVBRE1FLm1kP3BsYWluPTEjTDQ2NgojIGh0dHBzOi8vZ2l0aHViLmNvbS9ST0NtL2FpdGVyL2lzc3Vlcy8yMDA=

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 30202.

- aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCmltcG9ydCB0aW1lCmltcG9ydCB0cml0b24KaW1wb3J0IHRyaXRvbi5sYW5ndWFnZSBhcyB0bAppbXBvcnQgYWl0ZXIKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCmNsYXNzIEtWQ2FjaGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jYWNoZV9zaGFwZTogdHVwbGUsICoqa3dhcmdzKSAtPiBOb25lOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ2RhdGEnLCB0b3JjaC56ZXJvcyhrdl9jYWNoZV9zaGFwZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpKQogICAgICAgIHNlbGYuc2VxX2xlbiA9IDAKICAgICAgICBzZWxmLnplcm8oKQoKICAgIGRlZiB6ZXJvKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5kYXRhLnplcm9fKCkKICAgIAogICAgZGVmIGdldF9kYXRhKHNlbGYpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhCgogICAgZGVmIGZvcndhcmQoc2VsZiwgY19rdjogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgYXNzZXJ0IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSA8PSBzZWxmLmRhdGEuc2l6ZSgxKSwgIktWIENhY2hlIEV4Y2VlZGVkIgoKICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEudG8oY19rdi5kdHlwZSkKICAgICAgICBzZWxmLmRhdGFbCiAgICAgICAgICAgIDosIHNlbGYuc2VxX2xlbiA6IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSwgOgogICAgICAgIF0gPSBjX2t2CiAgICAgICAgc2VsZi5zZXFfbGVuICs9IGNfa3Yuc2l6ZSgxKQoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhWzosIDpzZWxmLnNlcV9sZW5dLCBzZWxmLnNlcV9sZW4KCmRlZiB0b3JjaF9yb3BlKAogICAgdGhldGE6IHRvcmNoLlRlbnNvciwKICAgIHg6IHRvcmNoLlRlbnNvciwKICAgIHN0YXJ0X3BvczogaW50ID0gMCwKKToKICAgICMgeDogKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgIGRfbW9kZWwgPSB4LnNpemUoLTEpCiAgICBvbGRfc2hhcGUgPSB4LnNoYXBlCiAgICB4ID0geC5yZXNoYXBlKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgc2VxX2lkeCA9IHRvcmNoLmFyYW5nZShzdGFydF9wb3MsIHN0YXJ0X3BvcyArIHNlcV9sZW4sIGRldmljZT14LmRldmljZSkgIyAoc2VxX2xlbiwpCiAgICBpZHhfdGhldGEgPSB0b3JjaC5laW5zdW0oJ3MsZC0+c2QnLCBzZXFfaWR4LCB0aGV0YSkgIyAoc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgIAogICAgY29zID0gaWR4X3RoZXRhLmNvcygpCiAgICBzaW4gPSBpZHhfdGhldGEuc2luKCkKICAgIHgwID0geFs6LCA6LCA6ZF9tb2RlbC8vMl0gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICB4MSA9IHhbOiwgOiwgZF9tb2RlbC8vMjpdICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgbmV3X3gwID0geDAgKiBjb3MgLSB4MSAqIHNpbiAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgIG5ld194MSA9IHgwICogc2luICsgeDEgKiBjb3MgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICBuZXdfeCA9IHRvcmNoLmNhdChbbmV3X3gwLCBuZXdfeDFdLCBkaW09LTEpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgbmV3X3ggPSBuZXdfeC52aWV3KG9sZF9zaGFwZSkgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgIHJldHVybiBuZXdfeApAdHJpdG9uLmppdApkZWYgcV9yb3BlX2tlcm5lbCgKICAgIHgsCiAgICB5LAogICAgdGhldGEsCiAgICBzdGFydF9wb3NpdGlvbiwKICAgIGJhdGNoc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2hlYWRzLAogICAgcm9wZV9oZWFkX2RpbTogdGwuY29uc3RleHByLAogICAgeF9iYXRjaF9zdHJpZGUsCiAgICB4X3NlcV9zdHJpZGUsCiAgICB4X2hlYWRfc3RyaWRlLAogICAgeV9iYXRjaF9zdHJpZGUsCiAgICB5X3NlcV9zdHJpZGUsCiAgICB5X2hlYWRfc3RyaWRlLAogICAgaGVhZF9ibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIHg6ICAoYmF0Y2hzaXplLCBzZXFfbGVuLCBuX2hlYWRzLCByb3BlX2hlYWRfZGltKSAKICAgICMgeTogIChiYXRjaHNpemUsIHNlcV9sZW4sIG5faGVhZHMsIHJvcGVfaGVhZF9kaW0pCiAgICAjIHRoZXRhOiAocm9wZV9oZWFkX2RpbSAvLyAyLCApCiAgICAjIGdyaWQ6IChjZGl2KG5faGVhZHMsIGhlYWRfYmxvY2tfc2l6ZSksIHNlcV9sZW4sIGJhdGNoc2l6ZSkKICAgIAogICAgYmF0Y2hfaWR4ID0gdGwucHJvZ3JhbV9pZCgyKQogICAgc2VxX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIGhlYWRfYmVnaW4gPSB0bC5wcm9ncmFtX2lkKDApICogaGVhZF9ibG9ja19zaXplCiAgICAKICAgIHgwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9pZHggKiB4X2JhdGNoX3N0cmlkZSArIHNlcV9pZHggKiB4X3NlcV9zdHJpZGUgKyBoZWFkX2JlZ2luICogeF9oZWFkX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeDFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeCArIGJhdGNoX2lkeCAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB4X2hlYWRfc3RyaWRlICsgcm9wZV9oZWFkX2RpbS8vMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeTBfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeSArIGJhdGNoX2lkeCAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB5X2hlYWRfc3RyaWRlLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB5MV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB5ICsgYmF0Y2hfaWR4ICogeV9iYXRjaF9zdHJpZGUgKyBzZXFfaWR4ICogeV9zZXFfc3RyaWRlICsgaGVhZF9iZWdpbiAqIHlfaGVhZF9zdHJpZGUgKyByb3BlX2hlYWRfZGltLy8yLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB0aGV0YV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB0aGV0YSwKICAgICAgICBzaGFwZT0oMSwgcm9wZV9oZWFkX2RpbS8vMiwgKSwKICAgICAgICBzdHJpZGVzPSgwLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oMSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeDAgPSB0bC5sb2FkKHgwX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChoZWFkX2Jsb2NrX3NpemUsIHJvcGVfaGVhZF9kaW0vLzIpCiAgICB4MSA9IHRsLmxvYWQoeDFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRoZXRhID0gdGwubG9hZCh0aGV0YV9ibG9ja19wdHIpICMgKDEsIHJvcGVfaGVhZF9kaW0vLzIpCiAgICBwb3NpdGlvbiA9IChzdGFydF9wb3NpdGlvbiArIHNlcV9pZHgpICMgKDEsICkKICAgICMgcHJlY2lzaW9uISEhIQogICAgdGhldGEgPSAodGhldGEgKiBwb3NpdGlvbikgIyAoMSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIGNvcyA9IHRsLmNvcyh0aGV0YSkudG8odGwuYmZsb2F0MTYpICMgKDEsIHJvcGVfaGVhZF9kaW0vLzIpCiAgICBzaW4gPSB0bC5zaW4odGhldGEpLnRvKHRsLmJmbG9hdDE2KSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgCiAgICB5MCA9ICh4MCAqIGNvcykgLSAoeDEgKiBzaW4pICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHkxID0gKHgwICogc2luKSArICh4MSAqIGNvcykgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgIyBjb252ZXJ0IHRvIHRoZSB0eXBlIG9mIHkKICAgIHkwID0geTAudG8oeS5kdHlwZS5lbGVtZW50X3R5KQogICAgeTEgPSB5MS50byh5LmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZSh5MF9ibG9ja19wdHIsIHkwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRsLnN0b3JlKHkxX2Jsb2NrX3B0ciwgeTEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQoKCkB0cml0b24uaml0CmRlZiBxX3JvcGVfY29zX3Npbl9rZXJuZWwoCiAgICB4LAogICAgeSwKICAgIGNvcywKICAgIHNpbiwKICAgIHN0YXJ0X3Bvc2l0aW9uLAogICAgYmF0Y2hzaXplLAogICAgc2VxX2xlbiwKICAgIG5faGVhZHMsCiAgICByb3BlX2hlYWRfZGltOiB0bC5jb25zdGV4cHIsCiAgICB4X2JhdGNoX3N0cmlkZSwKICAgIHhfc2VxX3N0cmlkZSwKICAgIHhfaGVhZF9zdHJpZGUsCiAgICB5X2JhdGNoX3N0cmlkZSwKICAgIHlfc2VxX3N0cmlkZSwKICAgIHlfaGVhZF9zdHJpZGUsCiAgICBoZWFkX2Jsb2NrX3NpemU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgeDogIChiYXRjaHNpemUsIHNlcV9sZW4sIG5faGVhZHMsIHJvcGVfaGVhZF9kaW0pIAogICAgIyB5OiAgKGJhdGNoc2l6ZSwgc2VxX2xlbiwgbl9oZWFkcywgcm9wZV9oZWFkX2RpbSkKICAgICMgY29zOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgc2luOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgc3RhcnRfcG9zaXRpb246ICgxLCApCiAgICAjIGdyaWQ6IChjZGl2KG5faGVhZHMsIGhlYWRfYmxvY2tfc2l6ZSksIHNlcV9sZW4sIGJhdGNoc2l6ZSkKICAgIAogICAgYmF0Y2hfaWR4ID0gdGwucHJvZ3JhbV9pZCgyKQogICAgc2VxX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIGhlYWRfYmVnaW4gPSB0bC5wcm9ncmFtX2lkKDApICogaGVhZF9ibG9ja19zaXplCiAgICAKICAgIHgwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9pZHggKiB4X2JhdGNoX3N0cmlkZSArIHNlcV9pZHggKiB4X3NlcV9zdHJpZGUgKyBoZWFkX2JlZ2luICogeF9oZWFkX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeDFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeCArIGJhdGNoX2lkeCAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB4X2hlYWRfc3RyaWRlICsgcm9wZV9oZWFkX2RpbS8vMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeTBfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeSArIGJhdGNoX2lkeCAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB5X2hlYWRfc3RyaWRlLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB5MV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB5ICsgYmF0Y2hfaWR4ICogeV9iYXRjaF9zdHJpZGUgKyBzZXFfaWR4ICogeV9zZXFfc3RyaWRlICsgaGVhZF9iZWdpbiAqIHlfaGVhZF9zdHJpZGUgKyByb3BlX2hlYWRfZGltLy8yLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjb3NfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgY29zICsgKHN0YXJ0X3Bvc2l0aW9uICsgc2VxX2lkeCkgKiAocm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIHN0cmlkZXM9KDAsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPSgxLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBzaW5fYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgc2luICsgKHN0YXJ0X3Bvc2l0aW9uICsgc2VxX2lkeCkgKiAocm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIHN0cmlkZXM9KDAsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPSgxLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB4MCA9IHRsLmxvYWQoeDBfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHgxID0gdGwubG9hZCh4MV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgY29zID0gdGwubG9hZChjb3NfYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgc2luID0gdGwubG9hZChzaW5fYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgCiAgICB5MCA9ICh4MCAqIGNvcykgLSAoeDEgKiBzaW4pICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHkxID0gKHgwICogc2luKSArICh4MSAqIGNvcykgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgIyBjb252ZXJ0IHRvIHRoZSB0eXBlIG9mIHkKICAgIHkwID0geTAudG8oeS5kdHlwZS5lbGVtZW50X3R5KQogICAgeTEgPSB5MS50byh5LmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZSh5MF9ibG9ja19wdHIsIHkwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRsLnN0b3JlKHkxX2Jsb2NrX3B0ciwgeTEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQoKQHRyaXRvbi5qaXQKZGVmIGtfcm9wZV9jb3Nfc2luX2tlcm5lbCgKICAgIHgsCiAgICB5LAogICAgY29zLAogICAgc2luLAogICAgYmF0Y2hzaXplLAogICAgc2VxX2xlbiwKICAgIHJvcGVfaGVhZF9kaW06IHRsLmNvbnN0ZXhwciwKICAgIHhfYmF0Y2hfc3RyaWRlLAogICAgeF9zZXFfc3RyaWRlLAogICAgeV9iYXRjaF9zdHJpZGUsCiAgICB5X3NlcV9zdHJpZGUsCiAgICBiYXRjaF9ibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIHg6ICAoYmF0Y2hzaXplLCBzZXFfbGVuLCByb3BlX2hlYWRfZGltKQogICAgIyB5OiAgKGJhdGNoc2l6ZSwgc2VxX2xlbiwgcm9wZV9oZWFkX2RpbSkKICAgICMgY29zOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgc2luOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgZ3JpZDogKHNlcV9sZW4sIGNkaXYoYmF0Y2hzaXplLCBiYXRjaF9ibG9ja19zaXplKSkKICAgIGJhdGNoX2JlZ2luID0gdGwucHJvZ3JhbV9pZCgxKSAqIGJhdGNoX2Jsb2NrX3NpemUKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDApCiAgICAKICAgIHgwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9iZWdpbiAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeF9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHgxX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9iZWdpbiAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSArIHJvcGVfaGVhZF9kaW0gLy8gMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeF9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHkwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHkgKyBiYXRjaF9iZWdpbiAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeV9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHkxX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHkgKyBiYXRjaF9iZWdpbiAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSArIHJvcGVfaGVhZF9kaW0gLy8gMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeV9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGNvc19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBjb3MgKyBzZXFfaWR4ICogKHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oMCwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgc2luX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHNpbiArIHNlcV9pZHggKiAocm9wZV9oZWFkX2RpbSAvLyAyKSwKICAgICAgICBzaGFwZT0oMSwgcm9wZV9oZWFkX2RpbSAvLyAyKSwKICAgICAgICBzdHJpZGVzPSgwLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oMSwgcm9wZV9oZWFkX2RpbSAvLyAyKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB4MCA9IHRsLmxvYWQoeDBfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoYmF0Y2hfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHgxID0gdGwubG9hZCh4MV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCApKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgY29zID0gdGwubG9hZChjb3NfYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgc2luID0gdGwubG9hZChzaW5fYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgeTAgPSAoeDAgKiBjb3MpIC0gKHgxICogc2luKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgeTEgPSAoeDAgKiBzaW4pICsgKHgxICogY29zKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgIyBjb252ZXJ0IHRvIHRoZSB0eXBlIG9mIHkKICAgIHkwID0geTAudG8oeS5kdHlwZS5lbGVtZW50X3R5KQogICAgeTEgPSB5MS50byh5LmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZSh5MF9ibG9ja19wdHIsIHkwLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoYmF0Y2hfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRsLnN0b3JlKHkxX2Jsb2NrX3B0ciwgeTEsIGJvdW5kYXJ5X2NoZWNrPSgwLCApKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgCnRoZXRhcyA9IHsKICAgIGRfbW9kZWw6IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKSBmb3IgZF9tb2RlbCBpbiBbNjQsXQp9CnRoZXRhcyA9IHsKICAgIGRfbW9kZWw6IHRoZXRhLmN1ZGEoKSBmb3IgZF9tb2RlbCwgdGhldGEgaW4gdGhldGFzLml0ZW1zKCkKfQptYXhfc2VxbGVuID0gODE5Mgpjb3NfdGVuc29ycyA9IHsKICAgIGRfbW9kZWw6IAogICAgICAgIHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHRvcmNoLmFyYW5nZSgwLCBtYXhfc2VxbGVuLCkuY3VkYSgpLCB0aGV0YSkuY29zKCkKICAgIGZvciBkX21vZGVsLCB0aGV0YSBpbiB0aGV0YXMuaXRlbXMoKQp9CnNpbl90ZW5zb3JzID0gewogICAgZF9tb2RlbDogCiAgICAgICAgdG9yY2guZWluc3VtKCdzLGQtPnNkJywgdG9yY2guYXJhbmdlKDAsIG1heF9zZXFsZW4sKS5jdWRhKCksIHRoZXRhKS5zaW4oKQogICAgZm9yIGRfbW9kZWwsIHRoZXRhIGluIHRoZXRhcy5pdGVtcygpCn0KY2xhc3MgVGltZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWw6IHN0cik6CiAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCiAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQogICAgICAgIHNlbGYuZW5kX3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcnZhbCA9IE5vbmUKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIyBzZWxmLnN0YXJ0ID0gdGltZS50aW1lKCkKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgICMgc2VsZi5lbmQgPSB0aW1lLnRpbWUoKQogICAgICAgICMgc2VsZi5pbnRlcnZhbCA9IChzZWxmLmVuZCAtIHNlbGYuc3RhcnQpICogMTAwMCAjIGluIG1zCiAgICAgICAgIyBwcmludChmIntzZWxmLmxhYmVsfToge3NlbGYuaW50ZXJ2YWw6LjRmfSBtcyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAKQHRyaXRvbi5qaXQKZGVmIG1sYV9kZWNvZGVfa2VybmVsKAogICAgcV9ub3BlLCBrdl9ub3BlLCAKICAgIHFfcm9wZSwga19yb3BlLAogICAgb3V0LAogICAgc2NhbGUsCiAgICBiYXRjaF9zaXplLAogICAga3ZfbGVuLAogICAgcV9ub3BlX2JhdGNoX3N0cmlkZSwKICAgIHFfbm9wZV9oZWFkX3N0cmlkZSwKICAgIGt2X25vcGVfYmF0Y2hfc3RyaWRlLAogICAga3Zfbm9wZV9zZXFfc3RyaWRlLAogICAgbl9oZWFkczogdGwuY29uc3RleHByLAogICAgcWtfcm9wZV9oZWFkX2RpbTogdGwuY29uc3RleHByLAogICAga3ZfbG9yYV9yYW5rOiB0bC5jb25zdGV4cHIsCiAgICBIRUFEX0JMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciA9IDE2LAogICAgU0VRX0JMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciA9IDMyLAopOgogICAgIyBxX25vcGU6IChiYXRjaF9zaXplLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspIDogKHFfbm9wZV9iYXRjaF9zdHJpZGUsIHFfbm9wZV9oZWFkX3N0cmlkZSwgMSkKICAgICMga3Zfbm9wZTogKGJhdGNoX3NpemUsIGt2X2xlbiwga3ZfbG9yYV9yYW5rKSA6IChrdl9ub3BlX2JhdGNoX3N0cmlkZSwga3Zfbm9wZV9zZXFfc3RyaWRlLCAxKQogICAgIyBxX3JvcGU6IChiYXRjaF9zaXplLCBuX2hlYWRzLCBxa19yb3BlX2hlYWRfZGltKSA6IChuX2hlYWRzICogcWtfcm9wZV9oZWFkX2RpbSwgcWtfcm9wZV9oZWFkX2RpbSwgMSkKICAgICMga19yb3BlOiAoYmF0Y2hfc2l6ZSwga3ZfbGVuLCBxa19yb3BlX2hlYWRfZGltKSA6IChrdl9sZW4gKiBxa19yb3BlX2hlYWRfZGltLCBxa19yb3BlX2hlYWRfZGltLCAxKQogICAgIyBvdXQ6IChiYXRjaF9zaXplLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspIDogKG5faGVhZHMgKiBrdl9sb3JhX3JhbmssIGt2X2xvcmFfcmFuaywgMSkKICAgICMgZ3JpZDogKGNkaXYobl9oZWFkcywgSEVBRF9CTE9DS19TSVpFKSwgYmF0Y2hfc2l6ZSkKICAgIGhlYWRfYmVnaW4gPSB0bC5wcm9ncmFtX2lkKDApICogSEVBRF9CTE9DS19TSVpFCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIHFfcm9wZV9oZWFkX3N0cmlkZSA9IHFrX3JvcGVfaGVhZF9kaW0KICAgIHFfcm9wZV9iYXRjaF9zdHJpZGUgPSBuX2hlYWRzICogcWtfcm9wZV9oZWFkX2RpbQogICAgcV9yb3BlX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHFfcm9wZSArIGJhdGNoX2lkeCAqIHFfcm9wZV9iYXRjaF9zdHJpZGUgKyBoZWFkX2JlZ2luICogcV9yb3BlX2hlYWRfc3RyaWRlLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKEhFQURfQkxPQ0tfU0laRSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCBxa19yb3BlX2hlYWRfZGltKSwKICAgICAgICBzdHJpZGVzPShxX3JvcGVfaGVhZF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShIRUFEX0JMT0NLX1NJWkUsIHFrX3JvcGVfaGVhZF9kaW0pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoSEVBRF9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICBrX3JvcGVfc2VxX3N0cmlkZSA9IHFrX3JvcGVfaGVhZF9kaW0KICAgIGtfcm9wZV9iYXRjaF9zdHJpZGUgPSBrdl9sZW4gKiBxa19yb3BlX2hlYWRfZGltCiAgICBrX3JvcGVfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAga19yb3BlICsgYmF0Y2hfaWR4ICoga19yb3BlX2JhdGNoX3N0cmlkZSwKICAgICAgICBzaGFwZT0oa3ZfbGVuLCBxa19yb3BlX2hlYWRfZGltKSwKICAgICAgICBzdHJpZGVzPShrX3JvcGVfc2VxX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KFNFUV9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApICMgKFNFUV9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICBxX25vcGVfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgcV9ub3BlICsgYmF0Y2hfaWR4ICogcV9ub3BlX2JhdGNoX3N0cmlkZSArIGhlYWRfYmVnaW4gKiBxX25vcGVfaGVhZF9zdHJpZGUsCiAgICAgICAgc2hhcGU9KHRsLm1pbmltdW0oSEVBRF9CTE9DS19TSVpFLCBuX2hlYWRzIC0gaGVhZF9iZWdpbiksIGt2X2xvcmFfcmFuayksCiAgICAgICAgc3RyaWRlcz0ocV9ub3BlX2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspCiAgICBrdl9ub3BlX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGt2X25vcGUgKyBiYXRjaF9pZHggKiBrdl9ub3BlX2JhdGNoX3N0cmlkZSwKICAgICAgICBzaGFwZT0oa3ZfbGVuLCBrdl9sb3JhX3JhbmspLAogICAgICAgIHN0cmlkZXM9KGt2X25vcGVfc2VxX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KFNFUV9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoU0VRX0JMT0NLX1NJWkUsIGt2X2xvcmFfcmFuaykKICAgIAogICAgb3V0X2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIG91dCArIGJhdGNoX2lkeCAqIChuX2hlYWRzICoga3ZfbG9yYV9yYW5rKSArIGhlYWRfYmVnaW4gKiBrdl9sb3JhX3JhbmssCiAgICAgICAgc2hhcGU9KHRsLm1pbmltdW0oSEVBRF9CTE9DS19TSVpFLCBuX2hlYWRzIC0gaGVhZF9iZWdpbiksIGt2X2xvcmFfcmFuayksCiAgICAgICAgc3RyaWRlcz0oa3ZfbG9yYV9yYW5rLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspCiAgICAKICAgICMgCiAgICBxa19zY2FsZSA9IHNjYWxlICogMS40NDI2OTUwNAogICAgIyBpbml0aWFsaXplIHBvaW50ZXIgdG8gbSBhbmQgbAogICAgbV9pID0gdGwuemVyb3MoW0hFQURfQkxPQ0tfU0laRV0sIGR0eXBlPXRsLmZsb2F0MzIpIC0gZmxvYXQoImluZiIpICMoSEVBRF9CTE9DS19TSVpFLCApCiAgICBsX2kgPSB0bC56ZXJvcyhbSEVBRF9CTE9DS19TSVpFXSwgZHR5cGU9dGwuZmxvYXQzMikgKyAxLjAgIyhIRUFEX0JMT0NLX1NJWkUsICkKICAgIGFjYyA9IHRsLnplcm9zKFtIRUFEX0JMT0NLX1NJWkUsIGt2X2xvcmFfcmFua10sIGR0eXBlPXRsLmZsb2F0MzIpICMgKEhFQURfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQogICAgCiAgICAjIFRPRE86IHJlbW92ZSBib3VuZGFyeSBjaGVjawogICAgcV9yb3BlID0gdGwubG9hZChxX3JvcGVfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKSAjIChIRUFEX0JMT0NLX1NJWkUsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBxX25vcGUgPSB0bC5sb2FkKHFfbm9wZV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCkpICMgKEhFQURfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQogICAgZm9yIHNlcV9iZWdpbiBpbiByYW5nZSgwLCBrdl9sZW4sIFNFUV9CTE9DS19TSVpFKToKICAgICAgICBrX3JvcGVfYmxvY2sgPSB0bC5sb2FkKGtfcm9wZV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCkpICMgKFNFUV9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKQogICAgICAgIHFrID0gdGwuZG90KHFfcm9wZSwga19yb3BlX2Jsb2NrLlQpICMgKEhFQURfQkxPQ0tfU0laRSwgU0VRX0JMT0NLX1NJWkUpCgogICAgICAgIGt2X25vcGVfYmxvY2sgPSB0bC5sb2FkKGt2X25vcGVfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKSAjIChTRVFfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQogICAgICAgIHFrICs9IHRsLmRvdChxX25vcGUsIGt2X25vcGVfYmxvY2suVCkgIyAoSEVBRF9CTE9DS19TSVpFLCBTRVFfQkxPQ0tfU0laRSkKICAgICAgICAKICAgICAgICBtX2lqID0gdGwubWF4aW11bShtX2ksIHRsLm1heChxaywgMSkgKiBxa19zY2FsZSkKICAgICAgICBxayA9IHFrICogcWtfc2NhbGUgLSBtX2lqWzosIE5vbmVdCiAgICAgICAgICAgICAgICAKICAgICAgICBwID0gdGwubWF0aC5leHAyKHFrKQogICAgICAgIAogICAgICAgICMgLS0gY29tcHV0ZSBjb3JyZWN0aW9uIGZhY3RvcgogICAgICAgIGFscGhhID0gdGwubWF0aC5leHAyKG1faSAtIG1faWopCiAgICAgICAgbF9paiA9IHRsLnN1bShwLCAxKQogICAgICAgICMgLS0gdXBkYXRlIG91dHB1dCBhY2N1bXVsYXRvciAtLQogICAgICAgIGFjYyA9IGFjYyAqIGFscGhhWzosIE5vbmVdCiAgICAgICAgIyBwcmVwYXJlIHAgYW5kIHYgZm9yIHRoZSBkb3QKICAgICAgICBwID0gcC50byh0bC5iZmxvYXQxNikgIyBjb252ZXJ0IHAgdG8gdGhlIHNhbWUgdHlwZSBhcyBrdl9ub3BlCiAgICAgICAgCiAgICAgICAgYWNjID0gdGwuZG90KHAsIGt2X25vcGVfYmxvY2ssIGFjYykgIyAoSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspCiAgICAgICAgIyB1cGRhdGUgbV9pIGFuZCBsX2kKICAgICAgICAjIHBsYWNlIHRoaXMgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUKICAgICAgICBsX2kgPSBsX2kgKiBhbHBoYSArIGxfaWoKICAgICAgICBtX2kgPSBtX2lqCiAgICAgICAgCiAgICAgICAga19yb3BlX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2Uoa19yb3BlX2Jsb2NrX3B0ciwgKFNFUV9CTE9DS19TSVpFLCAwKSkgCiAgICAgICAga3Zfbm9wZV9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGt2X25vcGVfYmxvY2tfcHRyLCAoU0VRX0JMT0NLX1NJWkUsIDApKSAKICAgIGFjYyA9IGFjYyAvIGxfaVs6LCBOb25lXSAjIChIRUFEX0JMT0NLX1NJWkUsIGt2X2xvcmFfcmFuaykKICAgIHRsLnN0b3JlKG91dF9ibG9ja19wdHIsIGFjYy50byh0bC5iZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCkpICMgKEhFQURfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQpkZWYgbWxhX2RlY29kZV92MCgKICAgIGNvbmZpZzogQ29uZmlnLAogICAgeDogdG9yY2guVGVuc29yLAogICAga3ZfY2FjaGU6IEtWQ2FjaGUsCikgOgogICAgIyBkaW06ICAgICAgICAgICAgICAgIDcxNjgKICAgICMgbl9oZWFkczogICAgICAgICAgICAgMTI4CiAgICAjIHFfbG9yYV9yYW5rOiAgICAgICAgMTUzNgogICAgIyBrdl9sb3JhX3Jhbms6ICAgICAgIDUxMgogICAgIyBxa19ub3BlX2hlYWRfZGltOiAgIDEyOAogICAgIyBxa19yb3BlX2hlYWRfZGltOiAgIDY0CiAgICAjIHZfaGVhZF9kaW06ICAgICAgICAxMjgKICAgICMgUV9wcm9qX2Rvd25fd2VpZ2h0OiAgICgxNTM2LCA3MTY4KQogICAgIyBRX3Byb2pfdXBfd2VpZ2h0OiAgICAgKCgxMjggKyA2NCkgKiAxMjgsIDE1MzYpID0gKDI0NTc2LCAxNTM2KQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKDUxMiArIDY0LCA3MTY4KSA9ICg1NzYsIDcxNjgpCiAgICAjIEtWX3Byb2pfdXBfd2VpZ2h0OiAgICAoKDEyOCArIDEyOCkgKiAxMjgsIDUxMikgPSAoMzI3NjgsIDUxMikKICAgICMgd29fd2VpZ2h0OiAgICAgICAgICAgICg3MTY4LCAxMjggKiAxMjgpID0gKDcxNjgsIDE2Mzg0KQogICAgIyBrdl9jYWNoZV9zaGFwZTogICAgIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKHFfbG9yYV9yYW5rLCBkaW0pCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSAqIG5faGVhZHMsIHFfbG9yYV9yYW5rKQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0sIGRpbSkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pICogbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKGRpbSwgdl9oZWFkX2RpbSAqIG5faGVhZHMpCiAgICAjIHg6ICAgICAgICAgICAgICAgIChiYXRjaHNpemUsIDEsIGRpbSkKICAgIHdpdGggVGltZXIoZiJrdiBsZW5ndGg6IHtrdl9jYWNoZS5zZXFfbGVuICsgMX0gZG93biBwcm9qZWN0aW9uIik6CiAgICAgICAgcV9sb3JhID0geCBAIGNvbmZpZy5RX3Byb2pfZG93bl93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIHFfbG9yYV9yYW5rKQogICAgICAgIGN1cl9rdl9sb3JhID0geCBAIGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICB3aXRoIFRpbWVyKGYia3YgbGVuZ3RoOiB7a3ZfY2FjaGUuc2VxX2xlbiArIDF9IHN0b3JlIGt2X2xvcmEiKToKICAgICAgICAjIHN0b3JlIGt2X2xvcmEgaW4gY2FjaGUgYW5kIHJldHVybiB0aGUgdXBkYXRlZCBjYWNoZQogICAgICAgIGt2X2NhY2hlX2RhdGEgPSBrdl9jYWNoZS5nZXRfZGF0YSgpICMgKGJhdGNoc2l6ZSwgbWF4X3NlcV9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAgICAga3ZfY2FjaGUuc2VxX2xlbiArPSAxCiAgICAgICAgIyBUT0RPOiB1c2UgdHJpdG9uIHRvIHdyaXRlIHRoZSBrdl9sb3JhIHRvIHRoZSBjYWNoZQogICAgICAgIGt2X2NhY2hlX2RhdGFbOiwga3ZfY2FjaGUuc2VxX2xlbiAtIDEsIDpdID0gY3VyX2t2X2xvcmEuc3F1ZWV6ZSgxKSAKICAgICAgICBrdl9sZW4gPSBrdl9jYWNoZS5zZXFfbGVuICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgICAgIGt2X2NhY2hlX2RhdGEgPSBrdl9jYWNoZS5nZXRfZGF0YSgpICMgKGJhdGNoc2l6ZSwgbWF4X3NlcV9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICAgICAga3ZfbG9yYSA9IGt2X2NhY2hlX2RhdGFbOiwgOmt2X2NhY2hlLnNlcV9sZW4sIDpdICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKSA6IChtYXhfc2VxX2xlbiAqIChrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKSwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSAsMSkKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxICMKICAgIHdpdGggVGltZXIoZiJrdiBsZW5ndGg6IHtrdl9jYWNoZS5zZXFfbGVufSB1cCBwcm9qZWN0aW9uIik6CiAgICAgICAgcV9ub3BlX2FuZF9yb3BlID0gcV9sb3JhIEAgY29uZmlnLlFfcHJval91cF93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkgKiBuX2hlYWRzKQogICAgICAgIHFfbm9wZV9hbmRfcm9wZSA9IHFfbm9wZV9hbmRfcm9wZS52aWV3KGNvbmZpZy5iYXRjaF9zaXplLCAxLCBjb25maWcubl9oZWFkcywgY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkKICAgICAgICAKICAgICAgICBxX25vcGUsIHFfcm9wZSA9IHRvcmNoLnNwbGl0KHFfbm9wZV9hbmRfcm9wZSwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgCiAgICAgICAgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltKSA6IChuX2hlYWRzICogKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSwgbl9oZWFkcyAqIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSksIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSksIDEpIAogICAgICAgICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywgcWtfcm9wZV9oZWFkX2RpbSkgOiAobl9oZWFkcyAqIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSksIG5faGVhZHMgKiAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCAxKQogICAgICAgICMgcHJpbnQoZiJxX25vcGUgc2hhcGU6IHtxX25vcGUuc2hhcGV9IHN0cmlkZToge3Ffbm9wZS5zdHJpZGUoKX0gaXNfY29udGlndW91czoge3Ffbm9wZS5pc19jb250aWd1b3VzKCl9IikKICAgICAgICAjIHByaW50KGYicV9yb3BlIHNoYXBlOiB7cV9yb3BlLnNoYXBlfSBzdHJpZGU6IHtxX3JvcGUuc3RyaWRlKCl9IGlzX2NvbnRpZ3VvdXM6IHtxX3JvcGUuaXNfY29udGlndW91cygpfSIpCiAgICAjIFRPRE86IGlucGxhY2Ugcm9wZSBmb3IgcV9yb3BlCiAgICB3aXRoIFRpbWVyKGYia3YgbGVuZ3RoOiB7a3ZfY2FjaGUuc2VxX2xlbn0gcV9yb3BlIHRyaXRvbiBrZXJuZWwiKToKICAgICAgICBxX3JvcGVfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT1xX3JvcGUuc2hhcGUsIGR0eXBlPXFfcm9wZS5kdHlwZSwgZGV2aWNlPXFfcm9wZS5kZXZpY2UpICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywgcWtfcm9wZV9oZWFkX2RpbSkKICAgICAgICBoZWFkX2Jsb2NrX3NpemUgPSAxNgogICAgICAgIHFfcm9wZV9jb3Nfc2luX2tlcm5lbFt0cml0b24uY2Rpdihjb25maWcubl9oZWFkcywgaGVhZF9ibG9ja19zaXplKSwgMSwgY29uZmlnLmJhdGNoX3NpemVdKAogICAgICAgICAgICB4ID0gcV9yb3BlLAogICAgICAgICAgICB5ID0gcV9yb3BlX291dCwKICAgICAgICAgICAgY29zID0gY29zX3RlbnNvcnNbY29uZmlnLnFrX3JvcGVfaGVhZF9kaW1dLAogICAgICAgICAgICBzaW4gPSBzaW5fdGVuc29yc1tjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sCiAgICAgICAgICAgIHN0YXJ0X3Bvc2l0aW9uPXF1ZXJ5X3BvcywKICAgICAgICAgICAgYmF0Y2hzaXplPWNvbmZpZy5iYXRjaF9zaXplLAogICAgICAgICAgICBzZXFfbGVuPTEsCiAgICAgICAgICAgIG5faGVhZHM9Y29uZmlnLm5faGVhZHMsCiAgICAgICAgICAgIHJvcGVfaGVhZF9kaW09Y29uZmlnLnFrX3JvcGVfaGVhZF9kaW0sCiAgICAgICAgICAgIHhfYmF0Y2hfc3RyaWRlPXFfcm9wZS5zdHJpZGUoMCksCiAgICAgICAgICAgIHhfc2VxX3N0cmlkZT1xX3JvcGUuc3RyaWRlKDEpLAogICAgICAgICAgICB4X2hlYWRfc3RyaWRlPXFfcm9wZS5zdHJpZGUoMiksCiAgICAgICAgICAgIHlfYmF0Y2hfc3RyaWRlPXFfcm9wZV9vdXQuc3RyaWRlKDApLAogICAgICAgICAgICB5X3NlcV9zdHJpZGU9cV9yb3BlX291dC5zdHJpZGUoMSksCiAgICAgICAgICAgIHlfaGVhZF9zdHJpZGU9cV9yb3BlX291dC5zdHJpZGUoMiksCiAgICAgICAgICAgIGhlYWRfYmxvY2tfc2l6ZT1oZWFkX2Jsb2NrX3NpemUsCiAgICAgICAgKQogICAgCiAgICBLVl9wcm9qX3VwX3dlaWdodCA9IGNvbmZpZy5LVl9wcm9qX3VwX3dlaWdodC52aWV3KGNvbmZpZy5uX2hlYWRzLCBjb25maWcucWtfbm9wZV9oZWFkX2RpbSArIGNvbmZpZy52X2hlYWRfZGltLCBjb25maWcua3ZfbG9yYV9yYW5rKSAjIChuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSwga3ZfbG9yYV9yYW5rKQogICAga19ub3BlX3Byb2pfdXBfd2VpZ2h0LCB2X3Byb2pfdXBfd2VpZ2h0ID0gdG9yY2guc3BsaXQoS1ZfcHJval91cF93ZWlnaHQsIFtjb25maWcucWtfbm9wZV9oZWFkX2RpbSwgY29uZmlnLnZfaGVhZF9kaW1dLCBkaW09LTIpIAogICAgIyAobl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSwga3ZfbG9yYV9yYW5rKSA6ICgocWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pICoga3ZfbG9yYV9yYW5rLCBrdl9sb3JhX3JhbmssIDEpCiAgICAjIChuX2hlYWRzLCB2X2hlYWRfZGltLCBrdl9sb3JhX3JhbmspIDogKChxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSkgKiBrdl9sb3JhX3JhbmssIGt2X2xvcmFfcmFuaywgMSkKICAgICMgcHJpbnQoZiJrX25vcGVfcHJval91cF93ZWlnaHQgc2hhcGU6IHtrX25vcGVfcHJval91cF93ZWlnaHQuc2hhcGV9IHN0cmlkZToge2tfbm9wZV9wcm9qX3VwX3dlaWdodC5zdHJpZGUoKX0gaXNfY29udGlndW91czoge2tfbm9wZV9wcm9qX3VwX3dlaWdodC5pc19jb250aWd1b3VzKCl9IikKICAgICMgcHJpbnQoZiJ2X3Byb2pfdXBfd2VpZ2h0IHNoYXBlOiB7dl9wcm9qX3VwX3dlaWdodC5zaGFwZX0gc3RyaWRlOiB7dl9wcm9qX3VwX3dlaWdodC5zdHJpZGUoKX0gaXNfY29udGlndW91czoge3ZfcHJval91cF93ZWlnaHQuaXNfY29udGlndW91cygpfSIpCiAgICAjIFRPRE86IGNoZWNrIGlmIGNvbnRpZ3VvdXMgaXMgY2FsbGVkIG9yIG5vdAogICAgd2l0aCBUaW1lcihmImt2IGxlbmd0aDoge2t2X2NhY2hlLnNlcV9sZW59IHEga25vcGUgcHJvamVjdGlvbiIpOgogICAgICAgICMgcV9ub3BlX3Byb2plZCA9IHRvcmNoLmVpbnN1bSgnYnNoZCxoZGMtPmJzaGMnLCBxX25vcGUsIGtfbm9wZV9wcm9qX3VwX3dlaWdodCkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAgICAgI3ByaW50KGYicV9ub3BlX3Byb2plZCBzaGFwZToge3Ffbm9wZV9wcm9qZWQuc2hhcGV9IHN0cmlkZToge3Ffbm9wZV9wcm9qZWQuc3RyaWRlKCl9IGlzX2NvbnRpZ3VvdXM6IHtxX25vcGVfcHJvamVkLmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgICAgIAogICAgICAgICMgYjFoZCAtPiBiaGQKICAgICAgICBxX25vcGUgPSBxX25vcGUuc3F1ZWV6ZSgxKSAjIChiYXRjaHNpemUsIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0pCiAgICAgICAgIyBiaGQgLT4gaGJkCiAgICAgICAgcV9ub3BlID0gcV9ub3BlLnRyYW5zcG9zZSgwLCAxKSAjIChuX2hlYWRzLCBiYXRjaHNpemUsIHFrX25vcGVfaGVhZF9kaW0pCiAgICAgICAgCiAgICAgICAgcV9ub3BlX3Byb2plZCA9IHRvcmNoLmJtbShxX25vcGUsIGtfbm9wZV9wcm9qX3VwX3dlaWdodCkgIyAobl9oZWFkcywgYmF0Y2hzaXplLCBrdl9sb3JhX3JhbmspCiAgICAgICAgcV9ub3BlX3Byb2plZCA9IHFfbm9wZV9wcm9qZWQudHJhbnNwb3NlKDAsIDEpICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgICAgIHFfbm9wZV9wcm9qZWQgPSBxX25vcGVfcHJvamVkLnVuc3F1ZWV6ZSgxKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xvcmFfcmFuaykKICAgIAogICAga3Zfbm9wZSwga19yb3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW2NvbmZpZy5rdl9sb3JhX3JhbmssIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwgZGltPS0xKSAKICAgICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmspIDogKG1heF9zZXFfbGVuICogKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltICwxKQogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIHFrX3JvcGVfaGVhZF9kaW0pIDogKG1heF9zZXFfbGVuICogKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltICwxKQogICAgIyBwcmludChmImt2X25vcGUgc2hhcGU6IHtrdl9ub3BlLnNoYXBlfSBzdHJpZGU6IHtrdl9ub3BlLnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7a3Zfbm9wZS5pc19jb250aWd1b3VzKCl9IikKICAgICMgcHJpbnQoZiJrX3JvcGUgc2hhcGU6IHtrX3JvcGUuc2hhcGV9IHN0cmlkZToge2tfcm9wZS5zdHJpZGUoKX0gaXNfY29udGlndW91czoge2tfcm9wZS5pc19jb250aWd1b3VzKCl9IikKICAgICMgVE9ETzogb3V0IG9mIHBsYWNlIHJvcGUgZm9yIGtfcm9wZQogICAgd2l0aCBUaW1lcihmImt2IGxlbmd0aDoge2t2X2NhY2hlLnNlcV9sZW59IGtfcm9wZSB0cml0b24ga2VybmVsIik6CiAgICAgICAga19yb3BlX291dCA9IHRvcmNoLmVtcHR5KHNpemU9a19yb3BlLnNoYXBlLCBkdHlwZT1rX3JvcGUuZHR5cGUsIGRldmljZT1rX3JvcGUuZGV2aWNlKSAjIChiYXRjaHNpemUsIGt2X2xlbiwgcWtfcm9wZV9oZWFkX2RpbSkKICAgICAgICBiYXRjaF9ibG9ja19zaXplID0gMzIKICAgICAgICBrX3JvcGVfY29zX3Npbl9rZXJuZWxba3ZfbGVuLCB0cml0b24uY2Rpdihjb25maWcuYmF0Y2hfc2l6ZSwgYmF0Y2hfYmxvY2tfc2l6ZSldKAogICAgICAgICAgICB4ID0ga19yb3BlLAogICAgICAgICAgICB5ID0ga19yb3BlX291dCwKICAgICAgICAgICAgY29zID0gY29zX3RlbnNvcnNbY29uZmlnLnFrX3JvcGVfaGVhZF9kaW1dLAogICAgICAgICAgICBzaW4gPSBzaW5fdGVuc29yc1tjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sCiAgICAgICAgICAgIGJhdGNoc2l6ZT1jb25maWcuYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgc2VxX2xlbj1rdl9sZW4sCiAgICAgICAgICAgIHJvcGVfaGVhZF9kaW09Y29uZmlnLnFrX3JvcGVfaGVhZF9kaW0sCiAgICAgICAgICAgIHhfYmF0Y2hfc3RyaWRlPWtfcm9wZS5zdHJpZGUoMCksCiAgICAgICAgICAgIHhfc2VxX3N0cmlkZT1rX3JvcGUuc3RyaWRlKDEpLAogICAgICAgICAgICB5X2JhdGNoX3N0cmlkZT1rX3JvcGVfb3V0LnN0cmlkZSgwKSwKICAgICAgICAgICAgeV9zZXFfc3RyaWRlPWtfcm9wZV9vdXQuc3RyaWRlKDEpLAogICAgICAgICAgICBiYXRjaF9ibG9ja19zaXplPWJhdGNoX2Jsb2NrX3NpemUsCiAgICAgICAgICAgIG51bV93YXJwcz04LCAjIFRPRE86IGNoZWNrIGlmIHRoaXMgaXMgbmVlZGVkCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwgIyBUT0RPOiBjaGVjayBpZiB0aGlzIGlzIG5lZWRlZAogICAgICAgICkKICAgICMga19yb3BlX291dCA9IHRvcmNoX3JvcGUodGhldGFzW2NvbmZpZy5xa19yb3BlX2hlYWRfZGltXSxrX3JvcGUsMCkKICAgIAogICAgd2l0aCBUaW1lcihmImt2IGxlbmd0aDoge2t2X2NhY2hlLnNlcV9sZW59IG1sYSBkZWNvZGUiKToKICAgICAgICAjIFRPRE86IE1MQQogICAgICAgICMgeSA9IHRvcmNoLnplcm9zKHNpemU9KGNvbmZpZy5iYXRjaF9zaXplLCBjb25maWcubl9oZWFkcywgY29uZmlnLmt2X2xvcmFfcmFuayksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSAjIChiYXRjaHNpemUsIG5faGVhZHMsIGt2X2xvcmFfcmFuaykKICAgICAgICAjIE1MQV9IRUFEX0JMT0NLX1NJWkUgPSAxNgogICAgICAgICMgTUxBX1NFUV9CTE9DS19TSVpFID0gMzIKICAgICAgICAjIG1sYV9kZWNvZGVfa2VybmVsW3RyaXRvbi5jZGl2KGNvbmZpZy5uX2hlYWRzLCBNTEFfSEVBRF9CTE9DS19TSVpFKSwgY29uZmlnLmJhdGNoX3NpemVdKAogICAgICAgICMgICAgIHFfbm9wZT1xX25vcGVfcHJvamVkLCAKICAgICAgICAjICAgICBrdl9ub3BlPWt2X25vcGUsIAogICAgICAgICMgICAgIHFfcm9wZT1xX3JvcGVfb3V0LCAKICAgICAgICAjICAgICBrX3JvcGU9a19yb3BlX291dCwKICAgICAgICAjICAgICBvdXQ9eSwKICAgICAgICAjICAgICBzY2FsZT0xLjAgLyBtYXRoLnNxcnQoY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSksCiAgICAgICAgIyAgICAgYmF0Y2hfc2l6ZT1jb25maWcuYmF0Y2hfc2l6ZSwKICAgICAgICAjICAgICBrdl9sZW49a3ZfbGVuLAogICAgICAgICMgICAgIHFfbm9wZV9iYXRjaF9zdHJpZGU9cV9ub3BlX3Byb2plZC5zdHJpZGUoMCksCiAgICAgICAgIyAgICAgcV9ub3BlX2hlYWRfc3RyaWRlPXFfbm9wZV9wcm9qZWQuc3RyaWRlKDIpLAogICAgICAgICMgICAgIGt2X25vcGVfYmF0Y2hfc3RyaWRlPWt2X25vcGUuc3RyaWRlKDApLAogICAgICAgICMgICAgIGt2X25vcGVfc2VxX3N0cmlkZT1rdl9ub3BlLnN0cmlkZSgxKSwKICAgICAgICAjICAgICBuX2hlYWRzPWNvbmZpZy5uX2hlYWRzLAogICAgICAgICMgICAgIHFrX3JvcGVfaGVhZF9kaW09Y29uZmlnLnFrX3JvcGVfaGVhZF9kaW0sCiAgICAgICAgIyAgICAga3ZfbG9yYV9yYW5rPWNvbmZpZy5rdl9sb3JhX3JhbmssCiAgICAgICAgIyAgICAgSEVBRF9CTE9DS19TSVpFPU1MQV9IRUFEX0JMT0NLX1NJWkUsCiAgICAgICAgIyAgICAgU0VRX0JMT0NLX1NJWkU9TUxBX1NFUV9CTE9DS19TSVpFLAogICAgICAgICMgICAgIG51bV9zdGFnZXM9MSwgIwogICAgICAgICMgICAgIG51bV93YXJwcz00LCAjCiAgICAgICAgIyAgICAgd2F2ZXNfcGVyX2V1ID0gMSwgbWF0cml4X2luc3RyX25vbmtkaW0gPSAxNiwga3BhY2sgPSAyCiAgICAgICAgIyApCiAgICAgICAgIyB5ID0geS51bnNxdWVlemUoMSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAgICAgIyBwcmludChmInFfbm9wZV9wcm9qZWQgaXMgY29udGlndW91czoge3Ffbm9wZV9wcm9qZWQuaXNfY29udGlndW91cygpfSBzaGFwZToge3Ffbm9wZV9wcm9qZWQuc2hhcGV9IHN0cmlkZToge3Ffbm9wZV9wcm9qZWQuc3RyaWRlKCl9IikKICAgICAgICAjIHByaW50KGYia3Zfbm9wZSBpcyBjb250aWd1b3VzOiB7a3Zfbm9wZS5pc19jb250aWd1b3VzKCl9IHNoYXBlOiB7a3Zfbm9wZS5zaGFwZX0gc3RyaWRlOiB7a3Zfbm9wZS5zdHJpZGUoKX0iKQogICAgICAgICMgcHJpbnQoZiJxX3JvcGVfb3V0IGlzIGNvbnRpZ3VvdXM6IHtxX3JvcGVfb3V0LmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgICAgICMgcHJpbnQoZiJrX3JvcGVfb3V0IGlzIGNvbnRpZ3VvdXM6IHtrX3JvcGVfb3V0LmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgICAgIHNjb3JlID0gdG9yY2guZWluc3VtKCdic2hjLGJ2Yy0+YnNodicsIHFfbm9wZV9wcm9qZWQsIGt2X25vcGUpICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywga3ZfbGVuKQogICAgICAgIHNjb3JlICs9IHRvcmNoLmVpbnN1bSgnYnNoZCxidmQtPmJzaHYnLCBxX3JvcGVfb3V0LCBrX3JvcGVfb3V0KSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xlbikKICAgICAgICBzY29yZSA9IHNjb3JlIC8gbWF0aC5zcXJ0KGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywga3ZfbGVuKQogICAgICAgIGF0dG4gPSBGLnNvZnRtYXgoc2NvcmUsIGRpbT0tMSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sZW4pCiAgICAgICAgeSA9IHRvcmNoLmVpbnN1bSgnYnNodixidmMtPmJzaGMnLCBhdHRuLCBrdl9ub3BlKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xvcmFfcmFuaykKICAgICAgICAKICAgIAogICAgd2l0aCBUaW1lcihmImt2IGxlbmd0aDoge2t2X2NhY2hlLnNlcV9sZW59IHYgcHJvamVjdGlvbiIpOgogICAgICAgIHkgPSB5LnNxdWVlemUoMSkgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAgICAgeSA9IHkudHJhbnNwb3NlKDAsIDEpICMgKG5faGVhZHMsIGJhdGNoc2l6ZSwga3ZfbG9yYV9yYW5rKQogICAgICAgIHZfcHJval91cF93ZWlnaHQgPSB2X3Byb2pfdXBfd2VpZ2h0LnRyYW5zcG9zZSgxLCAyKSAjIChuX2hlYWRzLCBrdl9sb3JhX3JhbmssIHZfaGVhZF9kaW0pCiAgICAgICAgeSA9IHRvcmNoLmJtbSh5LCB2X3Byb2pfdXBfd2VpZ2h0KSAjIChuX2hlYWRzLCBiYXRjaHNpemUsIHZfaGVhZF9kaW0pCiAgICAgICAgeSA9IHkudHJhbnNwb3NlKDAsIDEpICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywgdl9oZWFkX2RpbSkKICAgICAgICB5ID0geS5yZXNoYXBlKGNvbmZpZy5iYXRjaF9zaXplLCAtMSkgIyAoYmF0Y2hzaXplLCBuX2hlYWRzICogdl9oZWFkX2RpbSkKICAgICAgICB5ID0gdG9yY2gubWF0bXVsKHksIGNvbmZpZy53b193ZWlnaHQuVCkgIyAoYmF0Y2hzaXplLCBkaW0pCiAgICAgICAgeSA9IHkudmlldyhjb25maWcuYmF0Y2hfc2l6ZSwgMSwgY29uZmlnLmRpbSkgIyAoYmF0Y2hzaXplLCAxLCBkaW0pCiAgICByZXR1cm4geSwga3ZfY2FjaGVfZGF0YQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpOgogICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgIG91dCA9IG1sYV9kZWNvZGVfdjAoCiAgICAgICAgY29uZmlnLAogICAgICAgIHgsCiAgICAgICAga3ZfY2FjaGUsCiAgICApCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyB0aW1lLnNsZWVwKDAuMDA4KQogICAgcmV0dXJuIG91dAogICAgCgpkZWYgZ2VuZXJhdGVfaW5wdXQoYmF0Y2hzaXplLCBkaW0sIGRxLCBwcmVmaWxsLCBzZWVkKToKICAgICMgU2l6ZXMgZGVyaXZlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vZGVlcHNlZWstYWkvRGVlcFNlZWstVjMvYmxvYi9tYWluL2luZmVyZW5jZS9tb2RlbC5weQogICAgZ2VuID0gdG9yY2guR2VuZXJhdG9yKGRldmljZT0nY3VkYScpCiAgICBnZW4ubWFudWFsX3NlZWQoc2VlZCkKICAgIAogICAgIyBHZW5lcmF0ZSB3ZWlnaHRzIGZvciBsaW5lYXIgbGF5ZXJzCiAgICBRX3Byb2pfZG93bl93ZWlnaHQgPSB0b3JjaC5yYW5kbigoZHEsIGRpbSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKSAvIG1hdGguc3FydChkaW0pCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKDUxMiArIDY0LCBkaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykgLyBtYXRoLnNxcnQoZGltKQogICAgUV9wcm9qX3VwX3dlaWdodCA9IHRvcmNoLnJhbmRuKCgoMTI4ICsgNjQpICogMTI4LCBkcSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKSAvIG1hdGguc3FydChkcSkKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gdG9yY2gucmFuZG4oKCgxMjggKyAxMjgpICogMTI4LCA1MTIpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykgLyBtYXRoLnNxcnQoNTEyKQogICAgd29fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKGRpbSwgMTI4ICogMTI4KSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpIC8gbWF0aC5zcXJ0KDEyOCAqIDEyOCkKCiAgICBjb25maWcgPSBDb25maWcoCiAgICAgICAgYmF0Y2hfc2l6ZT1iYXRjaHNpemUsCiAgICAgICAgZGltPWRpbSwKICAgICAgICBxX2xvcmFfcmFuaz1kcSwKICAgICAgICBuX2hlYWRzPTEyOCwKICAgICAgICBrdl9sb3JhX3Jhbms9NTEyLAogICAgICAgIHFrX25vcGVfaGVhZF9kaW09MTI4LAogICAgICAgIHFrX3JvcGVfaGVhZF9kaW09NjQsCiAgICAgICAgdl9oZWFkX2RpbT0xMjgsCiAgICAgICAgc2VxX2xlbj0xLAogICAgICAgIG1heF9zZXFfbGVuPTgxOTIsCiAgICAgICAga3ZfY2FjaGVfc2hhcGU9KGJhdGNoc2l6ZSwgODE5MiwgNTEyICsgNjQpLAogICAgICAgIFFfcHJval9kb3duX3dlaWdodD1RX3Byb2pfZG93bl93ZWlnaHQsCiAgICAgICAgUV9wcm9qX3VwX3dlaWdodD1RX3Byb2pfdXBfd2VpZ2h0LAogICAgICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ9S1ZfcHJval9kb3duX3dlaWdodCwKICAgICAgICBLVl9wcm9qX3VwX3dlaWdodD1LVl9wcm9qX3VwX3dlaWdodCwKICAgICAgICB3b193ZWlnaHQ9d29fd2VpZ2h0LAogICAgKQogICAgeCA9IHRvcmNoLnJhbmRuKChjb25maWcuYmF0Y2hfc2l6ZSwgMSwgY29uZmlnLmRpbSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgCiAgICAjIFByZS1maWxsIEtWIGNhY2hlCiAgICBrdl9jYWNoZSA9IEtWQ2FjaGUoKGNvbmZpZy5iYXRjaF9zaXplLCBjb25maWcubWF4X3NlcV9sZW4sIGNvbmZpZy5rdl9sb3JhX3JhbmsgKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkpLnRvKCdjdWRhJykKICAgIHByZV9maWxsZWRfY2FjaGUgPSB0b3JjaC5yYW5kbigoY29uZmlnLmJhdGNoX3NpemUsIHByZWZpbGwsIGNvbmZpZy5rdl9sb3JhX3JhbmsgKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIGt2X2NhY2hlKHByZV9maWxsZWRfY2FjaGUpCgogICAgcmV0dXJuIGNvbmZpZywgeCwga3ZfY2FjaGUKCiMgd2FybSB1cApjb25maWcsIHgsIGt2X2NhY2hlID0gZ2VuZXJhdGVfaW5wdXQoCiAgICBiYXRjaHNpemU9MTI4LAogICAgZGltPTcxNjgsCiAgICBkcT0xNTM2LAogICAgcHJlZmlsbD00MDk2LAogICAgc2VlZD00MiwKKQpjdXN0b21fa2VybmVsKChjb25maWcsIHgsIGt2X2NhY2hlKSkKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIyBFeGFtcGxlIHVzYWdlCiAgICBiYXRjaHNpemUgPSAxMjgKICAgIGRpbSA9IDcxNjgKICAgIGRxID0gMTUzNgogICAgcHJlZmlsbCA9IDQwOTYKICAgIHNlZWQgPSA5ODE3CiAgICB3aXRoIHRvcmNoLnByb2ZpbGVyLnByb2ZpbGUoCiAgICAgICAgYWN0aXZpdGllcz1bdG9yY2gucHJvZmlsZXIuUHJvZmlsZXJBY3Rpdml0eS5DUFUsIHRvcmNoLnByb2ZpbGVyLlByb2ZpbGVyQWN0aXZpdHkuQ1VEQV0sCiAgICAgICAgIyBzY2hlZHVsZT10b3JjaC5wcm9maWxlci5zY2hlZHVsZSh3YWl0PTEsIHdhcm11cD0xLCBhY3RpdmU9MyksICAjIOaOp+WItuWIhuaekOatpemqpAogICAgICAgIHJlY29yZF9zaGFwZXM9VHJ1ZSwKICAgICAgICBwcm9maWxlX21lbW9yeT1UcnVlLAogICAgICAgIHdpdGhfc3RhY2s9VHJ1ZSwKICAgICkgYXMgcHJvZjoKICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CiAgICAgICAgICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBnZW5lcmF0ZV9pbnB1dChiYXRjaHNpemUsIGRpbSwgZHEsIHByZWZpbGwsIHNlZWQpCiAgICAgICAgICAgIGN1c3RvbV9rZXJuZWwoKGNvbmZpZywgeCwga3ZfY2FjaGUpKQogICAgIyBwcm9mLmV4cG9ydF9jaHJvbWVfdHJhY2UoIm1sYV90cmFjZS5qc29uIikKICAgICMgcHJpbnQocHJvZi5rZXlfYXZlcmFnZXMoKS50YWJsZShzb3J0X2J5PSJjdWRhX3RpbWVfdG90YWwiLCByb3dfbGltaXQ9NSkpCgoKIyBodHRwczovL2dpdGh1Yi5jb20vdmxsbS1wcm9qZWN0L3ZsbG0vYmxvYi81ODczODc3MjQxMGM1ZTBkNjBiNjFkYjM5NTM4YTliMzEzZDJkN2FkL3ZsbG0vYXR0ZW50aW9uL29wcy9yb2NtX2FpdGVyX21sYS5weSNMMjcKIyBodHRwczovL2dpdGh1Yi5jb20vWnlwaHJhL3ZsbG0vYmxvYi8wYzBmZGFlODRmMWRhNWU0NTUxOGFhZmM3YjMyZTgxMzkwNTVhZGFlL3ZsbG0vdjEvYXR0ZW50aW9uL2JhY2tlbmRzL21sYS9yb2NtX2FpdGVyX21sYS5weSNMMTg5CiMgaHR0cHM6Ly9naXRodWIuY29tL1JPQ20vcm9jbS1ibG9ncy9ibG9iL2JjZWEyMDJjOWMyYTQ3MWUyNGMzMmYwZjY1YTk4Y2VhNDY2YzVjYTIvYmxvZ3MvYXJ0aWZpY2lhbC1pbnRlbGxpZ2VuY2UvYWl0ZXItaW50ZXJncmF0aW9uLXMvUkVBRE1FLm1kP3BsYWluPTEjTDQ2NgojIGh0dHBzOi8vZ2l0aHViLmNvbS9ST0NtL2FpdGVyL2lzc3Vlcy8yMDA=
No newline at end of file
+ aW1wb3J0IG1hdGgKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCmltcG9ydCB0b3JjaApmcm9tIHRvcmNoIGltcG9ydCBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB0eXBpbmcgaW1wb3J0IFR1cGxlCmltcG9ydCB0aW1lCmltcG9ydCB0cml0b24KaW1wb3J0IHRyaXRvbi5sYW5ndWFnZSBhcyB0bAppbXBvcnQgYWl0ZXIKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCmNsYXNzIEtWQ2FjaGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrdl9jYWNoZV9zaGFwZTogdHVwbGUsICoqa3dhcmdzKSAtPiBOb25lOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoJ2RhdGEnLCB0b3JjaC56ZXJvcyhrdl9jYWNoZV9zaGFwZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYpKQogICAgICAgIHNlbGYuc2VxX2xlbiA9IDAKICAgICAgICBzZWxmLnplcm8oKQoKICAgIGRlZiB6ZXJvKHNlbGYpIC0+IE5vbmU6CiAgICAgICAgc2VsZi5kYXRhLnplcm9fKCkKICAgIAogICAgZGVmIGdldF9kYXRhKHNlbGYpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhCgogICAgZGVmIGZvcndhcmQoc2VsZiwgY19rdjogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgYXNzZXJ0IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSA8PSBzZWxmLmRhdGEuc2l6ZSgxKSwgIktWIENhY2hlIEV4Y2VlZGVkIgoKICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEudG8oY19rdi5kdHlwZSkKICAgICAgICBzZWxmLmRhdGFbCiAgICAgICAgICAgIDosIHNlbGYuc2VxX2xlbiA6IHNlbGYuc2VxX2xlbiArIGNfa3Yuc2l6ZSgxKSwgOgogICAgICAgIF0gPSBjX2t2CiAgICAgICAgc2VsZi5zZXFfbGVuICs9IGNfa3Yuc2l6ZSgxKQoKICAgICAgICByZXR1cm4gc2VsZi5kYXRhWzosIDpzZWxmLnNlcV9sZW5dLCBzZWxmLnNlcV9sZW4KCmRlZiB0b3JjaF9yb3BlKAogICAgdGhldGE6IHRvcmNoLlRlbnNvciwKICAgIHg6IHRvcmNoLlRlbnNvciwKICAgIHN0YXJ0X3BvczogaW50ID0gMCwKKToKICAgICMgeDogKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgIGRfbW9kZWwgPSB4LnNpemUoLTEpCiAgICBvbGRfc2hhcGUgPSB4LnNoYXBlCiAgICB4ID0geC5yZXNoYXBlKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgc2VxX2lkeCA9IHRvcmNoLmFyYW5nZShzdGFydF9wb3MsIHN0YXJ0X3BvcyArIHNlcV9sZW4sIGRldmljZT14LmRldmljZSkgIyAoc2VxX2xlbiwpCiAgICBpZHhfdGhldGEgPSB0b3JjaC5laW5zdW0oJ3MsZC0+c2QnLCBzZXFfaWR4LCB0aGV0YSkgIyAoc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgIAogICAgY29zID0gaWR4X3RoZXRhLmNvcygpCiAgICBzaW4gPSBpZHhfdGhldGEuc2luKCkKICAgIHgwID0geFs6LCA6LCA6ZF9tb2RlbC8vMl0gIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICB4MSA9IHhbOiwgOiwgZF9tb2RlbC8vMjpdICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsLy8yKQogICAgbmV3X3gwID0geDAgKiBjb3MgLSB4MSAqIHNpbiAjICgtMSwgc2VxX2xlbiwgZF9tb2RlbC8vMikKICAgIG5ld194MSA9IHgwICogc2luICsgeDEgKiBjb3MgIyAoLTEsIHNlcV9sZW4sIGRfbW9kZWwvLzIpCiAgICBuZXdfeCA9IHRvcmNoLmNhdChbbmV3X3gwLCBuZXdfeDFdLCBkaW09LTEpICMgKC0xLCBzZXFfbGVuLCBkX21vZGVsKQogICAgbmV3X3ggPSBuZXdfeC52aWV3KG9sZF9zaGFwZSkgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbCkKICAgIHJldHVybiBuZXdfeApAdHJpdG9uLmppdApkZWYgcV9yb3BlX2tlcm5lbCgKICAgIHgsCiAgICB5LAogICAgdGhldGEsCiAgICBzdGFydF9wb3NpdGlvbiwKICAgIGJhdGNoc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2hlYWRzLAogICAgcm9wZV9oZWFkX2RpbTogdGwuY29uc3RleHByLAogICAgeF9iYXRjaF9zdHJpZGUsCiAgICB4X3NlcV9zdHJpZGUsCiAgICB4X2hlYWRfc3RyaWRlLAogICAgeV9iYXRjaF9zdHJpZGUsCiAgICB5X3NlcV9zdHJpZGUsCiAgICB5X2hlYWRfc3RyaWRlLAogICAgaGVhZF9ibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIHg6ICAoYmF0Y2hzaXplLCBzZXFfbGVuLCBuX2hlYWRzLCByb3BlX2hlYWRfZGltKSAKICAgICMgeTogIChiYXRjaHNpemUsIHNlcV9sZW4sIG5faGVhZHMsIHJvcGVfaGVhZF9kaW0pCiAgICAjIHRoZXRhOiAocm9wZV9oZWFkX2RpbSAvLyAyLCApCiAgICAjIGdyaWQ6IChjZGl2KG5faGVhZHMsIGhlYWRfYmxvY2tfc2l6ZSksIHNlcV9sZW4sIGJhdGNoc2l6ZSkKICAgIAogICAgYmF0Y2hfaWR4ID0gdGwucHJvZ3JhbV9pZCgyKQogICAgc2VxX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIGhlYWRfYmVnaW4gPSB0bC5wcm9ncmFtX2lkKDApICogaGVhZF9ibG9ja19zaXplCiAgICAKICAgIHgwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9pZHggKiB4X2JhdGNoX3N0cmlkZSArIHNlcV9pZHggKiB4X3NlcV9zdHJpZGUgKyBoZWFkX2JlZ2luICogeF9oZWFkX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeDFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeCArIGJhdGNoX2lkeCAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB4X2hlYWRfc3RyaWRlICsgcm9wZV9oZWFkX2RpbS8vMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeTBfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeSArIGJhdGNoX2lkeCAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB5X2hlYWRfc3RyaWRlLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB5MV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB5ICsgYmF0Y2hfaWR4ICogeV9iYXRjaF9zdHJpZGUgKyBzZXFfaWR4ICogeV9zZXFfc3RyaWRlICsgaGVhZF9iZWdpbiAqIHlfaGVhZF9zdHJpZGUgKyByb3BlX2hlYWRfZGltLy8yLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB0aGV0YV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB0aGV0YSwKICAgICAgICBzaGFwZT0oMSwgcm9wZV9oZWFkX2RpbS8vMiwgKSwKICAgICAgICBzdHJpZGVzPSgwLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oMSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeDAgPSB0bC5sb2FkKHgwX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChoZWFkX2Jsb2NrX3NpemUsIHJvcGVfaGVhZF9kaW0vLzIpCiAgICB4MSA9IHRsLmxvYWQoeDFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRoZXRhID0gdGwubG9hZCh0aGV0YV9ibG9ja19wdHIpICMgKDEsIHJvcGVfaGVhZF9kaW0vLzIpCiAgICBwb3NpdGlvbiA9IChzdGFydF9wb3NpdGlvbiArIHNlcV9pZHgpICMgKDEsICkKICAgICMgcHJlY2lzaW9uISEhIQogICAgdGhldGEgPSAodGhldGEgKiBwb3NpdGlvbikgIyAoMSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIGNvcyA9IHRsLmNvcyh0aGV0YSkudG8odGwuYmZsb2F0MTYpICMgKDEsIHJvcGVfaGVhZF9kaW0vLzIpCiAgICBzaW4gPSB0bC5zaW4odGhldGEpLnRvKHRsLmJmbG9hdDE2KSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgCiAgICB5MCA9ICh4MCAqIGNvcykgLSAoeDEgKiBzaW4pICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHkxID0gKHgwICogc2luKSArICh4MSAqIGNvcykgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgIyBjb252ZXJ0IHRvIHRoZSB0eXBlIG9mIHkKICAgIHkwID0geTAudG8oeS5kdHlwZS5lbGVtZW50X3R5KQogICAgeTEgPSB5MS50byh5LmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZSh5MF9ibG9ja19wdHIsIHkwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRsLnN0b3JlKHkxX2Jsb2NrX3B0ciwgeTEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQoKCkB0cml0b24uaml0CmRlZiBxX3JvcGVfY29zX3Npbl9rZXJuZWwoCiAgICB4LAogICAgeSwKICAgIGNvcywKICAgIHNpbiwKICAgIHN0YXJ0X3Bvc2l0aW9uLAogICAgYmF0Y2hzaXplLAogICAgc2VxX2xlbiwKICAgIG5faGVhZHMsCiAgICByb3BlX2hlYWRfZGltOiB0bC5jb25zdGV4cHIsCiAgICB4X2JhdGNoX3N0cmlkZSwKICAgIHhfc2VxX3N0cmlkZSwKICAgIHhfaGVhZF9zdHJpZGUsCiAgICB5X2JhdGNoX3N0cmlkZSwKICAgIHlfc2VxX3N0cmlkZSwKICAgIHlfaGVhZF9zdHJpZGUsCiAgICBoZWFkX2Jsb2NrX3NpemU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgeDogIChiYXRjaHNpemUsIHNlcV9sZW4sIG5faGVhZHMsIHJvcGVfaGVhZF9kaW0pIAogICAgIyB5OiAgKGJhdGNoc2l6ZSwgc2VxX2xlbiwgbl9oZWFkcywgcm9wZV9oZWFkX2RpbSkKICAgICMgY29zOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgc2luOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgc3RhcnRfcG9zaXRpb246ICgxLCApCiAgICAjIGdyaWQ6IChjZGl2KG5faGVhZHMsIGhlYWRfYmxvY2tfc2l6ZSksIHNlcV9sZW4sIGJhdGNoc2l6ZSkKICAgIAogICAgYmF0Y2hfaWR4ID0gdGwucHJvZ3JhbV9pZCgyKQogICAgc2VxX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIGhlYWRfYmVnaW4gPSB0bC5wcm9ncmFtX2lkKDApICogaGVhZF9ibG9ja19zaXplCiAgICAKICAgIHgwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9pZHggKiB4X2JhdGNoX3N0cmlkZSArIHNlcV9pZHggKiB4X3NlcV9zdHJpZGUgKyBoZWFkX2JlZ2luICogeF9oZWFkX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeDFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeCArIGJhdGNoX2lkeCAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB4X2hlYWRfc3RyaWRlICsgcm9wZV9oZWFkX2RpbS8vMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShoZWFkX2Jsb2NrX3NpemUsIG5faGVhZHMgLSBoZWFkX2JlZ2luKSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc3RyaWRlcz0oeF9oZWFkX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgeTBfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgeSArIGJhdGNoX2lkeCAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSArIGhlYWRfYmVnaW4gKiB5X2hlYWRfc3RyaWRlLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB5MV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICB5ICsgYmF0Y2hfaWR4ICogeV9iYXRjaF9zdHJpZGUgKyBzZXFfaWR4ICogeV9zZXFfc3RyaWRlICsgaGVhZF9iZWdpbiAqIHlfaGVhZF9zdHJpZGUgKyByb3BlX2hlYWRfZGltLy8yLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKGhlYWRfYmxvY2tfc2l6ZSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBzdHJpZGVzPSh5X2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjb3NfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgY29zICsgKHN0YXJ0X3Bvc2l0aW9uICsgc2VxX2lkeCkgKiAocm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIHN0cmlkZXM9KDAsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPSgxLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBzaW5fYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgc2luICsgKHN0YXJ0X3Bvc2l0aW9uICsgc2VxX2lkeCkgKiAocm9wZV9oZWFkX2RpbS8vMiksCiAgICAgICAgc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0vLzIpLAogICAgICAgIHN0cmlkZXM9KDAsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPSgxLCByb3BlX2hlYWRfZGltLy8yKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB4MCA9IHRsLmxvYWQoeDBfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHgxID0gdGwubG9hZCh4MV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgY29zID0gdGwubG9hZChjb3NfYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgc2luID0gdGwubG9hZChzaW5fYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgCiAgICB5MCA9ICh4MCAqIGNvcykgLSAoeDEgKiBzaW4pICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHkxID0gKHgwICogc2luKSArICh4MSAqIGNvcykgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgIyBjb252ZXJ0IHRvIHRoZSB0eXBlIG9mIHkKICAgIHkwID0geTAudG8oeS5kdHlwZS5lbGVtZW50X3R5KQogICAgeTEgPSB5MS50byh5LmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZSh5MF9ibG9ja19wdHIsIHkwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKGhlYWRfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRsLnN0b3JlKHkxX2Jsb2NrX3B0ciwgeTEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoaGVhZF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQoKQHRyaXRvbi5qaXQKZGVmIGtfcm9wZV9jb3Nfc2luX2tlcm5lbCgKICAgIHgsCiAgICB5LAogICAgY29zLAogICAgc2luLAogICAgYmF0Y2hzaXplLAogICAgc2VxX2xlbiwKICAgIHJvcGVfaGVhZF9kaW06IHRsLmNvbnN0ZXhwciwKICAgIHhfYmF0Y2hfc3RyaWRlLAogICAgeF9zZXFfc3RyaWRlLAogICAgeV9iYXRjaF9zdHJpZGUsCiAgICB5X3NlcV9zdHJpZGUsCiAgICBiYXRjaF9ibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIHg6ICAoYmF0Y2hzaXplLCBzZXFfbGVuLCByb3BlX2hlYWRfZGltKQogICAgIyB5OiAgKGJhdGNoc2l6ZSwgc2VxX2xlbiwgcm9wZV9oZWFkX2RpbSkKICAgICMgY29zOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgc2luOiAobWF4X3NlcV9sZW4sIHJvcGVfaGVhZF9kaW0gLy8gMikKICAgICMgZ3JpZDogKHNlcV9sZW4sIGNkaXYoYmF0Y2hzaXplLCBiYXRjaF9ibG9ja19zaXplKSkKICAgIGJhdGNoX2JlZ2luID0gdGwucHJvZ3JhbV9pZCgxKSAqIGJhdGNoX2Jsb2NrX3NpemUKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDApCiAgICAKICAgIHgwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9iZWdpbiAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeF9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHgxX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHggKyBiYXRjaF9iZWdpbiAqIHhfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHhfc2VxX3N0cmlkZSArIHJvcGVfaGVhZF9kaW0gLy8gMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeF9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHkwX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHkgKyBiYXRjaF9iZWdpbiAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeV9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIHkxX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHkgKyBiYXRjaF9iZWdpbiAqIHlfYmF0Y2hfc3RyaWRlICsgc2VxX2lkeCAqIHlfc2VxX3N0cmlkZSArIHJvcGVfaGVhZF9kaW0gLy8gMiwKICAgICAgICBzaGFwZT0odGwubWluaW11bShiYXRjaF9ibG9ja19zaXplLCBiYXRjaHNpemUgLSBiYXRjaF9iZWdpbiksIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oeV9iYXRjaF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltIC8vIDIpLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGNvc19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBjb3MgKyBzZXFfaWR4ICogKHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgc3RyaWRlcz0oMCwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KDEsIHJvcGVfaGVhZF9kaW0gLy8gMiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgc2luX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHNpbiArIHNlcV9pZHggKiAocm9wZV9oZWFkX2RpbSAvLyAyKSwKICAgICAgICBzaGFwZT0oMSwgcm9wZV9oZWFkX2RpbSAvLyAyKSwKICAgICAgICBzdHJpZGVzPSgwLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oMSwgcm9wZV9oZWFkX2RpbSAvLyAyKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICB4MCA9IHRsLmxvYWQoeDBfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoYmF0Y2hfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHgxID0gdGwubG9hZCh4MV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCApKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgY29zID0gdGwubG9hZChjb3NfYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgc2luID0gdGwubG9hZChzaW5fYmxvY2tfcHRyKSAjICgxLCByb3BlX2hlYWRfZGltLy8yKQogICAgeTAgPSAoeDAgKiBjb3MpIC0gKHgxICogc2luKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgeTEgPSAoeDAgKiBzaW4pICsgKHgxICogY29zKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgIyBjb252ZXJ0IHRvIHRoZSB0eXBlIG9mIHkKICAgIHkwID0geTAudG8oeS5kdHlwZS5lbGVtZW50X3R5KQogICAgeTEgPSB5MS50byh5LmR0eXBlLmVsZW1lbnRfdHkpCiAgICB0bC5zdG9yZSh5MF9ibG9ja19wdHIsIHkwLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoYmF0Y2hfYmxvY2tfc2l6ZSwgcm9wZV9oZWFkX2RpbS8vMikKICAgIHRsLnN0b3JlKHkxX2Jsb2NrX3B0ciwgeTEsIGJvdW5kYXJ5X2NoZWNrPSgwLCApKSAjIChiYXRjaF9ibG9ja19zaXplLCByb3BlX2hlYWRfZGltLy8yKQogICAgCnRoZXRhcyA9IHsKICAgIGRfbW9kZWw6IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKSBmb3IgZF9tb2RlbCBpbiBbNjQsXQp9CnRoZXRhcyA9IHsKICAgIGRfbW9kZWw6IHRoZXRhLmN1ZGEoKSBmb3IgZF9tb2RlbCwgdGhldGEgaW4gdGhldGFzLml0ZW1zKCkKfQptYXhfc2VxbGVuID0gODE5Mgpjb3NfdGVuc29ycyA9IHsKICAgIGRfbW9kZWw6IAogICAgICAgIHRvcmNoLmVpbnN1bSgncyxkLT5zZCcsIHRvcmNoLmFyYW5nZSgwLCBtYXhfc2VxbGVuLCkuY3VkYSgpLCB0aGV0YSkuY29zKCkKICAgIGZvciBkX21vZGVsLCB0aGV0YSBpbiB0aGV0YXMuaXRlbXMoKQp9CnNpbl90ZW5zb3JzID0gewogICAgZF9tb2RlbDogCiAgICAgICAgdG9yY2guZWluc3VtKCdzLGQtPnNkJywgdG9yY2guYXJhbmdlKDAsIG1heF9zZXFsZW4sKS5jdWRhKCksIHRoZXRhKS5zaW4oKQogICAgZm9yIGRfbW9kZWwsIHRoZXRhIGluIHRoZXRhcy5pdGVtcygpCn0KY2xhc3MgVGltZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWw6IHN0cik6CiAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCiAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQogICAgICAgIHNlbGYuZW5kX3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcnZhbCA9IE5vbmUKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIyBzZWxmLnN0YXJ0ID0gdGltZS50aW1lKCkKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgICMgc2VsZi5lbmQgPSB0aW1lLnRpbWUoKQogICAgICAgICMgc2VsZi5pbnRlcnZhbCA9IChzZWxmLmVuZCAtIHNlbGYuc3RhcnQpICogMTAwMCAjIGluIG1zCiAgICAgICAgIyBwcmludChmIntzZWxmLmxhYmVsfToge3NlbGYuaW50ZXJ2YWw6LjRmfSBtcyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAKQHRyaXRvbi5qaXQKZGVmIG1sYV9kZWNvZGVfa2VybmVsKAogICAgcV9ub3BlLCBrdl9ub3BlLCAKICAgIHFfcm9wZSwga19yb3BlLAogICAgb3V0LAogICAgc2NhbGUsCiAgICBiYXRjaF9zaXplLAogICAga3ZfbGVuLAogICAgcV9ub3BlX2JhdGNoX3N0cmlkZSwKICAgIHFfbm9wZV9oZWFkX3N0cmlkZSwKICAgIGt2X25vcGVfYmF0Y2hfc3RyaWRlLAogICAga3Zfbm9wZV9zZXFfc3RyaWRlLAogICAgbl9oZWFkczogdGwuY29uc3RleHByLAogICAgcWtfcm9wZV9oZWFkX2RpbTogdGwuY29uc3RleHByLAogICAga3ZfbG9yYV9yYW5rOiB0bC5jb25zdGV4cHIsCiAgICBIRUFEX0JMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciA9IDE2LAogICAgU0VRX0JMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciA9IDMyLAopOgogICAgIyBxX25vcGU6IChiYXRjaF9zaXplLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspIDogKHFfbm9wZV9iYXRjaF9zdHJpZGUsIHFfbm9wZV9oZWFkX3N0cmlkZSwgMSkKICAgICMga3Zfbm9wZTogKGJhdGNoX3NpemUsIGt2X2xlbiwga3ZfbG9yYV9yYW5rKSA6IChrdl9ub3BlX2JhdGNoX3N0cmlkZSwga3Zfbm9wZV9zZXFfc3RyaWRlLCAxKQogICAgIyBxX3JvcGU6IChiYXRjaF9zaXplLCBuX2hlYWRzLCBxa19yb3BlX2hlYWRfZGltKSA6IChuX2hlYWRzICogcWtfcm9wZV9oZWFkX2RpbSwgcWtfcm9wZV9oZWFkX2RpbSwgMSkKICAgICMga19yb3BlOiAoYmF0Y2hfc2l6ZSwga3ZfbGVuLCBxa19yb3BlX2hlYWRfZGltKSA6IChrdl9sZW4gKiBxa19yb3BlX2hlYWRfZGltLCBxa19yb3BlX2hlYWRfZGltLCAxKQogICAgIyBvdXQ6IChiYXRjaF9zaXplLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspIDogKG5faGVhZHMgKiBrdl9sb3JhX3JhbmssIGt2X2xvcmFfcmFuaywgMSkKICAgICMgZ3JpZDogKGNkaXYobl9oZWFkcywgSEVBRF9CTE9DS19TSVpFKSwgYmF0Y2hfc2l6ZSkKICAgIGhlYWRfYmVnaW4gPSB0bC5wcm9ncmFtX2lkKDApICogSEVBRF9CTE9DS19TSVpFCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIHFfcm9wZV9oZWFkX3N0cmlkZSA9IHFrX3JvcGVfaGVhZF9kaW0KICAgIHFfcm9wZV9iYXRjaF9zdHJpZGUgPSBuX2hlYWRzICogcWtfcm9wZV9oZWFkX2RpbQogICAgcV9yb3BlX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIHFfcm9wZSArIGJhdGNoX2lkeCAqIHFfcm9wZV9iYXRjaF9zdHJpZGUgKyBoZWFkX2JlZ2luICogcV9yb3BlX2hlYWRfc3RyaWRlLAogICAgICAgIHNoYXBlPSh0bC5taW5pbXVtKEhFQURfQkxPQ0tfU0laRSwgbl9oZWFkcyAtIGhlYWRfYmVnaW4pLCBxa19yb3BlX2hlYWRfZGltKSwKICAgICAgICBzdHJpZGVzPShxX3JvcGVfaGVhZF9zdHJpZGUsIDEpLAogICAgICAgIG9mZnNldHM9KDAsIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShIRUFEX0JMT0NLX1NJWkUsIHFrX3JvcGVfaGVhZF9kaW0pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoSEVBRF9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICBrX3JvcGVfc2VxX3N0cmlkZSA9IHFrX3JvcGVfaGVhZF9kaW0KICAgIGtfcm9wZV9iYXRjaF9zdHJpZGUgPSBrdl9sZW4gKiBxa19yb3BlX2hlYWRfZGltCiAgICBrX3JvcGVfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAga19yb3BlICsgYmF0Y2hfaWR4ICoga19yb3BlX2JhdGNoX3N0cmlkZSwKICAgICAgICBzaGFwZT0oa3ZfbGVuLCBxa19yb3BlX2hlYWRfZGltKSwKICAgICAgICBzdHJpZGVzPShrX3JvcGVfc2VxX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KFNFUV9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApICMgKFNFUV9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICBxX25vcGVfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgcV9ub3BlICsgYmF0Y2hfaWR4ICogcV9ub3BlX2JhdGNoX3N0cmlkZSArIGhlYWRfYmVnaW4gKiBxX25vcGVfaGVhZF9zdHJpZGUsCiAgICAgICAgc2hhcGU9KHRsLm1pbmltdW0oSEVBRF9CTE9DS19TSVpFLCBuX2hlYWRzIC0gaGVhZF9iZWdpbiksIGt2X2xvcmFfcmFuayksCiAgICAgICAgc3RyaWRlcz0ocV9ub3BlX2hlYWRfc3RyaWRlLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspCiAgICBrdl9ub3BlX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGt2X25vcGUgKyBiYXRjaF9pZHggKiBrdl9ub3BlX2JhdGNoX3N0cmlkZSwKICAgICAgICBzaGFwZT0oa3ZfbGVuLCBrdl9sb3JhX3JhbmspLAogICAgICAgIHN0cmlkZXM9KGt2X25vcGVfc2VxX3N0cmlkZSwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KFNFUV9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoU0VRX0JMT0NLX1NJWkUsIGt2X2xvcmFfcmFuaykKICAgIAogICAgb3V0X2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIG91dCArIGJhdGNoX2lkeCAqIChuX2hlYWRzICoga3ZfbG9yYV9yYW5rKSArIGhlYWRfYmVnaW4gKiBrdl9sb3JhX3JhbmssCiAgICAgICAgc2hhcGU9KHRsLm1pbmltdW0oSEVBRF9CTE9DS19TSVpFLCBuX2hlYWRzIC0gaGVhZF9iZWdpbiksIGt2X2xvcmFfcmFuayksCiAgICAgICAgc3RyaWRlcz0oa3ZfbG9yYV9yYW5rLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspCiAgICAKICAgICMgCiAgICBxa19zY2FsZSA9IHNjYWxlICogMS40NDI2OTUwNAogICAgIyBpbml0aWFsaXplIHBvaW50ZXIgdG8gbSBhbmQgbAogICAgbV9pID0gdGwuemVyb3MoW0hFQURfQkxPQ0tfU0laRV0sIGR0eXBlPXRsLmZsb2F0MzIpIC0gZmxvYXQoImluZiIpICMoSEVBRF9CTE9DS19TSVpFLCApCiAgICBsX2kgPSB0bC56ZXJvcyhbSEVBRF9CTE9DS19TSVpFXSwgZHR5cGU9dGwuZmxvYXQzMikgKyAxLjAgIyhIRUFEX0JMT0NLX1NJWkUsICkKICAgIGFjYyA9IHRsLnplcm9zKFtIRUFEX0JMT0NLX1NJWkUsIGt2X2xvcmFfcmFua10sIGR0eXBlPXRsLmZsb2F0MzIpICMgKEhFQURfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQogICAgCiAgICAjIFRPRE86IHJlbW92ZSBib3VuZGFyeSBjaGVjawogICAgcV9yb3BlID0gdGwubG9hZChxX3JvcGVfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKSAjIChIRUFEX0JMT0NLX1NJWkUsIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBxX25vcGUgPSB0bC5sb2FkKHFfbm9wZV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCkpICMgKEhFQURfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQogICAgZm9yIHNlcV9iZWdpbiBpbiByYW5nZSgwLCBrdl9sZW4sIFNFUV9CTE9DS19TSVpFKToKICAgICAgICBrX3JvcGVfYmxvY2sgPSB0bC5sb2FkKGtfcm9wZV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCkpICMgKFNFUV9CTE9DS19TSVpFLCBxa19yb3BlX2hlYWRfZGltKQogICAgICAgIHFrID0gdGwuZG90KHFfcm9wZSwga19yb3BlX2Jsb2NrLlQpICMgKEhFQURfQkxPQ0tfU0laRSwgU0VRX0JMT0NLX1NJWkUpCgogICAgICAgIGt2X25vcGVfYmxvY2sgPSB0bC5sb2FkKGt2X25vcGVfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKSAjIChTRVFfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQogICAgICAgIHFrICs9IHRsLmRvdChxX25vcGUsIGt2X25vcGVfYmxvY2suVCkgIyAoSEVBRF9CTE9DS19TSVpFLCBTRVFfQkxPQ0tfU0laRSkKICAgICAgICAKICAgICAgICBtX2lqID0gdGwubWF4aW11bShtX2ksIHRsLm1heChxaywgMSkgKiBxa19zY2FsZSkKICAgICAgICBxayA9IHFrICogcWtfc2NhbGUgLSBtX2lqWzosIE5vbmVdCiAgICAgICAgICAgICAgICAKICAgICAgICBwID0gdGwubWF0aC5leHAyKHFrKQogICAgICAgIAogICAgICAgICMgLS0gY29tcHV0ZSBjb3JyZWN0aW9uIGZhY3RvcgogICAgICAgIGFscGhhID0gdGwubWF0aC5leHAyKG1faSAtIG1faWopCiAgICAgICAgbF9paiA9IHRsLnN1bShwLCAxKQogICAgICAgICMgLS0gdXBkYXRlIG91dHB1dCBhY2N1bXVsYXRvciAtLQogICAgICAgIGFjYyA9IGFjYyAqIGFscGhhWzosIE5vbmVdCiAgICAgICAgIyBwcmVwYXJlIHAgYW5kIHYgZm9yIHRoZSBkb3QKICAgICAgICBwID0gcC50byh0bC5iZmxvYXQxNikgIyBjb252ZXJ0IHAgdG8gdGhlIHNhbWUgdHlwZSBhcyBrdl9ub3BlCiAgICAgICAgCiAgICAgICAgYWNjID0gdGwuZG90KHAsIGt2X25vcGVfYmxvY2ssIGFjYykgIyAoSEVBRF9CTE9DS19TSVpFLCBrdl9sb3JhX3JhbmspCiAgICAgICAgIyB1cGRhdGUgbV9pIGFuZCBsX2kKICAgICAgICAjIHBsYWNlIHRoaXMgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUKICAgICAgICBsX2kgPSBsX2kgKiBhbHBoYSArIGxfaWoKICAgICAgICBtX2kgPSBtX2lqCiAgICAgICAgCiAgICAgICAga19yb3BlX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2Uoa19yb3BlX2Jsb2NrX3B0ciwgKFNFUV9CTE9DS19TSVpFLCAwKSkgCiAgICAgICAga3Zfbm9wZV9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGt2X25vcGVfYmxvY2tfcHRyLCAoU0VRX0JMT0NLX1NJWkUsIDApKSAKICAgIGFjYyA9IGFjYyAvIGxfaVs6LCBOb25lXSAjIChIRUFEX0JMT0NLX1NJWkUsIGt2X2xvcmFfcmFuaykKICAgIHRsLnN0b3JlKG91dF9ibG9ja19wdHIsIGFjYy50byh0bC5iZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCkpICMgKEhFQURfQkxPQ0tfU0laRSwga3ZfbG9yYV9yYW5rKQpkZWYgbWxhX2RlY29kZV92MCgKICAgIGNvbmZpZzogQ29uZmlnLAogICAgeDogdG9yY2guVGVuc29yLAogICAga3ZfY2FjaGU6IEtWQ2FjaGUsCikgOgogICAgIyBkaW06ICAgICAgICAgICAgICAgIDcxNjgKICAgICMgbl9oZWFkczogICAgICAgICAgICAgMTI4CiAgICAjIHFfbG9yYV9yYW5rOiAgICAgICAgMTUzNgogICAgIyBrdl9sb3JhX3Jhbms6ICAgICAgIDUxMgogICAgIyBxa19ub3BlX2hlYWRfZGltOiAgIDEyOAogICAgIyBxa19yb3BlX2hlYWRfZGltOiAgIDY0CiAgICAjIHZfaGVhZF9kaW06ICAgICAgICAxMjgKICAgICMgUV9wcm9qX2Rvd25fd2VpZ2h0OiAgICgxNTM2LCA3MTY4KQogICAgIyBRX3Byb2pfdXBfd2VpZ2h0OiAgICAgKCgxMjggKyA2NCkgKiAxMjgsIDE1MzYpID0gKDI0NTc2LCAxNTM2KQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKDUxMiArIDY0LCA3MTY4KSA9ICg1NzYsIDcxNjgpCiAgICAjIEtWX3Byb2pfdXBfd2VpZ2h0OiAgICAoKDEyOCArIDEyOCkgKiAxMjgsIDUxMikgPSAoMzI3NjgsIDUxMikKICAgICMgd29fd2VpZ2h0OiAgICAgICAgICAgICg3MTY4LCAxMjggKiAxMjgpID0gKDcxNjgsIDE2Mzg0KQogICAgIyBrdl9jYWNoZV9zaGFwZTogICAgIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgIyBRX3Byb2pfZG93bl93ZWlnaHQ6ICAgKHFfbG9yYV9yYW5rLCBkaW0pCiAgICAjIFFfcHJval91cF93ZWlnaHQ6ICAgICAoKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSAqIG5faGVhZHMsIHFfbG9yYV9yYW5rKQogICAgIyBLVl9wcm9qX2Rvd25fd2VpZ2h0OiAgKGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0sIGRpbSkKICAgICMgS1ZfcHJval91cF93ZWlnaHQ6ICAgICgocWtfbm9wZV9oZWFkX2RpbSArIHZfaGVhZF9kaW0pICogbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgIyB3b193ZWlnaHQ6ICAgICAgICAgICAgKGRpbSwgdl9oZWFkX2RpbSAqIG5faGVhZHMpCiAgICAjIHg6ICAgICAgICAgICAgICAgIChiYXRjaHNpemUsIDEsIGRpbSkKICAgICMgd2l0aCBUaW1lcihmImt2IGxlbmd0aDoge2t2X2NhY2hlLnNlcV9sZW4gKyAxfSBkb3duIHByb2plY3Rpb24iKToKICAgIHFfbG9yYSA9IHggQCBjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBxX2xvcmFfcmFuaykKICAgIGN1cl9rdl9sb3JhID0geCBAIGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0LlQgIyAoYmF0Y2hzaXplLCAxLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICAjIHdpdGggVGltZXIoZiJrdiBsZW5ndGg6IHtrdl9jYWNoZS5zZXFfbGVuICsgMX0gc3RvcmUga3ZfbG9yYSIpOgogICAgIyBzdG9yZSBrdl9sb3JhIGluIGNhY2hlIGFuZCByZXR1cm4gdGhlIHVwZGF0ZWQgY2FjaGUKICAgIGt2X2NhY2hlX2RhdGEgPSBrdl9jYWNoZS5nZXRfZGF0YSgpICMgKGJhdGNoc2l6ZSwgbWF4X3NlcV9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBrdl9jYWNoZS5zZXFfbGVuICs9IDEKICAgICMgVE9ETzogdXNlIHRyaXRvbiB0byB3cml0ZSB0aGUga3ZfbG9yYSB0byB0aGUgY2FjaGUKICAgIGt2X2NhY2hlX2RhdGFbOiwga3ZfY2FjaGUuc2VxX2xlbiAtIDEsIDpdID0gY3VyX2t2X2xvcmEuc3F1ZWV6ZSgxKSAKICAgIGt2X2xlbiA9IGt2X2NhY2hlLnNlcV9sZW4gIyAoYmF0Y2hzaXplLCBrdl9sZW4sIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0pCiAgICBrdl9jYWNoZV9kYXRhID0ga3ZfY2FjaGUuZ2V0X2RhdGEoKSAjIChiYXRjaHNpemUsIG1heF9zZXFfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKQogICAga3ZfbG9yYSA9IGt2X2NhY2hlX2RhdGFbOiwgOmt2X2NhY2hlLnNlcV9sZW4sIDpdICMgKGJhdGNoc2l6ZSwga3ZfbGVuLCBrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKSA6IChtYXhfc2VxX2xlbiAqIChrdl9sb3JhX3JhbmsgKyBxa19yb3BlX2hlYWRfZGltKSwga3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSAsMSkKICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEgIwogICAgICAgIAogICAgIyB3aXRoIFRpbWVyKGYia3YgbGVuZ3RoOiB7a3ZfY2FjaGUuc2VxX2xlbn0gdXAgcHJvamVjdGlvbiIpOgogICAgcV9ub3BlX2FuZF9yb3BlID0gcV9sb3JhIEAgY29uZmlnLlFfcHJval91cF93ZWlnaHQuVCAjIChiYXRjaHNpemUsIDEsIChxa19ub3BlX2hlYWRfZGltICsgcWtfcm9wZV9oZWFkX2RpbSkgKiBuX2hlYWRzKQogICAgcV9ub3BlX2FuZF9yb3BlID0gcV9ub3BlX2FuZF9yb3BlLnZpZXcoY29uZmlnLmJhdGNoX3NpemUsIDEsIGNvbmZpZy5uX2hlYWRzLCBjb25maWcucWtfbm9wZV9oZWFkX2RpbSArIGNvbmZpZy5xa19yb3BlX2hlYWRfZGltKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKQogICAgCiAgICBxX25vcGUsIHFfcm9wZSA9IHRvcmNoLnNwbGl0KHFfbm9wZV9hbmRfcm9wZSwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sIGRpbT0tMSkgCiAgICAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0pIDogKG5faGVhZHMgKiAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCBuX2hlYWRzICogKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSwgKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSwgMSkgCiAgICAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIHFrX3JvcGVfaGVhZF9kaW0pIDogKG5faGVhZHMgKiAocWtfbm9wZV9oZWFkX2RpbSArIHFrX3JvcGVfaGVhZF9kaW0pLCBuX2hlYWRzICogKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSwgKHFrX25vcGVfaGVhZF9kaW0gKyBxa19yb3BlX2hlYWRfZGltKSwgMSkKICAgICMgcHJpbnQoZiJxX25vcGUgc2hhcGU6IHtxX25vcGUuc2hhcGV9IHN0cmlkZToge3Ffbm9wZS5zdHJpZGUoKX0gaXNfY29udGlndW91czoge3Ffbm9wZS5pc19jb250aWd1b3VzKCl9IikKICAgICMgcHJpbnQoZiJxX3JvcGUgc2hhcGU6IHtxX3JvcGUuc2hhcGV9IHN0cmlkZToge3Ffcm9wZS5zdHJpZGUoKX0gaXNfY29udGlndW91czoge3Ffcm9wZS5pc19jb250aWd1b3VzKCl9IikKICAgICMgVE9ETzogaW5wbGFjZSByb3BlIGZvciBxX3JvcGUKICAgICMgd2l0aCBUaW1lcihmImt2IGxlbmd0aDoge2t2X2NhY2hlLnNlcV9sZW59IHFfcm9wZSB0cml0b24ga2VybmVsIik6CiAgICBxX3JvcGVfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT1xX3JvcGUuc2hhcGUsIGR0eXBlPXFfcm9wZS5kdHlwZSwgZGV2aWNlPXFfcm9wZS5kZXZpY2UpICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGhlYWRfYmxvY2tfc2l6ZSA9IDE2CiAgICBxX3JvcGVfY29zX3Npbl9rZXJuZWxbdHJpdG9uLmNkaXYoY29uZmlnLm5faGVhZHMsIGhlYWRfYmxvY2tfc2l6ZSksIDEsIGNvbmZpZy5iYXRjaF9zaXplXSgKICAgICAgICB4ID0gcV9yb3BlLAogICAgICAgIHkgPSBxX3JvcGVfb3V0LAogICAgICAgIGNvcyA9IGNvc190ZW5zb3JzW2NvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwKICAgICAgICBzaW4gPSBzaW5fdGVuc29yc1tjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sCiAgICAgICAgc3RhcnRfcG9zaXRpb249cXVlcnlfcG9zLAogICAgICAgIGJhdGNoc2l6ZT1jb25maWcuYmF0Y2hfc2l6ZSwKICAgICAgICBzZXFfbGVuPTEsCiAgICAgICAgbl9oZWFkcz1jb25maWcubl9oZWFkcywKICAgICAgICByb3BlX2hlYWRfZGltPWNvbmZpZy5xa19yb3BlX2hlYWRfZGltLAogICAgICAgIHhfYmF0Y2hfc3RyaWRlPXFfcm9wZS5zdHJpZGUoMCksCiAgICAgICAgeF9zZXFfc3RyaWRlPXFfcm9wZS5zdHJpZGUoMSksCiAgICAgICAgeF9oZWFkX3N0cmlkZT1xX3JvcGUuc3RyaWRlKDIpLAogICAgICAgIHlfYmF0Y2hfc3RyaWRlPXFfcm9wZV9vdXQuc3RyaWRlKDApLAogICAgICAgIHlfc2VxX3N0cmlkZT1xX3JvcGVfb3V0LnN0cmlkZSgxKSwKICAgICAgICB5X2hlYWRfc3RyaWRlPXFfcm9wZV9vdXQuc3RyaWRlKDIpLAogICAgICAgIGhlYWRfYmxvY2tfc2l6ZT1oZWFkX2Jsb2NrX3NpemUsCiAgICApCiAgICAKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0LnZpZXcoY29uZmlnLm5faGVhZHMsIGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnZfaGVhZF9kaW0sIGNvbmZpZy5rdl9sb3JhX3JhbmspICMgKG5faGVhZHMsIHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltLCBrdl9sb3JhX3JhbmspCiAgICBrX25vcGVfcHJval91cF93ZWlnaHQsIHZfcHJval91cF93ZWlnaHQgPSB0b3JjaC5zcGxpdChLVl9wcm9qX3VwX3dlaWdodCwgW2NvbmZpZy5xa19ub3BlX2hlYWRfZGltLCBjb25maWcudl9oZWFkX2RpbV0sIGRpbT0tMikgCiAgICAjIChuX2hlYWRzLCBxa19ub3BlX2hlYWRfZGltLCBrdl9sb3JhX3JhbmspIDogKChxa19ub3BlX2hlYWRfZGltICsgdl9oZWFkX2RpbSkgKiBrdl9sb3JhX3JhbmssIGt2X2xvcmFfcmFuaywgMSkKICAgICMgKG5faGVhZHMsIHZfaGVhZF9kaW0sIGt2X2xvcmFfcmFuaykgOiAoKHFrX25vcGVfaGVhZF9kaW0gKyB2X2hlYWRfZGltKSAqIGt2X2xvcmFfcmFuaywga3ZfbG9yYV9yYW5rLCAxKQogICAgIyBwcmludChmImtfbm9wZV9wcm9qX3VwX3dlaWdodCBzaGFwZToge2tfbm9wZV9wcm9qX3VwX3dlaWdodC5zaGFwZX0gc3RyaWRlOiB7a19ub3BlX3Byb2pfdXBfd2VpZ2h0LnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7a19ub3BlX3Byb2pfdXBfd2VpZ2h0LmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBwcmludChmInZfcHJval91cF93ZWlnaHQgc2hhcGU6IHt2X3Byb2pfdXBfd2VpZ2h0LnNoYXBlfSBzdHJpZGU6IHt2X3Byb2pfdXBfd2VpZ2h0LnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7dl9wcm9qX3VwX3dlaWdodC5pc19jb250aWd1b3VzKCl9IikKICAgICMgVE9ETzogY2hlY2sgaWYgY29udGlndW91cyBpcyBjYWxsZWQgb3Igbm90CiAgICAjIHdpdGggVGltZXIoZiJrdiBsZW5ndGg6IHtrdl9jYWNoZS5zZXFfbGVufSBxIGtub3BlIHByb2plY3Rpb24iKToKICAgICAgICAKICAgICMgYjFoZCAtPiBiaGQKICAgIHFfbm9wZSA9IHFfbm9wZS5zcXVlZXplKDEpICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywgcWtfbm9wZV9oZWFkX2RpbSkKICAgICMgYmhkIC0+IGhiZAogICAgcV9ub3BlID0gcV9ub3BlLnRyYW5zcG9zZSgwLCAxKSAjIChuX2hlYWRzLCBiYXRjaHNpemUsIHFrX25vcGVfaGVhZF9kaW0pCiAgICAKICAgIHFfbm9wZV9wcm9qZWQgPSB0b3JjaC5ibW0ocV9ub3BlLCBrX25vcGVfcHJval91cF93ZWlnaHQpICMgKG5faGVhZHMsIGJhdGNoc2l6ZSwga3ZfbG9yYV9yYW5rKQogICAgcV9ub3BlX3Byb2plZCA9IHFfbm9wZV9wcm9qZWQudHJhbnNwb3NlKDAsIDEpICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgcV9ub3BlX3Byb2plZCA9IHFfbm9wZV9wcm9qZWQudW5zcXVlZXplKDEpICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgCiAgICBrdl9ub3BlLCBrX3JvcGUgPSB0b3JjaC5zcGxpdChrdl9sb3JhLCBbY29uZmlnLmt2X2xvcmFfcmFuaywgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW1dLCBkaW09LTEpIAogICAgIyAoYmF0Y2hzaXplLCBrdl9sZW4sIGt2X2xvcmFfcmFuaykgOiAobWF4X3NlcV9sZW4gKiAoa3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSksIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0gLDEpCiAgICAjIChiYXRjaHNpemUsIGt2X2xlbiwgcWtfcm9wZV9oZWFkX2RpbSkgOiAobWF4X3NlcV9sZW4gKiAoa3ZfbG9yYV9yYW5rICsgcWtfcm9wZV9oZWFkX2RpbSksIGt2X2xvcmFfcmFuayArIHFrX3JvcGVfaGVhZF9kaW0gLDEpCiAgICAjIHByaW50KGYia3Zfbm9wZSBzaGFwZToge2t2X25vcGUuc2hhcGV9IHN0cmlkZToge2t2X25vcGUuc3RyaWRlKCl9IGlzX2NvbnRpZ3VvdXM6IHtrdl9ub3BlLmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBwcmludChmImtfcm9wZSBzaGFwZToge2tfcm9wZS5zaGFwZX0gc3RyaWRlOiB7a19yb3BlLnN0cmlkZSgpfSBpc19jb250aWd1b3VzOiB7a19yb3BlLmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBUT0RPOiBvdXQgb2YgcGxhY2Ugcm9wZSBmb3Iga19yb3BlCiAgICAjIHdpdGggVGltZXIoZiJrdiBsZW5ndGg6IHtrdl9jYWNoZS5zZXFfbGVufSBrX3JvcGUgdHJpdG9uIGtlcm5lbCIpOgogICAga19yb3BlX291dCA9IHRvcmNoLmVtcHR5KHNpemU9a19yb3BlLnNoYXBlLCBkdHlwZT1rX3JvcGUuZHR5cGUsIGRldmljZT1rX3JvcGUuZGV2aWNlKSAjIChiYXRjaHNpemUsIGt2X2xlbiwgcWtfcm9wZV9oZWFkX2RpbSkKICAgIGJhdGNoX2Jsb2NrX3NpemUgPSAzMgogICAga19yb3BlX2Nvc19zaW5fa2VybmVsW2t2X2xlbiwgdHJpdG9uLmNkaXYoY29uZmlnLmJhdGNoX3NpemUsIGJhdGNoX2Jsb2NrX3NpemUpXSgKICAgICAgICB4ID0ga19yb3BlLAogICAgICAgIHkgPSBrX3JvcGVfb3V0LAogICAgICAgIGNvcyA9IGNvc190ZW5zb3JzW2NvbmZpZy5xa19yb3BlX2hlYWRfZGltXSwKICAgICAgICBzaW4gPSBzaW5fdGVuc29yc1tjb25maWcucWtfcm9wZV9oZWFkX2RpbV0sCiAgICAgICAgYmF0Y2hzaXplPWNvbmZpZy5iYXRjaF9zaXplLAogICAgICAgIHNlcV9sZW49a3ZfbGVuLAogICAgICAgIHJvcGVfaGVhZF9kaW09Y29uZmlnLnFrX3JvcGVfaGVhZF9kaW0sCiAgICAgICAgeF9iYXRjaF9zdHJpZGU9a19yb3BlLnN0cmlkZSgwKSwKICAgICAgICB4X3NlcV9zdHJpZGU9a19yb3BlLnN0cmlkZSgxKSwKICAgICAgICB5X2JhdGNoX3N0cmlkZT1rX3JvcGVfb3V0LnN0cmlkZSgwKSwKICAgICAgICB5X3NlcV9zdHJpZGU9a19yb3BlX291dC5zdHJpZGUoMSksCiAgICAgICAgYmF0Y2hfYmxvY2tfc2l6ZT1iYXRjaF9ibG9ja19zaXplLAogICAgICAgIG51bV93YXJwcz04LCAjIFRPRE86IGNoZWNrIGlmIHRoaXMgaXMgbmVlZGVkCiAgICAgICAgbnVtX3N0YWdlcz0xLCAjIFRPRE86IGNoZWNrIGlmIHRoaXMgaXMgbmVlZGVkCiAgICApCiAgICAKICAgICMgd2l0aCBUaW1lcihmImt2IGxlbmd0aDoge2t2X2NhY2hlLnNlcV9sZW59IG1sYSBkZWNvZGUiKToKICAgICMgVE9ETzogTUxBCiAgICAjIHkgPSB0b3JjaC56ZXJvcyhzaXplPShjb25maWcuYmF0Y2hfc2l6ZSwgY29uZmlnLm5faGVhZHMsIGNvbmZpZy5rdl9sb3JhX3JhbmspLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykgIyAoYmF0Y2hzaXplLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAjIE1MQV9IRUFEX0JMT0NLX1NJWkUgPSAxNgogICAgIyBNTEFfU0VRX0JMT0NLX1NJWkUgPSAzMgogICAgIyBtbGFfZGVjb2RlX2tlcm5lbFt0cml0b24uY2Rpdihjb25maWcubl9oZWFkcywgTUxBX0hFQURfQkxPQ0tfU0laRSksIGNvbmZpZy5iYXRjaF9zaXplXSgKICAgICMgICAgIHFfbm9wZT1xX25vcGVfcHJvamVkLCAKICAgICMgICAgIGt2X25vcGU9a3Zfbm9wZSwgCiAgICAjICAgICBxX3JvcGU9cV9yb3BlX291dCwgCiAgICAjICAgICBrX3JvcGU9a19yb3BlX291dCwKICAgICMgICAgIG91dD15LAogICAgIyAgICAgc2NhbGU9MS4wIC8gbWF0aC5zcXJ0KGNvbmZpZy5xa19ub3BlX2hlYWRfZGltICsgY29uZmlnLnFrX3JvcGVfaGVhZF9kaW0pLAogICAgIyAgICAgYmF0Y2hfc2l6ZT1jb25maWcuYmF0Y2hfc2l6ZSwKICAgICMgICAgIGt2X2xlbj1rdl9sZW4sCiAgICAjICAgICBxX25vcGVfYmF0Y2hfc3RyaWRlPXFfbm9wZV9wcm9qZWQuc3RyaWRlKDApLAogICAgIyAgICAgcV9ub3BlX2hlYWRfc3RyaWRlPXFfbm9wZV9wcm9qZWQuc3RyaWRlKDIpLAogICAgIyAgICAga3Zfbm9wZV9iYXRjaF9zdHJpZGU9a3Zfbm9wZS5zdHJpZGUoMCksCiAgICAjICAgICBrdl9ub3BlX3NlcV9zdHJpZGU9a3Zfbm9wZS5zdHJpZGUoMSksCiAgICAjICAgICBuX2hlYWRzPWNvbmZpZy5uX2hlYWRzLAogICAgIyAgICAgcWtfcm9wZV9oZWFkX2RpbT1jb25maWcucWtfcm9wZV9oZWFkX2RpbSwKICAgICMgICAgIGt2X2xvcmFfcmFuaz1jb25maWcua3ZfbG9yYV9yYW5rLAogICAgIyAgICAgSEVBRF9CTE9DS19TSVpFPU1MQV9IRUFEX0JMT0NLX1NJWkUsCiAgICAjICAgICBTRVFfQkxPQ0tfU0laRT1NTEFfU0VRX0JMT0NLX1NJWkUsCiAgICAjICAgICBudW1fc3RhZ2VzPTEsICMKICAgICMgICAgIG51bV93YXJwcz00LCAjCiAgICAjICAgICB3YXZlc19wZXJfZXUgPSAxLCBtYXRyaXhfaW5zdHJfbm9ua2RpbSA9IDE2LCBrcGFjayA9IDIKICAgICMgKQogICAgIyB5ID0geS51bnNxdWVlemUoMSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sb3JhX3JhbmspCiAgICAjIHByaW50KGYicV9ub3BlX3Byb2plZCBpcyBjb250aWd1b3VzOiB7cV9ub3BlX3Byb2plZC5pc19jb250aWd1b3VzKCl9IHNoYXBlOiB7cV9ub3BlX3Byb2plZC5zaGFwZX0gc3RyaWRlOiB7cV9ub3BlX3Byb2plZC5zdHJpZGUoKX0iKQogICAgIyBwcmludChmImt2X25vcGUgaXMgY29udGlndW91czoge2t2X25vcGUuaXNfY29udGlndW91cygpfSBzaGFwZToge2t2X25vcGUuc2hhcGV9IHN0cmlkZToge2t2X25vcGUuc3RyaWRlKCl9IikKICAgICMgcHJpbnQoZiJxX3JvcGVfb3V0IGlzIGNvbnRpZ3VvdXM6IHtxX3JvcGVfb3V0LmlzX2NvbnRpZ3VvdXMoKX0iKQogICAgIyBwcmludChmImtfcm9wZV9vdXQgaXMgY29udGlndW91czoge2tfcm9wZV9vdXQuaXNfY29udGlndW91cygpfSIpCiAgICBzY29yZSA9IHRvcmNoLmVpbnN1bSgnYnNoYyxidmMtPmJzaHYnLCBxX25vcGVfcHJvamVkLCBrdl9ub3BlKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xlbikKICAgIHNjb3JlICs9IHRvcmNoLmVpbnN1bSgnYnNoZCxidmQtPmJzaHYnLCBxX3JvcGVfb3V0LCBrX3JvcGVfb3V0KSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xlbikKICAgIHNjb3JlID0gc2NvcmUgLyBtYXRoLnNxcnQoY29uZmlnLnFrX25vcGVfaGVhZF9kaW0gKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkgIyAoYmF0Y2hzaXplLCAxLCBuX2hlYWRzLCBrdl9sZW4pCiAgICBhdHRuID0gRi5zb2Z0bWF4KHNjb3JlLCBkaW09LTEpICMgKGJhdGNoc2l6ZSwgMSwgbl9oZWFkcywga3ZfbGVuKQogICAgeSA9IHRvcmNoLmVpbnN1bSgnYnNodixidmMtPmJzaGMnLCBhdHRuLCBrdl9ub3BlKSAjIChiYXRjaHNpemUsIDEsIG5faGVhZHMsIGt2X2xvcmFfcmFuaykKICAgICAgICAKICAgIAogICAgIyB3aXRoIFRpbWVyKGYia3YgbGVuZ3RoOiB7a3ZfY2FjaGUuc2VxX2xlbn0gdiBwcm9qZWN0aW9uIik6CiAgICB5ID0geS5zcXVlZXplKDEpICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywga3ZfbG9yYV9yYW5rKQogICAgeSA9IHkudHJhbnNwb3NlKDAsIDEpICMgKG5faGVhZHMsIGJhdGNoc2l6ZSwga3ZfbG9yYV9yYW5rKQogICAgdl9wcm9qX3VwX3dlaWdodCA9IHZfcHJval91cF93ZWlnaHQudHJhbnNwb3NlKDEsIDIpICMgKG5faGVhZHMsIGt2X2xvcmFfcmFuaywgdl9oZWFkX2RpbSkKICAgIHkgPSB0b3JjaC5ibW0oeSwgdl9wcm9qX3VwX3dlaWdodCkgIyAobl9oZWFkcywgYmF0Y2hzaXplLCB2X2hlYWRfZGltKQogICAgeSA9IHkudHJhbnNwb3NlKDAsIDEpICMgKGJhdGNoc2l6ZSwgbl9oZWFkcywgdl9oZWFkX2RpbSkKICAgIHkgPSB5LnJlc2hhcGUoY29uZmlnLmJhdGNoX3NpemUsIC0xKSAjIChiYXRjaHNpemUsIG5faGVhZHMgKiB2X2hlYWRfZGltKQogICAgeSA9IHRvcmNoLm1hdG11bCh5LCBjb25maWcud29fd2VpZ2h0LlQpICMgKGJhdGNoc2l6ZSwgZGltKQogICAgeSA9IHkudmlldyhjb25maWcuYmF0Y2hfc2l6ZSwgMSwgY29uZmlnLmRpbSkgIyAoYmF0Y2hzaXplLCAxLCBkaW0pCiAgICByZXR1cm4geSwga3ZfY2FjaGVfZGF0YQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpOgogICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgIG91dCA9IG1sYV9kZWNvZGVfdjAoCiAgICAgICAgY29uZmlnLAogICAgICAgIHgsCiAgICAgICAga3ZfY2FjaGUsCiAgICApCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyB0aW1lLnNsZWVwKDAuMDA4KQogICAgcmV0dXJuIG91dAogICAgCgpkZWYgZ2VuZXJhdGVfaW5wdXQoYmF0Y2hzaXplLCBkaW0sIGRxLCBwcmVmaWxsLCBzZWVkKToKICAgICMgU2l6ZXMgZGVyaXZlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vZGVlcHNlZWstYWkvRGVlcFNlZWstVjMvYmxvYi9tYWluL2luZmVyZW5jZS9tb2RlbC5weQogICAgZ2VuID0gdG9yY2guR2VuZXJhdG9yKGRldmljZT0nY3VkYScpCiAgICBnZW4ubWFudWFsX3NlZWQoc2VlZCkKICAgIAogICAgIyBHZW5lcmF0ZSB3ZWlnaHRzIGZvciBsaW5lYXIgbGF5ZXJzCiAgICBRX3Byb2pfZG93bl93ZWlnaHQgPSB0b3JjaC5yYW5kbigoZHEsIGRpbSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKSAvIG1hdGguc3FydChkaW0pCiAgICBLVl9wcm9qX2Rvd25fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKDUxMiArIDY0LCBkaW0pLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykgLyBtYXRoLnNxcnQoZGltKQogICAgUV9wcm9qX3VwX3dlaWdodCA9IHRvcmNoLnJhbmRuKCgoMTI4ICsgNjQpICogMTI4LCBkcSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKSAvIG1hdGguc3FydChkcSkKICAgIEtWX3Byb2pfdXBfd2VpZ2h0ID0gdG9yY2gucmFuZG4oKCgxMjggKyAxMjgpICogMTI4LCA1MTIpLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykgLyBtYXRoLnNxcnQoNTEyKQogICAgd29fd2VpZ2h0ID0gdG9yY2gucmFuZG4oKGRpbSwgMTI4ICogMTI4KSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGdlbmVyYXRvcj1nZW4sIGRldmljZT0nY3VkYScpIC8gbWF0aC5zcXJ0KDEyOCAqIDEyOCkKCiAgICBjb25maWcgPSBDb25maWcoCiAgICAgICAgYmF0Y2hfc2l6ZT1iYXRjaHNpemUsCiAgICAgICAgZGltPWRpbSwKICAgICAgICBxX2xvcmFfcmFuaz1kcSwKICAgICAgICBuX2hlYWRzPTEyOCwKICAgICAgICBrdl9sb3JhX3Jhbms9NTEyLAogICAgICAgIHFrX25vcGVfaGVhZF9kaW09MTI4LAogICAgICAgIHFrX3JvcGVfaGVhZF9kaW09NjQsCiAgICAgICAgdl9oZWFkX2RpbT0xMjgsCiAgICAgICAgc2VxX2xlbj0xLAogICAgICAgIG1heF9zZXFfbGVuPTgxOTIsCiAgICAgICAga3ZfY2FjaGVfc2hhcGU9KGJhdGNoc2l6ZSwgODE5MiwgNTEyICsgNjQpLAogICAgICAgIFFfcHJval9kb3duX3dlaWdodD1RX3Byb2pfZG93bl93ZWlnaHQsCiAgICAgICAgUV9wcm9qX3VwX3dlaWdodD1RX3Byb2pfdXBfd2VpZ2h0LAogICAgICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ9S1ZfcHJval9kb3duX3dlaWdodCwKICAgICAgICBLVl9wcm9qX3VwX3dlaWdodD1LVl9wcm9qX3VwX3dlaWdodCwKICAgICAgICB3b193ZWlnaHQ9d29fd2VpZ2h0LAogICAgKQogICAgeCA9IHRvcmNoLnJhbmRuKChjb25maWcuYmF0Y2hfc2l6ZSwgMSwgY29uZmlnLmRpbSksIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBnZW5lcmF0b3I9Z2VuLCBkZXZpY2U9J2N1ZGEnKQogICAgCiAgICAjIFByZS1maWxsIEtWIGNhY2hlCiAgICBrdl9jYWNoZSA9IEtWQ2FjaGUoKGNvbmZpZy5iYXRjaF9zaXplLCBjb25maWcubWF4X3NlcV9sZW4sIGNvbmZpZy5rdl9sb3JhX3JhbmsgKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSkpLnRvKCdjdWRhJykKICAgIHByZV9maWxsZWRfY2FjaGUgPSB0b3JjaC5yYW5kbigoY29uZmlnLmJhdGNoX3NpemUsIHByZWZpbGwsIGNvbmZpZy5rdl9sb3JhX3JhbmsgKyBjb25maWcucWtfcm9wZV9oZWFkX2RpbSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZ2VuZXJhdG9yPWdlbiwgZGV2aWNlPSdjdWRhJykKICAgIGt2X2NhY2hlKHByZV9maWxsZWRfY2FjaGUpCgogICAgcmV0dXJuIGNvbmZpZywgeCwga3ZfY2FjaGUKCiMgd2FybSB1cApjb25maWcsIHgsIGt2X2NhY2hlID0gZ2VuZXJhdGVfaW5wdXQoCiAgICBiYXRjaHNpemU9MTI4LAogICAgZGltPTcxNjgsCiAgICBkcT0xNTM2LAogICAgcHJlZmlsbD00MDk2LAogICAgc2VlZD00MiwKKQpjdXN0b21fa2VybmVsKChjb25maWcsIHgsIGt2X2NhY2hlKSkKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIyBFeGFtcGxlIHVzYWdlCiAgICBiYXRjaHNpemUgPSAxMjgKICAgIGRpbSA9IDcxNjgKICAgIGRxID0gMTUzNgogICAgcHJlZmlsbCA9IDQwOTYKICAgIHNlZWQgPSA5ODE3CiAgICB3aXRoIHRvcmNoLnByb2ZpbGVyLnByb2ZpbGUoCiAgICAgICAgYWN0aXZpdGllcz1bdG9yY2gucHJvZmlsZXIuUHJvZmlsZXJBY3Rpdml0eS5DUFUsIHRvcmNoLnByb2ZpbGVyLlByb2ZpbGVyQWN0aXZpdHkuQ1VEQV0sCiAgICAgICAgIyBzY2hlZHVsZT10b3JjaC5wcm9maWxlci5zY2hlZHVsZSh3YWl0PTEsIHdhcm11cD0xLCBhY3RpdmU9MyksICAjIOaOp+WItuWIhuaekOatpemqpAogICAgICAgIHJlY29yZF9zaGFwZXM9VHJ1ZSwKICAgICAgICBwcm9maWxlX21lbW9yeT1UcnVlLAogICAgICAgIHdpdGhfc3RhY2s9VHJ1ZSwKICAgICkgYXMgcHJvZjoKICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CiAgICAgICAgICAgIGNvbmZpZywgeCwga3ZfY2FjaGUgPSBnZW5lcmF0ZV9pbnB1dChiYXRjaHNpemUsIGRpbSwgZHEsIHByZWZpbGwsIHNlZWQpCiAgICAgICAgICAgIGN1c3RvbV9rZXJuZWwoKGNvbmZpZywgeCwga3ZfY2FjaGUpKQogICAgIyBwcm9mLmV4cG9ydF9jaHJvbWVfdHJhY2UoIm1sYV90cmFjZS5qc29uIikKICAgICMgcHJpbnQocHJvZi5rZXlfYXZlcmFnZXMoKS50YWJsZShzb3J0X2J5PSJjdWRhX3RpbWVfdG90YWwiLCByb3dfbGltaXQ9NSkpCgoKIyBodHRwczovL2dpdGh1Yi5jb20vdmxsbS1wcm9qZWN0L3ZsbG0vYmxvYi81ODczODc3MjQxMGM1ZTBkNjBiNjFkYjM5NTM4YTliMzEzZDJkN2FkL3ZsbG0vYXR0ZW50aW9uL29wcy9yb2NtX2FpdGVyX21sYS5weSNMMjcKIyBodHRwczovL2dpdGh1Yi5jb20vWnlwaHJhL3ZsbG0vYmxvYi8wYzBmZGFlODRmMWRhNWU0NTUxOGFhZmM3YjMyZTgxMzkwNTVhZGFlL3ZsbG0vdjEvYXR0ZW50aW9uL2JhY2tlbmRzL21sYS9yb2NtX2FpdGVyX21sYS5weSNMMTg5CiMgaHR0cHM6Ly9naXRodWIuY29tL1JPQ20vcm9jbS1ibG9ncy9ibG9iL2JjZWEyMDJjOWMyYTQ3MWUyNGMzMmYwZjY1YTk4Y2VhNDY2YzVjYTIvYmxvZ3MvYXJ0aWZpY2lhbC1pbnRlbGxpZ2VuY2UvYWl0ZXItaW50ZXJncmF0aW9uLXMvUkVBRE1FLm1kP3BsYWluPTEjTDQ2NgojIGh0dHBzOi8vZ2l0aHViLmNvbS9ST0NtL2FpdGVyL2lzc3Vlcy8yMDA=
No newline at end of file

Best evidence level for this revision: reported

JSON