Аудит

Данные на 16 февраля 2024

Добавить сайт в список

31

Показатели сайта

0
0
0
Узнайте больше об этом сайте
ИКС сайта 190
SSL-сертификат Есть SSL-сертификат

Содержимое

Заголовок (тег title) Активный рыболов
Заголовок (тег h1) Отсутствует
Описание сайта (description) Отсутствует

Главная страница сайта

URL сайта https://activefisher.net/
Локализация сайта Альтернативных страниц нет
Кодировка страниц UTF-8
Тексты 98
HTML теги 717
a214 article31 body1 center1 comment5 div176 footer1 h11 h232 h42 head1 header1 html1 i4 img38 li114 link15 meta7 nav2 noscript1 p3 picture3 script26 source6 span7 style7 title1 ul15 unknown1
Скрипты на сайте 26
Обнаружены скрипты:
Яндекс.Метрика
Все скрипты:
data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgam9oYW5uZXNfanNfc2V0dGluZ3MgPSB7InJ0bF9tb2RlIjoiIiwiaGVhZGVyX3N0aWNreSI6IiIsImhlYWRlcl9zdGlja3lfb2Zmc2V0IjoiMzAwIiwiaGVhZGVyX3N0aWNreV91cCI6IiIsInBvcHVwIjoiMSIsImdvX3RvX3RvcCI6IjEiLCJncmlkIjp7ImNvbHVtbiI6NTAsImd1dHRlciI6eyJ4cyI6MTUsInNtIjoxNSwibWQiOjMwLCJsZyI6MzAsInhsIjo0OH0sImJyZWFrcG9pbnQiOnsieHMiOjAsInNtIjozNzQsIm1kIjo2MDAsImxnIjo5MDAsInhsIjoxMTI4fX19OwovKiBdXT4gKi8K
data:text/javascript;base64,CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvbkVycm9yUGxhY2luZygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhY2hlUGxhY2luZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNhY2hlUGxhY2luZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygd2luZG93LmpzSW5wdXRlckxhdW5jaCAhPT0gJ3VuZGVmaW5lZCcgJiYgWzE1LCAxMF0uaW5jbHVkZXMod2luZG93LmpzSW5wdXRlckxhdW5jaCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9ySW5mbyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVBsYWNpbmcoJ2xvdycsZXJyb3JJbmZvKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3JQbGFjaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICB4aHIub3BlbignR0VUJywiLy9uZXdyb3RhdG9ybWFyY2gyMy5iaWQvMXY5ODYuanNvbiIsdHJ1ZSk7CiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOwogICAgICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzICE9IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1c1RleHQgIT0gJ2Fib3J0JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvclBsYWNpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpOwogICAgICAgICAgICA=
data:text/javascript;base64,CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvbkVycm9yUGxhY2luZygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhY2hlUGxhY2luZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNhY2hlUGxhY2luZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygd2luZG93LmpzSW5wdXRlckxhdW5jaCAhPT0gJ3VuZGVmaW5lZCcgJiYgWzE1LCAxMF0uaW5jbHVkZXMod2luZG93LmpzSW5wdXRlckxhdW5jaCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9ySW5mbyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVBsYWNpbmcoJ2xvdycsZXJyb3JJbmZvKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3JQbGFjaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICB4aHIub3BlbignR0VUJywiLy9uZXdyb3RhdG9ybWFyY2gyMy5iaWQvMXY5ODYubWluLmpzIix0cnVlKTsKICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7CiAgICAgICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgIT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzVGV4dCAhPSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yUGxhY2luZygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7CiAgICAgICAgICAgIA==
data:text/javascript;base64,CiAgICAgICAgICAgIHZhciBjb3UxID0gMDsKICAgICAgICAgICAgaWYgKHR5cGVvZiBibG9ja1NldHRpbmdBcnJheT09PSJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB2YXIgYmxvY2tTZXR0aW5nQXJyYXkgPSBbXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJsb2NrU2V0dGluZ0FycmF5KSkgewogICAgICAgICAgICAgICAgICAgIGNvdTEgPSBibG9ja1NldHRpbmdBcnJheS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBibG9ja1NldHRpbmdBcnJheSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhjSWRDbGFzcz09PSJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICB2YXIgZXhjSWRDbGFzcyA9IFsiLnBlcmNlbnRQb2ludGVyQ2xhc3MiLCIuY29udGVudF9yYiIsIi5jbnQzMl9ybF9iZ19zdHIiLCIucmxfY250X2JnIiwiLmFkZGVkSW5zZXJ0aW5nIiwiI3RvY19jb250YWluZXIiLCJ0YWJsZSIsImJsb2NrcXVvdGUiXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIGJsb2NrRHVwbGljYXRlPT09InVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHZhciBibG9ja0R1cGxpY2F0ZSA9ICJubyI7CiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmxpZ2F0b3J5TWFyZ2luPT09InVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICAgIHZhciBvYmxpZ2F0b3J5TWFyZ2luID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHR5cGVvZiB0YWdzTGlzdEZvclRleHRMZW5ndGg9PT0idW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgdmFyIHRhZ3NMaXN0Rm9yVGV4dExlbmd0aCA9IFsiUCIsIkgxIiwiSDIiLCJIMyIsIkg0IiwiSDUiLCJINiIsIkRJViIsIkJMT0NLUVVPVEUiLCJJTkRFWCIsIkFSVElDTEUiLCJTRUNUSU9OIl07CiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzQwMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBpZD1cImNvbnRlbnRfcmJfMzQ1MzQyXCIgY2xhc3M9XCJjb250ZW50X3JiXCIgZGF0YS1pZD1cIjM0NTM0MlwiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSAxOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Il0gPSAiaDIiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQb3NpdGlvbiJdID0gMDsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDE7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MDEnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM0M1wiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNDNcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSAzMDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MDInOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM0NFwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNDRcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSA5MDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MDMnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM0NVwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNDVcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSAxODAwOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnNDA0JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGlkPVwiY29udGVudF9yYl8zNDUzNDZcIiBjbGFzcz1cImNvbnRlbnRfcmJcIiBkYXRhLWlkPVwiMzQ1MzQ2XCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMjcwMDsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzQwNSc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBpZD1cImNvbnRlbnRfcmJfMzQ1MzQ3XCIgY2xhc3M9XCJjb250ZW50X3JiXCIgZGF0YS1pZD1cIjM0NTM0N1wiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSA3OyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDM2MDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MDYnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM0OFwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNDhcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSA0NTAwOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnNDA3JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGlkPVwiY29udGVudF9yYl8zNDUzNDlcIiBjbGFzcz1cImNvbnRlbnRfcmJcIiBkYXRhLWlkPVwiMzQ1MzQ5XCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gNTQwMDsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzQwOCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBpZD1cImNvbnRlbnRfcmJfMzQ1MzUwXCIgY2xhc3M9XCJjb250ZW50X3JiXCIgZGF0YS1pZD1cIjM0NTM1MFwiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSA3OyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDYzMDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MDknOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM1MVwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNTFcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSA3MjAwOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnNDEwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGlkPVwiY29udGVudF9yYl8zNDUzNTJcIiBjbGFzcz1cImNvbnRlbnRfcmJcIiBkYXRhLWlkPVwiMzQ1MzUyXCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gODEwMDsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzQxMSc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBpZD1cImNvbnRlbnRfcmJfMzQ1MzUzXCIgY2xhc3M9XCJjb250ZW50X3JiXCIgZGF0YS1pZD1cIjM0NTM1M1wiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSA3OyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDkwMDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MTInOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM1NFwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNTRcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSA5OTAwOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnNDEzJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGlkPVwiY29udGVudF9yYl8zNDUzNTVcIiBjbGFzcz1cImNvbnRlbnRfcmJcIiBkYXRhLWlkPVwiMzQ1MzU1XCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMTA4MDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MTQnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM1NlwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNTZcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSAxMTcwMDsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzQxNSc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBpZD1cImNvbnRlbnRfcmJfMzQ1MzU3XCIgY2xhc3M9XCJjb250ZW50X3JiXCIgZGF0YS1pZD1cIjM0NTM1N1wiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSA3OyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDEyNjAwOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnNDE2JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGlkPVwiY29udGVudF9yYl8zNDUzNThcIiBjbGFzcz1cImNvbnRlbnRfcmJcIiBkYXRhLWlkPVwiMzQ1MzU4XCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMTM1MDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MTcnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM1OVwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNTlcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSAxNDQwMDsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzQxOCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBpZD1cImNvbnRlbnRfcmJfMzQ1MzYwXCIgY2xhc3M9XCJjb250ZW50X3JiXCIgZGF0YS1pZD1cIjM0NTM2MFwiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSA3OyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDE1MzAwOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnNDE5JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGlkPVwiY29udGVudF9yYl8zNDUzNjFcIiBjbGFzcz1cImNvbnRlbnRfcmJcIiBkYXRhLWlkPVwiMzQ1MzYxXCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMTYyMDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MjAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM2MlwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNjJcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSAxNzEwMDsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzQyMSc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBpZD1cImNvbnRlbnRfcmJfMzQ1MzYzXCIgY2xhc3M9XCJjb250ZW50X3JiXCIgZGF0YS1pZD1cIjM0NTM2M1wiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSA3OyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDE4MDAwOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnNDIyJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGlkPVwiY29udGVudF9yYl8zNDUzNjRcIiBjbGFzcz1cImNvbnRlbnRfcmJcIiBkYXRhLWlkPVwiMzQ1MzY0XCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMTg5MDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MjMnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM2NVwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNjVcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSAxOTgwMDsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzQyNCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBpZD1cImNvbnRlbnRfcmJfMzQ1MzY2XCIgY2xhc3M9XCJjb250ZW50X3JiXCIgZGF0YS1pZD1cIjM0NTM2NlwiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSA3OyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDIwNzAwOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnNDI1JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGlkPVwiY29udGVudF9yYl8zNDUzNjdcIiBjbGFzcz1cImNvbnRlbnRfcmJcIiBkYXRhLWlkPVwiMzQ1MzY3XCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMjE2MDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MjYnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM2OFwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNjhcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSAyMjUwMDsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzQyNyc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBpZD1cImNvbnRlbnRfcmJfMzQ1MzY5XCIgY2xhc3M9XCJjb250ZW50X3JiXCIgZGF0YS1pZD1cIjM0NTM2OVwiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSA3OyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDIzNDAwOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnNDI4JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGlkPVwiY29udGVudF9yYl8zNDUzNzBcIiBjbGFzcz1cImNvbnRlbnRfcmJcIiBkYXRhLWlkPVwiMzQ1MzcwXCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMjQzMDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MjknOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM3MVwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNzFcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBsYWNlIl0gPSAyNTIwMDsgCmNvdTErKzsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV0gPSBbXTsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pblN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhTeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluSGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heEhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJpZCJdID0gJzQzMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2MiXSA9ICcwJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJ0ZXh0Il0gPSAnPGRpdiBpZD1cImNvbnRlbnRfcmJfMzQ1MzcyXCIgY2xhc3M9XCJjb250ZW50X3JiXCIgZGF0YS1pZD1cIjM0NTM3MlwiPjwvZGl2Pic7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsic2V0dGluZ190eXBlIl0gPSA3OyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRDc3MiXSA9ICJkZWZhdWx0IjsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50UGxhY2UiXSA9IDI2MTAwOyAKY291MSsrOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXSA9IFtdOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWluU3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1heFN5bWJvbHMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5IZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4SGVhZGVycyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImlkIl0gPSAnNDMxJzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzYyJdID0gJzAnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInRleHQiXSA9ICc8ZGl2IGlkPVwiY29udGVudF9yYl8zNDUzNzNcIiBjbGFzcz1cImNvbnRlbnRfcmJcIiBkYXRhLWlkPVwiMzQ1MzczXCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMjcwMDA7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MzInOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgaWQ9XCJjb250ZW50X3JiXzM0NTM3NFwiIGNsYXNzPVwiY29udGVudF9yYlwiIGRhdGEtaWQ9XCIzNDUzNzRcIj48L2Rpdj4nOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNldHRpbmdfdHlwZSJdID0gNDsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJlbGVtZW50Q3NzIl0gPSAiZGVmYXVsdCI7IApjb3UxKys7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdID0gW107CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtaW5TeW1ib2xzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsibWF4U3ltYm9scyJdID0gMDsKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bIm1pbkhlYWRlcnMiXSA9IDA7CmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJtYXhIZWFkZXJzIl0gPSAwOwpibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiaWQiXSA9ICc0MzMnOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bInNjIl0gPSAnMCc7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsidGV4dCJdID0gJzxkaXYgY2xhc3M9XCJybF9jbnRfYmdcIiBkYXRhLWlkPVwiMzUwNDk4XCI+PC9kaXY+JzsgCmJsb2NrU2V0dGluZ0FycmF5W2NvdTFdWyJzZXR0aW5nX3R5cGUiXSA9IDE7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudENzcyJdID0gImRlZmF1bHQiOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnQiXSA9ICJoMiI7IApibG9ja1NldHRpbmdBcnJheVtjb3UxXVsiZWxlbWVudFBvc2l0aW9uIl0gPSAxOyAKYmxvY2tTZXR0aW5nQXJyYXlbY291MV1bImVsZW1lbnRQbGFjZSJdID0gMTsgCmNvdTErKzsKY29uc29sZS5sb2coImJzYS1sOiAiK2Jsb2NrU2V0dGluZ0FycmF5Lmxlbmd0aCk7Cg==
data:text/javascript;base64,CiAgICBpZiAodHlwZW9mIHdpbmRvdy5qc0lucHV0ZXJMYXVuY2ggPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgd2luZG93LmpzSW5wdXRlckxhdW5jaCA9IC0xOwogICAgfQogICAgaWYgKHR5cGVvZiBjb250ZW50U2VhcmNoQ291bnQgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdmFyIGNvbnRlbnRTZWFyY2hDb3VudCA9IDA7CiAgICB9CiAgICBpZiAodHlwZW9mIGxhdW5jaEFzeW5jRnVuY3Rpb25MYXVuY2hlciA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICBmdW5jdGlvbiBsYXVuY2hBc3luY0Z1bmN0aW9uTGF1bmNoZXIoKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYXN5bmNGdW5jdGlvbkxhdW5jaGVyICE9PSAidW5kZWZpbmVkIiAmJiB0eXBlb2YgYXN5bmNGdW5jdGlvbkxhdW5jaGVyID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICBhc3luY0Z1bmN0aW9uTGF1bmNoZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGxhdW5jaEFzeW5jRnVuY3Rpb25MYXVuY2hlcigpOwogICAgICAgICAgICAgICAgfSwgMTAwKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKHR5cGVvZiBsYXVuY2hHYXRoZXJDb250ZW50QmxvY2sgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgZnVuY3Rpb24gbGF1bmNoR2F0aGVyQ29udGVudEJsb2NrKCkgewogICAgICAgICAgICBpZiAodHlwZW9mIGdhdGhlckNvbnRlbnRCbG9jayAhPT0gInVuZGVmaW5lZCIgJiYgdHlwZW9mIGdhdGhlckNvbnRlbnRCbG9jayA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgZ2F0aGVyQ29udGVudEJsb2NrKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBsYXVuY2hHYXRoZXJDb250ZW50QmxvY2soKTsKICAgICAgICAgICAgICAgIH0sIDEwMCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRlbnRNb25pdG9yaW5nKCkgewogICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmpzSW5wdXRlckxhdW5jaD09PSd1bmRlZmluZWQnfHwodHlwZW9mIHdpbmRvdy5qc0lucHV0ZXJMYXVuY2ghPT0ndW5kZWZpbmVkJyYmd2luZG93LmpzSW5wdXRlckxhdW5jaD09LTEpKSB7CiAgICAgICAgICAgIGxldCBwb3NzaWJsZUNsYXNzZXMgPSBbJy50YXhvbm9teS1kZXNjcmlwdGlvbicsJy5lbnRyeS1jb250ZW50JywnLnBvc3Qtd3JhcCcsJy5wb3N0LWJvZHknLCcjYmxvZy1lbnRyaWVzJywnLmNvbnRlbnQnLCcuYXJjaGl2ZS1wb3N0c19faXRlbS10ZXh0JywnLnNpbmdsZS1jb21wYW55X3dyYXBwZXInLCcucG9zdHMtY29udGFpbmVyJywnLmNvbnRlbnQtYXJlYScsJy5wb3N0LWxpc3RpbmcnLCcudGQtY2F0ZWdvcnktZGVzY3JpcHRpb24nLCcuamVnX3Bvc3RzX3dyYXAnXTsKICAgICAgICAgICAgbGV0IGRlbmllZENsYXNzZXMgPSBbJy5wZXJjZW50UG9pbnRlckNsYXNzJywnLmFkZGVkSW5zZXJ0aW5nJywnI3RvY19jb250YWluZXInXTsKICAgICAgICAgICAgbGV0IGRlbmllZFN0cmluZyA9ICIiOwogICAgICAgICAgICBsZXQgY29udGVudFNlbGVjdG9yID0gJy5lbnRyeS1jb250ZW50JzsKICAgICAgICAgICAgbGV0IGNvbnRlbnRDaGVjayA9IG51bGw7CiAgICAgICAgICAgIGlmIChjb250ZW50U2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgIGNvbnRlbnRDaGVjayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGVudFNlbGVjdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGJsb2NrX2NsYXNzZXMgJiYgYmxvY2tfY2xhc3Nlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrX2NsYXNzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tfY2xhc3Nlc1tpXSkgewogICAgICAgICAgICAgICAgICAgICAgICBkZW5pZWRDbGFzc2VzLnB1c2goJy4nICsgYmxvY2tfY2xhc3Nlc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZGVuaWVkQ2xhc3NlcyYmZGVuaWVkQ2xhc3Nlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbmllZENsYXNzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBkZW5pZWRTdHJpbmcgKz0gIjpub3QoIitkZW5pZWRDbGFzc2VzW2ldKyIpIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCFjb250ZW50Q2hlY2spIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zc2libGVDbGFzc2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudENoZWNrID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihwb3NzaWJsZUNsYXNzZXNbaV0rZGVuaWVkU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudENoZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNvbnRlbnRDaGVjaykgewogICAgICAgICAgICAgICAgY29udGVudENoZWNrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2l0ZW1wcm9wPWFydGljbGVCb2R5XScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb250ZW50Q2hlY2spIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb250ZW50IGlzIGhlcmUnKTsKICAgICAgICAgICAgICAgIGxldCBjb250ZW50UG9pbnRlckNoZWNrID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnRfcG9pbnRlcl9pZCcpOwogICAgICAgICAgICAgICAgbGV0IGNwU3BhbgogICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRQb2ludGVyQ2hlY2sgJiYgY29udGVudENoZWNrLmNvbnRhaW5zKGNvbnRlbnRQb2ludGVyQ2hlY2spKSB7CiAgICAgICAgICAgICAgICAgICAgY3BTcGFuID0gY29udGVudFBvaW50ZXJDaGVjazsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRQb2ludGVyQ2hlY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFBvaW50ZXJDaGVjay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNvbnRlbnRQb2ludGVyQ2hlY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjcFNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdTUEFOJyk7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNwU3Bhbi5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2NvbnRlbnRfcG9pbnRlcl9pZCcpOwogICAgICAgICAgICAgICAgY3BTcGFuLmNsYXNzTGlzdC5hZGQoJ25vLWNvbnRlbnQnKTsKICAgICAgICAgICAgICAgIGNwU3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGVudC1sZW5ndGgnLCAnMCcpOwogICAgICAgICAgICAgICAgY3BTcGFuLnNldEF0dHJpYnV0ZSgnZGF0YS1hY2NlcHRlZC1ibG9ja3MnLCAnNDAwLDQwMSw0MDIsNDAzLDQwNCw0MDUsNDA2LDQwNyw0MDgsNDA5LDQxMCw0MTEsNDEyLDQxMyw0MTQsNDE1LDQxNiw0MTcsNDE4LDQxOSw0MjAsNDIxLDQyMiw0MjMsNDI0LDQyNSw0MjYsNDI3LDQyOCw0MjksNDMwLDQzMSw0MzIsNDMzJyk7CiAgICAgICAgICAgICAgICBjcFNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXJlamVjdGVkLWJsb2NrcycsICcwJyk7CiAgICAgICAgICAgICAgICB3aW5kb3cuanNJbnB1dGVyTGF1bmNoID0gMTA7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICghY3BTcGFuLnBhcmVudE5vZGUpIGNvbnRlbnRDaGVjay5wcmVwZW5kKGNwU3Bhbik7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGxhdW5jaEFzeW5jRnVuY3Rpb25MYXVuY2hlcigpOwogICAgICAgICAgICAgICAgbGF1bmNoR2F0aGVyQ29udGVudEJsb2NrKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29udGVudE1vbml0b3JpbmcgdHJ5Jyk7CiAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgY29udGVudFNlYXJjaENvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoY29udGVudFNlYXJjaENvdW50IDwgMjApIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudE1vbml0b3JpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50Q2hlY2sgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJib2R5IitkZW5pZWRTdHJpbmcrIiBkaXYiK2RlbmllZFN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRDaGVjaykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29udGVudCBpcyBoZXJlIGhhcmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNwU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1NQQU4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgY3BTcGFuLnNldEF0dHJpYnV0ZSgnaWQnLCAnY29udGVudF9wb2ludGVyX2lkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNwU3Bhbi5jbGFzc0xpc3QuYWRkKCduby1jb250ZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNwU3Bhbi5jbGFzc0xpc3QuYWRkKCdoYXJkLWNvbnRlbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY3BTcGFuLnNldEF0dHJpYnV0ZSgnZGF0YS1jb250ZW50LWxlbmd0aCcsICcwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNwU3Bhbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWNjZXB0ZWQtYmxvY2tzJywgJzQwMCw0MDEsNDAyLDQwMyw0MDQsNDA1LDQwNiw0MDcsNDA4LDQwOSw0MTAsNDExLDQxMiw0MTMsNDE0LDQxNSw0MTYsNDE3LDQxOCw0MTksNDIwLDQyMSw0MjIsNDIzLDQyNCw0MjUsNDI2LDQyNyw0MjgsNDI5LDQzMCw0MzEsNDMyLDQzMycpOwogICAgICAgICAgICAgICAgICAgICAgICBjcFNwYW4uc2V0QXR0cmlidXRlKCdkYXRhLXJlamVjdGVkLWJsb2NrcycsICcwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5qc0lucHV0ZXJMYXVuY2ggPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDaGVjay5wcmVwZW5kKGNwU3Bhbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaEFzeW5jRnVuY3Rpb25MYXVuY2hlcigpOwogICAgICAgICAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdqc0lucHV0ZXJMYXVuY2ggaXMgaGVyZScpOwogICAgICAgICAgICBsYXVuY2hHYXRoZXJDb250ZW50QmxvY2soKTsKICAgICAgICB9CiAgICB9CiAgICBjb250ZW50TW9uaXRvcmluZygpOwo=
data:text/javascript;base64,CmlmICh0eXBlb2YgcmJfYWpheHVybD09PSd1bmRlZmluZWQnKSB7dmFyIHJiX2FqYXh1cmwgPSAnaHR0cHM6Ly9hY3RpdmVmaXNoZXIubmV0L3dwLWFkbWluL2FkbWluLWFqYXgucGhwJzt9CmlmICh0eXBlb2YgZ2F0aGVyX2NvbnRlbnQ9PT0ndW5kZWZpbmVkJykge3ZhciBnYXRoZXJfY29udGVudCA9IHRydWU7fQppZiAodHlwZW9mIGVuZGVkU2M9PT0ndW5kZWZpbmVkJykge3ZhciBlbmRlZFNjID0gZmFsc2U7fQ0KaWYgKHR5cGVvZiBlbmRlZENjPT09J3VuZGVmaW5lZCcpIHt2YXIgZW5kZWRDYyA9IGZhbHNlO30NCmlmICh0eXBlb2YgdXNlZEFkQmxvY2tzQXJyYXk9PT0ndW5kZWZpbmVkJykge3ZhciB1c2VkQWRCbG9ja3NBcnJheSA9IFtdO30NCmlmICh0eXBlb2YgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzPT09J3VuZGVmaW5lZCcpIHt2YXIgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzID0gW107fQ0KaWYgKHR5cGVvZiBzYW1lRWxlbWVudEFmdGVyV2lkdGg9PT0ndW5kZWZpbmVkJykge3ZhciBzYW1lRWxlbWVudEFmdGVyV2lkdGggPSBmYWxzZTt9DQppZiAodHlwZW9mIHNhbWVFbGVtZW50QWZ0ZXJFeGNDbGFzc0lkPT09J3VuZGVmaW5lZCcpIHt2YXIgc2FtZUVsZW1lbnRBZnRlckV4Y0NsYXNzSWQgPSBmYWxzZTt9DQppZiAodHlwZW9mIHNhbWVFbGVtZW50QWZ0ZXJGcm9tQ29uc3RydWN0aW9uPT09J3VuZGVmaW5lZCcpIHt2YXIgc2FtZUVsZW1lbnRBZnRlckZyb21Db25zdHJ1Y3Rpb24gPSBmYWxzZTt9DQppZiAodHlwZW9mIHJiX3RlbXBFbGVtZW50X2NoZWNrPT09J3VuZGVmaW5lZCcpIHt2YXIgcmJfdGVtcEVsZW1lbnRfY2hlY2sgPSBmYWxzZTt9DQppZiAodHlwZW9mIHJiX3RlbXBFbGVtZW50PT09J3VuZGVmaW5lZCcpIHt2YXIgcmJfdGVtcEVsZW1lbnQgPSBudWxsO30NCmlmICh0eXBlb2Ygd2luZG93LmpzSW5wdXRlckxhdW5jaD09PSd1bmRlZmluZWQnKSB7d2luZG93LmpzSW5wdXRlckxhdW5jaCA9IC0xO30NCg0KZnVuY3Rpb24gbGF1bmNoVXBkYXRlUmJEaXNwbGF5cygpIHsNCiAgICBpZiAoKHR5cGVvZiB1cGRhdGVSYkRpc3BsYXlzICE9PSAndW5kZWZpbmVkJykmJih0eXBlb2YgdXBkYXRlUmJEaXNwbGF5cyA9PT0gJ2Z1bmN0aW9uJykpIHsNCiAgICAgICAgdXBkYXRlUmJEaXNwbGF5cygpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgbGF1bmNoVXBkYXRlUmJEaXNwbGF5cygpOw0KICAgICAgICB9LCAyMDApOw0KICAgIH0NCn0NCg0KLyogInNjIiBpbiB2YXJpYWJsZXMgLSBtYXJrIGZvciBzaG9ydGNvZGUgdmFyaWFibGUgKi8NCmZ1bmN0aW9uIHNob3J0Y29kZXNJbnNlcnQoKSB7DQogICAgbGV0IGdhdGhlcmVkQmxvY2tzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBlcmNlbnRQb2ludGVyQ2xhc3Muc2NNYXJrJyksDQogICAgICAgIHNjQmxvY2tJZCA9IC0xLA0KICAgICAgICBzY0FkSWQgPSAtMSwNCiAgICAgICAgYmxvY2tTdGF0dXMgPSAnJywNCiAgICAgICAgZGF0YUZ1bGwgPSAtMSwNCiAgICAgICAgZ2F0aGVyZWRCbG9ja0NoaWxkLA0KICAgICAgICBva1N0YXRlcyA9IFsnZG9uZScsJ3JlZnJlc2gtd2FpdCcsJ25vLWJsb2NrJywnZmV0Y2hlZCddLA0KICAgICAgICBzY0NvbnRhaW5lciwNCiAgICAgICAgc2NpLA0KICAgICAgICBpMSA9IDAsDQogICAgICAgIHNreXNjcmFwZXJDaGVjayA9IFtdLA0KICAgICAgICBza3lzY3JhcGVyU3RhdHVzID0gZmFsc2UsDQogICAgICAgIHNwbGl0ZWRTa3lzY3JhcGVyID0gW10sDQogICAgICAgIGdhdGhlcmVkQmxvY2tDaGlsZFNreVBhcnRzID0gW10sDQogICAgICAgIHN0aWNreVN0YXR1cyA9IGZhbHNlLA0KICAgICAgICBzdGlja3lDaGVjayA9IFtdLA0KICAgICAgICBzdGlja3lGaXhlZFN0YXR1cyA9IGZhbHNlLA0KICAgICAgICBzdGlja3lGaXhlZENoZWNrID0gW10sDQogICAgICAgIG92ZXJmbG93Q2hlY2sgPSBbXSwNCiAgICAgICAgb3ZlcmZsb3dTdGF0dXMgPSBmYWxzZSwNCiAgICAgICAgcmVwZWF0YWJsZUlkZW50aWZpZXIgPSAiIiwNCiAgICAgICAgZGF0YUNpZElkZW50aWZpZXIgPSBudWxsLA0KICAgICAgICBkaXZDaWRFbGVtZW50ID0gJyc7DQoNCiAgICBpZiAodHlwZW9mIHNjQXJyYXkgIT09ICd1bmRlZmluZWQnKSB7DQogICAgICAgIGlmIChzY0FycmF5JiZzY0FycmF5Lmxlbmd0aCA+IDAmJmdhdGhlcmVkQmxvY2tzJiZnYXRoZXJlZEJsb2Nrcy5sZW5ndGggPiAwJiZ0eXBlb2Ygd2luZG93LnJ1bHZXNWdudGIgIT09ICd1bmRlZmluZWQnKSB7DQogICAgICAgICAgICBkYXRhQ2lkSWRlbnRpZmllciA9IHdpbmRvdy5ydWx2VzVnbnRiOw0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnYXRoZXJlZEJsb2Nrcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGdhdGhlcmVkQmxvY2tDaGlsZCA9IGdhdGhlcmVkQmxvY2tzW2ldLmNoaWxkcmVuWzBdOw0KICAgICAgICAgICAgICAgIGlmICghZ2F0aGVyZWRCbG9ja0NoaWxkKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBzY0FkSWQgPSAtMzsNCiAgICAgICAgICAgICAgICBibG9ja1N0YXR1cyA9IG51bGw7DQogICAgICAgICAgICAgICAgc2NDb250YWluZXIgPSBudWxsOw0KICAgICAgICAgICAgICAgIGRhdGFGdWxsID0gLTE7DQogICAgICAgICAgICAgICAgc2t5c2NyYXBlclN0YXR1cyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHNwbGl0ZWRTa3lzY3JhcGVyID0gW107DQogICAgICAgICAgICAgICAgZ2F0aGVyZWRCbG9ja0NoaWxkU2t5UGFydHMgPSBbXTsNCiAgICAgICAgICAgICAgICBzdGlja3lTdGF0dXMgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBzdGlja3lDaGVjayA9IFtdOw0KICAgICAgICAgICAgICAgIHN0aWNreUZpeGVkU3RhdHVzID0gZmFsc2U7DQogICAgICAgICAgICAgICAgc3RpY2t5Rml4ZWRDaGVjayA9IFtdOw0KICAgICAgICAgICAgICAgIHJlcGVhdGFibGVJZGVudGlmaWVyID0gIiI7DQogICAgICAgICAgICAgICAgZGl2Q2lkRWxlbWVudCA9IG51bGw7DQoNCiAgICAgICAgICAgICAgICBzY0FkSWQgPSBnYXRoZXJlZEJsb2NrQ2hpbGQuZ2V0QXR0cmlidXRlKCdkYXRhLWFpZCcpOw0KICAgICAgICAgICAgICAgIHNjQmxvY2tJZCA9IGdhdGhlcmVkQmxvY2tDaGlsZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKTsNCiAgICAgICAgICAgICAgICBibG9ja1N0YXR1cyA9IGdhdGhlcmVkQmxvY2tDaGlsZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhdGUnKTsNCiAgICAgICAgICAgICAgICBkYXRhRnVsbCA9IGdhdGhlcmVkQmxvY2tDaGlsZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZnVsbCcpOw0KDQogICAgICAgICAgICAgICAgaWYgKHNjQmxvY2tJZCYmc2NBZElkID4gMCkgew0KICAgICAgICAgICAgICAgICAgICBzY2kgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgc2NBcnJheS5sZW5ndGg7IGkxKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY0Jsb2NrSWQgPT0gc2NBcnJheVtpMV1bJ2Jsb2NrSWQnXSYmc2NBZElkID09IHNjQXJyYXlbaTFdWydhZElkJ10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2kgPSBpMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmIChzY2kgPiAtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrU3RhdHVzJiZva1N0YXRlcy5pbmNsdWRlcyhibG9ja1N0YXR1cykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tTdGF0dXM9PSduby1ibG9jaycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0aGVyZWRCbG9ja0NoaWxkLmlubmVySFRNTCA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJsb2NrU3RhdHVzPT0nZmV0Y2hlZCcmJmRhdGFGdWxsPT0xKXx8IVsnbm8tYmxvY2snLCdmZXRjaGVkJ10uaW5jbHVkZXMoYmxvY2tTdGF0dXMpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNsMSA9IDA7IGNsMSA8IGdhdGhlcmVkQmxvY2tzW2ldLmNsYXNzTGlzdC5sZW5ndGg7IGNsMSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2F0aGVyZWRCbG9ja3NbaV0uY2xhc3NMaXN0W2NsMV0uaW5jbHVkZXMoInJlcGVhdGFibGUtbWFyayIpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0YWJsZUlkZW50aWZpZXIgPSBnYXRoZXJlZEJsb2Nrc1tpXS5jbGFzc0xpc3RbY2wxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRhYmxlSWRlbnRpZmllcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2Q2lkRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5wZXJjZW50UG9pbnRlckNsYXNzLnNjTWFyay4iK3JlcGVhdGFibGVJZGVudGlmaWVyKycgZGl2W2RhdGEtY2lkPSInK2RhdGFDaWRJZGVudGlmaWVyKyciXScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2Q2lkRWxlbWVudCA9IGdhdGhlcmVkQmxvY2tDaGlsZC5xdWVyeVNlbGVjdG9yQWxsKCdkaXZbZGF0YS1jaWQ9IicrZGF0YUNpZElkZW50aWZpZXIrJyJdJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IHNjQXJyYXlbc2NpXVsndGV4dCddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGl2Q2lkRWxlbWVudCYmZGl2Q2lkRWxlbWVudC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpMiA9IDA7IGkyIDwgZGl2Q2lkRWxlbWVudC5sZW5ndGg7IGkyKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZGl2Q2lkRWxlbWVudFtpMl0pLmh0bWwodGV4dCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqUXVlcnkoZ2F0aGVyZWRCbG9ja0NoaWxkKS5odG1sKHRleHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaFVwZGF0ZVJiRGlzcGxheXMoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrU3RhdHVzIT0nZmV0Y2hlZCd8fChibG9ja1N0YXR1cz09J2ZldGNoZWQnJiZkYXRhRnVsbD09MSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgc2NBcnJheS5sZW5ndGg7IGkxKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY0Jsb2NrSWQgPT0gc2NBcnJheVtpMV1bJ2Jsb2NrSWQnXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjQXJyYXkuc3BsaWNlKGkxLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMS0tOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdGhlcmVkQmxvY2tzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ3NjTWFyaycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NCbG9ja0lkJiZzY0FkSWQgPCAxJiZbJ25vLWJsb2NrJywnZmV0Y2hlZCddLmluY2x1ZGVzKGJsb2NrU3RhdHVzKSkgew0KICAgICAgICAgICAgICAgICAgICBmb3IgKGkxID0gMDsgaTEgPCBzY0FycmF5Lmxlbmd0aDsgaTErKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjQmxvY2tJZCA9PSBzY0FycmF5W2kxXVsnYmxvY2tJZCddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NBcnJheS5zcGxpY2UoaTEsIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxLS07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZ2F0aGVyZWRCbG9ja3NbaV0uY2xhc3NMaXN0LnJlbW92ZSgnc2NNYXJrJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2UgaWYgKCFzY0FycmF5fHwoc2NBcnJheSYmc2NBcnJheS5sZW5ndGggPCAxKSkgew0KICAgICAgICAgICAgZW5kZWRTYyA9IHRydWU7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBlbmRlZFNjID0gdHJ1ZTsNCiAgICB9DQoNCiAgICBpZiAoIWVuZGVkU2MpIHsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBzaG9ydGNvZGVzSW5zZXJ0KCk7DQogICAgICAgIH0sIDIwMCk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBjbGVhclVuc3VpdGFibGVDYWNoZShjdWNfY291KSB7DQogICAgbGV0IHNjQWRJZCA9IC0xOw0KICAgIGxldCBjY1JlcGVhdCA9IGZhbHNlOw0KDQogICAgbGV0IGdhdGhlcmVkQmxvY2tzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBlcmNlbnRQb2ludGVyQ2xhc3MgLicgKyBibG9ja19jbGFzc2VzLmpvaW4oJywgLnBlcmNlbnRQb2ludGVyQ2xhc3MgLicpKTsNCg0KICAgIGlmIChnYXRoZXJlZEJsb2NrcyYmZ2F0aGVyZWRCbG9ja3MubGVuZ3RoID4gMCkgew0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdhdGhlcmVkQmxvY2tzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoZ2F0aGVyZWRCbG9ja3NbaV1bJ2RhdGFzZXQnXVsnYWlkJ10mJmdhdGhlcmVkQmxvY2tzW2ldWydkYXRhc2V0J11bJ2FpZCddIDwgMCkgew0KICAgICAgICAgICAgICAgIGlmICgoZ2F0aGVyZWRCbG9ja3NbaV1bJ2RhdGFzZXQnXVsic3RhdGUiXT09J25vLWJsb2NrJyl8fChbJ2RvbmUnLCdmZXRjaGVkJywncmVmcmVzaC13YWl0J10uaW5jbHVkZXMoZ2F0aGVyZWRCbG9ja3NbaV1bJ2RhdGFzZXQnXVsic3RhdGUiXSkpKSB7DQogICAgICAgICAgICAgICAgICAgIGdhdGhlcmVkQmxvY2tzW2ldWydpbm5lckhUTUwnXSA9ICcnOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGNjUmVwZWF0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2UgaWYgKCFnYXRoZXJlZEJsb2Nrc1tpXVsnZGF0YXNldCddWydhaWQnXSkgew0KICAgICAgICAgICAgICAgIGNjUmVwZWF0ID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZiAoY3VjX2NvdSA8IDUwKSB7DQogICAgICAgICAgICBpZiAoY2NSZXBlYXQpIHsNCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgY2xlYXJVbnN1aXRhYmxlQ2FjaGUoY3VjX2NvdSsxKTsNCiAgICAgICAgICAgICAgICB9LCAxMDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZW5kZWRDYyA9IHRydWU7DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBlbmRlZENjID0gdHJ1ZTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGJsb2Nrc1JlcG9zaXRpb25Vc2UoY29udGFpbmVyU3RyaW5nLCBibFR5cGUsIHNlYXJjaFR5cGUsIGNvbnRlbnRFbGVtZW50KSB7DQogICAgbGV0IGJsb2Nrc0luQ29udGFpbmVyOw0KICAgIGxldCBibExvY2FsID0gYmxUeXBlOw0KICAgIGxldCBjdXJyZW50QmxvY2s7DQogICAgbGV0IGN1cnJlbnRCbG9ja0lkOw0KICAgIGxldCBjdXJyZW50QmxvY2tQb3NpdGlvbjsNCiAgICBsZXQgY3VycmVudENvbnRhaW5lcjsNCiAgICBsZXQgaSA9IDA7DQogICAgbGV0IGogPSAwOw0KICAgIGxldCBibG9ja1N0ckpzID0gJyAucGVyY2VudFBvaW50ZXJDbGFzcy5tYXJrZWQnOw0KICAgIGxldCBibG9ja1N0clBocCA9ICcgLnBlcmNlbnRQb2ludGVyQ2xhc3M6bm90KC5tYXJrZWQpJzsNCiAgICBsZXQgYmxvY2tTdHIgPSAnIC5wZXJjZW50UG9pbnRlckNsYXNzJzsNCiAgICBsZXQgY2hlY2tQb2ludGVyID0gbnVsbDsNCiAgICBsZXQgYmxvY2tSZXBlYXRFbmQgPSBmYWxzZTsNCg0KICAgIGlmIChzZWFyY2hUeXBlKSB7DQogICAgICAgIGlmIChzZWFyY2hUeXBlID09ICdtYXJrZWQnKSB7DQogICAgICAgICAgICB3aGlsZSAoIWJsb2NrUmVwZWF0RW5kKSB7DQogICAgICAgICAgICAgICAgYmxMb2NhbCA9IGJsTG9jYWwucGFyZW50RWxlbWVudDsNCiAgICAgICAgICAgICAgICBpZiAoYmxMb2NhbCkgew0KICAgICAgICAgICAgICAgICAgICBjaGVja1BvaW50ZXIgPSBibExvY2FsLnF1ZXJ5U2VsZWN0b3IoIiNjb250ZW50X3BvaW50ZXJfaWQiKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja1BvaW50ZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc0luQ29udGFpbmVyID0galF1ZXJ5KGJsTG9jYWwpLnBhcmVudChjb250YWluZXJTdHJpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2Nrc0luQ29udGFpbmVyICYmIGJsb2Nrc0luQ29udGFpbmVyLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja1BvaW50ZXIgPSBibG9ja3NJbkNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjY29udGVudF9wb2ludGVyX2lkIik7ICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQb2ludGVyID0galF1ZXJ5KGJsb2Nrc0luQ29udGFpbmVyKS5maW5kKCIjY29udGVudF9wb2ludGVyX2lkIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrUG9pbnRlciAmJiBjaGVja1BvaW50ZXIubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NJbkNvbnRhaW5lciA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrUmVwZWF0RW5kID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrUmVwZWF0RW5kID0gdHJ1ZQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tSZXBlYXRFbmQgPSB0cnVlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLyogYmxvY2tzSW5Db250YWluZXIgPSBqUXVlcnkoYmxUeXBlKS5wYXJlbnQoY29udGFpbmVyU3RyaW5nKTsgKi8NCiAgICAgICAgICAgIGlmIChibG9ja3NJbkNvbnRhaW5lciYmYmxvY2tzSW5Db250YWluZXIubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIC8qIGJsb2Nrc0luQ29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHJiX3RlbXBFbGVtZW50LCBibG9ja3NJbkNvbnRhaW5lcik7ICovDQogICAgICAgICAgICAgICAgYmxvY2tzSW5Db250YWluZXJbMF0ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocmJfdGVtcEVsZW1lbnQsIGJsb2Nrc0luQ29udGFpbmVyWzBdKTsNCg0KICAgICAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJFeGNDbGFzc0lkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgcmV0dXJuIGJsb2Nrc0luQ29udGFpbmVyWzBdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGJsVHlwZTsNCiAgICAgICAgfSBlbHNlIGlmIChzZWFyY2hUeXBlID09ICdub24tbWFya2VkJykgew0KICAgICAgICAgICAgYmxvY2tzSW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGJsVHlwZSArIGNvbnRhaW5lclN0cmluZyArIGJsb2NrU3RyUGhwKTsNCiAgICAgICAgICAgIGlmIChibG9ja3NJbkNvbnRhaW5lciAmJiBibG9ja3NJbkNvbnRhaW5lci5sZW5ndGggPiAwICYmIHVzZWRCbG9ja1NldHRpbmdBcnJheSAmJiB1c2VkQmxvY2tTZXR0aW5nQXJyYXkubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3NJbkNvbnRhaW5lci5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2sgPSBibG9ja3NJbkNvbnRhaW5lcltpXTsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrSWQgPSBjdXJyZW50QmxvY2sucXVlcnlTZWxlY3RvcignLicgKyBibG9ja19jbGFzc2VzLmpvaW4oJywgLicpKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaWQnKTsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnRhaW5lciA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB1c2VkQmxvY2tTZXR0aW5nQXJyYXkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VkQmxvY2tTZXR0aW5nQXJyYXlbaV1bJ2lkJ10gPT0gY3VycmVudEJsb2NrSWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2tQb3NpdGlvbiA9IHVzZWRCbG9ja1NldHRpbmdBcnJheVtpXVsnZWxlbWVudFBvc2l0aW9uJ107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnRhaW5lciA9IGN1cnJlbnRCbG9jay5jbG9zZXN0KGJsVHlwZSArIGNvbnRhaW5lclN0cmluZyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9ja1Bvc2l0aW9uID09IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjdXJyZW50QmxvY2ssIGN1cnJlbnRDb250YWluZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY3VycmVudEJsb2NrLCBjdXJyZW50Q29udGFpbmVyLm5leHRTaWJsaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVTdHlsZUVsZW1lbnQoYmxvY2tOdW1iZXIsIGxvY2FsRWxlbWVudENzcykgew0KICAgIGxldCBodG1sVG9BZGQgPSAnJzsNCiAgICBsZXQgbWFyZ2luU3RyaW5nOw0KICAgIGxldCB0ZXh0QWxpZ25TdHJpbmc7DQogICAgbGV0IGNvbnRQb2k7DQogICAgbGV0IGVtcHR5VmFsdWVzID0gZmFsc2U7DQogICAgbGV0IGVsZW1lbnRUb0FkZFN0eWxlTG9jYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYmxvY2tzQWxpZ25TdHlsZScpOw0KICAgIGlmICghZWxlbWVudFRvQWRkU3R5bGVMb2NhbCkgew0KICAgICAgICBjb250UG9pID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NvbnRlbnRfcG9pbnRlcl9pZCcpOw0KICAgICAgICBpZiAoIWNvbnRQb2kpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGVsZW1lbnRUb0FkZFN0eWxlTG9jYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOw0KICAgICAgICBlbGVtZW50VG9BZGRTdHlsZUxvY2FsLnNldEF0dHJpYnV0ZSgnaWQnLCAnYmxvY2tzQWxpZ25TdHlsZScpOw0KICAgICAgICBjb250UG9pLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnRUb0FkZFN0eWxlTG9jYWwsIGNvbnRQb2kpOw0KICAgIH0NCg0KICAgIHN3aXRjaCAobG9jYWxFbGVtZW50Q3NzKSB7DQogICAgICAgIGNhc2UgJ2xlZnQnOg0KICAgICAgICAgICAgZW1wdHlWYWx1ZXMgPSBmYWxzZTsNCiAgICAgICAgICAgIG1hcmdpblN0cmluZyA9ICcwIGF1dG8gMCAwJzsNCiAgICAgICAgICAgIHRleHRBbGlnblN0cmluZyA9ICdsZWZ0JzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdyaWdodCc6DQogICAgICAgICAgICBlbXB0eVZhbHVlcyA9IGZhbHNlOw0KICAgICAgICAgICAgbWFyZ2luU3RyaW5nID0gJzAgMCAwIGF1dG8nOw0KICAgICAgICAgICAgdGV4dEFsaWduU3RyaW5nID0gJ3JpZ2h0JzsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBjYXNlICdjZW50ZXInOg0KICAgICAgICAgICAgZW1wdHlWYWx1ZXMgPSBmYWxzZTsNCiAgICAgICAgICAgIG1hcmdpblN0cmluZyA9ICcwIGF1dG8nOw0KICAgICAgICAgICAgdGV4dEFsaWduU3RyaW5nID0gJ2NlbnRlcic7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnZGVmYXVsdCc6DQogICAgICAgICAgICBlbXB0eVZhbHVlcyA9IHRydWU7DQogICAgICAgICAgICBtYXJnaW5TdHJpbmcgPSAnZGVmYXVsdCc7DQogICAgICAgICAgICB0ZXh0QWxpZ25TdHJpbmcgPSAnZGVmYXVsdCc7DQogICAgICAgICAgICAvKiogaGVyZSB3aWxsIGJlIGNzcyAqLw0KICAgICAgICAgICAgYnJlYWs7DQogICAgfQ0KICAgIGlmICghZW1wdHlWYWx1ZXMpIHsNCiAgICAgICAgaHRtbFRvQWRkID0gJy5wZXJjZW50UG9pbnRlckNsYXNzICA+ICpbZGF0YS1pZD0iJytibG9ja051bWJlcisnIl0ge1xuJyArDQogICAgICAgICAgICAnICAgIG1hcmdpbjogJyttYXJnaW5TdHJpbmcrJztcbicgKw0KICAgICAgICAgICAgJ31cbic7DQogICAgfQ0KDQogICAgZWxlbWVudFRvQWRkU3R5bGVMb2NhbC5pbm5lckhUTUwgKz0gaHRtbFRvQWRkOw0KICAgIHJldHVybiB0ZXh0QWxpZ25TdHJpbmc7DQp9DQoNCmZ1bmN0aW9uIGluaXRUYXJnZXRUb0luc2VydChwb3NpdGlvbiwgdHlwZSwgY3VycmVudEVsZW1lbnQpIHsNCiAgICBsZXQgcG9zQ3VycmVudEVsZW1lbnQ7DQogICAgbGV0IHVzZWRFbGVtZW50Ow0KICAgIGlmICh0eXBlID09ICdlbGVtZW50Jykgew0KICAgICAgICBpZiAocG9zaXRpb24gPT0gMCkgew0KICAgICAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsNCiAgICAgICAgICAgIGlmICghKHR5cGVvZiBvYmxpZ2F0b3J5TWFyZ2luIT09J3VuZGVmaW5lZCcmJm9ibGlnYXRvcnlNYXJnaW49PT0xKSkgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Jmd3BfcmVtb3ZlZE1hcmdpblRvcCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5uZXh0U2libGluZzsNCiAgICAgICAgICAgIGlmICghKHR5cGVvZiBvYmxpZ2F0b3J5TWFyZ2luIT09J3VuZGVmaW5lZCcmJm9ibGlnYXRvcnlNYXJnaW49PT0xKSkgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Jmd3BfcmVtb3ZlZE1hcmdpbkJvdHRvbScpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGN1cnJlbnRFbGVtZW50LnN0eWxlLmNsZWFyID0gJ2JvdGgnOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHVzZWRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQ7DQogICAgICAgIGlmIChwb3NpdGlvbiA9PSAwKSB7DQogICAgICAgICAgICBwb3NDdXJyZW50RWxlbWVudCA9IHVzZWRFbGVtZW50Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSB1c2VkRWxlbWVudC5uZXh0U2libGluZzsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gcG9zQ3VycmVudEVsZW1lbnQ7DQp9DQoNCmZ1bmN0aW9uIGNoZWNrQWRzV2lkdGgoY29udGVudF9wb2ludGVyLCBwb3NDdXJyZW50RWxlbWVudCwgY3VycmVudEVsZW1lbnQpIHsNCiAgICBsZXQgd2lkdGhDaGVja2VyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3dpZHRoQ2hlY2tlcicpOw0KICAgIGxldCB3aWR0aENoZWNrZXJTdHlsZSA9IG51bGw7DQogICAgbGV0IGNvbnRlbnRfcG9pbnRlclN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjb250ZW50X3BvaW50ZXIpOw0KICAgIC8qIGxldCBnZXRQb3NpdGlvbkZvclRlbXBFbGVtZW50ID0gbnVsbDsNCiAgICBsZXQgdGVzdEltZ0RldGVjdGVkID0gZmFsc2U7DQogICAgbGV0IHRlc3RJbWc7DQogICAgbGV0IHRlc3RJbWFnZUNvbXBXaWR0aDsNCiAgICBsZXQgdGVzdEltZ0NvdSA9IDANCiAgICBsZXQgZmlndXJlQ2hpbGRzOw0KICAgIGxldCBmaWd1cmVDb21XaWR0aDsNCiAgICBsZXQgZmNDb3UgPSAwOyAqLw0KICAgIGxldCBjb250ZW50ID0gY29udGVudF9wb2ludGVyLnBhcmVudEVsZW1lbnQ7DQoNCiAgICBpZiAoIXdpZHRoQ2hlY2tlcikgew0KICAgICAgICB3aWR0aENoZWNrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgICAgd2lkdGhDaGVja2VyLnNldEF0dHJpYnV0ZSgnaWQnLCd3aWR0aENoZWNrZXInKTsNCiAgICAgICAgd2lkdGhDaGVja2VyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7DQogICAgfQ0KDQogICAgaWYgKGNvbnRlbnQpIHsNCiAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSBpbml0VGFyZ2V0VG9JbnNlcnQocG9zQ3VycmVudEVsZW1lbnQsICd0ZXJtJywgY3VycmVudEVsZW1lbnQpOw0KICAgICAgICBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh3aWR0aENoZWNrZXIsIHBvc0N1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgd2lkdGhDaGVja2VyU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHdpZHRoQ2hlY2tlcik7DQogICAgICAgIC8qIHRlc3RJbWcgPSBjdXJyZW50RWxlbWVudC5wcmV2aW91c1NpYmxpbmc7DQogICAgICAgIGlmICh0ZXN0SW1nKSB7DQogICAgICAgICAgICB3aGlsZSAoIXRlc3RJbWdEZXRlY3RlZCYmdGVzdEltZ0NvdTw0KSB7DQogICAgICAgICAgICAgICAgaWYgKHRlc3RJbWcmJnRlc3RJbWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZpZ3VyZScpIHsNCiAgICAgICAgICAgICAgICAgICAgZmlndXJlQ29tV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHRlc3RJbWcpOw0KICAgICAgICAgICAgICAgICAgICBmaWd1cmVDb21XaWR0aCA9IHBhcnNlSW50KGZpZ3VyZUNvbVdpZHRoLndpZHRoKTsNCiAgICAgICAgICAgICAgICAgICAgZmlndXJlQ2hpbGRzID0gdGVzdEltZy5jaGlsZE5vZGVzOw0KICAgICAgICAgICAgICAgICAgICBpZiAoZmlndXJlQ2hpbGRzJiZmaWd1cmVDaGlsZHMubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCF0ZXN0SW1nRGV0ZWN0ZWQmJmZpZ3VyZUNoaWxkc1tmY0NvdV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlndXJlQ2hpbGRzW2ZjQ291XSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEltZ0RldGVjdGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEltYWdlQ29tcFdpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZShmaWd1cmVDaGlsZHNbZmNDb3VdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEltYWdlQ29tcFdpZHRoID0gcGFyc2VJbnQodGVzdEltYWdlQ29tcFdpZHRoLndpZHRoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2ltZ19mX3c6JytmaWd1cmVDb21XaWR0aCsnOyBpbWdfdzonK3Rlc3RJbWFnZUNvbXBXaWR0aCsnOycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY0NvdSsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICh0ZXN0SW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICB0ZXN0SW1nRGV0ZWN0ZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB0ZXN0SW1hZ2VDb21wV2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHRlc3RJbWcpOw0KICAgICAgICAgICAgICAgICAgICB0ZXN0SW1hZ2VDb21wV2lkdGggPSBwYXJzZUludCh0ZXN0SW1hZ2VDb21wV2lkdGgud2lkdGgpOw0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnaW1nX3c6Jyt0ZXN0SW1hZ2VDb21wV2lkdGgrJzsnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKCF0ZXN0SW1nLnByZXZpb3VzU2libGluZykgew0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGVzdEltZyA9IHRlc3RJbWcucHJldmlvdXNTaWJsaW5nOw0KICAgICAgICAgICAgICAgIHRlc3RJbWdDb3UrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBjb25zb2xlLmxvZygnY3BfdzonK3BhcnNlSW50KGNvbnRlbnRfcG9pbnRlclN0eWxlLndpZHRoKSsnOyB3Y193OicrcGFyc2VJbnQod2lkdGhDaGVja2VyU3R5bGUud2lkdGgpKyc7Jyk7ICovDQogICAgICAgIGlmIChwYXJzZUludCh3aWR0aENoZWNrZXJTdHlsZS53aWR0aCkgPj0gKHBhcnNlSW50KGNvbnRlbnRfcG9pbnRlclN0eWxlLndpZHRoKSAtIDUwKSkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICB9DQogICAgY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocmJfdGVtcEVsZW1lbnQsIGN1cnJlbnRFbGVtZW50Lm5leHRTaWJsaW5nKTsNCiAgICByYl90ZW1wRWxlbWVudF9jaGVjayA9IHRydWU7DQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQovKiBmdW5jdGlvbiBjdXJyZW50RWxlbWVudFJlY2VpdmVyKHJldmVydCwgY3VyU3VtLCBlbExpc3QsIGN1cnJlbnRFbGVtZW50KSB7DQogICAgbGV0IG9yaWdDdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50Ow0KICAgIGxldCBjb250ZW50X3BvaW50ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjY29udGVudF9wb2ludGVyX2lkIik7DQogICAgbGV0IHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCA9IGZhbHNlOw0KICAgIGxldCB0ZXN0Q291ID0gMDsNCiAgICB3aGlsZSAoZWxMaXN0W2N1clN1bV0mJnNhbWVFbGVtZW50QWZ0ZXJXaWR0aD09ZmFsc2UmJnRlc3RDb3UgPCA1KSB7DQogICAgICAgIGN1cnJlbnRFbGVtZW50ID0gZWxMaXN0W2N1clN1bV07DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBzYW1lRWxlbWVudEFmdGVyV2lkdGg9dHJ1ZTsNCiAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCA9IGNoZWNrQWRzV2lkdGgoY29udGVudF9wb2ludGVyLCAwLCBjdXJyZW50RWxlbWVudCk7DQogICAgICAgIH0gY2F0Y2ggKGV4KSB7DQogICAgICAgICAgICBjb25zb2xlLmxvZyhleC5tZXNzYWdlKTsNCiAgICAgICAgfQ0KICAgICAgICByZXZlcnQ/IGN1clN1bS0tOiBjdXJTdW0rKzsNCiAgICAgICAgdGVzdENvdSsrOw0KICAgIH0NCiAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ/Y3VycmVudEVsZW1lbnQ6b3JpZ0N1cnJlbnRFbGVtZW50Ow0KfSAqLw0KDQpmdW5jdGlvbiBjdXJyZW50RWxlbWVudFJlY2VpdmVyU3BlYyhyZXZlcnQsIGN1clN1bSwgZWxMaXN0LCBjdXJyZW50RWxlbWVudCkgew0KICAgIGxldCBvcmlnQ3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsNCiAgICBsZXQgY29udGVudF9wb2ludGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2NvbnRlbnRfcG9pbnRlcl9pZCIpOyAvKiBvcmlnICovDQogICAgbGV0IHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCA9IGZhbHNlOw0KICAgIGxldCB0ZXN0Q291ID0gMDsNCiAgICB3aGlsZSAoZWxMaXN0W2N1clN1bV0mJnNhbWVFbGVtZW50QWZ0ZXJXaWR0aD09ZmFsc2UmJnRlc3RDb3UgPCA1KSB7DQogICAgICAgIGN1cnJlbnRFbGVtZW50ID0gZWxMaXN0W2N1clN1bV1bJ2VsZW1lbnQnXTsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJXaWR0aD10cnVlOw0KICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlcldpZHRoID0gY2hlY2tBZHNXaWR0aChjb250ZW50X3BvaW50ZXIsIDAsIGN1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgfSBjYXRjaCAoZXgpIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4Lm1lc3NhZ2UpOw0KICAgICAgICB9DQogICAgICAgIHJldmVydD8gY3VyU3VtLS06IGN1clN1bSsrOw0KICAgICAgICB0ZXN0Q291Kys7DQogICAgfQ0KICAgIHJldHVybiBjdXJyZW50RWxlbWVudD9jdXJyZW50RWxlbWVudDpvcmlnQ3VycmVudEVsZW1lbnQ7DQp9DQoNCmZ1bmN0aW9uIGV4Y0lkQ2xVbnBhY2tlcigpIHsNCiAgICBsZXQgZXhjQXJyID0gW10sDQogICAgICAgIGNvdSA9IDAsDQogICAgICAgIGN1cnJFeGNTdHIgPSAnJywNCiAgICAgICAgY3VyRXhjRmlyc3QgPSAnJzsNCiAgICBleGNBcnJbJ2lkJ10gPSBbXTsNCiAgICBleGNBcnJbJ2NsYXNzJ10gPSBbXTsNCiAgICBleGNBcnJbJ3RhZyddID0gW107DQogICAgaWYgKGV4Y0lkQ2xhc3MmJmV4Y0lkQ2xhc3MubGVuZ3RoID4gMCkgew0KICAgICAgICB3aGlsZSAoZXhjSWRDbGFzc1tjb3VdKSB7DQogICAgICAgICAgICBjdXJyRXhjU3RyID0gZXhjSWRDbGFzc1tjb3VdOw0KICAgICAgICAgICAgaWYgKGN1cnJFeGNTdHIubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGN1ckV4Y0ZpcnN0ID0gY3VyckV4Y1N0ci5zdWJzdHJpbmcoMCwxKTsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1ckV4Y0ZpcnN0KSB7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgJyMnOg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJFeGNTdHIubGVuZ3RoID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJFeGNTdHIgPSBjdXJyRXhjU3RyLnN1YnN0cmluZygxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNBcnJbJ2lkJ10ucHVzaChjdXJyRXhjU3RyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICcuJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyRXhjU3RyLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyRXhjU3RyID0gY3VyckV4Y1N0ci5zdWJzdHJpbmcoMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjQXJyWydjbGFzcyddLnB1c2goY3VyckV4Y1N0cik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y0FyclsndGFnJ10ucHVzaChjdXJyRXhjU3RyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjb3UrKzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZXhjQXJyOw0KfQ0KDQpmdW5jdGlvbiBhc3luY0Jsb2Nrc0luc2VydGluZ0Z1bmN0aW9uKGJsb2NrU2V0dGluZ0FycmF5KSB7DQogICAgdHJ5IHsNCiAgICAgICAgdmFyIGNvbnRlbnRfcG9pbnRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNjb250ZW50X3BvaW50ZXJfaWQiKTsgLyogb3JpZyAqLw0KICAgICAgICB2YXIgcGFyZW50X3dpdGhfY29udGVudCA9IGNvbnRlbnRfcG9pbnRlci5wYXJlbnRFbGVtZW50Ow0KICAgICAgICB2YXIgbG9yZE9mRWxlbWVudHMgPSBwYXJlbnRfd2l0aF9jb250ZW50Ow0KICAgICAgICBwYXJlbnRfd2l0aF9jb250ZW50ID0gcGFyZW50X3dpdGhfY29udGVudC5wYXJlbnRFbGVtZW50Ow0KICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICB2YXIgZWxlbWVudFRvQWRkOw0KICAgICAgICB2YXIgZWxlbWVudFRvQWRkU3R5bGU7DQogICAgICAgIHZhciBwb29sYmFja0kgPSAwOw0KICAgICAgICB2YXIgY291bnRlciA9IDA7DQogICAgICAgIHZhciBjdXJyZW50RWxlbWVudDsNCiAgICAgICAgdmFyIHJlcGVhdGFibGVDdXJyZW50RWxlbWVudDsNCiAgICAgICAgdmFyIHJlcGVhdGFibGVTdWNjZXNzOw0KICAgICAgICB2YXIgcmVDb3U7DQogICAgICAgIHZhciBjdXJGaXJzdFBsYWNlOw0KICAgICAgICB2YXIgY3VyRWxlbWVudENvdW50Ow0KICAgICAgICB2YXIgY3VyRWxlbWVudFN0ZXA7DQogICAgICAgIHZhciBiYWNrRWxlbWVudCA9IDA7DQogICAgICAgIHZhciBzdW1SZXN1bHQgPSAwOw0KICAgICAgICB2YXIgY3VyU3VtUmVzdWx0ID0gMDsNCiAgICAgICAgdmFyIHJlcGVhdCA9IGZhbHNlOw0KICAgICAgICB2YXIgY3VycmVudEVsZW1lbnRDaGVja2VyID0gZmFsc2U7DQogICAgICAgIGxldCBjb250YWluZXJGb3I2dGggPSBbXTsNCiAgICAgICAgbGV0IGNvbnRhaW5lckZvcjd0aCA9IFtdOw0KICAgICAgICB2YXIgcG9zQ3VycmVudEVsZW1lbnQ7DQogICAgICAgIHZhciBibG9ja19udW1iZXI7DQogICAgICAgIGxldCBjb250ZW50TGVuZ3RoID0gY29udGVudF9wb2ludGVyLmdldEF0dHJpYnV0ZSgnZGF0YS1jb250ZW50LWxlbmd0aCcpOw0KICAgICAgICBsZXQgcmVqZWN0ZWRCbG9ja3MgPSBjb250ZW50X3BvaW50ZXIuZ2V0QXR0cmlidXRlKCdkYXRhLXJlamVjdGVkLWJsb2NrcycpOw0KICAgICAgICBpZiAocmVqZWN0ZWRCbG9ja3MmJnJlamVjdGVkQmxvY2tzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIHJlamVjdGVkQmxvY2tzID0gcmVqZWN0ZWRCbG9ja3Muc3BsaXQoJywnKTsNCiAgICAgICAgfQ0KICAgICAgICBsZXQgd2lkdGhDaGVjayA9IGZhbHNlOw0KICAgICAgICBsZXQgY3VycmVudEVsZW1lbnRMaXN0Ow0KICAgICAgICB2YXIgdGVzdEVsZW1lbnQxID0gbnVsbDsNCiAgICAgICAgdmFyIHRlcm1vcmFyaXR5X3BhcmVudF93aXRoX2NvbnRlbnQgPSBwYXJlbnRfd2l0aF9jb250ZW50Ow0KICAgICAgICB2YXIgdGVybW9yYXJpdHlfcGFyZW50X3dpdGhfY29udGVudF9sZW5ndGggPSAwOw0KICAgICAgICB2YXIgaGVhZGVyc0xpc3QgPSBbJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2J107DQogICAgICAgIGZvciAodmFyIGhjMSA9IDA7IGhjMSA8IGhlYWRlcnNMaXN0Lmxlbmd0aDsgaGMxKyspIHsNCiAgICAgICAgICAgIHRlcm1vcmFyaXR5X3BhcmVudF93aXRoX2NvbnRlbnRfbGVuZ3RoICs9IHRlcm1vcmFyaXR5X3BhcmVudF93aXRoX2NvbnRlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaGVhZGVyc0xpc3RbaGMxXSkubGVuZ3RoOw0KICAgICAgICB9DQoNCiAgICAgICAgbGV0IGRldGFpbGVkRWxlbWVudExpc3Q7DQogICAgICAgIGxldCBFeGNTdHJDb3UgPSAxOw0KICAgICAgICBsZXQgZGV0YWlsZWRRdWVyeVN0cmluZzsNCiAgICAgICAgbGV0IHVzZWRFbGVtZW50Ow0KICAgICAgICBsZXQgdGFnTGlzdCA9IFtdOw0KICAgICAgICBsZXQgbG9jYWxTdW1SZXN1bHQ7DQogICAgICAgIGxldCBiaW5kZXJOYW1lOw0KDQogICAgICAgIHZhciByZW1vdmVDbGVhcmluZzsNCiAgICAgICAgdmFyIHJlcGVhdGFibGVCbG9ja0lkZW50aWZpZXIgPSAwOw0KDQogICAgICAgIHZhciBpOw0KDQogICAgICAgIGlmIChjb250ZW50TGVuZ3RoIDwgMSkgew0KICAgICAgICAgICAgY29udGVudExlbmd0aCA9IHBhcmVudF93aXRoX2NvbnRlbnQuaW5uZXJUZXh0Lmxlbmd0aA0KICAgICAgICB9DQoNCiAgICAgICAgcmJfdGVtcEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcmJfdGVtcEVsZW1lbnQnKTsNCiAgICAgICAgaWYgKCFyYl90ZW1wRWxlbWVudCkgew0KICAgICAgICAgICAgcmJfdGVtcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7DQogICAgICAgICAgICByYl90ZW1wRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3JiX3RlbXBFbGVtZW50Jyk7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBnZXRGcm9tQ29uc3RydWN0aW9ucyhjdXJyZW50RWxlbWVudCkgew0KICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICJibG9ja3F1b3RlIikgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDsNCiAgICAgICAgICAgICAgICAvKiBpbml0VGFyZ2V0VG9JbnNlcnQoYmxvY2tTZXR0aW5nQXJyYXksICdlbGVtZW50JywgY3VycmVudEVsZW1lbnQpOyAqLw0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHJiX3RlbXBFbGVtZW50LCBjdXJyZW50RWxlbWVudCk7DQogICAgICAgICAgICAgICAgcmJfdGVtcEVsZW1lbnRfY2hlY2sgPSB0cnVlOw0KICAgICAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJGcm9tQ29uc3RydWN0aW9uPWZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChbInRyIiwidGQiLCJ0aCIsInRoZWFkIiwidGJvZHkiLCJ0YWJsZSJdLmluY2x1ZGVzKGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSkgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDsNCiAgICAgICAgICAgICAgICB3aGlsZSAoWyJ0ciIsInRkIiwidGgiLCJ0aGVhZCIsInRib2R5IiwidGFibGUiXS5pbmNsdWRlcyhjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyYl90ZW1wRWxlbWVudCwgY3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgIHJiX3RlbXBFbGVtZW50X2NoZWNrID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBzYW1lRWxlbWVudEFmdGVyRnJvbUNvbnN0cnVjdGlvbj1mYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGRpcmVjdENsYXNzRWxlbWVudERldGVjdGluZyhibG9ja1NldHRpbmdBcnJheSwgZGlyZWN0RWxlbWVudCkgew0KICAgICAgICAgICAgbGV0IGZpbmRRdWVyeSA9IDA7DQogICAgICAgICAgICBsZXQgZGlyZWN0Q2xhc3NFbGVtZW50UmVzdWx0ID0gW107DQoNCiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChkaXJlY3RFbGVtZW50KTsNCiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWydlbGVtZW50UGxhY2UnXSA+IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lmxlbmd0aCA+PSBibG9ja1NldHRpbmdBcnJheVtpXVsnZWxlbWVudFBsYWNlJ10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnRbYmxvY2tTZXR0aW5nQXJyYXlbaV1bJ2VsZW1lbnRQbGFjZSddLTFdOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRFbGVtZW50Lmxlbmd0aCA8IGJsb2NrU2V0dGluZ0FycmF5W2ldWydlbGVtZW50UGxhY2UnXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudFtjdXJyZW50RWxlbWVudC5sZW5ndGggLSAxXTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRRdWVyeSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWydlbGVtZW50UGxhY2UnXSA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50RWxlbWVudC5sZW5ndGggKyBibG9ja1NldHRpbmdBcnJheVtpXVsnZWxlbWVudFBsYWNlJ10gKyAxKSA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnRbY3VycmVudEVsZW1lbnQubGVuZ3RoICsgYmxvY2tTZXR0aW5nQXJyYXlbaV1bJ2VsZW1lbnRQbGFjZSddXTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRRdWVyeSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBmaW5kUXVlcnkgPSAxOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZmluZFF1ZXJ5ID0gMTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZGlyZWN0Q2xhc3NFbGVtZW50UmVzdWx0WydmaW5kUXVlcnknXSA9IGZpbmRRdWVyeTsNCiAgICAgICAgICAgIGRpcmVjdENsYXNzRWxlbWVudFJlc3VsdFsnY3VycmVudEVsZW1lbnQnXSA9IGN1cnJlbnRFbGVtZW50Ow0KDQogICAgICAgICAgICByZXR1cm4gZGlyZWN0Q2xhc3NFbGVtZW50UmVzdWx0Ow0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gcGxhY2luZ1RvSDEodXNlZEVsZW1lbnQsIGVsZW1lbnRUYWdUb0ZpbmQpIHsNCiAgICAgICAgICAgIGxldCB1c2VsZXNzTGV0Ow0KICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSB1c2VkRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGVsZW1lbnRUYWdUb0ZpbmQpOw0KDQogICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQubGVuZ3RoIDwgMSkgew0KICAgICAgICAgICAgICAgIGlmICh1c2VkRWxlbWVudC5wYXJlbnRFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgIHVzZWxlc3NMZXQgPSBwbGFjaW5nVG9IMSh1c2VkRWxlbWVudC5wYXJlbnRFbGVtZW50LCBlbGVtZW50VGFnVG9GaW5kKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBlbGVtZW50c0NsZWFuaW5nKGV4Y0FyciwgZWxMaXN0LCBwd2NMb2NhbCwgZ2F0aGVyU3RyaW5nKSB7DQogICAgICAgICAgICBsZXQgbWFya2VkQ2xhc3MgPSAncmJfbV9pbmMnOw0KICAgICAgICAgICAgbGV0IG1hcmtlZENsYXNzQmFkID0gJ3JiX21fZXhjJzsNCiAgICAgICAgICAgIGxldCBjb3UgPSAwOw0KICAgICAgICAgICAgbGV0IGNvdTEgPSAwOw0KICAgICAgICAgICAgbGV0IGZpbmFsQXJyID0gW107DQogICAgICAgICAgICBsZXQgZmluYWxBcnJDbGVhciA9IFtdOw0KICAgICAgICAgICAgbGV0IGNoZWNrTmVhcmVzdDsNCiAgICAgICAgICAgIGxldCBvdXRPZlJhbmdlQ2hlY2s7DQogICAgICAgICAgICBsZXQgZ2F0aGVyUmVqZWN0ZWQ7DQogICAgICAgICAgICBsZXQgYWxsb3dlcjsNCg0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICB3aGlsZSAoZWxMaXN0W2NvdV0pIHsNCiAgICAgICAgICAgICAgICAgICAgYWxsb3dlciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGlmICghZWxMaXN0W2NvdV0uY2xhc3NMaXN0LmNvbnRhaW5zKG1hcmtlZENsYXNzQmFkKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y0FyciYmZXhjQXJyLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3UxID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZXhjQXJyW2NvdTFdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTmVhcmVzdCA9IGVsTGlzdFtjb3VdLnBhcmVudEVsZW1lbnQuY2xvc2VzdChleGNBcnJbY291MV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tOZWFyZXN0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja05lYXJlc3QuY2xhc3NMaXN0LmFkZCgnY3VyckNsb3Nlc3QnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mUmFuZ2VDaGVjayA9IHB3Y0xvY2FsLnF1ZXJ5U2VsZWN0b3IoJy5jdXJyQ2xvc2VzdCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dE9mUmFuZ2VDaGVjaykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZXIgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja05lYXJlc3QuY2xhc3NMaXN0LmFkZChtYXJrZWRDbGFzcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F0aGVyUmVqZWN0ZWQgPSBjaGVja05lYXJlc3QucXVlcnlTZWxlY3RvckFsbChnYXRoZXJTdHJpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYXRoZXJSZWplY3RlZC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkxID0gMDsgaTEgPCBnYXRoZXJSZWplY3RlZC5sZW5ndGg7IGkxKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdGhlclJlamVjdGVkW2kxXS5jbGFzc0xpc3QuYWRkKG1hcmtlZENsYXNzQmFkKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTmVhcmVzdC5jbGFzc0xpc3QucmVtb3ZlKCdjdXJyQ2xvc2VzdCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdTErKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlcj09PXRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbExpc3RbY291XS5jbGFzc0xpc3QuYWRkKG1hcmtlZENsYXNzKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaW5hbEFyci5wdXNoKGVsTGlzdFtjb3VdKTsgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb3UrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZmluYWxBcnIgPSBwd2NMb2NhbC5xdWVyeVNlbGVjdG9yQWxsKCcuJyttYXJrZWRDbGFzcysnOm5vdCgnK21hcmtlZENsYXNzQmFkKycpJyk7DQogICAgICAgICAgICAgICAgZmluYWxBcnJDbGVhciA9IHB3Y0xvY2FsLnF1ZXJ5U2VsZWN0b3JBbGwoJy4nK21hcmtlZENsYXNzKycsLicrbWFya2VkQ2xhc3NCYWQpOw0KICAgICAgICAgICAgICAgIGlmIChmaW5hbEFyckNsZWFyJiZmaW5hbEFyckNsZWFyLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IGZpbmFsQXJyQ2xlYXIubGVuZ3RoOyBpMSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmaW5hbEFyckNsZWFyW2kxXS5jbGFzc0xpc3QucmVtb3ZlKG1hcmtlZENsYXNzLG1hcmtlZENsYXNzQmFkKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gY2F0Y2ggKGVyKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXIubWVzc2FnZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmluYWxBcnI7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBjdXJlZW50RWxlbWVudHNHYXRoZXIodXNlZEVsZW1lbnQsIGxvb3BMaW1pdCA9IDIsIGxvY2FsUHdjID0gcGFyZW50X3dpdGhfY29udGVudCkgew0KICAgICAgICAgICAgbGV0IGN1ckVsZW1lbnRTZWFyY2hSZXBlYXRlciA9IHRydWU7DQogICAgICAgICAgICBsZXQgY3VyRWxlbWVudFNlYXJjaENvdW50ZXIgPSAwOw0KICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50TG9jID0gbnVsbDsNCiAgICAgICAgICAgIGxldCBFeGNsdWRlZFN0cmluZ0JlZ2luID0gJyc7DQogICAgICAgICAgICBsZXQgRXhjbHVkZWRTdHJpbmcgPSAnJzsNCiAgICAgICAgICAgIGxldCBFeGNsdWRlZFN0cmluZ0VuZCA9ICcnOw0KICAgICAgICAgICAgbGV0IHRhZ0xpc3RTdHJpbmcgPSAnJzsNCiAgICAgICAgICAgIGxldCB0YWdMaXN0U3RyaW5nRXhjID0gJyc7DQogICAgICAgICAgICBsZXQgY291ID0gMDsNCiAgICAgICAgICAgIC8qIGxldCBleGNBcnIgPSBleGNJZENsVW5wYWNrZXIoKTsgKi8NCiAgICAgICAgICAgIGxldCB0YWdMaXN0Q291ID0gMDsNCg0KICAgICAgICAgICAgaWYgKHVzZWRFbGVtZW50PT0naDEnKSB7DQogICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRMb2MgPSBwbGFjaW5nVG9IMShsb2NhbFB3YywgdXNlZEVsZW1lbnQpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBpZiAodXNlZEVsZW1lbnQ9PSdoMi00Jykge3RhZ0xpc3QgPSBbJ2gyJywnaDMnLCdoMyddO30NCiAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAge3RhZ0xpc3QgPSBbdXNlZEVsZW1lbnRdOyAgIH0NCiAgICAgICAgICAgICAgICB3aGlsZSAodGFnTGlzdFt0YWdMaXN0Q291XSkgew0KICAgICAgICAgICAgICAgICAgICB0YWdMaXN0U3RyaW5nICs9ICgoY291Kys+MCk/JywnOicnKSt0YWdMaXN0W3RhZ0xpc3RDb3VdOw0KICAgICAgICAgICAgICAgICAgICB0YWdMaXN0U3RyaW5nRXhjICs9ICc6bm90KCcrdGFnTGlzdFt0YWdMaXN0Q291XSsnKSc7DQogICAgICAgICAgICAgICAgICAgIHRhZ0xpc3RDb3UrKzsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBFeGNsdWRlZFN0cmluZyA9ICcnOw0KICAgICAgICAgICAgICAgIGlmIChleGNJZENsYXNzJiZleGNJZENsYXNzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IGV4Y0lkQ2xhc3MubGVuZ3RoOyBpMisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhjSWRDbGFzc1tpMl0ubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGVkU3RyaW5nICs9IChpMj4wPycsJzonJykrZXhjSWRDbGFzc1tpMl0rdGFnTGlzdFN0cmluZ0V4YzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBkZXRhaWxlZFF1ZXJ5U3RyaW5nICs9IHRhZ0xpc3RTdHJpbmcrJywnK0V4Y2x1ZGVkU3RyaW5nOw0KDQogICAgICAgICAgICAgICAgLyogY29uc29sZS5sb2coZGV0YWlsZWRRdWVyeVN0cmluZyk7ICovDQogICAgICAgICAgICAgICAgd2hpbGUgKGN1ckVsZW1lbnRTZWFyY2hSZXBlYXRlciYmY3VyRWxlbWVudFNlYXJjaENvdW50ZXIgPCBsb29wTGltaXQpIHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50TG9jID0gbG9jYWxQd2MucXVlcnlTZWxlY3RvckFsbCh0YWdMaXN0U3RyaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZTEpIHtjb25zb2xlLmxvZyhlMS5tZXNzYWdlKTt9DQogICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudEVsZW1lbnRMb2MpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFB3Yy5wYXJlbnRFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxQd2MgPSBsb2NhbFB3Yy5wYXJlbnRFbGVtZW50Ow0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50TG9jID0gZWxlbWVudHNDbGVhbmluZyhleGNJZENsYXNzLCBjdXJyZW50RWxlbWVudExvYywgbG9jYWxQd2MsIGRldGFpbGVkUXVlcnlTdHJpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VyRWxlbWVudFNlYXJjaFJlcGVhdGVyID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY3VyRWxlbWVudFNlYXJjaENvdW50ZXIrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnRMb2M7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBjdXJyZW50RWxlbWVudFJlY2VpdmVyKHJldmVydCwgbG9jYWxDdXJFbCA9IGN1cnJlbnRFbGVtZW50KSB7DQogICAgICAgICAgICBsZXQgb3JpZ0N1ckVsID0gbG9jYWxDdXJFbDsNCiAgICAgICAgICAgIGN1clN1bVJlc3VsdCA9IHN1bVJlc3VsdDsNCiAgICAgICAgICAgIGRldGFpbGVkRWxlbWVudExpc3QgPSBsb2NhbEN1ckVsOw0KICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlcldpZHRoID0gZmFsc2U7DQogICAgICAgICAgICBsZXQgdGVzdENvdSA9IDA7DQogICAgICAgICAgICB3aGlsZSAoZGV0YWlsZWRFbGVtZW50TGlzdFtjdXJTdW1SZXN1bHRdJiZzYW1lRWxlbWVudEFmdGVyV2lkdGg9PWZhbHNlJiZ0ZXN0Q291IDwgOCkgew0KICAgICAgICAgICAgICAgIGxvY2FsQ3VyRWwgPSBkZXRhaWxlZEVsZW1lbnRMaXN0W2N1clN1bVJlc3VsdF07DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlcldpZHRoPXRydWU7DQogICAgICAgICAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCA9IGNoZWNrQWRzV2lkdGgoY29udGVudF9wb2ludGVyLCBibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFBvc2l0aW9uIl0sIGxvY2FsQ3VyRWwpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGV4Lm1lc3NhZ2UpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXZlcnQ/IGN1clN1bVJlc3VsdC0tOiBjdXJTdW1SZXN1bHQrKzsNCiAgICAgICAgICAgICAgICB0ZXN0Q291Kys7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobG9jYWxDdXJFbCkgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Q2hlY2tlciA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbG9jYWxDdXJFbD9sb2NhbEN1ckVsOm9yaWdDdXJFbDsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgZnVuY3Rpb24gZW5kaW5nQWN0aW9ucyhibG9ja19udW1iZXIpIHsNCiAgICAgICAgICAgIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5wdXNoKGJsb2NrX251bWJlcik7DQogICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgIHBvb2xiYWNrSSA9IDE7DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tTZXR0aW5nQXJyYXkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gbnVsbDsNCiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Q2hlY2tlciA9IGZhbHNlOw0KICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlcldpZHRoID0gZmFsc2U7DQogICAgICAgICAgICBzYW1lRWxlbWVudEFmdGVyRXhjQ2xhc3NJZCA9IGZhbHNlOw0KICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlckZyb21Db25zdHJ1Y3Rpb24gPSBmYWxzZTsNCiAgICAgICAgICAgIHRhZ0xpc3RDb3UgPSAwOw0KICAgICAgICAgICAgcG9vbGJhY2tJID0gMDsNCiAgICAgICAgICAgIGRldGFpbGVkUXVlcnlTdHJpbmcgPSAnJzsNCiAgICAgICAgICAgIGJpbmRlck5hbWUgPSBlbGVtZW50QmluZGVyTmFtZUdlbmVyYXRvcigpOw0KDQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGlmICghYmxvY2tTZXR0aW5nQXJyYXlbaV1bInRleHQiXQ0KICAgICAgICAgICAgICAgICAgICB8fChibG9ja1NldHRpbmdBcnJheVtpXVsidGV4dCJdJiZibG9ja1NldHRpbmdBcnJheVtpXVsidGV4dCJdLmxlbmd0aCA8IDEpDQogICAgICAgICAgICAgICAgICAgIHx8KHJlamVjdGVkQmxvY2tzJiZyZWplY3RlZEJsb2Nrcy5pbmNsdWRlcyhibG9ja1NldHRpbmdBcnJheVtpXVsiaWQiXSkpDQogICAgICAgICAgICAgICAgICAgIHx8KChibG9ja1NldHRpbmdBcnJheVtpXVsibWF4SGVhZGVycyJdID4gMCkmJihibG9ja1NldHRpbmdBcnJheVtpXVsibWF4SGVhZGVycyJdIDwgcGFyc2VJbnQodGVybW9yYXJpdHlfcGFyZW50X3dpdGhfY29udGVudF9sZW5ndGgpKSkNCiAgICAgICAgICAgICAgICAgICAgfHwoKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJtYXhTeW1ib2xzIl0gPiAwKSYmKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJtYXhTeW1ib2xzIl0gPCBwYXJzZUludChjb250ZW50TGVuZ3RoKSkpDQogICAgICAgICAgICAgICAgICAgIHx8KGNvbnRlbnRfcG9pbnRlci5jbGFzc0xpc3QuY29udGFpbnMoImhhcmQtY29udGVudCIpJiZibG9ja1NldHRpbmdBcnJheVtpXVsic2V0dGluZ190eXBlIl0hPTMpDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBibG9ja19udW1iZXIgPSAwOw0KDQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoInBlcmNlbnRQb2ludGVyQ2xhc3MiKTsNCiAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LmFkZCgibWFya2VkIik7DQogICAgICAgICAgICAgICAgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJzYyJdPT0xKSB7DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJzY01hcmsiKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmlubmVySFRNTCA9IGJsb2NrU2V0dGluZ0FycmF5W2ldWyJ0ZXh0Il07DQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmRhdGFzZXQucmJpbmRlciA9IGJpbmRlck5hbWU7DQogICAgICAgICAgICAgICAgYmxvY2tfbnVtYmVyID0gZWxlbWVudFRvQWRkLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXNbJ2RhdGEtaWQnXS52YWx1ZTsNCg0KICAgICAgICAgICAgICAgIGlmIChibG9ja0R1cGxpY2F0ZSA9PSAnbm8nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5sZW5ndGg7IGkxKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tfbnVtYmVyPT11c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHNbaTFdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9vbGJhY2tJID09IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZFN0eWxlID0gY3JlYXRlU3R5bGVFbGVtZW50KGJsb2NrX251bWJlciwgYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRDc3MiXSk7DQoNCiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFRvQWRkU3R5bGUmJmVsZW1lbnRUb0FkZFN0eWxlIT0nZGVmYXVsdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLnN0eWxlLnRleHRBbGlnbiA9IGVsZW1lbnRUb0FkZFN0eWxlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICgoYmxvY2tTZXR0aW5nQXJyYXlbaV1bIm1pbkhlYWRlcnMiXSA+IDApJiYoYmxvY2tTZXR0aW5nQXJyYXlbaV1bIm1pbkhlYWRlcnMiXSA+IHRlcm1vcmFyaXR5X3BhcmVudF93aXRoX2NvbnRlbnRfbGVuZ3RoKSkge2NvbnRpbnVlO30NCiAgICAgICAgICAgICAgICBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bIm1pblN5bWJvbHMiXSA+IGNvbnRlbnRMZW5ndGgpIHtjb250aW51ZTt9DQoNCiAgICAgICAgICAgICAgICBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNldHRpbmdfdHlwZSJdID09IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJlZW50RWxlbWVudHNHYXRoZXIoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnQiXS50b0xvd2VyQ2FzZSgpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRQbGFjZSJdIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJlc3VsdCA9IGN1cnJlbnRFbGVtZW50Lmxlbmd0aCArIGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UGxhY2UiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VtUmVzdWx0ID49IDAgJiYgc3VtUmVzdWx0IDwgY3VycmVudEVsZW1lbnQubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnRSZWNlaXZlcih0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJlc3VsdCA9IGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UGxhY2UiXSAtIDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bVJlc3VsdCA8IGN1cnJlbnRFbGVtZW50Lmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50UmVjZWl2ZXIoZmFsc2UpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgIT0gdW5kZWZpbmVkICYmIGN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnRDaGVja2VyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwb3NDdXJyZW50RWxlbWVudCA9IGluaXRUYXJnZXRUb0luc2VydChibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFBvc2l0aW9uIl0sICdlbGVtZW50JywgY3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudFRvQWRkLCBwb3NDdXJyZW50RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyYmluZGVyLScrYmluZGVyTmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LnJlbW92ZSgnY292ZXJlZEFkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmJfdGVtcEVsZW1lbnRfY2hlY2sgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNldHRpbmdfdHlwZSJdID09IDIpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrRHVwbGljYXRlID09ICdubycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50Q291bnQiXSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmVwZWF0YWJsZUN1cnJlbnRFbGVtZW50ID0gW107DQogICAgICAgICAgICAgICAgICAgIHJlQ291ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgY3VyRmlyc3RQbGFjZSA9IGJsb2NrU2V0dGluZ0FycmF5W2ldWyJmaXJzdFBsYWNlIl07DQogICAgICAgICAgICAgICAgICAgIGN1ckVsZW1lbnRDb3VudCA9IGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50Q291bnQiXTsNCiAgICAgICAgICAgICAgICAgICAgY3VyRWxlbWVudFN0ZXAgPSBibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFN0ZXAiXTsNCiAgICAgICAgICAgICAgICAgICAgcmVwZWF0YWJsZVN1Y2Nlc3MgPSBmYWxzZTsNCg0KICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGRTdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudChibG9ja19udW1iZXIsIGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50Q3NzIl0pOw0KDQogICAgICAgICAgICAgICAgICAgIHJlcGVhdGFibGVDdXJyZW50RWxlbWVudCA9IGN1cmVlbnRFbGVtZW50c0dhdGhlcihibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudCJdLnRvTG93ZXJDYXNlKCkpOw0KICAgICAgICAgICAgICAgICAgICBpZiAocmVwZWF0YWJsZUN1cnJlbnRFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpMSA9IDA7IGkxIDwgYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRDb3VudCJdOyBpMSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRDaGVja2VyID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcEVsZW1lbnRUb0FkZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcEVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJwZXJjZW50UG9pbnRlckNsYXNzIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwRWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoIm1hcmtlZCIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja1NldHRpbmdBcnJheVtpXVsic2MiXT09MSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBFbGVtZW50VG9BZGQuY2xhc3NMaXN0LmFkZCgic2NNYXJrIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcEVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJyZXBlYXRhYmxlLW1hcmstIityZXBlYXRhYmxlQmxvY2tJZGVudGlmaWVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBFbGVtZW50VG9BZGQuaW5uZXJIVE1MID0gYmxvY2tTZXR0aW5nQXJyYXlbaV1bInRleHQiXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VG9BZGRTdHlsZSYmZWxlbWVudFRvQWRkU3R5bGUhPSdkZWZhdWx0Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBFbGVtZW50VG9BZGQuc3R5bGUudGV4dEFsaWduID0gZWxlbWVudFRvQWRkU3R5bGU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtUmVzdWx0ID0gTWF0aC5yb3VuZChwYXJzZUludChibG9ja1NldHRpbmdBcnJheVtpXVsiZmlyc3RQbGFjZSJdKSArIChpMSpwYXJzZUludChibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFN0ZXAiXSkpIC0gMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bVJlc3VsdCA8IHJlcGVhdGFibGVDdXJyZW50RWxlbWVudC5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudFJlY2VpdmVyKGZhbHNlLCByZXBlYXRhYmxlQ3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCAhPSB1bmRlZmluZWQgJiYgY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiBjdXJyZW50RWxlbWVudENoZWNrZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSBpbml0VGFyZ2V0VG9JbnNlcnQoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRQb3NpdGlvbiJdLCAnZWxlbWVudCcsIGN1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocmVwRWxlbWVudFRvQWRkLCBwb3NDdXJyZW50RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3JiaW5kZXItJytiaW5kZXJOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwRWxlbWVudFRvQWRkLmNsYXNzTGlzdC5yZW1vdmUoJ2NvdmVyZWRBZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJGaXJzdFBsYWNlID0gc3VtUmVzdWx0ICsgcGFyc2VJbnQoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRTdGVwIl0pICsgMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyRWxlbWVudENvdW50LS07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGFibGVTdWNjZXNzID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRhYmxlU3VjY2VzcyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGFibGVTdWNjZXNzPT10cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0YWJsZUJsb2NrSWRlbnRpZmllcisrOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFibG9ja1NldHRpbmdBcnJheVtpXVsidW5zdWNjZXNzIl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheVtpXVsidW5zdWNjZXNzIl0gPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheVtpXVsidW5zdWNjZXNzIl0gPSBNYXRoLnJvdW5kKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJ1bnN1Y2Nlc3MiXSArIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJ1bnN1Y2Nlc3MiXSA+IDEwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheVtpXVsiZmlyc3RQbGFjZSJdID0gY3VyRmlyc3RQbGFjZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudENvdW50Il0gPSBjdXJFbGVtZW50Q291bnQ7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRTdGVwIl0gPSBjdXJFbGVtZW50U3RlcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJzZXR0aW5nX3R5cGUiXSA9PSAzKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50VHlwZVN5bWJvbCA9ICcnOw0KICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFNwYWNlU3ltYm9sID0gJyc7DQogICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50TmFtZSA9ICcnOw0KICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFR5cGUgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRUYWcgID0gJyc7DQogICAgICAgICAgICAgICAgICAgIGxldCBmaW5kUXVlcnkgPSAwOw0KICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0Q2xhc3NSZXN1bHQgPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGRpcmVjdEVsZW1lbnQgPSBibG9ja1NldHRpbmdBcnJheVtpXVsiZGlyZWN0RWxlbWVudCJdLnRyaW0oKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0RWxlbWVudC5zZWFyY2goJyMnKSA+IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmaW5kUXVlcnkgPSAxOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChkaXJlY3RFbGVtZW50LnNlYXJjaCgnIycpIDwgMCkmJihkaXJlY3RFbGVtZW50LnNlYXJjaCgnLicpID4gLTEpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RDbGFzc1Jlc3VsdCA9IGRpcmVjdENsYXNzRWxlbWVudERldGVjdGluZyhibG9ja1NldHRpbmdBcnJheSwgZGlyZWN0RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICBmaW5kUXVlcnkgPSBkaXJlY3RDbGFzc1Jlc3VsdFsnZmluZFF1ZXJ5J107DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGRpcmVjdENsYXNzUmVzdWx0WydjdXJyZW50RWxlbWVudCddOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChmaW5kUXVlcnkgPT0gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGRpcmVjdEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRDaGVja2VyID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCAhPSB1bmRlZmluZWQgJiYgY3VycmVudEVsZW1lbnQgIT0gbnVsbCAmJiBjdXJyZW50RWxlbWVudENoZWNrZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc0N1cnJlbnRFbGVtZW50ID0gaW5pdFRhcmdldFRvSW5zZXJ0KGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UG9zaXRpb24iXSwgJ2VsZW1lbnQnLCBjdXJyZW50RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50VG9BZGQsIHBvc0N1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QucmVtb3ZlKCdjb3ZlcmVkQWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3JiaW5kZXItJytiaW5kZXJOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5wdXNoKGJsb2NrX251bWJlcik7DQogICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xiYWNrSSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJzZXR0aW5nX3R5cGUiXSA9PSA0KSB7DQogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNjb250ZW50X3BvaW50ZXJfaWQiKS5wYXJlbnRFbGVtZW50LmFwcGVuZChlbGVtZW50VG9BZGQpOw0KICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNldHRpbmdfdHlwZSJdID09IDUpIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50TGlzdCA9IGN1cmVlbnRFbGVtZW50c0dhdGhlcigncCcsIDEsIGNvbnRlbnRfcG9pbnRlci5wYXJlbnRFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50TGlzdCYmY3VycmVudEVsZW1lbnRMaXN0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwQ291bnQgPSBjdXJyZW50RWxlbWVudExpc3QubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROdW1iZXIgPSBNYXRoLnJvdW5kKHBDb3VudC8yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ291bnQgPiAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudExpc3RbZWxlbWVudE51bWJlcisxXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCAhPSB1bmRlZmluZWQgJiYgY3VycmVudEVsZW1lbnQgIT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwQ291bnQgPiAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnRUb0FkZCwgY3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnRUb0FkZCwgY3VycmVudEVsZW1lbnQubmV4dFNpYmxpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LnJlbW92ZSgnY292ZXJlZEFkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmJpbmRlci0nK2JpbmRlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5wdXNoKGJsb2NrX251bWJlcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNldHRpbmdfdHlwZSJdID09IDYpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZvcjZ0aC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbnRhaW5lckZvcjZ0aC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGb3I2dGhbal1bImVsZW1lbnRQbGFjZSJdPmJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UGxhY2UiXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aW51ZTsgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gY29udGFpbmVyRm9yNnRoLmxlbmd0aC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJGb3I2dGgucHVzaChibG9ja1NldHRpbmdBcnJheVtpXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VkQWRCbG9ja3NBcnJheS5wdXNoKGNoZWNrSWZCbG9ja1VzZWQpOyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IGNvbnRhaW5lckZvcjZ0aC5sZW5ndGgtMTsgayA+IGotMTsgay0tKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJGb3I2dGhbayArIDFdID0gY29udGFpbmVyRm9yNnRoW2tdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckZvcjZ0aFtqXSA9IGJsb2NrU2V0dGluZ0FycmF5W2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VkQWRCbG9ja3NBcnJheS5wdXNoKGNoZWNrSWZCbG9ja1VzZWQpOyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRm9yNnRoLnB1c2goYmxvY2tTZXR0aW5nQXJyYXlbaV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8qIHZpZHByYXZ1dHUgdiB2aWRzdGlpbnVrIGRseWEgNmhvIHRpcGEgKi8NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNldHRpbmdfdHlwZSJdID09IDcpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZvcjd0aC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbnRhaW5lckZvcjd0aC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGb3I3dGhbal1bImVsZW1lbnRQbGFjZSJdPmJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UGxhY2UiXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aW51ZTsgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gY29udGFpbmVyRm9yN3RoLmxlbmd0aC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJGb3I3dGgucHVzaChibG9ja1NldHRpbmdBcnJheVtpXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gY29udGFpbmVyRm9yN3RoLmxlbmd0aC0xOyBrID4gai0xOyBrLS0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckZvcjd0aFtrICsgMV0gPSBjb250YWluZXJGb3I3dGhba107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRm9yN3RoW2pdID0gYmxvY2tTZXR0aW5nQXJyYXlbaV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5wdXNoKGJsb2NrX251bWJlcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJGb3I3dGgucHVzaChibG9ja1NldHRpbmdBcnJheVtpXSk7DQogICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLyogdmlkcHJhdnV0dSB2IHZpZHN0aWludWsgZGx5YSA3aG8gdGlwYSAqLw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGFycmF5ID0gdGV4dExlbmd0aEdhdGhlcmVyKGxvcmRPZkVsZW1lbnRzKSwNCiAgICAgICAgICAgIHRsQXJyYXkgPSBhcnJheS5hcnJheSwNCiAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsNCg0KICAgICAgICBpZiAoY29udGFpbmVyRm9yNnRoLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIHBlcmNlbnRJbnNlcnRlcihsb3JkT2ZFbGVtZW50cywgY29udGFpbmVyRm9yNnRoLCB0bEFycmF5LCBsZW5ndGgpOw0KICAgICAgICB9DQogICAgICAgIGlmIChjb250YWluZXJGb3I3dGgubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgc3ltYm9sSW5zZXJ0ZXIobG9yZE9mRWxlbWVudHMsIGNvbnRhaW5lckZvcjd0aCwgdGxBcnJheSk7DQogICAgICAgIH0NCiAgICAgICAgc2hvcnRjb2Rlc0luc2VydCgpOw0KICAgICAgICBsZXQgc3RvcHBlciA9IDA7DQoNCiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBpZiAocmVwZWF0ID0gdHJ1ZSkgew0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAvKiBhc3luY0Jsb2Nrc0luc2VydGluZ0Z1bmN0aW9uKGJsb2NrU2V0dGluZ0FycmF5LCBjb250ZW50TGVuZ3RoKSAqLw0KICAgICAgICAgICAgICAgICAgICBhc3luY0Jsb2Nrc0luc2VydGluZ0Z1bmN0aW9uKGJsb2NrU2V0dGluZ0FycmF5KTsNCiAgICAgICAgICAgICAgICB9LCAxMDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgICAgIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBwb3NzaWJsZVRhZ3NJbkNoZWNrQ29uZmlybWVyKHBvc3NpYmxlVGFnc0FycmF5LCBwb3NzaWJsZVRhZ3NJbkNoZWNrKSB7DQogICAgaWYgKHBvc3NpYmxlVGFnc0FycmF5LmluY2x1ZGVzKCJMSSIpKSB7DQogICAgICAgIGlmIChwb3NzaWJsZVRhZ3NBcnJheS5pbmNsdWRlcygiVUwiKSkgew0KICAgICAgICAgICAgcG9zc2libGVUYWdzSW5DaGVjay5wdXNoKCJVTCIpOw0KICAgICAgICB9DQogICAgICAgIGlmIChwb3NzaWJsZVRhZ3NBcnJheS5pbmNsdWRlcygiT0wiKSkgew0KICAgICAgICAgICAgcG9zc2libGVUYWdzSW5DaGVjay5wdXNoKCJPTCIpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiB0ZXh0TGVuZ3RoR2F0aGVyZXIobG9yZE9mRWxlbWVudHNMb2MpIHsNCiAgICB2YXIgcG9zc2libGVUYWdzQXJyYXk7DQogICAgaWYgKHR5cGVvZiB0YWdzTGlzdEZvclRleHRMZW5ndGghPT0idW5kZWZpbmVkIikgew0KICAgICAgICBwb3NzaWJsZVRhZ3NBcnJheSA9IHRhZ3NMaXN0Rm9yVGV4dExlbmd0aDsNCiAgICB9IGVsc2Ugew0KICAgICAgICBwb3NzaWJsZVRhZ3NBcnJheSA9IFsiUCIsICJIMSIsICJIMiIsICJIMyIsICJINCIsICJINSIsICJINiIsICJESVYiLCAiQkxPQ0tRVU9URSIsICJJTkRFWCIsICJBUlRJQ0xFIiwgIlNFQ1RJT04iXTsNCiAgICB9DQogICAgbGV0IHBvc3NpYmxlVGFnc0luQ2hlY2sgPSBbIkRJViIsICJJTkRFWCIsICJTRUNUSU9OIl07DQoNCiAgICBwb3NzaWJsZVRhZ3NJbkNoZWNrQ29uZmlybWVyKHBvc3NpYmxlVGFnc0FycmF5LCBwb3NzaWJsZVRhZ3NJbkNoZWNrKTsNCiAgICBsZXQgZXhjQXJyID0gZXhjSWRDbFVucGFja2VyKCksDQogICAgICAgIHRleHRMZW5ndGggPSAwLA0KICAgICAgICB0bEFycmF5ID0gW107DQoNCiAgICBmdW5jdGlvbiB0ZXh0TGVuZ3RoR2F0aGVyZXJSZWMobG9yZE9mRWxlbWVudHNMb2MpIHsNCiAgICAgICAgbGV0IGFsbG93ZWQ7DQogICAgICAgIGxldCBjb3UxOw0KICAgICAgICBsZXQgY2xhc3Nlc0FycmF5Ow0KICAgICAgICBsZXQgY291bnRTdWNjZXNzID0gMDsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAocG9zc2libGVUYWdzQXJyYXkuaW5jbHVkZXMobG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0udGFnTmFtZSkNCiAgICAgICAgICAgICAgICAgICAgJiYhbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJwZXJjZW50UG9pbnRlckNsYXNzIikNCiAgICAgICAgICAgICAgICAgICAgJiZsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS5pZCE9InRvY19jb250YWluZXIiDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChwb3NzaWJsZVRhZ3NJbkNoZWNrLmluY2x1ZGVzKGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLnRhZ05hbWUpDQogICAgICAgICAgICAgICAgICAgICAgICAmJihsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS5jaGlsZHJlbi5sZW5ndGggPiAwKQ0KICAgICAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLmlkJiZleGNBcnJbJ2lkJ10ubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdTEgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChleGNBcnJbJ2lkJ11bY291MV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLmlkLnRvTG93ZXJDYXNlKCk9PWV4Y0FyclsnaWQnXVtjb3UxXS50b0xvd2VyQ2FzZSgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3UxKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0uY2xhc3NMaXN0Lmxlbmd0aCA+IDAmJmV4Y0FyclsnY2xhc3MnXS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291MSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGV4Y0FyclsnY2xhc3MnXVtjb3UxXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2VzQXJyYXkgPSBleGNBcnJbJ2NsYXNzJ11bY291MV0uc3BsaXQoJy4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzZXNBcnJheS5ldmVyeShjbGFzc05hbWUgPT4gbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0uY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3UxKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhjQXJyWyd0YWcnXS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291MSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGV4Y0FyclsndGFnJ11bY291MV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09ZXhjQXJyWyd0YWcnXVtjb3UxXS50b0xvd2VyQ2FzZSgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3UxKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0TGVuZ3RoR2F0aGVyZXJSZWMobG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0sIGV4Y0FyciwgcG9zc2libGVUYWdzQXJyYXksIHBvc3NpYmxlVGFnc0luQ2hlY2spKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50U3VjY2VzcysrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGV4dExlbmd0aCA9IHRleHRMZW5ndGggKyBsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS5pbm5lclRleHQubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICB0bEFycmF5LnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiBsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS50YWdOYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS5pbm5lclRleHQubGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoU3VtOiB0ZXh0TGVuZ3RoLA0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0NCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIGNvdW50U3VjY2VzcysrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBjYXRjaCAoZXIpIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyLm1lc3NhZ2UpOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBjb3VudFN1Y2Nlc3MgPiAwOw0KICAgIH0NCg0KICAgIHRleHRMZW5ndGhHYXRoZXJlclJlYyhsb3JkT2ZFbGVtZW50c0xvYyk7DQoNCiAgICByZXR1cm4ge2FycmF5OiB0bEFycmF5LCBsZW5ndGg6IHRleHRMZW5ndGh9Ow0KfQ0KDQp3aW5kb3cuYXN5bmNGdW5jdGlvbkxhdW5jaGVyID0gZnVuY3Rpb24oKSB7DQogICAgaWYgKHdpbmRvdy5qc0lucHV0ZXJMYXVuY2ggIT09IHVuZGVmaW5lZA0KICAgICAgICAmJlsxNSwgMTBdLmluY2x1ZGVzKHdpbmRvdy5qc0lucHV0ZXJMYXVuY2gpDQogICAgICAgICYmKHR5cGVvZiBhc3luY0Jsb2Nrc0luc2VydGluZ0Z1bmN0aW9uICE9PSAndW5kZWZpbmVkJyApDQogICAgICAgICYmKHR5cGVvZiBhc3luY0Jsb2Nrc0luc2VydGluZ0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKQ0KICAgICAgICAmJnR5cGVvZiBlbmRlZFNjIT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2YgZW5kZWRDYyE9PSd1bmRlZmluZWQnJiYNCiAgICAgICAgdHlwZW9mIHVzZWRBZEJsb2Nrc0FycmF5IT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2YgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzIT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2Ygc2FtZUVsZW1lbnRBZnRlcldpZHRoIT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2Ygc2FtZUVsZW1lbnRBZnRlckV4Y0NsYXNzSWQhPT0ndW5kZWZpbmVkJyYmDQogICAgICAgIHR5cGVvZiBzYW1lRWxlbWVudEFmdGVyRnJvbUNvbnN0cnVjdGlvbiE9PSd1bmRlZmluZWQnJiYNCiAgICAgICAgdHlwZW9mIHJiX3RlbXBFbGVtZW50X2NoZWNrIT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2YgcmJfdGVtcEVsZW1lbnQhPT0ndW5kZWZpbmVkJyYmDQogICAgICAgIHR5cGVvZiB3aW5kb3cuanNJbnB1dGVyTGF1bmNoIT09J3VuZGVmaW5lZCcpIHsNCiAgICAgICAgLyogYXN5bmNCbG9ja3NJbnNlcnRpbmdGdW5jdGlvbihibG9ja1NldHRpbmdBcnJheSwgY29udGVudExlbmd0aCk7ICovDQogICAgICAgIGFzeW5jQmxvY2tzSW5zZXJ0aW5nRnVuY3Rpb24oYmxvY2tTZXR0aW5nQXJyYXkpOw0KICAgICAgICBpZiAoIWVuZGVkU2MpIHsNCiAgICAgICAgICAgIHNob3J0Y29kZXNJbnNlcnQoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWVuZGVkQ2MpIHsNCiAgICAgICAgICAgIC8qIGNsZWFyVW5zdWl0YWJsZUNhY2hlKDApOyAqLw0KICAgICAgICB9DQogICAgICAgIC8qIGJsb2Nrc1JlcG9zaXRpb24oKTsNCiAgICAgICAgY2FjaGVQbGFjaW5nKCk7DQogICAgICAgIHN5bWJvbE1hcmtlcnNQbGFjZWQoKTsgKi8NCiAgICB9IGVsc2Ugew0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGFzeW5jRnVuY3Rpb25MYXVuY2hlcigpOw0KICAgICAgICB9LCA1MCk7DQogICAgfQ0KfTsNCi8qIGFzeW5jRnVuY3Rpb25MYXVuY2hlcigpOyAqLw0KDQpmdW5jdGlvbiBhc3luY0luc2VydGluZ3NJbnNlcnRpbmdGdW5jdGlvbihpbnNlcnRpbmdzQXJyYXkpIHsNCiAgICBsZXQgY3VycmVudEVsZW1lbnRGb3JJbnNlcnRpbmcgPSAwOw0KICAgIGxldCBjdXJyZW50RWxlbWVudFRvTW92ZSA9IDA7DQogICAgbGV0IHBvc2l0aW9uRWxlbWVudCA9IDA7DQogICAgbGV0IHBvc2l0aW9uID0gMDsNCiAgICBsZXQgaW5zZXJ0VG9BZGQgPSAwOw0KICAgIGxldCBwb3N0SWQgPSAwOw0KICAgIGxldCByZXBlYXRTZWFyY2ggPSAwOw0KICAgIGlmIChpbnNlcnRpbmdzQXJyYXkmJmluc2VydGluZ3NBcnJheS5sZW5ndGggPiAwKSB7DQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zZXJ0aW5nc0FycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIWluc2VydGluZ3NBcnJheVtpXVsndXNlZCddfHwoaW5zZXJ0aW5nc0FycmF5W2ldWyd1c2VkJ10mJmluc2VydGluZ3NBcnJheVtpXVsndXNlZCddPT0wKSkgew0KICAgICAgICAgICAgICAgIHBvc2l0aW9uRWxlbWVudCA9IGluc2VydGluZ3NBcnJheVtpXVsncG9zaXRpb25fZWxlbWVudCddOw0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gaW5zZXJ0aW5nc0FycmF5W2ldWydwb3NpdGlvbiddOw0KICAgICAgICAgICAgICAgIGluc2VydFRvQWRkID0gaW5zZXJ0aW5nc0FycmF5W2ldWydjb250ZW50J107DQogICAgICAgICAgICAgICAgcG9zdElkID0gaW5zZXJ0aW5nc0FycmF5W2ldWydwb3N0SWQnXTsNCg0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Rm9ySW5zZXJ0aW5nID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihwb3NpdGlvbkVsZW1lbnQpOw0KDQogICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRUb01vdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY292ZXJlZEluc2VydGluZ3NbZGF0YS1pZD0iJytwb3N0SWQrJyJdJyk7DQogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Rm9ySW5zZXJ0aW5nKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbj09MCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRGb3JJbnNlcnRpbmcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY3VycmVudEVsZW1lbnRUb01vdmUsIGN1cnJlbnRFbGVtZW50Rm9ySW5zZXJ0aW5nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50VG9Nb3ZlLmNsYXNzTGlzdC5yZW1vdmUoJ2NvdmVyZWRJbnNlcnRpbmdzJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpbmdzQXJyYXlbaV1bJ3VzZWQnXSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudEZvckluc2VydGluZy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjdXJyZW50RWxlbWVudFRvTW92ZSwgY3VycmVudEVsZW1lbnRGb3JJbnNlcnRpbmcubmV4dFNpYmxpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRUb01vdmUuY2xhc3NMaXN0LnJlbW92ZSgnY292ZXJlZEluc2VydGluZ3MnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGluZ3NBcnJheVtpXVsndXNlZCddID0gMTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHJlcGVhdFNlYXJjaCA9IDE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIGlmIChyZXBlYXRTZWFyY2ggPT0gMSkgew0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGFzeW5jSW5zZXJ0aW5nc0luc2VydGluZ0Z1bmN0aW9uKGluc2VydGluZ3NBcnJheSk7DQogICAgICAgIH0sIDEwMCkNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGluc2VydGluZ3NGdW5jdGlvbkxhdW5jaCgpIHsNCiAgICBpZiAod2luZG93LmpzSW5zZXJ0aW5nc0xhdW5jaCAhPT0gdW5kZWZpbmVkJiZqc0luc2VydGluZ3NMYXVuY2ggPT0gMjUpIHsNCiAgICAgICAgYXN5bmNJbnNlcnRpbmdzSW5zZXJ0aW5nRnVuY3Rpb24oaW5zZXJ0aW5nc0FycmF5KTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGluc2VydGluZ3NGdW5jdGlvbkxhdW5jaCgpOw0KICAgICAgICB9LCAxMDApDQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBzZXRMb25nQ2FjaGUoKSB7DQogICAgbGV0IHhodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogICAgbGV0IHNlbmREYXRhID0gJ2FjdGlvbj1zZXRMb25nQ2FjaGUmdHlwZT1sb25nQ2F0Y2hpbmcnOw0KICAgIHhodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKHJlZGF0YSkgew0KICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IDQgJiYgdGhpcy5zdGF0dXMgPT0gMjAwKSB7DQogICAgICAgICAgICBjb25zb2xlLmxvZygnbG9uZyBjYWNoZSBkZXBsb3llZCcpOw0KICAgICAgICB9DQogICAgfTsNCiAgICB4aHR0cC5vcGVuKCJQT1NUIiwgcmJfYWpheHVybCwgdHJ1ZSk7DQogICAgeGh0dHAuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOw0KICAgIHhodHRwLnNlbmQoc2VuZERhdGEpOw0KfQ0KDQpmdW5jdGlvbiBjYWNoZVBsYWNpbmcoYWxlcnRfdHlwZSwgZXJyb3JJbmZvPW51bGwpIHsNCiAgICBsZXQgYWRCbG9ja3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGVyY2VudFBvaW50ZXJDbGFzcyAuJyArIGJsb2NrX2NsYXNzZXMuam9pbignLCAucGVyY2VudFBvaW50ZXJDbGFzcyAuJykpOw0KICAgIGxldCBjdXJBZEJsb2NrOw0KICAgIGxldCBva1N0YXRlcyA9IFsnZG9uZScsJ3JlZnJlc2gtd2FpdCcsJ25vLWJsb2NrJywnZmV0Y2hlZCddOw0KICAgIC8qIGxldCBhZElkID0gLTE7ICovDQogICAgbGV0IGJsb2NrQWlkID0gbnVsbDsNCiAgICBsZXQgYmxvY2tJZDsNCg0KICAgIGlmICh0eXBlb2YgY2FjaGVkQmxvY2tzQXJyYXkgIT09ICd1bmRlZmluZWQnJiZjYWNoZWRCbG9ja3NBcnJheSYmY2FjaGVkQmxvY2tzQXJyYXkubGVuZ3RoID4gMCYmYWRCbG9ja3MmJmFkQmxvY2tzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZEJsb2Nrcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgYmxvY2tBaWQgPSBhZEJsb2Nrc1tpXVsnZGF0YXNldCddWydhaWQnXTsNCg0KICAgICAgICAgICAgaWYgKCFibG9ja0FpZCkgew0KICAgICAgICAgICAgICAgIGJsb2NrSWQgPSBhZEJsb2Nrc1tpXVsnZGF0YXNldCddWydpZCddOw0KICAgICAgICAgICAgICAgIGlmIChjYWNoZWRCbG9ja3NBcnJheVtibG9ja0lkXSkgew0KICAgICAgICAgICAgICAgICAgICBqUXVlcnkoYWRCbG9ja3NbaV0pLmh0bWwoY2FjaGVkQmxvY2tzQXJyYXlbYmxvY2tJZF0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChhbGVydF90eXBlJiZhbGVydF90eXBlPT0naGlnaCcpIHsNCiAgICAgICAgc2V0TG9uZ0NhY2hlKCk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBzeW1ib2xJbnNlcnRlcihsb3JkT2ZFbGVtZW50cywgY29udGFpbmVyRm9yN3RoLCB0bEFycmF5KSB7DQogICAgdHJ5IHsNCiAgICAgICAgdmFyIGN1cnJlbnRDaGlsZHJlbkxlbmd0aCA9IDA7DQogICAgICAgIGxldCBwcmV2aW91c0JyZWFrID0gMDsNCiAgICAgICAgbGV0IG5lZWRsZUxlbmd0aDsNCiAgICAgICAgbGV0IGN1cnJlbnRTdW1MZW5ndGg7DQogICAgICAgIGxldCBlbGVtZW50VG9BZGQ7DQogICAgICAgIGxldCBlbGVtZW50VG9CaW5kOw0KICAgICAgICBsZXQgZWxlbWVudFRvQWRkU3R5bGU7DQogICAgICAgIGxldCBibG9ja19udW1iZXI7DQogICAgICAgIGxldCBiaW5kZXJOYW1lOw0KDQogICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcmtlZFNwYW4xIikpIHsNCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGFpbmVyRm9yN3RoLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgcHJldmlvdXNCcmVhayA9IDA7DQogICAgICAgICAgICAgICAgY3VycmVudENoaWxkcmVuTGVuZ3RoID0gMDsNCiAgICAgICAgICAgICAgICBjdXJyZW50U3VtTGVuZ3RoID0gMDsNCiAgICAgICAgICAgICAgICBuZWVkbGVMZW5ndGggPSBNYXRoLmFicyhjb250YWluZXJGb3I3dGhbaV1bJ2VsZW1lbnRQbGFjZSddKTsNCiAgICAgICAgICAgICAgICBiaW5kZXJOYW1lID0gZWxlbWVudEJpbmRlck5hbWVHZW5lcmF0b3IoKTsNCg0KICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJwZXJjZW50UG9pbnRlckNsYXNzIik7DQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoIm1hcmtlZCIpOw0KICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGb3I3dGhbaV1bInNjIl09PTEpIHsNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoInNjTWFyayIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuZGF0YXNldC5yYmluZGVyID0gYmluZGVyTmFtZTsNCiAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuaW5uZXJIVE1MID0gY29udGFpbmVyRm9yN3RoW2ldWyJ0ZXh0Il07DQogICAgICAgICAgICAgICAgYmxvY2tfbnVtYmVyID0gZWxlbWVudFRvQWRkLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXNbJ2RhdGEtaWQnXS52YWx1ZTsNCiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRUb0FkZCkgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGRTdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudChibG9ja19udW1iZXIsIGNvbnRhaW5lckZvcjd0aFtpXVsiZWxlbWVudENzcyJdKTsNCg0KICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VG9BZGRTdHlsZSYmZWxlbWVudFRvQWRkU3R5bGUhPSdkZWZhdWx0Jykgew0KICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuc3R5bGUudGV4dEFsaWduID0gZWxlbWVudFRvQWRkU3R5bGU7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZvcjd0aFtpXVsnZWxlbWVudFBsYWNlJ10gPCAwKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSB0bEFycmF5Lmxlbmd0aC0xOyBqID4gLTE7IGotLSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN1bUxlbmd0aCA9IGN1cnJlbnRTdW1MZW5ndGggKyB0bEFycmF5W2pdWydsZW5ndGgnXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkbGVMZW5ndGggPCBjdXJyZW50U3VtTGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZCA9IHRsQXJyYXlbal1bJ2VsZW1lbnQnXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9CaW5kID0gY3VycmVudEVsZW1lbnRSZWNlaXZlclNwZWModHJ1ZSwgaiwgdGxBcnJheSwgZWxlbWVudFRvQmluZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50VG9BZGQsIGVsZW1lbnRUb0JpbmQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQuY2xhc3NMaXN0LmFkZCgncmJpbmRlci0nK2JpbmRlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QucmVtb3ZlKCdjb3ZlcmVkQWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVyRm9yN3RoW2ldWydlbGVtZW50UGxhY2UnXSA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQgPSB0bEFycmF5WzBdWydlbGVtZW50J107DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudFRvQWRkLCBlbGVtZW50VG9CaW5kKTsNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZC5jbGFzc0xpc3QuYWRkKCdyYmluZGVyLScrYmluZGVyTmFtZSk7DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QucmVtb3ZlKCdjb3ZlcmVkQWQnKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRsQXJyYXkubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdW1MZW5ndGggPSBjdXJyZW50U3VtTGVuZ3RoICsgdGxBcnJheVtqXVsnbGVuZ3RoJ107DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZGxlTGVuZ3RoIDwgY3VycmVudFN1bUxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQgPSB0bEFycmF5W2pdWydlbGVtZW50J107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZCA9IGN1cnJlbnRFbGVtZW50UmVjZWl2ZXJTcGVjKGZhbHNlLCBqLCB0bEFycmF5LCBlbGVtZW50VG9CaW5kKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9CaW5kLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnRUb0FkZCwgZWxlbWVudFRvQmluZC5uZXh0U2libGluZyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZC5jbGFzc0xpc3QuYWRkKCdyYmluZGVyLScrYmluZGVyTmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5yZW1vdmUoJ2NvdmVyZWRBZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB2YXIgc3Bhbk1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsNCiAgICAgICAgICAgIHNwYW5NYXJrZXIuc2V0QXR0cmlidXRlKCJpZCIsICJtYXJrZWRTcGFuMSIpOw0KICAgICAgICAgICAgbG9yZE9mRWxlbWVudHMucHJlcGVuZChzcGFuTWFya2VyKTsNCiAgICAgICAgfQ0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgY29uc29sZS5sb2coZSk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBwZXJjZW50SW5zZXJ0ZXIobG9yZE9mRWxlbWVudHMsIGNvbnRhaW5lckZvcjZ0aCwgdGxBcnJheSwgdGV4dExlbmd0aCkgew0KICAgIHRyeSB7DQogICAgICAgIHZhciB0ZXh0TmVlZHlMZW5ndGggPSAwOw0KICAgICAgICBsZXQgZWxlbWVudFRvQWRkOw0KICAgICAgICB2YXIgZWxlbWVudFRvQmluZDsNCiAgICAgICAgbGV0IGVsZW1lbnRUb0FkZFN0eWxlOw0KICAgICAgICBsZXQgYmxvY2tfbnVtYmVyOw0KICAgICAgICB2YXIgYmluZGVyTmFtZTsNCiAgICAgICAgLyogdmFyIGNoZWNrSWZCbG9ja1VzZWQgPSAwOyAqLw0KDQogICAgICAgIGZ1bmN0aW9uIGluc2VydEJ5UGVyY2VudHModGV4dExlbmd0aCkgew0KICAgICAgICAgICAgbGV0IGxvY2FsTWlkZGxlVmFsdWUgPSAwOw0KDQogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbnRhaW5lckZvcjZ0aC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgIHRleHROZWVkeUxlbmd0aCA9IE1hdGgucm91bmQodGV4dExlbmd0aCAqIChjb250YWluZXJGb3I2dGhbal1bImVsZW1lbnRQbGFjZSJdLzEwMCkpOw0KICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGxBcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAodGxBcnJheVtpXVsnbGVuZ3RoU3VtJ10gPj0gdGV4dE5lZWR5TGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBiaW5kZXJOYW1lID0gZWxlbWVudEJpbmRlck5hbWVHZW5lcmF0b3IoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LmFkZCgicGVyY2VudFBvaW50ZXJDbGFzcyIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoIm1hcmtlZCIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lckZvcjZ0aFtqXVsic2MiXT09MSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJzY01hcmsiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5kYXRhc2V0LnJiaW5kZXIgPSBiaW5kZXJOYW1lOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmlubmVySFRNTCA9IGNvbnRhaW5lckZvcjZ0aFtqXVsidGV4dCJdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50VG9BZGQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX251bWJlciA9IGVsZW1lbnRUb0FkZC5jaGlsZHJlblswXS5hdHRyaWJ1dGVzWydkYXRhLWlkJ10udmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGRTdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudChibG9ja19udW1iZXIsIGNvbnRhaW5lckZvcjZ0aFtqXVsiZWxlbWVudENzcyJdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VG9BZGRTdHlsZSYmZWxlbWVudFRvQWRkU3R5bGUhPSdkZWZhdWx0Jykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5zdHlsZS50ZXh0QWxpZ24gPSBlbGVtZW50VG9BZGRTdHlsZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxNaWRkbGVWYWx1ZSA9IHRsQXJyYXlbaV1bJ2xlbmd0aFN1bSddIC0gTWF0aC5yb3VuZCh0bEFycmF5W2ldWydsZW5ndGgnXS8yKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQgPSB0bEFycmF5W2ldWydlbGVtZW50J107DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudFJlY2VpdmVyU3BlYyhmYWxzZSwgaSwgdGxBcnJheSwgZWxlbWVudFRvQmluZCk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dE5lZWR5TGVuZ3RoIDwgbG9jYWxNaWRkbGVWYWx1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudFRvQWRkLCBlbGVtZW50VG9CaW5kKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50VG9BZGQsIGVsZW1lbnRUb0JpbmQubmV4dFNpYmxpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZC5jbGFzc0xpc3QuYWRkKCdyYmluZGVyLScrYmluZGVyTmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LnJlbW92ZSgnY292ZXJlZEFkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIGNsZWFyVGxNYXJrcygpIHsNCiAgICAgICAgICAgIGxldCBtYXJrc0ZvckRlbGV0aW5nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRleHRMZW5ndGhNYXJrZXInKTsNCg0KICAgICAgICAgICAgaWYgKG1hcmtzRm9yRGVsZXRpbmcubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3NGb3JEZWxldGluZy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBtYXJrc0ZvckRlbGV0aW5nW2ldLnJlbW92ZSgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcmtlZFNwYW4iKSkgew0KICAgICAgICAgICAgaW5zZXJ0QnlQZXJjZW50cyh0ZXh0TGVuZ3RoKTsNCiAgICAgICAgICAgIGNsZWFyVGxNYXJrcygpOw0KICAgICAgICAgICAgdmFyIHNwYW5NYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7DQogICAgICAgICAgICBzcGFuTWFya2VyLnNldEF0dHJpYnV0ZSgiaWQiLCAibWFya2VkU3BhbiIpOw0KICAgICAgICAgICAgbG9yZE9mRWxlbWVudHMucHJlcGVuZChzcGFuTWFya2VyKTsNCiAgICAgICAgfQ0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgY29uc29sZS5sb2coZS5tZXNzYWdlKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIHNhdmVDb250ZW50QmxvY2soY29udGVudENvbnRhaW5lcikgew0KICAgIHRyeSB7DQogICAgICAgIGlmICghZ2F0aGVyX2NvbnRlbnQpIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb250ZW50IGdhdGhlciBzYXZlIGZ1bmN0aW9uIGVudGVyZWQnKTsNCiAgICAgICAgICAgIGxldCB4aHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KICAgICAgICAgICAgbGV0IHNlbmREYXRhID0gJ2FjdGlvbj1SRldQX3NhdmVDb250ZW50Q29udGFpbmVyJnR5cGU9Z2F0aGVyQ29udGVudEJsb2NrJmRhdGE9Jytjb250ZW50Q29udGFpbmVyOw0KICAgICAgICAgICAgeGh0dHAub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24ocmVkYXRhKSB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSA0ICYmIHRoaXMuc3RhdHVzID09IDIwMCkgew0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29udGVudCBnYXRoZXIgc3VjY2VlZCcpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb250ZW50IGdhdGhlciBnb25lIHdyb25nJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHhodHRwLm9wZW4oIlBPU1QiLCByYl9hamF4dXJsLCB0cnVlKTsNCiAgICAgICAgICAgIHhodHRwLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsNCiAgICAgICAgICAgIHhodHRwLnNlbmQoc2VuZERhdGEpOw0KICAgICAgICB9DQogICAgfSBjYXRjaCAoZXIpIHsNCiAgICAgICAgY29uc29sZS5sb2coJ2NvbnRlbnQgZ2F0aGVyIGVycm9yOiAnK2VyKyc7Jyk7DQogICAgfQ0KfQ0KDQp3aW5kb3cuZ2F0aGVyQ29udGVudEJsb2NrID0gZnVuY3Rpb24oKSB7DQogICAgbGV0IGNQb2ludGVyID0gbnVsbCwNCiAgICAgICAgY1BvaW50ZXJQYXJlbnQgPSBudWxsLA0KICAgICAgICBjUG9pbnRlclBhcmVudFN0cmluZyA9IG51bGwsDQogICAgICAgIGNsYXNzV29yZHMgPSBbJ2NvbnRlbnQnLCdlbnRyeScsJ3Bvc3QnLCd3cmFwJywnZGVzY3JpcHRpb24nLCd0YXhvbm9teSddLA0KICAgICAgICBjbGFzc0Nob29zZWQgPSBmYWxzZTsNCg0KICAgIGNQb2ludGVyID0gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50X3BvaW50ZXJfaWQnKTsNCiAgICBpZiAoY1BvaW50ZXIpIHsNCiAgICAgICAgaWYgKHdpbmRvdy5qc0lucHV0ZXJMYXVuY2ghPT0xNSkgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIGNQb2ludGVyUGFyZW50ID0gY1BvaW50ZXIucGFyZW50RWxlbWVudDsNCiAgICAgICAgaWYgKGNQb2ludGVyUGFyZW50KSB7DQogICAgICAgICAgICBpZiAoY1BvaW50ZXJQYXJlbnQuaWQpIHsNCiAgICAgICAgICAgICAgICBjUG9pbnRlclBhcmVudFN0cmluZyA9ICcjJytjUG9pbnRlclBhcmVudC5pZDsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgaWYgKGNQb2ludGVyUGFyZW50LmNsYXNzTGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIGNQb2ludGVyUGFyZW50U3RyaW5nID0gJy4nK2NQb2ludGVyUGFyZW50LmNsYXNzTGlzdFswXTsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjbGFzc1dvcmRzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNQb2ludGVyUGFyZW50LmNsYXNzTGlzdC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjUG9pbnRlclBhcmVudC5jbGFzc0xpc3RbaV0uaW5jbHVkZXMoY2xhc3NXb3Jkc1tqXSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1BvaW50ZXJQYXJlbnRTdHJpbmcgPSAnLicrY1BvaW50ZXJQYXJlbnQuY2xhc3NMaXN0W2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0Nob29zZWQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NDaG9vc2VkPT09dHJ1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGNQb2ludGVyUGFyZW50U3RyaW5nKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvbnRlbnQgZ2F0aGVyIGNvbnRlbnQgYmxvY2sgZGV0ZWN0ZWQnKTsNCiAgICAgICAgICAgICAgICAvKiBjUG9pbnRlclBhcmVudFN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGNQb2ludGVyUGFyZW50U3RyaW5nKTsgKi8NCiAgICAgICAgICAgICAgICBzYXZlQ29udGVudEJsb2NrKGNQb2ludGVyUGFyZW50U3RyaW5nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgIGNvbnNvbGUubG9nKCdjb250ZW50IGdhdGhlciBkZWxheWVkJyk7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgZ2F0aGVyQ29udGVudEJsb2NrKCk7DQogICAgICAgIH0sIDUwMCk7DQogICAgfQ0KfTsNCg0Kd2luZG93LnJlbW92ZU1hcmdpbkNsYXNzID0gZnVuY3Rpb24oYmxvY2tPYmplY3QpIHsNCiAgICBpZiAoYmxvY2tPYmplY3QgJiYgdHlwZW9mIHdpbmRvdy5qc0lucHV0ZXJMYXVuY2ggIT09ICd1bmRlZmluZWQnICYmIFsxNSwgMTBdLmluY2x1ZGVzKHdpbmRvdy5qc0lucHV0ZXJMYXVuY2gpKSB7DQogICAgICAgIGxldCBiaW5kZXJOYW1lLA0KICAgICAgICAgICAgbmVlZGVkRWxlbWVudCwNCiAgICAgICAgICAgIGN1cnJlbnREaXJlY3Rpb24sDQogICAgICAgICAgICBzZWVrZXJJdGVyYXRpb25Db3VudCwNCiAgICAgICAgICAgIGN1cnJlbnRTdWJsaW5nOw0KDQogICAgICAgIGJpbmRlck5hbWUgPSBibG9ja09iamVjdC5kYXRhc2V0LnJiaW5kZXI7DQogICAgICAgIGlmIChiaW5kZXJOYW1lKSB7DQogICAgICAgICAgICBzZWVrZXJJdGVyYXRpb25Db3VudCA9IDA7DQogICAgICAgICAgICBjdXJyZW50RGlyZWN0aW9uID0gJ2JlZm9yZSc7DQogICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgc2Vla2VySXRlcmF0aW9uQ291bnQrKzsNCiAgICAgICAgICAgICAgICBjdXJyZW50U3VibGluZyA9IGJsb2NrT2JqZWN0Lm5leHRFbGVtZW50U2libGluZzsNCiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN1YmxpbmcmJmN1cnJlbnRTdWJsaW5nLmNsYXNzTGlzdC5jb250YWlucygncmJpbmRlci0nK2JpbmRlck5hbWUpKSB7DQogICAgICAgICAgICAgICAgICAgIG5lZWRlZEVsZW1lbnQgPSBjdXJyZW50U3VibGluZzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IHdoaWxlIChjdXJyZW50U3VibGluZyYmIW5lZWRlZEVsZW1lbnQmJnNlZWtlckl0ZXJhdGlvbkNvdW50IDwgNSk7DQoNCiAgICAgICAgICAgIGlmICghbmVlZGVkRWxlbWVudCkgew0KICAgICAgICAgICAgICAgIHNlZWtlckl0ZXJhdGlvbkNvdW50ID0gMDsNCiAgICAgICAgICAgICAgICBjdXJyZW50RGlyZWN0aW9uID0gJ2FmdGVyJzsNCiAgICAgICAgICAgICAgICBkbyB7DQogICAgICAgICAgICAgICAgICAgIHNlZWtlckl0ZXJhdGlvbkNvdW50Kys7DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdWJsaW5nID0gYmxvY2tPYmplY3QucHJldmlvdXNFbGVtZW50U2libGluZzsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdWJsaW5nJiZjdXJyZW50U3VibGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ3JiaW5kZXItJytiaW5kZXJOYW1lKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkRWxlbWVudCA9IGN1cnJlbnRTdWJsaW5nOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSB3aGlsZSAoY3VycmVudFN1YmxpbmcmJiFuZWVkZWRFbGVtZW50JiZzZWVrZXJJdGVyYXRpb25Db3VudCA8IDUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKG5lZWRlZEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICBpZiAoY3VycmVudERpcmVjdGlvbiA9PT0gJ2JlZm9yZScpIHsNCiAgICAgICAgICAgICAgICAgICAgbmVlZGVkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdyZndwX3JlbW92ZWRNYXJnaW5Ub3AnKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBuZWVkZWRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Jmd3BfcmVtb3ZlZE1hcmdpbkJvdHRvbScpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBmYWxzZTsNCn07DQoNCmZ1bmN0aW9uIGVsZW1lbnRCaW5kZXJOYW1lR2VuZXJhdG9yKCkgew0KICAgIGxldCBiaW5kZXJOYW1lID0gJycsDQogICAgICAgIGNoZWNrZWRFbGVtZW50cywNCiAgICAgICAgcGFzc2VkID0gZmFsc2U7DQoNCiAgICB3aGlsZSAocGFzc2VkPT09ZmFsc2UpIHsNCiAgICAgICAgYmluZGVyTmFtZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxMDAwMDApOw0KICAgICAgICBjaGVja2VkRWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yYmluZGVyPSInK2JpbmRlck5hbWUrJyJdJyk7DQogICAgICAgIGlmIChjaGVja2VkRWxlbWVudHMubGVuZ3RoIDwgMSkgew0KICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBiaW5kZXJOYW1lOw0KfQo=
data:text/javascript;base64,DQogICAgdmFyIGJsb2NrX2NsYXNzZXMgPSBbImNvbnRlbnRfcmIiLCAiY250MzJfcmxfYmdfc3RyIiwgInJsX2NudF9iZyJdOw0KDQogICAgZnVuY3Rpb24gYWRkQXR0ckl0ZW0oY2xhc3NOYW1lKSB7DQogICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuIiArIGNsYXNzTmFtZSkgJiYgIWJsb2NrX2NsYXNzZXMuaW5jbHVkZXMoY2xhc3NOYW1lKSkgew0KICAgICAgICAgICAgYmxvY2tfY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7DQogICAgICAgIH0NCiAgICB9DQo=
data:text/javascript;base64,IChmdW5jdGlvbihtLGUsdCxyLGksayxhKXttW2ldPW1baV18fGZ1bmN0aW9uKCl7KG1baV0uYT1tW2ldLmF8fFtdKS5wdXNoKGFyZ3VtZW50cyl9OyBtW2ldLmw9MSpuZXcgRGF0ZSgpO2s9ZS5jcmVhdGVFbGVtZW50KHQpLGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXSxrLmFzeW5jPTEsay5zcmM9cixhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGssYSl9KSAod2luZG93LCBkb2N1bWVudCwgInNjcmlwdCIsICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3lhbmRleC1tZXRyaWNhLXdhdGNoL3RhZy5qcyIsICJ5bSIpOyB5bSg2NTg4NjU3MSwgImluaXQiLCB7IGNsaWNrbWFwOnRydWUsIHRyYWNrTGlua3M6dHJ1ZSwgYWNjdXJhdGVUcmFja0JvdW5jZTp0cnVlIH0pOyA=
data:text/javascript;base64,IHJiQ29uZmlnPXtzdGFydDpwZXJmb3JtYW5jZS5ub3coKSxyYkRvbWFpbjonbmV3cm90YXRvcm1hcmNoMjMuYmlkJyxyb3RhdG9yOicxdjk4Nid9O3Rva2VuPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCcxdjk4NicpfHwoMWU2KycnKS5yZXBsYWNlKC9bMDE4XS9nLCBjID0+IChjIF4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAxNSA+PiBjIC8gNCkudG9TdHJpbmcoMTYpKTtyc2RmaHNlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyByc2RmaHNlLnNldEF0dHJpYnV0ZSgnc3JjJywnLy9uZXdyb3RhdG9ybWFyY2gyMy5iaWQvMXY5ODYubWluLmpzPycrdG9rZW4pO3JzZGZoc2Uuc2V0QXR0cmlidXRlKCdhc3luYycsJ2FzeW5jJyk7cnNkZmhzZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCd0ZXh0L2phdmFzY3JpcHQnKTtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJzZGZoc2UpOyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnMXY5ODYnLCB0b2tlbik7
data:text/javascript;base64,Y29uc29sZS5sb2coJ2FkOiBudW4nKQ==
data:text/javascript;base64,d2luZG93LnlhQ29udGV4dENiPXdpbmRvdy55YUNvbnRleHRDYnx8W10=
data:text/javascript;base64,dmFyIHBzZXVkb19saW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5wc2V1ZG8tY2xlYXJmeS1saW5rIik7Zm9yICh2YXIgaT0wO2k8cHNldWRvX2xpbmtzLmxlbmd0aDtpKysgKSB7IHBzZXVkb19saW5rc1tpXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGUpeyAgIHdpbmRvdy5vcGVuKCBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtdXJpIikgKTsgfSk7IH0=
https://activefisher.net/wp-content/cache/autoptimize/js/autoptimize_single_2af90cd6a1f238d240eb712450f5f312.js?ver=1.0.6
https://activefisher.net/wp-content/cache/autoptimize/js/autoptimize_single_8ef4a8b28a5ffec13f8f73736aa98cba.js?ver=6.4.3
https://activefisher.net/wp-content/cache/autoptimize/js/autoptimize_single_90db5b8fdd2839962541055eac95df77.js?ver=1.4.1
https://activefisher.net/wp-content/cache/autoptimize/js/autoptimize_single_a91dcbb696a094d52a957e32f5220b05.js?ver=1.3
https://activefisher.net/wp-content/cache/autoptimize/js/autoptimize_single_b0e2018f157e4621904be9cb6edd6317.js?ver=6.4.3
https://activefisher.net/wp-content/cache/autoptimize/js/autoptimize_single_c43ab250dd171c1421949165eee5dc5e.js?ver=6.4.3
https://activefisher.net/wp-includes/js/imagesloaded.min.js?ver=5.0.0
https://activefisher.net/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1
https://activefisher.net/wp-includes/js/jquery/jquery.masonry.min.js?ver=3.1.2b
https://activefisher.net/wp-includes/js/jquery/jquery.min.js?ver=3.7.1
https://activefisher.net/wp-includes/js/masonry.min.js?ver=4.2.2
https://mxkikf.com/uz71l7/129ilv0mpy038qh/678/qvu678ykp81t.php
https://yandex.ru/ads/system/context.js
Внешние ссылки 2
Внутренние ссылки 211

meta-теги

viewportwidth=device-width, initial-scale=1
robotsindex, follow
googlebotindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1
bingbotindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1
msapplication-TileImagehttps://activefisher.net/wp-content/uploads/2020/11/cropped-activefisher-270x270.png

Скриншот сайта

Скриншота нет

Сервер сайта

IP адрес сайта 77.246.144.49
Веб-сервер nginx/1.16.1
Версия HTTP HTTP 2
DNS сервера dns2.eplanet.host
dns1.eplanet.host
dns3.eplanet.host
DNS записи 8
A записи
1: ip: 77.246.144.49
NS записи
2: target: dns2.eplanet.host
3: target: dns1.eplanet.host
4: target: dns3.eplanet.host
SOA записи
5: mname: rusichsamogon.ru
5: rname: root.rusichsamogon.ru
5: serial: 2020102700
5: refresh: 3600
5: retry: 3600
5: expire: 604800
5: minimum-ttl: 86400
MX записи
6: pri: 10
6: target: mail.activefisher.net
7: pri: 20
7: target: mail.activefisher.net
TXT записи
8: txt: v=spf1 ip4:77.246.145.43 a mx ~all
8: entries: 0: v=spf1 ip4:77.246.145.43 a mx ~all

Ответ сервера

Группы заголовков: заголовки безопасности, заголовки кэширования.
status HTTP/1.1 200 OK
server nginx/1.16.1
date Fri, 16 Feb 2024 05:42:32 GMT
content-type text/html; charset=UTF-8
transfer-encoding chunked
connection keep-alive
x-powered-by PHP/7.4.29
set-cookie PHPSESSID=9c834cb72ac814eab9fd468bed43ce48; path=/
expires Thu, 19 Nov 1981 08:52:00 GMT
cache-control no-store, no-cache, must-revalidate
pragma no-cache
strict-transport-security max-age=31536000;
x-rocket-nginx-serving-static No
content-encoding gzip

Оцените сайт

Не ставьте оценку если отвечаете на другой отзыв или пишите комментарий:

Можно добавить текст отзыва, ответ на другой отзыв, или просто комментарий к сайту:
captcha