Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 30702

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_v5_3.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-30702?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
AMD DeepSeek-style MoE layerfp16 · [1, 2048, 7168]
AMD Instinct MI300X
4.11ms
#1 of 118
2025-06-02
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
12.7ms
#30 of 118
2025-06-02

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:df530ed9909a4f307bfe5e17c2057e3befdce11a75b4feb36cc62876221da5c5
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

moe_v5_3.py1 lines
aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQgKiA0LAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksCiAgICBdLAogICAga2V5PVtdLAopCkB0cml0b24uaml0CmRlZiBzY2F0dGVyKAogICAgaW5wdXRfdGVuc29yLAogICAgdG9rZW4yaW5kZXgsCiAgICByZXBlYXRlZF90b2tlbnMsCiAgICBiYXRjaF9zaXplLAogICAgc2VxX2xlbiwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBkX2hpZGRlbiwgCiAgICBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGlucHV0X3RlbnNvcjogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIHRva2VuMmluZGV4OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pIDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIDEpCiAgICAjIHJlcGVhdGVkX3Rva2VuczogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyBncmlkOiAobl9leHBlcnRzX3Blcl90b2tlbiwgc2VxX2xlbiwgYmF0Y2hfc2l6ZSkKICAgIGV4cGVydF9pZHggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBzZXFfaWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgYmF0Y2hfaWR4ID0gdGwucHJvZ3JhbV9pZCgyKQogICAgCiAgICB0b2tlbl9pZHggPSBiYXRjaF9pZHggKiBzZXFfbGVuICsgc2VxX2lkeAogICAgZHN0X2lkeCA9IHRsLmxvYWQodG9rZW4yaW5kZXggKyB0b2tlbl9pZHggKiBuX2V4cGVydHNfcGVyX3Rva2VuICsgZXhwZXJ0X2lkeCkKICAgIGZvciBpIGluIHJhbmdlKDAsIGRfaGlkZGVuLCBCTE9DS19TSVpFKToKICAgICAgICBvZmZzZXQgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyBpCiAgICAgICAgbWFzayA9IG9mZnNldCA8IGRfaGlkZGVuCiAgICAgICAgaW5wdXRfdGVuc29yX2Jsb2NrID0gdGwubG9hZCgKICAgICAgICAgICAgaW5wdXRfdGVuc29yICsgdG9rZW5faWR4ICogZF9oaWRkZW4gKyBvZmZzZXQsCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCiAgICAgICAgdGwuc3RvcmUoCiAgICAgICAgICAgIHJlcGVhdGVkX3Rva2VucyArIGRzdF9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgaW5wdXRfdGVuc29yX2Jsb2NrLAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19LIjogMzIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTIsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGdyb3VwX2dlbW0oCiAgICBhLCBiX2Jhc2VfcHRycywgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX2Jhc2VfcHRyczogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoIHRyaXRvbi5jZGl2KG4sIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIGdyb3VwX3NpemUgKQogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX04KICAgIG1faWQgPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyID0gdGwubG9hZChiX2Jhc2VfcHRycyArIGdyb3VwX2lkKQogICAgaWYgZ3JvdXBfbV9zdGFydCArIG1faWQgKiBCTE9DS19NID49IGdyb3VwX21fZW5kOgogICAgICAgIHJldHVybgogICAgYV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBhICsgZ3JvdXBfbV9zdGFydCAqIGssCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19LKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9Z3JvdXBfYl9iYXNlX3B0ci50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgaywgQkxPQ0tfSyk6CiAgICAgICAgIyBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19NLCBCTE9DS19LKQogICAgICAgICMgYl9ibG9jayA9IHRsLmxvYWQoYl9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoQkxPQ0tfSywgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsICkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgYl9ibG9jayA9IHRsLmxvYWQoYl9ibG9ja19wdHIsICkgIyAoQkxPQ0tfSywgQkxPQ0tfTikKICAgICAgICBhY2N1bSArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jaykgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBhY2N1bS50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgYWNjdW0udG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCApLCApCgpAdHJpdG9uLmppdApkZWYgc3dpZ2x1KHgsIHkpOgogICAgbG9nXzJfZTogdGwuY29uc3RleHByID0gMS40NDI2OTUwNDEKICAgIGV4cF94ID0gdGwuZXhwMiggLWxvZ18yX2UgKiB4KQogICAgcmV0dXJuIDEuIC8gKDEuICsgZXhwX3gpICogeCAqIHkKCgojIEB0cml0b24uYXV0b3R1bmUoCiMgICAgIGNvbmZpZ3M9WwojICAgICAgICAgdHJpdG9uLkNvbmZpZygKIyAgICAgICAgICAgICB7CiMgICAgICAgICAgICAgICAgICJCTE9DS19NIjogMTI4LAojICAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAojICAgICAgICAgICAgICAgICAiQkxPQ0tfSyI6IDMyLAojICAgICAgICAgICAgIH0sCiMgICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiMgICAgICAgICAgICAgbnVtX3N0YWdlcz0yLAojICAgICAgICAgKSwKIyAgICAgXSwKIyAgICAga2V5PVtdLAojICkKQHRyaXRvbi5qaXQKZGVmIGdlbW1fU3dpR2x1KAogICAgYSwgCiAgICBiMCwgYjEsIAogICAgYywKICAgIG0sCiAgICBuLAogICAgaywKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKG0sIGspIDogKGssIDEpCiAgICAjIGIwOiAoaywgbikgOiAobiwgMSkKICAgICMgYjE6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAobSwgbikgOiAobiwgMSkKICAgICMgZ3JpZDogKCB0cml0b24uY2RpdihtLCBCTE9DS19NKSwgdHJpdG9uLmNkaXYobiwgQkxPQ0tfTikgKQogICAgbV9zdGFydCA9IHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19NCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgxKSAqIEJMT0NLX04KICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSwKICAgICAgICBzaGFwZT0obSwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9zdGFydCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoQkxPQ0tfTSwgQkxPQ0tfSykKICAgIGJfYmxvY2tfcHRyMCA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGIwLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYjEsCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGMsCiAgICAgICAgc2hhcGU9KG0sIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1fc3RhcnQsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBhY2N1bTAgPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBhY2N1bTEgPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICAjIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgIyBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgIyBiX2Jsb2NrMSA9IHRsLmxvYWQoYl9ibG9ja19wdHIxLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCApKSAjIChCTE9DS19NLCBCTE9DS19LKQogICAgICAgIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsICkgIyAoQkxPQ0tfSywgQkxPQ0tfTikKICAgICAgICBiX2Jsb2NrMSA9IHRsLmxvYWQoYl9ibG9ja19wdHIxLCApICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgYWNjdW0wICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMCkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhY2N1bTEgKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2sxKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIAogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIwID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0cjAsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgICAgIGJfYmxvY2tfcHRyMSA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIxLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgIG91dCA9IHN3aWdsdShhY2N1bTAsIGFjY3VtMSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgb3V0LnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgKSwgKQogICAgCiMgQHRyaXRvbi5hdXRvdHVuZSgKIyAgICAgY29uZmlncz1bCiMgICAgICAgICB0cml0b24uQ29uZmlnKAojICAgICAgICAgICAgIHsKIyAgICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiMgICAgICAgICAgICAgICAgICJCTE9DS19OIjogNjQsCiMgICAgICAgICAgICAgICAgICJCTE9DS19LIjogMzIsCiMgICAgICAgICAgICAgfSwKIyAgICAgICAgICAgICBudW1fd2FycHM9NCwKIyAgICAgICAgICAgICBudW1fc3RhZ2VzPTIsCiMgICAgICAgICApLAojICAgICBdLAojICAgICBrZXk9W10sCiMgKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHUoCiAgICBhLCAKICAgIGJfYmFzZV9wdHJzMCwgYl9iYXNlX3B0cnMxLCAKICAgIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnMwOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGJfYmFzZV9wdHJzMTogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoIHRyaXRvbi5jZGl2KG4sIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIGdyb3VwX3NpemUgKQogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX04KICAgIG1faWQgPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyMCA9IHRsLmxvYWQoYl9iYXNlX3B0cnMwICsgZ3JvdXBfaWQpCiAgICBncm91cF9iX2Jhc2VfcHRyMSA9IHRsLmxvYWQoYl9iYXNlX3B0cnMxICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIwID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMC50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtMCA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGFjY3VtMSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgICMgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2sxID0gdGwubG9hZChiX2Jsb2NrX3B0cjEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCApCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKICAgIAojIEB0cml0b24uYXV0b3R1bmUoCiMgICAgIGNvbmZpZ3M9WwojICAgICAgICAgdHJpdG9uLkNvbmZpZygKIyAgICAgICAgICAgICB7CiMgICAgICAgICAgICAgICAgICJCTE9DS19NIjogMTI4LAojICAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAojICAgICAgICAgICAgICAgICAiQkxPQ0tfSyI6IDMyLAojICAgICAgICAgICAgIH0sCiMgICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiMgICAgICAgICAgICAgbnVtX3N0YWdlcz0yLAojICAgICAgICAgKSwKIyAgICAgXSwKIyAgICAga2V5PVtdLAojICkKQHRyaXRvbi5qaXQKZGVmIGdyb3VwX2dlbW1fU3dpR2x1X3NodWZmbGUoCiAgICBhLCAKICAgIGJfYmFzZV9wdHJzMCwgYl9iYXNlX3B0cnMxLCAKICAgIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnMwOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGJfYmFzZV9wdHJzMTogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoOCwgdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIGNkaXYobWF4X20sIEJMT0NLX00pICogY2Rpdihncm91cF9zaXplLCA4KSkKICAgIFhDRF9DTlQgPSA4CiAgICBtX2Jsb2NrX2NudCA9IHRsLmNkaXYobWF4X20sIEJMT0NLX00pCiAgICAKICAgIAogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDApICsgdGwucHJvZ3JhbV9pZCgyKSAvLyBtX2Jsb2NrX2NudCAqIFhDRF9DTlQKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDEpICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMikgJSBtX2Jsb2NrX2NudAogICAgCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyMCA9IHRsLmxvYWQoYl9iYXNlX3B0cnMwICsgZ3JvdXBfaWQpCiAgICBncm91cF9iX2Jhc2VfcHRyMSA9IHRsLmxvYWQoYl9iYXNlX3B0cnMxICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIwID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMC50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtMCA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGFjY3VtMSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgICMgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2sxID0gdGwubG9hZChiX2Jsb2NrX3B0cjEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCApCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogMTAyNCAqIDgsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikgICAgICAgICAgIApAdHJpdG9uLmppdApkZWYgd2VpZ2h0ZWRfc3VtX2dhdGhlcigKICAgIGZmbjFfb3V0LAogICAgdG9rZW4yaW5kZXgsCiAgICB0b3BrX3Njb3JlcywKICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgIG1vZV9vdXQsCiAgICBkX2hpZGRlbiwKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgZmZuMV9vdXQ6IChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgdG9wa19zY29yZXM6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgc2hhcmVkX2V4cGVydF9mZm4xOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgbW9lX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgQkxPQ0tfU0laRSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKQogICAgCiAgICBzZWdtZW50X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHRva2VuX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIHNlZ21lbnRfaWR4ICogQkxPQ0tfU0laRQogICAgbWFzayA9IG9mZnNldHMgPCBkX2hpZGRlbgogICAgCiAgICBkYXRhID0gdGwubG9hZCgKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAgZm9yIGkgaW4gcmFuZ2Uobl9leHBlcnRzX3Blcl90b2tlbik6CiAgICAgICAgd2VpZ2h0ID0gdGwubG9hZCh0b3BrX3Njb3JlcyArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGluZGV4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGZmbjFfb3V0X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICAgICAgZmZuMV9vdXQgKyBpbmRleCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICBkYXRhICs9IHdlaWdodCAqIGZmbjFfb3V0X2Jsb2NrCiAgICB0bC5zdG9yZSgKICAgICAgICBtb2Vfb3V0ICsgdG9rZW5faWR4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgIGRhdGEsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAKIyBjb25maWc6IHsnZF9oaWRkZW4nOiA3MTY4LCAnZF9leHBlcnQnOiAyMDQ4LCAnbl9yb3V0ZWRfZXhwZXJ0cyc6IDMyLCAnbl9zaGFyZWRfZXhwZXJ0cyc6IDEsICduX2V4cGVydHNfcGVyX3Rva2VuJzogNCwgJ2JhdGNoX3NpemUnOiAxLCAnc2VxX2xlbic6IDIwNDh9CiMgaW5wdXRfdGVuc29yIGxheW91dDogKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiAqIHNlcV9sZW4sIGRfaGlkZGVuLCAxKQojIHJvdXRlci53ZWlnaHQgbGF5b3V0OiAobl9yb3V0ZWRfZXhwZXJ0cywgIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBleHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQpIDogKGRfZXhwZXJ0LCAxKQojIGV4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQsIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMC53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykgOiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4xLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjIud2VpZ2h0IGxheW91dDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQoKY2xhc3MgVGltZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWw6IHN0cik6CiAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCiAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQogICAgICAgIHNlbGYuZW5kX3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcnZhbCA9IE5vbmUKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkgICMgRW5zdXJlIGFsbCBwcmV2aW91cyBDVURBIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlCiAgICAgICAgIyBzZWxmLnN0YXJ0ID0gdGltZS50aW1lKCkKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgICMgc2VsZi5lbmQgPSB0aW1lLnRpbWUoKQogICAgICAgICMgc2VsZi5pbnRlcnZhbCA9IChzZWxmLmVuZCAtIHNlbGYuc3RhcnQpICogMTAwMCAjIGluIG1zCiAgICAgICAgIyBwcmludChmIntzZWxmLmxhYmVsfToge3NlbGYuaW50ZXJ2YWw6LjRmfSBtcyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgpAdG9yY2guY29tcGlsZQpkZWYgc2hhcmVkX2V4cGVydF9mZm4oCiAgICBpbnB1dF90ZW5zb3I6IHRvcmNoLlRlbnNvciwKICAgIHNoYXJlZF9leHBlcnRfd2VpZ2h0MDogdG9yY2guVGVuc29yLAogICAgc2hhcmVkX2V4cGVydF93ZWlnaHQxOiB0b3JjaC5UZW5zb3IsCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDI6IHRvcmNoLlRlbnNvciwKKToKICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgIHNoYXJlZF9leHBlcnRfZmZuMSA9IHNoYXJlZF9leHBlcnRfZmZuMCBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCiAgICByZXR1cm4gc2hhcmVkX2V4cGVydF9mZm4xCgpkZWYgbW9lX2ZvcndhcmQoCiAgICBpbnB1dF90ZW5zb3I6IHRvcmNoLlRlbnNvciwKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLAogICAgZF9oaWRkZW46IGludCwKICAgIGRfZXhwZXJ0OiBpbnQsCiAgICBuX3JvdXRlZF9leHBlcnRzOiBpbnQsCiAgICBuX3NoYXJlZF9leHBlcnRzOiBpbnQsCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuOiBpbnQsCiAgICBiYXRjaF9zaXplOiBpbnQsCiAgICBzZXFfbGVuOiBpbnQKKSAtPiB0b3JjaC5UZW5zb3I6CiAgICBpbnB1dF90ZW5zb3IgPSBpbnB1dF90ZW5zb3IucmVzaGFwZSgtMSwgZF9oaWRkZW4pICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikKICAgIAogICAgIyBUT0RPOiB1c2UgY3VkYSBncmFwaD8KICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSB0ZW5zb3IgdGltZXIiKSBhcyB0OgogICAgIyBBbGxvY2F0ZSB0ZW5zb3IgCiAgICAjIFRPRE86IHByZWFsbG9jYXRlIHRlbnNvcgogICAgZXhwZXJ0MnRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkoc2l6ZT0obl9yb3V0ZWRfZXhwZXJ0cywpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICB0b2tlbjJpbmRleCA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSA9IHRvcmNoLnplcm9zKHNpemU9KG5fcm91dGVkX2V4cGVydHMgKyAxLCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgIAogICAgcmVwZWF0ZWRfdG9rZW5zID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCgogICAgIyBmZm4wX2xocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgIyBmZm4wX3JocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgZmZuMF9vdXQgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIGZmbjFfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShyZXBlYXRlZF90b2tlbnMpCiAgICBtb2Vfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShpbnB1dF90ZW5zb3IpCiAgICAjIFRPRE86IG11bHRpIHN0cmVhbQogICAgIyB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGFsbG9jYXRlIHB0ciBhcnJheSIpIGFzIHQ6CiAgICBiX3B0cnMgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSArCiAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSArCiAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSwKICAgICAgICBkZXZpY2U9cmVwZWF0ZWRfdG9rZW5zLmRldmljZSwKICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICApCiAgICBiX3B0cnMwLCBiX3B0cnMxLCBiX3B0cnMyID0gdG9yY2guc3BsaXQoYl9wdHJzLCBuX3JvdXRlZF9leHBlcnRzKQogICAgIyBiX3B0cnMwID0gYl9wdHJzWzpuX3JvdXRlZF9leHBlcnRzXQogICAgIyBiX3B0cnMxID0gYl9wdHJzW25fcm91dGVkX2V4cGVydHM6MipuX3JvdXRlZF9leHBlcnRzXQogICAgIyBiX3B0cnMyID0gYl9wdHJzWzIqbl9yb3V0ZWRfZXhwZXJ0czpdCgogICAgCiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2hhcmVkIGV4cGVydCB0aW1lciIpIGFzIHQ6CiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDEgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddICMgKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgICMgVE9ETzogaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgICMgVE9ETzogc2hhcmVkIGV4cGVydCBpbiBhIHNlcGFyYXRlIHN0cmVhbT8KICAgICMgcnVuIHNoYXJlZCBleHBlcnQgZmZuIGluIGEgc2VwYXJhdGUgc3RyZWFtCiAgICBzaGFyZWRfZXhwZXJ0X2ZmbjAgPSBGLnNpbHUoaW5wdXRfdGVuc29yIEAgc2hhcmVkX2V4cGVydF93ZWlnaHQwKSAqIChpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgPSBzaGFyZWRfZXhwZXJ0X2ZmbjAgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgCiAgICAKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICByb3V0ZXIgdGltZXIiKSBhcyB0OgogICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICMgVE9ETzogZnVzZWQgbWF0bXVsICsgc29mdG1heCArIHRvcCBrID8gb3IgaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgIGxvZ2l0cyA9IHRvcmNoLm1hdG11bChpbnB1dF90ZW5zb3IsIHJvdXRlcl93ZWlnaHQudCgpKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9yb3V0ZWRfZXhwZXJ0cykKICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgIHNjb3JlcyA9IEYuc29mdG1heChsb2dpdHMsIGRpbT0tMSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fcm91dGVkX2V4cGVydHMpCiAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRpbT0tMSwgc29ydGVkPUZhbHNlKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgICAgCgogICAgIyB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGNhbGN1bGF0ZSBpbmRleCB0aW1lciIpIGFzIHQ6CiAgICAjIGV4cGVydDJ0b2tlbl9jb3VudCAobl9yb3V0ZWRfZXhwZXJ0cywpCiAgICAjIHdpdGhpbl9leHBlcnRfaW5kZXggKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleFsgKG5fcm91dGVkX2V4cGVydHMsICkgXSgKICAgICAgICB0b3BrX2luZGljZXMsCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQogICAgIyB0b2tlbjJpbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbIGxhbWJkYSBtZXRhIDogKHRyaXRvbi5jZGl2KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwpIF0oCiAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQoKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBzY2F0dGVyIHRpbWVyIikgYXMgdDoKICAgIHNjYXR0ZXJbIChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKSBdKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICBzZXFfbGVuLAogICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgZF9oaWRkZW4sCiAgICApCiAgICAKICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4KICAgIEJMT0NLX01fbGlzdCA9IFszMiwgNjQsIDEyOCwgXQogICAgQkxPQ0tfTl9saXN0ID0gWzMyLCA2NCwgMTI4LCBdCiAgICBCTE9DS19LX2xpc3QgPSBbMzIsIDY0LCAxMjgsIF0KICAgIG51bV93YXJwc19saXN0ID0gWzIsIDQsIDgsIF0KICAgIHN0YWdlc19saXN0ID0gWzEsIDIsIF0KICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IHRvcmNoLmVtcHR5KAogICAgICAgIHNpemU9KGlucHV0X3RlbnNvci5zaGFwZVswXSwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSwKICAgICAgICBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwKICAgICAgICBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUsCiAgICApCiAgICAjIGZvciBCTE9DS19NIGluIEJMT0NLX01fbGlzdDoKICAgICMgICAgIGZvciBCTE9DS19OIGluIEJMT0NLX05fbGlzdDoKICAgICMgICAgICAgICBmb3IgQkxPQ0tfSyBpbiBCTE9DS19LX2xpc3Q6CiAgICAjICAgICAgICAgICAgIGZvciBudW1fd2FycHMgaW4gbnVtX3dhcnBzX2xpc3Q6CiAgICAjICAgICAgICAgICAgICAgICBmb3Igc3RhZ2VzIGluIHN0YWdlc19saXN0OgogICAgIyAgICAgICAgICAgICAgICAgICAgIGlmIChCTE9DS19NICogQkxPQ0tfSyArIEJMT0NLX04gKiBCTE9DS19LKSAqIHN0YWdlcyAqIDIgPj0gMTAyNCAqIDY0OgogICAgIyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgIyAgICAgICAgICAgICAgICAgICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgQkxPQ0tfTT17QkxPQ0tfTX0sIEJMT0NLX049e0JMT0NLX059LCBCTE9DS19LPXtCTE9DS19LfSwgbnVtX3dhcnBzPXtudW1fd2FycHN9LCBzdGFnZXM9e3N0YWdlc30gZ3JvdXBfZ2VtbV9Td2lHbHUgdGltZXIiKSBhcyB0OgogICAgZ3JvdXBfZ2VtbV9Td2lHbHVbIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9leHBlcnQsIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgIGEgPSByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYl9iYXNlX3B0cnMwID0gYl9wdHJzMCwKICAgICAgICBiX2Jhc2VfcHRyczEgPSBiX3B0cnMxLAogICAgICAgIGMgPSBmZm4wX291dCwKICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgbWF4X20gPSBtYXhfbSwKICAgICAgICBuID0gZF9leHBlcnQsCiAgICAgICAgayA9IGRfaGlkZGVuLAogICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIEJMT0NLX009MTI4LAogICAgICAgIEJMT0NLX049NjQsCiAgICAgICAgQkxPQ0tfSz02NCwKICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICApIAogICAgIyBncm91cF9nZW1tX1N3aUdsdVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2V4cGVydCwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAjICAgICBhID0gcmVwZWF0ZWRfdG9rZW5zLAogICAgIyAgICAgYl9iYXNlX3B0cnMwID0gYl9wdHJzMCwKICAgICMgICAgIGJfYmFzZV9wdHJzMSA9IGJfcHRyczEsCiAgICAjICAgICBjID0gZmZuMF9vdXQsCiAgICAjICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAjICAgICBtYXhfbSA9IG1heF9tLAogICAgIyAgICAgbiA9IGRfZXhwZXJ0LAogICAgIyAgICAgayA9IGRfaGlkZGVuLAogICAgIyAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAjICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICMgICAgICMgQkxPQ0tfTj1CTE9DS19OLAogICAgIyAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAjICkKICAgIAogICAgIyB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGZmbjEgdGltZXIiKSBhcyB0OgogICAgZ3JvdXBfZ2VtbVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgYSA9IGZmbjBfb3V0LAogICAgICAgIGJfYmFzZV9wdHJzID0gYl9wdHJzMiwKICAgICAgICBjID0gZmZuMV9vdXQsCiAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgIG1heF9tID0gbWF4X20sCiAgICAgICAgbiA9IGRfaGlkZGVuLAogICAgICAgIGsgPSBkX2V4cGVydCwKICAgICAgICBncm91cF9zaXplID0gbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAjIEJMT0NLX049QkxPQ0tfTiwKICAgICAgICAjIEJMT0NLX0s9QkxPQ0tfSywKICAgICkKICAgIAogICAgIyB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHdlaWdodGVkIHN1bSBnYXRoZXIgdGltZXIiKSBhcyB0OgogICAgd2VpZ2h0ZWRfc3VtX2dhdGhlclsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4pXSgKICAgICAgICBmZm4xX291dCwKICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICB0b3BrX3Njb3JlcywKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEsCiAgICAgICAgbW9lX291dCwKICAgICAgICBkX2hpZGRlbiwKICAgICAgICBiYXRjaF9zaXplLAogICAgICAgIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAjIEJMT0NLX1NJWkU9QkxPQ0tfU0laRSwKICAgICkKICAgICMgc2xlZXAgOCBtcyAKICAgICMgYmVuY2htYXJrIHN1Y2tzICEKICAgICMgdGltZS5zbGVlcCgwLjAwOCkKICAgIHJldHVybiBtb2Vfb3V0LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pICMgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBvdXRwdXQgPSBtb2VfZm9yd2FyZChpbnB1dF90ZW5zb3IsIHdlaWdodHMsICoqY29uZmlnKQogICAgcmV0dXJuIG91dHB1dAoKIyBwcmUgYWxsb2NhdGUgdGVuc29yCnNpemUgPSAzMiAqICgyKiozMCkKdGVuc29yID0gdG9yY2guZW1wdHkoc2l6ZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKZGVsIHRlbnNvcgoKCgoKCgoKCmRlZiBteV9nZW5lcmF0ZV9pbnB1dCgKICAgIGRoaWRkZW46IGludCwKICAgIGRleHBlcnQ6IGludCwKICAgIG5yb3V0ZWRleHBlcnRzOiBpbnQsCiAgICBuc2hhcmVkZXhwZXJ0czogaW50LAogICAgbmV4cGVydHNwZXJ0b2tlbjogaW50LAogICAgYnM6IGludCwKICAgIHNlcWxlbjogaW50LAogICAgc2VlZDogaW50CikgLT4gaW5wdXRfdDoKCiAgICAjIFJlYWxseSBkdW1iIGJ1dCBmb3Igbm93IF8gaXNuJ3QgcGFyc2luZyBjb3JyZWN0bHkuCiAgICBkX2hpZGRlbiA9IGRoaWRkZW4KICAgIGRfZXhwZXJ0ID0gZGV4cGVydAogICAgbl9yb3V0ZWRfZXhwZXJ0cyA9IG5yb3V0ZWRleHBlcnRzCiAgICBuX3NoYXJlZF9leHBlcnRzID0gbnNoYXJlZGV4cGVydHMKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4gPSBuZXhwZXJ0c3BlcnRva2VuCiAgICBiYXRjaF9zaXplID0gYnMKICAgIHNlcV9sZW4gPSBzZXFsZW4KCiAgICBjb25maWcgPSB7CiAgICAgICAgImRfaGlkZGVuIjogZF9oaWRkZW4sCiAgICAgICAgImRfZXhwZXJ0IjogZF9leHBlcnQsCiAgICAgICAgIm5fcm91dGVkX2V4cGVydHMiOiBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICJuX3NoYXJlZF9leHBlcnRzIjogbl9zaGFyZWRfZXhwZXJ0cywKICAgICAgICAibl9leHBlcnRzX3Blcl90b2tlbiI6IG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgImJhdGNoX3NpemUiOiBiYXRjaF9zaXplLAogICAgICAgICJzZXFfbGVuIjogc2VxX2xlbiwKICAgIH0KCiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQoKICAgIG51bV9leHBlcnRzID0gbl9yb3V0ZWRfZXhwZXJ0cwogICAgZXhwZXJ0X2RpbSA9IGRfZXhwZXJ0CiAgICB3ZWlnaHRzID0ge30KCiAgICBpbnB1dF90ZW5zb3IgPSB0b3JjaC5yYW5kbigKICAgICAgICAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApLmNvbnRpZ3VvdXMoKQoKICAgICMgSW5pdGlhbGl6ZSByb3V0ZXIgd2VpZ2h0cwogICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKG51bV9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChleHBlcnRfZGltLCBkX2hpZGRlbiksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQoKICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10gPSB0b3JjaC5yYW5kbigKICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzKSwKICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgZ2VuZXJhdG9yPWdlbgogICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cykKICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10gPSB0b3JjaC5yYW5kbigKICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzKSwKICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgZ2VuZXJhdG9yPWdlbgogICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cykKICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10gPSB0b3JjaC5yYW5kbigKICAgICAgICAoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMsIGRfaGlkZGVuKSwKICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgZ2VuZXJhdG9yPWdlbgogICAgKSAvIG1hdGguc3FydChkX2hpZGRlbikKCiAgICByZXR1cm4gKGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnKQppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIyB0b3JjaC5jdWRhLnNldF9kZXZpY2UoMSkKICAgIGNvbmZpZ3MgPSBbCiAgICAgICAgKDcxNjgsIDIwNDgsIDMyLCAxLCA0LCAxLCAyMDQ4LCA5MzcxKSwKICAgICAgICAoNzE2OCwgMjA0OCwgMzIsIDEsIDQsIDEsIDgxOTIsIDEyMTIpLAogICAgXQogICAgIyBmb3IgY29uZmlnX2RpY3QgaW4gY29uZmlnczoKICAgIGZvciBkaGlkZGVuLCBkZXhwZXJ0LCBucm91dGVkZXhwZXJ0cywgbnNoYXJlZGV4cGVydHMsIG5leHBlcnRzcGVydG9rZW4sIGJzLCBzZXFsZW4sIHNlZWQgaW4gY29uZmlnczoKCiAgICAgICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBteV9nZW5lcmF0ZV9pbnB1dCgKICAgICAgICAgICAgZGhpZGRlbiwKICAgICAgICAgICAgZGV4cGVydCwKICAgICAgICAgICAgbnJvdXRlZGV4cGVydHMsCiAgICAgICAgICAgIG5zaGFyZWRleHBlcnRzLAogICAgICAgICAgICBuZXhwZXJ0c3BlcnRva2VuLAogICAgICAgICAgICBicywKICAgICAgICAgICAgc2VxbGVuLAogICAgICAgICAgICBzZWVkCiAgICAgICAgKQogICAgICAgIA==

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

- aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIHNjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3IsCiAgICB0b2tlbjJpbmRleCwKICAgIHJlcGVhdGVkX3Rva2VucywKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIGRfaGlkZGVuLCAKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgaW5wdXRfdGVuc29yOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgcmVwZWF0ZWRfdG9rZW5zOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6IChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHNlcV9pZHggPSB0bC5wcm9ncmFtX2lkKDEpCiAgICBiYXRjaF9pZHggPSB0bC5wcm9ncmFtX2lkKDIpCiAgICAKICAgIHRva2VuX2lkeCA9IGJhdGNoX2lkeCAqIHNlcV9sZW4gKyBzZXFfaWR4CiAgICBkc3RfaWR4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBleHBlcnRfaWR4KQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgZF9oaWRkZW4sIEJMT0NLX1NJWkUpOgogICAgICAgIG9mZnNldCA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGkKICAgICAgICBtYXNrID0gb2Zmc2V0IDwgZF9oaWRkZW4KICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBpbnB1dF90ZW5zb3IgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICB0bC5zdG9yZSgKICAgICAgICAgICAgcmVwZWF0ZWRfdG9rZW5zICsgZHN0X2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBpbnB1dF90ZW5zb3JfYmxvY2ssCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfTSI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19OIjogMTI4LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbSgKICAgIGEsIGJfYmFzZV9wdHJzLCBjLAogICAgbV9jdW1zdW0sCiAgICBtYXhfbSwKICAgIG4sCiAgICBrLAogICAgZ3JvdXBfc2l6ZSwKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKHRvdGFsX20sIGspIDogKGssIDEpCiAgICAjIGJfYmFzZV9wdHJzOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICggdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIHRyaXRvbi5jZGl2KG1heF9tLCBCTE9DS19NKSwgZ3JvdXBfc2l6ZSApCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMikKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIgPSB0bC5sb2FkKGJfYmFzZV9wdHJzICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICBhX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGEgKyBncm91cF9tX3N0YXJ0ICogaywKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBrKSwKICAgICAgICBzdHJpZGVzPShrLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGJfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0gPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICAjIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgIyBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgKSkgIyAoQkxPQ0tfTSwgQkxPQ0tfSykKICAgICAgICBiX2Jsb2NrID0gdGwubG9hZChiX2Jsb2NrX3B0ciwgKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgICAgIGFjY3VtICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIGFjY3VtLnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgMSksICkKICAgIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBhY2N1bS50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKCkB0cml0b24uaml0CmRlZiBzd2lnbHUoeCwgeSk6CiAgICBsb2dfMl9lOiB0bC5jb25zdGV4cHIgPSAxLjQ0MjY5NTA0MQogICAgZXhwX3ggPSB0bC5leHAyKCAtbG9nXzJfZSAqIHgpCiAgICByZXR1cm4gMS4gLyAoMS4gKyBleHBfeCkgKiB4ICogeQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHUoCiAgICBhLCAKICAgIGJfYmFzZV9wdHJzMCwgYl9iYXNlX3B0cnMxLCAKICAgIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnMwOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGJfYmFzZV9wdHJzMTogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoIHRyaXRvbi5jZGl2KG4sIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIGdyb3VwX3NpemUgKQogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX04KICAgIG1faWQgPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyMCA9IHRsLmxvYWQoYl9iYXNlX3B0cnMwICsgZ3JvdXBfaWQpCiAgICBncm91cF9iX2Jhc2VfcHRyMSA9IHRsLmxvYWQoYl9iYXNlX3B0cnMxICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIwID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMC50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtMCA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGFjY3VtMSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgICMgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2sxID0gdGwubG9hZChiX2Jsb2NrX3B0cjEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCApCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKICAgIApAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAogICAgICAgICAgICAgICAgIkJMT0NLX0siOiAzMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHVfc2h1ZmZsZSgKICAgIGEsIAogICAgYl9iYXNlX3B0cnMwLCBiX2Jhc2VfcHRyczEsIAogICAgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX2Jhc2VfcHRyczA6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYl9iYXNlX3B0cnMxOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGI6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAodG90YWxfbSwgbikgOiAobiwgMSkKICAgICMgbV9jdW1zdW06IChncm91cF9zaXplICsgMSwgKSA6ICgxLCApCiAgICAjIGdyaWQ6ICg4LCB0cml0b24uY2RpdihuLCBCTE9DS19OKSwgY2RpdihtYXhfbSwgQkxPQ0tfTSkgKiBjZGl2KGdyb3VwX3NpemUsIDgpKQogICAgWENEX0NOVCA9IDgKICAgIG1fYmxvY2tfY250ID0gdGwuY2RpdihtYXhfbSwgQkxPQ0tfTSkKICAgIAogICAgCiAgICBncm91cF9pZCA9IHRsLnByb2dyYW1faWQoMCkgKyB0bC5wcm9ncmFtX2lkKDIpIC8vIG1fYmxvY2tfY250ICogWENEX0NOVAogICAgbl9zdGFydCA9IHRsLnByb2dyYW1faWQoMSkgKiBCTE9DS19OCiAgICBtX2lkID0gdGwucHJvZ3JhbV9pZCgyKSAlIG1fYmxvY2tfY250CiAgICAKICAgIAogICAgZ3JvdXBfbV9zdGFydCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCkKICAgIGdyb3VwX21fZW5kID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkICsgMSkKICAgIGdyb3VwX2JfYmFzZV9wdHIwID0gdGwubG9hZChiX2Jhc2VfcHRyczAgKyBncm91cF9pZCkKICAgIGdyb3VwX2JfYmFzZV9wdHIxID0gdGwubG9hZChiX2Jhc2VfcHRyczEgKyBncm91cF9pZCkKICAgIGlmIGdyb3VwX21fc3RhcnQgKyBtX2lkICogQkxPQ0tfTSA+PSBncm91cF9tX2VuZDoKICAgICAgICByZXR1cm4KICAgIAogICAgYV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBhICsgZ3JvdXBfbV9zdGFydCAqIGssCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19LKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjAgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIwLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0cjEgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIxLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSksCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9YyArIGdyb3VwX21fc3RhcnQgKiBuLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYWNjdW0wID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgYWNjdW0xID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgaywgQkxPQ0tfSyk6CiAgICAgICAgIyBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazAgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMCwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgICMgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKQogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwpKQogICAgICAgIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsICkKICAgICAgICBiX2Jsb2NrMSA9IHRsLmxvYWQoYl9ibG9ja19wdHIxLCApCiAgICAgICAgYWNjdW0wICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMCkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhY2N1bTEgKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2sxKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIwID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0cjAsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgICAgIGJfYmxvY2tfcHRyMSA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIxLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgIG91dCA9IHN3aWdsdShhY2N1bTAsIGFjY3VtMSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgb3V0LnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgKSwgKQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX1NJWkUiOiAxMDI0ICogOCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLAogICAgXSwKICAgIGtleT1bXSwKKSAgICAgICAgICAgCkB0cml0b24uaml0CmRlZiB3ZWlnaHRlZF9zdW1fZ2F0aGVyKAogICAgZmZuMV9vdXQsCiAgICB0b2tlbjJpbmRleCwKICAgIHRvcGtfc2NvcmVzLAogICAgc2hhcmVkX2V4cGVydF9mZm4xLAogICAgbW9lX291dCwKICAgIGRfaGlkZGVuLAogICAgYmF0Y2hfc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyBmZm4xX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyB0b2tlbjJpbmRleDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyB0b3BrX3Njb3JlczogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBzaGFyZWRfZXhwZXJ0X2ZmbjE6IChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyBtb2Vfb3V0OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgZ3JpZDogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBCTE9DS19TSVpFKSwgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4pCiAgICAKICAgIHNlZ21lbnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgdG9rZW5faWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgCiAgICBvZmZzZXRzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgc2VnbWVudF9pZHggKiBCTE9DS19TSVpFCiAgICBtYXNrID0gb2Zmc2V0cyA8IGRfaGlkZGVuCiAgICAKICAgIGRhdGEgPSB0bC5sb2FkKAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgICBmb3IgaSBpbiByYW5nZShuX2V4cGVydHNfcGVyX3Rva2VuKToKICAgICAgICB3ZWlnaHQgPSB0bC5sb2FkKHRvcGtfc2NvcmVzICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgaW5kZXggPSB0bC5sb2FkKHRva2VuMmluZGV4ICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgZmZuMV9vdXRfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBmZm4xX291dCArIGluZGV4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQogICAgICAgIGRhdGEgKz0gd2VpZ2h0ICogZmZuMV9vdXRfYmxvY2sKICAgIHRsLnN0b3JlKAogICAgICAgIG1vZV9vdXQgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgZGF0YSwKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgIAojIGNvbmZpZzogeydkX2hpZGRlbic6IDcxNjgsICdkX2V4cGVydCc6IDIwNDgsICduX3JvdXRlZF9leHBlcnRzJzogMzIsICduX3NoYXJlZF9leHBlcnRzJzogMSwgJ25fZXhwZXJ0c19wZXJfdG9rZW4nOiA0LCAnYmF0Y2hfc2l6ZSc6IDEsICdzZXFfbGVuJzogMjA0OH0KIyBpbnB1dF90ZW5zb3IgbGF5b3V0OiAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuICogc2VxX2xlbiwgZF9oaWRkZW4sIDEpCiMgcm91dGVyLndlaWdodCBsYXlvdXQ6IChuX3JvdXRlZF9leHBlcnRzLCAgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIGV4cGVydHMue2l9LjAud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMS53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0KSA6IChkX2V4cGVydCwgMSkKIyBleHBlcnRzLntpfS4yLndlaWdodCBsYXlvdXQ6IChkX2V4cGVydCwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpIDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCgpjbGFzcyBUaW1lcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYWJlbDogc3RyKToKICAgICAgICBzZWxmLmxhYmVsID0gbGFiZWwKICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5lbmRfdGltZSA9IE5vbmUKICAgICAgICBzZWxmLmludGVydmFsID0gTm9uZQogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICAjIHNlbGYuc3RhcnQgPSB0aW1lLnRpbWUoKQogICAgICAgIHJldHVybiBzZWxmCiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAgICAgIyBzZWxmLmVuZCA9IHRpbWUudGltZSgpCiAgICAgICAgIyBzZWxmLmludGVydmFsID0gKHNlbGYuZW5kIC0gc2VsZi5zdGFydCkgKiAxMDAwICMgaW4gbXMKICAgICAgICAjIHByaW50KGYie3NlbGYubGFiZWx9OiB7c2VsZi5pbnRlcnZhbDouNGZ9IG1zIikKICAgICAgICByZXR1cm4gRmFsc2UKZGVmIG1vZV9mb3J3YXJkKAogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IsCiAgICB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXSwKICAgIGRfaGlkZGVuOiBpbnQsCiAgICBkX2V4cGVydDogaW50LAogICAgbl9yb3V0ZWRfZXhwZXJ0czogaW50LAogICAgbl9zaGFyZWRfZXhwZXJ0czogaW50LAogICAgbl9leHBlcnRzX3Blcl90b2tlbjogaW50LAogICAgYmF0Y2hfc2l6ZTogaW50LAogICAgc2VxX2xlbjogaW50CikgLT4gdG9yY2guVGVuc29yOgogICAgaW5wdXRfdGVuc29yID0gaW5wdXRfdGVuc29yLnJlc2hhcGUoLTEsIGRfaGlkZGVuKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCiAgICAKICAgICMgVE9ETzogdXNlIGN1ZGEgZ3JhcGg/CiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgYWxsb2NhdGUgdGVuc29yIHRpbWVyIikgYXMgdDoKICAgICMgQWxsb2NhdGUgdGVuc29yIAogICAgIyBUT0RPOiBwcmVhbGxvY2F0ZSB0ZW5zb3IKICAgIGV4cGVydDJ0b2tlbl9jb3VudCA9IHRvcmNoLmVtcHR5KHNpemU9KG5fcm91dGVkX2V4cGVydHMsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgd2l0aGluX2V4cGVydF9pbmRleCA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gPSB0b3JjaC56ZXJvcyhzaXplPShuX3JvdXRlZF9leHBlcnRzICsgMSwpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICAKICAgIHJlcGVhdGVkX3Rva2VucyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKICAgICMgZmZuMF9saHMgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgICMgZmZuMF9yaHMgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIGZmbjBfb3V0ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBmZm4xX291dCA9IHRvcmNoLmVtcHR5X2xpa2UocmVwZWF0ZWRfdG9rZW5zKQogICAgbW9lX291dCA9IHRvcmNoLmVtcHR5X2xpa2UoaW5wdXRfdGVuc29yKQogICAgIyBUT0RPOiBtdWx0aSBzdHJlYW0KICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSBwdHIgYXJyYXkiKSBhcyB0OgogICAgYl9wdHJzID0gdG9yY2gudGVuc29yKAogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0gKwogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0gKwogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgZGV2aWNlPXJlcGVhdGVkX3Rva2Vucy5kZXZpY2UsCiAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgKQogICAgYl9wdHJzMCA9IGJfcHRyc1s6bl9yb3V0ZWRfZXhwZXJ0c10KICAgIGJfcHRyczEgPSBiX3B0cnNbbl9yb3V0ZWRfZXhwZXJ0czoyKm5fcm91dGVkX2V4cGVydHNdCiAgICBiX3B0cnMyID0gYl9wdHJzWzIqbl9yb3V0ZWRfZXhwZXJ0czpdCgogICAgCiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2hhcmVkIGV4cGVydCB0aW1lciIpIGFzIHQ6CiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDEgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddICMgKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgICMgVE9ETzogaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgICMgVE9ETzogc2hhcmVkIGV4cGVydCBpbiBhIHNlcGFyYXRlIHN0cmVhbT8KICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgIHNoYXJlZF9leHBlcnRfZmZuMSA9IHNoYXJlZF9leHBlcnRfZmZuMCBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCiAgICAKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICByb3V0ZXIgdGltZXIiKSBhcyB0OgogICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICMgVE9ETzogZnVzZWQgbWF0bXVsICsgc29mdG1heCArIHRvcCBrID8gb3IgaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgIGxvZ2l0cyA9IHRvcmNoLm1hdG11bChpbnB1dF90ZW5zb3IsIHJvdXRlcl93ZWlnaHQudCgpKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9yb3V0ZWRfZXhwZXJ0cykKICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgIHNjb3JlcyA9IEYuc29mdG1heChsb2dpdHMsIGRpbT0tMSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fcm91dGVkX2V4cGVydHMpCiAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRpbT0tMSwgc29ydGVkPUZhbHNlKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgICAgCgogICAgIyB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGNhbGN1bGF0ZSBpbmRleCB0aW1lciIpIGFzIHQ6CiAgICAjIGV4cGVydDJ0b2tlbl9jb3VudCAobl9yb3V0ZWRfZXhwZXJ0cywpCiAgICAjIHdpdGhpbl9leHBlcnRfaW5kZXggKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleFsgKG5fcm91dGVkX2V4cGVydHMsICkgXSgKICAgICAgICB0b3BrX2luZGljZXMsCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQogICAgIyB0b2tlbjJpbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbIGxhbWJkYSBtZXRhIDogKHRyaXRvbi5jZGl2KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwpIF0oCiAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQoKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBzY2F0dGVyIHRpbWVyIikgYXMgdDoKICAgIHNjYXR0ZXJbIChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKSBdKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICBzZXFfbGVuLAogICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgZF9oaWRkZW4sCiAgICApCiAgICAKICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4KICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4wIHRpbWVyIikgYXMgdDogICAgCiAgICBncm91cF9nZW1tX1N3aUdsdVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2V4cGVydCwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgYSA9IHJlcGVhdGVkX3Rva2VucywKICAgICAgICBiX2Jhc2VfcHRyczAgPSBiX3B0cnMwLAogICAgICAgIGJfYmFzZV9wdHJzMSA9IGJfcHRyczEsCiAgICAgICAgYyA9IGZmbjBfb3V0LAogICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICBtYXhfbSA9IG1heF9tLAogICAgICAgIG4gPSBkX2V4cGVydCwKICAgICAgICBrID0gZF9oaWRkZW4sCiAgICAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgIyBCTE9DS19NPUJMT0NLX00sCiAgICAgICAgIyBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICApCiAgICAKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBmZm4xIHRpbWVyIikgYXMgdDoKICAgIGdyb3VwX2dlbW1bIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9oaWRkZW4sIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgIGEgPSBmZm4wX291dCwKICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczIsCiAgICAgICAgYyA9IGZmbjFfb3V0LAogICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuID0gZF9oaWRkZW4sCiAgICAgICAgayA9IGRfZXhwZXJ0LAogICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICMgQkxPQ0tfTT1CTE9DS19NLAogICAgICAgICMgQkxPQ0tfTj1CTE9DS19OLAogICAgICAgICMgQkxPQ0tfSz1CTE9DS19LLAogICAgKQogICAgCiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgd2VpZ2h0ZWQgc3VtIGdhdGhlciB0aW1lciIpIGFzIHQ6CiAgICB3ZWlnaHRlZF9zdW1fZ2F0aGVyWyBsYW1iZGEgbWV0YTogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBtZXRhWyJCTE9DS19TSVpFIl0pLCBiYXRjaF9zaXplICogc2VxX2xlbildKAogICAgICAgIGZmbjFfb3V0LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIHRvcGtfc2NvcmVzLAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgICAgICBtb2Vfb3V0LAogICAgICAgIGRfaGlkZGVuLAogICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgc2VxX2xlbiwKICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICMgQkxPQ0tfU0laRT1CTE9DS19TSVpFLAogICAgKQogICAgIyBzbGVlcCA4IG1zIAogICAgIyBiZW5jaG1hcmsgc3Vja3MgIQogICAgIyB0aW1lLnNsZWVwKDAuMDA4KQogICAgcmV0dXJuIG1vZV9vdXQucmVzaGFwZShiYXRjaF9zaXplLCBzZXFfbGVuLCBkX2hpZGRlbikgIyAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pCgoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIG91dHB1dCA9IG1vZV9mb3J3YXJkKGlucHV0X3RlbnNvciwgd2VpZ2h0cywgKipjb25maWcpCiAgICByZXR1cm4gb3V0cHV0Cg==
No newline at end of file
+ aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQppbXBvcnQgdGltZQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogNTEyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksICAgIAogICAgXSwKICAgIGtleT1bXSwKKQpAdHJpdG9uLmppdApkZWYgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBncmlkOiAobl9yb3V0ZWRfZXhwZXJ0cywgKQogICAgZXhwZXJ0X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIAogICAgdG90YWxfY291bnQgPSAwCiAgICBmb3IgaWR4IGluIHJhbmdlKDAsIHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIGlkeAogICAgICAgIG1hc2sgPSBvZmZzZXRzIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuCiAgICAgICAgdG9wa19pbmRpY2VzX2Jsb2NrID0gdGwubG9hZCh0b3BrX2luZGljZXMgKyBvZmZzZXRzLCBtYXNrPW1hc2ssIG90aGVyPS0xKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgaXNfY3VycmVudF9leHBlcnQgPSB0bC53aGVyZSh0b3BrX2luZGljZXNfYmxvY2sgPT0gZXhwZXJ0X2lkeCwgMSwgMCkgIyAoQkxPQ0tfU0laRSwgKQogICAgICAgIGN1cl9jdW1zdW0gPSB0bC5jdW1zdW0oaXNfY3VycmVudF9leHBlcnQsIGF4aXM9MCkgKyB0b3RhbF9jb3VudCAtIDEgI3NoaWZ0IGxlZnQgYnkgMQogICAgICAgIHRvdGFsX2NvdW50ICs9IHRsLnN1bShpc19jdXJyZW50X2V4cGVydCkKICAgICAgICAKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwud2hlcmUoaXNfY3VycmVudF9leHBlcnQsIGN1cl9jdW1zdW0sIC0xKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLCB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrLCAKICAgICAgICAgICAgbWFzaz0gKGlkeCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbikgYW5kIChpc19jdXJyZW50X2V4cGVydC50byh0bC5pbnQxKSkKICAgICAgICApCiAgICAgICAgCiAgICB0bC5zdG9yZShleHBlcnQydG9rZW5fY291bnQgKyBleHBlcnRfaWR4LCB0b3RhbF9jb3VudCkKCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDUxMiwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiAgICAgICAgICAgIG51bV9zdGFnZXM9MSwKICAgICAgICApLCAgICAKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGNhbGN1bGF0ZV90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlcywKICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICB0b2tlbjJpbmRleCwKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICB0b2tlbl9jb3VudCwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyB0b3BrX2luZGljZXM6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgdG9rZW4yaW5kZXg6ICh0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sICkgOiAoMSwgKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoY2Rpdih0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApCiAgICAKICAgICMgdGwuZGV2aWNlX2Fzc2VydChCTE9DS19TSVpFID49IG5fZXhwZXJ0c19wZXJfdG9rZW4gKyAxKQogICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICBleHBlcnQydG9rZW5fY291bnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIG90aGVyPTAsCiAgICApICMgKEJMT0NLX1NJWkUsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgaWYgdGwucHJvZ3JhbV9pZCgwKSA9PSAwOgogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPVsKICAgICAgICB0cml0b24uQ29uZmlnKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiQkxPQ0tfU0laRSI6IDEwMjQgKiA0LAogICAgICAgICAgICB9LAogICAgICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICAgICAgbnVtX3N0YWdlcz0xLAogICAgICAgICksCiAgICBdLAogICAga2V5PVtdLAopCkB0cml0b24uaml0CmRlZiBzY2F0dGVyKAogICAgaW5wdXRfdGVuc29yLAogICAgdG9rZW4yaW5kZXgsCiAgICByZXBlYXRlZF90b2tlbnMsCiAgICBiYXRjaF9zaXplLAogICAgc2VxX2xlbiwKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICBkX2hpZGRlbiwgCiAgICBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGlucHV0X3RlbnNvcjogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIHRva2VuMmluZGV4OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pIDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIDEpCiAgICAjIHJlcGVhdGVkX3Rva2VuczogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyBncmlkOiAobl9leHBlcnRzX3Blcl90b2tlbiwgc2VxX2xlbiwgYmF0Y2hfc2l6ZSkKICAgIGV4cGVydF9pZHggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBzZXFfaWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgYmF0Y2hfaWR4ID0gdGwucHJvZ3JhbV9pZCgyKQogICAgCiAgICB0b2tlbl9pZHggPSBiYXRjaF9pZHggKiBzZXFfbGVuICsgc2VxX2lkeAogICAgZHN0X2lkeCA9IHRsLmxvYWQodG9rZW4yaW5kZXggKyB0b2tlbl9pZHggKiBuX2V4cGVydHNfcGVyX3Rva2VuICsgZXhwZXJ0X2lkeCkKICAgIGZvciBpIGluIHJhbmdlKDAsIGRfaGlkZGVuLCBCTE9DS19TSVpFKToKICAgICAgICBvZmZzZXQgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyBpCiAgICAgICAgbWFzayA9IG9mZnNldCA8IGRfaGlkZGVuCiAgICAgICAgaW5wdXRfdGVuc29yX2Jsb2NrID0gdGwubG9hZCgKICAgICAgICAgICAgaW5wdXRfdGVuc29yICsgdG9rZW5faWR4ICogZF9oaWRkZW4gKyBvZmZzZXQsCiAgICAgICAgICAgIG1hc2s9bWFzaywKICAgICAgICApCiAgICAgICAgdGwuc3RvcmUoCiAgICAgICAgICAgIHJlcGVhdGVkX3Rva2VucyArIGRzdF9pZHggKiBkX2hpZGRlbiArIG9mZnNldCwKICAgICAgICAgICAgaW5wdXRfdGVuc29yX2Jsb2NrLAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZygKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDEyOCwKICAgICAgICAgICAgICAgICJCTE9DS19LIjogMzIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTIsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikKQHRyaXRvbi5qaXQKZGVmIGdyb3VwX2dlbW0oCiAgICBhLCBiX2Jhc2VfcHRycywgYywKICAgIG1fY3Vtc3VtLAogICAgbWF4X20sCiAgICBuLAogICAgaywKICAgIGdyb3VwX3NpemUsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19LOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX2Jhc2VfcHRyczogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoIHRyaXRvbi5jZGl2KG4sIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIGdyb3VwX3NpemUgKQogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX04KICAgIG1faWQgPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyID0gdGwubG9hZChiX2Jhc2VfcHRycyArIGdyb3VwX2lkKQogICAgaWYgZ3JvdXBfbV9zdGFydCArIG1faWQgKiBCTE9DS19NID49IGdyb3VwX21fZW5kOgogICAgICAgIHJldHVybgogICAgYV9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBhICsgZ3JvdXBfbV9zdGFydCAqIGssCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIDApLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19LKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBiX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGJhc2U9Z3JvdXBfYl9iYXNlX3B0ci50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtID0gdGwuemVyb3MoKEJMT0NLX00sIEJMT0NLX04pLCBkdHlwZT10bC5mbG9hdDMyKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgZm9yIGkgaW4gcmFuZ2UoMCwgaywgQkxPQ0tfSyk6CiAgICAgICAgIyBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsIDEpKSAjIChCTE9DS19NLCBCTE9DS19LKQogICAgICAgICMgYl9ibG9jayA9IHRsLmxvYWQoYl9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoQkxPQ0tfSywgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsICkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgYl9ibG9jayA9IHRsLmxvYWQoYl9ibG9ja19wdHIsICkgIyAoQkxPQ0tfSywgQkxPQ0tfTikKICAgICAgICBhY2N1bSArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jaykgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBhY2N1bS50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgYWNjdW0udG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCApLCApCgpAdHJpdG9uLmppdApkZWYgc3dpZ2x1KHgsIHkpOgogICAgbG9nXzJfZTogdGwuY29uc3RleHByID0gMS40NDI2OTUwNDEKICAgIGV4cF94ID0gdGwuZXhwMiggLWxvZ18yX2UgKiB4KQogICAgcmV0dXJuIDEuIC8gKDEuICsgZXhwX3gpICogeCAqIHkKCgojIEB0cml0b24uYXV0b3R1bmUoCiMgICAgIGNvbmZpZ3M9WwojICAgICAgICAgdHJpdG9uLkNvbmZpZygKIyAgICAgICAgICAgICB7CiMgICAgICAgICAgICAgICAgICJCTE9DS19NIjogMTI4LAojICAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAojICAgICAgICAgICAgICAgICAiQkxPQ0tfSyI6IDMyLAojICAgICAgICAgICAgIH0sCiMgICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiMgICAgICAgICAgICAgbnVtX3N0YWdlcz0yLAojICAgICAgICAgKSwKIyAgICAgXSwKIyAgICAga2V5PVtdLAojICkKQHRyaXRvbi5qaXQKZGVmIGdlbW1fU3dpR2x1KAogICAgYSwgCiAgICBiMCwgYjEsIAogICAgYywKICAgIG0sCiAgICBuLAogICAgaywKICAgIEJMT0NLX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX0s6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgYTogKG0sIGspIDogKGssIDEpCiAgICAjIGIwOiAoaywgbikgOiAobiwgMSkKICAgICMgYjE6IChrLCBuKSA6IChuLCAxKQogICAgIyBjOiAobSwgbikgOiAobiwgMSkKICAgICMgZ3JpZDogKCB0cml0b24uY2RpdihtLCBCTE9DS19NKSwgdHJpdG9uLmNkaXYobiwgQkxPQ0tfTikgKQogICAgbV9zdGFydCA9IHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19NCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgxKSAqIEJMT0NLX04KICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSwKICAgICAgICBzaGFwZT0obSwgayksCiAgICAgICAgc3RyaWRlcz0oaywgMSksCiAgICAgICAgb2Zmc2V0cz0obV9zdGFydCwgMCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX0spLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkgIyAoQkxPQ0tfTSwgQkxPQ0tfSykKICAgIGJfYmxvY2tfcHRyMCA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGIwLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKSAjIChCTE9DS19LLCBCTE9DS19OKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYjEsCiAgICAgICAgc2hhcGU9KGssIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KDAsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19LLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBjX2Jsb2NrX3B0ciA9IHRsLm1ha2VfYmxvY2tfcHRyKAogICAgICAgIGMsCiAgICAgICAgc2hhcGU9KG0sIG4pLAogICAgICAgIHN0cmlkZXM9KG4sIDEpLAogICAgICAgIG9mZnNldHM9KG1fc3RhcnQsIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBhY2N1bTAgPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBhY2N1bTEgPSB0bC56ZXJvcygoQkxPQ0tfTSwgQkxPQ0tfTiksIGR0eXBlPXRsLmZsb2F0MzIpICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICBmb3IgaSBpbiByYW5nZSgwLCBrLCBCTE9DS19LKToKICAgICAgICAjIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgIyBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgIyBiX2Jsb2NrMSA9IHRsLmxvYWQoYl9ibG9ja19wdHIxLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCApKSAjIChCTE9DS19NLCBCTE9DS19LKQogICAgICAgIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsICkgIyAoQkxPQ0tfSywgQkxPQ0tfTikKICAgICAgICBiX2Jsb2NrMSA9IHRsLmxvYWQoYl9ibG9ja19wdHIxLCApICMgKEJMT0NLX0ssIEJMT0NLX04pCiAgICAgICAgYWNjdW0wICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMCkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhY2N1bTEgKz0gdGwuZG90KGFfYmxvY2ssIGJfYmxvY2sxKSAjIChCTE9DS19NLCBCTE9DS19OKQogICAgICAgIAogICAgICAgIGFfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShhX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oMCwgQkxPQ0tfSykpCiAgICAgICAgYl9ibG9ja19wdHIwID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0cjAsIG9mZnNldHM9KEJMT0NLX0ssIDApKQogICAgICAgIGJfYmxvY2tfcHRyMSA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIxLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgIG91dCA9IHN3aWdsdShhY2N1bTAsIGFjY3VtMSkKICAgICMgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsIDEpLCApCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgb3V0LnRvKHRsLmZsb2F0MTYpLCBib3VuZGFyeV9jaGVjaz0oMCwgKSwgKQogICAgCiMgQHRyaXRvbi5hdXRvdHVuZSgKIyAgICAgY29uZmlncz1bCiMgICAgICAgICB0cml0b24uQ29uZmlnKAojICAgICAgICAgICAgIHsKIyAgICAgICAgICAgICAgICAgIkJMT0NLX00iOiAxMjgsCiMgICAgICAgICAgICAgICAgICJCTE9DS19OIjogNjQsCiMgICAgICAgICAgICAgICAgICJCTE9DS19LIjogMzIsCiMgICAgICAgICAgICAgfSwKIyAgICAgICAgICAgICBudW1fd2FycHM9NCwKIyAgICAgICAgICAgICBudW1fc3RhZ2VzPTIsCiMgICAgICAgICApLAojICAgICBdLAojICAgICBrZXk9W10sCiMgKQpAdHJpdG9uLmppdApkZWYgZ3JvdXBfZ2VtbV9Td2lHbHUoCiAgICBhLCAKICAgIGJfYmFzZV9wdHJzMCwgYl9iYXNlX3B0cnMxLCAKICAgIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnMwOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGJfYmFzZV9wdHJzMTogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoIHRyaXRvbi5jZGl2KG4sIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIGdyb3VwX3NpemUgKQogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDIpCiAgICBuX3N0YXJ0ID0gdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX04KICAgIG1faWQgPSB0bC5wcm9ncmFtX2lkKDEpCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyMCA9IHRsLmxvYWQoYl9iYXNlX3B0cnMwICsgZ3JvdXBfaWQpCiAgICBncm91cF9iX2Jhc2VfcHRyMSA9IHRsLmxvYWQoYl9iYXNlX3B0cnMxICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIwID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMC50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtMCA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGFjY3VtMSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgICMgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2sxID0gdGwubG9hZChiX2Jsb2NrX3B0cjEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCApCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKICAgIAojIEB0cml0b24uYXV0b3R1bmUoCiMgICAgIGNvbmZpZ3M9WwojICAgICAgICAgdHJpdG9uLkNvbmZpZygKIyAgICAgICAgICAgICB7CiMgICAgICAgICAgICAgICAgICJCTE9DS19NIjogMTI4LAojICAgICAgICAgICAgICAgICAiQkxPQ0tfTiI6IDY0LAojICAgICAgICAgICAgICAgICAiQkxPQ0tfSyI6IDMyLAojICAgICAgICAgICAgIH0sCiMgICAgICAgICAgICAgbnVtX3dhcnBzPTQsCiMgICAgICAgICAgICAgbnVtX3N0YWdlcz0yLAojICAgICAgICAgKSwKIyAgICAgXSwKIyAgICAga2V5PVtdLAojICkKQHRyaXRvbi5qaXQKZGVmIGdyb3VwX2dlbW1fU3dpR2x1X3NodWZmbGUoCiAgICBhLCAKICAgIGJfYmFzZV9wdHJzMCwgYl9iYXNlX3B0cnMxLCAKICAgIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnMwOiAoZ3JvdXBfc2l6ZSwgKSA6ICgxLCApCiAgICAjIGJfYmFzZV9wdHJzMTogKGdyb3VwX3NpemUsICkgOiAoMSwgKQogICAgIyBiOiAoaywgbikgOiAobiwgMSkKICAgICMgYzogKHRvdGFsX20sIG4pIDogKG4sIDEpCiAgICAjIG1fY3Vtc3VtOiAoZ3JvdXBfc2l6ZSArIDEsICkgOiAoMSwgKQogICAgIyBncmlkOiAoOCwgdHJpdG9uLmNkaXYobiwgQkxPQ0tfTiksIGNkaXYobWF4X20sIEJMT0NLX00pICogY2Rpdihncm91cF9zaXplLCA4KSkKICAgIFhDRF9DTlQgPSA4CiAgICBtX2Jsb2NrX2NudCA9IHRsLmNkaXYobWF4X20sIEJMT0NLX00pCiAgICAKICAgIAogICAgZ3JvdXBfaWQgPSB0bC5wcm9ncmFtX2lkKDApICsgdGwucHJvZ3JhbV9pZCgyKSAvLyBtX2Jsb2NrX2NudCAqIFhDRF9DTlQKICAgIG5fc3RhcnQgPSB0bC5wcm9ncmFtX2lkKDEpICogQkxPQ0tfTgogICAgbV9pZCA9IHRsLnByb2dyYW1faWQoMikgJSBtX2Jsb2NrX2NudAogICAgCiAgICAKICAgIGdyb3VwX21fc3RhcnQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQpCiAgICBncm91cF9tX2VuZCA9IHRsLmxvYWQobV9jdW1zdW0gKyBncm91cF9pZCArIDEpCiAgICBncm91cF9iX2Jhc2VfcHRyMCA9IHRsLmxvYWQoYl9iYXNlX3B0cnMwICsgZ3JvdXBfaWQpCiAgICBncm91cF9iX2Jhc2VfcHRyMSA9IHRsLmxvYWQoYl9iYXNlX3B0cnMxICsgZ3JvdXBfaWQpCiAgICBpZiBncm91cF9tX3N0YXJ0ICsgbV9pZCAqIEJMT0NLX00gPj0gZ3JvdXBfbV9lbmQ6CiAgICAgICAgcmV0dXJuCiAgICAKICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIwID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMC50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIxID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1ncm91cF9iX2Jhc2VfcHRyMS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpLAogICAgICAgIHNoYXBlPShrLCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPSgwLCBuX3N0YXJ0KSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfSywgQkxPQ0tfTiksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgY19ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWMgKyBncm91cF9tX3N0YXJ0ICogbiwKICAgICAgICBzaGFwZT0oZ3JvdXBfbV9lbmQgLSBncm91cF9tX3N0YXJ0LCBuKSwKICAgICAgICBzdHJpZGVzPShuLCAxKSwKICAgICAgICBvZmZzZXRzPShtX2lkICogQkxPQ0tfTSwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX00sIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGFjY3VtMCA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGFjY3VtMSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgICMgYV9ibG9jayA9IHRsLmxvYWQoYV9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2swID0gdGwubG9hZChiX2Jsb2NrX3B0cjAsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICAjIGJfYmxvY2sxID0gdGwubG9hZChiX2Jsb2NrX3B0cjEsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkKICAgICAgICBhX2Jsb2NrID0gdGwubG9hZChhX2Jsb2NrX3B0ciwgYm91bmRhcnlfY2hlY2s9KDAsKSkKICAgICAgICBiX2Jsb2NrMCA9IHRsLmxvYWQoYl9ibG9ja19wdHIwLCApCiAgICAgICAgYl9ibG9jazEgPSB0bC5sb2FkKGJfYmxvY2tfcHRyMSwgKQogICAgICAgIGFjY3VtMCArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jazApICMgKEJMT0NLX00sIEJMT0NLX04pCiAgICAgICAgYWNjdW0xICs9IHRsLmRvdChhX2Jsb2NrLCBiX2Jsb2NrMSkgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyMCA9IHRsLmFkdmFuY2UoYl9ibG9ja19wdHIwLCBvZmZzZXRzPShCTE9DS19LLCAwKSkKICAgICAgICBiX2Jsb2NrX3B0cjEgPSB0bC5hZHZhbmNlKGJfYmxvY2tfcHRyMSwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICBvdXQgPSBzd2lnbHUoYWNjdW0wLCBhY2N1bTEpCiAgICAjIHRsLnN0b3JlKGNfYmxvY2tfcHRyLCBvdXQudG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQogICAgdGwuc3RvcmUoY19ibG9ja19wdHIsIG91dC50byh0bC5mbG9hdDE2KSwgYm91bmRhcnlfY2hlY2s9KDAsICksICkKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJCTE9DS19TSVpFIjogMTAyNCAqIDgsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG51bV93YXJwcz00LAogICAgICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICAgICAgKSwKICAgIF0sCiAgICBrZXk9W10sCikgICAgICAgICAgIApAdHJpdG9uLmppdApkZWYgd2VpZ2h0ZWRfc3VtX2dhdGhlcigKICAgIGZmbjFfb3V0LAogICAgdG9rZW4yaW5kZXgsCiAgICB0b3BrX3Njb3JlcywKICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgIG1vZV9vdXQsCiAgICBkX2hpZGRlbiwKICAgIGJhdGNoX3NpemUsCiAgICBzZXFfbGVuLAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgZmZuMV9vdXQ6IChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgdG9wa19zY29yZXM6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgc2hhcmVkX2V4cGVydF9mZm4xOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgbW9lX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIGdyaWQ6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgQkxPQ0tfU0laRSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKQogICAgCiAgICBzZWdtZW50X2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHRva2VuX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIAogICAgb2Zmc2V0cyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSArIHNlZ21lbnRfaWR4ICogQkxPQ0tfU0laRQogICAgbWFzayA9IG9mZnNldHMgPCBkX2hpZGRlbgogICAgCiAgICBkYXRhID0gdGwubG9hZCgKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAgZm9yIGkgaW4gcmFuZ2Uobl9leHBlcnRzX3Blcl90b2tlbik6CiAgICAgICAgd2VpZ2h0ID0gdGwubG9hZCh0b3BrX3Njb3JlcyArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGluZGV4ID0gdGwubG9hZCh0b2tlbjJpbmRleCArIHRva2VuX2lkeCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4gKyBpKQogICAgICAgIGZmbjFfb3V0X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICAgICAgZmZuMV9vdXQgKyBpbmRleCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKICAgICAgICBkYXRhICs9IHdlaWdodCAqIGZmbjFfb3V0X2Jsb2NrCiAgICB0bC5zdG9yZSgKICAgICAgICBtb2Vfb3V0ICsgdG9rZW5faWR4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgIGRhdGEsCiAgICAgICAgbWFzaz1tYXNrLAogICAgKQogICAKIyBjb25maWc6IHsnZF9oaWRkZW4nOiA3MTY4LCAnZF9leHBlcnQnOiAyMDQ4LCAnbl9yb3V0ZWRfZXhwZXJ0cyc6IDMyLCAnbl9zaGFyZWRfZXhwZXJ0cyc6IDEsICduX2V4cGVydHNfcGVyX3Rva2VuJzogNCwgJ2JhdGNoX3NpemUnOiAxLCAnc2VxX2xlbic6IDIwNDh9CiMgaW5wdXRfdGVuc29yIGxheW91dDogKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiAqIHNlcV9sZW4sIGRfaGlkZGVuLCAxKQojIHJvdXRlci53ZWlnaHQgbGF5b3V0OiAobl9yb3V0ZWRfZXhwZXJ0cywgIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBleHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQpIDogKGRfZXhwZXJ0LCAxKQojIGV4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQsIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMC53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykgOiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4xLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjIud2VpZ2h0IGxheW91dDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQoKY2xhc3MgVGltZXI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWw6IHN0cik6CiAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCiAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQogICAgICAgIHNlbGYuZW5kX3RpbWUgPSBOb25lCiAgICAgICAgc2VsZi5pbnRlcnZhbCA9IE5vbmUKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkgICMgRW5zdXJlIGFsbCBwcmV2aW91cyBDVURBIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlCiAgICAgICAgIyBzZWxmLnN0YXJ0ID0gdGltZS50aW1lKCkKICAgICAgICByZXR1cm4gc2VsZgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKICAgICAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgICAgICMgc2VsZi5lbmQgPSB0aW1lLnRpbWUoKQogICAgICAgICMgc2VsZi5pbnRlcnZhbCA9IChzZWxmLmVuZCAtIHNlbGYuc3RhcnQpICogMTAwMCAjIGluIG1zCiAgICAgICAgIyBwcmludChmIntzZWxmLmxhYmVsfToge3NlbGYuaW50ZXJ2YWw6LjRmfSBtcyIpCiAgICAgICAgcmV0dXJuIEZhbHNlCgpAdG9yY2guY29tcGlsZQpkZWYgc2hhcmVkX2V4cGVydF9mZm4oCiAgICBpbnB1dF90ZW5zb3I6IHRvcmNoLlRlbnNvciwKICAgIHNoYXJlZF9leHBlcnRfd2VpZ2h0MDogdG9yY2guVGVuc29yLAogICAgc2hhcmVkX2V4cGVydF93ZWlnaHQxOiB0b3JjaC5UZW5zb3IsCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDI6IHRvcmNoLlRlbnNvciwKKToKICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgIHNoYXJlZF9leHBlcnRfZmZuMSA9IHNoYXJlZF9leHBlcnRfZmZuMCBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCiAgICByZXR1cm4gc2hhcmVkX2V4cGVydF9mZm4xCgpkZWYgbW9lX2ZvcndhcmQoCiAgICBpbnB1dF90ZW5zb3I6IHRvcmNoLlRlbnNvciwKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLAogICAgZF9oaWRkZW46IGludCwKICAgIGRfZXhwZXJ0OiBpbnQsCiAgICBuX3JvdXRlZF9leHBlcnRzOiBpbnQsCiAgICBuX3NoYXJlZF9leHBlcnRzOiBpbnQsCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuOiBpbnQsCiAgICBiYXRjaF9zaXplOiBpbnQsCiAgICBzZXFfbGVuOiBpbnQKKSAtPiB0b3JjaC5UZW5zb3I6CiAgICBpbnB1dF90ZW5zb3IgPSBpbnB1dF90ZW5zb3IucmVzaGFwZSgtMSwgZF9oaWRkZW4pICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikKICAgIAogICAgIyBUT0RPOiB1c2UgY3VkYSBncmFwaD8KICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBhbGxvY2F0ZSB0ZW5zb3IgdGltZXIiKSBhcyB0OgogICAgIyBBbGxvY2F0ZSB0ZW5zb3IgCiAgICAjIFRPRE86IHByZWFsbG9jYXRlIHRlbnNvcgogICAgZXhwZXJ0MnRva2VuX2NvdW50ID0gdG9yY2guZW1wdHkoc2l6ZT0obl9yb3V0ZWRfZXhwZXJ0cywpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICB0b2tlbjJpbmRleCA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSA9IHRvcmNoLnplcm9zKHNpemU9KG5fcm91dGVkX2V4cGVydHMgKyAxLCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgIAogICAgcmVwZWF0ZWRfdG9rZW5zID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCgogICAgIyBmZm4wX2xocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgIyBmZm4wX3JocyA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9leHBlcnQpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgZmZuMF9vdXQgPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIGZmbjFfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShyZXBlYXRlZF90b2tlbnMpCiAgICBtb2Vfb3V0ID0gdG9yY2guZW1wdHlfbGlrZShpbnB1dF90ZW5zb3IpCiAgICAjIFRPRE86IG11bHRpIHN0cmVhbQogICAgIyB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGFsbG9jYXRlIHB0ciBhcnJheSIpIGFzIHQ6CiAgICBiX3B0cnMgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSArCiAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSArCiAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSwKICAgICAgICBkZXZpY2U9cmVwZWF0ZWRfdG9rZW5zLmRldmljZSwKICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICApCiAgICBiX3B0cnMwLCBiX3B0cnMxLCBiX3B0cnMyID0gdG9yY2guc3BsaXQoYl9wdHJzLCBuX3JvdXRlZF9leHBlcnRzKQogICAgIyBiX3B0cnMwID0gYl9wdHJzWzpuX3JvdXRlZF9leHBlcnRzXQogICAgIyBiX3B0cnMxID0gYl9wdHJzW25fcm91dGVkX2V4cGVydHM6MipuX3JvdXRlZF9leHBlcnRzXQogICAgIyBiX3B0cnMyID0gYl9wdHJzWzIqbl9yb3V0ZWRfZXhwZXJ0czpdCgogICAgCiAgICAjIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgc2hhcmVkIGV4cGVydCB0aW1lciIpIGFzIHQ6CiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDEgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddICMgKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgICMgVE9ETzogaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgICMgVE9ETzogc2hhcmVkIGV4cGVydCBpbiBhIHNlcGFyYXRlIHN0cmVhbT8KICAgICMgcnVuIHNoYXJlZCBleHBlcnQgZmZuIGluIGEgc2VwYXJhdGUgc3RyZWFtCiAgICBzaGFyZWRfZXhwZXJ0X2ZmbjAgPSBGLnNpbHUoaW5wdXRfdGVuc29yIEAgc2hhcmVkX2V4cGVydF93ZWlnaHQwKSAqIChpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEgPSBzaGFyZWRfZXhwZXJ0X2ZmbjAgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgCiAgICAKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICByb3V0ZXIgdGltZXIiKSBhcyB0OgogICAgcm91dGVyX3dlaWdodCA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSAjIChuX3JvdXRlZF9leHBlcnRzLCBkX2hpZGRlbikKICAgICMgVE9ETzogZnVzZWQgbWF0bXVsICsgc29mdG1heCArIHRvcCBrID8gb3IgaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgIGxvZ2l0cyA9IHRvcmNoLm1hdG11bChpbnB1dF90ZW5zb3IsIHJvdXRlcl93ZWlnaHQudCgpKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9yb3V0ZWRfZXhwZXJ0cykKICAgICMgVE9ETzogZnVzZWQgc29mdG1heCArIHRvcCBrIGh0dHBzOi8vZ2l0aHViLmNvbS9zZ2wtcHJvamVjdC9zZ2xhbmcvYmxvYi9mYmE4ZWNjZDdlYmU0MWJiZGJmNzBhYjNiNmEyZGYxODM1ZjhiNTMyL3NnbC1rZXJuZWwvY3NyYy90b3JjaF9leHRlbnNpb25fcm9jbS5jYyNMNjUKICAgIHNjb3JlcyA9IEYuc29mdG1heChsb2dpdHMsIGRpbT0tMSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fcm91dGVkX2V4cGVydHMpCiAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRpbT0tMSwgc29ydGVkPUZhbHNlKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgICAgCgogICAgIyB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGNhbGN1bGF0ZSBpbmRleCB0aW1lciIpIGFzIHQ6CiAgICAjIGV4cGVydDJ0b2tlbl9jb3VudCAobl9yb3V0ZWRfZXhwZXJ0cywpCiAgICAjIHdpdGhpbl9leHBlcnRfaW5kZXggKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgY2FsY3VsYXRlX2V4cGVydDJ0b2tlbl9jb3VudF9hbmRfd2l0aGluX2V4cGVydF9pbmRleFsgKG5fcm91dGVkX2V4cGVydHMsICkgXSgKICAgICAgICB0b3BrX2luZGljZXMsCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXgsCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQogICAgIyB0b2tlbjJpbmRleCAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pCiAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbIGxhbWJkYSBtZXRhIDogKHRyaXRvbi5jZGl2KGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwpIF0oCiAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQoKICAgICMgd2l0aCBUaW1lcihsYWJlbD1mIih7YmF0Y2hfc2l6ZX0sIHtzZXFfbGVufSk6ICBzY2F0dGVyIHRpbWVyIikgYXMgdDoKICAgIHNjYXR0ZXJbIChuX2V4cGVydHNfcGVyX3Rva2VuLCBzZXFfbGVuLCBiYXRjaF9zaXplKSBdKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYmF0Y2hfc2l6ZSwKICAgICAgICBzZXFfbGVuLAogICAgICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgZF9oaWRkZW4sCiAgICApCiAgICAKICAgIG1heF9tID0gYmF0Y2hfc2l6ZSAqIHNlcV9sZW4KICAgIEJMT0NLX01fbGlzdCA9IFszMiwgNjQsIDEyOCwgXQogICAgQkxPQ0tfTl9saXN0ID0gWzMyLCA2NCwgMTI4LCBdCiAgICBCTE9DS19LX2xpc3QgPSBbMzIsIDY0LCAxMjgsIF0KICAgIG51bV93YXJwc19saXN0ID0gWzIsIDQsIDgsIF0KICAgIHN0YWdlc19saXN0ID0gWzEsIDIsIF0KICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IHRvcmNoLmVtcHR5KAogICAgICAgIHNpemU9KGlucHV0X3RlbnNvci5zaGFwZVswXSwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSwKICAgICAgICBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwKICAgICAgICBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUsCiAgICApCiAgICAjIGZvciBCTE9DS19NIGluIEJMT0NLX01fbGlzdDoKICAgICMgICAgIGZvciBCTE9DS19OIGluIEJMT0NLX05fbGlzdDoKICAgICMgICAgICAgICBmb3IgQkxPQ0tfSyBpbiBCTE9DS19LX2xpc3Q6CiAgICAjICAgICAgICAgICAgIGZvciBudW1fd2FycHMgaW4gbnVtX3dhcnBzX2xpc3Q6CiAgICAjICAgICAgICAgICAgICAgICBmb3Igc3RhZ2VzIGluIHN0YWdlc19saXN0OgogICAgIyAgICAgICAgICAgICAgICAgICAgIGlmIChCTE9DS19NICogQkxPQ0tfSyArIEJMT0NLX04gKiBCTE9DS19LKSAqIHN0YWdlcyAqIDIgPj0gMTAyNCAqIDY0OgogICAgIyAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgIyAgICAgICAgICAgICAgICAgICAgIHdpdGggVGltZXIobGFiZWw9ZiIoe2JhdGNoX3NpemV9LCB7c2VxX2xlbn0pOiAgQkxPQ0tfTT17QkxPQ0tfTX0sIEJMT0NLX049e0JMT0NLX059LCBCTE9DS19LPXtCTE9DS19LfSwgbnVtX3dhcnBzPXtudW1fd2FycHN9LCBzdGFnZXM9e3N0YWdlc30gZ3JvdXBfZ2VtbV9Td2lHbHUgdGltZXIiKSBhcyB0OgogICAgZ3JvdXBfZ2VtbV9Td2lHbHVbIGxhbWJkYSBtZXRhOiAodHJpdG9uLmNkaXYoZF9leHBlcnQsIG1ldGFbIkJMT0NLX04iXSksIHRyaXRvbi5jZGl2KG1heF9tLCBtZXRhWyJCTE9DS19NIl0pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgIGEgPSByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYl9iYXNlX3B0cnMwID0gYl9wdHJzMCwKICAgICAgICBiX2Jhc2VfcHRyczEgPSBiX3B0cnMxLAogICAgICAgIGMgPSBmZm4wX291dCwKICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgbWF4X20gPSBtYXhfbSwKICAgICAgICBuID0gZF9leHBlcnQsCiAgICAgICAgayA9IGRfaGlkZGVuLAogICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIEJMT0NLX009MTI4LAogICAgICAgIEJMT0NLX049NjQsCiAgICAgICAgQkxPQ0tfSz02NCwKICAgICAgICBudW1fd2FycHM9NCwKICAgICAgICBudW1fc3RhZ2VzPTEsCiAgICApIAogICAgIyBncm91cF9nZW1tX1N3aUdsdVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2V4cGVydCwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAjICAgICBhID0gcmVwZWF0ZWRfdG9rZW5zLAogICAgIyAgICAgYl9iYXNlX3B0cnMwID0gYl9wdHJzMCwKICAgICMgICAgIGJfYmFzZV9wdHJzMSA9IGJfcHRyczEsCiAgICAjICAgICBjID0gZmZuMF9vdXQsCiAgICAjICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAjICAgICBtYXhfbSA9IG1heF9tLAogICAgIyAgICAgbiA9IGRfZXhwZXJ0LAogICAgIyAgICAgayA9IGRfaGlkZGVuLAogICAgIyAgICAgZ3JvdXBfc2l6ZSA9IG5fcm91dGVkX2V4cGVydHMsCiAgICAjICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICMgICAgICMgQkxPQ0tfTj1CTE9DS19OLAogICAgIyAgICAgIyBCTE9DS19LPUJMT0NLX0ssCiAgICAjICkKICAgIAogICAgIyB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIGZmbjEgdGltZXIiKSBhcyB0OgogICAgZ3JvdXBfZ2VtbVsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgbWV0YVsiQkxPQ0tfTiJdKSwgdHJpdG9uLmNkaXYobWF4X20sIG1ldGFbIkJMT0NLX00iXSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgYSA9IGZmbjBfb3V0LAogICAgICAgIGJfYmFzZV9wdHJzID0gYl9wdHJzMiwKICAgICAgICBjID0gZmZuMV9vdXQsCiAgICAgICAgbV9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgICAgIG1heF9tID0gbWF4X20sCiAgICAgICAgbiA9IGRfaGlkZGVuLAogICAgICAgIGsgPSBkX2V4cGVydCwKICAgICAgICBncm91cF9zaXplID0gbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICAjIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICAjIEJMT0NLX049QkxPQ0tfTiwKICAgICAgICAjIEJMT0NLX0s9QkxPQ0tfSywKICAgICkKICAgIAogICAgIyB3aXRoIFRpbWVyKGxhYmVsPWYiKHtiYXRjaF9zaXplfSwge3NlcV9sZW59KTogIHdlaWdodGVkIHN1bSBnYXRoZXIgdGltZXIiKSBhcyB0OgogICAgd2VpZ2h0ZWRfc3VtX2dhdGhlclsgbGFtYmRhIG1ldGE6ICh0cml0b24uY2RpdihkX2hpZGRlbiwgbWV0YVsiQkxPQ0tfU0laRSJdKSwgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4pXSgKICAgICAgICBmZm4xX291dCwKICAgICAgICB0b2tlbjJpbmRleCwKICAgICAgICB0b3BrX3Njb3JlcywKICAgICAgICBzaGFyZWRfZXhwZXJ0X2ZmbjEsCiAgICAgICAgbW9lX291dCwKICAgICAgICBkX2hpZGRlbiwKICAgICAgICBiYXRjaF9zaXplLAogICAgICAgIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICAjIEJMT0NLX1NJWkU9QkxPQ0tfU0laRSwKICAgICkKICAgICMgc2xlZXAgOCBtcyAKICAgICMgYmVuY2htYXJrIHN1Y2tzICEKICAgICMgdGltZS5zbGVlcCgwLjAwOCkKICAgIHJldHVybiBtb2Vfb3V0LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pICMgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBvdXRwdXQgPSBtb2VfZm9yd2FyZChpbnB1dF90ZW5zb3IsIHdlaWdodHMsICoqY29uZmlnKQogICAgcmV0dXJuIG91dHB1dAoKIyBwcmUgYWxsb2NhdGUgdGVuc29yCnNpemUgPSAzMiAqICgyKiozMCkKdGVuc29yID0gdG9yY2guZW1wdHkoc2l6ZSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykKZGVsIHRlbnNvcgoKCgoKCgoKCmRlZiBteV9nZW5lcmF0ZV9pbnB1dCgKICAgIGRoaWRkZW46IGludCwKICAgIGRleHBlcnQ6IGludCwKICAgIG5yb3V0ZWRleHBlcnRzOiBpbnQsCiAgICBuc2hhcmVkZXhwZXJ0czogaW50LAogICAgbmV4cGVydHNwZXJ0b2tlbjogaW50LAogICAgYnM6IGludCwKICAgIHNlcWxlbjogaW50LAogICAgc2VlZDogaW50CikgLT4gaW5wdXRfdDoKCiAgICAjIFJlYWxseSBkdW1iIGJ1dCBmb3Igbm93IF8gaXNuJ3QgcGFyc2luZyBjb3JyZWN0bHkuCiAgICBkX2hpZGRlbiA9IGRoaWRkZW4KICAgIGRfZXhwZXJ0ID0gZGV4cGVydAogICAgbl9yb3V0ZWRfZXhwZXJ0cyA9IG5yb3V0ZWRleHBlcnRzCiAgICBuX3NoYXJlZF9leHBlcnRzID0gbnNoYXJlZGV4cGVydHMKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4gPSBuZXhwZXJ0c3BlcnRva2VuCiAgICBiYXRjaF9zaXplID0gYnMKICAgIHNlcV9sZW4gPSBzZXFsZW4KCiAgICBjb25maWcgPSB7CiAgICAgICAgImRfaGlkZGVuIjogZF9oaWRkZW4sCiAgICAgICAgImRfZXhwZXJ0IjogZF9leHBlcnQsCiAgICAgICAgIm5fcm91dGVkX2V4cGVydHMiOiBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICJuX3NoYXJlZF9leHBlcnRzIjogbl9zaGFyZWRfZXhwZXJ0cywKICAgICAgICAibl9leHBlcnRzX3Blcl90b2tlbiI6IG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgImJhdGNoX3NpemUiOiBiYXRjaF9zaXplLAogICAgICAgICJzZXFfbGVuIjogc2VxX2xlbiwKICAgIH0KCiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQoKICAgIG51bV9leHBlcnRzID0gbl9yb3V0ZWRfZXhwZXJ0cwogICAgZXhwZXJ0X2RpbSA9IGRfZXhwZXJ0CiAgICB3ZWlnaHRzID0ge30KCiAgICBpbnB1dF90ZW5zb3IgPSB0b3JjaC5yYW5kbigKICAgICAgICAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApLmNvbnRpZ3VvdXMoKQoKICAgICMgSW5pdGlhbGl6ZSByb3V0ZXIgd2VpZ2h0cwogICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKG51bV9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChleHBlcnRfZGltLCBkX2hpZGRlbiksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQoKICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10gPSB0b3JjaC5yYW5kbigKICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzKSwKICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgZ2VuZXJhdG9yPWdlbgogICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cykKICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10gPSB0b3JjaC5yYW5kbigKICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzKSwKICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgZ2VuZXJhdG9yPWdlbgogICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cykKICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10gPSB0b3JjaC5yYW5kbigKICAgICAgICAoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMsIGRfaGlkZGVuKSwKICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgZ2VuZXJhdG9yPWdlbgogICAgKSAvIG1hdGguc3FydChkX2hpZGRlbikKCiAgICByZXR1cm4gKGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnKQppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIyB0b3JjaC5jdWRhLnNldF9kZXZpY2UoMSkKICAgIGNvbmZpZ3MgPSBbCiAgICAgICAgKDcxNjgsIDIwNDgsIDMyLCAxLCA0LCAxLCAyMDQ4LCA5MzcxKSwKICAgICAgICAoNzE2OCwgMjA0OCwgMzIsIDEsIDQsIDEsIDgxOTIsIDEyMTIpLAogICAgXQogICAgIyBmb3IgY29uZmlnX2RpY3QgaW4gY29uZmlnczoKICAgIGZvciBkaGlkZGVuLCBkZXhwZXJ0LCBucm91dGVkZXhwZXJ0cywgbnNoYXJlZGV4cGVydHMsIG5leHBlcnRzcGVydG9rZW4sIGJzLCBzZXFsZW4sIHNlZWQgaW4gY29uZmlnczoKCiAgICAgICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBteV9nZW5lcmF0ZV9pbnB1dCgKICAgICAgICAgICAgZGhpZGRlbiwKICAgICAgICAgICAgZGV4cGVydCwKICAgICAgICAgICAgbnJvdXRlZGV4cGVydHMsCiAgICAgICAgICAgIG5zaGFyZWRleHBlcnRzLAogICAgICAgICAgICBuZXhwZXJ0c3BlcnRva2VuLAogICAgICAgICAgICBicywKICAgICAgICAgICAgc2VxbGVuLAogICAgICAgICAgICBzZWVkCiAgICAgICAgKQogICAgICAgIA==
No newline at end of file

Best evidence level for this revision: reported

JSON