diff --git a/www/parental_controls.html b/www/parental_controls.html
new file mode 100644
index 0000000..b2918d2
--- /dev/null
+++ b/www/parental_controls.html
@@ -0,0 +1 @@
+PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgo8dGl0bGU+UGFyZW50YWwgQ29udHJvbHM8L3RpdGxlPgo8c3R5bGU+Cjpyb290IHsKICAtLWJnOiAgICAgICAgIzBkMTExNzsKICAtLXN1cmZhY2U6ICAgIzE2MWIyNDsKICAtLXN1cmZhY2UyOiAgIzFlMjUzNTsKICAtLXN1cmZhY2UzOiAgIzI1MmQzZDsKICAtLWJvcmRlcjogICAgIzJhMzM0NzsKICAtLXRleHQ6ICAgICAgI2RkZTNmMDsKICAtLXRleHQtbXV0ZWQ6IzZiN2E5OTsKICAtLWFjY2VudDogICAgIzZiOGJlZjsKICAtLWFjY2VudC1oOiAgIzdlOWNmNTsKICAtLXN1Y2Nlc3M6ICAgIzNlY2Y4ZTsKICAtLWRhbmdlcjogICAgI2Y1NjU2NTsKICAtLXdhcm5pbmc6ICAgI2Y2YWQ1NTsKICAtLXI6ICAgICAgICAgMTRweDsKICAtLXItc206ICAgICAgOHB4OwogIC0tc2hhZG93OiAgICAwIDhweCAzMnB4IHJnYmEoMCwwLDAsLjU1KTsKICAtLXRyOiAgICAgICAgLjE4cyBlYXNlOwp9Cip7Ym94LXNpemluZzpib3JkZXItYm94O21hcmdpbjowO3BhZGRpbmc6MH0KaHRtbCxib2R5e2hlaWdodDoxMDAlO2ZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLHNhbnMtc2VyaWY7YmFja2dyb3VuZDp2YXIoLS1iZyk7Y29sb3I6dmFyKC0tdGV4dCk7Zm9udC1zaXplOjE1cHh9CgovKiDilIDilIAgU0NST0xMQkFSIOKUgOKUgCAqLwo6Oi13ZWJraXQtc2Nyb2xsYmFye3dpZHRoOjZweH0KOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fQo6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JhY2tncm91bmQ6dmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjNweH0KCi8qIOKUgOKUgCBTRVRVUCBTQ1JFRU4g4pSA4pSAICovCiNzZXR1cC1zY3JlZW57cG9zaXRpb246Zml4ZWQ7aW5zZXQ6MDtiYWNrZ3JvdW5kOnZhcigtLWJnKTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7ei1pbmRleDo5OTk7cGFkZGluZzoyMHB4fQouc2V0dXAtY2FyZHtiYWNrZ3JvdW5kOnZhcigtLXN1cmZhY2UpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOnZhcigtLXIpO3BhZGRpbmc6MzZweDt3aWR0aDptaW4oNDQwcHgsMTAwJSk7Ym94LXNoYWRvdzp2YXIoLS1zaGFkb3cpfQouc2V0dXAtbG9nb3tmb250LXNpemU6Mi44cmVtO21hcmdpbi1ib3R0b206MTJweDtkaXNwbGF5OmJsb2NrfQouc2V0dXAtY2FyZCBoMXtmb250LXNpemU6MS41cmVtO2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW4tYm90dG9tOjZweDtsZXR0ZXItc3BhY2luZzotLjAyZW19Ci5zZXR1cC1jYXJkIHB7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7Zm9udC1zaXplOi44NzVyZW07bGluZS1oZWlnaHQ6MS42O21hcmdpbi1ib3R0b206MjRweH0KCi8qIOKUgOKUgCBIRUFERVIg4pSA4pSAICovCmhlYWRlcntiYWNrZ3JvdW5kOnZhcigtLXN1cmZhY2UpO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7cGFkZGluZzoxNHB4IDI0cHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbjtwb3NpdGlvbjpzdGlja3k7dG9wOjA7ei1pbmRleDoxMDB9Ci5oLWxlZnR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweH0KLmgtbGVmdCBoMXtmb250LXNpemU6MS4xNXJlbTtmb250LXdlaWdodDo3MDA7bGV0dGVyLXNwYWNpbmc6LS4wMmVtfQoubG9nby1pY29ue2ZvbnQtc2l6ZToxLjRyZW19Ci5oLXJpZ2h0e2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweH0KCi8qIOKUgOKUgCBDT05ORUNUSU9OIEJBREdFIOKUgOKUgCAqLwouYmFkZ2V7Zm9udC1zaXplOi43MnJlbTtmb250LXdlaWdodDo3MDA7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi4wNmVtO3BhZGRpbmc6M3B4IDEwcHg7Ym9yZGVyLXJhZGl1czoyMHB4fQouYmFkZ2UuY29ubmVjdGVkICAge2JhY2tncm91bmQ6cmdiYSg2MiwyMDcsMTQyLC4xMik7Y29sb3I6dmFyKC0tc3VjY2Vzcyk7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDYyLDIwNywxNDIsLjMpfQouYmFkZ2UuY29ubmVjdGluZyAge2JhY2tncm91bmQ6cmdiYSgyNDYsMTczLDg1LC4xMik7Y29sb3I6dmFyKC0td2FybmluZyk7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDI0NiwxNzMsODUsLjMpfQouYmFkZ2UuZGlzY29ubmVjdGVke2JhY2tncm91bmQ6cmdiYSgyNDUsMTAxLDEwMSwuMTIpO2NvbG9yOnZhcigtLWRhbmdlcik7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDI0NSwxMDEsMTAxLC4zKX0KCi8qIOKUgOKUgCBCVVRUT05TIOKUgOKUgCAqLwouYnRue3BhZGRpbmc6N3B4IDE2cHg7Ym9yZGVyLXJhZGl1czp2YXIoLS1yLXNtKTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6Ljg1cmVtO2ZvbnQtd2VpZ2h0OjYwMDt0cmFuc2l0aW9uOmFsbCB2YXIoLS10cik7d2hpdGUtc3BhY2U6bm93cmFwO2xpbmUtaGVpZ2h0OjEuNH0KLmJ0bi1wcmltYXJ5e2JhY2tncm91bmQ6dmFyKC0tYWNjZW50KTtjb2xvcjojZmZmfQouYnRuLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQtaCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTFweCl9Ci5idG4tZ2hvc3R7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcil9Ci5idG4tZ2hvc3Q6aG92ZXJ7YmFja2dyb3VuZDp2YXIoLS1zdXJmYWNlMik7Y29sb3I6dmFyKC0tdGV4dCl9Ci5idG4tc217cGFkZGluZzo1cHggMTJweDtmb250LXNpemU6Ljc4cmVtfQouYnRuLWZ1bGx7d2lkdGg6MTAwJTttYXJnaW4tdG9wOjZweDtwYWRkaW5nOjEwcHh9Ci5pY29uLWJ0bntiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTtib3JkZXItcmFkaXVzOnZhcigtLXItc20pO3dpZHRoOjM0cHg7aGVpZ2h0OjM0cHg7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2ZvbnQtc2l6ZTouOTVyZW07dHJhbnNpdGlvbjphbGwgdmFyKC0tdHIpfQouaWNvbi1idG46aG92ZXJ7YmFja2dyb3VuZDp2YXIoLS1zdXJmYWNlMik7Y29sb3I6dmFyKC0tdGV4dCl9CgovKiDilIDilIAgVE9HR0xFIOKUgOKUgCAqLwoudG9nLXdyYXB7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4O2N1cnNvcjpwb2ludGVyO3VzZXItc2VsZWN0Om5vbmV9Ci50b2d7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6NDJweDtoZWlnaHQ6MjNweDtmbGV4LXNocmluazowfQoudG9nIGlucHV0e29wYWNpdHk6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlfQoudG9nLXRyYWNre3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7Ym9yZGVyLXJhZGl1czoxMnB4O2JhY2tncm91bmQ6dmFyKC0tYm9yZGVyKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgdmFyKC0tdHIpfQoudG9nLXRodW1ie3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjE3cHg7aGVpZ2h0OjE3cHg7dG9wOjNweDtsZWZ0OjNweDtiYWNrZ3JvdW5kOnZhcigtLXRleHQtbXV0ZWQpO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIHZhcigtLXRyKSxiYWNrZ3JvdW5kIHZhcigtLXRyKX0KLnRvZyBpbnB1dDpjaGVja2VkIH4gLnRvZy10cmFja3tiYWNrZ3JvdW5kOnZhcigtLWRhbmdlcil9Ci50b2cgaW5wdXQ6Y2hlY2tlZCB+IC50b2ctdGh1bWJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTlweCk7YmFja2dyb3VuZDojZmZmfQoudG9nLmdybiBpbnB1dDpjaGVja2VkIH4gLnRvZy10cmFja3tiYWNrZ3JvdW5kOnZhcigtLXN1Y2Nlc3MpfQovKiBzbWFsbCB0b2dnbGUgKi8KLnRvZy5zbXt3aWR0aDozNHB4O2hlaWdodDoxOXB4fQoudG9nLnNtIC50b2ctdGh1bWJ7d2lkdGg6MTNweDtoZWlnaHQ6MTNweH0KLnRvZy5zbSBpbnB1dDpjaGVja2VkIH4gLnRvZy10aHVtYnt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxNXB4KX0KCi8qIOKUgOKUgCBNQUlOIExBWU9VVCDilIDilIAgKi8KI2FwcHtkaXNwbGF5Om5vbmU7aGVpZ2h0OjEwMHZoO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0KI2FwcC52aXNpYmxle2Rpc3BsYXk6ZmxleH0KbWFpbntmbGV4OjE7b3ZlcmZsb3cteTphdXRvO3BhZGRpbmc6MjRweH0KLmdyaWR7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maWxsLG1pbm1heCgzNDBweCwxZnIpKTtnYXA6MThweDthbGlnbi1pdGVtczpzdGFydH0KCi8qIOKUgOKUgCBVU0VSIENBUkQg4pSA4pSAICovCi51c2VyLWNhcmR7YmFja2dyb3VuZDp2YXIoLS1zdXJmYWNlKTtib3JkZXItcmFkaXVzOnZhcigtLXIpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtvdmVyZmxvdzpoaWRkZW47dHJhbnNpdGlvbjpib3gtc2hhZG93IHZhcigtLXRyKSxib3JkZXItY29sb3IgdmFyKC0tdHIpfQoudXNlci1jYXJkLmJsb2NrZWR7Ym9yZGVyLWNvbG9yOnJnYmEoMjQ1LDEwMSwxMDEsLjQpfQoudXNlci1jYXJkOmhvdmVye2JveC1zaGFkb3c6dmFyKC0tc2hhZG93KX0KCi5jYXJkLWhlYWR7cGFkZGluZzoxNHB4IDE4cHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6MTBweDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JhY2tncm91bmQ6dmFyKC0tc3VyZmFjZTIpfQouY29sb3ItZG90e3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7Ym9yZGVyLXJhZGl1czo1MCU7ZmxleC1zaHJpbms6MH0KLnVzZXItbmFtZS1lbHtmbGV4OjE7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxcmVtO2xldHRlci1zcGFjaW5nOi0uMDFlbX0KLnN0YXR1cy1sYmx7Zm9udC1zaXplOi43MnJlbTtmb250LXdlaWdodDo3MDA7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi4wNmVtO2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpfQouc3RhdHVzLWxibC5ibG9ja2Vke2NvbG9yOnZhcigtLWRhbmdlcil9Ci5kZWwtYnRue2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjFyZW07cGFkZGluZzoycHggNnB4O2JvcmRlci1yYWRpdXM6NHB4O3RyYW5zaXRpb246YWxsIHZhcigtLXRyKTtsaW5lLWhlaWdodDoxfQouZGVsLWJ0bjpob3Zlcntjb2xvcjp2YXIoLS1kYW5nZXIpO2JhY2tncm91bmQ6cmdiYSgyNDUsMTAxLDEwMSwuMSl9CgouY2FyZC1ib2R5e3BhZGRpbmc6MTZweCAxOHB4fQoKLyog4pSA4pSAIERFVklDRVMg4pSA4pSAICovCi5zZWMtdGl0bGV7Zm9udC1zaXplOi43MnJlbTtmb250LXdlaWdodDo3MDA7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOi4wNmVtO2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO21hcmdpbi1ib3R0b206MTBweDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47YWxpZ24taXRlbXM6Y2VudGVyfQouZGV2LWxpc3R7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6N3B4O21hcmdpbi1ib3R0b206MTJweH0KLmRldi1pdGVte2JhY2tncm91bmQ6dmFyKC0tc3VyZmFjZTIpO2JvcmRlci1yYWRpdXM6dmFyKC0tci1zbSk7cGFkZGluZzo5cHggMTJweDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo5cHg7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudDt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciB2YXIoLS10cil9Ci5kZXYtaXRlbS5ibG9ja2Vke2JvcmRlci1jb2xvcjpyZ2JhKDI0NSwxMDEsMTAxLC4zKX0KLm9ubGluZS1kb3R7d2lkdGg6N3B4O2hlaWdodDo3cHg7Ym9yZGVyLXJhZGl1czo1MCU7ZmxleC1zaHJpbms6MDtiYWNrZ3JvdW5kOnZhcigtLXRleHQtbXV0ZWQpfQoub25saW5lLWRvdC5vbntiYWNrZ3JvdW5kOnZhcigtLXN1Y2Nlc3MpO2JveC1zaGFkb3c6MCAwIDVweCB2YXIoLS1zdWNjZXNzKX0KLmRldi1pbmZve2ZsZXg6MTttaW4td2lkdGg6MH0KLmRldi1uYW1le2ZvbnQtc2l6ZTouODc1cmVtO2ZvbnQtd2VpZ2h0OjYwMDt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Ci5kZXYtc3Vie2ZvbnQtc2l6ZTouN3JlbTtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTtmb250LWZhbWlseTptb25vc3BhY2U7bWFyZ2luLXRvcDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzfQouZGV2LWFjdHN7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O2ZsZXgtc2hyaW5rOjB9Ci5uby1kZXZ7Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7Zm9udC1zaXplOi44NXJlbTt0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjEwcHggMH0KCi8qIOKUgOKUgCBTQ0hFRFVMRSDilIDilIAgKi8KLnNjaGVkLXNlY3Rpb257Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtwYWRkaW5nLXRvcDoxNHB4O21hcmdpbi10b3A6MTRweH0KLnNjaGVkLWhlYWR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtjdXJzb3I6cG9pbnRlcjttYXJnaW4tYm90dG9tOjB9Ci5zY2hlZC10aXRsZXtmb250LXNpemU6LjcycmVtO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjA2ZW07Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCl9Ci5zY2hlZC1jaGV2e2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO3RyYW5zaXRpb246dHJhbnNmb3JtIHZhcigtLXRyKTtmb250LXNpemU6LjdyZW07bGluZS1oZWlnaHQ6MX0KLnNjaGVkLWNoZXYub3Blbnt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9Ci5zY2hlZC1ib2R5e2Rpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjEycHh9Ci5zY2hlZC1ib2R5Lm9wZW57ZGlzcGxheTpibG9ja30KLnNjaGVkLWVuLXJvd3tkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo4cHg7bWFyZ2luLWJvdHRvbToxMHB4fQouc2NoZWQtcm93e2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjhweDttYXJnaW4tYm90dG9tOjhweH0KLnNjaGVkLXJvdyBsYWJlbHtmb250LXNpemU6Ljc4cmVtO2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO3dpZHRoOjY4cHg7ZmxleC1zaHJpbms6MH0KLnRpbWUtaW57YmFja2dyb3VuZDp2YXIoLS1zdXJmYWNlMyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2NvbG9yOnZhcigtLXRleHQpO2JvcmRlci1yYWRpdXM6dmFyKC0tci1zbSk7cGFkZGluZzo1cHggOHB4O2ZvbnQtc2l6ZTouODJyZW07d2lkdGg6ODhweDt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciB2YXIoLS10cil9Ci50aW1lLWluOmZvY3Vze291dGxpbmU6bm9uZTtib3JkZXItY29sb3I6dmFyKC0tYWNjZW50KX0KLnRpbWUtc2Vwe2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpO2ZvbnQtc2l6ZTouNzhyZW19Ci5zY2hlZC1oaW50e2ZvbnQtc2l6ZTouNzJyZW07Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCk7bWFyZ2luLXRvcDo0cHg7bGluZS1oZWlnaHQ6MS40fQoKLyog4pSA4pSAIEFERCBVU0VSIFRJTEUg4pSA4pSAICovCi5hZGQtdXNlci10aWxle2JhY2tncm91bmQ6dmFyKC0tc3VyZmFjZSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1yKTtib3JkZXI6MnB4IGRhc2hlZCB2YXIoLS1ib3JkZXIpO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjttaW4taGVpZ2h0OjIwMHB4O2N1cnNvcjpwb2ludGVyO3RyYW5zaXRpb246YWxsIHZhcigtLXRyKX0KLmFkZC11c2VyLXRpbGU6aG92ZXJ7Ym9yZGVyLWNvbG9yOnZhcigtLWFjY2VudCk7YmFja2dyb3VuZDpyZ2JhKDEwNywxMzksMjM5LC4wNSl9Ci5hZGQtdXNlci10aWxlLWlubmVye3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpfQouYWRkLXVzZXItdGlsZS1pbm5lciAucGx1c3tmb250LXNpemU6MnJlbTttYXJnaW4tYm90dG9tOjZweDtsaW5lLWhlaWdodDoxfQouYWRkLXVzZXItdGlsZS1pbm5lciBwe2ZvbnQtc2l6ZTouODVyZW19CgovKiDilIDilIAgRU1QVFkgU1RBVEUg4pSA4pSAICovCi5lbXB0eXt0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjY0cHggMjBweDtncmlkLWNvbHVtbjoxLy0xO2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpfQouZW1wdHkgLmJpZ3tmb250LXNpemU6M3JlbTttYXJnaW4tYm90dG9tOjE0cHh9CmVtcHR5IGgye2ZvbnQtc2l6ZToxLjFyZW07Y29sb3I6dmFyKC0tdGV4dCk7bWFyZ2luLWJvdHRvbTo2cHh9CmVtcHR5IHB7Zm9udC1zaXplOi44NzVyZW19CgovKiDilIDilIAgTU9EQUxTIOKUgOKUgCAqLwouZGVsLWVtcHR5IGgye2ZvbnQtc2l6ZToxLjFyZW07Y29sb3I6dmFyKC0tdGV4dCk7bWFyZ2luLWJvdHRvbTo2cHh9Ci5kZWwtZW1wdHkgcHtmb250LXNpemU6Ljg3NXJlbX0KCi5vdmVybGF5e3Bvc2l0aW9uOmZpeGVkO2luc2V0OjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC43Mik7ei1pbmRleDoyMDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3BhZGRpbmc6MjBweDtiYWNrZHJvcC1maWx0ZXI6Ymx1cig0cHgpO29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSB2YXIoLS10cil9Ci5vdmVybGF5Lm9wZW57b3BhY2l0eToxO3BvaW50ZXItZXZlbnRzOmFsbH0KLm1vZGFse2JhY2tncm91bmQ6dmFyKC0tc3VyZmFjZSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1yKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7cGFkZGluZzoyNnB4O3dpZHRoOm1pbig0NjBweCwxMDAlKTtib3gtc2hhZG93OnZhcigtLXNoYWRvdyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTZweCk7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gdmFyKC0tdHIpfQoub3ZlcmxheS5vcGVuIC5tb2RhbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX0KLm1vZGFsIGgye2ZvbnQtc2l6ZToxLjFyZW07Zm9udC13ZWlnaHQ6NzAwO21hcmdpbi1ib3R0b206MThweDtsZXR0ZXItc3BhY2luZzotLjAxZW19Ci5mZ3ttYXJnaW4tYm90dG9tOjE0cHh9Ci5mZyBsYWJlbHtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTouNzJyZW07Zm9udC13ZWlnaHQ6NzAwO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTtsZXR0ZXItc3BhY2luZzouMDZlbTtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTttYXJnaW4tYm90dG9tOjVweH0KLmZpe3dpZHRoOjEwMCU7YmFja2dyb3VuZDp2YXIoLS1zdXJmYWNlMik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2NvbG9yOnZhcigtLXRleHQpO2JvcmRlci1yYWRpdXM6dmFyKC0tci1zbSk7cGFkZGluZzo5cHggMTJweDtmb250LXNpemU6Ljg3NXJlbTt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciB2YXIoLS10cil9Ci5maTpmb2N1c3tvdXRsaW5lOm5vbmU7Ym9yZGVyLWNvbG9yOnZhcigtLWFjY2VudCl9Ci5tb2RhbC1hY3Rze2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7Z2FwOjhweDttYXJnaW4tdG9wOjIwcHh9CgovKiDilIDilIAgQ09MT1VSIFBJQ0tFUiDilIDilIAgKi8KLmNvbC1yb3d7ZGlzcGxheTpmbGV4O2dhcDo4cHg7ZmxleC13cmFwOndyYXB9Ci5jb2wtb3B0e3dpZHRoOjI2cHg7aGVpZ2h0OjI2cHg7Ym9yZGVyLXJhZGl1czo1MCU7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjNweCBzb2xpZCB0cmFuc3BhcmVudDt0cmFuc2l0aW9uOmFsbCB2YXIoLS10cil9Ci5jb2wtb3B0LnNlbHtib3JkZXItY29sb3I6I2ZmZjt0cmFuc2Zvcm06c2NhbGUoMS4xOCl9CgovKiDilIDilIAgRElTQ09WRVJFRCBMSVNUIOKUgOKUgCAqLwouZGlzYy1saXN0e21heC1oZWlnaHQ6MjEwcHg7b3ZlcmZsb3cteTphdXRvO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOnZhcigtLXItc20pO21hcmdpbi10b3A6NnB4O2JhY2tncm91bmQ6dmFyKC0tc3VyZmFjZTIpfQouZGlzYy1pdGVte3BhZGRpbmc6OXB4IDEycHg7Y3Vyc29yOnBvaW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIHZhcigtLXRyKTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDo5cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKX0KLmRpc2MtaXRlbTpsYXN0LWNoaWxke2JvcmRlci1ib3R0b206bm9uZX0KLmRpc2MtaXRlbTpob3ZlcntiYWNrZ3JvdW5kOnZhcigtLXN1cmZhY2UzKX0KLmRpc2MtaXRlbS5zZWx7YmFja2dyb3VuZDpyZ2JhKDEwNywxMzksMjM5LC4xOCl9Ci5kaXNjLW5hbWV7Zm9udC1zaXplOi44NzVyZW07Zm9udC13ZWlnaHQ6NjAwfQouZGlzYy1zdWJ7Zm9udC1zaXplOi43MnJlbTtjb2xvcjp2YXIoLS10ZXh0LW11dGVkKTtmb250LWZhbWlseTptb25vc3BhY2U7bWFyZ2luLXRvcDoxcHh9CgovKiDilIDilIAgVE9BU1Qg4pSA4pSAICovCiN0b2FzdHN7cG9zaXRpb246Zml4ZWQ7Ym90dG9tOjIycHg7cmlnaHQ6MjJweDt6LWluZGV4OjQwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDo3cHg7cG9pbnRlci1ldmVudHM6bm9uZX0KLnRvYXN0e2JhY2tncm91bmQ6dmFyKC0tc3VyZmFjZSk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6dmFyKC0tci1zbSk7cGFkZGluZzoxMXB4IDE2cHg7Zm9udC1zaXplOi44NXJlbTtmb250LXdlaWdodDo1MDA7Ym94LXNoYWRvdzp2YXIoLS1zaGFkb3cpO21heC13aWR0aDozMDBweDt0cmFuc2l0aW9uOm9wYWNpdHkgLjNzO2JvcmRlci1sZWZ0OjNweCBzb2xpZCB2YXIoLS1ib3JkZXIpfQoudG9hc3Quc3tib3JkZXItbGVmdC1jb2xvcjp2YXIoLS1zdWNjZXNzKX0KLnRvYXN0LmV7Ym9yZGVyLWxlZnQtY29sb3I6dmFyKC0tZGFuZ2VyKX0KLnRvYXN0Lnd7Ym9yZGVyLWxlZnQtY29sb3I6dmFyKC0td2FybmluZyl9CkBrZXlmcmFtZXMgdGl7ZnJvbXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMTAlKTtvcGFjaXR5OjB9dG97dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7b3BhY2l0eToxfX0KLnRvYXN0e2FuaW1hdGlvbjp0aSAuMjVzIGVhc2V9CgppbnB1dFt0eXBlPXRpbWVdOjotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3J7ZmlsdGVyOmludmVydCguNSl9CgpAbWVkaWEobWF4LXdpZHRoOjYwMHB4KXsKICBoZWFkZXJ7cGFkZGluZzoxMnB4IDE2cHh9CiAgbWFpbntwYWRkaW5nOjE0cHh9CiAgLmdyaWR7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcn0KfQo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoKPGRpdiBpZD0ic2V0dXAtc2NyZWVuIj4KICA8ZGl2IGNsYXNzPSJzZXR1cC1jYXJkIj4KICAgIDxzcGFuIGNsYXNzPSJzZXR1cC1sb2dvIj7wn5uh77iPPC9zcGFuPgogICAgPGgxPlBhcmVudGFsIENvbnRyb2xzPC9oMT4KICAgIDxwPkNvbm5lY3QgdG8geW91ciBIb21lIEFzc2lzdGFudCBpbnN0YW5jZS4gWW91J2xsIG5lZWQgYSA8c3Ryb25nPkxvbmctTGl2ZWQgQWNjZXNzIFRva2VuPC9zdHJvbmc+IGZyb20geW91ciBIQSBwcm9maWxlIHBhZ2UgKFByb2ZpbGUg4oaSIFNlY3VyaXR5IOKGkiBMb25nLUxpdmVkIEFjY2VzcyBUb2tlbnMpLjwvcD4KICAgIDxkaXYgY2xhc3M9ImZnIj4KICAgICAgPGxhYmVsPkhvbWUgQXNzaXN0YW50IFVSTDwvbGFiZWw+CiAgICAgIDxpbnB1dCBpZD0icy11cmwiIGNsYXNzPSJmaSIgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9Imh0dHBzOi8vaGEuZXhhbXBsZS5jb20iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJmZyI+CiAgICAgIDxsYWJlbD5Mb25nLUxpdmVkIEFjY2VzcyBUb2tlbjwvbGFiZWw+CiAgICAgIDxpbnB1dCBpZD0icy10b2siIGNsYXNzPSJmaSIgdHlwZT0icGFzc3dvcmQiIHBsYWNlaG9sZGVyPSJleUouLi4iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgPC9kaXY+CiAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgYnRuLWZ1bGwiIG9uY2xpY2s9ImRvU2V0dXAoKSI+Q29ubmVjdCDihpI8L2J1dHRvbj4KICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGlkPSJhcHAiPgogIDxoZWFkZXI+CiAgICA8ZGl2IGNsYXNzPSJoLWxlZnQiPgogICAgICA8c3BhbiBjbGFzcz0ibG9nby1pY29uIj7wn5uh77iPPC9zcGFuPgogICAgICA8aDE+UGFyZW50YWwgQ29udHJvbHM8L2gxPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJoLXJpZ2h0Ij4KICAgICAgPHNwYW4gaWQ9ImNvbm4tYmFkZ2UiIGNsYXNzPSJiYWRnZSBjb25uZWN0aW5nIj5Db25uZWN0aW5nPC9zcGFuPgogICAgICA8YnV0dG9uIGNsYXNzPSJpY29uLWJ0biIgb25jbGljaz0ib3Blbk1vZGFsKCdzZXR0aW5ncy1tb2RhbCcpIiB0aXRsZT0iU2V0dGluZ3MiPuKamTwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG9uY2xpY2s9Im9wZW5Nb2RhbCgnYWRkLXVzZXItbW9kYWwnKSI+77yLIEFkZCBVc2VyPC9idXR0b24+CiAgICA8L2Rpdj4KICA8L2hlYWRlcj4KICA8bWFpbj4KICAgIDxkaXYgaWQ9ImdyaWQiIGNsYXNzPSJncmlkIj48L2Rpdj4KICA8L21haW4+CjwvZGl2PgoKPGRpdiBpZD0idG9hc3RzIj48L2Rpdj4KCjxkaXYgaWQ9ImFkZC11c2VyLW1vZGFsIiBjbGFzcz0ib3ZlcmxheSIgb25jbGljaz0ib3ZlcmxheUNsaWNrKGV2ZW50LCdhZGQtdXNlci1tb2RhbCcpIj4KICA8ZGl2IGNsYXNzPSJtb2RhbCI+CiAgICA8aDI+QWRkIFVzZXI8L2gyPgogICAgPGRpdiBjbGFzcz0iZmciPgogICAgICA8bGFiZWw+TmFtZTwvbGFiZWw+CiAgICAgIDxpbnB1dCBpZD0idS1uYW1lIiBjbGFzcz0iZmkiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJlLmcuIEFsZXgiIC8+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZnIj4KICAgICAgPGxhYmVsPkNvbG91cjwvbGFiZWw+CiAgICAgIDxkaXYgY2xhc3M9ImNvbC1yb3ciIGlkPSJjb2wtcGlja2VyIj48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0ibW9kYWwtYWN0cyI+CiAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tZ2hvc3QiIG9uY2xpY2s9ImNsb3NlTW9kYWwoJ2FkZC11c2VyLW1vZGFsJykiPkNhbmNlbDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG9uY2xpY2s9ImNyZWF0ZVVzZXIoKSI+Q3JlYXRlIFVzZXI8L2J1dHRvbj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KCjxkaXYgaWQ9ImFkZC1kZXYtbW9kYWwiIGNsYXNzPSJvdmVybGF5IiBvbmNsaWNrPSJvdmVybGF5Q2xpY2soZXZlbnQsJ2FkZC1kZXYtbW9kYWwnKSI+CiAgPGRpdiBjbGFzcz0ibW9kYWwiPgogICAgPGgyPkFkZCBEZXZpY2U8L2gyPgogICAgPGRpdiBjbGFzcz0iZmciPgogICAgICA8bGFiZWw+RGV2aWNlIE5hbWU8L2xhYmVsPgogICAgICA8aW5wdXQgaWQ9ImQtbmFtZSIgY2xhc3M9ImZpIiB0eXBlPSJ0ZXh0IiBwbGFjZWhvbGRlcj0iZS5nLiBBbGV4J3MgaVBhZCIgLz4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iZmciPgogICAgICA8bGFiZWw+TUFDIEFkZHJlc3M8L2xhYmVsPgogICAgICA8aW5wdXQgaWQ9ImQtbWFjIiBjbGFzcz0iZmkiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJhYTpiYjpjYzpkZDplZTpmZiIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZnIj4KICAgICAgPGxhYmVsPk9yIHBpY2sgYSBkaXNjb3ZlcmVkIGRldmljZTwvbGFiZWw+CiAgICAgIDxkaXYgaWQ9ImRpc2MtbGlzdCIgY2xhc3M9ImRpc2MtbGlzdCI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWFjdHMiPgogICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWdob3N0IiBvbmNsaWNrPSJjbG9zZU1vZGFsKCdhZGQtZGV2LW1vZGFsJykiPkNhbmNlbDwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG9uY2xpY2s9ImFkZERldmljZSgpIj5BZGQgRGV2aWNlPC9idXR0b24+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGlkPSJzZXR0aW5ncy1tb2RhbCIgY2xhc3M9Im92ZXJsYXkiIG9uY2xpY2s9Im92ZXJsYXlDbGljayguZXZlbnQsJ3NldHRpbmdzLW1vZGFsJykiPgogIDxkaXYgY2xhc3M9Im1vZGFsIj4KICAgIDxoMj7implTZXR0aW5nczwvaDI+CiAgICA8ZGl2IGNsYXNzPSJmZyI+CiAgICAgIDxsYWJlbD5Ib21lIEFzc2lzdGFudCBVUkw8L2xhYmVsPgogICAgICA8aW5wdXQgaWQ9InNldC11cmwiIGNsYXNzPSJmaSIgdHlwZT0idGV4dCIgLz4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iZmciPgogICAgICA8bGFiZWw+TG9uZy1MaXZlZCBBY2Nlc3MgVG9rZW48L2xhYmVsPgogICAgICA8aW5wdXQgaWQ9InNldC10b2siIGNsYXNzPSJmaSIgdHlwZT0icGFzc3dvcmQiIC8+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWFjdHMiPgogICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWdob3N0IiBvbmNsaWNrPSJjbG9zZU1vZGFsKCdzZXR0aW5ncy1tb2RhbCcpIj5DYW5jZWw8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBvbmNsaWNrPSJzYXZlU2V0dGluZ3MoKSI+U2F2ZSAmYW1wOyBSZWNvbm5lY3Q8L2J1dHRvbj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KCjxzY3JpcHQ+CmNvbnN0IENGR19FTlRJVFkgPSAnaW5wdXRfdGV4dC5wYXJlbnRhbF9jb250cm9sX2NvbmZpZyc7CmNvbnN0IENPTE9SUyA9IFsnI2VmNTM1MCcsJyNmZjcwNDMnLCcjZmZhNzI2JywnIzY2YmI2YScsJyMyNmM2ZGEnLCcjNDJhNWY1JywnIzdlNTdjMicsJyNlYzQwN2EnLCcjMjZhNjlhJywnI2U2YzIyOSddOwpjb25zdCBNQUNfUkUgPSAvXihbMC05YS1mXXsyfTopezV9WzAtOWEtZl17Mn0kL2k7CgpsZXQgd3MsIHdzSWQgPSAxLCBwZW5kaW5nID0ge30sIHJldHJ5VGltZXI7CmxldCBzdGF0ZXMgPSB7fTsKbGV0IGNmZyA9IHsgdXNlcnM6IFtdIH07CmxldCBwcmVmcyA9IHsgdXJsOiAnJywgdG9rZW46ICcnIH07CmxldCBkZXZNb2RhbFVzZXJJZCA9IG51bGw7CmxldCBzY2hlZE9wZW4gPSB7fTsKbGV0IHJlbmRlclRpbWVyID0gbnVsbDsKCmZ1bmN0aW9uIGxvYWRQcmVmcygpIHsKICB0cnkgewogICAgY29uc3QgcCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwY19wcmVmcycpOwogICAgaWYgKHApIHsgcHJlZnMgPSBKU09OLnBhcnNlKHApOyByZXR1cm4gdHJ1ZTsgfQogIH0gY2F0Y2goZSkge30KICByZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gcGVyc2lzdFByZWZzKCkgewogIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdwY19wcmVmcycsIEpTT04uc3RyaW5naWZ5KHByZWZzKSk7Cn0KZnVuY3Rpb24gZG9TZXR1cCgpIHsKICBjb25zdCB1cmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncy11cmwnKS52YWx1ZS50cmltKCkucmVwbGFjZSgvXC8rJC8sJycpOwogIGNvbnN0IHRvayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzLXRvaycpLnZhbHVlLnRyaW0oKTsKICBpZiAoIXVybCB8fCAhdG9rKSB7IHRvYXN0KCdGaWxsIGluIGJvdGggZmllbGRzJywgJ2UnKTsgcmV0dXJuOyB9CiAgcHJlZnMgPSB7IHVybCwgdG9rZW46IHRvayB9OwogIHBlcnNpc3RQcmVmcygpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zY3JlZW4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAnKS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7CiAgY29ubmVjdCgpOwp9CmZ1bmN0aW9uIHNhdmVTZXR0aW5ncygpIHsKICBjb25zdCB1cmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0LXVybCcpLnZhbHVlLnRyaW0oKS5yZXBsYWNlKC9cLyskLywnJyk7CiAgY29uc3QgdG9rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldC10b2snKS52YWx1ZS50cmltKCk7CiAgaWYgKCF1cmwgfHwgIXRvaykgeyB0b2FzdCgnRmlsbCBpbiBib3RoIGZpZWxkcycsICdlJyk7IHJldHVybjsgfQogIHByZWZzID0geyB1cmwsIHRva2VuOiB0b2sgfTsKICBwZXJzaXN0UHJlZnMoKTsKICBjbG9zZU1vZGFsKCdzZXR0aW5ncy1tb2RhbCcpOwogIGlmICh3cykgd3MuY2xvc2UoKTsKICBjb25uZWN0KCk7Cn0KCmZ1bmN0aW9uIGNvbm5lY3QoKSB7CiAgc2V0QmFkZ2UoJ2Nvbm5lY3RpbmcnKTsKICBjbGVhclRpbWVvdXQocmV0cnlUaW1lcik7CiAgY29uc3Qgd3NVcmwgPSBwcmVmcy51cmwucmVwbGFjZSgvXmh0dHBzPy8sbSA9PiBtPT09J2h0dHBzJz8nd3NzJzond3MnKSArICcvYXBpL3dlYnNvY2tldCc7CiAgdHJ5IHsKICAgIHdzID0gbmV3IFdlYlNvY2tldCh3c1VybCk7CiAgICB3cy5vbm1lc3NhZ2UgPSBlID0+IGRpc3BhdGNoKEpTT04ucGFyc2UoZS5kYXRhKSk7CiAgICB3cy5vbmVycm9yICAgPSAoKSA9PiB7fTsKICAgIHdzLm9uY2xvc2UgICA9ICgpID0+IHsgc2V0QmFkZ2UoJ2Rpc2Nvbm5lY3RlZCcpOyByZXRyeVRpbWVyID0gc2V0VGltZW91dChjb25uZWN0LCA2MDAwKTsgfTsKICB9IGNhdGNoKGV4KSB7CiAgICBzZXRCYWRnZSgnZGlzY29ubmVjdGVkJyk7CiAgICByZXRyeVRpbWVyID0gc2V0VGltZW91dChjb25uZWN0LCA2MDAwKTsKICB9Cn0KCmZ1bmN0aW9uIGRpc3BhdGNoKG1zZykgewogIHN3aXRjaCAobXNnLnR5cGUpIHsKICAgIGNhc2UgJ2F1dGhfcmVxdWlyZWQnOgogICAgICBzZW5kKHsgdHlwZTonYXV0aCcsIGFjY2Vzc190b2tlbjogcHJlZnMudG9rZW4gfSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAnYXV0aF9vayc6IG9uQXV0aCgpOyBicmVhazsKICAgIGNhc2UgJ2F1dGhfaW52YWxpZCc6CiAgICAgIHNldEJhZGdlKCdkaXNjb25uZWN0ZWQnKTsKICAgICAgdG9hc3QoJ0hBIGF1dGggZmFpbGVkIOKAlCBjaGVjayB5b3VyIHRva2VuJywgJ2UnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdyZXN1bHQnOgogICAgICBpZiAocGVuZGluZ1ttc2cuaWRdKSB7CiAgICAgICAgY29uc3QgeyByZXMsIHJlaiB9ID0gcGVuZGluZ1ttc2cuaWRdOwogICAgICAgIGRlbGV0ZSBwZW5kaW5nW21zZy5pZF07CiAgICAgICAgbXNnLnN1Y2Nlc3MgPyByZXMobXNnKSA6IHJlaihuZXcgRXJyb3IobXNnLmVycm9yPy5tZXNzYWdlIHx8ICdIQSBlcnJvcicpKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgJ2V2ZW50JzoKICAgICAgaWYgKG1zZy5ldmVudD8uZXZlbnRfdHlwZSA9PT0gJ3N0YXRlX2NoYW5nZWQnKSBvblN0YXRlQ2hhbmdlKG1zZy5ldmVudC5kYXRhKTsKICAgICAgYnJlYWs7CiAgfQp9CgpmdW5jdGlvbiBzZW5kKG1zZykgewogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHsKICAgIGNvbnN0IGlkID0gd3NJZCsrOwogICAgbXNnLmlkID0gaWQ7CiAgICBwZW5kaW5nW2lkXSA9IHsgcmVzLCByZWogfTsKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICBpZiAocGVuZGluZ1tpZF0pIHsgZGVsZXRlIHBlbmRpbmdbaWRdOyByZWoobmV3IEVycm9yKCd0aW1lb3V0JykpOyB9CiAgICB9LCAxMjAwMCk7CiAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KG1zZykpOwogIH0pOwp9Cgphc3luYyBmdW5jdGlvbiBvbkF1dGgoKSB7CiAgc2V0QmFkZ2UoJ2Nvbm5lY3RlZCcpOwogIGNvbnN0IHIgPSBhd2FpdCBzZW5kKHsgdHlwZTogJ2dldF9zdGF0ZXMnIH0pOwogIHIucmVzdWx0LmZvckVhY2gocyA9PiB7IHN0YXRlc1tzLmVudGl0eV9pZF0gPSBzOyB9KTsKICBhd2FpdCBzZW5kKHsgdHlwZTogJ3N1YnNjcmliZV9ldmVudHMnLCBldmVudF90eXBlOiAnc3RhdGVfY2hhbmdlZCcgfSk7CiAgcGFyc2VDZmcoc3RhdGVzW0NGR19FTlRJVFldPy5zdGF0ZSk7CiAgcmVuZGVyKCk7Cn0KCmZ1bmN0aW9uIG9uU3RhdGVDaGFuZ2UoeyBlbnRpdHlfaWQsIG5ld19zdGF0ZSB9KSB7CiAgc3RhdGVzW2VudGl0eV9pZF0gPSBuZXdfc3RhdGU7CiAgaWYgKGVudGl0eV9pZCA9PT0gQ0ZHX0VOVElUWSkgeyBwYXJzZUNmZyhuZXdfc3RhdGU/LnN0YXRlKTsgc2NoZWRSZW5kZXIoKTsgcmV0dXJuOyB9CiAgaWYgKGVudGl0eV9pZC5zdGFydHNXaXRoKCdkZXZpY2VfdHJhY2tlci4nKSkgewogICAgaWYgKG5ld19zdGF0ZT8uc3RhdGUgPT09ICdob21lJykgaGFuZGxlUmVjb25uZWN0KG5ld19zdGF0ZSk7CiAgICBzY2hlZFJlbmRlcigpOwogIH0KfQoKYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVjb25uZWN0KHQpIHsKICBjb25zdCBtYWMgPSBub3JtTWFjKHQuYXR0cmlidXRlcz8ubWFjIHx8IHQuYXR0cmlidXRlcz8ubWFjX2FkZHJlc3MgfHwgJycpOwogIGNvbnN0IG5ld0lwID0gdC5hdHRyaWJ1dGVzPy5pcCB8fCB0LmF0dHJpYnV0ZXM/LmlwX2FkZHJlc3MgfHwgJyc7CiAgaWYgKCFtYWMgfHwgIW5ld0lwKSByZXR1cm47CiAgZm9yIChjb25zdCB1c2VyIG9mIGNmZy51c2VycykgewogICAgZm9yIChjb25zdCBkZXYgb2YgdXNlci5kZXZpY2VzKSB7CiAgICAgIGlmIChub3JtTWFjKGRldi5tYWMpID09PSBtYWMgJiYgZGV2LmJsb2NrZWQpIHsKICAgICAgICBkZXYubGFzdF9pcCA9IG5ld0lwOwogICAgICAgIGF3YWl0IGNhbGxCbG9jayhuZXdJcCk7CiAgICAgICAgYXdhaXQgY2FsbEFwcGx5KCk7CiAgICAgICAgdG9hc3QoYFJlLWJsb2NrZWQgJHtkZXYubmFtZX0gKHJlY29ubmVjdGVkKWAsICd3Jyk7CiAgICAgICAgYXdhaXQgc2F2ZUNmZygpOwogICAgICB9CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBwYXJzZUNmZyh2YWwpIHsKICB0cnkgewogICAgaWYgKHZhbCAmJiB2YWwgIT09ICd1bmtub3duJyAmJiB2YWwgIT09ICd1bmF2YWlsYWJsZScgJiYgdmFsLnRyaW0oKVswXSA9PT0gJ3snKSB7CiAgICAgIGNmZyA9IEpTT04ucGFyc2UodmFsKTsKICAgICAgaWYgKCFjZmcudXNlcnMpIGNmZy51c2VycyA9IFtdOwogICAgfQogIH0gY2F0Y2goZSkge30KfQoKYXN5bmMgZnVuY3Rpb24gc2F2ZUNmZygpIHsKICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoY2ZnKTsKICBpZiAoanNvbi5sZW5ndGggPiA5NTAwKSB0b2FzdCgnQ29uZmlnIG5lYXJpbmcgc2l6ZSBsaW1pdCcsICd3Jyk7CiAgdHJ5IHsKICAgIGF3YWl0IHNlbmQoeyB0eXBlOidjYWxsX3NlcnZpY2UnLCBkb21haW46J2lucHV0X3RleHQnLCBzZXJ2aWNlOidzZXRfdmFsdWUnLCBzZXJ2aWNlX2RhdGE6eyBlbnRpdHlfaWQ6IENGR19FTlRJVFksIHZhbHVlOiBqc29uIH0gfSk7CiAgfSBjYXRjaChlKSB7IHRvYXN0KCdGYWlsZWQgdG8gc2F2ZSBjb25maWcnLCAnZScpOyB9Cn0KCmZ1bmN0aW9uIG5vcm1NYWMobSkgeyByZXR1cm4gbS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLy0vZywnOicpOyB9CgpmdW5jdGlvbiBkZXZpY2VJbmZvKG1hYykgewogIGNvbnN0IG0gPSBub3JtTWFjKG1hYyk7CiAgZm9yIChjb25zdCBbZWlkLCBzXSBvZiBPYmplY3QuZW50cmllcyhzdGF0ZXMpKSB7CiAgICBpZiAoIWVpZC5zdGFydHNXaXRoKCdkZXZpY2VfdHJhY2tlci4nKSkgY29udGludWU7CiAgICBjb25zdCBhID0gcy5hdHRyaWJ1dGVzIHx8IHt9OwogICAgY29uc3Qgc20gPSBub3JtTWFjKGEubWFjIHx8IGEubWFjX2FkZHJlc3MgfHwgYS5tYWNhZGRyZXNzIHx8ICcnKTsKICAgIGlmIChzbSA9PT0gbSkgcmV0dXJuIHsgb25saW5lOiBzLnN0YXRlID09PSAnaG9tZScsIGlwOiBhLmlwIHx8IGEuaXBfYWRkcmVzcyB8fCAnJywgbGFiZWw6IGEuZnJpZW5kbHlfbmFtZSB8fCBhLmhvc3RuYW1lIHx8IGVpZC5yZXBsYWNlKCdkZXZpY2VfdHJhY2tlci4nLCcnKSwgZWlkIH07CiAgfQogIHJldHVybiB7IG9ubGluZTogZmFsc2UsIGlwOiAnJywgbGFiZWw6ICcnLCBlaWQ6IG51bGwgfTsKfQoKZnVuY3Rpb24gZGlzY292ZXJlZERldmljZXMoKSB7CiAgY29uc3QgYXNzaWduZWQgPSBuZXcgU2V0KGNmZy51c2Vycy5mbGF0TWFwKHUgPT4gdS5kZXZpY2VzLm1hcChkID0+IG5vcm1NYWMoZC5tYWMpKSkpOwogIGNvbnN0IG91dCA9IFtdOwogIGZvciAoY29uc3QgW2VpZCwgc10gb2YgT2JqZWN0LmVudHJpZXMoc3RhdGVzKSkgewogICAgaWYgKCFlaWQuc3RhcnRzV2l0aCgnZGV2aWNlX3RyYWNrZXIuJykpIGNvbnRpbnVlOwogICAgY29uc3QgYSA9IHMuYXR0cmlidXRlcyB8fCB7fTsKICAgIGNvbnN0IG1hYyA9IG5vcm1NYWMoYS5tYWMgfHwgYS5tYWNfYWRkcmVzcyB8fCBhLm1hY2FkZHJlc3MgfHwgJycpOwogICAgaWYgKCFtYWMgfHwgYXNzaWduZWQuaGFzKG1hYykpIGNvbnRpbnVlOwogICAgb3V0LnB1c2goeyBtYWMsIGVpZCwgbmFtZTogYS5mcmllbmRseV9uYW1lIHx8IGEuaG9zdG5hbWUgfHwgZWlkLnJlcGxhY2UoJ2RldmljZV90cmFja2VyLicsJycpLCBpcDogYS5pcCB8fCBhLmlwX2FkZHJlc3MgfHwgJycsIG9ubGluZTogcy5zdGF0ZSA9PT0gJ2hvbWUnIH0pOwogIH0KICByZXR1cm4gb3V0LnNvcnQoKGEsYikgPT4gYi5vbmxpbmUgLSBhLm9ubGluZSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNhbGxCbG9jayhpcCkgeyBhd2FpdCBzZW5kKHsgdHlwZTonY2FsbF9zZXJ2aWNlJywgZG9tYWluOidzY3JpcHQnLCBzZXJ2aWNlOidwYXJlbnRhbF9ibG9ja19pcCcsIHNlcnZpY2VfZGF0YTp7IGlwIH0gfSk7IH0KYXNzeW5jIGZ1bmN0aW9uIGNhbGxVbmJsb2NrKGlwKSB7IGF3YWl0IHNlbmQoeyB0eXBlOidjYWxsX3NlcnZpY2UnLCBkb21haW46J3NjcmlwdCcsIHNlcnZpY2U6J3BhcmVudGFsX3VuYmxvY2tfaXAnLCBzZXJ2aWNlX2RhdGE6eyBpcCB9IH0pOyB9CmFzeW5jIGZ1bmN0aW9uIGNhbGxBcHBseSgpIHsgdHJ5IHsgYXdhaXQgc2VuZCh7IHR5cGU6J2NhbGxfc2VydmljZScsIGRvbWFpbjonc2NyaXB0Jywgc2VydmljZToncGFyZW50YWxfYXBwbHlfZmlyZXdhbGwnLCBzZXJ2aWNlX2RhdGE6e30gfSk7IH0gY2F0Y2goZSkge30gfQoKYXN5bmMgZnVuY3Rpb24gdG9nZ2xlVXNlcih1c2VySWQpIHsKICBjb25zdCB1c2VyID0gY2ZnLnVzZXJzLmZpbmQodSA9PiB1LmlkID09PSB1c2VySWQpOwogIGlmICghdXNlcikgcmV0dXJuOwogIGNvbnN0IGJsb2NrID0gIXVzZXIuYmxvY2tlZDsKICB1c2VyLmJsb2NrZWQgPSBibG9jazsKICBsZXQgb2sgPSAwLCBmYWlsID0gMDsKICBmb3IgKGNvbnN0IGRldiBvZiB1c2VyLmRldmljZXMpIHsKICAgIGNvbnN0IGluZm8gPSBkZXZpY2VJbmZvKGRldi5tYWMpOwogICAgY29uc3QgaXAgPSBpbmZvLmlwIHx8IGRldi5sYXN0X2lwOwogICAgaWYgKGlwKSB7CiAgICAgIHRyeSB7CiAgICAgICAgYmxvY2sgPyBhd2FpdCBjYWxsQmxvY2soaXApIDogYXdhaXQgY2FsbFVuYmxvY2soaXApOwogICAgICAgIGRldi5ibG9ja2VkID0gYmxvY2s7CiAgICAgICAgaWYgKGluZm8uaXApIGRldi5sYXN0X2lwID0gaW5mby5pcDsKICAgICAgICBvaysrOwogICAgICB9IGNhdGNoKGUpIHsgZmFpbCsrOyB9CiAgICB9IGVsc2UgewogICAgICBkZXYuYmxvY2tlZCA9IGJsb2NrOwogICAgICBpZiAoYmxvY2spIHRvYXN0KGAke2Rldi5uYW1lfTogbm8gSVAgeWV0IOKAlCB3aWxsIGJsb2NrIHdoZW4gaXQgY29ubmVjdHNgLCAndycpOwogICAgfQogIH0KICBhd2FpdCBjYWxsQXBwbHkoKTsKICBhd2FpdCBzYXZlQ2ZnKCk7CiAgcmVuZGVyKCk7CiAgaWYgKGZhaWwgPT09IDApIHRvYXN0KGAke3VzZXIubmFtZX0gJHtibG9jayA/ICdibG9ja2VkIPCflJInIDogJ3VuYmxvY2tlZCDinJMnfWAsIGJsb2NrID8gJ3cnIDogJ3MnKTsKICBlbHNlIHRvYXN0KGAke29rfSBvaywgJHtmYWlsfSBmYWlsZWRgLCAnZScpOwp9CgphY3luYyBmdW5jdGlvbiB0b2dnbGVEZXZpY2UodXNlcklkLCBtYWMpIHsKICBjb25zdCB1c2VyID0gY2ZnLnVzZXJzLmZpbmQodSA9PiB1LmlkID09PSB1c2VySWQpOwogIGNvbnN0IGRldiAgPSB1c2VyPy5kZXZpY2VzLmZpbmQoZCA9PiBkLm1hYyA9PT0gbWFjKTsKICBpZiAoIWRldikgcmV0dXJuOwogIGNvbnN0IGJsb2NrID0gIWRldi5ibG9ja2VkOwogIGNvbnN0IGluZm8gID0gZGV2aWNlSW5mbyhtYWMpOwogIGNvbnN0IGlwICAgID0gaW5mby5pcCB8fCBkZXYubGFzdF9pcDsKICBpZiAoIWlwKSB7CiAgICBkZXYuYmxvY2tlZCA9IGJsb2NrOwogICAgYXdhaXQgc2F2ZUNmZygpOyByZW5kZXIoKTsKICAgIHRvYXN0KGJsb2NrID8gYCR7ZGV2Lm5hbWV9OiBubyBJUCB5ZXQg4oCUIHdpbGwgYXBwbHkgd2hlbiBvbmxpbmVgIDogYCR7ZGV2Lm5hbWV9IG1hcmtlZCB1bmJsb2NrZWRgLCBibG9jaz8ndyc6J3MnKTsKICAgIHJldHVybjsKICB9CiAgdHJ5IHsKICAgIGJsb2NrID8gYXdhaXQgY2FsbEJsb2NrKGlwKSA6IGF3YWl0IGNhbGxVbmJsb2NrKGlwKTsKICAgIGRldi5ibG9ja2VkID0gYmxvY2s7CiAgICBpZiAoaW5mby5pcCkgZGV2Lmxhc3RfaXAgPSBpbmZvLmlwOwogICAgYXdhaXQgY2FsbEFwcGx5KCk7CiAgICBhd2FpdCBzYXZlQ2ZnKCk7IHJlbmRlcigpOwogICAgdG9hc3QoYCR7ZGV2Lm5hbWV9ICR7YmxvY2sgPyAnYmxvY2tlZCDwn5SSJyA6ICd1bmJsb2NrZWQg4pyTJ31gLCBibG9jayA/ICd3JyA6ICdzJyk7CiAgfSBjYXRjaChlKSB7CiAgICB0b2FzdChgRmFpbGVkIHRvICR7YmxvY2s/J2Jsb2NrJzondW5ibG9jayd9ICR7ZGV2Lm5hbWV9YCwgJ2UnKTsKICB9Cn0KCnNldEludGVydmFsKHJ1blNjaGVkdWxlcywgNjAwMDApOwoKYXN5bmMgZnVuY3Rpb24gcnVuU2NoZWR1bGVzKCkgewogIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7CiAgY29uc3QgaGhtbSA9IHBhZDIobm93LmdldEhvdXJzKCkpICsgJzonICsgcGFkMihub3cuZ2V0TWludXRlcygpKTsKICBjb25zdCB3ZWVrZW5kID0gbm93LmdldERheSgpID09PSAwIHx8IG5vdy5nZXREYXkoKSA9PT0gNjsKICBsZXQgY2hhbmdlZCA9IGZhbHNlOwogIGZvciAoY29uc3QgdXNlciBvZiBjZmcudXNlcnMpIHsKICAgIGlmICghdXNlci5zY2hlZHVsZT8uZW5hYmxlZCkgY29udGludWU7CiAgICBjb25zdCBzbG90ID0gd2Vla2VuZCA/IHVzZXIuc2NoZWR1bGUud2Vla2VuZCA6IHVzZXIuc2NoZWR1bGUud2Vla2RheTsKICAgIGNvbnN0IHNob3VsZEJsb2NrID0gaW5SYW5nZShoaG1tLCBzbG90LmJsb2NrX3RpbWUsIHNsb3QudW5ibG9ja190aW1lKTsKICAgIGlmIChzaG91bGRCbG9jayA9PT0gdXNlci5ibG9ja2VkKSBjb250aW51ZTsKICAgIHVzZXIuYmxvY2tlZCA9IHNob3VsZEJsb2NrOwogICAgZm9yIChjb25zdCBkZXYgb2YgdXNlci5kZXZpY2VzKSB7CiAgICAgIGNvbnN0IGluZm8gPSBkZXZpY2VJbmZvKGRldi5tYWMpOwogICAgICBjb25zdCBpcCAgID0gaW5mby5pcCB8fCBkZXYubGFzdF9pcDsKICAgICAgaWYgKGlwKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHNob3VsZEJsb2NrID8gYXdhaXQgY2FsbEJsb2NrKGlwKSA6IGF3YWl0IGNhbGxVbmJsb2NrKGlwKTsKICAgICAgICAgIGRldi5ibG9ja2VkID0gc2hvdWxkQmxvY2s7CiAgICAgICAgICBpZiAoaW5mby5pcCkgZGV2Lmxhc3RfaXAgPSBpbmZvLmlwOwogICAgICAgIH0gY2F0Y2goZSkge30KICAgICAgfSBlbHNlIHsgZGV2LmJsb2NrZWQgPSBzaG91bGRCbG9jazsgfQogICAgfQogICAgdG9hc3QoYCR7dXNlci5uYW1lfSAke3Nob3VsZEJsb2NrID8gJ2Jsb2NrZWQgYnkgc2NoZWR1bGUg8J+VkCcgOiAndW5ibG9ja2VkIGJ5IHNjaGVkdWxlIOKckyd9YCwgc2hvdWxkQmxvY2s/J3cnOidzJyk7CiAgICBjaGFuZ2VkID0gdHJ1ZTsKICB9CiAgaWYgKGNoYW5nZWQpIHsgYXdhaXQgY2FsbEFwcGx5KCk7IGF3YWl0IHNhdmVDZmcoKTsgcmVuZGVyKCk7IH0KfQoKZnVuY3Rpb24gaW5SYW5nZShub3csIGJ0LCB1dCkgewogIGlmICghYnQgfHwgIXV0IHx8IGJ0ID09PSB1dCkgcmV0dXJuIGZhbHNlOwogIHJldHVybiBidCA8IHV0ID8gKG5vdyA+PSBidCAmJiBub3cgPCB1dCkgOiAobm93ID49IGJ0IHx8IG5vdyA8IHV0KTsKfQoKYXN5bmMgZnVuY3Rpb24gb25TY2hlZENoYW5nZSh1c2VySWQsIGZpZWxkLCB2YWx1ZSkgewogIGNvbnN0IHVzZXIgPSBjZmcudXNlcnMuZmluZCh1ID0+IHUuaWQgPT09IHVzZXJJZCk7CiAgaWYgKCF1c2VyKSByZXR1cm47CiAgaWYgKCF1c2VyLnNjaGVkdWxlKSB1c2VyLnNjaGVkdWxlID0geyBlbmFibGVkOmZhbHNlLCB3ZWVrZGF5OntibG9ja190aW1lOicyMTowMCcsdW5ibG9ja190aW1lOicwNzowMCd9LCB3ZWVrZW5kOntibG9ja190aW1lOicyMjowMCcsdW5ibG9ja190aW1lOicwODowMCd9IH07CiAgaWYgKGZpZWxkID09PSAnZW5hYmxlZCcpIHVzZXIuc2NoZWR1bGUuZW5hYmxlZCA9IHZhbHVlOwogIGVsc2UgeyBjb25zdCBbc2xvdCwga2V5XSA9IGZpZWxkLnNwbGl0KCcuJyk7IHVzZXIuc2NoZWR1bGVbc2xvdF1ba2V5XSA9IHZhbHVlOyB9CiAgYXdhaXQgc2F2ZUNmZygpOwp9CgpmdW5jdGlvbiB1aWQoKSB7IHJldHVybiAndScgKyBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KSArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsNik7IH0KCmZ1bmN0aW9uIG9wZW5BZGRVc2VyTW9kYWwoKSB7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3UtbmFtZScpLnZhbHVlID0gJyc7CiAgYnVpbGRDb2xvclBpY2tlcihDT0xPUlNbY2ZnLnVzZXJzLmxlbmd0aCAlIENPTE9SUy5sZW5ndGhdKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkLXVzZXItbW9kYWwnKS5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7Cn0KCmZ1bmN0aW9uIGNyZWF0ZVVzZXIoKSB7CiAgY29uc3QgbmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1LW5hbWUnKS52YWx1ZS50cmltKCk7CiAgaWYgKCFuYW1lKSB7IHRvYXN0KCdFbnRlciBhIG5hbWUnLCAnZScpOyByZXR1cm47IH0KICBjb25zdCBzZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY29sLXBpY2tlciAuY29sLW9wdC5zZWwnKTsKICBjb25zdCBjb2xvciA9IHNlbCA/IHNlbC5kYXRhc2V0LmMgOiBDT0xPUlNbMF07CiAgY2ZnLnVzZXJzLnB1c2goeyBpZDogdWlkKCksIG5hbWUsIGNvbG9yLCBibG9ja2VkOiBmYWxzZSwgZGV2aWNlczogW10sIHNjaGVkdWxlOiB7IGVuYWJsZWQ6ZmFsc2UsIHdlZWtkYXk6e2Jsb2NrX3RpbWU6JzIxOjAwJyx1bmJsb2NrX3RpbWU6JzA3OjAwJ30sIHdlZWtlbmQ6e2Jsb2NrX3RpbWU6JzIyOjAwJyx1bmJsb2NrX3RpbWU6JzA4OjAwJ30gfSB9KTsKICBzYXZlQ2ZnKCk7IHJlbmRlcigpOyBjbG9zZU1vZGFsKCdhZGQtdXNlci1tb2RhbCcpOwogIHRvYXN0KGAke25hbWV9IGFkZGVkYCwgJ3MnKTsKfQoKYXN5bmMgZnVuY3Rpb24gZGVsZXRlVXNlcih1c2VySWQpIHsKICBjb25zdCB1c2VyID0gY2ZnLnVzZXJzLmZpbmQodSA9PiB1LmlkID09PSB1c2VySWQpOwogIGlmICghdXNlciB8fCAhY29uZmlybShgUmVtb3ZlICR7dXNlci5uYW1lfSBhbmQgdW5ibG9jayBhbGwgdGhlaXIgZGV2aWNlcz9gKSkgcmV0dXJuOwogIGxldCBhbnlCbG9ja2VkID0gZmFsc2U7CiAgZm9yIChjb25zdCBkZXYgb2YgdXNlci5kZXZpY2VzLmZpbHRlcihkID0+IGQuYmxvY2tlZCkpIHsKICAgIGNvbnN0IGlwID0gZGV2aWNlSW5mbyhkZXYubWFjKS5pcCB8fCBkZXYubGFzdF9pcDsKICAgIGlmIChpcCkgeyB0cnkgeyBhd2FpdCBjYWxsVW5ibG9jayhpcCk7IGFueUJsb2NrZWQgPSB0cnVlOyB9IGNhdGNoKGUpIHt9IH0KICB9CiAgaWYgKGFueUJsb2NrZWQpIGF3YWl0IGNhbGxBcHBseSgpOwogIGNmZy51c2VycyA9IGNmZy51c2Vycy5maWx0ZXIodSA9PiB1LmlkICE9PSB1c2VySWQpOwogIGF3YWl0IHNhdmVDZmcoKTsgcmVuZGVyKCk7CiAgdG9hc3QoYCR7dXNlci5uYW1lfSByZW1vdmVkYCwgJ3MnKTsKfQoKZnVuY3Rpb24gb3BlbkFkZERldmljZU1vZGFsKHVzZXJJZCkgewogIGRldk1vZGFsVXNlcklkID0gdXNlcklkOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkLW5hbWUnKS52YWx1ZSA9ICcnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkLW1hYycpLnZhbHVlICA9ICcnOwogIGNvbnN0IGRpc2MgPSBkaXNjb3ZlcmVkRGV2aWNlcygpOwogIGNvbnN0IGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzYy1saXN0Jyk7CiAgaWYgKCFkaXNjLmxlbmd0aCkgewogICAgbGlzdC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT0icGFkZGluZzoxMnB4O3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZTouODJyZW07Y29sb3I6dmFyKC0tdGV4dC1tdXRlZCkiPk5vIHVuYXNzaWduZWQgZGV2aWNlcyBmb3VuZDwvZGl2Pic7CiAgfSBlbHNlIHsKICAgIGxpc3QuaW5uZXJIVE1MID0gZGlzYy5tYXAoZCA9PiBgPGRpdiBjbGFzcz0iZGlzYy1pdGVtIiBkYXRhLW1hYz0iJHtkLm1hY30iIGRhdGEtbmFtZT0iJHtlc2MoZC5uYW1lKX0iIG9uY2xpY2s9InBpY2tEaXNjKHRoaXMpIj48c3BhbiBzdHlsZT0id2lkdGg6N3B4O2hlaWdodDo3cHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZDoke2Qub25saW5lPyd2YXIoLS1zdWNjZXNzKSc6J3ZhcigtLXRleHQtbXV0ZWQpJ307ZmxleC1zaHJpbms6MCI+PC9zcGFuPjxkaXY+PGRpdiBjbGFzcz0iZGlzYy1uYW1lIj4ke2VzYyhkLm5hbWUpfTwvZGl2PjxkaXYgY2xhc3M9ImRpc2Mtc3ViIj4ke2QubWFjfSR7ZC5pcD8nIMK3ICcrZC5pcDonJ308L2Rpdj48L2Rpdj48L2Rpdj5gKS5qb2luKCcnKTsKICB9CiAgb3Blbk1vZGFsKCdhZGQtZGV2LW1vZGFsJyk7Cn0KCmZ1bmN0aW9uIHBpY2tEaXNjKGVsKSB7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpc2MtaXRlbScpLmZvckVhY2goaSA9PiBpLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbCcpKTsKICBlbC5jbGFzc0xpc3QuYWRkKCdzZWwnKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZC1uYW1lJykudmFsdWUgPSBlbC5kYXRhc2V0Lm5hbWU7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2QtbWFjJykudmFsdWUgID0gZWwuZGF0YXNldC5tYWM7Cn0KCmFzeW5jIGZ1bmN0aW9uIGFkZERldmljZSgpIHsKICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2QtbmFtZScpLnZhbHVlLnRyaW0oKTsKICBjb25zdCBtYWMgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2QtbWFjJykudmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgaWYgKCFuYW1lKSB7IHRvYXN0KCdFbnRlciBhIGRldmljZSBuYW1lJywgJ2UnKTsgcmV0dXJuOyB9CiAgaWYgKCFNQUNfUkUudGVzdChtYWMpKSB7IHRvYXN0KCdJbnZhbGlkIE1BQyAoZm9ybWF0OiBhYTpiYjpjYzpkZDplZTpmZiknLCAnZScpOyByZXR1cm47IH0KICBpZiAoY2ZnLnVzZXJzLnNvbWUodSA9PiB1LmRldmljZXMuc29tZShkID0+IG5vcm1NYWMoZC5tYWMpID09PSBub3JtTWFjKG1hYykpKSkgeyB0b2FzdCgnVGhhdCBNQUMgaXMgYWxyZWFkeSBhc3NpZ25lZCcsICdlJyk7IHJldHVybjsgfQogIGNvbnN0IHVzZXIgPSBjZmcudXNlcnMuZmluZCh1ID0+IHUuaWQgPT09IGRldk1vZGFsVXNlcklkKTsKICBpZiAoIXVzZXIpIHJldHVybjsKICBjb25zdCBpbmZvID0gZGV2aWNlSW5mbyhtYWMpOwogIHVzZXIuZGV2aWNlcy5wdXNoKHsgbmFtZSwgbWFjOiBtYWMudG9Mb3dlckNhc2UoKSwgYmxvY2tlZDogZmFsc2UsIGxhc3RfaXA6IGluZm8uaXAgfHwgJycgfSk7CiAgYXdhaXQgc2F2ZUNmZygpOyByZW5kZXIoKTsgY2xvc2VNb2RhbCgnYWRkLWRldi1tb2RhbCcpOwogIHRvYXN0KGAke25hbWV9IGFkZGVkIHRvICR7dXNlci5uYW1lfWAsICdzJyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURldmljZSh1c2VySWQsIG1hYykgewogIGNvbnN0IHVzZXIgPSBjZmcudXNlcnMuZmluZCh1ID0+IHUuaWQgPT09IHVzZXJJZCk7CiAgY29uc3QgZGV2ICA9IHVzZXI/LmRldmljZXMuZmluZChkID0+IGQubWFjID09PSBtYWMpOwogIGlmICghZGV2KSByZXR1cm47CiAgaWYgKGRldi5ibG9ja2VkKSB7CiAgICBjb25zdCBpcCA9IGRldmljZUluZm8obWFjKS5pcCB8fCBkZXYubGFzdF9pcDsKICAgIGlmIChpcCkgeyB0cnkgeyBhd2FpdCBjYWxsVW5ibG9jayhpcCk7IGF3YWl0IGNhbGxBcHBseSgpOyB9IGNhdGNoKGUpIHt9IH0KICB9CiAgdXNlci5kZXZpY2VzID0gdXNlci5kZXZpY2VzLmZpbHRlcihkID0+IGQubWFjICE9PSBtYWMpOwogIGF3YWl0IHNhdmVDZmcoKTsgcmVuZGVyKCk7CiAgdG9hc3QoYCR7ZGV2Lm5hbWV9IHJlbW92ZWRgLCAncycpOwp9CgpmdW5jdGlvbiBzY2hlZFJlbmRlcigpIHsgY2xlYXJUaW1lb3V0KHJlbmRlclRpbWVyKTsgcmVuZGVyVGltZXIgPSBzZXRUaW1lb3V0KHJlbmRlciwgNDAwKTsgfQoKZnVuY3Rpb24gcmVuZGVyKCkgewogIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ3JpZCcpOwogIGlmICghY2ZnLnVzZXJzLmxlbmd0aCkgewogICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iZW1wdHkiPjxkaXYgY2xhc3M9ImJpZyI+8J+RqOKAjfCfkanguI3wn5Gn4oCN8J+RpjwvZGl2PjxoMj5ObyB1c2VycyB5ZXQ8L2gyPjxwPkFkZCBhIHVzZXIgdG8gc3RhcnQgbWFuYWdpbmcgaW50ZXJuZXQgYWNjZXNzLjwvcD48YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIHN0eWxlPSJtYXJnaW4tdG9wOjE0cHgiIG9uY2xpY2s9Im9wZW5Nb2RhbChcJ2FkZC11c2VyLW1vZGFsXCcpIj7vvIsgQWRkIEZpcnN0IFVzZXI8L2J1dHRvbj48L2Rpdj4nOwogICAgcmV0dXJuOwogIH0KICBncmlkLmlubmVySFRNTCA9IGNmZy51c2Vycy5tYXAodSA9PiByZW5kZXJVc2VyKHUpKS5qb2luKCcnKSArICc8ZGl2IGNsYXNzPSJhZGQtdXNlci10aWxlIiBvbmNsaWNrPSJvcGVuTW9kYWwoXCdhZGQtdXNlci1tb2RhbFwnKSI+PGRpdiBjbGFzcz0iYWRkLXVzZXItdGlsZS1pbm5lciI+PGRpdiBjbGFzcz0icGx1cyI+77yLPC9kaXY+PHAgPkFkZCBVc2VyPC9wPjwvZGl2PjwvZGl2Pic7Cn0KCmZ1bmN0aW9uIHJlbmRlclVzZXIodXNlcikgewogIGNvbnN0IHNjaGVkICA9IHVzZXIuc2NoZWR1bGUgfHwgeyBlbmFibGVkOmZhbHNlLCB3ZWVrZGF5OntibG9ja190aW1lOicyMTowMCcsdW5ibG9ja190aW1lOicwNzowMCd9LCB3ZWVrZW5kOntibG9ja190aW1lOicyMjowMCcsdW5ibG9ja190aW1lOicwODowMCd9IH07CiAgY29uc3Qgb3BlbiAgID0gISFzY2hlZE9wZW5bdXNlci5pZF07CiAgY29uc3QgZGV2SHRtbCA9IHVzZXIuZGV2aWNlcy5sZW5ndGggPyB1c2VyLmRldmljZXMubWFwKGQgPT4gcmVuZGVyRGV2KHVzZXIuaWQsIGQpKS5qb2luKCcnKSA6ICc8ZGl2IGNsYXNzPSJuby1kZXYiPk5vIGRldmljZXMgYXNzaWduZWQ8L2Rpdj4nOwogIHJldHVybiBgPGRpdiBjbGFzcz0idXNlci1jYXJkJHt1c2VyLmJsb2NrZWQ/JyBibG9ja2VkJzonJ30iPjxkaXYgY2xhc3M9ImNhcmQtaGVhZCI+PHNwYW4gY2xhc3M9ImNvbG9yLWRvdCIgc3R5bGU9ImJhY2tncm91bmQ6JHt1c2VyLmNvbG9yfSI+PC9zcGFuPjxzcGFuIGNsYXNzPSJ1c2VyLW5hbWUtZWwiPiR7ZXNjKHVzZXIubmFtZSl9PC9zcGFuPjxzcGFuIGNsYXNzPSJzdGF0dXMtbGJsJHt1c2VyLmJsb2NrZWQ/JyBibG9ja2VkJzonJ30iPiR7dXNlci5ibG9ja2VkPydCbG9ja2VkJzonT25saW5lJ308L3NwYW4+PGxhYmVsIGNsYXNzPSJ0b2ctd3JhcCIgdGl0bGU9IiR7dXNlci5ibG9ja2VkPydVbmJsb2NrJzonQmxvY2snfSBhbGwiPjxkaXYgY2xhc3M9InRvZyI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAke3VzZXIuYmxvY2tlZD8nY2hlY2tlZCc6Jyd9IG9uY2hhbmdlPSJ0b2dnbGVVc2VyKCcke3VzZXIuaWR9JykiPjxkaXYgY2xhc3M9InRvZy10cmFjayI+PC9kaXY+PGRpdiBjbGFzcz0idG9nLXRodW1iIj48L2Rpdj48L2Rpdj48L2xhYmVsPjxidXR0b24gY2xhc3M9ImRlbC1idG4iIG9uY2xpY2s9ImRlbGV0ZVVzZXIoJyR7dXNlci5pZH0nKSIgdGl0bGU9IlJlbW92ZSB1c2VyIj7inJU8L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPjxkaXYgY2xhc3M9InNlYy10aXRsZSI+RGV2aWNlcyAoJHt1c2VyLmRldmljZXMubGVuZ3RofSk8L2Rpdj48ZGl2IGNsYXNzPSJkZXYtbGlzdCI+JHtkZXZIdG1sfTwvZGl2PjxidXR0b24gY2xhc3M9ImJ0biBidG4tZ2hvc3QgYnRuLXNtIiBvbmNsaWNrPSJvcGVuQWRkRGV2aWNlTW9kYWwoJyR7dXNlci5pZH0nKSI+77yLIEFkZCBEZXZpY2U8L2J1dHRvbj48ZGl2IGNsYXNzPSJzY2hlZC1zZWN0aW9uIj48ZGl2IGNsYXNzPSJzY2hlZC1oZWFkIiBvbmNsaWNrPSJ0b2dnbGVTY2hlZCgnJHt1c2VyLmlkfScpIj48c3BhbiBjbGFzcz0ic2NoZWQtdGl0bGUiPvCflZAgU2NoZWR1bGUke3NjaGVkLmVuYWJsZWQ/JyAoYWN0aXZlKSc6Jyd9PC9zcGFuPjxzcGFuIGNsYXNzPSJzY2hlZC1jaGV2JHtvcGVuPycgb3Blbic6Jyd9Ij7ilrw8L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0ic2NoZWQtYm9keSR7b3Blbj8nIG9wZW4nOicnfSI+PGRpdiBjbGFzcz0ic2NoZWQtZW4tcm93Ij48bGFiZWwgY2xhc3M9InRvZy13cmFwIj48ZGl2IGNsYXNzPSJ0b2cgc20gZ3JuIj48aW5wdXQgdHlwZT0iY2hlY2tib3giICR7c2NoZWQuZW5hYmxlZD8nY2hlY2tlZCc6Jyd9IG9uY2hhbmdlPSJvblNjaGVkQ2hhbmdlKCcke3VzZXIuaWR9JywnZW5hYmxlZCcsdGhpcy5jaGVja2VkKSI+PGRpdiBjbGFzcz0idG9nLXRyYWNrIj48L2Rpdj48ZGl2IGNsYXNzPSJ0b2ctdGh1bWIiPjwvZGl2PjwvZGl2PjxzcGFuIHN0eWxlPSJmb250LXNpemU6Ljc4cmVtO2NvbG9yOnZhcigtLXRleHQtbXV0ZWQpIj5FbmFibGUgc2NoZWR1bGUgYmxvY2tpbmc8L3NwYW4+PC9sYWJlbD48L2Rpdj48ZGl2IGNsYXNzPSJzY2hlZC1yb3ciPjxsYWJlbD5XZWVrZGF5czwvbGFiZWw+PGlucHV0IGNsYXNzPSJ0aW1lLWluIiB0eXBlPSJ0aW1lIiB2YWx1ZT0iJHtzY2hlZC53ZWVrZGF5LmJsb2NrX3RpbWV9IiBvbmNoYW5nZT0ib25TY2hlZENoYW5nZSgnJHt1c2VyLmlkfScsJ3dlZWtkYXkuYmxvY2tfdGltZScsdGhpcy52YWx1ZSkiIC8+PHNwYW4gY2xhc3M9InRpbWUtc2VwIj7ihpI8L3NwYW4+PGlucHV0IGNsYXNzPSJ0aW1lLWluIiB0eXBlPSJ0aW1lIiB2YWx1ZT0iJHtzY2hlZC53ZWVrZGF5LnVuYmxvY2tfdGltZX0iIG9uY2hhbmdlPSJvblNjaGVkQ2hhbmdlKCcke3VzZXIuaWR9JywnZWVrZGF5LnVuYmxvY2tfdGltZScsdGhpcy52YWx1ZSkiIC8+PC9kaXY+PGRpdiBjbGFzcz0ic2NoZWQtcm93Ij48bGFiZWw+V2Vla2VuZDwvbGFiZWw+PGlucHV0IGNsYXNzPSJ0aW1lLWluIiB0eXBlPSJ0aW1lIiB2YWx1ZT0iJHtzY2hlZC53ZWVrZW5kLmJsb2NrX3RpbWV9IiBvbmNoYW5nZT0ib25TY2hlZENoYW5nZSgnJHt1c2VyLmlkfScsJ3dlZWtlbmQuYmxvY2tfdGltZScsdGhpcy52YWx1ZSkiIC8+PHNwYW4gY2xhc3M9InRpbWUtc2VwIj7ihpI8L3NwYW4+PGlucHV0IGNsYXNzPSJ0aW1lLWluIiB0eXBlPSJ0aW1lIiB2YWx1ZT0iJHtzY2hlZC53ZWVrZW5kLnVuYmxvY2tfdGltZX0iIG9uY2hhbmdlPSJvblNjaGVkQ2hhbmdlKCcke3VzZXIuaWR9JywnZWVrZW5kLnVuYmxvY2tfdGltZScsdGhpcy52YWx1ZSkiIC8+PC9kaXY+PHAgY2xhc3M9InNjaGVkLWhpbnQiPkJsb2NrIHN0YXJ0cyBhdCBmaXJzdCB0aW1lLCB1bmJsb2NrcyBhdCBzZWNvbmQuIE92ZXJuaWdodCByYW5nZXMgd29yayAoZS5nLiAyMTowMCDihpIgMDc6MDApLjwvcD48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj5gOwp9CgpmdW5jdGlvbiByZW5kZXJEZXYodXNlcklkLCBkZXYpIHsKICBjb25zdCBpbmZvID0gZGV2aWNlSW5mbyhkZXYubWFjKTsKICBjb25zdCBzdWIgID0gW2Rldi5tYWMsIGluZm8uaXAgfHwgZGV2Lmxhc3RfaXBdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJyk7CiAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJkZXYtaXRlbSR7ZGV2LmJsb2NrZWQ/JyBibG9ja2VkJzonJ30iPjxzcGFuIGNsYXNzPSJvbmxpbmUtZG90JHtpbmZvLm9ubGluZT8nIG9uJzonfSIgdGl0bGU9IiR7aW5mby5vbmxpbmU/J09ubGluZSc6J09mZmxpbmUnfSI+PC9zcGFuPjxkaXYgY2xhc3M9ImRldi1pbmZvIj48ZGl2IGNsYXNzPSJkZXYtbmFtZSI+JHtlc2MoZGV2Lm5hbWUpfTwvZGl2PjxkaXYgY2xhc3M9ImRldi1zdWIiPiR7c3VifTwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImRldi1hY3RzIj48bGFiZWwgY2xhc3M9InRvZy13cmFwIiB0aXRsZT0iJHtkZXYuYmxvY2tlZD8nVW5ibG9jayc6J0Jsb2NrJ30iPjxkaXYgY2xhc3M9InRvZyBzbSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAke2Rldi5ibG9ja2VkPydjaGVja2VkJzonfSBvbmNoYW5nZT0idG9nZ2xlRGV2aWNlKCcke3VzZXJJZH0nLCcke2Rldi5tYWN9JykiPjxkaXYgY2xhc3M9InRvZy10cmFjayI+PC9kaXY+PGRpdiBjbGFzcz0idG9nLXRodW1iIj48L2Rpdj48L2Rpdj48L2xhYmVsPjxidXR0b24gY2xhc3M9ImRlbC1idG4iIG9uY2xpY2s9InJlbW92ZURldmljZSgnJHt1c2VySWR9JywnJHtkZXYubWFjfScpIiB0aXRsZT0iUmVtb3ZlIGRldmljZSI+4pyVPC9idXR0b24+PC9kaXY+PC9kaXY+YDsKfQoKZnVuY3Rpb24gdG9nZ2xlU2NoZWQodXNlcklkKSB7IHNjaGVkT3Blblt1c2VySWRdID0gIXNjaGVkT3Blblt1c2VySWRdOyByZW5kZXIoKTsgfQoKZnVuY3Rpb24gYnVpbGRDb2xvclBpY2tlcihwcmVzZWwpIHsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sLXBpY2tlcicpLmlubmVySFRNTCA9IENPTE9SUy5tYXAoYyA9PiBgPHNwYW4gY2xhc3M9ImNvbC1vcHQke2M9PT1wcmVzZWw/JyBzZWwnOicnfSIgZGF0YS1jPSIke2N9IiBzdHlsZT0iYmFja2dyb3VuZDoke2N9IiBvbmNsaWNrPSJwaWNrQ29sb3IodGhpcykiPjwvc3Bhbj5gKS5qb2luKCcnKTsKfQpmdW5jdGlvbiBwaWNrQ29sb3IoZWwpIHsgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNvbC1vcHQnKS5mb3JFYWNoKG8gPT4gby5jbGFzc0xpc3QucmVtb3ZlKCdzZWwnKSk7IGVsLmNsYXNzTGlzdC5hZGQoJ3NlbCcpOyB9CgpmdW5jdGlvbiBvcGVuTW9kYWwoaWQpIHsKICBpZiAoaWQgPT09ICdhZGQtdXNlci1tb2RhbCcpIG9wZW5BZGRVc2VyTW9kYWwoKTsKICBlbHNlIHsKICAgIGlmIChpZCA9PT0gJ3NldHRpbmdzLW1vZGFsJykgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0LXVybCcpLnZhbHVlID0gcHJlZnMudXJsOyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0LXRvaycpLnZhbHVlID0gcHJlZnMudG9rZW47IH0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7CiAgfQp9CmZ1bmN0aW9uIGNsb3NlTW9kYWwoaWQpIHsgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsgfQpmdW5jdGlvbiBvdmVybGF5Q2xpY2soZSwgaWQpIHsgaWYgKGUudGFyZ2V0ID09PSBlLmN1cnJlbnRUYXJnZXQpIGNsb3NlTW9kYWwoaWQpOyB9CgpmdW5jdGlvbiB0b2FzdChtc2csIHR5cGU9J3MnKSB7CiAgY29uc3QgYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2FzdHMnKTsKICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGVsLmNsYXNzTmFtZSA9IGB0b2FzdCAke3R5cGV9YDsKICBlbC50ZXh0Q29udGVudCA9IG1zZzsKICBjLmFwcGVuZENoaWxkKGVsKTsKICBzZXRUaW1lb3V0KCgpID0+IHsgZWwuc3R5bGUub3BhY2l0eT0nMCc7IHNldFRpbWVvdXQoKCk9PmVsLnJlbW92ZSgpLDMwMCk7IH0sIDM4MDApOwp9CgpmdW5jdGlvbiBzZXRCYWRnZShzdGF0ZSkgewogIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nvbm4tYmFkZ2UnKTsKICBlbC5jbGFzc05hbWUgPSBgYmFkZ2UgJHtzdGF0ZX1gOwogIGVsLnRleHRDb250ZW50ID0gc3RhdGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdGF0ZS5zbGljZSgxKTsKfQpmdW5jdGlvbiBlc2MocykgeyByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoLyYvZywnJmFtcDsnKS5yZXBsYWNlKC88L2csJyZsdDsnKS5yZXBsYWNlKC8+L2csJyZndDsnKS5yZXBsYWNlKC8iL2csJyZxdW90OycpOyB9CmZ1bmN0aW9uIHBhZDIobikgeyByZXR1cm4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsJzAnKTsgfQoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHsKICBpZiAobG9hZFByZWZzKCkpIHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zY3JlZW4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcCcpLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsKICAgIGNvbm5lY3QoKTsKICB9IGVsc2UgewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3MtdXJsJykudmFsdWUgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luOwogIH0KfSk7Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K
\ No newline at end of file