Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 31459

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_2.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-31459?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
5.90ms
#43 of 118
2025-06-05
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
14.3ms
#41 of 118
2025-06-05

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:07e37d08257a7189ce2017ca0cd4a7fd728b4357e8d6e8b06bccba3aa017c661
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

group_gemm_functional_2.py1 lines
ciIiIgpVc2VzIGEgZ3JvdXAgZ2VtbSwgaW5zdGVhZCBvZiBhIGxvb3Agb3ZlciBleHBlcnRzLgoiIiIKCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgVHVwbGUsIExpc3QsIE9wdGlvbmFsCmltcG9ydCBtYXRoCmltcG9ydCBlaW5vcHMKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcwoKQGRhdGFjbGFzcwpjbGFzcyBHcm91cGVkVG9rZW5zOgogICAgdG9rZW5zOiB0b3JjaC5UZW5zb3IKICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlOiB0b3JjaC50ZW5zb3IKICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlX2NwdTogdG9yY2gudGVuc29yCiAgICBpbmRpY2VzOiB0b3JjaC5UZW5zb3IKICAgIHRva2VuX2dhdGhlcl9pbmRpY2VzOiB0b3JjaC5UZW5zb3IKCkB0cml0b24uaml0CmRlZiBzaWx1KHRpbGUpOgogICAgIyB0bC5leHAgbmVlZHMgZmxvYXQzMiBvciBmbG9hdDY0LgogICAgcmV0dXJuIHRpbGUgKiAoMS4wIC8gKDEuMCArIHRsLmV4cCgtdGlsZSkpKQoKZGVmIG51bV9zbXMoKToKICAgICMgTUkzMDAgaGFzIDMwNCBDVXMKICAgIHJldHVybiAyICogMzA0Cgpjb25maWdzID0gWwogICAgIyBNLCBOLCBLLCB3YXJwcywgc3RhZ2VzCiAgICAjIGZvciBBTUQsIG51bSBzdGFnZXMgc2hvdWxkIGJlIDEgb3IgMi4KICAgICgxMjgsIDEyOCwgMTI4LCA0LCAyKSwKICAgICgxMjgsIDEyOCwgNjQsIDQsIDIpLAogICAgKDEyOCwgMTI4LCAzMiwgNCwgMiksCiAgICAoMjU2LCAyNTYsIDY0LCA0LCAyKSwKICAgICg2NCwgMTI4LCAxMjgsIDQsIDIpLAogICAgKDEyOCwgMTI4LCAxMjgsIDgsIDIpLAogICAgKDI1NiwgMjU2LCA2NCwgOCwgMiksCiAgICAoNjQsIDY0LCAxMjgsIDQsIDIpLAogICAgKDY0LCA2NCwgMjU2LCA0LCAyKSwKICAgICgxMjgsIDY0LCAyNTYsIDQsIDIpCl0KCmNvbmZpZ3MgPSBbCiAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAnQkxPQ0tfU0laRV9NJzogY1swXSwKICAgICAgICAnQkxPQ0tfU0laRV9OJzogY1sxXSwKICAgICAgICAnQkxPQ0tfU0laRV9LJzogY1syXSwKICAgICAgICAnbnVtX3dhcnBzJzogY1szXSwKICAgICAgICAnbnVtX3N0YWdlcyc6IGNbNF0sCiAgICAgICAgJ05VTV9TTSc6IG51bV9zbXMoKQogICAgfSkgZm9yIGMgaW4gY29uZmlncwpdCgpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1jb25maWdzLAogICAga2V5PVsnZ3JvdXBfc2l6ZSddLAopCkB0cml0b24uaml0CmRlZiBncm91cGVkX21hdG11bF9rZXJuZWwoCiAgICAjIGRldmljZSB0ZW5zb3Igb2YgbWF0cmljZXMgcG9pbnRlcnMKICAgIGdyb3VwX2FfcHRycywKICAgIGdyb3VwX2JfcHRycywKICAgIGdyb3VwX2NfcHRycywKICAgICMgZGV2aWNlIHRlbnNvciBvZiBnZW1tIHNpemVzLiBpdHMgc2hhcGUgaXMgW2dyb3VwX3NpemUsIDNdCiAgICAjIGRpbSAwIGlzIGdyb3VwX3NpemUsIGRpbSAxIGlzIHRoZSB2YWx1ZXMgb2YgPE0sIE4sIEs+IG9mIGVhY2ggZ2VtbQogICAgZ3JvdXBfZ2VtbV9zaXplcywKICAgICMgZGV2aWNlIHRlbnNvciBvZiBsZWFkaW5nIGRpbWVuc2lvbiBzaXplcy4gaXRzIHNoYXBlIGlzIFtncm91cF9zaXplLCAzXQogICAgIyBkaW0gMCBpcyBncm91cF9zaXplLCBkaW0gMSBpcyB0aGUgdmFsdWVzIG9mIDxsZGEsIGxkYiwgbGRjPiBvZiBlYWNoIGdlbW0KICAgIGdfbGRzLAogICAgIyBudW1iZXIgb2YgZ2VtbXMKICAgIGdyb3VwX3NpemUsCiAgICBBQ1RJVkFUSU9OOiB0bC5jb25zdGV4cHIsCiAgICAjIG51bWJlciBvZiB2aXJ0dWFsIFNNCiAgICBOVU1fU006IHRsLmNvbnN0ZXhwciwKICAgICMgdGlsZSBzaXplcwogICAgQkxPQ0tfU0laRV9NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfSzogdGwuY29uc3RleHByLAopOgogICAgdGlsZV9pZHggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBsYXN0X3Byb2JsZW1fZW5kID0gMAogICAgZm9yIGcgaW4gcmFuZ2UoZ3JvdXBfc2l6ZSk6CiAgICAgICAgIyBnZXQgdGhlIGdlbW0gc2l6ZSBvZiB0aGUgY3VycmVudCBwcm9ibGVtCiAgICAgICAgZ20gPSB0bC5sb2FkKGdyb3VwX2dlbW1fc2l6ZXMgKyBnICogMykKICAgICAgICBnbiA9IHRsLmxvYWQoZ3JvdXBfZ2VtbV9zaXplcyArIGcgKiAzICsgMSkKICAgICAgICBnayA9IHRsLmxvYWQoZ3JvdXBfZ2VtbV9zaXplcyArIGcgKiAzICsgMikKICAgICAgICBudW1fbV90aWxlcyA9IHRsLmNkaXYoZ20sIEJMT0NLX1NJWkVfTSkKICAgICAgICBudW1fbl90aWxlcyA9IHRsLmNkaXYoZ24sIEJMT0NLX1NJWkVfTikKICAgICAgICBudW1fdGlsZXMgPSBudW1fbV90aWxlcyAqIG51bV9uX3RpbGVzCiAgICAgICAgIyBpdGVyYXRlIHRocm91Z2ggdGhlIHRpbGVzIGluIHRoZSBjdXJyZW50IGdlbW0gcHJvYmxlbQogICAgICAgIHdoaWxlICh0aWxlX2lkeCA+PSBsYXN0X3Byb2JsZW1fZW5kIGFuZCB0aWxlX2lkeCA8IGxhc3RfcHJvYmxlbV9lbmQgKyBudW1fdGlsZXMpOgogICAgICAgICAgICAjIHBpY2sgdXAgYSB0aWxlIGZyb20gdGhlIGN1cnJlbnQgZ2VtbSBwcm9ibGVtCiAgICAgICAgICAgIGsgPSBnawogICAgICAgICAgICBsZGEgPSB0bC5sb2FkKGdfbGRzICsgZyAqIDMpCiAgICAgICAgICAgIGxkYiA9IHRsLmxvYWQoZ19sZHMgKyBnICogMyArIDEpCiAgICAgICAgICAgIGxkYyA9IHRsLmxvYWQoZ19sZHMgKyBnICogMyArIDIpCiAgICAgICAgICAgIGFfcHRyID0gdGwubG9hZChncm91cF9hX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgIGJfcHRyID0gdGwubG9hZChncm91cF9iX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgIGNfcHRyID0gdGwubG9hZChncm91cF9jX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgICMgZmlndXJlIG91dCB0aWxlIGNvb3JkaW5hdGVzCiAgICAgICAgICAgIHRpbGVfaWR4X2luX2dlbW0gPSB0aWxlX2lkeCAtIGxhc3RfcHJvYmxlbV9lbmQKICAgICAgICAgICAgdGlsZV9tX2lkeCA9IHRpbGVfaWR4X2luX2dlbW0gLy8gbnVtX25fdGlsZXMKICAgICAgICAgICAgdGlsZV9uX2lkeCA9IHRpbGVfaWR4X2luX2dlbW0gJSBudW1fbl90aWxlcwoKICAgICAgICAgICAgIyBkbyByZWd1bGFyIGdlbW0gaGVyZQogICAgICAgICAgICBvZmZzX2FtID0gdGlsZV9tX2lkeCAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pCiAgICAgICAgICAgIG9mZnNfYm4gPSB0aWxlX25faWR4ICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICAgICAgb2Zmc19rID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfSykKICAgICAgICAgICAgYV9wdHJzID0gYV9wdHIgKyBvZmZzX2FtWzosIE5vbmVdICogbGRhICsgb2Zmc19rW05vbmUsIDpdCiAgICAgICAgICAgIGJfcHRycyA9IGJfcHRyICsgb2Zmc19rWzosIE5vbmVdICogbGRiICsgb2Zmc19ibltOb25lLCA6XQogICAgICAgICAgICAKICAgICAgICAgICAgbV9tYXNrID0gb2Zmc19hbSA8IGdtCiAgICAgICAgICAgIAogICAgICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCiAgICAgICAgICAgIGZvciBrayBpbiByYW5nZSgwLCB0bC5jZGl2KGssIEJMT0NLX1NJWkVfSykpOgogICAgICAgICAgICAgICAgIyBoaW50IHRvIFRyaXRvbiBjb21waWxlciB0byBkbyBwcm9wZXIgbG9vcCBwaXBlbGluaW5nCiAgICAgICAgICAgICAgICB0bC5tdWx0aXBsZV9vZihhX3B0cnMsIFsxNiwgMTZdKQogICAgICAgICAgICAgICAgdGwubXVsdGlwbGVfb2YoYl9wdHJzLCBbMTYsIDE2XSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGEgPSB0bC5sb2FkKGFfcHRycywgbWFzaz1tX21hc2tbOiwgTm9uZV0pCiAgICAgICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCiAgICAgICAgICAgICAgICBhY2N1bXVsYXRvciA9IHRsLmRvdChhLCBiLCBhY2M9YWNjdW11bGF0b3IpCiAgICAgICAgICAgICAgICBhX3B0cnMgKz0gQkxPQ0tfU0laRV9LCiAgICAgICAgICAgICAgICBiX3B0cnMgKz0gQkxPQ0tfU0laRV9LICogbGRiCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgQUNUSVZBVElPTjoKICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gc2lsdShhY2N1bXVsYXRvcikKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBjID0gYWNjdW11bGF0b3IudG8odGwuZmxvYXQxNikKCiAgICAgICAgICAgIG9mZnNfY20gPSB0aWxlX21faWR4ICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICAgICAgb2Zmc19jbiA9IHRpbGVfbl9pZHggKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgICAgICAgICBjX3B0cnMgPSBjX3B0ciArIGxkYyAqIG9mZnNfY21bOiwgTm9uZV0gKyBvZmZzX2NuW05vbmUsIDpdCgogICAgICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGMsIG1hc2s9bV9tYXNrWzosIE5vbmVdKQoKICAgICAgICAgICAgIyBnbyB0byB0aGUgbmV4dCB0aWxlIGJ5IGFkdmFuY2luZyBOVU1fU00KICAgICAgICAgICAgdGlsZV9pZHggKz0gdGwubnVtX3Byb2dyYW1zKGF4aXM9MCkKCiAgICAgICAgIyBnZXQgcmVhZHkgdG8gZ28gdG8gdGhlIG5leHQgZ2VtbSBwcm9ibGVtCiAgICAgICAgbGFzdF9wcm9ibGVtX2VuZCA9IGxhc3RfcHJvYmxlbV9lbmQgKyBudW1fdGlsZXMKCmRlZiBnZXRfYV9hZGRycyhncm91cF9BOiBHcm91cGVkVG9rZW5zLCBncm91cF9zaXplOiBpbnQpOgogICAgYV9hZGRycyA9IFtdCiAgICBhX3NoYXBlcyA9IFtdCiAgICBmb3IgaSBpbiByYW5nZShncm91cF9zaXplKToKICAgICAgICBlbmRfaWR4ID0gZ3JvdXBfQS50b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHVbaV0KICAgICAgICBzdGFydF9pZHggPSAwIGlmIGkgPT0gMCBlbHNlIGdyb3VwX0EudG9rZW5zX3Blcl9leHBlcnRfcmFuZ2VfY3B1W2kgLSAxXQogICAgICAgIGFfYWRkcnMuYXBwZW5kKGdyb3VwX0EudG9rZW5zW3N0YXJ0X2lkeDotMV0uZGF0YV9wdHIoKSkKICAgICAgICBNID0gZW5kX2lkeCAtIHN0YXJ0X2lkeAogICAgICAgIEsgPSBncm91cF9BLnRva2Vucy5zaXplKC0xKQogICAgICAgIGFfc2hhcGVzLmFwcGVuZCgoTSwgSykpCiAgICByZXR1cm4gYV9hZGRycywgYV9zaGFwZXMKICAgICAgICAKZGVmIGdldF9iX2FkZHJzKGdyb3VwX0I6IExpc3RbdG9yY2guVGVuc29yXSwgZ3JvdXBfc2l6ZTogaW50KToKICAgIGJfYWRkcnMgPSBbXQogICAgYl9zaGFwZXMgPSBbXQogICAgZm9yIGkgaW4gcmFuZ2UoZ3JvdXBfc2l6ZSk6CiAgICAgICAgYl9hZGRycy5hcHBlbmQoZ3JvdXBfQltpXS5kYXRhX3B0cigpKQogICAgICAgIEsgPSBncm91cF9CW2ldLnNpemUoMCkKICAgICAgICBOID0gZ3JvdXBfQltpXS5zaXplKDEpCiAgICAgICAgYl9zaGFwZXMuYXBwZW5kKChLLCBOKSkKICAgIHJldHVybiBiX2FkZHJzLCBiX3NoYXBlcwoKZGVmIGdyb3VwX2dlbW1fZm4oZ3JvdXBfQTogR3JvdXBlZFRva2VucywgZ3JvdXBfQjogTGlzdFt0b3JjaC5UZW5zb3JdLCBhY3RpdmF0aW9uKToKICAgIERFVklDRT1ncm91cF9CWzBdLmRldmljZQogICAgCiAgICBncm91cF9zaXplID0gbGVuKGdyb3VwX0IpCiAgICAKICAgIEFfYWRkcnMsIEFfc2hhcGVzID0gZ2V0X2FfYWRkcnMoZ3JvdXBfQSwgZ3JvdXBfc2l6ZSkKICAgIEJfYWRkcnMsIEJfc2hhcGVzID0gZ2V0X2JfYWRkcnMoZ3JvdXBfQiwgZ3JvdXBfc2l6ZSkKICAgIAogICAgQ19hZGRycyA9IFtdCiAgICBnX3NpemVzID0gW10KICAgIGdfbGRzID0gW10KICAgICAgICAKICAgIGMgPSB0b3JjaC5lbXB0eSgoZ3JvdXBfQS50b2tlbnMuc2l6ZSgwKSwgZ3JvdXBfQlswXS5zaXplKC0xKSksIGRldmljZT1ERVZJQ0UsIGR0eXBlPWdyb3VwX0EudG9rZW5zLmR0eXBlKQogICAgCiAgICBjX29mZnNldCA9IDAKICAgIGZvciBpIGluIHJhbmdlKGdyb3VwX3NpemUpOgogICAgICAgIGFzc2VydCBBX3NoYXBlc1tpXVsxXSA9PSBCX3NoYXBlc1tpXVswXQogICAgICAgIE0sIEsgPSBBX3NoYXBlc1tpXQogICAgICAgIEssIE4gPSBCX3NoYXBlc1tpXQogICAgICAgIAogICAgICAgIENfYWRkcnMuYXBwZW5kKGNbY19vZmZzZXQ6XS5kYXRhX3B0cigpKSAjIHVzaW5nIFtjX29mZnNldDpdIGluZGV4aW5nIHRvIGdldCB2aWV3CiAgICAgICAgZ19zaXplcyArPSBbTSwgTiwgS10KICAgICAgICBnX2xkcyArPSBbSywgTiwgYy5zdHJpZGUoMCldCiAgICAgICAgY19vZmZzZXQgKz0gTQogICAgICAgICAgICAgICAgCiAgICAjIG5vdGUgdGhlc2UgYXJlIGRldmljZSB0ZW5zb3JzCiAgICBkX2FfcHRycyA9IHRvcmNoLnRlbnNvcihBX2FkZHJzLCBkZXZpY2U9REVWSUNFKQogICAgZF9iX3B0cnMgPSB0b3JjaC50ZW5zb3IoQl9hZGRycywgZGV2aWNlPURFVklDRSkKICAgIGRfY19wdHJzID0gdG9yY2gudGVuc29yKENfYWRkcnMsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfc2l6ZXMgPSB0b3JjaC50ZW5zb3IoZ19zaXplcywgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfbGRzID0gdG9yY2gudGVuc29yKGdfbGRzLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPURFVklDRSkKCiAgICAjIGludm9rZSBsaWtlIG5vcm1hbCBrZXJuZWw/Pz8gICAgCiAgICBncmlkID0gbGFtYmRhIE1FVEE6ICh0cml0b24uY2RpdihjLnNpemUoMCksIE1FVEFbJ0JMT0NLX1NJWkVfTSddKSAqIAogICAgICAgICAgICAgICAgICAgICAgICAgdHJpdG9uLmNkaXYoYy5zaXplKDEpLCBNRVRBWydCTE9DS19TSVpFX04nXSksICkKICAgIGdyb3VwZWRfbWF0bXVsX2tlcm5lbFtncmlkXSgKICAgICAgICBkX2FfcHRycywKICAgICAgICBkX2JfcHRycywKICAgICAgICBkX2NfcHRycywKICAgICAgICBkX2dfc2l6ZXMsCiAgICAgICAgZF9nX2xkcywKICAgICAgICBncm91cF9zaXplLAogICAgICAgIEFDVElWQVRJT049YWN0aXZhdGlvbgogICAgKQogICAgICAgIAogICAgcmV0dXJuIEdyb3VwZWRUb2tlbnMoCiAgICAgICAgdG9rZW5zPWMsCiAgICAgICAgdG9rZW5zX3Blcl9leHBlcnRfcmFuZ2U9Z3JvdXBfQS50b2tlbnNfcGVyX2V4cGVydF9yYW5nZSwKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHU9Z3JvdXBfQS50b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHUsCiAgICAgICAgaW5kaWNlcz1ncm91cF9BLmluZGljZXMsCiAgICAgICAgdG9rZW5fZ2F0aGVyX2luZGljZXM9Z3JvdXBfQS50b2tlbl9nYXRoZXJfaW5kaWNlcywKICAgICkKCkB0b3JjaC5jb21waWxlCmRlZiBnZXRfdG9rZW5faW5kaWNlcyhleHBlcnRfaW5kaWNlcywgbnVtX2V4cGVydHNfcGVyX3Rva2VuKToKICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgaW5kaWNlcyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYXJnc29ydCgpCiAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkKICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlID0gY291bnRzLmN1bXN1bShkaW09MCkKICAgIHRva2VuX2luZGljZXMgPSBpbmRpY2VzIC8vIG51bV9leHBlcnRzX3Blcl90b2tlbgogICAgcmV0dXJuIGluZGljZXMsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzCgpAdG9yY2guY29tcGlsZQpkZWYgZXhwZXJ0X2lucHV0X3Blcm11dGUoCiAgICB0b2tlbnM6IHRvcmNoLlRlbnNvciwgCiAgICBleHBlcnRfaW5kaWNlczogdG9yY2guVGVuc29yLCAKICAgIG51bV9leHBlcnRzX3Blcl90b2tlbjogaW50CikgLT4gR3JvdXBlZFRva2VuczoKICAgIGluZGljZXMsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzID0gZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbikKICAgIHRva2VuX2RpbSA9IHRva2Vucy5zaXplKDEpCiAgICBvdXRwdXQgPSB0b3JjaC5nYXRoZXIodG9rZW5zLCBkaW09MCwgaW5kZXg9dG9rZW5faW5kaWNlcy51bnNxdWVlemUoMSkuZXhwYW5kKC0xLCB0b2tlbl9kaW0pKQogICAgcmV0dXJuIEdyb3VwZWRUb2tlbnMoCiAgICAgICAgdG9rZW5zPW91dHB1dCwKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZT10b2tlbnNfcGVyX2V4cGVydF9yYW5nZSwKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHU9dG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UuZGV0YWNoKCkuY3B1KCksCiAgICAgICAgaW5kaWNlcz1pbmRpY2VzLCAKICAgICAgICB0b2tlbl9nYXRoZXJfaW5kaWNlcz10b2tlbl9pbmRpY2VzLAogICAgKQoKQHRvcmNoLmNvbXBpbGUKZGVmIGV4cGVydF9vdXRwdXRfcGVybXV0ZSgKICAgIGdyb3VwZWRfdG9rZW5zOiBHcm91cGVkVG9rZW5zLAogICAgZXhwZXJ0X3Njb3JlczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHNfcGVyX3Rva2VuOiBpbnQsCiAgICBvdXRwdXQ6IHRvcmNoLlRlbnNvcgopIC0+IHRvcmNoLlRlbnNvcjoKICAgIGdyb3VwZWRfdG9rZW5zLnRva2Vucy5tdWxfKGV4cGVydF9zY29yZXMudmlldygtMSwgMSlbZ3JvdXBlZF90b2tlbnMuaW5kaWNlc10pCiAgICBvdXRwdXQuc2NhdHRlcl9yZWR1Y2VfKAogICAgICAgIDAsCiAgICAgICAgIyBpbmRleCB0ZW5zb3IgZG9lc24ndCBicm9hZGNhc3QsIHNvIHJlcGVhdCBpbmRpY2VzIGFsb25nIGhpZGRlbiBkaW0KICAgICAgICBncm91cGVkX3Rva2Vucy50b2tlbl9nYXRoZXJfaW5kaWNlcy52aWV3KC0xLCAxKS5leHBhbmQoLTEsIG91dHB1dC5zaXplKC0xKSksCiAgICAgICAgZ3JvdXBlZF90b2tlbnMudG9rZW5zLAogICAgICAgIHJlZHVjZT0nc3VtJwogICAgKQogICAgcmV0dXJuIG91dHB1dAoKQHRvcmNoLmNvbXBpbGUKZGVmIGNvbXB1dGVfc2hhcmVkX2V4cGVydCh3ZWlnaHRzLCB0b2tlbnMpOgogICAgd19nYXRlID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXQogICAgd191cCA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10KICAgIHdfZG93biA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10KICAgIGdhdGUgPSBGLnNpbHUodG9rZW5zIEAgd19nYXRlKQogICAgdXAgPSB0b2tlbnMgQCB3X3VwCiAgICBkb3duID0gKGdhdGUgKiB1cCkgQCB3X2Rvd24KICAgIHJldHVybiBkb3duCgpAdG9yY2guY29tcGlsZQpkZWYgY29tcHV0ZV9yb3V0aW5nKHdlaWdodHMsIHRva2VucywgdG9wayk6CiAgICAjIEZvciBzb21lIHJlYXNvbiwgcm91dGVyIHdlaWdodHMgYXJlIGFscmVhZHkgdHJhbnNwb3NlZD8/IFNvIHRyYW5zcG9zZSBoZXJlLi4uCiAgICB3X2cgPSB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10udCgpCiAgICBsb2dpdHMgPSB0b2tlbnMgQCB3X2cKICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgaz10b3BrLCBkaW09LTEsIHNvcnRlZD1GYWxzZSkKICAgIHJldHVybiB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzCgpkZWYgY29tcHV0ZV9yb3V0ZWRfZXhwZXJ0cygKICAgICAgICB3ZWlnaHRzLCAKICAgICAgICB0b2tlbnMsIAogICAgICAgIHRvcGssIAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIGV4cGVydF9pbmRpY2VzLAogICAgICAgIGV4cGVydF9zY29yZXMsCiAgICAgICAgb3V0cHV0CiAgICApOgogICAgZ2F0ZV9wcm9qX3dlaWdodHMgPSBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10gZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpXQogICAgdXBfcHJval93ZWlnaHRzID0gW3dlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKV0KICAgIGRvd25fcHJval93ZWlnaHRzID0gW3dlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKV0KICAgIAogICAgIyBnZXQgdG9rZW5zIGZvciBlYWNoIGV4cGVydCwgYnV0IGNvbXB1dGUgZXhwZXJ0IHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwgd2l0aCBncm91cCBnZW1tcy4KICAgIGdyb3VwX3Rva2VuczogR3JvdXBlZFRva2VucyA9IGV4cGVydF9pbnB1dF9wZXJtdXRlKHRva2VucywgZXhwZXJ0X2luZGljZXMsIHRvcGspCgogICAgZ2F0ZTogR3JvdXBlZFRva2VucyA9IGdyb3VwX2dlbW1fZm4oZ3JvdXBfdG9rZW5zLCBnYXRlX3Byb2pfd2VpZ2h0cywgYWN0aXZhdGlvbj1UcnVlKQogICAgCiAgICAjIHRoaXMgZnVzZXMgZ2F0ZSAqICh0b2tlbiBAIFdfdXApCiAgICB1cDogR3JvdXBlZFRva2VucyA9IGdyb3VwX2dlbW1fZm4oZ3JvdXBfdG9rZW5zLCB1cF9wcm9qX3dlaWdodHMsIGFjdGl2YXRpb249RmFsc2UpCiAgICAKICAgIHVwX2dhdGVkID0gR3JvdXBlZFRva2VucygKICAgICAgICB0b2tlbnM9Z2F0ZS50b2tlbnMgKiB1cC50b2tlbnMsCiAgICAgICAgdG9rZW5zX3Blcl9leHBlcnRfcmFuZ2U9Z2F0ZS50b2tlbnNfcGVyX2V4cGVydF9yYW5nZSwKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHU9Z2F0ZS50b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHUsCiAgICAgICAgaW5kaWNlcz1nYXRlLmluZGljZXMsCiAgICAgICAgdG9rZW5fZ2F0aGVyX2luZGljZXM9Z2F0ZS50b2tlbl9nYXRoZXJfaW5kaWNlcywKICAgICkKICAgIAogICAgZ3JvdXBfdG9rZW46IEdyb3VwZWRUb2tlbnMgPSBncm91cF9nZW1tX2ZuKHVwX2dhdGVkLCBkb3duX3Byb2pfd2VpZ2h0cywgYWN0aXZhdGlvbj1GYWxzZSkKCiAgICAjIHJvdXRlZCBleHBlcnRzIGdldCBhY2N1bXVsYXRlZCBvbnRvIG91dHB1dAogICAgZXhwZXJ0X291dHB1dF9wZXJtdXRlKAogICAgICAgIGdyb3VwX3Rva2VuLCAKICAgICAgICBleHBlcnRfc2NvcmVzLCAKICAgICAgICB0b3BrLCAKICAgICAgICBvdXRwdXQpCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhKToKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgbnVtX2V4cGVydHMgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgdG9wayA9IGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCgogICAgaGlkZGVuX3NpemUgPSBpbnB1dF90ZW5zb3Iuc2l6ZSgyKQogICAgb3JpZ2luYWxfc2hhcGUgPSBpbnB1dF90ZW5zb3Iuc2l6ZSgpCiAgICAKICAgIGZsYXRfdG9rZW5zID0gaW5wdXRfdGVuc29yLnZpZXcoLTEsIGhpZGRlbl9zaXplKQoKICAgIHNoYXJlZF9vdXRwdXQgPSBjb21wdXRlX3NoYXJlZF9leHBlcnQod2VpZ2h0cywgZmxhdF90b2tlbnMpCiAgICBzY29yZXMsIGluZGljZXMgPSBjb21wdXRlX3JvdXRpbmcod2VpZ2h0cywgZmxhdF90b2tlbnMsIHRvcGspCgogICAgY29tcHV0ZV9yb3V0ZWRfZXhwZXJ0cygKICAgICAgICB3ZWlnaHRzLAogICAgICAgIGZsYXRfdG9rZW5zLAogICAgICAgIHRvcGssCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgaW5kaWNlcywKICAgICAgICBzY29yZXMsCiAgICAgICAgc2hhcmVkX291dHB1dAogICAgKQoKICAgIHJldHVybiBzaGFyZWRfb3V0cHV0LnZpZXcob3JpZ2luYWxfc2hhcGUpCgojIElucHV0IGdlbmVyYXRpb24gZm9yIHRoZSByZWZlcmVuY2UgY29kZQoKZGVmIGdlbmVyYXRlX2lucHV0KAogICAgZGhpZGRlbjogaW50LAogICAgZGV4cGVydDogaW50LAogICAgbnJvdXRlZGV4cGVydHM6IGludCwKICAgIG5zaGFyZWRleHBlcnRzOiBpbnQsCiAgICBuZXhwZXJ0c3BlcnRva2VuOiBpbnQsCiAgICBiczogaW50LAogICAgc2VxbGVuOiBpbnQsCiAgICBzZWVkOiBpbnQKKToKCiAgICAjIFJlYWxseSBkdW1iIGJ1dCBmb3Igbm93IF8gaXNuJ3QgcGFyc2luZyBjb3JyZWN0bHkuCiAgICBkX2hpZGRlbiA9IGRoaWRkZW4KICAgIGRfZXhwZXJ0ID0gZGV4cGVydAogICAgbl9yb3V0ZWRfZXhwZXJ0cyA9IG5yb3V0ZWRleHBlcnRzCiAgICBuX3NoYXJlZF9leHBlcnRzID0gbnNoYXJlZGV4cGVydHMKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4gPSBuZXhwZXJ0c3BlcnRva2VuCiAgICBiYXRjaF9zaXplID0gYnMKICAgIHNlcV9sZW4gPSBzZXFsZW4KCiAgICBjb25maWcgPSB7CiAgICAgICAgImRfaGlkZGVuIjogZF9oaWRkZW4sCiAgICAgICAgImRfZXhwZXJ0IjogZF9leHBlcnQsCiAgICAgICAgIm5fcm91dGVkX2V4cGVydHMiOiBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICJuX3NoYXJlZF9leHBlcnRzIjogbl9zaGFyZWRfZXhwZXJ0cywKICAgICAgICAibl9leHBlcnRzX3Blcl90b2tlbiI6IG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgImJhdGNoX3NpemUiOiBiYXRjaF9zaXplLAogICAgICAgICJzZXFfbGVuIjogc2VxX2xlbiwKICAgIH0KCiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQoKICAgIG51bV9leHBlcnRzID0gbl9yb3V0ZWRfZXhwZXJ0cwogICAgZXhwZXJ0X2RpbSA9IGRfZXhwZXJ0CiAgICB3ZWlnaHRzID0ge30KCiAgICBpbnB1dF90ZW5zb3IgPSB0b3JjaC5yYW5kbigKICAgICAgICAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApLmNvbnRpZ3VvdXMoKQoKICAgICMgSW5pdGlhbGl6ZSByb3V0ZXIgd2VpZ2h0cwogICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKG51bV9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChleHBlcnRfZGltLCBkX2hpZGRlbiksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQogICAgCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgcmV0dXJuIChpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZykKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBpbnB1dCA9IGdlbmVyYXRlX2lucHV0KDEyOCwgMTI4LCA0LCAxLCAyLCA4LCA4LCAwKQogICAgb3V0cHV0ID0gY3VzdG9tX2tlcm5lbChpbnB1dCk=

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

- ciIiIgpVc2VzIGEgZ3JvdXAgZ2VtbSwgaW5zdGVhZCBvZiBhIGxvb3Agb3ZlciBleHBlcnRzLgoiIiIKCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgVHVwbGUsIExpc3QsIE9wdGlvbmFsCmltcG9ydCBtYXRoCmltcG9ydCBlaW5vcHMKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcwoKQGRhdGFjbGFzcwpjbGFzcyBHcm91cGVkVG9rZW5zOgogICAgdG9rZW5zOiB0b3JjaC5UZW5zb3IKICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlOiB0b3JjaC50ZW5zb3IKICAgIGluZGljZXM6IHRvcmNoLlRlbnNvcgogICAgdG9rZW5fZ2F0aGVyX2luZGljZXM6IHRvcmNoLlRlbnNvcgoKQHRyaXRvbi5qaXQKZGVmIHNpbHUodGlsZSk6CiAgICAjIHRsLmV4cCBuZWVkcyBmbG9hdDMyIG9yIGZsb2F0NjQuCiAgICByZXR1cm4gdGlsZSAqICgxLjAgLyAoMS4wICsgdGwuZXhwKC10aWxlKSkpCgpkZWYgbnVtX3NtcygpOgogICAgIyBNSTMwMCBoYXMgMzA0IENVcwogICAgcmV0dXJuIDIgKiAzMDQKCmNvbmZpZ3MgPSBbCiAgICAjIE0sIE4sIEssIHdhcnBzLCBzdGFnZXMsIG51bV9zbXMKICAgICMgZm9yIEFNRCwgbnVtIHN0YWdlcyBzaG91bGQgYmUgMSBvciAyLgogICAgKDEyOCwgMTI4LCAxMjgsIDQsIDIpLAogICAgKDEyOCwgMTI4LCA2NCwgNCwgMiksCiAgICAoMTI4LCAxMjgsIDMyLCA0LCAyKSwKICAgICgyNTYsIDI1NiwgNjQsIDQsIDIpLAogICAgKDY0LCAxMjgsIDEyOCwgNCwgMiksCiAgICAoMTI4LCAxMjgsIDEyOCwgOCwgMiksCiAgICAoMjU2LCAyNTYsIDY0LCA4LCAyKSwKICAgICg2NCwgNjQsIDEyOCwgNCwgMiksCiAgICAoNjQsIDY0LCAyNTYsIDQsIDIpLAogICAgKDEyOCwgNjQsIDI1NiwgNCwgMikKXQoKY29uZmlncyA9IFsKICAgIHRyaXRvbi5Db25maWcoewogICAgICAgICdCTE9DS19TSVpFX00nOiBjWzBdLAogICAgICAgICdCTE9DS19TSVpFX04nOiBjWzFdLAogICAgICAgICdCTE9DS19TSVpFX0snOiBjWzJdLAogICAgICAgICdudW1fd2FycHMnOiBjWzNdLAogICAgICAgICdudW1fc3RhZ2VzJzogY1s0XSwKICAgICAgICAnTlVNX1NNJzogbnVtX3NtcygpCiAgICB9KSBmb3IgYyBpbiBjb25maWdzCl0KCkB0cml0b24uYXV0b3R1bmUoCiAgICBjb25maWdzPWNvbmZpZ3MsCiAgICBrZXk9Wydncm91cF9zaXplJ10sCikKQHRyaXRvbi5qaXQKZGVmIGdyb3VwZWRfbWF0bXVsX2tlcm5lbCgKICAgICMgZGV2aWNlIHRlbnNvciBvZiBtYXRyaWNlcyBwb2ludGVycwogICAgZ3JvdXBfYV9wdHJzLAogICAgZ3JvdXBfYl9wdHJzLAogICAgZ3JvdXBfY19wdHJzLAogICAgIyBkZXZpY2UgdGVuc29yIG9mIGdlbW0gc2l6ZXMuIGl0cyBzaGFwZSBpcyBbZ3JvdXBfc2l6ZSwgM10KICAgICMgZGltIDAgaXMgZ3JvdXBfc2l6ZSwgZGltIDEgaXMgdGhlIHZhbHVlcyBvZiA8TSwgTiwgSz4gb2YgZWFjaCBnZW1tCiAgICBncm91cF9nZW1tX3NpemVzLAogICAgIyBkZXZpY2UgdGVuc29yIG9mIGxlYWRpbmcgZGltZW5zaW9uIHNpemVzLiBpdHMgc2hhcGUgaXMgW2dyb3VwX3NpemUsIDNdCiAgICAjIGRpbSAwIGlzIGdyb3VwX3NpemUsIGRpbSAxIGlzIHRoZSB2YWx1ZXMgb2YgPGxkYSwgbGRiLCBsZGM+IG9mIGVhY2ggZ2VtbQogICAgZ19sZHMsCiAgICAjIG51bWJlciBvZiBnZW1tcwogICAgZ3JvdXBfc2l6ZSwKICAgIEFDVElWQVRJT046IHRsLmNvbnN0ZXhwciwKICAgICMgbnVtYmVyIG9mIHZpcnR1YWwgU00KICAgIE5VTV9TTTogdGwuY29uc3RleHByLAogICAgIyB0aWxlIHNpemVzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCik6CiAgICB0aWxlX2lkeCA9IHRsLnByb2dyYW1faWQoMCkKICAgIGxhc3RfcHJvYmxlbV9lbmQgPSAwCiAgICBmb3IgZyBpbiByYW5nZShncm91cF9zaXplKToKICAgICAgICAjIGdldCB0aGUgZ2VtbSBzaXplIG9mIHRoZSBjdXJyZW50IHByb2JsZW0KICAgICAgICBnbSA9IHRsLmxvYWQoZ3JvdXBfZ2VtbV9zaXplcyArIGcgKiAzKQogICAgICAgIGduID0gdGwubG9hZChncm91cF9nZW1tX3NpemVzICsgZyAqIDMgKyAxKQogICAgICAgIGdrID0gdGwubG9hZChncm91cF9nZW1tX3NpemVzICsgZyAqIDMgKyAyKQogICAgICAgIG51bV9tX3RpbGVzID0gdGwuY2RpdihnbSwgQkxPQ0tfU0laRV9NKQogICAgICAgIG51bV9uX3RpbGVzID0gdGwuY2RpdihnbiwgQkxPQ0tfU0laRV9OKQogICAgICAgIG51bV90aWxlcyA9IG51bV9tX3RpbGVzICogbnVtX25fdGlsZXMKICAgICAgICAjIGl0ZXJhdGUgdGhyb3VnaCB0aGUgdGlsZXMgaW4gdGhlIGN1cnJlbnQgZ2VtbSBwcm9ibGVtCiAgICAgICAgd2hpbGUgKHRpbGVfaWR4ID49IGxhc3RfcHJvYmxlbV9lbmQgYW5kIHRpbGVfaWR4IDwgbGFzdF9wcm9ibGVtX2VuZCArIG51bV90aWxlcyk6CiAgICAgICAgICAgICMgcGljayB1cCBhIHRpbGUgZnJvbSB0aGUgY3VycmVudCBnZW1tIHByb2JsZW0KICAgICAgICAgICAgayA9IGdrCiAgICAgICAgICAgIGxkYSA9IHRsLmxvYWQoZ19sZHMgKyBnICogMykKICAgICAgICAgICAgbGRiID0gdGwubG9hZChnX2xkcyArIGcgKiAzICsgMSkKICAgICAgICAgICAgbGRjID0gdGwubG9hZChnX2xkcyArIGcgKiAzICsgMikKICAgICAgICAgICAgYV9wdHIgPSB0bC5sb2FkKGdyb3VwX2FfcHRycyArIGcpLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSkKICAgICAgICAgICAgYl9wdHIgPSB0bC5sb2FkKGdyb3VwX2JfcHRycyArIGcpLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSkKICAgICAgICAgICAgY19wdHIgPSB0bC5sb2FkKGdyb3VwX2NfcHRycyArIGcpLnRvKHRsLnBvaW50ZXJfdHlwZSh0bC5mbG9hdDE2KSkKICAgICAgICAgICAgIyBmaWd1cmUgb3V0IHRpbGUgY29vcmRpbmF0ZXMKICAgICAgICAgICAgdGlsZV9pZHhfaW5fZ2VtbSA9IHRpbGVfaWR4IC0gbGFzdF9wcm9ibGVtX2VuZAogICAgICAgICAgICB0aWxlX21faWR4ID0gdGlsZV9pZHhfaW5fZ2VtbSAvLyBudW1fbl90aWxlcwogICAgICAgICAgICB0aWxlX25faWR4ID0gdGlsZV9pZHhfaW5fZ2VtbSAlIG51bV9uX3RpbGVzCgogICAgICAgICAgICAjIGRvIHJlZ3VsYXIgZ2VtbSBoZXJlCiAgICAgICAgICAgIG9mZnNfYW0gPSB0aWxlX21faWR4ICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICAgICAgb2Zmc19ibiA9IHRpbGVfbl9pZHggKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgICAgICAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQogICAgICAgICAgICBhX3B0cnMgPSBhX3B0ciArIG9mZnNfYW1bOiwgTm9uZV0gKiBsZGEgKyBvZmZzX2tbTm9uZSwgOl0KICAgICAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZzX2tbOiwgTm9uZV0gKiBsZGIgKyBvZmZzX2JuW05vbmUsIDpdCiAgICAgICAgICAgIAogICAgICAgICAgICBtX21hc2sgPSBvZmZzX2FtIDwgZ20KICAgICAgICAgICAgCiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKICAgICAgICAgICAgZm9yIGtrIGluIHJhbmdlKDAsIHRsLmNkaXYoaywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICAgICAjIGhpbnQgdG8gVHJpdG9uIGNvbXBpbGVyIHRvIGRvIHByb3BlciBsb29wIHBpcGVsaW5pbmcKICAgICAgICAgICAgICAgIHRsLm11bHRpcGxlX29mKGFfcHRycywgWzE2LCAxNl0pCiAgICAgICAgICAgICAgICB0bC5tdWx0aXBsZV9vZihiX3B0cnMsIFsxNiwgMTZdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgYSA9IHRsLmxvYWQoYV9wdHJzLCBtYXNrPW1fbWFza1s6LCBOb25lXSkKICAgICAgICAgICAgICAgIGIgPSB0bC5sb2FkKGJfcHRycykKICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gdGwuZG90KGEsIGIsIGFjYz1hY2N1bXVsYXRvcikKICAgICAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sKICAgICAgICAgICAgICAgIGJfcHRycyArPSBCTE9DS19TSVpFX0sgKiBsZGIKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiBBQ1RJVkFUSU9OOgogICAgICAgICAgICAgICAgYWNjdW11bGF0b3IgPSBzaWx1KGFjY3VtdWxhdG9yKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGMgPSBhY2N1bXVsYXRvci50byh0bC5mbG9hdDE2KQoKICAgICAgICAgICAgb2Zmc19jbSA9IHRpbGVfbV9pZHggKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKQogICAgICAgICAgICBvZmZzX2NuID0gdGlsZV9uX2lkeCAqIEJMT0NLX1NJWkVfTiArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX04pCiAgICAgICAgICAgIGNfcHRycyA9IGNfcHRyICsgbGRjICogb2Zmc19jbVs6LCBOb25lXSArIG9mZnNfY25bTm9uZSwgOl0KCiAgICAgICAgICAgIHRsLnN0b3JlKGNfcHRycywgYywgbWFzaz1tX21hc2tbOiwgTm9uZV0pCgogICAgICAgICAgICAjIGdvIHRvIHRoZSBuZXh0IHRpbGUgYnkgYWR2YW5jaW5nIE5VTV9TTQogICAgICAgICAgICB0aWxlX2lkeCArPSB0bC5udW1fcHJvZ3JhbXMoYXhpcz0wKQoKICAgICAgICAjIGdldCByZWFkeSB0byBnbyB0byB0aGUgbmV4dCBnZW1tIHByb2JsZW0KICAgICAgICBsYXN0X3Byb2JsZW1fZW5kID0gbGFzdF9wcm9ibGVtX2VuZCArIG51bV90aWxlcwoKZGVmIGdldF9hX2FkZHJzKGdyb3VwX0E6IEdyb3VwZWRUb2tlbnMsIGdyb3VwX3NpemU6IGludCk6CiAgICBhX2FkZHJzID0gW10KICAgIGFfc2hhcGVzID0gW10KICAgIGZvciBpIGluIHJhbmdlKGdyb3VwX3NpemUpOgogICAgICAgIGVuZF9pZHggPSBncm91cF9BLnRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlW2ldCiAgICAgICAgc3RhcnRfaWR4ID0gMCBpZiBpID09IDAgZWxzZSBncm91cF9BLnRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlW2kgLSAxXQogICAgICAgIGFfYWRkcnMuYXBwZW5kKGdyb3VwX0EudG9rZW5zW3N0YXJ0X2lkeDotMV0uZGF0YV9wdHIoKSkKICAgICAgICBNID0gZW5kX2lkeCAtIHN0YXJ0X2lkeAogICAgICAgIEsgPSBncm91cF9BLnRva2Vucy5zaXplKC0xKQogICAgICAgIGFfc2hhcGVzLmFwcGVuZCgoTSwgSykpCiAgICByZXR1cm4gYV9hZGRycywgYV9zaGFwZXMKICAgICAgICAKZGVmIGdldF9iX2FkZHJzKGdyb3VwX0I6IExpc3RbdG9yY2guVGVuc29yXSwgZ3JvdXBfc2l6ZTogaW50KToKICAgIGJfYWRkcnMgPSBbXQogICAgYl9zaGFwZXMgPSBbXQogICAgZm9yIGkgaW4gcmFuZ2UoZ3JvdXBfc2l6ZSk6CiAgICAgICAgYl9hZGRycy5hcHBlbmQoZ3JvdXBfQltpXS5kYXRhX3B0cigpKQogICAgICAgIEsgPSBncm91cF9CW2ldLnNpemUoMCkKICAgICAgICBOID0gZ3JvdXBfQltpXS5zaXplKDEpCiAgICAgICAgYl9zaGFwZXMuYXBwZW5kKChLLCBOKSkKICAgIHJldHVybiBiX2FkZHJzLCBiX3NoYXBlcwoKZGVmIGdyb3VwX2dlbW1fZm4oZ3JvdXBfQTogR3JvdXBlZFRva2VucywgZ3JvdXBfQjogTGlzdFt0b3JjaC5UZW5zb3JdLCBhY3RpdmF0aW9uKToKICAgIERFVklDRT1ncm91cF9CWzBdLmRldmljZQogICAgCiAgICBncm91cF9zaXplID0gbGVuKGdyb3VwX0IpCiAgICAKICAgIEFfYWRkcnMsIEFfc2hhcGVzID0gZ2V0X2FfYWRkcnMoZ3JvdXBfQSwgZ3JvdXBfc2l6ZSkKICAgIEJfYWRkcnMsIEJfc2hhcGVzID0gZ2V0X2JfYWRkcnMoZ3JvdXBfQiwgZ3JvdXBfc2l6ZSkKICAgIAogICAgQ19hZGRycyA9IFtdCiAgICBnX3NpemVzID0gW10KICAgIGdfbGRzID0gW10KICAgICAgICAKICAgIGMgPSB0b3JjaC5lbXB0eSgoZ3JvdXBfQS50b2tlbnMuc2l6ZSgwKSwgZ3JvdXBfQlswXS5zaXplKC0xKSksIGRldmljZT1ERVZJQ0UsIGR0eXBlPWdyb3VwX0EudG9rZW5zLmR0eXBlKQogICAgCiAgICBjX29mZnNldCA9IDAKICAgIGZvciBpIGluIHJhbmdlKGdyb3VwX3NpemUpOgogICAgICAgIGFzc2VydCBBX3NoYXBlc1tpXVsxXSA9PSBCX3NoYXBlc1tpXVswXQogICAgICAgIE0sIEsgPSBBX3NoYXBlc1tpXQogICAgICAgIEssIE4gPSBCX3NoYXBlc1tpXQogICAgICAgIAogICAgICAgIENfYWRkcnMuYXBwZW5kKGNbY19vZmZzZXQ6XS5kYXRhX3B0cigpKSAjIHVzaW5nIFtjX29mZnNldDpdIGluZGV4aW5nIHRvIGdldCB2aWV3CiAgICAgICAgZ19zaXplcyArPSBbTSwgTiwgS10KICAgICAgICBnX2xkcyArPSBbSywgTiwgYy5zdHJpZGUoMCldCiAgICAgICAgY19vZmZzZXQgKz0gTQogICAgICAgICAgICAgICAgCiAgICAjIG5vdGUgdGhlc2UgYXJlIGRldmljZSB0ZW5zb3JzCiAgICBkX2FfcHRycyA9IHRvcmNoLnRlbnNvcihBX2FkZHJzLCBkZXZpY2U9REVWSUNFKQogICAgZF9iX3B0cnMgPSB0b3JjaC50ZW5zb3IoQl9hZGRycywgZGV2aWNlPURFVklDRSkKICAgIGRfY19wdHJzID0gdG9yY2gudGVuc29yKENfYWRkcnMsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfc2l6ZXMgPSB0b3JjaC50ZW5zb3IoZ19zaXplcywgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfbGRzID0gdG9yY2gudGVuc29yKGdfbGRzLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPURFVklDRSkKICAgICMgd2UgdXNlIGEgZml4ZWQgbnVtYmVyIG9mIENUQSwgYW5kIGl0J3MgYXV0by10dW5hYmxlCiAgICAKICAgIGdyaWQgPSBsYW1iZGEgTUVUQTogKHRyaXRvbi5jZGl2KGMuc2l6ZSgwKSwgTUVUQVsnQkxPQ0tfU0laRV9NJ10pICogCiAgICAgICAgICAgICAgICAgICAgICAgICB0cml0b24uY2RpdihjLnNpemUoMSksIE1FVEFbJ0JMT0NLX1NJWkVfTiddKSwgKQogICAgZ3JvdXBlZF9tYXRtdWxfa2VybmVsW2dyaWRdKAogICAgICAgIGRfYV9wdHJzLAogICAgICAgIGRfYl9wdHJzLAogICAgICAgIGRfY19wdHJzLAogICAgICAgIGRfZ19zaXplcywKICAgICAgICBkX2dfbGRzLAogICAgICAgIGdyb3VwX3NpemUsCiAgICAgICAgQUNUSVZBVElPTj1hY3RpdmF0aW9uCiAgICApCiAgICAgICAgCiAgICByZXR1cm4gR3JvdXBlZFRva2VucygKICAgICAgICB0b2tlbnM9YywKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZT1ncm91cF9BLnRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLAogICAgICAgIGluZGljZXM9Z3JvdXBfQS5pbmRpY2VzLAogICAgICAgIHRva2VuX2dhdGhlcl9pbmRpY2VzPWdyb3VwX0EudG9rZW5fZ2F0aGVyX2luZGljZXMsCiAgICApCgpAdG9yY2guY29tcGlsZQpkZWYgZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbik6CiAgICBmbGF0X2V4cGVydF9pbmRpY2VzID0gZXhwZXJ0X2luZGljZXMudmlldygtMSkKICAgIGluZGljZXMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmFyZ3NvcnQoKQogICAgY291bnRzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5iaW5jb3VudCgpCiAgICB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZSA9IGNvdW50cy5jdW1zdW0oZGltPTApCiAgICB0b2tlbl9pbmRpY2VzID0gaW5kaWNlcyAvLyBudW1fZXhwZXJ0c19wZXJfdG9rZW4KICAgIHJldHVybiBpbmRpY2VzLCB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZSwgdG9rZW5faW5kaWNlcwoKQHRvcmNoLmNvbXBpbGUKZGVmIGV4cGVydF9pbnB1dF9wZXJtdXRlKAogICAgdG9rZW5zOiB0b3JjaC5UZW5zb3IsIAogICAgZXhwZXJ0X2luZGljZXM6IHRvcmNoLlRlbnNvciwgCiAgICBudW1fZXhwZXJ0c19wZXJfdG9rZW46IGludAopIC0+IEdyb3VwZWRUb2tlbnM6CiAgICAKICAgIGluZGljZXMsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzID0gZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbikKCiAgICB0b2tlbl9kaW0gPSB0b2tlbnMuc2l6ZSgxKQogICAgb3V0cHV0ID0gdG9yY2guZ2F0aGVyKHRva2VucywgZGltPTAsIGluZGV4PXRva2VuX2luZGljZXMudW5zcXVlZXplKDEpLmV4cGFuZCgtMSwgdG9rZW5fZGltKSkKCiAgICByZXR1cm4gR3JvdXBlZFRva2VucygKICAgICAgICB0b2tlbnM9b3V0cHV0LAogICAgICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlPXRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLAogICAgICAgIGluZGljZXM9aW5kaWNlcywgCiAgICAgICAgdG9rZW5fZ2F0aGVyX2luZGljZXM9dG9rZW5faW5kaWNlcywKICAgICkKCkB0b3JjaC5jb21waWxlCmRlZiBleHBlcnRfb3V0cHV0X3Blcm11dGUoCiAgICBncm91cGVkX3Rva2VuczogR3JvdXBlZFRva2VucywKICAgIGV4cGVydF9zY29yZXM6IHRvcmNoLlRlbnNvciwKICAgIG51bV9leHBlcnRzX3Blcl90b2tlbjogaW50LAogICAgb3V0cHV0OiB0b3JjaC5UZW5zb3IKKSAtPiB0b3JjaC5UZW5zb3I6CiAgICBncm91cGVkX3Rva2Vucy50b2tlbnMubXVsXyhleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpW2dyb3VwZWRfdG9rZW5zLmluZGljZXNdKQogICAgb3V0cHV0LnNjYXR0ZXJfcmVkdWNlXygKICAgICAgICAwLAogICAgICAgICMgaW5kZXggdGVuc29yIGRvZXNuJ3QgYnJvYWRjYXN0LCBzbyByZXBlYXQgaW5kaWNlcyBhbG9uZyBoaWRkZW4gZGltCiAgICAgICAgZ3JvdXBlZF90b2tlbnMudG9rZW5fZ2F0aGVyX2luZGljZXMudmlldygtMSwgMSkucmVwZWF0KDEsIG91dHB1dC5zaXplKC0xKSksCiAgICAgICAgZ3JvdXBlZF90b2tlbnMudG9rZW5zLAogICAgICAgIHJlZHVjZT0nc3VtJwogICAgKQogICAgcmV0dXJuIG91dHB1dAoKQHRvcmNoLmNvbXBpbGUKZGVmIGNvbXB1dGVfc2hhcmVkX2V4cGVydCh3ZWlnaHRzLCB0b2tlbnMpOgogICAgd19nYXRlID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXQogICAgd191cCA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10KICAgIHdfZG93biA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10KCiAgICBnYXRlID0gRi5zaWx1KHRva2VucyBAIHdfZ2F0ZSkKICAgIHVwID0gdG9rZW5zIEAgd191cAogICAgZG93biA9IChnYXRlICogdXApIEAgd19kb3duCiAgICByZXR1cm4gZG93bgoKQHRvcmNoLmNvbXBpbGUKZGVmIGNvbXB1dGVfcm91dGluZyh3ZWlnaHRzLCB0b2tlbnMsIHRvcGspOgogICAgIyBGb3Igc29tZSByZWFzb24sIHJvdXRlciB3ZWlnaHRzIGFyZSBhbHJlYWR5IHRyYW5zcG9zZWQ/PyBTbyB0cmFuc3Bvc2UgaGVyZS4uLgogICAgd19nID0gd2VpZ2h0c1sncm91dGVyLndlaWdodCddLnQoKQogICAgbG9naXRzID0gdG9rZW5zIEAgd19nCiAgICBzY29yZXMgPSBsb2dpdHMuc29mdG1heChkaW09LTEpCiAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9dG9waywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCiAgICByZXR1cm4gdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcwoKZGVmIGNvbXB1dGVfcm91dGVkX2V4cGVydHMoCiAgICAgICAgd2VpZ2h0cywgCiAgICAgICAgdG9rZW5zLCAKICAgICAgICB0b3BrLCAKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBleHBlcnRfaW5kaWNlcywKICAgICAgICBleHBlcnRfc2NvcmVzLAogICAgICAgIG91dHB1dAogICAgKToKICAgIGdhdGVfcHJval93ZWlnaHRzID0gW3dlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKV0KICAgIHVwX3Byb2pfd2VpZ2h0cyA9IFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXSBmb3IgaSBpbiByYW5nZShudW1fZXhwZXJ0cyldCiAgICBkb3duX3Byb2pfd2VpZ2h0cyA9IFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXSBmb3IgaSBpbiByYW5nZShudW1fZXhwZXJ0cyldCiAgICAKICAgICMgZ2V0IHRva2VucyBmb3IgZWFjaCBleHBlcnQsIGJ1dCBjb21wdXRlIGV4cGVydCB0cmFuc2Zvcm1zIGluIHBhcmFsbGVsIHdpdGggZ3JvdXAgZ2VtbXMuCiAgICBncm91cF90b2tlbnM6IEdyb3VwZWRUb2tlbnMgPSBleHBlcnRfaW5wdXRfcGVybXV0ZSh0b2tlbnMsIGV4cGVydF9pbmRpY2VzLCB0b3BrKQoKICAgIGdhdGU6IEdyb3VwZWRUb2tlbnMgPSBncm91cF9nZW1tX2ZuKGdyb3VwX3Rva2VucywgZ2F0ZV9wcm9qX3dlaWdodHMsIGFjdGl2YXRpb249VHJ1ZSkKICAgIAogICAgIyB0aGlzIGZ1c2VzIGdhdGUgKiAodG9rZW4gQCBXX3VwKQogICAgdXA6IEdyb3VwZWRUb2tlbnMgPSBncm91cF9nZW1tX2ZuKGdyb3VwX3Rva2VucywgdXBfcHJval93ZWlnaHRzLCBhY3RpdmF0aW9uPUZhbHNlKQogICAgCiAgICB1cF9nYXRlZCA9IEdyb3VwZWRUb2tlbnMoCiAgICAgICAgdG9rZW5zPWdhdGUudG9rZW5zICogdXAudG9rZW5zLAogICAgICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlPWdhdGUudG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UsCiAgICAgICAgaW5kaWNlcz1nYXRlLmluZGljZXMsCiAgICAgICAgdG9rZW5fZ2F0aGVyX2luZGljZXM9Z2F0ZS50b2tlbl9nYXRoZXJfaW5kaWNlcywKICAgICkKICAgIAogICAgZ3JvdXBfdG9rZW46IEdyb3VwZWRUb2tlbnMgPSBncm91cF9nZW1tX2ZuKHVwX2dhdGVkLCBkb3duX3Byb2pfd2VpZ2h0cywgYWN0aXZhdGlvbj1GYWxzZSkKCiAgICAjIHJvdXRlZCBleHBlcnRzIGdldCBhY2N1bXVsYXRlZCBvbnRvIG91dHB1dAogICAgZXhwZXJ0X291dHB1dF9wZXJtdXRlKAogICAgICAgIGdyb3VwX3Rva2VuLCAKICAgICAgICBleHBlcnRfc2NvcmVzLCAKICAgICAgICB0b3BrLCAKICAgICAgICBvdXRwdXQpCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhKToKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgbnVtX2V4cGVydHMgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgdG9wayA9IGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCgogICAgaGlkZGVuX3NpemUgPSBpbnB1dF90ZW5zb3Iuc2l6ZSgyKQogICAgb3JpZ2luYWxfc2hhcGUgPSBpbnB1dF90ZW5zb3Iuc2l6ZSgpCiAgICAKICAgIGZsYXRfdG9rZW5zID0gaW5wdXRfdGVuc29yLnZpZXcoLTEsIGhpZGRlbl9zaXplKQoKICAgIHNoYXJlZF9vdXRwdXQgPSBjb21wdXRlX3NoYXJlZF9leHBlcnQod2VpZ2h0cywgZmxhdF90b2tlbnMpCiAgICBzY29yZXMsIGluZGljZXMgPSBjb21wdXRlX3JvdXRpbmcod2VpZ2h0cywgZmxhdF90b2tlbnMsIHRvcGspCgogICAgY29tcHV0ZV9yb3V0ZWRfZXhwZXJ0cygKICAgICAgICB3ZWlnaHRzLAogICAgICAgIGZsYXRfdG9rZW5zLAogICAgICAgIHRvcGssCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgaW5kaWNlcywKICAgICAgICBzY29yZXMsCiAgICAgICAgc2hhcmVkX291dHB1dAogICAgKQoKICAgIHJldHVybiBzaGFyZWRfb3V0cHV0LnZpZXcob3JpZ2luYWxfc2hhcGUpCgojIElucHV0IGdlbmVyYXRpb24gZm9yIHRoZSByZWZlcmVuY2UgY29kZQoKZGVmIGdlbmVyYXRlX2lucHV0KAogICAgZGhpZGRlbjogaW50LAogICAgZGV4cGVydDogaW50LAogICAgbnJvdXRlZGV4cGVydHM6IGludCwKICAgIG5zaGFyZWRleHBlcnRzOiBpbnQsCiAgICBuZXhwZXJ0c3BlcnRva2VuOiBpbnQsCiAgICBiczogaW50LAogICAgc2VxbGVuOiBpbnQsCiAgICBzZWVkOiBpbnQKKToKCiAgICAjIFJlYWxseSBkdW1iIGJ1dCBmb3Igbm93IF8gaXNuJ3QgcGFyc2luZyBjb3JyZWN0bHkuCiAgICBkX2hpZGRlbiA9IGRoaWRkZW4KICAgIGRfZXhwZXJ0ID0gZGV4cGVydAogICAgbl9yb3V0ZWRfZXhwZXJ0cyA9IG5yb3V0ZWRleHBlcnRzCiAgICBuX3NoYXJlZF9leHBlcnRzID0gbnNoYXJlZGV4cGVydHMKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4gPSBuZXhwZXJ0c3BlcnRva2VuCiAgICBiYXRjaF9zaXplID0gYnMKICAgIHNlcV9sZW4gPSBzZXFsZW4KCiAgICBjb25maWcgPSB7CiAgICAgICAgImRfaGlkZGVuIjogZF9oaWRkZW4sCiAgICAgICAgImRfZXhwZXJ0IjogZF9leHBlcnQsCiAgICAgICAgIm5fcm91dGVkX2V4cGVydHMiOiBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICJuX3NoYXJlZF9leHBlcnRzIjogbl9zaGFyZWRfZXhwZXJ0cywKICAgICAgICAibl9leHBlcnRzX3Blcl90b2tlbiI6IG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgImJhdGNoX3NpemUiOiBiYXRjaF9zaXplLAogICAgICAgICJzZXFfbGVuIjogc2VxX2xlbiwKICAgIH0KCiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQoKICAgIG51bV9leHBlcnRzID0gbl9yb3V0ZWRfZXhwZXJ0cwogICAgZXhwZXJ0X2RpbSA9IGRfZXhwZXJ0CiAgICB3ZWlnaHRzID0ge30KCiAgICBpbnB1dF90ZW5zb3IgPSB0b3JjaC5yYW5kbigKICAgICAgICAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApLmNvbnRpZ3VvdXMoKQoKICAgICMgSW5pdGlhbGl6ZSByb3V0ZXIgd2VpZ2h0cwogICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKG51bV9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChleHBlcnRfZGltLCBkX2hpZGRlbiksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQogICAgCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgcmV0dXJuIChpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZykKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBpbnB1dCA9IGdlbmVyYXRlX2lucHV0KDEyOCwgMTI4LCA0LCAxLCAyLCA4LCA4LCAwKQogICAgb3V0cHV0ID0gY3VzdG9tX2tlcm5lbChpbnB1dCk=
No newline at end of file
+ ciIiIgpVc2VzIGEgZ3JvdXAgZ2VtbSwgaW5zdGVhZCBvZiBhIGxvb3Agb3ZlciBleHBlcnRzLgoiIiIKCmltcG9ydCB0b3JjaAppbXBvcnQgdG9yY2gubm4gYXMgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgVHVwbGUsIExpc3QsIE9wdGlvbmFsCmltcG9ydCBtYXRoCmltcG9ydCBlaW5vcHMKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcwoKQGRhdGFjbGFzcwpjbGFzcyBHcm91cGVkVG9rZW5zOgogICAgdG9rZW5zOiB0b3JjaC5UZW5zb3IKICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlOiB0b3JjaC50ZW5zb3IKICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlX2NwdTogdG9yY2gudGVuc29yCiAgICBpbmRpY2VzOiB0b3JjaC5UZW5zb3IKICAgIHRva2VuX2dhdGhlcl9pbmRpY2VzOiB0b3JjaC5UZW5zb3IKCkB0cml0b24uaml0CmRlZiBzaWx1KHRpbGUpOgogICAgIyB0bC5leHAgbmVlZHMgZmxvYXQzMiBvciBmbG9hdDY0LgogICAgcmV0dXJuIHRpbGUgKiAoMS4wIC8gKDEuMCArIHRsLmV4cCgtdGlsZSkpKQoKZGVmIG51bV9zbXMoKToKICAgICMgTUkzMDAgaGFzIDMwNCBDVXMKICAgIHJldHVybiAyICogMzA0Cgpjb25maWdzID0gWwogICAgIyBNLCBOLCBLLCB3YXJwcywgc3RhZ2VzCiAgICAjIGZvciBBTUQsIG51bSBzdGFnZXMgc2hvdWxkIGJlIDEgb3IgMi4KICAgICgxMjgsIDEyOCwgMTI4LCA0LCAyKSwKICAgICgxMjgsIDEyOCwgNjQsIDQsIDIpLAogICAgKDEyOCwgMTI4LCAzMiwgNCwgMiksCiAgICAoMjU2LCAyNTYsIDY0LCA0LCAyKSwKICAgICg2NCwgMTI4LCAxMjgsIDQsIDIpLAogICAgKDEyOCwgMTI4LCAxMjgsIDgsIDIpLAogICAgKDI1NiwgMjU2LCA2NCwgOCwgMiksCiAgICAoNjQsIDY0LCAxMjgsIDQsIDIpLAogICAgKDY0LCA2NCwgMjU2LCA0LCAyKSwKICAgICgxMjgsIDY0LCAyNTYsIDQsIDIpCl0KCmNvbmZpZ3MgPSBbCiAgICB0cml0b24uQ29uZmlnKHsKICAgICAgICAnQkxPQ0tfU0laRV9NJzogY1swXSwKICAgICAgICAnQkxPQ0tfU0laRV9OJzogY1sxXSwKICAgICAgICAnQkxPQ0tfU0laRV9LJzogY1syXSwKICAgICAgICAnbnVtX3dhcnBzJzogY1szXSwKICAgICAgICAnbnVtX3N0YWdlcyc6IGNbNF0sCiAgICAgICAgJ05VTV9TTSc6IG51bV9zbXMoKQogICAgfSkgZm9yIGMgaW4gY29uZmlncwpdCgpAdHJpdG9uLmF1dG90dW5lKAogICAgY29uZmlncz1jb25maWdzLAogICAga2V5PVsnZ3JvdXBfc2l6ZSddLAopCkB0cml0b24uaml0CmRlZiBncm91cGVkX21hdG11bF9rZXJuZWwoCiAgICAjIGRldmljZSB0ZW5zb3Igb2YgbWF0cmljZXMgcG9pbnRlcnMKICAgIGdyb3VwX2FfcHRycywKICAgIGdyb3VwX2JfcHRycywKICAgIGdyb3VwX2NfcHRycywKICAgICMgZGV2aWNlIHRlbnNvciBvZiBnZW1tIHNpemVzLiBpdHMgc2hhcGUgaXMgW2dyb3VwX3NpemUsIDNdCiAgICAjIGRpbSAwIGlzIGdyb3VwX3NpemUsIGRpbSAxIGlzIHRoZSB2YWx1ZXMgb2YgPE0sIE4sIEs+IG9mIGVhY2ggZ2VtbQogICAgZ3JvdXBfZ2VtbV9zaXplcywKICAgICMgZGV2aWNlIHRlbnNvciBvZiBsZWFkaW5nIGRpbWVuc2lvbiBzaXplcy4gaXRzIHNoYXBlIGlzIFtncm91cF9zaXplLCAzXQogICAgIyBkaW0gMCBpcyBncm91cF9zaXplLCBkaW0gMSBpcyB0aGUgdmFsdWVzIG9mIDxsZGEsIGxkYiwgbGRjPiBvZiBlYWNoIGdlbW0KICAgIGdfbGRzLAogICAgIyBudW1iZXIgb2YgZ2VtbXMKICAgIGdyb3VwX3NpemUsCiAgICBBQ1RJVkFUSU9OOiB0bC5jb25zdGV4cHIsCiAgICAjIG51bWJlciBvZiB2aXJ0dWFsIFNNCiAgICBOVU1fU006IHRsLmNvbnN0ZXhwciwKICAgICMgdGlsZSBzaXplcwogICAgQkxPQ0tfU0laRV9NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfSzogdGwuY29uc3RleHByLAopOgogICAgdGlsZV9pZHggPSB0bC5wcm9ncmFtX2lkKDApCiAgICBsYXN0X3Byb2JsZW1fZW5kID0gMAogICAgZm9yIGcgaW4gcmFuZ2UoZ3JvdXBfc2l6ZSk6CiAgICAgICAgIyBnZXQgdGhlIGdlbW0gc2l6ZSBvZiB0aGUgY3VycmVudCBwcm9ibGVtCiAgICAgICAgZ20gPSB0bC5sb2FkKGdyb3VwX2dlbW1fc2l6ZXMgKyBnICogMykKICAgICAgICBnbiA9IHRsLmxvYWQoZ3JvdXBfZ2VtbV9zaXplcyArIGcgKiAzICsgMSkKICAgICAgICBnayA9IHRsLmxvYWQoZ3JvdXBfZ2VtbV9zaXplcyArIGcgKiAzICsgMikKICAgICAgICBudW1fbV90aWxlcyA9IHRsLmNkaXYoZ20sIEJMT0NLX1NJWkVfTSkKICAgICAgICBudW1fbl90aWxlcyA9IHRsLmNkaXYoZ24sIEJMT0NLX1NJWkVfTikKICAgICAgICBudW1fdGlsZXMgPSBudW1fbV90aWxlcyAqIG51bV9uX3RpbGVzCiAgICAgICAgIyBpdGVyYXRlIHRocm91Z2ggdGhlIHRpbGVzIGluIHRoZSBjdXJyZW50IGdlbW0gcHJvYmxlbQogICAgICAgIHdoaWxlICh0aWxlX2lkeCA+PSBsYXN0X3Byb2JsZW1fZW5kIGFuZCB0aWxlX2lkeCA8IGxhc3RfcHJvYmxlbV9lbmQgKyBudW1fdGlsZXMpOgogICAgICAgICAgICAjIHBpY2sgdXAgYSB0aWxlIGZyb20gdGhlIGN1cnJlbnQgZ2VtbSBwcm9ibGVtCiAgICAgICAgICAgIGsgPSBnawogICAgICAgICAgICBsZGEgPSB0bC5sb2FkKGdfbGRzICsgZyAqIDMpCiAgICAgICAgICAgIGxkYiA9IHRsLmxvYWQoZ19sZHMgKyBnICogMyArIDEpCiAgICAgICAgICAgIGxkYyA9IHRsLmxvYWQoZ19sZHMgKyBnICogMyArIDIpCiAgICAgICAgICAgIGFfcHRyID0gdGwubG9hZChncm91cF9hX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgIGJfcHRyID0gdGwubG9hZChncm91cF9iX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgIGNfcHRyID0gdGwubG9hZChncm91cF9jX3B0cnMgKyBnKS50byh0bC5wb2ludGVyX3R5cGUodGwuZmxvYXQxNikpCiAgICAgICAgICAgICMgZmlndXJlIG91dCB0aWxlIGNvb3JkaW5hdGVzCiAgICAgICAgICAgIHRpbGVfaWR4X2luX2dlbW0gPSB0aWxlX2lkeCAtIGxhc3RfcHJvYmxlbV9lbmQKICAgICAgICAgICAgdGlsZV9tX2lkeCA9IHRpbGVfaWR4X2luX2dlbW0gLy8gbnVtX25fdGlsZXMKICAgICAgICAgICAgdGlsZV9uX2lkeCA9IHRpbGVfaWR4X2luX2dlbW0gJSBudW1fbl90aWxlcwoKICAgICAgICAgICAgIyBkbyByZWd1bGFyIGdlbW0gaGVyZQogICAgICAgICAgICBvZmZzX2FtID0gdGlsZV9tX2lkeCAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pCiAgICAgICAgICAgIG9mZnNfYm4gPSB0aWxlX25faWR4ICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICAgICAgb2Zmc19rID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfSykKICAgICAgICAgICAgYV9wdHJzID0gYV9wdHIgKyBvZmZzX2FtWzosIE5vbmVdICogbGRhICsgb2Zmc19rW05vbmUsIDpdCiAgICAgICAgICAgIGJfcHRycyA9IGJfcHRyICsgb2Zmc19rWzosIE5vbmVdICogbGRiICsgb2Zmc19ibltOb25lLCA6XQogICAgICAgICAgICAKICAgICAgICAgICAgbV9tYXNrID0gb2Zmc19hbSA8IGdtCiAgICAgICAgICAgIAogICAgICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCiAgICAgICAgICAgIGZvciBrayBpbiByYW5nZSgwLCB0bC5jZGl2KGssIEJMT0NLX1NJWkVfSykpOgogICAgICAgICAgICAgICAgIyBoaW50IHRvIFRyaXRvbiBjb21waWxlciB0byBkbyBwcm9wZXIgbG9vcCBwaXBlbGluaW5nCiAgICAgICAgICAgICAgICB0bC5tdWx0aXBsZV9vZihhX3B0cnMsIFsxNiwgMTZdKQogICAgICAgICAgICAgICAgdGwubXVsdGlwbGVfb2YoYl9wdHJzLCBbMTYsIDE2XSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGEgPSB0bC5sb2FkKGFfcHRycywgbWFzaz1tX21hc2tbOiwgTm9uZV0pCiAgICAgICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCiAgICAgICAgICAgICAgICBhY2N1bXVsYXRvciA9IHRsLmRvdChhLCBiLCBhY2M9YWNjdW11bGF0b3IpCiAgICAgICAgICAgICAgICBhX3B0cnMgKz0gQkxPQ0tfU0laRV9LCiAgICAgICAgICAgICAgICBiX3B0cnMgKz0gQkxPQ0tfU0laRV9LICogbGRiCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgQUNUSVZBVElPTjoKICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gc2lsdShhY2N1bXVsYXRvcikKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBjID0gYWNjdW11bGF0b3IudG8odGwuZmxvYXQxNikKCiAgICAgICAgICAgIG9mZnNfY20gPSB0aWxlX21faWR4ICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICAgICAgb2Zmc19jbiA9IHRpbGVfbl9pZHggKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgICAgICAgICBjX3B0cnMgPSBjX3B0ciArIGxkYyAqIG9mZnNfY21bOiwgTm9uZV0gKyBvZmZzX2NuW05vbmUsIDpdCgogICAgICAgICAgICB0bC5zdG9yZShjX3B0cnMsIGMsIG1hc2s9bV9tYXNrWzosIE5vbmVdKQoKICAgICAgICAgICAgIyBnbyB0byB0aGUgbmV4dCB0aWxlIGJ5IGFkdmFuY2luZyBOVU1fU00KICAgICAgICAgICAgdGlsZV9pZHggKz0gdGwubnVtX3Byb2dyYW1zKGF4aXM9MCkKCiAgICAgICAgIyBnZXQgcmVhZHkgdG8gZ28gdG8gdGhlIG5leHQgZ2VtbSBwcm9ibGVtCiAgICAgICAgbGFzdF9wcm9ibGVtX2VuZCA9IGxhc3RfcHJvYmxlbV9lbmQgKyBudW1fdGlsZXMKCmRlZiBnZXRfYV9hZGRycyhncm91cF9BOiBHcm91cGVkVG9rZW5zLCBncm91cF9zaXplOiBpbnQpOgogICAgYV9hZGRycyA9IFtdCiAgICBhX3NoYXBlcyA9IFtdCiAgICBmb3IgaSBpbiByYW5nZShncm91cF9zaXplKToKICAgICAgICBlbmRfaWR4ID0gZ3JvdXBfQS50b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHVbaV0KICAgICAgICBzdGFydF9pZHggPSAwIGlmIGkgPT0gMCBlbHNlIGdyb3VwX0EudG9rZW5zX3Blcl9leHBlcnRfcmFuZ2VfY3B1W2kgLSAxXQogICAgICAgIGFfYWRkcnMuYXBwZW5kKGdyb3VwX0EudG9rZW5zW3N0YXJ0X2lkeDotMV0uZGF0YV9wdHIoKSkKICAgICAgICBNID0gZW5kX2lkeCAtIHN0YXJ0X2lkeAogICAgICAgIEsgPSBncm91cF9BLnRva2Vucy5zaXplKC0xKQogICAgICAgIGFfc2hhcGVzLmFwcGVuZCgoTSwgSykpCiAgICByZXR1cm4gYV9hZGRycywgYV9zaGFwZXMKICAgICAgICAKZGVmIGdldF9iX2FkZHJzKGdyb3VwX0I6IExpc3RbdG9yY2guVGVuc29yXSwgZ3JvdXBfc2l6ZTogaW50KToKICAgIGJfYWRkcnMgPSBbXQogICAgYl9zaGFwZXMgPSBbXQogICAgZm9yIGkgaW4gcmFuZ2UoZ3JvdXBfc2l6ZSk6CiAgICAgICAgYl9hZGRycy5hcHBlbmQoZ3JvdXBfQltpXS5kYXRhX3B0cigpKQogICAgICAgIEsgPSBncm91cF9CW2ldLnNpemUoMCkKICAgICAgICBOID0gZ3JvdXBfQltpXS5zaXplKDEpCiAgICAgICAgYl9zaGFwZXMuYXBwZW5kKChLLCBOKSkKICAgIHJldHVybiBiX2FkZHJzLCBiX3NoYXBlcwoKZGVmIGdyb3VwX2dlbW1fZm4oZ3JvdXBfQTogR3JvdXBlZFRva2VucywgZ3JvdXBfQjogTGlzdFt0b3JjaC5UZW5zb3JdLCBhY3RpdmF0aW9uKToKICAgIERFVklDRT1ncm91cF9CWzBdLmRldmljZQogICAgCiAgICBncm91cF9zaXplID0gbGVuKGdyb3VwX0IpCiAgICAKICAgIEFfYWRkcnMsIEFfc2hhcGVzID0gZ2V0X2FfYWRkcnMoZ3JvdXBfQSwgZ3JvdXBfc2l6ZSkKICAgIEJfYWRkcnMsIEJfc2hhcGVzID0gZ2V0X2JfYWRkcnMoZ3JvdXBfQiwgZ3JvdXBfc2l6ZSkKICAgIAogICAgQ19hZGRycyA9IFtdCiAgICBnX3NpemVzID0gW10KICAgIGdfbGRzID0gW10KICAgICAgICAKICAgIGMgPSB0b3JjaC5lbXB0eSgoZ3JvdXBfQS50b2tlbnMuc2l6ZSgwKSwgZ3JvdXBfQlswXS5zaXplKC0xKSksIGRldmljZT1ERVZJQ0UsIGR0eXBlPWdyb3VwX0EudG9rZW5zLmR0eXBlKQogICAgCiAgICBjX29mZnNldCA9IDAKICAgIGZvciBpIGluIHJhbmdlKGdyb3VwX3NpemUpOgogICAgICAgIGFzc2VydCBBX3NoYXBlc1tpXVsxXSA9PSBCX3NoYXBlc1tpXVswXQogICAgICAgIE0sIEsgPSBBX3NoYXBlc1tpXQogICAgICAgIEssIE4gPSBCX3NoYXBlc1tpXQogICAgICAgIAogICAgICAgIENfYWRkcnMuYXBwZW5kKGNbY19vZmZzZXQ6XS5kYXRhX3B0cigpKSAjIHVzaW5nIFtjX29mZnNldDpdIGluZGV4aW5nIHRvIGdldCB2aWV3CiAgICAgICAgZ19zaXplcyArPSBbTSwgTiwgS10KICAgICAgICBnX2xkcyArPSBbSywgTiwgYy5zdHJpZGUoMCldCiAgICAgICAgY19vZmZzZXQgKz0gTQogICAgICAgICAgICAgICAgCiAgICAjIG5vdGUgdGhlc2UgYXJlIGRldmljZSB0ZW5zb3JzCiAgICBkX2FfcHRycyA9IHRvcmNoLnRlbnNvcihBX2FkZHJzLCBkZXZpY2U9REVWSUNFKQogICAgZF9iX3B0cnMgPSB0b3JjaC50ZW5zb3IoQl9hZGRycywgZGV2aWNlPURFVklDRSkKICAgIGRfY19wdHJzID0gdG9yY2gudGVuc29yKENfYWRkcnMsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfc2l6ZXMgPSB0b3JjaC50ZW5zb3IoZ19zaXplcywgZHR5cGU9dG9yY2guaW50MzIsIGRldmljZT1ERVZJQ0UpCiAgICBkX2dfbGRzID0gdG9yY2gudGVuc29yKGdfbGRzLCBkdHlwZT10b3JjaC5pbnQzMiwgZGV2aWNlPURFVklDRSkKCiAgICAjIGludm9rZSBsaWtlIG5vcm1hbCBrZXJuZWw/Pz8gICAgCiAgICBncmlkID0gbGFtYmRhIE1FVEE6ICh0cml0b24uY2RpdihjLnNpemUoMCksIE1FVEFbJ0JMT0NLX1NJWkVfTSddKSAqIAogICAgICAgICAgICAgICAgICAgICAgICAgdHJpdG9uLmNkaXYoYy5zaXplKDEpLCBNRVRBWydCTE9DS19TSVpFX04nXSksICkKICAgIGdyb3VwZWRfbWF0bXVsX2tlcm5lbFtncmlkXSgKICAgICAgICBkX2FfcHRycywKICAgICAgICBkX2JfcHRycywKICAgICAgICBkX2NfcHRycywKICAgICAgICBkX2dfc2l6ZXMsCiAgICAgICAgZF9nX2xkcywKICAgICAgICBncm91cF9zaXplLAogICAgICAgIEFDVElWQVRJT049YWN0aXZhdGlvbgogICAgKQogICAgICAgIAogICAgcmV0dXJuIEdyb3VwZWRUb2tlbnMoCiAgICAgICAgdG9rZW5zPWMsCiAgICAgICAgdG9rZW5zX3Blcl9leHBlcnRfcmFuZ2U9Z3JvdXBfQS50b2tlbnNfcGVyX2V4cGVydF9yYW5nZSwKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHU9Z3JvdXBfQS50b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHUsCiAgICAgICAgaW5kaWNlcz1ncm91cF9BLmluZGljZXMsCiAgICAgICAgdG9rZW5fZ2F0aGVyX2luZGljZXM9Z3JvdXBfQS50b2tlbl9nYXRoZXJfaW5kaWNlcywKICAgICkKCkB0b3JjaC5jb21waWxlCmRlZiBnZXRfdG9rZW5faW5kaWNlcyhleHBlcnRfaW5kaWNlcywgbnVtX2V4cGVydHNfcGVyX3Rva2VuKToKICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgaW5kaWNlcyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYXJnc29ydCgpCiAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkKICAgIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlID0gY291bnRzLmN1bXN1bShkaW09MCkKICAgIHRva2VuX2luZGljZXMgPSBpbmRpY2VzIC8vIG51bV9leHBlcnRzX3Blcl90b2tlbgogICAgcmV0dXJuIGluZGljZXMsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzCgpAdG9yY2guY29tcGlsZQpkZWYgZXhwZXJ0X2lucHV0X3Blcm11dGUoCiAgICB0b2tlbnM6IHRvcmNoLlRlbnNvciwgCiAgICBleHBlcnRfaW5kaWNlczogdG9yY2guVGVuc29yLCAKICAgIG51bV9leHBlcnRzX3Blcl90b2tlbjogaW50CikgLT4gR3JvdXBlZFRva2VuczoKICAgIGluZGljZXMsIHRva2Vuc19wZXJfZXhwZXJ0X3JhbmdlLCB0b2tlbl9pbmRpY2VzID0gZ2V0X3Rva2VuX2luZGljZXMoZXhwZXJ0X2luZGljZXMsIG51bV9leHBlcnRzX3Blcl90b2tlbikKICAgIHRva2VuX2RpbSA9IHRva2Vucy5zaXplKDEpCiAgICBvdXRwdXQgPSB0b3JjaC5nYXRoZXIodG9rZW5zLCBkaW09MCwgaW5kZXg9dG9rZW5faW5kaWNlcy51bnNxdWVlemUoMSkuZXhwYW5kKC0xLCB0b2tlbl9kaW0pKQogICAgcmV0dXJuIEdyb3VwZWRUb2tlbnMoCiAgICAgICAgdG9rZW5zPW91dHB1dCwKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZT10b2tlbnNfcGVyX2V4cGVydF9yYW5nZSwKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHU9dG9rZW5zX3Blcl9leHBlcnRfcmFuZ2UuZGV0YWNoKCkuY3B1KCksCiAgICAgICAgaW5kaWNlcz1pbmRpY2VzLCAKICAgICAgICB0b2tlbl9nYXRoZXJfaW5kaWNlcz10b2tlbl9pbmRpY2VzLAogICAgKQoKQHRvcmNoLmNvbXBpbGUKZGVmIGV4cGVydF9vdXRwdXRfcGVybXV0ZSgKICAgIGdyb3VwZWRfdG9rZW5zOiBHcm91cGVkVG9rZW5zLAogICAgZXhwZXJ0X3Njb3JlczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHNfcGVyX3Rva2VuOiBpbnQsCiAgICBvdXRwdXQ6IHRvcmNoLlRlbnNvcgopIC0+IHRvcmNoLlRlbnNvcjoKICAgIGdyb3VwZWRfdG9rZW5zLnRva2Vucy5tdWxfKGV4cGVydF9zY29yZXMudmlldygtMSwgMSlbZ3JvdXBlZF90b2tlbnMuaW5kaWNlc10pCiAgICBvdXRwdXQuc2NhdHRlcl9yZWR1Y2VfKAogICAgICAgIDAsCiAgICAgICAgIyBpbmRleCB0ZW5zb3IgZG9lc24ndCBicm9hZGNhc3QsIHNvIHJlcGVhdCBpbmRpY2VzIGFsb25nIGhpZGRlbiBkaW0KICAgICAgICBncm91cGVkX3Rva2Vucy50b2tlbl9nYXRoZXJfaW5kaWNlcy52aWV3KC0xLCAxKS5leHBhbmQoLTEsIG91dHB1dC5zaXplKC0xKSksCiAgICAgICAgZ3JvdXBlZF90b2tlbnMudG9rZW5zLAogICAgICAgIHJlZHVjZT0nc3VtJwogICAgKQogICAgcmV0dXJuIG91dHB1dAoKQHRvcmNoLmNvbXBpbGUKZGVmIGNvbXB1dGVfc2hhcmVkX2V4cGVydCh3ZWlnaHRzLCB0b2tlbnMpOgogICAgd19nYXRlID0gd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXQogICAgd191cCA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10KICAgIHdfZG93biA9IHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10KICAgIGdhdGUgPSBGLnNpbHUodG9rZW5zIEAgd19nYXRlKQogICAgdXAgPSB0b2tlbnMgQCB3X3VwCiAgICBkb3duID0gKGdhdGUgKiB1cCkgQCB3X2Rvd24KICAgIHJldHVybiBkb3duCgpAdG9yY2guY29tcGlsZQpkZWYgY29tcHV0ZV9yb3V0aW5nKHdlaWdodHMsIHRva2VucywgdG9wayk6CiAgICAjIEZvciBzb21lIHJlYXNvbiwgcm91dGVyIHdlaWdodHMgYXJlIGFscmVhZHkgdHJhbnNwb3NlZD8/IFNvIHRyYW5zcG9zZSBoZXJlLi4uCiAgICB3X2cgPSB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10udCgpCiAgICBsb2dpdHMgPSB0b2tlbnMgQCB3X2cKICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgaz10b3BrLCBkaW09LTEsIHNvcnRlZD1GYWxzZSkKICAgIHJldHVybiB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzCgpkZWYgY29tcHV0ZV9yb3V0ZWRfZXhwZXJ0cygKICAgICAgICB3ZWlnaHRzLCAKICAgICAgICB0b2tlbnMsIAogICAgICAgIHRvcGssIAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIGV4cGVydF9pbmRpY2VzLAogICAgICAgIGV4cGVydF9zY29yZXMsCiAgICAgICAgb3V0cHV0CiAgICApOgogICAgZ2F0ZV9wcm9qX3dlaWdodHMgPSBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10gZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpXQogICAgdXBfcHJval93ZWlnaHRzID0gW3dlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKV0KICAgIGRvd25fcHJval93ZWlnaHRzID0gW3dlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKV0KICAgIAogICAgIyBnZXQgdG9rZW5zIGZvciBlYWNoIGV4cGVydCwgYnV0IGNvbXB1dGUgZXhwZXJ0IHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwgd2l0aCBncm91cCBnZW1tcy4KICAgIGdyb3VwX3Rva2VuczogR3JvdXBlZFRva2VucyA9IGV4cGVydF9pbnB1dF9wZXJtdXRlKHRva2VucywgZXhwZXJ0X2luZGljZXMsIHRvcGspCgogICAgZ2F0ZTogR3JvdXBlZFRva2VucyA9IGdyb3VwX2dlbW1fZm4oZ3JvdXBfdG9rZW5zLCBnYXRlX3Byb2pfd2VpZ2h0cywgYWN0aXZhdGlvbj1UcnVlKQogICAgCiAgICAjIHRoaXMgZnVzZXMgZ2F0ZSAqICh0b2tlbiBAIFdfdXApCiAgICB1cDogR3JvdXBlZFRva2VucyA9IGdyb3VwX2dlbW1fZm4oZ3JvdXBfdG9rZW5zLCB1cF9wcm9qX3dlaWdodHMsIGFjdGl2YXRpb249RmFsc2UpCiAgICAKICAgIHVwX2dhdGVkID0gR3JvdXBlZFRva2VucygKICAgICAgICB0b2tlbnM9Z2F0ZS50b2tlbnMgKiB1cC50b2tlbnMsCiAgICAgICAgdG9rZW5zX3Blcl9leHBlcnRfcmFuZ2U9Z2F0ZS50b2tlbnNfcGVyX2V4cGVydF9yYW5nZSwKICAgICAgICB0b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHU9Z2F0ZS50b2tlbnNfcGVyX2V4cGVydF9yYW5nZV9jcHUsCiAgICAgICAgaW5kaWNlcz1nYXRlLmluZGljZXMsCiAgICAgICAgdG9rZW5fZ2F0aGVyX2luZGljZXM9Z2F0ZS50b2tlbl9nYXRoZXJfaW5kaWNlcywKICAgICkKICAgIAogICAgZ3JvdXBfdG9rZW46IEdyb3VwZWRUb2tlbnMgPSBncm91cF9nZW1tX2ZuKHVwX2dhdGVkLCBkb3duX3Byb2pfd2VpZ2h0cywgYWN0aXZhdGlvbj1GYWxzZSkKCiAgICAjIHJvdXRlZCBleHBlcnRzIGdldCBhY2N1bXVsYXRlZCBvbnRvIG91dHB1dAogICAgZXhwZXJ0X291dHB1dF9wZXJtdXRlKAogICAgICAgIGdyb3VwX3Rva2VuLCAKICAgICAgICBleHBlcnRfc2NvcmVzLCAKICAgICAgICB0b3BrLCAKICAgICAgICBvdXRwdXQpCgpkZWYgY3VzdG9tX2tlcm5lbChkYXRhKToKICAgIGlucHV0X3RlbnNvciwgd2VpZ2h0cywgY29uZmlnID0gZGF0YQogICAgbnVtX2V4cGVydHMgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgdG9wayA9IGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCgogICAgaGlkZGVuX3NpemUgPSBpbnB1dF90ZW5zb3Iuc2l6ZSgyKQogICAgb3JpZ2luYWxfc2hhcGUgPSBpbnB1dF90ZW5zb3Iuc2l6ZSgpCiAgICAKICAgIGZsYXRfdG9rZW5zID0gaW5wdXRfdGVuc29yLnZpZXcoLTEsIGhpZGRlbl9zaXplKQoKICAgIHNoYXJlZF9vdXRwdXQgPSBjb21wdXRlX3NoYXJlZF9leHBlcnQod2VpZ2h0cywgZmxhdF90b2tlbnMpCiAgICBzY29yZXMsIGluZGljZXMgPSBjb21wdXRlX3JvdXRpbmcod2VpZ2h0cywgZmxhdF90b2tlbnMsIHRvcGspCgogICAgY29tcHV0ZV9yb3V0ZWRfZXhwZXJ0cygKICAgICAgICB3ZWlnaHRzLAogICAgICAgIGZsYXRfdG9rZW5zLAogICAgICAgIHRvcGssCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgaW5kaWNlcywKICAgICAgICBzY29yZXMsCiAgICAgICAgc2hhcmVkX291dHB1dAogICAgKQoKICAgIHJldHVybiBzaGFyZWRfb3V0cHV0LnZpZXcob3JpZ2luYWxfc2hhcGUpCgojIElucHV0IGdlbmVyYXRpb24gZm9yIHRoZSByZWZlcmVuY2UgY29kZQoKZGVmIGdlbmVyYXRlX2lucHV0KAogICAgZGhpZGRlbjogaW50LAogICAgZGV4cGVydDogaW50LAogICAgbnJvdXRlZGV4cGVydHM6IGludCwKICAgIG5zaGFyZWRleHBlcnRzOiBpbnQsCiAgICBuZXhwZXJ0c3BlcnRva2VuOiBpbnQsCiAgICBiczogaW50LAogICAgc2VxbGVuOiBpbnQsCiAgICBzZWVkOiBpbnQKKToKCiAgICAjIFJlYWxseSBkdW1iIGJ1dCBmb3Igbm93IF8gaXNuJ3QgcGFyc2luZyBjb3JyZWN0bHkuCiAgICBkX2hpZGRlbiA9IGRoaWRkZW4KICAgIGRfZXhwZXJ0ID0gZGV4cGVydAogICAgbl9yb3V0ZWRfZXhwZXJ0cyA9IG5yb3V0ZWRleHBlcnRzCiAgICBuX3NoYXJlZF9leHBlcnRzID0gbnNoYXJlZGV4cGVydHMKICAgIG5fZXhwZXJ0c19wZXJfdG9rZW4gPSBuZXhwZXJ0c3BlcnRva2VuCiAgICBiYXRjaF9zaXplID0gYnMKICAgIHNlcV9sZW4gPSBzZXFsZW4KCiAgICBjb25maWcgPSB7CiAgICAgICAgImRfaGlkZGVuIjogZF9oaWRkZW4sCiAgICAgICAgImRfZXhwZXJ0IjogZF9leHBlcnQsCiAgICAgICAgIm5fcm91dGVkX2V4cGVydHMiOiBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgICJuX3NoYXJlZF9leHBlcnRzIjogbl9zaGFyZWRfZXhwZXJ0cywKICAgICAgICAibl9leHBlcnRzX3Blcl90b2tlbiI6IG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgImJhdGNoX3NpemUiOiBiYXRjaF9zaXplLAogICAgICAgICJzZXFfbGVuIjogc2VxX2xlbiwKICAgIH0KCiAgICBnZW4gPSB0b3JjaC5HZW5lcmF0b3IoZGV2aWNlPSdjdWRhJykKICAgIGdlbi5tYW51YWxfc2VlZChzZWVkKQoKICAgIG51bV9leHBlcnRzID0gbl9yb3V0ZWRfZXhwZXJ0cwogICAgZXhwZXJ0X2RpbSA9IGRfZXhwZXJ0CiAgICB3ZWlnaHRzID0ge30KCiAgICBpbnB1dF90ZW5zb3IgPSB0b3JjaC5yYW5kbigKICAgICAgICAoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApLmNvbnRpZ3VvdXMoKQoKICAgICMgSW5pdGlhbGl6ZSByb3V0ZXIgd2VpZ2h0cwogICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKG51bV9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSJjdWRhIiwKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgZm9yIGkgaW4gcmFuZ2UobnVtX2V4cGVydHMpOgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChkX2hpZGRlbiwgZXhwZXJ0X2RpbSksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGV4cGVydF9kaW0pCgogICAgICAgIHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgICAgIChleHBlcnRfZGltLCBkX2hpZGRlbiksCiAgICAgICAgICAgIGRldmljZT0nY3VkYScsCiAgICAgICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQogICAgCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgcmV0dXJuIChpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZykKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBpbnB1dCA9IGdlbmVyYXRlX2lucHV0KDEyOCwgMTI4LCA0LCAxLCAyLCA4LCA4LCAwKQogICAgb3V0cHV0ID0gY3VzdG9tX2tlcm5lbChpbnB1dCk=
No newline at end of file

Best evidence level for this revision: reported

JSON