Skip to content
KernelIndex
Search⌘K

amd-mixture-of-experts · submission 29047

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

submission_moe_version_6.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixture-of-experts-29047?include=source"
interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesfp16

Benchmark evidence

2 measurements across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
AMD DeepSeek-style MoE layerfp16 · [1, 2048, 7168]
AMD Instinct MI300X
5.65ms
#37 of 118
2025-05-29
AMD DeepSeek-style MoE layerfp16 · [1, 8192, 7168]
AMD Instinct MI300X
12.2ms
#23 of 118
2025-05-29

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:56307a2b67d52b2dabd7f25381ca55f4d5a588d6db7b60e7c4e7405ad547fc06
license declaredunknown
license concludedunknown
imported2026-08-15

Kernel source

submission_moe_version_6.py1 lines
aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbWF0bXVsCgojIEB0cml0b24uaml0CiMgZGVmIG1hdG11bF9rZXJuZWwoCiMgICAgICAgICAjIFBvaW50ZXJzIHRvIG1hdHJpY2VzCiMgICAgICAgICBhX3B0ciwgYl9wdHIsIGNfcHRyLAojICAgICAgICAgIyBNYXRyaXggZGltZW5zaW9ucwojICAgICAgICAgTSwgTiwgSywKIyAgICAgICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQojICAgICAgICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAojICAgICAgICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgojICAgICAgICAgc3RyaWRlX2FtLCBzdHJpZGVfYWssICAjCiMgICAgICAgICBzdHJpZGVfYmssIHN0cmlkZV9ibiwgICMKIyAgICAgICAgIHN0cmlkZV9jbSwgc3RyaWRlX2NuLAojICAgICAgICAgIyBNZXRhLXBhcmFtZXRlcnMKIyAgICAgICAgIEJMT0NLX1NJWkVfTTogdGwuY29uc3RleHByLCBCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciwgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsICAjCiMgICAgICAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwgICMKIyAgICAgICAgIEFDVElWQVRJT046IHRsLmNvbnN0ZXhwciAgIwojICk6CiMgICAgICIiIktlcm5lbCBmb3IgY29tcHV0aW5nIHRoZSBtYXRtdWwgQyA9IEEgeCBCLgojICAgICBBIGhhcyBzaGFwZSAoTSwgSyksIEIgaGFzIHNoYXBlIChLLCBOKSBhbmQgQyBoYXMgc2hhcGUgKE0sIE4pCiMgICAgICIiIgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgTWFwIHByb2dyYW0gaWRzIGBwaWRgIHRvIHRoZSBibG9jayBvZiBDIGl0IHNob3VsZCBjb21wdXRlLgojICAgICAjIFRoaXMgaXMgZG9uZSBpbiBhIGdyb3VwZWQgb3JkZXJpbmcgdG8gcHJvbW90ZSBMMiBkYXRhIHJldXNlLgojICAgICAjIFNlZSBhYm92ZSBgTDIgQ2FjaGUgT3B0aW1pemF0aW9uc2Agc2VjdGlvbiBmb3IgZGV0YWlscy4KIyAgICAgcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiMgICAgIG51bV9waWRfbSA9IHRsLmNkaXYoTSwgQkxPQ0tfU0laRV9NKQojICAgICBudW1fcGlkX24gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKIyAgICAgbnVtX3BpZF9pbl9ncm91cCA9IEdST1VQX1NJWkVfTSAqIG51bV9waWRfbgojICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiMgICAgIGZpcnN0X3BpZF9tID0gZ3JvdXBfaWQgKiBHUk9VUF9TSVpFX00KIyAgICAgZ3JvdXBfc2l6ZV9tID0gbWluKG51bV9waWRfbSAtIGZpcnN0X3BpZF9tLCBHUk9VUF9TSVpFX00pCiMgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAoKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApICUgZ3JvdXBfc2l6ZV9tKQojICAgICBwaWRfbiA9IChwaWQgJSBudW1fcGlkX2luX2dyb3VwKSAvLyBncm91cF9zaXplX20KCiMgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIENyZWF0ZSBwb2ludGVycyBmb3IgdGhlIGZpcnN0IGJsb2NrcyBvZiBBIGFuZCBCLgojICAgICAjIFdlIHdpbGwgYWR2YW5jZSB0aGlzIHBvaW50ZXIgYXMgd2UgbW92ZSBpbiB0aGUgSyBkaXJlY3Rpb24KIyAgICAgIyBhbmQgYWNjdW11bGF0ZQojICAgICAjIGBhX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9LXSBwb2ludGVycwojICAgICAjIGBiX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfSywgQkxPQ0tfU0laRV9OXSBwb2ludGVycwojICAgICAjIFNlZSBhYm92ZSBgUG9pbnRlciBBcml0aG1ldGljYCBzZWN0aW9uIGZvciBkZXRhaWxzCiMgICAgIG9mZnNfYW0gPSAocGlkX20gKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKSkgJSBNCiMgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiMgICAgIG9mZnNfayA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX0spCiMgICAgIGFfcHRycyA9IGFfcHRyICsgKG9mZnNfYW1bOiwgTm9uZV0gKiBzdHJpZGVfYW0gKyBvZmZzX2tbTm9uZSwgOl0gKiBzdHJpZGVfYWspCiMgICAgIGJfcHRycyA9IGJfcHRyICsgKG9mZnNfa1s6LCBOb25lXSAqIHN0cmlkZV9iayArIG9mZnNfYm5bTm9uZSwgOl0gKiBzdHJpZGVfYm4pCgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgSXRlcmF0ZSB0byBjb21wdXRlIGEgYmxvY2sgb2YgdGhlIEMgbWF0cml4LgojICAgICAjIFdlIGFjY3VtdWxhdGUgaW50byBhIGBbQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX05dYCBibG9jawojICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiMgICAgICMgYGFjY3VtdWxhdG9yYCB3aWxsIGJlIGNvbnZlcnRlZCBiYWNrIHRvIGZwMTYgYWZ0ZXIgdGhlIGxvb3AuCiMgICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKIyAgICAgZm9yIGsgaW4gcmFuZ2UoMCwgdGwuY2RpdihLLCBCTE9DS19TSVpFX0spKToKIyAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgIyBJZiBpdCBpcyBvdXQgb2YgYm91bmRzLCBzZXQgaXQgdG8gMC4KIyAgICAgICAgIGEgPSB0bC5sb2FkKGFfcHRycywgbWFzaz1vZmZzX2tbTm9uZSwgOl0gPCBLIC0gayAqIEJMT0NLX1NJWkVfSywgb3RoZXI9MC4wKQojICAgICAgICAgYiA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPW9mZnNfa1s6LCBOb25lXSA8IEsgLSBrICogQkxPQ0tfU0laRV9LLCBvdGhlcj0wLjApCiMgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgYWNjdW11bGF0b3IgPSB0bC5kb3QoYSwgYiwgYWNjdW11bGF0b3IpCiMgICAgICAgICAjIEFkdmFuY2UgdGhlIHB0cnMgdG8gdGhlIG5leHQgSyBibG9jay4KIyAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKIyAgICAgICAgIGJfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYmsKIyAgICAgIyBZb3UgY2FuIGZ1c2UgYXJiaXRyYXJ5IGFjdGl2YXRpb24gZnVuY3Rpb25zIGhlcmUKIyAgICAgIyB3aGlsZSB0aGUgYWNjdW11bGF0b3IgaXMgc3RpbGwgaW4gRlAzMiEKIyAgICAgaWYgQUNUSVZBVElPTiA9PSAibGVha3lfcmVsdSI6CiMgICAgICAgICBhY2N1bXVsYXRvciA9IGxlYWt5X3JlbHUoYWNjdW11bGF0b3IpCiMgICAgIGMgPSBhY2N1bXVsYXRvci50byh0bC5mbG9hdDE2KQoKIyAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIFdyaXRlIGJhY2sgdGhlIGJsb2NrIG9mIHRoZSBvdXRwdXQgbWF0cml4IEMgd2l0aCBtYXNrcy4KIyAgICAgb2Zmc19jbSA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKIyAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKIyAgICAgY19wdHJzID0gY19wdHIgKyBzdHJpZGVfY20gKiBvZmZzX2NtWzosIE5vbmVdICsgc3RyaWRlX2NuICogb2Zmc19jbltOb25lLCA6XQojICAgICBjX21hc2sgPSAob2Zmc19jbVs6LCBOb25lXSA8IE0pICYgKG9mZnNfY25bTm9uZSwgOl0gPCBOKQojICAgICB0bC5zdG9yZShjX3B0cnMsIGMsIG1hc2s9Y19tYXNrKQoKCiMgZGVmIG1hdG11bChhLCBiLCBhY3RpdmF0aW9uPSIiKToKIyAgICAgIyBDaGVjayBjb25zdHJhaW50cy4KIyAgICAgSyA9IGEuc2l6ZSgtMSkKIyAgICAgTSA9IGEubnVtZWwoKSAvLyBLCiMgICAgIE4gPSBiLnNpemUoMSkKIyAgICAgYXNzZXJ0IGEuaXNfY29udGlndW91cygpLCAiTWF0cml4IEEgbXVzdCBiZSBjb250aWd1b3VzIgojICAgICBhc3NlcnQgSyA9PSBiLnNoYXBlWzBdLCAiSW5jb21wYXRpYmxlIGRpbWVuc2lvbnMiCiMgICAgICMgQWxsb2NhdGVzIG91dHB1dC4KIyAgICAgYyA9IHRvcmNoLmVtcHR5KChNLCBOKSwgZGV2aWNlPWEuZGV2aWNlLCBkdHlwZT10b3JjaC5mbG9hdDE2KQojICAgICAjIDFEIGxhdW5jaCBrZXJuZWwgd2hlcmUgZWFjaCBibG9jayBnZXRzIGl0cyBvd24gcHJvZ3JhbS4KIyAgICAgZ3JpZCA9IGxhbWJkYSBNRVRBOiAodHJpdG9uLmNkaXYoTSwgTUVUQVsnQkxPQ0tfU0laRV9NJ10pICogdHJpdG9uLmNkaXYoTiwgTUVUQVsnQkxPQ0tfU0laRV9OJ10pLCApCiMgICAgIG1hdG11bF9rZXJuZWxbZ3JpZF0oCiMgICAgICAgICBhLCBiLCBjLCAgIwojICAgICAgICAgTSwgTiwgSywgICMKIyAgICAgICAgIEssIDEsICAjCiMgICAgICAgICBiLnN0cmlkZSgwKSwgYi5zdHJpZGUoMSksICAjCiMgICAgICAgICBOLCAxLCAgIwojICAgICAgICAgQkxPQ0tfU0laRV9NPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9OPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9LPTEyOCwKIyAgICAgICAgIEdST1VQX1NJWkVfTT00LAojICAgICAgICAgQUNUSVZBVElPTj1hY3RpdmF0aW9uICAjCiMgICAgICkKIyAgICAgcmV0dXJuIGMKCgojIEB0b3JjaC5ub19ncmFkKCkKIyBkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiMgICAgIHhfZ2F0ZSA9IG1hdG11bCh4LCB3X2dhdGUpCiMgICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiMgICAgIHhfdXAgPSBtYXRtdWwoeCwgd191cCkKIyAgICAgb3V0ID0geF9nYXRlICogeF91cAojICAgICBvdXQgPSBtYXRtdWwob3V0LCB3X2Rvd24pCiMgICAgIHJldHVybiBvdXQKCiMgbW9lIGdhdGUKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKIyBtb2UgYWxpZ24KCmRlZiBjZWlsX2RpdihhLCBiKToKICAgIHJldHVybiAoYSArIGIgLSAxKSAvLyBiCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMSgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAoKICAgIG9mZl9jID0gKHBpZCArIDEpICogbnVtX2V4cGVydHMKCiAgICBmb3IgaSBpbiByYW5nZSh0b2tlbnNfcGVyX3RocmVhZCk6CiAgICAgICAgaWYgc3RhcnRfaWR4ICsgaSA8IG51bWVsOgogICAgICAgICAgICBpZHggPSB0bC5sb2FkKHRvcGtfaWRzX3B0ciArIHN0YXJ0X2lkeCArIGkpCiAgICAgICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgpCiAgICAgICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jICsgaWR4LCB0b2tlbl9jbnQgKyAxKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTIoCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIGxhc3RfY250ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIGkgKiBudW1fZXhwZXJ0cyArIHBpZCkKICAgICAgICBsYXN0X2NudCA9IGxhc3RfY250ICsgdG9rZW5fY250CiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkLCBsYXN0X2NudCkKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzKAogICAgdG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIGN1bXN1bV9wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAogICAgYmxvY2tfc2l6ZTogdGwuY29uc3RleHByLAopOgogICAgbGFzdF9jdW1zdW0gPSAwCiAgICBvZmZfY250ID0gbnVtX2V4cGVydHMgKiBudW1fZXhwZXJ0cwogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jbnQgKyBpIC0gMSkKICAgICAgICBsYXN0X2N1bXN1bSA9IGxhc3RfY3Vtc3VtICsgdGwuY2Rpdih0b2tlbl9jbnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZQogICAgICAgIHRsLnN0b3JlKGN1bXN1bV9wdHIgKyBpLCBsYXN0X2N1bXN1bSkKICAgIHRsLnN0b3JlKHRvdGFsX3Rva2Vuc19wb3N0X3BhZF9wdHIsIGxhc3RfY3Vtc3VtKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQoCiAgICB0b3BrX2lkc19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHN0YXJ0X2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCkKICAgIGVuZF9pZHggPSB0bC5sb2FkKGN1bXN1bV9wdHIgKyBwaWQgKyAxKQoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgZW5kX2lkeCwgYmxvY2tfc2l6ZSk6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X2lkc19wdHIgKyBpIC8vIGJsb2NrX3NpemUsIHBpZCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAogICAgb2ZmX3QgPSBwaWQgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgdGwubWluaW11bShzdGFydF9pZHggKyB0b2tlbnNfcGVyX3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lbCkpOgogICAgICAgIGV4cGVydF9pZCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgaSkKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkKQogICAgICAgIHJhbmtfcG9zdF9wYWQgPSB0b2tlbl9jbnQgKyB0bC5sb2FkKGN1bXN1bV9wdHIgKyBleHBlcnRfaWQpCiAgICAgICAgdGwuc3RvcmUoc29ydGVkX3Rva2VuX2lkc19wdHIgKyByYW5rX3Bvc3RfcGFkLCBpKQogICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkLCB0b2tlbl9jbnQgKyAxKQoKCmRlZiBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHM6IGludCwKICAgIGJsb2NrX3NpemU6IGludCwKKSAtPiBOb25lOgogICAgIiIiCiAgICAtIHRvcGtfaWRzOiBBIHRlbnNvciBvZiBzaGFwZSBbdG90YWxfdG9rZW5zLCB0b3Bfa10gcmVwcmVzZW50aW5nIHRoZQogICAgICAgIHRvcC1rIGV4cGVydCBpbmRpY2VzIGZvciBlYWNoIHRva2VuLgogICAgLSBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSB1c2VkIGluIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gbnVtX2V4cGVydHM6IFRoZSB0b3RhbCBudW1iZXIgb2YgZXhwZXJ0cy4KCiAgICBSZXR1cm5zOgogICAgLSBzb3J0ZWRfdG9rZW5faWRzOiBBIHRlbnNvciBjb250YWluaW5nIHRoZSBzb3J0ZWQgdG9rZW4gaW5kaWNlcyBhY2NvcmRpbmcKICAgICAgICB0byB0aGVpciBhbGxvY2F0ZWQgZXhwZXJ0LgogICAgLSBleHBlcnRfaWRzOiBBIHRlbnNvciBpbmRpY2F0aW5nIHRoZSBhc3NpZ25lZCBleHBlcnQgaW5kZXggZm9yIGVhY2ggYmxvY2suCiAgICAtIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IFRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGFmdGVyIHBhZGRpbmcsCiAgICAgICAgZW5zdXJpbmcgZGl2aXNpYmlsaXR5IGJ5IGJsb2NrX3NpemUuCgogICAgVGhpcyBmdW5jdGlvbiBwYWRzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgZWFjaCBleHBlcnQgbmVlZHMgdG8gcHJvY2VzcwogICAgc28gdGhhdCBpdCBpcyBkaXZpc2libGUgYnkgYmxvY2tfc2l6ZS4KICAgIFBhZGRpbmcgZW5zdXJlcyB0aGF0IGR1cmluZyBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24sIHRoZSBkaW1lbnNpb25zCiAgICBhbGlnbiBjb3JyZWN0bHkuCgogICAgRXhhbXBsZToKICAgIEdpdmVuIHRvcGtfaWRzID0gW1syLCAzLCA0XSwgWzEsIDIsIDRdLCBbMSwgMywgNF0sIFsxLCAyLCAzXV0sCiAgICBibG9ja19zaXplID0gNCwgYW5kIG51bV9leHBlcnRzID0gNDoKICAgIC0gV2UgaW5pdGlhbGx5IGhhdmUgMTIgdG9rZW5zIChhZnRlciByZXBlYXRpbmcgJ3RvcF9rJyB0aW1lcykgYW5kIDQgZXhwZXJ0cywKICAgICAgICB3aXRoIGVhY2ggZXhwZXJ0IG5lZWRpbmcgdG8gcHJvY2VzcyAzIHRva2Vucy4KICAgIC0gQXMgYmxvY2tfc2l6ZSBpcyA0LCB3ZSBwYWQgMSB0b2tlbiBmb3IgZWFjaCBleHBlcnQuCiAgICAtIEZpcnN0LCBmbGF0dGVuIHRvcGtfaWRzIHRvIFsyLCAzLCA0LCAxLCAyLCA0LCAxLCAzLCA0LCAxLCAyLCAzXS4KICAgIC0gVGhlbiBhcHBlbmQgcGFkZGluZyB0b2tlbnMgWzEyLCAxMiwgMTIsIDEyXSBmb3IgZWFjaCBibG9jay4KICAgIC0gQWZ0ZXIgc29ydGluZyBieSBleHBlcnQgaW5kZXgsIHdlIG9idGFpbiB0b2tlbl9pZHMKICAgICAgICBbMywgNiwgOSwgMTIsIDAsIDQsIDEwLCAxMiwgMSwgNywgMTEsIDEyLCAyLCA1LCA4LCAxMl0uCiAgICAgICAgVG9rZW5zIDEyIGFyZSBub24tZXhpc3RlbnQgKHBhZGRpbmcpIGFuZCBhcmUgaWdub3JlZCBpbgogICAgICAgIHRoZSBzdWJzZXF1ZW50IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gVGhlIHBhZGRpbmcgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzIG5vdyBkaXZpc2libGUKICAgICAgICBieSBibG9ja19zaXplIGZvciBwcm9wZXIgYmxvY2sgbWF0cml4IG9wZXJhdGlvbnMuCiAgICAiIiIKICAgIG1heF9udW1fdG9rZW5zX3BhZGRlZCA9IHRvcGtfaWRzLm51bWVsKCkgKyBudW1fZXhwZXJ0cyAqIChibG9ja19zaXplIC0gMSkKICAgIHNvcnRlZF9pZHMgPSB0b3JjaC5lbXB0eSgobWF4X251bV90b2tlbnNfcGFkZGVkLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBzb3J0ZWRfaWRzLmZpbGxfKHRvcGtfaWRzLm51bWVsKCkpCiAgICBtYXhfbnVtX21fYmxvY2tzID0gdHJpdG9uLmNkaXYobWF4X251bV90b2tlbnNfcGFkZGVkLCBibG9ja19zaXplKQogICAgIyBFeHBlcnQgaWRzIG11c3QgYmUgemVyb2VkIG91dCB0byBwcmV2ZW50IGluZGV4IG91dCBvZiBib3VuZHMgZXJyb3Igd2hpbGUKICAgICMgbWFwcGluZyBnbG9iYWwgZXhwZXJ0IGlkcyB0byBsb2NhbCBleHBlcnQgaWRzIGluIGV4cGVydCBwYXJhbGxlbGlzbS4KICAgIGV4cGVydF9pZHMgPSB0b3JjaC56ZXJvcygobWF4X251bV9tX2Jsb2NrcywgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQoKICAgIG51bWVsID0gdG9wa19pZHMubnVtZWwoKQogICAgZ3JpZCA9IChudW1fZXhwZXJ0cywgKQogICAgdG9rZW5zX2NudHMgPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCBudW1fZXhwZXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgY3Vtc3VtID0gdG9yY2guemVyb3MoKG51bV9leHBlcnRzICsgMSwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHRva2Vuc19wZXJfdGhyZWFkID0gY2VpbF9kaXYobnVtZWwsIG51bV9leHBlcnRzKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UxW2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgZW5kID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgIyBwcmludChmIm1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMToge2VuZCAtIHN0YXJ0fSIpCgogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgc3RhcnQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTJbZ3JpZF0oCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICApCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBlbmQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjIHByaW50KGYibW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UyOiB7ZW5kIC0gc3RhcnR9IikKCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlM1soMSwgKV0oCiAgICAgICAgbnVtX3Rva2Vuc19wb3N0X3BhZCwKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTM6IHtlbmQgLSBzdGFydH0iKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2U0W2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHNvcnRlZF9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICBudW1lbCwKICAgICAgICB0b2tlbnNfcGVyX3RocmVhZCwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQ6IHtlbmQgLSBzdGFydH0iKQoKICAgIHJldHVybiBzb3J0ZWRfaWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkCgoKIyBzaWx1IGFuZCBtdWwKCgojIEB0cml0b24uaml0CiMgZGVmIHNpbHVfYW5kX211bF9rZXJuZWwoaW5wdXRfcHRyLCBvdXRwdXRfcHRyLCBuX2VsZW1lbnRzLCBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIpOgojICAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKIyAgICAgYV9ibG9ja19zdGFydCA9IHBpZCAqIEJMT0NLX1NJWkUKIyAgICAgYl9ibG9ja19zdGFydCA9IGFfYmxvY2tfc3RhcnQgKyBuX2VsZW1lbnRzCiMgICAgIGFfb2Zmc2V0cyA9IGFfYmxvY2tfc3RhcnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkKIyAgICAgYl9vZmZzZXRzID0gYl9ibG9ja19zdGFydCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQojICAgICBhX21hc2sgPSBhX29mZnNldHMgPCBuX2VsZW1lbnRzCiMgICAgIGJfbWFzayA9IGJfb2Zmc2V0cyA8IG5fZWxlbWVudHMgKiAyCgojICAgICBhID0gdGwubG9hZChpbnB1dF9wdHIgKyBhX29mZnNldHMsIG1hc2s9YV9tYXNrKQojICAgICBiID0gdGwubG9hZChpbnB1dF9wdHIgKyBiX29mZnNldHMsIG1hc2s9Yl9tYXNrKQojICAgICBvdXRwdXQgPSBhICogKDEgLyAoMSArIHRsLmV4cCgtYS50byh0bC5mbG9hdDMyKSkpKSAqIGIKIyAgICAgdGwuc3RvcmUob3V0cHV0X3B0ciArIGFfb2Zmc2V0cywgb3V0cHV0LCBtYXNrPWFfbWFzaykKCiMgZ3JpZCA9ICh0cml0b24uY2RpdihuX2VsZW1lbnRzLCBCTE9DS19TSVpFKSwpCiMgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dF90ZW5zb3IsIG91dHB1dF90ZW5zb3IsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkUpCgpAdHJpdG9uLmppdApkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIGFfcm93X3B0ciA9IGlucHV0X3B0ciArIHBpZCAqIG5fZWxlbWVudHMgKiAyCiAgICBiX3Jvd19wdHIgPSBhX3Jvd19wdHIgKyBuX2VsZW1lbnRzCiAgICBjX3Jvd19wdHIgPSBvdXRwdXRfcHRyICsgcGlkICogbl9lbGVtZW50cwogICAgb2ZmcyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnMgPCBuX2VsZW1lbnRzCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSk6CiAgICAgICAgb2ZmcyA9IG9mZnMgKyBpCiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcm93X3B0ciArIG9mZnMsIG1hc2s9bWFzaykKICAgICAgICBjID0gYSAqICgxIC8gKDEgKyB0bC5leHAoLWEudG8odGwuZmxvYXQzMikpKSkgKiBiCiAgICAgICAgdGwuc3RvcmUoY19yb3dfcHRyICsgb2ZmcywgYywgbWFzaz1tYXNrKQoKCmRlZiBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dDogdG9yY2guVGVuc29yLCBvdXRwdXQ6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgaW5wdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgb3V0cHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IGxlbihpbnB1dC5zaGFwZSkgPiAxCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA9PSBsZW4ob3V0cHV0LnNoYXBlKQogICAgYXNzZXJ0IGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQuc2hhcGVbLTFdICogMgogICAgYXNzZXJ0IGlucHV0Lm51bWVsKCkgLyBpbnB1dC5zaGFwZVstMV0gPT0gb3V0cHV0Lm51bWVsKCkgLyBvdXRwdXQuc2hhcGVbLTFdCgogICAgbl9lbGVtZW50cyA9IGlucHV0LnNoYXBlWy0xXSAvLyAyCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KGlucHV0Lm51bWVsKCksIGlucHV0LnNoYXBlWy0xXSksKQogICAgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dCwgb3V0cHV0LCBuX2VsZW1lbnRzLCAxMDI0IGlmIG5fZWxlbWVudHMgPiAxMDI0IGVsc2Ugbl9lbGVtZW50cykKCgpkZWYgdGVzdF9zaWx1X2FuZF9tdWxfa2VybmVsKCk6CiAgICBudW1fdG9rZW5zID0gOAogICAgbnVtX2V4cGVydCA9IDQKICAgIGhpZGRlbl9zaXplID0gMjA0OAogICAgYSA9IHRvcmNoLnJhbmQoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGIgPSB0b3JjaC5vbmVzKChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgIyBiID0gYiAqIDIKICAgIGlucHV0X3RlbnNvciA9IHRvcmNoLmNvbmNhdCgoYSwgYiksIGRpbT0tMSkKICAgICMgcHJpbnQoaW5wdXRfdGVuc29yKQoKICAgIG91dHB1dF90ZW5zb3IgPSB0b3JjaC5lbXB0eSgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUsKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvcikKICAgICMgcHJpbnQob3V0cHV0X3RlbnNvcikKCiAgICByZWZfb3V0cHV0ID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGEpICogYgogICAgIyBwcmludChyZWZfb3V0cHV0KQoKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0X3RlbnNvciwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKCiMgZnVzZWQgZXhwZXJ0cwoKCkB0cml0b24uaml0CmRlZiByZW1hcF94Y2QocGlkLCBHUklEX01OLCBOVU1fWENEUzogdGwuY29uc3RleHByID0gOCk6CiAgICAjIyBwaWQgcmVtYXBwaW5nIG9uIHhjZHMKICAgICMgTnVtYmVyIG9mIHBpZHMgcGVyIFhDRCBpbiB0aGUgbmV3IGFycmFuZ2VtZW50CiAgICBwaWRzX3Blcl94Y2QgPSAoR1JJRF9NTiArIE5VTV9YQ0RTIC0gMSkgLy8gTlVNX1hDRFMKICAgICMgV2hlbiBHUklEX01OIGNhbm5vdCBkaXZpZGUgTlVNX1hDRFMsIHNvbWUgeGNkcyB3aWxsIGhhdmUKICAgICMgcGlkc19wZXJfeGNkIHBpZHMsIHRoZSBvdGhlciB3aWxsIGhhdmUgcGlkc19wZXJfeGNkIC0gMSBwaWRzLgogICAgIyBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB4Y2RzIHRoYXQgaGF2ZSBwaWRzX3Blcl94Y2QgcGlkcyBhcwogICAgIyB0YWxsX3hjZHMKICAgIHRhbGxfeGNkcyA9IEdSSURfTU4gJSBOVU1fWENEUwogICAgdGFsbF94Y2RzID0gTlVNX1hDRFMgaWYgdGFsbF94Y2RzID09IDAgZWxzZSB0YWxsX3hjZHMKICAgICMgQ29tcHV0ZSBjdXJyZW50IFhDRCBhbmQgbG9jYWwgcGlkIHdpdGhpbiB0aGUgWENECiAgICB4Y2QgPSBwaWQgJSBOVU1fWENEUwogICAgbG9jYWxfcGlkID0gcGlkIC8vIE5VTV9YQ0RTCiAgICAjIENhbGN1bGF0ZSBuZXcgcGlkIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXBpbmcKICAgICMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gY2FzZXM6CiAgICAjIDEuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHRhbGwgeGNkCiAgICAjIDIuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHNob3J0IHhjZAogICAgaWYgeGNkIDwgdGFsbF94Y2RzOgogICAgICAgIHBpZCA9IHhjZCAqIHBpZHNfcGVyX3hjZCArIGxvY2FsX3BpZAogICAgZWxzZToKICAgICAgICBwaWQgPSB0YWxsX3hjZHMgKiBwaWRzX3Blcl94Y2QgKyAoeGNkIC0gdGFsbF94Y2RzKSAqIChwaWRzX3Blcl94Y2QgLSAxKSArIGxvY2FsX3BpZAoKICAgIHJldHVybiBwaWQKCgpAdHJpdG9uLmppdApkZWYgcGlkX2dyaWQocGlkLCBudW1fcGlkX20sIG51bV9waWRfbiwgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIgPSAxKToKICAgIGlmIEdST1VQX1NJWkVfTSA9PSAxOgogICAgICAgIHBpZF9tID0gcGlkIC8vIG51bV9waWRfbgogICAgICAgIHBpZF9uID0gcGlkICUgbnVtX3BpZF9uCiAgICBlbHNlOgogICAgICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICAgICAgZmlyc3RfcGlkX20gPSBncm91cF9pZCAqIEdST1VQX1NJWkVfTQogICAgICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIHJldHVybiBwaWRfbSwgcGlkX24KCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE5VTV9TTVM6IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgc3RhcnRfcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBOVU1fWENEUzogdGwuY29uc3RleHByID0gOAoKICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSB0bC5sb2FkKG51bV90b2tlbnNfcG9zdF9wYWRkZWRfcHRyKQoKICAgIG51bV9waWRfbSA9IHRsLmNkaXYobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fdGlsZXMgPSBudW1fcGlkX20gKiBudW1fcGlkX24KICAgIHRpbGVfaWQgPSBzdGFydF9waWQKCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIG51bV92YWxpZF90aWxlcyA9IHRsLmNkaXYoKG51bV90aWxlcyAtIHRpbGVfaWQpLCBOVU1fU01TKQogICAgZm9yIF8gaW4gcmFuZ2UoMCwgbnVtX3ZhbGlkX3RpbGVzKToKICAgICAgICB0aWxlX2lkX3JlbWFwcGVkID0gcmVtYXBfeGNkKHRpbGVfaWQsIG51bV90aWxlcywgTlVNX1hDRFMpCiAgICAgICAgcGlkX20sIHBpZF9uID0gcGlkX2dyaWQodGlsZV9pZF9yZW1hcHBlZCwgbnVtX3BpZF9tLCBudW1fcGlkX24sIEdST1VQX1NJWkVfTSkKCiAgICAgICAgb2Zmc190b2tlbl9pZCA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICAgICAgdG9rZW5fbWFzayA9IG9mZnNfdG9rZW4gPCBudW1fdmFsaWRfdG9rZW5zCgogICAgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICAgICAgCiAgICAgICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc190b2tlbls6LCBOb25lXSAvLyB0b3BfayAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKCiAgICAgICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZfZXhwZXJ0cyAqIHN0cmlkZV9iZSArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGludG8gYSBgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OXWAgYmxvY2sKICAgICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiAgICAgICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9dG9rZW5fbWFza1s6LCBOb25lXSwgb3RoZXI9MC4wKQogICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCgogICAgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSBwdHJzIHRvIHRoZSBuZXh0IEsgYmxvY2suCiAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICBpZiBNVUxfUk9VVEVEX1dFSUdIVDoKICAgICAgICAgICAgbW9lX3dlaWdodCA9IHRsLmxvYWQodG9wa193ZWlnaHRzX3B0ciArIG9mZnNfdG9rZW4gKiBzdHJpZGVfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s9dG9rZW5fbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcj0wKQogICAgICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yLnRvKGNvbXB1dGVfdHlwZSkKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfdG9rZW5bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuWwogICAgICAgICAgICBOb25lLCA6XQogICAgICAgIGNfbWFzayA9IHRva2VuX21hc2tbOiwgTm9uZV0gJiAob2Zmc19jbltOb25lLCA6XSA8IE4pCiAgICAgICAgdGwuc3RvcmUoY19wdHJzLCBhY2N1bXVsYXRvciwgbWFzaz1jX21hc2spCgogICAgICAgIHRpbGVfaWQgKz0gTlVNX1NNUwoKCmRlZiBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChBOiB0b3JjaC5UZW5zb3IsIEI6IHRvcmNoLlRlbnNvciwgQzogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wa193ZWlnaHRzOiB0b3JjaC5UZW5zb3IsIHRvcGtfaWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRfdG9rZW5faWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWxfcm91dGVkX3dlaWdodDogYm9vbCwgdG9wX2s6IGludCk6CiAgICAjIHByaW50KG51bV90b2tlbnNfcG9zdF9wYWRkZWQpCiAgICAjIHByaW50KHNvcnRlZF90b2tlbl9pZHMuc2hhcGVbMF0pCiAgICBOVU1fU01TID0gdG9yY2guY3VkYS5nZXRfZGV2aWNlX3Byb3BlcnRpZXMoImN1ZGEiKS5tdWx0aV9wcm9jZXNzb3JfY291bnQgKiAyCiAgICBncmlkID0gbGFtYmRhIE1FVEE6IChtaW4oTlVNX1NNUywgdHJpdG9uLmNkaXYoc29ydGVkX3Rva2VuX2lkcy5zaGFwZVswXSwgTUVUQVsiQkxPQ0tfU0laRV9NIl0pICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cml0b24uY2RpdihCLnNoYXBlWzFdLCBNRVRBWyJCTE9DS19TSVpFX04iXSkpLCApCiAgICBmdXNlZF9tb2Vfa2VybmVsW2dyaWRdKAogICAgICAgIEEsCiAgICAgICAgQiwKICAgICAgICBDLAogICAgICAgIHRvcGtfd2VpZ2h0cywKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgIGV4cGVydF9pZHMsCiAgICAgICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwKICAgICAgICBCLnNoYXBlWzFdLAogICAgICAgIEIuc2hhcGVbMl0sCiAgICAgICAgc29ydGVkX3Rva2VuX2lkcy5zaGFwZVswXSwKICAgICAgICB0b3BrX2lkcy5udW1lbCgpLAogICAgICAgIEEuc3RyaWRlKDApLAogICAgICAgIEEuc3RyaWRlKDEpLAogICAgICAgIEIuc3RyaWRlKDApLAogICAgICAgIEIuc3RyaWRlKDIpLAogICAgICAgIEIuc3RyaWRlKDEpLAogICAgICAgIEMuc3RyaWRlKDEpLAogICAgICAgIEMuc3RyaWRlKDIpLAogICAgICAgIHRvcGtfd2VpZ2h0cy5zdHJpZGUoMiksCiAgICAgICAgc29ydGVkX3Rva2VuX2lkcy5zdHJpZGUoMCksCiAgICAgICAgTVVMX1JPVVRFRF9XRUlHSFQ9bXVsX3JvdXRlZF93ZWlnaHQsCiAgICAgICAgdG9wX2s9dG9wX2ssCiAgICAgICAgY29tcHV0ZV90eXBlPXRsLmJmbG9hdDE2IGlmIEEuZHR5cGUgPT0gdG9yY2guYmZsb2F0MTYgZWxzZSB0bC5mbG9hdDE2LAogICAgICAgIEJMT0NLX1NJWkVfTT1CTE9DS19TSVpFX00sCiAgICAgICAgQkxPQ0tfU0laRV9OPUJMT0NLX1NJWkVfTiwKICAgICAgICBCTE9DS19TSVpFX0s9QkxPQ0tfU0laRV9LLAogICAgICAgIEdST1VQX1NJWkVfTT1HUk9VUF9TSVpFX00sCiAgICAgICAgTlVNX1NNUz1OVU1fU01TLAogICAgICAgIG51bV93YXJwcz04LAogICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICB3YXZlc19wZXJfZXU9MCwKICAgICAgICBrcGFjaz0xLAogICAgICAgIG1hdHJpeF9pbnN0cl9ub25rZGltPTE2LAogICAgKQoKCiMgbWFpbiBrZXJuZWwKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9leHBlcnRfa2VybmVsKHg6IHRvcmNoLlRlbnNvciwgd19nYXRlOiB0b3JjaC5UZW5zb3IsIHdfdXA6IHRvcmNoLlRlbnNvciwgd19kb3duOiB0b3JjaC5UZW5zb3IpOgogICAgIyB4X2dhdGUgPSB4IEAgd19nYXRlCiAgICB4X2dhdGUgPSBGLmxpbmVhcih4LCB3X2dhdGUuVCkKICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiAgICAjIHhfdXAgPSB4IEAgd191cAogICAgeF91cCA9IEYubGluZWFyKHgsIHdfdXAuVCkKICAgIG91dCA9IHhfZ2F0ZSAqIHhfdXAKICAgICMgb3V0ID0gb3V0IEAgd19kb3duCiAgICBvdXQgPSBGLmxpbmVhcihvdXQsIHdfZG93bi5UKQogICAgcmV0dXJuIG91dAoKCkB0cml0b24uaml0CmRlZiB0cmFuc3Bvc2Vfa2VybmVsKAogICAgTTogdGwuY29uc3RleHByLAogICAgTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgWCwKICAgIHN0cmlkZV94bTogdGwuY29uc3RleHByLAogICAgc3RyaWRlX3huOiB0bC5jb25zdGV4cHIsCiAgICBZLAogICAgc3RyaWRlX3ltOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeW46IHRsLmNvbnN0ZXhwciwKICAgIElEWDogdGwuY29uc3RleHByLAopOgogICAgcGlkX20gPSB0bC5wcm9ncmFtX2lkKDApLnRvKHRsLmludDY0KQogICAgcGlkX24gPSB0bC5wcm9ncmFtX2lkKDEpLnRvKHRsLmludDY0KQoKICAgIG1fZXhhY3Q6IHRsLmNvbnN0ZXhwciA9IChNICUgQkxPQ0tfTSkgPT0gMAogICAgbl9leGFjdDogdGwuY29uc3RleHByID0gKE4gJSBCTE9DS19OKSA9PSAwCgogICAgb2ZmX20gPSBwaWRfbSAqIEJMT0NLX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTSkKICAgIG9mZl9uID0gcGlkX24gKiBCTE9DS19OICsgdGwuYXJhbmdlKDAsIEJMT0NLX04pCgogICAgbWFza19tID0gb2ZmX20gPCBNCiAgICBtYXNrX24gPSBvZmZfbiA8IE4KCiAgICBpZiBtX2V4YWN0OgogICAgICAgIGlmIG5fZXhhY3Q6CiAgICAgICAgICAgIG1hc2sgPSBOb25lCiAgICAgICAgICAgIG90aGVyID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1hc2sgPSBtYXNrX25bTm9uZSwgOl0KICAgICAgICAgICAgb3RoZXIgPSAwCiAgICBlbHNlOgogICAgICAgIGlmIG5fZXhhY3Q6CiAgICAgICAgICAgIG1hc2sgPSBtYXNrX21bOiwgTm9uZV0KICAgICAgICAgICAgb3RoZXIgPSAwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXSAmIG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKCiAgICAjIFhfcHRycyA9IFggKyBvZmZfbVs6LCBOb25lXSAqIDEgKyBvZmZfbltOb25lLCA6XSAqIE0KICAgICMgWV9wdHJzID0gWSArIChFX0lEICogMiArIFdfSUQpICogTSAqIE4gKyBvZmZfbVs6LCBOb25lXSAqIE4gKyBvZmZfbltOb25lLCA6XSAqIDEKICAgIFhfcHRycyA9IFggKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV94bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3huCiAgICBZX3B0cnMgPSBZICsgSURYICogTSAqIE4gKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV95bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3luCgogICAgdGlsZSA9IHRsLmxvYWQoWF9wdHJzLCBtYXNrPW1hc2ssIG90aGVyPW90aGVyKQogICAgdGwuc3RvcmUoWV9wdHJzLCB0aWxlLCBtYXNrPW1hc2spCgoKZGVmIGludm9rZV90cmFuc3Bvc2UoWCwgWSwgSURYPTAsIEJMT0NLX009MTI4LCBCTE9DS19OPTEyOCwgbnVtX3dhcnBzPTE2KSAtPiBOb25lOgogICAgaWYgWC5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFggPSBYLnZpZXcodG9yY2guaW50OCkKICAgIGlmIFkuZHR5cGUuaXRlbXNpemUgPT0gMToKICAgICAgICBZID0gWS52aWV3KHRvcmNoLmludDgpCgogICAgIyBjaGVjayBjb21wYXRpYmlsaXR5OgogICAgYXNzZXJ0IFguZHR5cGUgPT0gWS5kdHlwZQoKICAgIE0gPSBYLnNoYXBlWzBdCiAgICBOID0gWC5zaGFwZVsxXQoKICAgIHN0cmlkZV94bSA9IFguc3RyaWRlKDApCiAgICBzdHJpZGVfeG4gPSBYLnN0cmlkZSgxKQoKICAgIHN0cmlkZV95bSA9IFkuc3RyaWRlKC0yKQogICAgc3RyaWRlX3luID0gWS5zdHJpZGUoLTEpCgogICAgZ3JpZCA9ICgoTSArIEJMT0NLX00gLSAxKSAvLyBCTE9DS19NLCAoTiArIEJMT0NLX04gLSAxKSAvLyBCTE9DS19OKQogICAgdHJhbnNwb3NlX2tlcm5lbFtncmlkXSgKICAgICAgICBNLAogICAgICAgIE4sCiAgICAgICAgQkxPQ0tfTSwKICAgICAgICBCTE9DS19OLAogICAgICAgIFgsCiAgICAgICAgc3RyaWRlX3htLAogICAgICAgIHN0cmlkZV94biwKICAgICAgICBZLAogICAgICAgIHN0cmlkZV95bSwKICAgICAgICBzdHJpZGVfeW4sCiAgICAgICAgSURYPUlEWCwKICAgICAgICBudW1fd2FycHM9bnVtX3dhcnBzLAogICAgKQoKCncxOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDQwOTYsIDcxNjgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQp3MjogdG9yY2guVGVuc29yID0gdG9yY2guZW1wdHkoKDMyLCA3MTY4LCAyMDQ4KSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKCgpAdG9yY2gubm9fZ3JhZCgpCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgRGVlcFNlZWstc3R5bGUgTWl4dHVyZSBvZiBFeHBlcnRzIHVzaW5nIFB5VG9yY2guCiAgICAKICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgb2YgKGlucHV0OiB0b3JjaC5UZW5zb3IsIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLCBjb25maWc6IERpY3QpCiAgICAgICAgICAgIC0gaW5wdXQ6IElucHV0IHRlbnNvciBvZiBzaGFwZSBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX2RpbV0KICAgICAgICAgICAgLSB3ZWlnaHRzOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgd2VpZ2h0cwogICAgICAgICAgICAtIGNvbmZpZzogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICAgICAgICAgICAKICAgIFJldHVybnM6CiAgICAgICAgVHVwbGUgY29udGFpbmluZzoKICAgICAgICAgICAgLSBvdXRwdXQ6IFByb2Nlc3NlZCB0ZW5zb3IgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGRfbW9kZWxdCiAgICAgICAgICAgIC0gYXV4X2RhdGE6IERpY3Rpb25hcnkgd2l0aCBhdXhpbGlhcnkgZGF0YQogICAgIiIiCiAgICB0aW1lX2xpc3QgPSBbXQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBwcmVwYXJlIHdlaWdodAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGlucHV0X3RlbnNvcjogdG9yY2guVGVuc29yCiAgICB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXQogICAgY29uZmlnOiBEaWN0W3N0ciwgaW50XQogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCgogICAgTSA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdICogY29uZmlnWyJzZXFfbGVuIl0KICAgIE4gPSBjb25maWdbImRfZXhwZXJ0Il0KICAgIEsgPSBjb25maWdbImRfaGlkZGVuIl0KCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgZm9yIGogaW4gcmFuZ2UoMik6CiAgICAgICAgICAgIGludm9rZV90cmFuc3Bvc2Uod2VpZ2h0c1tmImV4cGVydHMue2l9LntqfS53ZWlnaHQiXS5ULCB3MSwgaSAqIDIgKyBqKQogICAgZm9yIGkgaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pOgogICAgICAgIGludm9rZV90cmFuc3Bvc2Uod2VpZ2h0c1tmImV4cGVydHMue2l9LjIud2VpZ2h0Il0uVCwgdzIsIGkpCgogICAgaW50ZXJtZWRpYXRlX2NhY2hlMSA9IHRvcmNoLm9uZXMoKE0sIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdLCBOICogMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMiA9IHRvcmNoLmVtcHR5KChNICogY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIGludGVybWVkaWF0ZV9jYWNoZTMgPSB0b3JjaC5lbXB0eSgoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIEspLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGdhdGUKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IG1vZV9nYXRlX2tlcm5lbCgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddLAogICAgICAgIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaGFyZWRfZXhwZXJ0cwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHNoYXJlZF9vdXRwdXQgPSBtb2VfZXhwZXJ0X2tlcm5lbCgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXSwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIG1vZSBhbGlnbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHNvcnRlZF90b2tlbl9pZHMsIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICAgICAgZXhwZXJ0X2luZGljZXMsIGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdLCBCTE9DS19TSVpFX00pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGZ1c2VkX21vZV8xCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX2Z1c2VkX21vZV9rZXJuZWwoaW5wdXRfdGVuc29yLnZpZXcoLTEsIEspLCB3MSwgaW50ZXJtZWRpYXRlX2NhY2hlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaW5kaWNlcy5zaGFwZVsyXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgc2lsdV9hbmRfbXVsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX3NpbHVfYW5kX211bF9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMS52aWV3KC0xLCAyICogTiksIGludGVybWVkaWF0ZV9jYWNoZTIpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGZ1c2VkX21vZV8yCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX2Z1c2VkX21vZV9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMiwgdzIsIGludGVybWVkaWF0ZV9jYWNoZTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfc2NvcmVzLCBleHBlcnRfaW5kaWNlcywgc29ydGVkX3Rva2VuX2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQsIFRydWUsIDEpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHN1bQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHJvdXRlZF9vdXRwdXQgPSB0b3JjaC5zdW0oCiAgICAgICAgaW50ZXJtZWRpYXRlX2NhY2hlMy52aWV3KCppbnRlcm1lZGlhdGVfY2FjaGUzLnNoYXBlKSwgZGltPTEpLnZpZXcoY29uZmlnWyJiYXRjaF9zaXplIl0sIGNvbmZpZ1sic2VxX2xlbiJdLCBLKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBhZGQKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBvdXRwdXQgPSByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIHJldHVybiBvdXRwdXQKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBkYXRhID0gZ2VuZXJhdGVfaW5wdXQoCiAgICAgICAgICAgIGRoaWRkZW49NzE2OCwgZGV4cGVydD0yMDQ4LAogICAgICAgICAgICBucm91dGVkZXhwZXJ0cz0zMiwgbnNoYXJlZGV4cGVydHM9MSwgbmV4cGVydHNwZXJ0b2tlbj00LAogICAgICAgICAgICBicz0xLCBzZXFsZW49MjA0OCwgc2VlZD0xKQogICAgb3V0cHV0ID0gY3VzdG9tX2tlcm5lbChkYXRhKQogICAgcmVmX2RhdGEgPSBfY2xvbmVfZGF0YShkYXRhKQogICAgcmVmX291dHB1dCA9IHJlZl9rZXJuZWwocmVmX2RhdGEpCiAgICBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dCwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKICAgICMgdGltZV9saXN0ID0gW10KICAgICMgZm9yIGkgaW4gcmFuZ2UoMjAwKToKICAgICMgICAgIGRhdGEgPSBnZW5lcmF0ZV9pbnB1dCgKICAgICMgICAgICAgICBkaGlkZGVuPTcxNjgsIGRleHBlcnQ9MjA0OCwKICAgICMgICAgICAgICBucm91dGVkZXhwZXJ0cz0zMiwgbnNoYXJlZGV4cGVydHM9MSwgbmV4cGVydHNwZXJ0b2tlbj00LAogICAgIyAgICAgICAgIGJzPTEsIHNlcWxlbj04MTkyLCBzZWVkPTEpCgogICAgIyAgICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjICAgICBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKCiAgICAjICAgICBvdXRwdXQgPSBjdXN0b21fa2VybmVsKGRhdGEpCgogICAgIyAgICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjICAgICBlbmQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjICAgICB0aW1lX2xpc3QuYXBwZW5kKChlbmQgLSBzdGFydCkgLyAxMDAwIC8gMTAwMCkKCiAgICAjICAgICByZWZfZGF0YSA9IF9jbG9uZV9kYXRhKGRhdGEpCiAgICAjICAgICByZWZfb3V0cHV0ID0gcmVmX2tlcm5lbChyZWZfZGF0YSkKCiAgICAjIHByaW50KHRpbWVfbGlzdCkKICAgICMgcHJpbnQoZiJhbGw6IHtzdW0odGltZV9saXN0Wy0xMDA6XSkgLyAxMDB9IikK

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

- aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbWF0bXVsCgpAdHJpdG9uLmppdApkZWYgbWF0bXVsX2tlcm5lbCgKICAgICAgICAjIFBvaW50ZXJzIHRvIG1hdHJpY2VzCiAgICAgICAgYV9wdHIsIGJfcHRyLCBjX3B0ciwKICAgICAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICAgICAgTSwgTiwgSywKICAgICAgICAjIFRoZSBzdHJpZGUgdmFyaWFibGVzIHJlcHJlc2VudCBob3cgbXVjaCB0byBpbmNyZWFzZSB0aGUgcHRyIGJ5IHdoZW4gbW92aW5nIGJ5IDEKICAgICAgICAjIGVsZW1lbnQgaW4gYSBwYXJ0aWN1bGFyIGRpbWVuc2lvbi4gRS5nLiBgc3RyaWRlX2FtYCBpcyBob3cgbXVjaCB0byBpbmNyZWFzZSBgYV9wdHJgCiAgICAgICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgICAgIHN0cmlkZV9hbSwgc3RyaWRlX2FrLCAgIwogICAgICAgIHN0cmlkZV9iaywgc3RyaWRlX2JuLCAgIwogICAgICAgIHN0cmlkZV9jbSwgc3RyaWRlX2NuLAogICAgICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICAgICAgQkxPQ0tfU0laRV9NOiB0bC5jb25zdGV4cHIsIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLCBCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciwgICMKICAgICAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwgICMKICAgICAgICBBQ1RJVkFUSU9OOiB0bC5jb25zdGV4cHIgICMKKToKICAgICIiIktlcm5lbCBmb3IgY29tcHV0aW5nIHRoZSBtYXRtdWwgQyA9IEEgeCBCLgogICAgQSBoYXMgc2hhcGUgKE0sIEspLCBCIGhhcyBzaGFwZSAoSywgTikgYW5kIEMgaGFzIHNoYXBlIChNLCBOKQogICAgIiIiCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIE1hcCBwcm9ncmFtIGlkcyBgcGlkYCB0byB0aGUgYmxvY2sgb2YgQyBpdCBzaG91bGQgY29tcHV0ZS4KICAgICMgVGhpcyBpcyBkb25lIGluIGEgZ3JvdXBlZCBvcmRlcmluZyB0byBwcm9tb3RlIEwyIGRhdGEgcmV1c2UuCiAgICAjIFNlZSBhYm92ZSBgTDIgQ2FjaGUgT3B0aW1pemF0aW9uc2Agc2VjdGlvbiBmb3IgZGV0YWlscy4KICAgIHBpZCA9IHRsLnByb2dyYW1faWQoYXhpcz0wKQogICAgbnVtX3BpZF9tID0gdGwuY2RpdihNLCBCTE9DS19TSVpFX00pCiAgICBudW1fcGlkX24gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgIGdyb3VwX2lkID0gcGlkIC8vIG51bV9waWRfaW5fZ3JvdXAKICAgIGZpcnN0X3BpZF9tID0gZ3JvdXBfaWQgKiBHUk9VUF9TSVpFX00KICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgcGlkX20gPSBmaXJzdF9waWRfbSArICgocGlkICUgbnVtX3BpZF9pbl9ncm91cCkgJSBncm91cF9zaXplX20pCiAgICBwaWRfbiA9IChwaWQgJSBudW1fcGlkX2luX2dyb3VwKSAvLyBncm91cF9zaXplX20KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgQ3JlYXRlIHBvaW50ZXJzIGZvciB0aGUgZmlyc3QgYmxvY2tzIG9mIEEgYW5kIEIuCiAgICAjIFdlIHdpbGwgYWR2YW5jZSB0aGlzIHBvaW50ZXIgYXMgd2UgbW92ZSBpbiB0aGUgSyBkaXJlY3Rpb24KICAgICMgYW5kIGFjY3VtdWxhdGUKICAgICMgYGFfcHRyc2AgaXMgYSBibG9jayBvZiBbQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX0tdIHBvaW50ZXJzCiAgICAjIGBiX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfSywgQkxPQ0tfU0laRV9OXSBwb2ludGVycwogICAgIyBTZWUgYWJvdmUgYFBvaW50ZXIgQXJpdGhtZXRpY2Agc2VjdGlvbiBmb3IgZGV0YWlscwogICAgb2Zmc19hbSA9IChwaWRfbSAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pKSAlIE0KICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQogICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc19hbVs6LCBOb25lXSAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKICAgIGJfcHRycyA9IGJfcHRyICsgKG9mZnNfa1s6LCBOb25lXSAqIHN0cmlkZV9iayArIG9mZnNfYm5bTm9uZSwgOl0gKiBzdHJpZGVfYm4pCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAjIFdlIGFjY3VtdWxhdGUgaW50byBhIGBbQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX05dYCBibG9jawogICAgIyBvZiBmcDMyIHZhbHVlcyBmb3IgaGlnaGVyIGFjY3VyYWN5LgogICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgIyBMb2FkIHRoZSBuZXh0IGJsb2NrIG9mIEEgYW5kIEIsIGdlbmVyYXRlIGEgbWFzayBieSBjaGVja2luZyB0aGUgSyBkaW1lbnNpb24uCiAgICAgICAgIyBJZiBpdCBpcyBvdXQgb2YgYm91bmRzLCBzZXQgaXQgdG8gMC4KICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9b2Zmc19rW05vbmUsIDpdIDwgSyAtIGsgKiBCTE9DS19TSVpFX0ssIG90aGVyPTAuMCkKICAgICAgICBiID0gdGwubG9hZChiX3B0cnMsIG1hc2s9b2Zmc19rWzosIE5vbmVdIDwgSyAtIGsgKiBCTE9DS19TSVpFX0ssIG90aGVyPTAuMCkKICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgIGFjY3VtdWxhdG9yID0gdGwuZG90KGEsIGIsIGFjY3VtdWxhdG9yKQogICAgICAgICMgQWR2YW5jZSB0aGUgcHRycyB0byB0aGUgbmV4dCBLIGJsb2NrLgogICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICBiX3B0cnMgKz0gQkxPQ0tfU0laRV9LICogc3RyaWRlX2JrCiAgICAjIFlvdSBjYW4gZnVzZSBhcmJpdHJhcnkgYWN0aXZhdGlvbiBmdW5jdGlvbnMgaGVyZQogICAgIyB3aGlsZSB0aGUgYWNjdW11bGF0b3IgaXMgc3RpbGwgaW4gRlAzMiEKICAgIGlmIEFDVElWQVRJT04gPT0gImxlYWt5X3JlbHUiOgogICAgICAgIGFjY3VtdWxhdG9yID0gbGVha3lfcmVsdShhY2N1bXVsYXRvcikKICAgIGMgPSBhY2N1bXVsYXRvci50byh0bC5mbG9hdDE2KQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgV3JpdGUgYmFjayB0aGUgYmxvY2sgb2YgdGhlIG91dHB1dCBtYXRyaXggQyB3aXRoIG1hc2tzLgogICAgb2Zmc19jbSA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgIG9mZnNfY24gPSBwaWRfbiAqIEJMT0NLX1NJWkVfTiArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX04pCiAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfY21bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuW05vbmUsIDpdCiAgICBjX21hc2sgPSAob2Zmc19jbVs6LCBOb25lXSA8IE0pICYgKG9mZnNfY25bTm9uZSwgOl0gPCBOKQogICAgdGwuc3RvcmUoY19wdHJzLCBjLCBtYXNrPWNfbWFzaykKCmRlZiBtYXRtdWwoYSwgYiwgYWN0aXZhdGlvbj0iIik6CiAgICAjIENoZWNrIGNvbnN0cmFpbnRzLgogICAgSyA9IGEuc2l6ZSgtMSkKICAgIE0gPSBhLm51bWVsKCkgLy8gSwogICAgTiA9IGIuc2l6ZSgxKQogICAgYXNzZXJ0IGEuaXNfY29udGlndW91cygpLCAiTWF0cml4IEEgbXVzdCBiZSBjb250aWd1b3VzIgogICAgYXNzZXJ0IEsgPT0gYi5zaGFwZVswXSwgIkluY29tcGF0aWJsZSBkaW1lbnNpb25zIgogICAgIyBBbGxvY2F0ZXMgb3V0cHV0LgogICAgYyA9IHRvcmNoLmVtcHR5KChNLCBOKSwgZGV2aWNlPWEuZGV2aWNlLCBkdHlwZT10b3JjaC5mbG9hdDE2KQogICAgIyAxRCBsYXVuY2gga2VybmVsIHdoZXJlIGVhY2ggYmxvY2sgZ2V0cyBpdHMgb3duIHByb2dyYW0uCiAgICBncmlkID0gbGFtYmRhIE1FVEE6ICh0cml0b24uY2RpdihNLCBNRVRBWydCTE9DS19TSVpFX00nXSkgKiB0cml0b24uY2RpdihOLCBNRVRBWydCTE9DS19TSVpFX04nXSksICkKICAgIG1hdG11bF9rZXJuZWxbZ3JpZF0oCiAgICAgICAgYSwgYiwgYywgICMKICAgICAgICBNLCBOLCBLLCAgIwogICAgICAgIEssIDEsICAjCiAgICAgICAgYi5zdHJpZGUoMCksIGIuc3RyaWRlKDEpLCAgIwogICAgICAgIE4sIDEsICAjCiAgICAgICAgQkxPQ0tfU0laRV9NPTY0LAogICAgICAgIEJMT0NLX1NJWkVfTj02NCwKICAgICAgICBCTE9DS19TSVpFX0s9MTI4LAogICAgICAgIEdST1VQX1NJWkVfTT00LAogICAgICAgIEFDVElWQVRJT049YWN0aXZhdGlvbiAgIwogICAgKQogICAgcmV0dXJuIGMKCgpAdG9yY2gubm9fZ3JhZCgpCmRlZiBtb2VfZXhwZXJ0X2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZ2F0ZTogdG9yY2guVGVuc29yLCB3X3VwOiB0b3JjaC5UZW5zb3IsIHdfZG93bjogdG9yY2guVGVuc29yKToKICAgIHhfZ2F0ZSA9IG1hdG11bCh4LCB3X2dhdGUpCiAgICB4X2dhdGUgPSBGLnNpbHUoeF9nYXRlKQogICAgeF91cCA9IG1hdG11bCh4LCB3X3VwKQogICAgb3V0ID0geF9nYXRlICogeF91cAogICAgb3V0ID0gbWF0bXVsKG91dCwgd19kb3duKQogICAgcmV0dXJuIG91dAoKIyBtb2UgZ2F0ZQoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgbW9lX2dhdGVfa2VybmVsKHg6IHRvcmNoLlRlbnNvciwgd19nOiB0b3JjaC5UZW5zb3IsIHRvcGs6IGludCk6CiAgICBsb2dpdHMgPSBGLmxpbmVhcih4LCB3X2cpCiAgICBzY29yZXMgPSBsb2dpdHMuc29mdG1heChkaW09LTEpCiAgICB0b3BrX3Njb3JlcywgdG9wa19pbmRpY2VzID0gdG9yY2gudG9wayhzY29yZXMsIGs9dG9waywgZGltPS0xLCBzb3J0ZWQ9RmFsc2UpCgogICAgcmV0dXJuIHRvcGtfaW5kaWNlcywgdG9wa19zY29yZXMKCgojIG1vZSBhbGlnbgoKZGVmIGNlaWxfZGl2KGEsIGIpOgogICAgcmV0dXJuIChhICsgYiAtIDEpIC8vIGIKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UxKAogICAgdG9wa19pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgbnVtX2V4cGVydHM6IHRsLmNvbnN0ZXhwciwKICAgIG51bWVsOiB0bC5jb25zdGV4cHIsCiAgICB0b2tlbnNfcGVyX3RocmVhZDogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIHN0YXJ0X2lkeCA9IHBpZCAqIHRva2Vuc19wZXJfdGhyZWFkCgogICAgb2ZmX2MgPSAocGlkICsgMSkgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHRva2Vuc19wZXJfdGhyZWFkKToKICAgICAgICBpZiBzdGFydF9pZHggKyBpIDwgbnVtZWw6CiAgICAgICAgICAgIGlkeCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgc3RhcnRfaWR4ICsgaSkKICAgICAgICAgICAgdG9rZW5fY250ID0gdGwubG9hZCh0b2tlbnNfY250c19wdHIgKyBvZmZfYyArIGlkeCkKICAgICAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgsIHRva2VuX2NudCArIDEpCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMigKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKDApCgogICAgbGFzdF9jbnQgPSAwCiAgICBmb3IgaSBpbiByYW5nZSgxLCBudW1fZXhwZXJ0cyArIDEpOgogICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkKQogICAgICAgIGxhc3RfY250ID0gbGFzdF9jbnQgKyB0b2tlbl9jbnQKICAgICAgICB0bC5zdG9yZSh0b2tlbnNfY250c19wdHIgKyBpICogbnVtX2V4cGVydHMgKyBwaWQsIGxhc3RfY250KQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTMoCiAgICB0b3RhbF90b2tlbnNfcG9zdF9wYWRfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCik6CiAgICBsYXN0X2N1bXN1bSA9IDAKICAgIG9mZl9jbnQgPSBudW1fZXhwZXJ0cyAqIG51bV9leHBlcnRzCiAgICBmb3IgaSBpbiByYW5nZSgxLCBudW1fZXhwZXJ0cyArIDEpOgogICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2NudCArIGkgLSAxKQogICAgICAgIGxhc3RfY3Vtc3VtID0gbGFzdF9jdW1zdW0gKyB0bC5jZGl2KHRva2VuX2NudCwgYmxvY2tfc2l6ZSkgKiBibG9ja19zaXplCiAgICAgICAgdGwuc3RvcmUoY3Vtc3VtX3B0ciArIGksIGxhc3RfY3Vtc3VtKQogICAgdGwuc3RvcmUodG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwgbGFzdF9jdW1zdW0pCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlNCgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHNvcnRlZF90b2tlbl9pZHNfcHRyLAogICAgZXhwZXJ0X2lkc19wdHIsCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBjdW1zdW1fcHRyLAogICAgbnVtX2V4cGVydHM6IHRsLmNvbnN0ZXhwciwKICAgIGJsb2NrX3NpemU6IHRsLmNvbnN0ZXhwciwKICAgIG51bWVsOiB0bC5jb25zdGV4cHIsCiAgICB0b2tlbnNfcGVyX3RocmVhZDogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQogICAgc3RhcnRfaWR4ID0gdGwubG9hZChjdW1zdW1fcHRyICsgcGlkKQogICAgZW5kX2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCArIDEpCgogICAgZm9yIGkgaW4gcmFuZ2Uoc3RhcnRfaWR4LCBlbmRfaWR4LCBibG9ja19zaXplKToKICAgICAgICB0bC5zdG9yZShleHBlcnRfaWRzX3B0ciArIGkgLy8gYmxvY2tfc2l6ZSwgcGlkKQoKICAgIHN0YXJ0X2lkeCA9IHBpZCAqIHRva2Vuc19wZXJfdGhyZWFkCiAgICBvZmZfdCA9IHBpZCAqIG51bV9leHBlcnRzCgogICAgZm9yIGkgaW4gcmFuZ2Uoc3RhcnRfaWR4LCB0bC5taW5pbXVtKHN0YXJ0X2lkeCArIHRva2Vuc19wZXJfdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVsKSk6CiAgICAgICAgZXhwZXJ0X2lkID0gdGwubG9hZCh0b3BrX2lkc19wdHIgKyBpKQogICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX3QgKyBleHBlcnRfaWQpCiAgICAgICAgcmFua19wb3N0X3BhZCA9IHRva2VuX2NudCArIHRsLmxvYWQoY3Vtc3VtX3B0ciArIGV4cGVydF9pZCkKICAgICAgICB0bC5zdG9yZShzb3J0ZWRfdG9rZW5faWRzX3B0ciArIHJhbmtfcG9zdF9wYWQsIGkpCiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgb2ZmX3QgKyBleHBlcnRfaWQsIHRva2VuX2NudCArIDEpCgoKZGVmIGludm9rZV9tb2VfYWxpZ25fYmxvY2tfc2l6ZSgKICAgIHRvcGtfaWRzOiB0b3JjaC5UZW5zb3IsCiAgICBudW1fZXhwZXJ0czogaW50LAogICAgYmxvY2tfc2l6ZTogaW50LAopIC0+IE5vbmU6CiAgICAiIiIKICAgIC0gdG9wa19pZHM6IEEgdGVuc29yIG9mIHNoYXBlIFt0b3RhbF90b2tlbnMsIHRvcF9rXSByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgdG9wLWsgZXhwZXJ0IGluZGljZXMgZm9yIGVhY2ggdG9rZW4uCiAgICAtIGJsb2NrX3NpemU6IFRoZSBibG9jayBzaXplIHVzZWQgaW4gYmxvY2sgbWF0cml4IG11bHRpcGxpY2F0aW9uLgogICAgLSBudW1fZXhwZXJ0czogVGhlIHRvdGFsIG51bWJlciBvZiBleHBlcnRzLgoKICAgIFJldHVybnM6CiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCB0b2tlbiBpbmRpY2VzIGFjY29yZGluZwogICAgICAgIHRvIHRoZWlyIGFsbG9jYXRlZCBleHBlcnQuCiAgICAtIGV4cGVydF9pZHM6IEEgdGVuc29yIGluZGljYXRpbmcgdGhlIGFzc2lnbmVkIGV4cGVydCBpbmRleCBmb3IgZWFjaCBibG9jay4KICAgIC0gbnVtX3Rva2Vuc19wb3N0X3BhZGRlZDogVGhlIHRvdGFsIG51bWJlciBvZiB0b2tlbnMgYWZ0ZXIgcGFkZGluZywKICAgICAgICBlbnN1cmluZyBkaXZpc2liaWxpdHkgYnkgYmxvY2tfc2l6ZS4KCiAgICBUaGlzIGZ1bmN0aW9uIHBhZHMgdGhlIG51bWJlciBvZiB0b2tlbnMgdGhhdCBlYWNoIGV4cGVydCBuZWVkcyB0byBwcm9jZXNzCiAgICBzbyB0aGF0IGl0IGlzIGRpdmlzaWJsZSBieSBibG9ja19zaXplLgogICAgUGFkZGluZyBlbnN1cmVzIHRoYXQgZHVyaW5nIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiwgdGhlIGRpbWVuc2lvbnMKICAgIGFsaWduIGNvcnJlY3RseS4KCiAgICBFeGFtcGxlOgogICAgR2l2ZW4gdG9wa19pZHMgPSBbWzIsIDMsIDRdLCBbMSwgMiwgNF0sIFsxLCAzLCA0XSwgWzEsIDIsIDNdXSwKICAgIGJsb2NrX3NpemUgPSA0LCBhbmQgbnVtX2V4cGVydHMgPSA0OgogICAgLSBXZSBpbml0aWFsbHkgaGF2ZSAxMiB0b2tlbnMgKGFmdGVyIHJlcGVhdGluZyAndG9wX2snIHRpbWVzKSBhbmQgNCBleHBlcnRzLAogICAgICAgIHdpdGggZWFjaCBleHBlcnQgbmVlZGluZyB0byBwcm9jZXNzIDMgdG9rZW5zLgogICAgLSBBcyBibG9ja19zaXplIGlzIDQsIHdlIHBhZCAxIHRva2VuIGZvciBlYWNoIGV4cGVydC4KICAgIC0gRmlyc3QsIGZsYXR0ZW4gdG9wa19pZHMgdG8gWzIsIDMsIDQsIDEsIDIsIDQsIDEsIDMsIDQsIDEsIDIsIDNdLgogICAgLSBUaGVuIGFwcGVuZCBwYWRkaW5nIHRva2VucyBbMTIsIDEyLCAxMiwgMTJdIGZvciBlYWNoIGJsb2NrLgogICAgLSBBZnRlciBzb3J0aW5nIGJ5IGV4cGVydCBpbmRleCwgd2Ugb2J0YWluIHRva2VuX2lkcwogICAgICAgIFszLCA2LCA5LCAxMiwgMCwgNCwgMTAsIDEyLCAxLCA3LCAxMSwgMTIsIDIsIDUsIDgsIDEyXS4KICAgICAgICBUb2tlbnMgMTIgYXJlIG5vbi1leGlzdGVudCAocGFkZGluZykgYW5kIGFyZSBpZ25vcmVkIGluCiAgICAgICAgdGhlIHN1YnNlcXVlbnQgbWF0cml4IG11bHRpcGxpY2F0aW9uLgogICAgLSBUaGUgcGFkZGluZyBlbnN1cmVzIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZiB0b2tlbnMgaXMgbm93IGRpdmlzaWJsZQogICAgICAgIGJ5IGJsb2NrX3NpemUgZm9yIHByb3BlciBibG9jayBtYXRyaXggb3BlcmF0aW9ucy4KICAgICIiIgogICAgbWF4X251bV90b2tlbnNfcGFkZGVkID0gdG9wa19pZHMubnVtZWwoKSArIG51bV9leHBlcnRzICogKGJsb2NrX3NpemUgLSAxKQogICAgc29ydGVkX2lkcyA9IHRvcmNoLmVtcHR5KChtYXhfbnVtX3Rva2Vuc19wYWRkZWQsICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9dG9yY2guaW50MzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHNvcnRlZF9pZHMuZmlsbF8odG9wa19pZHMubnVtZWwoKSkKICAgIG1heF9udW1fbV9ibG9ja3MgPSB0cml0b24uY2RpdihtYXhfbnVtX3Rva2Vuc19wYWRkZWQsIGJsb2NrX3NpemUpCiAgICAjIEV4cGVydCBpZHMgbXVzdCBiZSB6ZXJvZWQgb3V0IHRvIHByZXZlbnQgaW5kZXggb3V0IG9mIGJvdW5kcyBlcnJvciB3aGlsZQogICAgIyBtYXBwaW5nIGdsb2JhbCBleHBlcnQgaWRzIHRvIGxvY2FsIGV4cGVydCBpZHMgaW4gZXhwZXJ0IHBhcmFsbGVsaXNtLgogICAgZXhwZXJ0X2lkcyA9IHRvcmNoLnplcm9zKChtYXhfbnVtX21fYmxvY2tzLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBudW1fdG9rZW5zX3Bvc3RfcGFkID0gdG9yY2guZW1wdHkoKDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCgogICAgbnVtZWwgPSB0b3BrX2lkcy5udW1lbCgpCiAgICBncmlkID0gKG51bV9leHBlcnRzLCApCiAgICB0b2tlbnNfY250cyA9IHRvcmNoLnplcm9zKChudW1fZXhwZXJ0cyArIDEsIG51bV9leHBlcnRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9dG9yY2guaW50MzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBjdW1zdW0gPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9dG9yY2guaW50MzIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgdG9rZW5zX3Blcl90aHJlYWQgPSBjZWlsX2RpdihudW1lbCwgbnVtX2V4cGVydHMpCgogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgc3RhcnQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTFbZ3JpZF0oCiAgICAgICAgdG9wa19pZHMsCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgbnVtZWwsCiAgICAgICAgdG9rZW5zX3Blcl90aHJlYWQsCiAgICApCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBlbmQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjIHByaW50KGYibW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UxOiB7ZW5kIC0gc3RhcnR9IikKCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMltncmlkXSgKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBudW1fZXhwZXJ0cywKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTI6IHtlbmQgLSBzdGFydH0iKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzWygxLCApXSgKICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgKQogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgZW5kID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgIyBwcmludChmIm1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMzoge2VuZCAtIHN0YXJ0fSIpCgogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgc3RhcnQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTRbZ3JpZF0oCiAgICAgICAgdG9wa19pZHMsCiAgICAgICAgc29ydGVkX2lkcywKICAgICAgICBleHBlcnRfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIGN1bXN1bSwKICAgICAgICBudW1fZXhwZXJ0cywKICAgICAgICBibG9ja19zaXplLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgZW5kID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgIyBwcmludChmIm1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlNDoge2VuZCAtIHN0YXJ0fSIpCgogICAgcmV0dXJuIHNvcnRlZF9pZHMsIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWQKCgojIHNpbHUgYW5kIG11bAoKCiMgQHRyaXRvbi5qaXQKIyBkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiMgICAgIHBpZCA9IHRsLnByb2dyYW1faWQoYXhpcz0wKQojICAgICBhX2Jsb2NrX3N0YXJ0ID0gcGlkICogQkxPQ0tfU0laRQojICAgICBiX2Jsb2NrX3N0YXJ0ID0gYV9ibG9ja19zdGFydCArIG5fZWxlbWVudHMKIyAgICAgYV9vZmZzZXRzID0gYV9ibG9ja19zdGFydCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQojICAgICBiX29mZnNldHMgPSBiX2Jsb2NrX3N0YXJ0ICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpCiMgICAgIGFfbWFzayA9IGFfb2Zmc2V0cyA8IG5fZWxlbWVudHMKIyAgICAgYl9tYXNrID0gYl9vZmZzZXRzIDwgbl9lbGVtZW50cyAqIDIKCiMgICAgIGEgPSB0bC5sb2FkKGlucHV0X3B0ciArIGFfb2Zmc2V0cywgbWFzaz1hX21hc2spCiMgICAgIGIgPSB0bC5sb2FkKGlucHV0X3B0ciArIGJfb2Zmc2V0cywgbWFzaz1iX21hc2spCiMgICAgIG91dHB1dCA9IGEgKiAoMSAvICgxICsgdGwuZXhwKC1hLnRvKHRsLmZsb2F0MzIpKSkpICogYgojICAgICB0bC5zdG9yZShvdXRwdXRfcHRyICsgYV9vZmZzZXRzLCBvdXRwdXQsIG1hc2s9YV9tYXNrKQoKIyBncmlkID0gKHRyaXRvbi5jZGl2KG5fZWxlbWVudHMsIEJMT0NLX1NJWkUpLCkKIyBzaWx1X2FuZF9tdWxfa2VybmVsW2dyaWRdKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvciwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSkKCkB0cml0b24uaml0CmRlZiBzaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3B0ciwgb3V0cHV0X3B0ciwgbl9lbGVtZW50cywgQkxPQ0tfU0laRTogdGwuY29uc3RleHByKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoYXhpcz0wKQogICAgYV9yb3dfcHRyID0gaW5wdXRfcHRyICsgcGlkICogbl9lbGVtZW50cyAqIDIKICAgIGJfcm93X3B0ciA9IGFfcm93X3B0ciArIG5fZWxlbWVudHMKICAgIGNfcm93X3B0ciA9IG91dHB1dF9wdHIgKyBwaWQgKiBuX2VsZW1lbnRzCiAgICBvZmZzID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkUpCiAgICBtYXNrID0gb2ZmcyA8IG5fZWxlbWVudHMKCiAgICBmb3IgaSBpbiByYW5nZSgwLCBuX2VsZW1lbnRzLCBCTE9DS19TSVpFKToKICAgICAgICBvZmZzID0gb2ZmcyArIGkKICAgICAgICBhID0gdGwubG9hZChhX3Jvd19wdHIgKyBvZmZzLCBtYXNrPW1hc2spCiAgICAgICAgYiA9IHRsLmxvYWQoYl9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGMgPSBhICogKDEgLyAoMSArIHRsLmV4cCgtYS50byh0bC5mbG9hdDMyKSkpKSAqIGIKICAgICAgICB0bC5zdG9yZShjX3Jvd19wdHIgKyBvZmZzLCBjLCBtYXNrPW1hc2spCgoKZGVmIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0OiB0b3JjaC5UZW5zb3IsIG91dHB1dDogdG9yY2guVGVuc29yKToKICAgIGFzc2VydCBpbnB1dC5pc19jb250aWd1b3VzKCkKICAgIGFzc2VydCBvdXRwdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA+IDEKICAgIGFzc2VydCBsZW4oaW5wdXQuc2hhcGUpID09IGxlbihvdXRwdXQuc2hhcGUpCiAgICBhc3NlcnQgaW5wdXQuc2hhcGVbLTFdID09IG91dHB1dC5zaGFwZVstMV0gKiAyCiAgICBhc3NlcnQgaW5wdXQubnVtZWwoKSAvIGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQubnVtZWwoKSAvIG91dHB1dC5zaGFwZVstMV0KCiAgICBuX2VsZW1lbnRzID0gaW5wdXQuc2hhcGVbLTFdIC8vIDIKICAgIGdyaWQgPSAodHJpdG9uLmNkaXYoaW5wdXQubnVtZWwoKSwgaW5wdXQuc2hhcGVbLTFdKSwpCiAgICBzaWx1X2FuZF9tdWxfa2VybmVsW2dyaWRdKGlucHV0LCBvdXRwdXQsIG5fZWxlbWVudHMsIDEwMjQgaWYgbl9lbGVtZW50cyA+IDEwMjQgZWxzZSBuX2VsZW1lbnRzKQoKCmRlZiB0ZXN0X3NpbHVfYW5kX211bF9rZXJuZWwoKToKICAgIG51bV90b2tlbnMgPSA4CiAgICBudW1fZXhwZXJ0ID0gNAogICAgaGlkZGVuX3NpemUgPSAyMDQ4CiAgICBhID0gdG9yY2gucmFuZCgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgYiA9IHRvcmNoLm9uZXMoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplLCksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0iY3VkYSIpCiAgICAjIGIgPSBiICogMgogICAgaW5wdXRfdGVuc29yID0gdG9yY2guY29uY2F0KChhLCBiKSwgZGltPS0xKQogICAgIyBwcmludChpbnB1dF90ZW5zb3IpCgogICAgb3V0cHV0X3RlbnNvciA9IHRvcmNoLmVtcHR5KChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgaW52b2tlX3NpbHVfYW5kX211bF9rZXJuZWwoaW5wdXRfdGVuc29yLCBvdXRwdXRfdGVuc29yKQogICAgIyBwcmludChvdXRwdXRfdGVuc29yKQoKICAgIHJlZl9vdXRwdXQgPSB0b3JjaC5ubi5mdW5jdGlvbmFsLnNpbHUoYSkgKiBiCiAgICAjIHByaW50KHJlZl9vdXRwdXQpCgogICAgcHJpbnQodmVyYm9zZV9hbGxjbG9zZShvdXRwdXRfdGVuc29yLCByZWZfb3V0cHV0LCBydG9sPTFlLTIsIGF0b2w9MWUtMikpCgoKIyBmdXNlZCBleHBlcnRzCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBNYXAgcHJvZ3JhbSBpZHMgYHBpZGAgdG8gdGhlIGJsb2NrIG9mIEMgaXQgc2hvdWxkIGNvbXB1dGUuCiAgICAjIFRoaXMgaXMgZG9uZSBpbiBhIGdyb3VwZWQgb3JkZXJpbmcgdG8gcHJvbW90ZSBMMiBkYXRhIHJldXNlLgogICAgcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBudW1fcGlkX20gPSB0bC5jZGl2KEVNLCBCTE9DS19TSVpFX00pCiAgICBudW1fcGlkX24gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgIGdyb3VwX2lkID0gcGlkIC8vIG51bV9waWRfaW5fZ3JvdXAKICAgIGZpcnN0X3BpZF9tID0gZ3JvdXBfaWQgKiBHUk9VUF9TSVpFX00KICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgcGlkX20gPSBmaXJzdF9waWRfbSArICgocGlkICUgbnVtX3BpZF9pbl9ncm91cCkgJSBncm91cF9zaXplX20pCiAgICBwaWRfbiA9IChwaWQgJSBudW1fcGlkX2luX2dyb3VwKSAvLyBncm91cF9zaXplX20KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgQ3JlYXRlIHBvaW50ZXJzIGZvciB0aGUgZmlyc3QgYmxvY2tzIG9mIEEgYW5kIEIuCiAgICAjIFdlIHdpbGwgYWR2YW5jZSB0aGlzIHBvaW50ZXIgYXMgd2UgbW92ZSBpbiB0aGUgSyBkaXJlY3Rpb24KICAgICMgYW5kIGFjY3VtdWxhdGUKICAgICMgYGFfcHRyc2AgaXMgYSBibG9jayBvZiBbQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX0tdIHBvaW50ZXJzCiAgICAjIGBiX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfSywgQkxPQ0tfU0laRV9OXSBwb2ludGVycwogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCA9IHRsLmxvYWQobnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIpCiAgICBpZiBwaWRfbSAqIEJMT0NLX1NJWkVfTSA+PSBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkOgogICAgICAgIHJldHVybgoKICAgIG9mZnNfdG9rZW5faWQgPSBwaWRfbSAqIEJMT0NLX1NJWkVfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX00pCiAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICB0b2tlbl9tYXNrID0gb2Zmc190b2tlbiA8IG51bV92YWxpZF90b2tlbnMKCiAgICBvZmZzX2JuID0gKHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikpICUgTgogICAgb2Zmc19rID0gdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfSykKICAgIGFfcHRycyA9IGFfcHRyICsgKG9mZnNfdG9rZW5bOiwgTm9uZV0gLy8gdG9wX2sgKiBzdHJpZGVfYW0gKyBvZmZzX2tbTm9uZSwgOl0gKiBzdHJpZGVfYWspCgogICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICBiX3B0cnMgPSBiX3B0ciArIG9mZl9leHBlcnRzICogc3RyaWRlX2JlICsgKG9mZnNfa1s6LCBOb25lXSAqIHN0cmlkZV9iayArIG9mZnNfYm5bTm9uZSwgOl0gKiBzdHJpZGVfYm4pCgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAjIFdlIGFjY3VtdWxhdGUgaW50byBhIGBbQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX05dYCBibG9jawogICAgIyBvZiBmcDMyIHZhbHVlcyBmb3IgaGlnaGVyIGFjY3VyYWN5LgogICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKCiAgICBmb3IgayBpbiByYW5nZSgwLCB0bC5jZGl2KEssIEJMT0NLX1NJWkVfSykpOgogICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgIGEgPSB0bC5sb2FkKGFfcHRycywKICAgICAgICAgICAgICAgICAgICBtYXNrPXRva2VuX21hc2tbOiwgTm9uZV0gJgogICAgICAgICAgICAgICAgICAgIChvZmZzX2tbTm9uZSwgOl0gPCBLIC0gayAqIEJMT0NLX1NJWkVfSyksCiAgICAgICAgICAgICAgICAgICAgb3RoZXI9MC4wKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcHRycywKICAgICAgICAgICAgICAgICAgICBtYXNrPW9mZnNfa1s6LCBOb25lXSA8IEsgLSBrICogQkxPQ0tfU0laRV9LLAogICAgICAgICAgICAgICAgICAgIG90aGVyPTAuMCkKCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGFsb25nIHRoZSBLIGRpbWVuc2lvbi4KICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAjIEFkdmFuY2UgdGhlIHB0cnMgdG8gdGhlIG5leHQgSyBibG9jay4KICAgICAgICBhX3B0cnMgKz0gQkxPQ0tfU0laRV9LICogc3RyaWRlX2FrCiAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgIGlmIE1VTF9ST1VURURfV0VJR0hUOgogICAgICAgIG1vZV93ZWlnaHQgPSB0bC5sb2FkKHRvcGtfd2VpZ2h0c19wdHIgKyBvZmZzX3Rva2VuICogc3RyaWRlX3dlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrPXRva2VuX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXI9MCkKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgIGFjY3VtdWxhdG9yID0gYWNjdW11bGF0b3IudG8oY29tcHV0ZV90eXBlKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICBvZmZzX2NuID0gcGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKQogICAgY19wdHJzID0gY19wdHIgKyBzdHJpZGVfY20gKiBvZmZzX3Rva2VuWzosIE5vbmVdICsgc3RyaWRlX2NuICogb2Zmc19jblsKICAgICAgICBOb25lLCA6XQogICAgY19tYXNrID0gdG9rZW5fbWFza1s6LCBOb25lXSAmIChvZmZzX2NuW05vbmUsIDpdIDwgTikKICAgIHRsLnN0b3JlKGNfcHRycywgYWNjdW11bGF0b3IsIG1hc2s9Y19tYXNrKQoKCmRlZiBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChBOiB0b3JjaC5UZW5zb3IsIEI6IHRvcmNoLlRlbnNvciwgQzogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wa193ZWlnaHRzOiB0b3JjaC5UZW5zb3IsIHRvcGtfaWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRfdG9rZW5faWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWxfcm91dGVkX3dlaWdodDogYm9vbCwgdG9wX2s6IGludCk6CgogICAgZ3JpZCA9IGxhbWJkYSBNRVRBOiAodHJpdG9uLmNkaXYoc29ydGVkX3Rva2VuX2lkcy5zaGFwZVswXSwgTUVUQVsnQkxPQ0tfU0laRV9NJ10pICogdHJpdG9uLmNkaXYoQi5zaGFwZVsxXSwgTUVUQVsnQkxPQ0tfU0laRV9OJ10pLCApCiAgICBmdXNlZF9tb2Vfa2VybmVsW2dyaWRdKAogICAgICAgIEEsCiAgICAgICAgQiwKICAgICAgICBDLAogICAgICAgIHRvcGtfd2VpZ2h0cywKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgIGV4cGVydF9pZHMsCiAgICAgICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwKICAgICAgICBCLnNoYXBlWzFdLAogICAgICAgIEIuc2hhcGVbMl0sCiAgICAgICAgc29ydGVkX3Rva2VuX2lkcy5zaGFwZVswXSwKICAgICAgICB0b3BrX2lkcy5udW1lbCgpLAogICAgICAgIEEuc3RyaWRlKDApLAogICAgICAgIEEuc3RyaWRlKDEpLAogICAgICAgIEIuc3RyaWRlKDApLAogICAgICAgIEIuc3RyaWRlKDIpLAogICAgICAgIEIuc3RyaWRlKDEpLAogICAgICAgIEMuc3RyaWRlKDEpLAogICAgICAgIEMuc3RyaWRlKDIpLAogICAgICAgIHRvcGtfd2VpZ2h0cy5zdHJpZGUoMiksCiAgICAgICAgc29ydGVkX3Rva2VuX2lkcy5zdHJpZGUoMCksCiAgICAgICAgTVVMX1JPVVRFRF9XRUlHSFQ9bXVsX3JvdXRlZF93ZWlnaHQsCiAgICAgICAgdG9wX2s9dG9wX2ssCiAgICAgICAgY29tcHV0ZV90eXBlPXRsLmJmbG9hdDE2IGlmIEEuZHR5cGUgPT0gdG9yY2guYmZsb2F0MTYgZWxzZSB0bC5mbG9hdDE2LAogICAgICAgIEJMT0NLX1NJWkVfTT1CTE9DS19TSVpFX00sCiAgICAgICAgQkxPQ0tfU0laRV9OPUJMT0NLX1NJWkVfTiwKICAgICAgICBCTE9DS19TSVpFX0s9QkxPQ0tfU0laRV9LLAogICAgICAgIEdST1VQX1NJWkVfTT1HUk9VUF9TSVpFX00sCiAgICAgICAgbnVtX3dhcnBzPTgsCiAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgIHdhdmVzX3Blcl9ldT0wLAogICAgICAgIGtwYWNrPTEsCiAgICAgICAgbWF0cml4X2luc3RyX25vbmtkaW09MTYsCiAgICApCgoKIyBtYWluIGtlcm5lbAoKQHRvcmNoLm5vX2dyYWQoKQpkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiAgICAjIHhfZ2F0ZSA9IHggQCB3X2dhdGUKICAgIHhfZ2F0ZSA9IEYubGluZWFyKHgsIHdfZ2F0ZS5UKQogICAgeF9nYXRlID0gRi5zaWx1KHhfZ2F0ZSkKICAgICMgeF91cCA9IHggQCB3X3VwCiAgICB4X3VwID0gRi5saW5lYXIoeCwgd191cC5UKQogICAgb3V0ID0geF9nYXRlICogeF91cAogICAgIyBvdXQgPSBvdXQgQCB3X2Rvd24KICAgIG91dCA9IEYubGluZWFyKG91dCwgd19kb3duLlQpCiAgICByZXR1cm4gb3V0CgoKQHRyaXRvbi5qaXQKZGVmIHRyYW5zcG9zZV9rZXJuZWwoCiAgICBNOiB0bC5jb25zdGV4cHIsCiAgICBOOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19NOiB0bC5jb25zdGV4cHIsCiAgICBCTE9DS19OOiB0bC5jb25zdGV4cHIsCiAgICBYLAogICAgc3RyaWRlX3htOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeG46IHRsLmNvbnN0ZXhwciwKICAgIFksCiAgICBzdHJpZGVfeW06IHRsLmNvbnN0ZXhwciwKICAgIHN0cmlkZV95bjogdGwuY29uc3RleHByLAogICAgSURYOiB0bC5jb25zdGV4cHIsCik6CiAgICBwaWRfbSA9IHRsLnByb2dyYW1faWQoMCkudG8odGwuaW50NjQpCiAgICBwaWRfbiA9IHRsLnByb2dyYW1faWQoMSkudG8odGwuaW50NjQpCgogICAgbV9leGFjdDogdGwuY29uc3RleHByID0gKE0gJSBCTE9DS19NKSA9PSAwCiAgICBuX2V4YWN0OiB0bC5jb25zdGV4cHIgPSAoTiAlIEJMT0NLX04pID09IDAKCiAgICBvZmZfbSA9IHBpZF9tICogQkxPQ0tfTSArIHRsLmFyYW5nZSgwLCBCTE9DS19NKQogICAgb2ZmX24gPSBwaWRfbiAqIEJMT0NLX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTikKCiAgICBtYXNrX20gPSBvZmZfbSA8IE0KICAgIG1hc2tfbiA9IG9mZl9uIDwgTgoKICAgIGlmIG1fZXhhY3Q6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IE5vbmUKICAgICAgICAgICAgb3RoZXIgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKICAgIGVsc2U6CiAgICAgICAgaWYgbl9leGFjdDoKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXQogICAgICAgICAgICBvdGhlciA9IDAKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXNrID0gbWFza19tWzosIE5vbmVdICYgbWFza19uW05vbmUsIDpdCiAgICAgICAgICAgIG90aGVyID0gMAoKICAgICMgWF9wdHJzID0gWCArIG9mZl9tWzosIE5vbmVdICogMSArIG9mZl9uW05vbmUsIDpdICogTQogICAgIyBZX3B0cnMgPSBZICsgKEVfSUQgKiAyICsgV19JRCkgKiBNICogTiArIG9mZl9tWzosIE5vbmVdICogTiArIG9mZl9uW05vbmUsIDpdICogMQogICAgWF9wdHJzID0gWCArIG9mZl9tWzosIE5vbmVdICogc3RyaWRlX3htICsgb2ZmX25bTm9uZSwgOl0gKiBzdHJpZGVfeG4KICAgIFlfcHRycyA9IFkgKyBJRFggKiBNICogTiArIG9mZl9tWzosIE5vbmVdICogc3RyaWRlX3ltICsgb2ZmX25bTm9uZSwgOl0gKiBzdHJpZGVfeW4KCiAgICB0aWxlID0gdGwubG9hZChYX3B0cnMsIG1hc2s9bWFzaywgb3RoZXI9b3RoZXIpCiAgICB0bC5zdG9yZShZX3B0cnMsIHRpbGUsIG1hc2s9bWFzaykKCgpkZWYgaW52b2tlX3RyYW5zcG9zZShYLCBZLCBJRFg9MCwgQkxPQ0tfTT0xMjgsIEJMT0NLX049MTI4LCBudW1fd2FycHM9MTYpIC0+IE5vbmU6CiAgICBpZiBYLmR0eXBlLml0ZW1zaXplID09IDE6CiAgICAgICAgWCA9IFgudmlldyh0b3JjaC5pbnQ4KQogICAgaWYgWS5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFkgPSBZLnZpZXcodG9yY2guaW50OCkKCiAgICAjIGNoZWNrIGNvbXBhdGliaWxpdHk6CiAgICBhc3NlcnQgWC5kdHlwZSA9PSBZLmR0eXBlCgogICAgTSA9IFguc2hhcGVbMF0KICAgIE4gPSBYLnNoYXBlWzFdCgogICAgc3RyaWRlX3htID0gWC5zdHJpZGUoMCkKICAgIHN0cmlkZV94biA9IFguc3RyaWRlKDEpCgogICAgc3RyaWRlX3ltID0gWS5zdHJpZGUoLTIpCiAgICBzdHJpZGVfeW4gPSBZLnN0cmlkZSgtMSkKCiAgICBncmlkID0gKChNICsgQkxPQ0tfTSAtIDEpIC8vIEJMT0NLX00sIChOICsgQkxPQ0tfTiAtIDEpIC8vIEJMT0NLX04pCiAgICB0cmFuc3Bvc2Vfa2VybmVsW2dyaWRdKAogICAgICAgIE0sCiAgICAgICAgTiwKICAgICAgICBCTE9DS19NLAogICAgICAgIEJMT0NLX04sCiAgICAgICAgWCwKICAgICAgICBzdHJpZGVfeG0sCiAgICAgICAgc3RyaWRlX3huLAogICAgICAgIFksCiAgICAgICAgc3RyaWRlX3ltLAogICAgICAgIHN0cmlkZV95biwKICAgICAgICBJRFg9SURYLAogICAgICAgIG51bV93YXJwcz1udW1fd2FycHMsCiAgICApCgoKdzE6IHRvcmNoLlRlbnNvciA9IHRvcmNoLmVtcHR5KCgzMiwgNDA5NiwgNzE2OCksIGR0eXBlPXRvcmNoLmZsb2F0MTYsIGRldmljZT0iY3VkYSIpCncyOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDcxNjgsIDIwNDgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQoKCkB0b3JjaC5ub19ncmFkKCkKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICAiIiIKICAgIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBEZWVwU2Vlay1zdHlsZSBNaXh0dXJlIG9mIEV4cGVydHMgdXNpbmcgUHlUb3JjaC4KICAgIAogICAgQXJnczoKICAgICAgICBkYXRhOiBUdXBsZSBvZiAoaW5wdXQ6IHRvcmNoLlRlbnNvciwgd2VpZ2h0czogRGljdFtzdHIsIHRvcmNoLlRlbnNvcl0sIGNvbmZpZzogRGljdCkKICAgICAgICAgICAgLSBpbnB1dDogSW5wdXQgdGVuc29yIG9mIHNoYXBlIFtiYXRjaF9zaXplLCBzZXFfbGVuLCBoaWRkZW5fZGltXQogICAgICAgICAgICAtIHdlaWdodHM6IERpY3Rpb25hcnkgY29udGFpbmluZyBtb2RlbCB3ZWlnaHRzCiAgICAgICAgICAgIC0gY29uZmlnOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgIAogICAgUmV0dXJuczoKICAgICAgICBUdXBsZSBjb250YWluaW5nOgogICAgICAgICAgICAtIG91dHB1dDogUHJvY2Vzc2VkIHRlbnNvciBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgZF9tb2RlbF0KICAgICAgICAgICAgLSBhdXhfZGF0YTogRGljdGlvbmFyeSB3aXRoIGF1eGlsaWFyeSBkYXRhCiAgICAiIiIKICAgIHRpbWVfbGlzdCA9IFtdCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHByZXBhcmUgd2VpZ2h0CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW5wdXRfdGVuc29yOiB0b3JjaC5UZW5zb3IKICAgIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdCiAgICBjb25maWc6IERpY3Rbc3RyLCBpbnRdCiAgICBpbnB1dF90ZW5zb3IsIHdlaWdodHMsIGNvbmZpZyA9IGRhdGEKCiAgICBNID0gY29uZmlnWyJiYXRjaF9zaXplIl0gKiBjb25maWdbInNlcV9sZW4iXQogICAgTiA9IGNvbmZpZ1siZF9leHBlcnQiXQogICAgSyA9IGNvbmZpZ1siZF9oaWRkZW4iXQoKICAgIGZvciBpIGluIHJhbmdlKGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdKToKICAgICAgICBmb3IgaiBpbiByYW5nZSgyKToKICAgICAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0ue2p9LndlaWdodCJdLlQsIHcxLCBpICogMiArIGopCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgaW52b2tlX3RyYW5zcG9zZSh3ZWlnaHRzW2YiZXhwZXJ0cy57aX0uMi53ZWlnaHQiXS5ULCB3MiwgaSkKCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUxID0gdG9yY2gub25lcygoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4gKiAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9aW5wdXRfdGVuc29yLmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT1pbnB1dF90ZW5zb3IuZHR5cGUpCiAgICBpbnRlcm1lZGlhdGVfY2FjaGUyID0gdG9yY2guZW1wdHkoKE0gKiBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgTiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMyA9IHRvcmNoLmVtcHR5KChNLCBjb25maWdbIm5fZXhwZXJ0c19wZXJfdG9rZW4iXSwgSyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBtb2UgZ2F0ZQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGV4cGVydF9pbmRpY2VzLCBleHBlcnRfc2NvcmVzID0gbW9lX2dhdGVfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydyb3V0ZXIud2VpZ2h0J10sCiAgICAgICAgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHNoYXJlZF9leHBlcnRzCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc2hhcmVkX291dHB1dCA9IG1vZV9leHBlcnRfa2VybmVsKAogICAgICAgIGlucHV0X3RlbnNvciwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4wLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjEud2VpZ2h0J10sCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMi53ZWlnaHQnXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGFsaWduCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgc29ydGVkX3Rva2VuX2lkcywgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCA9IGludm9rZV9tb2VfYWxpZ25fYmxvY2tfc2l6ZSgKICAgICAgICBleHBlcnRfaW5kaWNlcywgY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0sIEJMT0NLX1NJWkVfTSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzEKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnB1dF90ZW5zb3IudmlldygtMSwgSyksIHcxLCBpbnRlcm1lZGlhdGVfY2FjaGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X3Njb3JlcywgZXhwZXJ0X2luZGljZXMsIHNvcnRlZF90b2tlbl9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkLCBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pbmRpY2VzLnNoYXBlWzJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaWx1X2FuZF9tdWwKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUxLnZpZXcoLTEsIDIgKiBOKSwgaW50ZXJtZWRpYXRlX2NhY2hlMikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgZnVzZWRfbW9lXzIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChpbnRlcm1lZGlhdGVfY2FjaGUyLCB3MiwgaW50ZXJtZWRpYXRlX2NhY2hlMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgVHJ1ZSwgMSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgc3VtCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgcm91dGVkX291dHB1dCA9IHRvcmNoLnN1bSgKICAgICAgICBpbnRlcm1lZGlhdGVfY2FjaGUzLnZpZXcoKmludGVybWVkaWF0ZV9jYWNoZTMuc2hhcGUpLCBkaW09MSkudmlldyhjb25maWdbImJhdGNoX3NpemUiXSwgY29uZmlnWyJzZXFfbGVuIl0sIEspCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGFkZAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIG91dHB1dCA9IHJvdXRlZF9vdXRwdXQgKyBzaGFyZWRfb3V0cHV0CgogICAgcmV0dXJuIG91dHB1dAo=
No newline at end of file
+ aW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIFR1cGxlLCBMaXN0LCBPcHRpb25hbAoKaW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKaW1wb3J0IHRyaXRvbgppbXBvcnQgdHJpdG9uLmxhbmd1YWdlIGFzIHRsCgpmcm9tIGV2YWwgaW1wb3J0IF9jbG9uZV9kYXRhCmZyb20gdGFzayBpbXBvcnQgaW5wdXRfdCwgb3V0cHV0X3QKZnJvbSB1dGlscyBpbXBvcnQgdmVyYm9zZV9hbGxjbG9zZQpmcm9tIHJlZmVyZW5jZSBpbXBvcnQgZ2VuZXJhdGVfaW5wdXQsIHJlZl9rZXJuZWwKCgpCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciA9IDI1NgpCTE9DS19TSVpFX0s6IHRsLmNvbnN0ZXhwciA9IDY0CkdST1VQX1NJWkVfTTogdGwuY29uc3RleHByID0gOAoKCiMgbWF0bXVsCgojIEB0cml0b24uaml0CiMgZGVmIG1hdG11bF9rZXJuZWwoCiMgICAgICAgICAjIFBvaW50ZXJzIHRvIG1hdHJpY2VzCiMgICAgICAgICBhX3B0ciwgYl9wdHIsIGNfcHRyLAojICAgICAgICAgIyBNYXRyaXggZGltZW5zaW9ucwojICAgICAgICAgTSwgTiwgSywKIyAgICAgICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQojICAgICAgICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAojICAgICAgICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgojICAgICAgICAgc3RyaWRlX2FtLCBzdHJpZGVfYWssICAjCiMgICAgICAgICBzdHJpZGVfYmssIHN0cmlkZV9ibiwgICMKIyAgICAgICAgIHN0cmlkZV9jbSwgc3RyaWRlX2NuLAojICAgICAgICAgIyBNZXRhLXBhcmFtZXRlcnMKIyAgICAgICAgIEJMT0NLX1NJWkVfTTogdGwuY29uc3RleHByLCBCTE9DS19TSVpFX046IHRsLmNvbnN0ZXhwciwgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsICAjCiMgICAgICAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwgICMKIyAgICAgICAgIEFDVElWQVRJT046IHRsLmNvbnN0ZXhwciAgIwojICk6CiMgICAgICIiIktlcm5lbCBmb3IgY29tcHV0aW5nIHRoZSBtYXRtdWwgQyA9IEEgeCBCLgojICAgICBBIGhhcyBzaGFwZSAoTSwgSyksIEIgaGFzIHNoYXBlIChLLCBOKSBhbmQgQyBoYXMgc2hhcGUgKE0sIE4pCiMgICAgICIiIgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgTWFwIHByb2dyYW0gaWRzIGBwaWRgIHRvIHRoZSBibG9jayBvZiBDIGl0IHNob3VsZCBjb21wdXRlLgojICAgICAjIFRoaXMgaXMgZG9uZSBpbiBhIGdyb3VwZWQgb3JkZXJpbmcgdG8gcHJvbW90ZSBMMiBkYXRhIHJldXNlLgojICAgICAjIFNlZSBhYm92ZSBgTDIgQ2FjaGUgT3B0aW1pemF0aW9uc2Agc2VjdGlvbiBmb3IgZGV0YWlscy4KIyAgICAgcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiMgICAgIG51bV9waWRfbSA9IHRsLmNkaXYoTSwgQkxPQ0tfU0laRV9NKQojICAgICBudW1fcGlkX24gPSB0bC5jZGl2KE4sIEJMT0NLX1NJWkVfTikKIyAgICAgbnVtX3BpZF9pbl9ncm91cCA9IEdST1VQX1NJWkVfTSAqIG51bV9waWRfbgojICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiMgICAgIGZpcnN0X3BpZF9tID0gZ3JvdXBfaWQgKiBHUk9VUF9TSVpFX00KIyAgICAgZ3JvdXBfc2l6ZV9tID0gbWluKG51bV9waWRfbSAtIGZpcnN0X3BpZF9tLCBHUk9VUF9TSVpFX00pCiMgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAoKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApICUgZ3JvdXBfc2l6ZV9tKQojICAgICBwaWRfbiA9IChwaWQgJSBudW1fcGlkX2luX2dyb3VwKSAvLyBncm91cF9zaXplX20KCiMgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIENyZWF0ZSBwb2ludGVycyBmb3IgdGhlIGZpcnN0IGJsb2NrcyBvZiBBIGFuZCBCLgojICAgICAjIFdlIHdpbGwgYWR2YW5jZSB0aGlzIHBvaW50ZXIgYXMgd2UgbW92ZSBpbiB0aGUgSyBkaXJlY3Rpb24KIyAgICAgIyBhbmQgYWNjdW11bGF0ZQojICAgICAjIGBhX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9LXSBwb2ludGVycwojICAgICAjIGBiX3B0cnNgIGlzIGEgYmxvY2sgb2YgW0JMT0NLX1NJWkVfSywgQkxPQ0tfU0laRV9OXSBwb2ludGVycwojICAgICAjIFNlZSBhYm92ZSBgUG9pbnRlciBBcml0aG1ldGljYCBzZWN0aW9uIGZvciBkZXRhaWxzCiMgICAgIG9mZnNfYW0gPSAocGlkX20gKiBCTE9DS19TSVpFX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9NKSkgJSBNCiMgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiMgICAgIG9mZnNfayA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFX0spCiMgICAgIGFfcHRycyA9IGFfcHRyICsgKG9mZnNfYW1bOiwgTm9uZV0gKiBzdHJpZGVfYW0gKyBvZmZzX2tbTm9uZSwgOl0gKiBzdHJpZGVfYWspCiMgICAgIGJfcHRycyA9IGJfcHRyICsgKG9mZnNfa1s6LCBOb25lXSAqIHN0cmlkZV9iayArIG9mZnNfYm5bTm9uZSwgOl0gKiBzdHJpZGVfYm4pCgojICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgICAgICMgSXRlcmF0ZSB0byBjb21wdXRlIGEgYmxvY2sgb2YgdGhlIEMgbWF0cml4LgojICAgICAjIFdlIGFjY3VtdWxhdGUgaW50byBhIGBbQkxPQ0tfU0laRV9NLCBCTE9DS19TSVpFX05dYCBibG9jawojICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiMgICAgICMgYGFjY3VtdWxhdG9yYCB3aWxsIGJlIGNvbnZlcnRlZCBiYWNrIHRvIGZwMTYgYWZ0ZXIgdGhlIGxvb3AuCiMgICAgIGFjY3VtdWxhdG9yID0gdGwuemVyb3MoKEJMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OKSwgZHR5cGU9dGwuZmxvYXQzMikKIyAgICAgZm9yIGsgaW4gcmFuZ2UoMCwgdGwuY2RpdihLLCBCTE9DS19TSVpFX0spKToKIyAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgIyBJZiBpdCBpcyBvdXQgb2YgYm91bmRzLCBzZXQgaXQgdG8gMC4KIyAgICAgICAgIGEgPSB0bC5sb2FkKGFfcHRycywgbWFzaz1vZmZzX2tbTm9uZSwgOl0gPCBLIC0gayAqIEJMT0NLX1NJWkVfSywgb3RoZXI9MC4wKQojICAgICAgICAgYiA9IHRsLmxvYWQoYl9wdHJzLCBtYXNrPW9mZnNfa1s6LCBOb25lXSA8IEsgLSBrICogQkxPQ0tfU0laRV9LLCBvdGhlcj0wLjApCiMgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgojICAgICAgICAgYWNjdW11bGF0b3IgPSB0bC5kb3QoYSwgYiwgYWNjdW11bGF0b3IpCiMgICAgICAgICAjIEFkdmFuY2UgdGhlIHB0cnMgdG8gdGhlIG5leHQgSyBibG9jay4KIyAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKIyAgICAgICAgIGJfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYmsKIyAgICAgIyBZb3UgY2FuIGZ1c2UgYXJiaXRyYXJ5IGFjdGl2YXRpb24gZnVuY3Rpb25zIGhlcmUKIyAgICAgIyB3aGlsZSB0aGUgYWNjdW11bGF0b3IgaXMgc3RpbGwgaW4gRlAzMiEKIyAgICAgaWYgQUNUSVZBVElPTiA9PSAibGVha3lfcmVsdSI6CiMgICAgICAgICBhY2N1bXVsYXRvciA9IGxlYWt5X3JlbHUoYWNjdW11bGF0b3IpCiMgICAgIGMgPSBhY2N1bXVsYXRvci50byh0bC5mbG9hdDE2KQoKIyAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICAgICAjIFdyaXRlIGJhY2sgdGhlIGJsb2NrIG9mIHRoZSBvdXRwdXQgbWF0cml4IEMgd2l0aCBtYXNrcy4KIyAgICAgb2Zmc19jbSA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKIyAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKIyAgICAgY19wdHJzID0gY19wdHIgKyBzdHJpZGVfY20gKiBvZmZzX2NtWzosIE5vbmVdICsgc3RyaWRlX2NuICogb2Zmc19jbltOb25lLCA6XQojICAgICBjX21hc2sgPSAob2Zmc19jbVs6LCBOb25lXSA8IE0pICYgKG9mZnNfY25bTm9uZSwgOl0gPCBOKQojICAgICB0bC5zdG9yZShjX3B0cnMsIGMsIG1hc2s9Y19tYXNrKQoKCiMgZGVmIG1hdG11bChhLCBiLCBhY3RpdmF0aW9uPSIiKToKIyAgICAgIyBDaGVjayBjb25zdHJhaW50cy4KIyAgICAgSyA9IGEuc2l6ZSgtMSkKIyAgICAgTSA9IGEubnVtZWwoKSAvLyBLCiMgICAgIE4gPSBiLnNpemUoMSkKIyAgICAgYXNzZXJ0IGEuaXNfY29udGlndW91cygpLCAiTWF0cml4IEEgbXVzdCBiZSBjb250aWd1b3VzIgojICAgICBhc3NlcnQgSyA9PSBiLnNoYXBlWzBdLCAiSW5jb21wYXRpYmxlIGRpbWVuc2lvbnMiCiMgICAgICMgQWxsb2NhdGVzIG91dHB1dC4KIyAgICAgYyA9IHRvcmNoLmVtcHR5KChNLCBOKSwgZGV2aWNlPWEuZGV2aWNlLCBkdHlwZT10b3JjaC5mbG9hdDE2KQojICAgICAjIDFEIGxhdW5jaCBrZXJuZWwgd2hlcmUgZWFjaCBibG9jayBnZXRzIGl0cyBvd24gcHJvZ3JhbS4KIyAgICAgZ3JpZCA9IGxhbWJkYSBNRVRBOiAodHJpdG9uLmNkaXYoTSwgTUVUQVsnQkxPQ0tfU0laRV9NJ10pICogdHJpdG9uLmNkaXYoTiwgTUVUQVsnQkxPQ0tfU0laRV9OJ10pLCApCiMgICAgIG1hdG11bF9rZXJuZWxbZ3JpZF0oCiMgICAgICAgICBhLCBiLCBjLCAgIwojICAgICAgICAgTSwgTiwgSywgICMKIyAgICAgICAgIEssIDEsICAjCiMgICAgICAgICBiLnN0cmlkZSgwKSwgYi5zdHJpZGUoMSksICAjCiMgICAgICAgICBOLCAxLCAgIwojICAgICAgICAgQkxPQ0tfU0laRV9NPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9OPTY0LAojICAgICAgICAgQkxPQ0tfU0laRV9LPTEyOCwKIyAgICAgICAgIEdST1VQX1NJWkVfTT00LAojICAgICAgICAgQUNUSVZBVElPTj1hY3RpdmF0aW9uICAjCiMgICAgICkKIyAgICAgcmV0dXJuIGMKCgojIEB0b3JjaC5ub19ncmFkKCkKIyBkZWYgbW9lX2V4cGVydF9rZXJuZWwoeDogdG9yY2guVGVuc29yLCB3X2dhdGU6IHRvcmNoLlRlbnNvciwgd191cDogdG9yY2guVGVuc29yLCB3X2Rvd246IHRvcmNoLlRlbnNvcik6CiMgICAgIHhfZ2F0ZSA9IG1hdG11bCh4LCB3X2dhdGUpCiMgICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiMgICAgIHhfdXAgPSBtYXRtdWwoeCwgd191cCkKIyAgICAgb3V0ID0geF9nYXRlICogeF91cAojICAgICBvdXQgPSBtYXRtdWwob3V0LCB3X2Rvd24pCiMgICAgIHJldHVybiBvdXQKCiMgbW9lIGdhdGUKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9nYXRlX2tlcm5lbCh4OiB0b3JjaC5UZW5zb3IsIHdfZzogdG9yY2guVGVuc29yLCB0b3BrOiBpbnQpOgogICAgbG9naXRzID0gRi5saW5lYXIoeCwgd19nKQogICAgc2NvcmVzID0gbG9naXRzLnNvZnRtYXgoZGltPS0xKQogICAgdG9wa19zY29yZXMsIHRvcGtfaW5kaWNlcyA9IHRvcmNoLnRvcGsoc2NvcmVzLCBrPXRvcGssIGRpbT0tMSwgc29ydGVkPUZhbHNlKQoKICAgIHJldHVybiB0b3BrX2luZGljZXMsIHRvcGtfc2NvcmVzCgoKIyBtb2UgYWxpZ24KCmRlZiBjZWlsX2RpdihhLCBiKToKICAgIHJldHVybiAoYSArIGIgLSAxKSAvLyBiCgoKQHRyaXRvbi5qaXQKZGVmIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMSgKICAgIHRvcGtfaWRzX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAoKICAgIG9mZl9jID0gKHBpZCArIDEpICogbnVtX2V4cGVydHMKCiAgICBmb3IgaSBpbiByYW5nZSh0b2tlbnNfcGVyX3RocmVhZCk6CiAgICAgICAgaWYgc3RhcnRfaWR4ICsgaSA8IG51bWVsOgogICAgICAgICAgICBpZHggPSB0bC5sb2FkKHRvcGtfaWRzX3B0ciArIHN0YXJ0X2lkeCArIGkpCiAgICAgICAgICAgIHRva2VuX2NudCA9IHRsLmxvYWQodG9rZW5zX2NudHNfcHRyICsgb2ZmX2MgKyBpZHgpCiAgICAgICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jICsgaWR4LCB0b2tlbl9jbnQgKyAxKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTIoCiAgICB0b2tlbnNfY250c19wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAopOgogICAgcGlkID0gdGwucHJvZ3JhbV9pZCgwKQoKICAgIGxhc3RfY250ID0gMAogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIGkgKiBudW1fZXhwZXJ0cyArIHBpZCkKICAgICAgICBsYXN0X2NudCA9IGxhc3RfY250ICsgdG9rZW5fY250CiAgICAgICAgdGwuc3RvcmUodG9rZW5zX2NudHNfcHRyICsgaSAqIG51bV9leHBlcnRzICsgcGlkLCBsYXN0X2NudCkKCgpAdHJpdG9uLmppdApkZWYgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UzKAogICAgdG90YWxfdG9rZW5zX3Bvc3RfcGFkX3B0ciwKICAgIHRva2Vuc19jbnRzX3B0ciwKICAgIGN1bXN1bV9wdHIsCiAgICBudW1fZXhwZXJ0czogdGwuY29uc3RleHByLAogICAgYmxvY2tfc2l6ZTogdGwuY29uc3RleHByLAopOgogICAgbGFzdF9jdW1zdW0gPSAwCiAgICBvZmZfY250ID0gbnVtX2V4cGVydHMgKiBudW1fZXhwZXJ0cwogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtX2V4cGVydHMgKyAxKToKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl9jbnQgKyBpIC0gMSkKICAgICAgICBsYXN0X2N1bXN1bSA9IGxhc3RfY3Vtc3VtICsgdGwuY2Rpdih0b2tlbl9jbnQsIGJsb2NrX3NpemUpICogYmxvY2tfc2l6ZQogICAgICAgIHRsLnN0b3JlKGN1bXN1bV9wdHIgKyBpLCBsYXN0X2N1bXN1bSkKICAgIHRsLnN0b3JlKHRvdGFsX3Rva2Vuc19wb3N0X3BhZF9wdHIsIGxhc3RfY3Vtc3VtKQoKCkB0cml0b24uaml0CmRlZiBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQoCiAgICB0b3BrX2lkc19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgdG9rZW5zX2NudHNfcHRyLAogICAgY3Vtc3VtX3B0ciwKICAgIG51bV9leHBlcnRzOiB0bC5jb25zdGV4cHIsCiAgICBibG9ja19zaXplOiB0bC5jb25zdGV4cHIsCiAgICBudW1lbDogdGwuY29uc3RleHByLAogICAgdG9rZW5zX3Blcl90aHJlYWQ6IHRsLmNvbnN0ZXhwciwKKToKICAgIHBpZCA9IHRsLnByb2dyYW1faWQoMCkKICAgIHN0YXJ0X2lkeCA9IHRsLmxvYWQoY3Vtc3VtX3B0ciArIHBpZCkKICAgIGVuZF9pZHggPSB0bC5sb2FkKGN1bXN1bV9wdHIgKyBwaWQgKyAxKQoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgZW5kX2lkeCwgYmxvY2tfc2l6ZSk6CiAgICAgICAgdGwuc3RvcmUoZXhwZXJ0X2lkc19wdHIgKyBpIC8vIGJsb2NrX3NpemUsIHBpZCkKCiAgICBzdGFydF9pZHggPSBwaWQgKiB0b2tlbnNfcGVyX3RocmVhZAogICAgb2ZmX3QgPSBwaWQgKiBudW1fZXhwZXJ0cwoKICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0X2lkeCwgdGwubWluaW11bShzdGFydF9pZHggKyB0b2tlbnNfcGVyX3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lbCkpOgogICAgICAgIGV4cGVydF9pZCA9IHRsLmxvYWQodG9wa19pZHNfcHRyICsgaSkKICAgICAgICB0b2tlbl9jbnQgPSB0bC5sb2FkKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkKQogICAgICAgIHJhbmtfcG9zdF9wYWQgPSB0b2tlbl9jbnQgKyB0bC5sb2FkKGN1bXN1bV9wdHIgKyBleHBlcnRfaWQpCiAgICAgICAgdGwuc3RvcmUoc29ydGVkX3Rva2VuX2lkc19wdHIgKyByYW5rX3Bvc3RfcGFkLCBpKQogICAgICAgIHRsLnN0b3JlKHRva2Vuc19jbnRzX3B0ciArIG9mZl90ICsgZXhwZXJ0X2lkLCB0b2tlbl9jbnQgKyAxKQoKCmRlZiBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICB0b3BrX2lkczogdG9yY2guVGVuc29yLAogICAgbnVtX2V4cGVydHM6IGludCwKICAgIGJsb2NrX3NpemU6IGludCwKKSAtPiBOb25lOgogICAgIiIiCiAgICAtIHRvcGtfaWRzOiBBIHRlbnNvciBvZiBzaGFwZSBbdG90YWxfdG9rZW5zLCB0b3Bfa10gcmVwcmVzZW50aW5nIHRoZQogICAgICAgIHRvcC1rIGV4cGVydCBpbmRpY2VzIGZvciBlYWNoIHRva2VuLgogICAgLSBibG9ja19zaXplOiBUaGUgYmxvY2sgc2l6ZSB1c2VkIGluIGJsb2NrIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gbnVtX2V4cGVydHM6IFRoZSB0b3RhbCBudW1iZXIgb2YgZXhwZXJ0cy4KCiAgICBSZXR1cm5zOgogICAgLSBzb3J0ZWRfdG9rZW5faWRzOiBBIHRlbnNvciBjb250YWluaW5nIHRoZSBzb3J0ZWQgdG9rZW4gaW5kaWNlcyBhY2NvcmRpbmcKICAgICAgICB0byB0aGVpciBhbGxvY2F0ZWQgZXhwZXJ0LgogICAgLSBleHBlcnRfaWRzOiBBIHRlbnNvciBpbmRpY2F0aW5nIHRoZSBhc3NpZ25lZCBleHBlcnQgaW5kZXggZm9yIGVhY2ggYmxvY2suCiAgICAtIG51bV90b2tlbnNfcG9zdF9wYWRkZWQ6IFRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGFmdGVyIHBhZGRpbmcsCiAgICAgICAgZW5zdXJpbmcgZGl2aXNpYmlsaXR5IGJ5IGJsb2NrX3NpemUuCgogICAgVGhpcyBmdW5jdGlvbiBwYWRzIHRoZSBudW1iZXIgb2YgdG9rZW5zIHRoYXQgZWFjaCBleHBlcnQgbmVlZHMgdG8gcHJvY2VzcwogICAgc28gdGhhdCBpdCBpcyBkaXZpc2libGUgYnkgYmxvY2tfc2l6ZS4KICAgIFBhZGRpbmcgZW5zdXJlcyB0aGF0IGR1cmluZyBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24sIHRoZSBkaW1lbnNpb25zCiAgICBhbGlnbiBjb3JyZWN0bHkuCgogICAgRXhhbXBsZToKICAgIEdpdmVuIHRvcGtfaWRzID0gW1syLCAzLCA0XSwgWzEsIDIsIDRdLCBbMSwgMywgNF0sIFsxLCAyLCAzXV0sCiAgICBibG9ja19zaXplID0gNCwgYW5kIG51bV9leHBlcnRzID0gNDoKICAgIC0gV2UgaW5pdGlhbGx5IGhhdmUgMTIgdG9rZW5zIChhZnRlciByZXBlYXRpbmcgJ3RvcF9rJyB0aW1lcykgYW5kIDQgZXhwZXJ0cywKICAgICAgICB3aXRoIGVhY2ggZXhwZXJ0IG5lZWRpbmcgdG8gcHJvY2VzcyAzIHRva2Vucy4KICAgIC0gQXMgYmxvY2tfc2l6ZSBpcyA0LCB3ZSBwYWQgMSB0b2tlbiBmb3IgZWFjaCBleHBlcnQuCiAgICAtIEZpcnN0LCBmbGF0dGVuIHRvcGtfaWRzIHRvIFsyLCAzLCA0LCAxLCAyLCA0LCAxLCAzLCA0LCAxLCAyLCAzXS4KICAgIC0gVGhlbiBhcHBlbmQgcGFkZGluZyB0b2tlbnMgWzEyLCAxMiwgMTIsIDEyXSBmb3IgZWFjaCBibG9jay4KICAgIC0gQWZ0ZXIgc29ydGluZyBieSBleHBlcnQgaW5kZXgsIHdlIG9idGFpbiB0b2tlbl9pZHMKICAgICAgICBbMywgNiwgOSwgMTIsIDAsIDQsIDEwLCAxMiwgMSwgNywgMTEsIDEyLCAyLCA1LCA4LCAxMl0uCiAgICAgICAgVG9rZW5zIDEyIGFyZSBub24tZXhpc3RlbnQgKHBhZGRpbmcpIGFuZCBhcmUgaWdub3JlZCBpbgogICAgICAgIHRoZSBzdWJzZXF1ZW50IG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4KICAgIC0gVGhlIHBhZGRpbmcgZW5zdXJlcyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzIG5vdyBkaXZpc2libGUKICAgICAgICBieSBibG9ja19zaXplIGZvciBwcm9wZXIgYmxvY2sgbWF0cml4IG9wZXJhdGlvbnMuCiAgICAiIiIKICAgIG1heF9udW1fdG9rZW5zX3BhZGRlZCA9IHRvcGtfaWRzLm51bWVsKCkgKyBudW1fZXhwZXJ0cyAqIChibG9ja19zaXplIC0gMSkKICAgIHNvcnRlZF9pZHMgPSB0b3JjaC5lbXB0eSgobWF4X251bV90b2tlbnNfcGFkZGVkLCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT10b3BrX2lkcy5kZXZpY2UpCiAgICBzb3J0ZWRfaWRzLmZpbGxfKHRvcGtfaWRzLm51bWVsKCkpCiAgICBtYXhfbnVtX21fYmxvY2tzID0gdHJpdG9uLmNkaXYobWF4X251bV90b2tlbnNfcGFkZGVkLCBibG9ja19zaXplKQogICAgIyBFeHBlcnQgaWRzIG11c3QgYmUgemVyb2VkIG91dCB0byBwcmV2ZW50IGluZGV4IG91dCBvZiBib3VuZHMgZXJyb3Igd2hpbGUKICAgICMgbWFwcGluZyBnbG9iYWwgZXhwZXJ0IGlkcyB0byBsb2NhbCBleHBlcnQgaWRzIGluIGV4cGVydCBwYXJhbGxlbGlzbS4KICAgIGV4cGVydF9pZHMgPSB0b3JjaC56ZXJvcygobWF4X251bV9tX2Jsb2NrcywgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgbnVtX3Rva2Vuc19wb3N0X3BhZCA9IHRvcmNoLmVtcHR5KCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10b3JjaC5pbnQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQoKICAgIG51bWVsID0gdG9wa19pZHMubnVtZWwoKQogICAgZ3JpZCA9IChudW1fZXhwZXJ0cywgKQogICAgdG9rZW5zX2NudHMgPSB0b3JjaC56ZXJvcygobnVtX2V4cGVydHMgKyAxLCBudW1fZXhwZXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U9dG9wa19pZHMuZGV2aWNlKQogICAgY3Vtc3VtID0gdG9yY2guemVyb3MoKG51bV9leHBlcnRzICsgMSwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPXRvcmNoLmludDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPXRvcGtfaWRzLmRldmljZSkKICAgIHRva2Vuc19wZXJfdGhyZWFkID0gY2VpbF9kaXYobnVtZWwsIG51bV9leHBlcnRzKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UxW2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHRva2Vuc19jbnRzLAogICAgICAgIG51bV9leHBlcnRzLAogICAgICAgIG51bWVsLAogICAgICAgIHRva2Vuc19wZXJfdGhyZWFkLAogICAgKQogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgZW5kID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgIyBwcmludChmIm1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlMToge2VuZCAtIHN0YXJ0fSIpCgogICAgIyB0b3JjaC5jdWRhLnN5bmNocm9uaXplKCkKICAgICMgc3RhcnQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICBtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTJbZ3JpZF0oCiAgICAgICAgdG9rZW5zX2NudHMsCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICApCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBlbmQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjIHByaW50KGYibW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2UyOiB7ZW5kIC0gc3RhcnR9IikKCiAgICAjIHRvcmNoLmN1ZGEuc3luY2hyb25pemUoKQogICAgIyBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgIG1vZV9hbGlnbl9ibG9ja19zaXplX3N0YWdlM1soMSwgKV0oCiAgICAgICAgbnVtX3Rva2Vuc19wb3N0X3BhZCwKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTM6IHtlbmQgLSBzdGFydH0iKQoKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIHN0YXJ0ID0gdGltZS5wZXJmX2NvdW50ZXJfbnMoKQogICAgbW9lX2FsaWduX2Jsb2NrX3NpemVfc3RhZ2U0W2dyaWRdKAogICAgICAgIHRvcGtfaWRzLAogICAgICAgIHNvcnRlZF9pZHMsCiAgICAgICAgZXhwZXJ0X2lkcywKICAgICAgICB0b2tlbnNfY250cywKICAgICAgICBjdW1zdW0sCiAgICAgICAgbnVtX2V4cGVydHMsCiAgICAgICAgYmxvY2tfc2l6ZSwKICAgICAgICBudW1lbCwKICAgICAgICB0b2tlbnNfcGVyX3RocmVhZCwKICAgICkKICAgICMgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjIGVuZCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKICAgICMgcHJpbnQoZiJtb2VfYWxpZ25fYmxvY2tfc2l6ZV9zdGFnZTQ6IHtlbmQgLSBzdGFydH0iKQoKICAgIHJldHVybiBzb3J0ZWRfaWRzLCBleHBlcnRfaWRzLCBudW1fdG9rZW5zX3Bvc3RfcGFkCgoKIyBzaWx1IGFuZCBtdWwKCgojIEB0cml0b24uaml0CiMgZGVmIHNpbHVfYW5kX211bF9rZXJuZWwoaW5wdXRfcHRyLCBvdXRwdXRfcHRyLCBuX2VsZW1lbnRzLCBCTE9DS19TSVpFOiB0bC5jb25zdGV4cHIpOgojICAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKIyAgICAgYV9ibG9ja19zdGFydCA9IHBpZCAqIEJMT0NLX1NJWkUKIyAgICAgYl9ibG9ja19zdGFydCA9IGFfYmxvY2tfc3RhcnQgKyBuX2VsZW1lbnRzCiMgICAgIGFfb2Zmc2V0cyA9IGFfYmxvY2tfc3RhcnQgKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRSkKIyAgICAgYl9vZmZzZXRzID0gYl9ibG9ja19zdGFydCArIHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQojICAgICBhX21hc2sgPSBhX29mZnNldHMgPCBuX2VsZW1lbnRzCiMgICAgIGJfbWFzayA9IGJfb2Zmc2V0cyA8IG5fZWxlbWVudHMgKiAyCgojICAgICBhID0gdGwubG9hZChpbnB1dF9wdHIgKyBhX29mZnNldHMsIG1hc2s9YV9tYXNrKQojICAgICBiID0gdGwubG9hZChpbnB1dF9wdHIgKyBiX29mZnNldHMsIG1hc2s9Yl9tYXNrKQojICAgICBvdXRwdXQgPSBhICogKDEgLyAoMSArIHRsLmV4cCgtYS50byh0bC5mbG9hdDMyKSkpKSAqIGIKIyAgICAgdGwuc3RvcmUob3V0cHV0X3B0ciArIGFfb2Zmc2V0cywgb3V0cHV0LCBtYXNrPWFfbWFzaykKCiMgZ3JpZCA9ICh0cml0b24uY2RpdihuX2VsZW1lbnRzLCBCTE9DS19TSVpFKSwpCiMgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dF90ZW5zb3IsIG91dHB1dF90ZW5zb3IsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkUpCgpAdHJpdG9uLmppdApkZWYgc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dF9wdHIsIG91dHB1dF9wdHIsIG5fZWxlbWVudHMsIEJMT0NLX1NJWkU6IHRsLmNvbnN0ZXhwcik6CiAgICBwaWQgPSB0bC5wcm9ncmFtX2lkKGF4aXM9MCkKICAgIGFfcm93X3B0ciA9IGlucHV0X3B0ciArIHBpZCAqIG5fZWxlbWVudHMgKiAyCiAgICBiX3Jvd19wdHIgPSBhX3Jvd19wdHIgKyBuX2VsZW1lbnRzCiAgICBjX3Jvd19wdHIgPSBvdXRwdXRfcHRyICsgcGlkICogbl9lbGVtZW50cwogICAgb2ZmcyA9IHRsLmFyYW5nZSgwLCBCTE9DS19TSVpFKQogICAgbWFzayA9IG9mZnMgPCBuX2VsZW1lbnRzCgogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbl9lbGVtZW50cywgQkxPQ0tfU0laRSk6CiAgICAgICAgb2ZmcyA9IG9mZnMgKyBpCiAgICAgICAgYSA9IHRsLmxvYWQoYV9yb3dfcHRyICsgb2ZmcywgbWFzaz1tYXNrKQogICAgICAgIGIgPSB0bC5sb2FkKGJfcm93X3B0ciArIG9mZnMsIG1hc2s9bWFzaykKICAgICAgICBjID0gYSAqICgxIC8gKDEgKyB0bC5leHAoLWEudG8odGwuZmxvYXQzMikpKSkgKiBiCiAgICAgICAgdGwuc3RvcmUoY19yb3dfcHRyICsgb2ZmcywgYywgbWFzaz1tYXNrKQoKCmRlZiBpbnZva2Vfc2lsdV9hbmRfbXVsX2tlcm5lbChpbnB1dDogdG9yY2guVGVuc29yLCBvdXRwdXQ6IHRvcmNoLlRlbnNvcik6CiAgICBhc3NlcnQgaW5wdXQuaXNfY29udGlndW91cygpCiAgICBhc3NlcnQgb3V0cHV0LmlzX2NvbnRpZ3VvdXMoKQogICAgYXNzZXJ0IGxlbihpbnB1dC5zaGFwZSkgPiAxCiAgICBhc3NlcnQgbGVuKGlucHV0LnNoYXBlKSA9PSBsZW4ob3V0cHV0LnNoYXBlKQogICAgYXNzZXJ0IGlucHV0LnNoYXBlWy0xXSA9PSBvdXRwdXQuc2hhcGVbLTFdICogMgogICAgYXNzZXJ0IGlucHV0Lm51bWVsKCkgLyBpbnB1dC5zaGFwZVstMV0gPT0gb3V0cHV0Lm51bWVsKCkgLyBvdXRwdXQuc2hhcGVbLTFdCgogICAgbl9lbGVtZW50cyA9IGlucHV0LnNoYXBlWy0xXSAvLyAyCiAgICBncmlkID0gKHRyaXRvbi5jZGl2KGlucHV0Lm51bWVsKCksIGlucHV0LnNoYXBlWy0xXSksKQogICAgc2lsdV9hbmRfbXVsX2tlcm5lbFtncmlkXShpbnB1dCwgb3V0cHV0LCBuX2VsZW1lbnRzLCAxMDI0IGlmIG5fZWxlbWVudHMgPiAxMDI0IGVsc2Ugbl9lbGVtZW50cykKCgpkZWYgdGVzdF9zaWx1X2FuZF9tdWxfa2VybmVsKCk6CiAgICBudW1fdG9rZW5zID0gOAogICAgbnVtX2V4cGVydCA9IDQKICAgIGhpZGRlbl9zaXplID0gMjA0OAogICAgYSA9IHRvcmNoLnJhbmQoKG51bV90b2tlbnMsIG51bV9leHBlcnQsIGhpZGRlbl9zaXplKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGIgPSB0b3JjaC5vbmVzKChudW1fdG9rZW5zLCBudW1fZXhwZXJ0LCBoaWRkZW5fc2l6ZSwpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQogICAgIyBiID0gYiAqIDIKICAgIGlucHV0X3RlbnNvciA9IHRvcmNoLmNvbmNhdCgoYSwgYiksIGRpbT0tMSkKICAgICMgcHJpbnQoaW5wdXRfdGVuc29yKQoKICAgIG91dHB1dF90ZW5zb3IgPSB0b3JjaC5lbXB0eSgobnVtX3Rva2VucywgbnVtX2V4cGVydCwgaGlkZGVuX3NpemUsKSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKICAgIGludm9rZV9zaWx1X2FuZF9tdWxfa2VybmVsKGlucHV0X3RlbnNvciwgb3V0cHV0X3RlbnNvcikKICAgICMgcHJpbnQob3V0cHV0X3RlbnNvcikKCiAgICByZWZfb3V0cHV0ID0gdG9yY2gubm4uZnVuY3Rpb25hbC5zaWx1KGEpICogYgogICAgIyBwcmludChyZWZfb3V0cHV0KQoKICAgIHByaW50KHZlcmJvc2VfYWxsY2xvc2Uob3V0cHV0X3RlbnNvciwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKCiMgZnVzZWQgZXhwZXJ0cwoKCkB0cml0b24uaml0CmRlZiByZW1hcF94Y2QocGlkLCBHUklEX01OLCBOVU1fWENEUzogdGwuY29uc3RleHByID0gOCk6CiAgICAjIyBwaWQgcmVtYXBwaW5nIG9uIHhjZHMKICAgICMgTnVtYmVyIG9mIHBpZHMgcGVyIFhDRCBpbiB0aGUgbmV3IGFycmFuZ2VtZW50CiAgICBwaWRzX3Blcl94Y2QgPSAoR1JJRF9NTiArIE5VTV9YQ0RTIC0gMSkgLy8gTlVNX1hDRFMKICAgICMgV2hlbiBHUklEX01OIGNhbm5vdCBkaXZpZGUgTlVNX1hDRFMsIHNvbWUgeGNkcyB3aWxsIGhhdmUKICAgICMgcGlkc19wZXJfeGNkIHBpZHMsIHRoZSBvdGhlciB3aWxsIGhhdmUgcGlkc19wZXJfeGNkIC0gMSBwaWRzLgogICAgIyBXZSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB4Y2RzIHRoYXQgaGF2ZSBwaWRzX3Blcl94Y2QgcGlkcyBhcwogICAgIyB0YWxsX3hjZHMKICAgIHRhbGxfeGNkcyA9IEdSSURfTU4gJSBOVU1fWENEUwogICAgdGFsbF94Y2RzID0gTlVNX1hDRFMgaWYgdGFsbF94Y2RzID09IDAgZWxzZSB0YWxsX3hjZHMKICAgICMgQ29tcHV0ZSBjdXJyZW50IFhDRCBhbmQgbG9jYWwgcGlkIHdpdGhpbiB0aGUgWENECiAgICB4Y2QgPSBwaWQgJSBOVU1fWENEUwogICAgbG9jYWxfcGlkID0gcGlkIC8vIE5VTV9YQ0RTCiAgICAjIENhbGN1bGF0ZSBuZXcgcGlkIGJhc2VkIG9uIHRoZSBuZXcgZ3JvdXBpbmcKICAgICMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0d28gY2FzZXM6CiAgICAjIDEuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHRhbGwgeGNkCiAgICAjIDIuIHRoZSBjdXJyZW50IHBpZCBpcyBvbiBhIHNob3J0IHhjZAogICAgaWYgeGNkIDwgdGFsbF94Y2RzOgogICAgICAgIHBpZCA9IHhjZCAqIHBpZHNfcGVyX3hjZCArIGxvY2FsX3BpZAogICAgZWxzZToKICAgICAgICBwaWQgPSB0YWxsX3hjZHMgKiBwaWRzX3Blcl94Y2QgKyAoeGNkIC0gdGFsbF94Y2RzKSAqIChwaWRzX3Blcl94Y2QgLSAxKSArIGxvY2FsX3BpZAoKICAgIHJldHVybiBwaWQKCgpAdHJpdG9uLmppdApkZWYgcGlkX2dyaWQocGlkLCBudW1fcGlkX20sIG51bV9waWRfbiwgR1JPVVBfU0laRV9NOiB0bC5jb25zdGV4cHIgPSAxKToKICAgIGlmIEdST1VQX1NJWkVfTSA9PSAxOgogICAgICAgIHBpZF9tID0gcGlkIC8vIG51bV9waWRfbgogICAgICAgIHBpZF9uID0gcGlkICUgbnVtX3BpZF9uCiAgICBlbHNlOgogICAgICAgIG51bV9waWRfaW5fZ3JvdXAgPSBHUk9VUF9TSVpFX00gKiBudW1fcGlkX24KICAgICAgICBncm91cF9pZCA9IHBpZCAvLyBudW1fcGlkX2luX2dyb3VwCiAgICAgICAgZmlyc3RfcGlkX20gPSBncm91cF9pZCAqIEdST1VQX1NJWkVfTQogICAgICAgIGdyb3VwX3NpemVfbSA9IG1pbihudW1fcGlkX20gLSBmaXJzdF9waWRfbSwgR1JPVVBfU0laRV9NKQogICAgICAgIHBpZF9tID0gZmlyc3RfcGlkX20gKyAocGlkICUgZ3JvdXBfc2l6ZV9tKQogICAgICAgIHBpZF9uID0gKHBpZCAlIG51bV9waWRfaW5fZ3JvdXApIC8vIGdyb3VwX3NpemVfbQoKICAgIHJldHVybiBwaWRfbSwgcGlkX24KCgpAdHJpdG9uLmppdApkZWYgZnVzZWRfbW9lX2tlcm5lbCgKICAgICMgUG9pbnRlcnMgdG8gbWF0cmljZXMKICAgIGFfcHRyLAogICAgYl9wdHIsCiAgICBjX3B0ciwKICAgIHRvcGtfd2VpZ2h0c19wdHIsCiAgICBzb3J0ZWRfdG9rZW5faWRzX3B0ciwKICAgIGV4cGVydF9pZHNfcHRyLAogICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZF9wdHIsCiAgICAjIE1hdHJpeCBkaW1lbnNpb25zCiAgICBOLAogICAgSywKICAgIEVNLAogICAgbnVtX3ZhbGlkX3Rva2VucywKICAgICMgVGhlIHN0cmlkZSB2YXJpYWJsZXMgcmVwcmVzZW50IGhvdyBtdWNoIHRvIGluY3JlYXNlIHRoZSBwdHIgYnkgd2hlbiBtb3ZpbmcgYnkgMQogICAgIyBlbGVtZW50IGluIGEgcGFydGljdWxhciBkaW1lbnNpb24uIEUuZy4gYHN0cmlkZV9hbWAgaXMgaG93IG11Y2ggdG8gaW5jcmVhc2UgYGFfcHRyYAogICAgIyBieSB0byBnZXQgdGhlIGVsZW1lbnQgb25lIHJvdyBkb3duIChBIGhhcyBNIHJvd3MpLgogICAgc3RyaWRlX2FtLAogICAgc3RyaWRlX2FrLAogICAgc3RyaWRlX2JlLAogICAgc3RyaWRlX2JrLAogICAgc3RyaWRlX2JuLAogICAgc3RyaWRlX2NtLAogICAgc3RyaWRlX2NuLAogICAgc3RyaWRlX3dlaWdodCwKICAgIHN0cmlkZV90b2tlbl9pZCwKICAgICMgTWV0YS1wYXJhbWV0ZXJzCiAgICBCTE9DS19TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIEJMT0NLX1NJWkVfTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfU0laRV9LOiB0bC5jb25zdGV4cHIsCiAgICBHUk9VUF9TSVpFX006IHRsLmNvbnN0ZXhwciwKICAgIE5VTV9TTVM6IHRsLmNvbnN0ZXhwciwKICAgIE1VTF9ST1VURURfV0VJR0hUOiB0bC5jb25zdGV4cHIsCiAgICB0b3BfazogdGwuY29uc3RleHByLAogICAgY29tcHV0ZV90eXBlOiB0bC5jb25zdGV4cHIsCik6CiAgICAiIiIKICAgIEltcGxlbWVudHMgdGhlIGZ1c2VkIGNvbXB1dGF0aW9uIGZvciBhIE1peHR1cmUgb2YgRXhwZXJ0cyAoTU9FKSB1c2luZyB0b2tlbiBhbmQgZXhwZXJ0IG1hdHJpY2VzLgoKICAgIEtleSBQYXJhbWV0ZXJzOgogICAgLSBBOiBUaGUgaW5wdXQgdGVuc29yIHJlcHJlc2VudGluZyB0b2tlbnMgd2l0aCBzaGFwZSAoKiwgSyksIHdoZXJlICcqJyBjYW4gYmUgYW55IHNoYXBlIHJlcHJlc2VudGluZyBiYXRjaGVzIGFuZCBLIGlzIHRoZSBmZWF0dXJlIGRpbWVuc2lvbiBvZiBlYWNoIHRva2VuLgogICAgLSBCOiBUaGUgc3RhY2tlZCBNT0Ugd2VpZ2h0IHRlbnNvciB3aXRoIHNoYXBlIChFLCBOLCBLKSwgd2hlcmUgRSBpcyB0aGUgbnVtYmVyIG9mIGV4cGVydHMsIEsgaXMgdGhlIGlucHV0IGZlYXR1cmUgZGltZW5zaW9uLCBhbmQgTiBpcyB0aGUgb3V0cHV0IGZlYXR1cmUgZGltZW5zaW9uLgogICAgLSBDOiBUaGUgb3V0cHV0IGNhY2hlIHRlbnNvciB3aXRoIHNoYXBlIChNLCB0b3BrLCBOKSwgd2hlcmUgTSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRva2VucyBwb3N0IHBhZGRpbmcsIHRvcGsgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHRva2VuIGlzIHJlcGVhdGVkLAogICAgICAgIGFuZCBOIGlzIHRoZSBvdXRwdXQgZmVhdHVyZSBkaW1lbnNpb24uCiAgICAtIHNvcnRlZF90b2tlbl9pZHM6IEEgdGVuc29yIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBpbmRpY2VzIG9mIHRva2VucywgcmVwZWF0ZWQgdG9wayB0aW1lcyBhbmQgYXJyYW5nZWQgYnkgdGhlIGV4cGVydCBpbmRleCB0aGV5IGFyZSBhc3NpZ25lZCB0by4KICAgIC0gZXhwZXJ0X2lkczogQSB0ZW5zb3IgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgZXhwZXJ0IGZvciBlYWNoIGJsb2NrLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGV4cGVydCBtYXRyaXggZnJvbSBCIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIGluIEEuCiAgICBUaGlzIGtlcm5lbCBwZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgYSB0b2tlbiBieSBpdHMgY29ycmVzcG9uZGluZyBleHBlcnQgbWF0cml4IGFzIGRldGVybWluZWQgYnkgYGV4cGVydF9pZHNgLiBUaGUgc29ydGluZyBvZiBgc29ydGVkX3Rva2VuX2lkc2AKICAgIGJ5IGV4cGVydCBpbmRleCBhbmQgcGFkZGluZyBlbnN1cmVzIGRpdmlzaWJpbGl0eSBieSBCTE9DS19TSVpFX00sIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBtYWludGFpbiBjb25zaXN0ZW5jeSBpbiBibG9jayBtYXRyaXggbXVsdGlwbGljYXRpb24gYWNyb3NzIGRpZmZlcmVudCBibG9ja3MgcHJvY2Vzc2VkIGJ5IHRoZSBzYW1lIGV4cGVydC4KICAgICIiIgogICAgc3RhcnRfcGlkID0gdGwucHJvZ3JhbV9pZChheGlzPTApCiAgICBOVU1fWENEUzogdGwuY29uc3RleHByID0gOAoKICAgIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSB0bC5sb2FkKG51bV90b2tlbnNfcG9zdF9wYWRkZWRfcHRyKQoKICAgIG51bV9waWRfbSA9IHRsLmNkaXYobnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgQkxPQ0tfU0laRV9NKQogICAgbnVtX3BpZF9uID0gdGwuY2RpdihOLCBCTE9DS19TSVpFX04pCiAgICBudW1fdGlsZXMgPSBudW1fcGlkX20gKiBudW1fcGlkX24KICAgIHRpbGVfaWQgPSBzdGFydF9waWQKCiAgICBvZmZzX2sgPSB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9LKQoKICAgIG51bV92YWxpZF90aWxlcyA9IHRsLmNkaXYoKG51bV90aWxlcyAtIHRpbGVfaWQpLCBOVU1fU01TKQogICAgZm9yIF8gaW4gcmFuZ2UoMCwgbnVtX3ZhbGlkX3RpbGVzKToKICAgICAgICB0aWxlX2lkX3JlbWFwcGVkID0gcmVtYXBfeGNkKHRpbGVfaWQsIG51bV90aWxlcywgTlVNX1hDRFMpCiAgICAgICAgcGlkX20sIHBpZF9uID0gcGlkX2dyaWQodGlsZV9pZF9yZW1hcHBlZCwgbnVtX3BpZF9tLCBudW1fcGlkX24sIEdST1VQX1NJWkVfTSkKCiAgICAgICAgb2Zmc190b2tlbl9pZCA9IHBpZF9tICogQkxPQ0tfU0laRV9NICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTSkKICAgICAgICBvZmZzX3Rva2VuID0gdGwubG9hZChzb3J0ZWRfdG9rZW5faWRzX3B0ciArIG9mZnNfdG9rZW5faWQpCiAgICAgICAgdG9rZW5fbWFzayA9IG9mZnNfdG9rZW4gPCBudW1fdmFsaWRfdG9rZW5zCgogICAgICAgIG9mZnNfYm4gPSAocGlkX24gKiBCTE9DS19TSVpFX04gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfU0laRV9OKSkgJSBOCiAgICAgICAgCiAgICAgICAgYV9wdHJzID0gYV9wdHIgKyAob2Zmc190b2tlbls6LCBOb25lXSAvLyB0b3BfayAqIHN0cmlkZV9hbSArIG9mZnNfa1tOb25lLCA6XSAqIHN0cmlkZV9haykKCiAgICAgICAgb2ZmX2V4cGVydHMgPSB0bC5sb2FkKGV4cGVydF9pZHNfcHRyICsgcGlkX20pCiAgICAgICAgYl9wdHJzID0gYl9wdHIgKyBvZmZfZXhwZXJ0cyAqIHN0cmlkZV9iZSArIChvZmZzX2tbOiwgTm9uZV0gKiBzdHJpZGVfYmsgKyBvZmZzX2JuW05vbmUsIDpdICogc3RyaWRlX2JuKQoKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBJdGVyYXRlIHRvIGNvbXB1dGUgYSBibG9jayBvZiB0aGUgQyBtYXRyaXguCiAgICAgICAgIyBXZSBhY2N1bXVsYXRlIGludG8gYSBgW0JMT0NLX1NJWkVfTSwgQkxPQ0tfU0laRV9OXWAgYmxvY2sKICAgICAgICAjIG9mIGZwMzIgdmFsdWVzIGZvciBoaWdoZXIgYWNjdXJhY3kuCiAgICAgICAgIyBgYWNjdW11bGF0b3JgIHdpbGwgYmUgY29udmVydGVkIGJhY2sgdG8gZnAxNiBhZnRlciB0aGUgbG9vcC4KICAgICAgICBhY2N1bXVsYXRvciA9IHRsLnplcm9zKChCTE9DS19TSVpFX00sIEJMT0NLX1NJWkVfTiksIGR0eXBlPXRsLmZsb2F0MzIpCgogICAgICAgIGZvciBrIGluIHJhbmdlKDAsIHRsLmNkaXYoSywgQkxPQ0tfU0laRV9LKSk6CiAgICAgICAgICAgICMgTG9hZCB0aGUgbmV4dCBibG9jayBvZiBBIGFuZCBCLCBnZW5lcmF0ZSBhIG1hc2sgYnkgY2hlY2tpbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhID0gdGwubG9hZChhX3B0cnMsIG1hc2s9dG9rZW5fbWFza1s6LCBOb25lXSwgb3RoZXI9MC4wKQogICAgICAgICAgICBiID0gdGwubG9hZChiX3B0cnMpCgogICAgICAgICAgICAjIFdlIGFjY3VtdWxhdGUgYWxvbmcgdGhlIEsgZGltZW5zaW9uLgogICAgICAgICAgICBhY2N1bXVsYXRvciArPSB0bC5kb3QoYSwgYikKICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSBwdHJzIHRvIHRoZSBuZXh0IEsgYmxvY2suCiAgICAgICAgICAgIGFfcHRycyArPSBCTE9DS19TSVpFX0sgKiBzdHJpZGVfYWsKICAgICAgICAgICAgYl9wdHJzICs9IEJMT0NLX1NJWkVfSyAqIHN0cmlkZV9iawoKICAgICAgICBpZiBNVUxfUk9VVEVEX1dFSUdIVDoKICAgICAgICAgICAgbW9lX3dlaWdodCA9IHRsLmxvYWQodG9wa193ZWlnaHRzX3B0ciArIG9mZnNfdG9rZW4gKiBzdHJpZGVfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s9dG9rZW5fbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcj0wKQogICAgICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yICogbW9lX3dlaWdodFs6LCBOb25lXQoKICAgICAgICBhY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yLnRvKGNvbXB1dGVfdHlwZSkKICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBXcml0ZSBiYWNrIHRoZSBibG9jayBvZiB0aGUgb3V0cHV0CiAgICAgICAgb2Zmc19jbiA9IHBpZF9uICogQkxPQ0tfU0laRV9OICsgdGwuYXJhbmdlKDAsIEJMT0NLX1NJWkVfTikKICAgICAgICBjX3B0cnMgPSBjX3B0ciArIHN0cmlkZV9jbSAqIG9mZnNfdG9rZW5bOiwgTm9uZV0gKyBzdHJpZGVfY24gKiBvZmZzX2NuWwogICAgICAgICAgICBOb25lLCA6XQogICAgICAgIGNfbWFzayA9IHRva2VuX21hc2tbOiwgTm9uZV0gJiAob2Zmc19jbltOb25lLCA6XSA8IE4pCiAgICAgICAgdGwuc3RvcmUoY19wdHJzLCBhY2N1bXVsYXRvciwgbWFzaz1jX21hc2spCgogICAgICAgIHRpbGVfaWQgKz0gTlVNX1NNUwoKCmRlZiBpbnZva2VfZnVzZWRfbW9lX2tlcm5lbChBOiB0b3JjaC5UZW5zb3IsIEI6IHRvcmNoLlRlbnNvciwgQzogdG9yY2guVGVuc29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wa193ZWlnaHRzOiB0b3JjaC5UZW5zb3IsIHRvcGtfaWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRfdG9rZW5faWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaWRzOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdG9rZW5zX3Bvc3RfcGFkZGVkOiB0b3JjaC5UZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWxfcm91dGVkX3dlaWdodDogYm9vbCwgdG9wX2s6IGludCk6CiAgICAjIHByaW50KG51bV90b2tlbnNfcG9zdF9wYWRkZWQpCiAgICAjIHByaW50KHNvcnRlZF90b2tlbl9pZHMuc2hhcGVbMF0pCiAgICBOVU1fU01TID0gdG9yY2guY3VkYS5nZXRfZGV2aWNlX3Byb3BlcnRpZXMoImN1ZGEiKS5tdWx0aV9wcm9jZXNzb3JfY291bnQgKiAyCiAgICBncmlkID0gbGFtYmRhIE1FVEE6IChtaW4oTlVNX1NNUywgdHJpdG9uLmNkaXYoc29ydGVkX3Rva2VuX2lkcy5zaGFwZVswXSwgTUVUQVsiQkxPQ0tfU0laRV9NIl0pICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cml0b24uY2RpdihCLnNoYXBlWzFdLCBNRVRBWyJCTE9DS19TSVpFX04iXSkpLCApCiAgICBmdXNlZF9tb2Vfa2VybmVsW2dyaWRdKAogICAgICAgIEEsCiAgICAgICAgQiwKICAgICAgICBDLAogICAgICAgIHRvcGtfd2VpZ2h0cywKICAgICAgICBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgIGV4cGVydF9pZHMsCiAgICAgICAgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwKICAgICAgICBCLnNoYXBlWzFdLAogICAgICAgIEIuc2hhcGVbMl0sCiAgICAgICAgc29ydGVkX3Rva2VuX2lkcy5zaGFwZVswXSwKICAgICAgICB0b3BrX2lkcy5udW1lbCgpLAogICAgICAgIEEuc3RyaWRlKDApLAogICAgICAgIEEuc3RyaWRlKDEpLAogICAgICAgIEIuc3RyaWRlKDApLAogICAgICAgIEIuc3RyaWRlKDIpLAogICAgICAgIEIuc3RyaWRlKDEpLAogICAgICAgIEMuc3RyaWRlKDEpLAogICAgICAgIEMuc3RyaWRlKDIpLAogICAgICAgIHRvcGtfd2VpZ2h0cy5zdHJpZGUoMiksCiAgICAgICAgc29ydGVkX3Rva2VuX2lkcy5zdHJpZGUoMCksCiAgICAgICAgTVVMX1JPVVRFRF9XRUlHSFQ9bXVsX3JvdXRlZF93ZWlnaHQsCiAgICAgICAgdG9wX2s9dG9wX2ssCiAgICAgICAgY29tcHV0ZV90eXBlPXRsLmJmbG9hdDE2IGlmIEEuZHR5cGUgPT0gdG9yY2guYmZsb2F0MTYgZWxzZSB0bC5mbG9hdDE2LAogICAgICAgIEJMT0NLX1NJWkVfTT1CTE9DS19TSVpFX00sCiAgICAgICAgQkxPQ0tfU0laRV9OPUJMT0NLX1NJWkVfTiwKICAgICAgICBCTE9DS19TSVpFX0s9QkxPQ0tfU0laRV9LLAogICAgICAgIEdST1VQX1NJWkVfTT1HUk9VUF9TSVpFX00sCiAgICAgICAgTlVNX1NNUz1OVU1fU01TLAogICAgICAgIG51bV93YXJwcz04LAogICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICB3YXZlc19wZXJfZXU9MCwKICAgICAgICBrcGFjaz0xLAogICAgICAgIG1hdHJpeF9pbnN0cl9ub25rZGltPTE2LAogICAgKQoKCiMgbWFpbiBrZXJuZWwKCkB0b3JjaC5ub19ncmFkKCkKZGVmIG1vZV9leHBlcnRfa2VybmVsKHg6IHRvcmNoLlRlbnNvciwgd19nYXRlOiB0b3JjaC5UZW5zb3IsIHdfdXA6IHRvcmNoLlRlbnNvciwgd19kb3duOiB0b3JjaC5UZW5zb3IpOgogICAgIyB4X2dhdGUgPSB4IEAgd19nYXRlCiAgICB4X2dhdGUgPSBGLmxpbmVhcih4LCB3X2dhdGUuVCkKICAgIHhfZ2F0ZSA9IEYuc2lsdSh4X2dhdGUpCiAgICAjIHhfdXAgPSB4IEAgd191cAogICAgeF91cCA9IEYubGluZWFyKHgsIHdfdXAuVCkKICAgIG91dCA9IHhfZ2F0ZSAqIHhfdXAKICAgICMgb3V0ID0gb3V0IEAgd19kb3duCiAgICBvdXQgPSBGLmxpbmVhcihvdXQsIHdfZG93bi5UKQogICAgcmV0dXJuIG91dAoKCkB0cml0b24uaml0CmRlZiB0cmFuc3Bvc2Vfa2VybmVsKAogICAgTTogdGwuY29uc3RleHByLAogICAgTjogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTTogdGwuY29uc3RleHByLAogICAgQkxPQ0tfTjogdGwuY29uc3RleHByLAogICAgWCwKICAgIHN0cmlkZV94bTogdGwuY29uc3RleHByLAogICAgc3RyaWRlX3huOiB0bC5jb25zdGV4cHIsCiAgICBZLAogICAgc3RyaWRlX3ltOiB0bC5jb25zdGV4cHIsCiAgICBzdHJpZGVfeW46IHRsLmNvbnN0ZXhwciwKICAgIElEWDogdGwuY29uc3RleHByLAopOgogICAgcGlkX20gPSB0bC5wcm9ncmFtX2lkKDApLnRvKHRsLmludDY0KQogICAgcGlkX24gPSB0bC5wcm9ncmFtX2lkKDEpLnRvKHRsLmludDY0KQoKICAgIG1fZXhhY3Q6IHRsLmNvbnN0ZXhwciA9IChNICUgQkxPQ0tfTSkgPT0gMAogICAgbl9leGFjdDogdGwuY29uc3RleHByID0gKE4gJSBCTE9DS19OKSA9PSAwCgogICAgb2ZmX20gPSBwaWRfbSAqIEJMT0NLX00gKyB0bC5hcmFuZ2UoMCwgQkxPQ0tfTSkKICAgIG9mZl9uID0gcGlkX24gKiBCTE9DS19OICsgdGwuYXJhbmdlKDAsIEJMT0NLX04pCgogICAgbWFza19tID0gb2ZmX20gPCBNCiAgICBtYXNrX24gPSBvZmZfbiA8IE4KCiAgICBpZiBtX2V4YWN0OgogICAgICAgIGlmIG5fZXhhY3Q6CiAgICAgICAgICAgIG1hc2sgPSBOb25lCiAgICAgICAgICAgIG90aGVyID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1hc2sgPSBtYXNrX25bTm9uZSwgOl0KICAgICAgICAgICAgb3RoZXIgPSAwCiAgICBlbHNlOgogICAgICAgIGlmIG5fZXhhY3Q6CiAgICAgICAgICAgIG1hc2sgPSBtYXNrX21bOiwgTm9uZV0KICAgICAgICAgICAgb3RoZXIgPSAwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWFzayA9IG1hc2tfbVs6LCBOb25lXSAmIG1hc2tfbltOb25lLCA6XQogICAgICAgICAgICBvdGhlciA9IDAKCiAgICAjIFhfcHRycyA9IFggKyBvZmZfbVs6LCBOb25lXSAqIDEgKyBvZmZfbltOb25lLCA6XSAqIE0KICAgICMgWV9wdHJzID0gWSArIChFX0lEICogMiArIFdfSUQpICogTSAqIE4gKyBvZmZfbVs6LCBOb25lXSAqIE4gKyBvZmZfbltOb25lLCA6XSAqIDEKICAgIFhfcHRycyA9IFggKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV94bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3huCiAgICBZX3B0cnMgPSBZICsgSURYICogTSAqIE4gKyBvZmZfbVs6LCBOb25lXSAqIHN0cmlkZV95bSArIG9mZl9uW05vbmUsIDpdICogc3RyaWRlX3luCgogICAgdGlsZSA9IHRsLmxvYWQoWF9wdHJzLCBtYXNrPW1hc2ssIG90aGVyPW90aGVyKQogICAgdGwuc3RvcmUoWV9wdHJzLCB0aWxlLCBtYXNrPW1hc2spCgoKZGVmIGludm9rZV90cmFuc3Bvc2UoWCwgWSwgSURYPTAsIEJMT0NLX009MTI4LCBCTE9DS19OPTEyOCwgbnVtX3dhcnBzPTE2KSAtPiBOb25lOgogICAgaWYgWC5kdHlwZS5pdGVtc2l6ZSA9PSAxOgogICAgICAgIFggPSBYLnZpZXcodG9yY2guaW50OCkKICAgIGlmIFkuZHR5cGUuaXRlbXNpemUgPT0gMToKICAgICAgICBZID0gWS52aWV3KHRvcmNoLmludDgpCgogICAgIyBjaGVjayBjb21wYXRpYmlsaXR5OgogICAgYXNzZXJ0IFguZHR5cGUgPT0gWS5kdHlwZQoKICAgIE0gPSBYLnNoYXBlWzBdCiAgICBOID0gWC5zaGFwZVsxXQoKICAgIHN0cmlkZV94bSA9IFguc3RyaWRlKDApCiAgICBzdHJpZGVfeG4gPSBYLnN0cmlkZSgxKQoKICAgIHN0cmlkZV95bSA9IFkuc3RyaWRlKC0yKQogICAgc3RyaWRlX3luID0gWS5zdHJpZGUoLTEpCgogICAgZ3JpZCA9ICgoTSArIEJMT0NLX00gLSAxKSAvLyBCTE9DS19NLCAoTiArIEJMT0NLX04gLSAxKSAvLyBCTE9DS19OKQogICAgdHJhbnNwb3NlX2tlcm5lbFtncmlkXSgKICAgICAgICBNLAogICAgICAgIE4sCiAgICAgICAgQkxPQ0tfTSwKICAgICAgICBCTE9DS19OLAogICAgICAgIFgsCiAgICAgICAgc3RyaWRlX3htLAogICAgICAgIHN0cmlkZV94biwKICAgICAgICBZLAogICAgICAgIHN0cmlkZV95bSwKICAgICAgICBzdHJpZGVfeW4sCiAgICAgICAgSURYPUlEWCwKICAgICAgICBudW1fd2FycHM9bnVtX3dhcnBzLAogICAgKQoKCncxOiB0b3JjaC5UZW5zb3IgPSB0b3JjaC5lbXB0eSgoMzIsIDQwOTYsIDcxNjgpLCBkdHlwZT10b3JjaC5mbG9hdDE2LCBkZXZpY2U9ImN1ZGEiKQp3MjogdG9yY2guVGVuc29yID0gdG9yY2guZW1wdHkoKDMyLCA3MTY4LCAyMDQ4KSwgZHR5cGU9dG9yY2guZmxvYXQxNiwgZGV2aWNlPSJjdWRhIikKCgpAdG9yY2gubm9fZ3JhZCgpCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgIiIiCiAgICBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgRGVlcFNlZWstc3R5bGUgTWl4dHVyZSBvZiBFeHBlcnRzIHVzaW5nIFB5VG9yY2guCiAgICAKICAgIEFyZ3M6CiAgICAgICAgZGF0YTogVHVwbGUgb2YgKGlucHV0OiB0b3JjaC5UZW5zb3IsIHdlaWdodHM6IERpY3Rbc3RyLCB0b3JjaC5UZW5zb3JdLCBjb25maWc6IERpY3QpCiAgICAgICAgICAgIC0gaW5wdXQ6IElucHV0IHRlbnNvciBvZiBzaGFwZSBbYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgaGlkZGVuX2RpbV0KICAgICAgICAgICAgLSB3ZWlnaHRzOiBEaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbW9kZWwgd2VpZ2h0cwogICAgICAgICAgICAtIGNvbmZpZzogRGljdGlvbmFyeSBjb250YWluaW5nIG1vZGVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICAgICAgICAgICAKICAgIFJldHVybnM6CiAgICAgICAgVHVwbGUgY29udGFpbmluZzoKICAgICAgICAgICAgLSBvdXRwdXQ6IFByb2Nlc3NlZCB0ZW5zb3IgW2JhdGNoX3NpemUsIHNlcV9sZW4sIGRfbW9kZWxdCiAgICAgICAgICAgIC0gYXV4X2RhdGE6IERpY3Rpb25hcnkgd2l0aCBhdXhpbGlhcnkgZGF0YQogICAgIiIiCiAgICB0aW1lX2xpc3QgPSBbXQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBwcmVwYXJlIHdlaWdodAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGlucHV0X3RlbnNvcjogdG9yY2guVGVuc29yCiAgICB3ZWlnaHRzOiBEaWN0W3N0ciwgdG9yY2guVGVuc29yXQogICAgY29uZmlnOiBEaWN0W3N0ciwgaW50XQogICAgaW5wdXRfdGVuc29yLCB3ZWlnaHRzLCBjb25maWcgPSBkYXRhCgogICAgTSA9IGNvbmZpZ1siYmF0Y2hfc2l6ZSJdICogY29uZmlnWyJzZXFfbGVuIl0KICAgIE4gPSBjb25maWdbImRfZXhwZXJ0Il0KICAgIEsgPSBjb25maWdbImRfaGlkZGVuIl0KCiAgICBmb3IgaSBpbiByYW5nZShjb25maWdbIm5fcm91dGVkX2V4cGVydHMiXSk6CiAgICAgICAgZm9yIGogaW4gcmFuZ2UoMik6CiAgICAgICAgICAgIGludm9rZV90cmFuc3Bvc2Uod2VpZ2h0c1tmImV4cGVydHMue2l9LntqfS53ZWlnaHQiXS5ULCB3MSwgaSAqIDIgKyBqKQogICAgZm9yIGkgaW4gcmFuZ2UoY29uZmlnWyJuX3JvdXRlZF9leHBlcnRzIl0pOgogICAgICAgIGludm9rZV90cmFuc3Bvc2Uod2VpZ2h0c1tmImV4cGVydHMue2l9LjIud2VpZ2h0Il0uVCwgdzIsIGkpCgogICAgaW50ZXJtZWRpYXRlX2NhY2hlMSA9IHRvcmNoLm9uZXMoKE0sIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdLCBOICogMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlPWlucHV0X3RlbnNvci5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9aW5wdXRfdGVuc29yLmR0eXBlKQogICAgaW50ZXJtZWRpYXRlX2NhY2hlMiA9IHRvcmNoLmVtcHR5KChNICogY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIE4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKICAgIGludGVybWVkaWF0ZV9jYWNoZTMgPSB0b3JjaC5lbXB0eSgoTSwgY29uZmlnWyJuX2V4cGVydHNfcGVyX3Rva2VuIl0sIEspLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZT1pbnB1dF90ZW5zb3IuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPWlucHV0X3RlbnNvci5kdHlwZSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgbW9lIGdhdGUKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBleHBlcnRfaW5kaWNlcywgZXhwZXJ0X3Njb3JlcyA9IG1vZV9nYXRlX2tlcm5lbCgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgd2VpZ2h0c1sncm91dGVyLndlaWdodCddLAogICAgICAgIGNvbmZpZ1sibl9leHBlcnRzX3Blcl90b2tlbiJdKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBzaGFyZWRfZXhwZXJ0cwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHNoYXJlZF9vdXRwdXQgPSBtb2VfZXhwZXJ0X2tlcm5lbCgKICAgICAgICBpbnB1dF90ZW5zb3IsCiAgICAgICAgd2VpZ2h0c1snc2hhcmVkX2V4cGVydHMuMC53ZWlnaHQnXSwKICAgICAgICB3ZWlnaHRzWydzaGFyZWRfZXhwZXJ0cy4xLndlaWdodCddLAogICAgICAgIHdlaWdodHNbJ3NoYXJlZF9leHBlcnRzLjIud2VpZ2h0J10pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIG1vZSBhbGlnbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHNvcnRlZF90b2tlbl9pZHMsIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQgPSBpbnZva2VfbW9lX2FsaWduX2Jsb2NrX3NpemUoCiAgICAgICAgZXhwZXJ0X2luZGljZXMsIGNvbmZpZ1sibl9yb3V0ZWRfZXhwZXJ0cyJdLCBCTE9DS19TSVpFX00pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGZ1c2VkX21vZV8xCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX2Z1c2VkX21vZV9rZXJuZWwoaW5wdXRfdGVuc29yLnZpZXcoLTEsIEspLCB3MSwgaW50ZXJtZWRpYXRlX2NhY2hlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9zY29yZXMsIGV4cGVydF9pbmRpY2VzLCBzb3J0ZWRfdG9rZW5faWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJ0X2lkcywgbnVtX3Rva2Vuc19wb3N0X3BhZGRlZCwgRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfaW5kaWNlcy5zaGFwZVsyXSkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgc2lsdV9hbmRfbXVsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX3NpbHVfYW5kX211bF9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMS52aWV3KC0xLCAyICogTiksIGludGVybWVkaWF0ZV9jYWNoZTIpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIGZ1c2VkX21vZV8yCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgogICAgaW52b2tlX2Z1c2VkX21vZV9rZXJuZWwoaW50ZXJtZWRpYXRlX2NhY2hlMiwgdzIsIGludGVybWVkaWF0ZV9jYWNoZTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlcnRfc2NvcmVzLCBleHBlcnRfaW5kaWNlcywgc29ydGVkX3Rva2VuX2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVydF9pZHMsIG51bV90b2tlbnNfcG9zdF9wYWRkZWQsIFRydWUsIDEpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHN1bQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIHJvdXRlZF9vdXRwdXQgPSB0b3JjaC5zdW0oCiAgICAgICAgaW50ZXJtZWRpYXRlX2NhY2hlMy52aWV3KCppbnRlcm1lZGlhdGVfY2FjaGUzLnNoYXBlKSwgZGltPTEpLnZpZXcoY29uZmlnWyJiYXRjaF9zaXplIl0sIGNvbmZpZ1sic2VxX2xlbiJdLCBLKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBhZGQKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBvdXRwdXQgPSByb3V0ZWRfb3V0cHV0ICsgc2hhcmVkX291dHB1dAoKICAgIHJldHVybiBvdXRwdXQKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBkYXRhID0gZ2VuZXJhdGVfaW5wdXQoCiAgICAgICAgICAgIGRoaWRkZW49NzE2OCwgZGV4cGVydD0yMDQ4LAogICAgICAgICAgICBucm91dGVkZXhwZXJ0cz0zMiwgbnNoYXJlZGV4cGVydHM9MSwgbmV4cGVydHNwZXJ0b2tlbj00LAogICAgICAgICAgICBicz0xLCBzZXFsZW49MjA0OCwgc2VlZD0xKQogICAgb3V0cHV0ID0gY3VzdG9tX2tlcm5lbChkYXRhKQogICAgcmVmX2RhdGEgPSBfY2xvbmVfZGF0YShkYXRhKQogICAgcmVmX291dHB1dCA9IHJlZl9rZXJuZWwocmVmX2RhdGEpCiAgICBwcmludCh2ZXJib3NlX2FsbGNsb3NlKG91dHB1dCwgcmVmX291dHB1dCwgcnRvbD0xZS0yLCBhdG9sPTFlLTIpKQoKICAgICMgdGltZV9saXN0ID0gW10KICAgICMgZm9yIGkgaW4gcmFuZ2UoMjAwKToKICAgICMgICAgIGRhdGEgPSBnZW5lcmF0ZV9pbnB1dCgKICAgICMgICAgICAgICBkaGlkZGVuPTcxNjgsIGRleHBlcnQ9MjA0OCwKICAgICMgICAgICAgICBucm91dGVkZXhwZXJ0cz0zMiwgbnNoYXJlZGV4cGVydHM9MSwgbmV4cGVydHNwZXJ0b2tlbj00LAogICAgIyAgICAgICAgIGJzPTEsIHNlcWxlbj04MTkyLCBzZWVkPTEpCgogICAgIyAgICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjICAgICBzdGFydCA9IHRpbWUucGVyZl9jb3VudGVyX25zKCkKCiAgICAjICAgICBvdXRwdXQgPSBjdXN0b21fa2VybmVsKGRhdGEpCgogICAgIyAgICAgdG9yY2guY3VkYS5zeW5jaHJvbml6ZSgpCiAgICAjICAgICBlbmQgPSB0aW1lLnBlcmZfY291bnRlcl9ucygpCiAgICAjICAgICB0aW1lX2xpc3QuYXBwZW5kKChlbmQgLSBzdGFydCkgLyAxMDAwIC8gMTAwMCkKCiAgICAjICAgICByZWZfZGF0YSA9IF9jbG9uZV9kYXRhKGRhdGEpCiAgICAjICAgICByZWZfb3V0cHV0ID0gcmVmX2tlcm5lbChyZWZfZGF0YSkKCiAgICAjIHByaW50KHRpbWVfbGlzdCkKICAgICMgcHJpbnQoZiJhbGw6IHtzdW0odGltZV9saXN0Wy0xMDA6XSkgLyAxMDB9IikK
No newline at end of file

Best evidence level for this revision: reported

JSON