Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 28924

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

group_gemm_functional.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-28924?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
19.1ms
#67 of 118
2025-05-29
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
40.7ms
#67 of 118
2025-05-29

Reported · How evidence levels are derived →

Source and license

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

Kernel source

group_gemm_functional.py1 lines
ciIiIgpVc2VzIGEgZ3JvdXAgZ2VtbSwgaW5zdGVhZCBvZiBhIGxvb3Agb3ZlciBleHBlcnRzLgoiIiIKCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgVHVwbGUsIExpc3QsIE9wdGlvbmFsCmltcG9ydCBtYXRoCmltcG9ydCBlaW5vcHMKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpkZWYgbnVtX3NtcygpOgogICAgIyBNSTMwMCBoYXMgMzA0IENVcwogICAgcmV0dXJuIDMwNAoKQHRyaXRvbi5qaXQKZGVmIHNpbHUodGlsZSk6CiAgICAjIHByb2JhYmx5IG5vdCB0aGUgbW9zdCBhY2N1cmF0ZSAvIGZhc3Rlc3QgdGhpbmcgZXZlciA6LSkKICAgICMgdGwuZXhwIG5lZWRzIGZsb2F0MzIgb3IgZmxvYXQ2NC4KICAgIHJldHVybiB0aWxlICogKDEuMCAvICgxLjAgKyB0bC5leHAoLXRpbGUuY2FzdCh0bC5mbG9hdDMyKSkpKS5jYXN0KHRpbGUuZHR5cGUpCgpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZyh7CiAgICAgICAgICAgICdCTE9DS19TSVpFX00nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX04nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiAzMiwKICAgICAgICAgICAgJ05VTV9TTSc6IDg0LAogICAgICAgIH0pLAogICAgICAgIHRyaXRvbi5Db25maWcoewogICAgICAgICAgICAnQkxPQ0tfU0laRV9NJzogMTI4LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9OJzogMTI4LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9LJzogMzIsCiAgICAgICAgICAgICdOVU1fU00nOiAxMjgsCiAgICAgICAgfSksCiAgICAgICAgdHJpdG9uLkNvbmZpZyh7CiAgICAgICAgICAgICdCTE9DS19TSVpFX00nOiA2NCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTic6IDY0LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9LJzogMzIsCiAgICAgICAgICAgICdOVU1fU00nOiA4NCwKICAgICAgICB9KSwKICAgICAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTSc6IDY0LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9OJzogNjQsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiAzMiwKICAgICAgICAgICAgJ05VTV9TTSc6IDEyOCwKICAgICAgICB9KSwKICAgICAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTSc6IDEyOCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTic6IDEyOCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfSyc6IDY0LAogICAgICAgICAgICAnTlVNX1NNJzogbnVtX3NtcygpLAogICAgICAgIH0pLAogICAgICAgIHRyaXRvbi5Db25maWcoewogICAgICAgICAgICAnQkxPQ0tfU0laRV9NJzogNjQsCiAgICAgICAgICAgICdCTE9DS19TSVpFX04nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiA2NCwKICAgICAgICAgICAgJ05VTV9TTSc6IG51bV9zbXMoKSwKICAgICAgICB9KSwKICAgIF0sCiAgICBrZXk9Wydncm91cF9zaXplJ10sCikKQHRyaXRvbi5qaXQKZGVmIGdyb3VwZWRfbWF0bXVsX2tlcm5lbCgKICAgICMgZGV2aWNlIHRlbnNvciBvZiBtYXRyaWNlcyBwb2ludGVycwogICAgZ3JvdXBfYV9wdHJzLAogICAgZ3JvdXBfYl9wdHJzLAogICAgZ3JvdXBfY19wdHJzLAogICAgIyBkZXZpY2UgdGVuc29yIG9mIGdlbW0gc2l6ZXMuIGl0cyBzaGFwZSBpcyBbZ3JvdXBfc2l6ZSwgM10KICAgICMgZGltIDAgaXMgZ3JvdXBfc2l6ZSwgZGltIDEgaXMgdGhlIHZhbHVlcyBvZiA8TSwgTiwgSz4gb2YgZWFjaCBnZW1tCiAgICBncm91cF9nZW1tX3NpemVzLAogICAgIyBkZXZpY2UgdGVuc29yIG9mIGxlYWRpbmcgZGltZW5zaW9uIHNpemVzLiBpdHMgc2hhcGUgaXMgW2dyb3VwX3NpemUsIDNdCiAgICAjIGRpbSAwIGlzIGdyb3VwX3NpemUsIGRpbSAxIGlzIHRoZSB2YWx1ZXMgb2YgPGxkYSwgbGRiLCBsZGM+IG9mIGVhY2ggZ2VtbQogICAgZ19sZHMsCiAgICAjIG51bWJlciBvZiBnZW1tcwogICAgZ3JvdXBfc2l6ZSwKICAgICMgbnVtYmVyIG9mIHZpcnR1YWwgU00KICAgIE5VTV9TTTogdGwuY29uc3RleHByLAogICAgIyB0aWxlIHNpemVzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBBQ1RJVkFUSU9OOiB0bC5jb25zdGV4cHIKKToKICAgIHIiIiIKICAgIFRoaXMgaXMgdGFrZW4gYW5kIG1vZGlmaWVkIGZyb20gdGhlIHRyaXRvbiB0dXRvcmlhbC4gCiAgICAgIC0gYWRkcyBtYXNraW5nIHRvIGdldCB3b3JraW5nIHdpdGggZGlmZmVyZW50IHNoYXBlcy4KICAgICAgLSBmdXNlcyB0aGUgU2lMVSBhY3RpdmF0aW9uIGZ1bmN0aW9uLiAKICAgICIiIgogICAgdGlsZV9pZHggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBsYXN0X3Byb2JsZW1fZW5kID0gMAogICAgZm9yIGcgaW4gcmFuZ2UoZ3JvdXBfc2l6ZSk6CiAgICAgICAgIyBnZXQgdGhlIGdlbW0gc2l6ZSBvZiB0aGUgY3VycmVudCBwcm9ibGVtCiAgICAgICAgZ20gPSB0bC5sb2FkKGdyb3VwX2dlbW1fc2l6ZXMgKyBnICogMykKICAgICAgICBnbiA9IHRsLmxvYWQoZ3JvdXBfZ2VtbV9zaXplcyArIGcgKiAzICsgMSkKICAgICAgICBnayA9IHRsLmxvYWQoZ3JvdXBfZ2VtbV9zaXplcyArIGcgKiAzICsgMikKICAgICAgICBudW1fbV90aWxlcyA9IHRsLmNkaXYoZ20sIEJMT0NLX1NJWkVfTSkKICAgICAgICBudW1fbl90aWxlcyA9IHRsLmNkaXYoZ24sIEJMT0NLX1NJWkVfTikKICAgICAgICBudW1fdGlsZXMgPSBudW1fbV90aWxlcyAqIG51bV9uX3RpbGVzCiAgICAgICAgIyBpdGVyYXRlIHRocm91Z2ggdGhlIHRpbGVzIGluIHRoZSBjdXJyZW50IGdlbW0gcHJvYmxlbQogICAgICAgIHdoaWxlICh0aWxlX2lkeCA+PSBsYXN0X3Byb2JsZW1fZW5kIGFuZCB0aWxlX2lkeCA8IGxhc3RfcHJvYmxlbV9lbmQgKyBudW1fdGlsZXMpOgogICAgICAgICAgICAjIHBpY2sgdXAgYSB0aWxlIGZyb20gdGhlIGN1cnJlbnQgZ2VtbSBwcm9ibGVtCiAgICAgICAgICAgIGsgPSBnawogICAgICAgICAgICBsZGEgPSB0bC5sb2FkKGdfbGRzICsgZyAqIDMpCiAgICAgICAgICAgIGxkYiA9IHRsLmxvYWQoZ19sZHMgKyBnICogMyArIDEpCiAgICAgICAgICAgIGxkYyA9IHRsLmxvYWQoZ19sZHMgKyBnICogMyArIDIpCiAgICAgICAgICAgIGFfcHRyID0gdGwubG9hZChncm91cF9hX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgIGJfcHRyID0gdGwubG9hZChncm91cF9iX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgIGNfcHRyID0gdGwubG9hZChncm91cF9jX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgICMgZmlndXJlIG91dCB0aWxlIGNvb3JkaW5hdGVzCiAgICAgICAgICAgIHRpbGVfaWR4X2luX2dlbW0gPSB0aWxlX2lkeCAtIGxhc3RfcHJvYmxlbV9lbmQKICAgICAgICAgICAgdGlsZV9tX2lkeCA9IHRpbGVfaWR4X2luX2dlbW0gLy8gbnVtX25fdGlsZXMKICAgICAgICAgICAgdGlsZV9uX2lkeCA9IHRpbGVfaWR4X2luX2dlbW0gJSBudW1fbl90aWxlcwoKICAgICAgICAgICAgIyBkbyByZWd1bGFyIGdlbW0gaGVyZQogICAgICAgICAgICBvZmZzX2FtID0gdGlsZV9tX2lkeCAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pCiAgICAgICAgICAgIG9mZnNfYm4gPSB0aWxlX25faWR4ICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICAgICAgb2Zmc19rID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfSykKICAgICAgICAgICAgYV9wdHJzID0gYV9wdHIgKyBvZmZzX2FtWzosIE5vbmVdICogbGRhICsgb2Zmc19rW05vbmUsIDpdCiAgICAgICAgICAgIGJfcHRycyA9IGJfcHRyICsgb2Zmc19rWzosIE5vbmVdICogbGRiICsgb2Zmc19ibltOb25lLCA6XQogICAgICAgICAgICAKICAgICAgICAgICAgbV9tYXNrID0gb2Zmc19hbSA8IGdtCiAgICAgICAgICAgIG5fbWFzayA9IG9mZnNfYm4gPCBnbgogICAgICAgICAgICAKICAgICAgICAgICAgYWNjdW11bGF0b3IgPSB0bC56ZXJvcygoQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX04pLCBkdHlwZT10bC5mbG9hdDMyKQogICAgICAgICAgICBmb3Iga2sgaW4gcmFuZ2UoMCwgdGwuY2RpdihrLCBCTE9DS19TSVpFX0spKToKICAgICAgICAgICAgICAgICMgaGludCB0byBUcml0b24gY29tcGlsZXIgdG8gZG8gcHJvcGVyIGxvb3AgcGlwZWxpbmluZwogICAgICAgICAgICAgICAgdGwubXVsdGlwbGVfb2YoYV9wdHJzLCBbMTYsIDE2XSkKICAgICAgICAgICAgICAgIHRsLm11bHRpcGxlX29mKGJfcHRycywgWzE2LCAxNl0pCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGtfbWFzayA9IGtrICsgb2Zmc19rIDwgZ2sKICAgICAgICAgICAgICAgIGFfbWFzayA9IG1fbWFza1s6LCBOb25lXSBhbmQga19tYXNrW05vbmUsIDpdCiAgICAgICAgICAgICAgICBiX21hc2sgPSBrX21hc2tbOiwgTm9uZV0gYW5kIG5fbWFza1tOb25lLCA6XQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9YV9tYXNrKQogICAgICAgICAgICAgICAgYiA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPWJfbWFzaykKICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IHRsLmRvdChhLCBiKQogICAgICAgICAgICAgICAgYV9wdHJzICs9IEJMT0NLX1NJWkVfSwogICAgICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIGxkYgogICAgICAgICAgICBjID0gYWNjdW11bGF0b3IudG8odGwuZmxvYXQxNikKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIEFDVElWQVRJT046CiAgICAgICAgICAgICAgICBjID0gc2lsdShjKQoKICAgICAgICAgICAgb2Zmc19jbSA9IHRpbGVfbV9pZHggKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKQogICAgICAgICAgICBvZmZzX2NuID0gdGlsZV9uX2lkeCAqIEJMT0NLX1NJWkVfTiArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX04pCiAgICAgICAgICAgIGNfcHRycyA9IGNfcHRyICsgbGRjICogb2Zmc19jbVs6LCBOb25lXSArIG9mZnNfY25bTm9uZSwgOl0KCiAgICAgICAgICAgIGNfbWFzayA9IG1fbWFza1s6LCBOb25lXSBhbmQgbl9tYXNrW05vbmUsIDpdCiAgICAgICAgICAgIHRsLnN0b3JlKGNfcHRycywgYywgbWFzaz1jX21hc2spCgogICAgICAgICAgICAjIGdvIHRvIHRoZSBuZXh0IHRpbGUgYnkgYWR2YW5jaW5nIE5VTV9TTQogICAgICAgICAgICB0aWxlX2lkeCArPSBOVU1fU00KCiAgICAgICAgIyBnZXQgcmVhZHkgdG8gZ28gdG8gdGhlIG5leHQgZ2VtbSBwcm9ibGVtCiAgICAgICAgbGFzdF9wcm9ibGVtX2VuZCA9IGxhc3RfcHJvYmxlbV9lbmQgKyBudW1fdGlsZXMKCmRlZiBncm91cF9nZW1tX2ZuKAogICAgICAgIGdyb3VwX0E6IExpc3RbdG9yY2guVGVuc29yXSwKICAgICAgICBncm91cF9COiBMaXN0W3RvcmNoLlRlbnNvcl0sCiAgICAgICAgYWN0aXZhdGlvbjogYm9vbAogICAgKToKICAgIGFzc2VydCBsZW4oZ3JvdXBfQSkgPT0gbGVuKGdyb3VwX0IpCgogICAgREVWSUNFID0gJ2N1ZGEnCiAgICBncm91cF9zaXplID0gbGVuKGdyb3VwX0EpCgogICAgQV9hZGRycyA9IFtdCiAgICBCX2FkZHJzID0gW10KICAgIENfYWRkcnMgPSBbXQogICAgZ19zaXplcyA9IFtdCiAgICBnX2xkcyA9IFtdCiAgICBncm91cF9DID0gW10KICAgIGZvciBpIGluIHJhbmdlKGdyb3VwX3NpemUpOiAgICAgICAgCiAgICAgICAgQSA9IGdyb3VwX0FbaV0KICAgICAgICBCID0gZ3JvdXBfQltpXQogICAgICAgIGFzc2VydCBBLnNoYXBlWzFdID09IEIuc2hhcGVbMF0KICAgICAgICBNLCBLID0gQS5zaGFwZQogICAgICAgIEssIE4gPSBCLnNoYXBlCiAgICAgICAgCiAgICAgICAgQyA9IHRvcmNoLmVtcHR5KChNLCBOKSwgZGV2aWNlPURFVklDRSwgZHR5cGU9QS5kdHlwZSkKICAgICAgICBncm91cF9DLmFwcGVuZChDKQogICAgICAgIEFfYWRkcnMuYXBwZW5kKEEuZGF0YV9wdHIoKSkKICAgICAgICBCX2FkZHJzLmFwcGVuZChCLmRhdGFfcHRyKCkpCiAgICAgICAgQ19hZGRycy5hcHBlbmQoQy5kYXRhX3B0cigpKQogICAgICAgIGdfc2l6ZXMgKz0gW00sIE4sIEtdCiAgICAgICAgZ19sZHMgKz0gW0Euc3RyaWRlKDApLCBCLnN0cmlkZSgwKSwgQy5zdHJpZGUoMCldCiAgICAgICAgCiAgICAjIG5vdGUgdGhlc2UgYXJlIGRldmljZSB0ZW5zb3JzCiAgICBkX2FfcHRycyA9IHRvcmNoLnRlbnNvcihBX2FkZHJzLCBkZXZpY2U9REVWSUNFKQogICAgZF9iX3B0cnMgPSB0b3JjaC50ZW5zb3IoQl9hZGRycywgZGV2aWNlPURFVklDRSkKICAgIGRfY19wdHJzID0gdG9yY2gudGVuc29yKENfYWRkcnMsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfc2l6ZXMgPSB0b3JjaC50ZW5zb3IoZ19zaXplcywgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfbGRzID0gdG9yY2gudGVuc29yKGdfbGRzLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPURFVklDRSkKICAgICMgd2UgdXNlIGEgZml4ZWQgbnVtYmVyIG9mIENUQSwgYW5kIGl0J3MgYXV0by10dW5hYmxlCiAgICBncmlkID0gbGFtYmRhIE1FVEE6IChNRVRBWydOVU1fU00nXSwgKQogICAgZ3JvdXBlZF9tYXRtdWxfa2VybmVsW2dyaWRdKAogICAgICAgIGRfYV9wdHJzLAogICAgICAgIGRfYl9wdHJzLAogICAgICAgIGRfY19wdHJzLAogICAgICAgIGRfZ19zaXplcywKICAgICAgICBkX2dfbGRzLAogICAgICAgIGdyb3VwX3NpemUsCiAgICAgICAgQUNUSVZBVElPTj1hY3RpdmF0aW9uCiAgICApCgogICAgcmV0dXJuIGdyb3VwX0MKCmRlZiBnZXRfdG9rZW5faW5kaWNlcyhleHBlcnRfaW5kaWNlcywgbnVtX2V4cGVydHNfcGVyX3Rva2VuKToKICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgaW5kaWNlcyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYXJnc29ydCgpCiAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKSAjIFRPRE86IHdoeSBtb3ZlIHRvIGNwdT8KICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlID0gY291bnRzLmN1bXN1bSgpCiAgICB0b2tlbl9pbmRpY2VzID0gaW5kaWNlcyAvLyBudW1fZXhwZXJ0c19wZXJfdG9rZW4KICAgIHJldHVybiBpbmRpY2VzLCB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZSwgdG9rZW5faW5kaWNlcwoKQHRvcmNoLmNvbXBpbGUKZGVmIGV4cGVydF9pbnB1dF9wZXJtdXRlKAogICAgdG9rZW5zOiB0b3JjaC5UZW5zb3IsIAogICAgZXhwZXJ0X2luZGljZXM6IHRvcmNoLlRlbnNvciwgCiAgICBudW1fZXhwZXJ0c19wZXJfdG9rZW46IGludAopIC0+IExpc3RbdG9yY2guVGVuc29yXToKICAgIF8sIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzID0gZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbikKICAgIAogICAgZXhwZXJ0X2RhdGEgPSBbXQogICAgZm9yIGV4cGVydF9pZCwgZW5kX2lkeCBpbiBlbnVtZXJhdGUodG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UpOgogICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZVtleHBlcnRfaWQgLSAxXQogICAgICAgIGlmIHN0YXJ0X2lkeCA9PSBlbmRfaWR4OgogICAgICAgICAgICAjIHRyaXRvbiBncm91cCBnZW1tIG5lZWRzIGxlbihncm91cF9BKSA9PSBsZW4oZ3JvdXBfQiksCiAgICAgICAgICAgICMgYWRkaW5nIGFuIGVtcHR5IGxpc3QgaXMganVzdCBhIGhhY2sgdG8gZW5zdXJlIHRoZSBncm91cCBzaXplcyBhcmUgdGhlCiAgICAgICAgICAgICMgc2FtZS4gVGhpcyBjb3VsZC9zaG91bGQgYWxzbyBiZSBkb25lIGJ5IG5vdCBwYXNzaW5nIGluIHdlaWdodHMgaWYgdGhlCiAgICAgICAgICAgICMgY29ycmVzcG9uZGluZyBleHBlcnQgZ2V0cyBubyB0b2tlbnMuCiAgICAgICAgICAgIGV4cGVydF9kYXRhLmFwcGVuZCh0b3JjaC5lbXB0eSgoMCwgdG9rZW5zLnNpemUoLTEpKSkpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgCiAgICAgICAgZXhwX3Rva2VuX2lkeHMgPSB0b2tlbl9pbmRpY2VzW3N0YXJ0X2lkeDplbmRfaWR4XQogICAgICAgIGV4cGVydF90b2tlbnMgPSB0b2tlbnNbZXhwX3Rva2VuX2lkeHNdCiAgICAgICAgZXhwZXJ0X2RhdGEuYXBwZW5kKGV4cGVydF90b2tlbnMpCiAgICAgICAgCiAgICByZXR1cm4gZXhwZXJ0X2RhdGEsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlCgpAdG9yY2guY29tcGlsZQpkZWYgZXhwZXJ0X291dHB1dF9wZXJtdXRlKAogICAgZXhwZXJ0X2RhdGE6IExpc3RbdG9yY2guVGVuc29yXSwgCiAgICBleHBlcnRfaW5kaWNlczogdG9yY2guVGVuc29yLCAKICAgIGV4cGVydF93ZWlnaHRzOiB0b3JjaC5UZW5zb3IsIAogICAgbnVtX2V4cGVydHNfcGVyX3Rva2VuOiBpbnQsCiAgICBvdXRwdXQ6IHRvcmNoLlRlbnNvciwKKSAtPiB0b3JjaC5UZW5zb3I6CiAgICBoaWRkZW5fZGltID0gZXhwZXJ0X2RhdGFbMF0uc2l6ZSgtMSkKICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfd2VpZ2h0cy52aWV3KC0xLCAxKQoKICAgIGluZGljZXMsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzID0gZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbikKICAgIAogICAgZm9yIGV4cGVydF9pZCwgZW5kX2lkeCBpbiBlbnVtZXJhdGUodG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UpOgogICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZVtleHBlcnRfaWQgLSAxXQogICAgICAgIGlmIHN0YXJ0X2lkeCA9PSBlbmRfaWR4OgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIAogICAgICAgICMgbXVsdGlwbHkgdG9rZW4gYnkgYnkgZXhwZXJ0IHdlaWdodHMgYW5kIHJlZHVjZQogICAgICAgIGV4cGVydF9kYXRhW2V4cGVydF9pZF0ubXVsXyhmbGF0X2V4cGVydF93ZWlnaHRzW2luZGljZXNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2luZGljZXNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgCiAgICAgICAgIyBkaXJlY3RseSBhY2N1bXVsYXRlIG9udG8gb3V0cHV0IHRlbnNvcgogICAgICAgIG91dHB1dC5zY2F0dGVyX3JlZHVjZV8oCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzLnZpZXcoLTEsIDEpLnJlcGVhdCgxLCBoaWRkZW5fZGltKSwKICAgICAgICAgICAgZXhwZXJ0X2RhdGFbZXhwZXJ0X2lkXSwKICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgKQogICAgCiAgICByZXR1cm4gb3V0cHV0CgpAdG9yY2guY29tcGlsZQpkZWYgY29tcHV0ZV9zaGFyZWRfZXhwZXJ0KHdlaWdodHMsIHRva2Vucyk6CiAgICB3X2dhdGUgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddCiAgICB3X3VwID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXQogICAgd19kb3duID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXQoKICAgIGdhdGUgPSBGLnNpbHUodG9rZW5zIEAgd19nYXRlKQogICAgdXAgPSB0b2tlbnMgQCB3X3VwCiAgICBkb3duID0gKGdhdGUgKiB1cCkgQCB3X2Rvd24KICAgIHJldHVybiBkb3duCgpAdG9yY2guY29tcGlsZQpkZWYgY29tcHV0ZV9yb3V0aW5nKHdlaWdodHMsIHRva2VucywgdG9wayk6CiAgICAjIEZvciBzb21lIHJlYXNvbiwgcm91dGVyIHdlaWdodHMgYXJlIGFscmVhZHkgdHJhbnNwb3NlZD8/IFNvIHRyYW5zcG9zZSBoZXJlLi4uCiAgICB3X2cgPSB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10udCgpCiAgICBsb2dpdHMgPSB0b2tlbnMgQCB3X2cKICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgaz10b3BrLCBkaW09LTEsIHNvcnRlZD1GYWxzZSkKICAgIHJldHVybiB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzCgpkZWYgY29tcHV0ZV9yb3V0ZWRfZXhwZXJ0cygKICAgICAgICB3ZWlnaHRzLCAKICAgICAgICB0b2tlbnMsIAogICAgICAgIHRvcGssIAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIGV4cGVydF9pbmRpY2VzLAogICAgICAgIGV4cGVydF9zY29yZXMsCiAgICAgICAgb3V0cHV0CiAgICApOgogICAgZ2F0ZV9wcm9qX3dlaWdodHMgPSBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10gZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpXQogICAgdXBfcHJval93ZWlnaHRzID0gW3dlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKV0KICAgIGRvd25fcHJval93ZWlnaHRzID0gW3dlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKV0KICAgIAogICAgIyBnZXQgdG9rZW5zIGZvciBlYWNoIGV4cGVydCwgYnV0IGNvbXB1dGUgZXhwZXJ0IHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwgd2l0aCBncm91cCBnZW1tcy4KICAgIGdyb3VwX3Rva2VuLCBfID0gZXhwZXJ0X2lucHV0X3Blcm11dGUodG9rZW5zLCBleHBlcnRfaW5kaWNlcywgdG9waykKCiAgICBnYXRlID0gZ3JvdXBfZ2VtbV9mbihncm91cF90b2tlbiwgZ2F0ZV9wcm9qX3dlaWdodHMsIGFjdGl2YXRpb249VHJ1ZSkKICAgIHVwID0gZ3JvdXBfZ2VtbV9mbihncm91cF90b2tlbiwgdXBfcHJval93ZWlnaHRzLCBhY3RpdmF0aW9uPUZhbHNlKQogICAgIyBUT0RPOiB0aGlzIHNob3VsZCBiZSBhbm90aGVyIGdyb3VwIGtlcm5lbCwgb3IgcG9zc2libHkgY29tYmluZWQgd2l0aCB0aGUgZG93biBwcm9qZWN0IGtlcm5lbAogICAgbGhzID0gW3RfZ2F0ZSAqIHRfdXAgZm9yICh0X2dhdGUsIHRfdXApIGluIHppcChnYXRlLCB1cCldCiAgICBncm91cF90b2tlbiA9IGdyb3VwX2dlbW1fZm4obGhzLCBkb3duX3Byb2pfd2VpZ2h0cywgYWN0aXZhdGlvbj1GYWxzZSkKCiAgICAjIHJvdXRlZCBleHBlcnRzIGdldCBhY2N1bXVsYXRlZCBvbnRvIG91dHB1dAogICAgZXhwZXJ0X291dHB1dF9wZXJtdXRlKAogICAgICAgIGdyb3VwX3Rva2VuLCAKICAgICAgICBleHBlcnRfaW5kaWNlcywgCiAgICAgICAgZXhwZXJ0X3Njb3JlcywgCiAgICAgICAgdG9waywgCiAgICAgICAgb3V0cHV0KQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YSk6CiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIG51bV9leHBlcnRzID0gY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0KICAgIHRvcGsgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQoKICAgIGhpZGRlbl9zaXplID0gaW5wdXRfdGVuc29yLnNpemUoMikKICAgIG9yaWdpbmFsX3NoYXBlID0gaW5wdXRfdGVuc29yLnNpemUoKQogICAgCiAgICBmbGF0X3Rva2VucyA9IGlucHV0X3RlbnNvci52aWV3KC0xLCBoaWRkZW5fc2l6ZSkKCiAgICBzaGFyZWRfb3V0cHV0ID0gY29tcHV0ZV9zaGFyZWRfZXhwZXJ0KHdlaWdodHMsIGZsYXRfdG9rZW5zKQogICAgc2NvcmVzLCBpbmRpY2VzID0gY29tcHV0ZV9yb3V0aW5nKHdlaWdodHMsIGZsYXRfdG9rZW5zLCB0b3BrKQoKICAgIGNvbXB1dGVfcm91dGVkX2V4cGVydHMoCiAgICAgICAgd2VpZ2h0cywKICAgICAgICBmbGF0X3Rva2VucywKICAgICAgICB0b3BrLAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIGluZGljZXMsCiAgICAgICAgc2NvcmVzLAogICAgICAgIHNoYXJlZF9vdXRwdXQKICAgICkKCiAgICByZXR1cm4gc2hhcmVkX291dHB1dC52aWV3KG9yaWdpbmFsX3NoYXBlKQoKIyBJbnB1dCBnZW5lcmF0aW9uIGZvciB0aGUgcmVmZXJlbmNlIGNvZGUKCmRlZiBnZW5lcmF0ZV9pbnB1dCgKICAgIGRoaWRkZW46IGludCwKICAgIGRleHBlcnQ6IGludCwKICAgIG5yb3V0ZWRleHBlcnRzOiBpbnQsCiAgICBuc2hhcmVkZXhwZXJ0czogaW50LAogICAgbmV4cGVydHNwZXJ0b2tlbjogaW50LAogICAgYnM6IGludCwKICAgIHNlcWxlbjogaW50LAogICAgc2VlZDogaW50Cik6CgogICAgIyBSZWFsbHkgZHVtYiBidXQgZm9yIG5vdyBfIGlzbid0IHBhcnNpbmcgY29ycmVjdGx5LgogICAgZF9oaWRkZW4gPSBkaGlkZGVuCiAgICBkX2V4cGVydCA9IGRleHBlcnQKICAgIG5fcm91dGVkX2V4cGVydHMgPSBucm91dGVkZXhwZXJ0cwogICAgbl9zaGFyZWRfZXhwZXJ0cyA9IG5zaGFyZWRleHBlcnRzCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuID0gbmV4cGVydHNwZXJ0b2tlbgogICAgYmF0Y2hfc2l6ZSA9IGJzCiAgICBzZXFfbGVuID0gc2VxbGVuCgogICAgY29uZmlnID0gewogICAgICAgICJkX2hpZGRlbiI6IGRfaGlkZGVuLAogICAgICAgICJkX2V4cGVydCI6IGRfZXhwZXJ0LAogICAgICAgICJuX3JvdXRlZF9leHBlcnRzIjogbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICAibl9zaGFyZWRfZXhwZXJ0cyI6IG5fc2hhcmVkX2V4cGVydHMsCiAgICAgICAgIm5fZXhwZXJ0c19wZXJfdG9rZW4iOiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICJiYXRjaF9zaXplIjogYmF0Y2hfc2l6ZSwKICAgICAgICAic2VxX2xlbiI6IHNlcV9sZW4sCiAgICB9CgogICAgZ2VuID0gdG9yY2guR2VuZXJhdG9yKGRldmljZT0nY3VkYScpCiAgICBnZW4ubWFudWFsX3NlZWQoc2VlZCkKCiAgICBudW1fZXhwZXJ0cyA9IG5fcm91dGVkX2V4cGVydHMKICAgIGV4cGVydF9kaW0gPSBkX2V4cGVydAogICAgd2VpZ2h0cyA9IHt9CgogICAgaW5wdXRfdGVuc29yID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSwKICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgZ2VuZXJhdG9yPWdlbgogICAgKS5jb250aWd1b3VzKCkKCiAgICAjIEluaXRpYWxpemUgcm91dGVyIHdlaWdodHMKICAgIHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgIChudW1fZXhwZXJ0cywgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0iY3VkYSIsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQoKICAgIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKToKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltKQoKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltKQoKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZXhwZXJ0X2RpbSwgZF9oaWRkZW4pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChkX2hpZGRlbikKICAgIAogICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzKQogICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzKQogICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgIChleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQoKICAgIHJldHVybiAoaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgaW5wdXQgPSBnZW5lcmF0ZV9pbnB1dCgxMjgsIDEyOCwgNCwgMSwgMiwgOCwgOCwgMCkKICAgIG91dHB1dCA9IGN1c3RvbV9rZXJuZWwoaW5wdXQp

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

- ciIiIgpVc2VzIGEgZ3JvdXAgZ2VtbSwgaW5zdGVhZCBvZiBhIGxvb3Agb3ZlciBleHBlcnRzLgoiIiIKCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgVHVwbGUsIExpc3QsIE9wdGlvbmFsCmltcG9ydCBtYXRoCmltcG9ydCBlaW5vcHMKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpkZWYgaXNfY3VkYSgpOgogICAgcmV0dXJuIHRyaXRvbi5ydW50aW1lLmRyaXZlci5hY3RpdmUuZ2V0X2N1cnJlbnRfdGFyZ2V0KCkuYmFja2VuZCA9PSAiY3VkYSIKCmRlZiBudW1fc21zKCk6CiAgICBpZiBpc19jdWRhKCk6CiAgICAgICAgcmV0dXJuIHRvcmNoLmN1ZGEuZ2V0X2RldmljZV9wcm9wZXJ0aWVzKCJjdWRhIikubXVsdGlfcHJvY2Vzc29yX2NvdW50CiAgICByZXR1cm4gMTQ4CgpAdHJpdG9uLmppdApkZWYgc2lsdSh0aWxlKToKICAgICMgcHJvYmFibHkgbm90IHRoZSBtb3N0IGFjY3VyYXRlIHRoaW5nIGV2ZXIgOi0pCiAgICByZXR1cm4gdGlsZSAqICgxLjAgLyAoMS4wICsgdGwuZXhwKC10aWxlLmNhc3QodGwuZmxvYXQzMikpKSkuY2FzdCh0aWxlLmR0eXBlKQoKQHRyaXRvbi5hdXRvdHVuZSgKICAgIGNvbmZpZ3M9WwogICAgICAgIHRyaXRvbi5Db25maWcoewogICAgICAgICAgICAnQkxPQ0tfU0laRV9NJzogMTI4LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9OJzogMTI4LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9LJzogMzIsCiAgICAgICAgICAgICdOVU1fU00nOiA4NCwKICAgICAgICB9KSwKICAgICAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTSc6IDEyOCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTic6IDEyOCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfSyc6IDMyLAogICAgICAgICAgICAnTlVNX1NNJzogMTI4LAogICAgICAgIH0pLAogICAgICAgIHRyaXRvbi5Db25maWcoewogICAgICAgICAgICAnQkxPQ0tfU0laRV9NJzogNjQsCiAgICAgICAgICAgICdCTE9DS19TSVpFX04nOiA2NCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfSyc6IDMyLAogICAgICAgICAgICAnTlVNX1NNJzogODQsCiAgICAgICAgfSksCiAgICAgICAgdHJpdG9uLkNvbmZpZyh7CiAgICAgICAgICAgICdCTE9DS19TSVpFX00nOiA2NCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTic6IDY0LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9LJzogMzIsCiAgICAgICAgICAgICdOVU1fU00nOiAxMjgsCiAgICAgICAgfSksCiAgICAgICAgdHJpdG9uLkNvbmZpZyh7CiAgICAgICAgICAgICdCTE9DS19TSVpFX00nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX04nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiA2NCwKICAgICAgICAgICAgJ05VTV9TTSc6IG51bV9zbXMoKSwKICAgICAgICB9KSwKICAgICAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTSc6IDY0LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9OJzogMTI4LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9LJzogNjQsCiAgICAgICAgICAgICdOVU1fU00nOiBudW1fc21zKCksCiAgICAgICAgfSksCiAgICBdLAogICAga2V5PVsnZ3JvdXBfc2l6ZSddLAopCkB0cml0b24uaml0CmRlZiBncm91cGVkX21hdG11bF9rZXJuZWwoCiAgICAjIGRldmljZSB0ZW5zb3Igb2YgbWF0cmljZXMgcG9pbnRlcnMKICAgIGdyb3VwX2FfcHRycywKICAgIGdyb3VwX2JfcHRycywKICAgIGdyb3VwX2NfcHRycywKICAgICMgZGV2aWNlIHRlbnNvciBvZiBnZW1tIHNpemVzLiBpdHMgc2hhcGUgaXMgW2dyb3VwX3NpemUsIDNdCiAgICAjIGRpbSAwIGlzIGdyb3VwX3NpemUsIGRpbSAxIGlzIHRoZSB2YWx1ZXMgb2YgPE0sIE4sIEs+IG9mIGVhY2ggZ2VtbQogICAgZ3JvdXBfZ2VtbV9zaXplcywKICAgICMgZGV2aWNlIHRlbnNvciBvZiBsZWFkaW5nIGRpbWVuc2lvbiBzaXplcy4gaXRzIHNoYXBlIGlzIFtncm91cF9zaXplLCAzXQogICAgIyBkaW0gMCBpcyBncm91cF9zaXplLCBkaW0gMSBpcyB0aGUgdmFsdWVzIG9mIDxsZGEsIGxkYiwgbGRjPiBvZiBlYWNoIGdlbW0KICAgIGdfbGRzLAogICAgIyBudW1iZXIgb2YgZ2VtbXMKICAgIGdyb3VwX3NpemUsCiAgICAjIG51bWJlciBvZiB2aXJ0dWFsIFNNCiAgICBOVU1fU006IHRsLmNvbnN0ZXhwciwKICAgICMgdGlsZSBzaXplcwogICAgQkxPQ0tfU0laRV9NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfSzogdGwuY29uc3RleHByLAogICAgQUNUSVZBVElPTjogdGwuY29uc3RleHByCik6CiAgICByIiIiCiAgICBUaGlzIGlzIHRha2VuIGFuZCBtb2RpZmllZCBmcm9tIHRoZSB0cml0b24gdHV0b3JpYWwuIAogICAgICAtIGFkZHMgbWFza2luZyB0byBnZXQgd29ya2luZyB3aXRoIGRpZmZlcmVudCBzaGFwZXMuCiAgICAgIC0gZnVzZXMgdGhlIFNpTFUgYWN0aXZhdGlvbiBmdW5jdGlvbi4gCiAgICAiIiIKICAgIHRpbGVfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgbGFzdF9wcm9ibGVtX2VuZCA9IDAKICAgIGZvciBnIGluIHJhbmdlKGdyb3VwX3NpemUpOgogICAgICAgICMgZ2V0IHRoZSBnZW1tIHNpemUgb2YgdGhlIGN1cnJlbnQgcHJvYmxlbQogICAgICAgIGdtID0gdGwubG9hZChncm91cF9nZW1tX3NpemVzICsgZyAqIDMpCiAgICAgICAgZ24gPSB0bC5sb2FkKGdyb3VwX2dlbW1fc2l6ZXMgKyBnICogMyArIDEpCiAgICAgICAgZ2sgPSB0bC5sb2FkKGdyb3VwX2dlbW1fc2l6ZXMgKyBnICogMyArIDIpCiAgICAgICAgbnVtX21fdGlsZXMgPSB0bC5jZGl2KGdtLCBCTE9DS19TSVpFX00pCiAgICAgICAgbnVtX25fdGlsZXMgPSB0bC5jZGl2KGduLCBCTE9DS19TSVpFX04pCiAgICAgICAgbnVtX3RpbGVzID0gbnVtX21fdGlsZXMgKiBudW1fbl90aWxlcwogICAgICAgICMgaXRlcmF0ZSB0aHJvdWdoIHRoZSB0aWxlcyBpbiB0aGUgY3VycmVudCBnZW1tIHByb2JsZW0KICAgICAgICB3aGlsZSAodGlsZV9pZHggPj0gbGFzdF9wcm9ibGVtX2VuZCBhbmQgdGlsZV9pZHggPCBsYXN0X3Byb2JsZW1fZW5kICsgbnVtX3RpbGVzKToKICAgICAgICAgICAgIyBwaWNrIHVwIGEgdGlsZSBmcm9tIHRoZSBjdXJyZW50IGdlbW0gcHJvYmxlbQogICAgICAgICAgICBrID0gZ2sKICAgICAgICAgICAgbGRhID0gdGwubG9hZChnX2xkcyArIGcgKiAzKQogICAgICAgICAgICBsZGIgPSB0bC5sb2FkKGdfbGRzICsgZyAqIDMgKyAxKQogICAgICAgICAgICBsZGMgPSB0bC5sb2FkKGdfbGRzICsgZyAqIDMgKyAyKQogICAgICAgICAgICBhX3B0ciA9IHRsLmxvYWQoZ3JvdXBfYV9wdHJzICsgZykudG8odGwucG9pbnRlcl90eXBlKHRsLmZsb2F0MTYpKQogICAgICAgICAgICBiX3B0ciA9IHRsLmxvYWQoZ3JvdXBfYl9wdHJzICsgZykudG8odGwucG9pbnRlcl90eXBlKHRsLmZsb2F0MTYpKQogICAgICAgICAgICBjX3B0ciA9IHRsLmxvYWQoZ3JvdXBfY19wdHJzICsgZykudG8odGwucG9pbnRlcl90eXBlKHRsLmZsb2F0MTYpKQogICAgICAgICAgICAjIGZpZ3VyZSBvdXQgdGlsZSBjb29yZGluYXRlcwogICAgICAgICAgICB0aWxlX2lkeF9pbl9nZW1tID0gdGlsZV9pZHggLSBsYXN0X3Byb2JsZW1fZW5kCiAgICAgICAgICAgIHRpbGVfbV9pZHggPSB0aWxlX2lkeF9pbl9nZW1tIC8vIG51bV9uX3RpbGVzCiAgICAgICAgICAgIHRpbGVfbl9pZHggPSB0aWxlX2lkeF9pbl9nZW1tICUgbnVtX25fdGlsZXMKCiAgICAgICAgICAgICMgZG8gcmVndWxhciBnZW1tIGhlcmUKICAgICAgICAgICAgb2Zmc19hbSA9IHRpbGVfbV9pZHggKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKQogICAgICAgICAgICBvZmZzX2JuID0gdGlsZV9uX2lkeCAqIEJMT0NLX1NJWkVfTiArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX04pCiAgICAgICAgICAgIG9mZnNfayA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX0spCiAgICAgICAgICAgIGFfcHRycyA9IGFfcHRyICsgb2Zmc19hbVs6LCBOb25lXSAqIGxkYSArIG9mZnNfa1tOb25lLCA6XQogICAgICAgICAgICBiX3B0cnMgPSBiX3B0ciArIG9mZnNfa1s6LCBOb25lXSAqIGxkYiArIG9mZnNfYm5bTm9uZSwgOl0KICAgICAgICAgICAgCiAgICAgICAgICAgIG1fbWFzayA9IG9mZnNfYW0gPCBnbQogICAgICAgICAgICBuX21hc2sgPSBvZmZzX2JuIDwgZ24KICAgICAgICAgICAgCiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKICAgICAgICAgICAgZm9yIGtrIGluIHJhbmdlKDAsIHRsLmNkaXYoaywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICAgICAjIGhpbnQgdG8gVHJpdG9uIGNvbXBpbGVyIHRvIGRvIHByb3BlciBsb29wIHBpcGVsaW5pbmcKICAgICAgICAgICAgICAgICN0bC5tdWx0aXBsZV9vZihhX3B0cnMsIFsxNiwgMTZdKQogICAgICAgICAgICAgICAgI3RsLm11bHRpcGxlX29mKGJfcHRycywgWzE2LCAxNl0pCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGtfbWFzayA9IGtrICsgb2Zmc19rIDwgZ2sKICAgICAgICAgICAgICAgIGFfbWFzayA9IG1fbWFza1s6LCBOb25lXSBhbmQga19tYXNrW05vbmUsIDpdCiAgICAgICAgICAgICAgICBiX21hc2sgPSBrX21hc2tbOiwgTm9uZV0gYW5kIG5fbWFza1tOb25lLCA6XQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9YV9tYXNrKQogICAgICAgICAgICAgICAgYiA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPWJfbWFzaykKICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IHRsLmRvdChhLCBiKQogICAgICAgICAgICAgICAgYV9wdHJzICs9IEJMT0NLX1NJWkVfSwogICAgICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIGxkYgogICAgICAgICAgICBjID0gYWNjdW11bGF0b3IudG8odGwuZmxvYXQxNikKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIEFDVElWQVRJT046CiAgICAgICAgICAgICAgICBjID0gc2lsdShjKQoKICAgICAgICAgICAgb2Zmc19jbSA9IHRpbGVfbV9pZHggKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKQogICAgICAgICAgICBvZmZzX2NuID0gdGlsZV9uX2lkeCAqIEJMT0NLX1NJWkVfTiArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX04pCiAgICAgICAgICAgIGNfcHRycyA9IGNfcHRyICsgbGRjICogb2Zmc19jbVs6LCBOb25lXSArIG9mZnNfY25bTm9uZSwgOl0KCiAgICAgICAgICAgIGNfbWFzayA9IG1fbWFza1s6LCBOb25lXSBhbmQgbl9tYXNrW05vbmUsIDpdCiAgICAgICAgICAgIHRsLnN0b3JlKGNfcHRycywgYywgbWFzaz1jX21hc2spCgogICAgICAgICAgICAjIGdvIHRvIHRoZSBuZXh0IHRpbGUgYnkgYWR2YW5jaW5nIE5VTV9TTQogICAgICAgICAgICB0aWxlX2lkeCArPSBOVU1fU00KCiAgICAgICAgIyBnZXQgcmVhZHkgdG8gZ28gdG8gdGhlIG5leHQgZ2VtbSBwcm9ibGVtCiAgICAgICAgbGFzdF9wcm9ibGVtX2VuZCA9IGxhc3RfcHJvYmxlbV9lbmQgKyBudW1fdGlsZXMKCmRlZiBncm91cF9nZW1tX2ZuKGdyb3VwX0E6IExpc3RbdG9yY2guVGVuc29yXSwgZ3JvdXBfQjogTGlzdFt0b3JjaC5UZW5zb3JdLCBhY3RpdmF0aW9uOiBib29sKToKICAgIGFzc2VydCBsZW4oZ3JvdXBfQSkgPT0gbGVuKGdyb3VwX0IpCiAgICBERVZJQ0UgPSAnY3VkYScKICAgIGdyb3VwX3NpemUgPSBsZW4oZ3JvdXBfQSkKCiAgICBBX2FkZHJzID0gW10KICAgIEJfYWRkcnMgPSBbXQogICAgQ19hZGRycyA9IFtdCiAgICBnX3NpemVzID0gW10KICAgIGdfbGRzID0gW10KICAgIGdyb3VwX0MgPSBbXQogICAgZm9yIGkgaW4gcmFuZ2UoZ3JvdXBfc2l6ZSk6ICAgICAgICAKICAgICAgICBBID0gZ3JvdXBfQVtpXQogICAgICAgIEIgPSBncm91cF9CW2ldCiAgICAgICAgYXNzZXJ0IEEuc2hhcGVbMV0gPT0gQi5zaGFwZVswXQogICAgICAgIE0sIEsgPSBBLnNoYXBlCiAgICAgICAgSywgTiA9IEIuc2hhcGUKICAgICAgICAKICAgICAgICBDID0gdG9yY2guZW1wdHkoKE0sIE4pLCBkZXZpY2U9REVWSUNFLCBkdHlwZT1BLmR0eXBlKQogICAgICAgIGdyb3VwX0MuYXBwZW5kKEMpCiAgICAgICAgQV9hZGRycy5hcHBlbmQoQS5kYXRhX3B0cigpKQogICAgICAgIEJfYWRkcnMuYXBwZW5kKEIuZGF0YV9wdHIoKSkKICAgICAgICBDX2FkZHJzLmFwcGVuZChDLmRhdGFfcHRyKCkpCiAgICAgICAgZ19zaXplcyArPSBbTSwgTiwgS10KICAgICAgICBnX2xkcyArPSBbQS5zdHJpZGUoMCksIEIuc3RyaWRlKDApLCBDLnN0cmlkZSgwKV0KICAgICAgICAKICAgICMgbm90ZSB0aGVzZSBhcmUgZGV2aWNlIHRlbnNvcnMKICAgIGRfYV9wdHJzID0gdG9yY2gudGVuc29yKEFfYWRkcnMsIGRldmljZT1ERVZJQ0UpCiAgICBkX2JfcHRycyA9IHRvcmNoLnRlbnNvcihCX2FkZHJzLCBkZXZpY2U9REVWSUNFKQogICAgZF9jX3B0cnMgPSB0b3JjaC50ZW5zb3IoQ19hZGRycywgZGV2aWNlPURFVklDRSkKICAgIGRfZ19zaXplcyA9IHRvcmNoLnRlbnNvcihnX3NpemVzLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPURFVklDRSkKICAgIGRfZ19sZHMgPSB0b3JjaC50ZW5zb3IoZ19sZHMsIGR0eXBlPXRvcmNoLmludDMyLCBkZXZpY2U9REVWSUNFKQogICAgIyB3ZSB1c2UgYSBmaXhlZCBudW1iZXIgb2YgQ1RBLCBhbmQgaXQncyBhdXRvLXR1bmFibGUKICAgIGdyaWQgPSBsYW1iZGEgTUVUQTogKE1FVEFbJ05VTV9TTSddLCApCiAgICBncm91cGVkX21hdG11bF9rZXJuZWxbZ3JpZF0oCiAgICAgICAgZF9hX3B0cnMsCiAgICAgICAgZF9iX3B0cnMsCiAgICAgICAgZF9jX3B0cnMsCiAgICAgICAgZF9nX3NpemVzLAogICAgICAgIGRfZ19sZHMsCiAgICAgICAgZ3JvdXBfc2l6ZSwKICAgICAgICBBQ1RJVkFUSU9OPWFjdGl2YXRpb24KICAgICkKCiAgICByZXR1cm4gZ3JvdXBfQwoKZGVmIGdldF90b2tlbl9pbmRpY2VzKGV4cGVydF9pbmRpY2VzLCBudW1fZXhwZXJ0c19wZXJfdG9rZW4pOgogICAgZmxhdF9leHBlcnRfaW5kaWNlcyA9IGV4cGVydF9pbmRpY2VzLnZpZXcoLTEpCiAgICBpbmRpY2VzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgIGNvdW50cyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYmluY291bnQoKS5jcHUoKS5udW1weSgpICMgVE9ETzogd2h5IG1vdmUgdG8gY3B1PwogICAgdG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UgPSBjb3VudHMuY3Vtc3VtKCkKICAgIHRva2VuX2luZGljZXMgPSBpbmRpY2VzIC8vIG51bV9leHBlcnRzX3Blcl90b2tlbgogICAgcmV0dXJuIGluZGljZXMsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzCgpAdG9yY2guY29tcGlsZQpkZWYgZXhwZXJ0X2lucHV0X3Blcm11dGUoCiAgICB0b2tlbnM6IHRvcmNoLlRlbnNvciwgCiAgICBleHBlcnRfaW5kaWNlczogdG9yY2guVGVuc29yLCAKICAgIG51bV9leHBlcnRzX3Blcl90b2tlbjogaW50CikgLT4gTGlzdFt0b3JjaC5UZW5zb3JdOgogICAgXywgdG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UsIHRva2VuX2luZGljZXMgPSBnZXRfdG9rZW5faW5kaWNlcyhleHBlcnRfaW5kaWNlcywgbnVtX2V4cGVydHNfcGVyX3Rva2VuKQogICAgCiAgICBleHBlcnRfZGF0YSA9IFtdCiAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydF9yYW5nZSk6CiAgICAgICAgc3RhcnRfaWR4ID0gMCBpZiBleHBlcnRfaWQgPT0gMCBlbHNlIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlW2V4cGVydF9pZCAtIDFdCiAgICAgICAgaWYgc3RhcnRfaWR4ID09IGVuZF9pZHg6CiAgICAgICAgICAgICMgdHJpdG9uIGdyb3VwIGdlbW0gbmVlZHMgbGVuKGdyb3VwX0EpID09IGxlbihncm91cF9CKSwKICAgICAgICAgICAgIyBhZGRpbmcgYW4gZW1wdHkgbGlzdCBpcyBqdXN0IGEgaGFjayB0byBlbnN1cmUgdGhlIGdyb3VwIHNpemVzIGFyZSB0aGUKICAgICAgICAgICAgIyBzYW1lLiBUaGlzIGNvdWxkL3Nob3VsZCBhbHNvIGJlIGRvbmUgYnkgbm90IHBhc3NpbmcgaW4gd2VpZ2h0cyBpZiB0aGUKICAgICAgICAgICAgIyBjb3JyZXNwb25kaW5nIGV4cGVydCBnZXRzIG5vIHRva2Vucy4KICAgICAgICAgICAgZXhwZXJ0X2RhdGEuYXBwZW5kKHRvcmNoLmVtcHR5KCgwLCB0b2tlbnMuc2l6ZSgtMSkpKSkKICAgICAgICAgICAgY29udGludWUKICAgICAgICAKICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2luZGljZXNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgZXhwZXJ0X3Rva2VucyA9IHRva2Vuc1tleHBfdG9rZW5faWR4c10KICAgICAgICBleHBlcnRfZGF0YS5hcHBlbmQoZXhwZXJ0X3Rva2VucykKICAgICAgICAKICAgIHJldHVybiBleHBlcnRfZGF0YSwgdG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UKCkB0b3JjaC5jb21waWxlCmRlZiBleHBlcnRfb3V0cHV0X3Blcm11dGUoCiAgICBleHBlcnRfZGF0YTogTGlzdFt0b3JjaC5UZW5zb3JdLCAKICAgIGV4cGVydF9pbmRpY2VzOiB0b3JjaC5UZW5zb3IsIAogICAgZXhwZXJ0X3dlaWdodHM6IHRvcmNoLlRlbnNvciwgCiAgICBudW1fZXhwZXJ0c19wZXJfdG9rZW46IGludCwKICAgIG91dHB1dDogdG9yY2guVGVuc29yLAopIC0+IHRvcmNoLlRlbnNvcjoKICAgIGhpZGRlbl9kaW0gPSBleHBlcnRfZGF0YVswXS5zaXplKC0xKQogICAgZmxhdF9leHBlcnRfd2VpZ2h0cyA9IGV4cGVydF93ZWlnaHRzLnZpZXcoLTEsIDEpCgogICAgaW5kaWNlcywgdG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UsIHRva2VuX2luZGljZXMgPSBnZXRfdG9rZW5faW5kaWNlcyhleHBlcnRfaW5kaWNlcywgbnVtX2V4cGVydHNfcGVyX3Rva2VuKQogICAgCiAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydF9yYW5nZSk6CiAgICAgICAgc3RhcnRfaWR4ID0gMCBpZiBleHBlcnRfaWQgPT0gMCBlbHNlIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlW2V4cGVydF9pZCAtIDFdCiAgICAgICAgaWYgc3RhcnRfaWR4ID09IGVuZF9pZHg6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgCiAgICAgICAgIyBtdWx0aXBseSB0b2tlbiBieSBieSBleHBlcnQgd2VpZ2h0cyBhbmQgcmVkdWNlCiAgICAgICAgZXhwZXJ0X2RhdGFbZXhwZXJ0X2lkXS5tdWxfKGZsYXRfZXhwZXJ0X3dlaWdodHNbaW5kaWNlc1tzdGFydF9pZHg6ZW5kX2lkeF1dKQogICAgICAgIGV4cF90b2tlbl9pZHhzID0gdG9rZW5faW5kaWNlc1tzdGFydF9pZHg6ZW5kX2lkeF0KICAgICAgICAKICAgICAgICAjIGRpcmVjdGx5IGFjY3VtdWxhdGUgb250byBvdXRwdXQgdGVuc29yCiAgICAgICAgb3V0cHV0LnNjYXR0ZXJfcmVkdWNlXygKICAgICAgICAgICAgMCwKICAgICAgICAgICAgZXhwX3Rva2VuX2lkeHMudmlldygtMSwgMSkucmVwZWF0KDEsIGhpZGRlbl9kaW0pLAogICAgICAgICAgICBleHBlcnRfZGF0YVtleHBlcnRfaWRdLAogICAgICAgICAgICByZWR1Y2U9J3N1bScKICAgICAgICApCiAgICAKICAgIHJldHVybiBvdXRwdXQKCkB0b3JjaC5jb21waWxlCmRlZiBjb21wdXRlX3NoYXJlZF9leHBlcnQod2VpZ2h0cywgdG9rZW5zKToKICAgIHdfZ2F0ZSA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjAud2VpZ2h0J10KICAgIHdfdXAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddCiAgICB3X2Rvd24gPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddCgogICAgZ2F0ZSA9IEYuc2lsdSh0b2tlbnMgQCB3X2dhdGUpCiAgICB1cCA9IHRva2VucyBAIHdfdXAKICAgIGRvd24gPSAoZ2F0ZSAqIHVwKSBAIHdfZG93bgogICAgcmV0dXJuIGRvd24KCmRlZiBjb21wdXRlX3JvdXRpbmcod2VpZ2h0cywgdG9rZW5zLCB0b3BrKToKICAgICMgRm9yIHNvbWUgcmVhc29uLCByb3V0ZXIgd2VpZ2h0cyBhcmUgYWxyZWFkeSB0cmFuc3Bvc2VkPz8gU28gdHJhbnNwb3NlIGhlcmUuLi4KICAgIHdfZyA9IHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXS50KCkKICAgIGxvZ2l0cyA9IHRva2VucyBAIHdfZwogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQogICAgcmV0dXJuIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMKCmRlZiBjb21wdXRlX3JvdXRlZF9leHBlcnRzKAogICAgICAgIHdlaWdodHMsIAogICAgICAgIHRva2VucywgCiAgICAgICAgdG9waywgCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgZXhwZXJ0X2luZGljZXMsCiAgICAgICAgZXhwZXJ0X3Njb3JlcywKICAgICAgICBvdXRwdXQKICAgICk6CiAgICBnYXRlX3Byb2pfd2VpZ2h0cyA9IFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXSBmb3IgaSBpbiByYW5nZShudW1fZXhwZXJ0cyldCiAgICB1cF9wcm9qX3dlaWdodHMgPSBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjEud2VpZ2h0J10gZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpXQogICAgZG93bl9wcm9qX3dlaWdodHMgPSBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10gZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpXQogICAgCiAgICAjIGdldCB0b2tlbnMgZm9yIGVhY2ggZXhwZXJ0LCBidXQgY29tcHV0ZSBleHBlcnQgdHJhbnNmb3JtcyBpbiBwYXJhbGxlbCB3aXRoIGdyb3VwIGdlbW1zLgogICAgZ3JvdXBfdG9rZW4sIF8gPSBleHBlcnRfaW5wdXRfcGVybXV0ZSh0b2tlbnMsIGV4cGVydF9pbmRpY2VzLCB0b3BrKQoKICAgIGdhdGUgPSBncm91cF9nZW1tX2ZuKGdyb3VwX3Rva2VuLCBnYXRlX3Byb2pfd2VpZ2h0cywgYWN0aXZhdGlvbj1UcnVlKQogICAgdXAgPSBncm91cF9nZW1tX2ZuKGdyb3VwX3Rva2VuLCB1cF9wcm9qX3dlaWdodHMsIGFjdGl2YXRpb249RmFsc2UpCiAgICAgIyBUT0RPOiB0aGlzIHNob3VsZCBiZSBhbm90aGVyIGdyb3VwIGtlcm5lbCwgb3IgcG9zc2libGUgY29tYmluZWQgd2l0aCB0aGUgZG93biBwcm9qZWN0IGtlcm5lbAogICAgbGhzID0gW3RfZ2F0ZSAqIHRfdXAgZm9yICh0X2dhdGUsIHRfdXApIGluIHppcChnYXRlLCB1cCldCiAgICBncm91cF90b2tlbiA9IGdyb3VwX2dlbW1fZm4obGhzLCBkb3duX3Byb2pfd2VpZ2h0cywgYWN0aXZhdGlvbj1GYWxzZSkKCiAgICAjIHJvdXRlZCBleHBlcnRzIGdldCBhY2N1bXVsYXRlZCBvbnRvIG91dHB1dAogICAgZXhwZXJ0X291dHB1dF9wZXJtdXRlKAogICAgICAgIGdyb3VwX3Rva2VuLCAKICAgICAgICBleHBlcnRfaW5kaWNlcywgCiAgICAgICAgZXhwZXJ0X3Njb3JlcywgCiAgICAgICAgdG9waywgCiAgICAgICAgb3V0cHV0KQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YSk6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgbnVtX2V4cGVydHMgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgdG9wayA9IGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCgogICAgaGlkZGVuX3NpemUgPSBpbnB1dF90ZW5zb3Iuc2l6ZSgyKQogICAgb3JpZ2luYWxfc2hhcGUgPSBpbnB1dF90ZW5zb3Iuc2l6ZSgpCiAgICAKICAgIGZsYXRfdG9rZW5zID0gaW5wdXRfdGVuc29yLnZpZXcoLTEsIGhpZGRlbl9zaXplKQoKICAgIHNoYXJlZF9vdXRwdXQgPSBjb21wdXRlX3NoYXJlZF9leHBlcnQod2VpZ2h0cywgZmxhdF90b2tlbnMpCiAgICBzY29yZXMsIGluZGljZXMgPSBjb21wdXRlX3JvdXRpbmcod2VpZ2h0cywgZmxhdF90b2tlbnMsIHRvcGspCgogICAgY29tcHV0ZV9yb3V0ZWRfZXhwZXJ0cygKICAgICAgICB3ZWlnaHRzLAogICAgICAgIGZsYXRfdG9rZW5zLAogICAgICAgIHRvcGssCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgaW5kaWNlcywKICAgICAgICBzY29yZXMsCiAgICAgICAgc2hhcmVkX291dHB1dAogICAgKQoKICAgIHJldHVybiBzaGFyZWRfb3V0cHV0LnZpZXcob3JpZ2luYWxfc2hhcGUpCgojIElucHV0IGdlbmVyYXRpb24gZm9yIHRoZSByZWZlcmVuY2UgY29kZQoKZGVmIGdlbmVyYXRlX2lucHV0KAogICAgZGhpZGRlbjogaW50LAogICAgZGV4cGVydDogaW50LAogICAgbnJvdXRlZGV4cGVydHM6IGludCwKICAgIG5zaGFyZWRleHBlcnRzOiBpbnQsCiAgICBuZXhwZXJ0c3BlcnRva2VuOiBpbnQsCiAgICBiczogaW50LAogICAgc2VxbGVuOiBpbnQsCiAgICBzZWVkOiBpbnQKKToKCiAgICAjIFJlYWxseSBkdW1iIGJ1dCBmb3Igbm93IF8gaXNuJ3QgcGFyc2luZyBjb3JyZWN0bHkuCiAgICBkX2hpZGRlbiA9IGRoaWRkZW4KICAgIGRfZXhwZXJ0ID0gZGV4cGVydAogICAgbl9yb3V0ZWRfZXhwZXJ0cyA9IG5yb3V0ZWRleHBlcnRzCiAgICBuX3NoYXJlZF9leHBlcnRzID0gbnNoYXJlZGV4cGVydHMKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4gPSBuZXhwZXJ0c3BlcnRva2VuCiAgICBiYXRjaF9zaXplID0gYnMKICAgIHNlcV9sZW4gPSBzZXFsZW4KCiAgICBjb25maWcgPSB7CiAgICAgICAgImRfaGlkZGVuIjogZF9oaWRkZW4sCiAgICAgICAgImRfZXhwZXJ0IjogZF9leHBlcnQsCiAgICAgICAgIm5fcm91dGVkX2V4cGVydHMiOiBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICJuX3NoYXJlZF9leHBlcnRzIjogbl9zaGFyZWRfZXhwZXJ0cywKICAgICAgICAibl9leHBlcnRzX3Blcl90b2tlbiI6IG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgImJhdGNoX3NpemUiOiBiYXRjaF9zaXplLAogICAgICAgICJzZXFfbGVuIjogc2VxX2xlbiwKICAgIH0KCiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQoKICAgIG51bV9leHBlcnRzID0gbl9yb3V0ZWRfZXhwZXJ0cwogICAgZXhwZXJ0X2RpbSA9IGRfZXhwZXJ0CiAgICB3ZWlnaHRzID0ge30KCiAgICBpbnB1dF90ZW5zb3IgPSB0b3JjaC5yYW5kbigKICAgICAgICAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApLmNvbnRpZ3VvdXMoKQoKICAgICMgSW5pdGlhbGl6ZSByb3V0ZXIgd2VpZ2h0cwogICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKG51bV9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChleHBlcnRfZGltLCBkX2hpZGRlbiksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQogICAgCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgcmV0dXJuIChpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZykKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBpbnB1dCA9IGdlbmVyYXRlX2lucHV0KDEyOCwgMTI4LCA0LCAxLCAyLCA4LCA4LCAwKQogICAgb3V0cHV0ID0gY3VzdG9tX2tlcm5lbChpbnB1dCk=
No newline at end of file
+ ciIiIgpVc2VzIGEgZ3JvdXAgZ2VtbSwgaW5zdGVhZCBvZiBhIGxvb3Agb3ZlciBleHBlcnRzLgoiIiIKCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgVHVwbGUsIExpc3QsIE9wdGlvbmFsCmltcG9ydCBtYXRoCmltcG9ydCBlaW5vcHMKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpkZWYgbnVtX3NtcygpOgogICAgIyBNSTMwMCBoYXMgMzA0IENVcwogICAgcmV0dXJuIDMwNAoKQHRyaXRvbi5qaXQKZGVmIHNpbHUodGlsZSk6CiAgICAjIHByb2JhYmx5IG5vdCB0aGUgbW9zdCBhY2N1cmF0ZSAvIGZhc3Rlc3QgdGhpbmcgZXZlciA6LSkKICAgICMgdGwuZXhwIG5lZWRzIGZsb2F0MzIgb3IgZmxvYXQ2NC4KICAgIHJldHVybiB0aWxlICogKDEuMCAvICgxLjAgKyB0bC5leHAoLXRpbGUuY2FzdCh0bC5mbG9hdDMyKSkpKS5jYXN0KHRpbGUuZHR5cGUpCgpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1bCiAgICAgICAgdHJpdG9uLkNvbmZpZyh7CiAgICAgICAgICAgICdCTE9DS19TSVpFX00nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX04nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiAzMiwKICAgICAgICAgICAgJ05VTV9TTSc6IDg0LAogICAgICAgIH0pLAogICAgICAgIHRyaXRvbi5Db25maWcoewogICAgICAgICAgICAnQkxPQ0tfU0laRV9NJzogMTI4LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9OJzogMTI4LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9LJzogMzIsCiAgICAgICAgICAgICdOVU1fU00nOiAxMjgsCiAgICAgICAgfSksCiAgICAgICAgdHJpdG9uLkNvbmZpZyh7CiAgICAgICAgICAgICdCTE9DS19TSVpFX00nOiA2NCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTic6IDY0LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9LJzogMzIsCiAgICAgICAgICAgICdOVU1fU00nOiA4NCwKICAgICAgICB9KSwKICAgICAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTSc6IDY0LAogICAgICAgICAgICAnQkxPQ0tfU0laRV9OJzogNjQsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiAzMiwKICAgICAgICAgICAgJ05VTV9TTSc6IDEyOCwKICAgICAgICB9KSwKICAgICAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTSc6IDEyOCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfTic6IDEyOCwKICAgICAgICAgICAgJ0JMT0NLX1NJWkVfSyc6IDY0LAogICAgICAgICAgICAnTlVNX1NNJzogbnVtX3NtcygpLAogICAgICAgIH0pLAogICAgICAgIHRyaXRvbi5Db25maWcoewogICAgICAgICAgICAnQkxPQ0tfU0laRV9NJzogNjQsCiAgICAgICAgICAgICdCTE9DS19TSVpFX04nOiAxMjgsCiAgICAgICAgICAgICdCTE9DS19TSVpFX0snOiA2NCwKICAgICAgICAgICAgJ05VTV9TTSc6IG51bV9zbXMoKSwKICAgICAgICB9KSwKICAgIF0sCiAgICBrZXk9Wydncm91cF9zaXplJ10sCikKQHRyaXRvbi5qaXQKZGVmIGdyb3VwZWRfbWF0bXVsX2tlcm5lbCgKICAgICMgZGV2aWNlIHRlbnNvciBvZiBtYXRyaWNlcyBwb2ludGVycwogICAgZ3JvdXBfYV9wdHJzLAogICAgZ3JvdXBfYl9wdHJzLAogICAgZ3JvdXBfY19wdHJzLAogICAgIyBkZXZpY2UgdGVuc29yIG9mIGdlbW0gc2l6ZXMuIGl0cyBzaGFwZSBpcyBbZ3JvdXBfc2l6ZSwgM10KICAgICMgZGltIDAgaXMgZ3JvdXBfc2l6ZSwgZGltIDEgaXMgdGhlIHZhbHVlcyBvZiA8TSwgTiwgSz4gb2YgZWFjaCBnZW1tCiAgICBncm91cF9nZW1tX3NpemVzLAogICAgIyBkZXZpY2UgdGVuc29yIG9mIGxlYWRpbmcgZGltZW5zaW9uIHNpemVzLiBpdHMgc2hhcGUgaXMgW2dyb3VwX3NpemUsIDNdCiAgICAjIGRpbSAwIGlzIGdyb3VwX3NpemUsIGRpbSAxIGlzIHRoZSB2YWx1ZXMgb2YgPGxkYSwgbGRiLCBsZGM+IG9mIGVhY2ggZ2VtbQogICAgZ19sZHMsCiAgICAjIG51bWJlciBvZiBnZW1tcwogICAgZ3JvdXBfc2l6ZSwKICAgICMgbnVtYmVyIG9mIHZpcnR1YWwgU00KICAgIE5VTV9TTTogdGwuY29uc3RleHByLAogICAgIyB0aWxlIHNpemVzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBBQ1RJVkFUSU9OOiB0bC5jb25zdGV4cHIKKToKICAgIHIiIiIKICAgIFRoaXMgaXMgdGFrZW4gYW5kIG1vZGlmaWVkIGZyb20gdGhlIHRyaXRvbiB0dXRvcmlhbC4gCiAgICAgIC0gYWRkcyBtYXNraW5nIHRvIGdldCB3b3JraW5nIHdpdGggZGlmZmVyZW50IHNoYXBlcy4KICAgICAgLSBmdXNlcyB0aGUgU2lMVSBhY3RpdmF0aW9uIGZ1bmN0aW9uLiAKICAgICIiIgogICAgdGlsZV9pZHggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBsYXN0X3Byb2JsZW1fZW5kID0gMAogICAgZm9yIGcgaW4gcmFuZ2UoZ3JvdXBfc2l6ZSk6CiAgICAgICAgIyBnZXQgdGhlIGdlbW0gc2l6ZSBvZiB0aGUgY3VycmVudCBwcm9ibGVtCiAgICAgICAgZ20gPSB0bC5sb2FkKGdyb3VwX2dlbW1fc2l6ZXMgKyBnICogMykKICAgICAgICBnbiA9IHRsLmxvYWQoZ3JvdXBfZ2VtbV9zaXplcyArIGcgKiAzICsgMSkKICAgICAgICBnayA9IHRsLmxvYWQoZ3JvdXBfZ2VtbV9zaXplcyArIGcgKiAzICsgMikKICAgICAgICBudW1fbV90aWxlcyA9IHRsLmNkaXYoZ20sIEJMT0NLX1NJWkVfTSkKICAgICAgICBudW1fbl90aWxlcyA9IHRsLmNkaXYoZ24sIEJMT0NLX1NJWkVfTikKICAgICAgICBudW1fdGlsZXMgPSBudW1fbV90aWxlcyAqIG51bV9uX3RpbGVzCiAgICAgICAgIyBpdGVyYXRlIHRocm91Z2ggdGhlIHRpbGVzIGluIHRoZSBjdXJyZW50IGdlbW0gcHJvYmxlbQogICAgICAgIHdoaWxlICh0aWxlX2lkeCA+PSBsYXN0X3Byb2JsZW1fZW5kIGFuZCB0aWxlX2lkeCA8IGxhc3RfcHJvYmxlbV9lbmQgKyBudW1fdGlsZXMpOgogICAgICAgICAgICAjIHBpY2sgdXAgYSB0aWxlIGZyb20gdGhlIGN1cnJlbnQgZ2VtbSBwcm9ibGVtCiAgICAgICAgICAgIGsgPSBnawogICAgICAgICAgICBsZGEgPSB0bC5sb2FkKGdfbGRzICsgZyAqIDMpCiAgICAgICAgICAgIGxkYiA9IHRsLmxvYWQoZ19sZHMgKyBnICogMyArIDEpCiAgICAgICAgICAgIGxkYyA9IHRsLmxvYWQoZ19sZHMgKyBnICogMyArIDIpCiAgICAgICAgICAgIGFfcHRyID0gdGwubG9hZChncm91cF9hX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgIGJfcHRyID0gdGwubG9hZChncm91cF9iX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgIGNfcHRyID0gdGwubG9hZChncm91cF9jX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgICMgZmlndXJlIG91dCB0aWxlIGNvb3JkaW5hdGVzCiAgICAgICAgICAgIHRpbGVfaWR4X2luX2dlbW0gPSB0aWxlX2lkeCAtIGxhc3RfcHJvYmxlbV9lbmQKICAgICAgICAgICAgdGlsZV9tX2lkeCA9IHRpbGVfaWR4X2luX2dlbW0gLy8gbnVtX25fdGlsZXMKICAgICAgICAgICAgdGlsZV9uX2lkeCA9IHRpbGVfaWR4X2luX2dlbW0gJSBudW1fbl90aWxlcwoKICAgICAgICAgICAgIyBkbyByZWd1bGFyIGdlbW0gaGVyZQogICAgICAgICAgICBvZmZzX2FtID0gdGlsZV9tX2lkeCAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pCiAgICAgICAgICAgIG9mZnNfYm4gPSB0aWxlX25faWR4ICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICAgICAgb2Zmc19rID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfSykKICAgICAgICAgICAgYV9wdHJzID0gYV9wdHIgKyBvZmZzX2FtWzosIE5vbmVdICogbGRhICsgb2Zmc19rW05vbmUsIDpdCiAgICAgICAgICAgIGJfcHRycyA9IGJfcHRyICsgb2Zmc19rWzosIE5vbmVdICogbGRiICsgb2Zmc19ibltOb25lLCA6XQogICAgICAgICAgICAKICAgICAgICAgICAgbV9tYXNrID0gb2Zmc19hbSA8IGdtCiAgICAgICAgICAgIG5fbWFzayA9IG9mZnNfYm4gPCBnbgogICAgICAgICAgICAKICAgICAgICAgICAgYWNjdW11bGF0b3IgPSB0bC56ZXJvcygoQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX04pLCBkdHlwZT10bC5mbG9hdDMyKQogICAgICAgICAgICBmb3Iga2sgaW4gcmFuZ2UoMCwgdGwuY2RpdihrLCBCTE9DS19TSVpFX0spKToKICAgICAgICAgICAgICAgICMgaGludCB0byBUcml0b24gY29tcGlsZXIgdG8gZG8gcHJvcGVyIGxvb3AgcGlwZWxpbmluZwogICAgICAgICAgICAgICAgdGwubXVsdGlwbGVfb2YoYV9wdHJzLCBbMTYsIDE2XSkKICAgICAgICAgICAgICAgIHRsLm11bHRpcGxlX29mKGJfcHRycywgWzE2LCAxNl0pCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGtfbWFzayA9IGtrICsgb2Zmc19rIDwgZ2sKICAgICAgICAgICAgICAgIGFfbWFzayA9IG1fbWFza1s6LCBOb25lXSBhbmQga19tYXNrW05vbmUsIDpdCiAgICAgICAgICAgICAgICBiX21hc2sgPSBrX21hc2tbOiwgTm9uZV0gYW5kIG5fbWFza1tOb25lLCA6XQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9YV9tYXNrKQogICAgICAgICAgICAgICAgYiA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPWJfbWFzaykKICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IHRsLmRvdChhLCBiKQogICAgICAgICAgICAgICAgYV9wdHJzICs9IEJMT0NLX1NJWkVfSwogICAgICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIGxkYgogICAgICAgICAgICBjID0gYWNjdW11bGF0b3IudG8odGwuZmxvYXQxNikKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIEFDVElWQVRJT046CiAgICAgICAgICAgICAgICBjID0gc2lsdShjKQoKICAgICAgICAgICAgb2Zmc19jbSA9IHRpbGVfbV9pZHggKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKQogICAgICAgICAgICBvZmZzX2NuID0gdGlsZV9uX2lkeCAqIEJMT0NLX1NJWkVfTiArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX04pCiAgICAgICAgICAgIGNfcHRycyA9IGNfcHRyICsgbGRjICogb2Zmc19jbVs6LCBOb25lXSArIG9mZnNfY25bTm9uZSwgOl0KCiAgICAgICAgICAgIGNfbWFzayA9IG1fbWFza1s6LCBOb25lXSBhbmQgbl9tYXNrW05vbmUsIDpdCiAgICAgICAgICAgIHRsLnN0b3JlKGNfcHRycywgYywgbWFzaz1jX21hc2spCgogICAgICAgICAgICAjIGdvIHRvIHRoZSBuZXh0IHRpbGUgYnkgYWR2YW5jaW5nIE5VTV9TTQogICAgICAgICAgICB0aWxlX2lkeCArPSBOVU1fU00KCiAgICAgICAgIyBnZXQgcmVhZHkgdG8gZ28gdG8gdGhlIG5leHQgZ2VtbSBwcm9ibGVtCiAgICAgICAgbGFzdF9wcm9ibGVtX2VuZCA9IGxhc3RfcHJvYmxlbV9lbmQgKyBudW1fdGlsZXMKCmRlZiBncm91cF9nZW1tX2ZuKAogICAgICAgIGdyb3VwX0E6IExpc3RbdG9yY2guVGVuc29yXSwKICAgICAgICBncm91cF9COiBMaXN0W3RvcmNoLlRlbnNvcl0sCiAgICAgICAgYWN0aXZhdGlvbjogYm9vbAogICAgKToKICAgIGFzc2VydCBsZW4oZ3JvdXBfQSkgPT0gbGVuKGdyb3VwX0IpCgogICAgREVWSUNFID0gJ2N1ZGEnCiAgICBncm91cF9zaXplID0gbGVuKGdyb3VwX0EpCgogICAgQV9hZGRycyA9IFtdCiAgICBCX2FkZHJzID0gW10KICAgIENfYWRkcnMgPSBbXQogICAgZ19zaXplcyA9IFtdCiAgICBnX2xkcyA9IFtdCiAgICBncm91cF9DID0gW10KICAgIGZvciBpIGluIHJhbmdlKGdyb3VwX3NpemUpOiAgICAgICAgCiAgICAgICAgQSA9IGdyb3VwX0FbaV0KICAgICAgICBCID0gZ3JvdXBfQltpXQogICAgICAgIGFzc2VydCBBLnNoYXBlWzFdID09IEIuc2hhcGVbMF0KICAgICAgICBNLCBLID0gQS5zaGFwZQogICAgICAgIEssIE4gPSBCLnNoYXBlCiAgICAgICAgCiAgICAgICAgQyA9IHRvcmNoLmVtcHR5KChNLCBOKSwgZGV2aWNlPURFVklDRSwgZHR5cGU9QS5kdHlwZSkKICAgICAgICBncm91cF9DLmFwcGVuZChDKQogICAgICAgIEFfYWRkcnMuYXBwZW5kKEEuZGF0YV9wdHIoKSkKICAgICAgICBCX2FkZHJzLmFwcGVuZChCLmRhdGFfcHRyKCkpCiAgICAgICAgQ19hZGRycy5hcHBlbmQoQy5kYXRhX3B0cigpKQogICAgICAgIGdfc2l6ZXMgKz0gW00sIE4sIEtdCiAgICAgICAgZ19sZHMgKz0gW0Euc3RyaWRlKDApLCBCLnN0cmlkZSgwKSwgQy5zdHJpZGUoMCldCiAgICAgICAgCiAgICAjIG5vdGUgdGhlc2UgYXJlIGRldmljZSB0ZW5zb3JzCiAgICBkX2FfcHRycyA9IHRvcmNoLnRlbnNvcihBX2FkZHJzLCBkZXZpY2U9REVWSUNFKQogICAgZF9iX3B0cnMgPSB0b3JjaC50ZW5zb3IoQl9hZGRycywgZGV2aWNlPURFVklDRSkKICAgIGRfY19wdHJzID0gdG9yY2gudGVuc29yKENfYWRkcnMsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfc2l6ZXMgPSB0b3JjaC50ZW5zb3IoZ19zaXplcywgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfbGRzID0gdG9yY2gudGVuc29yKGdfbGRzLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPURFVklDRSkKICAgICMgd2UgdXNlIGEgZml4ZWQgbnVtYmVyIG9mIENUQSwgYW5kIGl0J3MgYXV0by10dW5hYmxlCiAgICBncmlkID0gbGFtYmRhIE1FVEE6IChNRVRBWydOVU1fU00nXSwgKQogICAgZ3JvdXBlZF9tYXRtdWxfa2VybmVsW2dyaWRdKAogICAgICAgIGRfYV9wdHJzLAogICAgICAgIGRfYl9wdHJzLAogICAgICAgIGRfY19wdHJzLAogICAgICAgIGRfZ19zaXplcywKICAgICAgICBkX2dfbGRzLAogICAgICAgIGdyb3VwX3NpemUsCiAgICAgICAgQUNUSVZBVElPTj1hY3RpdmF0aW9uCiAgICApCgogICAgcmV0dXJuIGdyb3VwX0MKCmRlZiBnZXRfdG9rZW5faW5kaWNlcyhleHBlcnRfaW5kaWNlcywgbnVtX2V4cGVydHNfcGVyX3Rva2VuKToKICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgaW5kaWNlcyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYXJnc29ydCgpCiAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKSAjIFRPRE86IHdoeSBtb3ZlIHRvIGNwdT8KICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlID0gY291bnRzLmN1bXN1bSgpCiAgICB0b2tlbl9pbmRpY2VzID0gaW5kaWNlcyAvLyBudW1fZXhwZXJ0c19wZXJfdG9rZW4KICAgIHJldHVybiBpbmRpY2VzLCB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZSwgdG9rZW5faW5kaWNlcwoKQHRvcmNoLmNvbXBpbGUKZGVmIGV4cGVydF9pbnB1dF9wZXJtdXRlKAogICAgdG9rZW5zOiB0b3JjaC5UZW5zb3IsIAogICAgZXhwZXJ0X2luZGljZXM6IHRvcmNoLlRlbnNvciwgCiAgICBudW1fZXhwZXJ0c19wZXJfdG9rZW46IGludAopIC0+IExpc3RbdG9yY2guVGVuc29yXToKICAgIF8sIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzID0gZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbikKICAgIAogICAgZXhwZXJ0X2RhdGEgPSBbXQogICAgZm9yIGV4cGVydF9pZCwgZW5kX2lkeCBpbiBlbnVtZXJhdGUodG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UpOgogICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZVtleHBlcnRfaWQgLSAxXQogICAgICAgIGlmIHN0YXJ0X2lkeCA9PSBlbmRfaWR4OgogICAgICAgICAgICAjIHRyaXRvbiBncm91cCBnZW1tIG5lZWRzIGxlbihncm91cF9BKSA9PSBsZW4oZ3JvdXBfQiksCiAgICAgICAgICAgICMgYWRkaW5nIGFuIGVtcHR5IGxpc3QgaXMganVzdCBhIGhhY2sgdG8gZW5zdXJlIHRoZSBncm91cCBzaXplcyBhcmUgdGhlCiAgICAgICAgICAgICMgc2FtZS4gVGhpcyBjb3VsZC9zaG91bGQgYWxzbyBiZSBkb25lIGJ5IG5vdCBwYXNzaW5nIGluIHdlaWdodHMgaWYgdGhlCiAgICAgICAgICAgICMgY29ycmVzcG9uZGluZyBleHBlcnQgZ2V0cyBubyB0b2tlbnMuCiAgICAgICAgICAgIGV4cGVydF9kYXRhLmFwcGVuZCh0b3JjaC5lbXB0eSgoMCwgdG9rZW5zLnNpemUoLTEpKSkpCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgCiAgICAgICAgZXhwX3Rva2VuX2lkeHMgPSB0b2tlbl9pbmRpY2VzW3N0YXJ0X2lkeDplbmRfaWR4XQogICAgICAgIGV4cGVydF90b2tlbnMgPSB0b2tlbnNbZXhwX3Rva2VuX2lkeHNdCiAgICAgICAgZXhwZXJ0X2RhdGEuYXBwZW5kKGV4cGVydF90b2tlbnMpCiAgICAgICAgCiAgICByZXR1cm4gZXhwZXJ0X2RhdGEsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlCgpAdG9yY2guY29tcGlsZQpkZWYgZXhwZXJ0X291dHB1dF9wZXJtdXRlKAogICAgZXhwZXJ0X2RhdGE6IExpc3RbdG9yY2guVGVuc29yXSwgCiAgICBleHBlcnRfaW5kaWNlczogdG9yY2guVGVuc29yLCAKICAgIGV4cGVydF93ZWlnaHRzOiB0b3JjaC5UZW5zb3IsIAogICAgbnVtX2V4cGVydHNfcGVyX3Rva2VuOiBpbnQsCiAgICBvdXRwdXQ6IHRvcmNoLlRlbnNvciwKKSAtPiB0b3JjaC5UZW5zb3I6CiAgICBoaWRkZW5fZGltID0gZXhwZXJ0X2RhdGFbMF0uc2l6ZSgtMSkKICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfd2VpZ2h0cy52aWV3KC0xLCAxKQoKICAgIGluZGljZXMsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzID0gZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbikKICAgIAogICAgZm9yIGV4cGVydF9pZCwgZW5kX2lkeCBpbiBlbnVtZXJhdGUodG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UpOgogICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZVtleHBlcnRfaWQgLSAxXQogICAgICAgIGlmIHN0YXJ0X2lkeCA9PSBlbmRfaWR4OgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIAogICAgICAgICMgbXVsdGlwbHkgdG9rZW4gYnkgYnkgZXhwZXJ0IHdlaWdodHMgYW5kIHJlZHVjZQogICAgICAgIGV4cGVydF9kYXRhW2V4cGVydF9pZF0ubXVsXyhmbGF0X2V4cGVydF93ZWlnaHRzW2luZGljZXNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2luZGljZXNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgCiAgICAgICAgIyBkaXJlY3RseSBhY2N1bXVsYXRlIG9udG8gb3V0cHV0IHRlbnNvcgogICAgICAgIG91dHB1dC5zY2F0dGVyX3JlZHVjZV8oCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzLnZpZXcoLTEsIDEpLnJlcGVhdCgxLCBoaWRkZW5fZGltKSwKICAgICAgICAgICAgZXhwZXJ0X2RhdGFbZXhwZXJ0X2lkXSwKICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgKQogICAgCiAgICByZXR1cm4gb3V0cHV0CgpAdG9yY2guY29tcGlsZQpkZWYgY29tcHV0ZV9zaGFyZWRfZXhwZXJ0KHdlaWdodHMsIHRva2Vucyk6CiAgICB3X2dhdGUgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddCiAgICB3X3VwID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXQogICAgd19kb3duID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXQoKICAgIGdhdGUgPSBGLnNpbHUodG9rZW5zIEAgd19nYXRlKQogICAgdXAgPSB0b2tlbnMgQCB3X3VwCiAgICBkb3duID0gKGdhdGUgKiB1cCkgQCB3X2Rvd24KICAgIHJldHVybiBkb3duCgpAdG9yY2guY29tcGlsZQpkZWYgY29tcHV0ZV9yb3V0aW5nKHdlaWdodHMsIHRva2VucywgdG9wayk6CiAgICAjIEZvciBzb21lIHJlYXNvbiwgcm91dGVyIHdlaWdodHMgYXJlIGFscmVhZHkgdHJhbnNwb3NlZD8/IFNvIHRyYW5zcG9zZSBoZXJlLi4uCiAgICB3X2cgPSB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10udCgpCiAgICBsb2dpdHMgPSB0b2tlbnMgQCB3X2cKICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgaz10b3BrLCBkaW09LTEsIHNvcnRlZD1GYWxzZSkKICAgIHJldHVybiB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzCgpkZWYgY29tcHV0ZV9yb3V0ZWRfZXhwZXJ0cygKICAgICAgICB3ZWlnaHRzLCAKICAgICAgICB0b2tlbnMsIAogICAgICAgIHRvcGssIAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIGV4cGVydF9pbmRpY2VzLAogICAgICAgIGV4cGVydF9zY29yZXMsCiAgICAgICAgb3V0cHV0CiAgICApOgogICAgZ2F0ZV9wcm9qX3dlaWdodHMgPSBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10gZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpXQogICAgdXBfcHJval93ZWlnaHRzID0gW3dlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKV0KICAgIGRvd25fcHJval93ZWlnaHRzID0gW3dlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKV0KICAgIAogICAgIyBnZXQgdG9rZW5zIGZvciBlYWNoIGV4cGVydCwgYnV0IGNvbXB1dGUgZXhwZXJ0IHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwgd2l0aCBncm91cCBnZW1tcy4KICAgIGdyb3VwX3Rva2VuLCBfID0gZXhwZXJ0X2lucHV0X3Blcm11dGUodG9rZW5zLCBleHBlcnRfaW5kaWNlcywgdG9waykKCiAgICBnYXRlID0gZ3JvdXBfZ2VtbV9mbihncm91cF90b2tlbiwgZ2F0ZV9wcm9qX3dlaWdodHMsIGFjdGl2YXRpb249VHJ1ZSkKICAgIHVwID0gZ3JvdXBfZ2VtbV9mbihncm91cF90b2tlbiwgdXBfcHJval93ZWlnaHRzLCBhY3RpdmF0aW9uPUZhbHNlKQogICAgIyBUT0RPOiB0aGlzIHNob3VsZCBiZSBhbm90aGVyIGdyb3VwIGtlcm5lbCwgb3IgcG9zc2libHkgY29tYmluZWQgd2l0aCB0aGUgZG93biBwcm9qZWN0IGtlcm5lbAogICAgbGhzID0gW3RfZ2F0ZSAqIHRfdXAgZm9yICh0X2dhdGUsIHRfdXApIGluIHppcChnYXRlLCB1cCldCiAgICBncm91cF90b2tlbiA9IGdyb3VwX2dlbW1fZm4obGhzLCBkb3duX3Byb2pfd2VpZ2h0cywgYWN0aXZhdGlvbj1GYWxzZSkKCiAgICAjIHJvdXRlZCBleHBlcnRzIGdldCBhY2N1bXVsYXRlZCBvbnRvIG91dHB1dAogICAgZXhwZXJ0X291dHB1dF9wZXJtdXRlKAogICAgICAgIGdyb3VwX3Rva2VuLCAKICAgICAgICBleHBlcnRfaW5kaWNlcywgCiAgICAgICAgZXhwZXJ0X3Njb3JlcywgCiAgICAgICAgdG9waywgCiAgICAgICAgb3V0cHV0KQoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YSk6CiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIG51bV9leHBlcnRzID0gY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0KICAgIHRvcGsgPSBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXQoKICAgIGhpZGRlbl9zaXplID0gaW5wdXRfdGVuc29yLnNpemUoMikKICAgIG9yaWdpbmFsX3NoYXBlID0gaW5wdXRfdGVuc29yLnNpemUoKQogICAgCiAgICBmbGF0X3Rva2VucyA9IGlucHV0X3RlbnNvci52aWV3KC0xLCBoaWRkZW5fc2l6ZSkKCiAgICBzaGFyZWRfb3V0cHV0ID0gY29tcHV0ZV9zaGFyZWRfZXhwZXJ0KHdlaWdodHMsIGZsYXRfdG9rZW5zKQogICAgc2NvcmVzLCBpbmRpY2VzID0gY29tcHV0ZV9yb3V0aW5nKHdlaWdodHMsIGZsYXRfdG9rZW5zLCB0b3BrKQoKICAgIGNvbXB1dGVfcm91dGVkX2V4cGVydHMoCiAgICAgICAgd2VpZ2h0cywKICAgICAgICBmbGF0X3Rva2VucywKICAgICAgICB0b3BrLAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIGluZGljZXMsCiAgICAgICAgc2NvcmVzLAogICAgICAgIHNoYXJlZF9vdXRwdXQKICAgICkKCiAgICByZXR1cm4gc2hhcmVkX291dHB1dC52aWV3KG9yaWdpbmFsX3NoYXBlKQoKIyBJbnB1dCBnZW5lcmF0aW9uIGZvciB0aGUgcmVmZXJlbmNlIGNvZGUKCmRlZiBnZW5lcmF0ZV9pbnB1dCgKICAgIGRoaWRkZW46IGludCwKICAgIGRleHBlcnQ6IGludCwKICAgIG5yb3V0ZWRleHBlcnRzOiBpbnQsCiAgICBuc2hhcmVkZXhwZXJ0czogaW50LAogICAgbmV4cGVydHNwZXJ0b2tlbjogaW50LAogICAgYnM6IGludCwKICAgIHNlcWxlbjogaW50LAogICAgc2VlZDogaW50Cik6CgogICAgIyBSZWFsbHkgZHVtYiBidXQgZm9yIG5vdyBfIGlzbid0IHBhcnNpbmcgY29ycmVjdGx5LgogICAgZF9oaWRkZW4gPSBkaGlkZGVuCiAgICBkX2V4cGVydCA9IGRleHBlcnQKICAgIG5fcm91dGVkX2V4cGVydHMgPSBucm91dGVkZXhwZXJ0cwogICAgbl9zaGFyZWRfZXhwZXJ0cyA9IG5zaGFyZWRleHBlcnRzCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuID0gbmV4cGVydHNwZXJ0b2tlbgogICAgYmF0Y2hfc2l6ZSA9IGJzCiAgICBzZXFfbGVuID0gc2VxbGVuCgogICAgY29uZmlnID0gewogICAgICAgICJkX2hpZGRlbiI6IGRfaGlkZGVuLAogICAgICAgICJkX2V4cGVydCI6IGRfZXhwZXJ0LAogICAgICAgICJuX3JvdXRlZF9leHBlcnRzIjogbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICAibl9zaGFyZWRfZXhwZXJ0cyI6IG5fc2hhcmVkX2V4cGVydHMsCiAgICAgICAgIm5fZXhwZXJ0c19wZXJfdG9rZW4iOiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICJiYXRjaF9zaXplIjogYmF0Y2hfc2l6ZSwKICAgICAgICAic2VxX2xlbiI6IHNlcV9sZW4sCiAgICB9CgogICAgZ2VuID0gdG9yY2guR2VuZXJhdG9yKGRldmljZT0nY3VkYScpCiAgICBnZW4ubWFudWFsX3NlZWQoc2VlZCkKCiAgICBudW1fZXhwZXJ0cyA9IG5fcm91dGVkX2V4cGVydHMKICAgIGV4cGVydF9kaW0gPSBkX2V4cGVydAogICAgd2VpZ2h0cyA9IHt9CgogICAgaW5wdXRfdGVuc29yID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSwKICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgZ2VuZXJhdG9yPWdlbgogICAgKS5jb250aWd1b3VzKCkKCiAgICAjIEluaXRpYWxpemUgcm91dGVyIHdlaWdodHMKICAgIHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgIChudW1fZXhwZXJ0cywgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0iY3VkYSIsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQoKICAgIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKToKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltKQoKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltKQoKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZXhwZXJ0X2RpbSwgZF9oaWRkZW4pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChkX2hpZGRlbikKICAgIAogICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzKQogICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMS53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzKQogICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgIChleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQoKICAgIHJldHVybiAoaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcpCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgaW5wdXQgPSBnZW5lcmF0ZV9pbnB1dCgxMjgsIDEyOCwgNCwgMSwgMiwgOCwgOCwgMCkKICAgIG91dHB1dCA9IGN1c3RvbV9rZXJuZWwoaW5wdXQp
No newline at end of file

Best evidence level for this revision: reported

JSON