amd-mixture-of-experts · submission 30063
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.
moe_v4_clean.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-30063?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp16
Benchmark evidence
2 measurements across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:a815afa22cebbe2d11d8a9a4514619628aafc45726702f9a7bfb759e051b9580
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
moe_v4_clean.py1 lines
aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICAjIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgIyBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoQkxPQ0tfTSwgQkxPQ0tfSykKICAgICAgICBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFjY3VtICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgMSksICkKICAgIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBhY2N1bS50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKCkB0cml0b24uaml0CmRlZiBzd2lnbHUoeCwgeSk6CiAgICBsb2dfMl9lOiB0bC5jb25zdGV4cHIgPSAxLjQ0MjY5NTA0MQogICAgZXhwX3ggPSB0bC5leHAyKCAtbG9nXzJfZSAqIHgpCiAgICByZXR1cm4gMS4gLyAoMS4gKyBleHBfeCkgKiB4ICogeQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHUoCiAgICBhLCAKICAgIGJfYmFzZV9wdHJzMCwgYl9iYXNlX3B0cnMxLCAKICAgIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnMwOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGJfYmFzZV9wdHJzMTogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoIHRyaXRvbi5jZGl2KG4sIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIGdyb3VwX3NpemUgKQogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX04KICAgIG1faWQgPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyMCA9IHRsLmxvYWQoYl9iYXNlX3B0cnMwICsgZ3JvdXBfaWQpCiAgICBncm91cF9iX2Jhc2VfcHRyMSA9IHRsLmxvYWQoYl9iYXNlX3B0cnMxICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIwID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMC50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtMCA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGFjY3VtMSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgICMgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2sxID0gdGwubG9hZChiX2Jsb2NrX3B0cjEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCApCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKICAgIApAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHVfc2h1ZmZsZSgKICAgIGEsIAogICAgYl9iYXNlX3B0cnMwLCBiX2Jhc2VfcHRyczEsIAogICAgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX2Jhc2VfcHRyczA6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYl9iYXNlX3B0cnMxOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICg4LCB0cml0b24uY2RpdihuLCBCTE9DS19OKSwgY2RpdihtYXhfbSwgQkxPQ0tfTSkgKiBjZGl2KGdyb3VwX3NpemUsIDgpKQogICAgWENEX0NOVCA9IDgKICAgIG1fYmxvY2tfY250ID0gdGwuY2RpdihtYXhfbSwgQkxPQ0tfTSkKICAgIAogICAgCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMCkgKyB0bC5wcm9ncmFtX2lkKDIpIC8vIG1fYmxvY2tfY250ICogWENEX0NOVAogICAgbl9zdGFydCA9IHRsLnByb2dyYW1faWQoMSkgKiBCTE9DS19OCiAgICBtX2lkID0gdGwucHJvZ3JhbV9pZCgyKSAlIG1fYmxvY2tfY250CiAgICAKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIwID0gdGwubG9hZChiX2Jhc2VfcHRyczAgKyBncm91cF9pZCkKICAgIGdyb3VwX2JfYmFzZV9wdHIxID0gdGwubG9hZChiX2Jhc2VfcHRyczEgKyBncm91cF9pZCkKICAgIGlmIGdyb3VwX21fc3RhcnQgKyBtX2lkICogQkxPQ0tfTSA+PSBncm91cF9tX2VuZDoKICAgICAgICByZXR1cm4KICAgIAogICAgYV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBhICsgZ3JvdXBfbV9zdGFydCAqIGssCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19LKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjAgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIwLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjEgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIxLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0wID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgYWNjdW0xID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgaywgQkxPQ0tfSyk6CiAgICAgICAgIyBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazAgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMCwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKQogICAgICAgIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsICkKICAgICAgICBiX2Jsb2NrMSA9IHRsLmxvYWQoYl9ibG9ja19wdHIxLCApCiAgICAgICAgYWNjdW0wICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMCkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhY2N1bTEgKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2sxKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIwID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0cjAsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgICAgIGJfYmxvY2tfcHRyMSA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIxLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgIG91dCA9IHN3aWdsdShhY2N1bTAsIGFjY3VtMSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgb3V0LnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgKSwgKQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX1NJWkUiOiAxMDI0ICogOCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKSAgICAgICAgICAgCkB0cml0b24uaml0CmRlZiB3ZWlnaHRlZF9zdW1fZ2F0aGVyKAogICAgZmZuMV9vdXQsCiAgICB0b2tlbjJpbmRleCwKICAgIHRvcGtfc2NvcmVzLAogICAgc2hhcmVkX2V4cGVydF9mZm4xLAogICAgbW9lX291dCwKICAgIGRfaGlkZGVuLAogICAgYmF0Y2hfc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyBmZm4xX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyB0b2tlbjJpbmRleDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyB0b3BrX3Njb3JlczogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBzaGFyZWRfZXhwZXJ0X2ZmbjE6IChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyBtb2Vfb3V0OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgZ3JpZDogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBCTE9DS19TSVpFKSwgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4pCiAgICAKICAgIHNlZ21lbnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgdG9rZW5faWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgCiAgICBvZmZzZXRzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgc2VnbWVudF9pZHggKiBCTE9DS19TSVpFCiAgICBtYXNrID0gb2Zmc2V0cyA8IGRfaGlkZGVuCiAgICAKICAgIGRhdGEgPSB0bC5sb2FkKAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgICBmb3IgaSBpbiByYW5nZShuX2V4cGVydHNfcGVyX3Rva2VuKToKICAgICAgICB3ZWlnaHQgPSB0bC5sb2FkKHRvcGtfc2NvcmVzICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgaW5kZXggPSB0bC5sb2FkKHRva2VuMmluZGV4ICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgZmZuMV9vdXRfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBmZm4xX291dCArIGluZGV4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQogICAgICAgIGRhdGEgKz0gd2VpZ2h0ICogZmZuMV9vdXRfYmxvY2sKICAgIHRsLnN0b3JlKAogICAgICAgIG1vZV9vdXQgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgZGF0YSwKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgIAojIGNvbmZpZzogeydkX2hpZGRlbic6IDcxNjgsICdkX2V4cGVydCc6IDIwNDgsICduX3JvdXRlZF9leHBlcnRzJzogMzIsICduX3NoYXJlZF9leHBlcnRzJzogMSwgJ25fZXhwZXJ0c19wZXJfdG9rZW4nOiA0LCAnYmF0Y2hfc2l6ZSc6IDEsICdzZXFfbGVuJzogMjA0OH0KIyBpbnB1dF90ZW5zb3IgbGF5b3V0OiAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuICogc2VxX2xlbiwgZF9oaWRkZW4sIDEpCiMgcm91dGVyLndlaWdodCBsYXlvdXQ6IChuX3JvdXRlZF9leHBlcnRzLCAgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIGV4cGVydHMue2l9LjAud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMS53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0KSA6IChkX2V4cGVydCwgMSkKIyBleHBlcnRzLntpfS4yLndlaWdodCBsYXlvdXQ6IChkX2V4cGVydCwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpIDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCgpjbGFzcyBUaW1lcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYWJlbDogc3RyKToKICAgICAgICBzZWxmLmxhYmVsID0gbGFiZWwKICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5lbmRfdGltZSA9IE5vbmUKICAgICAgICBzZWxmLmludGVydmFsID0gTm9uZQogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAjIHNlbGYuc3RhcnQgPSB0aW1lLnRpbWUoKQogICAgICAgIHJldHVybiBzZWxmCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAgICAgIyBzZWxmLmVuZCA9IHRpbWUudGltZSgpCiAgICAgICAgIyBzZWxmLmludGVydmFsID0gKHNlbGYuZW5kIC0gc2VsZi5zdGFydCkgKiAxMDAwICMgaW4gbXMKICAgICAgICAjIHByaW50KGYie3NlbGYubGFiZWx9OiB7c2VsZi5pbnRlcnZhbDouNGZ9IG1zIikKICAgICAgICByZXR1cm4gRmFsc2UKZGVmIG1vZV9mb3J3YXJkKAogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IsCiAgICB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwKICAgIGRfaGlkZGVuOiBpbnQsCiAgICBkX2V4cGVydDogaW50LAogICAgbl9yb3V0ZWRfZXhwZXJ0czogaW50LAogICAgbl9zaGFyZWRfZXhwZXJ0czogaW50LAogICAgbl9leHBlcnRzX3Blcl90b2tlbjogaW50LAogICAgYmF0Y2hfc2l6ZTogaW50LAogICAgc2VxX2xlbjogaW50CikgLT4gdG9yY2guVGVuc29yOgogICAgaW5wdXRfdGVuc29yID0gaW5wdXRfdGVuc29yLnJlc2hhcGUoLTEsIGRfaGlkZGVuKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCiAgICAKICAgICMgVE9ETzogdXNlIGN1ZGEgZ3JhcGg/CiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgYWxsb2NhdGUgdGVuc29yIHRpbWVyIikgYXMgdDoKICAgICMgQWxsb2NhdGUgdGVuc29yIAogICAgIyBUT0RPOiBwcmVhbGxvY2F0ZSB0ZW5zb3IKICAgIGV4cGVydDJ0b2tlbl9jb3VudCA9IHRvcmNoLmVtcHR5KHNpemU9KG5fcm91dGVkX2V4cGVydHMsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgd2l0aGluX2V4cGVydF9pbmRleCA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gPSB0b3JjaC56ZXJvcyhzaXplPShuX3JvdXRlZF9leHBlcnRzICsgMSwpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAKICAgIHJlcGVhdGVkX3Rva2VucyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKICAgICMgZmZuMF9saHMgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgICMgZmZuMF9yaHMgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIGZmbjBfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBmZm4xX291dCA9IHRvcmNoLmVtcHR5X2xpa2UocmVwZWF0ZWRfdG9rZW5zKQogICAgbW9lX291dCA9IHRvcmNoLmVtcHR5X2xpa2UoaW5wdXRfdGVuc29yKQogICAgIyBUT0RPOiBtdWx0aSBzdHJlYW0KICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSBwdHIgYXJyYXkiKSBhcyB0OgogICAgYl9wdHJzID0gdG9yY2gudGVuc29yKAogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0gKwogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0gKwogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgZGV2aWNlPXJlcGVhdGVkX3Rva2Vucy5kZXZpY2UsCiAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgKQogICAgYl9wdHJzMCA9IGJfcHRyc1s6bl9yb3V0ZWRfZXhwZXJ0c10KICAgIGJfcHRyczEgPSBiX3B0cnNbbl9yb3V0ZWRfZXhwZXJ0czoyKm5fcm91dGVkX2V4cGVydHNdCiAgICBiX3B0cnMyID0gYl9wdHJzWzIqbl9yb3V0ZWRfZXhwZXJ0czpdCgogICAgCiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2hhcmVkIGV4cGVydCB0aW1lciIpIGFzIHQ6CiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDEgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddICMgKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgICMgVE9ETzogaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgICMgVE9ETzogc2hhcmVkIGV4cGVydCBpbiBhIHNlcGFyYXRlIHN0cmVhbT8KICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgIHNoYXJlZF9leHBlcnRfZmZuMSA9IHNoYXJlZF9leHBlcnRfZmZuMCBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCiAgICAKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICByb3V0ZXIgdGltZXIiKSBhcyB0OgogICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICMgVE9ETzogZnVzZWQgbWF0bXVsICsgc29mdG1heCArIHRvcCBrID8gb3IgaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgIGxvZ2l0cyA9IHRvcmNoLm1hdG11bChpbnB1dF90ZW5zb3IsIHJvdXRlcl93ZWlnaHQudCgpKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9yb3V0ZWRfZXhwZXJ0cykKICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgIHNjb3JlcyA9IEYuc29mdG1heChsb2dpdHMsIGRpbT0tMSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fcm91dGVkX2V4cGVydHMpCiAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRpbT0tMSwgc29ydGVkPUZhbHNlKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgICAgCgogICAgIyB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGNhbGN1bGF0ZSBpbmRleCB0aW1lciIpIGFzIHQ6CiAgICAjIGV4cGVydDJ0b2tlbl9jb3VudCAobl9yb3V0ZWRfZXhwZXJ0cywpCiAgICAjIHdpdGhpbl9leHBlcnRfaW5kZXggKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleFsgKG5fcm91dGVkX2V4cGVydHMsICkgXSgKICAgICAgICB0b3BrX2luZGljZXMsCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQogICAgIyB0b2tlbjJpbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbIGxhbWJkYSBtZXRhIDogKHRyaXRvbi5jZGl2KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwpIF0oCiAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQoKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBzY2F0dGVyIHRpbWVyIikgYXMgdDoKICAgIHNjYXR0ZXJbIChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKSBdKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICBzZXFfbGVuLAogICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgZF9oaWRkZW4sCiAgICApCiAgICAKICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4KICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4wIHRpbWVyIikgYXMgdDogICAgCiAgICBncm91cF9nZW1tX1N3aUdsdVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2V4cGVydCwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgYSA9IHJlcGVhdGVkX3Rva2VucywKICAgICAgICBiX2Jhc2VfcHRyczAgPSBiX3B0cnMwLAogICAgICAgIGJfYmFzZV9wdHJzMSA9IGJfcHRyczEsCiAgICAgICAgYyA9IGZmbjBfb3V0LAogICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICBtYXhfbSA9IG1heF9tLAogICAgICAgIG4gPSBkX2V4cGVydCwKICAgICAgICBrID0gZF9oaWRkZW4sCiAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgIyBCTE9DS19NPUJMT0NLX00sCiAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICApCiAgICAKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4xIHRpbWVyIikgYXMgdDoKICAgIGdyb3VwX2dlbW1bIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgIGEgPSBmZm4wX291dCwKICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczIsCiAgICAgICAgYyA9IGZmbjFfb3V0LAogICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuID0gZF9oaWRkZW4sCiAgICAgICAgayA9IGRfZXhwZXJ0LAogICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICMgQkxPQ0tfTj1CTE9DS19OLAogICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgKQogICAgCiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgd2VpZ2h0ZWQgc3VtIGdhdGhlciB0aW1lciIpIGFzIHQ6CiAgICB3ZWlnaHRlZF9zdW1fZ2F0aGVyWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19TSVpFIl0pLCBiYXRjaF9zaXplICogc2VxX2xlbildKAogICAgICAgIGZmbjFfb3V0LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIHRvcGtfc2NvcmVzLAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgICAgICBtb2Vfb3V0LAogICAgICAgIGRfaGlkZGVuLAogICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgc2VxX2xlbiwKICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICMgQkxPQ0tfU0laRT1CTE9DS19TSVpFLAogICAgKQogICAgIyBzbGVlcCA4IG1zIAogICAgIyBiZW5jaG1hcmsgc3Vja3MgIQogICAgIyB0aW1lLnNsZWVwKDAuMDA4KQogICAgcmV0dXJuIG1vZV9vdXQucmVzaGFwZShiYXRjaF9zaXplLCBzZXFfbGVuLCBkX2hpZGRlbikgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pCgoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIG91dHB1dCA9IG1vZV9mb3J3YXJkKGlucHV0X3RlbnNvciwgd2VpZ2h0cywgKipjb25maWcpCiAgICByZXR1cm4gb3V0cHV0Cg==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 amd-mixture-of-experts · submission 29858.
- aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICAjIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgIyBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoQkxPQ0tfTSwgQkxPQ0tfSykKICAgICAgICBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFjY3VtICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgMSksICkKICAgIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBhY2N1bS50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKCkB0cml0b24uaml0CmRlZiBzd2lnbHUoeCwgeSk6CiAgICBsb2dfMl9lOiB0bC5jb25zdGV4cHIgPSAxLjQ0MjY5NTA0MQogICAgZXhwX3ggPSB0bC5leHAyKCAtbG9nXzJfZSAqIHgpCiAgICByZXR1cm4gMS4gLyAoMS4gKyBleHBfeCkgKiB4ICogeQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHUoCiAgICBhLCAKICAgIGJfYmFzZV9wdHJzMCwgYl9iYXNlX3B0cnMxLCAKICAgIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnMwOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGJfYmFzZV9wdHJzMTogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoIHRyaXRvbi5jZGl2KG4sIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIGdyb3VwX3NpemUgKQogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX04KICAgIG1faWQgPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyMCA9IHRsLmxvYWQoYl9iYXNlX3B0cnMwICsgZ3JvdXBfaWQpCiAgICBncm91cF9iX2Jhc2VfcHRyMSA9IHRsLmxvYWQoYl9iYXNlX3B0cnMxICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIwID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMC50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtMCA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGFjY3VtMSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgICMgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2sxID0gdGwubG9hZChiX2Jsb2NrX3B0cjEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCApCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKICAgIApAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHVfc2h1ZmZsZSgKICAgIGEsIAogICAgYl9iYXNlX3B0cnMwLCBiX2Jhc2VfcHRyczEsIAogICAgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX2Jhc2VfcHRyczA6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYl9iYXNlX3B0cnMxOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICg4LCB0cml0b24uY2RpdihuLCBCTE9DS19OKSwgY2RpdihtYXhfbSwgQkxPQ0tfTSkgKiBjZGl2KGdyb3VwX3NpemUsIDgpKQogICAgWENEX0NOVCA9IDgKICAgIG1fYmxvY2tfY250ID0gdGwuY2RpdihtYXhfbSwgQkxPQ0tfTSkKICAgIAogICAgCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMCkgKyB0bC5wcm9ncmFtX2lkKDIpIC8vIG1fYmxvY2tfY250ICogWENEX0NOVAogICAgbl9zdGFydCA9IHRsLnByb2dyYW1faWQoMSkgKiBCTE9DS19OCiAgICBtX2lkID0gdGwucHJvZ3JhbV9pZCgyKSAlIG1fYmxvY2tfY250CiAgICAKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIwID0gdGwubG9hZChiX2Jhc2VfcHRyczAgKyBncm91cF9pZCkKICAgIGdyb3VwX2JfYmFzZV9wdHIxID0gdGwubG9hZChiX2Jhc2VfcHRyczEgKyBncm91cF9pZCkKICAgIGlmIGdyb3VwX21fc3RhcnQgKyBtX2lkICogQkxPQ0tfTSA+PSBncm91cF9tX2VuZDoKICAgICAgICByZXR1cm4KICAgIAogICAgYV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBhICsgZ3JvdXBfbV9zdGFydCAqIGssCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19LKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjAgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIwLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjEgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIxLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0wID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgYWNjdW0xID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgaywgQkxPQ0tfSyk6CiAgICAgICAgIyBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazAgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMCwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKQogICAgICAgIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsICkKICAgICAgICBiX2Jsb2NrMSA9IHRsLmxvYWQoYl9ibG9ja19wdHIxLCApCiAgICAgICAgYWNjdW0wICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMCkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhY2N1bTEgKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2sxKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIwID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0cjAsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgICAgIGJfYmxvY2tfcHRyMSA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIxLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgIG91dCA9IHN3aWdsdShhY2N1bTAsIGFjY3VtMSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgb3V0LnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgKSwgKQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX1NJWkUiOiAxMDI0ICogOCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKSAgICAgICAgICAgCkB0cml0b24uaml0CmRlZiB3ZWlnaHRlZF9zdW1fZ2F0aGVyKAogICAgZmZuMV9vdXQsCiAgICB0b2tlbjJpbmRleCwKICAgIHRvcGtfc2NvcmVzLAogICAgc2hhcmVkX2V4cGVydF9mZm4xLAogICAgbW9lX291dCwKICAgIGRfaGlkZGVuLAogICAgYmF0Y2hfc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyBmZm4xX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyB0b2tlbjJpbmRleDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyB0b3BrX3Njb3JlczogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBzaGFyZWRfZXhwZXJ0X2ZmbjE6IChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyBtb2Vfb3V0OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgZ3JpZDogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBCTE9DS19TSVpFKSwgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4pCiAgICAKICAgIHNlZ21lbnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgdG9rZW5faWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgCiAgICBvZmZzZXRzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgc2VnbWVudF9pZHggKiBCTE9DS19TSVpFCiAgICBtYXNrID0gb2Zmc2V0cyA8IGRfaGlkZGVuCiAgICAKICAgIGRhdGEgPSB0bC5sb2FkKAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgICBmb3IgaSBpbiByYW5nZShuX2V4cGVydHNfcGVyX3Rva2VuKToKICAgICAgICB3ZWlnaHQgPSB0bC5sb2FkKHRvcGtfc2NvcmVzICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgaW5kZXggPSB0bC5sb2FkKHRva2VuMmluZGV4ICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgZmZuMV9vdXRfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBmZm4xX291dCArIGluZGV4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQogICAgICAgIGRhdGEgKz0gd2VpZ2h0ICogZmZuMV9vdXRfYmxvY2sKICAgIHRsLnN0b3JlKAogICAgICAgIG1vZV9vdXQgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgZGF0YSwKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgIAojIGNvbmZpZzogeydkX2hpZGRlbic6IDcxNjgsICdkX2V4cGVydCc6IDIwNDgsICduX3JvdXRlZF9leHBlcnRzJzogMzIsICduX3NoYXJlZF9leHBlcnRzJzogMSwgJ25fZXhwZXJ0c19wZXJfdG9rZW4nOiA0LCAnYmF0Y2hfc2l6ZSc6IDEsICdzZXFfbGVuJzogMjA0OH0KIyBpbnB1dF90ZW5zb3IgbGF5b3V0OiAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuICogc2VxX2xlbiwgZF9oaWRkZW4sIDEpCiMgcm91dGVyLndlaWdodCBsYXlvdXQ6IChuX3JvdXRlZF9leHBlcnRzLCAgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIGV4cGVydHMue2l9LjAud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMS53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0KSA6IChkX2V4cGVydCwgMSkKIyBleHBlcnRzLntpfS4yLndlaWdodCBsYXlvdXQ6IChkX2V4cGVydCwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpIDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCgpjbGFzcyBUaW1lcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYWJlbDogc3RyKToKICAgICAgICBzZWxmLmxhYmVsID0gbGFiZWwKICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5lbmRfdGltZSA9IE5vbmUKICAgICAgICBzZWxmLmludGVydmFsID0gTm9uZQogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAjIHNlbGYuc3RhcnQgPSB0aW1lLnRpbWUoKQogICAgICAgIHJldHVybiBzZWxmCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAgICAgIyBzZWxmLmVuZCA9IHRpbWUudGltZSgpCiAgICAgICAgIyBzZWxmLmludGVydmFsID0gKHNlbGYuZW5kIC0gc2VsZi5zdGFydCkgKiAxMDAwICMgaW4gbXMKICAgICAgICAjIHByaW50KGYie3NlbGYubGFiZWx9OiB7c2VsZi5pbnRlcnZhbDouNGZ9IG1zIikKICAgICAgICByZXR1cm4gRmFsc2UKZGVmIG1vZV9mb3J3YXJkKAogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IsCiAgICB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwKICAgIGRfaGlkZGVuOiBpbnQsCiAgICBkX2V4cGVydDogaW50LAogICAgbl9yb3V0ZWRfZXhwZXJ0czogaW50LAogICAgbl9zaGFyZWRfZXhwZXJ0czogaW50LAogICAgbl9leHBlcnRzX3Blcl90b2tlbjogaW50LAogICAgYmF0Y2hfc2l6ZTogaW50LAogICAgc2VxX2xlbjogaW50CikgLT4gdG9yY2guVGVuc29yOgogICAgaW5wdXRfdGVuc29yID0gaW5wdXRfdGVuc29yLnJlc2hhcGUoLTEsIGRfaGlkZGVuKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCiAgICAKICAgICMgVE9ETzogdXNlIGN1ZGEgZ3JhcGg/CiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGFsbG9jYXRlIHRlbnNvciB0aW1lciIpIGFzIHQ6CiAgICAgICAgIyBBbGxvY2F0ZSB0ZW5zb3IgCiAgICAgICAgIyBUT0RPOiBwcmVhbGxvY2F0ZSB0ZW5zb3IKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgPSB0b3JjaC5lbXB0eShzaXplPShuX3JvdXRlZF9leHBlcnRzLCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAgICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtID0gdG9yY2guemVyb3Moc2l6ZT0obl9yb3V0ZWRfZXhwZXJ0cyArIDEsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgICAgIAogICAgICAgIHJlcGVhdGVkX3Rva2VucyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKICAgICAgICAjIGZmbjBfbGhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgIyBmZm4wX3JocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgICAgIGZmbjBfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICAgICAgZmZuMV9vdXQgPSB0b3JjaC5lbXB0eV9saWtlKHJlcGVhdGVkX3Rva2VucykKICAgICAgICBtb2Vfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShpbnB1dF90ZW5zb3IpCiAgICAjIFRPRE86IG11bHRpIHN0cmVhbQogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSBwdHIgYXJyYXkiKSBhcyB0OgogICAgICAgIGJfcHRycyA9IHRvcmNoLnRlbnNvcigKICAgICAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSArCiAgICAgICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0gKwogICAgICAgICAgICBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10uZGF0YV9wdHIoKSAgZm9yIGkgaW4gcmFuZ2Uobl9yb3V0ZWRfZXhwZXJ0cyldLAogICAgICAgICAgICBkZXZpY2U9cmVwZWF0ZWRfdG9rZW5zLmRldmljZSwKICAgICAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgICAgICkKICAgICAgICBiX3B0cnMwID0gYl9wdHJzWzpuX3JvdXRlZF9leHBlcnRzXQogICAgICAgIGJfcHRyczEgPSBiX3B0cnNbbl9yb3V0ZWRfZXhwZXJ0czoyKm5fcm91dGVkX2V4cGVydHNdCiAgICAgICAgYl9wdHJzMiA9IGJfcHRyc1syKm5fcm91dGVkX2V4cGVydHM6XQoKICAgIAogICAgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBzaGFyZWQgZXhwZXJ0IHRpbWVyIikgYXMgdDoKICAgICAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICAgICAgc2hhcmVkX2V4cGVydF93ZWlnaHQxID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXSAjIChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKQogICAgICAgIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10gIyAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgICAgICAjIFRPRE86IGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICAgICAgIyBUT0RPOiBzaGFyZWQgZXhwZXJ0IGluIGEgc2VwYXJhdGUgc3RyZWFtPwogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgPSBzaGFyZWRfZXhwZXJ0X2ZmbjAgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHJvdXRlciB0aW1lciIpIGFzIHQ6CiAgICAgICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNvZnRtYXggKyB0b3AgayA/IG9yIGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICAgICAgbG9naXRzID0gdG9yY2gubWF0bXVsKGlucHV0X3RlbnNvciwgcm91dGVyX3dlaWdodC50KCkpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgICAgICBzY29yZXMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgbl9leHBlcnRzX3Blcl90b2tlbiwgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSAgICAKCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGNhbGN1bGF0ZSBpbmRleCB0aW1lciIpIGFzIHQ6CiAgICAgICAgIyBleHBlcnQydG9rZW5fY291bnQgKG5fcm91dGVkX2V4cGVydHMsKQogICAgICAgICMgd2l0aGluX2V4cGVydF9pbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICAgICAgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleFsgKG5fcm91dGVkX2V4cGVydHMsICkgXSgKICAgICAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgICAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICAgICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICAgICAgICAgIGJhdGNoX3NpemUgKiBzZXFfbGVuLAogICAgICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICkKICAgICAgICAjIHRva2VuMmluZGV4IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKICAgICAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbIGxhbWJkYSBtZXRhIDogKHRyaXRvbi5jZGl2KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwpIF0oCiAgICAgICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgKQoKICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2NhdHRlciB0aW1lciIpIGFzIHQ6CiAgICAgICAgc2NhdHRlclsgKG5fZXhwZXJ0c19wZXJfdG9rZW4sIHNlcV9sZW4sIGJhdGNoX3NpemUpIF0oCiAgICAgICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgICAgIHJlcGVhdGVkX3Rva2VucywKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgc2VxX2xlbiwKICAgICAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAgICAgZF9oaWRkZW4sCiAgICAgICAgKQogICAgCiAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGZmbjAgdGltZXIiKSBhcyB0OiAgICAKICAgICAgICBncm91cF9nZW1tX1N3aUdsdVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2V4cGVydCwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgICAgIGEgPSByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzMCA9IGJfcHRyczAsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzMSA9IGJfcHRyczEsCiAgICAgICAgICAgIGMgPSBmZm4wX291dCwKICAgICAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgICAgICBtYXhfbSA9IG1heF9tLAogICAgICAgICAgICBuID0gZF9leHBlcnQsCiAgICAgICAgICAgIGsgPSBkX2hpZGRlbiwKICAgICAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICAgICAjIEJMT0NLX049QkxPQ0tfTiwKICAgICAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAgICAgKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGZmbjEgdGltZXIiKSBhcyB0OgogICAgICAgIGdyb3VwX2dlbW1bIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgICAgICBhID0gZmZuMF9vdXQsCiAgICAgICAgICAgIGJfYmFzZV9wdHJzID0gYl9wdHJzMiwKICAgICAgICAgICAgYyA9IGZmbjFfb3V0LAogICAgICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICAgICBuID0gZF9oaWRkZW4sCiAgICAgICAgICAgIGsgPSBkX2V4cGVydCwKICAgICAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICAgICAjIEJMT0NLX049QkxPQ0tfTiwKICAgICAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAgICAgKQogICAgCiAgICB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHdlaWdodGVkIHN1bSBnYXRoZXIgdGltZXIiKSBhcyB0OgogICAgICAgIHdlaWdodGVkX3N1bV9nYXRoZXJbIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIG1ldGFbIkJMT0NLX1NJWkUiXSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKV0oCiAgICAgICAgICAgIGZmbjFfb3V0LAogICAgICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICAgICAgdG9wa19zY29yZXMsCiAgICAgICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgICAgICAgICAgbW9lX291dCwKICAgICAgICAgICAgZF9oaWRkZW4sCiAgICAgICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgICAgIHNlcV9sZW4sCiAgICAgICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgICAgICMgQkxPQ0tfU0laRT1CTE9DS19TSVpFLAogICAgICAgICkKICAgICMgc2xlZXAgOCBtcyAKICAgICMgYmVuY2htYXJrIHN1Y2tzICEKICAgICMgdGltZS5zbGVlcCgwLjAwOCkKICAgIHJldHVybiBtb2Vfb3V0LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pICMgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBvdXRwdXQgPSBtb2VfZm9yd2FyZChpbnB1dF90ZW5zb3IsIHdlaWdodHMsICoqY29uZmlnKQogICAgcmV0dXJuIG91dHB1dAo=No newline at end of file+ aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICAjIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgIyBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoQkxPQ0tfTSwgQkxPQ0tfSykKICAgICAgICBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFjY3VtICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgMSksICkKICAgIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBhY2N1bS50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKCkB0cml0b24uaml0CmRlZiBzd2lnbHUoeCwgeSk6CiAgICBsb2dfMl9lOiB0bC5jb25zdGV4cHIgPSAxLjQ0MjY5NTA0MQogICAgZXhwX3ggPSB0bC5leHAyKCAtbG9nXzJfZSAqIHgpCiAgICByZXR1cm4gMS4gLyAoMS4gKyBleHBfeCkgKiB4ICogeQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHUoCiAgICBhLCAKICAgIGJfYmFzZV9wdHJzMCwgYl9iYXNlX3B0cnMxLCAKICAgIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnMwOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGJfYmFzZV9wdHJzMTogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoIHRyaXRvbi5jZGl2KG4sIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIGdyb3VwX3NpemUgKQogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX04KICAgIG1faWQgPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyMCA9IHRsLmxvYWQoYl9iYXNlX3B0cnMwICsgZ3JvdXBfaWQpCiAgICBncm91cF9iX2Jhc2VfcHRyMSA9IHRsLmxvYWQoYl9iYXNlX3B0cnMxICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIwID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMC50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtMCA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGFjY3VtMSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgICMgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2sxID0gdGwubG9hZChiX2Jsb2NrX3B0cjEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCApCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKICAgIApAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHVfc2h1ZmZsZSgKICAgIGEsIAogICAgYl9iYXNlX3B0cnMwLCBiX2Jhc2VfcHRyczEsIAogICAgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX2Jhc2VfcHRyczA6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYl9iYXNlX3B0cnMxOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICg4LCB0cml0b24uY2RpdihuLCBCTE9DS19OKSwgY2RpdihtYXhfbSwgQkxPQ0tfTSkgKiBjZGl2KGdyb3VwX3NpemUsIDgpKQogICAgWENEX0NOVCA9IDgKICAgIG1fYmxvY2tfY250ID0gdGwuY2RpdihtYXhfbSwgQkxPQ0tfTSkKICAgIAogICAgCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMCkgKyB0bC5wcm9ncmFtX2lkKDIpIC8vIG1fYmxvY2tfY250ICogWENEX0NOVAogICAgbl9zdGFydCA9IHRsLnByb2dyYW1faWQoMSkgKiBCTE9DS19OCiAgICBtX2lkID0gdGwucHJvZ3JhbV9pZCgyKSAlIG1fYmxvY2tfY250CiAgICAKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIwID0gdGwubG9hZChiX2Jhc2VfcHRyczAgKyBncm91cF9pZCkKICAgIGdyb3VwX2JfYmFzZV9wdHIxID0gdGwubG9hZChiX2Jhc2VfcHRyczEgKyBncm91cF9pZCkKICAgIGlmIGdyb3VwX21fc3RhcnQgKyBtX2lkICogQkxPQ0tfTSA+PSBncm91cF9tX2VuZDoKICAgICAgICByZXR1cm4KICAgIAogICAgYV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBhICsgZ3JvdXBfbV9zdGFydCAqIGssCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19LKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjAgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIwLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjEgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIxLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0wID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgYWNjdW0xID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgaywgQkxPQ0tfSyk6CiAgICAgICAgIyBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazAgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMCwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKQogICAgICAgIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsICkKICAgICAgICBiX2Jsb2NrMSA9IHRsLmxvYWQoYl9ibG9ja19wdHIxLCApCiAgICAgICAgYWNjdW0wICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMCkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhY2N1bTEgKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2sxKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIwID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0cjAsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgICAgIGJfYmxvY2tfcHRyMSA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIxLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgIG91dCA9IHN3aWdsdShhY2N1bTAsIGFjY3VtMSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgb3V0LnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgKSwgKQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX1NJWkUiOiAxMDI0ICogOCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKSAgICAgICAgICAgCkB0cml0b24uaml0CmRlZiB3ZWlnaHRlZF9zdW1fZ2F0aGVyKAogICAgZmZuMV9vdXQsCiAgICB0b2tlbjJpbmRleCwKICAgIHRvcGtfc2NvcmVzLAogICAgc2hhcmVkX2V4cGVydF9mZm4xLAogICAgbW9lX291dCwKICAgIGRfaGlkZGVuLAogICAgYmF0Y2hfc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyBmZm4xX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyB0b2tlbjJpbmRleDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyB0b3BrX3Njb3JlczogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBzaGFyZWRfZXhwZXJ0X2ZmbjE6IChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyBtb2Vfb3V0OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgZ3JpZDogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBCTE9DS19TSVpFKSwgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4pCiAgICAKICAgIHNlZ21lbnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgdG9rZW5faWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgCiAgICBvZmZzZXRzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgc2VnbWVudF9pZHggKiBCTE9DS19TSVpFCiAgICBtYXNrID0gb2Zmc2V0cyA8IGRfaGlkZGVuCiAgICAKICAgIGRhdGEgPSB0bC5sb2FkKAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgICBmb3IgaSBpbiByYW5nZShuX2V4cGVydHNfcGVyX3Rva2VuKToKICAgICAgICB3ZWlnaHQgPSB0bC5sb2FkKHRvcGtfc2NvcmVzICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgaW5kZXggPSB0bC5sb2FkKHRva2VuMmluZGV4ICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgZmZuMV9vdXRfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBmZm4xX291dCArIGluZGV4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQogICAgICAgIGRhdGEgKz0gd2VpZ2h0ICogZmZuMV9vdXRfYmxvY2sKICAgIHRsLnN0b3JlKAogICAgICAgIG1vZV9vdXQgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgZGF0YSwKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgIAojIGNvbmZpZzogeydkX2hpZGRlbic6IDcxNjgsICdkX2V4cGVydCc6IDIwNDgsICduX3JvdXRlZF9leHBlcnRzJzogMzIsICduX3NoYXJlZF9leHBlcnRzJzogMSwgJ25fZXhwZXJ0c19wZXJfdG9rZW4nOiA0LCAnYmF0Y2hfc2l6ZSc6IDEsICdzZXFfbGVuJzogMjA0OH0KIyBpbnB1dF90ZW5zb3IgbGF5b3V0OiAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuICogc2VxX2xlbiwgZF9oaWRkZW4sIDEpCiMgcm91dGVyLndlaWdodCBsYXlvdXQ6IChuX3JvdXRlZF9leHBlcnRzLCAgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIGV4cGVydHMue2l9LjAud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMS53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0KSA6IChkX2V4cGVydCwgMSkKIyBleHBlcnRzLntpfS4yLndlaWdodCBsYXlvdXQ6IChkX2V4cGVydCwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpIDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCgpjbGFzcyBUaW1lcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYWJlbDogc3RyKToKICAgICAgICBzZWxmLmxhYmVsID0gbGFiZWwKICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5lbmRfdGltZSA9IE5vbmUKICAgICAgICBzZWxmLmludGVydmFsID0gTm9uZQogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAjIHNlbGYuc3RhcnQgPSB0aW1lLnRpbWUoKQogICAgICAgIHJldHVybiBzZWxmCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAgICAgIyBzZWxmLmVuZCA9IHRpbWUudGltZSgpCiAgICAgICAgIyBzZWxmLmludGVydmFsID0gKHNlbGYuZW5kIC0gc2VsZi5zdGFydCkgKiAxMDAwICMgaW4gbXMKICAgICAgICAjIHByaW50KGYie3NlbGYubGFiZWx9OiB7c2VsZi5pbnRlcnZhbDouNGZ9IG1zIikKICAgICAgICByZXR1cm4gRmFsc2UKZGVmIG1vZV9mb3J3YXJkKAogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IsCiAgICB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwKICAgIGRfaGlkZGVuOiBpbnQsCiAgICBkX2V4cGVydDogaW50LAogICAgbl9yb3V0ZWRfZXhwZXJ0czogaW50LAogICAgbl9zaGFyZWRfZXhwZXJ0czogaW50LAogICAgbl9leHBlcnRzX3Blcl90b2tlbjogaW50LAogICAgYmF0Y2hfc2l6ZTogaW50LAogICAgc2VxX2xlbjogaW50CikgLT4gdG9yY2guVGVuc29yOgogICAgaW5wdXRfdGVuc29yID0gaW5wdXRfdGVuc29yLnJlc2hhcGUoLTEsIGRfaGlkZGVuKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCiAgICAKICAgICMgVE9ETzogdXNlIGN1ZGEgZ3JhcGg/CiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgYWxsb2NhdGUgdGVuc29yIHRpbWVyIikgYXMgdDoKICAgICMgQWxsb2NhdGUgdGVuc29yIAogICAgIyBUT0RPOiBwcmVhbGxvY2F0ZSB0ZW5zb3IKICAgIGV4cGVydDJ0b2tlbl9jb3VudCA9IHRvcmNoLmVtcHR5KHNpemU9KG5fcm91dGVkX2V4cGVydHMsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgd2l0aGluX2V4cGVydF9pbmRleCA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gPSB0b3JjaC56ZXJvcyhzaXplPShuX3JvdXRlZF9leHBlcnRzICsgMSwpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAKICAgIHJlcGVhdGVkX3Rva2VucyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKICAgICMgZmZuMF9saHMgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgICMgZmZuMF9yaHMgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIGZmbjBfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBmZm4xX291dCA9IHRvcmNoLmVtcHR5X2xpa2UocmVwZWF0ZWRfdG9rZW5zKQogICAgbW9lX291dCA9IHRvcmNoLmVtcHR5X2xpa2UoaW5wdXRfdGVuc29yKQogICAgIyBUT0RPOiBtdWx0aSBzdHJlYW0KICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSBwdHIgYXJyYXkiKSBhcyB0OgogICAgYl9wdHJzID0gdG9yY2gudGVuc29yKAogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0gKwogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0gKwogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgZGV2aWNlPXJlcGVhdGVkX3Rva2Vucy5kZXZpY2UsCiAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgKQogICAgYl9wdHJzMCA9IGJfcHRyc1s6bl9yb3V0ZWRfZXhwZXJ0c10KICAgIGJfcHRyczEgPSBiX3B0cnNbbl9yb3V0ZWRfZXhwZXJ0czoyKm5fcm91dGVkX2V4cGVydHNdCiAgICBiX3B0cnMyID0gYl9wdHJzWzIqbl9yb3V0ZWRfZXhwZXJ0czpdCgogICAgCiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2hhcmVkIGV4cGVydCB0aW1lciIpIGFzIHQ6CiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDEgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddICMgKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgICMgVE9ETzogaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgICMgVE9ETzogc2hhcmVkIGV4cGVydCBpbiBhIHNlcGFyYXRlIHN0cmVhbT8KICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgIHNoYXJlZF9leHBlcnRfZmZuMSA9IHNoYXJlZF9leHBlcnRfZmZuMCBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCiAgICAKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICByb3V0ZXIgdGltZXIiKSBhcyB0OgogICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICMgVE9ETzogZnVzZWQgbWF0bXVsICsgc29mdG1heCArIHRvcCBrID8gb3IgaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgIGxvZ2l0cyA9IHRvcmNoLm1hdG11bChpbnB1dF90ZW5zb3IsIHJvdXRlcl93ZWlnaHQudCgpKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9yb3V0ZWRfZXhwZXJ0cykKICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgIHNjb3JlcyA9IEYuc29mdG1heChsb2dpdHMsIGRpbT0tMSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fcm91dGVkX2V4cGVydHMpCiAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRpbT0tMSwgc29ydGVkPUZhbHNlKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgICAgCgogICAgIyB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGNhbGN1bGF0ZSBpbmRleCB0aW1lciIpIGFzIHQ6CiAgICAjIGV4cGVydDJ0b2tlbl9jb3VudCAobl9yb3V0ZWRfZXhwZXJ0cywpCiAgICAjIHdpdGhpbl9leHBlcnRfaW5kZXggKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleFsgKG5fcm91dGVkX2V4cGVydHMsICkgXSgKICAgICAgICB0b3BrX2luZGljZXMsCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQogICAgIyB0b2tlbjJpbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbIGxhbWJkYSBtZXRhIDogKHRyaXRvbi5jZGl2KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwpIF0oCiAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQoKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBzY2F0dGVyIHRpbWVyIikgYXMgdDoKICAgIHNjYXR0ZXJbIChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKSBdKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICBzZXFfbGVuLAogICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgZF9oaWRkZW4sCiAgICApCiAgICAKICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4KICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4wIHRpbWVyIikgYXMgdDogICAgCiAgICBncm91cF9nZW1tX1N3aUdsdVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2V4cGVydCwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgYSA9IHJlcGVhdGVkX3Rva2VucywKICAgICAgICBiX2Jhc2VfcHRyczAgPSBiX3B0cnMwLAogICAgICAgIGJfYmFzZV9wdHJzMSA9IGJfcHRyczEsCiAgICAgICAgYyA9IGZmbjBfb3V0LAogICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICBtYXhfbSA9IG1heF9tLAogICAgICAgIG4gPSBkX2V4cGVydCwKICAgICAgICBrID0gZF9oaWRkZW4sCiAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgIyBCTE9DS19NPUJMT0NLX00sCiAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICApCiAgICAKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4xIHRpbWVyIikgYXMgdDoKICAgIGdyb3VwX2dlbW1bIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgIGEgPSBmZm4wX291dCwKICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczIsCiAgICAgICAgYyA9IGZmbjFfb3V0LAogICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuID0gZF9oaWRkZW4sCiAgICAgICAgayA9IGRfZXhwZXJ0LAogICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICMgQkxPQ0tfTj1CTE9DS19OLAogICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgKQogICAgCiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgd2VpZ2h0ZWQgc3VtIGdhdGhlciB0aW1lciIpIGFzIHQ6CiAgICB3ZWlnaHRlZF9zdW1fZ2F0aGVyWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19TSVpFIl0pLCBiYXRjaF9zaXplICogc2VxX2xlbildKAogICAgICAgIGZmbjFfb3V0LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIHRvcGtfc2NvcmVzLAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgICAgICBtb2Vfb3V0LAogICAgICAgIGRfaGlkZGVuLAogICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgc2VxX2xlbiwKICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICMgQkxPQ0tfU0laRT1CTE9DS19TSVpFLAogICAgKQogICAgIyBzbGVlcCA4IG1zIAogICAgIyBiZW5jaG1hcmsgc3Vja3MgIQogICAgIyB0aW1lLnNsZWVwKDAuMDA4KQogICAgcmV0dXJuIG1vZV9vdXQucmVzaGFwZShiYXRjaF9zaXplLCBzZXFfbGVuLCBkX2hpZGRlbikgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pCgoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIG91dHB1dCA9IG1vZV9mb3J3YXJkKGlucHV0X3RlbnNvciwgd2VpZ2h0cywgKipjb25maWcpCiAgICByZXR1cm4gb3V0cHV0Cg==No newline at end of file
Best evidence level for this revision: reported
JSON