Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 23869

KernelBot user 302 · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.

moe_v0.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-23869?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
197.7ms
#74 of 118
2025-05-17
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
781.1ms
#79 of 118
2025-05-17

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:9ee4771b77a0ad450097b1d3a69095107eee577ec418ff798c503f6ee70dcc67
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

moe_v0.py1 lines
aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKCmNsYXNzIEV4cGVydChubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgZF9leHBlcnQ6IE9wdGlvbmFsW2ludF0gPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuYWN0X2ZuID0gbm4uU2lMVSgpCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCiAgICAgICAgc2VsZi5kX2V4cGVydDogaW50ID0gY29uZmlnWyJkX2V4cGVydCJdIGlmIGRfZXhwZXJ0IGlzIE5vbmUgZWxzZSBkX2V4cGVydAoKICAgICAgICBzZWxmLldfZ2F0ZSA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV191cCA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV19kb3duID0gbm4uTGluZWFyKHNlbGYuZF9leHBlcnQsIHNlbGYuZF9oaWRkZW4sIGJpYXM9RmFsc2UpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZ2F0ZSA9IHNlbGYuYWN0X2ZuKHNlbGYuV19nYXRlKHgpKQogICAgICAgIG91dCA9IHNlbGYuV19kb3duKGdhdGUgKiBzZWxmLldfdXAoeCkpCiAgICAgICAgcmV0dXJuIG91dAoKCmNsYXNzIE1vRUdhdGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYudG9wX2s6IGludCA9IGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgc2VsZi5udW1fZXhwZXJ0czogaW50ID0gY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KCiAgICAgICAgc2VsZi5XX2cgPSBubi5MaW5lYXIoc2VsZi5kX2hpZGRlbiwgc2VsZi5udW1fZXhwZXJ0cywgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICBsb2dpdHMgPSBzZWxmLldfZyh4KQogICAgICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgICAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9c2VsZi50b3BfaywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCgogICAgICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKY2xhc3MgTW9FKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZXhwZXJ0cyA9IG5uLk1vZHVsZUxpc3QoWwogICAgICAgICAgICBFeHBlcnQoY29uZmlnKQogICAgICAgICAgICBmb3IgXyBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSkKICAgICAgICBdKQogICAgICAgIHNlbGYuZ2F0aW5nX25ldHdvcmsgPSBNb0VHYXRlKGNvbmZpZykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2RpbSA9IGNvbmZpZ1siZF9leHBlcnQiXSAqIGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5zaGFyZWRfZXhwZXJ0ID0gRXhwZXJ0KGNvbmZpZz1jb25maWcsIGRfZXhwZXJ0PXNoYXJlZF9leHBlcnRfZGltKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNoYXJlZF9vdXRwdXQgPSBzZWxmLnNoYXJlZF9leHBlcnQoeCkKICAgICAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IHNlbGYuZ2F0aW5nX25ldHdvcmsoeCkKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltID0geC5zaGFwZQogICAgICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeF9mbGF0ID0geC52aWV3KC0xLCBoaWRkZW5fZGltKQogICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCiAgICAgICAgcm91dGVkX291dHB1dF9mbGF0ID0gc2VsZi5tb2VfaW5mZXIoeF9mbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cykKCiAgICAgICAgcm91dGVkX291dHB1dCA9IHJvdXRlZF9vdXRwdXRfZmxhdC52aWV3KCpvcmlnX3NoYXBlKQogICAgICAgIHJldHVybiByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIEB0b3JjaC5ub19ncmFkKCkKICAgIGRlZiBtb2VfaW5mZXIoc2VsZiwKICAgICAgICAgICAgICAgICAgeDogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHM6IHRvcmNoLlRlbnNvcgogICAgICAgICAgICAgICAgICkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGV4cGVydF9jYWNoZSA9IHRvcmNoLnplcm9zX2xpa2UoeCkKICAgICAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgICAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKQogICAgICAgIHRva2Vuc19wZXJfZXhwZXJ0ID0gY291bnRzLmN1bXN1bSgpCiAgICAgICAgbnVtX3Blcl90b2sgPSBzZWxmLmNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgICAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydCk6CiAgICAgICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydFtleHBlcnRfaWQgLSAxXQogICAgICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBleHBlcnQgPSBzZWxmLmV4cGVydHNbZXhwZXJ0X2lkXQogICAgICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMgPSB4W2V4cF90b2tlbl9pZHhzXQogICAgICAgICAgICBleHBlcnRfb3V0ICAgID0gZXhwZXJ0KGV4cGVydF90b2tlbnMpCiAgICAgICAgICAgIGV4cGVydF9vdXQubXVsXyhmbGF0X2V4cGVydF93ZWlnaHRzW2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICAgICAgZXhwZXJ0X2NhY2hlLnNjYXR0ZXJfcmVkdWNlXygKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBleHBfdG9rZW5faWR4cy52aWV3KC0xLCAxKS5yZXBlYXQoMSwgeC5zaGFwZVstMV0pLAogICAgICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgICAgIHJlZHVjZT0nc3VtJwogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBleHBlcnRfY2FjaGUKCgpkZWYgcmVmX2N1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFN1Ym1pc3Npb24gdGVtcGxhdGUgZm9yIERlZXBTZWVrLXN0eWxlIE1peHR1cmUgb2YgRXhwZXJ0cyB1c2luZyBQeVRvcmNoLgoKICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgb2YgKGlucHV0OiB0b3JjaC5UZW5zb3IsIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLCBjb25maWc6IERpY3QpCiAgICAgICAgICAgIC0gaW5wdXQ6IElucHV0IHRlbnNvciBvZiBzaGFwZSBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX3NpemVdCiAgICAgICAgICAgIC0gd2VpZ2h0czogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIHdlaWdodHMKICAgICAgICAgICAgLSBjb25maWc6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKCiAgICBSZXR1cm5zOgogICAgICAgIFR1cGxlIGNvbnRhaW5pbmc6CiAgICAgICAgICAgIC0gb3V0cHV0OiBQcm9jZXNzZWQgdGVuc29yIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsXQogICAgICAgICAgICAtIGF1eF9kYXRhOiBEaWN0aW9uYXJ5IHdpdGggYXV4aWxpYXJ5IGRhdGEKICAgICIiIgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBudW1fZXhwZXJ0cyA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICBtb2UgPSBNb0UoY29uZmlnKQoKICAgICMgRmlsbCBpbiB0aGUgZ2l2ZW4gd2VpZ2h0cyBvZiB0aGUgbW9kZWwKICAgIG1vZS5nYXRpbmdfbmV0d29yay5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKCiAgICBmb3IgaSBpbiByYW5nZShudW1fZXhwZXJ0cyk6CiAgICAgICAgZ2F0ZV9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddCiAgICAgICAgdXBfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQogICAgICAgIGRvd25fcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXQoKICAgICAgICAjIFRyYW5zcG9zZSB3ZWlnaHRzIHRvIG1hdGNoIGV4cGVjdGVkIHNoYXBlIGZvciBubi5MaW5lYXIKICAgICAgICBtb2UuZXhwZXJ0c1tpXS5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGdhdGVfcHJval93ZWlnaHQudCgpKQogICAgICAgIG1vZS5leHBlcnRzW2ldLldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHVwX3Byb2pfd2VpZ2h0LnQoKSkKICAgICAgICBtb2UuZXhwZXJ0c1tpXS5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGRvd25fcHJval93ZWlnaHQudCgpKQoKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkpCiAgICBtb2Uuc2hhcmVkX2V4cGVydC5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnQoKSkKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LldfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS50KCkpCgogICAgIyBSdW4gdGhlIG1vZGVsCiAgICBvdXRwdXQgPSBtb2UoaW5wdXRfdGVuc29yKQoKICAgIHJldHVybiBvdXRwdXQKCgpkZWYgZ2VuZXJhdGVfaW5wdXQoCiAgICBkaGlkZGVuOiBpbnQsCiAgICBkZXhwZXJ0OiBpbnQsCiAgICBucm91dGVkZXhwZXJ0czogaW50LAogICAgbnNoYXJlZGV4cGVydHM6IGludCwKICAgIG5leHBlcnRzcGVydG9rZW46IGludCwKICAgIGJzOiBpbnQsCiAgICBzZXFsZW46IGludCwKICAgIHNlZWQ6IGludAopIC0+IGlucHV0X3Q6CgogICAgIyBSZWFsbHkgZHVtYiBidXQgZm9yIG5vdyBfIGlzbid0IHBhcnNpbmcgY29ycmVjdGx5LgogICAgZF9oaWRkZW4gPSBkaGlkZGVuCiAgICBkX2V4cGVydCA9IGRleHBlcnQKICAgIG5fcm91dGVkX2V4cGVydHMgPSBucm91dGVkZXhwZXJ0cwogICAgbl9zaGFyZWRfZXhwZXJ0cyA9IG5zaGFyZWRleHBlcnRzCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuID0gbmV4cGVydHNwZXJ0b2tlbgogICAgYmF0Y2hfc2l6ZSA9IGJzCiAgICBzZXFfbGVuID0gc2VxbGVuCgogICAgY29uZmlnID0gewogICAgICAgICJkX2hpZGRlbiI6IGRfaGlkZGVuLAogICAgICAgICJkX2V4cGVydCI6IGRfZXhwZXJ0LAogICAgICAgICJuX3JvdXRlZF9leHBlcnRzIjogbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICAibl9zaGFyZWRfZXhwZXJ0cyI6IG5fc2hhcmVkX2V4cGVydHMsCiAgICAgICAgIm5fZXhwZXJ0c19wZXJfdG9rZW4iOiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICJiYXRjaF9zaXplIjogYmF0Y2hfc2l6ZSwKICAgICAgICAic2VxX2xlbiI6IHNlcV9sZW4sCiAgICB9CgogICAgZ2VuID0gdG9yY2guR2VuZXJhdG9yKGRldmljZT0nY3VkYScpCiAgICBnZW4ubWFudWFsX3NlZWQoc2VlZCkKCiAgICBudW1fZXhwZXJ0cyA9IG5fcm91dGVkX2V4cGVydHMKICAgIGV4cGVydF9kaW0gPSBkX2V4cGVydAogICAgd2VpZ2h0cyA9IHt9CgogICAgaW5wdXRfdGVuc29yID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSwKICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgZ2VuZXJhdG9yPWdlbgogICAgKS5jb250aWd1b3VzKCkKCiAgICAjIEluaXRpYWxpemUgcm91dGVyIHdlaWdodHMKICAgIHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgIChudW1fZXhwZXJ0cywgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0iY3VkYSIsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQoKICAgIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKToKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltKQoKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltKQoKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZXhwZXJ0X2RpbSwgZF9oaWRkZW4pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChkX2hpZGRlbikKCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgcmV0dXJuIChpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZykKCkB0cml0b24uaml0CmRlZiBjYWxjdWxhdGVfZXhwZXJ0MnRva2VuX2NvdW50X2FuZF93aXRoaW5fZXhwZXJ0X2luZGV4KAogICAgdG9wa19pbmRpY2VzLAogICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgd2l0aGluX2V4cGVydF9pbmRleCwKICAgIHRva2VuX2NvdW50LAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIHRvcGtfaW5kaWNlczogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQsIG5fZXhwZXJ0c19wZXJfdG9rZW4pIDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIDEpCiAgICAjIGdyaWQ6IChuX3JvdXRlZF9leHBlcnRzLCApCiAgICBleHBlcnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgCiAgICB0b3RhbF9jb3VudCA9IDAKICAgIGZvciBpZHggaW4gcmFuZ2UoMCwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBCTE9DS19TSVpFKToKICAgICAgICBvZmZzZXRzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgaWR4CiAgICAgICAgbWFzayA9IG9mZnNldHMgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4KICAgICAgICB0b3BrX2luZGljZXNfYmxvY2sgPSB0bC5sb2FkKHRvcGtfaW5kaWNlcyArIG9mZnNldHMsIG1hc2s9bWFzaywgb3RoZXI9LTEpICMgKEJMT0NLX1NJWkUsICkKICAgICAgICBpc19jdXJyZW50X2V4cGVydCA9IHRsLndoZXJlKHRvcGtfaW5kaWNlc19ibG9jayA9PSBleHBlcnRfaWR4LCAxLCAwKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgY3VyX2N1bXN1bSA9IHRsLmN1bXN1bShpc19jdXJyZW50X2V4cGVydCwgYXhpcz0wKSArIHRvdGFsX2NvdW50IC0gMSAjc2hpZnQgbGVmdCBieSAxCiAgICAgICAgdG90YWxfY291bnQgKz0gdGwuc3VtKGlzX2N1cnJlbnRfZXhwZXJ0KQogICAgICAgIAogICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXhfYmxvY2sgPSB0bC53aGVyZShpc19jdXJyZW50X2V4cGVydCwgY3VyX2N1bXN1bSwgLTEpCiAgICAgICAgdGwuc3RvcmUoCiAgICAgICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXggKyBpZHggKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksIHdpdGhpbl9leHBlcnRfaW5kZXhfYmxvY2ssIAogICAgICAgICAgICBtYXNrPSAoaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuKSBhbmQgKGlzX2N1cnJlbnRfZXhwZXJ0LnRvKHRsLmludDEpKQogICAgICAgICkKICAgICAgICAKICAgIHRsLnN0b3JlKGV4cGVydDJ0b2tlbl9jb3VudCArIGV4cGVydF9pZHgsIHRvdGFsX2NvdW50KQogICAgCkB0cml0b24uaml0CmRlZiBjYWxjdWxhdGVfdG9rZW4yaW5kZXgoCiAgICB0b3BrX2luZGljZXMsCiAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgdG9rZW4yaW5kZXgsCiAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgdG9rZW5fY291bnQsCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgbl9yb3V0ZWRfZXhwZXJ0cywKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgdG9wa19pbmRpY2VzOiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgKSA6ICgxLCApCiAgICAjIHRva2VuMmluZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bTogKG5fcm91dGVkX2V4cGVydHMgKyAxLCApIDogKDEsICkKICAgICMgZ3JpZDogKGNkaXYodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBCTE9DS19TSVpFKSwgKQogICAgCiAgICAjIHRsLmRldmljZV9hc3NlcnQoQkxPQ0tfU0laRSA+PSBuX2V4cGVydHNfcGVyX3Rva2VuICsgMSkKICAgIGV4cGVydDJ0b2tlbl9jb3VudF9ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIG1hc2s9dGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpIDwgbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICAjIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jYXQoCiAgICAjICAgICB0bC56ZXJvcygoMSwgKSwgZHR5cGU9dGwuaW50MzIpLAogICAgIyAgICAgdGwuY3Vtc3VtKAogICAgIyAgICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudF9ibG9jaywKICAgICMgICAgICAgICBheGlzPTAsCiAgICAjICAgICApLAogICAgIyAgICAgY2FuX3Jlb3JkZXI9RmFsc2UsCiAgICAjICkgIyAoQkxPQ0tfU0laRSArIDEsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgIyB0bC5kZXZpY2VfcHJpbnQoImV4cGVydDJ0b2tlbl9jb3VudF9ibG9jazogIiwgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrKQogICAgIyB0bC5kZXZpY2VfcHJpbnQoImV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2s6ICIsIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2spCiAgICBpZiB0bC5wcm9ncmFtX2lkKDApID09IDA6CiAgICAgICAgIyB0bC5kZXZpY2VfcHJpbnQoImV4cGVydDJ0b2tlbl9jb3VudF9ibG9jazogIiwgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrKQogICAgICAgICMgdGwuZGV2aWNlX3ByaW50KCJleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrOiAiLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrKQogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCmRlZiB0b3JjaF9nZXRfbV9jdW1zdW0oCiAgICB0b3BrX2luZGljZXM6IHRvcmNoLlRlbnNvciwKICAgIGV4cGVydF9jbnQ6IGludCwKKToKICAgICMgdG9wa19pbmRpY2VzOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pIDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIDEpCiAgICAjIGV4cGVydDJ0b2tlbl9jb3VudDogKG5fcm91dGVkX2V4cGVydHMsKSA6ICgxLCApCiAgICAKICAgIGV4cGVydF9jb3VudCA9IHRvcmNoLnplcm9zKChleHBlcnRfY250LCksIGR0eXBlPXRvcmNoLmludDMyKQogICAgZm9yIGkgaW4gcmFuZ2UodG9wa19pbmRpY2VzLnNoYXBlWzBdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSh0b3BrX2luZGljZXMuc2hhcGVbMV0pOgogICAgICAgICAgICBleHBlcnRfY291bnRbdG9wa19pbmRpY2VzW2ldW2pdXSArPSAxCiAgICBleHBlcnRfY291bnRfY3Vtc3VtID0gdG9yY2guY2F0KAogICAgICAgICh0b3JjaC56ZXJvcygoMSwpLCBkdHlwZT10b3JjaC5pbnQzMiksIHRvcmNoLmN1bXN1bShleHBlcnRfY291bnQsIGRpbT0wKSksCiAgICAgICAgZGltPTAsCiAgICApCiAgICByZXR1cm4gZXhwZXJ0X2NvdW50X2N1bXN1bS5jdWRhKCkKZGVmIHRvcmNoX2dldF90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlczogdG9yY2guVGVuc29yLAogICAgZXhwZXJ0X2NvdW50OiBpbnQsCik6CiAgICAjIHRvcGtfaW5kaWNlczogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsKSA6ICgxLCApCiAgICB0b3BrX2luZGljZXMgPSB0b3BrX2luZGljZXMuY3B1KCkKICAgIGV4cGVydF90b2tlbl9jb3VudCA9IHRvcmNoLnplcm9zKChleHBlcnRfY291bnQsKSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guemVyb3MoKHRvcGtfaW5kaWNlcy5zaGFwZVswXSwgdG9wa19pbmRpY2VzLnNoYXBlWzFdKSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICBmb3IgaSBpbiByYW5nZSh0b3BrX2luZGljZXMuc2hhcGVbMF0pOgogICAgICAgIGZvciBqIGluIHJhbmdlKHRvcGtfaW5kaWNlcy5zaGFwZVsxXSk6CiAgICAgICAgICAgIGV4cGVydF9pZHggPSB0b3BrX2luZGljZXNbaV1bal0KICAgICAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleFtpXVtqXSA9IGV4cGVydF90b2tlbl9jb3VudFtleHBlcnRfaWR4XQogICAgICAgICAgICBleHBlcnRfdG9rZW5fY291bnRbZXhwZXJ0X2lkeF0gKz0gMQogICAgCiAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtID0gdG9yY2guY2F0KAogICAgICAgICh0b3JjaC56ZXJvcygoMSwpLCBkdHlwZT10b3JjaC5pbnQzMiksIHRvcmNoLmN1bXN1bShleHBlcnRfdG9rZW5fY291bnQsIGRpbT0wKSksCiAgICAgICAgZGltPTAsCiAgICApCiAgICB0b2tlbjJpbmRleCA9IHRvcmNoLnplcm9zKCh0b3BrX2luZGljZXMuc2hhcGVbMF0sIHRvcGtfaW5kaWNlcy5zaGFwZVsxXSksIGR0eXBlPXRvcmNoLmludDMyKQogICAgZm9yIGkgaW4gcmFuZ2UodG9wa19pbmRpY2VzLnNoYXBlWzBdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSh0b3BrX2luZGljZXMuc2hhcGVbMV0pOgogICAgICAgICAgICBleHBlcnRfaWR4ID0gdG9wa19pbmRpY2VzW2ldW2pdCiAgICAgICAgICAgIHRva2VuMmluZGV4W2ldW2pdID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bVtleHBlcnRfaWR4XSArIHdpdGhpbl9leHBlcnRfaW5kZXhbaV1bal0KICAgIHJldHVybiB0b2tlbjJpbmRleC5jdWRhKCksIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0uY3VkYSgpLCB3aXRoaW5fZXhwZXJ0X2luZGV4LmN1ZGEoKSwgZXhwZXJ0X3Rva2VuX2NvdW50LmN1ZGEoKQpAdHJpdG9uLmppdApkZWYgc2NhdHRlcigKICAgIGlucHV0X3RlbnNvciwKICAgIHRva2VuMmluZGV4LAogICAgcmVwZWF0ZWRfdG9rZW5zLAogICAgYmF0Y2hfc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgZF9oaWRkZW4sIAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyBpbnB1dF90ZW5zb3I6IChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyB0b2tlbjJpbmRleDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyByZXBlYXRlZF90b2tlbnM6IChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgZ3JpZDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIHNlcV9sZW4sIGJhdGNoX3NpemUpCiAgICBleHBlcnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgc2VxX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIGJhdGNoX2lkeCA9IHRsLnByb2dyYW1faWQoMikKICAgIAogICAgdG9rZW5faWR4ID0gYmF0Y2hfaWR4ICogc2VxX2xlbiArIHNlcV9pZHgKICAgIGRzdF9pZHggPSB0bC5sb2FkKHRva2VuMmluZGV4ICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGV4cGVydF9pZHgpCiAgICBmb3IgaSBpbiByYW5nZSgwLCBkX2hpZGRlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0ID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgaQogICAgICAgIG1hc2sgPSBvZmZzZXQgPCBkX2hpZGRlbgogICAgICAgIGlucHV0X3RlbnNvcl9ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgICAgIGlucHV0X3RlbnNvciArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICByZXBlYXRlZF90b2tlbnMgKyBkc3RfaWR4ICogZF9oaWRkZW4gKyBvZmZzZXQsCiAgICAgICAgICAgIGlucHV0X3RlbnNvcl9ibG9jaywKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKZGVmIHRvcmNoX3NjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3I6IHRvcmNoLlRlbnNvciwKICAgIHRva2VuMmluZGV4OiB0b3JjaC5UZW5zb3IsCik6CiAgICAjIGlucHV0X3RlbnNvcjogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIHRva2VuMmluZGV4OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pIDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIDEpCiAgICAjIHJlcGVhdGVkX3Rva2VuczogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgcmVwZWF0ZWRfdG9rZW5zID0gdG9yY2guemVyb3MoCiAgICAgICAgKGlucHV0X3RlbnNvci5zaGFwZVswXSAqIHRva2VuMmluZGV4LnNoYXBlWzFdLCBpbnB1dF90ZW5zb3Iuc2hhcGVbMV0pLAogICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSwKICAgICkKICAgIGZvciBpIGluIHJhbmdlKHRva2VuMmluZGV4LnNoYXBlWzBdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSh0b2tlbjJpbmRleC5zaGFwZVsxXSk6CiAgICAgICAgICAgIGRzdF9pZHggPSB0b2tlbjJpbmRleFtpXVtqXQogICAgICAgICAgICByZXBlYXRlZF90b2tlbnNbZHN0X2lkeF0gPSBpbnB1dF90ZW5zb3JbaV0KICAgIHJldHVybiByZXBlYXRlZF90b2tlbnMuY3VkYSgpCkB0cml0b24uaml0CmRlZiBncm91cF9nZW1tKAogICAgYSwgYl9iYXNlX3B0cnMsIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnM6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYjogKGssIG4pIDogKG4sIDEpCiAgICAjIGM6ICh0b3RhbF9tLCBuKSA6IChuLCAxKQogICAgIyBtX2N1bXN1bTogKGdyb3VwX3NpemUgKyAxLCApIDogKDEsICkKICAgICMgZ3JpZDogKCB0cml0b24uY2RpdihuLCBCTE9DS19OKSwgdHJpdG9uLmNkaXYobWF4X20sIEJMT0NLX00pLCBncm91cF9zaXplICkKICAgIGdyb3VwX2lkID0gdGwucHJvZ3JhbV9pZCgyKQogICAgbl9zdGFydCA9IHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19OCiAgICBtX2lkID0gdGwucHJvZ3JhbV9pZCgxKQogICAgCiAgICBncm91cF9tX3N0YXJ0ID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkKQogICAgZ3JvdXBfbV9lbmQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQgKyAxKQogICAgZ3JvdXBfYl9iYXNlX3B0ciA9IHRsLmxvYWQoYl9iYXNlX3B0cnMgKyBncm91cF9pZCkKICAgIGlmIGdyb3VwX21fc3RhcnQgKyBtX2lkICogQkxPQ0tfTSA+PSBncm91cF9tX2VuZDoKICAgICAgICByZXR1cm4KICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIudG8odGwucG9pbnRlcl90eXBlKHRsLmZsb2F0MTYpKSwKICAgICAgICBzaGFwZT0oaywgbiksCiAgICAgICAgc3RyaWRlcz0obiwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX0ssIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGNfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1jICsgZ3JvdXBfbV9zdGFydCAqIG4sCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgbiksCiAgICAgICAgc3RyaWRlcz0obiwgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBhY2N1bSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgYl9ibG9jayA9IHRsLmxvYWQoYl9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoQkxPQ0tfSywgQkxPQ0tfTikKICAgICAgICBhY2N1bSArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jaykgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgYWNjdW0udG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQoKZGVmIHRvcmNoX2dyb3VwX2dlbW0oCiAgICBhOiB0b3JjaC5UZW5zb3IsCiAgICBiX3RlbnNvcnM6IExpc3RbdG9yY2guVGVuc29yXSwKICAgIG1fY3Vtc3VtOiB0b3JjaC5UZW5zb3IsCiAgICBuOiBpbnQsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX3RlbnNvcnM6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYjogKGssIG4pIDogKG4sIDEpCiAgICAjIGM6ICh0b3RhbF9tLCBuKSA6IChuLCAxKQogICAgIyBtX2N1bXN1bTogKGdyb3VwX3NpemUgKyAxLCApIDogKDEsICkKICAgIAogICAgZ3JvdXBfc2l6ZSA9IGxlbihiX3RlbnNvcnMpCiAgICBjID0gdG9yY2guemVyb3MoCiAgICAgICAgKG1fY3Vtc3VtWy0xXSwgbiksCiAgICAgICAgZGV2aWNlPWEuZGV2aWNlLAogICAgICAgIGR0eXBlPWEuZHR5cGUsCiAgICApCiAgICBmb3IgaSBpbiByYW5nZShncm91cF9zaXplKToKICAgICAgICAKICAgICAgICBtYXRfYSA9IGFbbV9jdW1zdW1baV06bV9jdW1zdW1baSArIDFdXQogICAgICAgIG1hdF9iID0gYl90ZW5zb3JzW2ldCiAgICAgICAgY1ttX2N1bXN1bVtpXTptX2N1bXN1bVtpICsgMV1dID0gdG9yY2gubWF0bXVsKAogICAgICAgICAgICBtYXRfYSwKICAgICAgICAgICAgbWF0X2IsCiAgICAgICAgKQogICAgcmV0dXJuIGMuY3VkYSgpCiAgICAgICAgCiAgICAgICAgCkB0cml0b24uaml0CmRlZiB3ZWlnaHRlZF9zdW1fZ2F0aGVyKAogICAgZmZuMV9vdXQsCiAgICB0b2tlbjJpbmRleCwKICAgIHRvcGtfc2NvcmVzLAogICAgc2hhcmVkX2V4cGVydF9mZm4xLAogICAgbW9lX291dCwKICAgIGRfaGlkZGVuLAogICAgYmF0Y2hfc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyBmZm4xX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyB0b2tlbjJpbmRleDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyB0b3BrX3Njb3JlczogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBzaGFyZWRfZXhwZXJ0X2ZmbjE6IChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyBtb2Vfb3V0OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgZ3JpZDogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBCTE9DS19TSVpFKSwgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4pCiAgICAKICAgIHNlZ21lbnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgdG9rZW5faWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgCiAgICBvZmZzZXRzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgc2VnbWVudF9pZHggKiBCTE9DS19TSVpFCiAgICBtYXNrID0gb2Zmc2V0cyA8IGRfaGlkZGVuCiAgICAKICAgIGRhdGEgPSB0bC5sb2FkKAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgICBmb3IgaSBpbiByYW5nZShuX2V4cGVydHNfcGVyX3Rva2VuKToKICAgICAgICB3ZWlnaHQgPSB0bC5sb2FkKHRvcGtfc2NvcmVzICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgaW5kZXggPSB0bC5sb2FkKHRva2VuMmluZGV4ICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgZmZuMV9vdXRfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBmZm4xX291dCArIGluZGV4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQogICAgICAgIGRhdGEgKz0gd2VpZ2h0ICogZmZuMV9vdXRfYmxvY2sKICAgIHRsLnN0b3JlKAogICAgICAgIG1vZV9vdXQgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgZGF0YSwKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgICAgICAKZGVmIHRvcmNoX3dlaWdodGVkX3N1bV9nYXRoZXIoCiAgICBmZm4xX291dDogdG9yY2guVGVuc29yLAogICAgdG9rZW4yaW5kZXg6IHRvcmNoLlRlbnNvciwKICAgIHRvcGtfc2NvcmVzOiB0b3JjaC5UZW5zb3IsCiAgICBzaGFyZWRfZXhwZXJ0X2ZmbjE6IHRvcmNoLlRlbnNvciwKKToKICAgICMgZmZuMV9vdXQ6IChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgdG9wa19zY29yZXM6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgc2hhcmVkX2V4cGVydF9mZm4xOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgbW9lX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICB0b2tlbl9jb3VudCA9IHRva2VuMmluZGV4LnNoYXBlWzBdCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuID0gdG9rZW4yaW5kZXguc2hhcGVbMV0KICAgIGRfaGlkZGVuID0gZmZuMV9vdXQuc2hhcGVbMV0KICAgIG1vZV9vdXQgPSB0b3JjaC56ZXJvcygKICAgICAgICAodG9rZW5fY291bnQsIGRfaGlkZGVuKSwKICAgICAgICBkZXZpY2U9ZmZuMV9vdXQuZGV2aWNlLAogICAgICAgIGR0eXBlPWZmbjFfb3V0LmR0eXBlLAogICAgKQogICAgZm9yIGkgaW4gcmFuZ2UodG9rZW5fY291bnQpOgogICAgICAgIGZvciBqIGluIHJhbmdlKG5fZXhwZXJ0c19wZXJfdG9rZW4pOgogICAgICAgICAgICBpbmRleCA9IHRva2VuMmluZGV4W2ldW2pdCiAgICAgICAgICAgIHdlaWdodCA9IHRvcGtfc2NvcmVzW2ldW2pdCiAgICAgICAgICAgIG1vZV9vdXRbaV0gKz0gd2VpZ2h0ICogZmZuMV9vdXRbaW5kZXhdCiAgICAgICAgbW9lX291dFtpXSArPSBzaGFyZWRfZXhwZXJ0X2ZmbjFbaV0KICAgIHJldHVybiBtb2Vfb3V0LmN1ZGEoKQogICAKIyBjb25maWc6IHsnZF9oaWRkZW4nOiA3MTY4LCAnZF9leHBlcnQnOiAyMDQ4LCAnbl9yb3V0ZWRfZXhwZXJ0cyc6IDMyLCAnbl9zaGFyZWRfZXhwZXJ0cyc6IDEsICduX2V4cGVydHNfcGVyX3Rva2VuJzogNCwgJ2JhdGNoX3NpemUnOiAxLCAnc2VxX2xlbic6IDIwNDh9CiMgaW5wdXRfdGVuc29yIGxheW91dDogKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiAqIHNlcV9sZW4sIGRfaGlkZGVuLCAxKQojIHJvdXRlci53ZWlnaHQgbGF5b3V0OiAobl9yb3V0ZWRfZXhwZXJ0cywgIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBleHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQpIDogKGRfZXhwZXJ0LCAxKQojIGV4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQsIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMC53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykgOiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4xLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjIud2VpZ2h0IGxheW91dDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQpkZWYgbW9lX2ZvcndhcmQoCiAgICBpbnB1dF90ZW5zb3I6IHRvcmNoLlRlbnNvciwKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLAogICAgZF9oaWRkZW46IGludCwKICAgIGRfZXhwZXJ0OiBpbnQsCiAgICBuX3JvdXRlZF9leHBlcnRzOiBpbnQsCiAgICBuX3NoYXJlZF9leHBlcnRzOiBpbnQsCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuOiBpbnQsCiAgICBiYXRjaF9zaXplOiBpbnQsCiAgICBzZXFfbGVuOiBpbnQKKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAjIGlucHV0X3RlbnNvcjogKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgaW5wdXRfdGVuc29yID0gaW5wdXRfdGVuc29yLnJlc2hhcGUoLTEsIGRfaGlkZGVuKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCgoKICAgIHJvdXRlcl93ZWlnaHQgPSB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10gIyAobl9yb3V0ZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNvZnRtYXggKyB0b3AgayA/IG9yIGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICBsb2dpdHMgPSB0b3JjaC5tYXRtdWwoaW5wdXRfdGVuc29yLCByb3V0ZXJfd2VpZ2h0LnQoKSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fcm91dGVkX2V4cGVydHMpCiAgICAjIFRPRE86IGZ1c2VkIHNvZnRtYXggKyB0b3AgayBodHRwczovL2dpdGh1Yi5jb20vc2dsLXByb2plY3Qvc2dsYW5nL2Jsb2IvZmJhOGVjY2Q3ZWJlNDFiYmRiZjcwYWIzYjZhMmRmMTgzNWY4YjUzMi9zZ2wta2VybmVsL2NzcmMvdG9yY2hfZXh0ZW5zaW9uX3JvY20uY2MjTDY1CiAgICBzY29yZXMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBuX2V4cGVydHNfcGVyX3Rva2VuLCBkaW09LTEsIHNvcnRlZD1GYWxzZSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pICAgIAogICAgIyB0b3BrX3Njb3JlczogdG9rZW5faWQgLT4gdG9wayBzY29yZXMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgIyB0b3BrX2luZGljZXM6IHRva2VuX2lkIC0+IHRvcGsgZXhwZXJ0X2lkIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDEgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddICMgKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgICMgVE9ETzogaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgIHNoYXJlZF9leHBlcnRfZmZuMSA9IHNoYXJlZF9leHBlcnRfZmZuMCBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCgogICAgIyBUT0RPOiBjYWxjdWxhdGUgZXhwZXJ0MnRva2VuX2NvdW50IChuX3JvdXRlZF9leHBlcnRzICsgMSwpCiAgICAjIFRPRE86IGNhbGN1bGF0ZSB0b2tlbjJ3aXRoaW5fZXhwZXJ0X2luZGV4IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKICAgICMgVE9ETzogY2FsY3VsYXRlIHRva2VuMmluZGV4IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKICAgIEJMT0NLX1NJWkUgPSA1MTIKICAgIGV4cGVydDJ0b2tlbl9jb3VudCA9IHRvcmNoLmVtcHR5KHNpemU9KG5fcm91dGVkX2V4cGVydHMsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgd2l0aGluX2V4cGVydF9pbmRleCA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gPSB0b3JjaC56ZXJvcyhzaXplPShuX3JvdXRlZF9leHBlcnRzICsgMSwpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICBjYWxjdWxhdGVfZXhwZXJ0MnRva2VuX2NvdW50X2FuZF93aXRoaW5fZXhwZXJ0X2luZGV4WyAobl9yb3V0ZWRfZXhwZXJ0cywgKSBdKAogICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleCwKICAgICAgICBiYXRjaF9zaXplICogc2VxX2xlbiwKICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgQkxPQ0tfU0laRT1CTE9DS19TSVpFLAogICAgKQogICAgIyBwcmludChmIndpdGhpbl9leHBlcnRfaW5kZXg6IHt3aXRoaW5fZXhwZXJ0X2luZGV4fSIpCiAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbICh0cml0b24uY2RpdihiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApIF0oCiAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIEJMT0NLX1NJWkU9QkxPQ0tfU0laRSwKICAgICkKICAgIHRva2VuMmluZGV4X3JlZiwgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9yZWYsIHdpdGhpbl9leHBlcnRfaW5kZXhfcmVmLCBleHBlcnRfdG9rZW5fY291bnRfcmVmID0gdG9yY2hfZ2V0X3Rva2VuMmluZGV4KAogICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQogICAgIyBwcmludChmInRvcGtfaW5kaWNlczoge3RvcGtfaW5kaWNlc30iKQogICAgIyBwcmludChmImV4cGVydDJ0b2tlbl9jb3VudCA6IHtleHBlcnQydG9rZW5fY291bnR9IikKICAgICMgcHJpbnQoZiJleHBlcnRfdG9rZW5fY291bnRfcmVmIDoge2V4cGVydF90b2tlbl9jb3VudF9yZWZ9IikKICAgICMgZXhpdCgpCiAgICAjIHByaW50KGYiZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bToge2V4cGVydF90b2tlbl9jb3VudF9jdW1zdW19IikKICAgICMgcHJpbnQoZiJleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX3JlZjoge2V4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fcmVmfSIpCiAgICAjIGV4aXQoKQogICAgdG9rZW4yaW5kZXggPSB0b2tlbjJpbmRleF9yZWYKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX3JlZgoKICAgICMgZm9yIHRva2VuX2lkeCBpbiByYW5nZShiYXRjaF9zaXplICogc2VxX2xlbik6CiAgICAjICAgICBkaWZmID0gdG9yY2guYWJzKHRva2VuMmluZGV4W3Rva2VuX2lkeF0gLSB0b2tlbjJpbmRleF9yZWZbdG9rZW5faWR4XSkKICAgICMgICAgIGlmIGRpZmYuc3VtKCkgIT0gMDoKICAgICMgICAgICAgICBwcmludChmInRva2VuX2lkeDoge3Rva2VuX2lkeH0sIGRpZmY6IHtkaWZmfSIpCiAgICAjICAgICAgICAgcHJpbnQoZiJ0b2tlbjJpbmRleDoge3Rva2VuMmluZGV4W3Rva2VuX2lkeF19IikKICAgICMgICAgICAgICBwcmludChmInRva2VuMmluZGV4X3JlZjoge3Rva2VuMmluZGV4X3JlZlt0b2tlbl9pZHhdfSIpCiAgICAjICAgICAgICAgZXhpdCgpCiAgICAjIHByaW50KGYid2l0aGluX2V4cGVydF9pbmRleF9kaWZmOiB7d2l0aGluX2V4cGVydF9pbmRleF9kaWZmfSIpCiAgICAKICAgICMgcHJpbnQoZiJ0b2tlbjJpbmRleDoge3Rva2VuMmluZGV4fSIpCiAgICAKICAgICMgVE9ETzogc2NhdHRlciBpbnB1dF90ZW5zb3IgaW50byByZXBlYXRlZF90b2tlbnMgYWNjb3JkaW5nIHRvIHRva2VuMmluZGV4CiAgICAjIFRPRE86IHByZSBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcGVhdGVkX3Rva2VucwogICAgcmVwZWF0ZWRfdG9rZW5zID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBzY2F0dGVyWyAobl9leHBlcnRzX3Blcl90b2tlbiwgc2VxX2xlbiwgYmF0Y2hfc2l6ZSkgXSgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgcmVwZWF0ZWRfdG9rZW5zLAogICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgc2VxX2xlbiwKICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgIGRfaGlkZGVuLAogICAgICAgIEJMT0NLX1NJWkU9MTAyNCwKICAgICkKICAgICMgcmVwZWF0ZWRfdG9rZW5zX3JlZiA9IHRvcmNoX3NjYXR0ZXIoCiAgICAjICAgICBpbnB1dF90ZW5zb3IsCiAgICAjICAgICB0b2tlbjJpbmRleCwKICAgICMgKQogICAgIyBkaWZmID0gdG9yY2guYWJzKHJlcGVhdGVkX3Rva2VucyAtIHJlcGVhdGVkX3Rva2Vuc19yZWYpCiAgICAjIHByaW50KGYicmVwZWF0ZWRfdG9rZW5zX2RpZmY6IHtkaWZmfSIpCiAgICAjIHByaW50KGYicmVwZWF0ZWRfdG9rZW5zOiB7cmVwZWF0ZWRfdG9rZW5zfSIpCiAgICAjIHByaW50KGYiYmVmb3JlIGdyb3VwIGdlbW0iKQogICAgIyBleGl0KCkKICAgIGJfcHRyczAgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSwKICAgICAgICBkZXZpY2U9cmVwZWF0ZWRfdG9rZW5zLmRldmljZSwKICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICApCiAgICBiX3B0cnMxID0gdG9yY2gudGVuc29yKAogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgZGV2aWNlPXJlcGVhdGVkX3Rva2Vucy5kZXZpY2UsCiAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgKQogICAgYl9wdHJzMiA9IHRvcmNoLnRlbnNvcigKICAgICAgICBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10uZGF0YV9wdHIoKSAgZm9yIGkgaW4gcmFuZ2Uobl9yb3V0ZWRfZXhwZXJ0cyldLAogICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgIGR0eXBlPXRvcmNoLnVpbnQ2NCwKICAgICkKICAgICMgVE9ETzogZ3JvdXAgZ2VtbTAKICAgIGZmbjBfbGhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBCTE9DS19NID0gMTI4CiAgICBCTE9DS19OID0gMTI4CiAgICBCTE9DS19LID0gMTI4CiAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbgogICAgZ3JvdXBfZ2VtbVsgKHRyaXRvbi5jZGl2KGRfZXhwZXJ0LCBCTE9DS19OKSwgdHJpdG9uLmNkaXYobWF4X20sIEJMT0NLX00pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgIGEgPSByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYl9iYXNlX3B0cnMgPSBiX3B0cnMwLAogICAgICAgIGMgPSBmZm4wX2xocywKICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgbWF4X20gPSBiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgbiA9IGRfZXhwZXJ0LAogICAgICAgIGsgPSBkX2hpZGRlbiwKICAgICAgICBncm91cF9zaXplID0gbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICBCTE9DS19NPUJMT0NLX00sCiAgICAgICAgQkxPQ0tfTj1CTE9DS19OLAogICAgICAgIEJMT0NLX0s9QkxPQ0tfSywKICAgICkKICAgICMgZmZuMF9saHNfcmVmID0gdG9yY2hfZ3JvdXBfZ2VtbSgKICAgICMgICAgIHJlcGVhdGVkX3Rva2VucywKICAgICMgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXSBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAjICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgIyAgICAgZF9leHBlcnQsCiAgICAjICkKICAgICMgZGlmZiA9IHRvcmNoLmFicyhmZm4wX2xocyAtIGZmbjBfbGhzX3JlZikKICAgICMgcHJpbnQoZiJmZm4wX2xoczoge2ZmbjBfbGhzLnNoYXBlfSIpCiAgICAjIHByaW50KGYiZmZuMF9saHNfcmVmOiB7ZmZuMF9saHNfcmVmLnNoYXBlfSIpCiAgICAjIHByaW50KGYiZmZuMF9saHNfZGlmZjoge2RpZmZ9IikKICAgIGZmbjBfcmhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBncm91cF9nZW1tWyAodHJpdG9uLmNkaXYoZF9leHBlcnQsIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgYSA9IHJlcGVhdGVkX3Rva2VucywKICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczEsCiAgICAgICAgYyA9IGZmbjBfcmhzLAogICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuID0gZF9leHBlcnQsCiAgICAgICAgayA9IGRfaGlkZGVuLAogICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgQkxPQ0tfSz1CTE9DS19LLAogICAgKQogICAgCiAgICAjICMgVE9ETzogU2lMVSBhY3RpdmF0aW9uCiAgICBmZm4wX291dCA9IEYuc2lsdShmZm4wX2xocykgKiBmZm4wX3JocyAjIChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KQogICAgIyAjIFRPRE86IGdyb3VwIGdlbW0xCiAgICBmZm4xX291dCA9IHRvcmNoLmVtcHR5X2xpa2UocmVwZWF0ZWRfdG9rZW5zKQogICAgZ3JvdXBfZ2VtbVsgKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBCTE9DS19OKSwgdHJpdG9uLmNkaXYobWF4X20sIEJMT0NLX00pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgIGEgPSBmZm4wX291dCwKICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczIsCiAgICAgICAgYyA9IGZmbjFfb3V0LAogICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuID0gZF9oaWRkZW4sCiAgICAgICAgayA9IGRfZXhwZXJ0LAogICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgQkxPQ0tfSz1CTE9DS19LLAogICAgKQogICAgIyAjIFRPRE86IHdlaWdodGVkIHN1bSArIGdhdGhlcgogICAgbW9lX291dCA9IHRvcmNoLmVtcHR5X2xpa2UoaW5wdXRfdGVuc29yKQogICAgQkxPQ0tfU0laRSA9IDEwMjQKICAgIHdlaWdodGVkX3N1bV9nYXRoZXJbICh0cml0b24uY2RpdihkX2hpZGRlbiwgQkxPQ0tfU0laRSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKSBdKAogICAgICAgIGZmbjFfb3V0LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIHRvcGtfc2NvcmVzLAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgICAgICBtb2Vfb3V0LAogICAgICAgIGRfaGlkZGVuLAogICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgc2VxX2xlbiwKICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgIEJMT0NLX1NJWkU9QkxPQ0tfU0laRSwKICAgICkKICAgICMgbW9lX291dF9yZWYgPSB0b3JjaF93ZWlnaHRlZF9zdW1fZ2F0aGVyKAogICAgIyAgICAgZmZuMV9vdXQsCiAgICAjICAgICB0b2tlbjJpbmRleCwKICAgICMgICAgIHRvcGtfc2NvcmVzLAogICAgIyAgICAgc2hhcmVkX2V4cGVydF9mZm4xLAogICAgIyApCiAgICAjIGRpZmYgPSB0b3JjaC5hYnMobW9lX291dCAtIG1vZV9vdXRfcmVmKQogICAgIyBwcmludChmIm1vZV9vdXRfZGlmZjoge2RpZmZ9IikKICAgIHJldHVybiBtb2Vfb3V0LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pICMgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBTdWJtaXNzaW9uIHRlbXBsYXRlIGZvciBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fc2l6ZV0KICAgICAgICAgICAgLSB3ZWlnaHRzOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgd2VpZ2h0cwogICAgICAgICAgICAtIGNvbmZpZzogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICAgICAgICAgICAKICAgIFJldHVybnM6CiAgICAgICAgVHVwbGUgY29udGFpbmluZzoKICAgICAgICAgICAgLSBvdXRwdXQ6IFByb2Nlc3NlZCB0ZW5zb3IgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGRfbW9kZWxdCiAgICAgICAgICAgIC0gYXV4X2RhdGE6IERpY3Rpb25hcnkgd2l0aCBhdXhpbGlhcnkgZGF0YQogICAgIiIiCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIG91dHB1dCA9IG1vZV9mb3J3YXJkKGlucHV0X3RlbnNvciwgd2VpZ2h0cywgKipjb25maWcpCiAgICByZXR1cm4gb3V0cHV0CgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdG9yY2guY3VkYS5zZXRfZGV2aWNlKDEpCiAgICBkaGlkZGVuID0gNzE2OAogICAgZGV4cGVydCA9IDIwNDgKICAgIG5yb3V0ZWRleHBlcnRzID0gOAogICAgbnNoYXJlZGV4cGVydHMgPSAxCiAgICBuZXhwZXJ0c3BlcnRva2VuID0gNAogICAgYnMgPSAyCiAgICBzZXFsZW4gPSA4MTkyCiAgICBzZWVkID0gODE5MzQKCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGdlbmVyYXRlX2lucHV0KAogICAgICAgIGRoaWRkZW4sCiAgICAgICAgZGV4cGVydCwKICAgICAgICBucm91dGVkZXhwZXJ0cywKICAgICAgICBuc2hhcmVkZXhwZXJ0cywKICAgICAgICBuZXhwZXJ0c3BlcnRva2VuLAogICAgICAgIGJzLAogICAgICAgIHNlcWxlbiwKICAgICAgICBzZWVkCiAgICApCiAgICBwcmludCgiSW5wdXQgdGVuc29yIHNoYXBlOiIsIGlucHV0X3RlbnNvci5zaGFwZSkKICAgICMgcHJpbnQoIldlaWdodHMgZGljdGlvbmFyeSBrZXlzOiIsIGxpc3Qod2VpZ2h0cy5rZXlzKCkpKQogICAgZm9yIGtleSwgdmFsdWUgaW4gd2VpZ2h0cy5pdGVtcygpOgogICAgICAgIHByaW50KGYie2tleX06IHt2YWx1ZS5zaGFwZX0iKQogICAgcHJpbnQoIkNvbmZpZyBkaWN0aW9uYXJ5OiIsIGNvbmZpZykKCiAgICBteV9tb2Vfb3V0ID0gY3VzdG9tX2tlcm5lbCgoaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcpKQogICAgcmVmX21vZV9vdXQgPSByZWZfY3VzdG9tX2tlcm5lbCgoaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcpKQogICAgZGlmZiA9IHRvcmNoLmFicyhteV9tb2Vfb3V0IC0gcmVmX21vZV9vdXQpCiAgICBwcmludCgiUmVmZXJlbmNlIE1vRSBvdXRwdXQgc2hhcGU6IiwgcmVmX21vZV9vdXQuc2hhcGUpCiAgICBwcmludCgiTXkgTW9FIG91dHB1dCBzaGFwZToiLCBteV9tb2Vfb3V0LnNoYXBlKQogICAgcHJpbnQoZiJGaW5hbCBkaWZmZXJlbmNlOiB7ZGlmZn0iKQ==

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

- aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAoKY2xhc3MgRXhwZXJ0KG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0LCBkX2V4cGVydDogT3B0aW9uYWxbaW50XSA9IE5vbmUpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgICAgc2VsZi5hY3RfZm4gPSBubi5TaUxVKCkKICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KICAgICAgICBzZWxmLmRfZXhwZXJ0OiBpbnQgPSBjb25maWdbImRfZXhwZXJ0Il0gaWYgZF9leHBlcnQgaXMgTm9uZSBlbHNlIGRfZXhwZXJ0CgogICAgICAgIHNlbGYuV19nYXRlID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYuZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX3VwID0gbm4uTGluZWFyKHNlbGYuZF9oaWRkZW4sIHNlbGYuZF9leHBlcnQsIGJpYXM9RmFsc2UpCiAgICAgICAgc2VsZi5XX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kX2V4cGVydCwgc2VsZi5kX2hpZGRlbiwgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBnYXRlID0gc2VsZi5hY3RfZm4oc2VsZi5XX2dhdGUoeCkpCiAgICAgICAgb3V0ID0gc2VsZi5XX2Rvd24oZ2F0ZSAqIHNlbGYuV191cCh4KSkKICAgICAgICByZXR1cm4gb3V0CgoKY2xhc3MgTW9FR2F0ZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi50b3BfazogaW50ID0gY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0KICAgICAgICBzZWxmLm51bV9leHBlcnRzOiBpbnQgPSBjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXQogICAgICAgIHNlbGYuZF9oaWRkZW46IGludCA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgICAgICBzZWxmLldfZyA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLm51bV9leHBlcnRzLCBiaWFzPUZhbHNlKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gVHVwbGVbdG9yY2guVGVuc29yLCB0b3JjaC5UZW5zb3JdOgogICAgICAgIGxvZ2l0cyA9IHNlbGYuV19nKHgpCiAgICAgICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgICAgIHRvcGtfc2NvcmVzLCB0b3BrX2luZGljZXMgPSB0b3JjaC50b3BrKHNjb3Jlcywgaz1zZWxmLnRvcF9rLCBkaW09LTEsIHNvcnRlZD1GYWxzZSkKCiAgICAgICAgcmV0dXJuIHRvcGtfaW5kaWNlcywgdG9wa19zY29yZXMKCgpjbGFzcyBNb0Uobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnCiAgICAgICAgc2VsZi5leHBlcnRzID0gbm4uTW9kdWxlTGlzdChbCiAgICAgICAgICAgIEV4cGVydChjb25maWcpCiAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKQogICAgICAgIF0pCiAgICAgICAgc2VsZi5nYXRpbmdfbmV0d29yayA9IE1vRUdhdGUoY29uZmlnKQogICAgICAgIHNoYXJlZF9leHBlcnRfZGltID0gY29uZmlnWyJkX2V4cGVydCJdICogY29uZmlnWyJuX3NoYXJlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLnNoYXJlZF9leHBlcnQgPSBFeHBlcnQoY29uZmlnPWNvbmZpZywgZF9leHBlcnQ9c2hhcmVkX2V4cGVydF9kaW0pCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2hhcmVkX291dHB1dCA9IHNlbGYuc2hhcmVkX2V4cGVydCh4KQogICAgICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gc2VsZi5nYXRpbmdfbmV0d29yayh4KQogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIGhpZGRlbl9kaW0gPSB4LnNoYXBlCiAgICAgICAgb3JpZ19zaGFwZSA9IHguc2hhcGUKICAgICAgICB4X2ZsYXQgPSB4LnZpZXcoLTEsIGhpZGRlbl9kaW0pCiAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlcyA9IGV4cGVydF9pbmRpY2VzLnZpZXcoLTEpCiAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cyA9IGV4cGVydF9zY29yZXMudmlldygtMSwgMSkKICAgICAgICByb3V0ZWRfb3V0cHV0X2ZsYXQgPSBzZWxmLm1vZV9pbmZlcih4X2ZsYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfaW5kaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF93ZWlnaHRzKQoKICAgICAgICByb3V0ZWRfb3V0cHV0ID0gcm91dGVkX291dHB1dF9mbGF0LnZpZXcoKm9yaWdfc2hhcGUpCiAgICAgICAgcmV0dXJuIHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgogICAgQHRvcmNoLm5vX2dyYWQoKQogICAgZGVmIG1vZV9pbmZlcihzZWxmLAogICAgICAgICAgICAgICAgICB4OiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXM6IHRvcmNoLlRlbnNvciwKICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0czogdG9yY2guVGVuc29yCiAgICAgICAgICAgICAgICAgKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZXhwZXJ0X2NhY2hlID0gdG9yY2guemVyb3NfbGlrZSh4KQogICAgICAgIGlkeHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmFyZ3NvcnQoKQogICAgICAgIGNvdW50cyA9IGZsYXRfZXhwZXJ0X2luZGljZXMuYmluY291bnQoKS5jcHUoKS5udW1weSgpCiAgICAgICAgdG9rZW5zX3Blcl9leHBlcnQgPSBjb3VudHMuY3Vtc3VtKCkKICAgICAgICBudW1fcGVyX3RvayA9IHNlbGYuY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0KICAgICAgICB0b2tlbl9pZHhzID0gaWR4cyAvLyBudW1fcGVyX3RvawogICAgICAgIGZvciBleHBlcnRfaWQsIGVuZF9pZHggaW4gZW51bWVyYXRlKHRva2Vuc19wZXJfZXhwZXJ0KToKICAgICAgICAgICAgc3RhcnRfaWR4ID0gMCBpZiBleHBlcnRfaWQgPT0gMCBlbHNlIHRva2Vuc19wZXJfZXhwZXJ0W2V4cGVydF9pZCAtIDFdCiAgICAgICAgICAgIGlmIHN0YXJ0X2lkeCA9PSBlbmRfaWR4OgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGV4cGVydCA9IHNlbGYuZXhwZXJ0c1tleHBlcnRfaWRdCiAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzID0gdG9rZW5faWR4c1tzdGFydF9pZHg6ZW5kX2lkeF0KICAgICAgICAgICAgZXhwZXJ0X3Rva2VucyA9IHhbZXhwX3Rva2VuX2lkeHNdCiAgICAgICAgICAgIGV4cGVydF9vdXQgICAgPSBleHBlcnQoZXhwZXJ0X3Rva2VucykKICAgICAgICAgICAgZXhwZXJ0X291dC5tdWxfKGZsYXRfZXhwZXJ0X3dlaWdodHNbaWR4c1tzdGFydF9pZHg6ZW5kX2lkeF1dKQogICAgICAgICAgICBleHBlcnRfY2FjaGUuc2NhdHRlcl9yZWR1Y2VfKAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIGV4cF90b2tlbl9pZHhzLnZpZXcoLTEsIDEpLnJlcGVhdCgxLCB4LnNoYXBlWy0xXSksCiAgICAgICAgICAgICAgICBleHBlcnRfb3V0LAogICAgICAgICAgICAgICAgcmVkdWNlPSdzdW0nCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIGV4cGVydF9jYWNoZQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBTdWJtaXNzaW9uIHRlbXBsYXRlIGZvciBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fc2l6ZV0KICAgICAgICAgICAgLSB3ZWlnaHRzOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgd2VpZ2h0cwogICAgICAgICAgICAtIGNvbmZpZzogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICAgICAgICAgICAKICAgIFJldHVybnM6CiAgICAgICAgVHVwbGUgY29udGFpbmluZzoKICAgICAgICAgICAgLSBvdXRwdXQ6IFByb2Nlc3NlZCB0ZW5zb3IgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGRfbW9kZWxdCiAgICAgICAgICAgIC0gYXV4X2RhdGE6IERpY3Rpb25hcnkgd2l0aCBhdXhpbGlhcnkgZGF0YQogICAgIiIiCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIG51bV9leHBlcnRzID0gY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0KICAgIG1vZSA9IE1vRShjb25maWcpCgogICAgIyBGaWxsIGluIHRoZSBnaXZlbiB3ZWlnaHRzIG9mIHRoZSBtb2RlbAogICAgbW9lLmdhdGluZ19uZXR3b3JrLldfZy53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1sncm91dGVyLndlaWdodCddKQoKICAgIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKToKICAgICAgICBnYXRlX3Byb2pfd2VpZ2h0ID0gd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjAud2VpZ2h0J10KICAgICAgICB1cF9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4xLndlaWdodCddCiAgICAgICAgZG93bl9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4yLndlaWdodCddCgogICAgICAgICMgVHJhbnNwb3NlIHdlaWdodHMgdG8gbWF0Y2ggZXhwZWN0ZWQgc2hhcGUgZm9yIG5uLkxpbmVhcgogICAgICAgIG1vZS5leHBlcnRzW2ldLldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoZ2F0ZV9wcm9qX3dlaWdodC50KCkpCiAgICAgICAgbW9lLmV4cGVydHNbaV0uV191cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIodXBfcHJval93ZWlnaHQudCgpKQogICAgICAgIG1vZS5leHBlcnRzW2ldLldfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoZG93bl9wcm9qX3dlaWdodC50KCkpCgogICAgbW9lLnNoYXJlZF9leHBlcnQuV19nYXRlLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLnQoKSkKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10udCgpKQogICAgbW9lLnNoYXJlZF9leHBlcnQuV19kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddLnQoKSkKCiAgICAjIFJ1biB0aGUgbW9kZWwKICAgIG91dHB1dCA9IG1vZShpbnB1dF90ZW5zb3IpCgogICAgcmV0dXJuIG91dHB1dA==
No newline at end of file
+ aW1wb3J0IG1hdGgKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgppbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBUdXBsZSwgT3B0aW9uYWwsIExpc3QKZnJvbSB0YXNrIGltcG9ydCBpbnB1dF90LCBvdXRwdXRfdAppbXBvcnQgdHJpdG9uCmltcG9ydCB0cml0b24ubGFuZ3VhZ2UgYXMgdGwKCmNsYXNzIEV4cGVydChubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogRGljdCwgZF9leHBlcnQ6IE9wdGlvbmFsW2ludF0gPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuYWN0X2ZuID0gbm4uU2lMVSgpCiAgICAgICAgc2VsZi5kX2hpZGRlbjogaW50ID0gY29uZmlnWyJkX2hpZGRlbiJdCiAgICAgICAgc2VsZi5kX2V4cGVydDogaW50ID0gY29uZmlnWyJkX2V4cGVydCJdIGlmIGRfZXhwZXJ0IGlzIE5vbmUgZWxzZSBkX2V4cGVydAoKICAgICAgICBzZWxmLldfZ2F0ZSA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV191cCA9IG5uLkxpbmVhcihzZWxmLmRfaGlkZGVuLCBzZWxmLmRfZXhwZXJ0LCBiaWFzPUZhbHNlKQogICAgICAgIHNlbGYuV19kb3duID0gbm4uTGluZWFyKHNlbGYuZF9leHBlcnQsIHNlbGYuZF9oaWRkZW4sIGJpYXM9RmFsc2UpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgZ2F0ZSA9IHNlbGYuYWN0X2ZuKHNlbGYuV19nYXRlKHgpKQogICAgICAgIG91dCA9IHNlbGYuV19kb3duKGdhdGUgKiBzZWxmLldfdXAoeCkpCiAgICAgICAgcmV0dXJuIG91dAoKCmNsYXNzIE1vRUdhdGUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERpY3QpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYudG9wX2s6IGludCA9IGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgc2VsZi5udW1fZXhwZXJ0czogaW50ID0gY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0KICAgICAgICBzZWxmLmRfaGlkZGVuOiBpbnQgPSBjb25maWdbImRfaGlkZGVuIl0KCiAgICAgICAgc2VsZi5XX2cgPSBubi5MaW5lYXIoc2VsZi5kX2hpZGRlbiwgc2VsZi5udW1fZXhwZXJ0cywgYmlhcz1GYWxzZSkKCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IFR1cGxlW3RvcmNoLlRlbnNvciwgdG9yY2guVGVuc29yXToKICAgICAgICBsb2dpdHMgPSBzZWxmLldfZyh4KQogICAgICAgIHNjb3JlcyA9IGxvZ2l0cy5zb2Z0bWF4KGRpbT0tMSkKICAgICAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9c2VsZi50b3BfaywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCgogICAgICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKY2xhc3MgTW9FKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBEaWN0KToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZwogICAgICAgIHNlbGYuZXhwZXJ0cyA9IG5uLk1vZHVsZUxpc3QoWwogICAgICAgICAgICBFeHBlcnQoY29uZmlnKQogICAgICAgICAgICBmb3IgXyBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSkKICAgICAgICBdKQogICAgICAgIHNlbGYuZ2F0aW5nX25ldHdvcmsgPSBNb0VHYXRlKGNvbmZpZykKICAgICAgICBzaGFyZWRfZXhwZXJ0X2RpbSA9IGNvbmZpZ1siZF9leHBlcnQiXSAqIGNvbmZpZ1sibl9zaGFyZWRfZXhwZXJ0cyJdCiAgICAgICAgc2VsZi5zaGFyZWRfZXhwZXJ0ID0gRXhwZXJ0KGNvbmZpZz1jb25maWcsIGRfZXhwZXJ0PXNoYXJlZF9leHBlcnRfZGltKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHNoYXJlZF9vdXRwdXQgPSBzZWxmLnNoYXJlZF9leHBlcnQoeCkKICAgICAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IHNlbGYuZ2F0aW5nX25ldHdvcmsoeCkKICAgICAgICBiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltID0geC5zaGFwZQogICAgICAgIG9yaWdfc2hhcGUgPSB4LnNoYXBlCiAgICAgICAgeF9mbGF0ID0geC52aWV3KC0xLCBoaWRkZW5fZGltKQogICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMgPSBleHBlcnRfaW5kaWNlcy52aWV3KC0xKQogICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHMgPSBleHBlcnRfc2NvcmVzLnZpZXcoLTEsIDEpCiAgICAgICAgcm91dGVkX291dHB1dF9mbGF0ID0gc2VsZi5tb2VfaW5mZXIoeF9mbGF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X2luZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdF9leHBlcnRfd2VpZ2h0cykKCiAgICAgICAgcm91dGVkX291dHB1dCA9IHJvdXRlZF9vdXRwdXRfZmxhdC52aWV3KCpvcmlnX3NoYXBlKQogICAgICAgIHJldHVybiByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIEB0b3JjaC5ub19ncmFkKCkKICAgIGRlZiBtb2VfaW5mZXIoc2VsZiwKICAgICAgICAgICAgICAgICAgeDogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICBmbGF0X2V4cGVydF9pbmRpY2VzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgIGZsYXRfZXhwZXJ0X3dlaWdodHM6IHRvcmNoLlRlbnNvcgogICAgICAgICAgICAgICAgICkgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGV4cGVydF9jYWNoZSA9IHRvcmNoLnplcm9zX2xpa2UoeCkKICAgICAgICBpZHhzID0gZmxhdF9leHBlcnRfaW5kaWNlcy5hcmdzb3J0KCkKICAgICAgICBjb3VudHMgPSBmbGF0X2V4cGVydF9pbmRpY2VzLmJpbmNvdW50KCkuY3B1KCkubnVtcHkoKQogICAgICAgIHRva2Vuc19wZXJfZXhwZXJ0ID0gY291bnRzLmN1bXN1bSgpCiAgICAgICAgbnVtX3Blcl90b2sgPSBzZWxmLmNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdCiAgICAgICAgdG9rZW5faWR4cyA9IGlkeHMgLy8gbnVtX3Blcl90b2sKICAgICAgICBmb3IgZXhwZXJ0X2lkLCBlbmRfaWR4IGluIGVudW1lcmF0ZSh0b2tlbnNfcGVyX2V4cGVydCk6CiAgICAgICAgICAgIHN0YXJ0X2lkeCA9IDAgaWYgZXhwZXJ0X2lkID09IDAgZWxzZSB0b2tlbnNfcGVyX2V4cGVydFtleHBlcnRfaWQgLSAxXQogICAgICAgICAgICBpZiBzdGFydF9pZHggPT0gZW5kX2lkeDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBleHBlcnQgPSBzZWxmLmV4cGVydHNbZXhwZXJ0X2lkXQogICAgICAgICAgICBleHBfdG9rZW5faWR4cyA9IHRva2VuX2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdCiAgICAgICAgICAgIGV4cGVydF90b2tlbnMgPSB4W2V4cF90b2tlbl9pZHhzXQogICAgICAgICAgICBleHBlcnRfb3V0ICAgID0gZXhwZXJ0KGV4cGVydF90b2tlbnMpCiAgICAgICAgICAgIGV4cGVydF9vdXQubXVsXyhmbGF0X2V4cGVydF93ZWlnaHRzW2lkeHNbc3RhcnRfaWR4OmVuZF9pZHhdXSkKICAgICAgICAgICAgZXhwZXJ0X2NhY2hlLnNjYXR0ZXJfcmVkdWNlXygKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBleHBfdG9rZW5faWR4cy52aWV3KC0xLCAxKS5yZXBlYXQoMSwgeC5zaGFwZVstMV0pLAogICAgICAgICAgICAgICAgZXhwZXJ0X291dCwKICAgICAgICAgICAgICAgIHJlZHVjZT0nc3VtJwogICAgICAgICAgICApCgogICAgICAgIHJldHVybiBleHBlcnRfY2FjaGUKCgpkZWYgcmVmX2N1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFN1Ym1pc3Npb24gdGVtcGxhdGUgZm9yIERlZXBTZWVrLXN0eWxlIE1peHR1cmUgb2YgRXhwZXJ0cyB1c2luZyBQeVRvcmNoLgoKICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgb2YgKGlucHV0OiB0b3JjaC5UZW5zb3IsIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLCBjb25maWc6IERpY3QpCiAgICAgICAgICAgIC0gaW5wdXQ6IElucHV0IHRlbnNvciBvZiBzaGFwZSBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX3NpemVdCiAgICAgICAgICAgIC0gd2VpZ2h0czogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIHdlaWdodHMKICAgICAgICAgICAgLSBjb25maWc6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKCiAgICBSZXR1cm5zOgogICAgICAgIFR1cGxlIGNvbnRhaW5pbmc6CiAgICAgICAgICAgIC0gb3V0cHV0OiBQcm9jZXNzZWQgdGVuc29yIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBkX21vZGVsXQogICAgICAgICAgICAtIGF1eF9kYXRhOiBEaWN0aW9uYXJ5IHdpdGggYXV4aWxpYXJ5IGRhdGEKICAgICIiIgogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCiAgICBudW1fZXhwZXJ0cyA9IGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdCiAgICBtb2UgPSBNb0UoY29uZmlnKQoKICAgICMgRmlsbCBpbiB0aGUgZ2l2ZW4gd2VpZ2h0cyBvZiB0aGUgbW9kZWwKICAgIG1vZS5nYXRpbmdfbmV0d29yay5XX2cud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSkKCiAgICBmb3IgaSBpbiByYW5nZShudW1fZXhwZXJ0cyk6CiAgICAgICAgZ2F0ZV9wcm9qX3dlaWdodCA9IHdlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddCiAgICAgICAgdXBfcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXQogICAgICAgIGRvd25fcHJval93ZWlnaHQgPSB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXQoKICAgICAgICAjIFRyYW5zcG9zZSB3ZWlnaHRzIHRvIG1hdGNoIGV4cGVjdGVkIHNoYXBlIGZvciBubi5MaW5lYXIKICAgICAgICBtb2UuZXhwZXJ0c1tpXS5XX2dhdGUud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGdhdGVfcHJval93ZWlnaHQudCgpKQogICAgICAgIG1vZS5leHBlcnRzW2ldLldfdXAud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKHVwX3Byb2pfd2VpZ2h0LnQoKSkKICAgICAgICBtb2UuZXhwZXJ0c1tpXS5XX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGRvd25fcHJval93ZWlnaHQudCgpKQoKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LldfZ2F0ZS53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXS50KCkpCiAgICBtb2Uuc2hhcmVkX2V4cGVydC5XX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcih3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLnQoKSkKICAgIG1vZS5zaGFyZWRfZXhwZXJ0LldfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIod2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXS50KCkpCgogICAgIyBSdW4gdGhlIG1vZGVsCiAgICBvdXRwdXQgPSBtb2UoaW5wdXRfdGVuc29yKQoKICAgIHJldHVybiBvdXRwdXQKCgpkZWYgZ2VuZXJhdGVfaW5wdXQoCiAgICBkaGlkZGVuOiBpbnQsCiAgICBkZXhwZXJ0OiBpbnQsCiAgICBucm91dGVkZXhwZXJ0czogaW50LAogICAgbnNoYXJlZGV4cGVydHM6IGludCwKICAgIG5leHBlcnRzcGVydG9rZW46IGludCwKICAgIGJzOiBpbnQsCiAgICBzZXFsZW46IGludCwKICAgIHNlZWQ6IGludAopIC0+IGlucHV0X3Q6CgogICAgIyBSZWFsbHkgZHVtYiBidXQgZm9yIG5vdyBfIGlzbid0IHBhcnNpbmcgY29ycmVjdGx5LgogICAgZF9oaWRkZW4gPSBkaGlkZGVuCiAgICBkX2V4cGVydCA9IGRleHBlcnQKICAgIG5fcm91dGVkX2V4cGVydHMgPSBucm91dGVkZXhwZXJ0cwogICAgbl9zaGFyZWRfZXhwZXJ0cyA9IG5zaGFyZWRleHBlcnRzCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuID0gbmV4cGVydHNwZXJ0b2tlbgogICAgYmF0Y2hfc2l6ZSA9IGJzCiAgICBzZXFfbGVuID0gc2VxbGVuCgogICAgY29uZmlnID0gewogICAgICAgICJkX2hpZGRlbiI6IGRfaGlkZGVuLAogICAgICAgICJkX2V4cGVydCI6IGRfZXhwZXJ0LAogICAgICAgICJuX3JvdXRlZF9leHBlcnRzIjogbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICAibl9zaGFyZWRfZXhwZXJ0cyI6IG5fc2hhcmVkX2V4cGVydHMsCiAgICAgICAgIm5fZXhwZXJ0c19wZXJfdG9rZW4iOiBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgICJiYXRjaF9zaXplIjogYmF0Y2hfc2l6ZSwKICAgICAgICAic2VxX2xlbiI6IHNlcV9sZW4sCiAgICB9CgogICAgZ2VuID0gdG9yY2guR2VuZXJhdG9yKGRldmljZT0nY3VkYScpCiAgICBnZW4ubWFudWFsX3NlZWQoc2VlZCkKCiAgICBudW1fZXhwZXJ0cyA9IG5fcm91dGVkX2V4cGVydHMKICAgIGV4cGVydF9kaW0gPSBkX2V4cGVydAogICAgd2VpZ2h0cyA9IHt9CgogICAgaW5wdXRfdGVuc29yID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSwKICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgIGR0eXBlPXRvcmNoLmZsb2F0MTYsCiAgICAgICAgZ2VuZXJhdG9yPWdlbgogICAgKS5jb250aWd1b3VzKCkKCiAgICAjIEluaXRpYWxpemUgcm91dGVyIHdlaWdodHMKICAgIHdlaWdodHNbJ3JvdXRlci53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgIChudW1fZXhwZXJ0cywgZF9oaWRkZW4pLAogICAgICAgIGRldmljZT0iY3VkYSIsCiAgICAgICAgZHR5cGU9dG9yY2guZmxvYXQxNiwKICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICApIC8gbWF0aC5zcXJ0KGRfaGlkZGVuKQoKICAgIGZvciBpIGluIHJhbmdlKG51bV9leHBlcnRzKToKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltKQoKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZF9oaWRkZW4sIGV4cGVydF9kaW0pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChleHBlcnRfZGltKQoKICAgICAgICB3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMi53ZWlnaHQnXSA9IHRvcmNoLnJhbmRuKAogICAgICAgICAgICAoZXhwZXJ0X2RpbSwgZF9oaWRkZW4pLAogICAgICAgICAgICBkZXZpY2U9J2N1ZGEnLAogICAgICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgICAgICBnZW5lcmF0b3I9Z2VuCiAgICAgICAgKSAvIG1hdGguc3FydChkX2hpZGRlbikKCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGRfaGlkZGVuLCBleHBlcnRfZGltICogbl9zaGFyZWRfZXhwZXJ0cyksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZXhwZXJ0X2RpbSAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddID0gdG9yY2gucmFuZG4oCiAgICAgICAgKGV4cGVydF9kaW0gKiBuX3NoYXJlZF9leHBlcnRzLCBkX2hpZGRlbiksCiAgICAgICAgZGV2aWNlPSdjdWRhJywKICAgICAgICBkdHlwZT10b3JjaC5mbG9hdDE2LAogICAgICAgIGdlbmVyYXRvcj1nZW4KICAgICkgLyBtYXRoLnNxcnQoZF9oaWRkZW4pCgogICAgcmV0dXJuIChpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZykKCkB0cml0b24uaml0CmRlZiBjYWxjdWxhdGVfZXhwZXJ0MnRva2VuX2NvdW50X2FuZF93aXRoaW5fZXhwZXJ0X2luZGV4KAogICAgdG9wa19pbmRpY2VzLAogICAgZXhwZXJ0MnRva2VuX2NvdW50LAogICAgd2l0aGluX2V4cGVydF9pbmRleCwKICAgIHRva2VuX2NvdW50LAogICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIsCik6CiAgICAjIHRvcGtfaW5kaWNlczogKHRva2VuX2NvdW50LCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBleHBlcnQydG9rZW5fY291bnQ6IChuX3JvdXRlZF9leHBlcnRzLCkgOiAoMSwgKQogICAgIyB3aXRoaW5fZXhwZXJ0X2luZGV4OiAodG9rZW5fY291bnQsIG5fZXhwZXJ0c19wZXJfdG9rZW4pIDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIDEpCiAgICAjIGdyaWQ6IChuX3JvdXRlZF9leHBlcnRzLCApCiAgICBleHBlcnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgCiAgICB0b3RhbF9jb3VudCA9IDAKICAgIGZvciBpZHggaW4gcmFuZ2UoMCwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBCTE9DS19TSVpFKToKICAgICAgICBvZmZzZXRzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgaWR4CiAgICAgICAgbWFzayA9IG9mZnNldHMgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4KICAgICAgICB0b3BrX2luZGljZXNfYmxvY2sgPSB0bC5sb2FkKHRvcGtfaW5kaWNlcyArIG9mZnNldHMsIG1hc2s9bWFzaywgb3RoZXI9LTEpICMgKEJMT0NLX1NJWkUsICkKICAgICAgICBpc19jdXJyZW50X2V4cGVydCA9IHRsLndoZXJlKHRvcGtfaW5kaWNlc19ibG9jayA9PSBleHBlcnRfaWR4LCAxLCAwKSAjIChCTE9DS19TSVpFLCApCiAgICAgICAgY3VyX2N1bXN1bSA9IHRsLmN1bXN1bShpc19jdXJyZW50X2V4cGVydCwgYXhpcz0wKSArIHRvdGFsX2NvdW50IC0gMSAjc2hpZnQgbGVmdCBieSAxCiAgICAgICAgdG90YWxfY291bnQgKz0gdGwuc3VtKGlzX2N1cnJlbnRfZXhwZXJ0KQogICAgICAgIAogICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXhfYmxvY2sgPSB0bC53aGVyZShpc19jdXJyZW50X2V4cGVydCwgY3VyX2N1bXN1bSwgLTEpCiAgICAgICAgdGwuc3RvcmUoCiAgICAgICAgICAgIHdpdGhpbl9leHBlcnRfaW5kZXggKyBpZHggKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksIHdpdGhpbl9leHBlcnRfaW5kZXhfYmxvY2ssIAogICAgICAgICAgICBtYXNrPSAoaWR4ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpIDwgdG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuKSBhbmQgKGlzX2N1cnJlbnRfZXhwZXJ0LnRvKHRsLmludDEpKQogICAgICAgICkKICAgICAgICAKICAgIHRsLnN0b3JlKGV4cGVydDJ0b2tlbl9jb3VudCArIGV4cGVydF9pZHgsIHRvdGFsX2NvdW50KQogICAgCkB0cml0b24uaml0CmRlZiBjYWxjdWxhdGVfdG9rZW4yaW5kZXgoCiAgICB0b3BrX2luZGljZXMsCiAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgdG9rZW4yaW5kZXgsCiAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgdG9rZW5fY291bnQsCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgbl9yb3V0ZWRfZXhwZXJ0cywKICAgIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwciwKKToKICAgICMgdG9wa19pbmRpY2VzOiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgZXhwZXJ0MnRva2VuX2NvdW50OiAobl9yb3V0ZWRfZXhwZXJ0cywpIDogKDEsICkKICAgICMgd2l0aGluX2V4cGVydF9pbmRleDogKHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwgKSA6ICgxLCApCiAgICAjIHRva2VuMmluZGV4OiAodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCApIDogKDEsICkKICAgICMgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bTogKG5fcm91dGVkX2V4cGVydHMgKyAxLCApIDogKDEsICkKICAgICMgZ3JpZDogKGNkaXYodG9rZW5fY291bnQgKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBCTE9DS19TSVpFKSwgKQogICAgCiAgICAjIHRsLmRldmljZV9hc3NlcnQoQkxPQ0tfU0laRSA+PSBuX2V4cGVydHNfcGVyX3Rva2VuICsgMSkKICAgIGV4cGVydDJ0b2tlbl9jb3VudF9ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIG1hc2s9dGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpIDwgbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICAjIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jYXQoCiAgICAjICAgICB0bC56ZXJvcygoMSwgKSwgZHR5cGU9dGwuaW50MzIpLAogICAgIyAgICAgdGwuY3Vtc3VtKAogICAgIyAgICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudF9ibG9jaywKICAgICMgICAgICAgICBheGlzPTAsCiAgICAjICAgICApLAogICAgIyAgICAgY2FuX3Jlb3JkZXI9RmFsc2UsCiAgICAjICkgIyAoQkxPQ0tfU0laRSArIDEsICkKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2sgPSB0bC5jdW1zdW0oCiAgICAgICAgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrLAogICAgICAgIGF4aXM9MCwKICAgICkgIyAoQkxPQ0tfU0laRSwgKQogICAgIyB0bC5kZXZpY2VfcHJpbnQoImV4cGVydDJ0b2tlbl9jb3VudF9ibG9jazogIiwgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrKQogICAgIyB0bC5kZXZpY2VfcHJpbnQoImV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2s6ICIsIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fYmxvY2spCiAgICBpZiB0bC5wcm9ncmFtX2lkKDApID09IDA6CiAgICAgICAgIyB0bC5kZXZpY2VfcHJpbnQoImV4cGVydDJ0b2tlbl9jb3VudF9ibG9jazogIiwgZXhwZXJ0MnRva2VuX2NvdW50X2Jsb2NrKQogICAgICAgICMgdGwuZGV2aWNlX3ByaW50KCJleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrOiAiLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrKQogICAgICAgIHRsLnN0b3JlKGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgKyAxLCBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX2Jsb2NrLCBtYXNrPXRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IG5fcm91dGVkX2V4cGVydHMpCiAgICAKICAgIHRvcGtfaW5kaWNlc19ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgdG9wa19pbmRpY2VzICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4X2Jsb2NrID0gdGwubG9hZCgKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ICsgdGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSksCiAgICAgICAgbWFzaz10bC5wcm9ncmFtX2lkKDApICogQkxPQ0tfU0laRSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKSA8IHRva2VuX2NvdW50ICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBvdGhlcj0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBpc196ZXJvID0gdG9wa19pbmRpY2VzX2Jsb2NrID09IDAKICAgIGV4cGVydF9vZmZzZXQgPSB0bC5nYXRoZXIoCiAgICAgICAgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9ibG9jayAsCiAgICAgICAgdGwud2hlcmUoaXNfemVybywgMCwgdG9wa19pbmRpY2VzX2Jsb2NrIC0gMSksCiAgICAgICAgYXhpcz0wLAogICAgKSAjIChCTE9DS19TSVpFLCApCiAgICBleHBlcnRfb2Zmc2V0ID0gdGwud2hlcmUoaXNfemVybywgMCwgZXhwZXJ0X29mZnNldCkgIyAoQkxPQ0tfU0laRSwgKQogICAgdG9rZW4yaW5kZXhfYmxvY2sgPSBleHBlcnRfb2Zmc2V0ICsgd2l0aGluX2V4cGVydF9pbmRleF9ibG9jayAjIChCTE9DS19TSVpFLCApCiAgICB0bC5zdG9yZSgKICAgICAgICB0b2tlbjJpbmRleCArIHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19TSVpFICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpLAogICAgICAgIHRva2VuMmluZGV4X2Jsb2NrLAogICAgICAgIG1hc2s9dGwucHJvZ3JhbV9pZCgwKSAqIEJMT0NLX1NJWkUgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkgPCB0b2tlbl9jb3VudCAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICApCmRlZiB0b3JjaF9nZXRfbV9jdW1zdW0oCiAgICB0b3BrX2luZGljZXM6IHRvcmNoLlRlbnNvciwKICAgIGV4cGVydF9jbnQ6IGludCwKKToKICAgICMgdG9wa19pbmRpY2VzOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pIDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIDEpCiAgICAjIGV4cGVydDJ0b2tlbl9jb3VudDogKG5fcm91dGVkX2V4cGVydHMsKSA6ICgxLCApCiAgICAKICAgIGV4cGVydF9jb3VudCA9IHRvcmNoLnplcm9zKChleHBlcnRfY250LCksIGR0eXBlPXRvcmNoLmludDMyKQogICAgZm9yIGkgaW4gcmFuZ2UodG9wa19pbmRpY2VzLnNoYXBlWzBdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSh0b3BrX2luZGljZXMuc2hhcGVbMV0pOgogICAgICAgICAgICBleHBlcnRfY291bnRbdG9wa19pbmRpY2VzW2ldW2pdXSArPSAxCiAgICBleHBlcnRfY291bnRfY3Vtc3VtID0gdG9yY2guY2F0KAogICAgICAgICh0b3JjaC56ZXJvcygoMSwpLCBkdHlwZT10b3JjaC5pbnQzMiksIHRvcmNoLmN1bXN1bShleHBlcnRfY291bnQsIGRpbT0wKSksCiAgICAgICAgZGltPTAsCiAgICApCiAgICByZXR1cm4gZXhwZXJ0X2NvdW50X2N1bXN1bS5jdWRhKCkKZGVmIHRvcmNoX2dldF90b2tlbjJpbmRleCgKICAgIHRvcGtfaW5kaWNlczogdG9yY2guVGVuc29yLAogICAgZXhwZXJ0X2NvdW50OiBpbnQsCik6CiAgICAjIHRvcGtfaW5kaWNlczogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtOiAobl9yb3V0ZWRfZXhwZXJ0cyArIDEsKSA6ICgxLCApCiAgICB0b3BrX2luZGljZXMgPSB0b3BrX2luZGljZXMuY3B1KCkKICAgIGV4cGVydF90b2tlbl9jb3VudCA9IHRvcmNoLnplcm9zKChleHBlcnRfY291bnQsKSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICB3aXRoaW5fZXhwZXJ0X2luZGV4ID0gdG9yY2guemVyb3MoKHRvcGtfaW5kaWNlcy5zaGFwZVswXSwgdG9wa19pbmRpY2VzLnNoYXBlWzFdKSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICBmb3IgaSBpbiByYW5nZSh0b3BrX2luZGljZXMuc2hhcGVbMF0pOgogICAgICAgIGZvciBqIGluIHJhbmdlKHRvcGtfaW5kaWNlcy5zaGFwZVsxXSk6CiAgICAgICAgICAgIGV4cGVydF9pZHggPSB0b3BrX2luZGljZXNbaV1bal0KICAgICAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleFtpXVtqXSA9IGV4cGVydF90b2tlbl9jb3VudFtleHBlcnRfaWR4XQogICAgICAgICAgICBleHBlcnRfdG9rZW5fY291bnRbZXhwZXJ0X2lkeF0gKz0gMQogICAgCiAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtID0gdG9yY2guY2F0KAogICAgICAgICh0b3JjaC56ZXJvcygoMSwpLCBkdHlwZT10b3JjaC5pbnQzMiksIHRvcmNoLmN1bXN1bShleHBlcnRfdG9rZW5fY291bnQsIGRpbT0wKSksCiAgICAgICAgZGltPTAsCiAgICApCiAgICB0b2tlbjJpbmRleCA9IHRvcmNoLnplcm9zKCh0b3BrX2luZGljZXMuc2hhcGVbMF0sIHRvcGtfaW5kaWNlcy5zaGFwZVsxXSksIGR0eXBlPXRvcmNoLmludDMyKQogICAgZm9yIGkgaW4gcmFuZ2UodG9wa19pbmRpY2VzLnNoYXBlWzBdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSh0b3BrX2luZGljZXMuc2hhcGVbMV0pOgogICAgICAgICAgICBleHBlcnRfaWR4ID0gdG9wa19pbmRpY2VzW2ldW2pdCiAgICAgICAgICAgIHRva2VuMmluZGV4W2ldW2pdID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bVtleHBlcnRfaWR4XSArIHdpdGhpbl9leHBlcnRfaW5kZXhbaV1bal0KICAgIHJldHVybiB0b2tlbjJpbmRleC5jdWRhKCksIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0uY3VkYSgpLCB3aXRoaW5fZXhwZXJ0X2luZGV4LmN1ZGEoKSwgZXhwZXJ0X3Rva2VuX2NvdW50LmN1ZGEoKQpAdHJpdG9uLmppdApkZWYgc2NhdHRlcigKICAgIGlucHV0X3RlbnNvciwKICAgIHRva2VuMmluZGV4LAogICAgcmVwZWF0ZWRfdG9rZW5zLAogICAgYmF0Y2hfc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgZF9oaWRkZW4sIAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyBpbnB1dF90ZW5zb3I6IChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyB0b2tlbjJpbmRleDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyByZXBlYXRlZF90b2tlbnM6IChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgZ3JpZDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIHNlcV9sZW4sIGJhdGNoX3NpemUpCiAgICBleHBlcnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgc2VxX2lkeCA9IHRsLnByb2dyYW1faWQoMSkKICAgIGJhdGNoX2lkeCA9IHRsLnByb2dyYW1faWQoMikKICAgIAogICAgdG9rZW5faWR4ID0gYmF0Y2hfaWR4ICogc2VxX2xlbiArIHNlcV9pZHgKICAgIGRzdF9pZHggPSB0bC5sb2FkKHRva2VuMmluZGV4ICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGV4cGVydF9pZHgpCiAgICBmb3IgaSBpbiByYW5nZSgwLCBkX2hpZGRlbiwgQkxPQ0tfU0laRSk6CiAgICAgICAgb2Zmc2V0ID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgaQogICAgICAgIG1hc2sgPSBvZmZzZXQgPCBkX2hpZGRlbgogICAgICAgIGlucHV0X3RlbnNvcl9ibG9jayA9IHRsLmxvYWQoCiAgICAgICAgICAgIGlucHV0X3RlbnNvciArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0LAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQogICAgICAgIHRsLnN0b3JlKAogICAgICAgICAgICByZXBlYXRlZF90b2tlbnMgKyBkc3RfaWR4ICogZF9oaWRkZW4gKyBvZmZzZXQsCiAgICAgICAgICAgIGlucHV0X3RlbnNvcl9ibG9jaywKICAgICAgICAgICAgbWFzaz1tYXNrLAogICAgICAgICkKZGVmIHRvcmNoX3NjYXR0ZXIoCiAgICBpbnB1dF90ZW5zb3I6IHRvcmNoLlRlbnNvciwKICAgIHRva2VuMmluZGV4OiB0b3JjaC5UZW5zb3IsCik6CiAgICAjIGlucHV0X3RlbnNvcjogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICAjIHRva2VuMmluZGV4OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pIDogKG5fZXhwZXJ0c19wZXJfdG9rZW4sIDEpCiAgICAjIHJlcGVhdGVkX3Rva2VuczogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgcmVwZWF0ZWRfdG9rZW5zID0gdG9yY2guemVyb3MoCiAgICAgICAgKGlucHV0X3RlbnNvci5zaGFwZVswXSAqIHRva2VuMmluZGV4LnNoYXBlWzFdLCBpbnB1dF90ZW5zb3Iuc2hhcGVbMV0pLAogICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSwKICAgICkKICAgIGZvciBpIGluIHJhbmdlKHRva2VuMmluZGV4LnNoYXBlWzBdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSh0b2tlbjJpbmRleC5zaGFwZVsxXSk6CiAgICAgICAgICAgIGRzdF9pZHggPSB0b2tlbjJpbmRleFtpXVtqXQogICAgICAgICAgICByZXBlYXRlZF90b2tlbnNbZHN0X2lkeF0gPSBpbnB1dF90ZW5zb3JbaV0KICAgIHJldHVybiByZXBlYXRlZF90b2tlbnMuY3VkYSgpCkB0cml0b24uaml0CmRlZiBncm91cF9nZW1tKAogICAgYSwgYl9iYXNlX3B0cnMsIGMsCiAgICBtX2N1bXN1bSwKICAgIG1heF9tLAogICAgbiwKICAgIGssCiAgICBncm91cF9zaXplLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfSzogdGwuY29uc3RleHByLAopOgogICAgIyBhOiAodG90YWxfbSwgaykgOiAoaywgMSkKICAgICMgYl9iYXNlX3B0cnM6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYjogKGssIG4pIDogKG4sIDEpCiAgICAjIGM6ICh0b3RhbF9tLCBuKSA6IChuLCAxKQogICAgIyBtX2N1bXN1bTogKGdyb3VwX3NpemUgKyAxLCApIDogKDEsICkKICAgICMgZ3JpZDogKCB0cml0b24uY2RpdihuLCBCTE9DS19OKSwgdHJpdG9uLmNkaXYobWF4X20sIEJMT0NLX00pLCBncm91cF9zaXplICkKICAgIGdyb3VwX2lkID0gdGwucHJvZ3JhbV9pZCgyKQogICAgbl9zdGFydCA9IHRsLnByb2dyYW1faWQoMCkgKiBCTE9DS19OCiAgICBtX2lkID0gdGwucHJvZ3JhbV9pZCgxKQogICAgCiAgICBncm91cF9tX3N0YXJ0ID0gdGwubG9hZChtX2N1bXN1bSArIGdyb3VwX2lkKQogICAgZ3JvdXBfbV9lbmQgPSB0bC5sb2FkKG1fY3Vtc3VtICsgZ3JvdXBfaWQgKyAxKQogICAgZ3JvdXBfYl9iYXNlX3B0ciA9IHRsLmxvYWQoYl9iYXNlX3B0cnMgKyBncm91cF9pZCkKICAgIGlmIGdyb3VwX21fc3RhcnQgKyBtX2lkICogQkxPQ0tfTSA+PSBncm91cF9tX2VuZDoKICAgICAgICByZXR1cm4KICAgIGFfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYSArIGdyb3VwX21fc3RhcnQgKiBrLAogICAgICAgIHNoYXBlPShncm91cF9tX2VuZCAtIGdyb3VwX21fc3RhcnQsIGspLAogICAgICAgIHN0cmlkZXM9KGssIDEpLAogICAgICAgIG9mZnNldHM9KG1faWQgKiBCTE9DS19NLCAwKSwKICAgICAgICBibG9ja19zaGFwZT0oQkxPQ0tfTSwgQkxPQ0tfSyksCiAgICAgICAgb3JkZXI9KDEsIDApLAogICAgKQogICAgYl9ibG9ja19wdHIgPSB0bC5tYWtlX2Jsb2NrX3B0cigKICAgICAgICBiYXNlPWdyb3VwX2JfYmFzZV9wdHIudG8odGwucG9pbnRlcl90eXBlKHRsLmZsb2F0MTYpKSwKICAgICAgICBzaGFwZT0oaywgbiksCiAgICAgICAgc3RyaWRlcz0obiwgMSksCiAgICAgICAgb2Zmc2V0cz0oMCwgbl9zdGFydCksCiAgICAgICAgYmxvY2tfc2hhcGU9KEJMT0NLX0ssIEJMT0NLX04pLAogICAgICAgIG9yZGVyPSgxLCAwKSwKICAgICkKICAgIGNfYmxvY2tfcHRyID0gdGwubWFrZV9ibG9ja19wdHIoCiAgICAgICAgYmFzZT1jICsgZ3JvdXBfbV9zdGFydCAqIG4sCiAgICAgICAgc2hhcGU9KGdyb3VwX21fZW5kIC0gZ3JvdXBfbV9zdGFydCwgbiksCiAgICAgICAgc3RyaWRlcz0obiwgMSksCiAgICAgICAgb2Zmc2V0cz0obV9pZCAqIEJMT0NLX00sIG5fc3RhcnQpLAogICAgICAgIGJsb2NrX3NoYXBlPShCTE9DS19NLCBCTE9DS19OKSwKICAgICAgICBvcmRlcj0oMSwgMCksCiAgICApCiAgICBhY2N1bSA9IHRsLnplcm9zKChCTE9DS19NLCBCTE9DS19OKSwgZHR5cGU9dGwuZmxvYXQzMikgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgIGZvciBpIGluIHJhbmdlKDAsIGssIEJMT0NLX0spOgogICAgICAgIGFfYmxvY2sgPSB0bC5sb2FkKGFfYmxvY2tfcHRyLCBib3VuZGFyeV9jaGVjaz0oMCwgMSkpICMgKEJMT0NLX00sIEJMT0NLX0spCiAgICAgICAgYl9ibG9jayA9IHRsLmxvYWQoYl9ibG9ja19wdHIsIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSkgIyAoQkxPQ0tfSywgQkxPQ0tfTikKICAgICAgICBhY2N1bSArPSB0bC5kb3QoYV9ibG9jaywgYl9ibG9jaykgIyAoQkxPQ0tfTSwgQkxPQ0tfTikKICAgICAgICBhX2Jsb2NrX3B0ciA9IHRsLmFkdmFuY2UoYV9ibG9ja19wdHIsIG9mZnNldHM9KDAsIEJMT0NLX0spKQogICAgICAgIGJfYmxvY2tfcHRyID0gdGwuYWR2YW5jZShiX2Jsb2NrX3B0ciwgb2Zmc2V0cz0oQkxPQ0tfSywgMCkpCiAgICB0bC5zdG9yZShjX2Jsb2NrX3B0ciwgYWNjdW0udG8odGwuZmxvYXQxNiksIGJvdW5kYXJ5X2NoZWNrPSgwLCAxKSwgKQoKZGVmIHRvcmNoX2dyb3VwX2dlbW0oCiAgICBhOiB0b3JjaC5UZW5zb3IsCiAgICBiX3RlbnNvcnM6IExpc3RbdG9yY2guVGVuc29yXSwKICAgIG1fY3Vtc3VtOiB0b3JjaC5UZW5zb3IsCiAgICBuOiBpbnQsCik6CiAgICAjIGE6ICh0b3RhbF9tLCBrKSA6IChrLCAxKQogICAgIyBiX3RlbnNvcnM6IChncm91cF9zaXplLCApIDogKDEsICkKICAgICMgYjogKGssIG4pIDogKG4sIDEpCiAgICAjIGM6ICh0b3RhbF9tLCBuKSA6IChuLCAxKQogICAgIyBtX2N1bXN1bTogKGdyb3VwX3NpemUgKyAxLCApIDogKDEsICkKICAgIAogICAgZ3JvdXBfc2l6ZSA9IGxlbihiX3RlbnNvcnMpCiAgICBjID0gdG9yY2guemVyb3MoCiAgICAgICAgKG1fY3Vtc3VtWy0xXSwgbiksCiAgICAgICAgZGV2aWNlPWEuZGV2aWNlLAogICAgICAgIGR0eXBlPWEuZHR5cGUsCiAgICApCiAgICBmb3IgaSBpbiByYW5nZShncm91cF9zaXplKToKICAgICAgICAKICAgICAgICBtYXRfYSA9IGFbbV9jdW1zdW1baV06bV9jdW1zdW1baSArIDFdXQogICAgICAgIG1hdF9iID0gYl90ZW5zb3JzW2ldCiAgICAgICAgY1ttX2N1bXN1bVtpXTptX2N1bXN1bVtpICsgMV1dID0gdG9yY2gubWF0bXVsKAogICAgICAgICAgICBtYXRfYSwKICAgICAgICAgICAgbWF0X2IsCiAgICAgICAgKQogICAgcmV0dXJuIGMuY3VkYSgpCiAgICAgICAgCiAgICAgICAgCkB0cml0b24uaml0CmRlZiB3ZWlnaHRlZF9zdW1fZ2F0aGVyKAogICAgZmZuMV9vdXQsCiAgICB0b2tlbjJpbmRleCwKICAgIHRvcGtfc2NvcmVzLAogICAgc2hhcmVkX2V4cGVydF9mZm4xLAogICAgbW9lX291dCwKICAgIGRfaGlkZGVuLAogICAgYmF0Y2hfc2l6ZSwKICAgIHNlcV9sZW4sCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgQkxPQ0tfU0laRTogdGwuY29uc3RleHByLAopOgogICAgIyBmZm4xX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyB0b2tlbjJpbmRleDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyB0b3BrX3Njb3JlczogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSA6IChuX2V4cGVydHNfcGVyX3Rva2VuLCAxKQogICAgIyBzaGFyZWRfZXhwZXJ0X2ZmbjE6IChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQogICAgIyBtb2Vfb3V0OiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgZ3JpZDogKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBCTE9DS19TSVpFKSwgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4pCiAgICAKICAgIHNlZ21lbnRfaWR4ID0gdGwucHJvZ3JhbV9pZCgwKQogICAgdG9rZW5faWR4ID0gdGwucHJvZ3JhbV9pZCgxKQogICAgCiAgICBvZmZzZXRzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpICsgc2VnbWVudF9pZHggKiBCTE9DS19TSVpFCiAgICBtYXNrID0gb2Zmc2V0cyA8IGRfaGlkZGVuCiAgICAKICAgIGRhdGEgPSB0bC5sb2FkKAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSArIHRva2VuX2lkeCAqIGRfaGlkZGVuICsgb2Zmc2V0cywKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgICBmb3IgaSBpbiByYW5nZShuX2V4cGVydHNfcGVyX3Rva2VuKToKICAgICAgICB3ZWlnaHQgPSB0bC5sb2FkKHRvcGtfc2NvcmVzICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgaW5kZXggPSB0bC5sb2FkKHRva2VuMmluZGV4ICsgdG9rZW5faWR4ICogbl9leHBlcnRzX3Blcl90b2tlbiArIGkpCiAgICAgICAgZmZuMV9vdXRfYmxvY2sgPSB0bC5sb2FkKAogICAgICAgICAgICBmZm4xX291dCArIGluZGV4ICogZF9oaWRkZW4gKyBvZmZzZXRzLAogICAgICAgICAgICBtYXNrPW1hc2ssCiAgICAgICAgKQogICAgICAgIGRhdGEgKz0gd2VpZ2h0ICogZmZuMV9vdXRfYmxvY2sKICAgIHRsLnN0b3JlKAogICAgICAgIG1vZV9vdXQgKyB0b2tlbl9pZHggKiBkX2hpZGRlbiArIG9mZnNldHMsCiAgICAgICAgZGF0YSwKICAgICAgICBtYXNrPW1hc2ssCiAgICApCiAgICAgICAKZGVmIHRvcmNoX3dlaWdodGVkX3N1bV9nYXRoZXIoCiAgICBmZm4xX291dDogdG9yY2guVGVuc29yLAogICAgdG9rZW4yaW5kZXg6IHRvcmNoLlRlbnNvciwKICAgIHRvcGtfc2NvcmVzOiB0b3JjaC5UZW5zb3IsCiAgICBzaGFyZWRfZXhwZXJ0X2ZmbjE6IHRvcmNoLlRlbnNvciwKKToKICAgICMgZmZuMV9vdXQ6IChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgdG9rZW4yaW5kZXg6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgdG9wa19zY29yZXM6IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikgOiAobl9leHBlcnRzX3Blcl90b2tlbiwgMSkKICAgICMgc2hhcmVkX2V4cGVydF9mZm4xOiAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKICAgICMgbW9lX291dDogKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBkX2hpZGRlbikgOiAoZF9oaWRkZW4sIDEpCiAgICB0b2tlbl9jb3VudCA9IHRva2VuMmluZGV4LnNoYXBlWzBdCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuID0gdG9rZW4yaW5kZXguc2hhcGVbMV0KICAgIGRfaGlkZGVuID0gZmZuMV9vdXQuc2hhcGVbMV0KICAgIG1vZV9vdXQgPSB0b3JjaC56ZXJvcygKICAgICAgICAodG9rZW5fY291bnQsIGRfaGlkZGVuKSwKICAgICAgICBkZXZpY2U9ZmZuMV9vdXQuZGV2aWNlLAogICAgICAgIGR0eXBlPWZmbjFfb3V0LmR0eXBlLAogICAgKQogICAgZm9yIGkgaW4gcmFuZ2UodG9rZW5fY291bnQpOgogICAgICAgIGZvciBqIGluIHJhbmdlKG5fZXhwZXJ0c19wZXJfdG9rZW4pOgogICAgICAgICAgICBpbmRleCA9IHRva2VuMmluZGV4W2ldW2pdCiAgICAgICAgICAgIHdlaWdodCA9IHRvcGtfc2NvcmVzW2ldW2pdCiAgICAgICAgICAgIG1vZV9vdXRbaV0gKz0gd2VpZ2h0ICogZmZuMV9vdXRbaW5kZXhdCiAgICAgICAgbW9lX291dFtpXSArPSBzaGFyZWRfZXhwZXJ0X2ZmbjFbaV0KICAgIHJldHVybiBtb2Vfb3V0LmN1ZGEoKQogICAKIyBjb25maWc6IHsnZF9oaWRkZW4nOiA3MTY4LCAnZF9leHBlcnQnOiAyMDQ4LCAnbl9yb3V0ZWRfZXhwZXJ0cyc6IDMyLCAnbl9zaGFyZWRfZXhwZXJ0cyc6IDEsICduX2V4cGVydHNfcGVyX3Rva2VuJzogNCwgJ2JhdGNoX3NpemUnOiAxLCAnc2VxX2xlbic6IDIwNDh9CiMgaW5wdXRfdGVuc29yIGxheW91dDogKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKSA6IChkX2hpZGRlbiAqIHNlcV9sZW4sIGRfaGlkZGVuLCAxKQojIHJvdXRlci53ZWlnaHQgbGF5b3V0OiAobl9yb3V0ZWRfZXhwZXJ0cywgIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBleHBlcnRzLntpfS4wLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQpIDogKGRfZXhwZXJ0LCAxKQojIGV4cGVydHMue2l9LjEud2VpZ2h0IGxheW91dDogKGRfaGlkZGVuLCBkX2V4cGVydCkgOiAoZF9leHBlcnQsIDEpCiMgZXhwZXJ0cy57aX0uMi53ZWlnaHQgbGF5b3V0OiAoZF9leHBlcnQsIGRfaGlkZGVuKSA6IChkX2hpZGRlbiwgMSkKIyBzaGFyZWRfZXhwZXJ0cy57aX0uMC53ZWlnaHQgbGF5b3V0OiAoZF9oaWRkZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykgOiAoZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzLCAxKQojIHNoYXJlZF9leHBlcnRzLntpfS4xLndlaWdodCBsYXlvdXQ6IChkX2hpZGRlbiwgZF9leHBlcnQgKiBuX3NoYXJlZF9leHBlcnRzKSA6IChkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMsIDEpCiMgc2hhcmVkX2V4cGVydHMue2l9LjIud2VpZ2h0IGxheW91dDogKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pIDogKGRfaGlkZGVuLCAxKQpkZWYgbW9lX2ZvcndhcmQoCiAgICBpbnB1dF90ZW5zb3I6IHRvcmNoLlRlbnNvciwKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLAogICAgZF9oaWRkZW46IGludCwKICAgIGRfZXhwZXJ0OiBpbnQsCiAgICBuX3JvdXRlZF9leHBlcnRzOiBpbnQsCiAgICBuX3NoYXJlZF9leHBlcnRzOiBpbnQsCiAgICBuX2V4cGVydHNfcGVyX3Rva2VuOiBpbnQsCiAgICBiYXRjaF9zaXplOiBpbnQsCiAgICBzZXFfbGVuOiBpbnQKKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAjIGlucHV0X3RlbnNvcjogKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKQogICAgaW5wdXRfdGVuc29yID0gaW5wdXRfdGVuc29yLnJlc2hhcGUoLTEsIGRfaGlkZGVuKSAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCgoKICAgIHJvdXRlcl93ZWlnaHQgPSB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10gIyAobl9yb3V0ZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNvZnRtYXggKyB0b3AgayA/IG9yIGltcGxlbWVudCBtYXRtdWw/IG9yIHVzZSB0b3JjaC5tYXRtdWw/CiAgICBsb2dpdHMgPSB0b3JjaC5tYXRtdWwoaW5wdXRfdGVuc29yLCByb3V0ZXJfd2VpZ2h0LnQoKSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fcm91dGVkX2V4cGVydHMpCiAgICAjIFRPRE86IGZ1c2VkIHNvZnRtYXggKyB0b3AgayBodHRwczovL2dpdGh1Yi5jb20vc2dsLXByb2plY3Qvc2dsYW5nL2Jsb2IvZmJhOGVjY2Q3ZWJlNDFiYmRiZjcwYWIzYjZhMmRmMTgzNWY4YjUzMi9zZ2wta2VybmVsL2NzcmMvdG9yY2hfZXh0ZW5zaW9uX3JvY20uY2MjTDY1CiAgICBzY29yZXMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpICMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX3JvdXRlZF9leHBlcnRzKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBuX2V4cGVydHNfcGVyX3Rva2VuLCBkaW09LTEsIHNvcnRlZD1GYWxzZSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIG5fZXhwZXJ0c19wZXJfdG9rZW4pICAgIAogICAgIyB0b3BrX3Njb3JlczogdG9rZW5faWQgLT4gdG9wayBzY29yZXMgKGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKQogICAgIyB0b3BrX2luZGljZXM6IHRva2VuX2lkIC0+IHRvcGsgZXhwZXJ0X2lkIChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDAgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDEgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddICMgKGRfaGlkZGVuLCBkX2V4cGVydCAqIG5fc2hhcmVkX2V4cGVydHMpCiAgICBzaGFyZWRfZXhwZXJ0X3dlaWdodDIgPSB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4yLndlaWdodCddICMgKGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cywgZF9oaWRkZW4pCiAgICAjIFRPRE86IGZ1c2VkIG1hdG11bCArIHNpbHUgKyBtYXRtdWwKICAgIHNoYXJlZF9leHBlcnRfZmZuMCA9IEYuc2lsdShpbnB1dF90ZW5zb3IgQCBzaGFyZWRfZXhwZXJ0X3dlaWdodDApICogKGlucHV0X3RlbnNvciBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MSkgIyAoYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sIGRfZXhwZXJ0ICogbl9zaGFyZWRfZXhwZXJ0cykKICAgICMgVE9ETzogaW1wbGVtZW50IG1hdG11bD8gb3IgdXNlIHRvcmNoLm1hdG11bD8KICAgIHNoYXJlZF9leHBlcnRfZmZuMSA9IHNoYXJlZF9leHBlcnRfZmZuMCBAIHNoYXJlZF9leHBlcnRfd2VpZ2h0MiAjIChiYXRjaF9zaXplICogc2VxX2xlbiwgZF9oaWRkZW4pCgogICAgIyBUT0RPOiBjYWxjdWxhdGUgZXhwZXJ0MnRva2VuX2NvdW50IChuX3JvdXRlZF9leHBlcnRzICsgMSwpCiAgICAjIFRPRE86IGNhbGN1bGF0ZSB0b2tlbjJ3aXRoaW5fZXhwZXJ0X2luZGV4IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKICAgICMgVE9ETzogY2FsY3VsYXRlIHRva2VuMmluZGV4IChiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbikKICAgIEJMT0NLX1NJWkUgPSA1MTIKICAgIGV4cGVydDJ0b2tlbl9jb3VudCA9IHRvcmNoLmVtcHR5KHNpemU9KG5fcm91dGVkX2V4cGVydHMsKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgd2l0aGluX2V4cGVydF9pbmRleCA9IHRvcmNoLmVtcHR5KHNpemU9KGJhdGNoX3NpemUgKiBzZXFfbGVuLCBuX2V4cGVydHNfcGVyX3Rva2VuKSwgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsIGR0eXBlPXRvcmNoLmludDMyKQogICAgdG9rZW4yaW5kZXggPSB0b3JjaC5lbXB0eShzaXplPShiYXRjaF9zaXplICogc2VxX2xlbiwgbl9leHBlcnRzX3Blcl90b2tlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT10b3JjaC5pbnQzMikKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gPSB0b3JjaC56ZXJvcyhzaXplPShuX3JvdXRlZF9leHBlcnRzICsgMSwpLCBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwgZHR5cGU9dG9yY2guaW50MzIpCiAgICBjYWxjdWxhdGVfZXhwZXJ0MnRva2VuX2NvdW50X2FuZF93aXRoaW5fZXhwZXJ0X2luZGV4WyAobl9yb3V0ZWRfZXhwZXJ0cywgKSBdKAogICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICBleHBlcnQydG9rZW5fY291bnQsCiAgICAgICAgd2l0aGluX2V4cGVydF9pbmRleCwKICAgICAgICBiYXRjaF9zaXplICogc2VxX2xlbiwKICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgIG5fcm91dGVkX2V4cGVydHMsCiAgICAgICAgQkxPQ0tfU0laRT1CTE9DS19TSVpFLAogICAgKQogICAgIyBwcmludChmIndpdGhpbl9leHBlcnRfaW5kZXg6IHt3aXRoaW5fZXhwZXJ0X2luZGV4fSIpCiAgICBjYWxjdWxhdGVfdG9rZW4yaW5kZXhbICh0cml0b24uY2RpdihiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIEJMT0NLX1NJWkUpLCApIF0oCiAgICAgICAgdG9wa19pbmRpY2VzLAogICAgICAgIGV4cGVydDJ0b2tlbl9jb3VudCwKICAgICAgICB3aXRoaW5fZXhwZXJ0X2luZGV4LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgYmF0Y2hfc2l6ZSAqIHNlcV9sZW4sCiAgICAgICAgbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIEJMT0NLX1NJWkU9QkxPQ0tfU0laRSwKICAgICkKICAgIHRva2VuMmluZGV4X3JlZiwgZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bV9yZWYsIHdpdGhpbl9leHBlcnRfaW5kZXhfcmVmLCBleHBlcnRfdG9rZW5fY291bnRfcmVmID0gdG9yY2hfZ2V0X3Rva2VuMmluZGV4KAogICAgICAgIHRvcGtfaW5kaWNlcywKICAgICAgICBuX3JvdXRlZF9leHBlcnRzLAogICAgKQogICAgIyBwcmludChmInRvcGtfaW5kaWNlczoge3RvcGtfaW5kaWNlc30iKQogICAgIyBwcmludChmImV4cGVydDJ0b2tlbl9jb3VudCA6IHtleHBlcnQydG9rZW5fY291bnR9IikKICAgICMgcHJpbnQoZiJleHBlcnRfdG9rZW5fY291bnRfcmVmIDoge2V4cGVydF90b2tlbl9jb3VudF9yZWZ9IikKICAgICMgZXhpdCgpCiAgICAjIHByaW50KGYiZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bToge2V4cGVydF90b2tlbl9jb3VudF9jdW1zdW19IikKICAgICMgcHJpbnQoZiJleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX3JlZjoge2V4cGVydF90b2tlbl9jb3VudF9jdW1zdW1fcmVmfSIpCiAgICAjIGV4aXQoKQogICAgdG9rZW4yaW5kZXggPSB0b2tlbjJpbmRleF9yZWYKICAgIGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0gPSBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtX3JlZgoKICAgICMgZm9yIHRva2VuX2lkeCBpbiByYW5nZShiYXRjaF9zaXplICogc2VxX2xlbik6CiAgICAjICAgICBkaWZmID0gdG9yY2guYWJzKHRva2VuMmluZGV4W3Rva2VuX2lkeF0gLSB0b2tlbjJpbmRleF9yZWZbdG9rZW5faWR4XSkKICAgICMgICAgIGlmIGRpZmYuc3VtKCkgIT0gMDoKICAgICMgICAgICAgICBwcmludChmInRva2VuX2lkeDoge3Rva2VuX2lkeH0sIGRpZmY6IHtkaWZmfSIpCiAgICAjICAgICAgICAgcHJpbnQoZiJ0b2tlbjJpbmRleDoge3Rva2VuMmluZGV4W3Rva2VuX2lkeF19IikKICAgICMgICAgICAgICBwcmludChmInRva2VuMmluZGV4X3JlZjoge3Rva2VuMmluZGV4X3JlZlt0b2tlbl9pZHhdfSIpCiAgICAjICAgICAgICAgZXhpdCgpCiAgICAjIHByaW50KGYid2l0aGluX2V4cGVydF9pbmRleF9kaWZmOiB7d2l0aGluX2V4cGVydF9pbmRleF9kaWZmfSIpCiAgICAKICAgICMgcHJpbnQoZiJ0b2tlbjJpbmRleDoge3Rva2VuMmluZGV4fSIpCiAgICAKICAgICMgVE9ETzogc2NhdHRlciBpbnB1dF90ZW5zb3IgaW50byByZXBlYXRlZF90b2tlbnMgYWNjb3JkaW5nIHRvIHRva2VuMmluZGV4CiAgICAjIFRPRE86IHByZSBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcGVhdGVkX3Rva2VucwogICAgcmVwZWF0ZWRfdG9rZW5zID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2hpZGRlbiksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBzY2F0dGVyWyAobl9leHBlcnRzX3Blcl90b2tlbiwgc2VxX2xlbiwgYmF0Y2hfc2l6ZSkgXSgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgdG9rZW4yaW5kZXgsCiAgICAgICAgcmVwZWF0ZWRfdG9rZW5zLAogICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgc2VxX2xlbiwKICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgIGRfaGlkZGVuLAogICAgICAgIEJMT0NLX1NJWkU9MTAyNCwKICAgICkKICAgICMgcmVwZWF0ZWRfdG9rZW5zX3JlZiA9IHRvcmNoX3NjYXR0ZXIoCiAgICAjICAgICBpbnB1dF90ZW5zb3IsCiAgICAjICAgICB0b2tlbjJpbmRleCwKICAgICMgKQogICAgIyBkaWZmID0gdG9yY2guYWJzKHJlcGVhdGVkX3Rva2VucyAtIHJlcGVhdGVkX3Rva2Vuc19yZWYpCiAgICAjIHByaW50KGYicmVwZWF0ZWRfdG9rZW5zX2RpZmY6IHtkaWZmfSIpCiAgICAjIHByaW50KGYicmVwZWF0ZWRfdG9rZW5zOiB7cmVwZWF0ZWRfdG9rZW5zfSIpCiAgICAjIHByaW50KGYiYmVmb3JlIGdyb3VwIGdlbW0iKQogICAgIyBleGl0KCkKICAgIGJfcHRyczAgPSB0b3JjaC50ZW5zb3IoCiAgICAgICAgW3dlaWdodHNbZidleHBlcnRzLntpfS4wLndlaWdodCddLmRhdGFfcHRyKCkgIGZvciBpIGluIHJhbmdlKG5fcm91dGVkX2V4cGVydHMpXSwKICAgICAgICBkZXZpY2U9cmVwZWF0ZWRfdG9rZW5zLmRldmljZSwKICAgICAgICBkdHlwZT10b3JjaC51aW50NjQsCiAgICApCiAgICBiX3B0cnMxID0gdG9yY2gudGVuc29yKAogICAgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMS53ZWlnaHQnXS5kYXRhX3B0cigpICBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAgICAgZGV2aWNlPXJlcGVhdGVkX3Rva2Vucy5kZXZpY2UsCiAgICAgICAgZHR5cGU9dG9yY2gudWludDY0LAogICAgKQogICAgYl9wdHJzMiA9IHRvcmNoLnRlbnNvcigKICAgICAgICBbd2VpZ2h0c1tmJ2V4cGVydHMue2l9LjIud2VpZ2h0J10uZGF0YV9wdHIoKSAgZm9yIGkgaW4gcmFuZ2Uobl9yb3V0ZWRfZXhwZXJ0cyldLAogICAgICAgIGRldmljZT1yZXBlYXRlZF90b2tlbnMuZGV2aWNlLAogICAgICAgIGR0eXBlPXRvcmNoLnVpbnQ2NCwKICAgICkKICAgICMgVE9ETzogZ3JvdXAgZ2VtbTAKICAgIGZmbjBfbGhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBCTE9DS19NID0gMTI4CiAgICBCTE9DS19OID0gMTI4CiAgICBCTE9DS19LID0gMTI4CiAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbgogICAgZ3JvdXBfZ2VtbVsgKHRyaXRvbi5jZGl2KGRfZXhwZXJ0LCBCTE9DS19OKSwgdHJpdG9uLmNkaXYobWF4X20sIEJMT0NLX00pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgIGEgPSByZXBlYXRlZF90b2tlbnMsCiAgICAgICAgYl9iYXNlX3B0cnMgPSBiX3B0cnMwLAogICAgICAgIGMgPSBmZm4wX2xocywKICAgICAgICBtX2N1bXN1bSA9IGV4cGVydF90b2tlbl9jb3VudF9jdW1zdW0sCiAgICAgICAgbWF4X20gPSBiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sCiAgICAgICAgbiA9IGRfZXhwZXJ0LAogICAgICAgIGsgPSBkX2hpZGRlbiwKICAgICAgICBncm91cF9zaXplID0gbl9yb3V0ZWRfZXhwZXJ0cywKICAgICAgICBCTE9DS19NPUJMT0NLX00sCiAgICAgICAgQkxPQ0tfTj1CTE9DS19OLAogICAgICAgIEJMT0NLX0s9QkxPQ0tfSywKICAgICkKICAgICMgZmZuMF9saHNfcmVmID0gdG9yY2hfZ3JvdXBfZ2VtbSgKICAgICMgICAgIHJlcGVhdGVkX3Rva2VucywKICAgICMgICAgIFt3ZWlnaHRzW2YnZXhwZXJ0cy57aX0uMC53ZWlnaHQnXSBmb3IgaSBpbiByYW5nZShuX3JvdXRlZF9leHBlcnRzKV0sCiAgICAjICAgICBleHBlcnRfdG9rZW5fY291bnRfY3Vtc3VtLAogICAgIyAgICAgZF9leHBlcnQsCiAgICAjICkKICAgICMgZGlmZiA9IHRvcmNoLmFicyhmZm4wX2xocyAtIGZmbjBfbGhzX3JlZikKICAgICMgcHJpbnQoZiJmZm4wX2xoczoge2ZmbjBfbGhzLnNoYXBlfSIpCiAgICAjIHByaW50KGYiZmZuMF9saHNfcmVmOiB7ZmZuMF9saHNfcmVmLnNoYXBlfSIpCiAgICAjIHByaW50KGYiZmZuMF9saHNfZGlmZjoge2RpZmZ9IikKICAgIGZmbjBfcmhzID0gdG9yY2guZW1wdHkoc2l6ZT0oYmF0Y2hfc2l6ZSAqIHNlcV9sZW4gKiBuX2V4cGVydHNfcGVyX3Rva2VuLCBkX2V4cGVydCksIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLCBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBncm91cF9nZW1tWyAodHJpdG9uLmNkaXYoZF9leHBlcnQsIEJMT0NLX04pLCB0cml0b24uY2RpdihtYXhfbSwgQkxPQ0tfTSksIG5fcm91dGVkX2V4cGVydHMpIF0oCiAgICAgICAgYSA9IHJlcGVhdGVkX3Rva2VucywKICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczEsCiAgICAgICAgYyA9IGZmbjBfcmhzLAogICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuID0gZF9leHBlcnQsCiAgICAgICAgayA9IGRfaGlkZGVuLAogICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgQkxPQ0tfSz1CTE9DS19LLAogICAgKQogICAgCiAgICAjICMgVE9ETzogU2lMVSBhY3RpdmF0aW9uCiAgICBmZm4wX291dCA9IEYuc2lsdShmZm4wX2xocykgKiBmZm4wX3JocyAjIChiYXRjaF9zaXplICogc2VxX2xlbiAqIG5fZXhwZXJ0c19wZXJfdG9rZW4sIGRfZXhwZXJ0KQogICAgIyAjIFRPRE86IGdyb3VwIGdlbW0xCiAgICBmZm4xX291dCA9IHRvcmNoLmVtcHR5X2xpa2UocmVwZWF0ZWRfdG9rZW5zKQogICAgZ3JvdXBfZ2VtbVsgKHRyaXRvbi5jZGl2KGRfaGlkZGVuLCBCTE9DS19OKSwgdHJpdG9uLmNkaXYobWF4X20sIEJMT0NLX00pLCBuX3JvdXRlZF9leHBlcnRzKSBdKAogICAgICAgIGEgPSBmZm4wX291dCwKICAgICAgICBiX2Jhc2VfcHRycyA9IGJfcHRyczIsCiAgICAgICAgYyA9IGZmbjFfb3V0LAogICAgICAgIG1fY3Vtc3VtID0gZXhwZXJ0X3Rva2VuX2NvdW50X2N1bXN1bSwKICAgICAgICBtYXhfbSA9IGJhdGNoX3NpemUgKiBzZXFfbGVuICogbl9leHBlcnRzX3Blcl90b2tlbiwKICAgICAgICBuID0gZF9oaWRkZW4sCiAgICAgICAgayA9IGRfZXhwZXJ0LAogICAgICAgIGdyb3VwX3NpemUgPSBuX3JvdXRlZF9leHBlcnRzLAogICAgICAgIEJMT0NLX009QkxPQ0tfTSwKICAgICAgICBCTE9DS19OPUJMT0NLX04sCiAgICAgICAgQkxPQ0tfSz1CTE9DS19LLAogICAgKQogICAgIyAjIFRPRE86IHdlaWdodGVkIHN1bSArIGdhdGhlcgogICAgbW9lX291dCA9IHRvcmNoLmVtcHR5X2xpa2UoaW5wdXRfdGVuc29yKQogICAgQkxPQ0tfU0laRSA9IDEwMjQKICAgIHdlaWdodGVkX3N1bV9nYXRoZXJbICh0cml0b24uY2RpdihkX2hpZGRlbiwgQkxPQ0tfU0laRSksIGJhdGNoX3NpemUgKiBzZXFfbGVuKSBdKAogICAgICAgIGZmbjFfb3V0LAogICAgICAgIHRva2VuMmluZGV4LAogICAgICAgIHRvcGtfc2NvcmVzLAogICAgICAgIHNoYXJlZF9leHBlcnRfZmZuMSwKICAgICAgICBtb2Vfb3V0LAogICAgICAgIGRfaGlkZGVuLAogICAgICAgIGJhdGNoX3NpemUsCiAgICAgICAgc2VxX2xlbiwKICAgICAgICBuX2V4cGVydHNfcGVyX3Rva2VuLAogICAgICAgIEJMT0NLX1NJWkU9QkxPQ0tfU0laRSwKICAgICkKICAgICMgbW9lX291dF9yZWYgPSB0b3JjaF93ZWlnaHRlZF9zdW1fZ2F0aGVyKAogICAgIyAgICAgZmZuMV9vdXQsCiAgICAjICAgICB0b2tlbjJpbmRleCwKICAgICMgICAgIHRvcGtfc2NvcmVzLAogICAgIyAgICAgc2hhcmVkX2V4cGVydF9mZm4xLAogICAgIyApCiAgICAjIGRpZmYgPSB0b3JjaC5hYnMobW9lX291dCAtIG1vZV9vdXRfcmVmKQogICAgIyBwcmludChmIm1vZV9vdXRfZGlmZjoge2RpZmZ9IikKICAgIHJldHVybiBtb2Vfb3V0LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9oaWRkZW4pICMgKGJhdGNoX3NpemUsIHNlcV9sZW4sIGRfaGlkZGVuKQoKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBTdWJtaXNzaW9uIHRlbXBsYXRlIGZvciBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fc2l6ZV0KICAgICAgICAgICAgLSB3ZWlnaHRzOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgd2VpZ2h0cwogICAgICAgICAgICAtIGNvbmZpZzogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICAgICAgICAgICAKICAgIFJldHVybnM6CiAgICAgICAgVHVwbGUgY29udGFpbmluZzoKICAgICAgICAgICAgLSBvdXRwdXQ6IFByb2Nlc3NlZCB0ZW5zb3IgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGRfbW9kZWxdCiAgICAgICAgICAgIC0gYXV4X2RhdGE6IERpY3Rpb25hcnkgd2l0aCBhdXhpbGlhcnkgZGF0YQogICAgIiIiCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKICAgIG91dHB1dCA9IG1vZV9mb3J3YXJkKGlucHV0X3RlbnNvciwgd2VpZ2h0cywgKipjb25maWcpCiAgICByZXR1cm4gb3V0cHV0CgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdG9yY2guY3VkYS5zZXRfZGV2aWNlKDEpCiAgICBkaGlkZGVuID0gNzE2OAogICAgZGV4cGVydCA9IDIwNDgKICAgIG5yb3V0ZWRleHBlcnRzID0gOAogICAgbnNoYXJlZGV4cGVydHMgPSAxCiAgICBuZXhwZXJ0c3BlcnRva2VuID0gNAogICAgYnMgPSAyCiAgICBzZXFsZW4gPSA4MTkyCiAgICBzZWVkID0gODE5MzQKCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGdlbmVyYXRlX2lucHV0KAogICAgICAgIGRoaWRkZW4sCiAgICAgICAgZGV4cGVydCwKICAgICAgICBucm91dGVkZXhwZXJ0cywKICAgICAgICBuc2hhcmVkZXhwZXJ0cywKICAgICAgICBuZXhwZXJ0c3BlcnRva2VuLAogICAgICAgIGJzLAogICAgICAgIHNlcWxlbiwKICAgICAgICBzZWVkCiAgICApCiAgICBwcmludCgiSW5wdXQgdGVuc29yIHNoYXBlOiIsIGlucHV0X3RlbnNvci5zaGFwZSkKICAgICMgcHJpbnQoIldlaWdodHMgZGljdGlvbmFyeSBrZXlzOiIsIGxpc3Qod2VpZ2h0cy5rZXlzKCkpKQogICAgZm9yIGtleSwgdmFsdWUgaW4gd2VpZ2h0cy5pdGVtcygpOgogICAgICAgIHByaW50KGYie2tleX06IHt2YWx1ZS5zaGFwZX0iKQogICAgcHJpbnQoIkNvbmZpZyBkaWN0aW9uYXJ5OiIsIGNvbmZpZykKCiAgICBteV9tb2Vfb3V0ID0gY3VzdG9tX2tlcm5lbCgoaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcpKQogICAgcmVmX21vZV9vdXQgPSByZWZfY3VzdG9tX2tlcm5lbCgoaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcpKQogICAgZGlmZiA9IHRvcmNoLmFicyhteV9tb2Vfb3V0IC0gcmVmX21vZV9vdXQpCiAgICBwcmludCgiUmVmZXJlbmNlIE1vRSBvdXRwdXQgc2hhcGU6IiwgcmVmX21vZV9vdXQuc2hhcGUpCiAgICBwcmludCgiTXkgTW9FIG91dHB1dCBzaGFwZToiLCBteV9tb2Vfb3V0LnNoYXBlKQogICAgcHJpbnQoZiJGaW5hbCBkaWZmZXJlbmNlOiB7ZGlmZn0iKQ==
No newline at end of file

Best evidence level for this revision: reported

JSON