You want to buy Menzerna polishes or accessories? Our range caters to professionals with the highest standards
and is available from selected partners around the globe. Our international network of qualified dealers offers
fast and competent service worldwide.
Whether auto detail shop or car detailing supplies stores: Find the right stockist among numerous polishing and
car care shops with our Menzerna dealer and onlineshop search. For car polishes, boat polishes and solid compounds.
CiAgICAgICAgICAgICAgICAgICAgICAKICAgIDxkaXYgaWQ9Im1vYmlsZS1jaGVjayI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJtb2JpbGUtcmVzZXQtc2VhcmNoIj4KICAgICAgICA8YnV0dG9uIGlkPSJyZXNldC1zZWFyY2giIGNsYXNzPSJidG4iPlVzZSBEZWFsZXItc2VhcmNoIGFnYWluPC9idXR0b24+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZpbHRlcmZvcm0tY29udGFpbmVyIGRlYWxlci1zZWFyY2gtZm9ybS13cmFwIj4KICAgICAgICA8Zm9ybSBkYXRhLWFqYXh1cmw9Ii9zZXJ2aWNlL2RlYWxlci1zZWFyY2g/bm9fY2FjaGU9MSZhbXA7dHhfcHhwZGVhbGVyc19hamF4Y2FsbCU1QmFjdGlvbiU1RD1hamF4Q2FsbCZhbXA7dHhfcHhwZGVhbGVyc19hamF4Y2FsbCU1QmNvbnRyb2xsZXIlNUQ9RGVhbGVyJmFtcDt0eXBlPTExMjImYW1wO2NIYXNoPWIxMDY4Y2RlMDI3MTA0OTU4ZGMzZDIyMWNmY2Y3ZDRkIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJkZWFsZXItc2VhcmNoLWZvcm0iIGlkPSJzZWxlY3RGb3JtIiBhY3Rpb249Ii9zZXJ2aWNlL2RlYWxlci1zZWFyY2g/dHhfcHhwZGVhbGVyc19hamF4Y2FsbCU1QmFjdGlvbiU1RD1hamF4Q2FsbCZhbXA7dHhfcHhwZGVhbGVyc19hamF4Y2FsbCU1QmNvbnRyb2xsZXIlNUQ9RGVhbGVyJmFtcDt0eXBlPTExMjImYW1wO2NIYXNoPWIxMDY4Y2RlMDI3MTA0OTU4ZGMzZDIyMWNmY2Y3ZDRkIj4KPGRpdj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHhfcHhwZGVhbGVyc19hamF4Y2FsbFtfX3JlZmVycmVyXVtAZXh0ZW5zaW9uXSIgdmFsdWU9IlB4cGRlYWxlcnMiIC8+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InR4X3B4cGRlYWxlcnNfYWpheGNhbGxbX19yZWZlcnJlcl1bQGNvbnRyb2xsZXJdIiB2YWx1ZT0iRGVhbGVyIiAvPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eF9weHBkZWFsZXJzX2FqYXhjYWxsW19fcmVmZXJyZXJdW0BhY3Rpb25dIiB2YWx1ZT0ibGlzdCIgLz4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHhfcHhwZGVhbGVyc19hamF4Y2FsbFtfX3JlZmVycmVyXVthcmd1bWVudHNdIiB2YWx1ZT0iWVRvd09udDljMzJhZmQwODliYmI3MWEwMjBhZDI2Y2U2ZjU1MGNmMDYwYzQ5ZTM1IiAvPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eF9weHBkZWFsZXJzX2FqYXhjYWxsW19fcmVmZXJyZXJdW0ByZXF1ZXN0XSIgdmFsdWU9InsmcXVvdDtAZXh0ZW5zaW9uJnF1b3Q7OiZxdW90O1B4cGRlYWxlcnMmcXVvdDssJnF1b3Q7QGNvbnRyb2xsZXImcXVvdDs6JnF1b3Q7RGVhbGVyJnF1b3Q7LCZxdW90O0BhY3Rpb24mcXVvdDs6JnF1b3Q7bGlzdCZxdW90O30yZTQwOTI2ZjE1MTA1ODc1ODZjNmRjMGNiYzc5NWMxM2M0NzdjNGE5IiAvPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eF9weHBkZWFsZXJzX2FqYXhjYWxsW19fdHJ1c3RlZFByb3BlcnRpZXNdIiB2YWx1ZT0ieyZxdW90O2NhdGVnb3JpZXMmcXVvdDs6WzEsMSwxXX01ZTg4YmNmNWQwNjQ2YTE1YWMwYzQ5NGE2YTZiNGI3OWIwNmY2NTRiIiAvPgo8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvY2F0aW9uLXNlYXJjaC1jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb3VudHJ5LXNlbGVjdCIgY2xhc3M9InNlbGVjdC1sYWJlbCBmb3JtLWJpZy1sYWJlbCI+U2VhcmNoIGZvciBsb2NhdGlvbjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBsb2NhdGlvbi1zZWFyY2gtcm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtNiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlbGVjdC13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0idHhfcHhwZGVhbGVyc19hamF4Y2FsbFtjb3VudHJ5XSIgaWQ9ImNvdW50cnktc2VsZWN0IiBjbGFzcz0iZm9ybS1jb250cm9sIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPlNlbGVjdCBjb3VudHJ5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjYiIGRhdGEtbmFtZT0iQWxiYW5pYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IkFMIj5BbGJhbmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjExIiBkYXRhLW5hbWU9IkFyZ2VudGluYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iQVIiPkFyZ2VudGluYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNCIgZGF0YS1uYW1lPSJBdXN0cmFsaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJBVSI+QXVzdHJhbGlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEzIiBkYXRhLW5hbWU9IkF1c3RyaWEiIGRhdGEtY2F0ZWdvcmllcz0iMyIgZGF0YS1pc28yPSJBVCI+QXVzdHJpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzNCIgZGF0YS1uYW1lPSJCZWxhcnVzIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iQlkiPkJlbGFydXM8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjAiIGRhdGEtbmFtZT0iQmVsZ2l1bSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJCRSI+QmVsZ2l1bTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyOSIgZGF0YS1uYW1lPSJCcmF6aWwiIGRhdGEtY2F0ZWdvcmllcz0iMSwzIiBkYXRhLWlzbzI9IkJSIj5CcmF6aWw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjIiIGRhdGEtbmFtZT0iQnVsZ2FyaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iQkciPkJ1bGdhcmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjM2IiBkYXRhLW5hbWU9IkNhbmFkYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJDQSI+Q2FuYWRhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQ0IiBkYXRhLW5hbWU9IkNoaWxlIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iQ0wiPkNoaWxlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQ2IiBkYXRhLW5hbWU9IkNoaW5hIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iQ04iPkNoaW5hPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQ3IiBkYXRhLW5hbWU9IkNvbG9tYmlhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iQ08iPkNvbG9tYmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjkzIiBkYXRhLW5hbWU9IkNyb2F0aWEiIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iSFIiPkNyb2F0aWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNTYiIGRhdGEtbmFtZT0iRGVubWFyayIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IkRLIj5EZW5tYXJrPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjYyIiBkYXRhLW5hbWU9IkVneXB0IiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iRUciPkVneXB0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjYxIiBkYXRhLW5hbWU9IkVzdG9uaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJFRSI+RXN0b25pYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI2NyIgZGF0YS1uYW1lPSJGaW5sYW5kIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiIgZGF0YS1pc28yPSJGSSI+RmlubGFuZDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI3MiIgZGF0YS1uYW1lPSJGcmFuY2UiIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iRlIiPkZyYW5jZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI1NCIgZGF0YS1uYW1lPSJHZXJtYW55IiBkYXRhLWNhdGVnb3JpZXM9IjEsMiwzIiBkYXRhLWlzbzI9IkRFIj5HZXJtYW55PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijg1IiBkYXRhLW5hbWU9IkdyZWVjZSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iR1IiPkdyZWVjZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI5NSIgZGF0YS1uYW1lPSJIdW5nYXJ5IiBkYXRhLWNhdGVnb3JpZXM9IjEsMiIgZGF0YS1pc28yPSJIVSI+SHVuZ2FyeTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI5NiIgZGF0YS1uYW1lPSJJbmRvbmVzaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSwyIiBkYXRhLWlzbzI9IklEIj5JbmRvbmVzaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTA0IiBkYXRhLW5hbWU9Ikl0YWx5IiBkYXRhLWNhdGVnb3JpZXM9IjEsMiwzIiBkYXRhLWlzbzI9IklUIj5JdGFseTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMDciIGRhdGEtbmFtZT0iSmFwYW4iIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iSlAiPkphcGFuPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjExOCIgZGF0YS1uYW1lPSJLYXpha2hzdGFuIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iS1oiPkthemFraHN0YW48L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTE2IiBkYXRhLW5hbWU9Ikt1d2FpdCIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IktXIj5LdXdhaXQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTI4IiBkYXRhLW5hbWU9IkxhdHZpYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IkxWIj5MYXR2aWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTIwIiBkYXRhLW5hbWU9IkxlYmFub24iIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iTEIiPkxlYmFub248L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTI2IiBkYXRhLW5hbWU9IkxpdGh1YW5pYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IkxUIj5MaXRodWFuaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTQ0IiBkYXRhLW5hbWU9Ik1hbHRhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iTVQiPk1hbHRhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE0OCIgZGF0YS1uYW1lPSJNZXhpY28iIGRhdGEtY2F0ZWdvcmllcz0iMSwyIiBkYXRhLWlzbzI9Ik1YIj5NZXhpY288L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTMwIiBkYXRhLW5hbWU9Ik1vcm9jY28iIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJNQSI+TW9yb2Njbzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNTciIGRhdGEtbmFtZT0iTmV0aGVybGFuZHMiIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iTkwiPk5ldGhlcmxhbmRzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEzNSIgZGF0YS1uYW1lPSJOb3J0aCBNYWNlZG9uaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJNSyI+Tm9ydGggTWFjZWRvbmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE1OCIgZGF0YS1uYW1lPSJOb3J3YXkiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJOTyI+Tm9yd2F5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE2NCIgZGF0YS1uYW1lPSJQYW5hbWEiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJQQSI+UGFuYW1hPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE3MCIgZGF0YS1uYW1lPSJQb2xhbmQiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJQTCI+UG9sYW5kPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE3NCIgZGF0YS1uYW1lPSJQb3J0dWdhbCIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlBUIj5Qb3J0dWdhbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNzMiIGRhdGEtbmFtZT0iUHVlcnRvIFJpY28iIGRhdGEtY2F0ZWdvcmllcz0iMSwyIiBkYXRhLWlzbzI9IlBSIj5QdWVydG8gUmljbzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNzkiIGRhdGEtbmFtZT0iUm9tYW5pYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlJPIj5Sb21hbmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE4MCIgZGF0YS1uYW1lPSJSdXNzaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJSVSI+UnVzc2lhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE4MiIgZGF0YS1uYW1lPSJTYXVkaSBBcmFiaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSwyIiBkYXRhLWlzbzI9IlNBIj5TYXVkaSBBcmFiaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjQzIiBkYXRhLW5hbWU9IlNlcmJpYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlJTIj5TZXJiaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTg5IiBkYXRhLW5hbWU9IlNsb3ZlbmlhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iU0kiPlNsb3ZlbmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIzNSIgZGF0YS1uYW1lPSJTb3V0aCBBZnJpY2EiIGRhdGEtY2F0ZWdvcmllcz0iMSwyIiBkYXRhLWlzbzI9IlpBIj5Tb3V0aCBBZnJpY2E8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTE1IiBkYXRhLW5hbWU9IlNvdXRoIEtvcmVhIiBkYXRhLWNhdGVnb3JpZXM9IjMiIGRhdGEtaXNvMj0iS1IiPlNvdXRoIEtvcmVhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjY1IiBkYXRhLW5hbWU9IlNwYWluIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiwzIiBkYXRhLWlzbzI9IkVTIj5TcGFpbjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxODYiIGRhdGEtbmFtZT0iU3dlZGVuIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiIgZGF0YS1pc28yPSJTRSI+U3dlZGVuPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQxIiBkYXRhLW5hbWU9IlN3aXR6ZXJsYW5kIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iQ0giPlN3aXR6ZXJsYW5kPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE5OSIgZGF0YS1uYW1lPSJTeXJpYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlNZIj5TeXJpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMDUiIGRhdGEtbmFtZT0iVGhhaWxhbmQiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJUSCI+VGhhaWxhbmQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjEyIiBkYXRhLW5hbWU9IlR1cmtleSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iVFIiPlR1cmtleTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMTciIGRhdGEtbmFtZT0iVWtyYWluZSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iVUEiPlVrcmFpbmU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMiIgZGF0YS1uYW1lPSJVbml0ZWQgQXJhYiBFbWlyYXRlcyIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iQUUiPlVuaXRlZCBBcmFiIEVtaXJhdGVzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijc0IiBkYXRhLW5hbWU9IlVuaXRlZCBLaW5nZG9tIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiwzIiBkYXRhLWlzbzI9IkdCIj5Vbml0ZWQgS2luZ2RvbTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMjAiIGRhdGEtbmFtZT0iVW5pdGVkIFN0YXRlcyIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJVUyI+VW5pdGVkIFN0YXRlczwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMjEiIGRhdGEtbmFtZT0iVXJ1Z3VheSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlVZIj5VcnVndWF5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTYiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsb2NhdGlvbi13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrYm94LXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImNiLWxvY2F0aW9uIiBjbGFzcz0iY2ItbGFiZWwgY3VzdG9tLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIGN1cnJlbnQgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iIiB2YWx1ZT0iIiAvPjxpbnB1dCBkYXRhLWFqYXh1cmw9Ii9zZXJ2aWNlL2RlYWxlci1zZWFyY2g/bm9fY2FjaGU9MSZhbXA7dHhfcHhwZGVhbGVyc19hamF4Y2FsbCU1QmFjdGlvbiU1RD1nZXRDb3VudHJ5Q29kZUFqYXgmYW1wO3R4X3B4cGRlYWxlcnNfYWpheGNhbGwlNUJjb250cm9sbGVyJTVEPURlYWxlciZhbXA7dHlwZT0xMTIyJmFtcDtjSGFzaD0wYjZiZDhmZmRiYzRhNmI1NDQ4MjhiMzJjZGU0NTY5OCIgaWQ9ImNiLWxvY2F0aW9uIiB0eXBlPSJjaGVja2JveCIgbmFtZT0iIiB2YWx1ZT0iIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2hlY2ttYXJrIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZ2VvbG9jYXRpb24tbG9hZCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPkxvY2F0aW9uIGlzIGRldGVybWluZWQgLi4uPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJnZW9sb2NhdGlvbi1lcnJvciIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPlBsZWFzZSBhbGxvdyBhY2Nlc3MgdG8geW91ciBsb2NhdGlvbjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0ZWdvcnktc2VhcmNoLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1iaWctbGFiZWwiPkkmIzAzOTttIGxvb2tpbmcgZm9yIC4uLjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhdGVnb3JpZXMtY2ItY29udGFpbmVyIiBkYXRhLWFsbC1jYXRlZ29yeS11aWRzPSIxLDIsMyI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhdC1jYiBjaGVja2JveC13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY2ItQ2FyIHBvbGlzaGVzIiBjbGFzcz0iY2ItbGFiZWwgY3VzdG9tLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhciBwb2xpc2hlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHhfcHhwZGVhbGVyc19hamF4Y2FsbFtjYXRlZ29yaWVzXSIgdmFsdWU9IiIgLz48aW5wdXQgY2xhc3M9ImNhdGVnb3J5LWNiIGVuYWJsZWQiIGlkPSJjYi1DYXIgcG9saXNoZXMiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0eF9weHBkZWFsZXJzX2FqYXhjYWxsW2NhdGVnb3JpZXNdW10iIHZhbHVlPSIxIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNoZWNrbWFyayI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhdC1jYiBjaGVja2JveC13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY2ItQm9hdCBwb2xpc2hlcyIgY2xhc3M9ImNiLWxhYmVsIGN1c3RvbS1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb2F0IHBvbGlzaGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNhdGVnb3J5LWNiIGVuYWJsZWQiIGlkPSJjYi1Cb2F0IHBvbGlzaGVzIiB0eXBlPSJjaGVja2JveCIgbmFtZT0idHhfcHhwZGVhbGVyc19hamF4Y2FsbFtjYXRlZ29yaWVzXVtdIiB2YWx1ZT0iMiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjaGVja21hcmsiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXQtY2IgY2hlY2tib3gtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImNiLVNvbGlkIENvbXBvdW5kIiBjbGFzcz0iY2ItbGFiZWwgY3VzdG9tLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbGlkIENvbXBvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNhdGVnb3J5LWNiIGVuYWJsZWQiIGlkPSJjYi1Tb2xpZCBDb21wb3VuZCIgdHlwZT0iY2hlY2tib3giIG5hbWU9InR4X3B4cGRlYWxlcnNfYWpheGNhbGxbY2F0ZWdvcmllc11bXSIgdmFsdWU9IjMiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2hlY2ttYXJrIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5vdGlmaWVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5vdGlmaWVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+JiM0Mk5vdGU6IE1lbnplcm5hIHBvbGlzaGVzIGFyZSBtYWRlIGZvciBwcm9mZXNzaW9uYWwgdXNlcnMuPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PkJ5IGNsaWNraW5nIG9uICZxdW90O0ZpbmQgZGVhbGVycyBub3cmcXVvdDsgSSBjb25maXJtIHRoYXQgSSBiZWxvbmcgdG8gdGhpcyBjdXN0b21lciBncm91cC48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Ym1pdC1idXR0b24tY29udGFpbmVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ic3VibWl0LWJ0biBidG4iIHR5cGU9InN1Ym1pdCIgbmFtZT0iIiB2YWx1ZT0iIj5GaW5kIGRlYWxlcnM8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWFsZXItc2VhcmNoLW1hcC13cmFwIiBzdHlsZT0iZGlzcGxheTogbm9uZTsiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlYWxlci1zZWFyY2gtbWFwIiBpZD0iZ21hcCI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgCgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJyZXN1bHQtY29udGFpbmVyIGRlYWxlci1zZWFyY2gtcmVzdWx0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWFwLWhlYWRsaW5lIiAgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij5RdWFsaWZpZWQgZGVhbGVycyBhbmQgYXV0aG9yaXplZCBvbmxpbmUgc2hvcHMgaW4mbmJzcDs8c3BhbiBpZD0ibWFwLWhlYWRsaW5lLWNvdW50cnkiPjwvc3Bhbj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFjY29yZGlvbi13cmFwIGRlYWxlci1zZWFyY2gtYWNjb3JkaW9ucyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtZ3JvdXAiIGlkPSJhY2NvcmRpb24iIHJvbGU9InRhYmxpc3QiIGFyaWEtbXVsdGlzZWxlY3RhYmxlPSJ0cnVlIj4KCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250YWN0LWhlYWRsaW5lIiBkYXRhLXN0cmluZz0iQ29udGFjdCI+PC9kaXY+CiAgICA8ZGl2IGlkPSJjYXRlZ29yaWVzLWhlYWRsaW5lIiBkYXRhLXN0cmluZz0iVGhlIGRlYWxlciByYW5nZSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHByb2R1Y3QgY2F0ZWdvcmllczoiPjwvZGl2PgogICAgPGRpdiBpZD0idGV4dC1saW5rLW9ubGluZXNob3AiIGRhdGEtc3RyaW5nPSJUbyB0aGUgT25saW5lc2hvcCI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ0ZXh0LWxpbmstd2Vic2l0ZSIgZGF0YS1zdHJpbmc9IlRvIHRoZSBXZWJzaXRlIj48L2Rpdj4KICAgIDxkaXYgaWQ9InRleHQtY2xvc2UtYWNjb3JkaW9uIiBkYXRhLXN0cmluZz0iQ2xvc2UgRGVhbGVyLUluZm9ybWF0aW9uIj48L2Rpdj4KICAgIDxkaXYgaWQ9ImRlZXBsaW5rIiBkYXRhLXN0cmluZz0iIj48L2Rpdj4KICAgIAoKICAgIAogICAgICAgICAgICA8c2NyaXB0IGFzeW5jIGRlZmVyIHNyYz0iaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT1BSXphU3lDSWtqb1FuQW5EbHltMEg3dUVxUXBBeWMwQjBnNTdHUWcmbGlicmFyaWVzPXBsYWNlcyZjYWxsYmFjaz1pbml0TWFwIj48L3NjcmlwdD4KICAgICAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgICAgIHZhciBtYXA7CiAgICAgICAgICAgICAgICB2YXIgZ2VvY29kZXI7CiAgICAgICAgICAgICAgICB2YXIgbWFya2VycyA9IFtdOwogICAgICAgICAgICAgICAgdmFyIG1hcFN0eWxlID0gIFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJnZW9tZXRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjZjVmNWY1IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJsYWJlbHMuaWNvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aXNpYmlsaXR5IjogIm9mZiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjNjE2MTYxIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJsYWJlbHMudGV4dC5zdHJva2UiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2Y1ZjVmNSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAiYWRtaW5pc3RyYXRpdmUubGFuZF9wYXJjZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjYmRiZGJkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJwb2kiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAiZ2VvbWV0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2VlZWVlZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAicG9pIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRUeXBlIjogImxhYmVscy50ZXh0LmZpbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiIzc1NzU3NSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAicG9pLnBhcmsiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAiZ2VvbWV0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2U1ZTVlNSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAicG9pLnBhcmsiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjOWU5ZTllIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJyb2FkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRUeXBlIjogImdlb21ldHJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yIjogIiNmZmZmZmYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVUeXBlIjogInJvYWQuYXJ0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjNzU3NTc1IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJyb2FkLmhpZ2h3YXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAiZ2VvbWV0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2RhZGFkYSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAicm9hZC5oaWdod2F5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRUeXBlIjogImxhYmVscy50ZXh0LmZpbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiIzYxNjE2MSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAicm9hZC5sb2NhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJsYWJlbHMudGV4dC5maWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yIjogIiM5ZTllOWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVUeXBlIjogInRyYW5zaXQubGluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJnZW9tZXRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjZTVlNWU1IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJ0cmFuc2l0LnN0YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAiZ2VvbWV0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2VlZWVlZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAid2F0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAiZ2VvbWV0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2M5YzljOSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAid2F0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjOWU5ZTllIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXTsKCiAgICAgICAgICAgICAgICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbml0TWFwKCkgewogICAgICAgICAgICAgICAgICAgIG1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dtYXAnKSwgewogICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IHtsYXQ6IDQ4Ljc3OTU5NDIsIGxuZzogOC4yMDU4Njc0fSwKICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogNiwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4Wm9vbTogMTgsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlczogbWFwU3R5bGUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHZhciBldU1lbWJlcnMgPSBbMTMsMjAsMjIsNTIsNTMsNTQsNTYsNjEsNjUsNjcsNzIsODUsOTMsOTUsOTcsMTA0LDEyNiwxMjcsMTI4LDE0NCwxNTcsMTcwLDE3NCwxNzksMTg2LDE4OSwxOTFdOwogICAgICAgICAgICAgICAgICAgIHZhciBhbGxDYXRlZ29yeVVpZHMgPSAkKCcuY2F0ZWdvcmllcy1jYi1jb250YWluZXInKS5kYXRhKCdhbGwtY2F0ZWdvcnktdWlkcycpLnNwbGl0KCcsJyk7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJmb3JtID0gJCgnI3NlbGVjdEZvcm0nKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeVNlbGVjdCA9ICQoJyNjb3VudHJ5LXNlbGVjdCcpOwogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbkNoZWNrYm94ID0gJCgnI2NiLWxvY2F0aW9uJyk7CgogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvblNlYXJjaENvbnRhaW5lciA9ICQoJy5sb2NhdGlvbi1zZWFyY2gtY29udGFpbmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhdGVnb3J5U2VhcmNoQ29udGFpbmVyID0gJCgnLmNhdGVnb3J5LXNlYXJjaC1jb250YWluZXInKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbm90aWZpZXJDb250YWluZXIgPSAkKCcubm90aWZpZXItY29udGFpbmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkNvbnRhaW5lciA9ICQoJy5zdWJtaXQtYnV0dG9uLWNvbnRhaW5lcicpOwogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHRDb250YWluZXIgPSAkKCcucmVzdWx0LWNvbnRhaW5lcicpOwogICAgICAgICAgICAgICAgICAgIHZhciBtYXBDb250YWluZXIgPSAkKCcuZGVhbGVyLXNlYXJjaC1tYXAtd3JhcCcpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeUNhdGVnb3JpZXMgPSAnJzsKICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeU5hbWUgPSAnJzsKICAgICAgICAgICAgICAgICAgICB2YXIgZGlzYWJsZWRDYXRlZ29yaWVzID0gJyc7CgogICAgICAgICAgICAgICAgICAgIHZhciBtb2JpbGVDaGVjayA9ICQoJyNtb2JpbGUtY2hlY2snKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFqYXhVcmwgPSBmaWx0ZXJmb3JtLmRhdGEoJ2FqYXh1cmwnKTsKICAgICAgICAgICAgICAgICAgICB2YXIgZ2V0Q291bnRyeUNvZGVBamF4VXJsID0gbG9jYXRpb25DaGVja2JveC5kYXRhKCdhamF4dXJsJyk7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWVwbGluayA9ICQoJyNkZWVwbGluaycpLmRhdGEoJ3N0cmluZycpID09IDE7CgogICAgICAgICAgICAgICAgICAgIGlmKGRlZXBsaW5rKXsKICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeUNhdGVnb3JpZXMgPSBjb3VudHJ5U2VsZWN0LmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRhdGEoJ2NhdGVnb3JpZXMnKSArICcnOwogICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5TmFtZSA9IGNvdW50cnlTZWxlY3QuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGF0YSgnbmFtZScpICsgJyc7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBuaWNodCBpbSBMYW5kIHZvcmhhbmRlbmUgQ2F0ZWdvcmllcyBkaXNhYmxlbgogICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZENhdGVnb3JpZXMgPSBhcnJfZGlmZiAoYWxsQ2F0ZWdvcnlVaWRzLCBjb3VudHJ5Q2F0ZWdvcmllcy5zcGxpdCgnLCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNhYmxlZENhdGVnb3JpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jYXRlZ29yeS1jYlt2YWx1ZT0iJyArIGRpc2FibGVkQ2F0ZWdvcmllc1tpXSArICciXScpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuY2F0ZWdvcnktY2JbdmFsdWU9IicgKyBkaXNhYmxlZENhdGVnb3JpZXNbaV0gKyAnIl0nKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNhdGVnb3J5LWNiW3ZhbHVlPSInICsgZGlzYWJsZWRDYXRlZ29yaWVzW2ldICsgJyJdJykuY2xvc2VzdCgnLmNoZWNrYm94LXdyYXBwZXInKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlTZWFyY2hDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbkNvbnRhaW5lci5zbGlkZURvd24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXJyYXlDb250YWlucyhwYXJzZUludChjb3VudHJ5U2VsZWN0LnZhbCgpKSxldU1lbWJlcnMpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyQ29udGFpbmVyLnNsaWRlRG93bigpOwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyQ29udGFpbmVyLnNsaWRlVXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFqYXhDYWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnd29yaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobW9iaWxlQ2hlY2suaXMoJzp2aXNpYmxlJykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5tb2JpbGUtcmVzZXQtc2VhcmNoJykuZmFkZUluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmRlYWxlci1zZWFyY2gtZm9ybScpLmZhZGVPdXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkKCcubWFwLWhlYWRsaW5lJykuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCcjbWFwLWhlYWRsaW5lLWNvdW50cnknKS50ZXh0KGNvdW50cnlOYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICBjb3VudHJ5U2VsZWN0Lm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q2F0ZWdvcmllcyA9ICQodGhpcykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGF0YSgnY2F0ZWdvcmllcycpICsgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlOYW1lID0gJCh0aGlzKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kYXRhKCduYW1lJykgKyAnJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCQodGhpcykudmFsKCkgPT09ICcnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5U2VhcmNoQ29udGFpbmVyLnNsaWRlVXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbkNvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllckNvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLm9yaWdpbmFsRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZW5uIFVzZXIgU2VsZWN0LVZhbHVlIMOkbmRlcnQsIFN0YW5kb3J0LUNoZWNrYm94IHJlc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25DaGVja2JveC52YWwoJzAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkNoZWNrYm94LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tZXJyb3InKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tbG9hZCcpLmhpZGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxlIENhdGVnb3JpZXMgd2llZGVyIGVuYWJsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jYXRlZ29yeS1jYicpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnLmNoZWNrYm94LXdyYXBwZXInKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmljaHQgaW0gTGFuZCB2b3JoYW5kZW5lIENhdGVnb3JpZXMgZGlzYWJsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkQ2F0ZWdvcmllcyA9IGFycl9kaWZmIChhbGxDYXRlZ29yeVVpZHMsIGNvdW50cnlDYXRlZ29yaWVzLnNwbGl0KCcsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNhYmxlZENhdGVnb3JpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuY2F0ZWdvcnktY2JbdmFsdWU9IicgKyBkaXNhYmxlZENhdGVnb3JpZXNbaV0gKyAnIl0nKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jYXRlZ29yeS1jYlt2YWx1ZT0iJyArIGRpc2FibGVkQ2F0ZWdvcmllc1tpXSArICciXScpLmNsb3Nlc3QoJy5jaGVja2JveC13cmFwcGVyJykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlTZWFyY2hDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25Db250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJheUNvbnRhaW5zKHBhcnNlSW50KCQodGhpcykudmFsKCkpLGV1TWVtYmVycykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyQ29udGFpbmVyLnNsaWRlRG93bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZXJDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm1hcC1oZWFkbGluZScpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNtYXAtaGVhZGxpbmUtY291bnRyeScpLnRleHQoY291bnRyeU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25DaGVja2JveC5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNoZWNrZWQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoJzEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlTZWxlY3QudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbi1sb2FkJykuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihmdW5jdGlvbihwb3NpdGlvbil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gZXJtaXR0ZWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocG9zaXRpb24uY29vcmRzLmxhdGl0dWRlICE9PSB1bmRlZmluZWQgJiYgcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWxvYWQnKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uQ291bnRyeUNvZGUoZ2V0Q291bnRyeUNvZGVBamF4VXJsLCBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmZWhsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tZXJyb3InKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWxvYWQnKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnZhbCgnMCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeVNlbGVjdC52YWwoJycpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWVycm9yJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWxvYWQnKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJmb3JtLnN1Ym1pdChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICBhamF4Q2FsbCgpOwogICAgICAgICAgICAgICAgICAgICAgICBtYXBDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENvbnRhaW5lci5zbGlkZURvd24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYobW9iaWxlQ2hlY2suaXMoJzp2aXNpYmxlJykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnYm9keSxodG1sJykuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiAkKCcuZGVhbGVyLXNlYXJjaC1tYXAtd3JhcCcpLm9mZnNldCgpLnRvcCAtICQoJy5wYWdlLWhlYWRlcicpLm91dGVySGVpZ2h0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDgwMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm1vYmlsZS1yZXNldC1zZWFyY2gnKS5mYWRlSW4oJ3Nsb3cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5kZWFsZXItc2VhcmNoLWZvcm0nKS5mYWRlT3V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBndG1FdmVudExhYmVsID0gJCgnI2NvdW50cnktc2VsZWN0IG9wdGlvbjpzZWxlY3RlZCcpLnRleHQoKSArICcgLSc7CgogICAgICAgICAgICAgICAgICAgICAgICBpZigkKCcjY2ItQXV0b3BvbGl0dXJlbicpLmlzKCI6Y2hlY2tlZCIpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0bUV2ZW50TGFiZWwgPSBndG1FdmVudExhYmVsICsgJyBBdXRvcG9saXR1cmVuJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZigkKCcjY2ItQm9vdHNwb2xpdHVyZW4nKS5pcygiOmNoZWNrZWQiKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBndG1FdmVudExhYmVsID0gZ3RtRXZlbnRMYWJlbCArICcgQm9vdHNwb2xpdHVyZW4nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCQoJyNjYi1GZXN0cGFzdGVuJykuaXMoIjpjaGVja2VkIikpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RtRXZlbnRMYWJlbCA9IGd0bUV2ZW50TGFiZWwgKyAnIEZlc3RwYXN0ZW4nOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiAnSGFlbmRsZXJzdWNoZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogJ3N1Y2hlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NsaWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBndG1FdmVudExhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZXRMb2NhdGlvbkNvdW50cnlDb2RlKGFqYXhVcmwsIGxhdCwgbG9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQucG9zdChhamF4VXJsLCB7ICd0eF9weHBkZWFsZXJzX2FqYXhjYWxsW2xhdF0nOiBsYXQsICd0eF9weHBkZWFsZXJzX2FqYXhjYWxsW2xvbl0nOiBsb24gfSwgZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvblZhbHVlID0gJCgnI2NvdW50cnktc2VsZWN0IG9wdGlvbltkYXRhLWlzbzI9JytyZXNwb25zZSsnXScpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeVNlbGVjdC52YWwob3B0aW9uVmFsdWUpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFqYXhDYWxsKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhck1hcmtlcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2FjY29yZGlvbicpLmh0bWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAkLnBvc3QoYWpheFVybCwgZmlsdGVyZm9ybS5zZXJpYWxpemUoKSwgZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJvdW5kcyA9IG5ldyBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsICYmIHJlc3BvbnNlLmxlbmd0aCAhPSAwKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChyZXNwb25zZSwgZnVuY3Rpb24oaSwgaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmxhdCAhPT0gJycgJiYgaXRlbS5sb24gIT09ICcnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3IGdvb2dsZS5tYXBzLkxhdExuZyhpdGVtLmxhdCwgaXRlbS5sb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItcmVkLnBuZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBnb29nbGUubWFwcy5BbmltYXRpb24uRFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9pZDogaXRlbS5sb2NhdGlvbmlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uYWRkaXRpb25hbExhdE9uZSAhPT0gJycgJiYgaXRlbS5hZGRpdGlvbmFsTG9uT25lICE9PSAnJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxNYXJrZXJPbmUgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcoaXRlbS5hZGRpdGlvbmFsTGF0T25lLCBpdGVtLmFkZGl0aW9uYWxMb25PbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1yZWQucG5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBnb29nbGUubWFwcy5BbmltYXRpb24uRFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25faWQ6IGl0ZW0ubG9jYXRpb25pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnMucHVzaChhZGRpdGlvbmFsTWFya2VyT25lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBCb3VuZHMuZXh0ZW5kKGFkZGl0aW9uYWxNYXJrZXJPbmUucG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5hZGRpdGlvbmFsTGF0VHdvICE9PSAnJyAmJiBpdGVtLmFkZGl0aW9uYWxMb25Ud28gIT09ICcnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbE1hcmtlclR3byA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3IGdvb2dsZS5tYXBzLkxhdExuZyhpdGVtLmFkZGl0aW9uYWxMYXRUd28sIGl0ZW0uYWRkaXRpb25hbExvblR3byksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLXJlZC5wbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5EUk9QLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9pZDogaXRlbS5sb2NhdGlvbmlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vycy5wdXNoKGFkZGl0aW9uYWxNYXJrZXJUd28pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJvdW5kcy5leHRlbmQoYWRkaXRpb25hbE1hcmtlclR3by5wb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmFkZGl0aW9uYWxMYXRUaHJlZSAhPT0gJycgJiYgaXRlbS5hZGRpdGlvbmFsTG9uVGhyZWUgIT09ICcnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbE1hcmtlclRocmVlID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGl0ZW0uYWRkaXRpb25hbExhdFRocmVlLCBpdGVtLmFkZGl0aW9uYWxMb25UaHJlZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLXJlZC5wbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5EUk9QLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9pZDogaXRlbS5sb2NhdGlvbmlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vycy5wdXNoKGFkZGl0aW9uYWxNYXJrZXJUaHJlZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwQm91bmRzLmV4dGVuZChhZGRpdGlvbmFsTWFya2VyVGhyZWUucG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5hZGRpdGlvbmFsTGF0Rm91ciAhPT0gJycgJiYgaXRlbS5hZGRpdGlvbmFsTG9uRm91ciAhPT0gJycpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsTWFya2VyRm91ciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3IGdvb2dsZS5tYXBzLkxhdExuZyhpdGVtLmFkZGl0aW9uYWxMYXRGb3VyLCBpdGVtLmFkZGl0aW9uYWxMb25Gb3VyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwOiBtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItcmVkLnBuZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkRST1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2lkOiBpdGVtLmxvY2F0aW9uaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLnB1c2goYWRkaXRpb25hbE1hcmtlckZvdXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJvdW5kcy5leHRlbmQoYWRkaXRpb25hbE1hcmtlckZvdXIucG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5hZGRpdGlvbmFsTGF0Rml2ZSAhPT0gJycgJiYgaXRlbS5hZGRpdGlvbmFsTG9uRml2ZSAhPT0gJycpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsTWFya2VyRml2ZSA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3IGdvb2dsZS5tYXBzLkxhdExuZyhpdGVtLmFkZGl0aW9uYWxMYXRGaXZlLCBpdGVtLmFkZGl0aW9uYWxMb25GaXZlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwOiBtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItcmVkLnBuZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkRST1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2lkOiBpdGVtLmxvY2F0aW9uaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLnB1c2goYWRkaXRpb25hbE1hcmtlckZpdmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJvdW5kcy5leHRlbmQoYWRkaXRpb25hbE1hcmtlckZpdmUucG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnMucHVzaChtYXJrZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwQm91bmRzLmV4dGVuZChtYXJrZXIucG9zaXRpb24pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNhY2NvcmRpb24nKS5hcHBlbmQoZ2V0SHRtbFRlbXBsYXRlKGl0ZW0saSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbkxpc3RFbnRyeSA9ICQoJyNsb2NhdGlvbicgKyBpdGVtLmxvY2F0aW9uaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25MaXN0RW50cnkuYmluZCgnY2xpY2snLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChtYXJrZXJzLCBmdW5jdGlvbihpLG1hcmtlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QW5pbWF0aW9uKC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEljb24oJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1yZWQucG5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jb2xsYXBzZScpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdzaG93Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICQoJy5jb2xsYXBzZS1saW5rJykuYWRkQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEkKHRoaXMpLmNsb3Nlc3QoJy5wYW5lbCcpLmZpbmQoJy5jb2xsYXBzZScpLmlzKCc6dmlzaWJsZScpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcucGFuZWwnKS5zaWJsaW5ncygnLnBhbmVsJykuZmluZCgnLmNvbGxhcHNlLWxpbmsnKS5hZGRDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnLnBhbmVsJykuc2libGluZ3MoJy5wYW5lbCcpLmZpbmQoJy5hY2NvcmRpb24tY29sbGFwc2UnKS5yZW1vdmVDbGFzcygnc2hvdycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISQodGhpcykuY2xvc2VzdCgnLnBhbmVsJykuZmluZCgnLmFjY29yZGlvbi1jb2xsYXBzZScpLmhhc0NsYXNzKCdzaG93JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJCh0aGlzKS5jbG9zZXN0KCcucGFuZWwnKS5maW5kKCcuYWNjb3JkaW9uLWNvbGxhcHNlJykuaGFzQ2xhc3MoJ2NvbGxhcHNpbmcnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnLnBhbmVsJykuZmluZCgnLmFjY29yZGlvbi1jb2xsYXBzZScpLmFkZENsYXNzKCdzaG93Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEljb24oJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1ncmV5LnBuZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QW5pbWF0aW9uKGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5CT1VOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhZGRpdGlvbmFsTWFya2VyT25lICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxNYXJrZXJPbmUuc2V0SWNvbignL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLWdyZXkucG5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsTWFya2VyT25lLnNldEFuaW1hdGlvbihnb29nbGUubWFwcy5BbmltYXRpb24uQk9VTkNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhZGRpdGlvbmFsTWFya2VyVHdvICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxNYXJrZXJUd28uc2V0SWNvbignL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLWdyZXkucG5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsTWFya2VyVHdvLnNldEFuaW1hdGlvbihnb29nbGUubWFwcy5BbmltYXRpb24uQk9VTkNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhZGRpdGlvbmFsTWFya2VyVGhyZWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbE1hcmtlclRocmVlLnNldEljb24oJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1ncmV5LnBuZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbE1hcmtlclRocmVlLnNldEFuaW1hdGlvbihnb29nbGUubWFwcy5BbmltYXRpb24uQk9VTkNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhZGRpdGlvbmFsTWFya2VyRm91ciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsTWFya2VyRm91ci5zZXRJY29uKCcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItZ3JleS5wbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxNYXJrZXJGb3VyLnNldEFuaW1hdGlvbihnb29nbGUubWFwcy5BbmltYXRpb24uQk9VTkNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhZGRpdGlvbmFsTWFya2VyRml2ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsTWFya2VyRml2ZS5zZXRJY29uKCcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItZ3JleS5wbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxNYXJrZXJGaXZlLnNldEFuaW1hdGlvbihnb29nbGUubWFwcy5BbmltYXRpb24uQk9VTkNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyQ2xpY2tMaXN0ZW5lciAobWFya2VyLCBtYXJrZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkZGl0aW9uYWxNYXJrZXJPbmUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckNsaWNrTGlzdGVuZXIoYWRkaXRpb25hbE1hcmtlck9uZSwgbWFya2Vycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhZGRpdGlvbmFsTWFya2VyVHdvICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJDbGlja0xpc3RlbmVyKGFkZGl0aW9uYWxNYXJrZXJUd28sIG1hcmtlcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRkaXRpb25hbE1hcmtlclRocmVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJDbGlja0xpc3RlbmVyKGFkZGl0aW9uYWxNYXJrZXJUaHJlZSwgbWFya2Vycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhZGRpdGlvbmFsTWFya2VyRm91ciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyQ2xpY2tMaXN0ZW5lcihhZGRpdGlvbmFsTWFya2VyRm91ciwgbWFya2Vycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhZGRpdGlvbmFsTWFya2VyRml2ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyQ2xpY2tMaXN0ZW5lcihhZGRpdGlvbmFsTWFya2VyRml2ZSwgbWFya2Vycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5pc09ubHlPbmxpbmVzaG9wID09PSB0cnVlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1hcmtlcnNbaV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnNbaV0uc2V0TWFwKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmZpdEJvdW5kcyhtYXBCb3VuZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2xlYXJNYXJrZXJzKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZXJzW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vyc1tpXS5zZXRNYXAobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VycyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbWFya2VyQ2xpY2tMaXN0ZW5lcihtYXJrZXJUZW1wLCBtYXJrZXJBcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUubWFwcy5ldmVudC5hZGRMaXN0ZW5lcihtYXJrZXJUZW1wLCAnY2xpY2snLCAoZnVuY3Rpb24obWFya2VyLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG1hcmtlckFycmF5LCBmdW5jdGlvbihpLG1hcmtlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QW5pbWF0aW9uKC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldE9wdGlvbnMoe2ljb246ICJ0eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1yZWQucG5nIn0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRPcHRpb25zKHtpY29uOiAidHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItZ3JleS5wbmcifSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJCgnLmNvbGxhcHNlLWxpbmsnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJCgnI2xvY2F0aW9uJyttYXJrZXIubG9jYXRpb25faWQpLmFkZENsYXNzKCdhY3RpdmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAkKCcuY29sbGFwc2UtbGluaycpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSkuYWRkQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICQoJyNsb2NhdGlvbicrbWFya2VyLmxvY2F0aW9uX2lkKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpLnJlbW92ZUNsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjbG9jYXRpb24nK21hcmtlci5sb2NhdGlvbl9pZCkuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QW5pbWF0aW9uKGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5CT1VOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiAkKCcjbG9jYXRpb24nK21hcmtlci5sb2NhdGlvbl9pZCkub2Zmc2V0KCkudG9wIC0gKCQoJy5wYWdlLWhlYWRlcicpLm91dGVySGVpZ2h0KCkgKyAzNSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkobWFya2VyVGVtcCwgaSkpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYXJyYXlDb250YWlucyhuZWVkbGUsIGFycmhheXN0YWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYXJyaGF5c3RhY2suaW5kZXhPZihuZWVkbGUpID4gLTEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhcnJfZGlmZiAoYTEsIGEyKSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IFtdLCBkaWZmID0gW107CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2ExW2ldXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhW2EyW2ldXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhW2EyW2ldXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVthMltpXV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYucHVzaChrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpZmY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICAKICAgIDxzY3JpcHQ+CiAgICAgICAgJChkb2N1bWVudC5ib2R5KS5vbignY2xpY2snLCcubW9iaWxlLWNsb3NlLWFjY29yZGlvbi10cmlnZ2VyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vICQodGhpcykuY2xvc2VzdCgnLmNvbGxhcHNlJykuc2xpZGVVcCgpOwogICAgICAgICAgICAkKHRoaXMpLnBhcmVudHMoJy5hY2NvcmRpb24taXRlbScpLmZpbmQoJy5hY2NvcmRpb24tY29sbGFwc2UnKS5yZW1vdmVDbGFzcygnc2hvdycpOwogICAgICAgICAgICAkKHRoaXMpLnBhcmVudHMoJy5hY2NvcmRpb24taXRlbScpLmZpbmQoJy5jb2xsYXBzZS1saW5rJykuYWRkQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgIH0pOwoKICAgICAgICAkKGRvY3VtZW50LmJvZHkpLm9uKCdjbGljaycsJyNyZXNldC1zZWFyY2gnLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIGNvdW50cnlTZWxlY3QudmFsKCcnKS5jaGFuZ2UoKTsKICAgICAgICAgICAgY2F0ZWdvcnlTZWFyY2hDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICBzdWJtaXRCdXR0b25Db250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICBub3RpZmllckNvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgICQoJy5kZWFsZXItc2VhcmNoLWZvcm0nKS5mYWRlSW4oKTsKICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5mYWRlT3V0KCk7CiAgICAgICAgfSk7CgogICAgICAgICQoZG9jdW1lbnQuYm9keSkub24oJ2NsaWNrJywnLml0ZW0tbGluaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZigkKHRoaXMpLmRhdGEoJ2FuYWx5dGljc2V2ZW50JykgIT09ICcnKXsKICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBldmVudDogJ0hhZW5kbGVyc3VjaGUnLAogICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiAnd2VpdGVybGVpdHVuZycsCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY2xpY2snLAogICAgICAgICAgICAgICAgICAgIGxhYmVsOiAkKHRoaXMpLmRhdGEoJ2FuYWx5dGljc2V2ZW50JykKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGZ1bmN0aW9uIGdldEh0bWxUZW1wbGF0ZShpdGVtLGkpewogICAgICAgICAgICB2YXIgY29udGFjdEhlYWRsaW5lID0gJCgnI2NvbnRhY3QtaGVhZGxpbmUnKS5kYXRhKCdzdHJpbmcnKTsKICAgICAgICAgICAgdmFyIGNhdGVnb3JpZXNIZWFkbGluZSA9ICQoJyNjYXRlZ29yaWVzLWhlYWRsaW5lJykuZGF0YSgnc3RyaW5nJyk7CiAgICAgICAgICAgIHZhciB0ZXh0TGlua09ubGluZXNob3AgPSAkKCcjdGV4dC1saW5rLW9ubGluZXNob3AnKS5kYXRhKCdzdHJpbmcnKTsKICAgICAgICAgICAgdmFyIHRleHRMaW5rV2Vic2l0ZSA9ICQoJyN0ZXh0LWxpbmstd2Vic2l0ZScpLmRhdGEoJ3N0cmluZycpOwogICAgICAgICAgICB2YXIgY2xvc2VBY2NvcmRpb25UcmlnZ2VyVGV4dCA9ICQoJyN0ZXh0LWNsb3NlLWFjY29yZGlvbicpLmRhdGEoJ3N0cmluZycpOwogICAgICAgICAgICB2YXIgaXRlcmF0b3JDbGFzcyA9ICcnOwogICAgICAgICAgICBpZiAoaSA9PSAnMCcpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9yQ2xhc3MgPSAnIGZpcnN0JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIGFuYWx5dGljc0V2ZW50ID0gJyc7CiAgICAgICAgICAgIGlmKGl0ZW0uYW5hbHl0aWNzRXZlbnQgIT0gJycpewogICAgICAgICAgICAgICAgYW5hbHl0aWNzRXZlbnQgPSBpdGVtLmFuYWx5dGljc0V2ZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgaHRtbCA9ICc8ZGl2IGNsYXNzPSJhY2NvcmRpb24taXRlbSBwYW5lbCI+JzsKCiAgICAgICAgICAgIGh0bWwgICArPSAnIDxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgY2xhc3M9ImFjY29yZGlvbi10aXRsZSBjb2xsYXBzZS1saW5rIGNvbGxhcHNlZCIgZGF0YS1icy10b2dnbGU9ImNvbGxhcHNlIiBpZD0ibG9jYXRpb24nICsgaXRlbS5sb2NhdGlvbmlkICsnIiBkYXRhLWJzLXRhcmdldD0iI2NvbGxhcHNlJyArIGl0ZW0ubG9jYXRpb25pZCArJyIgYXJpYS1leHBhbmRlZD0iZmFsc2UiIGFyaWEtY29udHJvbHM9ImxvY2F0aW9uJyArIGl0ZW0ubG9jYXRpb25pZCArJyI+JzsKICAgICAgICAgICAgaHRtbCAgICs9ICc8ZGl2IGNsYXNzPSJhY2MtdGl0bGUiPicgKyBpdGVtLnRpdGxlICsnPC9kaXY+JzsKCiAgICAgICAgICAgIGh0bWwgICArPSAnPGRpdiBjbGFzcz0iYWNjLXN1YnRpdGxlIj4nICsgaXRlbS5zdWJ0aXRsZSArJzwvZGl2PjwvYT4nOwoKICAgICAgICAgICAgaHRtbCAgICs9JzxkaXYgZGF0YS1icy1wYXJlbnQ9IiNhY2NvcmRpb24iIGlkPSJjb2xsYXBzZScgKyBpdGVtLmxvY2F0aW9uaWQgKyciIGNsYXNzPSJhY2NvcmRpb24tY29sbGFwc2UgY29sbGFwc2UiIHN0eWxlPSIiPic7CiAgICAgICAgICAgIGh0bWwgICArPSc8ZGl2IGNsYXNzPSJhY2NvcmRpb24tYm9keSI+JzsKCgogICAgICAgICAgICBodG1sICAgKz0nPGRpdiBjbGFzcz0icm93IGRlc2NyaXB0aW9uLXJvdyI+JzsKICAgICAgICAgICAgaHRtbCAgICs9JzxkaXYgY2xhc3M9ImNvbC1tZC02IGNvbC1sZy04Ij4nOwogICAgICAgICAgICBodG1sICAgKz0nIDxkaXYgY2xhc3M9ImRlYWxlci1kZXNjcmlwdGlvbiI+JyArIGl0ZW0uZGVzY3JpcHRpb24gKyAnPC9kaXY+JzsKICAgICAgICAgICAgaHRtbCAgICs9JzwvZGl2Pic7CiAgICAgICAgICAgIGh0bWwgICArPSc8ZGl2IGNsYXNzPSJjb2wtbWQtNiBjb2wtbGctNCI+JzsKCiAgICAgICAgICAgIGlmKGl0ZW0uaW1hZ2VVcmwgIT09ICcnKXsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxpbWcgc3JjPSInICsgaXRlbS5pbWFnZVVybCArICciIGNsYXNzPSJpbWctcmVzcG9uc2l2ZSIgd2lkdGg9IjI1MCIgLz4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBodG1sICAgKz0nPC9kaXY+PC9kaXY+JzsKCiAgICAgICAgICAgIGh0bWwgICArPScgPGRpdiBjbGFzcz0icm93IGNvbnRhY3Qtcm93Ij4nOwogICAgICAgICAgICBodG1sICAgKz0nPGRpdiBjbGFzcz0iY29sLW1kLTYgY29sLWxnLTgiPic7CiAgICAgICAgICAgIGh0bWwgICArPSc8ZGl2IGNsYXNzPSJjYXRlZ29yaWVzLWhlYWRsaW5lIj4nICsgY2F0ZWdvcmllc0hlYWRsaW5lICsgJzwvZGl2Pic7CiAgICAgICAgICAgIGh0bWwgICArPSc8ZGl2IGNsYXNzPSJpdGVtLWNhdGVnb3JpZXMiPic7CgogICAgICAgICAgICBpZihpdGVtLmNhdGVnb3JpZXMgIT09ICcnKXsKICAgICAgICAgICAgICAgIHZhciBjYXRlZ29yaWVzQXJyYXkgPSBpdGVtLmNhdGVnb3JpZXM7CgogICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY2F0ZWdvcmllc0FycmF5KSkgewogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9Iml0ZW0tY2F0ICcgKyBrZXkgICsgJyI+JyArIHZhbHVlICArICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaHRtbCAgKz0nPC9kaXY+JzsKICAgICAgICAgICAgaHRtbCAgKz0nPC9kaXY+JzsKCiAgICAgICAgICAgIGh0bWwgICs9JzxkaXYgY2xhc3M9ImNvbC1tZC02IGNvbC1sZy00Ij4nOwoKICAgICAgICAgICAgaHRtbCAgKz0nPGRpdiBjbGFzcz0iY29udGFjdC1oZWFkbGluZSI+JyArIGNvbnRhY3RIZWFkbGluZSArICc8L2Rpdj4nOwoKICAgICAgICAgICAgaWYgKGl0ZW0uYWRkcmVzcykgewogICAgICAgICAgICAgICAgaHRtbCAgKz0nIDxkaXY+PGRpdiBjbGFzcz0iaXRlbS1hZGRyZXNzIj4nICsgaXRlbS5hZGRyZXNzICsgJzwvZGl2PjwvZGl2Pic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpdGVtLnBob25lKSB7CiAgICAgICAgICAgICAgICBodG1sICArPSc8ZGl2PjxkaXYgY2xhc3M9Iml0ZW0tcGhvbmUiPjxhIGhyZWY9InRlbDonKyBpdGVtLnBob25lICsnIj4nICsgaXRlbS5waG9uZSArICc8L2E+PC9kaXY+PC9kaXY+JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGl0ZW0uZW1haWwpIHsKICAgICAgICAgICAgICAgIGh0bWwgICs9JzxkaXY+PGRpdiBjbGFzcz0iaXRlbS1lbWFpbCI+PGEgaHJlZj0ibWFpbHRvOicrIGl0ZW0uZW1haWwgKyciPicgKyBpdGVtLmVtYWlsICsgJzwvYT48L2Rpdj48L2Rpdj4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBodG1sICArPScgIDxkaXYgY2xhc3M9InZpc2l0LXN0b3JlLWxpbmtzIj4nOwoKICAgICAgICAgICAgaWYoaXRlbS5saW5rV2Vic2l0ZSAhPT0gJycpewogICAgICAgICAgICAgICAgaHRtbCArPSAnPGEgaHJlZj0iJyArIGl0ZW0ubGlua1dlYnNpdGUgKyAnIiBjbGFzcz0iaXRlbS1saW5rIGJ0biIgdGFyZ2V0PSJfYmxhbmsiIGRhdGEtYW5hbHl0aWNzZXZlbnQ9IicgKyBhbmFseXRpY3NFdmVudCArICciPicgKyB0ZXh0TGlua1dlYnNpdGUgKyAnPC9hPic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKGl0ZW0ubGlua09ubGluZVNob3AgIT09ICcnKXsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxhIGhyZWY9IicgKyBpdGVtLmxpbmtPbmxpbmVTaG9wICsgJyIgY2xhc3M9Iml0ZW0tbGluayBidG4iIHRhcmdldD0iX2JsYW5rIiBkYXRhLWFuYWx5dGljc2V2ZW50PSInICsgYW5hbHl0aWNzRXZlbnQgKyAnIj4nICsgdGV4dExpbmtPbmxpbmVzaG9wICsgJzwvYT4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBodG1sICs9JzwvZGl2Pic7CgogICAgICAgICAgICBodG1sICs9JzwvZGl2Pic7CgogICAgICAgICAgICBodG1sICs9JzwvZGl2Pic7CgogICAgICAgICAgICBodG1sICs9JzxkaXYgY2xhc3M9InJvdyI+JzsKCiAgICAgICAgICAgIGh0bWwgKz0nIDxkaXYgY2xhc3M9ImNvbC1zbS0xMiI+JzsKCiAgICAgICAgICAgIGh0bWwgKz0nICA8ZGl2IGNsYXNzPSJtb2JpbGUtY2xvc2UtYWNjb3JkaW9uIj48c3BhbiBjbGFzcz0ibW9iaWxlLWNsb3NlLWFjY29yZGlvbi10cmlnZ2VyIj4nKyBjbG9zZUFjY29yZGlvblRyaWdnZXJUZXh0ICsnPC9zcGFuPjwvZGl2Pic7CgogICAgICAgICAgICBodG1sICs9JzwvZGl2PjwvZGl2PiA8L2Rpdj48L2Rpdj48L2Rpdj4nOwoKCiAgICAgICAgICAgIHJldHVybiBodG1sOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBhcnJheUNvbnRhaW5zKG5lZWRsZSwgYXJyaGF5c3RhY2spIHsKICAgICAgICAgICAgcmV0dXJuIChhcnJoYXlzdGFjay5pbmRleE9mKG5lZWRsZSkgPiAtMSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFycl9kaWZmIChhMSwgYTIpIHsKCiAgICAgICAgICAgIHZhciBhID0gW10sIGRpZmYgPSBbXTsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGFbYTFbaV1dID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGFbYTJbaV1dKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFbYTJbaV1dOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBhW2EyW2ldXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gYSkgewogICAgICAgICAgICAgICAgZGlmZi5wdXNoKGspOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZGlmZjsKICAgICAgICB9CiAgICA8L3NjcmlwdD4KCiAgICAgICAgICAgICAgICAgIA==
By clicking on "Load Google Maps" I consent to the processing of my data by Google. This consent can be revoked at any time with effect for the future. Further information can be found in our privacy policy.