Аудит

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

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

221

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

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

Содержимое

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

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

URL сайта https://class-tour.com/
Локализация сайта 2
https://class-tour.com/feed/
https://class-tour.com/comments/feed/
Кодировка страниц UTF-8
Тексты 49
HTML теги 457
a84 article30 body1 center1 comment5 div137 footer1 h11 h231 h41 head1 header1 html1 i4 img37 li17 link18 meta18 nav2 noscript1 p3 picture3 script31 source6 span7 style7 title1 ul6 unknown1
Скрипты на сайте 32
Обнаружены скрипты:
Яндекс.Метрика
Google AdSense
Все скрипты:
//hsgdyq.com/c3fl71291vil/m0p30y/hq8/786uvq/867kyppm.php
data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgam9oYW5uZXNfanNfc2V0dGluZ3MgPSB7InJ0bF9tb2RlIjoiIiwiaGVhZGVyX3N0aWNreSI6IiIsImhlYWRlcl9zdGlja3lfb2Zmc2V0IjoiMzAwIiwiaGVhZGVyX3N0aWNreV91cCI6IiIsInBvcHVwIjoiMSIsImdvX3RvX3RvcCI6IjEiLCJncmlkIjp7ImNvbHVtbiI6NTAsImd1dHRlciI6eyJ4cyI6MTUsInNtIjoxNSwibWQiOjMwLCJsZyI6MzAsInhsIjo0OH0sImJyZWFrcG9pbnQiOnsieHMiOjAsInNtIjozNzQsIm1kIjo2MDAsImxnIjo5MDAsInhsIjoxMTI4fX19OwovKiBdXT4gKi8K
data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp2YXIgcTJ3M19zaWRlYmFyX29wdGlvbnMgPSBbeyJ1c2Vfc3RpY2t5X3Bvc2l0aW9uIjpmYWxzZSwibWFyZ2luX3RvcCI6MTAsIm1hcmdpbl9ib3R0b20iOjAsInN0b3BfZWxlbWVudHNfc2VsZWN0b3JzIjoiIiwic2NyZWVuX21heF93aWR0aCI6MCwic2NyZWVuX21heF9oZWlnaHQiOjAsIndpZGdldHMiOltdfV07Ci8qIF1dPiAqLwo=
data:text/javascript;base64,CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvbkVycm9yUGxhY2luZygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhY2hlUGxhY2luZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNhY2hlUGxhY2luZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygd2luZG93LmpzSW5wdXRlckxhdW5jaCAhPT0gJ3VuZGVmaW5lZCcgJiYgWzE1LCAxMF0uaW5jbHVkZXMod2luZG93LmpzSW5wdXRlckxhdW5jaCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9ySW5mbyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVBsYWNpbmcoJ2xvdycsZXJyb3JJbmZvKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3JQbGFjaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICB4aHIub3BlbignR0VUJywiLy9uZXdyb3RhdG9ybWFyY2gyMy5iaWQvMXozdnEuanNvbiIsdHJ1ZSk7CiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOwogICAgICAgICAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzICE9IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1c1RleHQgIT0gJ2Fib3J0JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvclBsYWNpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB4aHIuc2VuZCgpOwogICAgICAgICAgICA=
data:text/javascript;base64,CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvbkVycm9yUGxhY2luZygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhY2hlUGxhY2luZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNhY2hlUGxhY2luZyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygd2luZG93LmpzSW5wdXRlckxhdW5jaCAhPT0gJ3VuZGVmaW5lZCcgJiYgWzE1LCAxMF0uaW5jbHVkZXMod2luZG93LmpzSW5wdXRlckxhdW5jaCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9ySW5mbyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVBsYWNpbmcoJ2xvdycsZXJyb3JJbmZvKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3JQbGFjaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICB4aHIub3BlbignR0VUJywiLy9uZXdyb3RhdG9ybWFyY2gyMy5iaWQvMXozdnEubWluLmpzIix0cnVlKTsKICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7CiAgICAgICAgICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgIT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzVGV4dCAhPSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yUGxhY2luZygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHhoci5zZW5kKCk7CiAgICAgICAgICAgIA==
data:text/javascript;base64,CmlmICh0eXBlb2YgcmJfYWpheHVybD09PSd1bmRlZmluZWQnKSB7dmFyIHJiX2FqYXh1cmwgPSAnaHR0cHM6Ly9jbGFzcy10b3VyLmNvbS93cC1hZG1pbi9hZG1pbi1hamF4LnBocCc7fQppZiAodHlwZW9mIGNhY2hlX2RldmljZXM9PT0ndW5kZWZpbmVkJykge3ZhciBjYWNoZV9kZXZpY2VzID0gZmFsc2U7fQp2YXIgblJlYWR5QmxvY2sgPSBmYWxzZTsNCnZhciBmZXRjaGVkQ291bnRlciA9IDA7DQoNCmZ1bmN0aW9uIHNlbmRSZWFkeUJsb2Nrc05ldyhibG9ja3MpIHsNCiAgICBpZiAoIWNhY2hlX2RldmljZXMpIHsNCiAgICAgICAgbGV0IHhodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7DQogICAgICAgIGxldCBzZW5kRGF0YSA9ICdhY3Rpb249c2F2ZUFkQmxvY2tzJnR5cGU9YmxvY2tzR2V0aGVyaW5nJmRhdGE9JytibG9ja3M7DQogICAgICAgIHhodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKHJlZGF0YSkgew0KICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSA0ICYmIHRoaXMuc3RhdHVzID09IDIwMCkgew0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjYWNoZSBzdWNjZWVkJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIHhodHRwLm9wZW4oIlBPU1QiLCByYl9hamF4dXJsLCB0cnVlKTsNCiAgICAgICAgeGh0dHAuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOw0KICAgICAgICB4aHR0cC5zZW5kKHNlbmREYXRhKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGdhdGhlclJlYWR5QmxvY2tzKCkgew0KICAgIGlmIChibG9ja19jbGFzc2VzICYmIGJsb2NrX2NsYXNzZXMubGVuZ3RoKSB7DQogICAgICAgIGxldCBibG9ja3MgPSB7fTsNCiAgICAgICAgbGV0IGNvdW50ZXIxID0gMDsNCiAgICAgICAgbGV0IGdhdGhlcmVkQmxvY2tzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLicgKyBibG9ja19jbGFzc2VzLmpvaW4oJywgLicpKTsNCiAgICAgICAgbGV0IGNoZWNrZXIgPSAwOw0KICAgICAgICBsZXQgYWRDb250ZW50ID0gJyc7DQogICAgICAgIGxldCBjdXJTdGF0ZSA9ICcnOw0KICAgICAgICBsZXQgdGhpc0RhdGEgPSBbXTsNCiAgICAgICAgbGV0IHN1bURhdGEgPSBbXTsNCiAgICAgICAgbGV0IG5ld0Jsb2NrcyA9ICcnOw0KICAgICAgICBsZXQgdGhpc0RhdGFTdHJpbmcgPSAnJzsNCg0KICAgICAgICBpZiAoZ2F0aGVyZWRCbG9ja3MubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgYmxvY2tzLmRhdGEgPSB7fTsNCg0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnYXRoZXJlZEJsb2Nrcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGN1clN0YXRlID0gZ2F0aGVyZWRCbG9ja3NbaV1bJ2RhdGFzZXQnXVsic3RhdGUiXS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgICAgIGNoZWNrZXIgPSAwOw0KICAgICAgICAgICAgICAgIGlmIChjdXJTdGF0ZSYmZ2F0aGVyZWRCbG9ja3NbaV1bJ2lubmVySFRNTCddLmxlbmd0aCA+IDAmJmdhdGhlcmVkQmxvY2tzW2ldWydkYXRhc2V0J11bJ2FpZCddID4gMCYmY3VyU3RhdGUhPSduby1ibG9jaycpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGdhdGhlcmVkQmxvY2tzW2ldWydpbm5lckhUTUwnXS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyID0gMTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tlcj09MSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLmRhdGFbY291bnRlcjFdID0ge2lkOmdhdGhlcmVkQmxvY2tzW2ldWydkYXRhc2V0J11bJ2lkJ10sY29kZTpnYXRoZXJlZEJsb2Nrc1tpXVsnZGF0YXNldCddWydhaWQnXX07DQogICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyMSsrOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBibG9ja3MgPSBKU09OLnN0cmluZ2lmeShibG9ja3MpOw0KICAgICAgICAgICAgc2VuZFJlYWR5QmxvY2tzTmV3KGJsb2Nrcyk7DQogICAgICAgIH0NCiAgICB9IGVsc2UgblJlYWR5QmxvY2sgPSB0cnVlOw0KfQ0KDQpmdW5jdGlvbiB0aW1lQmVmb3JlR2F0aGVyaW5nKCkgew0KICAgIGlmIChibG9ja19jbGFzc2VzICYmIGJsb2NrX2NsYXNzZXMubGVuZ3RoID4gMCkNCiAgICB7DQogICAgICAgIGxldCBnYXRoZXJlZEJsb2NrcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy4nICsgYmxvY2tfY2xhc3Nlcy5qb2luKCcsIC4nKSk7DQogICAgICAgIGxldCBva1N0YXRlcyA9IFsnZG9uZScsJ3JlZnJlc2gtd2FpdCcsJ25vLWJsb2NrJywnZmV0Y2hlZCddOw0KICAgICAgICBsZXQgY3VyU3RhdGUgPSAnJzsNCg0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdhdGhlcmVkQmxvY2tzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoIWdhdGhlcmVkQmxvY2tzW2ldWydkYXRhc2V0J11bInN0YXRlIl0pIHsNCiAgICAgICAgICAgICAgICBuUmVhZHlCbG9jayA9IHRydWU7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGN1clN0YXRlID0gZ2F0aGVyZWRCbG9ja3NbaV1bJ2RhdGFzZXQnXVsic3RhdGUiXS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgICAgIGlmICghb2tTdGF0ZXMuaW5jbHVkZXMoY3VyU3RhdGUpKSB7DQogICAgICAgICAgICAgICAgICAgIG5SZWFkeUJsb2NrID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJTdGF0ZT09J2ZldGNoZWQnJiZmZXRjaGVkQ291bnRlciA8IDMpIHsNCiAgICAgICAgICAgICAgICAgICAgZmV0Y2hlZENvdW50ZXIrKzsNCiAgICAgICAgICAgICAgICAgICAgblJlYWR5QmxvY2sgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgZWxzZSBuUmVhZHlCbG9jayA9IHRydWU7DQoNCiAgICBpZiAoblJlYWR5QmxvY2sgPT0gdHJ1ZSkgew0KICAgICAgICBuUmVhZHlCbG9jayA9IGZhbHNlOw0KICAgICAgICBzZXRUaW1lb3V0KHRpbWVCZWZvcmVHYXRoZXJpbmcsMjAwMCk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgZ2F0aGVyUmVhZHlCbG9ja3MoKTsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIGxhdW5jaFRpbWVCZWZvcmVHYXRoZXJpbmcoKSB7DQogICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgfHwgKGRvY3VtZW50LnJlYWR5U3RhdGUgIT09ICJsb2FkaW5nIiAmJiAhZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKSkgew0KICAgICAgICB0aW1lQmVmb3JlR2F0aGVyaW5nKCk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgc2V0VGltZW91dChsYXVuY2hUaW1lQmVmb3JlR2F0aGVyaW5nLDEwMCk7DQogICAgfQ0KfQ0KbGF1bmNoVGltZUJlZm9yZUdhdGhlcmluZygpOw0KCg==
data:text/javascript;base64,CmlmICh0eXBlb2YgcmJfYWpheHVybD09PSd1bmRlZmluZWQnKSB7dmFyIHJiX2FqYXh1cmwgPSAnaHR0cHM6Ly9jbGFzcy10b3VyLmNvbS93cC1hZG1pbi9hZG1pbi1hamF4LnBocCc7fQppZiAodHlwZW9mIGdhdGhlcl9jb250ZW50PT09J3VuZGVmaW5lZCcpIHt2YXIgZ2F0aGVyX2NvbnRlbnQgPSB0cnVlO30KaWYgKHR5cGVvZiBlbmRlZFNjPT09J3VuZGVmaW5lZCcpIHt2YXIgZW5kZWRTYyA9IGZhbHNlO30NCmlmICh0eXBlb2YgZW5kZWRDYz09PSd1bmRlZmluZWQnKSB7dmFyIGVuZGVkQ2MgPSBmYWxzZTt9DQppZiAodHlwZW9mIHVzZWRBZEJsb2Nrc0FycmF5PT09J3VuZGVmaW5lZCcpIHt2YXIgdXNlZEFkQmxvY2tzQXJyYXkgPSBbXTt9DQppZiAodHlwZW9mIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcz09PSd1bmRlZmluZWQnKSB7dmFyIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcyA9IFtdO30NCmlmICh0eXBlb2Ygc2FtZUVsZW1lbnRBZnRlcldpZHRoPT09J3VuZGVmaW5lZCcpIHt2YXIgc2FtZUVsZW1lbnRBZnRlcldpZHRoID0gZmFsc2U7fQ0KaWYgKHR5cGVvZiBzYW1lRWxlbWVudEFmdGVyRXhjQ2xhc3NJZD09PSd1bmRlZmluZWQnKSB7dmFyIHNhbWVFbGVtZW50QWZ0ZXJFeGNDbGFzc0lkID0gZmFsc2U7fQ0KaWYgKHR5cGVvZiBzYW1lRWxlbWVudEFmdGVyRnJvbUNvbnN0cnVjdGlvbj09PSd1bmRlZmluZWQnKSB7dmFyIHNhbWVFbGVtZW50QWZ0ZXJGcm9tQ29uc3RydWN0aW9uID0gZmFsc2U7fQ0KaWYgKHR5cGVvZiByYl90ZW1wRWxlbWVudF9jaGVjaz09PSd1bmRlZmluZWQnKSB7dmFyIHJiX3RlbXBFbGVtZW50X2NoZWNrID0gZmFsc2U7fQ0KaWYgKHR5cGVvZiByYl90ZW1wRWxlbWVudD09PSd1bmRlZmluZWQnKSB7dmFyIHJiX3RlbXBFbGVtZW50ID0gbnVsbDt9DQppZiAodHlwZW9mIHdpbmRvdy5qc0lucHV0ZXJMYXVuY2g9PT0ndW5kZWZpbmVkJykge3dpbmRvdy5qc0lucHV0ZXJMYXVuY2ggPSAtMTt9DQoNCmZ1bmN0aW9uIGxhdW5jaFVwZGF0ZVJiRGlzcGxheXMoKSB7DQogICAgaWYgKCh0eXBlb2YgdXBkYXRlUmJEaXNwbGF5cyAhPT0gJ3VuZGVmaW5lZCcpJiYodHlwZW9mIHVwZGF0ZVJiRGlzcGxheXMgPT09ICdmdW5jdGlvbicpKSB7DQogICAgICAgIHVwZGF0ZVJiRGlzcGxheXMoKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGxhdW5jaFVwZGF0ZVJiRGlzcGxheXMoKTsNCiAgICAgICAgfSwgMjAwKTsNCiAgICB9DQp9DQoNCi8qICJzYyIgaW4gdmFyaWFibGVzIC0gbWFyayBmb3Igc2hvcnRjb2RlIHZhcmlhYmxlICovDQpmdW5jdGlvbiBzaG9ydGNvZGVzSW5zZXJ0KCkgew0KICAgIGxldCBnYXRoZXJlZEJsb2NrcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZXJjZW50UG9pbnRlckNsYXNzLnNjTWFyaycpLA0KICAgICAgICBzY0Jsb2NrSWQgPSAtMSwNCiAgICAgICAgc2NBZElkID0gLTEsDQogICAgICAgIGJsb2NrU3RhdHVzID0gJycsDQogICAgICAgIGRhdGFGdWxsID0gLTEsDQogICAgICAgIGdhdGhlcmVkQmxvY2tDaGlsZCwNCiAgICAgICAgb2tTdGF0ZXMgPSBbJ2RvbmUnLCdyZWZyZXNoLXdhaXQnLCduby1ibG9jaycsJ2ZldGNoZWQnXSwNCiAgICAgICAgc2NDb250YWluZXIsDQogICAgICAgIHNjaSwNCiAgICAgICAgaTEgPSAwLA0KICAgICAgICBza3lzY3JhcGVyQ2hlY2sgPSBbXSwNCiAgICAgICAgc2t5c2NyYXBlclN0YXR1cyA9IGZhbHNlLA0KICAgICAgICBzcGxpdGVkU2t5c2NyYXBlciA9IFtdLA0KICAgICAgICBnYXRoZXJlZEJsb2NrQ2hpbGRTa3lQYXJ0cyA9IFtdLA0KICAgICAgICBzdGlja3lTdGF0dXMgPSBmYWxzZSwNCiAgICAgICAgc3RpY2t5Q2hlY2sgPSBbXSwNCiAgICAgICAgc3RpY2t5Rml4ZWRTdGF0dXMgPSBmYWxzZSwNCiAgICAgICAgc3RpY2t5Rml4ZWRDaGVjayA9IFtdLA0KICAgICAgICBvdmVyZmxvd0NoZWNrID0gW10sDQogICAgICAgIG92ZXJmbG93U3RhdHVzID0gZmFsc2UsDQogICAgICAgIHJlcGVhdGFibGVJZGVudGlmaWVyID0gIiIsDQogICAgICAgIGRhdGFDaWRJZGVudGlmaWVyID0gbnVsbCwNCiAgICAgICAgZGl2Q2lkRWxlbWVudCA9ICcnOw0KDQogICAgaWYgKHR5cGVvZiBzY0FycmF5ICE9PSAndW5kZWZpbmVkJykgew0KICAgICAgICBpZiAoc2NBcnJheSYmc2NBcnJheS5sZW5ndGggPiAwJiZnYXRoZXJlZEJsb2NrcyYmZ2F0aGVyZWRCbG9ja3MubGVuZ3RoID4gMCYmdHlwZW9mIHdpbmRvdy5ydWx2VzVnbnRiICE9PSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgZGF0YUNpZElkZW50aWZpZXIgPSB3aW5kb3cucnVsdlc1Z250YjsNCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2F0aGVyZWRCbG9ja3MubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBnYXRoZXJlZEJsb2NrQ2hpbGQgPSBnYXRoZXJlZEJsb2Nrc1tpXS5jaGlsZHJlblswXTsNCiAgICAgICAgICAgICAgICBpZiAoIWdhdGhlcmVkQmxvY2tDaGlsZCkgew0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgc2NBZElkID0gLTM7DQogICAgICAgICAgICAgICAgYmxvY2tTdGF0dXMgPSBudWxsOw0KICAgICAgICAgICAgICAgIHNjQ29udGFpbmVyID0gbnVsbDsNCiAgICAgICAgICAgICAgICBkYXRhRnVsbCA9IC0xOw0KICAgICAgICAgICAgICAgIHNreXNjcmFwZXJTdGF0dXMgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICBzcGxpdGVkU2t5c2NyYXBlciA9IFtdOw0KICAgICAgICAgICAgICAgIGdhdGhlcmVkQmxvY2tDaGlsZFNreVBhcnRzID0gW107DQogICAgICAgICAgICAgICAgc3RpY2t5U3RhdHVzID0gZmFsc2U7DQogICAgICAgICAgICAgICAgc3RpY2t5Q2hlY2sgPSBbXTsNCiAgICAgICAgICAgICAgICBzdGlja3lGaXhlZFN0YXR1cyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHN0aWNreUZpeGVkQ2hlY2sgPSBbXTsNCiAgICAgICAgICAgICAgICByZXBlYXRhYmxlSWRlbnRpZmllciA9ICIiOw0KICAgICAgICAgICAgICAgIGRpdkNpZEVsZW1lbnQgPSBudWxsOw0KDQogICAgICAgICAgICAgICAgc2NBZElkID0gZ2F0aGVyZWRCbG9ja0NoaWxkLmdldEF0dHJpYnV0ZSgnZGF0YS1haWQnKTsNCiAgICAgICAgICAgICAgICBzY0Jsb2NrSWQgPSBnYXRoZXJlZEJsb2NrQ2hpbGQuZ2V0QXR0cmlidXRlKCdkYXRhLWlkJyk7DQogICAgICAgICAgICAgICAgYmxvY2tTdGF0dXMgPSBnYXRoZXJlZEJsb2NrQ2hpbGQuZ2V0QXR0cmlidXRlKCdkYXRhLXN0YXRlJyk7DQogICAgICAgICAgICAgICAgZGF0YUZ1bGwgPSBnYXRoZXJlZEJsb2NrQ2hpbGQuZ2V0QXR0cmlidXRlKCdkYXRhLWZ1bGwnKTsNCg0KICAgICAgICAgICAgICAgIGlmIChzY0Jsb2NrSWQmJnNjQWRJZCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgc2NpID0gLTE7DQogICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHNjQXJyYXkubGVuZ3RoOyBpMSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NCbG9ja0lkID09IHNjQXJyYXlbaTFdWydibG9ja0lkJ10mJnNjQWRJZCA9PSBzY0FycmF5W2kxXVsnYWRJZCddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpID0gaTE7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpZiAoc2NpID4gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja1N0YXR1cyYmb2tTdGF0ZXMuaW5jbHVkZXMoYmxvY2tTdGF0dXMpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrU3RhdHVzPT0nbm8tYmxvY2snKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdGhlcmVkQmxvY2tDaGlsZC5pbm5lckhUTUwgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChibG9ja1N0YXR1cz09J2ZldGNoZWQnJiZkYXRhRnVsbD09MSl8fCFbJ25vLWJsb2NrJywnZmV0Y2hlZCddLmluY2x1ZGVzKGJsb2NrU3RhdHVzKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBjbDEgPSAwOyBjbDEgPCBnYXRoZXJlZEJsb2Nrc1tpXS5jbGFzc0xpc3QubGVuZ3RoOyBjbDErKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdhdGhlcmVkQmxvY2tzW2ldLmNsYXNzTGlzdFtjbDFdLmluY2x1ZGVzKCJyZXBlYXRhYmxlLW1hcmsiKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGFibGVJZGVudGlmaWVyID0gZ2F0aGVyZWRCbG9ja3NbaV0uY2xhc3NMaXN0W2NsMV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwZWF0YWJsZUlkZW50aWZpZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkNpZEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucGVyY2VudFBvaW50ZXJDbGFzcy5zY01hcmsuIityZXBlYXRhYmxlSWRlbnRpZmllcisnIGRpdltkYXRhLWNpZD0iJytkYXRhQ2lkSWRlbnRpZmllcisnIl0nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdkNpZEVsZW1lbnQgPSBnYXRoZXJlZEJsb2NrQ2hpbGQucXVlcnlTZWxlY3RvckFsbCgnZGl2W2RhdGEtY2lkPSInK2RhdGFDaWRJZGVudGlmaWVyKyciXScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHQgPSBzY0FycmF5W3NjaV1bJ3RleHQnXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpdkNpZEVsZW1lbnQmJmRpdkNpZEVsZW1lbnQubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTIgPSAwOyBpMiA8IGRpdkNpZEVsZW1lbnQubGVuZ3RoOyBpMisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KGRpdkNpZEVsZW1lbnRbaTJdKS5odG1sKHRleHQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KGdhdGhlcmVkQmxvY2tDaGlsZCkuaHRtbCh0ZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2hVcGRhdGVSYkRpc3BsYXlzKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja1N0YXR1cyE9J2ZldGNoZWQnfHwoYmxvY2tTdGF0dXM9PSdmZXRjaGVkJyYmZGF0YUZ1bGw9PTEpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTEgPSAwOyBpMSA8IHNjQXJyYXkubGVuZ3RoOyBpMSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NCbG9ja0lkID09IHNjQXJyYXlbaTFdWydibG9ja0lkJ10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY0FycmF5LnNwbGljZShpMSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTEtLTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXRoZXJlZEJsb2Nrc1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdzY01hcmsnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjQmxvY2tJZCYmc2NBZElkIDwgMSYmWyduby1ibG9jaycsJ2ZldGNoZWQnXS5pbmNsdWRlcyhibG9ja1N0YXR1cykpIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpMSA9IDA7IGkxIDwgc2NBcnJheS5sZW5ndGg7IGkxKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY0Jsb2NrSWQgPT0gc2NBcnJheVtpMV1bJ2Jsb2NrSWQnXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjQXJyYXkuc3BsaWNlKGkxLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMS0tOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGdhdGhlcmVkQmxvY2tzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ3NjTWFyaycpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIGlmICghc2NBcnJheXx8KHNjQXJyYXkmJnNjQXJyYXkubGVuZ3RoIDwgMSkpIHsNCiAgICAgICAgICAgIGVuZGVkU2MgPSB0cnVlOw0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgZW5kZWRTYyA9IHRydWU7DQogICAgfQ0KDQogICAgaWYgKCFlbmRlZFNjKSB7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgc2hvcnRjb2Rlc0luc2VydCgpOw0KICAgICAgICB9LCAyMDApOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gY2xlYXJVbnN1aXRhYmxlQ2FjaGUoY3VjX2NvdSkgew0KICAgIGxldCBzY0FkSWQgPSAtMTsNCiAgICBsZXQgY2NSZXBlYXQgPSBmYWxzZTsNCg0KICAgIGxldCBnYXRoZXJlZEJsb2NrcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZXJjZW50UG9pbnRlckNsYXNzIC4nICsgYmxvY2tfY2xhc3Nlcy5qb2luKCcsIC5wZXJjZW50UG9pbnRlckNsYXNzIC4nKSk7DQoNCiAgICBpZiAoZ2F0aGVyZWRCbG9ja3MmJmdhdGhlcmVkQmxvY2tzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnYXRoZXJlZEJsb2Nrcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKGdhdGhlcmVkQmxvY2tzW2ldWydkYXRhc2V0J11bJ2FpZCddJiZnYXRoZXJlZEJsb2Nrc1tpXVsnZGF0YXNldCddWydhaWQnXSA8IDApIHsNCiAgICAgICAgICAgICAgICBpZiAoKGdhdGhlcmVkQmxvY2tzW2ldWydkYXRhc2V0J11bInN0YXRlIl09PSduby1ibG9jaycpfHwoWydkb25lJywnZmV0Y2hlZCcsJ3JlZnJlc2gtd2FpdCddLmluY2x1ZGVzKGdhdGhlcmVkQmxvY2tzW2ldWydkYXRhc2V0J11bInN0YXRlIl0pKSkgew0KICAgICAgICAgICAgICAgICAgICBnYXRoZXJlZEJsb2Nrc1tpXVsnaW5uZXJIVE1MJ10gPSAnJzsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBjY1JlcGVhdCA9IHRydWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIGlmICghZ2F0aGVyZWRCbG9ja3NbaV1bJ2RhdGFzZXQnXVsnYWlkJ10pIHsNCiAgICAgICAgICAgICAgICBjY1JlcGVhdCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGN1Y19jb3UgPCA1MCkgew0KICAgICAgICAgICAgaWYgKGNjUmVwZWF0KSB7DQogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIGNsZWFyVW5zdWl0YWJsZUNhY2hlKGN1Y19jb3UrMSk7DQogICAgICAgICAgICAgICAgfSwgMTAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVuZGVkQ2MgPSB0cnVlOw0KICAgICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgICAgZW5kZWRDYyA9IHRydWU7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBibG9ja3NSZXBvc2l0aW9uVXNlKGNvbnRhaW5lclN0cmluZywgYmxUeXBlLCBzZWFyY2hUeXBlLCBjb250ZW50RWxlbWVudCkgew0KICAgIGxldCBibG9ja3NJbkNvbnRhaW5lcjsNCiAgICBsZXQgYmxMb2NhbCA9IGJsVHlwZTsNCiAgICBsZXQgY3VycmVudEJsb2NrOw0KICAgIGxldCBjdXJyZW50QmxvY2tJZDsNCiAgICBsZXQgY3VycmVudEJsb2NrUG9zaXRpb247DQogICAgbGV0IGN1cnJlbnRDb250YWluZXI7DQogICAgbGV0IGkgPSAwOw0KICAgIGxldCBqID0gMDsNCiAgICBsZXQgYmxvY2tTdHJKcyA9ICcgLnBlcmNlbnRQb2ludGVyQ2xhc3MubWFya2VkJzsNCiAgICBsZXQgYmxvY2tTdHJQaHAgPSAnIC5wZXJjZW50UG9pbnRlckNsYXNzOm5vdCgubWFya2VkKSc7DQogICAgbGV0IGJsb2NrU3RyID0gJyAucGVyY2VudFBvaW50ZXJDbGFzcyc7DQogICAgbGV0IGNoZWNrUG9pbnRlciA9IG51bGw7DQogICAgbGV0IGJsb2NrUmVwZWF0RW5kID0gZmFsc2U7DQoNCiAgICBpZiAoc2VhcmNoVHlwZSkgew0KICAgICAgICBpZiAoc2VhcmNoVHlwZSA9PSAnbWFya2VkJykgew0KICAgICAgICAgICAgd2hpbGUgKCFibG9ja1JlcGVhdEVuZCkgew0KICAgICAgICAgICAgICAgIGJsTG9jYWwgPSBibExvY2FsLnBhcmVudEVsZW1lbnQ7DQogICAgICAgICAgICAgICAgaWYgKGJsTG9jYWwpIHsNCiAgICAgICAgICAgICAgICAgICAgY2hlY2tQb2ludGVyID0gYmxMb2NhbC5xdWVyeVNlbGVjdG9yKCIjY29udGVudF9wb2ludGVyX2lkIik7DQogICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tQb2ludGVyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NJbkNvbnRhaW5lciA9IGpRdWVyeShibExvY2FsKS5wYXJlbnQoY29udGFpbmVyU3RyaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja3NJbkNvbnRhaW5lciAmJiBibG9ja3NJbkNvbnRhaW5lci5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2tQb2ludGVyID0gYmxvY2tzSW5Db250YWluZXIucXVlcnlTZWxlY3RvcigiI2NvbnRlbnRfcG9pbnRlcl9pZCIpOyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUG9pbnRlciA9IGpRdWVyeShibG9ja3NJbkNvbnRhaW5lcikuZmluZCgiI2NvbnRlbnRfcG9pbnRlcl9pZCIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja1BvaW50ZXIgJiYgY2hlY2tQb2ludGVyLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzSW5Db250YWluZXIgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1JlcGVhdEVuZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBibG9ja1JlcGVhdEVuZCA9IHRydWUNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGJsb2NrUmVwZWF0RW5kID0gdHJ1ZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8qIGJsb2Nrc0luQ29udGFpbmVyID0galF1ZXJ5KGJsVHlwZSkucGFyZW50KGNvbnRhaW5lclN0cmluZyk7ICovDQogICAgICAgICAgICBpZiAoYmxvY2tzSW5Db250YWluZXImJmJsb2Nrc0luQ29udGFpbmVyLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAvKiBibG9ja3NJbkNvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyYl90ZW1wRWxlbWVudCwgYmxvY2tzSW5Db250YWluZXIpOyAqLw0KICAgICAgICAgICAgICAgIGJsb2Nrc0luQ29udGFpbmVyWzBdLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHJiX3RlbXBFbGVtZW50LCBibG9ja3NJbkNvbnRhaW5lclswXSk7DQoNCiAgICAgICAgICAgICAgICBzYW1lRWxlbWVudEFmdGVyRXhjQ2xhc3NJZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3NJbkNvbnRhaW5lclswXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBibFR5cGU7DQogICAgICAgIH0gZWxzZSBpZiAoc2VhcmNoVHlwZSA9PSAnbm9uLW1hcmtlZCcpIHsNCiAgICAgICAgICAgIGJsb2Nrc0luQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChibFR5cGUgKyBjb250YWluZXJTdHJpbmcgKyBibG9ja1N0clBocCk7DQogICAgICAgICAgICBpZiAoYmxvY2tzSW5Db250YWluZXIgJiYgYmxvY2tzSW5Db250YWluZXIubGVuZ3RoID4gMCAmJiB1c2VkQmxvY2tTZXR0aW5nQXJyYXkgJiYgdXNlZEJsb2NrU2V0dGluZ0FycmF5Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tzSW5Db250YWluZXIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrID0gYmxvY2tzSW5Db250YWluZXJbaV07DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9ja0lkID0gY3VycmVudEJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy4nICsgYmxvY2tfY2xhc3Nlcy5qb2luKCcsIC4nKSkuZ2V0QXR0cmlidXRlKCdkYXRhLWlkJyk7DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdXNlZEJsb2NrU2V0dGluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlZEJsb2NrU2V0dGluZ0FycmF5W2ldWydpZCddID09IGN1cnJlbnRCbG9ja0lkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrUG9zaXRpb24gPSB1c2VkQmxvY2tTZXR0aW5nQXJyYXlbaV1bJ2VsZW1lbnRQb3NpdGlvbiddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIgPSBjdXJyZW50QmxvY2suY2xvc2VzdChibFR5cGUgKyBjb250YWluZXJTdHJpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmxvY2tQb3NpdGlvbiA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY3VycmVudEJsb2NrLCBjdXJyZW50Q29udGFpbmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGN1cnJlbnRCbG9jaywgY3VycmVudENvbnRhaW5lci5uZXh0U2libGluZyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gY3JlYXRlU3R5bGVFbGVtZW50KGJsb2NrTnVtYmVyLCBsb2NhbEVsZW1lbnRDc3MpIHsNCiAgICBsZXQgaHRtbFRvQWRkID0gJyc7DQogICAgbGV0IG1hcmdpblN0cmluZzsNCiAgICBsZXQgdGV4dEFsaWduU3RyaW5nOw0KICAgIGxldCBjb250UG9pOw0KICAgIGxldCBlbXB0eVZhbHVlcyA9IGZhbHNlOw0KICAgIGxldCBlbGVtZW50VG9BZGRTdHlsZUxvY2FsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2Jsb2Nrc0FsaWduU3R5bGUnKTsNCiAgICBpZiAoIWVsZW1lbnRUb0FkZFN0eWxlTG9jYWwpIHsNCiAgICAgICAgY29udFBvaSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250ZW50X3BvaW50ZXJfaWQnKTsNCiAgICAgICAgaWYgKCFjb250UG9pKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICBlbGVtZW50VG9BZGRTdHlsZUxvY2FsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCiAgICAgICAgZWxlbWVudFRvQWRkU3R5bGVMb2NhbC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2Jsb2Nrc0FsaWduU3R5bGUnKTsNCiAgICAgICAgY29udFBvaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50VG9BZGRTdHlsZUxvY2FsLCBjb250UG9pKTsNCiAgICB9DQoNCiAgICBzd2l0Y2ggKGxvY2FsRWxlbWVudENzcykgew0KICAgICAgICBjYXNlICdsZWZ0JzoNCiAgICAgICAgICAgIGVtcHR5VmFsdWVzID0gZmFsc2U7DQogICAgICAgICAgICBtYXJnaW5TdHJpbmcgPSAnMCBhdXRvIDAgMCc7DQogICAgICAgICAgICB0ZXh0QWxpZ25TdHJpbmcgPSAnbGVmdCc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAncmlnaHQnOg0KICAgICAgICAgICAgZW1wdHlWYWx1ZXMgPSBmYWxzZTsNCiAgICAgICAgICAgIG1hcmdpblN0cmluZyA9ICcwIDAgMCBhdXRvJzsNCiAgICAgICAgICAgIHRleHRBbGlnblN0cmluZyA9ICdyaWdodCc7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnY2VudGVyJzoNCiAgICAgICAgICAgIGVtcHR5VmFsdWVzID0gZmFsc2U7DQogICAgICAgICAgICBtYXJnaW5TdHJpbmcgPSAnMCBhdXRvJzsNCiAgICAgICAgICAgIHRleHRBbGlnblN0cmluZyA9ICdjZW50ZXInOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ2RlZmF1bHQnOg0KICAgICAgICAgICAgZW1wdHlWYWx1ZXMgPSB0cnVlOw0KICAgICAgICAgICAgbWFyZ2luU3RyaW5nID0gJ2RlZmF1bHQnOw0KICAgICAgICAgICAgdGV4dEFsaWduU3RyaW5nID0gJ2RlZmF1bHQnOw0KICAgICAgICAgICAgLyoqIGhlcmUgd2lsbCBiZSBjc3MgKi8NCiAgICAgICAgICAgIGJyZWFrOw0KICAgIH0NCiAgICBpZiAoIWVtcHR5VmFsdWVzKSB7DQogICAgICAgIGh0bWxUb0FkZCA9ICcucGVyY2VudFBvaW50ZXJDbGFzcyAgPiAqW2RhdGEtaWQ9IicrYmxvY2tOdW1iZXIrJyJdIHtcbicgKw0KICAgICAgICAgICAgJyAgICBtYXJnaW46ICcrbWFyZ2luU3RyaW5nKyc7XG4nICsNCiAgICAgICAgICAgICd9XG4nOw0KICAgIH0NCg0KICAgIGVsZW1lbnRUb0FkZFN0eWxlTG9jYWwuaW5uZXJIVE1MICs9IGh0bWxUb0FkZDsNCiAgICByZXR1cm4gdGV4dEFsaWduU3RyaW5nOw0KfQ0KDQpmdW5jdGlvbiBpbml0VGFyZ2V0VG9JbnNlcnQocG9zaXRpb24sIHR5cGUsIGN1cnJlbnRFbGVtZW50KSB7DQogICAgbGV0IHBvc0N1cnJlbnRFbGVtZW50Ow0KICAgIGxldCB1c2VkRWxlbWVudDsNCiAgICBpZiAodHlwZSA9PSAnZWxlbWVudCcpIHsNCiAgICAgICAgaWYgKHBvc2l0aW9uID09IDApIHsNCiAgICAgICAgICAgIHBvc0N1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQ7DQogICAgICAgICAgICBpZiAoISh0eXBlb2Ygb2JsaWdhdG9yeU1hcmdpbiE9PSd1bmRlZmluZWQnJiZvYmxpZ2F0b3J5TWFyZ2luPT09MSkpIHsNCiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyZndwX3JlbW92ZWRNYXJnaW5Ub3AnKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHBvc0N1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQubmV4dFNpYmxpbmc7DQogICAgICAgICAgICBpZiAoISh0eXBlb2Ygb2JsaWdhdG9yeU1hcmdpbiE9PSd1bmRlZmluZWQnJiZvYmxpZ2F0b3J5TWFyZ2luPT09MSkpIHsNCiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyZndwX3JlbW92ZWRNYXJnaW5Cb3R0b20nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBjdXJyZW50RWxlbWVudC5zdHlsZS5jbGVhciA9ICdib3RoJzsNCiAgICB9IGVsc2Ugew0KICAgICAgICB1c2VkRWxlbWVudCA9IGN1cnJlbnRFbGVtZW50Ow0KICAgICAgICBpZiAocG9zaXRpb24gPT0gMCkgew0KICAgICAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSB1c2VkRWxlbWVudDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHBvc0N1cnJlbnRFbGVtZW50ID0gdXNlZEVsZW1lbnQubmV4dFNpYmxpbmc7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHBvc0N1cnJlbnRFbGVtZW50Ow0KfQ0KDQpmdW5jdGlvbiBjaGVja0Fkc1dpZHRoKGNvbnRlbnRfcG9pbnRlciwgcG9zQ3VycmVudEVsZW1lbnQsIGN1cnJlbnRFbGVtZW50KSB7DQogICAgbGV0IHdpZHRoQ2hlY2tlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN3aWR0aENoZWNrZXInKTsNCiAgICBsZXQgd2lkdGhDaGVja2VyU3R5bGUgPSBudWxsOw0KICAgIGxldCBjb250ZW50X3BvaW50ZXJTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoY29udGVudF9wb2ludGVyKTsNCiAgICAvKiBsZXQgZ2V0UG9zaXRpb25Gb3JUZW1wRWxlbWVudCA9IG51bGw7DQogICAgbGV0IHRlc3RJbWdEZXRlY3RlZCA9IGZhbHNlOw0KICAgIGxldCB0ZXN0SW1nOw0KICAgIGxldCB0ZXN0SW1hZ2VDb21wV2lkdGg7DQogICAgbGV0IHRlc3RJbWdDb3UgPSAwDQogICAgbGV0IGZpZ3VyZUNoaWxkczsNCiAgICBsZXQgZmlndXJlQ29tV2lkdGg7DQogICAgbGV0IGZjQ291ID0gMDsgKi8NCiAgICBsZXQgY29udGVudCA9IGNvbnRlbnRfcG9pbnRlci5wYXJlbnRFbGVtZW50Ow0KDQogICAgaWYgKCF3aWR0aENoZWNrZXIpIHsNCiAgICAgICAgd2lkdGhDaGVja2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgIHdpZHRoQ2hlY2tlci5zZXRBdHRyaWJ1dGUoJ2lkJywnd2lkdGhDaGVja2VyJyk7DQogICAgICAgIHdpZHRoQ2hlY2tlci5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOw0KICAgIH0NCg0KICAgIGlmIChjb250ZW50KSB7DQogICAgICAgIHBvc0N1cnJlbnRFbGVtZW50ID0gaW5pdFRhcmdldFRvSW5zZXJ0KHBvc0N1cnJlbnRFbGVtZW50LCAndGVybScsIGN1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUod2lkdGhDaGVja2VyLCBwb3NDdXJyZW50RWxlbWVudCk7DQogICAgICAgIHdpZHRoQ2hlY2tlclN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSh3aWR0aENoZWNrZXIpOw0KICAgICAgICAvKiB0ZXN0SW1nID0gY3VycmVudEVsZW1lbnQucHJldmlvdXNTaWJsaW5nOw0KICAgICAgICBpZiAodGVzdEltZykgew0KICAgICAgICAgICAgd2hpbGUgKCF0ZXN0SW1nRGV0ZWN0ZWQmJnRlc3RJbWdDb3U8NCkgew0KICAgICAgICAgICAgICAgIGlmICh0ZXN0SW1nJiZ0ZXN0SW1nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdmaWd1cmUnKSB7DQogICAgICAgICAgICAgICAgICAgIGZpZ3VyZUNvbVdpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZSh0ZXN0SW1nKTsNCiAgICAgICAgICAgICAgICAgICAgZmlndXJlQ29tV2lkdGggPSBwYXJzZUludChmaWd1cmVDb21XaWR0aC53aWR0aCk7DQogICAgICAgICAgICAgICAgICAgIGZpZ3VyZUNoaWxkcyA9IHRlc3RJbWcuY2hpbGROb2RlczsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZ3VyZUNoaWxkcyYmZmlndXJlQ2hpbGRzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghdGVzdEltZ0RldGVjdGVkJiZmaWd1cmVDaGlsZHNbZmNDb3VdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZ3VyZUNoaWxkc1tmY0NvdV0gaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RJbWdEZXRlY3RlZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RJbWFnZUNvbXBXaWR0aCA9IGdldENvbXB1dGVkU3R5bGUoZmlndXJlQ2hpbGRzW2ZjQ291XSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RJbWFnZUNvbXBXaWR0aCA9IHBhcnNlSW50KHRlc3RJbWFnZUNvbXBXaWR0aC53aWR0aCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdpbWdfZl93OicrZmlndXJlQ29tV2lkdGgrJzsgaW1nX3c6Jyt0ZXN0SW1hZ2VDb21wV2lkdGgrJzsnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNDb3UrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAodGVzdEltZyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgdGVzdEltZ0RldGVjdGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgdGVzdEltYWdlQ29tcFdpZHRoID0gZ2V0Q29tcHV0ZWRTdHlsZSh0ZXN0SW1nKTsNCiAgICAgICAgICAgICAgICAgICAgdGVzdEltYWdlQ29tcFdpZHRoID0gcGFyc2VJbnQodGVzdEltYWdlQ29tcFdpZHRoLndpZHRoKTsNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2ltZ193OicrdGVzdEltYWdlQ29tcFdpZHRoKyc7Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmICghdGVzdEltZy5wcmV2aW91c1NpYmxpbmcpIHsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRlc3RJbWcgPSB0ZXN0SW1nLnByZXZpb3VzU2libGluZzsNCiAgICAgICAgICAgICAgICB0ZXN0SW1nQ291Kys7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgY29uc29sZS5sb2coJ2NwX3c6JytwYXJzZUludChjb250ZW50X3BvaW50ZXJTdHlsZS53aWR0aCkrJzsgd2NfdzonK3BhcnNlSW50KHdpZHRoQ2hlY2tlclN0eWxlLndpZHRoKSsnOycpOyAqLw0KICAgICAgICBpZiAocGFyc2VJbnQod2lkdGhDaGVja2VyU3R5bGUud2lkdGgpID49IChwYXJzZUludChjb250ZW50X3BvaW50ZXJTdHlsZS53aWR0aCkgLSA1MCkpIHsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9DQogICAgfQ0KICAgIGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHJiX3RlbXBFbGVtZW50LCBjdXJyZW50RWxlbWVudC5uZXh0U2libGluZyk7DQogICAgcmJfdGVtcEVsZW1lbnRfY2hlY2sgPSB0cnVlOw0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KLyogZnVuY3Rpb24gY3VycmVudEVsZW1lbnRSZWNlaXZlcihyZXZlcnQsIGN1clN1bSwgZWxMaXN0LCBjdXJyZW50RWxlbWVudCkgew0KICAgIGxldCBvcmlnQ3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsNCiAgICBsZXQgY29udGVudF9wb2ludGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2NvbnRlbnRfcG9pbnRlcl9pZCIpOw0KICAgIGxldCBzYW1lRWxlbWVudEFmdGVyV2lkdGggPSBmYWxzZTsNCiAgICBsZXQgdGVzdENvdSA9IDA7DQogICAgd2hpbGUgKGVsTGlzdFtjdXJTdW1dJiZzYW1lRWxlbWVudEFmdGVyV2lkdGg9PWZhbHNlJiZ0ZXN0Q291IDwgNSkgew0KICAgICAgICBjdXJyZW50RWxlbWVudCA9IGVsTGlzdFtjdXJTdW1dOw0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlcldpZHRoPXRydWU7DQogICAgICAgICAgICBzYW1lRWxlbWVudEFmdGVyV2lkdGggPSBjaGVja0Fkc1dpZHRoKGNvbnRlbnRfcG9pbnRlciwgMCwgY3VycmVudEVsZW1lbnQpOw0KICAgICAgICB9IGNhdGNoIChleCkgew0KICAgICAgICAgICAgY29uc29sZS5sb2coZXgubWVzc2FnZSk7DQogICAgICAgIH0NCiAgICAgICAgcmV2ZXJ0PyBjdXJTdW0tLTogY3VyU3VtKys7DQogICAgICAgIHRlc3RDb3UrKzsNCiAgICB9DQogICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50P2N1cnJlbnRFbGVtZW50Om9yaWdDdXJyZW50RWxlbWVudDsNCn0gKi8NCg0KZnVuY3Rpb24gY3VycmVudEVsZW1lbnRSZWNlaXZlclNwZWMocmV2ZXJ0LCBjdXJTdW0sIGVsTGlzdCwgY3VycmVudEVsZW1lbnQpIHsNCiAgICBsZXQgb3JpZ0N1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQ7DQogICAgbGV0IGNvbnRlbnRfcG9pbnRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNjb250ZW50X3BvaW50ZXJfaWQiKTsgLyogb3JpZyAqLw0KICAgIGxldCBzYW1lRWxlbWVudEFmdGVyV2lkdGggPSBmYWxzZTsNCiAgICBsZXQgdGVzdENvdSA9IDA7DQogICAgd2hpbGUgKGVsTGlzdFtjdXJTdW1dJiZzYW1lRWxlbWVudEFmdGVyV2lkdGg9PWZhbHNlJiZ0ZXN0Q291IDwgNSkgew0KICAgICAgICBjdXJyZW50RWxlbWVudCA9IGVsTGlzdFtjdXJTdW1dWydlbGVtZW50J107DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBzYW1lRWxlbWVudEFmdGVyV2lkdGg9dHJ1ZTsNCiAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCA9IGNoZWNrQWRzV2lkdGgoY29udGVudF9wb2ludGVyLCAwLCBjdXJyZW50RWxlbWVudCk7DQogICAgICAgIH0gY2F0Y2ggKGV4KSB7DQogICAgICAgICAgICBjb25zb2xlLmxvZyhleC5tZXNzYWdlKTsNCiAgICAgICAgfQ0KICAgICAgICByZXZlcnQ/IGN1clN1bS0tOiBjdXJTdW0rKzsNCiAgICAgICAgdGVzdENvdSsrOw0KICAgIH0NCiAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ/Y3VycmVudEVsZW1lbnQ6b3JpZ0N1cnJlbnRFbGVtZW50Ow0KfQ0KDQpmdW5jdGlvbiBleGNJZENsVW5wYWNrZXIoKSB7DQogICAgbGV0IGV4Y0FyciA9IFtdLA0KICAgICAgICBjb3UgPSAwLA0KICAgICAgICBjdXJyRXhjU3RyID0gJycsDQogICAgICAgIGN1ckV4Y0ZpcnN0ID0gJyc7DQogICAgZXhjQXJyWydpZCddID0gW107DQogICAgZXhjQXJyWydjbGFzcyddID0gW107DQogICAgZXhjQXJyWyd0YWcnXSA9IFtdOw0KICAgIGlmIChleGNJZENsYXNzJiZleGNJZENsYXNzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgd2hpbGUgKGV4Y0lkQ2xhc3NbY291XSkgew0KICAgICAgICAgICAgY3VyckV4Y1N0ciA9IGV4Y0lkQ2xhc3NbY291XTsNCiAgICAgICAgICAgIGlmIChjdXJyRXhjU3RyLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICBjdXJFeGNGaXJzdCA9IGN1cnJFeGNTdHIuc3Vic3RyaW5nKDAsMSk7DQogICAgICAgICAgICAgICAgc3dpdGNoIChjdXJFeGNGaXJzdCkgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICcjJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyRXhjU3RyLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyRXhjU3RyID0gY3VyckV4Y1N0ci5zdWJzdHJpbmcoMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjQXJyWydpZCddLnB1c2goY3VyckV4Y1N0cik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnLic6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyckV4Y1N0ci5sZW5ndGggPiAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyckV4Y1N0ciA9IGN1cnJFeGNTdHIuc3Vic3RyaW5nKDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y0FyclsnY2xhc3MnXS5wdXNoKGN1cnJFeGNTdHIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBleGNBcnJbJ3RhZyddLnB1c2goY3VyckV4Y1N0cik7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY291Kys7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGV4Y0FycjsNCn0NCg0KZnVuY3Rpb24gYXN5bmNCbG9ja3NJbnNlcnRpbmdGdW5jdGlvbihibG9ja1NldHRpbmdBcnJheSkgew0KICAgIHRyeSB7DQogICAgICAgIHZhciBjb250ZW50X3BvaW50ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjY29udGVudF9wb2ludGVyX2lkIik7IC8qIG9yaWcgKi8NCiAgICAgICAgdmFyIHBhcmVudF93aXRoX2NvbnRlbnQgPSBjb250ZW50X3BvaW50ZXIucGFyZW50RWxlbWVudDsNCiAgICAgICAgdmFyIGxvcmRPZkVsZW1lbnRzID0gcGFyZW50X3dpdGhfY29udGVudDsNCiAgICAgICAgcGFyZW50X3dpdGhfY29udGVudCA9IHBhcmVudF93aXRoX2NvbnRlbnQucGFyZW50RWxlbWVudDsNCiAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgICAgdmFyIGVsZW1lbnRUb0FkZDsNCiAgICAgICAgdmFyIGVsZW1lbnRUb0FkZFN0eWxlOw0KICAgICAgICB2YXIgcG9vbGJhY2tJID0gMDsNCiAgICAgICAgdmFyIGNvdW50ZXIgPSAwOw0KICAgICAgICB2YXIgY3VycmVudEVsZW1lbnQ7DQogICAgICAgIHZhciByZXBlYXRhYmxlQ3VycmVudEVsZW1lbnQ7DQogICAgICAgIHZhciByZXBlYXRhYmxlU3VjY2VzczsNCiAgICAgICAgdmFyIHJlQ291Ow0KICAgICAgICB2YXIgY3VyRmlyc3RQbGFjZTsNCiAgICAgICAgdmFyIGN1ckVsZW1lbnRDb3VudDsNCiAgICAgICAgdmFyIGN1ckVsZW1lbnRTdGVwOw0KICAgICAgICB2YXIgYmFja0VsZW1lbnQgPSAwOw0KICAgICAgICB2YXIgc3VtUmVzdWx0ID0gMDsNCiAgICAgICAgdmFyIGN1clN1bVJlc3VsdCA9IDA7DQogICAgICAgIHZhciByZXBlYXQgPSBmYWxzZTsNCiAgICAgICAgdmFyIGN1cnJlbnRFbGVtZW50Q2hlY2tlciA9IGZhbHNlOw0KICAgICAgICBsZXQgY29udGFpbmVyRm9yNnRoID0gW107DQogICAgICAgIGxldCBjb250YWluZXJGb3I3dGggPSBbXTsNCiAgICAgICAgdmFyIHBvc0N1cnJlbnRFbGVtZW50Ow0KICAgICAgICB2YXIgYmxvY2tfbnVtYmVyOw0KICAgICAgICBsZXQgY29udGVudExlbmd0aCA9IGNvbnRlbnRfcG9pbnRlci5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29udGVudC1sZW5ndGgnKTsNCiAgICAgICAgbGV0IHJlamVjdGVkQmxvY2tzID0gY29udGVudF9wb2ludGVyLmdldEF0dHJpYnV0ZSgnZGF0YS1yZWplY3RlZC1ibG9ja3MnKTsNCiAgICAgICAgaWYgKHJlamVjdGVkQmxvY2tzJiZyZWplY3RlZEJsb2Nrcy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICByZWplY3RlZEJsb2NrcyA9IHJlamVjdGVkQmxvY2tzLnNwbGl0KCcsJyk7DQogICAgICAgIH0NCiAgICAgICAgbGV0IHdpZHRoQ2hlY2sgPSBmYWxzZTsNCiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50TGlzdDsNCiAgICAgICAgdmFyIHRlc3RFbGVtZW50MSA9IG51bGw7DQogICAgICAgIHZhciB0ZXJtb3Jhcml0eV9wYXJlbnRfd2l0aF9jb250ZW50ID0gcGFyZW50X3dpdGhfY29udGVudDsNCiAgICAgICAgdmFyIHRlcm1vcmFyaXR5X3BhcmVudF93aXRoX2NvbnRlbnRfbGVuZ3RoID0gMDsNCiAgICAgICAgdmFyIGhlYWRlcnNMaXN0ID0gWydoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNiddOw0KICAgICAgICBmb3IgKHZhciBoYzEgPSAwOyBoYzEgPCBoZWFkZXJzTGlzdC5sZW5ndGg7IGhjMSsrKSB7DQogICAgICAgICAgICB0ZXJtb3Jhcml0eV9wYXJlbnRfd2l0aF9jb250ZW50X2xlbmd0aCArPSB0ZXJtb3Jhcml0eV9wYXJlbnRfd2l0aF9jb250ZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGhlYWRlcnNMaXN0W2hjMV0pLmxlbmd0aDsNCiAgICAgICAgfQ0KDQogICAgICAgIGxldCBkZXRhaWxlZEVsZW1lbnRMaXN0Ow0KICAgICAgICBsZXQgRXhjU3RyQ291ID0gMTsNCiAgICAgICAgbGV0IGRldGFpbGVkUXVlcnlTdHJpbmc7DQogICAgICAgIGxldCB1c2VkRWxlbWVudDsNCiAgICAgICAgbGV0IHRhZ0xpc3QgPSBbXTsNCiAgICAgICAgbGV0IGxvY2FsU3VtUmVzdWx0Ow0KICAgICAgICBsZXQgYmluZGVyTmFtZTsNCg0KICAgICAgICB2YXIgcmVtb3ZlQ2xlYXJpbmc7DQogICAgICAgIHZhciByZXBlYXRhYmxlQmxvY2tJZGVudGlmaWVyID0gMDsNCg0KICAgICAgICB2YXIgaTsNCg0KICAgICAgICBpZiAoY29udGVudExlbmd0aCA8IDEpIHsNCiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBwYXJlbnRfd2l0aF9jb250ZW50LmlubmVyVGV4dC5sZW5ndGgNCiAgICAgICAgfQ0KDQogICAgICAgIHJiX3RlbXBFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3JiX3RlbXBFbGVtZW50Jyk7DQogICAgICAgIGlmICghcmJfdGVtcEVsZW1lbnQpIHsNCiAgICAgICAgICAgIHJiX3RlbXBFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KICAgICAgICAgICAgcmJfdGVtcEVsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsICdyYl90ZW1wRWxlbWVudCcpOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gZ2V0RnJvbUNvbnN0cnVjdGlvbnMoY3VycmVudEVsZW1lbnQpIHsNCiAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAiYmxvY2txdW90ZSIpIHsNCiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7DQogICAgICAgICAgICAgICAgLyogaW5pdFRhcmdldFRvSW5zZXJ0KGJsb2NrU2V0dGluZ0FycmF5LCAnZWxlbWVudCcsIGN1cnJlbnRFbGVtZW50KTsgKi8NCiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyYl90ZW1wRWxlbWVudCwgY3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgIHJiX3RlbXBFbGVtZW50X2NoZWNrID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICBzYW1lRWxlbWVudEFmdGVyRnJvbUNvbnN0cnVjdGlvbj1mYWxzZTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoWyJ0ciIsInRkIiwidGgiLCJ0aGVhZCIsInRib2R5IiwidGFibGUiXS5pbmNsdWRlcyhjdXJyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSkpIHsNCiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7DQogICAgICAgICAgICAgICAgd2hpbGUgKFsidHIiLCJ0ZCIsInRoIiwidGhlYWQiLCJ0Ym9keSIsInRhYmxlIl0uaW5jbHVkZXMoY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKSB7DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocmJfdGVtcEVsZW1lbnQsIGN1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgICAgICAgICByYl90ZW1wRWxlbWVudF9jaGVjayA9IHRydWU7DQogICAgICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlckZyb21Db25zdHJ1Y3Rpb249ZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBkaXJlY3RDbGFzc0VsZW1lbnREZXRlY3RpbmcoYmxvY2tTZXR0aW5nQXJyYXksIGRpcmVjdEVsZW1lbnQpIHsNCiAgICAgICAgICAgIGxldCBmaW5kUXVlcnkgPSAwOw0KICAgICAgICAgICAgbGV0IGRpcmVjdENsYXNzRWxlbWVudFJlc3VsdCA9IFtdOw0KDQogICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZGlyZWN0RWxlbWVudCk7DQogICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGlmIChibG9ja1NldHRpbmdBcnJheVtpXVsnZWxlbWVudFBsYWNlJ10gPiAxKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5sZW5ndGggPj0gYmxvY2tTZXR0aW5nQXJyYXlbaV1bJ2VsZW1lbnRQbGFjZSddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50W2Jsb2NrU2V0dGluZ0FycmF5W2ldWydlbGVtZW50UGxhY2UnXS0xXTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RWxlbWVudC5sZW5ndGggPCBibG9ja1NldHRpbmdBcnJheVtpXVsnZWxlbWVudFBsYWNlJ10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnRbY3VycmVudEVsZW1lbnQubGVuZ3RoIC0gMV07DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmaW5kUXVlcnkgPSAxOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChibG9ja1NldHRpbmdBcnJheVtpXVsnZWxlbWVudFBsYWNlJ10gPCAwKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICgoY3VycmVudEVsZW1lbnQubGVuZ3RoICsgYmxvY2tTZXR0aW5nQXJyYXlbaV1bJ2VsZW1lbnRQbGFjZSddICsgMSkgPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50W2N1cnJlbnRFbGVtZW50Lmxlbmd0aCArIGJsb2NrU2V0dGluZ0FycmF5W2ldWydlbGVtZW50UGxhY2UnXV07DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmaW5kUXVlcnkgPSAxOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgZmluZFF1ZXJ5ID0gMTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGZpbmRRdWVyeSA9IDE7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGRpcmVjdENsYXNzRWxlbWVudFJlc3VsdFsnZmluZFF1ZXJ5J10gPSBmaW5kUXVlcnk7DQogICAgICAgICAgICBkaXJlY3RDbGFzc0VsZW1lbnRSZXN1bHRbJ2N1cnJlbnRFbGVtZW50J10gPSBjdXJyZW50RWxlbWVudDsNCg0KICAgICAgICAgICAgcmV0dXJuIGRpcmVjdENsYXNzRWxlbWVudFJlc3VsdDsNCiAgICAgICAgfQ0KDQogICAgICAgIGZ1bmN0aW9uIHBsYWNpbmdUb0gxKHVzZWRFbGVtZW50LCBlbGVtZW50VGFnVG9GaW5kKSB7DQogICAgICAgICAgICBsZXQgdXNlbGVzc0xldDsNCiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gdXNlZEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChlbGVtZW50VGFnVG9GaW5kKTsNCg0KICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lmxlbmd0aCA8IDEpIHsNCiAgICAgICAgICAgICAgICBpZiAodXNlZEVsZW1lbnQucGFyZW50RWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICB1c2VsZXNzTGV0ID0gcGxhY2luZ1RvSDEodXNlZEVsZW1lbnQucGFyZW50RWxlbWVudCwgZWxlbWVudFRhZ1RvRmluZCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50Ow0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gZWxlbWVudHNDbGVhbmluZyhleGNBcnIsIGVsTGlzdCwgcHdjTG9jYWwsIGdhdGhlclN0cmluZykgew0KICAgICAgICAgICAgbGV0IG1hcmtlZENsYXNzID0gJ3JiX21faW5jJzsNCiAgICAgICAgICAgIGxldCBtYXJrZWRDbGFzc0JhZCA9ICdyYl9tX2V4Yyc7DQogICAgICAgICAgICBsZXQgY291ID0gMDsNCiAgICAgICAgICAgIGxldCBjb3UxID0gMDsNCiAgICAgICAgICAgIGxldCBmaW5hbEFyciA9IFtdOw0KICAgICAgICAgICAgbGV0IGZpbmFsQXJyQ2xlYXIgPSBbXTsNCiAgICAgICAgICAgIGxldCBjaGVja05lYXJlc3Q7DQogICAgICAgICAgICBsZXQgb3V0T2ZSYW5nZUNoZWNrOw0KICAgICAgICAgICAgbGV0IGdhdGhlclJlamVjdGVkOw0KICAgICAgICAgICAgbGV0IGFsbG93ZXI7DQoNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgd2hpbGUgKGVsTGlzdFtjb3VdKSB7DQogICAgICAgICAgICAgICAgICAgIGFsbG93ZXIgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIWVsTGlzdFtjb3VdLmNsYXNzTGlzdC5jb250YWlucyhtYXJrZWRDbGFzc0JhZCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGNBcnImJmV4Y0Fyci5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291MSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGV4Y0Fycltjb3UxXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja05lYXJlc3QgPSBlbExpc3RbY291XS5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoZXhjQXJyW2NvdTFdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrTmVhcmVzdCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tOZWFyZXN0LmNsYXNzTGlzdC5hZGQoJ2N1cnJDbG9zZXN0Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRPZlJhbmdlQ2hlY2sgPSBwd2NMb2NhbC5xdWVyeVNlbGVjdG9yKCcuY3VyckNsb3Nlc3QnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRPZlJhbmdlQ2hlY2spIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VyID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tOZWFyZXN0LmNsYXNzTGlzdC5hZGQobWFya2VkQ2xhc3MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdGhlclJlamVjdGVkID0gY2hlY2tOZWFyZXN0LnF1ZXJ5U2VsZWN0b3JBbGwoZ2F0aGVyU3RyaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2F0aGVyUmVqZWN0ZWQubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpMSA9IDA7IGkxIDwgZ2F0aGVyUmVqZWN0ZWQubGVuZ3RoOyBpMSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXRoZXJSZWplY3RlZFtpMV0uY2xhc3NMaXN0LmFkZChtYXJrZWRDbGFzc0JhZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja05lYXJlc3QuY2xhc3NMaXN0LnJlbW92ZSgnY3VyckNsb3Nlc3QnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3UxKys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZXI9PT10cnVlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxMaXN0W2NvdV0uY2xhc3NMaXN0LmFkZChtYXJrZWRDbGFzcyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmluYWxBcnIucHVzaChlbExpc3RbY291XSk7ICovDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY291Kys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZpbmFsQXJyID0gcHdjTG9jYWwucXVlcnlTZWxlY3RvckFsbCgnLicrbWFya2VkQ2xhc3MrJzpub3QoJyttYXJrZWRDbGFzc0JhZCsnKScpOw0KICAgICAgICAgICAgICAgIGZpbmFsQXJyQ2xlYXIgPSBwd2NMb2NhbC5xdWVyeVNlbGVjdG9yQWxsKCcuJyttYXJrZWRDbGFzcysnLC4nK21hcmtlZENsYXNzQmFkKTsNCiAgICAgICAgICAgICAgICBpZiAoZmluYWxBcnJDbGVhciYmZmluYWxBcnJDbGVhci5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkxID0gMDsgaTEgPCBmaW5hbEFyckNsZWFyLmxlbmd0aDsgaTErKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxBcnJDbGVhcltpMV0uY2xhc3NMaXN0LnJlbW92ZShtYXJrZWRDbGFzcyxtYXJrZWRDbGFzc0JhZCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGNhdGNoIChlcikgew0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVyLm1lc3NhZ2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGZpbmFsQXJyOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gY3VyZWVudEVsZW1lbnRzR2F0aGVyKHVzZWRFbGVtZW50LCBsb29wTGltaXQgPSAyLCBsb2NhbFB3YyA9IHBhcmVudF93aXRoX2NvbnRlbnQpIHsNCiAgICAgICAgICAgIGxldCBjdXJFbGVtZW50U2VhcmNoUmVwZWF0ZXIgPSB0cnVlOw0KICAgICAgICAgICAgbGV0IGN1ckVsZW1lbnRTZWFyY2hDb3VudGVyID0gMDsNCiAgICAgICAgICAgIGxldCBjdXJyZW50RWxlbWVudExvYyA9IG51bGw7DQogICAgICAgICAgICBsZXQgRXhjbHVkZWRTdHJpbmdCZWdpbiA9ICcnOw0KICAgICAgICAgICAgbGV0IEV4Y2x1ZGVkU3RyaW5nID0gJyc7DQogICAgICAgICAgICBsZXQgRXhjbHVkZWRTdHJpbmdFbmQgPSAnJzsNCiAgICAgICAgICAgIGxldCB0YWdMaXN0U3RyaW5nID0gJyc7DQogICAgICAgICAgICBsZXQgdGFnTGlzdFN0cmluZ0V4YyA9ICcnOw0KICAgICAgICAgICAgbGV0IGNvdSA9IDA7DQogICAgICAgICAgICAvKiBsZXQgZXhjQXJyID0gZXhjSWRDbFVucGFja2VyKCk7ICovDQogICAgICAgICAgICBsZXQgdGFnTGlzdENvdSA9IDA7DQoNCiAgICAgICAgICAgIGlmICh1c2VkRWxlbWVudD09J2gxJykgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50TG9jID0gcGxhY2luZ1RvSDEobG9jYWxQd2MsIHVzZWRFbGVtZW50KTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgaWYgKHVzZWRFbGVtZW50PT0naDItNCcpIHt0YWdMaXN0ID0gWydoMicsJ2gzJywnaDMnXTt9DQogICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgIHt0YWdMaXN0ID0gW3VzZWRFbGVtZW50XTsgICB9DQogICAgICAgICAgICAgICAgd2hpbGUgKHRhZ0xpc3RbdGFnTGlzdENvdV0pIHsNCiAgICAgICAgICAgICAgICAgICAgdGFnTGlzdFN0cmluZyArPSAoKGNvdSsrPjApPycsJzonJykrdGFnTGlzdFt0YWdMaXN0Q291XTsNCiAgICAgICAgICAgICAgICAgICAgdGFnTGlzdFN0cmluZ0V4YyArPSAnOm5vdCgnK3RhZ0xpc3RbdGFnTGlzdENvdV0rJyknOw0KICAgICAgICAgICAgICAgICAgICB0YWdMaXN0Q291Kys7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgRXhjbHVkZWRTdHJpbmcgPSAnJzsNCiAgICAgICAgICAgICAgICBpZiAoZXhjSWRDbGFzcyYmZXhjSWRDbGFzcy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkyID0gMDsgaTIgPCBleGNJZENsYXNzLmxlbmd0aDsgaTIrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y0lkQ2xhc3NbaTJdLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNsdWRlZFN0cmluZyArPSAoaTI+MD8nLCc6JycpK2V4Y0lkQ2xhc3NbaTJdK3RhZ0xpc3RTdHJpbmdFeGM7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZGV0YWlsZWRRdWVyeVN0cmluZyArPSB0YWdMaXN0U3RyaW5nKycsJytFeGNsdWRlZFN0cmluZzsNCg0KICAgICAgICAgICAgICAgIC8qIGNvbnNvbGUubG9nKGRldGFpbGVkUXVlcnlTdHJpbmcpOyAqLw0KICAgICAgICAgICAgICAgIHdoaWxlIChjdXJFbGVtZW50U2VhcmNoUmVwZWF0ZXImJmN1ckVsZW1lbnRTZWFyY2hDb3VudGVyIDwgbG9vcExpbWl0KSB7DQogICAgICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudExvYyA9IGxvY2FsUHdjLnF1ZXJ5U2VsZWN0b3JBbGwodGFnTGlzdFN0cmluZyk7DQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUxKSB7Y29uc29sZS5sb2coZTEubWVzc2FnZSk7fQ0KICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRFbGVtZW50TG9jKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxQd2MucGFyZW50RWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUHdjID0gbG9jYWxQd2MucGFyZW50RWxlbWVudDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudExvYyA9IGVsZW1lbnRzQ2xlYW5pbmcoZXhjSWRDbGFzcywgY3VycmVudEVsZW1lbnRMb2MsIGxvY2FsUHdjLCBkZXRhaWxlZFF1ZXJ5U3RyaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1ckVsZW1lbnRTZWFyY2hSZXBlYXRlciA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGN1ckVsZW1lbnRTZWFyY2hDb3VudGVyKys7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50TG9jOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gY3VycmVudEVsZW1lbnRSZWNlaXZlcihyZXZlcnQsIGxvY2FsQ3VyRWwgPSBjdXJyZW50RWxlbWVudCkgew0KICAgICAgICAgICAgbGV0IG9yaWdDdXJFbCA9IGxvY2FsQ3VyRWw7DQogICAgICAgICAgICBjdXJTdW1SZXN1bHQgPSBzdW1SZXN1bHQ7DQogICAgICAgICAgICBkZXRhaWxlZEVsZW1lbnRMaXN0ID0gbG9jYWxDdXJFbDsNCiAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCA9IGZhbHNlOw0KICAgICAgICAgICAgbGV0IHRlc3RDb3UgPSAwOw0KICAgICAgICAgICAgd2hpbGUgKGRldGFpbGVkRWxlbWVudExpc3RbY3VyU3VtUmVzdWx0XSYmc2FtZUVsZW1lbnRBZnRlcldpZHRoPT1mYWxzZSYmdGVzdENvdSA8IDgpIHsNCiAgICAgICAgICAgICAgICBsb2NhbEN1ckVsID0gZGV0YWlsZWRFbGVtZW50TGlzdFtjdXJTdW1SZXN1bHRdOw0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJXaWR0aD10cnVlOw0KICAgICAgICAgICAgICAgICAgICBzYW1lRWxlbWVudEFmdGVyV2lkdGggPSBjaGVja0Fkc1dpZHRoKGNvbnRlbnRfcG9pbnRlciwgYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRQb3NpdGlvbiJdLCBsb2NhbEN1ckVsKTsNCiAgICAgICAgICAgICAgICB9IGNhdGNoIChleCkgew0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhleC5tZXNzYWdlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV2ZXJ0PyBjdXJTdW1SZXN1bHQtLTogY3VyU3VtUmVzdWx0Kys7DQogICAgICAgICAgICAgICAgdGVzdENvdSsrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGxvY2FsQ3VyRWwpIHsNCiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudENoZWNrZXIgPSB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIGxvY2FsQ3VyRWw/bG9jYWxDdXJFbDpvcmlnQ3VyRWw7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGZ1bmN0aW9uIGVuZGluZ0FjdGlvbnMoYmxvY2tfbnVtYmVyKSB7DQogICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICB9DQoNCiAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2V0dGluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IG51bGw7DQogICAgICAgICAgICBjdXJyZW50RWxlbWVudENoZWNrZXIgPSBmYWxzZTsNCiAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCA9IGZhbHNlOw0KICAgICAgICAgICAgc2FtZUVsZW1lbnRBZnRlckV4Y0NsYXNzSWQgPSBmYWxzZTsNCiAgICAgICAgICAgIHNhbWVFbGVtZW50QWZ0ZXJGcm9tQ29uc3RydWN0aW9uID0gZmFsc2U7DQogICAgICAgICAgICB0YWdMaXN0Q291ID0gMDsNCiAgICAgICAgICAgIHBvb2xiYWNrSSA9IDA7DQogICAgICAgICAgICBkZXRhaWxlZFF1ZXJ5U3RyaW5nID0gJyc7DQogICAgICAgICAgICBiaW5kZXJOYW1lID0gZWxlbWVudEJpbmRlck5hbWVHZW5lcmF0b3IoKTsNCg0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBpZiAoIWJsb2NrU2V0dGluZ0FycmF5W2ldWyJ0ZXh0Il0NCiAgICAgICAgICAgICAgICAgICAgfHwoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInRleHQiXSYmYmxvY2tTZXR0aW5nQXJyYXlbaV1bInRleHQiXS5sZW5ndGggPCAxKQ0KICAgICAgICAgICAgICAgICAgICB8fChyZWplY3RlZEJsb2NrcyYmcmVqZWN0ZWRCbG9ja3MuaW5jbHVkZXMoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImlkIl0pKQ0KICAgICAgICAgICAgICAgICAgICB8fCgoYmxvY2tTZXR0aW5nQXJyYXlbaV1bIm1heEhlYWRlcnMiXSA+IDApJiYoYmxvY2tTZXR0aW5nQXJyYXlbaV1bIm1heEhlYWRlcnMiXSA8IHBhcnNlSW50KHRlcm1vcmFyaXR5X3BhcmVudF93aXRoX2NvbnRlbnRfbGVuZ3RoKSkpDQogICAgICAgICAgICAgICAgICAgIHx8KChibG9ja1NldHRpbmdBcnJheVtpXVsibWF4U3ltYm9scyJdID4gMCkmJihibG9ja1NldHRpbmdBcnJheVtpXVsibWF4U3ltYm9scyJdIDwgcGFyc2VJbnQoY29udGVudExlbmd0aCkpKQ0KICAgICAgICAgICAgICAgICAgICB8fChjb250ZW50X3BvaW50ZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCJoYXJkLWNvbnRlbnQiKSYmYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNldHRpbmdfdHlwZSJdIT0zKQ0KICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgYmxvY2tfbnVtYmVyID0gMDsNCg0KICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJwZXJjZW50UG9pbnRlckNsYXNzIik7DQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoIm1hcmtlZCIpOw0KICAgICAgICAgICAgICAgIGlmIChibG9ja1NldHRpbmdBcnJheVtpXVsic2MiXT09MSkgew0KICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LmFkZCgic2NNYXJrIik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5pbm5lckhUTUwgPSBibG9ja1NldHRpbmdBcnJheVtpXVsidGV4dCJdOw0KICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5kYXRhc2V0LnJiaW5kZXIgPSBiaW5kZXJOYW1lOw0KICAgICAgICAgICAgICAgIGJsb2NrX251bWJlciA9IGVsZW1lbnRUb0FkZC5jaGlsZHJlblswXS5hdHRyaWJ1dGVzWydkYXRhLWlkJ10udmFsdWU7DQoNCiAgICAgICAgICAgICAgICBpZiAoYmxvY2tEdXBsaWNhdGUgPT0gJ25vJykgew0KICAgICAgICAgICAgICAgICAgICBpZiAodXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkxID0gMDsgaTEgPCB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMubGVuZ3RoOyBpMSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrX251bWJlcj09dXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzW2kxXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvb2xiYWNrSSA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGRTdHlsZSA9IGNyZWF0ZVN0eWxlRWxlbWVudChibG9ja19udW1iZXIsIGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50Q3NzIl0pOw0KDQogICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRUb0FkZFN0eWxlJiZlbGVtZW50VG9BZGRTdHlsZSE9J2RlZmF1bHQnKSB7DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5zdHlsZS50ZXh0QWxpZ24gPSBlbGVtZW50VG9BZGRTdHlsZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJtaW5IZWFkZXJzIl0gPiAwKSYmKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJtaW5IZWFkZXJzIl0gPiB0ZXJtb3Jhcml0eV9wYXJlbnRfd2l0aF9jb250ZW50X2xlbmd0aCkpIHtjb250aW51ZTt9DQogICAgICAgICAgICAgICAgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJtaW5TeW1ib2xzIl0gPiBjb250ZW50TGVuZ3RoKSB7Y29udGludWU7fQ0KDQogICAgICAgICAgICAgICAgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJzZXR0aW5nX3R5cGUiXSA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VyZWVudEVsZW1lbnRzR2F0aGVyKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50Il0udG9Mb3dlckNhc2UoKSk7DQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UGxhY2UiXSA8IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1SZXN1bHQgPSBjdXJyZW50RWxlbWVudC5sZW5ndGggKyBibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFBsYWNlIl07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bVJlc3VsdCA+PSAwICYmIHN1bVJlc3VsdCA8IGN1cnJlbnRFbGVtZW50Lmxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50UmVjZWl2ZXIodHJ1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1SZXN1bHQgPSBibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFBsYWNlIl0gLSAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdW1SZXN1bHQgPCBjdXJyZW50RWxlbWVudC5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50RWxlbWVudFJlY2VpdmVyKGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50ICE9IHVuZGVmaW5lZCAmJiBjdXJyZW50RWxlbWVudCAhPSBudWxsICYmIGN1cnJlbnRFbGVtZW50Q2hlY2tlcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgcG9zQ3VycmVudEVsZW1lbnQgPSBpbml0VGFyZ2V0VG9JbnNlcnQoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRQb3NpdGlvbiJdLCAnZWxlbWVudCcsIGN1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnRUb0FkZCwgcG9zQ3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncmJpbmRlci0nK2JpbmRlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5yZW1vdmUoJ2NvdmVyZWRBZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJiX3RlbXBFbGVtZW50X2NoZWNrID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJzZXR0aW5nX3R5cGUiXSA9PSAyKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChibG9ja0R1cGxpY2F0ZSA9PSAnbm8nKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudENvdW50Il0gPSAxOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJlcGVhdGFibGVDdXJyZW50RWxlbWVudCA9IFtdOw0KICAgICAgICAgICAgICAgICAgICByZUNvdSA9IDA7DQogICAgICAgICAgICAgICAgICAgIGN1ckZpcnN0UGxhY2UgPSBibG9ja1NldHRpbmdBcnJheVtpXVsiZmlyc3RQbGFjZSJdOw0KICAgICAgICAgICAgICAgICAgICBjdXJFbGVtZW50Q291bnQgPSBibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudENvdW50Il07DQogICAgICAgICAgICAgICAgICAgIGN1ckVsZW1lbnRTdGVwID0gYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRTdGVwIl07DQogICAgICAgICAgICAgICAgICAgIHJlcGVhdGFibGVTdWNjZXNzID0gZmFsc2U7DQoNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkU3R5bGUgPSBjcmVhdGVTdHlsZUVsZW1lbnQoYmxvY2tfbnVtYmVyLCBibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudENzcyJdKTsNCg0KICAgICAgICAgICAgICAgICAgICByZXBlYXRhYmxlQ3VycmVudEVsZW1lbnQgPSBjdXJlZW50RWxlbWVudHNHYXRoZXIoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnQiXS50b0xvd2VyQ2FzZSgpKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGFibGVDdXJyZW50RWxlbWVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaTEgPSAwOyBpMSA8IGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50Q291bnQiXTsgaTErKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Q2hlY2tlciA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXBFbGVtZW50VG9BZGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBFbGVtZW50VG9BZGQuY2xhc3NMaXN0LmFkZCgicGVyY2VudFBvaW50ZXJDbGFzcyIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcEVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJtYXJrZWQiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tTZXR0aW5nQXJyYXlbaV1bInNjIl09PTEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwRWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoInNjTWFyayIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBFbGVtZW50VG9BZGQuY2xhc3NMaXN0LmFkZCgicmVwZWF0YWJsZS1tYXJrLSIrcmVwZWF0YWJsZUJsb2NrSWRlbnRpZmllcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwRWxlbWVudFRvQWRkLmlubmVySFRNTCA9IGJsb2NrU2V0dGluZ0FycmF5W2ldWyJ0ZXh0Il07DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFRvQWRkU3R5bGUmJmVsZW1lbnRUb0FkZFN0eWxlIT0nZGVmYXVsdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwRWxlbWVudFRvQWRkLnN0eWxlLnRleHRBbGlnbiA9IGVsZW1lbnRUb0FkZFN0eWxlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJlc3VsdCA9IE1hdGgucm91bmQocGFyc2VJbnQoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImZpcnN0UGxhY2UiXSkgKyAoaTEqcGFyc2VJbnQoYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRTdGVwIl0pKSAtIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdW1SZXN1bHQgPCByZXBlYXRhYmxlQ3VycmVudEVsZW1lbnQubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnRSZWNlaXZlcihmYWxzZSwgcmVwZWF0YWJsZUN1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgIT0gdW5kZWZpbmVkICYmIGN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnRDaGVja2VyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc0N1cnJlbnRFbGVtZW50ID0gaW5pdFRhcmdldFRvSW5zZXJ0KGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50UG9zaXRpb24iXSwgJ2VsZW1lbnQnLCBjdXJyZW50RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHJlcEVsZW1lbnRUb0FkZCwgcG9zQ3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyYmluZGVyLScrYmluZGVyTmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcEVsZW1lbnRUb0FkZC5jbGFzc0xpc3QucmVtb3ZlKCdjb3ZlcmVkQWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyRmlyc3RQbGFjZSA9IHN1bVJlc3VsdCArIHBhcnNlSW50KGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50U3RlcCJdKSArIDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckVsZW1lbnRDb3VudC0tOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRhYmxlU3VjY2VzcyA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0YWJsZVN1Y2Nlc3MgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRhYmxlU3VjY2Vzcz09dHJ1ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGFibGVCbG9ja0lkZW50aWZpZXIrKzsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmxvY2tTZXR0aW5nQXJyYXlbaV1bInVuc3VjY2VzcyJdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXlbaV1bInVuc3VjY2VzcyJdID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXlbaV1bInVuc3VjY2VzcyJdID0gTWF0aC5yb3VuZChibG9ja1NldHRpbmdBcnJheVtpXVsidW5zdWNjZXNzIl0gKyAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja1NldHRpbmdBcnJheVtpXVsidW5zdWNjZXNzIl0gPiAxMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5wdXNoKGJsb2NrX251bWJlcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXlbaV1bImZpcnN0UGxhY2UiXSA9IGN1ckZpcnN0UGxhY2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXlbaV1bImVsZW1lbnRDb3VudCJdID0gY3VyRWxlbWVudENvdW50Ow0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5W2ldWyJlbGVtZW50U3RlcCJdID0gY3VyRWxlbWVudFN0ZXA7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChibG9ja1NldHRpbmdBcnJheVtpXVsic2V0dGluZ190eXBlIl0gPT0gMykgew0KICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFR5cGVTeW1ib2wgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRTcGFjZVN5bWJvbCA9ICcnOw0KICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudE5hbWUgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRUeXBlID0gJyc7DQogICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50VGFnICA9ICcnOw0KICAgICAgICAgICAgICAgICAgICBsZXQgZmluZFF1ZXJ5ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGRpcmVjdENsYXNzUmVzdWx0ID0gW107DQogICAgICAgICAgICAgICAgICAgIGxldCBkaXJlY3RFbGVtZW50ID0gYmxvY2tTZXR0aW5nQXJyYXlbaV1bImRpcmVjdEVsZW1lbnQiXS50cmltKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdEVsZW1lbnQuc2VhcmNoKCcjJykgPiAtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZmluZFF1ZXJ5ID0gMTsNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZGlyZWN0RWxlbWVudC5zZWFyY2goJyMnKSA8IDApJiYoZGlyZWN0RWxlbWVudC5zZWFyY2goJy4nKSA+IC0xKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0Q2xhc3NSZXN1bHQgPSBkaXJlY3RDbGFzc0VsZW1lbnREZXRlY3RpbmcoYmxvY2tTZXR0aW5nQXJyYXksIGRpcmVjdEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZmluZFF1ZXJ5ID0gZGlyZWN0Q2xhc3NSZXN1bHRbJ2ZpbmRRdWVyeSddOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQgPSBkaXJlY3RDbGFzc1Jlc3VsdFsnY3VycmVudEVsZW1lbnQnXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoZmluZFF1ZXJ5ID09IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihkaXJlY3RFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Q2hlY2tlciA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgIT0gdW5kZWZpbmVkICYmIGN1cnJlbnRFbGVtZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnRDaGVja2VyKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwb3NDdXJyZW50RWxlbWVudCA9IGluaXRUYXJnZXRUb0luc2VydChibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFBvc2l0aW9uIl0sICdlbGVtZW50JywgY3VycmVudEVsZW1lbnQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudFRvQWRkLCBwb3NDdXJyZW50RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LnJlbW92ZSgnY292ZXJlZEFkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdyYmluZGVyLScrYmluZGVyTmFtZSk7DQogICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICBwb29sYmFja0kgPSAxOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIGlmIChibG9ja1NldHRpbmdBcnJheVtpXVsic2V0dGluZ190eXBlIl0gPT0gNCkgew0KICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjY29udGVudF9wb2ludGVyX2lkIikucGFyZW50RWxlbWVudC5hcHBlbmQoZWxlbWVudFRvQWRkKTsNCiAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgIHBvb2xiYWNrSSA9IDE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJzZXR0aW5nX3R5cGUiXSA9PSA1KSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RWxlbWVudExpc3QgPSBjdXJlZW50RWxlbWVudHNHYXRoZXIoJ3AnLCAxLCBjb250ZW50X3BvaW50ZXIucGFyZW50RWxlbWVudCk7DQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudExpc3QmJmN1cnJlbnRFbGVtZW50TGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcENvdW50ID0gY3VycmVudEVsZW1lbnRMaXN0Lmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50TnVtYmVyID0gTWF0aC5yb3VuZChwQ291bnQvMik7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvdW50ID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnRMaXN0W2VsZW1lbnROdW1iZXIrMV07DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQgIT0gdW5kZWZpbmVkICYmIGN1cnJlbnRFbGVtZW50ICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvdW50ID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50VG9BZGQsIGN1cnJlbnRFbGVtZW50KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50VG9BZGQsIGN1cnJlbnRFbGVtZW50Lm5leHRTaWJsaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5yZW1vdmUoJ2NvdmVyZWRBZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3JiaW5kZXItJytiaW5kZXJOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xiYWNrSSA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJzZXR0aW5nX3R5cGUiXSA9PSA2KSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGb3I2dGgubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb250YWluZXJGb3I2dGgubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyRm9yNnRoW2pdWyJlbGVtZW50UGxhY2UiXT5ibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFBsYWNlIl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udGludWU7ICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IGNvbnRhaW5lckZvcjZ0aC5sZW5ndGgtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRm9yNnRoLnB1c2goYmxvY2tTZXR0aW5nQXJyYXlbaV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlZEFkQmxvY2tzQXJyYXkucHVzaChjaGVja0lmQmxvY2tVc2VkKTsgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5wdXNoKGJsb2NrX251bWJlcik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xiYWNrSSA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSBjb250YWluZXJGb3I2dGgubGVuZ3RoLTE7IGsgPiBqLTE7IGstLSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRm9yNnRoW2sgKyAxXSA9IGNvbnRhaW5lckZvcjZ0aFtrXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJGb3I2dGhbal0gPSBibG9ja1NldHRpbmdBcnJheVtpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlZEFkQmxvY2tzQXJyYXkucHVzaChjaGVja0lmQmxvY2tVc2VkKTsgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTZXR0aW5nQXJyYXkuc3BsaWNlKGktLSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xiYWNrSSA9IDE7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckZvcjZ0aC5wdXNoKGJsb2NrU2V0dGluZ0FycmF5W2ldKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcy5wdXNoKGJsb2NrX251bWJlcik7DQogICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xiYWNrSSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvKiB2aWRwcmF2dXR1IHYgdmlkc3RpaW51ayBkbHlhIDZobyB0aXBhICovDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJsb2NrU2V0dGluZ0FycmF5W2ldWyJzZXR0aW5nX3R5cGUiXSA9PSA3KSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGb3I3dGgubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb250YWluZXJGb3I3dGgubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyRm9yN3RoW2pdWyJlbGVtZW50UGxhY2UiXT5ibG9ja1NldHRpbmdBcnJheVtpXVsiZWxlbWVudFBsYWNlIl0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udGludWU7ICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IGNvbnRhaW5lckZvcjd0aC5sZW5ndGgtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRm9yN3RoLnB1c2goYmxvY2tTZXR0aW5nQXJyYXlbaV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IGNvbnRhaW5lckZvcjd0aC5sZW5ndGgtMTsgayA+IGotMTsgay0tKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJGb3I3dGhbayArIDFdID0gY29udGFpbmVyRm9yN3RoW2tdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckZvcjd0aFtqXSA9IGJsb2NrU2V0dGluZ0FycmF5W2ldOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkQmxvY2tTZXR0aW5nQXJyYXlJZHMucHVzaChibG9ja19udW1iZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NldHRpbmdBcnJheS5zcGxpY2UoaS0tLCAxKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRm9yN3RoLnB1c2goYmxvY2tTZXR0aW5nQXJyYXlbaV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJsb2NrU2V0dGluZ0FycmF5SWRzLnB1c2goYmxvY2tfbnVtYmVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2V0dGluZ0FycmF5LnNwbGljZShpLS0sIDEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGJhY2tJID0gMTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIC8qIHZpZHByYXZ1dHUgdiB2aWRzdGlpbnVrIGRseWEgN2hvIHRpcGEgKi8NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZS5tZXNzYWdlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBhcnJheSA9IHRleHRMZW5ndGhHYXRoZXJlcihsb3JkT2ZFbGVtZW50cyksDQogICAgICAgICAgICB0bEFycmF5ID0gYXJyYXkuYXJyYXksDQogICAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7DQoNCiAgICAgICAgaWYgKGNvbnRhaW5lckZvcjZ0aC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICBwZXJjZW50SW5zZXJ0ZXIobG9yZE9mRWxlbWVudHMsIGNvbnRhaW5lckZvcjZ0aCwgdGxBcnJheSwgbGVuZ3RoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoY29udGFpbmVyRm9yN3RoLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIHN5bWJvbEluc2VydGVyKGxvcmRPZkVsZW1lbnRzLCBjb250YWluZXJGb3I3dGgsIHRsQXJyYXkpOw0KICAgICAgICB9DQogICAgICAgIHNob3J0Y29kZXNJbnNlcnQoKTsNCiAgICAgICAgbGV0IHN0b3BwZXIgPSAwOw0KDQogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKHJlcGVhdCA9IHRydWUpIHsNCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgLyogYXN5bmNCbG9ja3NJbnNlcnRpbmdGdW5jdGlvbihibG9ja1NldHRpbmdBcnJheSwgY29udGVudExlbmd0aCkgKi8NCiAgICAgICAgICAgICAgICAgICAgYXN5bmNCbG9ja3NJbnNlcnRpbmdGdW5jdGlvbihibG9ja1NldHRpbmdBcnJheSk7DQogICAgICAgICAgICAgICAgfSwgMTAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gcG9zc2libGVUYWdzSW5DaGVja0NvbmZpcm1lcihwb3NzaWJsZVRhZ3NBcnJheSwgcG9zc2libGVUYWdzSW5DaGVjaykgew0KICAgIGlmIChwb3NzaWJsZVRhZ3NBcnJheS5pbmNsdWRlcygiTEkiKSkgew0KICAgICAgICBpZiAocG9zc2libGVUYWdzQXJyYXkuaW5jbHVkZXMoIlVMIikpIHsNCiAgICAgICAgICAgIHBvc3NpYmxlVGFnc0luQ2hlY2sucHVzaCgiVUwiKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocG9zc2libGVUYWdzQXJyYXkuaW5jbHVkZXMoIk9MIikpIHsNCiAgICAgICAgICAgIHBvc3NpYmxlVGFnc0luQ2hlY2sucHVzaCgiT0wiKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gdGV4dExlbmd0aEdhdGhlcmVyKGxvcmRPZkVsZW1lbnRzTG9jKSB7DQogICAgdmFyIHBvc3NpYmxlVGFnc0FycmF5Ow0KICAgIGlmICh0eXBlb2YgdGFnc0xpc3RGb3JUZXh0TGVuZ3RoIT09InVuZGVmaW5lZCIpIHsNCiAgICAgICAgcG9zc2libGVUYWdzQXJyYXkgPSB0YWdzTGlzdEZvclRleHRMZW5ndGg7DQogICAgfSBlbHNlIHsNCiAgICAgICAgcG9zc2libGVUYWdzQXJyYXkgPSBbIlAiLCAiSDEiLCAiSDIiLCAiSDMiLCAiSDQiLCAiSDUiLCAiSDYiLCAiRElWIiwgIkJMT0NLUVVPVEUiLCAiSU5ERVgiLCAiQVJUSUNMRSIsICJTRUNUSU9OIl07DQogICAgfQ0KICAgIGxldCBwb3NzaWJsZVRhZ3NJbkNoZWNrID0gWyJESVYiLCAiSU5ERVgiLCAiU0VDVElPTiJdOw0KDQogICAgcG9zc2libGVUYWdzSW5DaGVja0NvbmZpcm1lcihwb3NzaWJsZVRhZ3NBcnJheSwgcG9zc2libGVUYWdzSW5DaGVjayk7DQogICAgbGV0IGV4Y0FyciA9IGV4Y0lkQ2xVbnBhY2tlcigpLA0KICAgICAgICB0ZXh0TGVuZ3RoID0gMCwNCiAgICAgICAgdGxBcnJheSA9IFtdOw0KDQogICAgZnVuY3Rpb24gdGV4dExlbmd0aEdhdGhlcmVyUmVjKGxvcmRPZkVsZW1lbnRzTG9jKSB7DQogICAgICAgIGxldCBhbGxvd2VkOw0KICAgICAgICBsZXQgY291MTsNCiAgICAgICAgbGV0IGNsYXNzZXNBcnJheTsNCiAgICAgICAgbGV0IGNvdW50U3VjY2VzcyA9IDA7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlVGFnc0FycmF5LmluY2x1ZGVzKGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLnRhZ05hbWUpDQogICAgICAgICAgICAgICAgICAgICYmIWxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLmNsYXNzTGlzdC5jb250YWlucygicGVyY2VudFBvaW50ZXJDbGFzcyIpDQogICAgICAgICAgICAgICAgICAgICYmbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0uaWQhPSJ0b2NfY29udGFpbmVyIg0KICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgICBpZiAocG9zc2libGVUYWdzSW5DaGVjay5pbmNsdWRlcyhsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS50YWdOYW1lKQ0KICAgICAgICAgICAgICAgICAgICAgICAgJiYobG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0uY2hpbGRyZW4ubGVuZ3RoID4gMCkNCiAgICAgICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS5pZCYmZXhjQXJyWydpZCddLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3UxID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZXhjQXJyWydpZCddW2NvdTFdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS5pZC50b0xvd2VyQ2FzZSgpPT1leGNBcnJbJ2lkJ11bY291MV0udG9Mb3dlckNhc2UoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291MSsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLmNsYXNzTGlzdC5sZW5ndGggPiAwJiZleGNBcnJbJ2NsYXNzJ10ubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdTEgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChleGNBcnJbJ2NsYXNzJ11bY291MV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3Nlc0FycmF5ID0gZXhjQXJyWydjbGFzcyddW2NvdTFdLnNwbGl0KCcuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzQXJyYXkuZXZlcnkoY2xhc3NOYW1lID0+IGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291MSsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y0FyclsndGFnJ10ubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdTEgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChleGNBcnJbJ3RhZyddW2NvdTFdKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb3JkT2ZFbGVtZW50c0xvYy5jaGlsZHJlbltpXS50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PWV4Y0FyclsndGFnJ11bY291MV0udG9Mb3dlckNhc2UoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291MSsrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dExlbmd0aEdhdGhlcmVyUmVjKGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldLCBleGNBcnIsIHBvc3NpYmxlVGFnc0FycmF5LCBwb3NzaWJsZVRhZ3NJbkNoZWNrKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudFN1Y2Nlc3MrKzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoICsgbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0uaW5uZXJUZXh0Lmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgdGxBcnJheS5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0udGFnTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogbG9yZE9mRWxlbWVudHNMb2MuY2hpbGRyZW5baV0uaW5uZXJUZXh0Lmxlbmd0aCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFN1bTogdGV4dExlbmd0aCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGxvcmRPZkVsZW1lbnRzTG9jLmNoaWxkcmVuW2ldDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICBjb3VudFN1Y2Nlc3MrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gY2F0Y2ggKGVyKSB7DQogICAgICAgICAgICBjb25zb2xlLmxvZyhlci5tZXNzYWdlKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gY291bnRTdWNjZXNzID4gMDsNCiAgICB9DQoNCiAgICB0ZXh0TGVuZ3RoR2F0aGVyZXJSZWMobG9yZE9mRWxlbWVudHNMb2MpOw0KDQogICAgcmV0dXJuIHthcnJheTogdGxBcnJheSwgbGVuZ3RoOiB0ZXh0TGVuZ3RofTsNCn0NCg0Kd2luZG93LmFzeW5jRnVuY3Rpb25MYXVuY2hlciA9IGZ1bmN0aW9uKCkgew0KICAgIGlmICh3aW5kb3cuanNJbnB1dGVyTGF1bmNoICE9PSB1bmRlZmluZWQNCiAgICAgICAgJiZbMTUsIDEwXS5pbmNsdWRlcyh3aW5kb3cuanNJbnB1dGVyTGF1bmNoKQ0KICAgICAgICAmJih0eXBlb2YgYXN5bmNCbG9ja3NJbnNlcnRpbmdGdW5jdGlvbiAhPT0gJ3VuZGVmaW5lZCcgKQ0KICAgICAgICAmJih0eXBlb2YgYXN5bmNCbG9ja3NJbnNlcnRpbmdGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykNCiAgICAgICAgJiZ0eXBlb2YgZW5kZWRTYyE9PSd1bmRlZmluZWQnJiYNCiAgICAgICAgdHlwZW9mIGVuZGVkQ2MhPT0ndW5kZWZpbmVkJyYmDQogICAgICAgIHR5cGVvZiB1c2VkQWRCbG9ja3NBcnJheSE9PSd1bmRlZmluZWQnJiYNCiAgICAgICAgdHlwZW9mIHVzZWRCbG9ja1NldHRpbmdBcnJheUlkcyE9PSd1bmRlZmluZWQnJiYNCiAgICAgICAgdHlwZW9mIHNhbWVFbGVtZW50QWZ0ZXJXaWR0aCE9PSd1bmRlZmluZWQnJiYNCiAgICAgICAgdHlwZW9mIHNhbWVFbGVtZW50QWZ0ZXJFeGNDbGFzc0lkIT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2Ygc2FtZUVsZW1lbnRBZnRlckZyb21Db25zdHJ1Y3Rpb24hPT0ndW5kZWZpbmVkJyYmDQogICAgICAgIHR5cGVvZiByYl90ZW1wRWxlbWVudF9jaGVjayE9PSd1bmRlZmluZWQnJiYNCiAgICAgICAgdHlwZW9mIHJiX3RlbXBFbGVtZW50IT09J3VuZGVmaW5lZCcmJg0KICAgICAgICB0eXBlb2Ygd2luZG93LmpzSW5wdXRlckxhdW5jaCE9PSd1bmRlZmluZWQnKSB7DQogICAgICAgIC8qIGFzeW5jQmxvY2tzSW5zZXJ0aW5nRnVuY3Rpb24oYmxvY2tTZXR0aW5nQXJyYXksIGNvbnRlbnRMZW5ndGgpOyAqLw0KICAgICAgICBhc3luY0Jsb2Nrc0luc2VydGluZ0Z1bmN0aW9uKGJsb2NrU2V0dGluZ0FycmF5KTsNCiAgICAgICAgaWYgKCFlbmRlZFNjKSB7DQogICAgICAgICAgICBzaG9ydGNvZGVzSW5zZXJ0KCk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCFlbmRlZENjKSB7DQogICAgICAgICAgICAvKiBjbGVhclVuc3VpdGFibGVDYWNoZSgwKTsgKi8NCiAgICAgICAgfQ0KICAgICAgICAvKiBibG9ja3NSZXBvc2l0aW9uKCk7DQogICAgICAgIGNhY2hlUGxhY2luZygpOw0KICAgICAgICBzeW1ib2xNYXJrZXJzUGxhY2VkKCk7ICovDQogICAgfSBlbHNlIHsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBhc3luY0Z1bmN0aW9uTGF1bmNoZXIoKTsNCiAgICAgICAgfSwgNTApOw0KICAgIH0NCn07DQovKiBhc3luY0Z1bmN0aW9uTGF1bmNoZXIoKTsgKi8NCg0KZnVuY3Rpb24gYXN5bmNJbnNlcnRpbmdzSW5zZXJ0aW5nRnVuY3Rpb24oaW5zZXJ0aW5nc0FycmF5KSB7DQogICAgbGV0IGN1cnJlbnRFbGVtZW50Rm9ySW5zZXJ0aW5nID0gMDsNCiAgICBsZXQgY3VycmVudEVsZW1lbnRUb01vdmUgPSAwOw0KICAgIGxldCBwb3NpdGlvbkVsZW1lbnQgPSAwOw0KICAgIGxldCBwb3NpdGlvbiA9IDA7DQogICAgbGV0IGluc2VydFRvQWRkID0gMDsNCiAgICBsZXQgcG9zdElkID0gMDsNCiAgICBsZXQgcmVwZWF0U2VhcmNoID0gMDsNCiAgICBpZiAoaW5zZXJ0aW5nc0FycmF5JiZpbnNlcnRpbmdzQXJyYXkubGVuZ3RoID4gMCkgew0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluc2VydGluZ3NBcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKCFpbnNlcnRpbmdzQXJyYXlbaV1bJ3VzZWQnXXx8KGluc2VydGluZ3NBcnJheVtpXVsndXNlZCddJiZpbnNlcnRpbmdzQXJyYXlbaV1bJ3VzZWQnXT09MCkpIHsNCiAgICAgICAgICAgICAgICBwb3NpdGlvbkVsZW1lbnQgPSBpbnNlcnRpbmdzQXJyYXlbaV1bJ3Bvc2l0aW9uX2VsZW1lbnQnXTsNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGluc2VydGluZ3NBcnJheVtpXVsncG9zaXRpb24nXTsNCiAgICAgICAgICAgICAgICBpbnNlcnRUb0FkZCA9IGluc2VydGluZ3NBcnJheVtpXVsnY29udGVudCddOw0KICAgICAgICAgICAgICAgIHBvc3RJZCA9IGluc2VydGluZ3NBcnJheVtpXVsncG9zdElkJ107DQoNCiAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudEZvckluc2VydGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocG9zaXRpb25FbGVtZW50KTsNCg0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50VG9Nb3ZlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvdmVyZWRJbnNlcnRpbmdzW2RhdGEtaWQ9IicrcG9zdElkKyciXScpOw0KICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudEZvckluc2VydGluZykgew0KICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb249PTApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Rm9ySW5zZXJ0aW5nLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGN1cnJlbnRFbGVtZW50VG9Nb3ZlLCBjdXJyZW50RWxlbWVudEZvckluc2VydGluZyk7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RWxlbWVudFRvTW92ZS5jbGFzc0xpc3QucmVtb3ZlKCdjb3ZlcmVkSW5zZXJ0aW5ncycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0aW5nc0FycmF5W2ldWyd1c2VkJ10gPSAxOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRGb3JJbnNlcnRpbmcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY3VycmVudEVsZW1lbnRUb01vdmUsIGN1cnJlbnRFbGVtZW50Rm9ySW5zZXJ0aW5nLm5leHRTaWJsaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50VG9Nb3ZlLmNsYXNzTGlzdC5yZW1vdmUoJ2NvdmVyZWRJbnNlcnRpbmdzJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpbmdzQXJyYXlbaV1bJ3VzZWQnXSA9IDE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXBlYXRTZWFyY2ggPSAxOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBpZiAocmVwZWF0U2VhcmNoID09IDEpIHsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBhc3luY0luc2VydGluZ3NJbnNlcnRpbmdGdW5jdGlvbihpbnNlcnRpbmdzQXJyYXkpOw0KICAgICAgICB9LCAxMDApDQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBpbnNlcnRpbmdzRnVuY3Rpb25MYXVuY2goKSB7DQogICAgaWYgKHdpbmRvdy5qc0luc2VydGluZ3NMYXVuY2ggIT09IHVuZGVmaW5lZCYmanNJbnNlcnRpbmdzTGF1bmNoID09IDI1KSB7DQogICAgICAgIGFzeW5jSW5zZXJ0aW5nc0luc2VydGluZ0Z1bmN0aW9uKGluc2VydGluZ3NBcnJheSk7DQogICAgfSBlbHNlIHsNCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICBpbnNlcnRpbmdzRnVuY3Rpb25MYXVuY2goKTsNCiAgICAgICAgfSwgMTAwKQ0KICAgIH0NCn0NCg0KZnVuY3Rpb24gc2V0TG9uZ0NhY2hlKCkgew0KICAgIGxldCB4aHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KICAgIGxldCBzZW5kRGF0YSA9ICdhY3Rpb249c2V0TG9uZ0NhY2hlJnR5cGU9bG9uZ0NhdGNoaW5nJzsNCiAgICB4aHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbihyZWRhdGEpIHsNCiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSA0ICYmIHRoaXMuc3RhdHVzID09IDIwMCkgew0KICAgICAgICAgICAgY29uc29sZS5sb2coJ2xvbmcgY2FjaGUgZGVwbG95ZWQnKTsNCiAgICAgICAgfQ0KICAgIH07DQogICAgeGh0dHAub3BlbigiUE9TVCIsIHJiX2FqYXh1cmwsIHRydWUpOw0KICAgIHhodHRwLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsNCiAgICB4aHR0cC5zZW5kKHNlbmREYXRhKTsNCn0NCg0KZnVuY3Rpb24gY2FjaGVQbGFjaW5nKGFsZXJ0X3R5cGUsIGVycm9ySW5mbz1udWxsKSB7DQogICAgbGV0IGFkQmxvY2tzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBlcmNlbnRQb2ludGVyQ2xhc3MgLicgKyBibG9ja19jbGFzc2VzLmpvaW4oJywgLnBlcmNlbnRQb2ludGVyQ2xhc3MgLicpKTsNCiAgICBsZXQgY3VyQWRCbG9jazsNCiAgICBsZXQgb2tTdGF0ZXMgPSBbJ2RvbmUnLCdyZWZyZXNoLXdhaXQnLCduby1ibG9jaycsJ2ZldGNoZWQnXTsNCiAgICAvKiBsZXQgYWRJZCA9IC0xOyAqLw0KICAgIGxldCBibG9ja0FpZCA9IG51bGw7DQogICAgbGV0IGJsb2NrSWQ7DQoNCiAgICBpZiAodHlwZW9mIGNhY2hlZEJsb2Nrc0FycmF5ICE9PSAndW5kZWZpbmVkJyYmY2FjaGVkQmxvY2tzQXJyYXkmJmNhY2hlZEJsb2Nrc0FycmF5Lmxlbmd0aCA+IDAmJmFkQmxvY2tzJiZhZEJsb2Nrcy5sZW5ndGggPiAwKSB7DQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRCbG9ja3MubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGJsb2NrQWlkID0gYWRCbG9ja3NbaV1bJ2RhdGFzZXQnXVsnYWlkJ107DQoNCiAgICAgICAgICAgIGlmICghYmxvY2tBaWQpIHsNCiAgICAgICAgICAgICAgICBibG9ja0lkID0gYWRCbG9ja3NbaV1bJ2RhdGFzZXQnXVsnaWQnXTsNCiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkQmxvY2tzQXJyYXlbYmxvY2tJZF0pIHsNCiAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KGFkQmxvY2tzW2ldKS5odG1sKGNhY2hlZEJsb2Nrc0FycmF5W2Jsb2NrSWRdKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAoYWxlcnRfdHlwZSYmYWxlcnRfdHlwZT09J2hpZ2gnKSB7DQogICAgICAgIHNldExvbmdDYWNoZSgpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gc3ltYm9sSW5zZXJ0ZXIobG9yZE9mRWxlbWVudHMsIGNvbnRhaW5lckZvcjd0aCwgdGxBcnJheSkgew0KICAgIHRyeSB7DQogICAgICAgIHZhciBjdXJyZW50Q2hpbGRyZW5MZW5ndGggPSAwOw0KICAgICAgICBsZXQgcHJldmlvdXNCcmVhayA9IDA7DQogICAgICAgIGxldCBuZWVkbGVMZW5ndGg7DQogICAgICAgIGxldCBjdXJyZW50U3VtTGVuZ3RoOw0KICAgICAgICBsZXQgZWxlbWVudFRvQWRkOw0KICAgICAgICBsZXQgZWxlbWVudFRvQmluZDsNCiAgICAgICAgbGV0IGVsZW1lbnRUb0FkZFN0eWxlOw0KICAgICAgICBsZXQgYmxvY2tfbnVtYmVyOw0KICAgICAgICBsZXQgYmluZGVyTmFtZTsNCg0KICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYXJrZWRTcGFuMSIpKSB7DQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRhaW5lckZvcjd0aC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHByZXZpb3VzQnJlYWsgPSAwOw0KICAgICAgICAgICAgICAgIGN1cnJlbnRDaGlsZHJlbkxlbmd0aCA9IDA7DQogICAgICAgICAgICAgICAgY3VycmVudFN1bUxlbmd0aCA9IDA7DQogICAgICAgICAgICAgICAgbmVlZGxlTGVuZ3RoID0gTWF0aC5hYnMoY29udGFpbmVyRm9yN3RoW2ldWydlbGVtZW50UGxhY2UnXSk7DQogICAgICAgICAgICAgICAgYmluZGVyTmFtZSA9IGVsZW1lbnRCaW5kZXJOYW1lR2VuZXJhdG9yKCk7DQoNCiAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCiAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LmFkZCgicGVyY2VudFBvaW50ZXJDbGFzcyIpOw0KICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJtYXJrZWQiKTsNCiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyRm9yN3RoW2ldWyJzYyJdPT0xKSB7DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJzY01hcmsiKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmRhdGFzZXQucmJpbmRlciA9IGJpbmRlck5hbWU7DQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmlubmVySFRNTCA9IGNvbnRhaW5lckZvcjd0aFtpXVsidGV4dCJdOw0KICAgICAgICAgICAgICAgIGJsb2NrX251bWJlciA9IGVsZW1lbnRUb0FkZC5jaGlsZHJlblswXS5hdHRyaWJ1dGVzWydkYXRhLWlkJ10udmFsdWU7DQogICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50VG9BZGQpIHsNCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkU3R5bGUgPSBjcmVhdGVTdHlsZUVsZW1lbnQoYmxvY2tfbnVtYmVyLCBjb250YWluZXJGb3I3dGhbaV1bImVsZW1lbnRDc3MiXSk7DQoNCiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFRvQWRkU3R5bGUmJmVsZW1lbnRUb0FkZFN0eWxlIT0nZGVmYXVsdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLnN0eWxlLnRleHRBbGlnbiA9IGVsZW1lbnRUb0FkZFN0eWxlOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGb3I3dGhbaV1bJ2VsZW1lbnRQbGFjZSddIDwgMCkgew0KICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gdGxBcnJheS5sZW5ndGgtMTsgaiA+IC0xOyBqLS0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdW1MZW5ndGggPSBjdXJyZW50U3VtTGVuZ3RoICsgdGxBcnJheVtqXVsnbGVuZ3RoJ107DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZGxlTGVuZ3RoIDwgY3VycmVudFN1bUxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQgPSB0bEFycmF5W2pdWydlbGVtZW50J107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZCA9IGN1cnJlbnRFbGVtZW50UmVjZWl2ZXJTcGVjKHRydWUsIGosIHRsQXJyYXksIGVsZW1lbnRUb0JpbmQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudFRvQWRkLCBlbGVtZW50VG9CaW5kKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9CaW5kLmNsYXNzTGlzdC5hZGQoJ3JiaW5kZXItJytiaW5kZXJOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LnJlbW92ZSgnY292ZXJlZEFkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5lckZvcjd0aFtpXVsnZWxlbWVudFBsYWNlJ10gPT0gMCkgew0KICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9CaW5kID0gdGxBcnJheVswXVsnZWxlbWVudCddOw0KICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9CaW5kLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnRUb0FkZCwgZWxlbWVudFRvQmluZCk7DQogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQuY2xhc3NMaXN0LmFkZCgncmJpbmRlci0nK2JpbmRlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LnJlbW92ZSgnY292ZXJlZEFkJyk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0bEFycmF5Lmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3VtTGVuZ3RoID0gY3VycmVudFN1bUxlbmd0aCArIHRsQXJyYXlbal1bJ2xlbmd0aCddOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRsZUxlbmd0aCA8IGN1cnJlbnRTdW1MZW5ndGgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9CaW5kID0gdGxBcnJheVtqXVsnZWxlbWVudCddOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQgPSBjdXJyZW50RWxlbWVudFJlY2VpdmVyU3BlYyhmYWxzZSwgaiwgdGxBcnJheSwgZWxlbWVudFRvQmluZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQmluZC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbGVtZW50VG9BZGQsIGVsZW1lbnRUb0JpbmQubmV4dFNpYmxpbmcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQuY2xhc3NMaXN0LmFkZCgncmJpbmRlci0nK2JpbmRlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QucmVtb3ZlKCdjb3ZlcmVkQWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIHNwYW5NYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7DQogICAgICAgICAgICBzcGFuTWFya2VyLnNldEF0dHJpYnV0ZSgiaWQiLCAibWFya2VkU3BhbjEiKTsNCiAgICAgICAgICAgIGxvcmRPZkVsZW1lbnRzLnByZXBlbmQoc3Bhbk1hcmtlcik7DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChlKSB7DQogICAgICAgIGNvbnNvbGUubG9nKGUpOw0KICAgIH0NCn0NCg0KZnVuY3Rpb24gcGVyY2VudEluc2VydGVyKGxvcmRPZkVsZW1lbnRzLCBjb250YWluZXJGb3I2dGgsIHRsQXJyYXksIHRleHRMZW5ndGgpIHsNCiAgICB0cnkgew0KICAgICAgICB2YXIgdGV4dE5lZWR5TGVuZ3RoID0gMDsNCiAgICAgICAgbGV0IGVsZW1lbnRUb0FkZDsNCiAgICAgICAgdmFyIGVsZW1lbnRUb0JpbmQ7DQogICAgICAgIGxldCBlbGVtZW50VG9BZGRTdHlsZTsNCiAgICAgICAgbGV0IGJsb2NrX251bWJlcjsNCiAgICAgICAgdmFyIGJpbmRlck5hbWU7DQogICAgICAgIC8qIHZhciBjaGVja0lmQmxvY2tVc2VkID0gMDsgKi8NCg0KICAgICAgICBmdW5jdGlvbiBpbnNlcnRCeVBlcmNlbnRzKHRleHRMZW5ndGgpIHsNCiAgICAgICAgICAgIGxldCBsb2NhbE1pZGRsZVZhbHVlID0gMDsNCg0KICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb250YWluZXJGb3I2dGgubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICB0ZXh0TmVlZHlMZW5ndGggPSBNYXRoLnJvdW5kKHRleHRMZW5ndGggKiAoY29udGFpbmVyRm9yNnRoW2pdWyJlbGVtZW50UGxhY2UiXS8xMDApKTsNCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRsQXJyYXkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHRsQXJyYXlbaV1bJ2xlbmd0aFN1bSddID49IHRleHROZWVkeUxlbmd0aCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYmluZGVyTmFtZSA9IGVsZW1lbnRCaW5kZXJOYW1lR2VuZXJhdG9yKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5hZGQoInBlcmNlbnRQb2ludGVyQ2xhc3MiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5jbGFzc0xpc3QuYWRkKCJtYXJrZWQiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJGb3I2dGhbal1bInNjIl09PTEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuY2xhc3NMaXN0LmFkZCgic2NNYXJrIik7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuZGF0YXNldC5yYmluZGVyID0gYmluZGVyTmFtZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkZC5pbm5lckhUTUwgPSBjb250YWluZXJGb3I2dGhbal1bInRleHQiXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudFRvQWRkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBibG9ja19udW1iZXIgPSBlbGVtZW50VG9BZGQuY2hpbGRyZW5bMF0uYXR0cmlidXRlc1snZGF0YS1pZCddLnZhbHVlOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkU3R5bGUgPSBjcmVhdGVTdHlsZUVsZW1lbnQoYmxvY2tfbnVtYmVyLCBjb250YWluZXJGb3I2dGhbal1bImVsZW1lbnRDc3MiXSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFRvQWRkU3R5bGUmJmVsZW1lbnRUb0FkZFN0eWxlIT0nZGVmYXVsdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9BZGQuc3R5bGUudGV4dEFsaWduID0gZWxlbWVudFRvQWRkU3R5bGU7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTWlkZGxlVmFsdWUgPSB0bEFycmF5W2ldWydsZW5ndGhTdW0nXSAtIE1hdGgucm91bmQodGxBcnJheVtpXVsnbGVuZ3RoJ10vMik7DQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9CaW5kID0gdGxBcnJheVtpXVsnZWxlbWVudCddOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRSZWNlaXZlclNwZWMoZmFsc2UsIGksIHRsQXJyYXksIGVsZW1lbnRUb0JpbmQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHROZWVkeUxlbmd0aCA8IGxvY2FsTWlkZGxlVmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9CaW5kLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnRUb0FkZCwgZWxlbWVudFRvQmluZCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudFRvQWRkLCBlbGVtZW50VG9CaW5kLm5leHRTaWJsaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0JpbmQuY2xhc3NMaXN0LmFkZCgncmJpbmRlci0nK2JpbmRlck5hbWUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvQWRkLmNsYXNzTGlzdC5yZW1vdmUoJ2NvdmVyZWRBZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBjbGVhclRsTWFya3MoKSB7DQogICAgICAgICAgICBsZXQgbWFya3NGb3JEZWxldGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50ZXh0TGVuZ3RoTWFya2VyJyk7DQoNCiAgICAgICAgICAgIGlmIChtYXJrc0ZvckRlbGV0aW5nLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtzRm9yRGVsZXRpbmcubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgbWFya3NGb3JEZWxldGluZ1tpXS5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYXJrZWRTcGFuIikpIHsNCiAgICAgICAgICAgIGluc2VydEJ5UGVyY2VudHModGV4dExlbmd0aCk7DQogICAgICAgICAgICBjbGVhclRsTWFya3MoKTsNCiAgICAgICAgICAgIHZhciBzcGFuTWFya2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOw0KICAgICAgICAgICAgc3Bhbk1hcmtlci5zZXRBdHRyaWJ1dGUoImlkIiwgIm1hcmtlZFNwYW4iKTsNCiAgICAgICAgICAgIGxvcmRPZkVsZW1lbnRzLnByZXBlbmQoc3Bhbk1hcmtlcik7DQogICAgICAgIH0NCiAgICB9IGNhdGNoIChlKSB7DQogICAgICAgIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBzYXZlQ29udGVudEJsb2NrKGNvbnRlbnRDb250YWluZXIpIHsNCiAgICB0cnkgew0KICAgICAgICBpZiAoIWdhdGhlcl9jb250ZW50KSB7DQogICAgICAgICAgICBjb25zb2xlLmxvZygnY29udGVudCBnYXRoZXIgc2F2ZSBmdW5jdGlvbiBlbnRlcmVkJyk7DQogICAgICAgICAgICBsZXQgeGh0dHAgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsNCiAgICAgICAgICAgIGxldCBzZW5kRGF0YSA9ICdhY3Rpb249UkZXUF9zYXZlQ29udGVudENvbnRhaW5lciZ0eXBlPWdhdGhlckNvbnRlbnRCbG9jayZkYXRhPScrY29udGVudENvbnRhaW5lcjsNCiAgICAgICAgICAgIHhodHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKHJlZGF0YSkgew0KICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT0gNCAmJiB0aGlzLnN0YXR1cyA9PSAyMDApIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvbnRlbnQgZ2F0aGVyIHN1Y2NlZWQnKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnY29udGVudCBnYXRoZXIgZ29uZSB3cm9uZycpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQogICAgICAgICAgICB4aHR0cC5vcGVuKCJQT1NUIiwgcmJfYWpheHVybCwgdHJ1ZSk7DQogICAgICAgICAgICB4aHR0cC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7DQogICAgICAgICAgICB4aHR0cC5zZW5kKHNlbmREYXRhKTsNCiAgICAgICAgfQ0KICAgIH0gY2F0Y2ggKGVyKSB7DQogICAgICAgIGNvbnNvbGUubG9nKCdjb250ZW50IGdhdGhlciBlcnJvcjogJytlcisnOycpOw0KICAgIH0NCn0NCg0Kd2luZG93LmdhdGhlckNvbnRlbnRCbG9jayA9IGZ1bmN0aW9uKCkgew0KICAgIGxldCBjUG9pbnRlciA9IG51bGwsDQogICAgICAgIGNQb2ludGVyUGFyZW50ID0gbnVsbCwNCiAgICAgICAgY1BvaW50ZXJQYXJlbnRTdHJpbmcgPSBudWxsLA0KICAgICAgICBjbGFzc1dvcmRzID0gWydjb250ZW50JywnZW50cnknLCdwb3N0Jywnd3JhcCcsJ2Rlc2NyaXB0aW9uJywndGF4b25vbXknXSwNCiAgICAgICAgY2xhc3NDaG9vc2VkID0gZmFsc2U7DQoNCiAgICBjUG9pbnRlciA9ICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY29udGVudF9wb2ludGVyX2lkJyk7DQogICAgaWYgKGNQb2ludGVyKSB7DQogICAgICAgIGlmICh3aW5kb3cuanNJbnB1dGVyTGF1bmNoIT09MTUpIHsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgICBjUG9pbnRlclBhcmVudCA9IGNQb2ludGVyLnBhcmVudEVsZW1lbnQ7DQogICAgICAgIGlmIChjUG9pbnRlclBhcmVudCkgew0KICAgICAgICAgICAgaWYgKGNQb2ludGVyUGFyZW50LmlkKSB7DQogICAgICAgICAgICAgICAgY1BvaW50ZXJQYXJlbnRTdHJpbmcgPSAnIycrY1BvaW50ZXJQYXJlbnQuaWQ7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGlmIChjUG9pbnRlclBhcmVudC5jbGFzc0xpc3QubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICBjUG9pbnRlclBhcmVudFN0cmluZyA9ICcuJytjUG9pbnRlclBhcmVudC5jbGFzc0xpc3RbMF07DQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2xhc3NXb3Jkcy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjUG9pbnRlclBhcmVudC5jbGFzc0xpc3QubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY1BvaW50ZXJQYXJlbnQuY2xhc3NMaXN0W2ldLmluY2x1ZGVzKGNsYXNzV29yZHNbal0pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNQb2ludGVyUGFyZW50U3RyaW5nID0gJy4nK2NQb2ludGVyUGFyZW50LmNsYXNzTGlzdFtpXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NDaG9vc2VkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzQ2hvb3NlZD09PXRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChjUG9pbnRlclBhcmVudFN0cmluZykgew0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdjb250ZW50IGdhdGhlciBjb250ZW50IGJsb2NrIGRldGVjdGVkJyk7DQogICAgICAgICAgICAgICAgLyogY1BvaW50ZXJQYXJlbnRTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShjUG9pbnRlclBhcmVudFN0cmluZyk7ICovDQogICAgICAgICAgICAgICAgc2F2ZUNvbnRlbnRCbG9jayhjUG9pbnRlclBhcmVudFN0cmluZyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgICBjb25zb2xlLmxvZygnY29udGVudCBnYXRoZXIgZGVsYXllZCcpOw0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGdhdGhlckNvbnRlbnRCbG9jaygpOw0KICAgICAgICB9LCA1MDApOw0KICAgIH0NCn07DQoNCndpbmRvdy5yZW1vdmVNYXJnaW5DbGFzcyA9IGZ1bmN0aW9uKGJsb2NrT2JqZWN0KSB7DQogICAgaWYgKGJsb2NrT2JqZWN0ICYmIHR5cGVvZiB3aW5kb3cuanNJbnB1dGVyTGF1bmNoICE9PSAndW5kZWZpbmVkJyAmJiBbMTUsIDEwXS5pbmNsdWRlcyh3aW5kb3cuanNJbnB1dGVyTGF1bmNoKSkgew0KICAgICAgICBsZXQgYmluZGVyTmFtZSwNCiAgICAgICAgICAgIG5lZWRlZEVsZW1lbnQsDQogICAgICAgICAgICBjdXJyZW50RGlyZWN0aW9uLA0KICAgICAgICAgICAgc2Vla2VySXRlcmF0aW9uQ291bnQsDQogICAgICAgICAgICBjdXJyZW50U3VibGluZzsNCg0KICAgICAgICBiaW5kZXJOYW1lID0gYmxvY2tPYmplY3QuZGF0YXNldC5yYmluZGVyOw0KICAgICAgICBpZiAoYmluZGVyTmFtZSkgew0KICAgICAgICAgICAgc2Vla2VySXRlcmF0aW9uQ291bnQgPSAwOw0KICAgICAgICAgICAgY3VycmVudERpcmVjdGlvbiA9ICdiZWZvcmUnOw0KICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgIHNlZWtlckl0ZXJhdGlvbkNvdW50Kys7DQogICAgICAgICAgICAgICAgY3VycmVudFN1YmxpbmcgPSBibG9ja09iamVjdC5uZXh0RWxlbWVudFNpYmxpbmc7DQogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdWJsaW5nJiZjdXJyZW50U3VibGluZy5jbGFzc0xpc3QuY29udGFpbnMoJ3JiaW5kZXItJytiaW5kZXJOYW1lKSkgew0KICAgICAgICAgICAgICAgICAgICBuZWVkZWRFbGVtZW50ID0gY3VycmVudFN1Ymxpbmc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSB3aGlsZSAoY3VycmVudFN1YmxpbmcmJiFuZWVkZWRFbGVtZW50JiZzZWVrZXJJdGVyYXRpb25Db3VudCA8IDUpOw0KDQogICAgICAgICAgICBpZiAoIW5lZWRlZEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICBzZWVrZXJJdGVyYXRpb25Db3VudCA9IDA7DQogICAgICAgICAgICAgICAgY3VycmVudERpcmVjdGlvbiA9ICdhZnRlcic7DQogICAgICAgICAgICAgICAgZG8gew0KICAgICAgICAgICAgICAgICAgICBzZWVrZXJJdGVyYXRpb25Db3VudCsrOw0KICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3VibGluZyA9IGJsb2NrT2JqZWN0LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7DQogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3VibGluZyYmY3VycmVudFN1YmxpbmcuY2xhc3NMaXN0LmNvbnRhaW5zKCdyYmluZGVyLScrYmluZGVyTmFtZSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZEVsZW1lbnQgPSBjdXJyZW50U3VibGluZzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKGN1cnJlbnRTdWJsaW5nJiYhbmVlZGVkRWxlbWVudCYmc2Vla2VySXRlcmF0aW9uQ291bnQgPCA1KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChuZWVkZWRFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnREaXJlY3Rpb24gPT09ICdiZWZvcmUnKSB7DQogICAgICAgICAgICAgICAgICAgIG5lZWRlZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncmZ3cF9yZW1vdmVkTWFyZ2luVG9wJyk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbmVlZGVkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdyZndwX3JlbW92ZWRNYXJnaW5Cb3R0b20nKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gZmFsc2U7DQp9Ow0KDQpmdW5jdGlvbiBlbGVtZW50QmluZGVyTmFtZUdlbmVyYXRvcigpIHsNCiAgICBsZXQgYmluZGVyTmFtZSA9ICcnLA0KICAgICAgICBjaGVja2VkRWxlbWVudHMsDQogICAgICAgIHBhc3NlZCA9IGZhbHNlOw0KDQogICAgd2hpbGUgKHBhc3NlZD09PWZhbHNlKSB7DQogICAgICAgIGJpbmRlck5hbWUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMTAwMDAwKTsNCiAgICAgICAgY2hlY2tlZEVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcmJpbmRlcj0iJytiaW5kZXJOYW1lKyciXScpOw0KICAgICAgICBpZiAoY2hlY2tlZEVsZW1lbnRzLmxlbmd0aCA8IDEpIHsNCiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gYmluZGVyTmFtZTsNCn0K
data:text/javascript;base64,DQogICAgdmFyIGJsb2NrX2NsYXNzZXMgPSBbImNvbnRlbnRfcmIiLCAiY250MzJfcmxfYmdfc3RyIiwgInJsX2NudF9iZyJdOw0KDQogICAgZnVuY3Rpb24gYWRkQXR0ckl0ZW0oY2xhc3NOYW1lKSB7DQogICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuIiArIGNsYXNzTmFtZSkgJiYgIWJsb2NrX2NsYXNzZXMuaW5jbHVkZXMoY2xhc3NOYW1lKSkgew0KICAgICAgICAgICAgYmxvY2tfY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7DQogICAgICAgIH0NCiAgICB9DQo=
data:text/javascript;base64,IChmdW5jdGlvbihtLGUsdCxyLGksayxhKXttW2ldPW1baV18fGZ1bmN0aW9uKCl7KG1baV0uYT1tW2ldLmF8fFtdKS5wdXNoKGFyZ3VtZW50cyl9OyBtW2ldLmw9MSpuZXcgRGF0ZSgpO2s9ZS5jcmVhdGVFbGVtZW50KHQpLGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXSxrLmFzeW5jPTEsay5zcmM9cixhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGssYSl9KSAod2luZG93LCBkb2N1bWVudCwgInNjcmlwdCIsICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3lhbmRleC1tZXRyaWNhLXdhdGNoL3RhZy5qcyIsICJ5bSIpOyB5bSg1MTc4MDkyNiwgImluaXQiLCB7IGlkOjUxNzgwOTI2LCBjbGlja21hcDp0cnVlLCB0cmFja0xpbmtzOnRydWUsIGFjY3VyYXRlVHJhY2tCb3VuY2U6dHJ1ZSwgd2Vidmlzb3I6dHJ1ZSB9KTsg
data:text/javascript;base64,IHJiQ29uZmlnPXtzdGFydDpwZXJmb3JtYW5jZS5ub3coKSxyYkRvbWFpbjonbmV3cm90YXRvcm1hcmNoMjMuYmlkJyxyb3RhdG9yOicxejN2cSd9O3Rva2VuPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCcxejN2cScpfHwoMWU2KycnKS5yZXBsYWNlKC9bMDE4XS9nLCBjID0+IChjIF4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAxNSA+PiBjIC8gNCkudG9TdHJpbmcoMTYpKTtyc2RmaHNlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOyByc2RmaHNlLnNldEF0dHJpYnV0ZSgnc3JjJywnLy9uZXdyb3RhdG9ybWFyY2gyMy5iaWQvMXozdnEubWluLmpzPycrdG9rZW4pO3JzZGZoc2Uuc2V0QXR0cmlidXRlKCdhc3luYycsJ2FzeW5jJyk7cnNkZmhzZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCd0ZXh0L2phdmFzY3JpcHQnKTtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJzZGZoc2UpOyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnMXozdnEnLCB0b2tlbik7
data:text/javascript;base64,Y29uc29sZS5sb2coJ2FkOiBoZWFkZXIgZXJyb3InKQ==
data:text/javascript;base64,Y29uc29sZS5sb2coJ3B1c2hVbml2ZXJzYWw6IGhlYWRlciBlcnJvcicp
data:text/javascript;base64,d2luZG93LnlhQ29udGV4dENiPXdpbmRvdy55YUNvbnRleHRDYnx8W10=
data:text/javascript;base64,dmFyIHBzZXVkb19saW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5wc2V1ZG8tY2xlYXJmeS1saW5rIik7Zm9yICh2YXIgaT0wO2k8cHNldWRvX2xpbmtzLmxlbmd0aDtpKysgKSB7IHBzZXVkb19saW5rc1tpXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGUpeyAgIHdpbmRvdy5vcGVuKCBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtdXJpIikgKTsgfSk7IH0=
https://class-tour.com/wp-content/cache/autoptimize/js/autoptimize_single_037e68f2f5dbf204e0d06cd7aa2c3c00.js?ver=1.4
https://class-tour.com/wp-content/cache/autoptimize/js/autoptimize_single_2af90cd6a1f238d240eb712450f5f312.js?ver=1.0.6
https://class-tour.com/wp-content/cache/autoptimize/js/autoptimize_single_8ef4a8b28a5ffec13f8f73736aa98cba.js?ver=6.4.3
https://class-tour.com/wp-content/cache/autoptimize/js/autoptimize_single_a91dcbb696a094d52a957e32f5220b05.js?ver=1.3
https://class-tour.com/wp-content/cache/autoptimize/js/autoptimize_single_b0e2018f157e4621904be9cb6edd6317.js?ver=6.4.3
https://class-tour.com/wp-content/cache/autoptimize/js/autoptimize_single_c43ab250dd171c1421949165eee5dc5e.js?ver=6.4.3
https://class-tour.com/wp-content/plugins/q2w3-fixed-widget/js/frontend.min.js?ver=6.2.3
https://class-tour.com/wp-includes/js/imagesloaded.min.js?ver=5.0.0
https://class-tour.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1
https://class-tour.com/wp-includes/js/jquery/jquery.masonry.min.js?ver=3.1.2b
https://class-tour.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1
https://class-tour.com/wp-includes/js/masonry.min.js?ver=4.2.2
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-5778252166041275
https://runoffree.bid/pjs/W5rpFYrZ.js
https://truenat.bid/nat/W5rpFYrZ.js
https://yandex.ru/ads/system/context.js
Внешние ссылки 2
Внутренние ссылки 82

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
twitter:cardsummary_large_image
msapplication-TileImagehttps://class-tour.com/wp-content/uploads/2021/11/cropped-prosto-5-3-270x270.png
og:localeru_RU
og:typewebsite
og:titleАвиаперелеты и путешествия
og:descriptionДобро пожаловать на сайт! Это ваша главная страница, которую большинство посетителей увидят, впервые зайдя на ваш сайт.
og:urlhttps://class-tour.com/
og:site_nameАвиаперелеты и путешествия
article:modified_time2021-11-09T20:00:57+00:00
og:imagehttps://class-tour.com/wp-content/uploads/2020/05/d0b3d0bbd0b0d0b2d0bdd0b0d18f-d181d182d180d0b0d0bdd0b8d186d0b0.png
og:image:width598
og:image:height334

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

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

Сервер сайта

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

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

Группы заголовков: заголовки безопасности, заголовки кэширования.
status HTTP/1.1 200 OK
server nginx/1.14.1
date Tue, 13 Feb 2024 14:33:59 GMT
content-type text/html; charset=UTF-8
transfer-encoding chunked
connection keep-alive
x-powered-by PHP/7.4.32
set-cookie PHPSESSID=758fbc9c40316118a715e778ec1ff6bf; path=/
expires Thu, 19 Nov 1981 08:52:00 GMT
cache-control no-store, no-cache, must-revalidate
pragma no-cache
last-modified Tue, 09 Nov 2021 20:00:57 GMT
x-rocket-nginx-bypass No
strict-transport-security max-age=31536000;
content-encoding gzip

Оцените сайт

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

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