Анализ страницы https://www.mann-ivanov-ferber.ru/top_for_autumn/
Основное Готовность: 100%
Домен
mann-ivanov-ferber.ru
Состояние доменного имени
?
Проверяем корректность доменного имени и наличие технических проблем на уровне домена.
Длина домена велика. Но если вы продвигаете запрос, входящий в название домена, то это хорошо.
Домен второго уровня идеален для продвижения.
Регистратор домена - REGRU-RU
Дата регистрации домена 27.10.2004 (более 20 лет назад)
Ответ сервера
200 Успешный ответ
HTTP-код ответа и цепочка редиректов
?
Код 200 — страница доступна. Коды 3xx — редиректы (цепочки замедляют загрузку и размывают ссылочный вес). Коды 4xx/5xx — ошибки, поисковик не сможет проиндексировать страницу.
Сервер настроен корректно.
Безопасность
Сайт безопасен
Использование HTTPS и SSL-сертификат
?
HTTPS — обязательный стандарт. Google и Яндекс отдают предпочтение защищённым сайтам. Отсутствие SSL или просроченный сертификат ведут к предупреждениям в браузере и снижению позиций.
Не настроен HSTS (Strict-Transport-Security) — рекомендуется включить.
На сайте работает защищенный протокол ssl и сайт открывается по https.
Ssl-сертификат действителен до 30.10.2026 12:32:55.
Поздравляем! Сайт не содержится в реестре РКН.
Кодировка
UTF-8
Кодировка символов страницы
?
Стандарт — UTF-8. Неправильная кодировка вызывает нечитаемые символы и мешает поисковику корректно распознать текст страницы.
Указана кодировка на странице UTF-8.
Язык
ru
Атрибут lang в HTML-теге
?
Атрибут lang (<html lang="ru">) сообщает поисковикам и браузерам, на каком языке написана страница. Помогает при ранжировании в региональном поиске.
Указан язык документа ru.
Скорость загрузки
~0,33сек
Время отклика сервера (TTFB)
?
Time To First Byte — время до получения первого байта от сервера. Норма до 200 мс. Медленный отклик ухудшает пользовательский опыт и ранжирование: Яндекс и Google учитывают скорость страниц.
Скорость загрузки сайта 0,33сек оптимальна.
Объем документа
1200Кб
Размер HTML-кода страницы
?
Слишком большой HTML замедляет парсинг браузером и сканирование поисковым роботом. Рекомендуется не более 200 Кб.
Объем html-документа 1200Кб оптимален.
Структура html-документа корректна.
Ресурсы
Ресурсы: 10
Внешние ресурсы страницы (CSS, JS, изображения)
?
Количество и тип подключённых ресурсов влияют на скорость загрузки. Большое число запросов увеличивает время рендеринга страницы.
Кол-во файлов ресурсов 10 достаточно.
Показать полный список ресурсов
| Тип | Название | Значение |
|---|---|---|
| stylesheet | https://fonts.googleapis.com/css?family=PT+Sans:400,400i,700,700i%7CPT+Serif:400,400i,700,700i&subset=cyrillic | |
| stylesheet | /assets/new/build/page-list.css?31381d5b6ea6 | |
| stylesheet | text/css | https://fonts.googleapis.com/css2?family=Cormorant:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700 |
| js | https://yookassa.ru/checkout-widget/v1/checkout-widget.js | |
| js | /_next/static/widgets/header.js | |
| js | /assets/new/src/js/cookie-consent.js | |
| js | data:text/html;base64,IWZ1bmN0aW9uKCl7dmFyIGU9MCx0PTA7ZnVuY3Rpb24gbigpeysrZT45fHwoInVuZGVmaW5lZCIhPXR5cGVvZiBUaWxkYUZvbnRzP2EoKTpzZXRUaW1lb3V0KG4sMjApKX1mdW5jdGlvbiBpKCl7Y2xlYXJUaW1lb3V0KHQpLG8oKSx3aW5kb3cudGlsZGFmb250c19sb2FkZWQ9ITB9ZnVuY3Rpb24gbygpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWZvbnRzLWxvYWRpbmciKTt2b2lkIDAhPT1lJiZudWxsIT1lJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9ZnVuY3Rpb24gYSgpe3dpbmRvdy50aWxkYWZvbnRzX2xvYWRlZD0hMTt2YXIgZT1kb2N1bWVudC5oZWFkfHxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLG49d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNwbGl0KCIuIik7aWYoInRpbGRhIiE9PW5bbi5sZW5ndGgtMl0pe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7aS5pbm5lckhUTUw9ImJvZHkgKntjb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7fSIsaS5zZXRBdHRyaWJ1dGUoImlkIiwidGlsZGFmb250cy1sb2FkaW5nIiksZS5pbnNlcnRCZWZvcmUoaSxlLmZpcnN0Q2hpbGQpLHQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvKCl9KSwieSI9PT13aW5kb3cudGlsZGFmb250c3N3YXA/NTA6M2UzKX12YXIgYT0obmF2aWdhdG9yLnVzZXJBZ2VudHx8bmF2aWdhdG9yLnZlbmRvcnx8d2luZG93Lm9wZXJhKS50b0xvd2VyQ2FzZSgpLHM9e29wZXJhOiJ2ZXJzaW9uIixmaXJlZm94OiJmaXJlZm94IixzYWZhcmk6InZlcnNpb24iLG1zaWU6Im1zaWUifSxkPVsibGludXgiLCJ3aW5kb3dzIiwiaXBob25lIiwibWFjIG9zIl0sZj0iZGVmYXVsdCIsbD0wLGM9LTEsdT0iZGVmYXVsdCIsdz0id29mZiIsbT0ieSI9PT13aW5kb3cudGlsZGFmb250c3N3YXA/IiZkaXNwbGF5PXN3YXAiOiIiLHA9L15Nb3ppbGxhXC81XC4wIFwoLitbXildK1wpIEFwcGxlV2ViS2l0XC9bXGQuXSsgXChLSFRNTCwgbGlrZSBHZWNrb1wpIENbaHJvbWV8cmlPU10rXC8oXGQrKVtcZC5dK1sgTW9iaWxlXSpbLzE1RTE0OF0qW1xzWWFCcm93c2VyL1tcZC5dK10/W1xzWW93c2VyL1tcZC5dK10/IFNhZmFyaVwvW1xkLl0rW1xzRWRnL1tcZC5dK10/W1xzT1BSL1tcZC5dK10/JC8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KSxoO2lmKHApe3ZhciBnO3BhcnNlSW50KHBbMV0sMTApPj0zNiYmKHc9IndvZmYyIil9ZWxzZXtmb3IodmFyIHYgaW4gcylpZihhLmluZGV4T2Yodik+LTEpe2M9YS5pbmRleE9mKHNbdl0pLGY9dixsPWEuc3Vic3RyaW5nKGMrc1t2XS5sZW5ndGgrMSxjK3Nbdl0ubGVuZ3RoKzMpO2JyZWFrfWZvcih2YXIgYj0wO2I8ZC5sZW5ndGg7YisrKWlmKGEuaW5kZXhPZihkW2JdKT4tMSl7dT1kW2JdO2JyZWFrfXN3aXRjaCgiZGVmYXVsdCI9PT1mJiZhLmluZGV4T2YoImluc3RhZ3JhbSIpPi0xJiZhLmluZGV4T2YoImlwaG9uZSIpPi0xJiYoYz1hLmluZGV4T2YoImlwaG9uZSBvcyIpLGY9InNhZmFyaSIsdT0iaXBob25lIixsPWEuc3Vic3RyaW5nKGMrMTAsYysxMikpLGYpe2Nhc2UiZmlyZWZveCI6bD49MzkmJih3PSJ3b2ZmMiIpO2JyZWFrO2Nhc2Uic2FmYXJpIjoiaXBob25lIj09PXU/bD49MTAmJih3PSJ3b2ZmMiIpOmw+PTEyJiYodz0id29mZjIiKTticmVhaztjYXNlIm9wZXJhIjpsPj0yMyYmKHc9IndvZmYyIil9fXIoImh0dHBzOi8vZm9udHMudGlsZGFjZG4uY29tL2dldC8iLCI/Zm9udHM9IitUaWxkYUZvbnRzKyImZm9ybWF0PSIrdyttLCEwLGUpfWZ1bmN0aW9uIHIoZSx0LG4sbyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpO2lmKGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7aSgpfSkpLG4pe2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLChmdW5jdGlvbigpe3IoImh0dHBzOi8vZm9udHMyLnRpbGRhY2RuLmNvbS9nZXQvIix0LCExLG8pfSkpO3ZhciBzPXdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmc7aWYoIXMpcmV0dXJuO3ZhciBkPXMucmVzcG9uc2VFbmQtcy5jb25uZWN0U3RhcnQsZj0yZTM7c3dpdGNoKCEwKXtjYXNlIGQ8PTMwMDpmPTJlMzticmVhaztjYXNlIGQ8PTFlMzpmPTdlMzticmVhaztjYXNlIGQ8PTJlMzpmPTJlNDticmVhaztjYXNlIGQ8PTNlMzpmPTNlNDticmVhaztjYXNlIGQ+M2UzOmY9NDVlM31zZXRUaW1lb3V0KChmdW5jdGlvbigpeyExPT09d2luZG93LnRpbGRhZm9udHNfbG9hZGVkJiZyKCJodHRwczovL2ZvbnRzMi50aWxkYWNkbi5jb20vZ2V0LyIsdCwhMSxvKX0pLGYpfWEuc2V0QXR0cmlidXRlKCJocmVmIixlK3QpLGEuc2V0QXR0cmlidXRlKCJyZWwiLCJzdHlsZXNoZWV0IiksYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ0ZXh0L2NzcyIpLGEuc2V0QXR0cmlidXRlKCJtZWRpYSIsImFsbCIpLG8uaW5zZXJ0QmVmb3JlKGEsby5maXJzdENoaWxkKX1uKCl9KCk7CgovKiEgalF1ZXJ5IHYxLjEwLjIgfCAoYykgMjAwNSwgMjAxMyBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiB8IGpxdWVyeS5vcmcvbGljZW5zZQoqLwooZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9dHlwZW9mIHQsbz1lLmxvY2F0aW9uLGE9ZS5kb2N1bWVudCxzPWEuZG9jdW1lbnRFbGVtZW50LGw9ZS5qUXVlcnksdT1lLiQsYz17fSxwPVtdLGY9IjEuMTAuMiIsZD1wLmNvbmNhdCxoPXAucHVzaCxnPXAuc2xpY2UsbT1wLmluZGV4T2YseT1jLnRvU3RyaW5nLHY9Yy5oYXNPd25Qcm9wZXJ0eSxiPWYudHJpbSx4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB4LmZuLmluaXQoZSx0LHIpfSx3PS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFQ9L1xTKy9nLEM9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLE49L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxrPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sRT0vXltcXSw6e31cc10qJC8sUz0vKD86Xnw6fCwpKD86XHMqXFspKy9nLEE9L1xcKD86WyJcXFwvYmZucnRdfHVbXGRhLWZBLUZdezR9KS9nLGo9LyJbXiJcXFxyXG5dKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/KD86XGQrXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpL2csRD0vXi1tcy0vLEw9Ly0oW1xkYS16XSkvZ2ksSD1mdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9LHE9ZnVuY3Rpb24oZSl7KGEuYWRkRXZlbnRMaXN0ZW5lcnx8ImxvYWQiPT09ZS50eXBlfHwiY29tcGxldGUiPT09YS5yZWFkeVN0YXRlKSYmKF8oKSx4LnJlYWR5KCkpfSxfPWZ1bmN0aW9uKCl7YS5hZGRFdmVudExpc3RlbmVyPyhhLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHEsITEpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIscSwhMSkpOihhLmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLHEpLGUuZGV0YWNoRXZlbnQoIm9ubG9hZCIscSkpfTt4LmZuPXgucHJvdG90eXBlPXtqcXVlcnk6Zixjb25zdHJ1Y3Rvcjp4LGluaXQ6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG87aWYoIWUpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZihpPSI8Ij09PWUuY2hhckF0KDApJiYiPiI9PT1lLmNoYXJBdChlLmxlbmd0aC0xKSYmZS5sZW5ndGg+PTM/W251bGwsZSxudWxsXTpOLmV4ZWMoZSksIWl8fCFpWzFdJiZuKXJldHVybiFufHxuLmpxdWVyeT8obnx8cikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKG4pLmZpbmQoZSk7aWYoaVsxXSl7aWYobj1uIGluc3RhbmNlb2YgeD9uWzBdOm4seC5tZXJnZSh0aGlzLHgucGFyc2VIVE1MKGlbMV0sbiYmbi5ub2RlVHlwZT9uLm93bmVyRG9jdW1lbnR8fG46YSwhMCkpLGsudGVzdChpWzFdKSYmeC5pc1BsYWluT2JqZWN0KG4pKWZvcihpIGluIG4peC5pc0Z1bmN0aW9uKHRoaXNbaV0pP3RoaXNbaV0obltpXSk6dGhpcy5hdHRyKGksbltpXSk7cmV0dXJuIHRoaXN9aWYobz1hLmdldEVsZW1lbnRCeUlkKGlbMl0pLG8mJm8ucGFyZW50Tm9kZSl7aWYoby5pZCE9PWlbMl0pcmV0dXJuIHIuZmluZChlKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09b31yZXR1cm4gdGhpcy5jb250ZXh0PWEsdGhpcy5zZWxlY3Rvcj1lLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTp4LmlzRnVuY3Rpb24oZSk/ci5yZWFkeShlKTooZS5zZWxlY3RvciE9PXQmJih0aGlzLnNlbGVjdG9yPWUuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWUuY29udGV4dCkseC5tYWtlQXJyYXkoZSx0aGlzKSl9LHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZy5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dGhpcy50b0FycmF5KCk6MD5lP3RoaXNbdGhpcy5sZW5ndGgrZV06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUpe3ZhciB0PXgubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0LmNvbnRleHQ9dGhpcy5jb250ZXh0LHR9LGVhY2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5lYWNoKHRoaXMsZSx0KX0scmVhZHk6ZnVuY3Rpb24oZSl7cmV0dXJuIHgucmVhZHkucHJvbWlzZSgpLmRvbmUoZSksdGhpc30sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZy5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKygwPmU/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobj49MCYmdD5uP1t0aGlzW25dXTpbXSl9LG1hcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soeC5tYXAodGhpcyxmdW5jdGlvbih0LG4pe3JldHVybiBlLmNhbGwodCxuLHQpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOmgsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LHguZm4uaW5pdC5wcm90b3R5cGU9eC5mbix4LmV4dGVuZD14LmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBlLG4scixpLG8sYSxzPWFyZ3VtZW50c1swXXx8e30sbD0xLHU9YXJndW1lbnRzLmxlbmd0aCxjPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBzJiYoYz1zLHM9YXJndW1lbnRzWzFdfHx7fSxsPTIpLCJvYmplY3QiPT10eXBlb2Ygc3x8eC5pc0Z1bmN0aW9uKHMpfHwocz17fSksdT09PWwmJihzPXRoaXMsLS1sKTt1Pmw7bCsrKWlmKG51bGwhPShvPWFyZ3VtZW50c1tsXSkpZm9yKGkgaW4gbyllPXNbaV0scj1vW2ldLHMhPT1yJiYoYyYmciYmKHguaXNQbGFpbk9iamVjdChyKXx8KG49eC5pc0FycmF5KHIpKSk/KG4/KG49ITEsYT1lJiZ4LmlzQXJyYXkoZSk/ZTpbXSk6YT1lJiZ4LmlzUGxhaW5PYmplY3QoZSk/ZTp7fSxzW2ldPXguZXh0ZW5kKGMsYSxyKSk6ciE9PXQmJihzW2ldPXIpKTtyZXR1cm4gc30seC5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGYrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9Db25mbGljdDpmdW5jdGlvbih0KXtyZXR1cm4gZS4kPT09eCYmKGUuJD11KSx0JiZlLmpRdWVyeT09PXgmJihlLmpRdWVyeT1sKSx4fSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihlKXtlP3gucmVhZHlXYWl0Kys6eC5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGUpe2lmKGU9PT0hMD8hLS14LnJlYWR5V2FpdDoheC5pc1JlYWR5KXtpZighYS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KHgucmVhZHkpO3guaXNSZWFkeT0hMCxlIT09ITAmJi0teC5yZWFkeVdhaXQ+MHx8KG4ucmVzb2x2ZVdpdGgoYSxbeF0pLHguZm4udHJpZ2dlciYmeChhKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKSl9fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PT14LnR5cGUoZSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuImFycmF5Ij09PXgudHlwZShlKX0saXNXaW5kb3c6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmU9PWUud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oZSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoZSkpJiZpc0Zpbml0ZShlKX0sdHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9lKyIiOiJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGU/Y1t5LmNhbGwoZSldfHwib2JqZWN0Ijp0eXBlb2YgZX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXt2YXIgbjtpZighZXx8Im9iamVjdCIhPT14LnR5cGUoZSl8fGUubm9kZVR5cGV8fHguaXNXaW5kb3coZSkpcmV0dXJuITE7dHJ5e2lmKGUuY29uc3RydWN0b3ImJiF2LmNhbGwoZSwiY29uc3RydWN0b3IiKSYmIXYuY2FsbChlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKHIpe3JldHVybiExfWlmKHguc3VwcG9ydC5vd25MYXN0KWZvcihuIGluIGUpcmV0dXJuIHYuY2FsbChlLG4pO2ZvcihuIGluIGUpO3JldHVybiBuPT09dHx8di5jYWxsKGUsbil9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgRXJyb3IoZSl9LHBhcnNlSFRNTDpmdW5jdGlvbihlLHQsbil7aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDsiYm9vbGVhbiI9PXR5cGVvZiB0JiYobj10LHQ9ITEpLHQ9dHx8YTt2YXIgcj1rLmV4ZWMoZSksaT0hbiYmW107cmV0dXJuIHI/W3QuY3JlYXRlRWxlbWVudChyWzFdKV06KHI9eC5idWlsZEZyYWdtZW50KFtlXSx0LGkpLGkmJngoaSkucmVtb3ZlKCkseC5tZXJnZShbXSxyLmNoaWxkTm9kZXMpKX0scGFyc2VKU09OOmZ1bmN0aW9uKG4pe3JldHVybiBlLkpTT04mJmUuSlNPTi5wYXJzZT9lLkpTT04ucGFyc2Uobik6bnVsbD09PW4/bjoic3RyaW5nIj09dHlwZW9mIG4mJihuPXgudHJpbShuKSxuJiZFLnRlc3Qobi5yZXBsYWNlKEEsIkAiKS5yZXBsYWNlKGosIl0iKS5yZXBsYWNlKFMsIiIpKSk/RnVuY3Rpb24oInJldHVybiAiK24pKCk6KHguZXJyb3IoIkludmFsaWQgSlNPTjogIituKSx0KX0scGFyc2VYTUw6ZnVuY3Rpb24obil7dmFyIHIsaTtpZighbnx8InN0cmluZyIhPXR5cGVvZiBuKXJldHVybiBudWxsO3RyeXtlLkRPTVBhcnNlcj8oaT1uZXcgRE9NUGFyc2VyLHI9aS5wYXJzZUZyb21TdHJpbmcobiwidGV4dC94bWwiKSk6KHI9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxyLmFzeW5jPSJmYWxzZSIsci5sb2FkWE1MKG4pKX1jYXRjaChvKXtyPXR9cmV0dXJuIHImJnIuZG9jdW1lbnRFbGVtZW50JiYhci5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fHguZXJyb3IoIkludmFsaWQgWE1MOiAiK24pLHJ9LG5vb3A6ZnVuY3Rpb24oKXt9LGdsb2JhbEV2YWw6ZnVuY3Rpb24odCl7dCYmeC50cmltKHQpJiYoZS5leGVjU2NyaXB0fHxmdW5jdGlvbih0KXtlLmV2YWwuY2FsbChlLHQpfSkodCl9LGNhbWVsQ2FzZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKEQsIm1zLSIpLnJlcGxhY2UoTCxIKX0sbm9kZU5hbWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPTAsbz1lLmxlbmd0aCxhPU0oZSk7aWYobil7aWYoYSl7Zm9yKDtvPmk7aSsrKWlmKHI9dC5hcHBseShlW2ldLG4pLHI9PT0hMSlicmVha31lbHNlIGZvcihpIGluIGUpaWYocj10LmFwcGx5KGVbaV0sbikscj09PSExKWJyZWFrfWVsc2UgaWYoYSl7Zm9yKDtvPmk7aSsrKWlmKHI9dC5jYWxsKGVbaV0saSxlW2ldKSxyPT09ITEpYnJlYWt9ZWxzZSBmb3IoaSBpbiBlKWlmKHI9dC5jYWxsKGVbaV0saSxlW2ldKSxyPT09ITEpYnJlYWs7cmV0dXJuIGV9LHRyaW06YiYmIWIuY2FsbCgiXHVmZWZmXHUwMGEwIik/ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6Yi5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjooZSsiIikucmVwbGFjZShDLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihNKE9iamVjdChlKSk/eC5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgZT9bZV06ZSk6aC5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKHQpe2lmKG0pcmV0dXJuIG0uY2FsbCh0LGUsbik7Zm9yKHI9dC5sZW5ndGgsbj1uPzA+bj9NYXRoLm1heCgwLHIrbik6bjowO3I+bjtuKyspaWYobiBpbiB0JiZ0W25dPT09ZSlyZXR1cm4gbn1yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oZSxuKXt2YXIgcj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89MDtpZigibnVtYmVyIj09dHlwZW9mIHIpZm9yKDtyPm87bysrKWVbaSsrXT1uW29dO2Vsc2Ugd2hpbGUobltvXSE9PXQpZVtpKytdPW5bbysrXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPVtdLG89MCxhPWUubGVuZ3RoO2ZvcihuPSEhbjthPm87bysrKXI9ISF0KGVbb10sbyksbiE9PXImJmkucHVzaChlW29dKTtyZXR1cm4gaX0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPTAsbz1lLmxlbmd0aCxhPU0oZSkscz1bXTtpZihhKWZvcig7bz5pO2krKylyPXQoZVtpXSxpLG4pLG51bGwhPXImJihzW3MubGVuZ3RoXT1yKTtlbHNlIGZvcihpIGluIGUpcj10KGVbaV0saSxuKSxudWxsIT1yJiYoc1tzLmxlbmd0aF09cik7cmV0dXJuIGQuYXBwbHkoW10scyl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihlLG4pe3ZhciByLGksbztyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG4mJihvPWVbbl0sbj1lLGU9bykseC5pc0Z1bmN0aW9uKGUpPyhyPWcuY2FsbChhcmd1bWVudHMsMiksaT1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KG58fHRoaXMsci5jb25jYXQoZy5jYWxsKGFyZ3VtZW50cykpKX0saS5ndWlkPWUuZ3VpZD1lLmd1aWR8fHguZ3VpZCsrLGkpOnR9LGFjY2VzczpmdW5jdGlvbihlLG4scixpLG8sYSxzKXt2YXIgbD0wLHU9ZS5sZW5ndGgsYz1udWxsPT1yO2lmKCJvYmplY3QiPT09eC50eXBlKHIpKXtvPSEwO2ZvcihsIGluIHIpeC5hY2Nlc3MoZSxuLGwscltsXSwhMCxhLHMpfWVsc2UgaWYoaSE9PXQmJihvPSEwLHguaXNGdW5jdGlvbihpKXx8KHM9ITApLGMmJihzPyhuLmNhbGwoZSxpKSxuPW51bGwpOihjPW4sbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGMuY2FsbCh4KGUpLG4pfSkpLG4pKWZvcig7dT5sO2wrKyluKGVbbF0scixzP2k6aS5jYWxsKGVbbF0sbCxuKGVbbF0scikpKTtyZXR1cm4gbz9lOmM/bi5jYWxsKGUpOnU/bihlWzBdLHIpOmF9LG5vdzpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxzd2FwOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYT17fTtmb3IobyBpbiB0KWFbb109ZS5zdHlsZVtvXSxlLnN0eWxlW29dPXRbb107aT1uLmFwcGx5KGUscnx8W10pO2ZvcihvIGluIHQpZS5zdHlsZVtvXT1hW29dO3JldHVybiBpfX0pLHgucmVhZHkucHJvbWlzZT1mdW5jdGlvbih0KXtpZighbilpZihuPXguRGVmZXJyZWQoKSwiY29tcGxldGUiPT09YS5yZWFkeVN0YXRlKXNldFRpbWVvdXQoeC5yZWFkeSk7ZWxzZSBpZihhLmFkZEV2ZW50TGlzdGVuZXIpYS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixxLCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHEsITEpO2Vsc2V7YS5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixxKSxlLmF0dGFjaEV2ZW50KCJvbmxvYWQiLHEpO3ZhciByPSExO3RyeXtyPW51bGw9PWUuZnJhbWVFbGVtZW50JiZhLmRvY3VtZW50RWxlbWVudH1jYXRjaChpKXt9ciYmci5kb1Njcm9sbCYmZnVuY3Rpb24gbygpe2lmKCF4LmlzUmVhZHkpe3RyeXtyLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goZSl7cmV0dXJuIHNldFRpbWVvdXQobyw1MCl9XygpLHgucmVhZHkoKX19KCl9cmV0dXJuIG4ucHJvbWlzZSh0KX0seC5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7Y1siW29iamVjdCAiK3QrIl0iXT10LnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBNKGUpe3ZhciB0PWUubGVuZ3RoLG49eC50eXBlKGUpO3JldHVybiB4LmlzV2luZG93KGUpPyExOjE9PT1lLm5vZGVUeXBlJiZ0PyEwOiJhcnJheSI9PT1ufHwiZnVuY3Rpb24iIT09biYmKDA9PT10fHwibnVtYmVyIj09dHlwZW9mIHQmJnQ+MCYmdC0xIGluIGUpfXI9eChhKSxmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscyxsLHUsYyxwLGYsZCxoLGcsbSx5LHYsYj0ic2l6emxlIistbmV3IERhdGUsdz1lLmRvY3VtZW50LFQ9MCxDPTAsTj1zdCgpLGs9c3QoKSxFPXN0KCksUz0hMSxBPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10PyhTPSEwLDApOjB9LGo9dHlwZW9mIHQsRD0xPDwzMSxMPXt9Lmhhc093blByb3BlcnR5LEg9W10scT1ILnBvcCxfPUgucHVzaCxNPUgucHVzaCxPPUguc2xpY2UsRj1ILmluZGV4T2Z8fGZ1bmN0aW9uKGUpe3ZhciB0PTAsbj10aGlzLmxlbmd0aDtmb3IoO24+dDt0KyspaWYodGhpc1t0XT09PWUpcmV0dXJuIHQ7cmV0dXJuLTF9LEI9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixQPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixSPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsVz1SLnJlcGxhY2UoInciLCJ3IyIpLCQ9IlxcWyIrUCsiKigiK1IrIikiK1ArIiooPzooWypeJHwhfl0/PSkiK1ArIiooPzooWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgiK1crIil8KXwpIitQKyIqXFxdIixJPSI6KCIrUisiKSg/OlxcKCgoWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrJC5yZXBsYWNlKDMsOCkrIikqKXwuKilcXCl8KSIsej1SZWdFeHAoIl4iK1ArIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrUCsiKyQiLCJnIiksWD1SZWdFeHAoIl4iK1ArIiosIitQKyIqIiksVT1SZWdFeHAoIl4iK1ArIiooWz4rfl18IitQKyIpIitQKyIqIiksVj1SZWdFeHAoUCsiKlsrfl0iKSxZPVJlZ0V4cCgiPSIrUCsiKihbXlxcXSdcIl0qKSIrUCsiKlxcXSIsImciKSxKPVJlZ0V4cChJKSxHPVJlZ0V4cCgiXiIrVysiJCIpLFE9e0lEOlJlZ0V4cCgiXiMoIitSKyIpIiksQ0xBU1M6UmVnRXhwKCJeXFwuKCIrUisiKSIpLFRBRzpSZWdFeHAoIl4oIitSLnJlcGxhY2UoInciLCJ3KiIpKyIpIiksQVRUUjpSZWdFeHAoIl4iKyQpLFBTRVVETzpSZWdFeHAoIl4iK0kpLENISUxEOlJlZ0V4cCgiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFwoIitQKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIitQKyIqKD86KFsrLV18KSIrUCsiKihcXGQrKXwpKSIrUCsiKlxcKXwpIiwiaSIpLGJvb2w6UmVnRXhwKCJeKD86IitCKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6UmVnRXhwKCJeIitQKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK1ArIiooKD86LVxcZCk/XFxkKikiK1ArIipcXCl8KSg/PVteLV18JCkiLCJpIil9LEs9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLFo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxldD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHR0PS9eaFxkJC9pLG50PS8nfFxcL2cscnQ9UmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK1ArIj98KCIrUCsiKXwuKSIsImlnIiksaXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSIweCIrdC02NTUzNjtyZXR1cm4gciE9PXJ8fG4/dDowPnI/U3RyaW5nLmZyb21DaGFyQ29kZShyKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKDU1Mjk2fHI+PjEwLDU2MzIwfDEwMjMmcil9O3RyeXtNLmFwcGx5KEg9Ty5jYWxsKHcuY2hpbGROb2Rlcyksdy5jaGlsZE5vZGVzKSxIW3cuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKG90KXtNPXthcHBseTpILmxlbmd0aD9mdW5jdGlvbihlLHQpe18uYXBwbHkoZSxPLmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBhdChlLHQsbixpKXt2YXIgbyxhLHMsbCx1LGMsZCxtLHkseDtpZigodD90Lm93bmVyRG9jdW1lbnR8fHQ6dykhPT1mJiZwKHQpLHQ9dHx8ZixuPW58fFtdLCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG47aWYoMSE9PShsPXQubm9kZVR5cGUpJiY5IT09bClyZXR1cm5bXTtpZihoJiYhaSl7aWYobz1aLmV4ZWMoZSkpaWYocz1vWzFdKXtpZig5PT09bCl7aWYoYT10LmdldEVsZW1lbnRCeUlkKHMpLCFhfHwhYS5wYXJlbnROb2RlKXJldHVybiBuO2lmKGEuaWQ9PT1zKXJldHVybiBuLnB1c2goYSksbn1lbHNlIGlmKHQub3duZXJEb2N1bWVudCYmKGE9dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHMpKSYmdih0LGEpJiZhLmlkPT09cylyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZXtpZihvWzJdKXJldHVybiBNLmFwcGx5KG4sdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSksbjtpZigocz1vWzNdKSYmci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZ0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIE0uYXBwbHkobix0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUocykpLG59aWYoci5xc2EmJighZ3x8IWcudGVzdChlKSkpe2lmKG09ZD1iLHk9dCx4PTk9PT1sJiZlLDE9PT1sJiYib2JqZWN0IiE9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7Yz1tdChlKSwoZD10LmdldEF0dHJpYnV0ZSgiaWQiKSk/bT1kLnJlcGxhY2UobnQsIlxcJCYiKTp0LnNldEF0dHJpYnV0ZSgiaWQiLG0pLG09IltpZD0nIittKyInXSAiLHU9Yy5sZW5ndGg7d2hpbGUodS0tKWNbdV09bSt5dChjW3VdKTt5PVYudGVzdChlKSYmdC5wYXJlbnROb2RlfHx0LHg9Yy5qb2luKCIsIil9aWYoeCl0cnl7cmV0dXJuIE0uYXBwbHkobix5LnF1ZXJ5U2VsZWN0b3JBbGwoeCkpLG59Y2F0Y2goVCl7fWZpbmFsbHl7ZHx8dC5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4ga3QoZS5yZXBsYWNlKHosIiQxIiksdCxuLGkpfWZ1bmN0aW9uIHN0KCl7dmFyIGU9W107ZnVuY3Rpb24gdChuLHIpe3JldHVybiBlLnB1c2gobis9IiAiKT5vLmNhY2hlTGVuZ3RoJiZkZWxldGUgdFtlLnNoaWZ0KCldLHRbbl09cn1yZXR1cm4gdH1mdW5jdGlvbiBsdChlKXtyZXR1cm4gZVtiXT0hMCxlfWZ1bmN0aW9uIHV0KGUpe3ZhciB0PWYuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhZSh0KX1jYXRjaChuKXtyZXR1cm4hMX1maW5hbGx5e3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH19ZnVuY3Rpb24gY3QoZSx0KXt2YXIgbj1lLnNwbGl0KCJ8Iikscj1lLmxlbmd0aDt3aGlsZShyLS0pby5hdHRySGFuZGxlW25bcl1dPXR9ZnVuY3Rpb24gcHQoZSx0KXt2YXIgbj10JiZlLHI9biYmMT09PWUubm9kZVR5cGUmJjE9PT10Lm5vZGVUeXBlJiYofnQuc291cmNlSW5kZXh8fEQpLSh+ZS5zb3VyY2VJbmRleHx8RCk7aWYocilyZXR1cm4gcjtpZihuKXdoaWxlKG49bi5uZXh0U2libGluZylpZihuPT09dClyZXR1cm4tMTtyZXR1cm4gZT8xOi0xfWZ1bmN0aW9uIGZ0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PW4mJnQudHlwZT09PWV9fWZ1bmN0aW9uIGR0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ufHwiYnV0dG9uIj09PW4pJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBodChlKXtyZXR1cm4gbHQoZnVuY3Rpb24odCl7cmV0dXJuIHQ9K3QsbHQoZnVuY3Rpb24obixyKXt2YXIgaSxvPWUoW10sbi5sZW5ndGgsdCksYT1vLmxlbmd0aDt3aGlsZShhLS0pbltpPW9bYV1dJiYobltpXT0hKHJbaV09bltpXSkpfSl9KX1zPWF0LmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJihlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gdD8iSFRNTCIhPT10Lm5vZGVOYW1lOiExfSxyPWF0LnN1cHBvcnQ9e30scD1hdC5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgbj1lP2Uub3duZXJEb2N1bWVudHx8ZTp3LGk9bi5kZWZhdWx0VmlldztyZXR1cm4gbiE9PWYmJjk9PT1uLm5vZGVUeXBlJiZuLmRvY3VtZW50RWxlbWVudD8oZj1uLGQ9bi5kb2N1bWVudEVsZW1lbnQsaD0hcyhuKSxpJiZpLmF0dGFjaEV2ZW50JiZpIT09aS50b3AmJmkuYXR0YWNoRXZlbnQoIm9uYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3AoKX0pLHIuYXR0cmlidXRlcz11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxyLmdldEVsZW1lbnRzQnlUYWdOYW1lPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKG4uY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGRpdiBjbGFzcz0nYSc+PC9kaXY+PGRpdiBjbGFzcz0nYSBpJz48L2Rpdj4iLGUuZmlyc3RDaGlsZC5jbGFzc05hbWU9ImkiLDI9PT1lLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImkiKS5sZW5ndGh9KSxyLmdldEJ5SWQ9dXQoZnVuY3Rpb24oZSl7cmV0dXJuIGQuYXBwZW5kQ2hpbGQoZSkuaWQ9Yiwhbi5nZXRFbGVtZW50c0J5TmFtZXx8IW4uZ2V0RWxlbWVudHNCeU5hbWUoYikubGVuZ3RofSksci5nZXRCeUlkPyhvLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdC5nZXRFbGVtZW50QnlJZCE9PWomJmgpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4mJm4ucGFyZW50Tm9kZT9bbl06W119fSxvLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UocnQsaXQpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0pOihkZWxldGUgby5maW5kLklELG8uZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShydCxpdCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPT1qJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIG4mJm4udmFsdWU9PT10fX0pLG8uZmluZC5UQUc9ci5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLG4pe3JldHVybiB0eXBlb2Ygbi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PWo/bi5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTp0fTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT0wLG89dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTtpZigiKiI9PT1lKXt3aGlsZShuPW9baSsrXSkxPT09bi5ub2RlVHlwZSYmci5wdXNoKG4pO3JldHVybiByfXJldHVybiBvfSxvLmZpbmQuQ0xBU1M9ci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihlLG4pe3JldHVybiB0eXBlb2Ygbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09aiYmaD9uLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSk6dH0sbT1bXSxnPVtdLChyLnFzYT1LLnRlc3Qobi5xdWVyeVNlbGVjdG9yQWxsKSkmJih1dChmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPHNlbGVjdD48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHxnLnB1c2goIlxcWyIrUCsiKig/OnZhbHVlfCIrQisiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fGcucHVzaCgiOmNoZWNrZWQiKX0pLHV0KGZ1bmN0aW9uKGUpe3ZhciB0PW4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJ0IiwiIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbdF49JyddIikubGVuZ3RoJiZnLnB1c2goIlsqXiRdPSIrUCsiKig/OicnfFwiXCIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aHx8Zy5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLGcucHVzaCgiLC4qOiIpfSkpLChyLm1hdGNoZXNTZWxlY3Rvcj1LLnRlc3QoeT1kLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8ZC5tb3pNYXRjaGVzU2VsZWN0b3J8fGQub01hdGNoZXNTZWxlY3Rvcnx8ZC5tc01hdGNoZXNTZWxlY3RvcikpJiZ1dChmdW5jdGlvbihlKXtyLmRpc2Nvbm5lY3RlZE1hdGNoPXkuY2FsbChlLCJkaXYiKSx5LmNhbGwoZSwiW3MhPScnXTp4IiksbS5wdXNoKCIhPSIsSSl9KSxnPWcubGVuZ3RoJiZSZWdFeHAoZy5qb2luKCJ8IikpLG09bS5sZW5ndGgmJlJlZ0V4cChtLmpvaW4oInwiKSksdj1LLnRlc3QoZC5jb250YWlucyl8fGQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxBPWQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gUz0hMCwwO3ZhciBpPXQuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk7cmV0dXJuIGk/MSZpfHwhci5zb3J0RGV0YWNoZWQmJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk9PT1pP2U9PT1ufHx2KHcsZSk/LTE6dD09PW58fHYodyx0KT8xOmM/Ri5jYWxsKGMsZSktRi5jYWxsKGMsdCk6MDo0Jmk/LTE6MTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjF9OmZ1bmN0aW9uKGUsdCl7dmFyIHIsaT0wLG89ZS5wYXJlbnROb2RlLGE9dC5wYXJlbnROb2RlLHM9W2VdLGw9W3RdO2lmKGU9PT10KXJldHVybiBTPSEwLDA7aWYoIW98fCFhKXJldHVybiBlPT09bj8tMTp0PT09bj8xOm8/LTE6YT8xOmM/Ri5jYWxsKGMsZSktRi5jYWxsKGMsdCk6MDtpZihvPT09YSlyZXR1cm4gcHQoZSx0KTtyPWU7d2hpbGUocj1yLnBhcmVudE5vZGUpcy51bnNoaWZ0KHIpO3I9dDt3aGlsZShyPXIucGFyZW50Tm9kZSlsLnVuc2hpZnQocik7d2hpbGUoc1tpXT09PWxbaV0paSsrO3JldHVybiBpP3B0KHNbaV0sbFtpXSk6c1tpXT09PXc/LTE6bFtpXT09PXc/MTowfSxuKTpmfSxhdC5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGF0KGUsbnVsbCxudWxsLHQpfSxhdC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtpZigoZS5vd25lckRvY3VtZW50fHxlKSE9PWYmJnAoZSksdD10LnJlcGxhY2UoWSwiPSckMSddIiksISghci5tYXRjaGVzU2VsZWN0b3J8fCFofHxtJiZtLnRlc3QodCl8fGcmJmcudGVzdCh0KSkpdHJ5e3ZhciBuPXkuY2FsbChlLHQpO2lmKG58fHIuZGlzY29ubmVjdGVkTWF0Y2h8fGUuZG9jdW1lbnQmJjExIT09ZS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gbn1jYXRjaChpKXt9cmV0dXJuIGF0KHQsZixudWxsLFtlXSkubGVuZ3RoPjB9LGF0LmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPT1mJiZwKGUpLHYoZSx0KX0sYXQuYXR0cj1mdW5jdGlvbihlLG4peyhlLm93bmVyRG9jdW1lbnR8fGUpIT09ZiYmcChlKTt2YXIgaT1vLmF0dHJIYW5kbGVbbi50b0xvd2VyQ2FzZSgpXSxhPWkmJkwuY2FsbChvLmF0dHJIYW5kbGUsbi50b0xvd2VyQ2FzZSgpKT9pKGUsbiwhaCk6dDtyZXR1cm4gYT09PXQ/ci5hdHRyaWJ1dGVzfHwhaD9lLmdldEF0dHJpYnV0ZShuKTooYT1lLmdldEF0dHJpYnV0ZU5vZGUobikpJiZhLnNwZWNpZmllZD9hLnZhbHVlOm51bGw6YX0sYXQuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LGF0LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxpPTAsbz0wO2lmKFM9IXIuZGV0ZWN0RHVwbGljYXRlcyxjPSFyLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KEEpLFMpe3doaWxlKHQ9ZVtvKytdKXQ9PT1lW29dJiYoaT1uLnB1c2gobykpO3doaWxlKGktLSllLnNwbGljZShuW2ldLDEpfXJldHVybiBlfSxhPWF0LmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj0iIixyPTAsaT1lLm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW4rPWEoZSl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIGUubm9kZVZhbHVlfWVsc2UgZm9yKDt0PWVbcl07cisrKW4rPWEodCk7cmV0dXJuIG59LG89YXQuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86bHQsbWF0Y2g6USxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKHJ0LGl0KSxlWzNdPShlWzRdfHxlWzVdfHwiIikucmVwbGFjZShydCxpdCksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fGF0LmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJmF0LmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgbixyPSFlWzVdJiZlWzJdO3JldHVybiBRLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXSYmZVs0XSE9PXQ/ZVsyXT1lWzRdOnImJkoudGVzdChyKSYmKG49bXQociwhMCkpJiYobj1yLmluZGV4T2YoIikiLHIubGVuZ3RoLW4pLXIubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLG4pLGVbMl09ci5zbGljZSgwLG4pKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHJ0LGl0KS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1OW2UrIiAiXTtyZXR1cm4gdHx8KHQ9UmVnRXhwKCIoXnwiK1ArIikiK2UrIigiK1ArInwkKSIpKSYmTihlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoInN0cmluZyI9PXR5cGVvZiBlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWV8fHR5cGVvZiBlLmdldEF0dHJpYnV0ZSE9PWomJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBpPWF0LmF0dHIocixlKTtyZXR1cm4gbnVsbD09aT8iIT0iPT09dDp0PyhpKz0iIiwiPSI9PT10P2k9PT1uOiIhPSI9PT10P2khPT1uOiJePSI9PT10P24mJjA9PT1pLmluZGV4T2Yobik6Iio9Ij09PXQ/biYmaS5pbmRleE9mKG4pPi0xOiIkPSI9PT10P24mJmkuc2xpY2UoLW4ubGVuZ3RoKT09PW46In49Ij09PXQ/KCIgIitpKyIgIikuaW5kZXhPZihuKT4tMToifD0iPT09dD9pPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bisiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz0ibnRoIiE9PWUuc2xpY2UoMCwzKSxhPSJsYXN0IiE9PWUuc2xpY2UoLTQpLHM9Im9mLXR5cGUiPT09dDtyZXR1cm4gMT09PXImJjA9PT1pP2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbih0LG4sbCl7dmFyIHUsYyxwLGYsZCxoLGc9byE9PWE/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixtPXQucGFyZW50Tm9kZSx5PXMmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSx2PSFsJiYhcztpZihtKXtpZihvKXt3aGlsZShnKXtwPXQ7d2hpbGUocD1wW2ddKWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtoPWc9Im9ubHkiPT09ZSYmIWgmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoaD1bYT9tLmZpcnN0Q2hpbGQ6bS5sYXN0Q2hpbGRdLGEmJnYpe2M9bVtiXXx8KG1bYl09e30pLHU9Y1tlXXx8W10sZD11WzBdPT09VCYmdVsxXSxmPXVbMF09PT1UJiZ1WzJdLHA9ZCYmbS5jaGlsZE5vZGVzW2RdO3doaWxlKHA9KytkJiZwJiZwW2ddfHwoZj1kPTApfHxoLnBvcCgpKWlmKDE9PT1wLm5vZGVUeXBlJiYrK2YmJnA9PT10KXtjW2VdPVtULGQsZl07YnJlYWt9fWVsc2UgaWYodiYmKHU9KHRbYl18fCh0W2JdPXt9KSlbZV0pJiZ1WzBdPT09VClmPXVbMV07ZWxzZSB3aGlsZShwPSsrZCYmcCYmcFtnXXx8KGY9ZD0wKXx8aC5wb3AoKSlpZigocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKSYmKytmJiYodiYmKChwW2JdfHwocFtiXT17fSkpW2VdPVtULGZdKSxwPT09dCkpYnJlYWs7cmV0dXJuIGYtPWksZj09PXJ8fDA9PT1mJXImJmYvcj49MH19fSxQU0VVRE86ZnVuY3Rpb24oZSx0KXt2YXIgbixyPW8ucHNldWRvc1tlXXx8by5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fGF0LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIHJbYl0/cih0KTpyLmxlbmd0aD4xPyhuPVtlLGUsIiIsdF0sby5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/bHQoZnVuY3Rpb24oZSxuKXt2YXIgaSxvPXIoZSx0KSxhPW8ubGVuZ3RoO3doaWxlKGEtLSlpPUYuY2FsbChlLG9bYV0pLGVbaV09IShuW2ldPW9bYV0pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSwwLG4pfSk6cn19LHBzZXVkb3M6e25vdDpsdChmdW5jdGlvbihlKXt2YXIgdD1bXSxuPVtdLHI9bChlLnJlcGxhY2UoeiwiJDEiKSk7cmV0dXJuIHJbYl0/bHQoZnVuY3Rpb24oZSx0LG4saSl7dmFyIG8sYT1yKGUsbnVsbCxpLFtdKSxzPWUubGVuZ3RoO3doaWxlKHMtLSkobz1hW3NdKSYmKGVbc109ISh0W3NdPW8pKX0pOmZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gdFswXT1lLHIodCxudWxsLG8sbiksIW4ucG9wKCl9fSksaGFzOmx0KGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gYXQoZSx0KS5sZW5ndGg+MH19KSxjb250YWluczpsdChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuKHQudGV4dENvbnRlbnR8fHQuaW5uZXJUZXh0fHxhKHQpKS5pbmRleE9mKGUpPi0xfX0pLGxhbmc6bHQoZnVuY3Rpb24oZSl7cmV0dXJuIEcudGVzdChlfHwiIil8fGF0LmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2UpLGU9ZS5yZXBsYWNlKHJ0LGl0KS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHQpe3ZhciBuO2RvIGlmKG49aD90Lmxhbmc6dC5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fHQuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIG49bi50b0xvd2VyQ2FzZSgpLG49PT1lfHwwPT09bi5pbmRleE9mKGUrIi0iKTt3aGlsZSgodD10LnBhcmVudE5vZGUpJiYxPT09dC5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKHQpe3ZhciBuPWUubG9jYXRpb24mJmUubG9jYXRpb24uaGFzaDtyZXR1cm4gbiYmbi5zbGljZSgxKT09PXQuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1kfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWYuYWN0aXZlRWxlbWVudCYmKCFmLmhhc0ZvY3VzfHxmLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYhIWUuY2hlY2tlZHx8Im9wdGlvbiI9PT10JiYhIWUuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGUuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oZSl7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKWlmKGUubm9kZU5hbWU+IkAifHwzPT09ZS5ub2RlVHlwZXx8ND09PWUubm9kZVR5cGUpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4hby5wc2V1ZG9zLmVtcHR5KGUpfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHR0LnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBldC50ZXN0KGUubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT10JiYiYnV0dG9uIj09PWUudHlwZXx8ImJ1dHRvbiI9PT10fSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWUudHlwZSYmKG51bGw9PSh0PWUuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHx0LnRvTG93ZXJDYXNlKCk9PT1lLnR5cGUpfSxmaXJzdDpodChmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6aHQoZnVuY3Rpb24oZSx0KXtyZXR1cm5bdC0xXX0pLGVxOmh0KGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bMD5uP24rdDpuXX0pLGV2ZW46aHQoZnVuY3Rpb24oZSx0KXt2YXIgbj0wO2Zvcig7dD5uO24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksb2RkOmh0KGZ1bmN0aW9uKGUsdCl7dmFyIG49MTtmb3IoO3Q+bjtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0Omh0KGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wPm4/bit0Om47Zm9yKDstLXI+PTA7KWUucHVzaChyKTtyZXR1cm4gZX0pLGd0Omh0KGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wPm4/bit0Om47Zm9yKDt0PisrcjspZS5wdXNoKHIpO3JldHVybiBlfSl9fSxvLnBzZXVkb3MubnRoPW8ucHNldWRvcy5lcTtmb3IobiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlvLnBzZXVkb3Nbbl09ZnQobik7Zm9yKG4gaW57c3VibWl0OiEwLHJlc2V0OiEwfSlvLnBzZXVkb3Nbbl09ZHQobik7ZnVuY3Rpb24gZ3QoKXt9Z3QucHJvdG90eXBlPW8uZmlsdGVycz1vLnBzZXVkb3Msby5zZXRGaWx0ZXJzPW5ldyBndDtmdW5jdGlvbiBtdChlLHQpe3ZhciBuLHIsaSxhLHMsbCx1LGM9a1tlKyIgIl07aWYoYylyZXR1cm4gdD8wOmMuc2xpY2UoMCk7cz1lLGw9W10sdT1vLnByZUZpbHRlcjt3aGlsZShzKXsoIW58fChyPVguZXhlYyhzKSkpJiYociYmKHM9cy5zbGljZShyWzBdLmxlbmd0aCl8fHMpLGwucHVzaChpPVtdKSksbj0hMSwocj1VLmV4ZWMocykpJiYobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKHosIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2ZvcihhIGluIG8uZmlsdGVyKSEocj1RW2FdLmV4ZWMocykpfHx1W2FdJiYhKHI9dVthXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6cn0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P3MubGVuZ3RoOnM/YXQuZXJyb3IoZSk6ayhlLGwpLnNsaWNlKDApfWZ1bmN0aW9uIHl0KGUpe3ZhciB0PTAsbj1lLmxlbmd0aCxyPSIiO2Zvcig7bj50O3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIHZ0KGUsdCxuKXt2YXIgcj10LmRpcixvPW4mJiJwYXJlbnROb2RlIj09PXIsYT1DKys7cmV0dXJuIHQuZmlyc3Q/ZnVuY3Rpb24odCxuLGkpe3doaWxlKHQ9dFtyXSlpZigxPT09dC5ub2RlVHlwZXx8bylyZXR1cm4gZSh0LG4saSl9OmZ1bmN0aW9uKHQsbixzKXt2YXIgbCx1LGMscD1UKyIgIithO2lmKHMpe3doaWxlKHQ9dFtyXSlpZigoMT09PXQubm9kZVR5cGV8fG8pJiZlKHQsbixzKSlyZXR1cm4hMH1lbHNlIHdoaWxlKHQ9dFtyXSlpZigxPT09dC5ub2RlVHlwZXx8bylpZihjPXRbYl18fCh0W2JdPXt9KSwodT1jW3JdKSYmdVswXT09PXApe2lmKChsPXVbMV0pPT09ITB8fGw9PT1pKXJldHVybiBsPT09ITB9ZWxzZSBpZih1PWNbcl09W3BdLHVbMV09ZSh0LG4scyl8fGksdVsxXT09PSEwKXJldHVybiEwfX1mdW5jdGlvbiBidChlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiB4dChlLHQsbixyLGkpe3ZhciBvLGE9W10scz0wLGw9ZS5sZW5ndGgsdT1udWxsIT10O2Zvcig7bD5zO3MrKykobz1lW3NdKSYmKCFufHxuKG8scixpKSkmJihhLnB1c2gobyksdSYmdC5wdXNoKHMpKTtyZXR1cm4gYX1mdW5jdGlvbiB3dChlLHQsbixyLGksbyl7cmV0dXJuIHImJiFyW2JdJiYocj13dChyKSksaSYmIWlbYl0mJihpPXd0KGksbykpLGx0KGZ1bmN0aW9uKG8sYSxzLGwpe3ZhciB1LGMscCxmPVtdLGQ9W10saD1hLmxlbmd0aCxnPW98fE50KHR8fCIqIixzLm5vZGVUeXBlP1tzXTpzLFtdKSxtPSFlfHwhbyYmdD9nOnh0KGcsZixlLHMsbCkseT1uP2l8fChvP2U6aHx8cik/W106YTptO2lmKG4mJm4obSx5LHMsbCkscil7dT14dCh5LGQpLHIodSxbXSxzLGwpLGM9dS5sZW5ndGg7d2hpbGUoYy0tKShwPXVbY10pJiYoeVtkW2NdXT0hKG1bZFtjXV09cCkpfWlmKG8pe2lmKGl8fGUpe2lmKGkpe3U9W10sYz15Lmxlbmd0aDt3aGlsZShjLS0pKHA9eVtjXSkmJnUucHVzaChtW2NdPXApO2kobnVsbCx5PVtdLHUsbCl9Yz15Lmxlbmd0aDt3aGlsZShjLS0pKHA9eVtjXSkmJih1PWk/Ri5jYWxsKG8scCk6ZltjXSk+LTEmJihvW3VdPSEoYVt1XT1wKSl9fWVsc2UgeT14dCh5PT09YT95LnNwbGljZShoLHkubGVuZ3RoKTp5KSxpP2kobnVsbCxhLHksbCk6TS5hcHBseShhLHkpfSl9ZnVuY3Rpb24gVHQoZSl7dmFyIHQsbixyLGk9ZS5sZW5ndGgsYT1vLnJlbGF0aXZlW2VbMF0udHlwZV0scz1hfHxvLnJlbGF0aXZlWyIgIl0sbD1hPzE6MCxjPXZ0KGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0scywhMCkscD12dChmdW5jdGlvbihlKXtyZXR1cm4gRi5jYWxsKHQsZSk+LTF9LHMsITApLGY9W2Z1bmN0aW9uKGUsbixyKXtyZXR1cm4hYSYmKHJ8fG4hPT11KXx8KCh0PW4pLm5vZGVUeXBlP2MoZSxuLHIpOnAoZSxuLHIpKX1dO2Zvcig7aT5sO2wrKylpZihuPW8ucmVsYXRpdmVbZVtsXS50eXBlXSlmPVt2dChidChmKSxuKV07ZWxzZXtpZihuPW8uZmlsdGVyW2VbbF0udHlwZV0uYXBwbHkobnVsbCxlW2xdLm1hdGNoZXMpLG5bYl0pe2ZvcihyPSsrbDtpPnI7cisrKWlmKG8ucmVsYXRpdmVbZVtyXS50eXBlXSlicmVhaztyZXR1cm4gd3QobD4xJiZidChmKSxsPjEmJnl0KGUuc2xpY2UoMCxsLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtsLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoeiwiJDEiKSxuLHI+bCYmVHQoZS5zbGljZShsLHIpKSxpPnImJlR0KGU9ZS5zbGljZShyKSksaT5yJiZ5dChlKSl9Zi5wdXNoKG4pfXJldHVybiBidChmKX1mdW5jdGlvbiBDdChlLHQpe3ZhciBuPTAscj10Lmxlbmd0aD4wLGE9ZS5sZW5ndGg+MCxzPWZ1bmN0aW9uKHMsbCxjLHAsZCl7dmFyIGgsZyxtLHk9W10sdj0wLGI9IjAiLHg9cyYmW10sdz1udWxsIT1kLEM9dSxOPXN8fGEmJm8uZmluZC5UQUcoIioiLGQmJmwucGFyZW50Tm9kZXx8bCksaz1UKz1udWxsPT1DPzE6TWF0aC5yYW5kb20oKXx8LjE7Zm9yKHcmJih1PWwhPT1mJiZsLGk9bik7bnVsbCE9KGg9TltiXSk7YisrKXtpZihhJiZoKXtnPTA7d2hpbGUobT1lW2crK10paWYobShoLGwsYykpe3AucHVzaChoKTticmVha313JiYoVD1rLGk9KytuKX1yJiYoKGg9IW0mJmgpJiZ2LS0scyYmeC5wdXNoKGgpKX1pZih2Kz1iLHImJmIhPT12KXtnPTA7d2hpbGUobT10W2crK10pbSh4LHksbCxjKTtpZihzKXtpZih2PjApd2hpbGUoYi0tKXhbYl18fHlbYl18fCh5W2JdPXEuY2FsbChwKSk7eT14dCh5KX1NLmFwcGx5KHAseSksdyYmIXMmJnkubGVuZ3RoPjAmJnYrdC5sZW5ndGg+MSYmYXQudW5pcXVlU29ydChwKX1yZXR1cm4gdyYmKFQ9ayx1PUMpLHh9O3JldHVybiByP2x0KHMpOnN9bD1hdC5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLG89RVtlKyIgIl07aWYoIW8pe3R8fCh0PW10KGUpKSxuPXQubGVuZ3RoO3doaWxlKG4tLSlvPVR0KHRbbl0pLG9bYl0/ci5wdXNoKG8pOmkucHVzaChvKTtvPUUoZSxDdChpLHIpKX1yZXR1cm4gb307ZnVuY3Rpb24gTnQoZSx0LG4pe3ZhciByPTAsaT10Lmxlbmd0aDtmb3IoO2k+cjtyKyspYXQoZSx0W3JdLG4pO3JldHVybiBufWZ1bmN0aW9uIGt0KGUsdCxuLGkpe3ZhciBhLHMsdSxjLHAsZj1tdChlKTtpZighaSYmMT09PWYubGVuZ3RoKXtpZihzPWZbMF09ZlswXS5zbGljZSgwKSxzLmxlbmd0aD4yJiYiSUQiPT09KHU9c1swXSkudHlwZSYmci5nZXRCeUlkJiY5PT09dC5ub2RlVHlwZSYmaCYmby5yZWxhdGl2ZVtzWzFdLnR5cGVdKXtpZih0PShvLmZpbmQuSUQodS5tYXRjaGVzWzBdLnJlcGxhY2UocnQsaXQpLHQpfHxbXSlbMF0sIXQpcmV0dXJuIG47ZT1lLnNsaWNlKHMuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWE9US5uZWVkc0NvbnRleHQudGVzdChlKT8wOnMubGVuZ3RoO3doaWxlKGEtLSl7aWYodT1zW2FdLG8ucmVsYXRpdmVbYz11LnR5cGVdKWJyZWFrO2lmKChwPW8uZmluZFtjXSkmJihpPXAodS5tYXRjaGVzWzBdLnJlcGxhY2UocnQsaXQpLFYudGVzdChzWzBdLnR5cGUpJiZ0LnBhcmVudE5vZGV8fHQpKSl7aWYocy5zcGxpY2UoYSwxKSxlPWkubGVuZ3RoJiZ5dChzKSwhZSlyZXR1cm4gTS5hcHBseShuLGkpLG47YnJlYWt9fX1yZXR1cm4gbChlLGYpKGksdCwhaCxuLFYudGVzdChlKSksbn1yLnNvcnRTdGFibGU9Yi5zcGxpdCgiIikuc29ydChBKS5qb2luKCIiKT09PWIsci5kZXRlY3REdXBsaWNhdGVzPVMscCgpLHIuc29ydERldGFjaGVkPXV0KGZ1bmN0aW9uKGUpe3JldHVybiAxJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZi5jcmVhdGVFbGVtZW50KCJkaXYiKSl9KSx1dChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxjdCgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oZSxuLHIpe3JldHVybiByP3Q6ZS5nZXRBdHRyaWJ1dGUobiwidHlwZSI9PT1uLnRvTG93ZXJDYXNlKCk/MToyKX0pLHIuYXR0cmlidXRlcyYmdXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8Y3QoInZhbHVlIixmdW5jdGlvbihlLG4scil7cmV0dXJuIHJ8fCJpbnB1dCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dDplLmRlZmF1bHRWYWx1ZX0pLHV0KGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxjdChCLGZ1bmN0aW9uKGUsbixyKXt2YXIgaTtyZXR1cm4gcj90OihpPWUuZ2V0QXR0cmlidXRlTm9kZShuKSkmJmkuc3BlY2lmaWVkP2kudmFsdWU6ZVtuXT09PSEwP24udG9Mb3dlckNhc2UoKTpudWxsfSkseC5maW5kPWF0LHguZXhwcj1hdC5zZWxlY3RvcnMseC5leHByWyI6Il09eC5leHByLnBzZXVkb3MseC51bmlxdWU9YXQudW5pcXVlU29ydCx4LnRleHQ9YXQuZ2V0VGV4dCx4LmlzWE1MRG9jPWF0LmlzWE1MLHguY29udGFpbnM9YXQuY29udGFpbnN9KGUpO3ZhciBPPXt9O2Z1bmN0aW9uIEYoZSl7dmFyIHQ9T1tlXT17fTtyZXR1cm4geC5lYWNoKGUubWF0Y2goVCl8fFtdLGZ1bmN0aW9uKGUsbil7dFtuXT0hMH0pLHR9eC5DYWxsYmFja3M9ZnVuY3Rpb24oZSl7ZT0ic3RyaW5nIj09dHlwZW9mIGU/T1tlXXx8RihlKTp4LmV4dGVuZCh7fSxlKTt2YXIgbixyLGksbyxhLHMsbD1bXSx1PSFlLm9uY2UmJltdLGM9ZnVuY3Rpb24odCl7Zm9yKHI9ZS5tZW1vcnkmJnQsaT0hMCxhPXN8fDAscz0wLG89bC5sZW5ndGgsbj0hMDtsJiZvPmE7YSsrKWlmKGxbYV0uYXBwbHkodFswXSx0WzFdKT09PSExJiZlLnN0b3BPbkZhbHNlKXtyPSExO2JyZWFrfW49ITEsbCYmKHU/dS5sZW5ndGgmJmModS5zaGlmdCgpKTpyP2w9W106cC5kaXNhYmxlKCkpfSxwPXthZGQ6ZnVuY3Rpb24oKXtpZihsKXt2YXIgdD1sLmxlbmd0aDsoZnVuY3Rpb24gaSh0KXt4LmVhY2godCxmdW5jdGlvbih0LG4pe3ZhciByPXgudHlwZShuKTsiZnVuY3Rpb24iPT09cj9lLnVuaXF1ZSYmcC5oYXMobil8fGwucHVzaChuKTpuJiZuLmxlbmd0aCYmInN0cmluZyIhPT1yJiZpKG4pfSl9KShhcmd1bWVudHMpLG4/bz1sLmxlbmd0aDpyJiYocz10LGMocikpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gbCYmeC5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciByO3doaWxlKChyPXguaW5BcnJheSh0LGwscikpPi0xKWwuc3BsaWNlKHIsMSksbiYmKG8+PXImJm8tLSxhPj1yJiZhLS0pfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlP3guaW5BcnJheShlLGwpPi0xOiEoIWx8fCFsLmxlbmd0aCl9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGw9W10sbz0wLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbD11PXI9dCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFsfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIHU9dCxyfHxwLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hdX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4hbHx8aSYmIXV8fCh0PXR8fFtdLHQ9W2UsdC5zbGljZT90LnNsaWNlKCk6dF0sbj91LnB1c2godCk6Yyh0KSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBwLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhaX19O3JldHVybiBwfSx4LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9W1sicmVzb2x2ZSIsImRvbmUiLHguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIseC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIseC5DYWxsYmFja3MoIm1lbW9yeSIpXV0sbj0icGVuZGluZyIscj17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB4LkRlZmVycmVkKGZ1bmN0aW9uKG4pe3guZWFjaCh0LGZ1bmN0aW9uKHQsbyl7dmFyIGE9b1swXSxzPXguaXNGdW5jdGlvbihlW3RdKSYmZVt0XTtpW29bMV1dKGZ1bmN0aW9uKCl7dmFyIGU9cyYmcy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmeC5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkuZG9uZShuLnJlc29sdmUpLmZhaWwobi5yZWplY3QpLnByb2dyZXNzKG4ubm90aWZ5KTpuW2ErIldpdGgiXSh0aGlzPT09cj9uLnByb21pc2UoKTp0aGlzLHM/W2VdOmFyZ3VtZW50cyl9KX0pLGU9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT94LmV4dGVuZChlLHIpOnJ9fSxpPXt9O3JldHVybiByLnBpcGU9ci50aGVuLHguZWFjaCh0LGZ1bmN0aW9uKGUsbyl7dmFyIGE9b1syXSxzPW9bM107cltvWzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe249c30sdFsxXmVdWzJdLmRpc2FibGUsdFsyXVsyXS5sb2NrKSxpW29bMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGlbb1swXSsiV2l0aCJdKHRoaXM9PT1pP3I6dGhpcyxhcmd1bWVudHMpLHRoaXN9LGlbb1swXSsiV2l0aCJdPWEuZmlyZVdpdGh9KSxyLnByb21pc2UoaSksZSYmZS5jYWxsKGksaSksaX0sd2hlbjpmdW5jdGlvbihlKXt2YXIgdD0wLG49Zy5jYWxsKGFyZ3VtZW50cykscj1uLmxlbmd0aCxpPTEhPT1yfHxlJiZ4LmlzRnVuY3Rpb24oZS5wcm9taXNlKT9yOjAsbz0xPT09aT9lOnguRGVmZXJyZWQoKSxhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dFtlXT10aGlzLG5bZV09YXJndW1lbnRzLmxlbmd0aD4xP2cuY2FsbChhcmd1bWVudHMpOnIsbj09PXM/by5ub3RpZnlXaXRoKHQsbik6LS1pfHxvLnJlc29sdmVXaXRoKHQsbil9fSxzLGwsdTtpZihyPjEpZm9yKHM9QXJyYXkociksbD1BcnJheShyKSx1PUFycmF5KHIpO3I+dDt0Kyspblt0XSYmeC5pc0Z1bmN0aW9uKG5bdF0ucHJvbWlzZSk/blt0XS5wcm9taXNlKCkuZG9uZShhKHQsdSxuKSkuZmFpbChvLnJlamVjdCkucHJvZ3Jlc3MoYSh0LGwscykpOi0taTtyZXR1cm4gaXx8by5yZXNvbHZlV2l0aCh1LG4pLG8ucHJvbWlzZSgpfX0pLHguc3VwcG9ydD1mdW5jdGlvbih0KXt2YXIgbixyLG8scyxsLHUsYyxwLGYsZD1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKGQuc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IiksZC5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsbj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIil8fFtdLHI9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLCFyfHwhci5zdHlsZXx8IW4ubGVuZ3RoKXJldHVybiB0O3M9YS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSx1PXMuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksbz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLHIuc3R5bGUuY3NzVGV4dD0idG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjUiLHQuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWQuY2xhc3NOYW1lLHQubGVhZGluZ1doaXRlc3BhY2U9Mz09PWQuZmlyc3RDaGlsZC5ub2RlVHlwZSx0LnRib2R5PSFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCx0Lmh0bWxTZXJpYWxpemU9ISFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHQuc3R5bGU9L3RvcC8udGVzdChyLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksdC5ocmVmTm9ybWFsaXplZD0iL2EiPT09ci5nZXRBdHRyaWJ1dGUoImhyZWYiKSx0Lm9wYWNpdHk9L14wLjUvLnRlc3Qoci5zdHlsZS5vcGFjaXR5KSx0LmNzc0Zsb2F0PSEhci5zdHlsZS5jc3NGbG9hdCx0LmNoZWNrT249ISFvLnZhbHVlLHQub3B0U2VsZWN0ZWQ9dS5zZWxlY3RlZCx0LmVuY3R5cGU9ISFhLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLHQuaHRtbDVDbG9uZT0iPDpuYXY+PC86bmF2PiIhPT1hLmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSghMCkub3V0ZXJIVE1MLHQuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSx0LnNocmlua1dyYXBCbG9ja3M9ITEsdC5waXhlbFBvc2l0aW9uPSExLHQuZGVsZXRlRXhwYW5kbz0hMCx0Lm5vQ2xvbmVFdmVudD0hMCx0LnJlbGlhYmxlTWFyZ2luUmlnaHQ9ITAsdC5ib3hTaXppbmdSZWxpYWJsZT0hMCxvLmNoZWNrZWQ9ITAsdC5ub0Nsb25lQ2hlY2tlZD1vLmNsb25lTm9kZSghMCkuY2hlY2tlZCxzLmRpc2FibGVkPSEwLHQub3B0RGlzYWJsZWQ9IXUuZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBkLnRlc3R9Y2F0Y2goaCl7dC5kZWxldGVFeHBhbmRvPSExfW89YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLG8uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLHQuaW5wdXQ9IiI9PT1vLmdldEF0dHJpYnV0ZSgidmFsdWUiKSxvLnZhbHVlPSJ0IixvLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdC5yYWRpb1ZhbHVlPSJ0Ij09PW8udmFsdWUsby5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJ0Iiksby5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksbD1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxsLmFwcGVuZENoaWxkKG8pLHQuYXBwZW5kQ2hlY2tlZD1vLmNoZWNrZWQsdC5jaGVja0Nsb25lPWwuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGQuYXR0YWNoRXZlbnQmJihkLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbigpe3Qubm9DbG9uZUV2ZW50PSExfSksZC5jbG9uZU5vZGUoITApLmNsaWNrKCkpO2ZvcihmIGlue3N1Ym1pdDohMCxjaGFuZ2U6ITAsZm9jdXNpbjohMH0pZC5zZXRBdHRyaWJ1dGUoYz0ib24iK2YsInQiKSx0W2YrIkJ1YmJsZXMiXT1jIGluIGV8fGQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITE7ZC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGQuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix0LmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09ZC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcDtmb3IoZiBpbiB4KHQpKWJyZWFrO3JldHVybiB0Lm93bkxhc3Q9IjAiIT09Zix4KGZ1bmN0aW9uKCl7dmFyIG4scixvLHM9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDsiLGw9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdO2wmJihuPWEuY3JlYXRlRWxlbWVudCgiZGl2Iiksbi5zdHlsZS5jc3NUZXh0PSJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6LTk5OTlweDttYXJnaW4tdG9wOjFweCIsbC5hcHBlbmRDaGlsZChuKS5hcHBlbmRDaGlsZChkKSxkLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIsbz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLG9bMF0uc3R5bGUuY3NzVGV4dD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSIscD0wPT09b1swXS5vZmZzZXRIZWlnaHQsb1swXS5zdHlsZS5kaXNwbGF5PSIiLG9bMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsdC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9cCYmMD09PW9bMF0ub2Zmc2V0SGVpZ2h0LGQuaW5uZXJIVE1MPSIiLGQuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MXB4O2JvcmRlcjoxcHg7ZGlzcGxheTpibG9jazt3aWR0aDo0cHg7bWFyZ2luLXRvcDoxJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MSU7Iix4LnN3YXAobCxudWxsIT1sLnN0eWxlLnpvb20/e3pvb206MX06e30sZnVuY3Rpb24oKXt0LmJveFNpemluZz00PT09ZC5vZmZzZXRXaWR0aH0pLGUuZ2V0Q29tcHV0ZWRTdHlsZSYmKHQucGl4ZWxQb3NpdGlvbj0iMSUiIT09KGUuZ2V0Q29tcHV0ZWRTdHlsZShkLG51bGwpfHx7fSkudG9wLHQuYm94U2l6aW5nUmVsaWFibGU9IjRweCI9PT0oZS5nZXRDb21wdXRlZFN0eWxlKGQsbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoLHI9ZC5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxyLnN0eWxlLmNzc1RleHQ9ZC5zdHlsZS5jc3NUZXh0PXMsci5zdHlsZS5tYXJnaW5SaWdodD1yLnN0eWxlLndpZHRoPSIwIixkLnN0eWxlLndpZHRoPSIxcHgiLHQucmVsaWFibGVNYXJnaW5SaWdodD0hcGFyc2VGbG9hdCgoZS5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCl8fHt9KS5tYXJnaW5SaWdodCkpLHR5cGVvZiBkLnN0eWxlLnpvb20hPT1pJiYoZC5pbm5lckhUTUw9IiIsZC5zdHlsZS5jc3NUZXh0PXMrIndpZHRoOjFweDtwYWRkaW5nOjFweDtkaXNwbGF5OmlubGluZTt6b29tOjEiLHQuaW5saW5lQmxvY2tOZWVkc0xheW91dD0zPT09ZC5vZmZzZXRXaWR0aCxkLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixkLmlubmVySFRNTD0iPGRpdj48L2Rpdj4iLGQuZmlyc3RDaGlsZC5zdHlsZS53aWR0aD0iNXB4Iix0LnNocmlua1dyYXBCbG9ja3M9MyE9PWQub2Zmc2V0V2lkdGgsdC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0JiYobC5zdHlsZS56b29tPTEpKSxsLnJlbW92ZUNoaWxkKG4pLG49ZD1vPXI9bnVsbCl9KSxuPXM9bD11PXI9bz1udWxsLHQKfSh7fSk7dmFyIEI9Lyg/Olx7W1xzXFNdKlx9fFxbW1xzXFNdKlxdKSQvLFA9LyhbQS1aXSkvZztmdW5jdGlvbiBSKGUsbixyLGkpe2lmKHguYWNjZXB0RGF0YShlKSl7dmFyIG8sYSxzPXguZXhwYW5kbyxsPWUubm9kZVR5cGUsdT1sP3guY2FjaGU6ZSxjPWw/ZVtzXTplW3NdJiZzO2lmKGMmJnVbY10mJihpfHx1W2NdLmRhdGEpfHxyIT09dHx8InN0cmluZyIhPXR5cGVvZiBuKXJldHVybiBjfHwoYz1sP2Vbc109cC5wb3AoKXx8eC5ndWlkKys6cyksdVtjXXx8KHVbY109bD97fTp7dG9KU09OOngubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIG58fCJmdW5jdGlvbiI9PXR5cGVvZiBuKSYmKGk/dVtjXT14LmV4dGVuZCh1W2NdLG4pOnVbY10uZGF0YT14LmV4dGVuZCh1W2NdLmRhdGEsbikpLGE9dVtjXSxpfHwoYS5kYXRhfHwoYS5kYXRhPXt9KSxhPWEuZGF0YSksciE9PXQmJihhW3guY2FtZWxDYXNlKG4pXT1yKSwic3RyaW5nIj09dHlwZW9mIG4/KG89YVtuXSxudWxsPT1vJiYobz1hW3guY2FtZWxDYXNlKG4pXSkpOm89YSxvfX1mdW5jdGlvbiBXKGUsdCxuKXtpZih4LmFjY2VwdERhdGEoZSkpe3ZhciByLGksbz1lLm5vZGVUeXBlLGE9bz94LmNhY2hlOmUscz1vP2VbeC5leHBhbmRvXTp4LmV4cGFuZG87aWYoYVtzXSl7aWYodCYmKHI9bj9hW3NdOmFbc10uZGF0YSkpe3guaXNBcnJheSh0KT90PXQuY29uY2F0KHgubWFwKHQseC5jYW1lbENhc2UpKTp0IGluIHI/dD1bdF06KHQ9eC5jYW1lbENhc2UodCksdD10IGluIHI/W3RdOnQuc3BsaXQoIiAiKSksaT10Lmxlbmd0aDt3aGlsZShpLS0pZGVsZXRlIHJbdFtpXV07aWYobj8hSShyKToheC5pc0VtcHR5T2JqZWN0KHIpKXJldHVybn0obnx8KGRlbGV0ZSBhW3NdLmRhdGEsSShhW3NdKSkpJiYobz94LmNsZWFuRGF0YShbZV0sITApOnguc3VwcG9ydC5kZWxldGVFeHBhbmRvfHxhIT1hLndpbmRvdz9kZWxldGUgYVtzXTphW3NdPW51bGwpfX19eC5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7YXBwbGV0OiEwLGVtYmVkOiEwLG9iamVjdDoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gZT1lLm5vZGVUeXBlP3guY2FjaGVbZVt4LmV4cGFuZG9dXTplW3guZXhwYW5kb10sISFlJiYhSShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFIoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFcoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBSKGUsdCxuLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gVyhlLHQsITApfSxhY2NlcHREYXRhOmZ1bmN0aW9uKGUpe2lmKGUubm9kZVR5cGUmJjEhPT1lLm5vZGVUeXBlJiY5IT09ZS5ub2RlVHlwZSlyZXR1cm4hMTt2YXIgdD1lLm5vZGVOYW1lJiZ4Lm5vRGF0YVtlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO3JldHVybiF0fHx0IT09ITAmJmUuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT10fX0pLHguZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxvPW51bGwsYT0wLHM9dGhpc1swXTtpZihlPT09dCl7aWYodGhpcy5sZW5ndGgmJihvPXguZGF0YShzKSwxPT09cy5ub2RlVHlwZSYmIXguX2RhdGEocywicGFyc2VkQXR0cnMiKSkpe2ZvcihyPXMuYXR0cmlidXRlcztyLmxlbmd0aD5hO2ErKylpPXJbYV0ubmFtZSwwPT09aS5pbmRleE9mKCJkYXRhLSIpJiYoaT14LmNhbWVsQ2FzZShpLnNsaWNlKDUpKSwkKHMsaSxvW2ldKSk7eC5fZGF0YShzLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBvfXJldHVybiJvYmplY3QiPT10eXBlb2YgZT90aGlzLmVhY2goZnVuY3Rpb24oKXt4LmRhdGEodGhpcyxlKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXt4LmRhdGEodGhpcyxlLG4pfSk6cz8kKHMsZSx4LmRhdGEocyxlKSk6bnVsbH0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5yZW1vdmVEYXRhKHRoaXMsZSl9KX19KTtmdW5jdGlvbiAkKGUsbixyKXtpZihyPT09dCYmMT09PWUubm9kZVR5cGUpe3ZhciBpPSJkYXRhLSIrbi5yZXBsYWNlKFAsIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYocj1lLmdldEF0dHJpYnV0ZShpKSwic3RyaW5nIj09dHlwZW9mIHIpe3RyeXtyPSJ0cnVlIj09PXI/ITA6ImZhbHNlIj09PXI/ITE6Im51bGwiPT09cj9udWxsOityKyIiPT09cj8rcjpCLnRlc3Qocik/eC5wYXJzZUpTT04ocik6cn1jYXRjaChvKXt9eC5kYXRhKGUsbixyKX1lbHNlIHI9dH1yZXR1cm4gcn1mdW5jdGlvbiBJKGUpe3ZhciB0O2Zvcih0IGluIGUpaWYoKCJkYXRhIiE9PXR8fCF4LmlzRW1wdHlPYmplY3QoZVt0XSkpJiYidG9KU09OIiE9PXQpcmV0dXJuITE7cmV0dXJuITB9eC5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsbixyKXt2YXIgaTtyZXR1cm4gZT8obj0obnx8ImZ4IikrInF1ZXVlIixpPXguX2RhdGEoZSxuKSxyJiYoIWl8fHguaXNBcnJheShyKT9pPXguX2RhdGEoZSxuLHgubWFrZUFycmF5KHIpKTppLnB1c2gocikpLGl8fFtdKTp0fSxkZXF1ZXVlOmZ1bmN0aW9uKGUsdCl7dD10fHwiZngiO3ZhciBuPXgucXVldWUoZSx0KSxyPW4ubGVuZ3RoLGk9bi5zaGlmdCgpLG89eC5fcXVldWVIb29rcyhlLHQpLGE9ZnVuY3Rpb24oKXt4LmRlcXVldWUoZSx0KX07ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGEsbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4geC5fZGF0YShlLG4pfHx4Ll9kYXRhKGUsbix7ZW1wdHk6eC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7eC5fcmVtb3ZlRGF0YShlLHQrInF1ZXVlIikseC5fcmVtb3ZlRGF0YShlLG4pfSl9KX19KSx4LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSxuKXt2YXIgcj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKG49ZSxlPSJmeCIsci0tKSxyPmFyZ3VtZW50cy5sZW5ndGg/eC5xdWV1ZSh0aGlzWzBdLGUpOm49PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9eC5xdWV1ZSh0aGlzLGUsbik7eC5fcXVldWVIb29rcyh0aGlzLGUpLCJmeCI9PT1lJiYiaW5wcm9ncmVzcyIhPT10WzBdJiZ4LmRlcXVldWUodGhpcyxlKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmRlcXVldWUodGhpcyxlKX0pfSxkZWxheTpmdW5jdGlvbihlLHQpe3JldHVybiBlPXguZng/eC5meC5zcGVlZHNbZV18fGU6ZSx0PXR8fCJmeCIsdGhpcy5xdWV1ZSh0LGZ1bmN0aW9uKHQsbil7dmFyIHI9c2V0VGltZW91dCh0LGUpO24uc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChyKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLG4pe3ZhciByLGk9MSxvPXguRGVmZXJyZWQoKSxhPXRoaXMscz10aGlzLmxlbmd0aCxsPWZ1bmN0aW9uKCl7LS1pfHxvLnJlc29sdmVXaXRoKGEsW2FdKX07InN0cmluZyIhPXR5cGVvZiBlJiYobj1lLGU9dCksZT1lfHwiZngiO3doaWxlKHMtLSlyPXguX2RhdGEoYVtzXSxlKyJxdWV1ZUhvb2tzIiksciYmci5lbXB0eSYmKGkrKyxyLmVtcHR5LmFkZChsKSk7cmV0dXJuIGwoKSxvLnByb21pc2Uobil9fSk7dmFyIHosWCxVPS9bXHRcclxuXGZdL2csVj0vXHIvZyxZPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QpJC9pLEo9L14oPzphfGFyZWEpJC9pLEc9L14oPzpjaGVja2VkfHNlbGVjdGVkKSQvaSxRPXguc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsSz14LnN1cHBvcnQuaW5wdXQ7eC5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5hY2Nlc3ModGhpcyx4LmF0dHIsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3gucmVtb3ZlQXR0cih0aGlzLGUpfSl9LHByb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5hY2Nlc3ModGhpcyx4LnByb3AsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9eC5wcm9wRml4W2VdfHxlLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2VdPXQsZGVsZXRlIHRoaXNbZV19Y2F0Y2gobil7fX0pfSxhZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGE9MCxzPXRoaXMubGVuZ3RoLGw9InN0cmluZyI9PXR5cGVvZiBlJiZlO2lmKHguaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCx0aGlzLmNsYXNzTmFtZSkpfSk7aWYobClmb3IodD0oZXx8IiIpLm1hdGNoKFQpfHxbXTtzPmE7YSsrKWlmKG49dGhpc1thXSxyPTE9PT1uLm5vZGVUeXBlJiYobi5jbGFzc05hbWU/KCIgIituLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoVSwiICIpOiIgIikpe289MDt3aGlsZShpPXRbbysrXSkwPnIuaW5kZXhPZigiICIraSsiICIpJiYocis9aSsiICIpO24uY2xhc3NOYW1lPXgudHJpbShyKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhPTAscz10aGlzLmxlbmd0aCxsPTA9PT1hcmd1bWVudHMubGVuZ3RofHwic3RyaW5nIj09dHlwZW9mIGUmJmU7aWYoeC5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LHRoaXMuY2xhc3NOYW1lKSl9KTtpZihsKWZvcih0PShlfHwiIikubWF0Y2goVCl8fFtdO3M+YTthKyspaWYobj10aGlzW2FdLHI9MT09PW4ubm9kZVR5cGUmJihuLmNsYXNzTmFtZT8oIiAiK24uY2xhc3NOYW1lKyIgIikucmVwbGFjZShVLCIgIik6IiIpKXtvPTA7d2hpbGUoaT10W28rK10pd2hpbGUoci5pbmRleE9mKCIgIitpKyIgIik+PTApcj1yLnJlcGxhY2UoIiAiK2krIiAiLCIgIik7bi5jbGFzc05hbWU9ZT94LnRyaW0ocik6IiJ9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGU7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmInN0cmluZyI9PT1uP3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOnguaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24obil7eCh0aGlzKS50b2dnbGVDbGFzcyhlLmNhbGwodGhpcyxuLHRoaXMuY2xhc3NOYW1lLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1uKXt2YXIgdCxyPTAsbz14KHRoaXMpLGE9ZS5tYXRjaChUKXx8W107d2hpbGUodD1hW3IrK10pby5oYXNDbGFzcyh0KT9vLnJlbW92ZUNsYXNzKHQpOm8uYWRkQ2xhc3ModCl9ZWxzZShuPT09aXx8ImJvb2xlYW4iPT09bikmJih0aGlzLmNsYXNzTmFtZSYmeC5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGU9PT0hMT8iIjp4Ll9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PSIgIitlKyIgIixuPTAscj10aGlzLmxlbmd0aDtmb3IoO3I+bjtuKyspaWYoMT09PXRoaXNbbl0ubm9kZVR5cGUmJigiICIrdGhpc1tuXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKFUsIiAiKS5pbmRleE9mKHQpPj0wKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oZSl7dmFyIG4scixpLG89dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gaT14LmlzRnVuY3Rpb24oZSksdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciBvOzE9PT10aGlzLm5vZGVUeXBlJiYobz1pP2UuY2FsbCh0aGlzLG4seCh0aGlzKS52YWwoKSk6ZSxudWxsPT1vP289IiI6Im51bWJlciI9PXR5cGVvZiBvP28rPSIiOnguaXNBcnJheShvKSYmKG89eC5tYXAobyxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLHI9eC52YWxIb29rc1t0aGlzLnR5cGVdfHx4LnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sciYmInNldCJpbiByJiZyLnNldCh0aGlzLG8sInZhbHVlIikhPT10fHwodGhpcy52YWx1ZT1vKSl9KTtpZihvKXJldHVybiByPXgudmFsSG9va3Nbby50eXBlXXx8eC52YWxIb29rc1tvLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLHImJiJnZXQiaW4gciYmKG49ci5nZXQobywidmFsdWUiKSkhPT10P246KG49by52YWx1ZSwic3RyaW5nIj09dHlwZW9mIG4/bi5yZXBsYWNlKFYsIiIpOm51bGw9PW4/IiI6bil9fX0pLHguZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9eC5maW5kLmF0dHIoZSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9dD90OmUudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLm9wdGlvbnMsaT1lLnNlbGVjdGVkSW5kZXgsbz0ic2VsZWN0LW9uZSI9PT1lLnR5cGV8fDA+aSxhPW8/bnVsbDpbXSxzPW8/aSsxOnIubGVuZ3RoLGw9MD5pP3M6bz9pOjA7Zm9yKDtzPmw7bCsrKWlmKG49cltsXSwhKCFuLnNlbGVjdGVkJiZsIT09aXx8KHguc3VwcG9ydC5vcHREaXNhYmxlZD9uLmRpc2FibGVkOm51bGwhPT1uLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fG4ucGFyZW50Tm9kZS5kaXNhYmxlZCYmeC5ub2RlTmFtZShuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PXgobikudmFsKCksbylyZXR1cm4gdDthLnB1c2godCl9cmV0dXJuIGF9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz14Lm1ha2VBcnJheSh0KSxhPWkubGVuZ3RoO3doaWxlKGEtLSlyPWlbYV0sKHIuc2VsZWN0ZWQ9eC5pbkFycmF5KHgocikudmFsKCksbyk+PTApJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX0sYXR0cjpmdW5jdGlvbihlLG4scil7dmFyIG8sYSxzPWUubm9kZVR5cGU7aWYoZSYmMyE9PXMmJjghPT1zJiYyIT09cylyZXR1cm4gdHlwZW9mIGUuZ2V0QXR0cmlidXRlPT09aT94LnByb3AoZSxuLHIpOigxPT09cyYmeC5pc1hNTERvYyhlKXx8KG49bi50b0xvd2VyQ2FzZSgpLG89eC5hdHRySG9va3Nbbl18fCh4LmV4cHIubWF0Y2guYm9vbC50ZXN0KG4pP1g6eikpLHI9PT10P28mJiJnZXQiaW4gbyYmbnVsbCE9PShhPW8uZ2V0KGUsbikpP2E6KGE9eC5maW5kLmF0dHIoZSxuKSxudWxsPT1hP3Q6YSk6bnVsbCE9PXI/byYmInNldCJpbiBvJiYoYT1vLnNldChlLHIsbikpIT09dD9hOihlLnNldEF0dHJpYnV0ZShuLHIrIiIpLHIpOih4LnJlbW92ZUF0dHIoZSxuKSx0KSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9MCxvPXQmJnQubWF0Y2goVCk7aWYobyYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1vW2krK10pcj14LnByb3BGaXhbbl18fG4seC5leHByLm1hdGNoLmJvb2wudGVzdChuKT9LJiZRfHwhRy50ZXN0KG4pP2Vbcl09ITE6ZVt4LmNhbWVsQ2FzZSgiZGVmYXVsdC0iK24pXT1lW3JdPSExOnguYXR0cihlLG4sIiIpLGUucmVtb3ZlQXR0cmlidXRlKFE/bjpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZigheC5zdXBwb3J0LnJhZGlvVmFsdWUmJiJyYWRpbyI9PT10JiZ4Lm5vZGVOYW1lKGUsImlucHV0Iikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJ0eXBlIix0KSxuJiYoZS52YWx1ZT1uKSx0fX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn0scHJvcDpmdW5jdGlvbihlLG4scil7dmFyIGksbyxhLHM9ZS5ub2RlVHlwZTtpZihlJiYzIT09cyYmOCE9PXMmJjIhPT1zKXJldHVybiBhPTEhPT1zfHwheC5pc1hNTERvYyhlKSxhJiYobj14LnByb3BGaXhbbl18fG4sbz14LnByb3BIb29rc1tuXSksciE9PXQ/byYmInNldCJpbiBvJiYoaT1vLnNldChlLHIsbikpIT09dD9pOmVbbl09cjpvJiYiZ2V0ImluIG8mJm51bGwhPT0oaT1vLmdldChlLG4pKT9pOmVbbl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD14LmZpbmQuYXR0cihlLCJ0YWJpbmRleCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOlkudGVzdChlLm5vZGVOYW1lKXx8Si50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fX0pLFg9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9PT0hMT94LnJlbW92ZUF0dHIoZSxuKTpLJiZRfHwhRy50ZXN0KG4pP2Uuc2V0QXR0cmlidXRlKCFRJiZ4LnByb3BGaXhbbl18fG4sbik6ZVt4LmNhbWVsQ2FzZSgiZGVmYXVsdC0iK24pXT1lW25dPSEwLG59fSx4LmVhY2goeC5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSxuKXt2YXIgcj14LmV4cHIuYXR0ckhhbmRsZVtuXXx8eC5maW5kLmF0dHI7eC5leHByLmF0dHJIYW5kbGVbbl09SyYmUXx8IUcudGVzdChuKT9mdW5jdGlvbihlLG4saSl7dmFyIG89eC5leHByLmF0dHJIYW5kbGVbbl0sYT1pP3Q6KHguZXhwci5hdHRySGFuZGxlW25dPXQpIT1yKGUsbixpKT9uLnRvTG93ZXJDYXNlKCk6bnVsbDtyZXR1cm4geC5leHByLmF0dHJIYW5kbGVbbl09byxhfTpmdW5jdGlvbihlLG4scil7cmV0dXJuIHI/dDplW3guY2FtZWxDYXNlKCJkZWZhdWx0LSIrbildP24udG9Mb3dlckNhc2UoKTpudWxsfX0pLEsmJlF8fCh4LmF0dHJIb29rcy52YWx1ZT17c2V0OmZ1bmN0aW9uKGUsbixyKXtyZXR1cm4geC5ub2RlTmFtZShlLCJpbnB1dCIpPyhlLmRlZmF1bHRWYWx1ZT1uLHQpOnomJnouc2V0KGUsbixyKX19KSxRfHwoej17c2V0OmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1lLmdldEF0dHJpYnV0ZU5vZGUocik7cmV0dXJuIGl8fGUuc2V0QXR0cmlidXRlTm9kZShpPWUub3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUocikpLGkudmFsdWU9bis9IiIsInZhbHVlIj09PXJ8fG49PT1lLmdldEF0dHJpYnV0ZShyKT9uOnR9fSx4LmV4cHIuYXR0ckhhbmRsZS5pZD14LmV4cHIuYXR0ckhhbmRsZS5uYW1lPXguZXhwci5hdHRySGFuZGxlLmNvb3Jkcz1mdW5jdGlvbihlLG4scil7dmFyIGk7cmV0dXJuIHI/dDooaT1lLmdldEF0dHJpYnV0ZU5vZGUobikpJiYiIiE9PWkudmFsdWU/aS52YWx1ZTpudWxsfSx4LnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pO3JldHVybiByJiZyLnNwZWNpZmllZD9yLnZhbHVlOnR9LHNldDp6LnNldH0seC5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ouc2V0KGUsIiI9PT10PyExOnQsbil9fSx4LmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGUsbil7eC5hdHRySG9va3Nbbl09e3NldDpmdW5jdGlvbihlLHIpe3JldHVybiIiPT09cj8oZS5zZXRBdHRyaWJ1dGUobiwiYXV0byIpLHIpOnR9fX0pKSx4LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fHguZWFjaChbImhyZWYiLCJzcmMiXSxmdW5jdGlvbihlLHQpe3gucHJvcEhvb2tzW3RdPXtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsNCl9fX0pLHguc3VwcG9ydC5zdHlsZXx8KHguYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3R5bGUuY3NzVGV4dHx8dH0sc2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3R5bGUuY3NzVGV4dD10KyIifX0pLHguc3VwcG9ydC5vcHRTZWxlY3RlZHx8KHgucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYodC5zZWxlY3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpLG51bGx9fSkseC5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXt4LnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSkseC5zdXBwb3J0LmVuY3R5cGV8fCh4LnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKSx4LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt4LnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSxuKXtyZXR1cm4geC5pc0FycmF5KG4pP2UuY2hlY2tlZD14LmluQXJyYXkoeChlKS52YWwoKSxuKT49MDp0fX0seC5zdXBwb3J0LmNoZWNrT258fCh4LnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSk7dmFyIFo9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWEpJC9pLGV0PS9ea2V5Lyx0dD0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sbnQ9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLHJ0PS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gaXQoKXtyZXR1cm4hMH1mdW5jdGlvbiBvdCgpe3JldHVybiExfWZ1bmN0aW9uIGF0KCl7dHJ5e3JldHVybiBhLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX14LmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGUsbixyLG8sYSl7dmFyIHMsbCx1LGMscCxmLGQsaCxnLG0seSx2PXguX2RhdGEoZSk7aWYodil7ci5oYW5kbGVyJiYoYz1yLHI9Yy5oYW5kbGVyLGE9Yy5zZWxlY3Rvciksci5ndWlkfHwoci5ndWlkPXguZ3VpZCsrKSwobD12LmV2ZW50cyl8fChsPXYuZXZlbnRzPXt9KSwoZj12LmhhbmRsZSl8fChmPXYuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgeD09PWl8fGUmJnguZXZlbnQudHJpZ2dlcmVkPT09ZS50eXBlP3Q6eC5ldmVudC5kaXNwYXRjaC5hcHBseShmLmVsZW0sYXJndW1lbnRzKX0sZi5lbGVtPWUpLG49KG58fCIiKS5tYXRjaChUKXx8WyIiXSx1PW4ubGVuZ3RoO3doaWxlKHUtLSlzPXJ0LmV4ZWMoblt1XSl8fFtdLGc9eT1zWzFdLG09KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxnJiYocD14LmV2ZW50LnNwZWNpYWxbZ118fHt9LGc9KGE/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGcscD14LmV2ZW50LnNwZWNpYWxbZ118fHt9LGQ9eC5leHRlbmQoe3R5cGU6ZyxvcmlnVHlwZTp5LGRhdGE6byxoYW5kbGVyOnIsZ3VpZDpyLmd1aWQsc2VsZWN0b3I6YSxuZWVkc0NvbnRleHQ6YSYmeC5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGEpLG5hbWVzcGFjZTptLmpvaW4oIi4iKX0sYyksKGg9bFtnXSl8fChoPWxbZ109W10saC5kZWxlZ2F0ZUNvdW50PTAscC5zZXR1cCYmcC5zZXR1cC5jYWxsKGUsbyxtLGYpIT09ITF8fChlLmFkZEV2ZW50TGlzdGVuZXI/ZS5hZGRFdmVudExpc3RlbmVyKGcsZiwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib24iK2csZikpKSxwLmFkZCYmKHAuYWRkLmNhbGwoZSxkKSxkLmhhbmRsZXIuZ3VpZHx8KGQuaGFuZGxlci5ndWlkPXIuZ3VpZCkpLGE/aC5zcGxpY2UoaC5kZWxlZ2F0ZUNvdW50KyssMCxkKTpoLnB1c2goZCkseC5ldmVudC5nbG9iYWxbZ109ITApO2U9bnVsbH19LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyxsLHUsYyxwLGYsZCxoLGcsbT14Lmhhc0RhdGEoZSkmJnguX2RhdGEoZSk7aWYobSYmKGM9bS5ldmVudHMpKXt0PSh0fHwiIikubWF0Y2goVCl8fFsiIl0sdT10Lmxlbmd0aDt3aGlsZSh1LS0paWYocz1ydC5leGVjKHRbdV0pfHxbXSxkPWc9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7cD14LmV2ZW50LnNwZWNpYWxbZF18fHt9LGQ9KHI/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGQsZj1jW2RdfHxbXSxzPXNbMl0mJlJlZ0V4cCgiKF58XFwuKSIraC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxsPW89Zi5sZW5ndGg7d2hpbGUoby0tKWE9ZltvXSwhaSYmZyE9PWEub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWEuZ3VpZHx8cyYmIXMudGVzdChhLm5hbWVzcGFjZSl8fHImJnIhPT1hLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFhLnNlbGVjdG9yKXx8KGYuc3BsaWNlKG8sMSksYS5zZWxlY3RvciYmZi5kZWxlZ2F0ZUNvdW50LS0scC5yZW1vdmUmJnAucmVtb3ZlLmNhbGwoZSxhKSk7bCYmIWYubGVuZ3RoJiYocC50ZWFyZG93biYmcC50ZWFyZG93bi5jYWxsKGUsaCxtLmhhbmRsZSkhPT0hMXx8eC5yZW1vdmVFdmVudChlLGQsbS5oYW5kbGUpLGRlbGV0ZSBjW2RdKX1lbHNlIGZvcihkIGluIGMpeC5ldmVudC5yZW1vdmUoZSxkK3RbdV0sbixyLCEwKTt4LmlzRW1wdHlPYmplY3QoYykmJihkZWxldGUgbS5oYW5kbGUseC5fcmVtb3ZlRGF0YShlLCJldmVudHMiKSl9fSx0cmlnZ2VyOmZ1bmN0aW9uKG4scixpLG8pe3ZhciBzLGwsdSxjLHAsZixkLGg9W2l8fGFdLGc9di5jYWxsKG4sInR5cGUiKT9uLnR5cGU6bixtPXYuY2FsbChuLCJuYW1lc3BhY2UiKT9uLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKHU9Zj1pPWl8fGEsMyE9PWkubm9kZVR5cGUmJjghPT1pLm5vZGVUeXBlJiYhbnQudGVzdChnK3guZXZlbnQudHJpZ2dlcmVkKSYmKGcuaW5kZXhPZigiLiIpPj0wJiYobT1nLnNwbGl0KCIuIiksZz1tLnNoaWZ0KCksbS5zb3J0KCkpLGw9MD5nLmluZGV4T2YoIjoiKSYmIm9uIitnLG49blt4LmV4cGFuZG9dP246bmV3IHguRXZlbnQoZywib2JqZWN0Ij09dHlwZW9mIG4mJm4pLG4uaXNUcmlnZ2VyPW8/MjozLG4ubmFtZXNwYWNlPW0uam9pbigiLiIpLG4ubmFtZXNwYWNlX3JlPW4ubmFtZXNwYWNlP1JlZ0V4cCgiKF58XFwuKSIrbS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLG4ucmVzdWx0PXQsbi50YXJnZXR8fChuLnRhcmdldD1pKSxyPW51bGw9PXI/W25dOngubWFrZUFycmF5KHIsW25dKSxwPXguZXZlbnQuc3BlY2lhbFtnXXx8e30sb3x8IXAudHJpZ2dlcnx8cC50cmlnZ2VyLmFwcGx5KGkscikhPT0hMSkpe2lmKCFvJiYhcC5ub0J1YmJsZSYmIXguaXNXaW5kb3coaSkpe2ZvcihjPXAuZGVsZWdhdGVUeXBlfHxnLG50LnRlc3QoYytnKXx8KHU9dS5wYXJlbnROb2RlKTt1O3U9dS5wYXJlbnROb2RlKWgucHVzaCh1KSxmPXU7Zj09PShpLm93bmVyRG9jdW1lbnR8fGEpJiZoLnB1c2goZi5kZWZhdWx0Vmlld3x8Zi5wYXJlbnRXaW5kb3d8fGUpfWQ9MDt3aGlsZSgodT1oW2QrK10pJiYhbi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKW4udHlwZT1kPjE/YzpwLmJpbmRUeXBlfHxnLHM9KHguX2RhdGEodSwiZXZlbnRzIil8fHt9KVtuLnR5cGVdJiZ4Ll9kYXRhKHUsImhhbmRsZSIpLHMmJnMuYXBwbHkodSxyKSxzPWwmJnVbbF0scyYmeC5hY2NlcHREYXRhKHUpJiZzLmFwcGx5JiZzLmFwcGx5KHUscik9PT0hMSYmbi5wcmV2ZW50RGVmYXVsdCgpO2lmKG4udHlwZT1nLCFvJiYhbi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmKCFwLl9kZWZhdWx0fHxwLl9kZWZhdWx0LmFwcGx5KGgucG9wKCkscik9PT0hMSkmJnguYWNjZXB0RGF0YShpKSYmbCYmaVtnXSYmIXguaXNXaW5kb3coaSkpe2Y9aVtsXSxmJiYoaVtsXT1udWxsKSx4LmV2ZW50LnRyaWdnZXJlZD1nO3RyeXtpW2ddKCl9Y2F0Y2goeSl7fXguZXZlbnQudHJpZ2dlcmVkPXQsZiYmKGlbbF09Zil9cmV0dXJuIG4ucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7ZT14LmV2ZW50LmZpeChlKTt2YXIgbixyLGksbyxhLHM9W10sbD1nLmNhbGwoYXJndW1lbnRzKSx1PSh4Ll9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbZS50eXBlXXx8W10sYz14LmV2ZW50LnNwZWNpYWxbZS50eXBlXXx8e307aWYobFswXT1lLGUuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8Yy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsZSkhPT0hMSl7cz14LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxlLHUpLG49MDt3aGlsZSgobz1zW24rK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXtlLmN1cnJlbnRUYXJnZXQ9by5lbGVtLGE9MDt3aGlsZSgoaT1vLmhhbmRsZXJzW2ErK10pJiYhZS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghZS5uYW1lc3BhY2VfcmV8fGUubmFtZXNwYWNlX3JlLnRlc3QoaS5uYW1lc3BhY2UpKSYmKGUuaGFuZGxlT2JqPWksZS5kYXRhPWkuZGF0YSxyPSgoeC5ldmVudC5zcGVjaWFsW2kub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxpLmhhbmRsZXIpLmFwcGx5KG8uZWxlbSxsKSxyIT09dCYmKGUucmVzdWx0PXIpPT09ITEmJihlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBjLnBvc3REaXNwYXRjaCYmYy5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGUpLGUucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oZSxuKXt2YXIgcixpLG8sYSxzPVtdLGw9bi5kZWxlZ2F0ZUNvdW50LHU9ZS50YXJnZXQ7aWYobCYmdS5ub2RlVHlwZSYmKCFlLmJ1dHRvbnx8ImNsaWNrIiE9PWUudHlwZSkpZm9yKDt1IT10aGlzO3U9dS5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT11Lm5vZGVUeXBlJiYodS5kaXNhYmxlZCE9PSEwfHwiY2xpY2siIT09ZS50eXBlKSl7Zm9yKG89W10sYT0wO2w+YTthKyspaT1uW2FdLHI9aS5zZWxlY3RvcisiICIsb1tyXT09PXQmJihvW3JdPWkubmVlZHNDb250ZXh0P3gocix0aGlzKS5pbmRleCh1KT49MDp4LmZpbmQocix0aGlzLG51bGwsW3VdKS5sZW5ndGgpLG9bcl0mJm8ucHVzaChpKTtvLmxlbmd0aCYmcy5wdXNoKHtlbGVtOnUsaGFuZGxlcnM6b30pfXJldHVybiBuLmxlbmd0aD5sJiZzLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczpuLnNsaWNlKGwpfSksc30sZml4OmZ1bmN0aW9uKGUpe2lmKGVbeC5leHBhbmRvXSlyZXR1cm4gZTt2YXIgdCxuLHIsaT1lLnR5cGUsbz1lLHM9dGhpcy5maXhIb29rc1tpXTtzfHwodGhpcy5maXhIb29rc1tpXT1zPXR0LnRlc3QoaSk/dGhpcy5tb3VzZUhvb2tzOmV0LnRlc3QoaSk/dGhpcy5rZXlIb29rczp7fSkscj1zLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KHMucHJvcHMpOnRoaXMucHJvcHMsZT1uZXcgeC5FdmVudChvKSx0PXIubGVuZ3RoO3doaWxlKHQtLSluPXJbdF0sZVtuXT1vW25dO3JldHVybiBlLnRhcmdldHx8KGUudGFyZ2V0PW8uc3JjRWxlbWVudHx8YSksMz09PWUudGFyZ2V0Lm5vZGVUeXBlJiYoZS50YXJnZXQ9ZS50YXJnZXQucGFyZW50Tm9kZSksZS5tZXRhS2V5PSEhZS5tZXRhS2V5LHMuZmlsdGVyP3MuZmlsdGVyKGUsbyk6ZX0scHJvcHM6ImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWUud2hpY2gmJihlLndoaWNoPW51bGwhPXQuY2hhckNvZGU/dC5jaGFyQ29kZTp0LmtleUNvZGUpLGV9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLG4pe3ZhciByLGksbyxzPW4uYnV0dG9uLGw9bi5mcm9tRWxlbWVudDtyZXR1cm4gbnVsbD09ZS5wYWdlWCYmbnVsbCE9bi5jbGllbnRYJiYoaT1lLnRhcmdldC5vd25lckRvY3VtZW50fHxhLG89aS5kb2N1bWVudEVsZW1lbnQscj1pLmJvZHksZS5wYWdlWD1uLmNsaWVudFgrKG8mJm8uc2Nyb2xsTGVmdHx8ciYmci5zY3JvbGxMZWZ0fHwwKS0obyYmby5jbGllbnRMZWZ0fHxyJiZyLmNsaWVudExlZnR8fDApLGUucGFnZVk9bi5jbGllbnRZKyhvJiZvLnNjcm9sbFRvcHx8ciYmci5zY3JvbGxUb3B8fDApLShvJiZvLmNsaWVudFRvcHx8ciYmci5jbGllbnRUb3B8fDApKSwhZS5yZWxhdGVkVGFyZ2V0JiZsJiYoZS5yZWxhdGVkVGFyZ2V0PWw9PT1lLnRhcmdldD9uLnRvRWxlbWVudDpsKSxlLndoaWNofHxzPT09dHx8KGUud2hpY2g9MSZzPzE6MiZzPzM6NCZzPzI6MCksZX19LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7dHJpZ2dlcjpmdW5jdGlvbigpe2lmKHRoaXMhPT1hdCgpJiZ0aGlzLmZvY3VzKXRyeXtyZXR1cm4gdGhpcy5mb2N1cygpLCExfWNhdGNoKGUpe319LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PWF0KCkmJnRoaXMuYmx1cj8odGhpcy5ibHVyKCksITEpOnR9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiB4Lm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dH0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHgubm9kZU5hbWUoZS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe2UucmVzdWx0IT09dCYmKGUub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1lLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9eC5leHRlbmQobmV3IHguRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtyP3guZXZlbnQudHJpZ2dlcihpLG51bGwsdCk6eC5ldmVudC5kaXNwYXRjaC5jYWxsKHQsaSksaS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmbi5wcmV2ZW50RGVmYXVsdCgpfX0seC5yZW1vdmVFdmVudD1hLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSl9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0ib24iK3Q7ZS5kZXRhY2hFdmVudCYmKHR5cGVvZiBlW3JdPT09aSYmKGVbcl09bnVsbCksZS5kZXRhY2hFdmVudChyLG4pKX0seC5FdmVudD1mdW5jdGlvbihlLG4pe3JldHVybiB0aGlzIGluc3RhbmNlb2YgeC5FdmVudD8oZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8ZS5yZXR1cm5WYWx1ZT09PSExfHxlLmdldFByZXZlbnREZWZhdWx0JiZlLmdldFByZXZlbnREZWZhdWx0KCk/aXQ6b3QpOnRoaXMudHlwZT1lLG4mJnguZXh0ZW5kKHRoaXMsbiksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fHgubm93KCksdGhpc1t4LmV4cGFuZG9dPSEwLHQpOm5ldyB4LkV2ZW50KGUsbil9LHguRXZlbnQucHJvdG90eXBlPXtpc0RlZmF1bHRQcmV2ZW50ZWQ6b3QsaXNQcm9wYWdhdGlvblN0b3BwZWQ6b3QsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6b3QscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9aXQsZSYmKGUucHJldmVudERlZmF1bHQ/ZS5wcmV2ZW50RGVmYXVsdCgpOmUucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1pdCxlJiYoZS5zdG9wUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksZS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWl0LHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSx4LmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihlLHQpe3guZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7cmV0dXJuKCFpfHxpIT09ciYmIXguY29udGFpbnMocixpKSkmJihlLnR5cGU9by5vcmlnVHlwZSxuPW8uaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50eXBlPXQpLG59fX0pLHguc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoeC5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4geC5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6KHguZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oZSl7dmFyIG49ZS50YXJnZXQscj14Lm5vZGVOYW1lKG4sImlucHV0Iil8fHgubm9kZU5hbWUobiwiYnV0dG9uIik/bi5mb3JtOnQ7ciYmIXguX2RhdGEociwic3VibWl0QnViYmxlcyIpJiYoeC5ldmVudC5hZGQociwic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGUpe2UuX3N1Ym1pdF9idWJibGU9ITB9KSx4Ll9kYXRhKHIsInN1Ym1pdEJ1YmJsZXMiLCEwKSl9KSx0KX0scG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe2UuX3N1Ym1pdF9idWJibGUmJihkZWxldGUgZS5fc3VibWl0X2J1YmJsZSx0aGlzLnBhcmVudE5vZGUmJiFlLmlzVHJpZ2dlciYmeC5ldmVudC5zaW11bGF0ZSgic3VibWl0Iix0aGlzLnBhcmVudE5vZGUsZSwhMCkpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiB4Lm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTooeC5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKSx0KX19KSx4LnN1cHBvcnQuY2hhbmdlQnViYmxlc3x8KHguZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIFoudGVzdCh0aGlzLm5vZGVOYW1lKT8oKCJjaGVja2JveCI9PT10aGlzLnR5cGV8fCJyYWRpbyI9PT10aGlzLnR5cGUpJiYoeC5ldmVudC5hZGQodGhpcywicHJvcGVydHljaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oZSl7ImNoZWNrZWQiPT09ZS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZSYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMCl9KSx4LmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdlIixmdW5jdGlvbihlKXt0aGlzLl9qdXN0X2NoYW5nZWQmJiFlLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSkseC5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLGUsITApfSkpLCExKTooeC5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7Wi50ZXN0KHQubm9kZU5hbWUpJiYheC5fZGF0YSh0LCJjaGFuZ2VCdWJibGVzIikmJih4LmV2ZW50LmFkZCh0LCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oZSl7IXRoaXMucGFyZW50Tm9kZXx8ZS5pc1NpbXVsYXRlZHx8ZS5pc1RyaWdnZXJ8fHguZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGUsITApfSkseC5fZGF0YSh0LCJjaGFuZ2VCdWJibGVzIiwhMCkpfSksdCl9LGhhbmRsZTpmdW5jdGlvbihlKXt2YXIgbj1lLnRhcmdldDtyZXR1cm4gdGhpcyE9PW58fGUuaXNTaW11bGF0ZWR8fGUuaXNUcmlnZ2VyfHwicmFkaW8iIT09bi50eXBlJiYiY2hlY2tib3giIT09bi50eXBlP2UuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOnR9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIHguZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIiksIVoudGVzdCh0aGlzLm5vZGVOYW1lKX19KSx4LnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fHguZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9ZnVuY3Rpb24oZSl7eC5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LHguZXZlbnQuZml4KGUpLCEwKX07eC5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpezA9PT1uKysmJmEuYWRkRXZlbnRMaXN0ZW5lcihlLHIsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpezA9PT0tLW4mJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHIsITApfX19KSx4LmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSxuLHIsaSxvKXt2YXIgYSxzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7InN0cmluZyIhPXR5cGVvZiBuJiYocj1yfHxuLG49dCk7Zm9yKGEgaW4gZSl0aGlzLm9uKGEsbixyLGVbYV0sbyk7cmV0dXJuIHRoaXN9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj10KTpudWxsPT1pJiYoInN0cmluZyI9PXR5cGVvZiBuPyhpPXIscj10KTooaT1yLHI9bixuPXQpKSxpPT09ITEpaT1vdDtlbHNlIGlmKCFpKXJldHVybiB0aGlzO3JldHVybiAxPT09byYmKHM9aSxpPWZ1bmN0aW9uKGUpe3JldHVybiB4KCkub2ZmKGUpLHMuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpLmd1aWQ9cy5ndWlkfHwocy5ndWlkPXguZ3VpZCsrKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5ldmVudC5hZGQodGhpcyxlLGkscixuKX0pfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiBpPWUuaGFuZGxlT2JqLHgoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGkubmFtZXNwYWNlP2kub3JpZ1R5cGUrIi4iK2kubmFtZXNwYWNlOmkub3JpZ1R5cGUsaS5zZWxlY3RvcixpLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IobyBpbiBlKXRoaXMub2ZmKG8sbixlW29dKTtyZXR1cm4gdGhpc31yZXR1cm4obj09PSExfHwiZnVuY3Rpb24iPT10eXBlb2YgbikmJihyPW4sbj10KSxyPT09ITEmJihyPW90KSx0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmV2ZW50LnJlbW92ZSh0aGlzLGUscixuKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3guZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzWzBdO3JldHVybiByP3guZXZlbnQudHJpZ2dlcihlLG4sciwhMCk6dH19KTt2YXIgc3Q9L14uW146I1xbXC4sXSokLyxsdD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyx1dD14LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LGN0PXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3guZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG49W10scj10aGlzLGk9ci5sZW5ndGg7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayh4KGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7aT50O3QrKylpZih4LmNvbnRhaW5zKHJbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKHQ9MDtpPnQ7dCsrKXguZmluZChlLHJbdF0sbik7cmV0dXJuIG49dGhpcy5wdXNoU3RhY2soaT4xP3gudW5pcXVlKG4pOm4pLG4uc2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj90aGlzLnNlbGVjdG9yKyIgIitlOmUsbn0saGFzOmZ1bmN0aW9uKGUpe3ZhciB0LG49eChlLHRoaXMpLHI9bi5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDtyPnQ7dCsrKWlmKHguY29udGFpbnModGhpcyxuW3RdKSlyZXR1cm4hMH0pfSxub3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGZ0KHRoaXMsZXx8W10sITApKX0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGV8fFtdLCExKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhZnQodGhpcywic3RyaW5nIj09dHlwZW9mIGUmJnV0LnRlc3QoZSk/eChlKTplfHxbXSwhMSkubGVuZ3RofSxjbG9zZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dGhpcy5sZW5ndGgsbz1bXSxhPXV0LnRlc3QoZSl8fCJzdHJpbmciIT10eXBlb2YgZT94KGUsdHx8dGhpcy5jb250ZXh0KTowO2Zvcig7aT5yO3IrKylmb3Iobj10aGlzW3JdO24mJm4hPT10O249bi5wYXJlbnROb2RlKWlmKDExPm4ubm9kZVR5cGUmJihhP2EuaW5kZXgobik+LTE6MT09PW4ubm9kZVR5cGUmJnguZmluZC5tYXRjaGVzU2VsZWN0b3IobixlKSkpe249by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhvLmxlbmd0aD4xP3gudW5pcXVlKG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/eC5pbkFycmF5KHRoaXNbMF0seChlKSk6eC5pbkFycmF5KGUuanF1ZXJ5P2VbMF06ZSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3ZhciBuPSJzdHJpbmciPT10eXBlb2YgZT94KGUsdCk6eC5tYWtlQXJyYXkoZSYmZS5ub2RlVHlwZT9bZV06ZSkscj14Lm1lcmdlKHRoaXMuZ2V0KCksbik7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgudW5pcXVlKHIpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSk7ZnVuY3Rpb24gcHQoZSx0KXtkbyBlPWVbdF07d2hpbGUoZSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfXguZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4geC5kaXIoZSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmRpcihlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gcHQoZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gcHQoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmRpcihlLCJuZXh0U2libGluZyIsbil9LHByZXZVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHguZGlyKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiB4LnNpYmxpbmcoKGUucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsZSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGUpe3JldHVybiB4LnNpYmxpbmcoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHgubm9kZU5hbWUoZSwiaWZyYW1lIik/ZS5jb250ZW50RG9jdW1lbnR8fGUuY29udGVudFdpbmRvdy5kb2N1bWVudDp4Lm1lcmdlKFtdLGUuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT14Lm1hcCh0aGlzLHQsbik7cmV0dXJuIlVudGlsIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihpPXguZmlsdGVyKHIsaSkpLHRoaXMubGVuZ3RoPjEmJihjdFtlXXx8KGk9eC51bmlxdWUoaSkpLGx0LnRlc3QoZSkmJihpPWkucmV2ZXJzZSgpKSksdGhpcy5wdXNoU3RhY2soaSl9fSkseC5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT94LmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOnguZmluZC5tYXRjaGVzKGUseC5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSxkaXI6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPVtdLG89ZVtuXTt3aGlsZShvJiY5IT09by5ub2RlVHlwZSYmKHI9PT10fHwxIT09by5ub2RlVHlwZXx8IXgobykuaXMocikpKTE9PT1vLm5vZGVUeXBlJiZpLnB1c2gobyksbz1vW25dO3JldHVybiBpfSxzaWJsaW5nOmZ1bmN0aW9uKGUsdCl7dmFyIG49W107Zm9yKDtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn19KTtmdW5jdGlvbiBmdChlLHQsbil7aWYoeC5pc0Z1bmN0aW9uKHQpKXJldHVybiB4LmdyZXAoZSxmdW5jdGlvbihlLHIpe3JldHVybiEhdC5jYWxsKGUscixlKSE9PW59KTtpZih0Lm5vZGVUeXBlKXJldHVybiB4LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQhPT1ufSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZihzdC50ZXN0KHQpKXJldHVybiB4LmZpbHRlcih0LGUsbik7dD14LmZpbHRlcih0LGUpfXJldHVybiB4LmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4geC5pbkFycmF5KGUsdCk+PTAhPT1ufSl9ZnVuY3Rpb24gZHQoZSl7dmFyIHQ9aHQuc3BsaXQoInwiKSxuPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKG4uY3JlYXRlRWxlbWVudCl3aGlsZSh0Lmxlbmd0aCluLmNyZWF0ZUVsZW1lbnQodC5wb3AoKSk7cmV0dXJuIG59dmFyIGh0PSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixndD0vIGpRdWVyeVxkKz0iKD86bnVsbHxcZCspIi9nLG10PVJlZ0V4cCgiPCg/OiIraHQrIilbXFxzLz5dIiwiaSIpLHl0PS9eXHMrLyx2dD0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGJ0PS88KFtcdzpdKykvLHh0PS88dGJvZHkvaSx3dD0vPHwmIz9cdys7LyxUdD0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLEN0PS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLE50PS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGt0PS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxFdD0vXnRydWVcLyguKikvLFN0PS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZyxBdD17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6eC5zdXBwb3J0Lmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sanQ9ZHQoYSksRHQ9anQuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7QXQub3B0Z3JvdXA9QXQub3B0aW9uLEF0LnRib2R5PUF0LnRmb290PUF0LmNvbGdyb3VwPUF0LmNhcHRpb249QXQudGhlYWQsQXQudGg9QXQudGQseC5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10P3gudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGEpLmNyZWF0ZVRleHROb2RlKGUpKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PUx0KHRoaXMsZSk7dC5hcHBlbmRDaGlsZChlKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9THQodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWU/eC5maWx0ZXIoZSx0aGlzKTp0aGlzLGk9MDtmb3IoO251bGwhPShuPXJbaV0pO2krKyl0fHwxIT09bi5ub2RlVHlwZXx8eC5jbGVhbkRhdGEoRnQobikpLG4ucGFyZW50Tm9kZSYmKHQmJnguY29udGFpbnMobi5vd25lckRvY3VtZW50LG4pJiZfdChGdChuLCJzY3JpcHQiKSksbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXt2YXIgZSx0PTA7Zm9yKDtudWxsIT0oZT10aGlzW3RdKTt0KyspezE9PT1lLm5vZGVUeXBlJiZ4LmNsZWFuRGF0YShGdChlLCExKSk7d2hpbGUoZS5maXJzdENoaWxkKWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtlLm9wdGlvbnMmJngubm9kZU5hbWUoZSwic2VsZWN0IikmJihlLm9wdGlvbnMubGVuZ3RoPTApfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGw9PWU/ITE6ZSx0PW51bGw9PXQ/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHguY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7dmFyIG49dGhpc1swXXx8e30scj0wLGk9dGhpcy5sZW5ndGg7aWYoZT09PXQpcmV0dXJuIDE9PT1uLm5vZGVUeXBlP24uaW5uZXJIVE1MLnJlcGxhY2UoZ3QsIiIpOnQ7aWYoISgic3RyaW5nIiE9dHlwZW9mIGV8fFR0LnRlc3QoZSl8fCF4LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSYmbXQudGVzdChlKXx8IXguc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmeXQudGVzdChlKXx8QXRbKGJ0LmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKSl7ZT1lLnJlcGxhY2UodnQsIjwkMT48LyQyPiIpO3RyeXtmb3IoO2k+cjtyKyspbj10aGlzW3JdfHx7fSwxPT09bi5ub2RlVHlwZSYmKHguY2xlYW5EYXRhKEZ0KG4sITEpKSxuLmlubmVySFRNTD1lKTtuPTB9Y2F0Y2gobyl7fX1uJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGU9eC5tYXAodGhpcyxmdW5jdGlvbihlKXtyZXR1cm5bZS5uZXh0U2libGluZyxlLnBhcmVudE5vZGVdfSksdD0wO3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihuKXt2YXIgcj1lW3QrK10saT1lW3QrK107aSYmKHImJnIucGFyZW50Tm9kZSE9PWkmJihyPXRoaXMubmV4dFNpYmxpbmcpLHgodGhpcykucmVtb3ZlKCksaS5pbnNlcnRCZWZvcmUobixyKSl9LCEwKSx0P3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlbW92ZShlLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZSx0LG4pe2U9ZC5hcHBseShbXSxlKTt2YXIgcixpLG8sYSxzLGwsdT0wLGM9dGhpcy5sZW5ndGgscD10aGlzLGY9Yy0xLGg9ZVswXSxnPXguaXNGdW5jdGlvbihoKTtpZihnfHwhKDE+PWN8fCJzdHJpbmciIT10eXBlb2YgaHx8eC5zdXBwb3J0LmNoZWNrQ2xvbmUpJiZOdC50ZXN0KGgpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24ocil7dmFyIGk9cC5lcShyKTtnJiYoZVswXT1oLmNhbGwodGhpcyxyLGkuaHRtbCgpKSksaS5kb21NYW5pcChlLHQsbil9KTtpZihjJiYobD14LmJ1aWxkRnJhZ21lbnQoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsIW4mJnRoaXMpLHI9bC5maXJzdENoaWxkLDE9PT1sLmNoaWxkTm9kZXMubGVuZ3RoJiYobD1yKSxyKSl7Zm9yKGE9eC5tYXAoRnQobCwic2NyaXB0IiksSHQpLG89YS5sZW5ndGg7Yz51O3UrKylpPWwsdSE9PWYmJihpPXguY2xvbmUoaSwhMCwhMCksbyYmeC5tZXJnZShhLEZ0KGksInNjcmlwdCIpKSksdC5jYWxsKHRoaXNbdV0saSx1KTtpZihvKWZvcihzPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCx4Lm1hcChhLHF0KSx1PTA7bz51O3UrKylpPWFbdV0sa3QudGVzdChpLnR5cGV8fCIiKSYmIXguX2RhdGEoaSwiZ2xvYmFsRXZhbCIpJiZ4LmNvbnRhaW5zKHMsaSkmJihpLnNyYz94Ll9ldmFsVXJsKGkuc3JjKTp4Lmdsb2JhbEV2YWwoKGkudGV4dHx8aS50ZXh0Q29udGVudHx8aS5pbm5lckhUTUx8fCIiKS5yZXBsYWNlKFN0LCIiKSkpO2w9cj1udWxsfXJldHVybiB0aGlzfX0pO2Z1bmN0aW9uIEx0KGUsdCl7cmV0dXJuIHgubm9kZU5hbWUoZSwidGFibGUiKSYmeC5ub2RlTmFtZSgxPT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCwidHIiKT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxlLmFwcGVuZENoaWxkKGUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTplfWZ1bmN0aW9uIEh0KGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT14LmZpbmQuYXR0cihlLCJ0eXBlIikpKyIvIitlLnR5cGUsZX1mdW5jdGlvbiBxdChlKXt2YXIgdD1FdC5leGVjKGUudHlwZSk7cmV0dXJuIHQ/ZS50eXBlPXRbMV06ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIF90KGUsdCl7dmFyIG4scj0wO2Zvcig7bnVsbCE9KG49ZVtyXSk7cisrKXguX2RhdGEobiwiZ2xvYmFsRXZhbCIsIXR8fHguX2RhdGEodFtyXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBNdChlLHQpe2lmKDE9PT10Lm5vZGVUeXBlJiZ4Lmhhc0RhdGEoZSkpe3ZhciBuLHIsaSxvPXguX2RhdGEoZSksYT14Ll9kYXRhKHQsbykscz1vLmV2ZW50cztpZihzKXtkZWxldGUgYS5oYW5kbGUsYS5ldmVudHM9e307Zm9yKG4gaW4gcylmb3Iocj0wLGk9c1tuXS5sZW5ndGg7aT5yO3IrKyl4LmV2ZW50LmFkZCh0LG4sc1tuXVtyXSl9YS5kYXRhJiYoYS5kYXRhPXguZXh0ZW5kKHt9LGEuZGF0YSkpfX1mdW5jdGlvbiBPdChlLHQpe3ZhciBuLHIsaTtpZigxPT09dC5ub2RlVHlwZSl7aWYobj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIXguc3VwcG9ydC5ub0Nsb25lRXZlbnQmJnRbeC5leHBhbmRvXSl7aT14Ll9kYXRhKHQpO2ZvcihyIGluIGkuZXZlbnRzKXgucmVtb3ZlRXZlbnQodCxyLGkuaGFuZGxlKTt0LnJlbW92ZUF0dHJpYnV0ZSh4LmV4cGFuZG8pfSJzY3JpcHQiPT09biYmdC50ZXh0IT09ZS50ZXh0PyhIdCh0KS50ZXh0PWUudGV4dCxxdCh0KSk6Im9iamVjdCI9PT1uPyh0LnBhcmVudE5vZGUmJih0Lm91dGVySFRNTD1lLm91dGVySFRNTCkseC5zdXBwb3J0Lmh0bWw1Q2xvbmUmJmUuaW5uZXJIVE1MJiYheC50cmltKHQuaW5uZXJIVE1MKSYmKHQuaW5uZXJIVE1MPWUuaW5uZXJIVE1MKSk6ImlucHV0Ij09PW4mJkN0LnRlc3QoZS50eXBlKT8odC5kZWZhdWx0Q2hlY2tlZD10LmNoZWNrZWQ9ZS5jaGVja2VkLHQudmFsdWUhPT1lLnZhbHVlJiYodC52YWx1ZT1lLnZhbHVlKSk6Im9wdGlvbiI9PT1uP3QuZGVmYXVsdFNlbGVjdGVkPXQuc2VsZWN0ZWQ9ZS5kZWZhdWx0U2VsZWN0ZWQ6KCJpbnB1dCI9PT1ufHwidGV4dGFyZWEiPT09bikmJih0LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZSl9fXguZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsdCl7eC5mbltlXT1mdW5jdGlvbihlKXt2YXIgbixyPTAsaT1bXSxvPXgoZSksYT1vLmxlbmd0aC0xO2Zvcig7YT49cjtyKyspbj1yPT09YT90aGlzOnRoaXMuY2xvbmUoITApLHgob1tyXSlbdF0obiksaC5hcHBseShpLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhpKX19KTtmdW5jdGlvbiBGdChlLG4pe3ZhciByLG8sYT0wLHM9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1pP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUobnx8IioiKTp0eXBlb2YgZS5xdWVyeVNlbGVjdG9yQWxsIT09aT9lLnF1ZXJ5U2VsZWN0b3JBbGwobnx8IioiKTp0O2lmKCFzKWZvcihzPVtdLHI9ZS5jaGlsZE5vZGVzfHxlO251bGwhPShvPXJbYV0pO2ErKykhbnx8eC5ub2RlTmFtZShvLG4pP3MucHVzaChvKTp4Lm1lcmdlKHMsRnQobyxuKSk7cmV0dXJuIG49PT10fHxuJiZ4Lm5vZGVOYW1lKGUsbik/eC5tZXJnZShbZV0scyk6c31mdW5jdGlvbiBCdChlKXtDdC50ZXN0KGUudHlwZSkmJihlLmRlZmF1bHRDaGVja2VkPWUuY2hlY2tlZCl9eC5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLGw9eC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSk7aWYoeC5zdXBwb3J0Lmh0bWw1Q2xvbmV8fHguaXNYTUxEb2MoZSl8fCFtdC50ZXN0KCI8IitlLm5vZGVOYW1lKyI+Iik/bz1lLmNsb25lTm9kZSghMCk6KER0LmlubmVySFRNTD1lLm91dGVySFRNTCxEdC5yZW1vdmVDaGlsZChvPUR0LmZpcnN0Q2hpbGQpKSwhKHguc3VwcG9ydC5ub0Nsb25lRXZlbnQmJnguc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZXx8eC5pc1hNTERvYyhlKSkpZm9yKHI9RnQobykscz1GdChlKSxhPTA7bnVsbCE9KGk9c1thXSk7KythKXJbYV0mJk90KGksclthXSk7aWYodClpZihuKWZvcihzPXN8fEZ0KGUpLHI9cnx8RnQobyksYT0wO251bGwhPShpPXNbYV0pO2ErKylNdChpLHJbYV0pO2Vsc2UgTXQoZSxvKTtyZXR1cm4gcj1GdChvLCJzY3JpcHQiKSxyLmxlbmd0aD4wJiZfdChyLCFsJiZGdChlLCJzY3JpcHQiKSkscj1zPWk9bnVsbCxvfSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLGwsdSxjLHA9ZS5sZW5ndGgsZj1kdCh0KSxkPVtdLGg9MDtmb3IoO3A+aDtoKyspaWYobz1lW2hdLG98fDA9PT1vKWlmKCJvYmplY3QiPT09eC50eXBlKG8pKXgubWVyZ2UoZCxvLm5vZGVUeXBlP1tvXTpvKTtlbHNlIGlmKHd0LnRlc3Qobykpe3M9c3x8Zi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxsPShidC5leGVjKG8pfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGM9QXRbbF18fEF0Ll9kZWZhdWx0LHMuaW5uZXJIVE1MPWNbMV0rby5yZXBsYWNlKHZ0LCI8JDE+PC8kMj4iKStjWzJdLGk9Y1swXTt3aGlsZShpLS0pcz1zLmxhc3RDaGlsZDtpZigheC5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZ5dC50ZXN0KG8pJiZkLnB1c2godC5jcmVhdGVUZXh0Tm9kZSh5dC5leGVjKG8pWzBdKSksIXguc3VwcG9ydC50Ym9keSl7bz0idGFibGUiIT09bHx8eHQudGVzdChvKT8iPHRhYmxlPiIhPT1jWzFdfHx4dC50ZXN0KG8pPzA6czpzLmZpcnN0Q2hpbGQsaT1vJiZvLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGktLSl4Lm5vZGVOYW1lKHU9by5jaGlsZE5vZGVzW2ldLCJ0Ym9keSIpJiYhdS5jaGlsZE5vZGVzLmxlbmd0aCYmby5yZW1vdmVDaGlsZCh1KX14Lm1lcmdlKGQscy5jaGlsZE5vZGVzKSxzLnRleHRDb250ZW50PSIiO3doaWxlKHMuZmlyc3RDaGlsZClzLnJlbW92ZUNoaWxkKHMuZmlyc3RDaGlsZCk7cz1mLmxhc3RDaGlsZH1lbHNlIGQucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtzJiZmLnJlbW92ZUNoaWxkKHMpLHguc3VwcG9ydC5hcHBlbmRDaGVja2VkfHx4LmdyZXAoRnQoZCwiaW5wdXQiKSxCdCksaD0wO3doaWxlKG89ZFtoKytdKWlmKCghcnx8LTE9PT14LmluQXJyYXkobyxyKSkmJihhPXguY29udGFpbnMoby5vd25lckRvY3VtZW50LG8pLHM9RnQoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksYSYmX3Qocyksbikpe2k9MDt3aGlsZShvPXNbaSsrXSlrdC50ZXN0KG8udHlwZXx8IiIpJiZuLnB1c2gobyl9cmV0dXJuIHM9bnVsbCxmfSxjbGVhbkRhdGE6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLG8sYSxzPTAsbD14LmV4cGFuZG8sdT14LmNhY2hlLGM9eC5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8sZj14LmV2ZW50LnNwZWNpYWw7Zm9yKDtudWxsIT0obj1lW3NdKTtzKyspaWYoKHR8fHguYWNjZXB0RGF0YShuKSkmJihvPW5bbF0sYT1vJiZ1W29dKSl7aWYoYS5ldmVudHMpZm9yKHIgaW4gYS5ldmVudHMpZltyXT94LmV2ZW50LnJlbW92ZShuLHIpOngucmVtb3ZlRXZlbnQobixyLGEuaGFuZGxlKTsKdVtvXSYmKGRlbGV0ZSB1W29dLGM/ZGVsZXRlIG5bbF06dHlwZW9mIG4ucmVtb3ZlQXR0cmlidXRlIT09aT9uLnJlbW92ZUF0dHJpYnV0ZShsKTpuW2xdPW51bGwscC5wdXNoKG8pKX19LF9ldmFsVXJsOmZ1bmN0aW9uKGUpe3JldHVybiB4LmFqYXgoe3VybDplLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSl9fSkseC5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oZSl7aWYoeC5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS53cmFwQWxsKGUuY2FsbCh0aGlzLHQpKX0pO2lmKHRoaXNbMF0pe3ZhciB0PXgoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0Q2hpbGQmJjE9PT1lLmZpcnN0Q2hpbGQubm9kZVR5cGUpZT1lLmZpcnN0Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4geC5pc0Z1bmN0aW9uKGUpP3RoaXMuZWFjaChmdW5jdGlvbih0KXt4KHRoaXMpLndyYXBJbm5lcihlLmNhbGwodGhpcyx0KSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD14KHRoaXMpLG49dC5jb250ZW50cygpO24ubGVuZ3RoP24ud3JhcEFsbChlKTp0LmFwcGVuZChlKX0pfSx3cmFwOmZ1bmN0aW9uKGUpe3ZhciB0PXguaXNGdW5jdGlvbihlKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3godGhpcykud3JhcEFsbCh0P2UuY2FsbCh0aGlzLG4pOmUpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXt4Lm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8eCh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9fSk7dmFyIFB0LFJ0LFd0LCR0PS9hbHBoYVwoW14pXSpcKS9pLEl0PS9vcGFjaXR5XHMqPVxzKihbXildKikvLHp0PS9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLyxYdD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sVXQ9L15tYXJnaW4vLFZ0PVJlZ0V4cCgiXigiK3crIikoLiopJCIsImkiKSxZdD1SZWdFeHAoIl4oIit3KyIpKD8hcHgpW2EteiVdKyQiLCJpIiksSnQ9UmVnRXhwKCJeKFsrLV0pPSgiK3crIikiLCJpIiksR3Q9e0JPRFk6ImJsb2NrIn0sUXQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LEt0PXtsZXR0ZXJTcGFjaW5nOjAsZm9udFdlaWdodDo0MDB9LFp0PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sZW49WyJXZWJraXQiLCJPIiwiTW96IiwibXMiXTtmdW5jdGlvbiB0bihlLHQpe2lmKHQgaW4gZSlyZXR1cm4gdDt2YXIgbj10LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSkscj10LGk9ZW4ubGVuZ3RoO3doaWxlKGktLSlpZih0PWVuW2ldK24sdCBpbiBlKXJldHVybiB0O3JldHVybiByfWZ1bmN0aW9uIG5uKGUsdCl7cmV0dXJuIGU9dHx8ZSwibm9uZSI9PT14LmNzcyhlLCJkaXNwbGF5Iil8fCF4LmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX1mdW5jdGlvbiBybihlLHQpe3ZhciBuLHIsaSxvPVtdLGE9MCxzPWUubGVuZ3RoO2Zvcig7cz5hO2ErKylyPWVbYV0sci5zdHlsZSYmKG9bYV09eC5fZGF0YShyLCJvbGRkaXNwbGF5Iiksbj1yLnN0eWxlLmRpc3BsYXksdD8ob1thXXx8Im5vbmUiIT09bnx8KHIuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1yLnN0eWxlLmRpc3BsYXkmJm5uKHIpJiYob1thXT14Ll9kYXRhKHIsIm9sZGRpc3BsYXkiLGxuKHIubm9kZU5hbWUpKSkpOm9bYV18fChpPW5uKHIpLChuJiYibm9uZSIhPT1ufHwhaSkmJnguX2RhdGEociwib2xkZGlzcGxheSIsaT9uOnguY3NzKHIsImRpc3BsYXkiKSkpKTtmb3IoYT0wO3M+YTthKyspcj1lW2FdLHIuc3R5bGUmJih0JiYibm9uZSIhPT1yLnN0eWxlLmRpc3BsYXkmJiIiIT09ci5zdHlsZS5kaXNwbGF5fHwoci5zdHlsZS5kaXNwbGF5PXQ/b1thXXx8IiI6Im5vbmUiKSk7cmV0dXJuIGV9eC5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLG4pe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvLGE9e30scz0wO2lmKHguaXNBcnJheShuKSl7Zm9yKG89UnQoZSksaT1uLmxlbmd0aDtpPnM7cysrKWFbbltzXV09eC5jc3MoZSxuW3NdLCExLG8pO3JldHVybiBhfXJldHVybiByIT09dD94LnN0eWxlKGUsbixyKTp4LmNzcyhlLG4pfSxlLG4sYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBybih0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBybih0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtubih0aGlzKT94KHRoaXMpLnNob3coKTp4KHRoaXMpLmhpZGUoKX0pfX0pLHguZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49V3QoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOntjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6eC5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihlLG4scixpKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBvLGEscyxsPXguY2FtZWxDYXNlKG4pLHU9ZS5zdHlsZTtpZihuPXguY3NzUHJvcHNbbF18fCh4LmNzc1Byb3BzW2xdPXRuKHUsbCkpLHM9eC5jc3NIb29rc1tuXXx8eC5jc3NIb29rc1tsXSxyPT09dClyZXR1cm4gcyYmImdldCJpbiBzJiYobz1zLmdldChlLCExLGkpKSE9PXQ/bzp1W25dO2lmKGE9dHlwZW9mIHIsInN0cmluZyI9PT1hJiYobz1KdC5leGVjKHIpKSYmKHI9KG9bMV0rMSkqb1syXStwYXJzZUZsb2F0KHguY3NzKGUsbikpLGE9Im51bWJlciIpLCEobnVsbD09cnx8Im51bWJlciI9PT1hJiZpc05hTihyKXx8KCJudW1iZXIiIT09YXx8eC5jc3NOdW1iZXJbbF18fChyKz0icHgiKSx4LnN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PXJ8fDAhPT1uLmluZGV4T2YoImJhY2tncm91bmQiKXx8KHVbbl09ImluaGVyaXQiKSxzJiYic2V0ImluIHMmJihyPXMuc2V0KGUscixpKSk9PT10KSkpdHJ5e3Vbbl09cn1jYXRjaChjKXt9fX0sY3NzOmZ1bmN0aW9uKGUsbixyLGkpe3ZhciBvLGEscyxsPXguY2FtZWxDYXNlKG4pO3JldHVybiBuPXguY3NzUHJvcHNbbF18fCh4LmNzc1Byb3BzW2xdPXRuKGUuc3R5bGUsbCkpLHM9eC5jc3NIb29rc1tuXXx8eC5jc3NIb29rc1tsXSxzJiYiZ2V0ImluIHMmJihhPXMuZ2V0KGUsITAscikpLGE9PT10JiYoYT1XdChlLG4saSkpLCJub3JtYWwiPT09YSYmbiBpbiBLdCYmKGE9S3Rbbl0pLCIiPT09cnx8cj8obz1wYXJzZUZsb2F0KGEpLHI9PT0hMHx8eC5pc051bWVyaWMobyk/b3x8MDphKTphfX0pLGUuZ2V0Q29tcHV0ZWRTdHlsZT8oUnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGUuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpfSxXdD1mdW5jdGlvbihlLG4scil7dmFyIGksbyxhLHM9cnx8UnQoZSksbD1zP3MuZ2V0UHJvcGVydHlWYWx1ZShuKXx8c1tuXTp0LHU9ZS5zdHlsZTtyZXR1cm4gcyYmKCIiIT09bHx8eC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl8fChsPXguc3R5bGUoZSxuKSksWXQudGVzdChsKSYmVXQudGVzdChuKSYmKGk9dS53aWR0aCxvPXUubWluV2lkdGgsYT11Lm1heFdpZHRoLHUubWluV2lkdGg9dS5tYXhXaWR0aD11LndpZHRoPWwsbD1zLndpZHRoLHUud2lkdGg9aSx1Lm1pbldpZHRoPW8sdS5tYXhXaWR0aD1hKSksbH0pOmEuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKFJ0PWZ1bmN0aW9uKGUpe3JldHVybiBlLmN1cnJlbnRTdHlsZX0sV3Q9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8sYSxzPXJ8fFJ0KGUpLGw9cz9zW25dOnQsdT1lLnN0eWxlO3JldHVybiBudWxsPT1sJiZ1JiZ1W25dJiYobD11W25dKSxZdC50ZXN0KGwpJiYhenQudGVzdChuKSYmKGk9dS5sZWZ0LG89ZS5ydW50aW1lU3R5bGUsYT1vJiZvLmxlZnQsYSYmKG8ubGVmdD1lLmN1cnJlbnRTdHlsZS5sZWZ0KSx1LmxlZnQ9ImZvbnRTaXplIj09PW4/IjFlbSI6bCxsPXUucGl4ZWxMZWZ0KyJweCIsdS5sZWZ0PWksYSYmKG8ubGVmdD1hKSksIiI9PT1sPyJhdXRvIjpsfSk7ZnVuY3Rpb24gb24oZSx0LG4pe3ZhciByPVZ0LmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzFdLShufHwwKSkrKHJbMl18fCJweCIpOnR9ZnVuY3Rpb24gYW4oZSx0LG4scixpKXt2YXIgbz1uPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT10PzE6MCxhPTA7Zm9yKDs0Pm87bys9MikibWFyZ2luIj09PW4mJihhKz14LmNzcyhlLG4rWnRbb10sITAsaSkpLHI/KCJjb250ZW50Ij09PW4mJihhLT14LmNzcyhlLCJwYWRkaW5nIitadFtvXSwhMCxpKSksIm1hcmdpbiIhPT1uJiYoYS09eC5jc3MoZSwiYm9yZGVyIitadFtvXSsiV2lkdGgiLCEwLGkpKSk6KGErPXguY3NzKGUsInBhZGRpbmciK1p0W29dLCEwLGkpLCJwYWRkaW5nIiE9PW4mJihhKz14LmNzcyhlLCJib3JkZXIiK1p0W29dKyJXaWR0aCIsITAsaSkpKTtyZXR1cm4gYX1mdW5jdGlvbiBzbihlLHQsbil7dmFyIHI9ITAsaT0id2lkdGgiPT09dD9lLm9mZnNldFdpZHRoOmUub2Zmc2V0SGVpZ2h0LG89UnQoZSksYT14LnN1cHBvcnQuYm94U2l6aW5nJiYiYm9yZGVyLWJveCI9PT14LmNzcyhlLCJib3hTaXppbmciLCExLG8pO2lmKDA+PWl8fG51bGw9PWkpe2lmKGk9V3QoZSx0LG8pLCgwPml8fG51bGw9PWkpJiYoaT1lLnN0eWxlW3RdKSxZdC50ZXN0KGkpKXJldHVybiBpO3I9YSYmKHguc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZXx8aT09PWUuc3R5bGVbdF0pLGk9cGFyc2VGbG9hdChpKXx8MH1yZXR1cm4gaSthbihlLHQsbnx8KGE/ImJvcmRlciI6ImNvbnRlbnQiKSxyLG8pKyJweCJ9ZnVuY3Rpb24gbG4oZSl7dmFyIHQ9YSxuPUd0W2VdO3JldHVybiBufHwobj11bihlLHQpLCJub25lIiE9PW4mJm58fChQdD0oUHR8fHgoIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKS5jc3MoImNzc1RleHQiLCJkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQiKSkuYXBwZW5kVG8odC5kb2N1bWVudEVsZW1lbnQpLHQ9KFB0WzBdLmNvbnRlbnRXaW5kb3d8fFB0WzBdLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsdC53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+IiksdC5jbG9zZSgpLG49dW4oZSx0KSxQdC5kZXRhY2goKSksR3RbZV09biksbn1mdW5jdGlvbiB1bihlLHQpe3ZhciBuPXgodC5jcmVhdGVFbGVtZW50KGUpKS5hcHBlbmRUbyh0LmJvZHkpLHI9eC5jc3MoblswXSwiZGlzcGxheSIpO3JldHVybiBuLnJlbW92ZSgpLHJ9eC5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLG4pe3guY3NzSG9va3Nbbl09e2dldDpmdW5jdGlvbihlLHIsaSl7cmV0dXJuIHI/MD09PWUub2Zmc2V0V2lkdGgmJlh0LnRlc3QoeC5jc3MoZSwiZGlzcGxheSIpKT94LnN3YXAoZSxRdCxmdW5jdGlvbigpe3JldHVybiBzbihlLG4saSl9KTpzbihlLG4saSk6dH0sc2V0OmZ1bmN0aW9uKGUsdCxyKXt2YXIgaT1yJiZSdChlKTtyZXR1cm4gb24oZSx0LHI/YW4oZSxuLHIseC5zdXBwb3J0LmJveFNpemluZyYmImJvcmRlci1ib3giPT09eC5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxpKTowKX19fSkseC5zdXBwb3J0Lm9wYWNpdHl8fCh4LmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihlLHQpe3JldHVybiBJdC50ZXN0KCh0JiZlLmN1cnJlbnRTdHlsZT9lLmN1cnJlbnRTdHlsZS5maWx0ZXI6ZS5zdHlsZS5maWx0ZXIpfHwiIik/LjAxKnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsiIjp0PyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zdHlsZSxyPWUuY3VycmVudFN0eWxlLGk9eC5pc051bWVyaWModCk/ImFscGhhKG9wYWNpdHk9IisxMDAqdCsiKSI6IiIsbz1yJiZyLmZpbHRlcnx8bi5maWx0ZXJ8fCIiO24uem9vbT0xLCh0Pj0xfHwiIj09PXQpJiYiIj09PXgudHJpbShvLnJlcGxhY2UoJHQsIiIpKSYmbi5yZW1vdmVBdHRyaWJ1dGUmJihuLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIiksIiI9PT10fHxyJiYhci5maWx0ZXIpfHwobi5maWx0ZXI9JHQudGVzdChvKT9vLnJlcGxhY2UoJHQsaSk6bysiICIraSl9fSkseChmdW5jdGlvbigpe3guc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0fHwoeC5jc3NIb29rcy5tYXJnaW5SaWdodD17Z2V0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIG4/eC5zd2FwKGUse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LFd0LFtlLCJtYXJnaW5SaWdodCJdKTp0fX0pLCF4LnN1cHBvcnQucGl4ZWxQb3NpdGlvbiYmeC5mbi5wb3NpdGlvbiYmeC5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGUsbil7eC5jc3NIb29rc1tuXT17Z2V0OmZ1bmN0aW9uKGUscil7cmV0dXJuIHI/KHI9V3QoZSxuKSxZdC50ZXN0KHIpP3goZSkucG9zaXRpb24oKVtuXSsicHgiOnIpOnR9fX0pfSkseC5leHByJiZ4LmV4cHIuZmlsdGVycyYmKHguZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4gMD49ZS5vZmZzZXRXaWR0aCYmMD49ZS5vZmZzZXRIZWlnaHR8fCF4LnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYibm9uZSI9PT0oZS5zdHlsZSYmZS5zdHlsZS5kaXNwbGF5fHx4LmNzcyhlLCJkaXNwbGF5IikpfSx4LmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiF4LmV4cHIuZmlsdGVycy5oaWRkZW4oZSl9KSx4LmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihlLHQpe3guY3NzSG9va3NbZSt0XT17ZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciByPTAsaT17fSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO2Zvcig7ND5yO3IrKylpW2UrWnRbcl0rdF09b1tyXXx8b1tyLTJdfHxvWzBdO3JldHVybiBpfX0sVXQudGVzdChlKXx8KHguY3NzSG9va3NbZSt0XS5zZXQ9b24pfSk7dmFyIGNuPS8lMjAvZyxwbj0vXFtcXSQvLGZuPS9ccj9cbi9nLGRuPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxobj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7eC5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiB4LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9eC5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGU/eC5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYheCh0aGlzKS5pcygiOmRpc2FibGVkIikmJmhuLnRlc3QodGhpcy5ub2RlTmFtZSkmJiFkbi50ZXN0KGUpJiYodGhpcy5jaGVja2VkfHwhQ3QudGVzdChlKSl9KS5tYXAoZnVuY3Rpb24oZSx0KXt2YXIgbj14KHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6eC5pc0FycmF5KG4pP3gubWFwKG4sZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShmbiwiXHJcbiIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2UoZm4sIlxyXG4iKX19KS5nZXQoKX19KSx4LnBhcmFtPWZ1bmN0aW9uKGUsbil7dmFyIHIsaT1bXSxvPWZ1bmN0aW9uKGUsdCl7dD14LmlzRnVuY3Rpb24odCk/dCgpOm51bGw9PXQ/IiI6dCxpW2kubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KX07aWYobj09PXQmJihuPXguYWpheFNldHRpbmdzJiZ4LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCkseC5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIXguaXNQbGFpbk9iamVjdChlKSl4LmVhY2goZSxmdW5jdGlvbigpe28odGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IociBpbiBlKWduKHIsZVtyXSxuLG8pO3JldHVybiBpLmpvaW4oIiYiKS5yZXBsYWNlKGNuLCIrIil9O2Z1bmN0aW9uIGduKGUsdCxuLHIpe3ZhciBpO2lmKHguaXNBcnJheSh0KSl4LmVhY2godCxmdW5jdGlvbih0LGkpe258fHBuLnRlc3QoZSk/cihlLGkpOmduKGUrIlsiKygib2JqZWN0Ij09dHlwZW9mIGk/dDoiIikrIl0iLGksbixyKX0pO2Vsc2UgaWYobnx8Im9iamVjdCIhPT14LnR5cGUodCkpcihlLHQpO2Vsc2UgZm9yKGkgaW4gdClnbihlKyJbIitpKyJdIix0W2ldLG4scil9eC5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7eC5mblt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbih0LG51bGwsZSxuKTp0aGlzLnRyaWdnZXIodCl9fSkseC5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfSxiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLCIqKiIpOnRoaXMub2ZmKHQsZXx8IioqIixuKX19KTt2YXIgbW4seW4sdm49eC5ub3coKSxibj0vXD8vLHhuPS8jLiokLyx3bj0vKFs/Jl0pXz1bXiZdKi8sVG49L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxDbj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxObj0vXig/OkdFVHxIRUFEKSQvLGtuPS9eXC9cLy8sRW49L14oW1x3ListXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLFNuPXguZm4ubG9hZCxBbj17fSxqbj17fSxEbj0iKi8iLmNvbmNhdCgiKiIpO3RyeXt5bj1vLmhyZWZ9Y2F0Y2goTG4pe3luPWEuY3JlYXRlRWxlbWVudCgiYSIpLHluLmhyZWY9IiIseW49eW4uaHJlZn1tbj1Fbi5leGVjKHluLnRvTG93ZXJDYXNlKCkpfHxbXTtmdW5jdGlvbiBIbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iKiIpO3ZhciByLGk9MCxvPXQudG9Mb3dlckNhc2UoKS5tYXRjaChUKXx8W107aWYoeC5pc0Z1bmN0aW9uKG4pKXdoaWxlKHI9b1tpKytdKSIrIj09PXJbMF0/KHI9ci5zbGljZSgxKXx8IioiLChlW3JdPWVbcl18fFtdKS51bnNoaWZ0KG4pKTooZVtyXT1lW3JdfHxbXSkucHVzaChuKX19ZnVuY3Rpb24gcW4oZSxuLHIsaSl7dmFyIG89e30sYT1lPT09am47ZnVuY3Rpb24gcyhsKXt2YXIgdTtyZXR1cm4gb1tsXT0hMCx4LmVhY2goZVtsXXx8W10sZnVuY3Rpb24oZSxsKXt2YXIgYz1sKG4scixpKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGN8fGF8fG9bY10/YT8hKHU9Yyk6dDoobi5kYXRhVHlwZXMudW5zaGlmdChjKSxzKGMpLCExKX0pLHV9cmV0dXJuIHMobi5kYXRhVHlwZXNbMF0pfHwhb1siKiJdJiZzKCIqIil9ZnVuY3Rpb24gX24oZSxuKXt2YXIgcixpLG89eC5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihpIGluIG4pbltpXSE9PXQmJigob1tpXT9lOnJ8fChyPXt9KSlbaV09bltpXSk7cmV0dXJuIHImJnguZXh0ZW5kKCEwLGUsciksZX14LmZuLmxvYWQ9ZnVuY3Rpb24oZSxuLHIpe2lmKCJzdHJpbmciIT10eXBlb2YgZSYmU24pcmV0dXJuIFNuLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgaSxvLGEscz10aGlzLGw9ZS5pbmRleE9mKCIgIik7cmV0dXJuIGw+PTAmJihpPWUuc2xpY2UobCxlLmxlbmd0aCksZT1lLnNsaWNlKDAsbCkpLHguaXNGdW5jdGlvbihuKT8ocj1uLG49dCk6biYmIm9iamVjdCI9PXR5cGVvZiBuJiYoYT0iUE9TVCIpLHMubGVuZ3RoPjAmJnguYWpheCh7dXJsOmUsdHlwZTphLGRhdGFUeXBlOiJodG1sIixkYXRhOm59KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLHMuaHRtbChpP3goIjxkaXY+IikuYXBwZW5kKHgucGFyc2VIVE1MKGUpKS5maW5kKGkpOmUpfSkuY29tcGxldGUociYmZnVuY3Rpb24oZSx0KXtzLmVhY2gocixvfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9KSx0aGlzfSx4LmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihlLHQpe3guZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSx4LmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6eW4sdHlwZToiR0VUIixpc0xvY2FsOkNuLnRlc3QobW5bMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6RG4sdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjp4LnBhcnNlSlNPTiwidGV4dCB4bWwiOngucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P19uKF9uKGUseC5hamF4U2V0dGluZ3MpLHQpOl9uKHguYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkhuKEFuKSxhamF4VHJhbnNwb3J0OkhuKGpuKSxhamF4OmZ1bmN0aW9uKGUsbil7Im9iamVjdCI9PXR5cGVvZiBlJiYobj1lLGU9dCksbj1ufHx7fTt2YXIgcixpLG8sYSxzLGwsdSxjLHA9eC5hamF4U2V0dXAoe30sbiksZj1wLmNvbnRleHR8fHAsZD1wLmNvbnRleHQmJihmLm5vZGVUeXBlfHxmLmpxdWVyeSk/eChmKTp4LmV2ZW50LGg9eC5EZWZlcnJlZCgpLGc9eC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksbT1wLnN0YXR1c0NvZGV8fHt9LHk9e30sdj17fSxiPTAsdz0iY2FuY2VsZWQiLEM9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihlKXt2YXIgdDtpZigyPT09Yil7aWYoIWMpe2M9e307d2hpbGUodD1Ubi5leGVjKGEpKWNbdFsxXS50b0xvd2VyQ2FzZSgpXT10WzJdfXQ9Y1tlLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT10P251bGw6dH0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT1iP2E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihlLHQpe3ZhciBuPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYnx8KGU9dltuXT12W25dfHxlLHlbZV09dCksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gYnx8KHAubWltZVR5cGU9ZSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihlKXt2YXIgdDtpZihlKWlmKDI+Yilmb3IodCBpbiBlKW1bdF09W21bdF0sZVt0XV07ZWxzZSBDLmFsd2F5cyhlW0Muc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHc7cmV0dXJuIHUmJnUuYWJvcnQodCksaygwLHQpLHRoaXN9fTtpZihoLnByb21pc2UoQykuY29tcGxldGU9Zy5hZGQsQy5zdWNjZXNzPUMuZG9uZSxDLmVycm9yPUMuZmFpbCxwLnVybD0oKGV8fHAudXJsfHx5bikrIiIpLnJlcGxhY2UoeG4sIiIpLnJlcGxhY2Uoa24sbW5bMV0rIi8vIikscC50eXBlPW4ubWV0aG9kfHxuLnR5cGV8fHAubWV0aG9kfHxwLnR5cGUscC5kYXRhVHlwZXM9eC50cmltKHAuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChUKXx8WyIiXSxudWxsPT1wLmNyb3NzRG9tYWluJiYocj1Fbi5leGVjKHAudXJsLnRvTG93ZXJDYXNlKCkpLHAuY3Jvc3NEb21haW49ISghcnx8clsxXT09PW1uWzFdJiZyWzJdPT09bW5bMl0mJihyWzNdfHwoImh0dHA6Ij09PXJbMV0/IjgwIjoiNDQzIikpPT09KG1uWzNdfHwoImh0dHA6Ij09PW1uWzFdPyI4MCI6IjQ0MyIpKSkpLHAuZGF0YSYmcC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBwLmRhdGEmJihwLmRhdGE9eC5wYXJhbShwLmRhdGEscC50cmFkaXRpb25hbCkpLHFuKEFuLHAsbixDKSwyPT09YilyZXR1cm4gQztsPXAuZ2xvYmFsLGwmJjA9PT14LmFjdGl2ZSsrJiZ4LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHAudHlwZT1wLnR5cGUudG9VcHBlckNhc2UoKSxwLmhhc0NvbnRlbnQ9IU5uLnRlc3QocC50eXBlKSxvPXAudXJsLHAuaGFzQ29udGVudHx8KHAuZGF0YSYmKG89cC51cmwrPShibi50ZXN0KG8pPyImIjoiPyIpK3AuZGF0YSxkZWxldGUgcC5kYXRhKSxwLmNhY2hlPT09ITEmJihwLnVybD13bi50ZXN0KG8pP28ucmVwbGFjZSh3biwiJDFfPSIrdm4rKyk6bysoYm4udGVzdChvKT8iJiI6Ij8iKSsiXz0iK3ZuKyspKSxwLmlmTW9kaWZpZWQmJih4Lmxhc3RNb2RpZmllZFtvXSYmQy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIseC5sYXN0TW9kaWZpZWRbb10pLHguZXRhZ1tvXSYmQy5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIix4LmV0YWdbb10pKSwocC5kYXRhJiZwLmhhc0NvbnRlbnQmJnAuY29udGVudFR5cGUhPT0hMXx8bi5jb250ZW50VHlwZSkmJkMuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixwLmNvbnRlbnRUeXBlKSxDLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIscC5kYXRhVHlwZXNbMF0mJnAuYWNjZXB0c1twLmRhdGFUeXBlc1swXV0/cC5hY2NlcHRzW3AuZGF0YVR5cGVzWzBdXSsoIioiIT09cC5kYXRhVHlwZXNbMF0/IiwgIitEbisiOyBxPTAuMDEiOiIiKTpwLmFjY2VwdHNbIioiXSk7Zm9yKGkgaW4gcC5oZWFkZXJzKUMuc2V0UmVxdWVzdEhlYWRlcihpLHAuaGVhZGVyc1tpXSk7aWYocC5iZWZvcmVTZW5kJiYocC5iZWZvcmVTZW5kLmNhbGwoZixDLHApPT09ITF8fDI9PT1iKSlyZXR1cm4gQy5hYm9ydCgpO3c9ImFib3J0Ijtmb3IoaSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSlDW2ldKHBbaV0pO2lmKHU9cW4oam4scCxuLEMpKXtDLnJlYWR5U3RhdGU9MSxsJiZkLnRyaWdnZXIoImFqYXhTZW5kIixbQyxwXSkscC5hc3luYyYmcC50aW1lb3V0PjAmJihzPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtDLmFib3J0KCJ0aW1lb3V0Iil9LHAudGltZW91dCkpO3RyeXtiPTEsdS5zZW5kKHksayl9Y2F0Y2goTil7aWYoISgyPmIpKXRocm93IE47aygtMSxOKX19ZWxzZSBrKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBrKGUsbixyLGkpe3ZhciBjLHksdix3LFQsTj1uOzIhPT1iJiYoYj0yLHMmJmNsZWFyVGltZW91dChzKSx1PXQsYT1pfHwiIixDLnJlYWR5U3RhdGU9ZT4wPzQ6MCxjPWU+PTIwMCYmMzAwPmV8fDMwND09PWUsciYmKHc9TW4ocCxDLHIpKSx3PU9uKHAsdyxDLGMpLGM/KHAuaWZNb2RpZmllZCYmKFQ9Qy5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLFQmJih4Lmxhc3RNb2RpZmllZFtvXT1UKSxUPUMuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSxUJiYoeC5ldGFnW29dPVQpKSwyMDQ9PT1lfHwiSEVBRCI9PT1wLnR5cGU/Tj0ibm9jb250ZW50IjozMDQ9PT1lP049Im5vdG1vZGlmaWVkIjooTj13LnN0YXRlLHk9dy5kYXRhLHY9dy5lcnJvcixjPSF2KSk6KHY9TiwoZXx8IU4pJiYoTj0iZXJyb3IiLDA+ZSYmKGU9MCkpKSxDLnN0YXR1cz1lLEMuc3RhdHVzVGV4dD0obnx8TikrIiIsYz9oLnJlc29sdmVXaXRoKGYsW3ksTixDXSk6aC5yZWplY3RXaXRoKGYsW0MsTix2XSksQy5zdGF0dXNDb2RlKG0pLG09dCxsJiZkLnRyaWdnZXIoYz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtDLHAsYz95OnZdKSxnLmZpcmVXaXRoKGYsW0MsTl0pLGwmJihkLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW0MscF0pLC0teC5hY3RpdmV8fHguZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiBDfSxnZXRKU09OOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4geC5nZXQoZSx0LG4sImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIHguZ2V0KGUsdCxuLCJzY3JpcHQiKX19KSx4LmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxuKXt4W25dPWZ1bmN0aW9uKGUscixpLG8pe3JldHVybiB4LmlzRnVuY3Rpb24ocikmJihvPW98fGksaT1yLHI9dCkseC5hamF4KHt1cmw6ZSx0eXBlOm4sZGF0YVR5cGU6byxkYXRhOnIsc3VjY2VzczppfSl9fSk7ZnVuY3Rpb24gTW4oZSxuLHIpe3ZhciBpLG8sYSxzLGw9ZS5jb250ZW50cyx1PWUuZGF0YVR5cGVzO3doaWxlKCIqIj09PXVbMF0pdS5zaGlmdCgpLG89PT10JiYobz1lLm1pbWVUeXBlfHxuLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYobylmb3IocyBpbiBsKWlmKGxbc10mJmxbc10udGVzdChvKSl7dS51bnNoaWZ0KHMpO2JyZWFrfWlmKHVbMF1pbiByKWE9dVswXTtlbHNle2ZvcihzIGluIHIpe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbcysiICIrdVswXV0pe2E9czticmVha31pfHwoaT1zKX1hPWF8fGl9cmV0dXJuIGE/KGEhPT11WzBdJiZ1LnVuc2hpZnQoYSksclthXSk6dH1mdW5jdGlvbiBPbihlLHQsbixyKXt2YXIgaSxvLGEscyxsLHU9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKXVbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhbCYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksbD1vLG89Yy5zaGlmdCgpKWlmKCIqIj09PW8pbz1sO2Vsc2UgaWYoIioiIT09bCYmbCE9PW8pe2lmKGE9dVtsKyIgIitvXXx8dVsiKiAiK29dLCFhKWZvcihpIGluIHUpaWYocz1pLnNwbGl0KCIgIiksc1sxXT09PW8mJihhPXVbbCsiICIrc1swXV18fHVbIiogIitzWzBdXSkpe2E9PT0hMD9hPXVbaV06dVtpXSE9PSEwJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoYSE9PSEwKWlmKGEmJmVbInRocm93cyJdKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2gocCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9wOiJObyBjb252ZXJzaW9uIGZyb20gIitsKyIgdG8gIitvfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fXguYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovKD86amF2YXxlY21hKXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZ2xvYmFsRXZhbChlKSxlfX19KSx4LmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7ZS5jYWNoZT09PXQmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiLGUuZ2xvYmFsPSExKX0pLHguYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihlKXtpZihlLmNyb3NzRG9tYWluKXt2YXIgbixyPWEuaGVhZHx8eCgiaGVhZCIpWzBdfHxhLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbih0LGkpe249YS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxuLmFzeW5jPSEwLGUuc2NyaXB0Q2hhcnNldCYmKG4uY2hhcnNldD1lLnNjcmlwdENoYXJzZXQpLG4uc3JjPWUudXJsLG4ub25sb2FkPW4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGUsdCl7KHR8fCFuLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3Qobi5yZWFkeVN0YXRlKSkmJihuLm9ubG9hZD1uLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLG4ucGFyZW50Tm9kZSYmbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pLG49bnVsbCx0fHxpKDIwMCwic3VjY2VzcyIpKX0sci5pbnNlcnRCZWZvcmUobixyLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe24mJm4ub25sb2FkKHQsITApfX19fSk7dmFyIEZuPVtdLEJuPS8oPSlcPyg/PSZ8JCl8XD9cPy87eC5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPUZuLnBvcCgpfHx4LmV4cGFuZG8rIl8iK3ZuKys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSx4LmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKG4scixpKXt2YXIgbyxhLHMsbD1uLmpzb25wIT09ITEmJihCbi50ZXN0KG4udXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIG4uZGF0YSYmIShuLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJkJuLnRlc3Qobi5kYXRhKSYmImRhdGEiKTtyZXR1cm4gbHx8Impzb25wIj09PW4uZGF0YVR5cGVzWzBdPyhvPW4uanNvbnBDYWxsYmFjaz14LmlzRnVuY3Rpb24obi5qc29ucENhbGxiYWNrKT9uLmpzb25wQ2FsbGJhY2soKTpuLmpzb25wQ2FsbGJhY2ssbD9uW2xdPW5bbF0ucmVwbGFjZShCbiwiJDEiK28pOm4uanNvbnAhPT0hMSYmKG4udXJsKz0oYm4udGVzdChuLnVybCk/IiYiOiI/Iikrbi5qc29ucCsiPSIrbyksbi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIHN8fHguZXJyb3IobysiIHdhcyBub3QgY2FsbGVkIiksc1swXX0sbi5kYXRhVHlwZXNbMF09Impzb24iLGE9ZVtvXSxlW29dPWZ1bmN0aW9uKCl7cz1hcmd1bWVudHN9LGkuYWx3YXlzKGZ1bmN0aW9uKCl7ZVtvXT1hLG5bb10mJihuLmpzb25wQ2FsbGJhY2s9ci5qc29ucENhbGxiYWNrLEZuLnB1c2gobykpLHMmJnguaXNGdW5jdGlvbihhKSYmYShzWzBdKSxzPWE9dH0pLCJzY3JpcHQiKTp0fSk7dmFyIFBuLFJuLFduPTAsJG49ZS5BY3RpdmVYT2JqZWN0JiZmdW5jdGlvbigpe3ZhciBlO2ZvcihlIGluIFBuKVBuW2VdKHQsITApfTtmdW5jdGlvbiBJbigpe3RyeXtyZXR1cm4gbmV3IGUuWE1MSHR0cFJlcXVlc3R9Y2F0Y2godCl7fX1mdW5jdGlvbiB6bigpe3RyeXtyZXR1cm4gbmV3IGUuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaCh0KXt9fXguYWpheFNldHRpbmdzLnhocj1lLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0xvY2FsJiZJbigpfHx6bigpfTpJbixSbj14LmFqYXhTZXR0aW5ncy54aHIoKSx4LnN1cHBvcnQuY29ycz0hIVJuJiYid2l0aENyZWRlbnRpYWxzImluIFJuLFJuPXguc3VwcG9ydC5hamF4PSEhUm4sUm4mJnguYWpheFRyYW5zcG9ydChmdW5jdGlvbihuKXtpZighbi5jcm9zc0RvbWFpbnx8eC5zdXBwb3J0LmNvcnMpe3ZhciByO3JldHVybntzZW5kOmZ1bmN0aW9uKGksbyl7dmFyIGEscyxsPW4ueGhyKCk7aWYobi51c2VybmFtZT9sLm9wZW4obi50eXBlLG4udXJsLG4uYXN5bmMsbi51c2VybmFtZSxuLnBhc3N3b3JkKTpsLm9wZW4obi50eXBlLG4udXJsLG4uYXN5bmMpLG4ueGhyRmllbGRzKWZvcihzIGluIG4ueGhyRmllbGRzKWxbc109bi54aHJGaWVsZHNbc107bi5taW1lVHlwZSYmbC5vdmVycmlkZU1pbWVUeXBlJiZsLm92ZXJyaWRlTWltZVR5cGUobi5taW1lVHlwZSksbi5jcm9zc0RvbWFpbnx8aVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO3RyeXtmb3IocyBpbiBpKWwuc2V0UmVxdWVzdEhlYWRlcihzLGlbc10pfWNhdGNoKHUpe31sLnNlbmQobi5oYXNDb250ZW50JiZuLmRhdGF8fG51bGwpLHI9ZnVuY3Rpb24oZSxpKXt2YXIgcyx1LGMscDt0cnl7aWYociYmKGl8fDQ9PT1sLnJlYWR5U3RhdGUpKWlmKHI9dCxhJiYobC5vbnJlYWR5c3RhdGVjaGFuZ2U9eC5ub29wLCRuJiZkZWxldGUgUG5bYV0pLGkpNCE9PWwucmVhZHlTdGF0ZSYmbC5hYm9ydCgpO2Vsc2V7cD17fSxzPWwuc3RhdHVzLHU9bC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSwic3RyaW5nIj09dHlwZW9mIGwucmVzcG9uc2VUZXh0JiYocC50ZXh0PWwucmVzcG9uc2VUZXh0KTt0cnl7Yz1sLnN0YXR1c1RleHR9Y2F0Y2goZil7Yz0iIn1zfHwhbi5pc0xvY2FsfHxuLmNyb3NzRG9tYWluPzEyMjM9PT1zJiYocz0yMDQpOnM9cC50ZXh0PzIwMDo0MDR9fWNhdGNoKGQpe2l8fG8oLTEsZCl9cCYmbyhzLGMscCx1KX0sbi5hc3luYz80PT09bC5yZWFkeVN0YXRlP3NldFRpbWVvdXQocik6KGE9KytXbiwkbiYmKFBufHwoUG49e30seChlKS51bmxvYWQoJG4pKSxQblthXT1yKSxsLm9ucmVhZHlzdGF0ZWNoYW5nZT1yKTpyKCl9LGFib3J0OmZ1bmN0aW9uKCl7ciYmcih0LCEwKX19fX0pO3ZhciBYbixVbixWbj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sWW49UmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrdysiKShbYS16JV0qKSQiLCJpIiksSm49L3F1ZXVlSG9va3MkLyxHbj1bbnJdLFFuPXsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpLHI9bi5jdXIoKSxpPVluLmV4ZWModCksbz1pJiZpWzNdfHwoeC5jc3NOdW1iZXJbZV0/IiI6InB4IiksYT0oeC5jc3NOdW1iZXJbZV18fCJweCIhPT1vJiYrcikmJlluLmV4ZWMoeC5jc3Mobi5lbGVtLGUpKSxzPTEsbD0yMDtpZihhJiZhWzNdIT09byl7bz1vfHxhWzNdLGk9aXx8W10sYT0rcnx8MTtkbyBzPXN8fCIuNSIsYS89cyx4LnN0eWxlKG4uZWxlbSxlLGErbyk7d2hpbGUocyE9PShzPW4uY3VyKCkvcikmJjEhPT1zJiYtLWwpfXJldHVybiBpJiYoYT1uLnN0YXJ0PSthfHwrcnx8MCxuLnVuaXQ9byxuLmVuZD1pWzFdP2ErKGlbMV0rMSkqaVsyXToraVsyXSksbn1dfTtmdW5jdGlvbiBLbigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7WG49dH0pLFhuPXgubm93KCl9ZnVuY3Rpb24gWm4oZSx0LG4pe3ZhciByLGk9KFFuW3RdfHxbXSkuY29uY2F0KFFuWyIqIl0pLG89MCxhPWkubGVuZ3RoO2Zvcig7YT5vO28rKylpZihyPWlbb10uY2FsbChuLHQsZSkpcmV0dXJuIHJ9ZnVuY3Rpb24gZXIoZSx0LG4pe3ZhciByLGksbz0wLGE9R24ubGVuZ3RoLHM9eC5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBsLmVsZW19KSxsPWZ1bmN0aW9uKCl7aWYoaSlyZXR1cm4hMTt2YXIgdD1Ybnx8S24oKSxuPU1hdGgubWF4KDAsdS5zdGFydFRpbWUrdS5kdXJhdGlvbi10KSxyPW4vdS5kdXJhdGlvbnx8MCxvPTEtcixhPTAsbD11LnR3ZWVucy5sZW5ndGg7Zm9yKDtsPmE7YSsrKXUudHdlZW5zW2FdLnJ1bihvKTtyZXR1cm4gcy5ub3RpZnlXaXRoKGUsW3UsbyxuXSksMT5vJiZsP246KHMucmVzb2x2ZVdpdGgoZSxbdV0pLCExKX0sdT1zLnByb21pc2Uoe2VsZW06ZSxwcm9wczp4LmV4dGVuZCh7fSx0KSxvcHRzOnguZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6dCxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6WG58fEtuKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgcj14LlR3ZWVuKGUsdS5vcHRzLHQsbix1Lm9wdHMuc3BlY2lhbEVhc2luZ1t0XXx8dS5vcHRzLmVhc2luZyk7cmV0dXJuIHUudHdlZW5zLnB1c2gocikscn0sc3RvcDpmdW5jdGlvbih0KXt2YXIgbj0wLHI9dD91LnR3ZWVucy5sZW5ndGg6MDtpZihpKXJldHVybiB0aGlzO2ZvcihpPSEwO3I+bjtuKyspdS50d2VlbnNbbl0ucnVuKDEpO3JldHVybiB0P3MucmVzb2x2ZVdpdGgoZSxbdSx0XSk6cy5yZWplY3RXaXRoKGUsW3UsdF0pLHRoaXN9fSksYz11LnByb3BzO2Zvcih0cihjLHUub3B0cy5zcGVjaWFsRWFzaW5nKTthPm87bysrKWlmKHI9R25bb10uY2FsbCh1LGUsYyx1Lm9wdHMpKXJldHVybiByO3JldHVybiB4Lm1hcChjLFpuLHUpLHguaXNGdW5jdGlvbih1Lm9wdHMuc3RhcnQpJiZ1Lm9wdHMuc3RhcnQuY2FsbChlLHUpLHguZngudGltZXIoeC5leHRlbmQobCx7ZWxlbTplLGFuaW06dSxxdWV1ZTp1Lm9wdHMucXVldWV9KSksdS5wcm9ncmVzcyh1Lm9wdHMucHJvZ3Jlc3MpLmRvbmUodS5vcHRzLmRvbmUsdS5vcHRzLmNvbXBsZXRlKS5mYWlsKHUub3B0cy5mYWlsKS5hbHdheXModS5vcHRzLmFsd2F5cyl9ZnVuY3Rpb24gdHIoZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYocj14LmNhbWVsQ2FzZShuKSxpPXRbcl0sbz1lW25dLHguaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLGE9eC5jc3NIb29rc1tyXSxhJiYiZXhwYW5kImluIGEpe289YS5leHBhbmQobyksZGVsZXRlIGVbcl07Zm9yKG4gaW4gbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKX1lbHNlIHRbcl09aX14LkFuaW1hdGlvbj14LmV4dGVuZChlcix7dHdlZW5lcjpmdW5jdGlvbihlLHQpe3guaXNGdW5jdGlvbihlKT8odD1lLGU9WyIqIl0pOmU9ZS5zcGxpdCgiICIpO3ZhciBuLHI9MCxpPWUubGVuZ3RoO2Zvcig7aT5yO3IrKyluPWVbcl0sUW5bbl09UW5bbl18fFtdLFFuW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcjpmdW5jdGlvbihlLHQpe3Q/R24udW5zaGlmdChlKTpHbi5wdXNoKGUpfX0pO2Z1bmN0aW9uIG5yKGUsdCxuKXt2YXIgcixpLG8sYSxzLGwsdT10aGlzLGM9e30scD1lLnN0eWxlLGY9ZS5ub2RlVHlwZSYmbm4oZSksZD14Ll9kYXRhKGUsImZ4c2hvdyIpO24ucXVldWV8fChzPXguX3F1ZXVlSG9va3MoZSwiZngiKSxudWxsPT1zLnVucXVldWVkJiYocy51bnF1ZXVlZD0wLGw9cy5lbXB0eS5maXJlLHMuZW1wdHkuZmlyZT1mdW5jdGlvbigpe3MudW5xdWV1ZWR8fGwoKX0pLHMudW5xdWV1ZWQrKyx1LmFsd2F5cyhmdW5jdGlvbigpe3UuYWx3YXlzKGZ1bmN0aW9uKCl7cy51bnF1ZXVlZC0tLHgucXVldWUoZSwiZngiKS5sZW5ndGh8fHMuZW1wdHkuZmlyZSgpfSl9KSksMT09PWUubm9kZVR5cGUmJigiaGVpZ2h0ImluIHR8fCJ3aWR0aCJpbiB0KSYmKG4ub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLCJpbmxpbmUiPT09eC5jc3MoZSwiZGlzcGxheSIpJiYibm9uZSI9PT14LmNzcyhlLCJmbG9hdCIpJiYoeC5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09bG4oZS5ub2RlTmFtZSk/cC56b29tPTE6cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIseC5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3N8fHUuYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKTtmb3IociBpbiB0KWlmKGk9dFtyXSxWbi5leGVjKGkpKXtpZihkZWxldGUgdFtyXSxvPW98fCJ0b2dnbGUiPT09aSxpPT09KGY/ImhpZGUiOiJzaG93IikpY29udGludWU7Y1tyXT1kJiZkW3JdfHx4LnN0eWxlKGUscil9aWYoIXguaXNFbXB0eU9iamVjdChjKSl7ZD8iaGlkZGVuImluIGQmJihmPWQuaGlkZGVuKTpkPXguX2RhdGEoZSwiZnhzaG93Iix7fSksbyYmKGQuaGlkZGVuPSFmKSxmP3goZSkuc2hvdygpOnUuZG9uZShmdW5jdGlvbigpe3goZSkuaGlkZSgpfSksdS5kb25lKGZ1bmN0aW9uKCl7dmFyIHQ7eC5fcmVtb3ZlRGF0YShlLCJmeHNob3ciKTtmb3IodCBpbiBjKXguc3R5bGUoZSx0LGNbdF0pfSk7Zm9yKHIgaW4gYylhPVpuKGY/ZFtyXTowLHIsdSksciBpbiBkfHwoZFtyXT1hLnN0YXJ0LGYmJihhLmVuZD1hLnN0YXJ0LGEuc3RhcnQ9IndpZHRoIj09PXJ8fCJoZWlnaHQiPT09cj8xOjApKX19ZnVuY3Rpb24gcnIoZSx0LG4scixpKXtyZXR1cm4gbmV3IHJyLnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9eC5Ud2Vlbj1ycixyci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnJyLGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fCJzd2luZyIsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PW98fCh4LmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9cnIucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOnJyLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPXJyLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLnBvcz10PXRoaXMub3B0aW9ucy5kdXJhdGlvbj94LmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTplLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0K3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOnJyLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LHJyLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1yci5wcm90b3R5cGUscnIucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBudWxsPT1lLmVsZW1bZS5wcm9wXXx8ZS5lbGVtLnN0eWxlJiZudWxsIT1lLmVsZW0uc3R5bGVbZS5wcm9wXT8odD14LmNzcyhlLmVsZW0sZS5wcm9wLCIiKSx0JiYiYXV0byIhPT10P3Q6MCk6ZS5lbGVtW2UucHJvcF19LHNldDpmdW5jdGlvbihlKXt4LmZ4LnN0ZXBbZS5wcm9wXT94LmZ4LnN0ZXBbZS5wcm9wXShlKTplLmVsZW0uc3R5bGUmJihudWxsIT1lLmVsZW0uc3R5bGVbeC5jc3NQcm9wc1tlLnByb3BdXXx8eC5jc3NIb29rc1tlLnByb3BdKT94LnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KTplLmVsZW1bZS5wcm9wXT1lLm5vd319fSxyci5wcm9wSG9va3Muc2Nyb2xsVG9wPXJyLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LHguZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oZSx0KXt2YXIgbj14LmZuW3RdO3guZm5bdF09ZnVuY3Rpb24oZSxyLGkpe3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PXR5cGVvZiBlP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShpcih0LCEwKSxlLHIsaSl9fSkseC5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIobm4pLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXguaXNFbXB0eU9iamVjdChlKSxvPXguc3BlZWQodCxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgdD1lcih0aGlzLHguZXh0ZW5kKHt9LGUpLG8pOyhpfHx4Ll9kYXRhKHRoaXMsImZpbmlzaCIpKSYmdC5zdG9wKCEwKX07cmV0dXJuIGEuZmluaXNoPWEsaXx8by5xdWV1ZT09PSExP3RoaXMuZWFjaChhKTp0aGlzLnF1ZXVlKG8ucXVldWUsYSl9LHN0b3A6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RvcDtkZWxldGUgZS5zdG9wLHQocil9O3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKHI9bixuPWUsZT10KSxuJiZlIT09ITEmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ITAsbj1udWxsIT1lJiZlKyJxdWV1ZUhvb2tzIixvPXgudGltZXJzLGE9eC5fZGF0YSh0aGlzKTtpZihuKWFbbl0mJmFbbl0uc3RvcCYmaShhW25dKTtlbHNlIGZvcihuIGluIGEpYVtuXSYmYVtuXS5zdG9wJiZKbi50ZXN0KG4pJiZpKGFbbl0pO2ZvcihuPW8ubGVuZ3RoO24tLTspb1tuXS5lbGVtIT09dGhpc3x8bnVsbCE9ZSYmb1tuXS5xdWV1ZSE9PWV8fChvW25dLmFuaW0uc3RvcChyKSx0PSExLG8uc3BsaWNlKG4sMSkpOyh0fHwhcikmJnguZGVxdWV1ZSh0aGlzLGUpfSl9LGZpbmlzaDpmdW5jdGlvbihlKXtyZXR1cm4gZSE9PSExJiYoZT1lfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdCxuPXguX2RhdGEodGhpcykscj1uW2UrInF1ZXVlIl0saT1uW2UrInF1ZXVlSG9va3MiXSxvPXgudGltZXJzLGE9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCx4LnF1ZXVlKHRoaXMsZSxbXSksaSYmaS5zdG9wJiZpLnN0b3AuY2FsbCh0aGlzLCEwKSx0PW8ubGVuZ3RoO3QtLTspb1t0XS5lbGVtPT09dGhpcyYmb1t0XS5xdWV1ZT09PWUmJihvW3RdLmFuaW0uc3RvcCghMCksby5zcGxpY2UodCwxKSk7Zm9yKHQ9MDthPnQ7dCsrKXJbdF0mJnJbdF0uZmluaXNoJiZyW3RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pO2Z1bmN0aW9uIGlyKGUsdCl7dmFyIG4scj17aGVpZ2h0OmV9LGk9MDtmb3IodD10PzE6MDs0Pmk7aSs9Mi10KW49WnRbaV0sclsibWFyZ2luIituXT1yWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoci5vcGFjaXR5PXIud2lkdGg9ZSkscn14LmVhY2goe3NsaWRlRG93bjppcigic2hvdyIpLHNsaWRlVXA6aXIoImhpZGUiKSxzbGlkZVRvZ2dsZTppcigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSkseC5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3guZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8eC5pc0Z1bmN0aW9uKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiF4LmlzRnVuY3Rpb24odCkmJnR9O3JldHVybiByLmR1cmF0aW9uPXguZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiByLmR1cmF0aW9uP3IuZHVyYXRpb246ci5kdXJhdGlvbiBpbiB4LmZ4LnNwZWVkcz94LmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTp4LmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ci5xdWV1ZXx8ci5xdWV1ZT09PSEwKSYmKHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7eC5pc0Z1bmN0aW9uKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ4LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0seC5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfX0seC50aW1lcnM9W10seC5meD1yci5wcm90b3R5cGUuaW5pdCx4LmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSxuPXgudGltZXJzLHI9MDtmb3IoWG49eC5ub3coKTtuLmxlbmd0aD5yO3IrKyllPW5bcl0sZSgpfHxuW3JdIT09ZXx8bi5zcGxpY2Uoci0tLDEpO24ubGVuZ3RofHx4LmZ4LnN0b3AoKSxYbj10fSx4LmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe2UoKSYmeC50aW1lcnMucHVzaChlKSYmeC5meC5zdGFydCgpfSx4LmZ4LmludGVydmFsPTEzLHguZnguc3RhcnQ9ZnVuY3Rpb24oKXtVbnx8KFVuPXNldEludGVydmFsKHguZngudGljayx4LmZ4LmludGVydmFsKSl9LHguZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoVW4pLFVuPW51bGx9LHguZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHguZnguc3RlcD17fSx4LmV4cHImJnguZXhwci5maWx0ZXJzJiYoeC5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHguZ3JlcCh4LnRpbWVycyxmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQuZWxlbX0pLmxlbmd0aH0pLHguZm4ub2Zmc2V0PWZ1bmN0aW9uKGUpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGU9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3gub2Zmc2V0LnNldE9mZnNldCh0aGlzLGUsdCl9KTt2YXIgbixyLG89e3RvcDowLGxlZnQ6MH0sYT10aGlzWzBdLHM9YSYmYS5vd25lckRvY3VtZW50O2lmKHMpcmV0dXJuIG49cy5kb2N1bWVudEVsZW1lbnQseC5jb250YWlucyhuLGEpPyh0eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPT1pJiYobz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxyPW9yKHMpLHt0b3A6by50b3ArKHIucGFnZVlPZmZzZXR8fG4uc2Nyb2xsVG9wKS0obi5jbGllbnRUb3B8fDApLGxlZnQ6by5sZWZ0KyhyLnBhZ2VYT2Zmc2V0fHxuLnNjcm9sbExlZnQpLShuLmNsaWVudExlZnR8fDApfSk6b30seC5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHI9eC5jc3MoZSwicG9zaXRpb24iKTsic3RhdGljIj09PXImJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBpPXgoZSksbz1pLm9mZnNldCgpLGE9eC5jc3MoZSwidG9wIikscz14LmNzcyhlLCJsZWZ0IiksbD0oImFic29sdXRlIj09PXJ8fCJmaXhlZCI9PT1yKSYmeC5pbkFycmF5KCJhdXRvIixbYSxzXSk+LTEsdT17fSxjPXt9LHAsZjtsPyhjPWkucG9zaXRpb24oKSxwPWMudG9wLGY9Yy5sZWZ0KToocD1wYXJzZUZsb2F0KGEpfHwwLGY9cGFyc2VGbG9hdChzKXx8MCkseC5pc0Z1bmN0aW9uKHQpJiYodD10LmNhbGwoZSxuLG8pKSxudWxsIT10LnRvcCYmKHUudG9wPXQudG9wLW8udG9wK3ApLG51bGwhPXQubGVmdCYmKHUubGVmdD10LmxlZnQtby5sZWZ0K2YpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLHUpOmkuY3NzKHUpfX0seC5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuPXt0b3A6MCxsZWZ0OjB9LHI9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09eC5jc3MociwicG9zaXRpb24iKT90PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGU9dGhpcy5vZmZzZXRQYXJlbnQoKSx0PXRoaXMub2Zmc2V0KCkseC5ub2RlTmFtZShlWzBdLCJodG1sIil8fChuPWUub2Zmc2V0KCkpLG4udG9wKz14LmNzcyhlWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLG4ubGVmdCs9eC5jc3MoZVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6dC50b3Atbi50b3AteC5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDp0LmxlZnQtbi5sZWZ0LXguY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFBhcmVudHx8czt3aGlsZShlJiYheC5ub2RlTmFtZShlLCJodG1sIikmJiJzdGF0aWMiPT09eC5jc3MoZSwicG9zaXRpb24iKSllPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxzfSl9fSkseC5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGUsbil7dmFyIHI9L1kvLnRlc3Qobik7eC5mbltlXT1mdW5jdGlvbihpKXtyZXR1cm4geC5hY2Nlc3ModGhpcyxmdW5jdGlvbihlLGksbyl7dmFyIGE9b3IoZSk7cmV0dXJuIG89PT10P2E/biBpbiBhP2Fbbl06YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbaV06ZVtpXTooYT9hLnNjcm9sbFRvKHI/eChhKS5zY3JvbGxMZWZ0KCk6byxyP286eChhKS5zY3JvbGxUb3AoKSk6ZVtpXT1vLHQpfSxlLGksYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KTtmdW5jdGlvbiBvcihlKXtyZXR1cm4geC5pc1dpbmRvdyhlKT9lOjk9PT1lLm5vZGVUeXBlP2UuZGVmYXVsdFZpZXd8fGUucGFyZW50V2luZG93OiExfXguZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsbil7eC5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50Om4sIiI6Im91dGVyIitlfSxmdW5jdGlvbihyLGkpe3guZm5baV09ZnVuY3Rpb24oaSxvKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYocnx8ImJvb2xlYW4iIT10eXBlb2YgaSkscz1yfHwoaT09PSEwfHxvPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKG4scixpKXt2YXIgbztyZXR1cm4geC5pc1dpbmRvdyhuKT9uLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitlXTo5PT09bi5ub2RlVHlwZT8obz1uLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChuLmJvZHlbInNjcm9sbCIrZV0sb1sic2Nyb2xsIitlXSxuLmJvZHlbIm9mZnNldCIrZV0sb1sib2Zmc2V0IitlXSxvWyJjbGllbnQiK2VdKSk6aT09PXQ/eC5jc3MobixyLHMpOnguc3R5bGUobixyLGkscyl9LG4sYT9pOnQsYSxudWxsKX19KX0pLHguZm4uc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0seC5mbi5hbmRTZWxmPXguZm4uYWRkQmFjaywib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPXg6KGUualF1ZXJ5PWUuJD14LCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB4fSkpfSkod2luZG93KTsKCmZ1bmN0aW9uIHRfb25SZWFkeSh0KXsibG9hZGluZyIhPWRvY3VtZW50LnJlYWR5U3RhdGU/dCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHQpfWZ1bmN0aW9uIHRfYWRkQ2xhc3ModCxlKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdD90LmNsYXNzTGlzdC5hZGQoZSk6dC5jbGFzc05hbWUrPSh0LmNsYXNzTmFtZT8iICI6IiIpK2V9ZnVuY3Rpb24gdF9yZW1vdmVDbGFzcyh0LGUpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0P3QuY2xhc3NMaXN0LnJlbW92ZShlKTp0LmNsYXNzTmFtZT10LmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoIihefFxccyspIitlKyIoXFxzK3wkKSIpLCIgIikucmVwbGFjZSgvXlxzKy8sIiIpLnJlcGxhY2UoL1xzKyQvLCIiKX1mdW5jdGlvbiB0X3JlbW92ZUVsKHQpe3QmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIHRfb3V0ZXJXaWR0aCh0KXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKHQpLG49ZS53aWR0aCxvPWUubWFyZ2luTGVmdCxpPWUubWFyZ2luUmlnaHQ7cmV0dXJuImF1dG8iPT09biYmKG49MCksImF1dG8iPT09byYmKG89MCksImF1dG8iPT09aSYmKGk9MCksbj1wYXJzZUludChuKStwYXJzZUludChvKStwYXJzZUludChpKX12YXIgdmVyc2lvbix2ZXJzaW9uOyh3aW5kb3cuaXNTZWFyY2hCb3Q9ITEsL0JvdC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJih3aW5kb3cuaXNTZWFyY2hCb3Q9ITApLHdpbmRvdy5pc01vYmlsZT0hMSx3aW5kb3cuJGlzTW9iaWxlPSExLC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHdpbmRvdy5pc01vYmlsZT0hMCx3aW5kb3cuJGlzTW9iaWxlPSEwKSx3aW5kb3cuaXNUYWJsZXQ9LyhpcGFkfHRhYmxldHwoYW5kcm9pZCg/IS4qbW9iaWxlKSl8KHdpbmRvd3MoPyEuKnBob25lKSguKnRvdWNoKSl8a2luZGxlfHBsYXlib29rfHNpbGt8KHB1ZmZpbig/IS4qKElQfEFQfFdQKSkpKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LmlzaU9TPSExLC9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHdpbmRvdy5pc2lPUz0hMCksd2luZG93LmlzaU9TQ2hyb21lPSEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiQ3JpT1MiKSx3aW5kb3cuaXNGaXJlZm94PS9maXJlZm94L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx3aW5kb3cuaXNPcGVyYT0hIXdpbmRvdy5vcHImJiEhd2luZG93Lm9wci5hZGRvbnN8fCEhd2luZG93Lm9wZXJhfHxuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIiBPUFIvIik+PTAsd2luZG93LmlzaU9TVmVyc2lvbj0iIix3aW5kb3cuaXNpT1MpJiYobnVsbCE9PSh2ZXJzaW9uPW5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9PUyAoXGQrKV8oXGQrKV8/KFxkKyk/LykpJiYod2luZG93LmlzaU9TVmVyc2lvbj1bcGFyc2VJbnQodmVyc2lvblsxXSwxMCkscGFyc2VJbnQodmVyc2lvblsyXSwxMCkscGFyc2VJbnQodmVyc2lvblszXXx8MCwxMCldKSk7KHdpbmRvdy5pc1NhZmFyaT0hMSwvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYod2luZG93LmlzU2FmYXJpPSEwKSx3aW5kb3cuaXNJRT0hIWRvY3VtZW50LmRvY3VtZW50TW9kZSx3aW5kb3cuaXNTYWZhcmlWZXJzaW9uPSIiLHdpbmRvdy5pc1NhZmFyaSkmJihudWxsIT09KHZlcnNpb249bmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL1ZlcnNpb25cLyhcZCspXC4oXGQrKVwuPyhcZCspPyBTYWZhcmkvKSkmJih3aW5kb3cuaXNTYWZhcmlWZXJzaW9uPVtwYXJzZUludCh2ZXJzaW9uWzFdLDEwKSxwYXJzZUludCh2ZXJzaW9uWzJdLDEwKSxwYXJzZUludCh2ZXJzaW9uWzNdfHwwLDEwKV0pKTtmdW5jdGlvbiB0X3Rocm90dGxlKHQsZSxuKXt2YXIgbyxpO3JldHVybiBlfHwoZT0yNTApLGZ1bmN0aW9uKCl7dmFyIHI9bnx8dGhpcyxhPStuZXcgRGF0ZSxsPWFyZ3VtZW50cztvJiZhPG8rZT8oY2xlYXJUaW1lb3V0KGkpLGk9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvPWEsdC5hcHBseShyLGwpfSksZSkpOihvPWEsdC5hcHBseShyLGwpKX19ZnVuY3Rpb24gdF9vbkZ1bmNMb2FkKHQsZSxuKXt2YXIgbz0xNWUzLGk9dF9jaGVja0lzRWRpdE1vZGUoKSxyPWZ1bmN0aW9uIHQoKXtyZXR1cm4haXx8aSYmdF9jaGVja0VkaXRvcklzUmVhZHkoKX0sYT1mdW5jdGlvbiB0KGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3dbZV18fCJvYmplY3QiPT10eXBlb2Ygd2luZG93W2VdfTtpZihhKHQpJiZyKCkpZSgpO2Vsc2V7dmFyIGw9RGF0ZS5ub3coKSxkPW5ldyBFcnJvcih0KyIgaXMgdW5kZWZpbmVkIikscz1mdW5jdGlvbiB0KCl7dGhyb3cgZH07c2V0VGltZW91dCgoZnVuY3Rpb24gaSgpe3ZhciBkPURhdGUubm93KCk7YSh0KSYmcigpP2UoKTooImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJmQtbD5vJiYhYSh0KSYmcygpLHNldFRpbWVvdXQoaSxufHwxMDApKX0pKX19ZnVuY3Rpb24gdF9jaGVja0lzRWRpdE1vZGUoKXt2YXIgdD0hMSxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYoIWUpcmV0dXJuITE7dmFyIG49ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpO3JldHVybiEhKHQ9biYmImVkaXQiPT09bil9ZnVuY3Rpb24gdF9jaGVja0VkaXRvcklzUmVhZHkoKXt2YXIgdD0hMTtpZighdF9jaGVja0lzRWRpdE1vZGUoKSlyZXR1cm4hMTt2YXIgZT1kb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgiZGF0YS1yZWFkeS1zdGF0dXMiKTtyZXR1cm4hISh0PWUmJiJyZWFkeSI9PT1lKX1mdW5jdGlvbiB0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX3NldE9iamVjdCgpe3dpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yPXt9O3ZhciB0PXdpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yO3QuaXNJbml0ZWQ9ITEsdC5zY3JvbGxCYXJXaWR0aD1NYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aC1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpLHQuZGVsYXk9MCx0LmNhbmNlbFRpbWVvdXQ9bnVsbDt2YXIgZT1bInQ0NTAiLCJ0MjgyX19jb250YWluZXIiLCJ0MjgyX19jb250YWluZXJfX2JnX29wZW5lZCIsInQyODJfX21lbnVfX2NvbnRhaW5lciIsInQ4MzBtIiwidDgzMF9fcGFuZWwiLCJ0NDUxbSIsInQyMDRfX21lbnUiLCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIl0sbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIqIik7bj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xvc2VzdCgiLnQxMDkzIikmJiFlLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucyhlKX0pKX0pKSx0LmZpeGVkRWxlbWVudHM9W10sQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbihlKXtpZighZS5jbGFzc0xpc3QuY29udGFpbnMoInQ5NzUiKSl7dmFyIG49d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSksbz1uLmdldFByb3BlcnR5VmFsdWUoInBvc2l0aW9uIiksaT1uLmdldFByb3BlcnR5VmFsdWUoIndpZHRoIikscj1uLmdldFByb3BlcnR5VmFsdWUoImhlaWdodCIpLGE9IjEwMCUiPT09aXx8aT09PXdpbmRvdy5pbm5lcldpZHRoKyJweCJ8fGk9PT13aW5kb3cuaW5uZXJXaWR0aC10LnNjcm9sbEJhcldpZHRoKyJweCJ8fCIxMDB2dyI9PT1pLGw9IjEwMCUiPT09cnx8cj09PXdpbmRvdy5pbm5lckhlaWdodCsicHgifHxyPT09d2luZG93LmlubmVySGVpZ2h0LXQuc2Nyb2xsQmFyV2lkdGgrInB4Inx8ImF1dG8iPT09cnx8IjEwMHZoIj09PXI7KCJmaXhlZCI9PT1vfHwiYWJzb2x1dGUiPT09byYmYSYmIWwpJiZ0LmZpeGVkRWxlbWVudHMucHVzaCh7ZWw6ZSxjb21wdXRlZFN0eWxlOm59KX19KSl9ZnVuY3Rpb24gdF9zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yX19pbml0KCl7aWYoIXdpbmRvdy5pc01vYmlsZSl7d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3J8fHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fc2V0T2JqZWN0KCk7dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7aWYodC5zY3JvbGxCYXJXaWR0aD1NYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aC1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpLHQuY2FuY2VsVGltZW91dCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodC5jYW5jZWxUaW1lb3V0KSx0LmNhbmNlbFRpbWVvdXQ9bnVsbCksIXQuaXNJbml0ZWQmJnQuc2Nyb2xsQmFyV2lkdGgpe3QuaXNJbml0ZWQ9ITA7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgicGFkZGluZy1yaWdodCIpO2U9cGFyc2VJbnQoZS5yZXBsYWNlKCJweCIsIiIpLDEwKTt2YXIgbj1kb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodDtuJiZkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXBhZGRpbmctcmlnaHQiLG4pLGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PXQuc2Nyb2xsQmFyV2lkdGgrZSsicHgiLGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0PSIxMDB2aCIsZG9jdW1lbnQuYm9keS5zdHlsZS5taW5IZWlnaHQ9IjEwMHZoIixkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iO3ZhciBvPVtdO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5maXhlZEVsZW1lbnRzLChmdW5jdGlvbihlKXt2YXIgbj1lLmVsO2lmKGRvY3VtZW50LmJvZHkuY29udGFpbnMobikmJiFuLmNsYXNzTGlzdC5jb250YWlucygidDk3NSIpJiYhbi5jbGFzc0xpc3QuY29udGFpbnMoInQ5NzUiKSl7dmFyIGk9ZS5jb21wdXRlZFN0eWxlLHI9aS5nZXRQcm9wZXJ0eVZhbHVlKCJwb3NpdGlvbiIpO2lmKCJmaXhlZCI9PT1yfHwiYWJzb2x1dGUiPT09cil7dmFyIGE9aS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2l0aW9uLWR1cmF0aW9uIik7YS5pbmRleE9mKCJtcyIpKzE/KGE9cGFyc2VJbnQoYS5yZXBsYWNlKCJtcyIsIiIpLDEwKSxvLnB1c2goYSkpOmEuaW5kZXhPZigicyIpKzEmJihhPTFlMypwYXJzZUZsb2F0KGEucmVwbGFjZSgicyIsIiIpKSxvLnB1c2goYSkpO3ZhciBsPWkuZ2V0UHJvcGVydHlWYWx1ZSgicmlnaHQiKTtsPXBhcnNlSW50KGwucmVwbGFjZSgicHgiLCIiKSwxMCk7dmFyIGQ9aS5nZXRQcm9wZXJ0eVZhbHVlKCJ3aWR0aCIpLHM9aS5nZXRQcm9wZXJ0eVZhbHVlKCJoZWlnaHQiKSxjPW4uc3R5bGUucmlnaHQ7YyYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1yaWdodCIsYyk7dmFyIHU9bi5zdHlsZS53aWR0aDt1JiZuLnNldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXdpZHRoIix1KTt2YXIgbT0iMTAwJSI9PT1kfHxkPT09d2luZG93LmlubmVyV2lkdGgrInB4Inx8ZD09PXdpbmRvdy5pbm5lcldpZHRoLXQuc2Nyb2xsQmFyV2lkdGgrInB4Inx8IjEwMHZ3Ij09PWQsaD0iMTAwJSI9PT1zfHxzPT09d2luZG93LmlubmVySGVpZ2h0KyJweCJ8fHM9PT13aW5kb3cuaW5uZXJIZWlnaHQtdC5zY3JvbGxCYXJXaWR0aCsicHgifHwiYXV0byI9PT1zfHwiMTAwdmgiPT09czshbCYmMCE9PWx8fCJhdXRvIj09PW4uc3R5bGUucmlnaHR8fCJhYnNvbHV0ZSI9PT1yfHxtP20mJiFoJiYobi5zdHlsZS53aWR0aD0iY2FsYygxMDB2dyAtICIrdC5zY3JvbGxCYXJXaWR0aCsicHgpIik6bi5zdHlsZS5yaWdodD10LnNjcm9sbEJhcldpZHRoK2wrInB4In19fSkpLG8ubGVuZ3RoJiYodC5kZWxheT1NYXRoLm1heC5hcHBseShudWxsLG8pKX19fWZ1bmN0aW9uIHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2FuY2VsKCl7dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7dCYmdC5pc0luaXRlZCYmKHQuaXNJbml0ZWQ9ITEsdC5kZWxheT0wLGRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcGFkZGluZy1yaWdodCIpPyhkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1kb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXBhZGRpbmctcmlnaHQiKSk6ZG9jdW1lbnQuYm9keS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgicGFkZGluZy1yaWdodCIpLGRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoImhlaWdodCIpLGRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoIm1pbi1oZWlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJvdmVyZmxvdyIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5maXhlZEVsZW1lbnRzLChmdW5jdGlvbih0KXt2YXIgZT10LmVsLG49ZS5jbGFzc0xpc3QuY29udGFpbnMoInRuLWF0b21fX3N0aWNreS13cmFwcGVyIil8fGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik7ZS5oYXNBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1yaWdodCIpPyhlLnN0eWxlLnJpZ2h0PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcmlnaHQiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXJpZ2h0IikpOmUuc3R5bGUucmVtb3ZlUHJvcGVydHkoInJpZ2h0IiksZS5oYXNBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC13aWR0aCIpPyhlLnN0eWxlLndpZHRoPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtd2lkdGgiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXdpZHRoIikpOihlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ3aWR0aCIpLG4mJihlLnN0eWxlLndpZHRoPSJpbmhlcml0IikpfSkpKX1mdW5jdGlvbiB0X3RyaWdnZXJFdmVudCh0LGUpe3ZhciBuO2RvY3VtZW50LmNyZWF0ZUV2ZW50PyhuPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIikpLmluaXRFdmVudChlLCEwLCExKTpkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCYmKChuPWRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCkpLmV2ZW50VHlwZT1lKSxuLmV2ZW50TmFtZT1lLHQuZGlzcGF0Y2hFdmVudD90LmRpc3BhdGNoRXZlbnQobik6dC5maXJlRXZlbnQ/dC5maXJlRXZlbnQoIm9uIituLmV2ZW50VHlwZSxuKTp0W2VdP3RbZV0oKTp0WyJvbiIrZV0mJnRbIm9uIitlXSgpfWZ1bmN0aW9uIHRfZ2V0Um9vdFpvbmUoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGU7cmV0dXJuIHQmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXJvb3Qtem9uZSIpfHwiY29tIn1mdW5jdGlvbiB0X21vZGlmeVJvb3Rab25lKHQpe3JldHVybiB0JiZ0LmluY2x1ZGVzKCJzdGF0aWMudGlsZGFjZG4uY29tIik/dC5yZXBsYWNlKCJzdGF0aWMudGlsZGFjZG4uY29tIiwic3RhdGljLnRpbGRhY2RuLiIrdF9nZXRSb290Wm9uZSgpKTp0fWZ1bmN0aW9uIHRfbG9hZEpzRmlsZSh0LGUsbil7dm9pZCAwPT09biYmKG49MCk7dmFyIG89MyxpPTFlMyxyPXRfbW9kaWZ5Um9vdFpvbmUodCk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyY149IicrcisnIl0nKSllJiZlKCk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnR5cGU9InRleHQvamF2YXNjcmlwdCIsYS5zcmM9cixlJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe2UoKX0pKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZnVuY3Rpb24odCl7aWYoIShuPD0zKSl7dmFyIG89dC5tZXNzYWdlfHwiPG5vIGVycm9yIG1lc3NhZ2U+Ijt0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBsb2FkICIrcisiIHNjcmlwdDogIitvLHtjYXVzZTp0fSl9c2V0VGltZW91dCgoZnVuY3Rpb24oKXthLnJlbW92ZSgpLHRfbG9hZEpzRmlsZShyLGUsbisxKSxjb25zb2xlLndhcm4oIlJldHJ5aW5nIHRvIGxvYWQgIityKyIuIFJldHJ5OiAiKyhuKzEpKX0pLG4qaSl9KSksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhKX19ZnVuY3Rpb24gdF9sb2FkQ1NTRmlsZSh0LGUsbil7dm9pZCAwPT09biYmKG49MCk7dmFyIG89MyxpPTFlMyxyPXRfbW9kaWZ5Um9vdFpvbmUodCk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tocmVmXj0iJytyKyciXScpKWUmJmUoKTtlbHNle3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTthLnJlbD0ic3R5bGVzaGVldCIsYS50eXBlPSJ0ZXh0L2NzcyIsYS5tZWRpYT0iYWxsIixhLmhyZWY9cixhLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLGUmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2lmKCEobjw9Mykpe3ZhciBvPXQubWVzc2FnZXx8IjxubyBlcnJvciBtZXNzYWdlPiI7dGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gbG9hZCAiK3IrIiBzdHlsZTogIitvLHtjYXVzZTp0fSl9c2V0VGltZW91dCgoZnVuY3Rpb24oKXthLnJlbW92ZSgpLHRfbG9hZENTU0ZpbGUocixlLG4rMSksY29uc29sZS53YXJuKCJSZXRyeWluZyB0byBsb2FkICIrcisiLiBSZXRyeTogIisobisxKSl9KSxuKmkpfSkpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYSl9fWZ1bmN0aW9uIHRfc2Nyb2xsVG8odCxlKXtpZih0KXt2YXIgbj1lfHx7fSxvPW4udXNlTmF0aXZlU2Nyb2xsVG8saT1uLmR1cmF0aW9uLHI9bi5iZWhhdmlvcixhPXZvaWQgMD09PXI/Imluc3RhbnQiOnIsbD1uLm9mZnNldCxkPXZvaWQgMD09PWw/MDpsLHM9TWF0aC5tYXgocGFyc2VJbnQodC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnNjcm9sbFktZCwxMCksMCk7b3x8Imluc3RhbnQiPT09YT93aW5kb3cuc2Nyb2xsVG8oe2xlZnQ6MCx0b3A6cyxiZWhhdmlvcjphfSk6dF9zbW9vdGhTY3JvbGxUbyhzLGkpfX1mdW5jdGlvbiB0X3Ntb290aFNjcm9sbFRvKHQsZSl7dm9pZCAwPT09ZSYmKGU9NTAwKTt2YXIgbj1kb2N1bWVudC5ib2R5LG89d2luZG93LnNjcm9sbFl8fHdpbmRvdy5wYWdlWU9mZnNldCxpPXQtbyxyPXBlcmZvcm1hbmNlLm5vdygpO2Z1bmN0aW9uIGEodCl7cmV0dXJuIE1hdGgucG93KHQsMil9ZnVuY3Rpb24gbCgpe3ZhciBkPXBlcmZvcm1hbmNlLm5vdygpLHM9TWF0aC5taW4oKGQtcikvZSwxKSxjPWEocyk7d2luZG93LnNjcm9sbFRvKDAsbytpKmMpLHM8MT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobCk6KG4ucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXNjcm9sbCIpLG4ucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXNjcm9sbGFibGUiKSx3aW5kb3cuc2Nyb2xsVG8oMCx0KSl9bi5zZXRBdHRyaWJ1dGUoImRhdGEtc2Nyb2xsIiwidHJ1ZSIpLG4uc2V0QXR0cmlidXRlKCJkYXRhLXNjcm9sbGFibGUiLCJ0cnVlIikscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGwpfXdpbmRvdy5icm93c2VyTGFuZz0od2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UpLnRvVXBwZXJDYXNlKCkuc2xpY2UoMCwyKSx3aW5kb3cudGlsZGFCcm93c2VyTGFuZz13aW5kb3cuYnJvd3NlckxhbmcsdF9vblJlYWR5KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYodCl2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wcm9qZWN0LWxhbmciKTtlJiYod2luZG93LmJyb3dzZXJMYW5nPWUpfSkpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxlPS0xIT09dC5pbmRleE9mKCJJbnN0YWdyYW0iKSxuPS0xIT09dC5pbmRleE9mKCJGQkFWIiksbz0tMSE9PXQuaW5kZXhPZigiWWFTZWFyY2hCcm93c2VyIiksaT0tMSE9PXQuaW5kZXhPZigiU2Ftc3VuZ0Jyb3dzZXIiKSxyPS0xIT09dC5pbmRleE9mKCJEdWNrRHVja0dvIiksYTtpZigtMSE9PXQuaW5kZXhPZigiQW5kcm9pZCIpJiYobnx8ZXx8b3x8aXx8cikpe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTtsLnN0eWxlLmxpbmVIZWlnaHQ9IjEwMHB4IixsLnN0eWxlLnBhZGRpbmc9IjAiLGwuc3R5bGUubWFyZ2luPSIwIixsLnN0eWxlLmhlaWdodD0iYXV0byIsbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUub3BhY2l0eT0iMC4wMDEiLGwuaW5uZXJUZXh0PSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpO3ZhciBkPTEwMC9sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobCksZDwuOTgmJmRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8c3R5bGU+LnQzOTYgW2RhdGEtZWxlbS10eXBlPSJ0ZXh0Il0gLnRuLWF0b20ge3pvb206ICcrMTAwKmQrIiU7fTwvc3R5bGU+Iil9d2luZG93LmlzaU9TJiYhd2luZG93Lk1TU3RyZWFtJiYoZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgiLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0IiwiMTAwJSIpLGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoInRleHQtc2l6ZS1hZGp1c3QiLCIxMDAlIikpfSkpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImh0bWwiKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXRpbGRhbGFiZWwiKSxuPXQub2Zmc2V0SGVpZ2h0O2lmKGRvY3VtZW50LmJvZHkmJihuPU1hdGgubWF4KGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LHQub2Zmc2V0SGVpZ2h0KSksKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWNvcHkiKXx8ZSkmJmUucXVlcnlTZWxlY3RvckFsbCgiZGl2Iikpbis3MD53aW5kb3cuaW5uZXJIZWlnaHQmJmUmJmUuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IHBvaW50ZXItZXZlbnRzOiBhbGwgIWltcG9ydGFudDsgb3BhY2l0eTogMSAhaW1wb3J0YW50OyBtYXJnaW46IDAgIWltcG9ydGFudDsgei1pbmRleDogMSAhaW1wb3J0YW50Iik7ZWxzZXtmb3IodmFyIG89ZG9jdW1lbnQuYm9keS5jaGlsZE5vZGVzLGk9W10scj0wO3I8by5sZW5ndGg7cisrKXt2YXIgYT1vW3JdOzg9PT1hLm5vZGVUeXBlJiZpLnB1c2goYSl9Zm9yKHZhciByPTA7cjxpLmxlbmd0aDtyKyspLTEhPT1pW3JdLm5vZGVWYWx1ZS5pbmRleE9mKCIndCByZW1vdmUgdGhpcyBsIikmJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmVuZCIsJzxkaXYgY2xhc3M9InQtdGlsZGFsYWJlbCB0LXRpbGRhbGFiZWwtZnJlZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IHBvaW50ZXItZXZlbnRzOiBhbGwgIWltcG9ydGFudDsgb3BhY2l0eTogMSAhaW1wb3J0YW50OyBtYXJnaW46IDAgIWltcG9ydGFudDsgei1pbmRleDogOTk5MDAgIWltcG9ydGFudCI+PGRpdiBjbGFzcz0idC10aWxkYWxhYmVsLWZyZWVfX21haW4iPjxhIGhyZWY9Imh0dHBzOi8vdGlsZGEuY2MiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0icGFkZGluZy1ib3R0b206MTJweDsgZGlzcGxheTogYmxvY2s7Ij48aW1nIHN0eWxlPSJ3aWR0aDo0MHB4OyIgc3JjPSJodHRwczovL3N0YXRpYy50aWxkYWNkbi4nK3RfZ2V0Um9vdFpvbmUoKSsnL2ltZy90aWxkYWNvcHkucG5nIj48L2E+PGRpdiBzdHlsZT0icGFkZGluZy1ib3R0b206IDE1cHg7Ij5UaGlzIHNpdGUgd2FzIG1hZGUgb24gPGEgaHJlZj0iaHR0cHM6Ly90aWxkYS5jYyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOmluaGVyaXQ7Ij5UaWxkYSDigJQgYSB3ZWJzaXRlIGJ1aWxkZXI8L2E+IHRoYXQgaGVscHMgdG8mbmJzcDtjcmVhdGUgYSZuYnNwO3dlYnNpdGUgd2l0aG91dCBhbnkgY29kZTwvZGl2PjxhIGhyZWY9Imh0dHBzOi8vdGlsZGEuY2MvcmVnaXN0cmF0aW9uLyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDEwcHggMjBweDsgZm9udC1zaXplOiAxM3B4OyBib3JkZXItcmFkaXVzOiA1MHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmE4NjY5OyBjb2xvcjogI2ZmZjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyI+Q3JlYXRlIGEgd2Vic2l0ZTwvYT48L2Rpdj48ZGl2IGNsYXNzPSJ0LXRpbGRhbGFiZWwtZnJlZV9fbGlua3Mtd3IiPjxhIGNsYXNzPSJ0LXRpbGRhbGFiZWwtZnJlZV9fdHh0LWxpbmsiIGhyZWY9Imh0dHBzOi8vaGVscCcrKCJSVSI9PT13aW5kb3cuYnJvd3Nlckxhbmc/Ii1ydSI6IiIpKycudGlsZGEuY2Mvd2hpdGUtbGFiZWwiIHRhcmdldD0iX2JsYW5rIj4nKygiUlUiPT09d2luZG93LmJyb3dzZXJMYW5nPyLQmtCw0Log0YPQtNCw0LvQuNGC0Ywg0Y3RgtC+0YIg0LvQtdC50LHQuyI6IkhvdyB0byByZW1vdmUgdGhpcyBibG9jayIpKyI/PC9hPjwvZGl2PjwvZGl2PiIpfX0pLDUwMCl9KSksdF9vblJlYWR5KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYoIXdpbmRvdy5pc01vYmlsZSYmdCYmInllcyIhPT10LmdldEF0dHJpYnV0ZSgiZGF0YS1ibG9ja3MtYW5pbWF0aW9ub2ZmIikmJiExPT09d2luZG93LmlzU2VhcmNoQm90KXtmb3IodmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIiKSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvLGk9KG89ZVtuXSkuZ2V0QXR0cmlidXRlKCJzdHlsZSIpO2kmJi0xIT09aS5pbmRleE9mKCJiYWNrZ3JvdW5kLWNvbG9yIikmJm8uc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGlvbmFwcGVhciIsIm9mZiIpfWZvcih2YXIgcj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRpb25hcHBlYXIiKSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1taW4iKSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1tYXgiKX0pKSxuPTA7bjxyLmxlbmd0aDtuKyspe3ZhciBvLGE9KG89cltuXSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCxsPXdpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQrMzAwO3RfYWRkQ2xhc3MobyxhPjFlMyYmYT5sPyJyX2hpZGRlbiI6InJfc2hvd2VkIiksdF9hZGRDbGFzcyhvLCJyX2FuaW0iKX1pZihyLmxlbmd0aCl7ZnVuY3Rpb24gZCgpe2Zvcih2YXIgdD1yLmxlbmd0aC0xO3Q+PTA7dC0tKXt2YXIgZT1yW3RdLG4sbz0wO2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDwobz1lLm9mZnNldEhlaWdodDw9MTAwP3dpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQ6d2luZG93LnBhZ2VZT2Zmc2V0K3dpbmRvdy5pbm5lckhlaWdodC0xMDApJiYodF9yZW1vdmVDbGFzcyhlLCJyX2hpZGRlbiIpLHRfYWRkQ2xhc3MoZSwicl9zaG93ZWQiKSwocj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChyKSkuc3BsaWNlKHQsMSkpfX12YXIgcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZWNvcmQtdHlwZT0iNDAwIl0nKTtpZihzLmxlbmd0aD4wKXZhciBjPTAsdT0wLG09c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7MzAwPT09KHUrPTEpJiZjbGVhckludGVydmFsKG0pO2Zvcih2YXIgdD0wO3Q8cy5sZW5ndGg7dCsrKXt2YXIgZTsieWVzIj09PXNbdF0uZ2V0QXR0cmlidXRlKCJkYXRhLWhpZGluZy1jb21wbGV0ZWQiKSYmKGMrPTEpfWM9PT1zLmxlbmd0aCYmKGQoKSxjbGVhckludGVydmFsKG0pKX0pLDEwMCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtkKCl9KSwyMDApKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2QoKX0pKX19dmFyIGg9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaHRtbCIpLHA9ZG9jdW1lbnQuYm9keTsibm9uZSI9PT1oLnN0eWxlLmRpc3BsYXkmJihoLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dmFyIHc9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtdGlsZGFsYWJlbCIpLGY7KGY9cD9NYXRoLm1heChwLnNjcm9sbEhlaWdodCxwLm9mZnNldEhlaWdodCxwLmNsaWVudEhlaWdodCxoLm9mZnNldEhlaWdodCk6aC5vZmZzZXRIZWlnaHQpKzcwPHdpbmRvdy5pbm5lckhlaWdodD93JiYody5zdHlsZS5kaXNwbGF5PSJub25lIik6dyYmdy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogYmxvY2sgIWltcG9ydGFudCIpfSkpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3dpbmRvdy53aW5XaWR0aD13aW5kb3cuaW5uZXJXaWR0aCx3aW5kb3cud2luSGVpZ2h0PXdpbmRvdy5pbm5lckhlaWdodH1mdW5jdGlvbiBlKCl7dmFyIHQ9d2luZG93LmlzTW9iaWxlP2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDp3aW5kb3cuaW5uZXJXaWR0aCxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yW2RhdGEtc2NyZWVuLW1heF0sIC5yW2RhdGEtc2NyZWVuLW1pbl0iKSxuLG8saTstMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIikmJih0PXNjcmVlbi53aWR0aCk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBhPWVbcl0sbD1hLmlkLnJlcGxhY2UoInJlYyIsIiIpO2lmKCJ5ZXMiPT09YS5nZXRBdHRyaWJ1dGUoImRhdGEtY29ubmVjdC13aXRoLXRhYiIpfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wb3B1cC1yZWMtaWRzPSInK2wrJyJdJykpcmV0dXJuO2k9Z2V0Q29tcHV0ZWRTdHlsZShhKS5kaXNwbGF5LChuPWEuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1tYXgiKSl8fChuPTFlNCksKG89YS5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1pbiIpKXx8KG89MCksbj1wYXJzZUludChuKSwobz1wYXJzZUludChvKSk8PW4mJih0PD1uJiZ0Pm8/ImJsb2NrIiE9PWkmJihhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik6Im5vbmUiIT09aSYmKGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpKX19dF9vblJlYWR5KChmdW5jdGlvbigpe3QoKSxlKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0KCl9KSwyMDApKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKChmdW5jdGlvbigpe2UoKX0pLDIwMCkpfSkpfSgpLGZ1bmN0aW9uKCl7dmFyIHQ9LTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkluc3RhZ3JhbSIpO2Z1bmN0aW9uIGUoKXtmb3IodmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtY292ZXJfX2NhcnJpZXIiKSxlPTAsbj0wO248dC5sZW5ndGg7bisrKXt2YXIgbyxpO2lmKChpPShvPXRbbl0pLnN0eWxlKS5oZWlnaHQuaW5kZXhPZigidmgiKT4tMSl7ZT1wYXJzZUludChpLmhlaWdodCwxMCkvMTAwO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3IuaWQ9InRlbXBEaXYiLHIuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMHZoO3Zpc2liaWxpdHk6aGlkZGVuOyIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyKTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVtcERpdiIpLGw9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShhKS5oZWlnaHQucmVwbGFjZSgicHgiLCIiKSk7dF9yZW1vdmVFbChhKTt2YXIgZD1NYXRoLnJvdW5kKGwqZSkrInB4IixzPW8uY2xvc2VzdCgiLnQtY292ZXIiKTtpZihzKXt2YXIgYz1zLnF1ZXJ5U2VsZWN0b3IoIi50LWNvdmVyX19maWx0ZXIiKSx1PXMucXVlcnlTZWxlY3RvcigiLnQtY292ZXJfX3dyYXBwZXIiKTtzLnN0eWxlLmhlaWdodD1kLGMmJihjLnN0eWxlLmhlaWdodD1kKSx1JiYodS5zdHlsZS5oZWlnaHQ9ZCl9aS5oZWlnaHQ9ZH19dmFyIG09ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtaGVpZ2h0LWNvcnJlY3QtdmhdIiksaD13aW5kb3cuaW5uZXJIZWlnaHQ7ZT0wO2Zvcih2YXIgbj0wO248bS5sZW5ndGg7bisrKXt2YXIgbyxpOyhpPShvPW1bbl0pLnN0eWxlKS5oZWlnaHQuaW5kZXhPZigidmgiKT4tMSYmKGU9cGFyc2VJbnQoaS5oZWlnaHQpLzEwMCxkPWgrInB4IixpLmhlaWdodD1kKX19ZnVuY3Rpb24gbigpe3ZhciBlPXQ/c2NyZWVuLndpZHRoOndpbmRvdy5pbm5lcldpZHRoO3dpbmRvdy5pc01vYmlsZSYmIXQmJihlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk7Zm9yKHZhciBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yOm5vdChbZGF0YS1yZWNvcmQtdHlwZT0iMzk2Il0pOm5vdChbZGF0YS1yZWNvcmQtdHlwZT0iMTAwMyJdKScpLG89W10saT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgcj1uW2ldLGE9Z2V0Q29tcHV0ZWRTdHlsZShyKTsibm9uZSIhPT1hLmRpc3BsYXkmJiJoaWRkZW4iIT09YS52aXNpYmlsaXR5JiYiMCIhPT1hLm9wYWNpdHkmJm8ucHVzaChyKX1mb3IodmFyIGw9MDtsPG8ubGVuZ3RoO2wrKylmb3IodmFyIGQ9b1tsXSxzPWQucXVlcnlTZWxlY3RvckFsbCgnZGl2Om5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoPSJmYWxzZSJdKTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KC50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyKTpub3QoLnRuLWF0b21fX3ByeC13cmFwcGVyKTpub3QoLnRuLWF0b21fX3ZpZGVvaWZyYW1lKTpub3QoLnRuLWF0b21fX3N0aWNreS13cmFwcGVyKTpub3QoLnQtc3RvcmVfX3JlbGV2YW50c19fY29udGFpbmVyKTpub3QoLnQtc2xkc19faXRlbXMtd3JhcHBlcik6bm90KC5qcy1wcm9kdWN0LWNvbnRyb2xzLXdyYXBwZXIpOm5vdCguanMtcHJvZHVjdC1lZGl0aW9uLW9wdGlvbik6bm90KC50LXByb2R1Y3RfX29wdGlvbi12YXJpYW50cyknKSxjPTA7YzxzLmxlbmd0aDtjKyspe3ZhciB1PXNbY107ZC5zdHlsZS53b3JkQnJlYWs9IiI7dmFyIG09dF9vdXRlcldpZHRoKHUpO2lmKG0+ZSl7aWYoInllcyI9PT11LmdldEF0dHJpYnV0ZSgiW2RhdGEtY3VzdG9tc3R5bGVdIikmJiJmYWxzZSI9PT11LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJbZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoXSIpKXJldHVybjtjb25zb2xlLmxvZygiQmxvY2sgbm90IG9wdGltaXplZCBmb3IgbW9iaWxlIHdpZHRoLiBCbG9jayB3aWR0aDoiK20rIiBCbG9jayBpZDoiK2QuZ2V0QXR0cmlidXRlKCJpZCIpKSxjb25zb2xlLmxvZyh1KSxkLnN0eWxlLm92ZXJmbG93PSJhdXRvIixkLnN0eWxlLndvcmRCcmVhaz1tLTM+ZT8iYnJlYWstd29yZCI6IiJ9fX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudC10ZXh0Om5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtbmFtZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtZGVzY3I6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1oZWFkaW5nOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtdGV4dC1pbXBhY3Q6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1zdWJ0aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXVwdGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pJyksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dLGk9by5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYoaSl7dmFyIHI9InJlbSI9PT1vLmdldEF0dHJpYnV0ZSgiZGF0YS1hdXRvLWNvcnJlY3QtZm9udC1zaXplIiksYTtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg+dClhPShhPWkucmVwbGFjZSgibGluZWhlaWdodCIsImxpbmUtaGVpZ2h0IikpLnJlcGxhY2UoImZvbnRzaXplIiwiZm9udC1zaXplIiksby5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKTtlbHNle2lmKC0xPT09aS5pbmRleE9mKCJmb250LXNpemUiKSljb250aW51ZTtpZihwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPDI2KWNvbnRpbnVlO2E9aS5yZXBsYWNlKCJsaW5lLWhlaWdodCIsImxpbmVoZWlnaHQiKSxhPXI/YS5yZXBsYWNlKC9mb250LXNpemUuKnB4Oy9naSwiZm9udC1zaXplOiAxLjZyZW07Iik6YS5yZXBsYWNlKCJmb250LXNpemUiLCJmb250c2l6ZSIpLG8uc2V0QXR0cmlidXRlKCJzdHlsZSIsYSl9fX19KHdpbmRvdy5pc01vYmlsZXx8d2luZG93LnBhcmVudC5pc1BhZ2VQcmV2aWV3KSYmKHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGUsNDAwKX0pKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dChlLDQwMCl9KSksd2luZG93LmlubmVyV2lkdGg8NDgwfHx3aW5kb3cuaXNNb2JpbGUmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDw0ODB8fHQmJnNjcmVlbi53aWR0aDw0ODA/KHRfb25SZWFkeSgoZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJyksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZmllbGRdIHNwYW4sIFtmaWVsZF0gc3Ryb25nLCBbZmllbGRdIGVtLCBbZmllbGRdIGEiKSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4yNiYmKGkuc3R5bGUuZm9udFNpemU9bnVsbCxpLnN0eWxlLmxpbmVIZWlnaHQ9bnVsbCl9Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4yNiYmKGkuc3R5bGUuZm9udFNpemU9bnVsbCl9byg0ODApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvKDQ4MCl9KSw1MDApfSkpfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixuKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bigpfSksNTAwKX0pKSk6KHdpbmRvdy5pbm5lcldpZHRoPDkwMHx8d2luZG93LmlzTW9iaWxlJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg8OTAwfHx0JiZzY3JlZW4ud2lkdGg8OTAwKSYmdF9vblJlYWR5KChmdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jdXN0b21zdHlsZT0ieWVzIl0nKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltmaWVsZF0gc3BhbiwgW2ZpZWxkXSBzdHJvbmcsIFtmaWVsZF0gZW0sIFtmaWVsZF0gYSIpLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG89dFtuXTtwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPjMwJiYoby5zdHlsZS5mb250U2l6ZT1udWxsLG8uc3R5bGUubGluZUhlaWdodD1udWxsKX1mb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPjMwJiYoby5zdHlsZS5mb250U2l6ZT1udWxsKX1mb3IodmFyIGk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnQtdGV4dDpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LW5hbWU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC10aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LWRlc2NyOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtaGVhZGluZzpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXRleHQtaW1wYWN0Om5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtc3VidGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC11cHRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKScpLG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIG8scj0obz1pW25dKS5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYociYmci5pbmRleE9mKCJmb250LXNpemUiKT4tMSYmcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4zMClpZigicmVtIj09PW8uZ2V0QXR0cmlidXRlKCJkYXRhLWF1dG8tY29ycmVjdC1mb250LXNpemUiKSl7dmFyIGE9ci5yZXBsYWNlKC9mb250LXNpemUuKnB4Oy9naSwiZm9udC1zaXplOiAxLjZyZW07IikucmVwbGFjZSgibGluZS1oZWlnaHQiLCJsaW5laGVpZ2h0Iik7by5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKX1lbHNle3ZhciBhPXIucmVwbGFjZSgiZm9udC1zaXplIiwiZm9udHNpemUiKS5yZXBsYWNlKCJsaW5lLWhlaWdodCIsImxpbmVoZWlnaHQiKTtvLnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpfX19KSkpfSgpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZePSJodHRwIl1bdGFyZ2V0PSJfYmxhbmsiXScpLGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG49dFtlXSxvPW4uZ2V0QXR0cmlidXRlKCJyZWwiKXx8IiI7IiI9PT1vP24uc2V0QXR0cmlidXRlKCJyZWwiLCJub29wZW5lciIpOi0xPT09by5pbmRleE9mKCJub29wZW5lciIpJiZuLnNldEF0dHJpYnV0ZSgicmVsIixvKyIgbm9vcGVuZXIiKX19KSwyNTAwKX0pKSxmdW5jdGlvbih0LGUpe3Qub25lcnJvcj1mdW5jdGlvbihlLG4sbyxpLHIpeyJvYmplY3QiIT10eXBlb2YgdC50X2pzZXJyb3JzJiYodC50X2pzZXJyb3JzPVtdKSx0LnRfanNlcnJvcnMucHVzaCh7bWVzc2FnZTplLGZpbGVuYW1lOm4sbGluZW5vOm8sY29sbm86aSxlcnJvcjpyfSl9fSh3aW5kb3csTWF0aCksdF9vblJlYWR5KChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigicG9wdXBTaG93ZWQiLHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9faW5pdCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJwb3B1cEhpZGRlbiIsKGZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7dCYmKHQuY2FuY2VsVGltZW91dCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodC5jYW5jZWxUaW1lb3V0KSx0LmNhbmNlbFRpbWVvdXQ9bnVsbCksdC5jYW5jZWxUaW1lb3V0PXdpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2FuY2VsVGltZW91dD1udWxsLHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2FuY2VsKCl9KSxNYXRoLm1pbigzMDAsdC5kZWxheSkpKX0pKX0pKSx3aW5kb3cuc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcjsKCmZ1bmN0aW9uIHQ4NjhfaW5pdFBvcHVwKHJlY2lkKXt2YXIgcmVjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWMnK3JlY2lkKTtpZighcmVjKXJldHVybjtyZWMuc2V0QXR0cmlidXRlKCdkYXRhLWFuaW1hdGlvbmFwcGVhcicsJ29mZicpO3JlYy5zdHlsZS5vcGFjaXR5PScxJzt2YXIgcG9wdXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50LXBvcHVwJyk7aWYoIXBvcHVwKXJldHVybjt2YXIgaG9vaz1wb3B1cC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdG9vbHRpcC1ob29rJyk7aWYoIWhvb2spcmV0dXJuO3ZhciBhbmFsaXRpY3M9cG9wdXAuZ2V0QXR0cmlidXRlKCdkYXRhLXRyYWNrLXBvcHVwJyk7dmFyIGN1c3RvbUNvZGVIVE1MPXQ4NjhfX3JlYWRDdXN0b21Db2RlKHJlYyk7dmFyIHJlY0Jsb2Nrcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucicpO2Zvcih2YXIgaT0wO2k8cmVjQmxvY2tzLmxlbmd0aDtpKyspe3JlY0Jsb2Nrc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZXZlbnQpe3ZhciB0YXJnZXQ9ZXZlbnQudGFyZ2V0O3ZhciBocmVmPXRhcmdldC5jbG9zZXN0KCdhW2hyZWYkPSInK2hvb2srJyJdJyk/dGFyZ2V0OiExO2lmKCFocmVmKXJldHVybjtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3Q4Njhfc2hvd1BvcHVwKHJlYyxjdXN0b21Db2RlSFRNTCk7dF9vbkZ1bmNMb2FkKCd0X3BvcHVwX19yZXNpemVQb3B1cCcsZnVuY3Rpb24oKXt0X3BvcHVwX19yZXNpemVQb3B1cChyZWNpZCl9KTtpZihob29rLnN1YnN0cmluZygwLDcpPT09JyNwb3B1cDonJiZhbmFsaXRpY3MmJndpbmRvdy5UaWxkYSl7dmFyIHZpcnRUaXRsZT1ob29rO3ZpcnRUaXRsZT12aXJ0VGl0bGUuc3Vic3RyaW5nKDcpO1RpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcyhhbmFsaXRpY3MsdmlydFRpdGxlKX19KX0KaWYoIXBvcHVwLmdldEF0dHJpYnV0ZSgnZGF0YS1wb3B1cC1pbml0ZWQnKSYmJ011dGF0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdyl7cG9wdXAuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHVwLWluaXRlZCcsJ3llcycpO3ZhciBzdG9yZXM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSAudC1zdG9yZScpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoc3RvcmVzLGZ1bmN0aW9uKHN0b3JlKXtuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnNMaXN0KXtmb3IodmFyIG11dGF0aW9uIGluIG11dGF0aW9uc0xpc3Qpe3ZhciBldmVudD1tdXRhdGlvbnNMaXN0W211dGF0aW9uXTtpZihldmVudC50eXBlPT09J2F0dHJpYnV0ZXMnKXtpZihldmVudC50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3QtcG9wdXBfc2hvdycpIT09LTEpe3BvcHVwLnN0eWxlLnpJbmRleD0nOTk5OTk5OTknO3Q4NjhfaW5pdFBvcHVwKHJlY2lkKTt9fX19KS5vYnNlcnZlKHN0b3JlLHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbJ2NsYXNzJ10sc3VidHJlZTohMCx9KX0pfX0KZnVuY3Rpb24gdDg2OF9fcmVhZEN1c3RvbUNvZGUocmVjKXt2YXIgY29kZVdyYXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50ODY4IC50ODY4X19jb2RlLXdyYXAnKTtpZighY29kZVdyYXApcmV0dXJuO3ZhciBjdXN0b21Db2RlPWNvZGVXcmFwLmlubmVySFRNTDtyZXR1cm4gY3VzdG9tQ29kZX0KZnVuY3Rpb24gdDg2OF9zaG93UG9wdXAocmVjKXt2YXIgcG9wdXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50LXBvcHVwJyk7aWYoIXBvcHVwKXJldHVybjt2YXIgcG9wdXBDb250YWluZXI9cG9wdXAucXVlcnlTZWxlY3RvcignLnQtcG9wdXBfX2NvbnRhaW5lcicpO2lmKCFwb3B1cENvbnRhaW5lcilyZXR1cm47dmFyIGNvZGVXcmFwPXBvcHVwLnF1ZXJ5U2VsZWN0b3IoJy50ODY4X19jb2RlLXdyYXAnKTtpZighY29kZVdyYXApcmV0dXJuO3ZhciB3aW5kb3dXaWR0aD13aW5kb3cuaW5uZXJXaWR0aDt2YXIgc2NyZWVuTWluPXJlYy5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2NyZWVuLW1pbicpO3ZhciBzY3JlZW5NYXg9cmVjLmdldEF0dHJpYnV0ZSgnZGF0YS1zY3JlZW4tbWF4Jyk7aWYoc2NyZWVuTWluJiZ3aW5kb3dXaWR0aDxwYXJzZUludChzY3JlZW5NaW4sMTApKXJldHVybjtpZihzY3JlZW5NYXgmJndpbmRvd1dpZHRoPnBhcnNlSW50KHNjcmVlbk1heCwxMCkpcmV0dXJuO3BvcHVwLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJztjb2RlV3JhcC5zdHlsZS5kaXNwbGF5PSdibG9jayc7dDg2OF9zZXRIZWlnaHQocmVjKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cG9wdXBDb250YWluZXIuY2xhc3NMaXN0LmFkZCgndC1wb3B1cF9fY29udGFpbmVyLWFuaW1hdGVkJyk7cG9wdXAuY2xhc3NMaXN0LmFkZCgndC1wb3B1cF9zaG93Jyl9LDEwMCk7aWYodHlwZW9mIHRfdHJpZ2dlckV2ZW50PT09J2Z1bmN0aW9uJyl0X3RyaWdnZXJFdmVudChkb2N1bWVudC5ib2R5LCdwb3B1cFNob3dlZCcpO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgndC1ib2R5X3BvcHVwc2hvd2VkJyk7cG9wdXAuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGV2ZW50KXt2YXIgY29udGFpbmVyPWV2ZW50LnRhcmdldC5jbG9zZXN0KCcudC1wb3B1cF9fY29udGFpbmVyJyk7aWYoIWNvbnRhaW5lcil0ODY4X2Nsb3NlUG9wdXAocmVjKX0pO3ZhciBjbG9zZUJ1dHRvbj1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXBfX2Nsb3NlJyk7aWYoY2xvc2VCdXR0b24pe2Nsb3NlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbigpe3Q4NjhfY2xvc2VQb3B1cChyZWMpfSl9CnZhciBidXR0b25zPXJlYy5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWYqPSIjIl0nKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGJ1dHRvbnMsZnVuY3Rpb24oYnV0dG9uKXtidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKCl7dmFyIHVybD1idXR0b24uZ2V0QXR0cmlidXRlKCdocmVmJyk7aWYodXJsLmluZGV4T2YoJyNvcmRlcicpIT09LTEpe3ZhciBwb3B1cENvbnRhaW5lcj1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXBfX2NvbnRhaW5lcicpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt3aGlsZShwb3B1cENvbnRhaW5lci5maXJzdENoaWxkKXtwb3B1cENvbnRhaW5lci5yZW1vdmVDaGlsZChwb3B1cENvbnRhaW5lci5maXJzdENoaWxkKX19LDYwMCl9CmlmKCF1cmx8fHVybC5zdWJzdHJpbmcoMCw3KSE9PScjcHJpY2U6Jyl7dDg2OF9jbG9zZVBvcHVwKHJlYyk7aWYoIXVybHx8dXJsLnN1YnN0cmluZygwLDcpPT09JyNwb3B1cDonKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYodHlwZW9mIHRfdHJpZ2dlckV2ZW50PT09J2Z1bmN0aW9uJyl0X3RyaWdnZXJFdmVudChkb2N1bWVudC5ib2R5LCdwb3B1cFNob3dlZCcpO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgndC1ib2R5X3BvcHVwc2hvd2VkJyl9LDMwMCl9fX0pfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LmtleUNvZGU9PT0yNyl7dDg2OF9jbG9zZVBvcHVwKHJlYyl9fSl9CmZ1bmN0aW9uIHQ4NjhfY2xvc2VQb3B1cChyZWMpe3ZhciBwb3B1cD1yZWMucXVlcnlTZWxlY3RvcignLnQtcG9wdXAnKTt2YXIgY29kZVdyYXA9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50ODY4IC50ODY4X19jb2RlLXdyYXAnKTtpZih0eXBlb2YgdF90cmlnZ2VyRXZlbnQ9PT0nZnVuY3Rpb24nKXRfdHJpZ2dlckV2ZW50KGRvY3VtZW50LmJvZHksJ3BvcHVwSGlkZGVuJyk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCd0LWJvZHlfcG9wdXBzaG93ZWQnKTtwb3B1cC5jbGFzc0xpc3QucmVtb3ZlKCd0LXBvcHVwX3Nob3cnKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoIXBvcHVwLmNsYXNzTGlzdC5jb250YWlucygnLnQtcG9wdXBfc2hvdycpKXtwb3B1cC5zdHlsZS5kaXNwbGF5PSdub25lJztpZihjb2RlV3JhcCl7Y29kZVdyYXAuc3R5bGUuZGlzcGxheT0nbm9uZSd9fX0sMzAwKX0KZnVuY3Rpb24gdDg2OF9zZXRIZWlnaHQocmVjKXt2YXIgdmlkZW9DYXJpZXI9cmVjLnF1ZXJ5U2VsZWN0b3IoJy50ODY4X192aWRlby1jYXJpZXInKTtpZighdmlkZW9DYXJpZXIpcmV0dXJuO3ZhciBwYWRkaW5nTGVmdD1wYXJzZUludCh2aWRlb0Nhcmllci5zdHlsZS5wYWRkaW5nTGVmdCwxMCl8fDA7dmFyIHBhZGRpbmdSaWdodD1wYXJzZUludCh2aWRlb0Nhcmllci5zdHlsZS5wYWRkaW5nUmlnaHQsMTApfHwwO3ZhciBoZWlnaHQ9KHZpZGVvQ2FyaWVyLmNsaWVudFdpZHRoLShwYWRkaW5nTGVmdCtwYWRkaW5nUmlnaHQpKS8oMTYvOSk7dmlkZW9DYXJpZXIuc3R5bGUuaGVpZ2h0PWhlaWdodDtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHZpZGVvQ2FyaWVyLmNsb3Nlc3QsZnVuY3Rpb24ocGFyZW50KXtwYXJlbnQuc3R5bGUuaGVpZ2h0PWhlaWdodH0pfQppZighRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyl7RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcz1FbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tb3pNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUub01hdGNoZXNTZWxlY3Rvcn0KaWYoIUVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Qpe0VsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Q9ZnVuY3Rpb24ocyl7dmFyIGVsPXRoaXM7d2hpbGUoZWwmJmVsLm5vZGVUeXBlPT09MSl7aWYoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcy5jYWxsKGVsLHMpKXtyZXR1cm4gZWx9CmVsPWVsLnBhcmVudEVsZW1lbnR8fGVsLnBhcmVudE5vZGV9CnJldHVybiBudWxsfX0KZnVuY3Rpb24gdF9sYXp5bG9hZF91cGRhdGUoKXsidW5kZWZpbmVkIiE9dHlwZW9mIGxhenlsb2FkX2NvdmVyJiZsYXp5bG9hZF9jb3Zlci51cGRhdGUoKSwidW5kZWZpbmVkIiE9dHlwZW9mIGxhenlsb2FkX2ltZyYmbGF6eWxvYWRfaW1nLnVwZGF0ZSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfYmdpbWcmJmxhenlsb2FkX2JnaW1nLnVwZGF0ZSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfaWZyYW1lJiZsYXp5bG9hZF9pZnJhbWUudXBkYXRlKCl9ZnVuY3Rpb24gdF9sYXp5bG9hZF91cGRhdGVSZXNpemVfZWxlbShlKXtpZih3aW5kb3cualF1ZXJ5JiZlIGluc3RhbmNlb2YgalF1ZXJ5KXtpZigwPT1lLmxlbmd0aClyZXR1cm47ZT1lLmdldCgwKX1pZihudWxsIT1lKXt2YXIgdD1lLnRhZ05hbWU7aWYoIklNRyI9PXQpdmFyIG89ZS5nZXRBdHRyaWJ1dGUoInNyYyIpLG49Ii0vcmVzaXplLyI7ZWxzZSBpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdldENvbXB1dGVkU3R5bGUpe3ZhciBvPWdldENvbXB1dGVkU3R5bGUoZSlbImJhY2tncm91bmQtaW1hZ2UiXS5yZXBsYWNlKCJ1cmwoIiwiIikucmVwbGFjZSgiKSIsIiIpLnJlcGxhY2UoLyIvZ2ksIiIpLGk7aWYoImNvbnRhaW4iPT1nZXRDb21wdXRlZFN0eWxlKGUpWyJiYWNrZ3JvdW5kLXNpemUiXSl2YXIgbj0iLS9jb250YWluLyI7ZWxzZSB2YXIgbj0iLS9jb3Zlci8ifWVsc2UgdmFyIG49Ii0vY292ZXIvIjtpZighKG51bGw9PW98fC0xPT09by5pbmRleE9mKG4pfHxvLmluZGV4T2YoIi5zdmciKT4wfHxvLmluZGV4T2YoIi5naWYiKT4wfHxvLmluZGV4T2YoIi5pY28iKT4wfHwtMT09PW8uaW5kZXhPZigidGh1bWIudGlsZGFjZG4uY29tIil8fG8uaW5kZXhPZigiLS9lbXB0eS8iKT4wJiZvLmluZGV4T2YoIi0vcmVzaXplYi8iKT4wKSl7dmFyIGw9by5pbmRleE9mKG4pK24ubGVuZ3RoLGE9by5pbmRleE9mKCIvIixsKTtpZihsPjAmJmE+MCl7dmFyIHI9by5zbGljZShsLGEpLnNwbGl0KCJ4Iikscz1lLmNsaWVudFdpZHRoLGM9ZS5jbGllbnRIZWlnaHQ7aWYocz4wJiZjPjAmJihyWzBdPjB8fHJbMV0+MCkmJihyWzBdPjAmJnM+clswXXx8clsxXT4wJiZjPnJbMV0pJiYoclswXT4wJiZzLXJbMF0+MTAwfHxyWzFdPjAmJmMtclsxXT4xMDApKXt2YXIgZD1vLnNsaWNlKDAsbCkrKHJbMF0+MD9zOiIiKSsieCIrKHJbMV0+MD9jOiIiKStvLnN1YnN0cmluZyhhKTsiSU1HIj09dD9lLnNldEF0dHJpYnV0ZSgic3JjIixkKTplLnN0eWxlLmJhY2tncm91bmRJbWFnZT0idXJsKCciK2QrIicpIn19fX19IWZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sdCk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXQoKTplLkxhenlMb2FkPXQoKX0od2luZG93LChmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXttfHwoaD17ZWxlbWVudHNfc2VsZWN0b3I6ImltZyIsY29udGFpbmVyOndpbmRvdyx0aHJlc2hvbGQ6MzAwLHRocm90dGxlOjUwLGRhdGFfc3JjOiJvcmlnaW5hbCIsZGF0YV9zcmNzZXQ6Im9yaWdpbmFsLXNldCIsY2xhc3NfbG9hZGluZzoibG9hZGluZyIsY2xhc3NfbG9hZGVkOiJsb2FkZWQiLHNraXBfaW52aXNpYmxlOiEwLHNob3dfd2hpbGVfbG9hZGluZzohMCxjYWxsYmFja19sb2FkOm51bGwsY2FsbGJhY2tfZXJyb3I6bnVsbCxjYWxsYmFja19zZXQ6bnVsbCxjYWxsYmFja19wcm9jZXNzZWQ6bnVsbCxwbGFjZWhvbGRlcjoiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBQUFBQVAvLy95SDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUJSQUE3In0scD0hIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyLGY9ISF3aW5kb3cuYXR0YWNoRXZlbnQsZz0hIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LG09ITApfWZ1bmN0aW9uIHQoZSx0LG8pe3ZhciBuO3A/ZS5hZGRFdmVudExpc3RlbmVyKHQsbyk6ZiYmKGUuYXR0YWNoRXZlbnQoIm9uIit0LChuPWUsZnVuY3Rpb24oKXtvLmNhbGwobix3aW5kb3cuZXZlbnQpfSkpLGU9bnVsbCl9ZnVuY3Rpb24gbyhlLHQsbyl7cD9lLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxvKTpmJiZlLmRldGFjaEV2ZW50KCJvbiIrdCxvKX1mdW5jdGlvbiBuKGUsdCxvKXt2YXIgbixpLGw7ZnVuY3Rpb24gYSgpe3JldHVybiB3aW5kb3cuaW5uZXJXaWR0aHx8bi5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGh9ZnVuY3Rpb24gcigpe3JldHVybiB3aW5kb3cuaW5uZXJIZWlnaHR8fG4uZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AraS1uLmRvY3VtZW50RWxlbWVudC5jbGllbnRUb3B9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0K2wtbi5kb2N1bWVudEVsZW1lbnQuY2xpZW50TGVmdH1mdW5jdGlvbiBkKCl7dmFyIG47cmV0dXJuKG49dD09PXdpbmRvdz9yKCkraTpzKHQpK3Qub2Zmc2V0SGVpZ2h0KTw9cyhlKS1vfWZ1bmN0aW9uIHUoKXt2YXIgbjtyZXR1cm4obj10PT09d2luZG93P2EoKSt3aW5kb3cucGFnZVhPZmZzZXQ6Yyh0KSthKCkpPD1jKGUpLW99ZnVuY3Rpb24gXygpe3ZhciBvLG49MTIwMDtyZXR1cm4obz10PT09d2luZG93P2k6cyh0KSk+PXMoZSkrbitlLm9mZnNldEhlaWdodH1mdW5jdGlvbiBoKCl7dmFyIG47cmV0dXJuKG49dD09PXdpbmRvdz9sOmModCkpPj1jKGUpK28rZS5vZmZzZXRXaWR0aH1yZXR1cm4gbj1lLm93bmVyRG9jdW1lbnQsaT13aW5kb3cucGFnZVlPZmZzZXR8fG4uYm9keS5zY3JvbGxUb3AsbD13aW5kb3cucGFnZVhPZmZzZXR8fG4uYm9keS5zY3JvbGxMZWZ0LCJmaXhlZCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1jb250ZW50LWNvdmVyLXBhcmFsbGF4IikmJmUuY2xvc2VzdCYmZS5jbG9zZXN0KCIudC1jb3Zlcl9fY29udGFpbmVyIikmJihlPWUuY2xvc2VzdCgiLnQtY292ZXJfX2NvbnRhaW5lciIpKSwhKGQoKXx8XygpfHx1KCl8fGgoKSl9ZnVuY3Rpb24gaSgpe3ZhciBlO3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbz17fSxuO2ZvcihuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKG9bbl09ZVtuXSk7Zm9yKG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYob1tuXT10W25dKTtyZXR1cm4gb31mdW5jdGlvbiBhKGUpe3ZhciB0O3RyeXt0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpfWNhdGNoKGwpe3ZhciBvPVtdLG4saT1lLmxlbmd0aDtmb3Iobj0wO248aTtuKyspby5wdXNoKGVbbl0pO3Q9b31yZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmlzU2tpcEJ5UG9zaXRpb249bnVsbD09PWUub2Zmc2V0UGFyZW50JiYwPT09cihlLCIudDM5Nl9fY2Fycmllci13cmFwcGVyIikubGVuZ3RoJiYiZml4ZWQiIT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtY29udGVudC1jb3Zlci1wYXJhbGxheCIpLGUuaXNOb3RVbmRlclNjcmVlblJhbmdlPTA9PT1yKGUsIi50LXJlY1tkYXRhLXNjcmVlbi1tYXhdIikubGVuZ3RoJiYwPT09cihlLCIudC1yZWNbZGF0YS1zY3JlZW4tbWluXSIpLmxlbmd0aH0pKSx0fWZ1bmN0aW9uIHIoZSx0KXtmb3IodmFyIG89W107KGU9ZS5wYXJlbnROb2RlKSYmZSE9PWRvY3VtZW50Oyl0JiYhZS5tYXRjaGVzKHQpfHxvLnVuc2hpZnQoZSk7cmV0dXJuIG99ZnVuY3Rpb24gcyhlLHQpe2c/ZS5jbGFzc0xpc3QuYWRkKHQpOmUuY2xhc3NOYW1lKz0oZS5jbGFzc05hbWU/IiAiOiIiKSt0fWZ1bmN0aW9uIGMoZSx0KXtnP2UuY2xhc3NMaXN0LnJlbW92ZSh0KTplLmNsYXNzTmFtZT1lLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoIihefFxccyspIit0KyIoXFxzK3wkKSIpLCIgIikucmVwbGFjZSgvXlxzKy8sIiIpLnJlcGxhY2UoL1xzKyQvLCIiKX1mdW5jdGlvbiBkKGUsdCxvLG4pe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbiksbD10LmdldEF0dHJpYnV0ZSgiZGF0YS0iK28pLGE9ZS50YWdOYW1lO3JldHVybiJJTUciPT09YT8obCYmZS5zZXRBdHRyaWJ1dGUoInNyY3NldCIsbCksdm9pZChpJiZlLnNldEF0dHJpYnV0ZSgic3JjIixpKSkpOiJJRlJBTUUiPT09YT92b2lkKGkmJmUuc2V0QXR0cmlidXRlKCJzcmMiLGkpKTp2b2lkKGUuc3R5bGUuYmFja2dyb3VuZEltYWdlPSJ1cmwoIitpKyIpIil9ZnVuY3Rpb24gdShlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19ZnVuY3Rpb24gXyhvKXtlKCksdGhpcy5fc2V0dGluZ3M9bChoLG8pLHRoaXMuX3F1ZXJ5T3JpZ2luTm9kZT10aGlzLl9zZXR0aW5ncy5jb250YWluZXI9PT13aW5kb3c/ZG9jdW1lbnQ6dGhpcy5fc2V0dGluZ3MuY29udGFpbmVyLHRoaXMuX3ByZXZpb3VzTG9vcFRpbWU9MCx0aGlzLl9sb29wVGltZW91dD1udWxsLHRoaXMuX2hhbmRsZVNjcm9sbEZuPXUodGhpcy5oYW5kbGVTY3JvbGwsdGhpcyksdCh3aW5kb3csInJlc2l6ZSIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pLHRoaXMudXBkYXRlKCl9d2luZG93LnRfbGF6eWxvYWRfc2V0U291cmNlcz1kO3ZhciBoLHAsZixnLG09ITE7cmV0dXJuIF8ucHJvdG90eXBlLl9zaG93T25Mb2FkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXtudWxsIT09bCYmKGwuY2FsbGJhY2tfbG9hZCYmbC5jYWxsYmFja19sb2FkKGUpLGQoZSxlLGwuZGF0YV9zcmNzZXQsbC5kYXRhX3NyYyksbC5jYWxsYmFja19zZXQmJmwuY2FsbGJhY2tfc2V0KGUpLGMoZSxsLmNsYXNzX2xvYWRpbmcpLHMoZSxsLmNsYXNzX2xvYWRlZCksbyhpLCJsb2FkIixuKSl9dmFyIGksbD10aGlzLl9zZXR0aW5ncztlLmdldEF0dHJpYnV0ZSgic3JjIil8fGUuc2V0QXR0cmlidXRlKCJzcmMiLGwucGxhY2Vob2xkZXIpLHQoaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSwibG9hZCIsbiksdChpLCJlcnJvciIsKGZ1bmN0aW9uKCl7YyhlLGwuY2xhc3NfbG9hZGluZyksbC5jYWxsYmFja19lcnJvciYmbC5jYWxsYmFja19lcnJvcihlKX0pKSxzKGUsbC5jbGFzc19sb2FkaW5nKSxkKGksZSxsLmRhdGFfc3Jjc2V0LGwuZGF0YV9zcmMpfSxfLnByb3RvdHlwZS5fc2hvd09uQXBwZWFyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXtudWxsIT09aSYmKGkuY2FsbGJhY2tfbG9hZCYmaS5jYWxsYmFja19sb2FkKGUpLGMoZSxpLmNsYXNzX2xvYWRpbmcpLHMoZSxpLmNsYXNzX2xvYWRlZCksbyhlLCJsb2FkIixuKSl9dmFyIGk9dGhpcy5fc2V0dGluZ3M7KCJJTUciPT09ZS50YWdOYW1lfHwiSUZSQU1FIj09PWUudGFnTmFtZSkmJih0KGUsImxvYWQiLG4pLHQoZSwiZXJyb3IiLChmdW5jdGlvbigpe28oZSwibG9hZCIsbiksYyhlLGkuY2xhc3NfbG9hZGluZyksaS5jYWxsYmFja19lcnJvciYmaS5jYWxsYmFja19lcnJvcihlKX0pKSxzKGUsaS5jbGFzc19sb2FkaW5nKSksZChlLGUsaS5kYXRhX3NyY3NldCxpLmRhdGFfc3JjKSxpLmNhbGxiYWNrX3NldCYmaS5jYWxsYmFja19zZXQoZSl9LF8ucHJvdG90eXBlLl9sb29wVGhyb3VnaEVsZW1lbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXMuX3NldHRpbmdzLGk9dGhpcy5fZWxlbWVudHMsbD1pP2kubGVuZ3RoOjAsYT1bXTtmb3IoZT0wO2w+ZTtlKyspdD1pW2VdLG8uc2tpcF9pbnZpc2libGUmJnQuaXNTa2lwQnlQb3NpdGlvbnx8bih0LG8uY29udGFpbmVyLG8udGhyZXNob2xkKSYmKG8uc2hvd193aGlsZV9sb2FkaW5nP3RoaXMuX3Nob3dPbkFwcGVhcih0KTp0aGlzLl9zaG93T25Mb2FkKHQpLGEucHVzaChlKSx0Lndhc1Byb2Nlc3NlZD0hMCk7Zm9yKDthLmxlbmd0aD4wOylpLnNwbGljZShhLnBvcCgpLDEpLG8uY2FsbGJhY2tfcHJvY2Vzc2VkJiZvLmNhbGxiYWNrX3Byb2Nlc3NlZChpLmxlbmd0aCk7MD09PWwmJnRoaXMuX3N0b3BTY3JvbGxIYW5kbGVyKCl9LF8ucHJvdG90eXBlLl9wdXJnZUVsZW1lbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXMuX2VsZW1lbnRzLG49by5sZW5ndGgsaT1bXTtmb3IoZT0wO24+ZTtlKyspKHQ9b1tlXSkud2FzUHJvY2Vzc2VkJiZpLnB1c2goZSk7Zm9yKDtpLmxlbmd0aD4wOylvLnNwbGljZShpLnBvcCgpLDEpfSxfLnByb3RvdHlwZS5fc3RhcnRTY3JvbGxIYW5kbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNIYW5kbGluZ1Njcm9sbHx8KHRoaXMuX2lzSGFuZGxpbmdTY3JvbGw9ITAsdCh0aGlzLl9zZXR0aW5ncy5jb250YWluZXIsInNjcm9sbCIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pKX0sXy5wcm90b3R5cGUuX3N0b3BTY3JvbGxIYW5kbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNIYW5kbGluZ1Njcm9sbCYmKHRoaXMuX2lzSGFuZGxpbmdTY3JvbGw9ITEsbyh0aGlzLl9zZXR0aW5ncy5jb250YWluZXIsInNjcm9sbCIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pKX0sXy5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsPWZ1bmN0aW9uKCl7dmFyIGUsdCxvO3RoaXMuX3NldHRpbmdzJiYodD1pKCksMCE9PShvPXRoaXMuX3NldHRpbmdzLnRocm90dGxlKT8wPj0oZT1vLSh0LXRoaXMuX3ByZXZpb3VzTG9vcFRpbWUpKXx8ZT5vPyh0aGlzLl9sb29wVGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl9sb29wVGltZW91dCksdGhpcy5fbG9vcFRpbWVvdXQ9bnVsbCksdGhpcy5fcHJldmlvdXNMb29wVGltZT10LHRoaXMuX2xvb3BUaHJvdWdoRWxlbWVudHMoKSk6dGhpcy5fbG9vcFRpbWVvdXR8fCh0aGlzLl9sb29wVGltZW91dD1zZXRUaW1lb3V0KHUoKGZ1bmN0aW9uKCl7dGhpcy5fcHJldmlvdXNMb29wVGltZT1pKCksdGhpcy5fbG9vcFRpbWVvdXQ9bnVsbCx0aGlzLl9sb29wVGhyb3VnaEVsZW1lbnRzKCl9KSx0aGlzKSxlKSk6dGhpcy5fbG9vcFRocm91Z2hFbGVtZW50cygpKX0sXy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudHM9YSh0aGlzLl9xdWVyeU9yaWdpbk5vZGUucXVlcnlTZWxlY3RvckFsbCh0aGlzLl9zZXR0aW5ncy5lbGVtZW50c19zZWxlY3RvcikpLHRoaXMuX3B1cmdlRWxlbWVudHMoKSx0aGlzLl9sb29wVGhyb3VnaEVsZW1lbnRzKCksdGhpcy5fc3RhcnRTY3JvbGxIYW5kbGVyKCl9LF8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtvKHdpbmRvdywicmVzaXplIix0aGlzLl9oYW5kbGVTY3JvbGxGbiksdGhpcy5fbG9vcFRpbWVvdXQmJihjbGVhclRpbWVvdXQodGhpcy5fbG9vcFRpbWVvdXQpLHRoaXMuX2xvb3BUaW1lb3V0PW51bGwpLHRoaXMuX3N0b3BTY3JvbGxIYW5kbGVyKCksdGhpcy5fZWxlbWVudHM9bnVsbCx0aGlzLl9xdWVyeU9yaWdpbk5vZGU9bnVsbCx0aGlzLl9zZXR0aW5ncz1udWxsfSxffSkpLHdpbmRvdy5sYXp5PSJ5Iix0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtsYXp5bG9hZF9jb3Zlcj1uZXcgTGF6eUxvYWQoe2VsZW1lbnRzX3NlbGVjdG9yOiIudC1jb3Zlcl9fY2FycmllciIsc2hvd193aGlsZV9sb2FkaW5nOiExLGRhdGFfc3JjOiJjb250ZW50LWNvdmVyLWJnIixwbGFjZWhvbGRlcjoiIix0aHJlc2hvbGQ6NzAwfSl9KSwxMDApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYobGF6eWxvYWRfaW1nPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWltZyIsdGhyZXNob2xkOjgwMH0pLGxhenlsb2FkX2JnaW1nPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWJnaW1nIixzaG93X3doaWxlX2xvYWRpbmc6ITEscGxhY2Vob2xkZXI6IiIsdGhyZXNob2xkOjgwMH0pLGxhenlsb2FkX2lmcmFtZT1uZXcgTGF6eUxvYWQoe2VsZW1lbnRzX3NlbGVjdG9yOiIudC1pZnJhbWUifSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2xpZGUuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2xhenlsb2FkX2NvdmVyLnVwZGF0ZSgpLGxhenlsb2FkX2ltZy51cGRhdGUoKSxsYXp5bG9hZF9iZ2ltZy51cGRhdGUoKX0pLDUwMCl9KSksL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3Qpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NMaXN0LmFkZCgidC1tYmZpeCIpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtbWJmaXgiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2xhc3NMaXN0LmFkZCgidC1tYmZpeF9oaWRlIil9KSw1MCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtudWxsIT09dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9KSwxZTMpfX0pLDUwMCl9KSk7CgpmdW5jdGlvbiB0X2FuaW1hdGVfX2luaXQoKXt0X2FuaW1hdGVfX2NoZWNrQW5pbWF0aW9uQXZhaWxhYmlsaXR5KCkmJih0X2FuaW1hdGVfX2dlbmVyYXRlU3R5bGVzKCksdF9hbmltYXRlX193cmFwVGV4dFdpdGhPcGFjaXR5KCksdF9hbmltYXRlX19hZGROb0hvdmVyQ2xhc3NUb0J0bnMoKSx0X2FuaW1hdGVfX3ByZXZlbnRIb3Jpem9udGFsU2Nyb2xsKCksd2luZG93LmlubmVyV2lkdGg+PTEyMDAmJnRfYW5pbWF0ZV9fcGFyc2VOdW1iZXJUZXh0KCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX3N0YXJ0QW5pbWF0aW9uKCl9KSwxNTAwKSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja01vYmlsZSh0KXtyZXR1cm4gdC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2VsZW0sIC50Mzk2X19ncm91cCIpLGEsbjtyZXR1cm4hKCFlfHwieSIhPT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW1vYmlsZSIpKXx8KHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyIik/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKSwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCIiKX0pKTp0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsIiIpLCExKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsZSl7aWYodCl7dmFyIGE9InQtYW5pbWF0ZSI7dC5jbGFzc0xpc3QucmVtb3ZlKGEpLGUmJigic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSksZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1hKyJfIitlO3QuY2xhc3NMaXN0LnJlbW92ZShuKX0pKSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcHJldmVudEhvcml6b250YWxTY3JvbGwoKXt2YXIgdCxlPUFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdJykpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkLCAudC1jb3ZlciIpJiZ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0PndpbmRvdy5pbm5lcldpZHRofSkpOyFlLmxlbmd0aHx8d2luZG93LmlubmVyV2lkdGg8OTgwfHxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2xvc2VzdCgiLnIiKS5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX292ZXJmbG93LXgtaGlkZGVuIil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja0FuaW1hdGlvbkF2YWlsYWJpbGl0eSgpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXJlY29yZHMiKSxlPXQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2tzLWFuaW1hdGlvbm9mZiIpOm51bGwsYT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKTpudWxsO2lmKC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwieWVzIj09PWV8fHRfYW5pbWF0ZV9fY2hlY2tJRSgpfHwiZWRpdCI9PT1hKXt2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCIiKX0pKSwhMX1yZXR1cm4hMH1mdW5jdGlvbiB0X2FuaW1hdGVfX2dlbmVyYXRlU3R5bGVzKCl7dmFyIHQ7aWYoISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDM5NiIpKXtmb3IodmFyIGU9dF9hbmltYXRlX19nZXRCcmVha3BvaW50c0FycigpLGE9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWludXAiXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWluZG93biJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5sZWZ0Il0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnJpZ2h0Il0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29tb3V0Il0ge29wYWNpdHk6IDA7LXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07dHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtOy13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xOSwgMSwgMC4yMiwgMSk7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO30nLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIi50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9ImZhZGVpbnVwIl0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLScraS5taW5SZXMrJz0iZmFkZWluZG93biJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9ImZhZGVpbmxlZnQiXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJmYWRlaW5yaWdodCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9Inpvb21pbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9Inpvb21vdXQiXSB7b3BhY2l0eTogMDstd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHksIHRyYW5zZm9ybTt0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAxczt0cmFuc2l0aW9uLWR1cmF0aW9uOiAxczstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xOSwgMSwgMC4yMiwgMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE5LCAxLCAwLjIyLCAxKTstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47fX0nKX1hKz0nLnQzOTYgLnQtdGl0bGUudC1hbmltYXRlIHstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDEuMnM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMS4yczt9LnQzOTYgLnQtZGVzY3IudC1hbmltYXRlLC50Mzk2IC50LXVwdGl0bGUudC1hbmltYXRlLC50Mzk2IC50LXN1YnRpdGxlLnQtYW5pbWF0ZSwudDM5NiAudC10ZXh0LnQtYW5pbWF0ZSB7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjdzO3RyYW5zaXRpb24tZHVyYXRpb246IDAuN3M7fS50Mzk2IC50LWl0ZW0udC1hbmltYXRlIHstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMC41czt9LnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbiJdIHtvcGFjaXR5OiAwO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbiJdIHtvcGFjaXR5OiAwO3RyYW5zZm9ybTogbm9uZTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW4iXSB7b3BhY2l0eTogMTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWluIl0ge29wYWNpdHk6IDE7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnVwIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbnVwIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW51cCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWludXAiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmRvd24iXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC0xMDBweCk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW5kb3duIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMTAwcHgpO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmRvd24iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbmRvd24iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDBweCwgMCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoMTAwcHgsIDApO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlubGVmdCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDEwMHB4LCAwKTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDBweCwgMCk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlubGVmdCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9fScpfWErPScudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlucmlnaHQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIDApO3RyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDBweCwgMCk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW5yaWdodCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDBweCwgMCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwMHB4LCAwKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5yaWdodCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlucmlnaHQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdIHstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC45KTt0cmFuc2Zvcm06IHNjYWxlKDAuOSk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29taW4iXSB7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuOSk7dHJhbnNmb3JtOiBzY2FsZSgwLjkpO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTt0cmFuc2Zvcm06IHNjYWxlKDEpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29taW4iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7dHJhbnNmb3JtOiBzY2FsZSgxKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iem9vbW91dCJdIHstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4yKTt0cmFuc2Zvcm06IHNjYWxlKDEuMik7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29tb3V0Il0gey13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjIpO3RyYW5zZm9ybTogc2NhbGUoMS4yKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29tb3V0Il0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO3RyYW5zZm9ybTogc2NhbGUoMSk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9Inpvb21vdXQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7dHJhbnNmb3JtOiBzY2FsZSgxKTt9fScpfWErPSIudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLWRpc3RhbmNlXSwudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXNjYWxlXXstd2Via2l0LXRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O3RyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O30iO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1kaXN0YW5jZS1yZXMtIitpLm1pblJlcysiXSwjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9Inpvb21vdXQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt9fScpfXZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksbz1kb2N1bWVudC5oZWFkfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoZWFkIik7ci50ZXh0Q29udGVudD1hLG8uYXBwZW5kQ2hpbGQocil9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0QnJlYWtwb2ludHNBcnIoKXt2YXIgdD1bXSxlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yW2RhdGEtcmVjb3JkLXR5cGU9IjM5NiJdOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCcpKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbihlKXtpZihlLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQiKSl7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtc2NyZWVucyIpLG49KGE9KGE9YT9hLnNwbGl0KCIsIik6WzEyMDAsOTYwLDY0MCw0ODAsMzIwXSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VJbnQodCwxMCl9KSkpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuLTE9PT10LmluZGV4T2YoZSl9KSk7dD10LmNvbmNhdChuKX19KSksdD10X2FuaW1hdGVfX3NvcnRBcnIodCl9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KHQsZSl7dmFyIGE9IiIsbj0hMSxpPXRbZSsxXSxyPXRbZV0tMSxvPWU9PT10Lmxlbmd0aC0xLHM9ZT09PXQubGVuZ3RoLTI7cmV0dXJuIG8/bj0hMDphKz1zPyJAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAiK3IrInB4KSB7IjoiQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogIitpKyJweCkgYW5kIChtYXgtd2lkdGg6ICIrcisicHgpIHsiLHt0ZXh0OmEsaXNDb250aW51ZTpuLG1pblJlczppfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NvcnRBcnIodCl7cmV0dXJuIHQuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS10fSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc3RhcnRBbmltYXRpb24oKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuciIpLGU9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHQsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVbZGF0YS1hbmltYXRlLWdyb3VwPXllc10iKX0pKSxhPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCh0LChmdW5jdGlvbih0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj0ieWVzIl0nKX0pKSxuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKTtpZihuPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChuLChmdW5jdGlvbih0KXtyZXR1cm4hKCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1ncm91cCIpfHwieWVzIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtY2hhaW4iKXx8dC5nZXRBdHRyaWJ1dGUoIm9ic2VydmVyLXJlYWR5IikpfSkpLHdpbmRvdy5pbm5lcldpZHRoPDEyMDAmJihlPXRfYW5pbWF0ZV9fY2hlY2tNb2JpbGUoZSksYT10X2FuaW1hdGVfX2NoZWNrTW9iaWxlKGEpLG49dF9hbmltYXRlX19jaGVja01vYmlsZShuKSksZS5sZW5ndGh8fG4ubGVuZ3RofHxhLmxlbmd0aCl7dF9hbmltYXRlX19zZXRBbmltYXRpb25TdGF0ZShlLGEsbiksZT10X2FuaW1hdGVfX2hhc1dhaXRBbmltYXRpb24oZSksbj10X2FuaW1hdGVfX2hhc1dhaXRBbmltYXRpb24obiksYT10X2FuaW1hdGVfX2hhc1dhaXRBbmltYXRpb24oYSk7dmFyIGk9InVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3ImJi9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKihzYWZhcml8bW9iaWxlKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJi8ob3MgfHZlcnNpb25cLykxNSgufF8pWzQtOV0vaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKCJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3cmJiFpKXtpZihlLmxlbmd0aCl7dmFyIHI9W107ZS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGUiKSxhLG47aWYoImZhZGVpbmRvd24iPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdHlsZSIpJiZlLmNsb3Nlc3QoIi50LWNvdmVyIikpe3ZhciBpPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZTpub3QoOmZpcnN0LWNoaWxkKSIpO2kmJihlPWkpfXIucHVzaChlKX0pKSxyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXtyb290TWFyZ2luOnQub2Zmc2V0SGVpZ2h0LzUqLTErInB4IDBweCJ9LGE7bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbih0LGUpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodC5pc0ludGVyc2VjdGluZyl7dmFyIGE9dC50YXJnZXQ7ZS51bm9ic2VydmUoYSk7dmFyIG49YS5jbG9zZXN0KCIuciIpLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKTtuPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChuLChmdW5jdGlvbih0KXtyZXR1cm4hKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIil8fCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpKX0pKSx0X2FuaW1hdGVfX21ha2VTZWN0aW9uQnV0dG9uV2FpdChhKSx0X2FuaW1hdGVfX3NhdmVTZWN0aW9uSGVhZGVyU3RhcnRUaW1lKGEpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITEpfSkpfX0pKX0pLGUpLm9ic2VydmUodCl9KSl9dmFyIG87aWYobi5sZW5ndGgmJm4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9e30sYT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwidHJpZ2dlci1vZmZzZXQiKTthJiYoZS5yb290TWFyZ2luPSIwcHggMHB4ICIrLTEqYS5yZXBsYWNlKCJweCIsIiIpKyJweCAwcHgiKTt2YXIgbj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKHQsZSl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgYT10LnRhcmdldDtpZighYS5kZW1hbmRUcmFuc2Zvcm0mJmEuc3R5bGUudHJhbnNmb3JtKWEuZGVtYW5kVHJhbnNmb3JtPWEuc3R5bGUudHJhbnNmb3JtLGEuc3R5bGUudHJhbnNmb3JtPSJ1bnNldCI7ZWxzZXt2YXIgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS50cmFuc2Zvcm07YS5zdHlsZS50cmFuc2Zvcm18fCJub25lIj09PW58fChhLmRlbWFuZFRyYW5zZm9ybT1uLGEuc3R5bGUudHJhbnNmb3JtPSJ1bnNldCIpfWlmKHQuaXNJbnRlcnNlY3Rpbmcpe2EuY2xvc2VzdCgiLnQxMDkzIil8fGUudW5vYnNlcnZlKGEpO3ZhciBpPWEuc3R5bGUudHJhbnNpdGlvbkRlbGF5fHwiMG1zIjtpPS0xIT09aS5pbmRleE9mKCJtcyIpP3BhcnNlSW50KGkpKzI1MDoxZTMqcGFyc2VGbG9hdChpKSsyNTA7dmFyIHI9ZnVuY3Rpb24gdCgpe2EuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX3dhaXQiKSx0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKGEpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyhhLCEwKSwiYW5pbWF0ZWRudW1iZXIiPT09dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKGEsInN0eWxlIikmJnRfYW5pbWF0ZV9fYW5pbWF0ZU51bWJlcnMoYSl9O2EuZGVtYW5kVHJhbnNmb3JtJiYtMSE9PWEuZGVtYW5kVHJhbnNmb3JtLmluZGV4T2YoIm1hdHJpeCIpJiYoYS5zdHlsZS50cmFuc2Zvcm09IiIpLGEuZGVtYW5kVHJhbnNmb3JtJiYidW5zZXQiPT09YS5zdHlsZS50cmFuc2Zvcm0mJihhLnN0eWxlLnRyYW5zZm9ybT1hLmRlbWFuZFRyYW5zZm9ybSxkZWxldGUgYS5kZW1hbmRUcmFuc2Zvcm0pLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cigpfSksaSl9fSkpfSksZSk7dC5kYXRhc2V0Lm9ic2VydmVyUmVhZHk9ITAsbi5vYnNlcnZlKHQpfSkpLGEubGVuZ3RoKShvPWZ1bmN0aW9uIHQoKXt0X2FuaW1hdGVfX2dldENoYWluT2Zmc2V0cyhhKX0pKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtvKCl9KSkpLHNldEludGVydmFsKG8sNWUzKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3ZhciB0LGU9d2luZG93LnBhZ2VZT2Zmc2V0K3dpbmRvdy5pbm5lckhlaWdodDt0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbnNCbG9ja3MoYSxlKX0pKSl9ZWxzZXt2YXIgbzsobz1mdW5jdGlvbiB0KCl7dF9hbmltYXRlX19nZXRHcm91cHNPZmZzZXRzKGUpLHRfYW5pbWF0ZV9fZ2V0Q2hhaW5PZmZzZXRzKGEpLHRfYW5pbWF0ZV9fZ2V0RWxlbXNPZmZzZXRzKG4pfSkoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKG8pKSxzZXRJbnRlcnZhbChvLDVlMyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2YXIgdD10X2FuaW1hdGVfX2RlbGV0ZUFuaW1hdGVkRWxzKGUsbik7bj10WzBdO3ZhciBpPXRfYW5pbWF0ZV9fYW5pbWF0ZU9uU2Nyb2xsKGU9dFsxXSxhLG4pO2kmJmkubGVuZ3RoJiYoZT1pWzBdLGE9aVsxXSxuPWlbMl0pfSkpKX1BcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtcG9wdXAiKTtlJiZlLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cucGFnZVlPZmZzZXQrd2luZG93LmlubmVySGVpZ2h0O2lmKGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGUiKSYmInllcyI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIil8fGUucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpKXt2YXIgYT1bZV07dF9hbmltYXRlX19zZXRBbmltYXRpb25TdGF0ZUNoYWlucyhhKSx0X2FuaW1hdGVfX2dldENoYWluT2Zmc2V0cyhhPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLChmdW5jdGlvbih0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlX3dhaXQiKX0pKSksdF9hbmltYXRlX19hbmltYXRlQ2hhaW5zQmxvY2tzKGEsdCl9fSkpKX0pKX19ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlT25TY3JvbGwodCxlLGEpe2lmKHQubGVuZ3RofHxlLmxlbmd0aHx8YS5sZW5ndGgpe3ZhciBuPXdpbmRvdy5wYWdlWU9mZnNldCxpPW4rd2luZG93LmlubmVySGVpZ2h0LHIsbyxzO3JldHVyblt0X2FuaW1hdGVfX2FuaW1hdGVHcm91cHModCxpLG4pLHRfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluc0Jsb2NrcyhlLGksbiksdF9hbmltYXRlX19hbmltYXRlRWxlbXMoYSxpLG4pXX19ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlR3JvdXBzKHQsZSl7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodC5jdXJUb3BPZmZzZXQ8ZSl7dmFyIGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7YT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSwoZnVuY3Rpb24odCl7cmV0dXJuISh0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpfHwieWVzIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtY2hhaW4iKSl9KSksdF9hbmltYXRlX19tYWtlU2VjdGlvbkJ1dHRvbldhaXQodCksdF9hbmltYXRlX19zYXZlU2VjdGlvbkhlYWRlclN0YXJ0VGltZSh0KSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX3dhaXQiKSx0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKHQpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCExKX0pKX19KSksdH1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbnNCbG9ja3ModCxlKXtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt0Lml0ZW1zT2Zmc2V0c1swXTxlJiZ0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfd2FpdCIpLmxlbmd0aCYmKHRfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluSXRlbXNPblNjcm9sbCh0LGUpLHQuaXRlbXNPZmZzZXRzLmxlbmd0aCYmdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb25fX291dE9mVHVybih0KSl9KSksdH1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVFbGVtcyh0LGUsYSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgbj10X2FuaW1hdGVfX2RldGVjdEVsZW1UcmlnZ2VyT2Zmc2V0KHQsZSk7cmV0dXJuIHQuY3VyVG9wT2Zmc2V0PG4/KHQuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX3dhaXQiKSx0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKHQpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCExKSwiYW5pbWF0ZWRudW1iZXIiPT09dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInN0eWxlIikmJnRfYW5pbWF0ZV9fYW5pbWF0ZU51bWJlcnModCksITApOiEodC5jdXJUb3BPZmZzZXQ8YSkmJnZvaWQgMH0pKSx0fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZGVsZXRlQW5pbWF0ZWRFbHModCxlKXt2YXIgYT13aW5kb3cucGFnZVlPZmZzZXQsbj1bXSxpPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHQuY3VyVG9wT2Zmc2V0PD1hKXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCxbIndhaXQiLCJuby1ob3ZlciJdKX0pKX1lbHNlIG4ucHVzaCh0KX0pKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY3VyVG9wT2Zmc2V0PD1hPyh0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsWyJ3YWl0Iiwibm8taG92ZXIiXSksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITEpKTppLnB1c2godCl9KSksW2ksbl19ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlQ2hhaW5JdGVtc09uU2Nyb2xsKHQsZSl7dmFyIGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX3dhaXRbZGF0YS1hbmltYXRlLWNoYWluPXllc10iKTthPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpO3ZhciBuPTAsaT0wLHI9dC5pdGVtc09mZnNldHNbMF0sbz0uMTYscz10X2FuaW1hdGVfX2dldERlbGF5RnJvbVByZXZpb3VzU2Nyb2xsRXZlbnQodCxvKSxsPXRfYW5pbWF0ZV9fZ2V0U2VjdGlvbkhlYWREZWFseSh0KTthLmxlbmd0aCYmYVswXS5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX2NoYWluX2ZpcnN0LWluLXJvdyIpO2Zvcih2YXIgbT0wO208YS5sZW5ndGg7bSsrKXt2YXIgYz1hW21dLF89dC5pdGVtc09mZnNldHNbbV07aWYoIShfPGUpKWJyZWFrO18hPT1yJiYoYy5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX2NoYWluX2ZpcnN0LWluLXJvdyIpLG49KytpLHI9Xyk7dmFyIGY9bipvK3MrbDtjLnN0eWxlLnRyYW5zaXRpb25EZWxheT1mKyJzIixjLmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKGMsITEpLGMuc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIsRGF0ZS5ub3coKSsxZTMqZiksY1swXT09PWFbYS5sZW5ndGgtMV0mJnRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uKHQsZiksK189PStyJiZuKyssYS5zcGxpY2UobSwxKSx0Lml0ZW1zT2Zmc2V0cy5zcGxpY2UobSwxKSxtLS19dF9hbmltYXRlX19jYXRjaFRyYW5zaXRpb25FbmRFdmVudCh0KX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldFNlY3Rpb25IZWFkRGVhbHkodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1zZWN0aW9uX190aXRsZS50LWFuaW1hdGUiKSxhPXQucXVlcnlTZWxlY3RvcigiLnQtc2VjdGlvbl9fZGVzY3IudC1hbmltYXRlIiksbj0wO2lmKGUpe3ZhciBpPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIpfHwwO2lmKERhdGUubm93KCktaTw9MTYwKXJldHVybiBuPS4xNn1pZihhKXt2YXIgcj1hLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiKXx8MDtpZihEYXRlLm5vdygpLXI8PTE2MClyZXR1cm4gbj0uMTZ9cmV0dXJuIG59ZnVuY3Rpb24gdF9hbmltYXRlX19nZXREZWxheUZyb21QcmV2aW91c1Njcm9sbEV2ZW50KHQsZSl7dmFyIGE9IXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV9zdGFydGVkIikubGVuZ3RoLG49dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3cudC1hbmltYXRlX3N0YXJ0ZWQiKTtpZihuPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChuLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9fY2hhaW5fc2hvd2VkIil9KSksYXx8IW4ubGVuZ3RoKXJldHVybiAwO2lmKG4ubGVuZ3RoKXt2YXIgaSxyLG89KG5bbi5sZW5ndGgtMV0uZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIpfHwwKS1EYXRlLm5vdygpO3JldHVybiBvPD0wP2U6by8xZTMrZX19ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsZSl7aWYodCl7aWYoZSl7dmFyIGE9InQtYW5pbWF0ZS1mb3Itd3JhcHBlciIsbj10LmNsb3Nlc3QoIi4iK2EpO24mJm4uY2xhc3NMaXN0LnJlbW92ZShhKX12YXIgaTtpZih0LmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9zdGFydGVkIiksImZhZGVpbmxlZnQiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdHlsZSIpKXt2YXIgcj10LmNsb3Nlc3QoIi50LWFuaW1hdGVfX292ZXJmbG93LXgtaGlkZGVuIik7ciYmIXIucXVlcnlTZWxlY3RvcignW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdOm5vdCgudC1hbmltYXRlX3N0YXJ0ZWQpJykmJnIuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX19vdmVyZmxvdy14LWhpZGRlbiIpfX19ZnVuY3Rpb24gdF9hbmltYXRlX19jYXRjaFRyYW5zaXRpb25FbmRFdmVudCh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfX2NoYWluX2ZpcnN0LWluLXJvdy50LWFuaW1hdGVfc3RhcnRlZCIpO2U9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX19jaGFpbl9zaG93ZWQiKX0pKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKHQpe3ZhciBlO1sidHJhbnNpdGlvbmVuZCIsIndlYmtpdFRyYW5zaXRpb25FbmQiLCJvVHJhbnNpdGlvbkVuZCIsIm90cmFuc2l0aW9uZW5kIiwiTVNUcmFuc2l0aW9uRW5kIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5hZGRFdmVudExpc3RlbmVyKGUsKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19hZGRFdmVudE9uQW5pbWF0ZUNoYWluKHQpfSkpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLChmdW5jdGlvbigpe3RfYW5pbWF0ZV9fYWRkRXZlbnRPbkFuaW1hdGVDaGFpbih0KX0pKX0pKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3BhcnNlTnVtYmVyVGV4dCgpe3ZhciB0PXdpbmRvdy5wYWdlWU9mZnNldCxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSdhbmltYXRlZG51bWJlciddIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbihlKXt2YXIgYSxuPSIiLGk9ZS5xdWVyeVNlbGVjdG9yQWxsKCJzcGFuIik7aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXtuKz10LmdldEF0dHJpYnV0ZSgic3R5bGUiKXx8IiIsdC5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIiksdC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtcmVkYWN0b3Itc3R5bGUiKX0pKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdltkYXRhLWN1c3RvbXN0eWxlPSJ5ZXMiXScpLmxlbmd0aCl7dmFyIHI9ZS5xdWVyeVNlbGVjdG9yKCdkaXZbZGF0YS1jdXN0b21zdHlsZT0ieWVzIl0nKTthPXI/ci5pbm5lckhUTUw6IiI7dmFyIG89ZS5nZXRBdHRyaWJ1dGUoInN0eWxlIil8fCIiLHM9ZS5xdWVyeVNlbGVjdG9yKCJkaXZbZGF0YS1jdXN0b21zdHlsZV0iKSxsPXM/cy5nZXRBdHRyaWJ1dGUoInN0eWxlIik6IiI7bCYmKG8rPWwpLGUuc2V0QXR0cmlidXRlKCJzdHlsZSIsbyl9ZWxzZSBhPWUuaW5uZXJIVE1MO2lmKG49bi5zcGxpdCgiOyIpLmZpbHRlcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5zcGxpdCgiOyIpLmluZGV4T2YodCk9PT1lfSkpLmpvaW4oIjsiKSwhKGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDx0LTUwMCkmJmEubGVuZ3RoKXt2YXIgbT1hLnJlcGxhY2UoLzxicj4vZywiICIpLnJlcGxhY2UoL1teXGQuLCBdKy9nLCIiKS5yZXBsYWNlKC8gKFwufCwpL2csIiIpLnJlcGxhY2UoLyhcZCkoPz1cZCkgL2csIiQxIikudHJpbSgpLGM9bTtpZigtMT09PWEuaW5kZXhPZihtKSYmKGM9bT1tLnNwbGl0KCIgIilbMF0pLCIiIT09bSl7ZS5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1udW1iZXItY291bnQiLGEpLHRfYW5pbWF0ZV9fY2hhbmdlTnVtYmVyT25aZXJvKGUsYS5yZXBsYWNlKGMsIm51bSIpKTt2YXIgXz1lLnF1ZXJ5U2VsZWN0b3JBbGwoInNwYW4iKTtfPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChfLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoIi50LWFuaW1hdGVfX251bWJlciIpfSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoXywoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoInN0eWxlIixuKX0pKX19fSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hhbmdlTnVtYmVyT25aZXJvKHQsZSl7dC5pbm5lckhUTUw9ZS5yZXBsYWNlKC9udW0vZywnPHNwYW4gY2xhc3M9InQtYW5pbWF0ZV9fbnVtYmVyIj4wPC9zcGFuPicpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZU51bWJlcnModCl7aWYoIXQpcmV0dXJuITE7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1udW1iZXItY291bnQiKSxhPVtdLG49dC5xdWVyeVNlbGVjdG9yQWxsKCJzcGFuIik7KG49QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygiLnQtYW5pbWF0ZV9fbnVtYmVyIil9KSkpLmxlbmd0aCYmKGE9blswXS5nZXRBdHRyaWJ1dGUoInN0eWxlIil8fCIiKTt2YXIgaT1bXSxyPW51bGw7aWYoZSl7cj1lLm1hdGNoKC9cZCtcLlxkK3xcZCssXGQrL2cpO3ZhciBvPWUubWF0Y2goL1xkKy9nKSxzLGw7ZS5yZXBsYWNlKC8oXGQpKD89IFxkKSAvZywiJDEiKS5zcGxpdCgiICIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lzTmFOKHBhcnNlSW50KHQucmVwbGFjZSgvW15cZC4sIF0rL2csIiIpLDEwKSl8fGkucHVzaCh0LnJlcGxhY2UoL1teXGQuLCBdKy9nLCIiKSl9KSl9dmFyIG09MCxjPSExLF89ITE7dC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1udW1iZXItY291bnQiKSxudWxsIT09ciYmKF89LTEhPT1yWzBdLmluZGV4T2YoIiwiKSksaS5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3ZhciBhO251bGwhPT1yJiYoLTEhPT10LmluZGV4T2YoIiwiKSYmKGE9dC5zcGxpdCgiLCIpKSwtMSE9PXQuaW5kZXhPZigiLiIpJiYoYT10LnNwbGl0KCIuIikpLC0xPT09dC5pbmRleE9mKCIsIikmJi0xPT09dC5pbmRleE9mKCIuIil8fChtPWFbMV0ubGVuZ3RoLGlbZV09K2Euam9pbigiLiIpLGM9ITApKX0pKTt2YXIgZj10LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVfX251bWJlciIpO2lmKGlbMF0pe3ZhciBkPU51bWJlcihpWzBdKXx8MCx1PTAseT1NYXRoLnBvdygxMCxtKTtjJiYoZCo9eSx1Kj15KTt2YXIgaD0xMixwPTAsZz1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtpZih1Kz1kLzEwOCxwPWM/KE1hdGgucm91bmQodSkveSkudG9GaXhlZChtKSsiIjpNYXRoLmZsb29yKHUpKyIiLG8ubGVuZ3RoPjEmJihwPXAucmVwbGFjZSgvKFxkKSg/PShcZHszfSkrKFteXGRdfCQpKS9nLCIkMSAiKSksXyYmKHA9cC5yZXBsYWNlKC9cLi9nLCIsIikpLGYmJihmLnRleHRDb250ZW50PXApLHU+PWQpe2NsZWFySW50ZXJ2YWwoZyksdC5pbm5lckhUTUw9ZTt2YXIgbj10LnF1ZXJ5U2VsZWN0b3JBbGwoInNwYW4iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJzdHlsZSIsYSl9KSl9fSksaCl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0QW5pbWF0aW9uU3RhdGUodCxlLGEpe3ZhciBuPXdpbmRvdy5wYWdlWU9mZnNldCxpPW4rd2luZG93LmlubmVySGVpZ2h0O3RfYW5pbWF0ZV9fc2V0R3JvdXBzQmxvY2tzU3RhdGUodCxuLGkpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dF9hbmltYXRlX19hc3NpZ25DaGFpbkRlbGF5KHQsaSxuKSx0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbl9fb3V0T2ZUdXJuKHQpfSkpLHRfYW5pbWF0ZV9fc2V0QW5pbUVMZW1zU3RhdGUoYSxuLGkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUodF9hbmltYXRlX19yZW1vdmVJbmxpbmVBbmltU3R5bGVzKSl9ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRBbmltRUxlbXNTdGF0ZSh0LGUsYSl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7aWYobjxlLTUwMClyZXR1cm4gdF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCJuby1ob3ZlciIpLCJhbmltYXRlZG51bWJlciI9PT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic3R5bGUiKSYmdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyh0KSwhMDt2YXIgaT10X2FuaW1hdGVfX2RldGVjdEVsZW1UcmlnZ2VyT2Zmc2V0KHQsYSk7dF9hbmltYXRlX19zZXRDdXN0b21BbmltU2V0dGluZ3ModCxuLGEpLG48aSYmIXQuY2xvc2VzdCgiLnQxMDkzIikmJih0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKHQpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCEwKSwiYW5pbWF0ZWRudW1iZXIiPT09dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInN0eWxlIikmJnRfYW5pbWF0ZV9fYW5pbWF0ZU51bWJlcnModCkpLChuPj1pfHx0LmNsb3Nlc3QoIi50MTA5MyIpKSYmdC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfd2FpdCIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0R3JvdXBzQmxvY2tzU3RhdGUodCxlLGEpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7bj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuISgieWVzIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtY2hhaW4iKSl9KSk7dmFyIGk9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0O3RfYW5pbWF0ZV9fcmVtb3ZlQW5pbUZyb21IaWRkZW5TbGlkZXModCk7dmFyIHI9dF9hbmltYXRlX19hc3NpZ25TZWN0aW9uRGVsYXkodCk7dF9hbmltYXRlX19hc3NpZ25Hcm91cERlbGF5KHQsciksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbihuKXt2YXIgcj1uLmNsb3Nlc3QoIi50Mzk3X19vZmYiKXx8bi5jbG9zZXN0KCIudDM5NV9fb2ZmIil8fG4uY2xvc2VzdCgiLnQ0MDBfX29mZiIpO2lmKG4uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfbm8taG92ZXIiKSYmciYmbi5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfbm8taG92ZXIiKSxpPD1lLTEwMClyZXR1cm4gdF9hbmltYXRlX19zYXZlU2VjdGlvbkhlYWRlclN0YXJ0VGltZSh0KSx0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKG4sIm5vLWhvdmVyIiksbi5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IiIsITA7aTxhJiZpPmUtMTAwJiYodF9hbmltYXRlX19tYWtlU2VjdGlvbkJ1dHRvbldhaXQodCksbi5jbGFzc0xpc3QuY29udGFpbnMoIi50LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIil8fCh0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKG4pLHI/bi5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfd2FpdCIpOnRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyhuLCExKSkpLGk+PWEmJm4uY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3dhaXQiKX0pKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlQ2hhaW5zKHQpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuITE7dmFyIGU9d2luZG93LnBhZ2VZT2Zmc2V0LGE9ZSt3aW5kb3cuaW5uZXJIZWlnaHQ7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt0X2FuaW1hdGVfX2Fzc2lnbkNoYWluRGVsYXkodCxhLGUpLHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uX19vdXRPZlR1cm4odCl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19hc3NpZ25TZWN0aW9uRGVsYXkodCl7dmFyIGU9MCxhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fdGl0bGUudC1hbmltYXRlIiksbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX2Rlc2NyLnQtYW5pbWF0ZSIpO3JldHVybiBhLmxlbmd0aCYmKGU9LjE2KSxuLmxlbmd0aCYmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9ZSsicyJ9KSksZSs9LjE2KSxlfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYXNzaWduR3JvdXBEZWxheSh0LGUpe3ZhciBhPTA7aWYodC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1hbmltYXRlLW9yZGVyXSIpLmxlbmd0aCl0X2FuaW1hdGVfX2Fzc2lnbk9yZGVyZWRFbGVtc0RlbGF5KHQsZSk7ZWxzZXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWltZy50LWFuaW1hdGUiKSxpPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtdXB0aXRsZS50LWFuaW1hdGUiKSxyPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtdGl0bGUudC1hbmltYXRlIik7cj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwociwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNlY3Rpb25fX3RpdGxlIil9KSk7dmFyIG89dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1kZXNjci50LWFuaW1hdGUiKTtvPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChvLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2VjdGlvbl9fZGVzY3IiKX0pKTt2YXIgcz10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWJ0bi50LWFuaW1hdGUsIC50LWJ0bndyYXBwZXIudC1hbmltYXRlIik7cz1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwocywoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xvc2VzdCgiLnQtc2VjdGlvbl9fYm90dG9td3JhcHBlciIpfSkpO3ZhciBsPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtdGltZXIudC1hbmltYXRlIiksbT10LnF1ZXJ5U2VsZWN0b3JBbGwoImZvcm0udC1hbmltYXRlIik7bi5sZW5ndGgmJihhPS41KSxyLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSxyLmxlbmd0aCYmKGErPS4zKSxvLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSxvLmxlbmd0aCYmKGErPS4zKSxpLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSxpLmxlbmd0aCYmKGErPS4zKSwoaS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aCkmJihhKz0uMiksbC5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksbC5sZW5ndGgmJihhKz0uNSkscy5sZW5ndGgmJihzWzBdLnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIiksMj09PXMubGVuZ3RoJiYoYSs9LjQpLDI9PT1zLmxlbmd0aCYmKHNbMV0uc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMiKSwwIT09bS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobSwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYXNzaWduT3JkZXJlZEVsZW1zRGVsYXkodCxlKXt2YXIgYT0wO2UmJihhPWUpO3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjEiXScpLGk9dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iMiJdJykscj10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSIzIl0nKSxvPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjQiXScpLHM9dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iNSJdJyksbD10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI2Il0nKSxtPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjciXScpLGM9dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iOCJdJyksXz10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI5Il0nKTtuLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSxuLmxlbmd0aCYmaS5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShpWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGgpJiZyLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHJbMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aHx8ci5sZW5ndGgpJiZvLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKG9bMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RoKSYmcy5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShzWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocywoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aHx8cy5sZW5ndGgpJiZsLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKGxbMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RofHxzLmxlbmd0aHx8bC5sZW5ndGgpJiZtLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKG1bMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RofHxzLmxlbmd0aHx8bC5sZW5ndGh8fG0ubGVuZ3RoKSYmYy5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShjWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYywoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aHx8cy5sZW5ndGh8fGwubGVuZ3RofHxtLmxlbmd0aHx8Yy5sZW5ndGgpJiZfLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKF9bMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChfLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSl9ZnVuY3Rpb24gdF9hbmltYXRlX19hc3NpZ25DaGFpbkRlbGF5KHQsZSxhKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVbZGF0YS1hbmltYXRlLWNoYWluPXllc10iKSxpPTA7aWYobi5sZW5ndGgpe3ZhciByPW5bMF0sbz1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7ci5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX2NoYWluX2ZpcnN0LWluLXJvdyIpO3ZhciBzPXRfYW5pbWF0ZV9fZ2V0Q3VyQmxvY2tTZWN0aW9uSGVhZERlbGF5KHQpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24obCl7dmFyIG09bC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0O2lmKG08YSlyZXR1cm4gdF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyhsLCIiKSwhMDtpZihtPGUpe20hPT1vJiYobC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX2NoYWluX2ZpcnN0LWluLXJvdyIpLG89bSk7dmFyIGM9LjE2KmkrcyxfO2wuc3R5bGUudHJhbnNpdGlvbkRlbGF5PWMrInMiLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyhsLCExKSxsLnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiLERhdGUubm93KCkrMWUzKmMpLHI9PT1uW24ubGVuZ3RoLTFdJiZ0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbih0LGMpLGkrKyxbInRyYW5zaXRpb25lbmQiLCJ3ZWJraXRUcmFuc2l0aW9uRW5kIiwib1RyYW5zaXRpb25FbmQiLCJvdHJhbnNpdGlvbmVuZCIsIk1TVHJhbnNpdGlvbkVuZCJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe2wuYWRkRXZlbnRMaXN0ZW5lcih0LChmdW5jdGlvbigpe3RfYW5pbWF0ZV9fYWRkRXZlbnRPbkFuaW1hdGVDaGFpbihsKX0pKSxsLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4obCl9KSl9KSl9ZWxzZSBsLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV93YWl0Iil9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LGUpe3ZhciBhLG49dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKTtpZighbilyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS0iK2UpO3ZhciBpLHI9ImFiIituLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG8scyxsO3ZvaWQgMCE9PXdpbmRvdy50bltyXT8obz13aW5kb3cudG5bcl0uY3VyUmVzb2x1dGlvbixzPXdpbmRvdy50bltyXS5jdXJSZXNvbHV0aW9uX21heCxsPXdpbmRvdy50bltyXS5zY3JlZW5zLnNsaWNlKCkpOihvPXdpbmRvdy50bi5jdXJSZXNvbHV0aW9uLHM9MTIwMCxsPVszMjAsNDgwLDY0MCw5NjAsMTIwMF0pO3ZhciBtPXQuY2xvc2VzdCgiLnQzOTZfX2VsZW0sIC50Mzk2X19ncm91cCIpLGM9bSYmbS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1tb2JpbGUiKTtpZihvPT09cylhPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIitlKTtlbHNle2lmKCJ5IiE9PWMmJm88MTIwMClyZXR1cm4gdC5zdHlsZS50cmFuc2l0aW9uPSJub25lIixudWxsO2E9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS0iK2UrIi1yZXMtIitvKX1pZighYSYmIiIhPT1hKWZvcih2YXIgXz0wO188bC5sZW5ndGg7XysrKXt2YXIgZj1sW19dO2lmKCEoZjw9bykmJihhPWY9PT1zP3QuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIitlKTp0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSsiLXJlcy0iK2YpKSlicmVha31yZXR1cm4gYX1mdW5jdGlvbiB0X2FuaW1hdGVfX2hhc1dhaXRBbmltYXRpb24odCl7cmV0dXJuIHQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV93YWl0Iil8fHQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZV93YWl0Iil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19hZGRFdmVudE9uQW5pbWF0ZUNoYWluKHQpe3QuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9zaG93ZWQiKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldEN1c3RvbUFuaW1TZXR0aW5ncyh0LGUsYSl7dmFyIG49dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInN0eWxlIiksaT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwiZGlzdGFuY2UiKTtpZihpJiYiIiE9PWkpe3N3aXRjaChpPWkucmVwbGFjZSgicHgiLCIiKSx0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iMHMiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIwcyIsbil7Y2FzZSJmYWRlaW51cCI6dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKDAsIitpKyJweCwwKSI7YnJlYWs7Y2FzZSJmYWRlaW5kb3duIjp0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlM2QoMCwtIitpKyJweCwwKSI7YnJlYWs7Y2FzZSJmYWRlaW5sZWZ0Ijp0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlM2QoIitpKyJweCwwLDApIjticmVhaztjYXNlImZhZGVpbnJpZ2h0Ijp0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlM2QoLSIraSsicHgsMCwwKSJ9dF9hbmltYXRlX19mb3JjZUVsZW1JblZpZXdQb3J0UmVwYWludCh0LGUsYSksdC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IiIsdC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IiJ9dmFyIHI9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInNjYWxlIik7ciYmKHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIwcyIsdC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IjBzIix0LnN0eWxlLnRyYW5zZm9ybT0ic2NhbGUoIityKyIpIix0X2FuaW1hdGVfX2ZvcmNlRWxlbUluVmlld1BvcnRSZXBhaW50KHQsZSxhKSx0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iIix0LnN0eWxlLnRyYW5zaXRpb25EZWxheT0iIik7dmFyIG89dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsImRlbGF5Iik7byYmKHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PW8rInMiKTt2YXIgcz10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwiZHVyYXRpb24iKTtzJiYodC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249cysicyIpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcmVtb3ZlSW5saW5lQW5pbVN0eWxlcygpe2lmKHdpbmRvdy5pbm5lcldpZHRoPDk4MCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQzOTZfX2VsZW0udC1hbmltYXRlOm5vdCgudC1hbmltYXRlX3dhaXQpIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zZm9ybT0iIix0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iIix0LnN0eWxlLnRyYW5zaXRpb25EZWxheT0iIn0pKX19ZnVuY3Rpb24gdF9hbmltYXRlX19mb3JjZUVsZW1JblZpZXdQb3J0UmVwYWludCh0LGUsYSl7dCYmZTxhKzUwMCYmdC5vZmZzZXRIZWlnaHR9ZnVuY3Rpb24gdF9hbmltYXRlX19kZXRlY3RFbGVtVHJpZ2dlck9mZnNldCh0LGUpe3ZhciBhPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJ0cmlnZ2VyLW9mZnNldCIpLG49ZTtyZXR1cm4gYSYmKG49ZS0xKihhPWEucmVwbGFjZSgicHgiLCIiKSkpLG59ZnVuY3Rpb24gdF9hbmltYXRlX19zYXZlU2VjdGlvbkhlYWRlclN0YXJ0VGltZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX3RpdGxlLnQtYW5pbWF0ZSIpLGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX19kZXNjci50LWFuaW1hdGUiKTtlLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiLERhdGUubm93KCkpfSkpLGEubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIsRGF0ZS5ub3coKSsxNjApfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0Q3VyQmxvY2tTZWN0aW9uSGVhZERlbGF5KHQpe3ZhciBlPTA7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fdGl0bGUudC1hbmltYXRlIikubGVuZ3RoJiYoZSs9LjE2KSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX2Rlc2NyLnQtYW5pbWF0ZSIpLmxlbmd0aCYmKGUrPS4xNiksZX1mdW5jdGlvbiB0X2FuaW1hdGVfX21ha2VTZWN0aW9uQnV0dG9uV2FpdCh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVbZGF0YS1hbmltYXRlLWNoYWluPXllc10iKS5sZW5ndGgsYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX2JvdHRvbXdyYXBwZXIgLnQtYnRuLnQtYW5pbWF0ZSIpO2UubGVuZ3RoJiZhLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbih0LGUpe3ZhciBhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKTthLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1lKy4xNisicyIsdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0LmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb25fX291dE9mVHVybih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVbZGF0YS1hbmltYXRlLWNoYWluPXllc10iKSxhOyhlPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9zdGFydGVkIil9KSkpLmxlbmd0aHx8dF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb24odCwuMTYpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYWRkTm9Ib3ZlckNsYXNzVG9CdG5zKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYnRuLnQtYW5pbWF0ZSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfbm8taG92ZXIiKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKHQpe2lmKCF0KXJldHVybiExO3ZhciBlPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWJ0biIpP3Q6bnVsbDtlJiYoZS5vbnRyYW5zaXRpb25lbmQ9ZnVuY3Rpb24odCl7Im9wYWNpdHkiIT09dC5wcm9wZXJ0eU5hbWUmJiJ0cmFuc2Zvcm0iIT09dC5wcm9wZXJ0eU5hbWV8fChlLmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV9uby1ob3ZlciIpLGUuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIiLGUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIiLHRoaXMub250cmFuc2l0aW9uZW5kPW51bGwpfSl9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRHcm91cHNPZmZzZXRzKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlIik7aWYoZSl7dC5jdXJUb3BPZmZzZXQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0O3ZhciBhPXRfYW5pbWF0aW9uX19nZXRab29tKHQpO3dpbmRvdy5pc09ubHlTY2FsYWJsZXx8KHQuY3VyVG9wT2Zmc2V0Kj1hKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25fX2dldFpvb20odCl7aWYodm9pZCAwIT09dC5zY2FsZUZhY3RvcilyZXR1cm4gdC5zY2FsZUZhY3Rvcjt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpO2lmKCFlKXJldHVybiAxO3ZhciBhPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMqPSJ0aWxkYS1ibG9ja3MtMi43Il0nKTtyZXR1cm4gZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkX3NjYWxlIil8fCFhJiYidW5kZWZpbmVkIiE9dHlwZW9mIHQzOTZfYWJfX2dldEZpZWxkVmFsdWUmJiJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShlLCJ1cHNjYWxlIik/d2luZG93LnRuX3NjYWxlX2ZhY3RvcjoxfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0Q2hhaW5PZmZzZXRzKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX3dhaXRbZGF0YS1hbmltYXRlLWNoYWluPXllc10iKTt0Lml0ZW1zT2Zmc2V0cz1bXSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUsYSl7dC5pdGVtc09mZnNldHNbYV09ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0fSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0RWxlbXNPZmZzZXRzKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jdXJUb3BPZmZzZXQ9d2luZG93LnBhZ2VZT2Zmc2V0K3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO3ZhciBlPXRfYW5pbWF0aW9uX19nZXRab29tKHQpO3dpbmRvdy5pc09ubHlTY2FsYWJsZXx8KHQuY3VyVG9wT2Zmc2V0Kj1lKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3JlbW92ZUFuaW1Gcm9tSGlkZGVuU2xpZGVzKHQpe3ZhciBlO2lmKHQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xpZGVzIikubGVuZ3RoKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsaWRlc19faXRlbSIpO2E9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGEsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1zbGlkZXNfX2l0ZW1fYWN0aXZlIil9KSk7dmFyIG49W107YS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGUiKTtlJiZuLnB1c2goZSl9KSksbi5mb3JFYWNoKChmdW5jdGlvbih0KXt0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsIm5vLWhvdmVyIil9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fd3JhcFRleHRXaXRoT3BhY2l0eSgpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXRpdGxlLnQtYW5pbWF0ZSwgLnQtZGVzY3IudC1hbmltYXRlLCAudC11cHRpdGxlLnQtYW5pbWF0ZSwgLnQtdGV4dC50LWFuaW1hdGUiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpO2lmKGUmJi0xIT09ZS5pbmRleE9mKCJvcGFjaXR5Iikpe3ZhciBhPXQuc3R5bGUub3BhY2l0eTtpZihhJiZhPjApe3Quc3R5bGUub3BhY2l0eT0iIjt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtuLnN0eWxlLm9wYWNpdHk9YTt2YXIgaT10LmNoaWxkTm9kZXM7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt2YXIgZT10LmNsb25lTm9kZSghMCk7bi5hcHBlbmRDaGlsZChlKX0pKSx0LmlubmVySFRNTD0iIix0LmFwcGVuZENoaWxkKG4pfX19KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja0lFKCl7dmFyIHQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsZT10LmluZGV4T2YoIk1TSUUiKSxhPSIiLG49ITE7cmV0dXJuIGU+MCYmKDghPT0oYT1wYXJzZUludCh0LnN1YnN0cmluZyhlKzUsdC5pbmRleE9mKCIuIixlKSkpKSYmOSE9PWF8fChuPSEwKSksbn0ibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP3RfYW5pbWF0ZV9faW5pdCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHRfYW5pbWF0ZV9faW5pdCk7CgpmdW5jdGlvbiB0X3BvcHVwX190cmFwRm9jdXModCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCdhLCBidXR0b24sIGlucHV0Om5vdChbdHlwZT0iaGlkZGVuIl0pOm5vdCguanMtZm9ybS1zcGVjLWNvbW1lbnRzKSwgc2VsZWN0LCB0ZXh0YXJlYSwgZW1iZWQsIHZpZGVvLCBpZnJhbWUsIFt0YWJpbmRleD0iMCJdJyksbz1lWzBdLHA9ZVtlLmxlbmd0aC0xXTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwoZnVuY3Rpb24odCl7aWYoZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtYm9keV9wb3B1cHNob3dlZCIpKXt2YXIgZT0iVGFiIj09PXQua2V5fHw5PT09dC5rZXlDb2RlLG47KGV8fGUmJnQuc2hpZnRLZXkpJiYodC5zaGlmdEtleSYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInQtcG9wdXBfc2hvdyIpJiZwLmZvY3VzKCksIlRhYiIhPT10LmtleXx8dC5zaGlmdEtleXx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PXB8fCh0LnByZXZlbnREZWZhdWx0KCksby5mb2N1cygpKSwiVGFiIj09PXQua2V5JiZ0LnNoaWZ0S2V5JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09byYmKHQucHJldmVudERlZmF1bHQoKSxwLmZvY3VzKCkpKX19KSl9ZnVuY3Rpb24gdF9wb3B1cF9fYWRkQXR0cmlidXRlc0ZvckFjY2Vzc2liaWxpdHkodCl7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmPSInK3QrJyJdJyk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0JiYodC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJidXR0b24iKSx0LnNldEF0dHJpYnV0ZSgiYXJpYS1oYXNwb3B1cCIsImRpYWxvZyIpKX0pKX1mdW5jdGlvbiB0X3BvcHVwX19yZXNpemVQb3B1cCh0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KTtpZihlKXt2YXIgbz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwX19jb250YWluZXIiKTtpZihvKXt2YXIgcD1nZXRDb21wdXRlZFN0eWxlKG8sbnVsbCksbj1wYXJzZUludChwLnBhZGRpbmdUb3ApfHwwLHI9cGFyc2VJbnQocC5wYWRkaW5nQm90dG9tKXx8MCxzPW8uY2xpZW50SGVpZ2h0LShuK3IpLGM9MTIwLHU9TnVtYmVyKGUuZ2V0QXR0cmlidXRlKCJkYXRhLXJlY29yZC10eXBlIikpLGEsaT0xMDkzPT09dXx8MTIxPT09dSYmZS5xdWVyeVNlbGVjdG9yKCIudDEwOTMiKTszNjQhPT11JiYzNjUhPT11fHwoYz0zMCksKDg2OD09PXV8fDMzMT09PXV8fDM1OD09PXV8fDEwMTM9PT11fHw3NDY9PT11fHxpKSYmKGM9MCkscz53aW5kb3cuaW5uZXJIZWlnaHQtYz9vLmNsYXNzTGlzdC5hZGQoInQtcG9wdXBfX2NvbnRhaW5lci1zdGF0aWMiKTpvLmNsYXNzTGlzdC5yZW1vdmUoInQtcG9wdXBfX2NvbnRhaW5lci1zdGF0aWMiKX19fWZ1bmN0aW9uIHRfcG9wdXBfX3Nob3dQb3B1cCh0KXt0JiYodC5zdHlsZS5kaXNwbGF5PSJibG9jayIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5mb2N1cygpO3ZhciBlPXQ/dC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cF9fY29udGFpbmVyIik6bnVsbDtlJiZlLmNsYXNzTGlzdC5hZGQoInQtcG9wdXBfX2NvbnRhaW5lci1hbmltYXRlZCIpLHQmJnQuY2xhc3NMaXN0LmFkZCgidC1wb3B1cF9zaG93IiksdF9vbkZ1bmNMb2FkKCJ0X3BvcHVwX190cmFwRm9jdXMiLChmdW5jdGlvbigpe3RfcG9wdXBfX3RyYXBGb2N1cyh0KX0pKX0pLDUwKX1mdW5jdGlvbiB0X3BvcHVwX19jbG9zZVBvcHVwKHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwLnQtcG9wdXBfc2hvdyIpLG89dC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cF9fY29udGFpbmVyIik7aWYodD09PWUpe3ZhciBwPWRvY3VtZW50LmJvZHk7cC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicG9wdXBIaWRkZW4iKSkscC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWJvZHlfcG9wdXBzaG93ZWQiKSxwLmNsYXNzTGlzdC5yZW1vdmUoInQtcXVpel9fYm9keV9wb3B1cHNob3dlZCIpfXQuY2xhc3NMaXN0LnJlbW92ZSgidC1wb3B1cF9zaG93Iiksby5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpLG8uY2xhc3NMaXN0LnJlbW92ZSgidC1wb3B1cF9fY29udGFpbmVyX25vLXRyYW5zZm9ybSIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHQ7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtcG9wdXA6bm90KC50LXBvcHVwX3Nob3cpIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJub25lIn0pKX0pLDMwMCksdF9wb3B1cF9fYWRkRm9jdXNPblRyaWdnZXJCdXR0b24oKX1mdW5jdGlvbiB0X3BvcHVwX19hZGRDbGFzc09uVHJpZ2dlckJ1dHRvbih0LGUpe3ZhciBvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXBvcHVwX190cmlnZ2VyZWQtYnRuIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtcG9wdXBfX3RyaWdnZXJlZC1idG4iKX0pKSx0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLChmdW5jdGlvbih0KXtpZigxMz09PXQua2V5Q29kZSl7dmFyIG89dC50YXJnZXQscD0hIW8uY2xvc2VzdCgnYVtocmVmPSInK2UrJyJdJykmJm87aWYoIXApcmV0dXJuO3dpbmRvdy5pc01vYmlsZXx8cC5jbGFzc0xpc3QuYWRkKCJ0LXBvcHVwX190cmlnZ2VyZWQtYnRuIil9fSkpfWZ1bmN0aW9uIHRfcG9wdXBfX2FkZEZvY3VzT25UcmlnZ2VyQnV0dG9uKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtcG9wdXBfX3RyaWdnZXJlZC1idG4iKTt0JiYhdC5jbGFzc0xpc3QuY29udGFpbnMoInQ3MjRfX29wZW5lciIpJiYodC5mb2N1cygpLHQuY2xhc3NMaXN0LnJlbW92ZSgidC1wb3B1cF9fdHJpZ2dlcmVkLWJ0biIpKX1FbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzfHwoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcz1FbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tb3pNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUub01hdGNoZXNTZWxlY3RvciksRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdHx8KEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXM7ZSYmMT09PWUubm9kZVR5cGU7KXtpZihFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzLmNhbGwoZSx0KSlyZXR1cm4gZTtlPWUucGFyZW50RWxlbWVudHx8ZS5wYXJlbnROb2RlfXJldHVybiBudWxsfSk7CgpmdW5jdGlvbiB0Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKHQpe3RyeXt2YXIgZSxpPS92YXJcKC0tdWMtKFteLV0rKS0oW14tXSspLShbXixdKyksXHM/KC4qKVwpLy5leGVjKHQpO2lmKCFpKXJldHVybjt2YXIgcj1pWzBdLG89aVsxXSxuPWlbMl0sYT1pWzNdLGw9aVs0XTtpZighKHImJm8mJm4mJmEmJmwpKXJldHVybjtyZXR1cm57cGFyZW50OntpZDphLHR5cGU6b30sZmFsbGJhY2s6bCxmaWVsZDpufX1jYXRjaChkKXtjb25zb2xlLmVycm9yKCJFcnJvciB0cnlpbmcgdG8gcGFyc2UgQ1NTIFZhcmlhYmxlIil9fWZ1bmN0aW9uIHQzOTZfX2hleDJyZ2JhKHQsZSl7aWYoIXQpcmV0dXJuITE7dmFyIGk9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1Zhcih0KTtpJiYodD1pLmZhbGxiYWNrKTt2YXIgcj10LnJlcGxhY2UoLyMvLCIiKTtpZigzPT09ci5sZW5ndGgpe3ZhciBvPXJbMF0sbj1yWzFdLGE9clsyXTt0PSIjIitvK28rbituK2ErYX12YXIgbD1wYXJzZUludCh0LnN1YnN0cmluZygxKSwxNiksZCxfLHM7cmV0dXJuWygxNjcxMTY4MCZsKT4+MTYsKDY1MjgwJmwpPj44LDI1NSZsLHBhcnNlRmxvYXQoZSldfWZ1bmN0aW9uIHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCl7dmFyIGU9WyJnYWxsZXJ5Il0saT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtyZXR1cm4gZS5pbmNsdWRlcyhpKX1mdW5jdGlvbiB0Mzk2X19pc0ZsZXgodCl7dmFyIGU9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxpPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cC1mbGV4Iik7cmV0dXJuIGV8fGl9ZnVuY3Rpb24gdDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKHQpe3ZhciBlPVsiLnQ5NTFfX3NpZGViYXJfc3RpY2t5IiwiLnQxMjA2X19jb250ZW50X3N0aWNreSIsIi50NzU0X19jb2xfZml4ZWQiLCIudDc3Nl9fY29sX2ZpeGVkIiwiLnQ3ODZfX2NvbF9maXhlZCIsIi50LXN0b3JlX19wcm9kLXBvcHVwX19jb2xfZml4ZWQiXTt0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKTt2YXIgaT1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZS5qb2luKCIsICIpKSk7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiLCJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpLHQuY2xhc3NMaXN0LmFkZChpPyJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiOiJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpfX1mdW5jdGlvbiB0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQzOTZfX292ZXJmbG93LXN0eWxlcyIpKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3QuaWQ9InQzOTZfX292ZXJmbG93LXN0eWxlcyIsdC5pbm5lckhUTUw9Ii50LXJlY29yZHNfX292ZXJmbG93LWNsaXAgeyBvdmVyZmxvdzogY2xpcDsgfVxuXHRcdFx0XHRcdFx0LnQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdDM5Nl9fZ2V0QXJ0Ym9hcmRzKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksaSxyPWUmJiJlZGl0Ij09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKT8nLnJlY29yZFtkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdIC5yOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc6Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl06bm90KC50Mzk3X19vZmYpOm5vdCgudDM5NV9fb2ZmKTpub3QoLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChyKSl9ZnVuY3Rpb24gdDM5Nl9fZ2V0WmVyb0Jsb2Nrcygpe3ZhciB0PVtdLmNvbmNhdCh0Mzk2X19nZXRBcnRib2FyZHMoIjM5NiIpLHQzOTZfX2dldEFydGJvYXJkcygiMTIxIikpLGU7cmV0dXJuIHQubGVuZ3RoP3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm57cmVjb3JkOnQuY2xvc2VzdCgiLnI6bm90KC50Mzk3X19vZmYpOm5vdCgudDM5NV9fb2ZmKTpub3QoLnQ0MDBfX29mZikiKSxhcnRib2FyZDp0fX0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlY29yZH0pKTpbXX1mdW5jdGlvbiB0Mzk2X2luaXQodCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksaT1lP2UucXVlcnlTZWxlY3RvcigiLnQzOTYiKTpudWxsLHI9ZT9lLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGw7aWYocil7dDM5Nl9pbml0VE5vYmoodCxyKSx0Mzk2X19pbml0T25seVNjYWxhYmxlKCk7dmFyIG89IiIsbj10Mzk2X2RldGVjdFJlc29sdXRpb24odCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGw9YSYmImVkaXQiPT09YS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpO3ZvaWQgMD09PXdpbmRvdy50bi5pc0VkaXRNb2RlJiYod2luZG93LnRuLmlzRWRpdE1vZGU9bCksdDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsbik7dmFyIGQ9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsInVwc2NhbGUiKTtpZih0Mzk2X19zZXRHbG9iYWxTY2FsZVZhcmlhYmxlcyh0LG4sZCksdDM5Nl91cGRhdGVUTm9iaih0KSx0Mzk2X2FydGJvYXJkX2J1aWxkKG8sdCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9faW5pdGlhbGl6ZUFydGJvYXJkT3ZlcmZsb3coYSxyKX0pKSx3aW5kb3cudGlsZGFNZW1iZXJzJiYiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBfPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJhdHRyaWJ1dGVzIj09PWUudHlwZSYmImNsYXNzIj09PWUuYXR0cmlidXRlTmFtZSYmZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bGstY291cnNlc19wYWdlIikmJih0Mzk2X2RvUmVzaXplKHQsITApLF8uZGlzY29ubmVjdCgpKX0pKX0pKTtfLm9ic2VydmUoZG9jdW1lbnQuYm9keSx7YXR0cmlidXRlczohMH0pfWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50ODMwIikmJnRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgZSxpO1sidDgzMF9fYWxscmVjb3Jkc19wYWRkIiwidDgzMF9fYWxscmVjb3Jkc19wYWRkLXNtYWxsIl0uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGEuY2xhc3NMaXN0LmNvbnRhaW5zKHQpfSkpP3QzOTZfZG9SZXNpemUodCwhMCk6YS5hZGRFdmVudExpc3RlbmVyKCJhbGxSZWNQYWRkaW5nSW5pdCIsKGZ1bmN0aW9uKCl7dDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKX0pKSxlJiZpJiZyJiYieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbm5lY3Qtd2l0aC10YWIiKSYmaS5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsKGZ1bmN0aW9uKCl7dDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyhyKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhyKSx0Mzk2X2RvUmVzaXplKHQsITApfSkpO3ZhciBzPSJodWciPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpO2lmKHMpe3ZhciB1PXRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dDM5Nl9fdXBkYXRlQXV0b0hlaWdodChyKX0pLDEwMCk7dSgpLHNldEludGVydmFsKHUsM2UzKSxkb2N1bWVudC5mb250cyYmZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbih1KSxyLnF1ZXJ5U2VsZWN0b3JBbGwoImltZyIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Qub25sb2FkPXV9KSksbmV3IE11dGF0aW9uT2JzZXJ2ZXIodSkub2JzZXJ2ZShyLHtzdWJ0cmVlOiEwLGNoYXJhY3RlckRhdGE6ITAsY2hhcmFjdGVyRGF0YU9sZFZhbHVlOiEwfSl9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtlJiZlLmNsb3Nlc3QoIiNhbGxyZWNvcmRzdGFibGUiKSYmaSYmciYmaS5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsKGZ1bmN0aW9uKCl7dDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyhyKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhyKSx0Mzk2X2RvUmVzaXplKHQsITApfSkpfSksMWUzKTt2YXIgYz0hIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50NjM1X190ZXh0aG9sZGVyIik7ZSYmYyYmaSYmciYmaS5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25Jbml0ZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKSxlJiZkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDQzMSIpJiZpJiZyJiZ0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X2RvUmVzaXplKHQsITApfSkpfSkpLC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJmkmJmkuY2xhc3NMaXN0LmFkZCgidDM5Nl9zYWZhcmkiKSxkJiYhbCYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X3NjYWxlQmxvY2siLChmdW5jdGlvbigpe3QzOTZfc2NhbGVCbG9jayh0KX0pKSxsfHwieSIhPT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsImZpeGVkLW5lZWQtanMiKXx8dF9vbkZ1bmNMb2FkKCJ0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fcHJvY2Vzc0ZpeGVkQXJ0Qm9hcmQocil9KSksdDM5Nl9fcHJvY2Vzc0Fic29sdXRlQXJ0Qm9hcmQociksdDM5Nl9fcHJvY2Vzc1RvcFNoaWZ0KHIsdCwhMSksd2luZG93LnQzOTZfX2lzTW9iaWxlfHxzfHx0Mzk2X19yZW1vdmVJbmxpbmVIZWlnaHQoW3Isci5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLHIucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpXSksdDM5Nl9faW50aWFsaXplVW5kZXJjdXQoZSl9fXdpbmRvdy50Mzk2X19pc01vYmlsZT0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIik+LTEsd2luZG93LnQzOTZfX2lzSVBhZD0ib250b3VjaGVuZCJpbiBkb2N1bWVudCYmLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkFwcGxlV2ViS2l0Iiksd2luZG93LnQzOTZfX2lzU2FmYXJpPS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LnQzOTZfX2lzVG91Y2hEZXZpY2U9Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQsd2luZG93LnQzOTZfX2lzSW5BcHBCcm93c2VyPS9XZWJWaWV3fChpUGhvbmV8aVBvZHxpUGFkKSg/IS4qU2FmYXJpKS9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy50Mzk2X19pc0ZhY2Vib29rTWVzc2VuZ2VySW5BcHA9L0ZCQU58RkJBVi9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZ3aW5kb3cudDM5Nl9faXNJbkFwcEJyb3dzZXIsd2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHA9L1xiSW5zdGFncmFtL2dpLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJndpbmRvdy50Mzk2X19pc0luQXBwQnJvd3Nlcix0X29uUmVhZHkodDM5Nl9fZ2xvYmFsSW5pdCk7dmFyIHQzOTZfd2FpdEZvckZpbmFsRXZlbnQ9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gZnVuY3Rpb24oZSxpLHIpe3ZhciBvPXJ8fCJEb24ndCBjYWxsIHRoaXMgdHdpY2Ugd2l0aG91dCBhIHVuaXF1ZUlkIjt0W29dJiZjbGVhclRpbWVvdXQodFtvXSksdFtvXT1zZXRUaW1lb3V0KGUsaSl9fSgpO2Z1bmN0aW9uIHQzOTZfX2hhbmRsZVJlc2l6ZU9wZW5lZFBvcHVwKCl7dDM5Nl9fd2FpdEZvclBvcHVwKCkudGhlbigoZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTtlJiZ0Mzk2X2RvUmVzaXplKGUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpfX0pKX1mdW5jdGlvbiB0Mzk2X19pbml0UG9wdXBSZXNpemUoKXtkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvcHVwU2hvd2VkIix0Mzk2X19oYW5kbGVSZXNpemVPcGVuZWRQb3B1cCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJwb3B1cFNob3dlZCIsdDM5Nl9faGFuZGxlUmVzaXplT3BlbmVkUG9wdXApfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd0hlaWdodCh0KXtyZXR1cm4gdDM5Nl9fc2hvdWxkVXNlVmlzdWFsVmlld3BvcnRIZWlnaHQoKSYmdDM5Nl9faXNJblBvcHVwKHQpP3dpbmRvdy52aXN1YWxWaWV3cG9ydC5oZWlnaHQ6dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLmhlaWdodDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd1dpZHRoKHQpe3JldHVybiB0Mzk2X19pc0luUG9wdXAodCk/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOnQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfX2dldFROV2luZG93SGVpZ2h0KCl7cmV0dXJuIHdpbmRvdy50Mzk2X19pc01vYmlsZXx8d2luZG93LnQzOTZfX2lzSVBhZD9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodH1mdW5jdGlvbiB0Mzk2X19nZXRUTldpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpO2lmKHQpcmV0dXJuIHQ7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGk9dDM5Nl9fZ2V0QXhpc1hQYWRkaW5nKCk7cmV0dXJuIGkmJihlLT1pKSxlfWZ1bmN0aW9uIHQzOTZfX2dldENTU1dpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpLGU7cmV0dXJuIHR8fCh3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc0lQYWR8fHdpbmRvdy50Mzk2X19pc1NhZmFyaT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVyV2lkdGgpfWZ1bmN0aW9uIHQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnModCl7dmFyIGUsaT0odHx8e30pLmZvcmNlVXBkYXRlLHI9dm9pZCAwIT09aSYmaSxvPSF3aW5kb3cudG4ud2luZG93X3dpZHRofHwhd2luZG93LnRuLndpbmRvd19oZWlnaHR8fCF3aW5kb3cudG4ud2luZG93X3dpZHRoX2NzcyxuO3JldHVybihyfHxvKSYmdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLHt3aWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoLGhlaWdodDp3aW5kb3cudG4ud2luZG93X2hlaWdodCxjc3NXaWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoX2Nzc319ZnVuY3Rpb24gdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpe3dpbmRvdy50bi53aW5kb3dfd2lkdGg9dDM5Nl9fZ2V0VE5XaW5kb3dXaWR0aCgpLHdpbmRvdy50bi53aW5kb3dfaGVpZ2h0PXQzOTZfX2dldFROV2luZG93SGVpZ2h0KCksd2luZG93LnRuLndpbmRvd193aWR0aF9jc3M9dDM5Nl9fZ2V0Q1NTV2luZG93V2lkdGgoKX1mdW5jdGlvbiB0Mzk2X19yZW1vdmVJbmxpbmVIZWlnaHQodCl7IjEuMCIhPT13aW5kb3cuVE5fU0NBTEVfSU5JVElBTF9WRVImJnQuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QmJih0LnN0eWxlLmhlaWdodD0iIil9KSl9ZnVuY3Rpb24gdDM5Nl9fY2xlYXJJbml0aWFsU2NhbGVTdHlsZXMoKXtpZigiMS4wIj09PXdpbmRvdy5UTl9TQ0FMRV9JTklUSUFMX1ZFUil7dmFyIHQ9ZnVuY3Rpb24gdChlKXt2YXIgaTtlJiYoInZhcigtLWluaXRpYWwtc2NhbGUtaGVpZ2h0KSI9PT1lLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoImhlaWdodCIpJiZlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKSl9LGU7dDM5Nl9fZ2V0WmVyb0Jsb2NrcygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBpPWUuYXJ0Ym9hcmQ7aSYmKGkuc3R5bGUucmVtb3ZlUHJvcGVydHkoIi0taW5pdGlhbC1zY2FsZS1oZWlnaHQiKSx0KGkpLHQoaS5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpKSx0KGkucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpKSl9KSl9fWZ1bmN0aW9uIHQzOTZfX2dsb2JhbEluaXQoKXt3aW5kb3cudG58fHQzOTZfaW5pdFROb2JqX19jcmVhdGVEZWZhdWx0KCksdDM5Nl9faXNBbGxaZXJvQmxvY2tzUmVuZGVyZWQoKGZ1bmN0aW9uKCl7dDM5Nl9fYXBwbHlGaXhlc0ZvckFsbEVsZW1lbnRzKCksdDM5Nl9faW5pdGlhbGl6ZUFuY2hvckxpbmtPdmVyZmxvd0ZpeCgpLHQzOTZfX2luaXRQb3B1cFJlc2l6ZSgpLHQzOTZfX2NsZWFySW5pdGlhbFNjYWxlU3R5bGVzKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdDM5Nl9fb25SZXNpemUpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsdDM5Nl9fb25PcmllbnRhdGlvbkNoYW5nZSl9KSl9ZnVuY3Rpb24gdDM5Nl9fb25SZXNpemUoKXt0Mzk2X3dhaXRGb3JGaW5hbEV2ZW50KChmdW5jdGlvbigpe3ZhciB0LGU9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLndpZHRoO3QzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKTt2YXIgaSxyLG89ZSE9PXQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aDt0Mzk2X19nZXRaZXJvQmxvY2tzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5hcnRib2FyZCxpPXQucmVjb3JkO2lmKGUuY2xhc3NMaXN0LmFkZCgidDM5Nl9yZXNpemVjaGFuZ2UiKSx3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc1RvdWNoRGV2aWNlKXtpZihvKXtpZighaSlyZXR1cm47aWYoIXQzOTZfaXNCbG9ja1Zpc2libGUoaSkpcmV0dXJuO3QzOTZfZG9SZXNpemUoaS5pZC5yZXBsYWNlKCJyZWMiLCIiKSksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X3Jlc2l6ZWNoYW5nZSIpfX1lbHNle2lmKCFpKXJldHVybjtpZighdDM5Nl9pc0Jsb2NrVmlzaWJsZShpKSlyZXR1cm47dDM5Nl9kb1Jlc2l6ZShpLmlkLnJlcGxhY2UoInJlYyIsIiIpKSxlLmNsYXNzTGlzdC5yZW1vdmUoInQzOTZfcmVzaXplY2hhbmdlIil9fSkpfSksNTAwLCJnbG9iYWxfcmVzaXplX3plcm9fdW5pcXVlX2lkIil9ZnVuY3Rpb24gdDM5Nl9fb25PcmllbnRhdGlvbkNoYW5nZSgpe3QzOTZfd2FpdEZvckZpbmFsRXZlbnQoKGZ1bmN0aW9uKCl7dDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLHQzOTZfX2dldFplcm9CbG9ja3MoKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnJlY29yZDtlJiZ0Mzk2X2lzQmxvY2tWaXNpYmxlKGUpJiZ0Mzk2X2RvUmVzaXplKGUuaWQucmVwbGFjZSgicmVjIiwiIikpfSkpfSksNjAwLCJnbG9iYWxfb3JpZW50YXRpb25jaGFuZ2VfemVyb191bmlxdWVfaWQiKX1mdW5jdGlvbiB0Mzk2X2lzT25seVNjYWxhYmxlQnJvd3Nlcigpe3JldHVybiB3aW5kb3cuaXNPbmx5U2NhbGFibGV9ZnVuY3Rpb24gdDM5Nl9faW5pdE9ubHlTY2FsYWJsZSgpe2lmKHZvaWQgMD09PXdpbmRvdy5pc09ubHlTY2FsYWJsZSl7dmFyIHQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0ZpcmVmb3hcLyhbMC05XSspXC4vKSxlPXQ/cGFyc2VJbnQodFsxXSwxMCk6MTI2LGk9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVwvKFswLTldKylcLi8pLHI9aSYmcGFyc2VJbnQoaVsxXSwxMCl8fDA7d2luZG93LmlzT25seVNjYWxhYmxlPWU8MTI2LHdpbmRvdy5zaG91bGRVc2VTY2FsZUZhY3Rvcj0hd2luZG93LmlzT25seVNjYWxhYmxlJiYhdCYmcjw9MTI3fX1mdW5jdGlvbiB0Mzk2X19zZXRHbG9iYWxTY2FsZVZhcmlhYmxlcyh0LGUsaSl7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksbz1yP3IucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZihvKXt2YXIgbj10Mzk2X2FiX19nZXRXaW5kb3dXaWR0aChvKSxhPWk/cGFyc2VGbG9hdCgobi9lKS50b0ZpeGVkKDMpKToxLGw9ImFiIit0O3dpbmRvdy50bltsXS5zY2FsZUZhY3Rvcj1hLHdpbmRvdy50bl9zY2FsZV9mYWN0b3I9YTt2YXIgZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KTtkJiYhd2luZG93LnRuLmlzRWRpdE1vZGUmJmQuc3R5bGUuc2V0UHJvcGVydHkoIi0tem9vbSIsYS50b1N0cmluZygpKX19ZnVuY3Rpb24gdDM5Nl9fcHJvY2Vzc1RvcFNoaWZ0KHQsZSxpKXsiZnVuY3Rpb24iIT10eXBlb2Ygd2luZG93LnQzOTZfX3VwZGF0ZVRvcFNoaWZ0fHwieSIhPT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsInNoaWZ0LXByb2Nlc3NlZCIpJiYieSIhPT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImZpeGVkLXNoaWZ0Iil8fHdpbmRvdy50Mzk2X191cGRhdGVUb3BTaGlmdChlLGkpfWZ1bmN0aW9uIHQzOTZfZG9SZXNpemUodCxlKXtlJiZ0Mzk2X191cGRhdGVXaW5kb3dEaW1lbnNpb25zKCk7dmFyIGk9dDM5Nl9pc09ubHlTY2FsYWJsZUJyb3dzZXIoKSxyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpLG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxuPXQzOTZfZGV0ZWN0UmVzb2x1dGlvbih0KSxhPXI/ci5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fc2NhbGUtc3R5bGUiKTpudWxsO2lmKHQzOTZfX3NldFNjYWxlRmFjdG9yRm9yRWxlbWVudHModCksdDM5Nl9yZW1vdmVFbGVtZW50RnJvbURPTShhKSxpKXt2YXIgbD1yP3IucXVlcnlTZWxlY3RvckFsbCgiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpOltdO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCl7aWYoIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tIil8fCF0LmNsb3Nlc3QoIi50bi1tb2xlY3VsZSIpKXt2YXIgZT10LmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIiksaT1lP2UucGFyZW50Tm9kZTpudWxsO2kmJmkucmVtb3ZlQ2hpbGQoZSksaSYmaS5hcHBlbmRDaGlsZCh0KX19KSl9ZWxzZXt2YXIgZD1yP3IucXVlcnlTZWxlY3RvckFsbCgiLnQzOTZfX2VsZW0sIC50Mzk2X19ncm91cCIpOltdO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCwoZnVuY3Rpb24odCl7dC5zdHlsZS56b29tPSIiO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtlJiYoZS5zdHlsZS50cmFuc2Zvcm1PcmlnaW49IiIsZS5zdHlsZS5mb250U2l6ZT0iIixlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSIiKX0pKX10Mzk2X3N3aXRjaFJlc29sdXRpb24odCxuKTt2YXIgXz1yP3IucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbCxzPSJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShfLCJ1cHNjYWxlIik7dDM5Nl9fc2V0R2xvYmFsU2NhbGVWYXJpYWJsZXModCxuLHMpLHQzOTZfdXBkYXRlVE5vYmoodCksdDM5Nl9hYl9fcmVuZGVyVmlldyhfKTt2YXIgdT1vP28uZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKToiIjtzJiYiZWRpdCIhPT11JiZ0X29uRnVuY0xvYWQoInQzOTZfc2NhbGVCbG9jayIsKGZ1bmN0aW9uKCl7dDM5Nl9zY2FsZUJsb2NrKHQpfSkpLCJlZGl0IiE9PXUmJiJ5Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoXywiZml4ZWQtbmVlZC1qcyIpJiZ0X29uRnVuY0xvYWQoInQzOTZfX3Byb2Nlc3NGaXhlZEFydEJvYXJkIiwoZnVuY3Rpb24oKXt0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZChfKX0pKSx0Mzk2X19wcm9jZXNzQWJzb2x1dGVBcnRCb2FyZChfKSx0Mzk2X19wcm9jZXNzVG9wU2hpZnQoXyx0LCEwKSx0Mzk2X2FsbGVsZW1zX19yZW5kZXJWaWV3KF8pLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3KF8pLHQzOTZfX2FwcGx5Rml4ZXNGb3JBbGxFbGVtZW50cygpLHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQoXyksXyYmXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYXJ0Qm9hcmRSZXNpemVkIikpO3ZhciBjPSJodWciPT09Xy5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpO18mJiFjJiYod2luZG93LnQzOTZfX2lzTW9iaWxlfHx0Mzk2X19yZW1vdmVJbmxpbmVIZWlnaHQoW18sXy5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLF8ucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpXSkpfWZ1bmN0aW9uIHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQodCl7dmFyIGU7aWYoImh1ZyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHRtb2RlIikpe3ZhciBpPXQzOTZfX2dldEF1dG9IZWlnaHQodCkscj10Lm9mZnNldEhlaWdodDtpZighKE1hdGguYWJzKGktcik8PTEpKXt2YXIgbyxuPSJhYiIrdC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxhPXdpbmRvdy50bltuXS5jdXJSZXNvbHV0aW9uLGw7YT09PXdpbmRvdy50bltuXS5jdXJSZXNvbHV0aW9uX21heD90LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHQiLGkpOnQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodC1yZXMtIithLGkpLHQzOTZfYWJfX3JlbmRlclZpZXcodCl9fX1mdW5jdGlvbiB0Mzk2X19nZXRBdXRvSGVpZ2h0KHQpe3ZhciBlLGk9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxyPUFycmF5LmZyb20odC5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUgPiAudG4tZ3JvdXAsIDpzY29wZSA+IC50bi1lbGVtIikpLG89ci5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4iZ2FsbGVyeSI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKX0pKTtpZihpJiYhbyl7dmFyIG49dC5zdHlsZS5oZWlnaHQ7dC5zdHlsZS5oZWlnaHQ9ImF1dG8iLGU9dC5vZmZzZXRIZWlnaHQsdC5zdHlsZS5oZWlnaHQ9bn1lbHNlIGU9ci5yZWR1Y2UoKGZ1bmN0aW9uKGUsaSl7dmFyIHI9dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKGksImF4aXN5Iiksbz10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUoaSwidG9wdW5pdHMiKSxuPXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZShpLCJoZWlnaHR1bml0cyIpO2lmKCIlIj09PW98fCIlIj09PW58fCJib3R0b20iPT09cnx8ImNlbnRlciI9PT1yKXJldHVybiBlO3ZhciBhPTA7ImdhbGxlcnkiPT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIikmJihhPXQzOTZfX2F1dG9IZWlnaHRfX2dldEFkZGl0aW9uYWxPZmZzZXRGb3JHYWxsZXJ5KGkpKTt2YXIgbD1pLm9mZnNldFRvcCtpLm9mZnNldEhlaWdodCthLGQsXyxzOyJ3aW5kb3ciIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJ1cHNjYWxlIil8fHdpbmRvdy50bi5pc0VkaXRNb2RlfHwobCo9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpKTtyZXR1cm4gbD5lP2w6ZX0pLC0xLzApO3JldHVybiBlPT09LTEvMD8wOmV9ZnVuY3Rpb24gdDM5Nl9fYXV0b0hlaWdodF9fZ2V0QWRkaXRpb25hbE9mZnNldEZvckdhbGxlcnkodCl7dmFyIGU9MCxpPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fdGl0bGUiKSxyPSJub25lIiE9PXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZSh0LCJzbGRzX2RvdHNjb250cm9scyIpLG89InVuZGVyIj09PXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZSh0LCJzbGRzX2Fycm93Y29udHJvbHMiKTtpZihpfHxyfHxvKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX3RpdGxlIiksYT1uP24ub2Zmc2V0SGVpZ2h0OjAsbD10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NhcHRpb24udC1zbGRzX19jYXB0aW9uLWFjdGl2ZSIpLGQ9Z2V0Q29tcHV0ZWRTdHlsZShsKSxfO2UrPXBhcnNlSW50KGQubWFyZ2luVG9wLDEwKSthfXJldHVybiBpfHwhciYmIW98fChlLT0yMCksZX1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzQWJzb2x1dGVBcnRCb2FyZCh0KXtpZih0KXt2YXIgZT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsInBvcyIpO2lmKCJmaXhlZCIhPT1lKXt2YXIgaT0idDM5Nl9fYXJ0Ym9hcmQtZml4ZWQtbm8tYmciO2lmKCJhYnNvbHV0ZSI9PT1lKXt2YXIgcj1nZXRDb21wdXRlZFN0eWxlKHQpLG89dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fZmlsdGVyIiksbj0hb3x8Im5vbmUiPT09Z2V0Q29tcHV0ZWRTdHlsZShvKS5iYWNrZ3JvdW5kSW1hZ2UsYSxsPSJyZ2JhKDAsIDAsIDAsIDApIj09PXIuYmFja2dyb3VuZENvbG9yJiYibm9uZSI9PT1yLmJhY2tncm91bmRJbWFnZSYmbj8iYWRkIjoicmVtb3ZlIjt0LmNsYXNzTGlzdFtsXShpKX1lbHNlIHQuY2xhc3NMaXN0LnJlbW92ZShpKX19fWZ1bmN0aW9uIHQzOTZfZGV0ZWN0UmVzb2x1dGlvbih0KXtpZighdClyZXR1cm4gbnVsbDt2YXIgZSxpPXQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS5jc3NXaWR0aCxyPSJhYiIrdCxvO3JldHVybiB3aW5kb3cudG5bcl0uc2NyZWVucy5mb3JFYWNoKChmdW5jdGlvbih0KXtpPj10JiYobz10KX0pKSx2b2lkIDA9PT1vJiYobz13aW5kb3cudG5bcl0uc2NyZWVuc1swXSksb31mdW5jdGlvbiB0Mzk2X2luaXRUTm9ial9fY3JlYXRlRGVmYXVsdCgpe3dpbmRvdy50bj17fSx3aW5kb3cudG4uYWJfZmllbGRzPVsiaGVpZ2h0Iiwid2lkdGgiLCJiZ2NvbG9yIiwiYmdpbWciLCJiZ2F0dGFjaG1lbnQiLCJiZ3Bvc2l0aW9uIiwiZmlsdGVyb3BhY2l0eSIsImZpbHRlcmNvbG9yIiwiZmlsdGVyb3BhY2l0eTIiLCJmaWx0ZXJjb2xvcjIiLCJoZWlnaHRfdmgiLCJ2YWxpZ24iXX1mdW5jdGlvbiB0Mzk2X2luaXRUTm9iaih0LGUpe2UmJih3aW5kb3cudG58fHQzOTZfaW5pdFROb2JqX19jcmVhdGVEZWZhdWx0KCksdDM5Nl9zZXRTY3JlZW5zVE5vYmoodCxlKSl9ZnVuY3Rpb24gdDM5Nl9zZXRTY3JlZW5zVE5vYmoodCxlKXt2YXIgaT0iYWIiK3Q7d2luZG93LnRuW2ldPXt9LHdpbmRvdy50bltpXS5zY3JlZW5zPVtdO3ZhciByPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXNjcmVlbnMiKTtyPyhyPXIuc3BsaXQoIiwiKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7d2luZG93LnRuW2ldLnNjcmVlbnMucHVzaChwYXJzZUludCh0LDEwKSl9KSk6d2luZG93LnRuW2ldLnNjcmVlbnM9WzMyMCw0ODAsNjQwLDk2MCwxMjAwXX1mdW5jdGlvbiB0Mzk2X19nZXRBeGlzWFBhZGRpbmcoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGU9Qm9vbGVhbih3aW5kb3cudGlsZGFNZW1iZXJzKXx8ImFsbHJlY29yZHMiPT09d2luZG93Lnplcm9fd2luZG93X3dpZHRoX2hvb2ssaSxyO3JldHVybiB0JiZlJiZbZG9jdW1lbnQuYm9keSx0XS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7dmFyIGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkucGFkZGluZ0xlZnQscj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5wYWRkaW5nUmlnaHQ7cmV0dXJuIHQrcGFyc2VJbnQoaSwxMCkrcGFyc2VJbnQociwxMCl9KSwwKXx8MH1mdW5jdGlvbiB0Mzk2X3VwZGF0ZVROb2JqKHQpe2Zvcih2YXIgZSxpPXQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aCxyPSJhYiIrdCxvPXdpbmRvdy50bltyXS5zY3JlZW5zLnNsaWNlKCkucmV2ZXJzZSgpLG49MDtuPG8ubGVuZ3RoO24rKyl3aW5kb3cudG5bcl0uY3VyUmVzb2x1dGlvbj09PW9bbl0mJih3aW5kb3cudG5bcl0uY2FudmFzX21pbl93aWR0aD1vW25dLHdpbmRvdy50bltyXS5jYW52YXNfbWF4X3dpZHRoPTA9PT1uP2k6b1tuLTFdKTt2YXIgYT0iYWxscmVjb3JkcyI9PT13aW5kb3cuemVyb193aW5kb3dfd2lkdGhfaG9vazt3aW5kb3cudG5bcl0uZ3JpZF93aWR0aD13aW5kb3cudG5bcl0uY2FudmFzX21pbl93aWR0aDt2YXIgbD0oaS13aW5kb3cudG5bcl0uZ3JpZF93aWR0aCkvMjt3aW5kb3cudG5bcl0uZ3JpZF9vZmZzZXRfbGVmdD1sPDAmJmE/MDpsfWZ1bmN0aW9uIHQzOTZfc3dpdGNoUmVzb2x1dGlvbih0LGUpe3ZhciBpPSJhYiIrdCxyPXdpbmRvdy50bltpXS5zY3JlZW5zW3dpbmRvdy50bltpXS5zY3JlZW5zLmxlbmd0aC0xXTt3aW5kb3cudG5baV0uY3VyUmVzb2x1dGlvbj1lLHdpbmRvdy50bltpXS5jdXJSZXNvbHV0aW9uX21heD1yLHdpbmRvdy50bi5jdXJSZXNvbHV0aW9uPWUsd2luZG93LnRuLmN1clJlc29sdXRpb25fbWF4PXJ9ZnVuY3Rpb24gdDM5Nl9hcnRib2FyZF9idWlsZCh0LGUpe3ZhciBpPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpLHI9aT9pLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGw7aWYocil7dDM5Nl9hYl9fcmVuZGVyVmlldyhyKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhyKSx0Mzk2X19zZXRTY2FsZUZhY3RvckZvckVsZW1lbnRzKGUpO3ZhciBvPXIucXVlcnlTZWxlY3RvckFsbCgiLnRuLWVsZW0iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3ZhciBpO3N3aXRjaCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSl7Y2FzZSJ0ZXh0Ijp0Mzk2X2FkZFRleHQocix0KTticmVhaztjYXNlImltYWdlIjp0Mzk2X2FkZEltYWdlKHIsdCk7YnJlYWs7Y2FzZSJzaGFwZSI6dDM5Nl9hZGRTaGFwZShyLHQpO2JyZWFrO2Nhc2UiYnV0dG9uIjp0Mzk2X2FkZEJ1dHRvbihyLHQpO2JyZWFrO2Nhc2UidmlkZW8iOnQzOTZfYWRkVmlkZW8ocix0KTticmVhaztjYXNlImh0bWwiOnQzOTZfYWRkSHRtbChyLHQpO2JyZWFrO2Nhc2UidG9vbHRpcCI6dDM5Nl9hZGRUb29sdGlwKHIsdCk7YnJlYWs7Y2FzZSJmb3JtIjp0Mzk2X2FkZEZvcm0ocix0LGUpO2JyZWFrO2Nhc2UiZ2FsbGVyeSI6dDM5Nl9hZGRHYWxsZXJ5KHIsdCxlKTticmVhaztjYXNlInZlY3RvciI6dDM5Nl9hZGRWZWN0b3Iocix0KX19KSksci5jbGFzc0xpc3QucmVtb3ZlKCJyZW5kZXJpbmciKSxyLmNsYXNzTGlzdC5hZGQoInJlbmRlcmVkIiksci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgiYXJ0Qm9hcmRSZW5kZXJlZCIse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pKTt2YXIgbj1yLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1vdnJmbHciKTtpZihbInZpc2libGUiLCJ2aXNpYmxlWCJdLmluY2x1ZGVzKG4pJiZ0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3JkcygpLCJhdXRvIj09PW4pe3ZhciBhPU1hdGguYWJzKHIub2Zmc2V0SGVpZ2h0LXIuY2xpZW50SGVpZ2h0KTswIT09YSYmKHIuc3R5bGUucGFkZGluZ0JvdHRvbT1hKyJweCIpfWlmKHdpbmRvdy50Mzk2X19pc01vYmlsZXx8d2luZG93LnQzOTZfX2lzSVBhZCl7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtsLnRleHRDb250ZW50PSJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTM2NnB4KSBhbmQgKG9yaWVudGF0aW9uOmxhbmRzY2FwZSkgYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86Mikgey50Mzk2X19jYXJyaWVyIHtiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6c2Nyb2xsIWltcG9ydGFudDt9fSIsaS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsbCl9fX1mdW5jdGlvbiB0Mzk2X2FiX19yZW5kZXJWaWV3KHQpe2lmKHQpe2Zvcih2YXIgZT13aW5kb3cudG4uYWJfZmllbGRzLGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxyLG89MDtvPGUubGVuZ3RoO28rKyl0Mzk2X2FiX19yZW5kZXJWaWV3T25lRmllbGQodCxlW29dKTt2YXIgbj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodCIpLGE9dDM5Nl9hYl9fZ2V0SGVpZ2h0KHQpLGwsZD10Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3IodC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSksXz0hIWkmJiJlZGl0Ij09PWkuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKSxzPSJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJ1cHNjYWxlIiksdSxjLGY7aWYocj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodF92aCIpLHMmJiFfJiZyJiYodT1wYXJzZUludChuLDEwKSpkKSxuPT09YXx8dSYmdT49YSljPTA7ZWxzZSBzd2l0Y2godDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJ2YWxpZ24iKSl7Y2FzZSJ0b3AiOmRlZmF1bHQ6Yz0wO2JyZWFrO2Nhc2UiY2VudGVyIjpjPXU/cGFyc2VGbG9hdCgoKGEtdSkvMikudG9GaXhlZCgxKSk6cGFyc2VGbG9hdCgoKGEtbikvMikudG9GaXhlZCgxKSk7YnJlYWs7Y2FzZSJib3R0b20iOmM9dT9wYXJzZUZsb2F0KChhLXUpLnRvRml4ZWQoMSkpOnBhcnNlRmxvYXQoKGEtbikudG9GaXhlZCgxKSk7YnJlYWs7Y2FzZSJzdHJldGNoIjpjPTAsbj1hfXQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1pbi1vZmZzZXQtdG9wIixjKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1taW4taGVpZ2h0IixuKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1tYXgtaGVpZ2h0IixhKTt2YXIgdz10LnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKSxnPXQucXVlcnlTZWxlY3RvcigiLnQzOTZfX2NhcnJpZXIiKSxoO2lmKHI9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHRfdmgiKSxyPXBhcnNlRmxvYXQociksKHdpbmRvdy50Mzk2X19pc01vYmlsZXx8d2luZG93LnQzOTZfX2lzSVBhZCkmJnIpe3ZhciBwPXQzOTZfYWJfX2dldFdpbmRvd0hlaWdodCh0KSpyLzEwMDt0LnN0eWxlLmhlaWdodD1wKyJweCIsdyYmKHcuc3R5bGUuaGVpZ2h0PXArInB4IiksZyYmKGcuc3R5bGUuaGVpZ2h0PXArInB4Iil9Imh1ZyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHRtb2RlIikmJiFyJiYodC5zdHlsZS5oZWlnaHQ9bisicHgiLHcmJih3LnN0eWxlLmhlaWdodD1uKyJweCIpLGcmJihnLnN0eWxlLmhlaWdodD1uKyJweCIpKX19ZnVuY3Rpb24gdDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKHQpe3ZhciBlPSJhYiIrdCxpO3JldHVybiB3aW5kb3cudG4mJndpbmRvdy50bltlXSYmd2luZG93LnRuW2VdLnNjYWxlRmFjdG9yfHx3aW5kb3cudG5fc2NhbGVfZmFjdG9yfWZ1bmN0aW9uIHQzOTZfX3NldFNjYWxlRmFjdG9yRm9yRWxlbWVudHModCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksaT1lP2UucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZihpKXt2YXIgcj10Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3IodCksbz1pLnF1ZXJ5U2VsZWN0b3JBbGwoIi50Mzk2X19lbGVtLCAudG4tZ3JvdXAiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3Quc2NhbGVGYWN0b3I9cn0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRUZXh0KHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0idG9wLGxlZnQsd2lkdGgsaGVpZ2h0LGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyI7aS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSl9fWZ1bmN0aW9uIHQzOTZfYWRkSW1hZ2UodCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJpbWcsd2lkdGgsZmlsZXdpZHRoLGZpbGVoZWlnaHQsdG9wLGxlZnQsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIjtpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKTt2YXIgbz1pLnF1ZXJ5U2VsZWN0b3IoImltZyIpO28mJihvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3QzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpLG8uc3JjJiZzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpLHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQodCl9KSwyZTMpfSkpLG8uY29tcGxldGUmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKSxvLnNyYyYmc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKSx0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHQpfSksMmUzKSksby5hZGRFdmVudExpc3RlbmVyKCJ0dXdpZGdldF9kb25lIiwoZnVuY3Rpb24oKXt0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfY2hhbmdlRmlsdGVyT25TYWZhcmkoaSl9KSkpfX1mdW5jdGlvbiB0Mzk2X2FkZFNoYXBlKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7cis9ImNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSl9fWZ1bmN0aW9uIHQzOTZfY2hhbmdlRmlsdGVyT25TYWZhcmkodCl7dmFyIGU7aWYoL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHQzOTZfX2NoZWNrQ29udGFpbkJhY2tkcm9wRmlsdGVyKHQpJiYiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KSl7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpLHI7bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbihlLGkpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoZS5pc0ludGVyc2VjdGluZyl7dmFyIHI9ZS50YXJnZXQ7aS51bm9ic2VydmUociksdDM5Nl9fcHJvY2Vzc0JhY2tkcm9wRmlsdGVyT25JbWFnZSh0KX19KSl9KSkub2JzZXJ2ZShpKX19ZnVuY3Rpb24gdDM5Nl9fY2hlY2tDb250YWluQmFja2Ryb3BGaWx0ZXIodCl7aWYoIXQpcmV0dXJuITE7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkud2Via2l0QmFja2Ryb3BGaWx0ZXI7aWYoZSYmIm5vbmUiIT09ZSlyZXR1cm4hMDt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyLCAudG4tYXRvbV9fcHJ4LXdyYXBwZXIsIC50bi1hdG9tX19zdGlja3ktd3JhcHBlciIpO2lmKCFpKXJldHVybiExO3ZhciByPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGkpLndlYmtpdEJhY2tkcm9wRmlsdGVyO3JldHVybiByJiYibm9uZSIhPT1yfWZ1bmN0aW9uIHQzOTZfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCl7aWYodCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtb3B0cyIpLGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1wcngiKXx8dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1maXgiKSxyPWV8fGksbz10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZWxlbS0tYmFja2Ryb3AtZmlsdGVyLWltZy13cmFwcGVyZWQiKTtyJiZvfHwhcj90Mzk2X191cGRhdGVCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCk6dC5hZGRFdmVudExpc3RlbmVyKCJiYWNrZHJvcEZpbHRlckltZ1dyYXBwZXJlZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fdXBkYXRlQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpfSkpfX1mdW5jdGlvbiB0Mzk2X191cGRhdGVCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCl7aWYodCl7dmFyIGU9dCxpPWUucXVlcnlTZWxlY3RvcigiaW1nIikscj1lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyLCAudG4tYXRvbV9fcHJ4LXdyYXBwZXIsIC50bi1hdG9tX19zdGlja3ktd3JhcHBlciIpLG89IiI7ciYmKGU9cixvPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLndlYmtpdEJhY2tkcm9wRmlsdGVyfHwiIiksZS5zdHlsZS53ZWJraXRCYWNrZHJvcEZpbHRlcj0ibm9uZSIsdDM5Nl93YWl0Rm9yVXBsb2FkSW1nKGksKGZ1bmN0aW9uKCl7ZS5zdHlsZS53ZWJraXRCYWNrZHJvcEZpbHRlcj1vfSkpfX1mdW5jdGlvbiB0Mzk2X3dhaXRGb3JVcGxvYWRJbWcodCxlKXtpZigieSI9PT13aW5kb3cubGF6eSl2YXIgaT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJsb2FkZWQiKSYmdC5jbGllbnRXaWR0aCYmdC5zcmM/KGUoKSxjbGVhclRpbWVvdXQoaSkpOnQzOTZfd2FpdEZvclVwbG9hZEltZyh0LGUpfSksMzAwKTtlbHNlIGUoKX1mdW5jdGlvbiB0Mzk2X2FkZEJ1dHRvbih0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoIWkpcmV0dXJuIG51bGw7dmFyIHI9InRvcCxsZWZ0LHdpZHRoLGhlaWdodCxjb250YWluZXIsYXhpc3gsYXhpc3ksY2FwdGlvbixsZWZ0dW5pdHMsdG9wdW5pdHMiO3JldHVybiBpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKSxpfWZ1bmN0aW9uIHQzOTZfYWRkVmlkZW8odCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJ3aWR0aCxoZWlnaHQsdG9wLGxlZnQsIjtyKz0iY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsaGVpZ2h0dW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIixpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKSx0X29uRnVuY0xvYWQoInQzOTZfaW5pdFZpZGVvIiwoZnVuY3Rpb24oKXt0Mzk2X2luaXRWaWRlbyhpKX0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRIdG1sKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7cis9ImNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSl9fWZ1bmN0aW9uIHQzOTZfYWRkVG9vbHRpcCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO3IrPSJjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxoZWlnaHR1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMsdGlwcG9zaXRpb24iLGkuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpLHRfb25GdW5jTG9hZCgidDM5Nl9pbml0VG9vbHRpcCIsKGZ1bmN0aW9uKCl7dDM5Nl9pbml0VG9vbHRpcChpKX0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRGb3JtKHQsZSxpKXt2YXIgcj10Mzk2X2dldEVsKGUpO2lmKHIpe3ZhciBvPSJ3aWR0aCx0b3AsbGVmdCwiLG47bys9ImlucHV0cyxjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiLHIuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsbyk7dmFyIGE9ci5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpLGw9ci5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9faW5wdXRzLXRleHRhcmVhIik7bCYmKG49bC52YWx1ZSksdF9vbkZ1bmNMb2FkKCJ0X3plcm9Gb3Jtc19faW5pdCIsKGZ1bmN0aW9uKCl7dDM5Nl9lbGVtX19yZW5kZXJWaWV3KHIpLHRfemVyb0Zvcm1zX19pbml0KGksYSxuKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcocil9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkR2FsbGVyeSh0LGUsaSl7dmFyIHI9dDM5Nl9nZXRFbChlKTtpZihyKXt2YXIgbz0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7bys9ImltZ3MsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsaGVpZ2h0dW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIixyLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLG8pLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhyKTt2YXIgbj1yLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIik7dF9vbkZ1bmNMb2FkKCJ0X3plcm9HYWxsZXJ5X19pbml0IiwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19pbml0KGksbil9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkVmVjdG9yKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsZmlsZXdpZHRoLGZpbGVoZWlnaHQsdG9wLGxlZnQsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIjtpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKX19ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KTtpZighaSlyZXR1cm4gbnVsbDtpZihpLmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSlyZXR1cm4gdDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShpLGUpO3ZhciByPWkuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIiksbz1yLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG49ImFiIitvLGE7dm9pZCAwPT09d2luZG93LnRuW25dJiYodDM5Nl9pbml0VE5vYmoobyxyKSx0Mzk2X3N3aXRjaFJlc29sdXRpb24obyx0Mzk2X2RldGVjdFJlc29sdXRpb24obykpKTt2YXIgbD13aW5kb3cudG5bbl0uY3VyUmVzb2x1dGlvbixkPXdpbmRvdy50bltuXS5jdXJSZXNvbHV0aW9uX21heCxfPXdpbmRvdy50bltuXS5zY3JlZW5zLHM7aWYoIShzPWw9PT1kP2kuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLSIrZSsiLXZhbHVlIik6aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtIitlKyItcmVzLSIrbCsiLXZhbHVlIikpJiYiIiE9PXMpZm9yKHZhciB1PTA7dTxfLmxlbmd0aDt1Kyspe3ZhciBjPV9bdV07aWYoIShjPD1sKSYmKHM9Yz09PWQ/aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtIitlKyItdmFsdWUiKTppLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC0iK2UrIi1yZXMtIitjKyItdmFsdWUiKSkpYnJlYWt9cmV0dXJuIHN9ZnVuY3Rpb24gdDM5Nl9lbGVtX19yZW5kZXJWaWV3KHQpe3ZhciBlPXQzOTZfZ2V0RWwodCksaT1lP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIpOiIiO2kmJihpPWkuc3BsaXQoIiwiKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoZSx0KX0pKX1mdW5jdGlvbiB0Mzk2X2dyb3VwX19yZW5kZXJWaWV3KHQpe3ZhciBlPXQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIik6IiI7ZSYmKGU9ZS5zcGxpdCgiLCIpKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgaT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHQsZSk7c3dpdGNoKGUpe2Nhc2UibGVmdCI6aT10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUodCxlLGkpLHQuc3R5bGUubGVmdD1wYXJzZUZsb2F0KGkpLnRvRml4ZWQoMSkrInB4IjticmVhaztjYXNlInRvcCI6aT10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUodCxlLGkpLHQuc3R5bGUudG9wPXBhcnNlRmxvYXQoaSkudG9GaXhlZCgxKSsicHgiO2JyZWFrO2Nhc2UiY29udGFpbmVyIjp0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZCh0LCJsZWZ0IiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQodCwidG9wIil9fSkpfWZ1bmN0aW9uIHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KTtpZihpKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG89cj9yLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik6IiIsbixhPSJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShpLmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLCJ1cHNjYWxlIik7aWYoInllcyIhPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZS1vZmYiKXx8IWF8fCJlZGl0Ij09PW8pe3ZhciBsPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLGUpLGQsXz1bImZpbGwiLCJodWciXSxzPXQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20oaSk7c3dpdGNoKGUpe2Nhc2UibGVmdCI6bD10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoaSxlLGwpLGw9cz90Mzk2X196b29taWZ5VmFsdWUoaSxsKTpwYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4IixpLnN0eWxlLmxlZnQ9bDticmVhaztjYXNlInRvcCI6bD10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoaSxlLGwpLGw9cz90Mzk2X196b29taWZ5VmFsdWUoaSxsKTpwYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4IixpLnN0eWxlLnRvcD1sO2JyZWFrO2Nhc2Uid2lkdGgiOmQ9aS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7dmFyIHU9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksIndpZHRobW9kZSIpO2lmKCJ0ZXh0Ij09PWQmJiJhdXRvd2lkdGgiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksInRleHRmaXQiKSlyZXR1cm4gdm9pZChpLnN0eWxlLndpZHRoPSJhdXRvIik7aWYoXy5pbmNsdWRlcyh1KSlyZXR1cm4gdm9pZChpLnN0eWxlLndpZHRoPSIiKTtzd2l0Y2gobD10Mzk2X2VsZW1fX2dldFdpZHRoKGksbCksaS5zdHlsZS53aWR0aD1wYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4IixkKXtjYXNlInRvb2x0aXAiOnZhciBjPWkucXVlcnlTZWxlY3RvckFsbCgiLnRuLWF0b21fX3Bpbi1pY29uIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLChmdW5jdGlvbih0KXt2YXIgZT1wYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4Ijt0LnN0eWxlLndpZHRoPWUsdC5zdHlsZS5oZWlnaHQ9ZX0pKSxpLnN0eWxlLmhlaWdodD1wYXJzZUludChsKS50b0ZpeGVkKDEpKyJweCI7YnJlYWs7Y2FzZSJnYWxsZXJ5Ijp0Mzk2X2VsZW1fX3NldEdhbGxlcnlTaXplKGksIndpZHRoIixsLHMpfWJyZWFrO2Nhc2UiaGVpZ2h0IjpkPWkuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3ZhciBmPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJoZWlnaHRtb2RlIiksdz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwidGV4dGZpdCIpO2lmKCJ0ZXh0Ij09PWQmJihbImF1dG93aWR0aCIsImF1dG9oZWlnaHQiXS5pbmNsdWRlcyh3KXx8IXcpKXJldHVybiB2b2lkKGkuc3R5bGUuaGVpZ2h0PSJhdXRvIik7aWYoXy5pbmNsdWRlcyhmKSYmInRvb2x0aXAiIT09ZClyZXR1cm4gdm9pZChpLnN0eWxlLmhlaWdodD0iIik7aWYoInRvb2x0aXAiPT09ZClyZXR1cm47bD10Mzk2X2VsZW1fX2dldEhlaWdodChpLGwpLGkuc3R5bGUuaGVpZ2h0PXBhcnNlRmxvYXQobCkudG9GaXhlZCgxKSsicHgiLCJnYWxsZXJ5Ij09PWQmJnQzOTZfZWxlbV9fc2V0R2FsbGVyeVNpemUoaSwiaGVpZ2h0IixsKTticmVhaztjYXNlImNvbnRhaW5lciI6dDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwibGVmdCIpLHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpO2JyZWFrO2Nhc2UiaW5wdXRzIjp2YXIgZz1pLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtdGV4dGFyZWEiKTtsPWc/Zy52YWx1ZToiIjt0cnl7d2luZG93LnRfemVyb0Zvcm1zX19yZW5kZXJGb3JtKGksbCl9Y2F0Y2goaCl7fX0id2lkdGgiIT09ZSYmImhlaWdodCIhPT1lJiYiZm9udHNpemUiIT09ZSYmImZvbnRmYW1pbHkiIT09ZSYmImxldHRlcnNwYWNpbmciIT09ZSYmImZvbnR3ZWlnaHQiIT09ZSYmImltZyIhPT1lfHwodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwibGVmdCIpLHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpKX19fWZ1bmN0aW9uIHQzOTZfZWxlbV9fc2V0R2FsbGVyeVNpemUodCxlLGkpe3ZhciByPWksbz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwiYm9yZGVyd2lkdGgiKSxuPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LCJib3JkZXJzdHlsZSIpO24mJm8mJiJub25lIiE9PW58fChvPTApLHItPTIqbzt2YXIgYT1NYXRoLnJvdW5kKHBhcnNlRmxvYXQocikpKyJweCI7YT10Mzk2X196b29taWZ5VmFsdWUodCxhKTt2YXIgbD10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX21haW4iKSxkPXQucXVlcnlTZWxlY3RvckFsbCgiLnRuLWF0b21fX3NsZHMtaW1nIik7dC5zdHlsZVtlXT1hLGwmJihsLnN0eWxlW2VdPWEpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCwoZnVuY3Rpb24odCl7dC5zdHlsZVtlXT1hfSkpfWZ1bmN0aW9uIHQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZSh0LGUsaSl7dmFyIHI9dDM5Nl9nZXRFbCh0KTtpZighcilyZXR1cm4gbnVsbDt2YXIgbz1yLmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLG49by5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxhPSJhYiIrbixsPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywidmFsaWduIiksZD0id2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywidXBzY2FsZSIpLF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxzLHU9ImVkaXQiPT09KF8/Xy5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOiIiKSxjPXQzOTZfaXNPbmx5U2NhbGFibGVCcm93c2VyKCksZj0hdSYmZCYmYyx3PSF1JiZkJiYhYyxnPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShyLCJheGlzeSIpLGg9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsImF4aXN4IikscD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUociwiY29udGFpbmVyIiksbT1yLmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSYmInBoeXNpY2FsIj09PXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUociwidHlwZSIpLGI9ci5wYXJlbnROb2RlLmNsb3Nlc3QoIi50bi1ncm91cCIpLHY9InBoeXNpY2FsIj09PXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoYiwidHlwZSIpO20mJihwPXB8fCJncmlkIik7dmFyIHk9cGFyc2VJbnQoaSksRixBLHgsUyxWLEUsayx6PXQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3RvcihuKTtzd2l0Y2goZSl7Y2FzZSJsZWZ0Ijp2YXIgSSxCPXQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aCxMO2lmKEY9ImdyaWQiPT09cD8iZ3JpZCI6IndpbmRvdyIsQT0iZ3JpZCI9PT1wP3dpbmRvdy50blthXS5ncmlkX29mZnNldF9sZWZ0OjAsVj0iZ3JpZCI9PT1wP3dpbmRvdy50blthXS5ncmlkX3dpZHRoOkIsIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsImxlZnR1bml0cyIpJiYoeT10Mzk2X3JvdW5kRmxvYXQoVip5LzEwMCkpLHYpe3ZhciBPPXBhcnNlSW50KHQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoYiwibGVmdCIpLDEwKSxUOyIlIj09PXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoYiwibGVmdHVuaXRzIikmJihPPXQzOTZfcm91bmRGbG9hdChWKk8vMTAwKSkseS09TzticmVha30hdSYmZD8iZ3JpZCI9PT1wJiZjJiYoeSo9eik6eT1BK3ksImNlbnRlciI9PT1oJiYoUz10Mzk2X2VsZW1fX2dldFdpZHRoKHIpLGYmJiJ3aW5kb3ciIT09RiYmKFYqPXosUyo9eikseT1WLzItUy8yK3kpLCJyaWdodCI9PT1oJiYoUz10Mzk2X2VsZW1fX2dldFdpZHRoKHIpLGYmJiJ3aW5kb3ciIT09RiYmKFYqPXosUyo9eikseT1WLVMreSksZiYmIndpbmRvdyIhPT1GJiYoeSs9KChTPXQzOTZfZWxlbV9fZ2V0V2lkdGgocikpKnotUykvMik7YnJlYWs7Y2FzZSJ0b3AiOnZhciBSPXIuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikscT1SP1IuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1pbi1vZmZzZXQtdG9wIik6IjAiLFc9Uj9SLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1taW4taGVpZ2h0Iik6IjAiLEg9Uj9SLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1tYXgtaGVpZ2h0Iik6IjAiLEM9ZnVuY3Rpb24gdChlKXt2YXIgaT10Mzk2X2VsZW1fX2dldEhlaWdodChlKTtpZihlJiYiaW1hZ2UiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIikpe3ZhciByPXQzOTZfZWxlbV9fZ2V0V2lkdGgoZSksbz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwiZmlsZXdpZHRoIiksbj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwiZmlsZWhlaWdodCIpLGE7aWYobyYmbilpPXIvKHBhcnNlSW50KG8pL3BhcnNlSW50KG4pKX1yZXR1cm4gaX0sUDtpZihGPSJncmlkIj09PXA/ImdyaWQiOiJ3aW5kb3ciLHg9ImdyaWQiPT09cD9wYXJzZUZsb2F0KHEpOjAsaz0iZ3JpZCI9PT1wP3BhcnNlRmxvYXQoVyk6cGFyc2VGbG9hdChIKSwiJSI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUociwidG9wdW5pdHMiKSYmKHk9ayooeS8xMDApKSx2KXt2YXIgTT1wYXJzZUludCh0Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsInRvcCIpLDEwKSxOOyIlIj09PXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoYiwidG9wdW5pdHMiKSYmKE09dDM5Nl9yb3VuZEZsb2F0KGsqTS8xMDApKSx5LT1NO2JyZWFrfWYmJiJ3aW5kb3ciIT09RiYmKHkqPXopLHcmJiJ3aW5kb3ciIT09RiYmKHg9InN0cmV0Y2giPT09bD8wOngveikseT14K3k7dmFyIEQ9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShSLCJoZWlnaHRfdmgiKSxqPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoUiwiaGVpZ2h0IiksRz10Mzk2X2FiX19nZXRIZWlnaHQoUiksWjtpZihkJiYhdSYmRCYmKFo9cGFyc2VJbnQoaiwxMCkqeiksImNlbnRlciI9PT1nJiYoRT1DKHIpLGYmJiJ3aW5kb3ciIT09RiYmKCJzdHJldGNoIiE9PWw/ayo9ejprPVo/Wj5HP1o6RzpSLmNsaWVudEhlaWdodCxFKj16KSx1fHwhZHx8Y3x8IndpbmRvdyI9PT1GfHwic3RyZXRjaCIhPT1sfHwoaz1aP1o+Rz9aOkc6Ui5jbGllbnRIZWlnaHQsay89eikseT1rLzItRS8yK3kpLCJib3R0b20iPT09ZyYmKEU9QyhyKSxmJiYid2luZG93IiE9PUYmJigic3RyZXRjaCIhPT1sP2sqPXo6az1aP1o+Rz9aOkc6Ui5jbGllbnRIZWlnaHQsRSo9eiksdXx8IWR8fGN8fCJ3aW5kb3ciPT09Rnx8InN0cmV0Y2giIT09bHx8KGs9Wj9aPkc/WjpHOlIuY2xpZW50SGVpZ2h0LGsvPXopLHk9ay1FK3kpLGYmJiJ3aW5kb3ciIT09Ril7dmFyIFU9KChFPUMocikpKnotRSkvMjt5Kz1VPU1hdGgucm91bmQoVSl9fXJldHVybiB5fWZ1bmN0aW9uIHQzOTZfZWxlbV9maW5kRmlyc3RMZXZlbFBhcmVudEdyb3VwKHQpe2Zvcih2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2U7KXt2YXIgaT1lLnBhcmVudEVsZW1lbnQuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIik7aWYoIWkpYnJlYWs7ZT1pfXJldHVybiBlfWZ1bmN0aW9uIHQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCxlKXtpZighdClyZXR1cm4gbnVsbDt2YXIgaSxyPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksbz0iYWIiK3Isbjt2b2lkIDA9PT13aW5kb3cudG5bb10mJih0Mzk2X2luaXRUTm9iaihyLHQpLHQzOTZfc3dpdGNoUmVzb2x1dGlvbihyLHQzOTZfZGV0ZWN0UmVzb2x1dGlvbihyKSkpO3ZhciBhPXdpbmRvdy50bltvXS5jdXJSZXNvbHV0aW9uLGw9d2luZG93LnRuW29dLmN1clJlc29sdXRpb25fbWF4LGQ9d2luZG93LnRuW29dLnNjcmVlbnM7aWYobnVsbD09PShpPWE9PT1sP3QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLSIrZSk6dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtIitlKyItcmVzLSIrYSkpKWZvcih2YXIgXz0wO188ZC5sZW5ndGg7XysrKXt2YXIgcz1kW19dO2lmKCEoczw9YSkmJm51bGwhPT0oaT1zPT09bD90LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLSIrZSsiLXJlcy0iK3MpKSlicmVha31yZXR1cm4gaX1mdW5jdGlvbiB0Mzk2X2FiX19yZW5kZXJWaWV3T25lRmllbGQodCxlKXt0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsZSl9ZnVuY3Rpb24gdDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHQsZSl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIik/dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsZSk6dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LGUpfWZ1bmN0aW9uIHQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCxlKXtpZighdClyZXR1cm4gbnVsbDt2YXIgaSxyLG89ImFiIit0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG49d2luZG93LnRuW29dLmN1clJlc29sdXRpb24sYT13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbl9tYXgsbD13aW5kb3cudG5bb10uc2NyZWVucyxkPVsid2lkdGhtb2RlIiwiaGVpZ2h0bW9kZSIsImZsZXgiXS5pbmNsdWRlcyhlKT8iIjoiLXZhbHVlIjtpZihudWxsPT09KGk9bj09PWE/dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlK2QpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWdyb3VwLSIrZSsiLXJlcy0iK24rZCkpKWZvcih2YXIgXz0wO188bC5sZW5ndGg7XysrKXt2YXIgcz1sW19dO2lmKCEoczw9bikmJm51bGwhPT0oaT1zPT09YT90LmdldEF0dHJpYnV0ZSgiZGF0YS1ncm91cC0iK2UrZCk6dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlKyItcmVzLSIrcytkKSkpYnJlYWt9cmV0dXJuIGl9ZnVuY3Rpb24gdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcodCl7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudG4tZ3JvdXAiKSxpPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlLChmdW5jdGlvbih0KXtyZXR1cm4icGh5c2ljYWwiPT09dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LCJ0eXBlIil9KSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt0Mzk2X2dyb3VwX19yZW5kZXJWaWV3KHQpLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3QXV0b2xheW91dCh0KX0pKX19ZnVuY3Rpb24gdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXdBdXRvbGF5b3V0KHQpe2lmKHQmJnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cC1mbGV4Iikpe3ZhciBlPXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCwid2lkdGhtb2RlIiksaT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodG1vZGUiKTsiZmlsbCI9PT1lPyh0LnN0eWxlLndpZHRoPSIxMDAlIix0LnN0eWxlLmZsZXhTaHJpbms9IjEiKToodC5zdHlsZS53aWR0aD0iaHVnIj09PWU/Im1pbi1jb250ZW50IjoiIix0LnN0eWxlLmhlaWdodD0iaHVnIj09PWk/ImluaXRpYWwiOiIiLHQuc3R5bGUuZmxleFNocmluaz0iIil9fWZ1bmN0aW9uIHQzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcodCl7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudG4tZWxlbSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dDM5Nl9lbGVtX19yZW5kZXJWaWV3KHQpfSkpfX1mdW5jdGlvbiB0Mzk2X2FiX19nZXRIZWlnaHQodCxlKXt2YXIgaT1lO2l8fChpPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0IikpLGk9cGFyc2VGbG9hdChpKTt2YXIgcj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodF92aCIpO2lmKHImJihyPXBhcnNlRmxvYXQociksIWlzTmFOKHIpKSl7dmFyIG89dDM5Nl9hYl9fZ2V0V2luZG93SGVpZ2h0KHQpKnIvMTAwO2k8byYmKGk9byl9cmV0dXJuIGl9ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRXaWR0aCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwodCkscixvLG49ImFiIitpLmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLGE9ZSxsLGQsXyxzOyhhfHwoYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwid2lkdGgiKSksYT1wYXJzZUZsb2F0KGEpLCIlIj09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ3aWR0aHVuaXRzIikpJiYoYT0id2luZG93Ij09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJjb250YWluZXIiKT90Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGgqYS8xMDA6d2luZG93LnRuW25dLmdyaWRfd2lkdGgqYS8xMDApO3JldHVybiBhfWZ1bmN0aW9uIHQzOTZfZWxlbV9fZ2V0SGVpZ2h0KHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KSxyPWU7cnx8KHI9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImhlaWdodCIpKSxyPXBhcnNlRmxvYXQocik7dmFyIG89aS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIiksbj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwidGV4dGZpdCIpLGE7aWYoInNoYXBlIj09PW98fCJ2aWRlbyI9PT1vfHwiaHRtbCI9PT1vfHwiZ2FsbGVyeSI9PT1vfHwiYnV0dG9uIj09PW98fCJ0ZXh0Ij09PW8mJiJmaXhlZHNpemUiPT09bil7dmFyIGw7aWYoIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImhlaWdodHVuaXRzIikpe3ZhciBkPWkuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIiksXz1kP2QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1pbi1oZWlnaHQiKToiMCIscz1kP2QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1heC1oZWlnaHQiKToiMCIsdT1wYXJzZUZsb2F0KF8pLGM9cGFyc2VGbG9hdChzKSxmO3I9IndpbmRvdyI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiY29udGFpbmVyIik/Yyooci8xMDApOnUqKHIvMTAwKX1yZXR1cm4gcn1pZigidGV4dCI9PT1vKXt2YXIgdz1pLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik7dyYmKHcuc3R5bGUubGluZUhlaWdodD0iIil9cmV0dXJuIGkuY2xpZW50SGVpZ2h0fWZ1bmN0aW9uIHQzOTZfcm91bmRGbG9hdCh0KXtyZXR1cm4gTWF0aC5yb3VuZCgxMDAqdCkvMTAwfWZ1bmN0aW9uIHQzOTZfcmVtb3ZlRWxlbWVudEZyb21ET00odCl7dmFyIGU9dDM5Nl9nZXRFbCh0KTtlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX1mdW5jdGlvbiB0Mzk2X2dldEVsKHQpe3JldHVybiB3aW5kb3cualF1ZXJ5JiZ0IGluc3RhbmNlb2YgalF1ZXJ5P3QubGVuZ3RoP3QuZ2V0KDApOm51bGw6dH1mdW5jdGlvbiB0Mzk2X2lzQmxvY2tWaXNpYmxlKHQpe3ZhciBlPXdpbmRvdy5pbm5lcldpZHRoLGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1pbiIpLHI9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1heCIpO3JldHVybiEoaSYmZTxwYXJzZUludChpLDEwKSkmJiEociYmZT5wYXJzZUludChyLDEwKSl9ZnVuY3Rpb24gdDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpe2lmKCF3aW5kb3cudG4uaXNFZGl0TW9kZSlyZXR1cm4gMDt2YXIgdCxlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoIi0tcGFnZS12aWV3LXdpZHRoIik7cmV0dXJuIGUmJiIxMDAlIiE9PWU/cGFyc2VJbnQoZSwxMCk6MH1mdW5jdGlvbiB0Mzk2X19pc0FsbFplcm9CbG9ja3NSZW5kZXJlZCh0LGUpe3ZvaWQgMD09PWUmJihlPTApO3ZhciBpPXQzOTZfX2dldFplcm9CbG9ja3MoKSxyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbz1yJiYiZWRpdCI9PT1yLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIiksbj0icmVhZHkiPT09ZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoImRhdGEtcmVhZHktc3RhdHVzIiksYT0hMTtpZihpLmxlbmd0aHx8IW98fG4pe2lmKCFpLmxlbmd0aCYmbyYmbilyZXR1cm4gZT4zMD92b2lkIHQoKTp2b2lkIHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dDM5Nl9faXNBbGxaZXJvQmxvY2tzUmVuZGVyZWQodCxlKzEpfSksMTAwKTt2YXIgbD1pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuYXJ0Ym9hcmR9KSksZDtpZihsLmxlbmd0aD4wJiZsLmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil9KSkpdCgpO2Vsc2V7dmFyIF89bC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKX0pKTtsLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfHxlLmFkZEV2ZW50TGlzdGVuZXIoImFydEJvYXJkUmVuZGVyZWQiLChmdW5jdGlvbigpe18ucHVzaChlKSxfLmxlbmd0aCE9PWwubGVuZ3RofHxhfHx0KCl9KSl9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXthPSEwLF8ubGVuZ3RoIT09bC5sZW5ndGgmJnQoKX0pLDNlMyl9fWVsc2V7dmFyIHM9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKGUpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7InJlYWR5Ij09PWUudGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0YS1yZWFkeS1zdGF0dXMiKSYmKHMuZGlzY29ubmVjdCgpLHQzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKHQpKX0pKX0pKTtzLm9ic2VydmUoZG9jdW1lbnQuYm9keSx7YXR0cmlidXRlczohMCxhdHRyaWJ1dGVGaWx0ZXI6WyJkYXRhLXJlYWR5LXN0YXR1cyJdfSl9fWZ1bmN0aW9uIHQzOTZfX3Byb2Nlc3NFbGVtZW50c1RyYW5zZm9ybSh0KXt2YXIgZT10Mzk2X19pbml0RmFzdERPTSgpLGk9W107ZS5yZWFkKChmdW5jdGlvbigpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7aWYoInRleHQiPT09ZXx8ImltYWdlIj09PWV8fCJzaGFwZSI9PT1lfHwiYnV0dG9uIj09PWV8fCJ2ZWN0b3IiPT09ZSl7dmFyIHI9Z2V0Q29tcHV0ZWRTdHlsZSh0KSxvPXIuYmFja2Ryb3BGaWx0ZXImJiJub25lIiE9PXIuYmFja2Ryb3BGaWx0ZXJ8fHIud2Via2l0QmFja2Ryb3BGaWx0ZXImJiJub25lIiE9PXIud2Via2l0QmFja2Ryb3BGaWx0ZXIsbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0eWxlIik7aWYobyYmIW4pe3ZhciBhPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKSxsPWE/d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkudHJhbnNmb3JtOiJub25lIjsibWF0cml4KDEsIDAsIDAsIDEsIDAsIDApIj09PWwmJihsPSJub25lIiksIm5vbmUiIT09bCYmaS5wdXNoKHtlbGVtZW50OnQsYXRvbTphLGF0b21UcmFuc2Zvcm06bH0pfX19KSl9KSksZS53cml0ZSgoZnVuY3Rpb24oKXtpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYXRvbS5zdHlsZS50cmFuc2Zvcm09Im5vbmUiLHQuZWxlbWVudC5zdHlsZS50cmFuc2Zvcm09dC5hdG9tVHJhbnNmb3JtfSkpfSkpfWZ1bmN0aW9uIHQzOTZfX2ZpeEVsZW1lbnRzTGluZUhlaWdodHModCl7dmFyIGU9dDM5Nl9faW5pdEZhc3RET00oKSxpPVtdO2UucmVhZCgoZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlO2lmKCJ0ZXh0Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpKXt2YXIgcj10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik7aWYocil7dmFyIG89dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtpZighb3x8IW8uc3R5bGUuem9vbSl7dmFyIG49dC5zdHlsZS56b29tLGE9ci5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdCxsPXIuc3R5bGUuZm9udFNpemU7aS5wdXNoKHtlbGVtZW50OnQsYXRvbTpyLHpvb206bix0ZXh0U2l6ZUFkanVzdDphLGZvbnRTaXplOmx9KX19fX0pKX0pKSxlLndyaXRlKChmdW5jdGlvbigpe2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hdG9tLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJsaW5lLWhlaWdodCIpLHdpbmRvdy50Mzk2X19pc1NhZmFyaSYmdC56b29tJiYodC5hdG9tLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSJub25lIix0LmF0b20uc3R5bGUuZm9udFNpemU9IiIsdC5lbGVtZW50LnN0eWxlLnpvb209IiIpfSkpfSkpLGUucmVhZCgoZnVuY3Rpb24oKXtpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY29tcHV0ZWRMaW5lSGVpZ2h0PXBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodC5hdG9tKS5saW5lSGVpZ2h0KX0pKX0pKSxlLndyaXRlKChmdW5jdGlvbigpe2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5jb21wdXRlZExpbmVIZWlnaHQ7d2luZG93LnQzOTZfX2lzU2FmYXJpJiZ0Lnpvb20mJih0LmF0b20uc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9dC50ZXh0U2l6ZUFkanVzdCx0LmF0b20uc3R5bGUuZm9udFNpemU9dC5mb250U2l6ZSx0Lnpvb20mJih0LmVsZW1lbnQuc3R5bGUuem9vbT10Lnpvb20pKSxlJiYhaXNOYU4oZSkmJih0LmF0b20uc3R5bGUubGluZUhlaWdodD1NYXRoLnJvdW5kKGUpKyJweCIpfSkpfSkpfWZ1bmN0aW9uIHQzOTZfX2ZpeEVsZW1lbnRzRm9udFNpemVzKHQpe3ZhciBlPSF3aW5kb3cudDM5Nl9faXNNb2JpbGUmJndpbmRvdy50Mzk2X19pc0lQYWQ7aWYoZXx8d2luZG93LnQzOTZfX2lzRmFjZWJvb2tNZXNzZW5nZXJJbkFwcHx8d2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHApe3ZhciBpPXQzOTZfX2luaXRGYXN0RE9NKCkscj1bXTtpLnJlYWQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtpZigidGV4dCI9PT1lfHwiYnV0dG9uIj09PWUpe3ZhciBpPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtpZihpKXt2YXIgbz10Mzk2X2VsZW1fZmluZEZpcnN0TGV2ZWxQYXJlbnRHcm91cCh0KSxuPXtlbGVtZW50OnQsYXRvbTppLHpvb206MSxlbGVtZW50VHlwZTplfTtpZihvJiZvLnN0eWxlLnpvb20mJihuLnpvb209cGFyc2VGbG9hdChvLnN0eWxlLnpvb20pKSwxIT09bi56b29tKXtpZigidGV4dCI9PT1lKXt2YXIgYT10LnBhcmVudE5vZGUuY2xvc2VzdCgiLnRuLWdyb3VwIil8fHQucGFyZW50Tm9kZSxsPWEmJnQzOTZfX2lzRmxleChhKTtuLndpZHRoPXQuc3R5bGUud2lkdGgsbi5oZWlnaHQ9dC5zdHlsZS5oZWlnaHQsbi5pc1BhcmVudEdyb3VwQXV0b2xheW91dD1sfXIucHVzaChuKX19fX0pKX0pKSxpLndyaXRlKChmdW5jdGlvbigpe3IuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hdG9tLnN0eWxlLmZvbnRTaXplPSIifSkpfSkpLGkucmVhZCgoZnVuY3Rpb24oKXtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodC5hdG9tKS5mb250U2l6ZSk7dC5jb3JyZWN0Rm9udFNpemU9ZSpNYXRoLnBvdyh0Lnpvb20sMil9KSl9KSksaS53cml0ZSgoZnVuY3Rpb24oKXtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UmJigidGV4dCIhPT10LmVsZW1lbnRUeXBlfHx0LmlzUGFyZW50R3JvdXBBdXRvbGF5b3V0fHwodC53aWR0aCYmImF1dG8iIT09dC53aWR0aCYmKHQuZWxlbWVudC5zdHlsZS53aWR0aD0iY2FsYygiK3Qud2lkdGgrIiAqIHZhcigtLXpvb20sIDEpKSIpLHQuaGVpZ2h0JiYiYXV0byIhPT10LmhlaWdodCYmKHQuZWxlbWVudC5zdHlsZS5oZWlnaHQ9ImNhbGMoIit0LmhlaWdodCsiICogdmFyKC0tem9vbSwgMSkpIikpKSx0LmF0b20uc3R5bGUuZm9udFNpemU9TWF0aC5mbG9vcih0LmNvcnJlY3RGb250U2l6ZSkrInB4In0pKX0pKX19ZnVuY3Rpb24gdDM5Nl9faW5pdEZhc3RET00oKXtyZXR1cm57cmVhZDpmdW5jdGlvbiB0KGUpe2UoKX0sd3JpdGU6ZnVuY3Rpb24gdChlKXtlKCl9fX1mdW5jdGlvbiB0Mzk2X19hcHBseUZpeGVzRm9yQWxsRWxlbWVudHMoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudDM5Nl9fZWxlbSIpLGU9d2luZG93LnQzOTZfX2lzU2FmYXJpfHx3aW5kb3cudDM5Nl9faXNGYWNlYm9va01lc3NlbmdlckluQXBwfHx3aW5kb3cudDM5Nl9faXNJbnN0YWdyYW1JbkFwcDtkb2N1bWVudC5mb250cyYmZT9kb2N1bWVudC5mb250cy5yZWFkeS50aGVuKChmdW5jdGlvbigpe3QzOTZfX2ZpeEVsZW1lbnRzRm9udFNpemVzKHQpLHQzOTZfX2ZpeEVsZW1lbnRzTGluZUhlaWdodHModCl9KSk6dDM5Nl9fZml4RWxlbWVudHNMaW5lSGVpZ2h0cyh0KSx0Mzk2X19wcm9jZXNzRWxlbWVudHNUcmFuc2Zvcm0odCl9ZnVuY3Rpb24gdDM5Nl9fem9vbWlmeVZhbHVlKHQsZSl7dmFyIGkscj1lKyhTdHJpbmcoZSkuZW5kc1dpdGgoInB4Iik/IiI6InB4IiksbztyZXR1cm4gdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpP3I6ImNhbGMoIityKyIgKiB2YXIoLS16b29tLCAxKSkifWZ1bmN0aW9uIHQzOTZfX2lzSW5zaWRlR3JvdXBXaXRoWm9vbSh0KXtmb3IodmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtlOyl7dmFyIGk7aWYoZS5zdHlsZS56b29tKXJldHVybiEwO2U9bnVsbD09KGk9ZS5wYXJlbnRFbGVtZW50KT92b2lkIDA6aS5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKX1yZXR1cm4hMX1mdW5jdGlvbiB0Mzk2X19pc0luUG9wdXAodCl7aWYoIXQpcmV0dXJuITE7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxpLHI7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpLnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXBvcHVwX19jb250YWluZXIiKX1mdW5jdGlvbiB0Mzk2X193YWl0Rm9yUG9wdXAoKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3ZhciBlPTAsaT01O2Z1bmN0aW9uIHIoKXt2YXIgaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cF9zaG93Iik7aT90KGkpOmU+PTU/dChudWxsKTooZSsrLHNldFRpbWVvdXQociwxMDAqZSkpfXIoKX0pKX1mdW5jdGlvbiB0Mzk2X19zaG91bGRVc2VWaXN1YWxWaWV3cG9ydEhlaWdodCgpe3JldHVybiJ2aXN1YWxWaWV3cG9ydCJpbiB3aW5kb3cmJndpbmRvdy50Mzk2X19pc01vYmlsZSYmd2luZG93LnQzOTZfX2lzU2FmYXJpfWZ1bmN0aW9uIHQzOTZfX2dldFJvb3Rab25lKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlO3JldHVybiB0JiZ0LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1yb290LXpvbmUiKXx8ImNvbSJ9ZnVuY3Rpb24gdDM5Nl9faW50aWFsaXplVW5kZXJjdXQodCl7aWYodCYmdC5xdWVyeVNlbGVjdG9yKCIucWwtdW5kZXJjdXQiKSl7dmFyIGUsaT0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIit0Mzk2X19nZXRSb290Wm9uZSgpKyIvanMvdGlsZGEtdW5kZXJjdXQtMS4wLm1pbi5qcyI7dF9vbkZ1bmNMb2FkKCJ0X2xvYWRKc0ZpbGUiLChmdW5jdGlvbigpe3RfbG9hZEpzRmlsZShpLChmdW5jdGlvbigpe3Rfb25GdW5jTG9hZCgidF9xdWlsbFVuZGVyY3V0X3BhcnNlTm9kZXMiLChmdW5jdGlvbigpe3RfcXVpbGxVbmRlcmN1dF9wYXJzZU5vZGVzKHQpfSkpfSkpfSkpfX1mdW5jdGlvbiB0Mzk2X19pbml0aWFsaXplQXJ0Ym9hcmRPdmVyZmxvdyh0LGUpe2lmKGUmJnQpe3ZhciBpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoIm92ZXJmbG93Iik7aWYoImF1dG8iPT09aSl7dmFyIHI9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpOyJ5IiE9PXdpbmRvdy5sYXp5JiYieWVzIiE9PXJ8fHRfb25GdW5jTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe2UuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKHdpbmRvdy50X2xhenlsb2FkX3VwZGF0ZSw1MDApKX0pKX0iIiE9PXdpbmRvdy5sb2NhdGlvbi5oYXNoJiYidmlzaWJsZSI9PT1pJiYoZS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Uuc3R5bGUub3ZlcmZsb3c9InZpc2libGUifSksMSkpfX1mdW5jdGlvbiB0Mzk2X19pbml0aWFsaXplQW5jaG9yTGlua092ZXJmbG93Rml4KCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXJ0Ym9hcmQtb3ZyZmx3PSJ2aXNpYmxlIl0nKTt0Lmxlbmd0aCYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbihlKXt2YXIgaTtlLnRhcmdldC5jbG9zZXN0KCdhW2hyZWZePSIjIl0nKSYmKHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSJ9KSl9KSkpfSkpfQoKZnVuY3Rpb24gdF9zbGRzSW5pdCh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciBpPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLHI7aWYoaSlpZighaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWluaXRpYWxpemVkIikpe3ZhciBhPWkuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1mZWVkLWNvbnRhaW5lciIpLGw9cy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpO2lmKGwpe2UmJmUucmFuZG9tU29ydCYmKGw9dF9zbGRzX3JhbmRvbVNvcnRFbGVtZW50cyhsKSk7dmFyIGQ9bC5sZW5ndGgsbz1sWzBdLG49bFtsLmxlbmd0aC0xXSxjPXdpbmRvdy5pbm5lcldpZHRoLHU9cGFyc2VJbnQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MCxfPWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikscD1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIikpLGY7aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsLChmdW5jdGlvbih0LGUpe3Quc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IixlKzEpfSkpLCJ0cnVlIiE9PWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpe3B8fDA9PT1wfHwocD0zMDApLGlzTmFOKHApJiZpLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIsIjMwMCIpLGkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtZmFzdCIpfHxpLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLXNsb3ciKXx8aS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1ub25lIil8fGkuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLWZhc3QiKTt2YXIgbT11O3Rfc2xkc19zZXRJdGVtc0luUm93KHQpLHRfc2xkc19jaGFuZ2VJbWFnZVVybCh0KTt2YXIgeT04PT09ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PT09ZG9jdW1lbnQuZG9jdW1lbnRNb2RlO3kmJihpLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1mYXN0IiksaS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtc2xvdyIpLGkuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSxpLmNsYXNzTGlzdC5hZGQoInQtc2xkc19pZSIpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodCIsInRydWUiKSxpLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiwxKSksaS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWluaXRpYWxpemVkIiwidHJ1ZSIpLGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpfHxpLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiLGQpO3ZhciB2PTEsZz1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIik7Zz92PXBhcnNlSW50KGcsMTApOmkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLDEpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsIiIpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hbmltYXRlZCIsIiIpLGF8fHRfc2xkc19fY3JlYXRlRHVtbWllcyhvLG4saSksdT1wYXJzZUludChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiksMTApfHwwO3ZhciBiPXMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIpO2IubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGIsKGZ1bmN0aW9uKHQpe3Quc3R5bGUuZGlzcGxheT0iZmFsc2UiPT09XyYmZC11PD0wPyJub25lIjoiIn0pKSxhfHx0X3NsZHNfU2xpZGVyV2lkdGgodCksInRydWUiPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiKSYmdF9zbGRzX1NsaWRlckhlaWdodCh0KSx0X3NsZHNfU2xpZGVyQXJyb3dzSGVpZ2h0KHQpLHRfc2xkc19BY3RpdmVTbGlkZSh0LHYsZCksdF9zbGRzX0FjdGl2ZUNhcHRpb24odCx2LGQpLGE/Yz45NjAmJigidHJ1ZSI9PT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1mZWVkcy1wb3N0cy1sb2FkZWQiKT8odF9zbGRzX19pbml0RmVlZHNTbGlkZXIodCxzLGUpLHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxlKSk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZmVlZHNMb2FkUG9zdHMiLChmdW5jdGlvbigpe3Rfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQscyxlKSx0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQsZSl9KSkpOih5fHx0X3NsZHNfb25IYW1tZXJMb2FkKCJIYW1tZXIiLChmdW5jdGlvbigpe3Rfc2xkc19pbml0U2xpZGVyU3dpcGUodCxkLGMpfSkpLHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxlKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpKSxpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIpPjA/dF9zbGRzX2luaXRBdXRvUGxheSh0LHYsZCxlKTppLmFkZEV2ZW50TGlzdGVuZXIoInNsaWRlQXV0b3BsYXlUaW1lclJlYWR5IiwoZnVuY3Rpb24oKXtpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIpPjAmJnRfc2xkc19pbml0QXV0b1BsYXkodCx2LGQsZSl9KSkscy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtLWxvYWRlZCIpLmxlbmd0aDxkKzImJnRfc2xkc19VcGRhdGVJbWFnZXModCx2KSwieWVzIj09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWFycm93cy1uZWFycGljIikmJnRfc2xkc19wb3NpdGlvbkFycm93cyh0KTt2YXIgaD1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHMiKTtoLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChoLChmdW5jdGlvbih0KXt0LnN0eWxlLnZpc2liaWxpdHk9IiJ9KSksdF9zbGRzX19zZXRUYWJpbmRleEZvckZvY3VzYWJsZUVsZW1lbnRzKHQpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLHRfc2xkc191cGRhdGVPbkRpc3BsYXlDaGFuZ2UpLHMuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLHRfc2xkc191cGRhdGVPbkRpc3BsYXlDaGFuZ2UodCxtKSksYSYmKHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLHRfc2xkc191cGRhdGVGZWVkc1NsaWRlck9uUmVzaXplKSxzLmFkZEV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIiwoZnVuY3Rpb24oKXt0X3NsZHNfdXBkYXRlRmVlZHNTbGlkZXJPblJlc2l6ZSh0LHMsZSl9KSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3NsZHNfc2V0SXRlbXNJblJvdyh0LG0pLHRfc2xkc191cGRhdGVTbGlkZXIodCksdF9zbGRzX3Bvc2l0aW9uQXJyb3dzKHQpLGEmJnRfc2xkc191cGRhdGVGZWVkc1NsaWRlck9uUmVzaXplKHQscyxlKX0pLDEwMCl9KSkpLHdpbmRvdy50X3NsZHNfX2lzaU9TJiYoImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/dF9zbGRzX19oaWRlTW9iaWxlU2xpZGVzKHMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3Rfc2xkc19faGlkZU1vYmlsZVNsaWRlcyhzLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIikpfSkpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7InRydWUiPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiKSYmdF9zbGRzX1VwZGF0ZVNsaWRlckhlaWdodCh0KSx0X3NsZHNfVXBkYXRlU2xpZGVyQXJyb3dzSGVpZ2h0KHQpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zbGRzX1VwZGF0ZVNsaWRlckFycm93c0hlaWdodCh0KX0pLDUwMCk7dmFyIEE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FsbHJlY29yZHMiKTtBJiZBLmFkZEV2ZW50TGlzdGVuZXIoImFsbFJlY1BhZGRpbmdJbml0IiwoZnVuY3Rpb24oKXt0X3NsZHNfdXBkYXRlU2xpZGVyKHQpfSkpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3NsZHNfX3JlbW92ZUF1dG9wbGF5QnlWaWRlbyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfc2xkc19fcmVtb3ZlQXV0b3BsYXlCeVZpZGVvKX19fX19ZnVuY3Rpb24gdF9zbGRzX19yZW1vdmVBdXRvcGxheUJ5VmlkZW8odCl7dmFyIGU9dC50YXJnZXQuY2xvc2VzdCgiLnQtc2xkc19faXRlbSIpLHM9bnVsbD09ZT92b2lkIDA6ZS5xdWVyeVNlbGVjdG9yKCJbZGF0YS1zbGlkZXItdmlkZW8tdHlwZV0sIFtkYXRhLXZpZGVvbGF6eS10eXBlXSwgaWZyYW1lIik7aWYocyl7dmFyIGk9cy5jbG9zZXN0KCIudC1zbGRzX19pdGVtcy13cmFwcGVyIikscjtpZihpKWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbnRlcnZhbC1pZCIpJiYoaS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKSxpLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIsInkiKSl9fWZ1bmN0aW9uIHRfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQsZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYocyl7dmFyIGk9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpLHI9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIiksMTApfHwwLGE9aVswXSxsPWlbaS5sZW5ndGgtMV0sZD1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpO3Rfc2xkc19fY3JlYXRlRHVtbWllcyhhLGwscyksdF9zbGRzX3VwZGF0ZVNsaWRlcih0KTt2YXIgbz1wYXJzZUludChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiksMTApfHwwLG49ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyLXJpZ2h0Iik7bi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJmYWxzZSI9PT1kJiZyLW88PTA/Im5vbmUiOiIifSkpLCJ0cnVlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IikmJnRfc2xkc19TbGlkZXJIZWlnaHQodCl9fWZ1bmN0aW9uIHRfc2xkc19fY3JlYXRlRHVtbWllcyh0LGUscyl7dmFyIGkscj1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIikubGVuZ3RoLGE9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MCxsPXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIiksZD1zLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSxvPSExLG49ITEsYyx1O2lmKHQmJihjPXQucXVlcnlTZWxlY3RvcignW2RhdGEtem9vbWFibGU9InllcyJdJykpJiYobz0hMCxjLmNsYXNzTGlzdC5jb250YWlucygidC16b29tYWJsZSIpJiZjLmNsYXNzTGlzdC5yZW1vdmUoInQtem9vbWFibGUiKSxjLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS16b29tYWJsZSIpKSxlJiYodT1lLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXpvb21hYmxlPSJ5ZXMiXScpKSYmKG49ITAsdS5jbGFzc0xpc3QuY29udGFpbnMoInQtem9vbWFibGUiKSYmdS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXpvb21hYmxlIiksdS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiKSksZSYmMD09cy5xdWVyeVNlbGVjdG9yQWxsKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IjAiXScpLmxlbmd0aCl7dmFyIF89ZS5jbG9uZU5vZGUoITApO18uc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IiwiMCIpLF8uc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKTt2YXIgcD10LnBhcmVudE5vZGU7cC5pbnNlcnRCZWZvcmUoXyx0KTt2YXIgZj1wLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNsaWRlLWluZGV4PSIwIl0gW2ZpZWxkXScpO2YubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGYsKGZ1bmN0aW9uKHQpe3QucmVtb3ZlQXR0cmlidXRlKCJmaWVsZCIpfSkpfWlmKCFkJiZ0JiYhcy5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IicrKHIrMSkrJyJdJykpe3ZhciBtPXQuY2xvbmVOb2RlKCEwKTtpZihtLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIscisxKSxtLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19faXRlbV9hY3RpdmUiKSxtLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIiksZS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIixtKSxlLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbS1sb2FkZWQiKSxhPjAmJiJ0cnVlIj09PWwpZm9yKHZhciB5PXQsdj1lLGc9MDtnPGEtMTtnKyspe3ZhciBiPXkubmV4dEVsZW1lbnRTaWJsaW5nLmNsb25lTm9kZSghMCk7Yi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiLHIrZysxKSx2Lm5leHRFbGVtZW50U2libGluZy5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIixiKSx2PXYubmV4dEVsZW1lbnRTaWJsaW5nLHk9eS5uZXh0RWxlbWVudFNpYmxpbmd9fW8mJmMmJihjLmNsYXNzTGlzdC5hZGQoInQtem9vbWFibGUiKSxjLnNldEF0dHJpYnV0ZSgiZGF0YS16b29tYWJsZSIsInllcyIpKSxuJiZ1JiYodS5jbGFzc0xpc3QuYWRkKCJ0LXpvb21hYmxlIiksdS5zZXRBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiLCJ5ZXMiKSl9ZnVuY3Rpb24gdF9zbGRzX19oaWRlTW9iaWxlU2xpZGVzKHQpe2lmKHQpe3ZhciBlPXQuY2xvc2VzdCgiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLHM9ZSYmZ2V0Q29tcHV0ZWRTdHlsZShlKTtpZighc3x8InNjcm9sbCIhPT1zLm92ZXJmbG93WHx8ImZsZXgiIT09cy5kaXNwbGF5KXt2YXIgaT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIikpLHI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoPjk2MD81OjM7aWYoIShpLmxlbmd0aDw9MipyKSl7Zm9yKHZhciBhPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IiksbD1bYT1wYXJzZUludChhLDEwKV0sZD0xO2Q8cjtkKyspYStkPD1pLmxlbmd0aD9sLnB1c2goYStkKTpsLnB1c2goZCksYS1kPjA/bC5wdXNoKGEtZCk6bC5wdXNoKGkubGVuZ3RoKzEtZCk7dmFyIG89InQtc2xkc19faXRlbS1pbm5hY3RpdmUiO2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7bC5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiKSwxMCk9PT1lfSkpP3QuY2xhc3NMaXN0LnJlbW92ZShvKTp0LmNsYXNzTGlzdC5hZGQobyl9KSl9fX19ZnVuY3Rpb24gdF9zbGRzX3VwZGF0ZU9uRGlzcGxheUNoYW5nZSh0LGUpe3RfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dF9zbGRzX3NldEl0ZW1zSW5Sb3codCxlKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpLHRfc2xkc19wb3NpdGlvbkFycm93cyh0KX0pKX1mdW5jdGlvbiB0X3NsZHNfdXBkYXRlRmVlZHNTbGlkZXJPblJlc2l6ZSh0LGUscyl7dmFyIGk9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIikscjtpJiYoaS5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIikmJih3aW5kb3cuaW5uZXJXaWR0aD45NjA/InRydWUiPT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmVlZHMtcG9zdHMtbG9hZGVkIik/KHRfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQsZSxzKSx0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQscykpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZlZWRzTG9hZFBvc3RzIiwoZnVuY3Rpb24oKXt0X3NsZHNfX2luaXRGZWVkc1NsaWRlcih0LGUscyksdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LHMpfSkpOmkuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKDApIikpfWZ1bmN0aW9uIHRfc2xkc19zZXRJdGVtc0luUm93KHQsZSl7dmFyIHM9dF9zbGRzX19nZXRSZWModCk7aWYocyl7dmFyIGk9cy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIikscixhO2lmKGkpKGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCkmJih3aW5kb3cuaW5uZXJXaWR0aDw9OTYwJiYoYT0yKSx3aW5kb3cuaW5uZXJXaWR0aDw9NjQwJiYoYT0xKSx3aW5kb3cuaW5uZXJXaWR0aD45NjAmJihhPWUpKSxhJiZpLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IixhKX19ZnVuY3Rpb24gdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciBpPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKGkpe3ZhciByPWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCxhPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKSxsPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIiksZD1yPjAmJmEmJmw/YS5vZmZzZXRXaWR0aDpsLm9mZnNldFdpZHRoLG87aWYoInRydWUiIT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSl7aS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoLSIrZCsicHgpIjt2YXIgbj1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X3dyYXBwZXIiKTtuLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbihyKXtyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoZnVuY3Rpb24oKXt2YXIgcj10X3NsZHNfZ2V0Q3VycmVudFRyYW5zbGF0ZShzKSxhPWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hbmltYXRlZCIpLGw9cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIikpLGQ9cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSksbz1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpLG49IiIsYzsiIj09YSYmKGkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hbmltYXRlZCIsInllcyIpLCJsZWZ0Ij09PXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWRpcmVjdGlvbiIpPyJmYWxzZSI9PW8mJjE9PWw/bD0xOmwtLToiZmFsc2UiPT1vJiZsPT1kP2w9ZDpsKyssaS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsbCksbCE9ZCsxJiYwIT1sfHwobj0ieWVzIiksaS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIixuKSx0X3NsaWRlTW92ZVdpdGhvdXRBbmltYXRpb24odCwhMSxlLHIpKTt0X3NsZHNfdXBkYXRlU2xpZGVyKHQpfSkpfSkpO3ZhciBjPXMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYnVsbGV0Iik7Yy5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYywoZnVuY3Rpb24ocil7ci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKGZ1bmN0aW9uKCl7dmFyIGE9cGFyc2VJbnQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtYnVsbGV0LWZvciIpLDEwKSxsO2lmKHBhcnNlSW50KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKSwxMCkhPT1hKXt2YXIgZD10X3NsZHNfZ2V0Q3VycmVudFRyYW5zbGF0ZShzKTtpLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixhKSx0X3NsaWRlTW92ZVdpdGhvdXRBbmltYXRpb24odCwhMSxlLGQpLHRfc2xkc191cGRhdGVTbGlkZXIodCl9fSkpfSkpfX19fWZ1bmN0aW9uIHRfc2xkc19hbmltYXRlKHQsZSxzKXt2YXIgaT1wZXJmb3JtYW5jZS5ub3coKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uIHIoYSl7dmFyIGw9KGEtaSkvcztsPjEmJihsPTEpO3ZhciBkPXQobCk7ZShkKSxsPDE/cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIpOiJ5IiE9PXdpbmRvdy5sYXp5JiYieWVzIiE9PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhbGxyZWNvcmRzIikuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKXx8dF9zbGRzX29uSGFtbWVyTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KSl9KSl9ZnVuY3Rpb24gdF9zbGlkZV9Nb3ZlQW5pbWF0aW9uKHQsZSxzLGkpe2lmKHQpe3Quc3R5bGUudHJhbnNpdGlvbj0iaGVpZ2h0IGVhc2UtaW4tb3V0IC41cywgdHJhbnNmb3JtIGVhc2UtaW4tb3V0IDBzIjt2YXIgcj0tTWF0aC5hYnMoZSpzKSxhPS1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHQpLnRyYW5zZm9ybS5tYXRjaCgvXGQrLylbMF0pLGw9YS1yOzAhPT1sJiZ0X3NsZHNfYW5pbWF0ZSgoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSwoZnVuY3Rpb24oZSl7dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoIisoYS1sKmUpKyJweCkifSksaSl9fWZ1bmN0aW9uIHRfc2xpZGVNb3ZlV2l0aG91dEFuaW1hdGlvbih0LGUscyl7dmFyIGk9dF9zbGRzX19nZXRSZWModCk7aWYoaSl7dmFyIHI9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYocil7dmFyIGE9cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIikpLGwsZD0oci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpfHwwKT4wP2kucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKS5vZmZzZXRXaWR0aDppLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLm9mZnNldFdpZHRoLG89cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSksbj1yLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSxjLHU7YT5vKzEmJihhPTEpO3ZhciBfPWkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIik7aWYoXyYmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/KGM9bmV3IEN1c3RvbUV2ZW50KCJ0aWxkYVNsZHNNb3ZlU2xpZGVTdGFydCIpLHU9bmV3IEN1c3RvbUV2ZW50KCJ0aWxkYVNsZHNNb3ZlU2xpZGVFbmQiKSk6KChjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpKS5pbml0Q3VzdG9tRXZlbnQoInRpbGRhU2xkc01vdmVTbGlkZVN0YXJ0IiwhMCwhMCksKHU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IikpLmluaXRDdXN0b21FdmVudCgidGlsZGFTbGRzTW92ZVNsaWRlRW5kIiwhMCwhMCkpLGkuZGlzcGF0Y2hFdmVudChjKSksbil7dmFyIHA9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLGY9aS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIik7aWYocCYmMD09PWkucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbV9kdW1teSIpLmxlbmd0aCl7dmFyIG09cC5jbG9uZU5vZGUoITApLHk7bS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW1fZHVtbXkiKSxtLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbS5zdHlsZS5sZWZ0PWQqYSsicHgiLHIuYXBwZW5kQ2hpbGQobSksKHk9aS5jbGFzc0xpc3QuY29udGFpbnMoImpzLXByb2R1Y3QiKT9pOmkucXVlcnlTZWxlY3RvcigiLnQtc3RvcmUiKXx8aS5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdCIpKT8odF9zbGRzX2ZhZGVPdXQobSwxNTAsKGZ1bmN0aW9uKCl7bnVsbCE9PW0ucGFyZW50Tm9kZSYmbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG0pfSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZiwoZnVuY3Rpb24odCl7dF9zbGRzX2ZhZGVJbih0LDE1MCl9KSkpOihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGYsKGZ1bmN0aW9uKHQpe3Quc3R5bGUub3BhY2l0eT0wfSkpLHRfc2xkc19mYWRlT3V0KG0sNDAwLChmdW5jdGlvbigpe251bGwhPT1tLnBhcmVudE5vZGUmJm0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZiwoZnVuY3Rpb24odCl7dF9zbGRzX2ZhZGVJbih0KX0pKSxfJiZpLmRpc3BhdGNoRXZlbnQodSl9KSw1MCkpfXIuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLWNhbmNlbCIpfXRfc2xpZGVNb3ZlKHQsZSxzKSxuJiZyLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1jYW5jZWwiKSxfJiZpLmRpc3BhdGNoRXZlbnQodSl9fX1mdW5jdGlvbiB0X3NsaWRlTW92ZUluc3RhbnRseSh0LGUscyl7dmFyIGk9dF9zbGRzX19nZXRSZWModCk7aWYoaSl7dmFyIHI9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYocil7dmFyIGE9cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIikpLGwsZD0oci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpfHwwKT4wP2kucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKS5vZmZzZXRXaWR0aDppLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLm9mZnNldFdpZHRoLG89cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSksbj1yLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLW5vbmUiKTtpZihhPm8rMSYmKGE9MSksbil7dmFyIGM9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpO2lmKGMmJjA9PT1pLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW1fZHVtbXkiKS5sZW5ndGgpe3ZhciB1PWMuY2xvbmVOb2RlKCEwKTt1LmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbV9kdW1teSIpLHUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix1LnN0eWxlLmxlZnQ9ZCphKyJweCIsci5hcHBlbmRDaGlsZCh1KSx0X3NsZHNfZmFkZU91dCh1LDQwMCwoZnVuY3Rpb24oKXtudWxsIT09dS5wYXJlbnROb2RlJiZ1LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodSl9KSl9ci5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQiKSxyLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1jYW5jZWwiKX1lbHNlIHIuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkIiksci5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtY2FuY2VsIik7dF9zbGlkZU1vdmUodCxlLHMpLHIuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkIiksci5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtY2FuY2VsIil9fX1mdW5jdGlvbiB0X3NsaWRlTW92ZSh0LGUscyl7dmFyIGk9dF9zbGRzX19nZXRSZWModCk7aWYoaSl7dmFyIHI9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYocil7dmFyIGE9aS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpLGw9ci5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIiksZD1wYXJzZUludChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iil8fDApLG89cGFyc2VJbnQoci5nZXRBdHRyaWJ1dGUoImRhdGEtZmVlZC1zaG93LWNvdW50Iil8fDApLG49ZD4wP2kucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKS5vZmZzZXRXaWR0aDppLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLm9mZnNldFdpZHRoLGM9cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIpKSx1PXBhcnNlRmxvYXQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSxfPXBhcnNlRmxvYXQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLHA9ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIiksZj1yLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSxtPXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10aW1lb3V0Iik+MCx5PWkucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIpLHY9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvd193cmFwcGVyLWxlZnQiKSxnOyJvZmYiPT09ci5nZXRBdHRyaWJ1dGUoImFyaWEtbGl2ZSIpJiZyLnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIiwicG9saXRlIik7dmFyIGI9MDtpZigvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKXt2YXIgaD1uYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvVmVyc2lvblwvKFxkKylcLihcZCspXC4/KFxkKyk/IFNhZmFyaS8pO251bGwhPT1oJiYoYj1wYXJzZUludChoWzFdLDEwKSl9dmFyIEE9ISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKCJDcmlPUyIpLFM7aWYoY3x8MD09PWN8fChjPTMwMCksdT5fKzEmJih1PTEsci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsMSkpLCJ0cnVlIiE9PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpe2lmKHkpaWYobCl7dmFyIHc9YVthLmxlbmd0aC0xXSxxPXBhcnNlSW50KHcuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IiksMTApO2lmKGQ8XyYmdF9zbGRzX2ZhZGVJbih5LDMwMCkscTxfJiZkPjAmJih1PT1xLW8rMXx8cT09PW8pKXt2YXIgRT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtFLmluaXRFdmVudCgiZmVlZHNMYXN0U2xpZGUiLCEwLCEwKSxyLmRpc3BhdGNoRXZlbnQoRSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZmVlZHNMb2FkU2xpZGUiLChmdW5jdGlvbigpe3Rfc2xkc191cGRhdGVTbGlkZXIodCksImZ1bmN0aW9uIj09dHlwZW9mIHRfYW5pbWF0ZV9fc3RhcnRBbmltYXRpb24mJnRfYW5pbWF0ZV9fc3RhcnRBbmltYXRpb24oKX0pKSx0X3NsZHNfZmFkZUluKHksMzAwKX1lbHNlIHE9PT1fJiZ1PT09Xy1kKzEmJnRfc2xkc19mYWRlT3V0KHksMzAwKX1lbHNlImZhbHNlIj09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmKHU9PV98fGQ+MSYmdT09Xy1kKzEpP3Rfc2xkc19mYWRlT3V0KHksMzAwKTp0X3NsZHNfZmFkZUluKHksMzAwKTt2JiYoImZhbHNlIj09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmMT09dT90X3NsZHNfZmFkZU91dCh2LDMwMCk6dF9zbGRzX2ZhZGVJbih2LDMwMCkpLHIuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkIiksYj49MTMmJkEmJiFmP3Rfc2xpZGVfTW92ZUFuaW1hdGlvbihyLHUsbixjKTpyLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgtIituKnUrInB4KSIsdF90cmlnZ2VyRXZlbnQociwic2xpZGVDaGFuZ2VTdGFydCIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ci5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQiKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYW5pbWF0ZWQiLCIiKSwieWVzIj09KHA9ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIikpJiYodT09XysxJiYodT0xKSwwPT11JiYodT1fKSxiPj0xMyYmQSYmIWY/dF9zbGlkZV9Nb3ZlQW5pbWF0aW9uKHIsdSxuLDApOnIuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKC0iK24qdSsicHgpIiwhMCE9PWYmJnRfc2xkc19BY3RpdmVTbGlkZSh0LHUsXyxzKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIix1KSksKCJ5Ij09PXdpbmRvdy5sYXp5fHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYWxscmVjb3JkcyIpJiYieWVzIj09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhbGxyZWNvcmRzIikuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKSkmJnRfc2xkc19vbkhhbW1lckxvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpLCFlJiZtJiZ0X3NsZHNfaW5pdEF1dG9QbGF5KHQsdSxfLHMpfSksYyksdF9zbGRzX0FjdGl2ZUJ1bGxldCh0LHUsXyxzKSx0X3NsZHNfQWN0aXZlU2xpZGUodCx1LF8pLCJ0cnVlIj09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IikmJnRfc2xkc19TbGlkZXJIZWlnaHQodCksdF9zbGRzX1NsaWRlckFycm93c0hlaWdodCh0KSx0X3NsZHNfQWN0aXZlQ2FwdGlvbih0LHUsXyksaS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtLWxvYWRlZCIpLmxlbmd0aDxfKzImJnRfc2xkc19VcGRhdGVJbWFnZXModCx1KX19fX1mdW5jdGlvbiB0X3NsZHNfdXBkYXRlU2xpZGVyKHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3Rfc2xkc19TbGlkZXJXaWR0aCh0KTt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihzKXt2YXIgaT1wYXJzZUludChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiksMTApfHwxLHI9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLGE9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKSxsPWk+MCYmYSYmcj9yLm9mZnNldFdpZHRoOmEub2Zmc2V0V2lkdGgsZD1wYXJzZUludChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiksMTApLG89cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIiksMTApLG49cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSxjPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIpO2lmKGQ+bysxJiYoZD0xLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLDEpKSxjJiYiZmFsc2UiPT09bil7dmFyIHUsXz1vLWk8PTB8fGQraS0xPT09bztjLnN0eWxlLmRpc3BsYXk9Xz8ibm9uZSI6IiJ9cy5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoLSIrbCpkKyJweCkiLCJ0cnVlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IikmJnRfc2xkc19VcGRhdGVTbGlkZXJIZWlnaHQodCksdF9zbGRzX1VwZGF0ZVNsaWRlckFycm93c0hlaWdodCh0KSwieSI9PT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIpJiZzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIsIiIpfX19ZnVuY3Rpb24gdF9zbGRzX1VwZGF0ZUltYWdlcyh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciBpPXMucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSInK2UrJyJdJyk7aSYmKGkuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtLWxvYWRlZCIpLGkubmV4dEVsZW1lbnRTaWJsaW5nJiZpLm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW0tbG9hZGVkIiksaS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nJiZpLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtLWxvYWRlZCIpKX19ZnVuY3Rpb24gdF9zbGRzX0FjdGl2ZUNhcHRpb24odCxlLHMpe3ZhciBpPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGkpe3ZhciByPWkucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fY2FwdGlvbiIpLGE9aS5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19jYXB0aW9uW2RhdGEtc2xpZGUtY2FwdGlvbj0iJytlKyciXScpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX2NhcHRpb24tYWN0aXZlIil9KSksMD09ZT9hPWkucXVlcnlTZWxlY3RvcignLnQtc2xkc19fY2FwdGlvbltkYXRhLXNsaWRlLWNhcHRpb249IicrcysnIl0nKTplPT1zKzEmJihhPWkucXVlcnlTZWxlY3RvcignLnQtc2xkc19fY2FwdGlvbltkYXRhLXNsaWRlLWNhcHRpb249IjEiXScpKSxhJiZhLmNsYXNzTGlzdC5hZGQoInQtc2xkc19fY2FwdGlvbi1hY3RpdmUiKX19ZnVuY3Rpb24gdF9zbGRzX3Njcm9sbEltYWdlcyh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciBpPShlPDA/IiI6Ii0iKStNYXRoLmFicyhlKS50b1N0cmluZygpO3MucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgiK2krInB4KSJ9fWZ1bmN0aW9uIHRfc2xkc19BY3RpdmVCdWxsZXQodCxlLHMsaSl7dmFyIHI7aWYoaSYmaS50aHVtYnNidWxsZXRHYWxsZXJ5KXt2YXIgYT1wYXJzZUludChpLnN0b3JlT3B0aW9ucy5wb3B1cF9vcHRzLmNvbHVtbnMpLGw9K2kuc3RvcmVPcHRpb25zLnNsaWRlcl9zbGlkZXNPcHRzLnJhdGlvO3I9dF9zdG9yZV9wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQoYSxsLDYwLDEwKX12YXIgZD10X3NsZHNfX2dldFJlYyh0KTtpZihkKXt2YXIgbz1kLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2J1bGxldCIpLG49ZC5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19idWxsZXRbZGF0YS1zbGlkZS1idWxsZXQtZm9yPSInK2UrJyJdJyk7aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19fYnVsbGV0X2FjdGl2ZSIpO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYnVsbGV0X2JvZHkiKTtlJiZlLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1jdXJyZW50Iil9KSksaSYmaS50aHVtYnNidWxsZXRHYWxsZXJ5JiZlPj1yJiZlIT1zKzF8fHM+PXImJjA9PWU/bj1kLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2J1bGxldFtkYXRhLXNsaWRlLWJ1bGxldC1mb3I9IicrcisnIl0nKTowPT1lP249ZC5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19idWxsZXRbZGF0YS1zbGlkZS1idWxsZXQtZm9yPSInK3MrJyJdJyk6ZT09cysxJiYobj1kLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2J1bGxldFtkYXRhLXNsaWRlLWJ1bGxldC1mb3I9IjEiXScpKSxuKXtuLmNsYXNzTGlzdC5hZGQoInQtc2xkc19fYnVsbGV0X2FjdGl2ZSIpO3ZhciBjPW4ucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYnVsbGV0X2JvZHkiKTtjJiZjLnNldEF0dHJpYnV0ZSgiYXJpYS1jdXJyZW50IiwhMCl9fX1mdW5jdGlvbiB0X3NsZHNfQWN0aXZlU2xpZGUodCxlLHMpe3ZhciBpPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGkpe3ZhciByPWkucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGE9aS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIiksbD1pLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iJytlKyciXScpLGQ9ISFyJiZyLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSxvPWkucXVlcnlTZWxlY3RvckFsbCgiLnQtdmlkZW8tbGF6eWxvYWQiKTtpZihvLmxlbmd0aCl0X29uRnVuY0xvYWQoInRfdmlkZW9fX2dldFBsYXllciIsKGZ1bmN0aW9uKCl7by5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTtpZigiZmFsc2UiIT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LWxvYWQiKSl7dmFyIHM9dC5jbG9zZXN0KCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpO2lmKHMpe3ZhciBpPXRfdmlkZW9fX2dldFBsYXllcihzKTtpP2kucGF1c2UoKTp0X3NsZHNfX3Byb2NjZXNzVmlkZW8ocykudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQucGF1c2UoKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSl9fX0pKX0pKTtlbHNle3ZhciBuPWkucXVlcnlTZWxlY3RvckFsbCgiaWZyYW1lIiksYz1pLnF1ZXJ5U2VsZWN0b3JBbGwoInZpZGVvIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnNyYyYmKC0xIT09dC5zcmMuaW5kZXhPZigiJmVuYWJsZWpzYXBpPTEiKSYmdC5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7ImV2ZW50IjoiY29tbWFuZCIsImZ1bmMiOiJwYXVzZVZpZGVvIiwiYXJncyI6IiJ9JywiKiIpLC0xPT09dC5zcmMuaW5kZXhPZigidmltZW8iKXx8LTE9PT10LnNyYy5pbmRleE9mKCImYW1wO2FwaT0xIikmJi0xPT09dC5zcmMuaW5kZXhPZigiJmFwaT0xIil8fHQuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgneyJtZXRob2QiOiJwYXVzZSIsInZhbHVlIjoidHJ1ZSJ9JywiKiIpKX0pKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsKGZ1bmN0aW9uKHQpe3QucGF1c2UoKX0pKX1pZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX19pdGVtX2FjdGl2ZSIpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKX0pKSwwPT1lJiYhMT09PWQpaS5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IicrcysnIl0nKS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksaS5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwiZmFsc2UiKTtlbHNlIGlmKDA9PWUmJiEwPT09ZClsPWkucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSInK3MrJyJdJyk7ZWxzZSBpZihlPT1zKzEmJiExPT09ZCl7dmFyIHU9aS5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IjEiXScpO3UmJih1LmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbV9hY3RpdmUiKSx1LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJmYWxzZSIpKX1lbHNlIGU9PXMrMSYmITA9PT1kJiYobD1pLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iMSJdJykpO2wmJihsLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbV9hY3RpdmUiKSxsLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJmYWxzZSIpKSx3aW5kb3cudF9zbGRzX19pc2lPUyYmdF9zbGRzX19oaWRlTW9iaWxlU2xpZGVzKGwpLHRfc2xkc19fc2V0VGFiaW5kZXhGb3JGb2N1c2FibGVFbGVtZW50cyh0KX19ZnVuY3Rpb24gdF9zbGRzX19zZXRUYWJpbmRleEZvckZvY3VzYWJsZUVsZW1lbnRzKHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGk9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpO2lmKGkpe3ZhciByPSdhLCBidXR0b24sIGlucHV0Om5vdChbdHlwZT0iaGlkZGVuIl0pLCBzZWxlY3QsIHRleHRhcmVhLCB2aWRlbywgaWZyYW1lJyxhPXMucXVlcnlTZWxlY3RvckFsbChyKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIil9KSk7dmFyIGw9aS5xdWVyeVNlbGVjdG9yQWxsKHIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiMCIpfSkpfX19ZnVuY3Rpb24gdF9zbGRzX1NsaWRlcldpZHRoKHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIik7aWYocyl7dmFyIGk9Z2V0Q29tcHV0ZWRTdHlsZShzKSxyPXBhcnNlSW50KGkucGFkZGluZ0xlZnQpfHwwLGE9cGFyc2VJbnQoaS5wYWRkaW5nUmlnaHQpfHwwLGw9cy5jbGllbnRXaWR0aC0ocithKSxkPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKS5sZW5ndGgsbz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxuO2lmKCJ0cnVlIiE9by5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSl7dmFyIGM9MDtvJiYoYz1vLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iiksby5zdHlsZS53aWR0aD1sKmQrInB4Iiksd2luZG93LmlubmVyV2lkdGg8PTY0MD9jPTE6d2luZG93LmlubmVyV2lkdGg8PTk2MCYmYz4xJiYoYz0yKTt2YXIgdT1jPjE/bC9jOmw7aWYodT4wKXt2YXIgXz1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0iKTtvJiYoXz1vLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0iKSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChfLChmdW5jdGlvbih0KXt0LnN0eWxlLndpZHRoPXUrInB4In0pKX19fX19ZnVuY3Rpb24gdF9zbGRzX1NsaWRlckhlaWdodCh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1zLXdyYXBwZXI6bm90KFtkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodD0iZmFsc2UiXSknKTtpZihzKXt2YXIgaT1zLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSxyPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKSxhO2lmKHIpe3ZhciBsPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUocikucGFkZGluZ1RvcCl8fDAsZD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHIpLnBhZGRpbmdCb3R0b20pfHwwO2E9ci5jbGllbnRIZWlnaHQtKGwrZCl9YSYmcyYmKHMuc3R5bGUuaGVpZ2h0PWk/IiI6YSsicHgiKX19fWZ1bmN0aW9uIHRfc2xkc19VcGRhdGVTbGlkZXJIZWlnaHQodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtcy13cmFwcGVyOm5vdChbZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQ9ImZhbHNlIl0pJyk7aWYocyl7dmFyIGk9cy5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIikscj1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIiksYTtpZihyKXt2YXIgbD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHIpLnBhZGRpbmdUb3ApfHwwLGQ9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShyKS5wYWRkaW5nQm90dG9tKXx8MDthPXIuY2xpZW50SGVpZ2h0LShsK2QpfTAhPT1hJiZzJiYocy5zdHlsZS5oZWlnaHQ9aT8iIjphKyJweCIpfX19ZnVuY3Rpb24gdF9zbGRzX1NsaWRlckFycm93c0hlaWdodCh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIiksaT0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkscixhPTA7aWYocyl7dmFyIGw7cy5xdWVyeVNlbGVjdG9yKCJbZGF0YS1zbGlkZXItdmlkZW8tdHlwZV0iKSYmaSYmKGE9NDApO3ZhciBkPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUocykucGFkZGluZ1RvcCl8fDAsbz1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHMpLnBhZGRpbmdCb3R0b20pfHwwO3I9cy5jbGllbnRIZWlnaHQtKGQrbyktYX12YXIgbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X3dyYXBwZXIiKTtyJiZuLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnN0eWxlLmhlaWdodD1yKyJweCI7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdyIpO2UmJihlLnN0eWxlLm1hcmdpblRvcD1hLzIrInB4Iil9KSksdF9zbGRzX2ZpeEFycm93c0luQ2F0YWxvZyhlLHMsbixpKX19ZnVuY3Rpb24gdF9zbGRzX1VwZGF0ZVNsaWRlckFycm93c0hlaWdodCh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIiksaT0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkscixhPTA7aWYocyl7dmFyIGw7cy5xdWVyeVNlbGVjdG9yKCJbZGF0YS1zbGlkZXItdmlkZW8tdHlwZV0iKSYmaSYmKGE9NDApO3ZhciBkPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUocykucGFkZGluZ1RvcCl8fDAsbz1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHMpLnBhZGRpbmdCb3R0b20pfHwwO3I9cy5jbGllbnRIZWlnaHQtKGQrbyktYX12YXIgbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X3dyYXBwZXIiKTtyJiZuLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnN0eWxlLmhlaWdodD1yKyJweCI7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdyIpO2UmJihlLnN0eWxlLm1hcmdpblRvcD1hLzIrInB4Iil9KSksdF9zbGRzX2ZpeEFycm93c0luQ2F0YWxvZyhlLHMsbixpKX19ZnVuY3Rpb24gdF9zbGRzX2ZpeEFycm93c0luQ2F0YWxvZyh0LGUscyxpKXtpZihlJiZpJiZ0LmNsYXNzTGlzdC5jb250YWlucygidC1zdG9yZV9fcmVsZXZhbnRzLWdyaWQtY29udCIpKXt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LWltZyIpO2lmKHIpe3ZhciBhPXIub2Zmc2V0SGVpZ2h0O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwocywoZnVuY3Rpb24odCl7dmFyIGU9dC5vZmZzZXRIZWlnaHQscz0oYS1lKS8yO3Quc3R5bGUudG9wPXMrInB4Iix0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWSgwKSJ9KSl9fX1mdW5jdGlvbiB0X3NsZHNfaW5pdEF1dG9QbGF5KHQsZSxzLGkpe3ZhciByPSJvYmplY3QiPT10eXBlb2YgdCxhPXI/dFswXTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVjIit0KTtpZihhKXt2YXIgbD1hLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHMiKSxkPWEucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKGQpe3ZhciBvPXBhcnNlRmxvYXQoZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRpbWVvdXQiKSksbj0iIixjPWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbnRlcnZhbC1pZCIpLHU9ZSxfO2lmKGMmJmNsZWFySW50ZXJ2YWwoYyksInRydWUiIT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSl7dmFyIHA7IS9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmbCYmKGwuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwoZnVuY3Rpb24oKXtkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIsInllcyIpfSkpLGwuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLChmdW5jdGlvbigpeyJ5IiE9PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkLWJ5LXZpZGVvIikmJmQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwiIil9KSkpO3ZhciBmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCxtPWYrYS5vZmZzZXRIZWlnaHQseSx2O3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7Zj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQsbT1mK2Eub2Zmc2V0SGVpZ2h0fSkpKSx2b2lkIDAhPT1kb2N1bWVudC5oaWRkZW4/KHk9ImhpZGRlbiIsdj0idmlzaWJpbGl0eWNoYW5nZSIpOnZvaWQgMCE9PWRvY3VtZW50Lm1zSGlkZGVuPyh5PSJtc0hpZGRlbiIsdj0ibXN2aXNpYmlsaXR5Y2hhbmdlIik6dm9pZCAwIT09ZG9jdW1lbnQud2Via2l0SGlkZGVuJiYoeT0id2Via2l0SGlkZGVuIix2PSJ3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlIiksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih2LChmdW5jdGlvbigpe2lmKGRvY3VtZW50W3ldKWQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwieWVzIik7ZWxzZXt2YXIgdD1nZXRDb21wdXRlZFN0eWxlKGEpLmRpc3BsYXksZT13aW5kb3cucGFnZVlPZmZzZXQscz1lK3dpbmRvdy5pbm5lckhlaWdodDtmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCwobT1mK2Eub2Zmc2V0SGVpZ2h0KT5lJiZmPHMmJiJub25lIiE9PXQmJiJ5IiE9PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkLWJ5LXZpZGVvIikmJmQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwiIil9fSksITEpLDE9PT1hLmxlbmd0aCYmd2luZG93LmJpbmQoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2YXIgdD1nZXRDb21wdXRlZFN0eWxlKGEpLmRpc3BsYXksZT13aW5kb3cucGFnZVlPZmZzZXQscz1lK3dpbmRvdy5pbm5lckhlaWdodDsibm9uZSIhPT10PyhmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCwobT1mK2Eub2Zmc2V0SGVpZ2h0KT5lJiZmPHMmJiJ5IiE9PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkLWJ5LXZpZGVvIik/ZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCIiKToiIj09PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIikmJmQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwieWVzIikpOnJ8fGQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwieWVzIil9KSkpO3ZhciBnPXNldEludGVydmFsKChmdW5jdGlvbigpe3ZhciBlPWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIikscj1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYXV0b3BsYXktaWdub3JlLWhvdmVyIiksbD1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG91Y2giKSxvPXRfc2xkc19nZXRDdXJyZW50VHJhbnNsYXRlKGEpOyJ5ZXMiIT1lJiYieWVzIiE9ciYmInllcyIhPWwmJigiZmFsc2UiPT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiZ1PT1zP3U9czp1KyssZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsdSksdSE9cysxJiYwIT11fHwobj0ieWVzIiksdF9zbGlkZU1vdmVXaXRob3V0QW5pbWF0aW9uKHQsITAsaSxvKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpLCJ5ZXMiPT1uJiYodT09cysxJiYodT0xKSwwPT11JiYodT1zKSxkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIix1KSksZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIixuKSl9KSxvKTtkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaW50ZXJ2YWwtaWQiLGcpfX19fWZ1bmN0aW9uIHRfc2xkc19wb3NpdGlvbkFycm93cyh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93X2NvbnRhaW5lci1vdXRzaWRlIiksaT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW0iKTtpZihpKXt2YXIgcj1pLm9mZnNldFdpZHRoLGE9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1sZWZ0Iik/ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1sZWZ0Iikub2Zmc2V0V2lkdGg6MCxsPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctcmlnaHQiKT9lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LXJpZ2h0Iikub2Zmc2V0V2lkdGg6MDtzJiYocy5zdHlsZS5tYXhXaWR0aD1hK2wrcisxMjArInB4Iil9fX1mdW5jdGlvbiB0X3NsZHNfaW5pdFNsaWRlclN3aXBlKHQsZSxzLGkpe3ZhciByPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHIpe3ZhciBhPXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fbWFpbiIpO2lmKGEpe3ZhciBsPXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKGwpe3ZhciBkLG89ITEsbj0hMSxjLHU7aWYoInRydWUiIT09bC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSlpZigidHJ1ZSIhPT1sLmdldEF0dHJpYnV0ZSgiZGF0YS1zd2lwZXItaW5pdGlhbGl6ZWQiKSl7ZGVsZXRlIEhhbW1lci5kZWZhdWx0cy5jc3NQcm9wcy51c2VyU2VsZWN0LHdpbmRvdy5oYW1tZXI9bmV3IEhhbW1lcihhLHtkb21FdmVudHM6ITAsaW5wdXRDbGFzczpIYW1tZXIuVG91Y2hJbnB1dCxyZWNvZ25pemVyczpbW0hhbW1lci5QYW4se2RpcmVjdGlvbjpIYW1tZXIuRElSRUNUSU9OX0hPUklaT05UQUx9XV19KSxsLnNldEF0dHJpYnV0ZSgiZGF0YS1zd2lwZXItaW5pdGlhbGl6ZWQiLCJ0cnVlIik7dmFyIF89ZnVuY3Rpb24gdChlKXt3aW5kb3cucGFnZVlPZmZzZXQ+ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20rd2luZG93LnBhZ2VZT2Zmc2V0fHx3aW5kb3cucGFnZVlPZmZzZXQrZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDxyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ/bC5zZXRBdHRyaWJ1dGUoZSwieWVzIik6InkiIT09bC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKSYmbC5zZXRBdHRyaWJ1dGUoZSwiIil9LHA9Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQ/ImRhdGEtc2xpZGVyLXRvdWNoIjoiZGF0YS1zbGlkZXItc3RvcHBlZCIsZjtpZigiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24odCl7dmFyIGU9dFswXTtsLnNldEF0dHJpYnV0ZShwLGUuaXNJbnRlcnNlY3Rpbmc/IiI6InllcyIpfSkpLm9ic2VydmUocik7ZWxzZSBfKHApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLChmdW5jdGlvbigpe289ITAsY2xlYXJUaW1lb3V0KGQpLGQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtfKHApLG89ITF9KSwyNTApfSkpO2lmKDEhPWUpe3ZhciBtPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIW58fChlLnByZXZlbnREZWZhdWx0KCksITEpfTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixtLHtwYXNzaXZlOiExfSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsbSx7cGFzc2l2ZTohMX0pLHdpbmRvdy5oYW1tZXIub24oInBhbiIsKGZ1bmN0aW9uKGUpe2lmKG8pcmV0dXJuITE7bj0hMDt2YXIgcz1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxhPXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCxsPWE+MSxkPWw/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLm9mZnNldFdpZHRoOnIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIikub2Zmc2V0V2lkdGgsYz1wYXJzZUZsb2F0KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKSksdT1wYXJzZUZsb2F0KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpKSxfPSIiLHA9ZS5kZWx0YVgsZj0xMDAvdSplLmRlbHRhWC93aW5kb3cuaW5uZXJXaWR0aCxtPTMwLHk7aWYoInRydWUiPT09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSlyZXR1cm4hMTtpZihzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG91Y2giLCJ5ZXMiKSx0X3NsZHNfc2Nyb2xsSW1hZ2VzKHQsZCpjLXApLGUuaXNGaW5hbCl7aWYoZS52ZWxvY2l0eVg+LjQpImZhbHNlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmMT09Yz9jPTE6Yy0tLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGMpLDA9PWMmJihfPSJ5ZXMiKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLF8pLHRfc2xpZGVNb3ZlKHQsITEsaSk7ZWxzZSBpZihlLnZlbG9jaXR5WDwtLjQpe2lmKCJmYWxzZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJihjPT11fHxsJiZjPT11LWErMSkpYz1sP3UtYTp1O2Vsc2V7dmFyIHY9ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpLGc9dlt2Lmxlbmd0aC0xXSxiPXBhcnNlRmxvYXQoZy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiKSwxMCk7aWYoYjx1JiZjPT1iKXt2YXIgaD1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtoLmluaXRFdmVudCgiZmVlZHNMYXN0U2xpZGUiLCEwLCEwKSxzLmRpc3BhdGNoRXZlbnQoaCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZmVlZHNMb2FkU2xpZGUiLChmdW5jdGlvbigpe3Rfc2xkc191cGRhdGVTbGlkZXIodCl9KSl9YysrfXMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGMpLGM9PXUrMSYmKF89InllcyIpLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsXyksdF9zbGlkZU1vdmUodCwhMSxpKX1lbHNlIGY8PS0zMC91PygiZmFsc2UiPT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYoYz09dXx8bCYmYz09dS1hKzEpP2M9bD91LWE6dTpjKysscy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYyksYz09dSsxJiYoXz0ieWVzIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIixfKSx0X3NsaWRlTW92ZSh0LCExLGkpKTpmPj1tL3U/KCJmYWxzZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJjE9PWM/Yz0xOmMtLSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixjKSwwPT1jJiYoXz0ieWVzIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIixfKSx0X3NsaWRlTW92ZSh0LCExLGkpKTp0X3NsaWRlTW92ZSh0LCExLGkpO3Muc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3VjaCIsIiIpLG49ITF9cmV0dXJuITB9KSksd2luZG93LmhhbW1lci5vbigicGFuZW5kIiwoZnVuY3Rpb24oKXt0X3NsaWRlTW92ZSh0LCExLGkpLG49ITF9KSl9fX19fX1mdW5jdGlvbiB0X3NsZHNfZ2V0Q3VycmVudFRyYW5zbGF0ZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihlKXt2YXIgcz1nZXRDb21wdXRlZFN0eWxlKGUpLnRyYW5zZm9ybTtpZih2b2lkIDAhPT1zJiYiIiE9PXMpe3ZhciBpPXMubWF0Y2goL1xkKy9nKTtpZihudWxsIT09aSlyZXR1cm4gcGFyc2VJbnQoaVswXSwxMCl9fX1mdW5jdGlvbiB0X3NsZHNfY2hhbmdlSW1hZ2VVcmwodCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxzPWUmJiJ5ZXMiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpLGk9dF9zbGRzX19nZXRSZWModCkscjtpJiYocj1zP2kucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faW1nOm5vdChbZGF0YS1vcmlnaW5hbF0pIik6aS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pbWciKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNyYyIpO2UmJih0LnNldEF0dHJpYnV0ZSgic3JjIixlKSx0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1zcmMiKSl9KSkpfWZ1bmN0aW9uIHRfc2xkc19vbkhhbW1lckxvYWQodCxlLHMpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3dbdF0pZSgpO2Vsc2UgdmFyIGk9RGF0ZS5ub3coKSxyPXNldFRpbWVvdXQoKGZ1bmN0aW9uIGEoKXt2YXIgbD1EYXRlLm5vdygpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3dbdF0pe2lmKGwtaT43ZTMpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyB1bmRlZmluZWQiKTtyPXNldFRpbWVvdXQoYSxzfHwxMDApfWVsc2UgZSgpfSkpfWZ1bmN0aW9uIHRfc2xkc19mYWRlT3V0KHQsZSxzKXtpZigibm9uZSIhPT10LnN0eWxlLmRpc3BsYXkmJiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1mYWRlb3V0LXRpbWVvdXQiKSl7dmFyIGk9MSxyPXBhcnNlSW50KGUpLGEsbD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXt0LnN0eWxlLm9wYWNpdHk9aSwoaS09LjEpPD0uMSYmKGNsZWFySW50ZXJ2YWwobCksdC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtZmFkZW91dC10aW1lb3V0IiksdC5zdHlsZS5kaXNwbGF5PSJub25lIiwiZnVuY3Rpb24iPT10eXBlb2YgcyYmcygpKX0pLHI+MD9yLzEwOjQwKTt0LnNldEF0dHJpYnV0ZSgiZGF0YS1mYWRlb3V0LXRpbWVvdXQiLGwpfX1mdW5jdGlvbiB0X3NsZHNfZmFkZUluKHQsZSxzKXtpZigoIjEiIT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5vcGFjaXR5JiYiIiE9PWdldENvbXB1dGVkU3R5bGUodCkub3BhY2l0eXx8Im5vbmUiPT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5kaXNwbGF5KSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLWZhZGVpbi10aW1lb3V0Iikpe3ZhciBpPTAscj1wYXJzZUludChlKSxhPXI+MD9yLzEwOjQwO3Quc3R5bGUub3BhY2l0eT1pLHQuc3R5bGUuZGlzcGxheT0iYmxvY2siO3ZhciBsPXNldEludGVydmFsKChmdW5jdGlvbigpe3Quc3R5bGUub3BhY2l0eT1pLChpKz0uMSk+PTEmJihjbGVhckludGVydmFsKGwpLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWZhZGVpbi10aW1lb3V0IiksImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMoKSl9KSxhKTt0LnNldEF0dHJpYnV0ZSgiZGF0YS1mYWRlaW4tdGltZW91dCIsbCl9fWZ1bmN0aW9uIHRfc2xkc19yYW5kb21Tb3J0RWxlbWVudHModCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCk7aWYoIWUubGVuZ3RoKXJldHVybltdO2Uuc29ydCgoZnVuY3Rpb24oKXtyZXR1cm4uNS1NYXRoLnJhbmRvbSgpfSkpO3ZhciBzPXRbMF0ucGFyZW50Tm9kZTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbih0KXtzLmFwcGVuZENoaWxkKHQpfSkpLGV9ZnVuY3Rpb24gdF9zbGRzX19wcm9jY2Vzc1ZpZGVvKHQpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxzKXt0X29uRnVuY0xvYWQoInRfdmlkZW9fX2NyZWF0ZVBsYXllciIsKGZ1bmN0aW9uKCl7dF92aWRlb19fY3JlYXRlUGxheWVyKHQpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfSkpLmNhdGNoKChmdW5jdGlvbih0KXtyZXR1cm4gcyh0KX0pKX0pKX0pKX1mdW5jdGlvbiB0X3NsZHNfX2dldFJlYyh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3JlYyIrdCk6dCBpbnN0YW5jZW9mIEVsZW1lbnQ/dDp0WzBdfWZ1bmN0aW9uIHRfdHJpZ2dlckV2ZW50KHQsZSl7dmFyIHM7ZG9jdW1lbnQuY3JlYXRlRXZlbnQ/KHM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKSkuaW5pdEV2ZW50KGUsITAsITEpOmRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0JiYoKHM9ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKSkuZXZlbnRUeXBlPWUpLHMuZXZlbnROYW1lPWUsdC5kaXNwYXRjaEV2ZW50P3QuZGlzcGF0Y2hFdmVudChzKTp0LmZpcmVFdmVudD90LmZpcmVFdmVudCgib24iK3MuZXZlbnRUeXBlLHMpOnRbZV0/dFtlXSgpOnRbIm9uIitlXSYmdFsib24iK2VdKCl9d2luZG93LnRfc2xkc19faXNpT1M9L2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1hY2ludG9zaCIpJiYib250b3VjaGVuZCJpbiBkb2N1bWVudDt2YXIgREVCVUc9ITE7ZnVuY3Rpb24gc2V0SW1wb3J0YW50U3R5bGUodCxlLHMpe3Quc3R5bGUuc2V0UHJvcGVydHkoZSxzLCJpbXBvcnRhbnQiKX1mdW5jdGlvbiBnZXRHYWxsZXJ5Q29udGFpbmVyKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtcG9wdXAiKTtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lciIpO2lmKGUpcmV0dXJuIGV9cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lciIpfWZ1bmN0aW9uIGFwcGx5QmFzZVN0eWxlcyh0KXtmb3IodmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdCIpLHM9MDtzPGUubGVuZ3RoO3MrKylmb3IodmFyIGkscj1lW3NdLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXN0b3JlX19jYXJkX190ZXh0d3JhcHBlciIpLGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIGw9clthXTtzZXRJbXBvcnRhbnRTdHlsZShsLCJtYXJnaW4tYm90dG9tIiwiMHB4Iiksc2V0SW1wb3J0YW50U3R5bGUobCwibWFyZ2luLXRvcCIsImF1dG8iKSxzZXRJbXBvcnRhbnRTdHlsZShsLCJqdXN0aWZ5LWNvbnRlbnQiLCJmbGV4LXN0YXJ0Iik7dmFyIGQ9bC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1uYW1lIik7ZCYmKHNldEltcG9ydGFudFN0eWxlKGQsImRpc3BsYXkiLCItd2Via2l0LWJveCIpLHNldEltcG9ydGFudFN0eWxlKGQsIi13ZWJraXQtYm94LW9yaWVudCIsInZlcnRpY2FsIiksc2V0SW1wb3J0YW50U3R5bGUoZCwiLXdlYmtpdC1saW5lLWNsYW1wIiwiMiIpLHNldEltcG9ydGFudFN0eWxlKGQsIm92ZXJmbG93IiwiaGlkZGVuIiksc2V0SW1wb3J0YW50U3R5bGUoZCwidGV4dC1vdmVyZmxvdyIsImVsbGlwc2lzIiksc2V0SW1wb3J0YW50U3R5bGUoZCwibGluZS1oZWlnaHQiLCIxLjUiKSxzZXRJbXBvcnRhbnRTdHlsZShkLCJtYXgtaGVpZ2h0IiwiY2FsYygxLjVlbSAqIDIpIiksc2V0SW1wb3J0YW50U3R5bGUoZCwicGFkZGluZy1ib3R0b20iLCJ1bnNldCIpKTt2YXIgbz1sLnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLWRlc2NyIik7byYmKHNldEltcG9ydGFudFN0eWxlKG8sImRpc3BsYXkiLCItd2Via2l0LWJveCIpLHNldEltcG9ydGFudFN0eWxlKG8sIi13ZWJraXQtYm94LW9yaWVudCIsInZlcnRpY2FsIiksc2V0SW1wb3J0YW50U3R5bGUobywiLXdlYmtpdC1saW5lLWNsYW1wIiwiMSIpLHNldEltcG9ydGFudFN0eWxlKG8sIm92ZXJmbG93IiwiaGlkZGVuIiksc2V0SW1wb3J0YW50U3R5bGUobywidGV4dC1vdmVyZmxvdyIsImVsbGlwc2lzIiksc2V0SW1wb3J0YW50U3R5bGUobywicGFkZGluZy1ib3R0b20iLCJ1bnNldCIpKX1ERUJVRyYmY29uc29sZS5pbmZvKCLQkdCw0LfQvtCy0YvQtSDRgdGC0LjQu9C4INC/0YDQuNC80LXQvdC10L3Riy4iKX1mdW5jdGlvbiBnZXRSZWZlcmVuY2VIZWlnaHQoKXt2YXIgdD1nZXRHYWxsZXJ5Q29udGFpbmVyKCk7aWYoIXQpcmV0dXJuIDA7dC5vZmZzZXRIZWlnaHQ7Zm9yKHZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKSxzPTA7czxlLmxlbmd0aDtzKyspe3ZhciBpPWVbc107aWYoIm5vbmUiIT09d2luZG93LmdldENvbXB1dGVkU3R5bGUoaSkuZGlzcGxheSYmMCE9PWkub2Zmc2V0SGVpZ2h0JiZpLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LWltZyIpKXt2YXIgcj1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtyZXR1cm4gREVCVUcmJmNvbnNvbGUuaW5mbygi0J7Qv9C+0YDQvdCw0Y8g0LrQsNGA0YLQvtGH0LrQsCDQvdCw0LnQtNC10L3QsC4g0JLRi9GB0L7RgtCwOiIscikscn19cmV0dXJuIERFQlVHJiZjb25zb2xlLmluZm8oItCd0LUg0L3QsNC50LTQtdC90LAg0LLQuNC00LjQvNCw0Y8g0LrQsNGA0YLQvtGH0LrQsCDRgSDQuNC30L7QsdGA0LDQttC10L3QuNC10LwuIiksMH1mdW5jdGlvbiB1cGRhdGVOb0ltYWdlQ2FyZEhlaWdodHMoKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dmFyIHQ9Z2V0UmVmZXJlbmNlSGVpZ2h0KCk7aWYoISh0PD0wKSl7dmFyIGU9Z2V0R2FsbGVyeUNvbnRhaW5lcigpO2lmKGUpZm9yKHZhciBzPWUucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKSxpPTA7aTxzLmxlbmd0aDtpKyspe3ZhciByPXNbaV07ci5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdC1pbWciKT9yLnN0eWxlLmhlaWdodD0iIjooci5zdHlsZS5jc3NUZXh0Kz0iOyBoZWlnaHQ6ICIrdCsicHggIWltcG9ydGFudDsiLERFQlVHJiZjb25zb2xlLmluZm8oItCj0YHRgtCw0L3QvtCy0LvQtdC90LAg0LLRi9GB0L7RgtCwINC00LvRjyDQutCw0YDRgtC+0YfQutC4INCx0LXQtyDQuNC30L7QsdGA0LDQttC10L3QuNGPOiIsdCkpfX19KSl9ZnVuY3Rpb24gYXR0YWNoSW1hZ2VMb2FkTGlzdGVuZXJzKCl7dmFyIHQ9Z2V0R2FsbGVyeUNvbnRhaW5lcigpO2lmKHQpZm9yKHZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QtaW1nIikscz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgaT1lW3NdO2kuY29tcGxldGV8fGkuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7REVCVUcmJmNvbnNvbGUuaW5mbygi0JjQt9C+0LHRgNCw0LbQtdC90LjQtSDQt9Cw0LPRgNGD0LfQuNC70L7RgdGMLCDQvtCx0L3QvtCy0LvRj9C10Lwg0LLRi9GB0L7RgtGDIiksdXBkYXRlTm9JbWFnZUNhcmRIZWlnaHRzKCl9KSl9fWZ1bmN0aW9uIGFkZEVtcHR5RGVzY3JQbGFjZWhvbGRlcih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi5qcy1zdG9yZS1wcm9kLWRlc2NyLnQtc3RvcmVfX2NhcmRfX2Rlc2NyIik7aWYoZSl7dmFyIHM9Z2V0Q29tcHV0ZWRTdHlsZShlKSxpPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LHI9cy5wYWRkaW5nVG9wO3QucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighdC5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJvZC1kZXNjci50LXN0b3JlX19jYXJkX19kZXNjciIpKXt2YXIgcz10LnF1ZXJ5U2VsZWN0b3IoIi50LXN0b3JlX19jYXJkX190ZXh0d3JhcHBlciIpLGE9cyYmcy5xdWVyeVNlbGVjdG9yKCIuanMtc3RvcmUtcHJpY2Utd3JhcHBlciIpO2lmKHMmJmEpe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NOYW1lPWUuY2xhc3NOYW1lLGwuc3R5bGUuc2V0UHJvcGVydHkoImhlaWdodCIsaSsicHgiLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLXRvcCIsciwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgibWFyZ2luLWJvdHRvbSIsIjBweCIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoImRpc3BsYXkiLCItd2Via2l0LWJveCIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoIi13ZWJraXQtYm94LW9yaWVudCIsInZlcnRpY2FsIiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgiLXdlYmtpdC1saW5lLWNsYW1wIiwiMSIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoIm92ZXJmbG93IiwiaGlkZGVuIiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgidGV4dC1vdmVyZmxvdyIsImVsbGlwc2lzIiwiaW1wb3J0YW50Iikscy5pbnNlcnRCZWZvcmUobCxhKX19fSkpfX1mdW5jdGlvbiBpbml0R2FsbGVyeSgpe3ZhciB0PWdldEdhbGxlcnlDb250YWluZXIoKTtpZih0KXt0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1zdHlsZXMtYXBwbGllZCIpLGFwcGx5QmFzZVN0eWxlcyh0KSx0LmRhdGFzZXQuc3R5bGVzQXBwbGllZD0idHJ1ZSIsYWRkRW1wdHlEZXNjclBsYWNlaG9sZGVyKHQpLERFQlVHJiZjb25zb2xlLmluZm8oItCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINCz0LDQu9C10YDQtdC4INC30LDQstC10YDRiNC10L3QsC4iKTtmb3IodmFyIGU9WzUwMCwxZTMsMTUwMF0scz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgaTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2F0dGFjaEltYWdlTG9hZExpc3RlbmVycygpLHVwZGF0ZU5vSW1hZ2VDYXJkSGVpZ2h0cygpfSksZVtzXSl9fWVsc2UgREVCVUcmJmNvbnNvbGUuaW5mbygi0JrQvtC90YLQtdC50L3QtdGAINCz0LDQu9C10YDQtdC4INC90LUg0L3QsNC50LTQtdC9LiIpfWZ1bmN0aW9uIG9ic2VydmVQb3B1cCgpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwIiksZTt0JiYoIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdz9uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBzPTA7czx0Lmxlbmd0aDtzKyspe3ZhciBpO2lmKHRbc10uaXNJbnRlcnNlY3Rpbmcpe0RFQlVHJiZjb25zb2xlLmluZm8oItCf0L7Qv9Cw0L8g0LLQuNC00LjQvC4g0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LPQsNC70LXRgNC10Lgg0YfQtdGA0LXQtyAxNTAwINC80YEiKSxlLmRpc2Nvbm5lY3QoKSxzZXRUaW1lb3V0KGluaXRHYWxsZXJ5LDE1MDApO2JyZWFrfX19KSkub2JzZXJ2ZSh0KTpzZXRUaW1lb3V0KGluaXRHYWxsZXJ5LDE1MDApKX1mdW5jdGlvbiBvblJlc2l6ZSgpe0RFQlVHJiZjb25zb2xlLmluZm8oIlJlc2l6ZSDigJMg0L7QsdC90L7QstC70LXQvdC40LUg0LLRi9GB0L7RgtGLINC60LDRgNGC0L7Rh9C10LoiKSx1cGRhdGVOb0ltYWdlQ2FyZEhlaWdodHMoKX1mdW5jdGlvbiBvblBvcHN0YXRlKCl7REVCVUcmJmNvbnNvbGUuaW5mbygiUG9wc3RhdGUg4oCTINC40L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINCz0LDQu9C10YDQtdC4Iiksc2V0VGltZW91dChpbml0R2FsbGVyeSw1MDApfWZ1bmN0aW9uIG9uUGFnZXNob3codCl7dC5wZXJzaXN0ZWQmJihERUJVRyYmY29uc29sZS5pbmZvKCJQYWdlc2hvdyAo0LjQtyDQutGN0YjQsCkg4oCTINC40L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINCz0LDQu9C10YDQtdC4IiksaW5pdEdhbGxlcnkoKSl9ZnVuY3Rpb24gb25XaW5kb3dMb2FkKCl7aW5pdEdhbGxlcnkoKSxvYnNlcnZlUG9wdXAoKX1pZih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixvblJlc2l6ZSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIixvblBvcHN0YXRlKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicGFnZXNob3ciLG9uUGFnZXNob3cpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixvbldpbmRvd0xvYWQpLGRvY3VtZW50LmJvZHkmJiJNdXRhdGlvbk9ic2VydmVyImluIHdpbmRvdyl7dmFyIGRvbU9ic2VydmVyPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbigpe2luaXRHYWxsZXJ5KCl9KSk7ZG9tT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pfXZhciBwb2xsQ291bnQ9MCxwb2xsSW50ZXJ2YWw9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7aW5pdEdhbGxlcnkoKSwrK3BvbGxDb3VudD49MjAmJmNsZWFySW50ZXJ2YWwocG9sbEludGVydmFsKX0pLDUwMCk7CgpmdW5jdGlvbiB0Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKGUpe3RyeXt2YXIgdCxyPS92YXJcKCgtLXVjLShbXi1dKyktKFteLV0rKS0oW14sXSspKSxccz8oLiopXCkvLmV4ZWMoZSk7aWYoIXIpcmV0dXJuO3ZhciBsPXJbMF0sYT1yWzFdLG89clsyXSxzPXJbM10sXz1yWzRdLG49cls1XSxpLGQ7aWYoIShsJiZvJiZzJiZfJiZuKSlyZXR1cm47cmV0dXJue3BhcmVudDp7aWQ6Xyx0eXBlOm99LGZhbGxiYWNrOndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoYSl8fG4sZmllbGQ6c319Y2F0Y2goYyl7Y29uc29sZS5lcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHBhcnNlIENTUyBWYXJpYWJsZSIpfX1mdW5jdGlvbiB0Mzk2X19oZXgycmdiYShlLHQpe2lmKCFlKXJldHVybiExO3ZhciByPXQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIoZSk7ciYmKGU9ci5mYWxsYmFjayk7dmFyIGw9ZS5yZXBsYWNlKC8jLywiIik7aWYoMz09PWwubGVuZ3RoKXt2YXIgYT1sWzBdLG89bFsxXSxzPWxbMl07ZT0iIyIrYSthK28rbytzK3N9dmFyIF89cGFyc2VJbnQoZS5zdWJzdHJpbmcoMSksMTYpLG4saSxkO3JldHVyblsoMTY3MTE2ODAmXyk+PjE2LCg2NTI4MCZfKT4+OCwyNTUmXyxwYXJzZUZsb2F0KHQpXX1mdW5jdGlvbiB0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKGUpe3ZhciB0PVsiZ2FsbGVyeSJdLHI9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7cmV0dXJuIHQuaW5jbHVkZXMocil9ZnVuY3Rpb24gdDM5Nl9faXNGbGV4KGUpe3ZhciB0PWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZC1mbGV4Iikscj1lLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZ3JvdXAtZmxleCIpO3JldHVybiB0fHxyfWZ1bmN0aW9uIHQzOTZfX3NldE92ZXJmbG93VG9BbGxSZWNvcmRzKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtpZihlKXt2YXIgdD1bIi50OTUxX19zaWRlYmFyX3N0aWNreSIsIi50MTIwNl9fY29udGVudF9zdGlja3kiLCIudDc1NF9fY29sX2ZpeGVkIiwiLnQ3NzZfX2NvbF9maXhlZCIsIi50Nzg2X19jb2xfZml4ZWQiLCIudC1zdG9yZV9fcHJvZC1wb3B1cF9fY29sX2ZpeGVkIl07dDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCk7dmFyIHI9Qm9vbGVhbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQuam9pbigiLCAiKSkpO2UuY2xhc3NMaXN0LnJlbW92ZSgidC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIiwidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKSxlLmNsYXNzTGlzdC5hZGQocj8idC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIjoidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKX19ZnVuY3Rpb24gdDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCl7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtlLmlkPSJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiLGUuaW5uZXJIVE1MPSIudC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIHsgb3ZlcmZsb3c6IGNsaXA7IH1cblx0XHRcdFx0XHRcdC50LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiB7IG92ZXJmbG93OiBoaWRkZW47IH0iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSl9fWZ1bmN0aW9uIHQzOTZfX2dldEFydGJvYXJkcyhlKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHIsbD10JiYiZWRpdCI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik/Jy5yZWNvcmRbZGF0YS1yZWNvcmQtdHlwZT0iJytlKyciXSAucjpub3QoLnQzOTdfX29mZik6bm90KC50Mzk1X19vZmYpOm5vdCgudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnOicucltkYXRhLXJlY29yZC10eXBlPSInK2UrJyJdOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwobCkpfWZ1bmN0aW9uIHQzOTZfX2dldFplcm9CbG9ja3MoKXt2YXIgZT1bXS5jb25jYXQodDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIzOTYiKSx0Mzk2X19nZXRBcnRib2FyZHMoIjEyMSIpKSx0O3JldHVybiBlLmxlbmd0aD9lLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJue3JlY29yZDplLmNsb3Nlc3QoIi5yOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIiksYXJ0Ym9hcmQ6ZX19KSkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWNvcmR9KSk6W119ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9faW5pdChlLHQpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpLGw9cj9yLnF1ZXJ5U2VsZWN0b3IoJy50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJyt0KyciXScpOm51bGw7aWYoIWwpcmV0dXJuITE7dmFyIGE9ImZ1bmN0aW9uIj09dHlwZW9mIGpRdWVyeTt0X29uRnVuY0xvYWQoInRfc2xkc0luaXQiLChmdW5jdGlvbigpe3Rfb25GdW5jTG9hZCgidDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlIiwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19wcm9jZXNzR2FsbGVyeVdpdGhHZW9MYW5kaW5nKHIsKGZ1bmN0aW9uKCl7dF96ZXJvR2FsbGVyeV9fcmVuZGVyKGw9ci5xdWVyeVNlbGVjdG9yKCcudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrdCsnIl0nKSksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGE/JChsKTpsKSx0X3NsZHNJbml0KGE/JChsKTpbbF0pLHRfb25GdW5jTG9hZCgidF9zbGRzX3VwZGF0ZVNsaWRlciIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3NsZHNfdXBkYXRlU2xpZGVyKGE/JChsKTpbbF0pLHRfemVyb0dhbGxlcnlfX3JlbmRlcl9uZXh0KGwsZSl9KSl9KSl9KSl9KSksWyJlZGl0IiwiemVybyJdLmluY2x1ZGVzKHdpbmRvdy50aWxkYW1vZGUpfHwieSIhPT1sLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC16b29tYWJsZS12YWx1ZSIpfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC16b29tZXJfX3dyYXBwZXIiKS5sZW5ndGh8fHRfb25GdW5jTG9hZCgidF9pbml0Wm9vbSIsKGZ1bmN0aW9uKCl7dF9pbml0Wm9vbSgpfSkpLHRfemVyb0dhbGxlcnlfX2hhbmRsZU1vdmVTbGlkZXIobCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKGZ1bmN0aW9uKCl7dDM5Nl93YWl0Rm9yRmluYWxFdmVudCgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfc2xkc191cGRhdGVTbGlkZXIoYT8kKGwpOltsXSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyX25leHQobCxlKX0pLDIwMCl9KSw1MDAsInNsZHNfcmVzaXplcnVuaXF1ZWlkIitlK3QpfSkpO3ZhciBvPXIucXVlcnlTZWxlY3RvcigiLnQzOTYiKTtvJiYoInVuZGVmaW5lZCIhPXR5cGVvZiBqUXVlcnk/KCQobykudW5iaW5kKCJkaXNwbGF5Q2hhbmdlZCIsdF96ZXJvR2FsbGVyeV9fdXBkYXRlU2xpZGVySGFuZGxlciksJChvKS5iaW5kKCJkaXNwbGF5Q2hhbmdlZCIsdF96ZXJvR2FsbGVyeV9fdXBkYXRlU2xpZGVySGFuZGxlcikpOihvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIix0X3plcm9HYWxsZXJ5X191cGRhdGVTbGlkZXJIYW5kbGVyKSxvLmFkZEV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIix0X3plcm9HYWxsZXJ5X191cGRhdGVTbGlkZXJIYW5kbGVyKSkpO3ZhciBzPWwucXVlcnlTZWxlY3RvcigiLnQtc2xkcyIpO3MmJihzLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiKX0pKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19oYW5kbGVNb3ZlU2xpZGVyKGUpe3ZhciB0O2lmKCEoL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwib250b3VjaGVuZCJpbiBkb2N1bWVudCkpe3ZhciByPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGw9ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIiksYT1wYXJzZUZsb2F0KHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIikpO2F8fDA9PT1hfHwoYT0zMDApO3ZhciBvPTE0MDt0X3plcm9HYWxsZXJ5X19zZXRTbGlkZXNPcGFjaXR5KGwsIjAiKSxlLmFkZEV2ZW50TGlzdGVuZXIoInRpbGRhU2xkc01vdmVTbGlkZVN0YXJ0IiwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19zZXRTbGlkZXNPcGFjaXR5KGwsIjEiKX0pKSxlLmFkZEV2ZW50TGlzdGVuZXIoInRpbGRhU2xkc01vdmVTbGlkZUVuZCIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19zZXRTbGlkZXNPcGFjaXR5KGwsIjAiKX0pLGErbyl9KSl9fWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3NldFNsaWRlc09wYWNpdHkoZSx0KXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIil8fChlLnN0eWxlLm9wYWNpdHk9dCl9KSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fcHJvY2Vzc0dhbGxlcnlXaXRoR2VvTGFuZGluZyhlLHQpe3ZhciByPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50ODA0IiksbD0hIWUudGV4dENvbnRlbnQmJi0xIT09ZS50ZXh0Q29udGVudC5pbmRleE9mKCIlJSIpLGE9ZS5xdWVyeVNlbGVjdG9yKCJbZGF0YS1yZXBsYWNlLWtleV0iKSxvPSJwdWJsaXNoZWQiIT09dF96ZXJvR2FsbGVyeV9fZ2V0VGlsZGFNb2RlKCk7IXJ8fCFsfHxhfHxvP3QoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZXBsYWNpbmdDb21wbGV0ZWQiLHQpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3VwZGF0ZVNsaWRlckhhbmRsZXIoZSl7dF9zbGRzX3VwZGF0ZVNsaWRlcihlLnRhcmdldCl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2V0VGlsZGFNb2RlKCl7aWYodm9pZCAwIT09d2luZG93LnRpbGRhbW9kZSlyZXR1cm4gd2luZG93LnRpbGRhbW9kZTt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHQ7c3dpdGNoKGU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOiIiKXtjYXNlImVkaXQiOndpbmRvdy50aWxkYW1vZGU9ImVkaXQiO2JyZWFrO2Nhc2UicHJldmlldyI6d2luZG93LnRpbGRhbW9kZT0icHJldmlldyI7YnJlYWs7ZGVmYXVsdDp3aW5kb3cudGlsZGFtb2RlPSJwdWJsaXNoZWQifXJldHVybiB3aW5kb3cudGlsZGFtb2RlfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3JlbmRlcihlKXt3aW5kb3cualF1ZXJ5JiZlIGluc3RhbmNlb2YgalF1ZXJ5JiYoZT1lLmxlbmd0aD9lLmdldCgwKTpudWxsKTt2YXIgdD1lP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLWltZ3MtdmFsdWUiKToiIjtpZighdCl7dmFyIHI9ZT9lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zbGRzLWltZ3MtdGV4dGFyZWEiKTpudWxsO3Q9cj9yLnZhbHVlOiIifXZhciBsPSJmdW5jdGlvbiI9PXR5cGVvZiBqUXVlcnksYT10P0pTT04ucGFyc2UodCk6W107YT1hLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIXRfemVyb0dhbGxlcnlfX2lzRW1wdHlPYmooZSl9KSk7dmFyIG89ZT9lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik6bnVsbDtvJiYoby5pbm5lckhUTUw9JzxkaXYgY2xhc3M9InQtc2xkcyIgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbjsiPjxkaXYgY2xhc3M9InQtc2xkc19fbWFpbiI+PGRpdiBjbGFzcz0idC1zbGRzX19jb250YWluZXIiPjxkaXYgY2xhc3M9InQtc2xkc19faXRlbXMtd3JhcHBlciIgZGF0YS1zbGlkZXItdHJhbnNpdGlvbj0iIiBkYXRhLXNsaWRlci13aXRoLWN5Y2xlPSJ0cnVlIiBkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodD0idHJ1ZSIgZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoPSJmYWxzZSIgIGRhdGEtc2xpZGVyLWlzLXByZXZpZXc9InRydWUiPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InQtc2xkc19fYnVsbGV0X3dyYXBwZXIiPjwvZGl2PjxkaXYgY2xhc3M9InQtc2xkc19fY2FwdGlvbl9fY29udGFpbmVyIj48L2Rpdj48ZGl2IGNsYXNzPSJ0LXNsZHNfX2Fycm93X2NvbnRhaW5lciI+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvd193cmFwcGVyIHQtc2xkc19fYXJyb3dfd3JhcHBlci1sZWZ0IiBkYXRhLXNsaWRlLWRpcmVjdGlvbj0ibGVmdCIgc3R5bGU9ImhlaWdodDogNDg4cHg7Ij48ZGl2IGNsYXNzPSJ0LXNsZHNfX2Fycm93IHQtc2xkc19fYXJyb3ctbGVmdCI+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvd19ib2R5IHQtc2xkc19fYXJyb3dfYm9keS1sZWZ0Ij48c3ZnIGNsYXNzPSJ0LW51bGxfX3NsZHMtYXJyb3cgdC1udWxsX19zbGRzLWFycm93XzEiIHdpZHRoPSI5NCIgaGVpZ2h0PSI5NCIgdmlld0JveD0iMCAwIDk0IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0zOSA2OEw2MCA0N0wzOSAyNiIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PC9zdmc+PHN2ZyBjbGFzcz0idC1udWxsX19zbGRzLWFycm93IHQtbnVsbF9fc2xkcy1hcnJvd18yIiAgd2lkdGg9Ijk0IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgOTQgOTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYzIDQ3LjkxN0gzMCIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PHBhdGggZD0iTTQ2LjkxNyA2NEw2MyA0Ny45MTdMNDYuOTE3IDMxLjgzNCIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PC9zdmc+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvd193cmFwcGVyIHQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIgZGF0YS1zbGlkZS1kaXJlY3Rpb249InJpZ2h0IiBzdHlsZT0iaGVpZ2h0OiA0ODhweDsiPjxkaXYgY2xhc3M9InQtc2xkc19fYXJyb3cgdC1zbGRzX19hcnJvdy1yaWdodCAiPjxkaXYgY2xhc3M9InQtc2xkc19fYXJyb3dfYm9keSB0LXNsZHNfX2Fycm93X2JvZHktcmlnaHQiPjxzdmcgY2xhc3M9InQtbnVsbF9fc2xkcy1hcnJvdyB0LW51bGxfX3NsZHMtYXJyb3dfMSIgd2lkdGg9Ijk0IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgOTQgOTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTM5IDY4TDYwIDQ3TDM5IDI2IiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48L3N2Zz48c3ZnIGNsYXNzPSJ0LW51bGxfX3NsZHMtYXJyb3cgdC1udWxsX19zbGRzLWFycm93XzIiICB3aWR0aD0iOTQiIGhlaWdodD0iOTQiIHZpZXdCb3g9IjAgMCA5NCA5NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNjMgNDcuOTE3SDMwIiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48cGF0aCBkPSJNNDYuOTE3IDY0TDYzIDQ3LjkxN0w0Ni45MTcgMzEuODM0IiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48L3N2Zz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTtmb3IodmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksXz0icHVibGlzaGVkIj09PXRfemVyb0dhbGxlcnlfX2dldFRpbGRhTW9kZSgpJiYieSI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInpvb21hYmxlIiksbj0hMSxpPXRfemVyb0dhbGxlcnlfX2lzTGF6eUxvYWRpbmdPbkVsZW0oZSxsKSxkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBjPWFbZF0seT10X3plcm9HYWxsZXJ5X19nZXRWaWRlb0tleXMoKS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gY1tlXX0pKTsoeXx8Yy5saV9pbWd1cmwpJiYobj0hMCksXz1fJiYhYy5saV9pbWd1cmwmJiF5LGMuem9vbWFibGU9XyxjLndpdGhMYXp5PWk7dmFyIHU9dF96ZXJvR2FsbGVyeV9fZ2VuZXJhdGVTbGlkZShjLGQpO3UmJihudWxsPT1zfHxzLmFwcGVuZENoaWxkKHUpKTt2YXIgbT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF93cmFwcGVyIik7aWYobSl7dmFyIHA9JzxkaXYgY2xhc3M9InQtc2xkc19fYnVsbGV0JysoMD09PWQ/IiB0LXNsZHNfX2J1bGxldF9hY3RpdmUiOiIiKSsnIiBkYXRhLXNsaWRlLWJ1bGxldC1mb3I9IicrKGQrMSkrJyI+PGRpdiBjbGFzcz0idC1zbGRzX19idWxsZXRfYm9keSIgc3R5bGU9IndpZHRoOiAxMHB4OyBoZWlnaHQ6IDEwcHg7YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ij48L2Rpdj48L2Rpdj4nO20uaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLHApfXRfemVyb0dhbGxlcnlfX2FwcGVuZENhcHRpb24oZSxjLGQpfWlmKCFfJiYhbil7dmFyIGc9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19jb250YWluZXIiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGcsKGZ1bmN0aW9uKGUpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfemVyb0dhbGxlcnlfX3NldFNpZGVIYW5kbGVycyksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF96ZXJvR2FsbGVyeV9fc2V0U2lkZUhhbmRsZXJzKX0pKX1pJiZ0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2FwcGVuZENhcHRpb24oZSx0LHIpe3ZhciBsPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY2FwdGlvbl9fY29udGFpbmVyIik7bnVsbD09bHx8bC5hcHBlbmRDaGlsZCh0X3plcm9HYWxsZXJ5X19jcmVhdGVDYXB0aW9uKHQscikpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2NyZWF0ZUNhcHRpb24oZSx0KXt2YXIgcj1lLmxpX2ltZ3RpdGxlfHwiIixsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19jYXB0aW9uIiksMD09PXQmJmwuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19jYXB0aW9uLWFjdGl2ZSIpLGwuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWNhcHRpb24iLHQrMSk7dmFyIGEsbz1yLnN0YXJ0c1dpdGgoIjxzcGFuIGRhdGEtcmVwbGFjZS1rZXkiKSYmci5lbmRzV2l0aCgiPC9zcGFuPiIpP3I6dF96ZXJvR2FsbGVyeV9fZXNjYXBlSHRtbChyKTtyZXR1cm4gbC5pbm5lckhUTUw9bz8nPGRpdiBjbGFzcz0idC1zbGRzX19jYXB0aW9uX3dyYXBwZXIiPjxkaXYgY2xhc3M9InQtc2xkc19fdGl0bGUiPicrbysiPC9kaXY+PC9kaXY+IjoiIixsfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dlbmVyYXRlU2xpZGUoZSx0KXt2YXIgcixsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGE9WyJ0LXNsZHNfX2l0ZW0iXTswPT09dCYmYS5wdXNoKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksKHI9bC5jbGFzc0xpc3QpLmFkZC5hcHBseShyLGEpLGwuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4Iix0KzEpO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBvLmNsYXNzTGlzdC5hZGQoInQtd2lkdGgiLCJ0LW51bGxfX3NsZHMtd3JhcHBlciIsInQtc2xkc19fd3JhcHBlciIsInQtc2xkc19fd3JhcHBlcl8xMDAiLCJ0LWFsaWduX2NlbnRlciIpLGwuYXBwZW5kQ2hpbGQobyksZS5saV9pbWdhbHQmJihvLmlubmVySFRNTD0nPG1ldGEgaXRlbXByb3A9ImltYWdlIiBjb250ZW50PSInK3RfemVyb0dhbGxlcnlfX2VzY2FwZUh0bWwoZS5saV9pbWcpKyciPlxuXHRcdFx0PG1ldGEgaXRlbXByb3A9ImNhcHRpb24iIGNvbnRlbnQ9IicrdF96ZXJvR2FsbGVyeV9fZXNjYXBlSHRtbChlLmxpX2ltZ2FsdCkrJyI+XG5cdFx0XHQnKSxvLmFwcGVuZENoaWxkKHRfemVyb0dhbGxlcnlfX2dlbmVyYXRlU2xpZGVDb250ZW50KGUsdCkpLGx9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2VuZXJhdGVTbGlkZUNvbnRlbnQoZSx0KXt2YXIgcj10X3plcm9HYWxsZXJ5X19nZXRWaWRlb0tleXMoKS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKSxsPWUubGlfaW1ndXJsJiYhcixhPWUubGlfaW1ndGFyZ2V0JiYhcixvPWUubGlfaW1nbm9mb2xsb3cmJiFyLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsPyJhIjoiZGl2Iik7aWYocy5zZXRBdHRyaWJ1dGUoImRhdGEtaW1nLWxpZCIsZS5saWQpLGwmJnMuc2V0QXR0cmlidXRlKCJocmVmIixlLmxpX2ltZ3VybCksYSYmcy5zZXRBdHRyaWJ1dGUoInRhcmdldCIsIl9ibGFuayIpLG8mJnMuc2V0QXR0cmlidXRlKCJyZWwiLCJub2ZvbGxvdyIpLGUuem9vbWFibGUmJihzLnNldEF0dHJpYnV0ZSgiZGF0YS16b29tLXRhcmdldCIsdCsxKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS16b29tYWJsZSIsInllcyIpLHMuc2V0QXR0cmlidXRlKCJkYXRhLWltZy16b29tLXVybCIsZS5saV9pbWcpLHMuY2xhc3NMaXN0LmFkZCgidC16b29tYWJsZSIpKSxlLndpdGhMYXp5JiYocy5jbGFzc0xpc3QuYWRkKCJ0LWJnaW1nIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwiLGUubGlfaW1nKSkscy5jbGFzc0xpc3QuYWRkKCJ0bi1hdG9tX19zbGRzLWltZyIpLHMuc3R5bGUuYmFja2dyb3VuZEltYWdlPXRfemVyb0dhbGxlcnlfX3BhcnNlSW1hZ2VVcmwoZS5saV9pbWcsZS53aXRoTGF6eSkscil7dmFyIF89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Xy5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X192aWRlby13cmFwcGVyIiksXy5hcHBlbmRDaGlsZChzKTt2YXIgbj10X3plcm9HYWxsZXJ5X19jcmVhdGVQbGF5QnV0dG9uRm9yVmlkZW8oZSk7cmV0dXJuIG4mJl8uYXBwZW5kQ2hpbGQobiksX31yZXR1cm4gc31mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19wYXJzZUltYWdlVXJsKGUsdCl7aWYoIWUpcmV0dXJuIiI7aWYoIXR8fGUuaW5jbHVkZXMoIi5zdmciKXx8IWUuaW5jbHVkZXMoImh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIpKXJldHVybiJ1cmwoIitlKyIpIjt2YXIgcj1lLnNwbGl0KCIvIik7cmV0dXJuIHIuc3BsaWNlKC0xLDAsIi0vcmVzaXplLzIweC8iKSwidXJsKCIrci5qb2luKCIvIikrIikifWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2NyZWF0ZVBsYXlCdXR0b25Gb3JWaWRlbyhlKXt2YXIgdD10X3plcm9HYWxsZXJ5X19nZXRWaWRlb0tleXMoKS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKSxyPShudWxsPT10P3ZvaWQgMDp0LnJlcGxhY2UoImxpXyIsIiIpKXx8IiIsbD1lW3RdfHwiIjtpZighcnx8IWwpcmV0dXJuIG51bGw7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGEuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fcGxheSIpLGEuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci12aWRlby10eXBlIixyKSxhLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdmlkZW8tdXJsIixsKSxhLmlubmVySFRNTD0nPHN2ZyB2aWV3Qm94PSIwIDAgNjAgNjAiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGcgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9IiIgZmlsbC1ydWxlPSJldmVub2RkIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGcgY2xhc3M9InRuLWVsZW1fX2dhbGxlcnlfX3BsYXlfaWNvbl9fY29sb3ItaG9sZGVyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNjkxLjAwMDAwMCwgLTM1MTQuMDAwMDAwKSIgZmlsbD0iI0ZGRkZGRiI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHBhdGggZD0iTTcyMSwzNTc0IEM3MzcuNTY4NTQyLDM1NzQgNzUxLDM1NjAuNTY4NTQgNzUxLDM1NDQgQzc1MSwzNTI3LjQzMTQ2IDczNy41Njg1NDIsMzUxNCA3MjEsMzUxNCBDNzA0LjQzMTQ1OCwzNTE0IDY5MSwzNTI3LjQzMTQ2IDY5MSwzNTQ0IEM2OTEsMzU2MC41Njg1NCA3MDQuNDMxNDU4LDM1NzQgNzIxLDM1NzQgWiBNNzE1LDM1MzQgTDczMiwzNTQ0LjUgTDcxNSwzNTU1IEw3MTUsMzUzNCBaIj48L3BhdGg+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZz5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZz5cblx0XHRcdFx0XHRcdFx0XHQ8L3N2Zz4nLGEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfemVyb0dhbGxlcnlfX3BsYXlWaWRlbyksYX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19zZXRTaWRlSGFuZGxlcnMoZSl7dmFyIHQ9ZS50YXJnZXQscj10LmNsb3Nlc3QoIi50LXNsZHMiKSxsPWUub2Zmc2V0WCxhPXQub2Zmc2V0V2lkdGgsbz1yP3IucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctbGVmdCIpOm51bGwscz1yP3IucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctcmlnaHQiKTpudWxsO2w8PTYwJiZvJiZvLmNsaWNrKCksYS1sPD02MCYmcy5jbGljaygpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2lzRW1wdHlPYmooZSl7aWYoIWUpcmV0dXJuITA7dmFyIHQ9W107Zm9yKHZhciByIGluIGUpZVtyXXx8dC5wdXNoKCJ5Iik7cmV0dXJuIHQubGVuZ3RoPT09T2JqZWN0LmtleXMoZSkubGVuZ3RofWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3JlbmRlcl9uZXh0KGUsdCl7dmFyIHI7WyJzbGRzX2Fycm93c2l6ZSIsInNsZHNfYXJyb3dsaW5lc2l6ZSIsInNsZHNfYXJyb3djb2xvciIsInNsZHNfYXJyb3djb2xvcmhvdmVyIiwic2xkc19hcnJvd2JnY29sb3IiLCJzbGRzX2Fycm93Ymdjb2xvcmhvdmVyIiwic2xkc19hcnJvd2Jnb3BhY2l0eSIsInNsZHNfYXJyb3diZ29wYWNpdHlob3ZlciIsInNsZHNfZG90c3NpemUiLCJzbGRzX2RvdHNiZ2NvbG9yIiwic2xkc19kb3RzYmdjb2xvcmFjdGl2ZSIsInNsZHNfbG9vcCIsInNsZHNfc3BlZWQiLCJzbGRzX2F1dG9wbGF5Iiwic2xkc19hcnJvd2NvbnRyb2xzIiwic2xkc19kb3RzY29udHJvbHMiLCJzbGRzX3N0cmV0Y2giLCJzbGRzX3BsYXlpY29uc2l6ZSIsInNsZHNfcGxheWljb25jb2xvciIsInNsZHNfY2FwdGlvbnRvcG1hcmdpbiIsInNsZHNfZG90c3ZtYXJnaW4iLCJzbGRzX2NhcHRpb253aWR0aCIsInNsZHNfYXJyb3dobWFyZ2luIiwic2xkc19hcnJvd3ZtYXJnaW4iLCJzbGRzX2RvdHNobWFyZ2luIiwic2xkc19hcnJvd2FsaWduIiwic2xkc19hcnJvd2JldHdlZW5tYXJnaW4iLCJzbGRzX2Fycm93dHlwZSIsInNsZHNfY3Vyc29yY29udHJvbCIsInNsZHNfaW1ncG9zaXRpb24iLCJzbGRzX2Fycm93Ym9yZGVyIl0uZm9yRWFjaCgoZnVuY3Rpb24ocil7dF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCxyKX0pKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZXRBcnJvd1NpemUoZSl7dmFyIHQ7cmV0dXJue3M6MzAsbTo0MCxsOjQ1LHhsOjUwfVtlXX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LHIpe3ZhciBsPSJmdW5jdGlvbiI9PXR5cGVvZiBqUXVlcnksYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsciksbz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvd19jb250YWluZXIiKSxfPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYnVsbGV0X3dyYXBwZXIiKSxuPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGk9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvdyIpLGQ9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1yaWdodCIpLGM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1sZWZ0IikseT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2J1bGxldF9ib2R5IiksdSxtLHAsZyx2LHcsZjtzd2l0Y2godm9pZCAwPT09YSYmKGE9IiIpLHIpe2Nhc2Uic2xkc19pbWdwb3NpdGlvbiI6dmFyIGI7YXx8KGE9ImNlbnRlciBjZW50ZXIiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX3Bvc2l0aW9uLXN0eWxlcyIpKSxvJiYoKGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fcG9zaXRpb24tc3R5bGVzIiksZi50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50bi1hdG9tX19zbGRzLWltZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOiAnK2ErIjt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixmKSk7YnJlYWs7Y2FzZSJzbGRzX3N0cmV0Y2giOnZhciBoO2F8fChhPSJjb3ZlciIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9fc3RyZXRjaC1zdHlsZXMiKSksbyYmKChmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX3N0cmV0Y2gtc3R5bGVzIiksZi50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50bi1hdG9tX19zbGRzLWltZyB7YmFja2dyb3VuZC1zaXplOiAnK2ErIjt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixmKSk7YnJlYWs7Y2FzZSJzbGRzX2N1cnNvcmNvbnRyb2wiOmF8fChhPSJub25lIiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy1jdXJzb3IiKSwib24iPT09YSYmZS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy1jdXJzb3IiKTticmVhaztjYXNlInNsZHNfYXJyb3djb250cm9scyI6aWYoYXx8KGE9Im5lYXIiKSxlLmNsYXNzTGlzdC5yZW1vdmUoInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLWluIiwidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtbmVhciIsInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLW5vbmUiLCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy1hYm92ZSIsInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLXVuZGVyIiksZS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy0iK2EpLCJhYm92ZSI9PT1hfHwidW5kZXIiPT09YSl7dT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3dzaXplIik7dmFyIHo9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93YmV0d2Vlbm1hcmdpbiIpO2lmKHp8fCh6PSIxMCIpLHV8fCh1PSJzIiksdT10X3plcm9HYWxsZXJ5X19nZXRBcnJvd1NpemUodSkscyl7dmFyIEc9Mip1K3BhcnNlSW50KHosMTApO3Muc3R5bGUud2lkdGg9dDM5Nl9fem9vbWlmeVZhbHVlKGUsRyl9fWVsc2UgcyYmKHMuc3R5bGUud2lkdGg9IjEwMCUiKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChsPyQoZSk6ZSwiYm9yZGVyd2lkdGgiKTsiaW4iPT09YSYmZS5xdWVyeVNlbGVjdG9yKCJbZGF0YS1zbGlkZXItdmlkZW8tdHlwZV0iKSYmZS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX193aXRoLXZpZGVvIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2htYXJnaW4iKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93dm1hcmdpbiIpLCJ1bmRlciI9PT1hJiZ0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2NhcHRpb250b3BtYXJnaW4iKTticmVhaztjYXNlInNsZHNfZG90c2htYXJnaW4iOnZhciBBO2F8fChhPSIyMCIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9fYnVsbGV0LWhtYXJnaW4tc3R5bGVzIikpLG8mJigoZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19idWxsZXQtaG1hcmdpbi1zdHlsZXMiKSxmLnRleHRDb250ZW50PSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnQtc2xkc19fYnVsbGV0IHtwYWRkaW5nOiAxMHB4ICcrYS8yKyJweDttYXJnaW46IDBweDt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixmKSk7YnJlYWs7Y2FzZSJzbGRzX2RvdHNjb250cm9scyI6YXx8KGE9Im5vbmUiKSxfJiYoXy5zdHlsZS5kaXNwbGF5PSJibG9jayIpLHY9cGFyc2VJbnQodDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHNzaXplIiksMTApLCJuZWFyIj09PWEmJl8mJihfLnN0eWxlLmJvdHRvbT0tMjAtdisicHgiKSwiaW4iPT09YSYmXyYmKF8uc3R5bGUuYm90dG9tPSIwIiksIm5vbmUiPT09YSYmXyYmKF8uc3R5bGUuZGlzcGxheT0ibm9uZSIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfZG90c3ZtYXJnaW4iKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93dm1hcmdpbiIpO2JyZWFrO2Nhc2Uic2xkc19wbGF5aWNvbnNpemUiOnZhciBMO2F8fChhPSI3MCIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9faWNvbi1zaXplLXN0eWxlcyIpKSxvJiYoKGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9faWNvbi1zaXplLXN0eWxlcyIpLGYudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudG4tZWxlbV9fZ2FsbGVyeV9fcGxheSB7d2lkdGg6ICcrcGFyc2VJbnQoYSwxMCkrInB4O2hlaWdodDogIitwYXJzZUludChhLDEwKSsicHg7bGVmdDogY2FsYyg1MCUgLSAiK3BhcnNlSW50KGEsMTApLzIrInB4KTt0b3A6IGNhbGMoNTAlIC0gIitwYXJzZUludChhLDEwKS8yKyJweCk7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsZikpO2JyZWFrO2Nhc2Uic2xkc19wbGF5aWNvbmNvbG9yIjp2YXIgUzthfHwoYT0iI2ZmZiIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9faWNvbi1jb2xvci1zdHlsZXMiKSksbyYmKChmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2ljb24tY29sb3Itc3R5bGVzIiksZi50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50bi1lbGVtX19nYWxsZXJ5X19wbGF5X2ljb25fX2NvbG9yLWhvbGRlciB7ZmlsbDogJythKyI7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsZikpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd3R5cGUiOmF8fChhPSIxIik7dmFyIEU9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1udWxsX19zbGRzLWFycm93Iik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChFLChmdW5jdGlvbihlKXtlLnN0eWxlLmRpc3BsYXk9Im5vbmUifSkpO3ZhciBrPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtbnVsbF9fc2xkcy1hcnJvd18iK2EpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaywoZnVuY3Rpb24oZSl7ZS5zdHlsZS5kaXNwbGF5PSJibG9jayJ9KSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd3NpemUiKTticmVhaztjYXNlInNsZHNfYXJyb3dib3JkZXIiOnZhciBWO2lmKGF8fChhPSJub25lIiksdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X19hcnJvdy1ib3JkZXItc3R5bGVzIikpLCJub25lIiE9PWEpe3ZhciBGPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2xpbmVzaXplIil8fCIxIix4PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbG9yIil8fCIjMjIyIixxPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbG9yaG92ZXIiKXx8eDtvJiYoKGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fYXJyb3ctYm9yZGVyLXN0eWxlcyIpLGYudGV4dENvbnRlbnQ9Jy50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50LXNsZHNfX2Fycm93X2JvZHk6YmVmb3JlIHtib3JkZXI6ICcrRisicHggc29saWQgIit4Kyc7fS50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50LXNsZHNfX2Fycm93X2JvZHk6aG92ZXI6YmVmb3JlIHtib3JkZXI6ICcrRisicHggc29saWQgIitxKyI7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsZikpfWJyZWFrO2Nhc2Uic2xkc19hcnJvd3NpemUiOmF8fChhPSJzIiksYT10X3plcm9HYWxsZXJ5X19nZXRBcnJvd1NpemUoYSk7dmFyIEM9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd19ib2R5Iik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChDLChmdW5jdGlvbih0KXt0LnN0eWxlLnNldFByb3BlcnR5KCJ3aWR0aCIsdDM5Nl9fem9vbWlmeVZhbHVlKGUscGFyc2VJbnQoYSwxMCkpLCJpbXBvcnRhbnQiKX0pKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Ymdjb2xvciIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3diZXR3ZWVubWFyZ2luIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd3ZtYXJnaW4iKTticmVhaztjYXNlInNsZHNfYXJyb3dsaW5lc2l6ZSI6YXx8KGE9IjEiKTt2YXIgTz1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X2JvZHkgcG9seWxpbmUsIC50LXNsZHNfX2Fycm93X2JvZHkgcGF0aCIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTywoZnVuY3Rpb24oZSl7ZS5zdHlsZS5zdHJva2VXaWR0aD1wYXJzZUludChhLDEwKSsicHgifSkpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3dib3JkZXIiKTticmVhaztjYXNlInNsZHNfYXJyb3djb2xvciI6YXx8KGE9IiMyMjIiKTt2YXIgST1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X2NvbnRhaW5lciBwb2x5bGluZSwgLnQtc2xkc19fYXJyb3dfY29udGFpbmVyIHBhdGgiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKEksKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuc3Ryb2tlPWF9KSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JvcmRlciIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3djb2xvcmhvdmVyIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JnY29sb3IiKTticmVhaztjYXNlInNsZHNfZG90c2JnY29sb3IiOmF8fChhPSIjZmZmIiksdz0tMSE9PWEuaW5kZXhPZigiLWdyYWRpZW50KCIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoeSwoZnVuY3Rpb24oZSl7dz9lLnN0eWxlLmJhY2tncm91bmRJbWFnZT1hOmUuc3R5bGUuYmFja2dyb3VuZENvbG9yPWF9KSk7YnJlYWs7Y2FzZSJzbGRzX2RvdHNiZ2NvbG9yYWN0aXZlIjp2YXIgTTtpZihhfHwoYT0iIzIyMiIpLHc9LTEhPT1hLmluZGV4T2YoIi1ncmFkaWVudCgiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYnVsbGV0X3dyYXBwZXIgc3R5bGUiKSksXyl7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3ZhciBqPSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0nLEI9KGorPSIgLnQtc2xkc19fYnVsbGV0X2FjdGl2ZSAudC1zbGRzX19idWxsZXRfYm9keSIpKyJ7IjtCKz13PyJiYWNrZ3JvdW5kLWltYWdlOiAiK2ErIiAhaW1wb3J0YW50OyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OyI6ImJhY2tncm91bmQtY29sb3I6ICIrYSsiICFpbXBvcnRhbnQ7IGJhY2tncm91bmQtaW1hZ2U6IG5vbmUgIWltcG9ydGFudDsiLEIrPSJ9IixmLnRleHRDb250ZW50PUIsXy5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsZil9YnJlYWs7Y2FzZSJzbGRzX2F1dG9wbGF5IjppZihhfHwoYT0iMCIpLG4mJihuLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIsKDFlMypwYXJzZUZsb2F0KGEpKS50b1N0cmluZygpKSx0X29uRnVuY0xvYWQoInRfc2xpZGVNb3ZlIiwoZnVuY3Rpb24oKXt0X3NsaWRlTW92ZShsPyQoZSk6ZSl9KSksMWUzKnBhcnNlRmxvYXQoYSkpKXt2YXIgSD1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtILmluaXRFdmVudCgic2xpZGVBdXRvcGxheVRpbWVyUmVhZHkiLCEwLCEwKSxuLmRpc3BhdGNoRXZlbnQoSCl9YnJlYWs7Y2FzZSJzbGRzX2Fycm93Ymdjb2xvciI6dmFyIFQ9dF96ZXJvR2FsbGVyeV9fZ2V0QXJyb3dTaXplKHU9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93c2l6ZSIpKSxQPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2Jnb3BhY2l0eSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7YT8odC5zdHlsZS53aWR0aD10Mzk2X196b29taWZ5VmFsdWUoZSxUKSx0LnN0eWxlLmhlaWdodD10Mzk2X196b29taWZ5VmFsdWUoZSxUKSx0LnN0eWxlLmJhY2tncm91bmRDb2xvcj1QPyJyZ2JhKCIrdDM5Nl9faGV4MnJnYmEoYSxQKSsiKSI6YSk6KHQuc3R5bGUud2lkdGg9dDM5Nl9fem9vbWlmeVZhbHVlKGUsVCksdC5zdHlsZS5oZWlnaHQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsVCksdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InRyYW5zcGFyZW50Iil9KSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JnY29sb3Job3ZlciIpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2Jnb3BhY2l0eSI6dF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JnY29sb3IiKTticmVhaztjYXNlInNsZHNfYXJyb3dhbGlnbiI6YXx8KGE9ImNlbnRlciIpLHMmJihzLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19fYXJyb3dfY29udGFpbmVyLWxlZnQiLCJ0LXNsZHNfX2Fycm93X2NvbnRhaW5lci1jZW50ZXIiLCJ0LXNsZHNfX2Fycm93X2NvbnRhaW5lci1yaWdodCIpLHMuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19hcnJvd19jb250YWluZXItIithKSk7YnJlYWs7Y2FzZSJzbGRzX2RvdHNzaXplIjphfHwoYT0iMTAiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHksKGZ1bmN0aW9uKHQpe3Quc3R5bGUud2lkdGg9dDM5Nl9fem9vbWlmeVZhbHVlKGUsYSksdC5zdHlsZS5oZWlnaHQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsYSl9KSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19kb3RzY29udHJvbHMiKTticmVhaztjYXNlInNsZHNfbG9vcCI6YXx8KGE9Imxvb3AiKSwibm9uZSI9PT1hJiYobiYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiLCJmYWxzZSIpLHMmJnMuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19ub2N5Y2xlIikpLCJsb29wIj09PWEmJihuJiZuLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIsInRydWUiKSxzJiZzLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19fbm9jeWNsZSIpKTticmVhaztjYXNlInNsZHNfc3BlZWQiOmF8fChhPSJub25lIiksIm5vbmUiPT09YSYmbiYmKG4uc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIiwiIiksbi5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtc2xvdyIpLG4uY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLWZhc3QiKSxuLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1ub25lIikpLCJzbG93Ij09PWEmJm4mJihuLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIsIjUwMCIpLG4uY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLWZhc3QiKSxuLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1ub25lIiksbi5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtc2xvdyIpKSwiZmFzdCI9PT1hJiZuJiYobi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRyYW5zaXRpb24iLCIzMDAiKSxuLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1zbG93Iiksbi5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpLG4uY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLWZhc3QiKSk7YnJlYWs7Y2FzZSJzbGRzX2Fycm93Y29sb3Job3ZlciI6dF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JvcmRlciIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dmFyIHI9dC5xdWVyeVNlbGVjdG9yQWxsKCJwb2x5bGluZSwgcGF0aCIpO3QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsKGZ1bmN0aW9uKCl7YXx8KGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29sb3Job3ZlciIpKSxhfHwoYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb2xvciIpKSxhfHwoYT0iIzIyMiIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24oZSl7ZS5zdHlsZS5zdHJva2U9YX0pKX0pKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLChmdW5jdGlvbigpe3ZhciB0PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbG9yIik7dHx8KHQ9IiMyMjIiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuc3Ryb2tlPXR9KSl9KSl9KSk7YnJlYWs7Y2FzZSJzbGRzX2Fycm93Ymdjb2xvcmhvdmVyIjpBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsKGZ1bmN0aW9uKCl7dmFyIHI9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93YmdvcGFjaXR5aG92ZXIiKTtyfHwocj0iMS4wIiksYXx8KGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Ymdjb2xvciIpKSxhfHwoYT0idHJhbnNwYXJlbnQiKTt2YXIgbz1hOyJ0cmFuc3BhcmVudCIhPT1hJiYobz0icmdiYSgiK3QzOTZfX2hleDJyZ2JhKGEscikrIikiKSx0LnN0eWxlLmJhY2tncm91bmRDb2xvcj1vfSkpLHQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsKGZ1bmN0aW9uKCl7dmFyIHI9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Ymdjb2xvciIpO2lmKHJ8fChyPSJ0cmFuc3BhcmVudCIpLCJ0cmFuc3BhcmVudCIhPT1yKXt2YXIgYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3diZ29wYWNpdHkiKTthfHwoYT0iMS4wIikscj0icmdiYSgiK3QzOTZfX2hleDJyZ2JhKHIsYSkrIikifXQuc3R5bGUuYmFja2dyb3VuZENvbG9yPXJ9KSl9KSk7YnJlYWs7Y2FzZSJzbGRzX2RvdHN2bWFyZ2luIjphfHwoYT0iMTYiKSxwPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3RzY29udHJvbHMiKSxfJiYoIm5lYXIiPT09cD8oXy5zdHlsZS5tYXJnaW5Cb3R0b209LWErInB4IixfLnN0eWxlLnBhZGRpbmdCb3R0b209IjAiKTooXy5zdHlsZS5tYXJnaW5Cb3R0b209IjAiLF8uc3R5bGUucGFkZGluZ0JvdHRvbT1hKyJweCIpKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2NhcHRpb250b3BtYXJnaW4iKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93dm1hcmdpbiIpO2JyZWFrO2Nhc2Uic2xkc19jYXB0aW9udG9wbWFyZ2luIjp2YXIgUT10Mzk2X2dldEVsKGw/JChlKTplKSxXPW51bGw9PVE/dm9pZCAwOlEucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fdGl0bGUiKTthJiZXfHwoYT0iMjAiKSxwPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3RzY29udHJvbHMiKSxtPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbnRyb2xzIik7dmFyIFo9MCxSO2lmKCJuZWFyIj09PXAmJigoZz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c3ZtYXJnaW4iKSl8fChnPSIxNiIpLCh2PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3Rzc2l6ZSIpKXx8KHY9IjEwIiksWj0yMCtwYXJzZUludCh2LDEwKStwYXJzZUludChnLDEwKSksInVuZGVyIj09PW0pe3ZhciBVPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd3NpemUiKSxLPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd3ZtYXJnaW4iKTtLfHwoSz0iMTAiKSxVfHwoVT0icyIpLFU9dF96ZXJvR2FsbGVyeV9fZ2V0QXJyb3dTaXplKFUpLFo9WitwYXJzZUludChVLDEwKStwYXJzZUludChLLDEwKX10X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX2NhcHRpb24tcG9zaXRpb24tc3R5bGVzIikpLG8mJigoZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19jYXB0aW9uLXBvc2l0aW9uLXN0eWxlcyIpLGYudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudC1zbGRzX19jYXB0aW9uIHttYXJnaW4tdG9wOiAnKyhaK3BhcnNlSW50KGEsMTApKSsicHg7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsZikpO2JyZWFrO2Nhc2Uic2xkc19jYXB0aW9ud2lkdGgiOnZhciBOO2F8fChhPSI4MCIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9fY2FwdGlvbi13aWR0aC1zdHlsZXMiKSksbyYmKChmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2NhcHRpb24td2lkdGgtc3R5bGVzIiksZi50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50LXNsZHNfX2NhcHRpb24ge3dpZHRoOiAnK3BhcnNlSW50KGEsMTApKyIlO30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLGYpKTticmVhaztjYXNlInNsZHNfYXJyb3dobWFyZ2luIjphfHwoYT0iMzAiKSxtPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbnRyb2xzIiksZCYmYyYmKCJuZWFyIj09PW0/KGQuc3R5bGUubGVmdD10Mzk2X196b29taWZ5VmFsdWUoZSxhKSxkLnN0eWxlLnJpZ2h0PSJhdXRvIixjLnN0eWxlLmxlZnQ9ImF1dG8iLGMuc3R5bGUucmlnaHQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsYSkpOihkLnN0eWxlLmxlZnQ9ImF1dG8iLGQuc3R5bGUucmlnaHQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsYSksYy5zdHlsZS5sZWZ0PXQzOTZfX3pvb21pZnlWYWx1ZShlLGEpLGMuc3R5bGUucmlnaHQ9ImF1dG8iKSk7YnJlYWs7Y2FzZSJzbGRzX2Fycm93dm1hcmdpbiI6YXx8KGE9IjEwIik7dmFyIEo9e307aWYoImFib3ZlIj09PShtPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbnRyb2xzIikpKUoudG9wPS1hKyJweCIsSi5ib3R0b209ImF1dG8iLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24oZSl7ZS5zdHlsZS5tYXJnaW5Ub3A9IjAifSkpO2Vsc2UgaWYoInVuZGVyIj09PW0pe3ZhciBYPTA7Im5lYXIiPT09KHA9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHNjb250cm9scyIpKSYmKGc9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHN2bWFyZ2luIiksdj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c3NpemUiKSxYPTIwK3BhcnNlSW50KHYsMTApK3BhcnNlSW50KGcsMTApKSxhPXBhcnNlSW50KGEsMTApK1gsSi5ib3R0b209LWErInB4IixKLnRvcD0iYXV0byIsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbihlKXtlLnN0eWxlLm1hcmdpblRvcD0iMCJ9KSl9ZWxzZSBKLnRvcD0iIixKLmJvdHRvbT0iIjtzJiYocy5zdHlsZS50b3A9Si50b3Ascy5zdHlsZS5ib3R0b209Si5ib3R0b20pLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfY2FwdGlvbnRvcG1hcmdpbiIpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2JldHdlZW5tYXJnaW4iOmF8fChhPSIxMCIpLCgiYWJvdmUiPT09KG09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29udHJvbHMiKSl8fCJ1bmRlciI9PT1tKSYmZCYmYyYmKGQuc3R5bGUubWFyZ2luTGVmdD1hLzIrInB4IixjLnN0eWxlLm1hcmdpblJpZ2h0PWEvMisicHgiLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3djb250cm9scyIpKX19ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlKXtlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19wbGF5VmlkZW8oZSl7dmFyIHQ9ZS5jdXJyZW50VGFyZ2V0O2lmKHQpe3ZhciByLGwsYT10X3plcm9HYWxsZXJ5X19nZW5lcmF0ZVZpZGVvKHQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci12aWRlby10eXBlIiksdC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXZpZGVvLXVybCIpKTthJiZ0LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoYSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF96ZXJvR2FsbGVyeV9fcGxheVZpZGVvKX19ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2VuZXJhdGVWaWRlbyhlLHQpe2lmKCFlfHwhdClyZXR1cm4gbnVsbDt2YXIgcj1bInlvdXR1YmUiLCJ2aW1lbyJdLmluY2x1ZGVzKGUpLGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19mcmFtZSIpO3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocj8iaWZyYW1lIjoidmlkZW8iKTtyZXR1cm4gYS5jbGFzc0xpc3QuYWRkKHI/InRuLWVsZW1fX2dhbGxlcnlfX2lmcmFtZSI6InRuLWVsZW1fX2dhbGxlcnlfX3ZpZGVvIiksYS5zcmM9dF96ZXJvR2FsbGVyeV9fZ2V0VVJMQnlWaWRlb1R5cGUodCxlKSxyPyhhLmFsbG93PSJhdXRvcGxheSIsYS5zZXRBdHRyaWJ1dGUoImFsbG93ZnVsbHNjcmVlbiIsIiIpKTooYS5zZXRBdHRyaWJ1dGUoImNvbnRyb2xzIiwiY29udHJvbHMiKSxhLnNldEF0dHJpYnV0ZSgiYXV0b3BsYXkiLCJhdXRvcGxheSIpKSxsLmFwcGVuZENoaWxkKGEpLGx9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2V0VVJMQnlWaWRlb1R5cGUoZSx0KXtyZXR1cm4idmltZW8iPT09dD8iaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLyIrZSsiP2g9JmFwaT0xJmF1dG9wbGF5PTEiOiJ5b3V0dWJlIj09PXQ/Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyIrZSsiP2F1dG9wbGF5PTEmZW5hYmxlanNhcGk9MSI6ZXx8IiJ9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9faXNMYXp5TG9hZGluZ09uRWxlbShlLHQpe3ZhciByPSJ5Ij09PXdpbmRvdy5sYXp5O2lmKCFyKXt2YXIgbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO3I9ISFsJiYieWVzIj09PWwuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKX1yZXR1cm4hIXImJiJ5IiE9PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0PyQoZSk6ZSwibGF6eW9mZiIpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dldFZpZGVvS2V5cygpe3JldHVyblsibGlfdmltZW8iLCJsaV95b3V0dWJlIiwibGlfbXA0IiwibGlfd2VibSJdfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2VzY2FwZUh0bWwoZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7IikucmVwbGFjZSgvJy9nLCImIzAzOTsiKX13aW5kb3cudGlsZGFfemVyb19nYWxsZXJ5X2pzX3Zlcj0xOwoKLyohIEhhbW1lci5KUyAtIHYyLjAuOCAtIDIwMTYtMDQtMjMKICogaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby8KICoKICogQ29weXJpZ2h0IChjKSAyMDE2IEpvcmlrIFRhbmdlbGRlcjsKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlICovCiFmdW5jdGlvbihhLGIsYyxkKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShhLGIsYyl7cmV0dXJuIHNldFRpbWVvdXQoaihhLGMpLGIpfWZ1bmN0aW9uIGYoYSxiLGMpe3JldHVybiBBcnJheS5pc0FycmF5KGEpPyhnKGEsY1tiXSxjKSwhMCk6ITF9ZnVuY3Rpb24gZyhhLGIsYyl7dmFyIGU7aWYoYSlpZihhLmZvckVhY2gpYS5mb3JFYWNoKGIsYyk7ZWxzZSBpZihhLmxlbmd0aCE9PWQpZm9yKGU9MDtlPGEubGVuZ3RoOyliLmNhbGwoYyxhW2VdLGUsYSksZSsrO2Vsc2UgZm9yKGUgaW4gYSlhLmhhc093blByb3BlcnR5KGUpJiZiLmNhbGwoYyxhW2VdLGUsYSl9ZnVuY3Rpb24gaChiLGMsZCl7dmFyIGU9IkRFUFJFQ0FURUQgTUVUSE9EOiAiK2MrIlxuIitkKyIgQVQgXG4iO3JldHVybiBmdW5jdGlvbigpe3ZhciBjPW5ldyBFcnJvcigiZ2V0LXN0YWNrLXRyYWNlIiksZD1jJiZjLnN0YWNrP2Muc3RhY2sucmVwbGFjZSgvXlteXChdKz9bXG4kXS9nbSwiIikucmVwbGFjZSgvXlxzK2F0XHMrL2dtLCIiKS5yZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XHMqXCgvZ20sInthbm9ueW1vdXN9KClAIik6IlVua25vd24gU3RhY2sgVHJhY2UiLGY9YS5jb25zb2xlJiYoYS5jb25zb2xlLndhcm58fGEuY29uc29sZS5sb2cpO3JldHVybiBmJiZmLmNhbGwoYS5jb25zb2xlLGUsZCksYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGkoYSxiLGMpe3ZhciBkLGU9Yi5wcm90b3R5cGU7ZD1hLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUpLGQuY29uc3RydWN0b3I9YSxkLl9zdXBlcj1lLGMmJmxhKGQsYyl9ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGIsYXJndW1lbnRzKX19ZnVuY3Rpb24gayhhLGIpe3JldHVybiB0eXBlb2YgYT09b2E/YS5hcHBseShiP2JbMF18fGQ6ZCxiKTphfWZ1bmN0aW9uIGwoYSxiKXtyZXR1cm4gYT09PWQ/YjphfWZ1bmN0aW9uIG0oYSxiLGMpe2cocShiKSxmdW5jdGlvbihiKXthLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0pfWZ1bmN0aW9uIG4oYSxiLGMpe2cocShiKSxmdW5jdGlvbihiKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX0pfWZ1bmN0aW9uIG8oYSxiKXtmb3IoO2E7KXtpZihhPT1iKXJldHVybiEwO2E9YS5wYXJlbnROb2RlfXJldHVybiExfWZ1bmN0aW9uIHAoYSxiKXtyZXR1cm4gYS5pbmRleE9mKGIpPi0xfWZ1bmN0aW9uIHEoYSl7cmV0dXJuIGEudHJpbSgpLnNwbGl0KC9ccysvZyl9ZnVuY3Rpb24gcihhLGIsYyl7aWYoYS5pbmRleE9mJiYhYylyZXR1cm4gYS5pbmRleE9mKGIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7KXtpZihjJiZhW2RdW2NdPT1ifHwhYyYmYVtkXT09PWIpcmV0dXJuIGQ7ZCsrfXJldHVybi0xfWZ1bmN0aW9uIHMoYSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCl9ZnVuY3Rpb24gdChhLGIsYyl7Zm9yKHZhciBkPVtdLGU9W10sZj0wO2Y8YS5sZW5ndGg7KXt2YXIgZz1iP2FbZl1bYl06YVtmXTtyKGUsZyk8MCYmZC5wdXNoKGFbZl0pLGVbZl09ZyxmKyt9cmV0dXJuIGMmJihkPWI/ZC5zb3J0KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFbYl0+Y1tiXX0pOmQuc29ydCgpKSxkfWZ1bmN0aW9uIHUoYSxiKXtmb3IodmFyIGMsZSxmPWJbMF0udG9VcHBlckNhc2UoKStiLnNsaWNlKDEpLGc9MDtnPG1hLmxlbmd0aDspe2lmKGM9bWFbZ10sZT1jP2MrZjpiLGUgaW4gYSlyZXR1cm4gZTtnKyt9cmV0dXJuIGR9ZnVuY3Rpb24gdigpe3JldHVybiB1YSsrfWZ1bmN0aW9uIHcoYil7dmFyIGM9Yi5vd25lckRvY3VtZW50fHxiO3JldHVybiBjLmRlZmF1bHRWaWV3fHxjLnBhcmVudFdpbmRvd3x8YX1mdW5jdGlvbiB4KGEsYil7dmFyIGM9dGhpczt0aGlzLm1hbmFnZXI9YSx0aGlzLmNhbGxiYWNrPWIsdGhpcy5lbGVtZW50PWEuZWxlbWVudCx0aGlzLnRhcmdldD1hLm9wdGlvbnMuaW5wdXRUYXJnZXQsdGhpcy5kb21IYW5kbGVyPWZ1bmN0aW9uKGIpe2soYS5vcHRpb25zLmVuYWJsZSxbYV0pJiZjLmhhbmRsZXIoYil9LHRoaXMuaW5pdCgpfWZ1bmN0aW9uIHkoYSl7dmFyIGIsYz1hLm9wdGlvbnMuaW5wdXRDbGFzcztyZXR1cm4gbmV3KGI9Yz9jOnhhP006eWE/UDp3YT9SOkwpKGEseil9ZnVuY3Rpb24geihhLGIsYyl7dmFyIGQ9Yy5wb2ludGVycy5sZW5ndGgsZT1jLmNoYW5nZWRQb2ludGVycy5sZW5ndGgsZj1iJkVhJiZkLWU9PT0wLGc9YiYoR2F8SGEpJiZkLWU9PT0wO2MuaXNGaXJzdD0hIWYsYy5pc0ZpbmFsPSEhZyxmJiYoYS5zZXNzaW9uPXt9KSxjLmV2ZW50VHlwZT1iLEEoYSxjKSxhLmVtaXQoImhhbW1lci5pbnB1dCIsYyksYS5yZWNvZ25pemUoYyksYS5zZXNzaW9uLnByZXZJbnB1dD1jfWZ1bmN0aW9uIEEoYSxiKXt2YXIgYz1hLnNlc3Npb24sZD1iLnBvaW50ZXJzLGU9ZC5sZW5ndGg7Yy5maXJzdElucHV0fHwoYy5maXJzdElucHV0PUQoYikpLGU+MSYmIWMuZmlyc3RNdWx0aXBsZT9jLmZpcnN0TXVsdGlwbGU9RChiKToxPT09ZSYmKGMuZmlyc3RNdWx0aXBsZT0hMSk7dmFyIGY9Yy5maXJzdElucHV0LGc9Yy5maXJzdE11bHRpcGxlLGg9Zz9nLmNlbnRlcjpmLmNlbnRlcixpPWIuY2VudGVyPUUoZCk7Yi50aW1lU3RhbXA9cmEoKSxiLmRlbHRhVGltZT1iLnRpbWVTdGFtcC1mLnRpbWVTdGFtcCxiLmFuZ2xlPUkoaCxpKSxiLmRpc3RhbmNlPUgoaCxpKSxCKGMsYiksYi5vZmZzZXREaXJlY3Rpb249RyhiLmRlbHRhWCxiLmRlbHRhWSk7dmFyIGo9RihiLmRlbHRhVGltZSxiLmRlbHRhWCxiLmRlbHRhWSk7Yi5vdmVyYWxsVmVsb2NpdHlYPWoueCxiLm92ZXJhbGxWZWxvY2l0eVk9ai55LGIub3ZlcmFsbFZlbG9jaXR5PXFhKGoueCk+cWEoai55KT9qLng6ai55LGIuc2NhbGU9Zz9LKGcucG9pbnRlcnMsZCk6MSxiLnJvdGF0aW9uPWc/SihnLnBvaW50ZXJzLGQpOjAsYi5tYXhQb2ludGVycz1jLnByZXZJbnB1dD9iLnBvaW50ZXJzLmxlbmd0aD5jLnByZXZJbnB1dC5tYXhQb2ludGVycz9iLnBvaW50ZXJzLmxlbmd0aDpjLnByZXZJbnB1dC5tYXhQb2ludGVyczpiLnBvaW50ZXJzLmxlbmd0aCxDKGMsYik7dmFyIGs9YS5lbGVtZW50O28oYi5zcmNFdmVudC50YXJnZXQsaykmJihrPWIuc3JjRXZlbnQudGFyZ2V0KSxiLnRhcmdldD1rfWZ1bmN0aW9uIEIoYSxiKXt2YXIgYz1iLmNlbnRlcixkPWEub2Zmc2V0RGVsdGF8fHt9LGU9YS5wcmV2RGVsdGF8fHt9LGY9YS5wcmV2SW5wdXR8fHt9O2IuZXZlbnRUeXBlIT09RWEmJmYuZXZlbnRUeXBlIT09R2F8fChlPWEucHJldkRlbHRhPXt4OmYuZGVsdGFYfHwwLHk6Zi5kZWx0YVl8fDB9LGQ9YS5vZmZzZXREZWx0YT17eDpjLngseTpjLnl9KSxiLmRlbHRhWD1lLngrKGMueC1kLngpLGIuZGVsdGFZPWUueSsoYy55LWQueSl9ZnVuY3Rpb24gQyhhLGIpe3ZhciBjLGUsZixnLGg9YS5sYXN0SW50ZXJ2YWx8fGIsaT1iLnRpbWVTdGFtcC1oLnRpbWVTdGFtcDtpZihiLmV2ZW50VHlwZSE9SGEmJihpPkRhfHxoLnZlbG9jaXR5PT09ZCkpe3ZhciBqPWIuZGVsdGFYLWguZGVsdGFYLGs9Yi5kZWx0YVktaC5kZWx0YVksbD1GKGksaixrKTtlPWwueCxmPWwueSxjPXFhKGwueCk+cWEobC55KT9sLng6bC55LGc9RyhqLGspLGEubGFzdEludGVydmFsPWJ9ZWxzZSBjPWgudmVsb2NpdHksZT1oLnZlbG9jaXR5WCxmPWgudmVsb2NpdHlZLGc9aC5kaXJlY3Rpb247Yi52ZWxvY2l0eT1jLGIudmVsb2NpdHlYPWUsYi52ZWxvY2l0eVk9ZixiLmRpcmVjdGlvbj1nfWZ1bmN0aW9uIEQoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEucG9pbnRlcnMubGVuZ3RoOyliW2NdPXtjbGllbnRYOnBhKGEucG9pbnRlcnNbY10uY2xpZW50WCksY2xpZW50WTpwYShhLnBvaW50ZXJzW2NdLmNsaWVudFkpfSxjKys7cmV0dXJue3RpbWVTdGFtcDpyYSgpLHBvaW50ZXJzOmIsY2VudGVyOkUoYiksZGVsdGFYOmEuZGVsdGFYLGRlbHRhWTphLmRlbHRhWX19ZnVuY3Rpb24gRShhKXt2YXIgYj1hLmxlbmd0aDtpZigxPT09YilyZXR1cm57eDpwYShhWzBdLmNsaWVudFgpLHk6cGEoYVswXS5jbGllbnRZKX07Zm9yKHZhciBjPTAsZD0wLGU9MDtiPmU7KWMrPWFbZV0uY2xpZW50WCxkKz1hW2VdLmNsaWVudFksZSsrO3JldHVybnt4OnBhKGMvYikseTpwYShkL2IpfX1mdW5jdGlvbiBGKGEsYixjKXtyZXR1cm57eDpiL2F8fDAseTpjL2F8fDB9fWZ1bmN0aW9uIEcoYSxiKXtyZXR1cm4gYT09PWI/SWE6cWEoYSk+PXFhKGIpPzA+YT9KYTpLYTowPmI/TGE6TWF9ZnVuY3Rpb24gSChhLGIsYyl7Y3x8KGM9UWEpO3ZhciBkPWJbY1swXV0tYVtjWzBdXSxlPWJbY1sxXV0tYVtjWzFdXTtyZXR1cm4gTWF0aC5zcXJ0KGQqZCtlKmUpfWZ1bmN0aW9uIEkoYSxiLGMpe2N8fChjPVFhKTt2YXIgZD1iW2NbMF1dLWFbY1swXV0sZT1iW2NbMV1dLWFbY1sxXV07cmV0dXJuIDE4MCpNYXRoLmF0YW4yKGUsZCkvTWF0aC5QSX1mdW5jdGlvbiBKKGEsYil7cmV0dXJuIEkoYlsxXSxiWzBdLFJhKStJKGFbMV0sYVswXSxSYSl9ZnVuY3Rpb24gSyhhLGIpe3JldHVybiBIKGJbMF0sYlsxXSxSYSkvSChhWzBdLGFbMV0sUmEpfWZ1bmN0aW9uIEwoKXt0aGlzLmV2RWw9VGEsdGhpcy5ldldpbj1VYSx0aGlzLnByZXNzZWQ9ITEseC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gTSgpe3RoaXMuZXZFbD1YYSx0aGlzLmV2V2luPVlhLHguYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuc3RvcmU9dGhpcy5tYW5hZ2VyLnNlc3Npb24ucG9pbnRlckV2ZW50cz1bXX1mdW5jdGlvbiBOKCl7dGhpcy5ldlRhcmdldD0kYSx0aGlzLmV2V2luPV9hLHRoaXMuc3RhcnRlZD0hMSx4LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBPKGEsYil7dmFyIGM9cyhhLnRvdWNoZXMpLGQ9cyhhLmNoYW5nZWRUb3VjaGVzKTtyZXR1cm4gYiYoR2F8SGEpJiYoYz10KGMuY29uY2F0KGQpLCJpZGVudGlmaWVyIiwhMCkpLFtjLGRdfWZ1bmN0aW9uIFAoKXt0aGlzLmV2VGFyZ2V0PWJiLHRoaXMudGFyZ2V0SWRzPXt9LHguYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIFEoYSxiKXt2YXIgYz1zKGEudG91Y2hlcyksZD10aGlzLnRhcmdldElkcztpZihiJihFYXxGYSkmJjE9PT1jLmxlbmd0aClyZXR1cm4gZFtjWzBdLmlkZW50aWZpZXJdPSEwLFtjLGNdO3ZhciBlLGYsZz1zKGEuY2hhbmdlZFRvdWNoZXMpLGg9W10saT10aGlzLnRhcmdldDtpZihmPWMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBvKGEudGFyZ2V0LGkpfSksYj09PUVhKWZvcihlPTA7ZTxmLmxlbmd0aDspZFtmW2VdLmlkZW50aWZpZXJdPSEwLGUrKztmb3IoZT0wO2U8Zy5sZW5ndGg7KWRbZ1tlXS5pZGVudGlmaWVyXSYmaC5wdXNoKGdbZV0pLGImKEdhfEhhKSYmZGVsZXRlIGRbZ1tlXS5pZGVudGlmaWVyXSxlKys7cmV0dXJuIGgubGVuZ3RoP1t0KGYuY29uY2F0KGgpLCJpZGVudGlmaWVyIiwhMCksaF06dm9pZCAwfWZ1bmN0aW9uIFIoKXt4LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYT1qKHRoaXMuaGFuZGxlcix0aGlzKTt0aGlzLnRvdWNoPW5ldyBQKHRoaXMubWFuYWdlcixhKSx0aGlzLm1vdXNlPW5ldyBMKHRoaXMubWFuYWdlcixhKSx0aGlzLnByaW1hcnlUb3VjaD1udWxsLHRoaXMubGFzdFRvdWNoZXM9W119ZnVuY3Rpb24gUyhhLGIpe2EmRWE/KHRoaXMucHJpbWFyeVRvdWNoPWIuY2hhbmdlZFBvaW50ZXJzWzBdLmlkZW50aWZpZXIsVC5jYWxsKHRoaXMsYikpOmEmKEdhfEhhKSYmVC5jYWxsKHRoaXMsYil9ZnVuY3Rpb24gVChhKXt2YXIgYj1hLmNoYW5nZWRQb2ludGVyc1swXTtpZihiLmlkZW50aWZpZXI9PT10aGlzLnByaW1hcnlUb3VjaCl7dmFyIGM9e3g6Yi5jbGllbnRYLHk6Yi5jbGllbnRZfTt0aGlzLmxhc3RUb3VjaGVzLnB1c2goYyk7dmFyIGQ9dGhpcy5sYXN0VG91Y2hlcyxlPWZ1bmN0aW9uKCl7dmFyIGE9ZC5pbmRleE9mKGMpO2E+LTEmJmQuc3BsaWNlKGEsMSl9O3NldFRpbWVvdXQoZSxjYil9fWZ1bmN0aW9uIFUoYSl7Zm9yKHZhciBiPWEuc3JjRXZlbnQuY2xpZW50WCxjPWEuc3JjRXZlbnQuY2xpZW50WSxkPTA7ZDx0aGlzLmxhc3RUb3VjaGVzLmxlbmd0aDtkKyspe3ZhciBlPXRoaXMubGFzdFRvdWNoZXNbZF0sZj1NYXRoLmFicyhiLWUueCksZz1NYXRoLmFicyhjLWUueSk7aWYoZGI+PWYmJmRiPj1nKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFYoYSxiKXt0aGlzLm1hbmFnZXI9YSx0aGlzLnNldChiKX1mdW5jdGlvbiBXKGEpe2lmKHAoYSxqYikpcmV0dXJuIGpiO3ZhciBiPXAoYSxrYiksYz1wKGEsbGIpO3JldHVybiBiJiZjP2piOmJ8fGM/Yj9rYjpsYjpwKGEsaWIpP2liOmhifWZ1bmN0aW9uIFgoKXtpZighZmIpcmV0dXJuITE7dmFyIGI9e30sYz1hLkNTUyYmYS5DU1Muc3VwcG9ydHM7cmV0dXJuWyJhdXRvIiwibWFuaXB1bGF0aW9uIiwicGFuLXkiLCJwYW4teCIsInBhbi14IHBhbi15Iiwibm9uZSJdLmZvckVhY2goZnVuY3Rpb24oZCl7YltkXT1jP2EuQ1NTLnN1cHBvcnRzKCJ0b3VjaC1hY3Rpb24iLGQpOiEwfSksYn1mdW5jdGlvbiBZKGEpe3RoaXMub3B0aW9ucz1sYSh7fSx0aGlzLmRlZmF1bHRzLGF8fHt9KSx0aGlzLmlkPXYoKSx0aGlzLm1hbmFnZXI9bnVsbCx0aGlzLm9wdGlvbnMuZW5hYmxlPWwodGhpcy5vcHRpb25zLmVuYWJsZSwhMCksdGhpcy5zdGF0ZT1uYix0aGlzLnNpbXVsdGFuZW91cz17fSx0aGlzLnJlcXVpcmVGYWlsPVtdfWZ1bmN0aW9uIFooYSl7cmV0dXJuIGEmc2I/ImNhbmNlbCI6YSZxYj8iZW5kIjphJnBiPyJtb3ZlIjphJm9iPyJzdGFydCI6IiJ9ZnVuY3Rpb24gJChhKXtyZXR1cm4gYT09TWE/ImRvd24iOmE9PUxhPyJ1cCI6YT09SmE/ImxlZnQiOmE9PUthPyJyaWdodCI6IiJ9ZnVuY3Rpb24gXyhhLGIpe3ZhciBjPWIubWFuYWdlcjtyZXR1cm4gYz9jLmdldChhKTphfWZ1bmN0aW9uIGFhKCl7WS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gYmEoKXthYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wWD1udWxsLHRoaXMucFk9bnVsbH1mdW5jdGlvbiBjYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBkYSgpe1kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3RpbWVyPW51bGwsdGhpcy5faW5wdXQ9bnVsbH1mdW5jdGlvbiBlYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBmYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBnYSgpe1kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucFRpbWU9ITEsdGhpcy5wQ2VudGVyPSExLHRoaXMuX3RpbWVyPW51bGwsdGhpcy5faW5wdXQ9bnVsbCx0aGlzLmNvdW50PTB9ZnVuY3Rpb24gaGEoYSxiKXtyZXR1cm4gYj1ifHx7fSxiLnJlY29nbml6ZXJzPWwoYi5yZWNvZ25pemVycyxoYS5kZWZhdWx0cy5wcmVzZXQpLG5ldyBpYShhLGIpfWZ1bmN0aW9uIGlhKGEsYil7dGhpcy5vcHRpb25zPWxhKHt9LGhhLmRlZmF1bHRzLGJ8fHt9KSx0aGlzLm9wdGlvbnMuaW5wdXRUYXJnZXQ9dGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0fHxhLHRoaXMuaGFuZGxlcnM9e30sdGhpcy5zZXNzaW9uPXt9LHRoaXMucmVjb2duaXplcnM9W10sdGhpcy5vbGRDc3NQcm9wcz17fSx0aGlzLmVsZW1lbnQ9YSx0aGlzLmlucHV0PXkodGhpcyksdGhpcy50b3VjaEFjdGlvbj1uZXcgVih0aGlzLHRoaXMub3B0aW9ucy50b3VjaEFjdGlvbiksamEodGhpcywhMCksZyh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hZGQobmV3IGFbMF0oYVsxXSkpO2FbMl0mJmIucmVjb2duaXplV2l0aChhWzJdKSxhWzNdJiZiLnJlcXVpcmVGYWlsdXJlKGFbM10pfSx0aGlzKX1mdW5jdGlvbiBqYShhLGIpe3ZhciBjPWEuZWxlbWVudDtpZihjLnN0eWxlKXt2YXIgZDtnKGEub3B0aW9ucy5jc3NQcm9wcyxmdW5jdGlvbihlLGYpe2Q9dShjLnN0eWxlLGYpLGI/KGEub2xkQ3NzUHJvcHNbZF09Yy5zdHlsZVtkXSxjLnN0eWxlW2RdPWUpOmMuc3R5bGVbZF09YS5vbGRDc3NQcm9wc1tkXXx8IiJ9KSxifHwoYS5vbGRDc3NQcm9wcz17fSl9fWZ1bmN0aW9uIGthKGEsYyl7dmFyIGQ9Yi5jcmVhdGVFdmVudCgiRXZlbnQiKTtkLmluaXRFdmVudChhLCEwLCEwKSxkLmdlc3R1cmU9YyxjLnRhcmdldC5kaXNwYXRjaEV2ZW50KGQpfXZhciBsYSxtYT1bIiIsIndlYmtpdCIsIk1veiIsIk1TIiwibXMiLCJvIl0sbmE9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxvYT0iZnVuY3Rpb24iLHBhPU1hdGgucm91bmQscWE9TWF0aC5hYnMscmE9RGF0ZS5ub3c7bGE9ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24/ZnVuY3Rpb24oYSl7aWYoYT09PWR8fG51bGw9PT1hKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpO2Zvcih2YXIgYj1PYmplY3QoYSksYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspe3ZhciBlPWFyZ3VtZW50c1tjXTtpZihlIT09ZCYmbnVsbCE9PWUpZm9yKHZhciBmIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShmKSYmKGJbZl09ZVtmXSl9cmV0dXJuIGJ9Ok9iamVjdC5hc3NpZ247dmFyIHNhPWgoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyhiKSxmPTA7ZjxlLmxlbmd0aDspKCFjfHxjJiZhW2VbZl1dPT09ZCkmJihhW2VbZl1dPWJbZVtmXV0pLGYrKztyZXR1cm4gYX0sImV4dGVuZCIsIlVzZSBgYXNzaWduYC4iKSx0YT1oKGZ1bmN0aW9uKGEsYil7cmV0dXJuIHNhKGEsYiwhMCl9LCJtZXJnZSIsIlVzZSBgYXNzaWduYC4iKSx1YT0xLHZhPS9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaSx3YT0ib250b3VjaHN0YXJ0ImluIGEseGE9dShhLCJQb2ludGVyRXZlbnQiKSE9PWQseWE9d2EmJnZhLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksemE9InRvdWNoIixBYT0icGVuIixCYT0ibW91c2UiLENhPSJraW5lY3QiLERhPTI1LEVhPTEsRmE9MixHYT00LEhhPTgsSWE9MSxKYT0yLEthPTQsTGE9OCxNYT0xNixOYT1KYXxLYSxPYT1MYXxNYSxQYT1OYXxPYSxRYT1bIngiLCJ5Il0sUmE9WyJjbGllbnRYIiwiY2xpZW50WSJdO3gucHJvdG90eXBlPXtoYW5kbGVyOmZ1bmN0aW9uKCl7fSxpbml0OmZ1bmN0aW9uKCl7dGhpcy5ldkVsJiZtKHRoaXMuZWxlbWVudCx0aGlzLmV2RWwsdGhpcy5kb21IYW5kbGVyKSx0aGlzLmV2VGFyZ2V0JiZtKHRoaXMudGFyZ2V0LHRoaXMuZXZUYXJnZXQsdGhpcy5kb21IYW5kbGVyKSx0aGlzLmV2V2luJiZtKHcodGhpcy5lbGVtZW50KSx0aGlzLmV2V2luLHRoaXMuZG9tSGFuZGxlcil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJm4odGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJm4odGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJm4odyh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX19O3ZhciBTYT17bW91c2Vkb3duOkVhLG1vdXNlbW92ZTpGYSxtb3VzZXVwOkdhfSxUYT0ibW91c2Vkb3duIixVYT0ibW91c2Vtb3ZlIG1vdXNldXAiO2koTCx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPVNhW2EudHlwZV07YiZFYSYmMD09PWEuYnV0dG9uJiYodGhpcy5wcmVzc2VkPSEwKSxiJkZhJiYxIT09YS53aGljaCYmKGI9R2EpLHRoaXMucHJlc3NlZCYmKGImR2EmJih0aGlzLnByZXNzZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOlthXSxjaGFuZ2VkUG9pbnRlcnM6W2FdLHBvaW50ZXJUeXBlOkJhLHNyY0V2ZW50OmF9KSl9fSk7dmFyIFZhPXtwb2ludGVyZG93bjpFYSxwb2ludGVybW92ZTpGYSxwb2ludGVydXA6R2EscG9pbnRlcmNhbmNlbDpIYSxwb2ludGVyb3V0OkhhfSxXYT17Mjp6YSwzOkFhLDQ6QmEsNTpDYX0sWGE9InBvaW50ZXJkb3duIixZYT0icG9pbnRlcm1vdmUgcG9pbnRlcnVwIHBvaW50ZXJjYW5jZWwiO2EuTVNQb2ludGVyRXZlbnQmJiFhLlBvaW50ZXJFdmVudCYmKFhhPSJNU1BvaW50ZXJEb3duIixZYT0iTVNQb2ludGVyTW92ZSBNU1BvaW50ZXJVcCBNU1BvaW50ZXJDYW5jZWwiKSxpKE0seCx7aGFuZGxlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnN0b3JlLGM9ITEsZD1hLnR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCJtcyIsIiIpLGU9VmFbZF0sZj1XYVthLnBvaW50ZXJUeXBlXXx8YS5wb2ludGVyVHlwZSxnPWY9PXphLGg9cihiLGEucG9pbnRlcklkLCJwb2ludGVySWQiKTtlJkVhJiYoMD09PWEuYnV0dG9ufHxnKT8wPmgmJihiLnB1c2goYSksaD1iLmxlbmd0aC0xKTplJihHYXxIYSkmJihjPSEwKSwwPmh8fChiW2hdPWEsdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsZSx7cG9pbnRlcnM6YixjaGFuZ2VkUG9pbnRlcnM6W2FdLHBvaW50ZXJUeXBlOmYsc3JjRXZlbnQ6YX0pLGMmJmIuc3BsaWNlKGgsMSkpfX0pO3ZhciBaYT17dG91Y2hzdGFydDpFYSx0b3VjaG1vdmU6RmEsdG91Y2hlbmQ6R2EsdG91Y2hjYW5jZWw6SGF9LCRhPSJ0b3VjaHN0YXJ0IixfYT0idG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwiO2koTix4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPVphW2EudHlwZV07aWYoYj09PUVhJiYodGhpcy5zdGFydGVkPSEwKSx0aGlzLnN0YXJ0ZWQpe3ZhciBjPU8uY2FsbCh0aGlzLGEsYik7YiYoR2F8SGEpJiZjWzBdLmxlbmd0aC1jWzFdLmxlbmd0aD09PTAmJih0aGlzLnN0YXJ0ZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOmNbMF0sY2hhbmdlZFBvaW50ZXJzOmNbMV0scG9pbnRlclR5cGU6emEsc3JjRXZlbnQ6YX0pfX19KTt2YXIgYWI9e3RvdWNoc3RhcnQ6RWEsdG91Y2htb3ZlOkZhLHRvdWNoZW5kOkdhLHRvdWNoY2FuY2VsOkhhfSxiYj0idG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwiO2koUCx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPWFiW2EudHlwZV0sYz1RLmNhbGwodGhpcyxhLGIpO2MmJnRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOmNbMF0sY2hhbmdlZFBvaW50ZXJzOmNbMV0scG9pbnRlclR5cGU6emEsc3JjRXZlbnQ6YX0pfX0pO3ZhciBjYj0yNTAwLGRiPTI1O2koUix4LHtoYW5kbGVyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1jLnBvaW50ZXJUeXBlPT16YSxlPWMucG9pbnRlclR5cGU9PUJhO2lmKCEoZSYmYy5zb3VyY2VDYXBhYmlsaXRpZXMmJmMuc291cmNlQ2FwYWJpbGl0aWVzLmZpcmVzVG91Y2hFdmVudHMpKXtpZihkKVMuY2FsbCh0aGlzLGIsYyk7ZWxzZSBpZihlJiZVLmNhbGwodGhpcyxjKSlyZXR1cm47dGhpcy5jYWxsYmFjayhhLGIsYyl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy50b3VjaC5kZXN0cm95KCksdGhpcy5tb3VzZS5kZXN0cm95KCl9fSk7dmFyIGViPXUobmEuc3R5bGUsInRvdWNoQWN0aW9uIiksZmI9ZWIhPT1kLGdiPSJjb21wdXRlIixoYj0iYXV0byIsaWI9Im1hbmlwdWxhdGlvbiIsamI9Im5vbmUiLGtiPSJwYW4teCIsbGI9InBhbi15IixtYj1YKCk7Vi5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihhKXthPT1nYiYmKGE9dGhpcy5jb21wdXRlKCkpLGZiJiZ0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZSYmbWJbYV0mJih0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZVtlYl09YSksdGhpcy5hY3Rpb25zPWEudG9Mb3dlckNhc2UoKS50cmltKCl9LHVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuc2V0KHRoaXMubWFuYWdlci5vcHRpb25zLnRvdWNoQWN0aW9uKX0sY29tcHV0ZTpmdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiBnKHRoaXMubWFuYWdlci5yZWNvZ25pemVycyxmdW5jdGlvbihiKXtrKGIub3B0aW9ucy5lbmFibGUsW2JdKSYmKGE9YS5jb25jYXQoYi5nZXRUb3VjaEFjdGlvbigpKSl9KSxXKGEuam9pbigiICIpKX0scHJldmVudERlZmF1bHRzOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc3JjRXZlbnQsYz1hLm9mZnNldERpcmVjdGlvbjtpZih0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQpcmV0dXJuIHZvaWQgYi5wcmV2ZW50RGVmYXVsdCgpO3ZhciBkPXRoaXMuYWN0aW9ucyxlPXAoZCxqYikmJiFtYltqYl0sZj1wKGQsbGIpJiYhbWJbbGJdLGc9cChkLGtiKSYmIW1iW2tiXTtpZihlKXt2YXIgaD0xPT09YS5wb2ludGVycy5sZW5ndGgsaT1hLmRpc3RhbmNlPDIsaj1hLmRlbHRhVGltZTwyNTA7aWYoaCYmaSYmailyZXR1cm59cmV0dXJuIGcmJmY/dm9pZCAwOmV8fGYmJmMmTmF8fGcmJmMmT2E/dGhpcy5wcmV2ZW50U3JjKGIpOnZvaWQgMH0scHJldmVudFNyYzpmdW5jdGlvbihhKXt0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQ9ITAsYS5wcmV2ZW50RGVmYXVsdCgpfX07dmFyIG5iPTEsb2I9MixwYj00LHFiPTgscmI9cWIsc2I9MTYsdGI9MzI7WS5wcm90b3R5cGU9e2RlZmF1bHRzOnt9LHNldDpmdW5jdGlvbihhKXtyZXR1cm4gbGEodGhpcy5vcHRpb25zLGEpLHRoaXMubWFuYWdlciYmdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpLHRoaXN9LHJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7aWYoZihhLCJyZWNvZ25pemVXaXRoIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLnNpbXVsdGFuZW91cztyZXR1cm4gYT1fKGEsdGhpcyksYlthLmlkXXx8KGJbYS5pZF09YSxhLnJlY29nbml6ZVdpdGgodGhpcykpLHRoaXN9LGRyb3BSZWNvZ25pemVXaXRoOmZ1bmN0aW9uKGEpe3JldHVybiBmKGEsImRyb3BSZWNvZ25pemVXaXRoIix0aGlzKT90aGlzOihhPV8oYSx0aGlzKSxkZWxldGUgdGhpcy5zaW11bHRhbmVvdXNbYS5pZF0sdGhpcyl9LHJlcXVpcmVGYWlsdXJlOmZ1bmN0aW9uKGEpe2lmKGYoYSwicmVxdWlyZUZhaWx1cmUiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBiPXRoaXMucmVxdWlyZUZhaWw7cmV0dXJuIGE9XyhhLHRoaXMpLC0xPT09cihiLGEpJiYoYi5wdXNoKGEpLGEucmVxdWlyZUZhaWx1cmUodGhpcykpLHRoaXN9LGRyb3BSZXF1aXJlRmFpbHVyZTpmdW5jdGlvbihhKXtpZihmKGEsImRyb3BSZXF1aXJlRmFpbHVyZSIsdGhpcykpcmV0dXJuIHRoaXM7YT1fKGEsdGhpcyk7dmFyIGI9cih0aGlzLnJlcXVpcmVGYWlsLGEpO3JldHVybiBiPi0xJiZ0aGlzLnJlcXVpcmVGYWlsLnNwbGljZShiLDEpLHRoaXN9LGhhc1JlcXVpcmVGYWlsdXJlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aD4wfSxjYW5SZWNvZ25pemVXaXRoOmZ1bmN0aW9uKGEpe3JldHVybiEhdGhpcy5zaW11bHRhbmVvdXNbYS5pZF19LGVtaXQ6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtjLm1hbmFnZXIuZW1pdChiLGEpfXZhciBjPXRoaXMsZD10aGlzLnN0YXRlO3FiPmQmJmIoYy5vcHRpb25zLmV2ZW50K1ooZCkpLGIoYy5vcHRpb25zLmV2ZW50KSxhLmFkZGl0aW9uYWxFdmVudCYmYihhLmFkZGl0aW9uYWxFdmVudCksZD49cWImJmIoYy5vcHRpb25zLmV2ZW50K1ooZCkpfSx0cnlFbWl0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNhbkVtaXQoKT90aGlzLmVtaXQoYSk6dm9pZCh0aGlzLnN0YXRlPXRiKX0sY2FuRW1pdDpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg7KXtpZighKHRoaXMucmVxdWlyZUZhaWxbYV0uc3RhdGUmKHRifG5iKSkpcmV0dXJuITE7YSsrfXJldHVybiEwfSxyZWNvZ25pemU6ZnVuY3Rpb24oYSl7dmFyIGI9bGEoe30sYSk7cmV0dXJuIGsodGhpcy5vcHRpb25zLmVuYWJsZSxbdGhpcyxiXSk/KHRoaXMuc3RhdGUmKHJifHNifHRiKSYmKHRoaXMuc3RhdGU9bmIpLHRoaXMuc3RhdGU9dGhpcy5wcm9jZXNzKGIpLHZvaWQodGhpcy5zdGF0ZSYob2J8cGJ8cWJ8c2IpJiZ0aGlzLnRyeUVtaXQoYikpKToodGhpcy5yZXNldCgpLHZvaWQodGhpcy5zdGF0ZT10YikpfSxwcm9jZXNzOmZ1bmN0aW9uKGEpe30sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt9LHJlc2V0OmZ1bmN0aW9uKCl7fX0saShhYSxZLHtkZWZhdWx0czp7cG9pbnRlcnM6MX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLnBvaW50ZXJzO3JldHVybiAwPT09Ynx8YS5wb2ludGVycy5sZW5ndGg9PT1ifSxwcm9jZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc3RhdGUsYz1hLmV2ZW50VHlwZSxkPWImKG9ifHBiKSxlPXRoaXMuYXR0clRlc3QoYSk7cmV0dXJuIGQmJihjJkhhfHwhZSk/YnxzYjpkfHxlP2MmR2E/YnxxYjpiJm9iP2J8cGI6b2I6dGJ9fSksaShiYSxhYSx7ZGVmYXVsdHM6e2V2ZW50OiJwYW4iLHRocmVzaG9sZDoxMCxwb2ludGVyczoxLGRpcmVjdGlvbjpQYX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uLGI9W107cmV0dXJuIGEmTmEmJmIucHVzaChsYiksYSZPYSYmYi5wdXNoKGtiKSxifSxkaXJlY3Rpb25UZXN0OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucyxjPSEwLGQ9YS5kaXN0YW5jZSxlPWEuZGlyZWN0aW9uLGY9YS5kZWx0YVgsZz1hLmRlbHRhWTtyZXR1cm4gZSZiLmRpcmVjdGlvbnx8KGIuZGlyZWN0aW9uJk5hPyhlPTA9PT1mP0lhOjA+Zj9KYTpLYSxjPWYhPXRoaXMucFgsZD1NYXRoLmFicyhhLmRlbHRhWCkpOihlPTA9PT1nP0lhOjA+Zz9MYTpNYSxjPWchPXRoaXMucFksZD1NYXRoLmFicyhhLmRlbHRhWSkpKSxhLmRpcmVjdGlvbj1lLGMmJmQ+Yi50aHJlc2hvbGQmJmUmYi5kaXJlY3Rpb259LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3JldHVybiBhYS5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLGEpJiYodGhpcy5zdGF0ZSZvYnx8ISh0aGlzLnN0YXRlJm9iKSYmdGhpcy5kaXJlY3Rpb25UZXN0KGEpKX0sZW1pdDpmdW5jdGlvbihhKXt0aGlzLnBYPWEuZGVsdGFYLHRoaXMucFk9YS5kZWx0YVk7dmFyIGI9JChhLmRpcmVjdGlvbik7YiYmKGEuYWRkaXRpb25hbEV2ZW50PXRoaXMub3B0aW9ucy5ldmVudCtiKSx0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcyxhKX19KSxpKGNhLGFhLHtkZWZhdWx0czp7ZXZlbnQ6InBpbmNoIix0aHJlc2hvbGQ6MCxwb2ludGVyczoyfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltqYl19LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJihNYXRoLmFicyhhLnNjYWxlLTEpPnRoaXMub3B0aW9ucy50aHJlc2hvbGR8fHRoaXMuc3RhdGUmb2IpfSxlbWl0OmZ1bmN0aW9uKGEpe2lmKDEhPT1hLnNjYWxlKXt2YXIgYj1hLnNjYWxlPDE/ImluIjoib3V0IjthLmFkZGl0aW9uYWxFdmVudD10aGlzLm9wdGlvbnMuZXZlbnQrYn10aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcyxhKX19KSxpKGRhLFkse2RlZmF1bHRzOntldmVudDoicHJlc3MiLHBvaW50ZXJzOjEsdGltZToyNTEsdGhyZXNob2xkOjl9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2hiXX0scHJvY2VzczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYz1hLnBvaW50ZXJzLmxlbmd0aD09PWIucG9pbnRlcnMsZD1hLmRpc3RhbmNlPGIudGhyZXNob2xkLGY9YS5kZWx0YVRpbWU+Yi50aW1lO2lmKHRoaXMuX2lucHV0PWEsIWR8fCFjfHxhLmV2ZW50VHlwZSYoR2F8SGEpJiYhZil0aGlzLnJlc2V0KCk7ZWxzZSBpZihhLmV2ZW50VHlwZSZFYSl0aGlzLnJlc2V0KCksdGhpcy5fdGltZXI9ZShmdW5jdGlvbigpe3RoaXMuc3RhdGU9cmIsdGhpcy50cnlFbWl0KCl9LGIudGltZSx0aGlzKTtlbHNlIGlmKGEuZXZlbnRUeXBlJkdhKXJldHVybiByYjtyZXR1cm4gdGJ9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbihhKXt0aGlzLnN0YXRlPT09cmImJihhJiZhLmV2ZW50VHlwZSZHYT90aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQrInVwIixhKToodGhpcy5faW5wdXQudGltZVN0YW1wPXJhKCksdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHRoaXMuX2lucHV0KSkpfX0pLGkoZWEsYWEse2RlZmF1bHRzOntldmVudDoicm90YXRlIix0aHJlc2hvbGQ6MCxwb2ludGVyczoyfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltqYl19LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJihNYXRoLmFicyhhLnJvdGF0aW9uKT50aGlzLm9wdGlvbnMudGhyZXNob2xkfHx0aGlzLnN0YXRlJm9iKX19KSxpKGZhLGFhLHtkZWZhdWx0czp7ZXZlbnQ6InN3aXBlIix0aHJlc2hvbGQ6MTAsdmVsb2NpdHk6LjMsZGlyZWN0aW9uOk5hfE9hLHBvaW50ZXJzOjF9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGJhLnByb3RvdHlwZS5nZXRUb3VjaEFjdGlvbi5jYWxsKHRoaXMpfSxhdHRyVGVzdDpmdW5jdGlvbihhKXt2YXIgYixjPXRoaXMub3B0aW9ucy5kaXJlY3Rpb247cmV0dXJuIGMmKE5hfE9hKT9iPWEub3ZlcmFsbFZlbG9jaXR5OmMmTmE/Yj1hLm92ZXJhbGxWZWxvY2l0eVg6YyZPYSYmKGI9YS5vdmVyYWxsVmVsb2NpdHlZKSx0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJmMmYS5vZmZzZXREaXJlY3Rpb24mJmEuZGlzdGFuY2U+dGhpcy5vcHRpb25zLnRocmVzaG9sZCYmYS5tYXhQb2ludGVycz09dGhpcy5vcHRpb25zLnBvaW50ZXJzJiZxYShiKT50aGlzLm9wdGlvbnMudmVsb2NpdHkmJmEuZXZlbnRUeXBlJkdhfSxlbWl0OmZ1bmN0aW9uKGEpe3ZhciBiPSQoYS5vZmZzZXREaXJlY3Rpb24pO2ImJnRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCtiLGEpLHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCxhKX19KSxpKGdhLFkse2RlZmF1bHRzOntldmVudDoidGFwIixwb2ludGVyczoxLHRhcHM6MSxpbnRlcnZhbDozMDAsdGltZToyNTAsdGhyZXNob2xkOjkscG9zVGhyZXNob2xkOjEwfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltpYl19LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGM9YS5wb2ludGVycy5sZW5ndGg9PT1iLnBvaW50ZXJzLGQ9YS5kaXN0YW5jZTxiLnRocmVzaG9sZCxmPWEuZGVsdGFUaW1lPGIudGltZTtpZih0aGlzLnJlc2V0KCksYS5ldmVudFR5cGUmRWEmJjA9PT10aGlzLmNvdW50KXJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7aWYoZCYmZiYmYyl7aWYoYS5ldmVudFR5cGUhPUdhKXJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7dmFyIGc9dGhpcy5wVGltZT9hLnRpbWVTdGFtcC10aGlzLnBUaW1lPGIuaW50ZXJ2YWw6ITAsaD0hdGhpcy5wQ2VudGVyfHxIKHRoaXMucENlbnRlcixhLmNlbnRlcik8Yi5wb3NUaHJlc2hvbGQ7dGhpcy5wVGltZT1hLnRpbWVTdGFtcCx0aGlzLnBDZW50ZXI9YS5jZW50ZXIsaCYmZz90aGlzLmNvdW50Kz0xOnRoaXMuY291bnQ9MSx0aGlzLl9pbnB1dD1hO3ZhciBpPXRoaXMuY291bnQlYi50YXBzO2lmKDA9PT1pKXJldHVybiB0aGlzLmhhc1JlcXVpcmVGYWlsdXJlcygpPyh0aGlzLl90aW1lcj1lKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1yYix0aGlzLnRyeUVtaXQoKX0sYi5pbnRlcnZhbCx0aGlzKSxvYik6cmJ9cmV0dXJuIHRifSxmYWlsVGltZW91dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90aW1lcj1lKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT10Yn0sdGhpcy5vcHRpb25zLmludGVydmFsLHRoaXMpLHRifSxyZXNldDpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLl90aW1lcil9LGVtaXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXRlPT1yYiYmKHRoaXMuX2lucHV0LnRhcENvdW50PXRoaXMuY291bnQsdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHRoaXMuX2lucHV0KSl9fSksaGEuVkVSU0lPTj0iMi4wLjgiLGhhLmRlZmF1bHRzPXtkb21FdmVudHM6ITEsdG91Y2hBY3Rpb246Z2IsZW5hYmxlOiEwLGlucHV0VGFyZ2V0Om51bGwsaW5wdXRDbGFzczpudWxsLHByZXNldDpbW2VhLHtlbmFibGU6ITF9XSxbY2Ese2VuYWJsZTohMX0sWyJyb3RhdGUiXV0sW2ZhLHtkaXJlY3Rpb246TmF9XSxbYmEse2RpcmVjdGlvbjpOYX0sWyJzd2lwZSJdXSxbZ2FdLFtnYSx7ZXZlbnQ6ImRvdWJsZXRhcCIsdGFwczoyfSxbInRhcCJdXSxbZGFdXSxjc3NQcm9wczp7dXNlclNlbGVjdDoibm9uZSIsdG91Y2hTZWxlY3Q6Im5vbmUiLHRvdWNoQ2FsbG91dDoibm9uZSIsY29udGVudFpvb21pbmc6Im5vbmUiLHVzZXJEcmFnOiJub25lIix0YXBIaWdobGlnaHRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fTt2YXIgdWI9MSx2Yj0yO2lhLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKGEpe3JldHVybiBsYSh0aGlzLm9wdGlvbnMsYSksYS50b3VjaEFjdGlvbiYmdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSxhLmlucHV0VGFyZ2V0JiYodGhpcy5pbnB1dC5kZXN0cm95KCksdGhpcy5pbnB1dC50YXJnZXQ9YS5pbnB1dFRhcmdldCx0aGlzLmlucHV0LmluaXQoKSksdGhpc30sc3RvcDpmdW5jdGlvbihhKXt0aGlzLnNlc3Npb24uc3RvcHBlZD1hP3ZiOnVifSxyZWNvZ25pemU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5zZXNzaW9uO2lmKCFiLnN0b3BwZWQpe3RoaXMudG91Y2hBY3Rpb24ucHJldmVudERlZmF1bHRzKGEpO3ZhciBjLGQ9dGhpcy5yZWNvZ25pemVycyxlPWIuY3VyUmVjb2duaXplcjsoIWV8fGUmJmUuc3RhdGUmcmIpJiYoZT1iLmN1clJlY29nbml6ZXI9bnVsbCk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDspYz1kW2ZdLGIuc3RvcHBlZD09PXZifHxlJiZjIT1lJiYhYy5jYW5SZWNvZ25pemVXaXRoKGUpP2MucmVzZXQoKTpjLnJlY29nbml6ZShhKSwhZSYmYy5zdGF0ZSYob2J8cGJ8cWIpJiYoZT1iLmN1clJlY29nbml6ZXI9YyksZisrfX0sZ2V0OmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBZKXJldHVybiBhO2Zvcih2YXIgYj10aGlzLnJlY29nbml6ZXJzLGM9MDtjPGIubGVuZ3RoO2MrKylpZihiW2NdLm9wdGlvbnMuZXZlbnQ9PWEpcmV0dXJuIGJbY107cmV0dXJuIG51bGx9LGFkZDpmdW5jdGlvbihhKXtpZihmKGEsImFkZCIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5nZXQoYS5vcHRpb25zLmV2ZW50KTtyZXR1cm4gYiYmdGhpcy5yZW1vdmUoYiksdGhpcy5yZWNvZ25pemVycy5wdXNoKGEpLGEubWFuYWdlcj10aGlzLHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksYX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2lmKGYoYSwicmVtb3ZlIix0aGlzKSlyZXR1cm4gdGhpcztpZihhPXRoaXMuZ2V0KGEpKXt2YXIgYj10aGlzLnJlY29nbml6ZXJzLGM9cihiLGEpOy0xIT09YyYmKGIuc3BsaWNlKGMsMSksdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSl9cmV0dXJuIHRoaXN9LG9uOmZ1bmN0aW9uKGEsYil7aWYoYSE9PWQmJmIhPT1kKXt2YXIgYz10aGlzLmhhbmRsZXJzO3JldHVybiBnKHEoYSksZnVuY3Rpb24oYSl7Y1thXT1jW2FdfHxbXSxjW2FdLnB1c2goYil9KSx0aGlzfX0sb2ZmOmZ1bmN0aW9uKGEsYil7aWYoYSE9PWQpe3ZhciBjPXRoaXMuaGFuZGxlcnM7cmV0dXJuIGcocShhKSxmdW5jdGlvbihhKXtiP2NbYV0mJmNbYV0uc3BsaWNlKHIoY1thXSxiKSwxKTpkZWxldGUgY1thXX0pLHRoaXN9fSxlbWl0OmZ1bmN0aW9uKGEsYil7dGhpcy5vcHRpb25zLmRvbUV2ZW50cyYma2EoYSxiKTt2YXIgYz10aGlzLmhhbmRsZXJzW2FdJiZ0aGlzLmhhbmRsZXJzW2FdLnNsaWNlKCk7aWYoYyYmYy5sZW5ndGgpe2IudHlwZT1hLGIucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXtiLnNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCl9O2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7KWNbZF0oYiksZCsrfX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudCYmamEodGhpcywhMSksdGhpcy5oYW5kbGVycz17fSx0aGlzLnNlc3Npb249e30sdGhpcy5pbnB1dC5kZXN0cm95KCksdGhpcy5lbGVtZW50PW51bGx9fSxsYShoYSx7SU5QVVRfU1RBUlQ6RWEsSU5QVVRfTU9WRTpGYSxJTlBVVF9FTkQ6R2EsSU5QVVRfQ0FOQ0VMOkhhLFNUQVRFX1BPU1NJQkxFOm5iLFNUQVRFX0JFR0FOOm9iLFNUQVRFX0NIQU5HRUQ6cGIsU1RBVEVfRU5ERUQ6cWIsU1RBVEVfUkVDT0dOSVpFRDpyYixTVEFURV9DQU5DRUxMRUQ6c2IsU1RBVEVfRkFJTEVEOnRiLERJUkVDVElPTl9OT05FOklhLERJUkVDVElPTl9MRUZUOkphLERJUkVDVElPTl9SSUdIVDpLYSxESVJFQ1RJT05fVVA6TGEsRElSRUNUSU9OX0RPV046TWEsRElSRUNUSU9OX0hPUklaT05UQUw6TmEsRElSRUNUSU9OX1ZFUlRJQ0FMOk9hLERJUkVDVElPTl9BTEw6UGEsTWFuYWdlcjppYSxJbnB1dDp4LFRvdWNoQWN0aW9uOlYsVG91Y2hJbnB1dDpQLE1vdXNlSW5wdXQ6TCxQb2ludGVyRXZlbnRJbnB1dDpNLFRvdWNoTW91c2VJbnB1dDpSLFNpbmdsZVRvdWNoSW5wdXQ6TixSZWNvZ25pemVyOlksQXR0clJlY29nbml6ZXI6YWEsVGFwOmdhLFBhbjpiYSxTd2lwZTpmYSxQaW5jaDpjYSxSb3RhdGU6ZWEsUHJlc3M6ZGEsb246bSxvZmY6bixlYWNoOmcsbWVyZ2U6dGEsZXh0ZW5kOnNhLGFzc2lnbjpsYSxpbmhlcml0OmksYmluZEZuOmoscHJlZml4ZWQ6dX0pO3ZhciB3Yj0idW5kZWZpbmVkIiE9dHlwZW9mIGE/YToidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTt3Yi5IYW1tZXI9aGEsImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gaGF9KToidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9aGE6YVtjXT1oYX0od2luZG93LGRvY3VtZW50LCJIYW1tZXIiKTsKZnVuY3Rpb24gdDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KXt2YXIgZT1bImdhbGxlcnkiXSxuPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3JldHVybiBlLmluY2x1ZGVzKG4pfWZ1bmN0aW9uIHQzOTZfX2lzRmxleCh0KXt2YXIgZT10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpLG49dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKTtyZXR1cm4gZXx8bn1mdW5jdGlvbiB0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3Jkcygpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYodCl7dmFyIGU9WyIudDk1MV9fc2lkZWJhcl9zdGlja3kiLCIudDEyMDZfX2NvbnRlbnRfc3RpY2t5IiwiLnQ3NTRfX2NvbF9maXhlZCIsIi50Nzc2X19jb2xfZml4ZWQiLCIudDc4Nl9fY29sX2ZpeGVkIiwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2NvbF9maXhlZCJdO3QzOTZfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZSgpO3ZhciBuPUJvb2xlYW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLmpvaW4oIiwgIikpKTt0LmNsYXNzTGlzdC5yZW1vdmUoInQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCIsInQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIiksdC5jbGFzc0xpc3QuYWRkKG4/InQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCI6InQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIil9fWZ1bmN0aW9uIHQzOTZfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZSgpe2lmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidDM5Nl9fb3ZlcmZsb3ctc3R5bGVzIikpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC5pZD0idDM5Nl9fb3ZlcmZsb3ctc3R5bGVzIix0LmlubmVySFRNTD0iLnQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCB7IG92ZXJmbG93OiBjbGlwOyB9XG5cdFx0XHRcdFx0XHQudC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4geyBvdmVyZmxvdzogaGlkZGVuOyB9Iixkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHQpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSgpeyJ2aXNpYmxlIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmKHRfYW5pbWF0aW9uU0JTX19vblJlYWR5KHRfYW5pbWF0aW9uU0JTX19pbml0KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19vblJlYWR5KHQpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0KCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlPXQ/ImVkaXQiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOm51bGw7ZXx8KGU9Qm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9yX3JlZGFjdG9yX3Rvb2xiYXIiKSkpLC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxkb2N1bWVudC5kb2N1bWVudE1vZGU8MTF8fGV8fCh0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0hvcml6b250YWxTY3JvbGwoKSx0X2FuaW1hdGlvblNCU19faXNaZXJvQmxvY2tzUmVuZGVyZWQoKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfaXNJbnN0YWdyYW1SZW5kZXJlZCgoZnVuY3Rpb24oKXt2YXIgdDt0X2FuaW1hdGlvblNCU19fc2V0QXV0b1NjYWxlSW5mbygpLHRfYW5pbWF0aW9uU0JTX193cmFwQW5kVXBkYXRlRWxzKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtc2JzLWV2ZW50XSIpKSksdF9hbmltYXRpb25TQlNfX2luaXRBbGxSZXMoZSl9KSl9KSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzSG9yaXpvbnRhbFNjcm9sbCgpe3ZhciB0PSdbZGF0YS1hbmltYXRlLXNicy1ldmVudD0ic2Nyb2xsIl0nLGU9QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpKSxuLGk7ZS5sZW5ndGgmJihlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIil9KSkuc29tZSgoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtb3ZyZmx3Iik7cmV0dXJuWyJ2aXNpYmxlIiwidmlzaWJsZVgiXS5pbmNsdWRlcyhlKX0pKT90Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3JkcygpOih0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlcygpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7dC5jbG9zZXN0KCIuciIpLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0aW9uLXNic19fb3ZlcmZsb3cteCIpfSkpKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZXMoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNicy1hbmltYXRpb24tYmxvY2stb3ZlcmZsb3ciKSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0LmlkPSJzYnMtYW5pbWF0aW9uLWJsb2NrLW92ZXJmbG93Iix0LmlubmVySFRNTD0iLnQtYW5pbWF0aW9uLXNic19fb3ZlcmZsb3cteCB7IG92ZXJmbG93LXg6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEF1dG9TY2FsZUluZm8oKXtpZih2b2lkIDA9PT13aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3Ipe3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9GaXJlZm94XC8oWzAtOV0rKVwuLyksZT10P3BhcnNlSW50KHRbMV0sMTApOjEyNixuPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhbMC05XSspXC4vKSxpPW4mJnBhcnNlSW50KG5bMV0sMTApfHwwO3dpbmRvdy5pc09ubHlTY2FsYWJsZT1lPDEyNix3aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3I9IXdpbmRvdy5pc09ubHlTY2FsYWJsZSYmIXQmJmk8PTEyN319ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2lzWmVyb0Jsb2Nrc1JlbmRlcmVkKHQpe3ZhciBlPXRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHMoIjM5NiIpLG49dF9hbmltYXRpb25TQlNfX2dldEFydGJvYXJkcygiMTIxIiksaT1bXS5jb25jYXQoZSxuKTtpZihpLmxlbmd0aCl7dmFyIGE9ITE7aWYoaS5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKXQoKTtlbHNlIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdFtzcmMqPSJ0aWxkYS1ibG9ja3MtMiJdLCBzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTEiXScpLmxlbmd0aCl0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdChpLERhdGUubm93KCksdCk7ZWxzZXt2YXIgcj1pLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpO2kuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil8fGUuYWRkRXZlbnRMaXN0ZW5lcigiYXJ0Qm9hcmRSZW5kZXJlZCIsKGZ1bmN0aW9uKCl7ci5wdXNoKGUpLHIubGVuZ3RoIT09aS5sZW5ndGh8fGF8fHQoKX0pKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2E9ITAsci5sZW5ndGghPT1pLmxlbmd0aCYmdCgpfSksM2UzKX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHModCl7dmFyIGU9Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl06bm90KC50Mzk3X19vZmYpOm5vdCgudDM5NV9fb2ZmKTpub3QoLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2JhY2t3YXJkQ29tcGF0aWJpbGl0eVdhaXQodCxlLG4pe2lmKHQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKX0pKSluKCk7ZWxzZXtpZihEYXRlLm5vdygpLWU+MWU0KXJldHVybiB2b2lkIGNvbnNvbGUud2FybigiYWxsIHplcm8tYmxvY2tzIGNhbid0IGJlIHJlbmRlcmVkIik7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdCh0LGUsbil9KSw1MDApfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19pc0luc3RhZ3JhbVJlbmRlcmVkKHQpe2lmKHdpbmRvdy5hbmltYXRpb25TQlNfX2lzSU9TJiYtMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIikpdmFyIGU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cuaW5uZXJXaWR0aCE9PXNjcmVlbi53aWR0aCYmd2luZG93LmlubmVySGVpZ2h0PndpbmRvdy5pbm5lcldpZHRoP3RfYW5pbWF0aW9uU0JTX2lzSW5zdGFncmFtUmVuZGVyZWQodCk6KGNsZWFyVGltZW91dChlKSx0KCkpfSksMTAwKTtlbHNlIHQoKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVscyh0KXt2YXIgZT0tMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIik7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKTtpZihuKXstMT09PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIikmJihuLnN0eWxlLldlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eT0iaGlkZGVuIixuLnN0eWxlLmJhY2tmYWNlVmlzaWJpbGl0eT0iaGlkZGVuIik7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLGE9dF9hbmltYXRpb25TQlNfX2dldEFuaW1PcHRpb25zKHQsInB1Ymxpc2hlZCIsbnVsbCk7aWYoIWkmJmEpe3ZhciByPWdldENvbXB1dGVkU3R5bGUobikuZGlzcGxheSxvO24uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1tb2xlY3VsZSIpJiYiZmxleCIhPT1yJiYobi5zdHlsZS5kaXNwbGF5PSJpbmhlcml0Iik7dmFyIHM9dF9hbmltYXRpb25TQlNfX2dldFNjYWxlV3JhcHBlcihuKSxsPXQuc3R5bGUudHJhbnNmb3JtLF87bCYmLTEhPT1sLmluZGV4T2YoIm1hdHJpeCgiKSYmKHRfYW5pbWF0aW9uU0JTX193cmFwRWwoc3x8biwidG4tYXRvbV9fc2JzLXRyYW5zZm9ybS13cmFwcGVyIiksKF89dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLXRyYW5zZm9ybS13cmFwcGVyIikpLnN0eWxlLnRyYW5zZm9ybT1sLHQuc3R5bGUudHJhbnNmb3JtPSIiKSx0X2FuaW1hdGlvblNCU19fd3JhcEVsKChfPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy10cmFuc2Zvcm0td3JhcHBlciIpKXx8c3x8biwidG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLHRfYW5pbWF0aW9uU0JTX191cGRhdGVTdHlsZXNBZnRlcldyYXBwaW5nKHQsX3x8aSxlKX19fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRTY2FsZVdyYXBwZXIodCl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKSxuPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tIik7cmV0dXJuIGUmJm4/bnVsbDp0LmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3dyYXBBbmRVcGRhdGVFbE9uUmVzaXplKHQpe2lmKHQubGVuZ3RoKXt2YXIgZT10LmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKX0pKTtlLmxlbmd0aCYmdF9hbmltYXRpb25TQlNfX3dyYXBBbmRVcGRhdGVFbHMoZSl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVTdHlsZXNBZnRlcldyYXBwaW5nKHQsZSxuKXt2YXIgaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxhPWdldENvbXB1dGVkU3R5bGUodCkscj1hLmdldFByb3BlcnR5VmFsdWUoImJvcmRlci1yYWRpdXMiKTsic2hhcGUiIT09aSYmImJ1dHRvbiIhPT1pJiYiaW1hZ2UiIT09aXx8IXBhcnNlSW50KHIsMTApfHwoZS5zdHlsZS5ib3JkZXJSYWRpdXM9cik7dmFyIG89WyJmaWx0ZXIiLCJiYWNrZHJvcC1maWx0ZXIiXTtvPShvPW8ubWFwKChmdW5jdGlvbih0KXt2YXIgZT0iLXdlYmtpdC0iK3Qsbj1hLmdldFByb3BlcnR5VmFsdWUodCk7aWYoIm5vbmUiIT09biYmIiIhPT1ufHwobj1hLmdldFByb3BlcnR5VmFsdWUoZSkpLCJub25lIiE9PW4mJiIiIT09bilyZXR1cm57ZmlsdGVyOnQsd2Via2l0RmlsdGVyOmUsdmFsdWU6bn19KSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSk7dmFyIHM9dC5xdWVyeVNlbGVjdG9yKCIudG4tbW9sZWN1bGUsIC50bi1hdG9tIiksbD1nZXRDb21wdXRlZFN0eWxlKHMpLnRyYW5zZm9ybSxfPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO18uaW5pdEV2ZW50KCJiYWNrZHJvcEZpbHRlckltZ1dyYXBwZXJlZCIsITAsITApLG8uZm9yRWFjaCgoZnVuY3Rpb24oYSl7d2luZG93LnRfYW5pbWF0aW9uU0JTX19pc0ZpcmVmb3gmJihlLnN0eWxlLmJhY2tmYWNlVmlzaWJpbGl0eT0idmlzaWJsZSIpLGUuc3R5bGVbYS53ZWJraXRGaWx0ZXJdPWEudmFsdWUsZS5zdHlsZVthLmZpbHRlcl09YS52YWx1ZSx0LnN0eWxlW2Eud2Via2l0RmlsdGVyXT0ibm9uZSIsdC5zdHlsZVthLmZpbHRlcl09Im5vbmUiLCJpbWFnZSI9PT1pJiZ3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzU2FmYXJpJiYodC5kaXNwYXRjaEV2ZW50KF8pLHQuY2xhc3NMaXN0LmFkZCgidDM5Nl9fZWxlbS0tYmFja2Ryb3AtZmlsdGVyLWltZy13cmFwcGVyZWQiKSksbiYmImJhY2tkcm9wLWZpbHRlciI9PT1hLmZpbHRlciYmKHMuc3R5bGVbYS53ZWJraXRGaWx0ZXJdPSJpbmhlcml0IixzLnN0eWxlW2EuZmlsdGVyXT0iaW5oZXJpdCIpLCJub25lIj09PWwmJihzLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWigwKSIpfSkpO3ZhciBjPW8uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuImJhY2tkcm9wLWZpbHRlciI9PT10LmZpbHRlcn0pKTtuJiZjJiZ0X2FuaW1hdGlvblNCU19fY2hyb21lRml4QmFja2Ryb3BGaWx0ZXIocyxlKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hyb21lRml4QmFja2Ryb3BGaWx0ZXIodCxlKXt2YXIgbj1nZXRDb21wdXRlZFN0eWxlKHQpLGk9bi5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWNvbG9yIiksYT1uLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKSxyPW4uZ2V0UHJvcGVydHlWYWx1ZSgiYm94LXNoYWRvdyIpO2lmKCJyZ2JhKDAsIDAsIDAsIDApIiE9PWkmJiIxIiE9PWEpe3ZhciBvPWkuc3Vic3RyaW5nKGkuaW5kZXhPZigiKCIpKzEsaS5pbmRleE9mKCIpIikpLHM9dF9hbmltYXRpb25TQlNfX3Byb2Nlc3NCb3hTaGFkb3dSR0IocixhKTtzJiYoZS5zdHlsZS5ib3hTaGFkb3c9cyx0LnN0eWxlLmJveFNoYWRvdz0ibm9uZSIpLGUuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJyZ2JhKCIrbysiLCIrYSsiKSIsdC5zdHlsZS5vcGFjaXR5PSIxIix0LnN0eWxlLmJhY2tncm91bmRDb2xvcj0idHJhbnNwYXJlbnQiLHQuc3R5bGUuYmFja2Ryb3BGaWx0ZXI9ImluaXRpYWwiLHQuc3R5bGUuV2Via2l0QmFja2Ryb3BGaWx0ZXI9ImluaXRpYWwifX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0JveFNoYWRvd1JHQih0LGUpe2lmKCF0KXJldHVybiExO2lmKC0xPT09dC5pbmRleE9mKCJyZ2JhIikmJi0xPT09dC5pbmRleE9mKCJyZ2IiKXx8IjEiPT09ZSlyZXR1cm4hMTt2YXIgbj10LnN1YnN0cmluZyh0LmluZGV4T2YoIigiKSsxLHQuaW5kZXhPZigiKSIpKSxpPW4uc3BsaXQoIiwgIik7Mz09PWkubGVuZ3RoP2kucHVzaChlKTppWzNdKj1lO3ZhciBhPXQucmVwbGFjZShuLGkuam9pbigiLCAiKSk7cmV0dXJuLTEhPT1hLmluZGV4T2YoInJnYigiKSYmKGE9YS5yZXBsYWNlKCJyZ2IoIiwicmdiYSgiKSksYX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdEFsbFJlcyh0KXt2YXIgZT17ZWxlbWVudHM6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnRdIikpLHNjcm9sbFRvcDp3aW5kb3cucGFnZVlPZmZzZXQsaXNFZGl0TW9kZTp0LGNsaWNrZWRUcmlnZ2VyRWxzOltdLGhvdmVyVHJpZ2dlckVsczpbXX07aWYoZS5lbGVtZW50cy5sZW5ndGgpe3RfYW5pbWF0aW9uU0JTX19jYWNoZUFuZFNldERhdGEoZSksdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzKGUpO3ZhciBuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksaT0hIW4mJiJ5ZXMiPT09bi5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpOygieSI9PT13aW5kb3cubGF6eXx8aSkmJnRfb25GdW5jTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KSk7dmFyIGE9dF9hbmltYXRpb25TQlNfX2dldEFuaW1FbHNPblZpZXcoZS5lbGVtZW50cykscixvPS9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigiUmVzaXplT2JzZXJ2ZXIiaW4gd2luZG93KXt2YXIgcz10X2FuaW1hdGlvblNCU19fZ2V0QWxsQnJlYWtwb2ludHMoKSxsO3RfYW5pbWF0aW9uU0JTX19jcmVhdGVSZXNpemVPYnNlcnZlcih7YnJlYWtwb2ludHM6cyxjdXJyZW50UmVzOnRfYW5pbWF0aW9uU0JTX19nZXRDdXJyZW50UmVzKHMsbyksaXNNb2JpbGU6b30sZCl9ZWxzZSBvP3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtkKCl9KSwzMDApfSkpOndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGQpO3ZhciBfPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50Mzk2IiksYztpZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKF8sKGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLGQpfSkpLHdpbmRvdy50X2FuaW1hdGlvblNCU19faXNTYWZhcmkpe2Z1bmN0aW9uIG0oKXswIT09d2luZG93LnBhZ2VZT2Zmc2V0JiZkKCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsbSl9d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsbSl9dF9hbmltYXRpb25TQlNfX3RyaWdnZXJOb1Njcm9sbEFuaW1hdGlvbihlLGEpLGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuaW1hdGUtc2JzLWV2ZW50PSJzY3JvbGwiXScpLmxlbmd0aCYmKHRfYW5pbWF0aW9uU0JTX190cmlnZ2VyU2Nyb2xsQW5pbShlKSx0X2FuaW1hdGlvblNCU19fY2hlY2tGcmFtZShlKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX19jaGFuZ2VFbFZhbHVlcyhlKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpeyJjb21wbGV0ZSIhPT1kb2N1bWVudC5yZWFkeVN0YXRlJiZ0X2FuaW1hdGlvblNCU19fY2hhbmdlRWxWYWx1ZXMoZSl9KSwzZTMpfWZ1bmN0aW9uIGQoKXtjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtc2JzLWV2ZW50XSIpKTt0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZShlLCJlbGVtZW50cyIsdCksdF9hbmltYXRpb25TQlNfX3dyYXBBbmRVcGRhdGVFbE9uUmVzaXplKGUuZWxlbWVudHMpLHRfYW5pbWF0aW9uU0JTX19jYWNoZUFuZFNldERhdGEoZSksdF9hbmltYXRpb25TQlNfX3RyaWdnZXJTY3JvbGxBbmltKGUpLGE9dF9hbmltYXRpb25TQlNfX2dldEFuaW1FbHNPblZpZXcoZS5lbGVtZW50cyksdF9hbmltYXRpb25TQlNfX3RyaWdnZXJOb1Njcm9sbEFuaW1hdGlvbihlLGEpLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lcyhlKX0pLDUwMCl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBbmltRWxzT25WaWV3KHQpe3JldHVybiB0LmZpbHRlcigoZnVuY3Rpb24odCl7dmFyIGU9ImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiO3JldHVybiJpbnRvdmlldyI9PT10LmdldEF0dHJpYnV0ZShlKXx8ImJsb2NraW50b3ZpZXciPT09dC5nZXRBdHRyaWJ1dGUoZSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEFsbEJyZWFrcG9pbnRzKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIgLnQzOTZfX2FydGJvYXJkIikpLGU9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dF9hbmltYXRpb25TQlNfX2dldFJlc09wdHModCksaT1uLmJyZWFrcG9pbnRzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuLTE9PT1lLmluZGV4T2YodCl9KSk7LTE9PT0oZT1lLmNvbmNhdChpKSkuaW5kZXhPZihuLnJlc01heCkmJmUucHVzaChuLnJlc01heCl9KSksZS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBlLXR9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEN1cnJlbnRSZXModCxlKXt2YXIgbixpPWV8fCJvbnRvdWNoZW5kImluIGRvY3VtZW50JiYtMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQXBwbGVXZWJLaXQiKT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVyV2lkdGg7cmV0dXJuIHQuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIGk+dH0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LGUsbil7dFtlXT1ufWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRLZXlGb3JBbmltYXRlZE9iamVjdCh0LGUsbil7dFtlXXx8dF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCxlLG4pfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jcmVhdGVSZXNpemVPYnNlcnZlcih0LGUpe3ZhciBuPWRvY3VtZW50LmJvZHkuZ2V0Q2xpZW50UmVjdHMoKSxpPW5bMF0uaGVpZ2h0LGE7bmV3IFJlc2l6ZU9ic2VydmVyKChmdW5jdGlvbihhKXthLmZvckVhY2goKGZ1bmN0aW9uKGEpe2lmKCFkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygidC1ib2R5X3Njcm9sbC1sb2NrZWQiKSYmIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWJvZHlfcG9wdXBzaG93ZWQiKSl7dmFyIHI9dF9hbmltYXRpb25TQlNfX2dldEN1cnJlbnRSZXModC5icmVha3BvaW50cyx0LmlzTW9iaWxlKTthLmNvbnRlbnRSZWN0LmhlaWdodD09PWkmJnQuY3VycmVudFJlcz09PXJ8fCh0LmN1cnJlbnRSZXM9cixpPW5bMF0uaGVpZ2h0LGUoKSl9fSkpfSkpLm9ic2VydmUoZG9jdW1lbnQuYm9keSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NoYW5nZUVsVmFsdWVzKHQpe3QuZWxlbWVudHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dF9hbmltYXRpb25TQlNfX3NldEFuZENhY2hlRWxUb3BQb3MoZSx0KSwic2Nyb2xsIj09PWUuYW5pbVR5cGUmJnRfYW5pbWF0aW9uU0JTX191cGRhdGVTdGVwc1ZhbHVlcyhlKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hlY2tGcmFtZSh0KXt2YXIgZTsiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSYmKHRfYW5pbWF0aW9uU0JTX19jaGVja1Bvc0NoYW5nZXModCkmJnRfYW5pbWF0aW9uU0JTX190cmlnZ2VyU2Nyb2xsQW5pbSh0KSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfX2NoZWNrRnJhbWUodCl9KSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jaGVja1Bvc0NoYW5nZXModCl7dmFyIGU9dC5zY3JvbGxUb3Asbj13aW5kb3cucGFnZVlPZmZzZXQ7cmV0dXJuIG48MCYmd2luZG93LnRfYW5pbWF0aW9uU0JTX19pc1NhZmFyaSYmKG49MCksdF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCwic2Nyb2xsVG9wIixuKSxlIT09bn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdHJpZ2dlclNjcm9sbEFuaW0odCl7dC5lbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbihlKXtpZigic2Nyb2xsIj09PWUuYW5pbVR5cGUpe3ZhciBuPXtvcGFjaXR5OjEsYmx1cjowLGZpeDohMSxmaXhlZFNoaWZ0WTowLHRyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAsc2NhbGVYOjEsc2NhbGVZOjEscm90YXRlOjB9O3RfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25DaGVja1N0ZXBzKHQsZSxuKSx0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uVXBkYXRlVHJhbnNmb3JtKGUsbil9fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25DaGVja1N0ZXBzKHQsZSxuKXtlLnN0ZXBzLmZvckVhY2goKGZ1bmN0aW9uKGksYSl7dmFyIHI9dC5zY3JvbGxUb3ArZS50cmlnZ2VyT2Zmc2V0LG89dF9hbmltYXRpb25TQlNfX2dldFpvb20oZSk7ZS5zY2FsZWREaWZmZXJlbmNlJiYocis9ZS5zY2FsZWREaWZmZXJlbmNlKTt2YXIgcz1yPj1pLnN0YXJ0LGw9cjxpLnN0YXJ0LF89aS5lbmQ8PXIsYz1pLmVuZD5yO2lmKHMmJmMpe2kuc3RhdGU9InN0YXJ0ZWQiLGUud3JhcHBlckVsJiYoZS53cmFwcGVyRWwuc3R5bGUud2lsbENoYW5nZT0idHJhbnNmb3JtIik7dmFyIG09ci1pLnN0YXJ0LGQ9MD09PWkuZGlzdD8xOm0vaS5kaXN0O24ucHJldlVuZml4ZWREaXN0PWkucHJldlVuZml4ZWREaXN0LHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25DYWxjU3RlcFN0eWxlcyhuLGksZCxhLG8pfV8mJihpLnN0YXRlPSJmaW5pc2hlZCIsZS53cmFwcGVyRWwmJihlLndyYXBwZXJFbC5zdHlsZS53aWxsQ2hhbmdlPSIiKSx0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2FsY1N0ZXBTdHlsZXMobixpLDEsYSxvKSksIWx8fCJzdGFydGVkIiE9PWkuc3RhdGUmJiJmaW5pc2hlZCIhPT1pLnN0YXRlfHwoaS5zdGF0ZT0idW5hY3RpdmUiLGUud3JhcHBlckVsJiYoZS53cmFwcGVyRWwuc3R5bGUud2lsbENoYW5nZT0iIiksdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNhbGNTdGVwU3R5bGVzKG4saSwwLGEsbykpfSkpLGUuY2xhc3NMaXN0LnJlbW92ZSgidDM5Nl9fZWxlbS0tYW5pbS1oaWRkZW4iKSxlLnN0ZXBzWzFdJiYwPT09ZS5zdGVwc1sxXS5kaXN0JiYwPT09ZS5zdGVwc1sxXS5zdHlsZXMub3BhY2l0eSYmInVuYWN0aXZlIj09PWUuc3RlcHNbMV0uc3RhdGUmJihuLm9wYWNpdHk9MCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNhbGNTdGVwU3R5bGVzKHQsZSxuLGksYSl7aWYoITA9PT1lLnN0eWxlcy5maXgmJiJzdGFydGVkIj09PWUuc3RhdGUmJih0LmZpeD0hMCx0LmZpeGVkU2hpZnRZPTApLCEwPT09ZS5zdHlsZXMuZml4JiYiZmluaXNoZWQiPT09ZS5zdGF0ZSYmKHQuZml4PSExLHQuZml4ZWRTaGlmdFkrPWUuZGlzdC9hKSwhMD09PWUuc3R5bGVzLmZpeCYmInVuYWN0aXZlIj09PWUuc3RhdGUpe2lmKGk+MCYmITA9PT10LmZpeClyZXR1cm47dC5maXg9ITF9dC5vcGFjaXR5Kz1uKihlLnN0eWxlcy5vcGFjaXR5LXQub3BhY2l0eSksdC5ibHVyKz1uKihlLnN0eWxlcy5ibHVyLXQuYmx1ciksdC50cmFuc2xhdGVYKz1uKmUuc3R5bGVzLm1vdmVYLHQudHJhbnNsYXRlWSs9biplLnN0eWxlcy5tb3ZlWSx0LnNjYWxlWCs9biooZS5zdHlsZXMuc2NhbGVYLXQuc2NhbGVYKSx0LnNjYWxlWSs9biooZS5zdHlsZXMuc2NhbGVZLXQuc2NhbGVZKSx0LnJvdGF0ZSs9biplLnN0eWxlcy5yb3RhdGV9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvblVwZGF0ZVRyYW5zZm9ybSh0LGUpe2lmKHQud3JhcHBlckVsKXt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0Wm9vbSh0KSxpPWdldENvbXB1dGVkU3R5bGUodCkud2lsbENoYW5nZSxhPXdpbmRvdy5pc09ubHlTY2FsYWJsZXx8dDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KTtpZighMD09PWUuZml4JiYiZml4ZWQiIT09dC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb24pe3ZhciByPXQudHJpZ2dlck9mZnNldC1lLnByZXZVbmZpeGVkRGlzdDthfHwoci89biksdC5zY2FsZWREaWZmZXJlbmNlJiYocis9dC5zY2FsZWREaWZmZXJlbmNlKSx0LndyYXBwZXJFbC5zdHlsZS50b3A9cisicHgiLHQud3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsaSYmImF1dG8iIT09aSYmKHQuc3R5bGUud2lsbENoYW5nZT0idW5zZXQiKSx0LnpJbmRleCYmKHQud3JhcHBlckVsLnN0eWxlLnpJbmRleD10LnpJbmRleCl9ITE9PT1lLmZpeCYmImZpeGVkIj09PXQud3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uJiYodC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb249IiIsdC53cmFwcGVyRWwuc3R5bGUudG9wPSIiLHQud3JhcHBlckVsLnN0eWxlLnpJbmRleD0iIix0LnpJbmRleCYmKHQuc3R5bGUuekluZGV4PXQuekluZGV4KSx0LnN0eWxlLndpbGxDaGFuZ2U9IiIpLHQud3JhcHBlckVsLnN0eWxlLm9wYWNpdHk9ZS5vcGFjaXR5LnRvU3RyaW5nKCk7dmFyIG89IiI7aWYoZS50cmFuc2xhdGVYKXt2YXIgcz1lLnRyYW5zbGF0ZVg7YSYmKHMqPW4pLG8rPSJ0cmFuc2xhdGVYKCIrcy50b0ZpeGVkKDIpKyJweCkifWlmKDAhPT1lLnRyYW5zbGF0ZVl8fDAhPT1lLmZpeGVkU2hpZnRZKXt2YXIgbD1lLnRyYW5zbGF0ZVkrZS5maXhlZFNoaWZ0WTthJiYobCo9biksbys9InRyYW5zbGF0ZVkoIitsLnRvRml4ZWQoMikrInB4KSJ9MT09PWUuc2NhbGVYJiYxPT09ZS5zY2FsZVl8fChvKz0ic2NhbGUoIitlLnNjYWxlWCsiLCIrZS5zY2FsZVkrIikiKSwwIT09ZS5yb3RhdGUmJihvKz0icm90YXRlKCIrZS5yb3RhdGUrImRlZykiKSx0LndyYXBwZXJFbC5zdHlsZS50cmFuc2Zvcm09b3x8InNjYWxlKDEpIn19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzKHQpe3ZhciBlPSIiO2lmKHQuZWxlbWVudHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoInNjcm9sbCIhPT10LmFuaW1UeXBlKXt2YXIgbj17dGltZUR1cmF0aW9uOjB9LGk9W10sYT10X2FuaW1hdGlvblNCU19fY3JlYXRlRW1wdHlTdHlsZU9wdGlvbnNGb3JLZXlmcmFtZXModC5zdGVwcyk7dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb21iaW5lT2JqZWN0cyh0LnN0ZXBzLGksbixhKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvcnJlY3RGcmFtZXMoaSksdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb3VudFBlcmNlbnQoaSxuKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvcnJlY3RPcGFjaXR5T25GaXJzdFN0ZXAodCxpKTt2YXIgcj10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldFR4dFN0eWxlcyh0LGkpLG87aWYobi50aW1lRHVyYXRpb24vPTFlMyxyKWlmKGUrPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0RmluYWxDc3ModCxuLHIpLCJob3ZlciI9PT10LmFuaW1UeXBlfHwiY2xpY2siPT09dC5hbmltVHlwZSkoIXQubG9vcHx8Imxvb3B3aXRocmV2ZXJzZSI9PT10Lmxvb3ApJiYoZSs9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRSZXZlcnNlQW5pbSh0KSl9fSkpLGUpe2lmKHQuaXNFZGl0TW9kZSlyZXR1cm4gZTt2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuc2JzLWFuaW0ta2V5ZnJhbWVzIik7bj9uLnRleHRDb250ZW50IT09ZSYmKG4udGV4dENvbnRlbnQ9ZSk6KChuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInNicy1hbmltLWtleWZyYW1lcyIpLG4udGV4dENvbnRlbnQ9ZSxkb2N1bWVudC5oZWFkLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixuKSl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jcmVhdGVFbXB0eVN0eWxlT3B0aW9uc0ZvcktleWZyYW1lcyh0KXtyZXR1cm57bW92ZVg6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10LnN0eWxlcy5tb3ZlWH0pKSxtb3ZlWTp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuc3R5bGVzLm1vdmVZfSkpLHNjYWxlWDp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQuc3R5bGVzLnNjYWxlWH0pKSxzY2FsZVk6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10LnN0eWxlcy5zY2FsZVl9KSkscm90YXRlOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5zdHlsZXMucm90YXRlfSkpLGJsdXI6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10LnN0eWxlcy5ibHVyfSkpLG9wYWNpdHk6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10LnN0eWxlcy5vcGFjaXR5fSkpLGZpeDp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4hMT09PXQuc3R5bGVzLmZpeH0pKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb21iaW5lT2JqZWN0cyh0LGUsbixpKXt0LmZvckVhY2goKGZ1bmN0aW9uKGEscil7dmFyIG89e307Zm9yKHZhciBzIGluIG8uc3R5bGVzPWEuc3R5bGVzLGkpaVtzXSYmZGVsZXRlIG8uc3R5bGVzW3NdOyJ7fSIhPT1KU09OLnN0cmluZ2lmeShvLnN0eWxlcykmJihvLnRpbWU9MSphLnRpbWV8fDAsciE9PXQubGVuZ3RoLTEmJihvLmVhc2U9dFtyKzFdLmVhc2UpLGUucHVzaChvKSxuLnRpbWVEdXJhdGlvbis9by50aW1lKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvcnJlY3RGcmFtZXModCl7dC5mb3JFYWNoKChmdW5jdGlvbihlLG4pe3ZhciBpPW49PT10Lmxlbmd0aC0xLGE9MD09PW4scj1pP251bGw6dFtuKzFdLG89YT9udWxsOnRbbi0xXTtmb3IodmFyIHMgaW4gZS5zdHlsZXMpYXx8cyBpbiBvLnN0eWxlc3x8dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19hZGRTdHlsZVRvS2V5ZnJhbWUoZSxvLHMsMCksaXx8KHMgaW4gci5zdHlsZXM/Im1vdmVYIiE9PXMmJiJtb3ZlWSIhPT1zJiYicm90YXRlIiE9PXN8fHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fcmVjYWxjdWxhdGVWYWx1ZShlLHIscyk6dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19hZGRTdHlsZVRvS2V5ZnJhbWUoZSxyLHMsMSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fYWRkU3R5bGVUb0tleWZyYW1lKHQsZSxuLGkpeyJibHVyIiE9PW4mJiJyb3RhdGUiIT09biYmIm1vdmVYIiE9PW4mJiJtb3ZlWSIhPT1ufHwoZS5zdHlsZXNbbl09MD09PWk/MDp0LnN0eWxlc1tuXSksIm9wYWNpdHkiIT09biYmInNjYWxlWCIhPT1uJiYic2NhbGVZIiE9PW58fChlLnN0eWxlc1tuXT0wPT09aT8xOnQuc3R5bGVzW25dKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX3JlY2FsY3VsYXRlVmFsdWUodCxlLG4pe3N3aXRjaChuKXtjYXNlInJvdGF0ZSI6ZS5zdHlsZXMucm90YXRlKz10LnN0eWxlcy5yb3RhdGU7YnJlYWs7Y2FzZSJtb3ZlWCI6ZS5zdHlsZXMubW92ZVgrPXQuc3R5bGVzLm1vdmVYO2JyZWFrO2Nhc2UibW92ZVkiOmUuc3R5bGVzLm1vdmVZKz10LnN0eWxlcy5tb3ZlWX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19jb3VudFBlcmNlbnQodCxlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXSxhO2lmKDA9PT1uKTA9PT1lLnRpbWVEdXJhdGlvbj9pLnBlcmNlbnQ9MDooYT0oMTAwKmkudGltZS9lLnRpbWVEdXJhdGlvbikudG9GaXhlZCgyKSxpLnBlcmNlbnQ9cGFyc2VGbG9hdChhKSk7ZWxzZSBpZihuPT09dC5sZW5ndGgtMSlpLnBlcmNlbnQ9MTAwO2Vsc2V7dmFyIHI9dFtuLTFdLnBlcmNlbnQ7aWYoMD09PWUudGltZUR1cmF0aW9uKWkucGVyY2VudD0wO2Vsc2V7aWYoYT0oMTAwKmkudGltZS9lLnRpbWVEdXJhdGlvbityKS50b0ZpeGVkKDIpLDEwMD09PXBhcnNlSW50KGEsMTApJiZuPT09dC5sZW5ndGgtMiYmMCE9PW4pY29udGludWU7aS5wZXJjZW50PXBhcnNlRmxvYXQoYSl9aS5wZXJjZW50PT09ciYmKGkucGVyY2VudCs9MSksaS5wZXJjZW50PjEwMCYmKGkucGVyY2VudD05OSl9fX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvcnJlY3RPcGFjaXR5T25GaXJzdFN0ZXAodCxlKXt2YXIgbj1lWzFdO3QmJnQuY2xhc3NMaXN0LnJlbW92ZSgidDM5Nl9fZWxlbS0tYW5pbS1oaWRkZW4iKTt2YXIgaT10P3QucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKTpudWxsO24mJjA9PT1uLnRpbWUmJjA9PT1uLnN0eWxlcy5vcGFjaXR5PyhpJiYoaS5zdHlsZS5vcGFjaXR5PSIwIiksZVswXS5zdHlsZXMub3BhY2l0eT0wKTppJiYiMCI9PT1pLnN0eWxlLm9wYWNpdHkmJmkmJihpLnN0eWxlLm9wYWNpdHk9IiIpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0VHh0U3R5bGVzKHQsZSl7dmFyIG49IiI7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5jaGFuZ2VzfHwoZS5jaGFuZ2VzPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0RnJhbWVDaGFuZ2VzKHQsZSkpLG4rPSJudW1iZXIiPT10eXBlb2YgZS5wZXJjZW50P2UucGVyY2VudCsiJSB7IitlLmNoYW5nZXMrIn1cbiI6IiJ9KSksbn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldEZyYW1lQ2hhbmdlcyh0LGUpe3ZhciBuPSIiLGk9IiIsYT17eDoxLHk6MSxjaGFuZ2VkOiExfSxyPTE7KHdpbmRvdy5pc09ubHlTY2FsYWJsZXx8dDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KSkmJihyPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpKTt2YXIgbyxzPXRfYW5pbWF0aW9uU0JTX19nZXRTY2FsZVdyYXBwZXIodC5xdWVyeVNlbGVjdG9yKCIudG4tbW9sZWN1bGUsIC50bi1hdG9tIikpO2Zvcih2YXIgbCBpbiAxPT09cnx8c3x8KHI9MSksZS5zdHlsZXMpc3dpdGNoKGwpe2Nhc2Uib3BhY2l0eSI6bis9Im9wYWNpdHk6IitlLnN0eWxlcy5vcGFjaXR5KyI7IjticmVhaztjYXNlInNjYWxlWCI6YS54PWUuc3R5bGVzLnNjYWxlWCxhLmNoYW5nZWQ9ITA7YnJlYWs7Y2FzZSJzY2FsZVkiOmEueT1lLnN0eWxlcy5zY2FsZVksYS5jaGFuZ2VkPSEwO2JyZWFrO2Nhc2UibW92ZVgiOmkrPSJ0cmFuc2xhdGVYKCIrTWF0aC5yb3VuZChlLnN0eWxlcy5tb3ZlWCpyKSsicHgpIjticmVhaztjYXNlIm1vdmVZIjppKz0idHJhbnNsYXRlWSgiK01hdGgucm91bmQoZS5zdHlsZXMubW92ZVkqcikrInB4KSI7YnJlYWs7Y2FzZSJyb3RhdGUiOmkrPSJyb3RhdGUoIitlLnN0eWxlcy5yb3RhdGUrImRlZykifWlmKCEwPT09YS5jaGFuZ2VkJiYoaSs9InNjYWxlKCIrYS54KyIsIithLnkrIikiKSwiIiE9PWkmJihuKz0idHJhbnNmb3JtOiIraSsiOyIpLHZvaWQgMCE9PWUuZWFzZSlzd2l0Y2gobis9ImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IixlLmVhc2Upe2Nhc2UiZWFzZUluIjpuKz0iZWFzZS1pbjsiO2JyZWFrO2Nhc2UiZWFzZU91dCI6bis9ImVhc2Utb3V0OyI7YnJlYWs7Y2FzZSJlYXNlSW5PdXQiOm4rPSJlYXNlLWluLW91dDsiO2JyZWFrO2Nhc2UiYm91bmNlRmluIjpuKz0iY3ViaWMtYmV6aWVyKDAuMzQsMS42MSwwLjcsMSk7IjticmVhaztkZWZhdWx0Om4rPSIiPT09ZS5lYXNlLnRyaW0oKT8ibGluZWFyOyI6ZS5lYXNlKyI7In1yZXR1cm4gbn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldEZpbmFsQ3NzKHQsZSxuKXt2YXIgaT0iIixhPXQudW5pcXVlSUQscj0iLnQtc2JzLWFuaW1fc3RhcnRlZCAjIit0LnVuaXF1ZUlELG87InB1Ymxpc2hlZCIhPT13aW5kb3cudGlsZGFtb2RlJiYodC50aW1lRHVyYXRpb249ZS50aW1lRHVyYXRpb24pLGkrPXIrIiB7XG5hbmltYXRpb246ICIrYSsiICIrKDA9PT1lLnRpbWVEdXJhdGlvbj8xZS01OmUudGltZUR1cmF0aW9uKSsicyI7dmFyIHM9dC5sb29wJiYtMSE9PXQubG9vcC5pbmRleE9mKCJsb29wIik7cmV0dXJuIHMmJihpKz0iIGluZmluaXRlIiksaSs9IiBsaW5lYXIiLHM/Imxvb3B3aXRocmV2ZXJzZSI9PT10Lmxvb3AmJihpKz0iIGFsdGVybmF0ZSIpOmkrPSIgZm9yd2FyZHMiLGkrPSI7XG5iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbkBrZXlmcmFtZXMgIithKyIge1xuIituKyJ9XG5cbiJ9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRSZXZlcnNlQW5pbSh0KXt2YXIgZT10LmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSxuPWU/ImRhdGEtZ3JvdXAtaWQiOiJkYXRhLWVsZW0taWQiLGk9dC5nZXRBdHRyaWJ1dGUobil8fHQuaWQsYT1lPydbZGF0YS1ncm91cC1pZD0iJytpKyciXSc6J1tkYXRhLWVsZW0taWQ9IicraSsnIl0nLHIsbz0iIjtyZXR1cm4gbys9IiMiKyh0LmNsb3Nlc3QoIi50LXJlYyIpP3QuY2xvc2VzdCgiLnQtcmVjIikuZ2V0QXR0cmlidXRlKCJpZCIpOiIiKSsiICIsbys9YSsiLnQtc2JzLWFuaW1fc3RhcnRlZC50LXNicy1hbmltX3JldmVyc2VkIC50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyICIsbys9Intcbi13ZWJraXQtYW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTtcbmFuaW1hdGlvbi1kaXJlY3Rpb246IHJldmVyc2U7XG59XG5cbiJ9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEFuaW1PcHRpb25zKHQsZSxuKXtpZighdClyZXR1cm4iIjt2YXIgaT1bInNicyIsIm9wdHMiXTtufHwobj0iZWRpdCI9PT1lP2kuam9pbigiIik6aS5qb2luKCItIikpO3ZhciBhPSJlZGl0Ij09PWU/ImZpZWxkIjoiYW5pbWF0ZSIscj0iZWRpdCI9PT1lPyItdmFsdWUiOiIiLG89ImVkaXQiPT09ZT8iZGF0YS1maWVsZC1hbmltbW9iaWxlLXZhbHVlIjoiZGF0YS1hbmltYXRlLW1vYmlsZSIscz0ieSI9PT10LmdldEF0dHJpYnV0ZShvKSxsLF89dF9hbmltYXRpb25TQlNfX2dldFJlc09wdHModC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSksYz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVBdHRyKGEsbixyLCExKTtpZihfLnJlcz09PV8ucmVzTWF4KXJldHVybiB0LmdldEF0dHJpYnV0ZShjKTtpZighcyYmImVkaXQiIT09ZSYmXy5yZXM8MTIwMClyZXR1cm4gdC5zdHlsZS50cmFuc2l0aW9uPSJub25lIix0LmNsYXNzTGlzdC5yZW1vdmUoInQzOTZfX2VsZW0tLWFuaW0taGlkZGVuIiksIiI7dmFyIG09dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlQXR0cihhLG4scixfLnJlcyksZD10LmdldEF0dHJpYnV0ZShtKTtyZXR1cm4gZHx8KF8uYnJlYWtwb2ludHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoIShlPD1fLnJlc3x8ZCkpe3ZhciBpPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUF0dHIoYSxuLHIsZSk7ZD10LmdldEF0dHJpYnV0ZShpKX19KSksZHx8dC5nZXRBdHRyaWJ1dGUoYyl8fCIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVBdHRyKHQsZSxuLGkpe3ZhciBhPSJkYXRhLSIrdCsiLSIrZTtyZXR1cm4gaSYmKGErPSItcmVzLSIraSksYSs9bn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0UmVzT3B0cyh0KXt2YXIgZT1bMTIwMCw5NjAsNjQwLDQ4MCwzMjBdO2lmKCF3aW5kb3cudG4pe3ZhciBuLGk9d2luZG93LmlubmVyV2lkdGg7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7bnx8aT49dCYmKG49dCl9KSkse3JlczpufHwzMjAscmVzTWF4OjEyMDAsYnJlYWtwb2ludHM6WzMyMCw0ODAsNjQwLDk2MF19fXZhciBhPXQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKToiIixuO3JldHVybiBhJiZ3aW5kb3cudG5bImFiIithXT97cmVzOndpbmRvdy50Mzk2X2RldGVjdFJlc29sdXRpb24/dDM5Nl9kZXRlY3RSZXNvbHV0aW9uKGEpOndpbmRvdy50blsiYWIiK2FdLmN1clJlc29sdXRpb24scmVzTWF4OndpbmRvdy50blsiYWIiK2FdLmN1clJlc29sdXRpb25fbWF4LGJyZWFrcG9pbnRzOndpbmRvdy50blsiYWIiK2FdLnNjcmVlbnMuc2xpY2UoMCwtMSl9OndpbmRvdy50bi5zY3JlZW5zP3tyZXM6d2luZG93LnRuLmN1clJlc29sdXRpb24scmVzTWF4OndpbmRvdy50bi50b3BSZXNvbHV0aW9uLGJyZWFrcG9pbnRzOndpbmRvdy50bi5zY3JlZW5zLnNsaWNlKDAsLTEpfTp7cmVzOm49dF9hbmltYXRpb25TQlNfX2dldEN1cnJlbnRSZXMoZSx3aW5kb3cuaXNNb2JpbGUpLHJlc01heDoxMjAwLGJyZWFrcG9pbnRzOlszMjAsNDgwLDY0MCw5NjBdfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2FjaGVBbmRTZXREYXRhKHQpe3QuZWxlbWVudHMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKTtpZigic2Nyb2xsIiE9PWUuYW5pbVR5cGV8fCFufHwiZml4ZWQiIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShuLCJwb3MiKSl7dmFyIGk9dC5pc0VkaXRNb2RlPyJkYXRhLWZpZWxkLXNic2V2ZW50LXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy1ldmVudCI7ZS5hbmltVHlwZT1lLmdldEF0dHJpYnV0ZShpKTt2YXIgYT10LmlzRWRpdE1vZGU/ImRhdGEtZmllbGQtc2JzdHJnLXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy10cmciO2UudHJpZ2dlcj1wYXJzZUZsb2F0KGUuZ2V0QXR0cmlidXRlKGEpKSxpc05hTihlLnRyaWdnZXIpJiYoZS50cmlnZ2VyPTEpLGUudHJpZ2dlckVsZW1zPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyhlLCJwdWJsaXNoZWQiLCJzYnMtdHJnZWxzIiksZS53cmFwcGVyRWw9ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO3ZhciByPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyhlLHQuaXNFZGl0TW9kZT8iZWRpdCI6InB1Ymxpc2hlZCIsbnVsbCk7aWYoZS5zdGF0dXM9cj8iYWN0aXZlIjoiaW5uYWN0aXZlIiwiaW5uYWN0aXZlIiE9PWUuc3RhdHVzKXstMSE9PXIuaW5kZXhPZigiZml4ZWQiKSYmKGUuekluZGV4PWdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgiei1pbmRleCIpKSxyPXIucmVwbGFjZSgvJy9nLCciJyksdF9hbmltYXRpb25TQlNfX2FkZERlbGF5VG9TdGVwcyhyPUpTT04ucGFyc2UocikpO3ZhciBvPXQuaXNFZGl0TW9kZT8iZGF0YS1maWVsZC1zYnNsb29wLXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy1sb29wIjtlLmxvb3A9ZS5nZXRBdHRyaWJ1dGUobyl8fCIiLHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKGUsdCk7dmFyIHM9dF9hbmltYXRpb25TQlNfX2dldFpvb20oZSk7ZS5zdGVwcz1bXTt2YXIgbD0wO3IuZm9yRWFjaCgoZnVuY3Rpb24odCxuKXt2YXIgaT17c3RhdGU6InVuYWN0aXZlIn07aS5zdHlsZXM9dF9hbmltYXRpb25TQlNfX2NyZWF0ZVN0ZXBTdHlsZXModCksInNjcm9sbCI9PT1lLmFuaW1UeXBlPyhpLnByZXZVbmZpeGVkRGlzdD1sLGkuZGlzdD10LmRpKnMsITE9PT1pLnN0eWxlcy5maXgmJihsKz1pLmRpc3QpLGkuc3RhcnQ9MD09PW4/ZS50b3BPZmZzZXQ6ZS5zdGVwc1tuLTFdLmVuZCxpLmVuZD1pLnN0YXJ0K2kuZGlzdCk6KGkudGltZT10LnRpLGkuZWFzZT10LmVhKSxlLnN0ZXBzLnB1c2goaSl9KSksZS53cmFwcGVyRWwmJiFlLndyYXBwZXJFbC5pZCYmdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlVW5pcXVlSURGb3JFbChlKSx0X2FuaW1hdGlvblNCU19fdXBkYXRlSW5mb09uSW1nTG9hZChlLHQpLHRfYW5pbWF0aW9uU0JTX191cGRhdGVNb3ZlQW5kUm90YXRlU3RlcHNTdHlsZXMoZS5zdGVwcyl9fX0pKTt2YXIgZT10LmVsZW1lbnRzLmZpbHRlcigoZnVuY3Rpb24odCl7aWYoImlubmFjdGl2ZSI9PT10LnN0YXR1cyl7dmFyIGU9dF9hbmltYXRpb25TQlNfX2dldFNpemVCYXNlZE9uRGltZW5zaW9uTW9kZSh0KSxuPWUud2lkdGgsaT1lLmhlaWdodDt0LndyYXBwZXJFbCYmdC53cmFwcGVyRWwucmVtb3ZlQXR0cmlidXRlKCJzdHlsZSIpLHQud3JhcHBlckVsJiYodC53cmFwcGVyRWwuc3R5bGUuZGlzcGxheT0idGFibGUiKSx0LndyYXBwZXJFbCYmKHQud3JhcHBlckVsLnN0eWxlLndpZHRoPW4pLHQud3JhcHBlckVsJiYodC53cmFwcGVyRWwuc3R5bGUuaGVpZ2h0PWkpfXJldHVybiJpbm5hY3RpdmUiIT09dC5zdGF0dXN9KSk7dF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCwiZWxlbWVudHMiLGUpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZVVuaXF1ZUlERm9yRWwodCl7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQsIC50bi1hcnRib2FyZCIpLG49IiI7ZSYmKG49ZS5nZXRBdHRyaWJ1dGUoImRhdGEtcmVjb3JkLWlkIil8fGUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpO3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKXx8dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtaWQiKXx8dC5pZDt0LnVuaXF1ZUlEPSJzYnMtIituKyItIitpLHQud3JhcHBlckVsLmlkPXQudW5pcXVlSUR9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZUluZm9PbkltZ0xvYWQodCxlKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoImltZyIpO24mJihuLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX191cGRhdGVWYWx1ZXNBdGVySU1HTG9hZGluZyh0LGUpfSkpLG4uY29tcGxldGUmJnRfYW5pbWF0aW9uU0JTX191cGRhdGVWYWx1ZXNBdGVySU1HTG9hZGluZyh0LGUpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlVmFsdWVzQXRlcklNR0xvYWRpbmcodCxlKXt0X2FuaW1hdGlvblNCU19fc2V0QW5kQ2FjaGVFbFRvcFBvcyh0LGUpLCJzY3JvbGwiPT09dC5hbmltVHlwZSYmdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0ZXBzVmFsdWVzKHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVTdGVwc1ZhbHVlcyh0KXt0LnN0ZXBzLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7ZS5zdGFydD0wPT09bj90LnRvcE9mZnNldDp0LnN0ZXBzW24tMV0uZW5kLGUuZW5kPWUuc3RhcnQrZS5kaXN0fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKHQsZSl7dmFyIG49dF9hbmltYXRpb25TQlNfX2dldFpvb20odCksaSxhPVsic2Nyb2xsIiwiaW50b3ZpZXciLCJibG9ja2ludG92aWV3Il0uZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFuaW1UeXBlIT09ZX0pKTtpZighZS5pc0VkaXRNb2RlJiYhYSl7dmFyIHI9cGFyc2VJbnQodC5zdHlsZS50b3AsMTApO051bWJlci5pc05hTihyKSYmKHI9dC5vZmZzZXRUb3ApLHIrPXRfYW5pbWF0aW9uU0JTX19hY2N1bXVsYXRlUGFyZW50R3JvdXBPZmZzZXQodCksInNjcm9sbCIhPT10LmFuaW1UeXBlJiYiaW50b3ZpZXciIT09dC5hbmltVHlwZXx8d2luZG93LmlzT25seVNjYWxhYmxlfHx0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpfHwocio9bik7dmFyIG89dC5jbG9zZXN0KCIuciIpLHM9bz9vLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ6MCxsPW8mJnBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUobykucGFkZGluZ1RvcCwxMCl8fDA7dC5wYXJlbnRSZWNUb3BQb3M9cyx0LnRvcE9mZnNldD1zK3IrbCx0X2FuaW1hdGlvblNCU19fc2V0U2NhbGVkRGlmZmVyZW5jZSh0LG4pLHRfYW5pbWF0aW9uU0JTX19zZXRUcmlnZ2VyT2Zmc2V0KHQpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWNjdW11bGF0ZVBhcmVudEdyb3VwT2Zmc2V0KHQpe2Zvcih2YXIgZT0wLG49dC5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO247KWUrPXBhcnNlSW50KG4uc3R5bGUudG9wLDEwKXx8MCxuPW4ucGFyZW50RWxlbWVudC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtyZXR1cm4gZX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0U2NhbGVkRGlmZmVyZW5jZSh0LGUpe2lmKCF0LnNjYWxlZERpZmZlcmVuY2UmJndpbmRvdy5pc09ubHlTY2FsYWJsZSYmImZpeGVkIiE9PXQud3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uJiZ0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpKXt2YXIgbj10LndyYXBwZXJFbD90LndyYXBwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ6MCxpPU1hdGguYWJzKChuKmUtbikvMik7aT1NYXRoLnJvdW5kKGkpLHQuc2NhbGVkRGlmZmVyZW5jZT1pfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWRkRGVsYXlUb1N0ZXBzKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgbj10W2VdO2lmKDAhPT1lJiYocGFyc2VJbnQobi5kZCwxMCl8fHBhcnNlSW50KG4uZHQsMTApKSl7dmFyIGk9T2JqZWN0LmNyZWF0ZSh0W2UtMV0pO3ZvaWQgMCE9PW4uZHQ/aS50aT1uLmR0OmkuZGk9bi5kZCx0LnNwbGljZShlLDAsaSksZSsrfX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZU1vdmVBbmRSb3RhdGVTdGVwc1N0eWxlcyh0KXt2YXIgZT10WzBdLnN0eWxlcy5tb3ZlWCxuPXRbMF0uc3R5bGVzLm1vdmVZLGk9dFswXS5zdHlsZXMucm90YXRlO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGE9dC5zdHlsZXM7YS5tb3ZlWC09ZSxlKz1hLm1vdmVYLGEubW92ZVktPW4sbis9YS5tb3ZlWSxhLnJvdGF0ZS09aSxpKz1hLnJvdGF0ZX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY3JlYXRlU3RlcFN0eWxlcyh0KXtyZXR1cm57bW92ZVg6cGFyc2VJbnQodC5teCwxMCl8fDAsbW92ZVk6cGFyc2VJbnQodC5teSwxMCl8fDAsc2NhbGVYOmlzTmFOKHBhcnNlRmxvYXQodC5zeCkpPzE6cGFyc2VGbG9hdCh0LnN4KSxzY2FsZVk6aXNOYU4ocGFyc2VGbG9hdCh0LnN5KSk/MTpwYXJzZUZsb2F0KHQuc3kpLG9wYWNpdHk6aXNOYU4ocGFyc2VGbG9hdCh0Lm9wKSk/MTpwYXJzZUZsb2F0KHQub3ApLHJvdGF0ZTpwYXJzZUludCh0LnJvLDEwKXx8MCxibHVyOnBhcnNlSW50KHQuYmwsMTApfHwwLGZpeDoiZml4ZWQiPT09dC5maX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldFRyaWdnZXJPZmZzZXQodCl7dmFyIGU9d2luZG93LmlubmVySGVpZ2h0LG49dF9hbmltYXRpb25TQlNfX2dldFpvb20odCk7dC50cmlnZ2VyT2Zmc2V0PXBhcnNlSW50KHRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyh0LCJwdWJsaXNoZWQiLCJzYnMtdHJnb2ZzdCIpLDEwKSwod2luZG93LmlzT25seVNjYWxhYmxlfHwic2Nyb2xsIj09PXQuYW5pbVR5cGV8fHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCkpJiYodC50cmlnZ2VyT2Zmc2V0Kj1uKSx0LnRyaWdnZXJPZmZzZXR8fCh0LnRyaWdnZXJPZmZzZXQ9MCksLjUhPT10LnRyaWdnZXImJjEhPT10LnRyaWdnZXJ8fCh0LnRyaWdnZXJPZmZzZXQrPWUqdC50cmlnZ2VyLCgiaW50b3ZpZXciPT09dC5hbmltVHlwZXx8InNjcm9sbCI9PT10LmFuaW1UeXBlKSYmdC50cmlnZ2VyT2Zmc2V0PnQudG9wT2Zmc2V0JiZ0LnRyaWdnZXJPZmZzZXQ8PWUqdC50cmlnZ2VyJiYodC50cmlnZ2VyT2Zmc2V0PXQudG9wT2Zmc2V0LHQuc2NhbGVkRGlmZmVyZW5jZSYmKHQudHJpZ2dlck9mZnNldDwwfHx0LnRyaWdnZXJPZmZzZXQ9PT10LnNjYWxlZERpZmZlcmVuY2UpJiYodC5zY2FsZWREaWZmZXJlbmNlPTApKSwiYmxvY2tpbnRvdmlldyI9PT10LmFuaW1UeXBlJiZ0LnRyaWdnZXJPZmZzZXQ+dC5wYXJlbnRSZWNUb3BQb3MmJnQudHJpZ2dlck9mZnNldDw9ZSp0LnRyaWdnZXImJih0LnRyaWdnZXJPZmZzZXQ9dC5wYXJlbnRSZWNUb3BQb3MpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdHJpZ2dlck5vU2Nyb2xsQW5pbWF0aW9uKHQsZSl7dF9hbmltYXRpb25TQlNfX3Byb2Nlc3NFbHNJbnRvVmlldyh0LGUpLHRfYW5pbWF0aW9uU0JTX19yZW1vdmVIb3ZlckNsaWNrVHJpZ2dlcnModCksdF9hbmltYXRpb25TQlNfX2luaXRDbGlja1RyaWdnZXJzKHQpLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2Vycyh0KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0Vsc0ludG9WaWV3KHQsZSl7dF9hbmltYXRpb25TQlNfX3VwZGF0ZUludG9WaWV3RWxzU3RhdGUoZSk7dmFyIG49MDt0X2FuaW1hdGlvblNCU19fc2V0S2V5Rm9yQW5pbWF0ZWRPYmplY3QodCwib25TY3JvbGxVcGRhdGVFbHNJbnRvVmlldyIsKGZ1bmN0aW9uKCl7bnx8KG49c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fdXBkYXRlSW50b1ZpZXdFbHNTdGF0ZShlKSxuPTB9KSwyMDApKX0pKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0Lm9uU2Nyb2xsVXBkYXRlRWxzSW50b1ZpZXcpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHQub25TY3JvbGxVcGRhdGVFbHNJbnRvVmlldyl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3JlbW92ZUhvdmVyQ2xpY2tUcmlnZ2Vycyh0KXt2YXIgZT1bImpzLXNicy1hbmltLXRyaWdnZXJfY2xpY2siLCJqcy1zYnMtYW5pbS10cmlnZ2VyX2hvdmVyIl0sbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuIitlLmpvaW4oIiwgLiIpKTtuLmxlbmd0aCYmKChuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG4pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY2xhc3NMaXN0LnJlbW92ZShlKX0pKX0pKSx0LmNsaWNrZWRUcmlnZ2VyRWxzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tDYWxsYmFjayksdF9hbmltYXRpb25TQlNfX3JlbW92ZVRyaWdnZXJMaXN0KHQsImNsaWNrIil9KSksdC5ob3ZlclRyaWdnZXJFbHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHRfYW5pbWF0aW9uU0JTX19yZW1vdmVUcmlnZ2VyTGlzdCh0LCJob3ZlciIpfSkpLHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsImNsaWNrZWRUcmlnZ2VyRWxzIixbXSksdF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCwiaG92ZXJUcmlnZ2VyRWxzIixbXSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19yZW1vdmVUcmlnZ2VyTGlzdCh0LGUpe3RbInRyaWdnZXJMaXN0LW9uLSIrZV0mJih0WyJ0cmlnZ2VyTGlzdC1vbi0iK2VdPVtdKSx0WyJ0cmlnZ2VyT25jZUxpc3Qtb24tIitlXSYmKHRbInRyaWdnZXJPbmNlTGlzdC1vbi0iK2VdPVtdKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdENsaWNrVHJpZ2dlcnModCl7dmFyIGU9dC5lbGVtZW50cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiJjbGljayI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpfSkpO2lmKGUubGVuZ3RoKXt0X2FuaW1hdGlvblNCU19fY29ubmVjdFRyaWdnZXJzV2l0aEFuaW1FbHMoZSk7dmFyIG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXNicy1hbmltLXRyaWdnZXJfY2xpY2siKSk7aWYobi5sZW5ndGgpe2lmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgianMtc2JzLWFuaW0tdHJpZ2dlci1zdHlsZXMiKSl7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtpLmlkPSJqcy1zYnMtYW5pbS10cmlnZ2VyLXN0eWxlcyIsaS50ZXh0Q29udGVudD0iLmpzLXNicy1hbmltLXRyaWdnZXJfY2xpY2sgeyBjdXJzb3I6IHBvaW50ZXI7IH0iLGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLGkpfXQuY2xpY2tlZFRyaWdnZXJFbHM9bixuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfYW5pbWF0aW9uU0JTX19wcmV2ZW50QW5pbWF0ZWRQYXJlbnRUcmlnZ2VyKHQpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tDYWxsYmFjayksdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRDbGlja0NhbGxiYWNrKX0pKX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tDYWxsYmFjaygpe3ZhciB0PXRoaXNbInRyaWdnZXJMaXN0LW9uLWNsaWNrIl18fFtdLGU9dGhpc1sidHJpZ2dlck9uY2VMaXN0LW9uLWNsaWNrIl18fFtdOyh0Lmxlbmd0aHx8ZS5sZW5ndGgpJiYodF9hbmltYXRpb25TQlNfX3BsYXlPbmNlQW5pbWF0aW9uKHRoaXMsZSwiY2xpY2siKSx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKSYmIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3JldmVyc2VkIik/dF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uRW5kKHQpOnRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PblN0YXJ0KHQpfSkpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcGxheU9uY2VBbmltYXRpb24odCxlLG4pe2lmKGUmJmUubGVuZ3RoKXt0X2FuaW1hdGlvblNCU19fYWN0aW9uT25TdGFydChlKTt2YXIgaT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtpLmluaXRFdmVudCgidXBkYXRlQW5pbU9uY2UiLCEwLCEwKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZGlzcGF0Y2hFdmVudChpKX0pKSx0WyJ0cmlnZ2VyT25jZUxpc3Qtb24tIituXT1bXX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXJzKHQpe3ZhciBlPXQuZWxlbWVudHMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4iaG92ZXIiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKX0pKTtpZihlLmxlbmd0aCl7dF9hbmltYXRpb25TQlNfX2Nvbm5lY3RUcmlnZ2Vyc1dpdGhBbmltRWxzKGUpO3ZhciBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1zYnMtYW5pbS10cmlnZ2VyX2hvdmVyIik7bj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChuKSx0LmhvdmVyVHJpZ2dlckVscz1uLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dF9hbmltYXRpb25TQlNfX3ByZXZlbnRBbmltYXRlZFBhcmVudFRyaWdnZXIodCksd2luZG93LmFuaW1hdGlvblNCU19faXNJT1M/KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlcikpOih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSl9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcmV2ZW50QW5pbWF0ZWRQYXJlbnRUcmlnZ2VyKHQpe2lmKCJub25lIiE9PWdldENvbXB1dGVkU3R5bGUodCkucG9pbnRlckV2ZW50cyl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudG4tbW9sZWN1bGUsIC50bi1hdG9tIik7ZSYmKHQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsZS5zdHlsZS5wb2ludGVyRXZlbnRzPSJhdXRvIil9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKHQpe3ZhciBlPXQuY3VycmVudFRhcmdldCxuPXQuY3VycmVudFRhcmdldFsidHJpZ2dlckxpc3Qtb24taG92ZXIiXSxpPXQuY3VycmVudFRhcmdldFsidHJpZ2dlck9uY2VMaXN0LW9uLWhvdmVyIl07ZnVuY3Rpb24gYSh0KXtlLmNsb3Nlc3QoIi50Mzk2X19lbGVtIikhPT10LnRhcmdldC5jbG9zZXN0KCIudDM5Nl9fZWxlbSIpJiYodF9hbmltYXRpb25TQlNfX2FjdGlvbk9uRW5kKG4pLGUuY2xhc3NMaXN0LnJlbW92ZSgidC1ob3Zlci1tb2ItYWN0aXZlIiksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGEpKX0obiYmbi5sZW5ndGh8fGkmJmkubGVuZ3RoKSYmKHRfYW5pbWF0aW9uU0JTX19wbGF5T25jZUFuaW1hdGlvbihlLGksImhvdmVyIiksbiYmbi5sZW5ndGgmJigibW91c2VlbnRlciI9PT10LnR5cGUmJnRfYW5pbWF0aW9uU0JTX19hY3Rpb25PblN0YXJ0KG4pLCJtb3VzZWxlYXZlIj09PXQudHlwZSYmdF9hbmltYXRpb25TQlNfX2FjdGlvbk9uRW5kKG4pLCJjbGljayI9PT10LnR5cGUmJihlLmNsYXNzTGlzdC5jb250YWlucygidC1ob3Zlci1tb2ItYWN0aXZlIil8fChzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX19hY3Rpb25PblN0YXJ0KG4pLGUuY2xhc3NMaXN0LmFkZCgidC1ob3Zlci1tb2ItYWN0aXZlIil9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsYSl9KSkpKSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jb25uZWN0VHJpZ2dlcnNXaXRoQW5pbUVscyh0KXt2YXIgZT10WzBdLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dC50cmlnZ2VyRWxlbXM7aWYobil7dmFyIGk9bj9uLnNwbGl0KCIsIik6W10sYT10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLHI9YT9hLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpOiIiO2kuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIGk9cituLGE7dF9hbmltYXRpb25TQlNfX3Byb2Nlc3NUcmlnZ2Vyc0VsZW1MaXN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX18iK2krIiwgLnRuLWdyb3VwX18iK2kpLHQsZSl9KSl9ZWxzZXt2YXIgbzt0X2FuaW1hdGlvblNCU19fcHJvY2Vzc1RyaWdnZXJzRWxlbUxpc3QodC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLHQsZSl9fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzVHJpZ2dlcnNFbGVtTGlzdCh0LGUsbil7dmFyIGk7dCYmKCJvbmNlIj09PWUubG9vcD9lLmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9zdGFydGVkIil8fHRfYW5pbWF0aW9uU0JTX19pbml0VHJpZ2dlcnNMaXN0KHQsInRyaWdnZXJPbmNlTGlzdCIsbixlKTp0X2FuaW1hdGlvblNCU19faW5pdFRyaWdnZXJzTGlzdCh0LCJ0cmlnZ2VyTGlzdCIsbixlKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRUcmlnZ2Vyc0xpc3QodCxlLG4saSl7dFtlKyItb24tIituXT8tMT09PXRbZSsiLW9uLSIrbl0uaW5kZXhPZihpKSYmdFtlKyItb24tIituXS5wdXNoKGkpOnRbZSsiLW9uLSIrbl09W2ldLHRbZSsiLW9uLSIrbl0ubGVuZ3RoJiYhdC5jbGFzc0xpc3QuY29udGFpbnMoImpzLXNicy1hbmltLXRyaWdnZXJfIituKSYmdC5jbGFzc0xpc3QuYWRkKCJqcy1zYnMtYW5pbS10cmlnZ2VyXyIrbiksaS5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGVBbmltT25jZSIsKGZ1bmN0aW9uKCl7dFtlKyItb24tIituXT10W2UrIi1vbi0iK25dLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQhPT1pfSkpLHRbInRyaWdnZXJMaXN0LW9uLSIrbl0mJnRbInRyaWdnZXJMaXN0LW9uLSIrbl0ubGVuZ3RofHx0LmNsYXNzTGlzdC5yZW1vdmUoImpzLXNicy1hbmltLXRyaWdnZXJfIituKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWN0aW9uT25TdGFydCh0KXt0LmZvckVhY2godF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uU3RhcnQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PblN0YXJ0KHQpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3BsYXlpbmciKT90LnNldEF0dHJpYnV0ZSgiZGF0YS1wbGFubmVkLWRpciIsInBsYXkiKTp0X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0LCExKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWN0aW9uT25FbmQodCl7dC5mb3JFYWNoKHRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PbkVuZCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uRW5kKHQpe3ZhciBlPXQubG9vcCxuPSJub3JldmVyc2UiPT09ZSYmImhvdmVyIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50Iik7ZSYmLTEhPT1lLmluZGV4T2YoImxvb3AiKT90LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbml0ZXJhdGlvbiIsdF9hbmltYXRpb25TQlNfX3NldEl0ZXJhdGlvbkFuaW1hdGlvbik6dC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fcGxheWluZyIpJiYhbj90LnNldEF0dHJpYnV0ZSgiZGF0YS1wbGFubmVkLWRpciIsInJldmVyc2UiKTpufHx0X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0LCEwKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0SXRlcmF0aW9uQW5pbWF0aW9uKHQpe3ZhciBlPXQudGFyZ2V0LmNsb3Nlc3QoIi50Mzk2X19lbGVtIik7aWYoZSl7aWYoImxvb3B3aXRocmV2ZXJzZSI9PT1lLmxvb3Ape3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltYXRpb25GdWxsVGltZShlLCEwKSxpLGE7aWYoMWUzKnQuZWxhcHNlZFRpbWUvbiUyIT0wKXJldHVybn1lLmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fc3RhcnRlZCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9yZXZlcnNlZCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9wbGF5aW5nIiksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25pdGVyYXRpb24iLHRfYW5pbWF0aW9uU0JTX19zZXRJdGVyYXRpb25BbmltYXRpb24pfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kaW5nRXZlbnQpLHQuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kaW5nRXZlbnQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hbmltYXRpb25FbmRpbmdFdmVudCgpe3RoaXMuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9wbGF5aW5nIik7dmFyIHQ9dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtcGxhbm5lZC1kaXIiKTsicGxheSI9PT10JiZ0aGlzLmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9yZXZlcnNlZCIpP3RfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHRoaXMsITEpOiJyZXZlcnNlIiE9PXR8fHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3JldmVyc2VkIil8fHRfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHRoaXMsITApLHRoaXMuc2V0QXR0cmlidXRlKCJkYXRhLXBsYW5uZWQtZGlyIiwiIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEFuaW1hdGlvbkZ1bGxUaW1lKHQsZSl7dmFyIG4saTtyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtb3B0cyIpP0pTT04ucGFyc2UodC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtb3B0cyIpLnNwbGl0KCInIikuam9pbignIicpKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUmJih0Kz1wYXJzZUludChuLmR0LDEwKXx8MCksdCsocGFyc2VJbnQobi50aSwxMCl8fDApfSksMCk6MH1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0LGUpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9zdGFydGVkIiksZXx8dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3JldmVyc2VkIiksdF9hbmltYXRpb25TQlNfX2ZvcmNlUmVwYWludCh0KTt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0QW5pbWF0aW9uRnVsbFRpbWUodCwhMSksaT1bInQtc2JzLWFuaW1fc3RhcnRlZCJdO2UmJmkucHVzaCgidC1zYnMtYW5pbV9yZXZlcnNlZCIpLG4+MCYmaS5wdXNoKCJ0LXNicy1hbmltX3BsYXlpbmciKSxpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY2xhc3NMaXN0LmFkZChlKX0pKSx0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kKHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19mb3JjZVJlcGFpbnQodCl7dC5vZmZzZXRXaWR0aH1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlSW50b1ZpZXdFbHNTdGF0ZSh0KXt0JiZ0Lmxlbmd0aCYmdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT13aW5kb3cucGFnZVlPZmZzZXQrdC50cmlnZ2VyT2Zmc2V0LG49ImJsb2NraW50b3ZpZXciPT09dC5hbmltVHlwZT9lPj10LnBhcmVudFJlY1RvcFBvczplPj10LnRvcE9mZnNldCxpPXQuY2xvc2VzdCgiLnQzOTYiKS5wYXJlbnRFbGVtZW50LGEscj1bInQzOTdfX29mZiIsInQzOTVfX29mZiIsInQ0MDBfX29mZiJdLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBpLmNsYXNzTGlzdC5jb250YWlucyh0KX0pKTtuJiYhciYmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKXx8dC5jbGFzc0xpc3QuYWRkKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFpvb20odCl7aWYodm9pZCAwIT09dC5zY2FsZUZhY3RvcilyZXR1cm4gdC5zY2FsZUZhY3Rvcjt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpO2lmKCFlKXJldHVybiAxO3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIik7cmV0dXJuIGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZF9zY2FsZSIpfHwhd2luZG93LmFuaW1hdGlvblNCU19faXNPbGRQYWdlJiYidW5kZWZpbmVkIiE9dHlwZW9mIHQzOTZfYWJfX2dldEZpZWxkVmFsdWUmJiJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShlLCJ1cHNjYWxlIik/biYmd2luZG93LnRuWyJhYiIrbl0mJndpbmRvdy50blsiYWIiK25dLnNjYWxlRmFjdG9yfHx3aW5kb3cudG5fc2NhbGVfZmFjdG9yOjF9ZnVuY3Rpb24gdF9hbmltYXRlU2JzX193cmFwQXRvbUVscygpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtc2JzLWV2ZW50XSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpO2lmKGUmJiFlLmNsb3Nlc3QoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIikpe3RfYW5pbWF0aW9uU0JTX193cmFwRWwoZSwidG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO3ZhciBuPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpLGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuZ2V0UHJvcGVydHlWYWx1ZSgiYm9yZGVyLXJhZGl1cyIpO2lmKCJzaGFwZSI9PT1uJiZpJiZwYXJzZUludChpKSl7dmFyIGE9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO2EmJihhLnN0eWxlLmJvcmRlclJhZGl1cz1pKX19fSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZVNic19fY2FzaEVsc0luZm8odCl7dmFyIGU9dC5lbHM7dC50cmlnZ2VyRWxlbXNBdHRyTmFtZT0iZWRpdCI9PT10Lm1vZGU/ImRhdGEtZmllbGQtc2JzdHJnZWxzLXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy10cmdlbHMiLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSl7ZS5zdGF0ZT0idW5hY3RpdmUiLGUuYW5pbVR5cGU9ImVkaXQiPT09dC5tb2RlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXNic2V2ZW50LXZhbHVlIik6ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKSxlLmNoYW5nZVR5cGU9InNjcm9sbCI9PT1lLmFuaW1UeXBlPyJzY3JvbGwiOiJ0aW1lIixlLnRyaWdnZXI9ImVkaXQiPT09dC5tb2RlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXNic3RyZy12YWx1ZSIpOmUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLXRyZyIpLGUudHJpZ2dlcj1lLnRyaWdnZXI/ZS50cmlnZ2VyOjEsZS50cmlnZ2VyRWxlbXM9ZS5nZXRBdHRyaWJ1dGUodC50cmlnZ2VyRWxlbXNBdHRyTmFtZSksZS53cmFwcGVyRWw9ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLGUuc3RlcHM9W107dmFyIG49ImVkaXQiPT09dC5tb2RlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXNic29wdHMtdmFsdWUiKTplLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1vcHRzIik7aWYobil7LTEhPT1uLmluZGV4T2YoImZpeGVkIikmJihlLnpJbmRleD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5nZXRQcm9wZXJ0eVZhbHVlKCJ6LWluZGV4IikpLG49bi5yZXBsYWNlKC8nL2csJyInKTt2YXIgaT1KU09OLnBhcnNlKG4pO3RfYW5pbWF0aW9uU0JTX19hZGREZWxheVRvU3RlcHMoaSksZS5sb29wPSJlZGl0Ij09PXQubW9kZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC1zYnNsb29wLXZhbHVlIik6ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtbG9vcCIpLHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKGUsdCk7Zm9yKHZhciBhPTAscj0wO3I8aS5sZW5ndGg7cisrKXt2YXIgbz17c3RhdGU6InVuYWN0aXZlIn07by5zdHlsZXM9dF9hbmltYXRpb25TQlNfX2NyZWF0ZVN0ZXBTdHlsZXMoaVtyXSksInNjcm9sbCI9PT1lLmNoYW5nZVR5cGU/KG8ucHJldlVuZml4ZWREaXN0PWEsby5kaXN0PWlbcl0uZGksITE9PT1vLnN0eWxlcy5maXgmJihhKz1OdW1iZXIoby5kaXN0KSksby5zdGFydD0wPT09cj9lLnRvcE9mZnNldDplLnN0ZXBzW3ItMV0uZW5kLG8uZW5kPW8uc3RhcnQrMSpvLmRpc3QpOihvLnRpbWU9aVtyXS50aSxvLmVhc2U9aVtyXS5lYSksZS5zdGVwcy5wdXNoKG8pfXRfYW5pbWF0aW9uU0JTX191cGRhdGVJbmZvT25JbWdMb2FkKGUsdCksdF9hbmltYXRpb25TQlNfX3VwZGF0ZU1vdmVBbmRSb3RhdGVTdGVwc1N0eWxlcyhlLnN0ZXBzKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRlU2JzX19yZXNldCh0KXtmb3IodmFyIGU9dC5lbHMsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaT1lW25dLmFuaW1UeXBlO2lmKCJpbnRvdmlldyI9PT1pfHwiYmxvY2tpbnRvdmlldyI9PT1pfHwiY2xpY2siPT09aXx8ImhvdmVyIj09PWkpe2Vbbl0uY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9zdGFydGVkIik7dmFyIGE9ZVtuXS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO2EmJihhLnN0eWxlLm9wYWNpdHk9IiIpfWVsc2V7ZVtuXS5zdGF0ZT0icmVzZXRlZCI7dmFyIHI9ZVtuXS53cmFwcGVyRWw7ciYmKHIuc3R5bGUudHJhbnNmb3JtPSIiLHIuc3R5bGUucG9zaXRpb249IiIsci5zdHlsZS50b3A9IiIsci5zdHlsZS5vcGFjaXR5PSIiKX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRTaXplQmFzZWRPbkRpbWVuc2lvbk1vZGUodCl7aWYoIXQpcmV0dXJue3dpZHRoOiJpbmhlcml0IixoZWlnaHQ6ImluaGVyaXQifTt2YXIgZT10LnBhcmVudE5vZGUuY2xvc2VzdCgiLnRuLWdyb3VwIil8fHQucGFyZW50Tm9kZSxuLGksYTtyZXR1cm4gZSYmdDM5Nl9faXNGbGV4KGUpP3t3aWR0aDoiZmlsbCI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwid2lkdGhtb2RlIik/IjEwMCUiOiJpbmhlcml0IixoZWlnaHQ6ImZpbGwiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodG1vZGUiKT8iMTAwJSI6ImluaGVyaXQifTp7d2lkdGg6ImluaGVyaXQiLGhlaWdodDoiaW5oZXJpdCJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX193cmFwRWwodCxlKXtpZighdClyZXR1cm4hMTt2YXIgbj10LnBhcmVudE5vZGUsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxhPSJpbWFnZSI9PT10LnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpLHI9dF9hbmltYXRpb25TQlNfX2dldFNpemVCYXNlZE9uRGltZW5zaW9uTW9kZShuKSxvPXIud2lkdGgscz1yLmhlaWdodCxsPS9maXJlZm94fEZpcmVmb3gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7InN0cmluZyI9PXR5cGVvZiBlP2kuY2xhc3NMaXN0LmFkZChlKTplLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuY2xhc3NMaXN0LmFkZCh0KX0pKSxpLnN0eWxlLmRpc3BsYXk9YXx8bD8iaW5oZXJpdCI6InRhYmxlIixpLnN0eWxlLndpZHRoPW8saS5zdHlsZS5oZWlnaHQ9cyxpLmFwcGVuZENoaWxkKHQpLG4mJm4uYXBwZW5kQ2hpbGQoaSl9d2luZG93LnRfYW5pbWF0aW9uU0JTX19pc0ZpcmVmb3g9LTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LnNlYXJjaCgiRmlyZWZveCIpLHdpbmRvdy50X2FuaW1hdGlvblNCU19faXNTYWZhcmk9L14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx3aW5kb3cuYW5pbWF0aW9uU0JTX19pc0lPUz0vaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fCJvbnRvdWNoZW5kImluIGRvY3VtZW50JiYvTWFjaW50b3NoLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy5hbmltYXRpb25TQlNfX2lzT2xkUGFnZT1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMqPSJ0aWxkYS1ibG9ja3MtMi43Il0nKSksInZpc2libGUiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlPyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dF9hbmltYXRpb25TQlNfX2luaXQoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0X2FuaW1hdGlvblNCU19faW5pdCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdF9hbmltYXRpb25TQlNfX2NoZWNrVmlzaWJpbGl0eVBhZ2UpOwoKZnVuY3Rpb24gdDM5Nl9zY2FsZUJsb2NrKGUpe3ZhciB0PXQzOTZfZGV0ZWN0UmVzb2x1dGlvbihlKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpO2lmKGEpe3ZhciBsOyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yP2w9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKGUpOihsPXdpbmRvdy50biYmd2luZG93LnRuWyJhYiIrZV0mJndpbmRvdy50blsiYWIiK2VdLnNjYWxlRmFjdG9yKXx8KGw9d2luZG93LnRuX3NjYWxlX2ZhY3Rvcik7dmFyIG49YS5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKSxvPXQzOTZfc2NhbGVfX2NvbGxlY3RTY2FsZURhdGEobixsKTtpZihuJiYwIT09by5sZW5ndGgpe3ZhciByPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobiwiaGVpZ2h0IiksYz1NYXRoLmZsb29yKHIqbCksaSxfO2lmKHQzOTZfYWJfX2dldEZpZWxkVmFsdWUobiwiaGVpZ2h0X3ZoIikpe3ZhciBzPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobiwiaGVpZ2h0IiksZD10Mzk2X2FiX19nZXRIZWlnaHQobiksdT1zKmw7Yz11Pj1kP3U6ZH1pZih0Mzk2X3NjYWxlX191cGRhdGVBcnRib2FyZFN0YXRlKG4sYyksdDM5Nl9pc09ubHlTY2FsYWJsZUJyb3dzZXIoKSl0Mzk2X3NjYWxlX19zY2FsZUlzT25seVNjYWxhYmxlQmxvY2sobyk7ZWxzZXt2YXIgbT1vLmZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5lbGVtVHlwZTtyZXR1cm4idGV4dCI9PT10fHwiYnV0dG9uIj09PXR9KSksaD1vLmZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuInNoYXBlIj09PWUuZWxlbVR5cGV9KSkscD0vXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO3AmJnQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVRleHRFbGVtZW50cyhtKSx0Mzk2X3NjYWxlX19zY2hlZHVsZV9fc2NhbGVTaGFwZUVsZW1lbnRzKGgpLG8uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGE9ZS5lbGVtZW50LG49ZS5lbGVtZW50Q29yZSxvPWUuZWxlbVR5cGUscj0iZ2FsbGVyeSI9PT1vOyJ5ZXMiPT09YS5nZXRBdHRyaWJ1dGUoImRhdGEtc2NhbGUtb2ZmIil8fHJ8fChhLnN0eWxlLnpvb209bCksciYmKGEuc3R5bGUuem9vbT1udWxsKSwidGV4dCI9PT1vJiZ0PDEyMDAmJm4mJiFwJiYobi5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD0iYXV0byIpLG4mJihuLnN0eWxlLnRyYW5zZm9ybU9yaWdpbj0iY2VudGVyIil9KSl9fX19ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NoZWR1bGVfX3NjYWxlVGV4dEVsZW1lbnRzKGUpe3dpbmRvdy50bnx8KHdpbmRvdy50bj17fSksd2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlfHwod2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlPVtdKSx3aW5kb3cudG4uc2NoZWR1bGVkVGV4dEVsZW1lbnRzRm9yU2NhbGU9d2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlLmNvbmNhdChlKSxjbGVhclRpbWVvdXQod2luZG93LnRuLnRleHRFbGVtZW50c1NjYWxlVGltZXIpLHdpbmRvdy50bi50ZXh0RWxlbWVudHNTY2FsZVRpbWVyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dDM5Nl9zY2FsZV9fc2NhbGVUZXh0RWxlbWVudHMod2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlKSx3aW5kb3cudG4uc2NoZWR1bGVkVGV4dEVsZW1lbnRzRm9yU2NhbGU9W119KSwxKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19zY2FsZVRleHRFbGVtZW50cyhlKXt2YXIgdD10Mzk2X19pbml0RmFzdERPTSgpO3Qud3JpdGUoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmVsZW1lbnQuc3R5bGUuem9vbT0iIn0pKX0pKSx0LnJlYWQoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNhY2hlZEZvbnRTaXplPXBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShlLmVsZW1lbnRDb3JlKS5mb250U2l6ZSksZS5jYWNoZWRUZXh0U2l6ZUFkanVzdD1lLmVsZW1lbnRDb3JlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0fSkpfSkpLHQud3JpdGUoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmVsZW1lbnRDb3JlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSJub25lIixlLmVsZW1lbnQuc3R5bGUuem9vbT1lLnNjYWxlRmFjdG9yfSkpfSkpLHQucmVhZCgoZnVuY3Rpb24oKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuY3VycmVudEZvbnRTaXplPXBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShlLmVsZW1lbnRDb3JlKS5mb250U2l6ZSl9KSl9KSksdC53cml0ZSgoZnVuY3Rpb24oKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PU1hdGguYWJzKGUuY2FjaGVkRm9udFNpemUtZS5jdXJyZW50Rm9udFNpemUpO2UuZWxlbWVudENvcmUuc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9dD49MT8ibm9uZSI6ZS5jYWNoZWRUZXh0U2l6ZUFkanVzdCx0Pj0xJiYoZS5lbGVtZW50Q29yZS5zdHlsZS5mb250U2l6ZT1NYXRoLnJvdW5kKGUuY2FjaGVkRm9udFNpemUqZS5zY2FsZUZhY3RvcikrInB4Iil9KSl9KSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NoZWR1bGVfX3NjYWxlU2hhcGVFbGVtZW50cyhlKXt3aW5kb3cudG58fCh3aW5kb3cudG49e30pLHdpbmRvdy50bi5zY2hlZHVsZWRTaGFwZUVsZW1lbnRzRm9yU2NhbGV8fCh3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlPVtdKSx3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlPXdpbmRvdy50bi5zY2hlZHVsZWRTaGFwZUVsZW1lbnRzRm9yU2NhbGUuY29uY2F0KGUpLGNsZWFyVGltZW91dCh3aW5kb3cudG4uc2hhcGVFbGVtZW50c1NjYWxlVGltZXIpLHdpbmRvdy50bi5zaGFwZUVsZW1lbnRzU2NhbGVUaW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfc2NhbGVfX3NjYWxlU2hhcGVFbGVtZW50cyh3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlKSx3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlPVtdfSksMSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NhbGVTaGFwZUVsZW1lbnRzKGUpe3ZhciB0PXQzOTZfX2luaXRGYXN0RE9NKCk7dC5yZWFkKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUuZWxlbWVudCwiaGVpZ2h0Iik7dD10Mzk2X2VsZW1fX2dldEhlaWdodChlLmVsZW1lbnQsdCksdD10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZS5lbGVtZW50LCJoZWlnaHQiLHQpO3ZhciBhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLmVsZW1lbnQsIndpZHRoIik7YT10Mzk2X2VsZW1fX2dldFdpZHRoKGUuZWxlbWVudCxhKSxhPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLmVsZW1lbnQsIndpZHRoIixhKTt2YXIgbD1wYXJzZUZsb2F0KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLmVsZW1lbnQsInRvcCIpKTtsPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLmVsZW1lbnQsInRvcCIsbCk7dmFyIG49cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZS5lbGVtZW50LCJsZWZ0IikpO249dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUuZWxlbWVudCwibGVmdCIsbiksZS5zaGFwZVNpemU9e3RvcDpsLGxlZnQ6bix3aWR0aDphLGhlaWdodDp0fX0pKX0pKTt2YXIgYT1lLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2hhcGVTaXplLndpZHRoPD0yfHxlLnNoYXBlU2l6ZS5oZWlnaHQ8PTJ9KSk7dC5yZWFkKChmdW5jdGlvbigpe2EuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZS5lbGVtZW50Q29yZSk7ZS5ib3JkZXJXaWR0aD10LmJvcmRlcldpZHRoLGUuaXNJbWFnZT0ibm9uZSIhPT10LmJhY2tncm91bmRJbWFnZSxlLmlzQW5pbWF0ZWQ9ZS5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpfSkpfSkpLHQud3JpdGUoKGZ1bmN0aW9uKCl7YS5mb3JFYWNoKChmdW5jdGlvbihlKXtpZigiMHB4Ij09PWUuYm9yZGVyV2lkdGgmJiFlLmlzSW1hZ2UmJiFlLmlzQW5pbWF0ZWQpe2UuZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiem9vbSIpO3ZhciB0PWUuc2hhcGVTaXplLndpZHRoKmUuc2NhbGVGYWN0b3IsYT1lLnNoYXBlU2l6ZS5oZWlnaHQqZS5zY2FsZUZhY3RvcixsPWUuc2hhcGVTaXplLnRvcCplLnNjYWxlRmFjdG9yLG49ZS5zaGFwZVNpemUubGVmdCplLnNjYWxlRmFjdG9yO2UuZWxlbWVudC5zdHlsZS53aWR0aD1wYXJzZUZsb2F0KHQpKyJweCIsZS5lbGVtZW50LnN0eWxlLmhlaWdodD1wYXJzZUZsb2F0KGEpKyJweCIsZS5lbGVtZW50LnN0eWxlLnRvcD1NYXRoLnJvdW5kKGwpKyJweCIsZS5lbGVtZW50LnN0eWxlLmxlZnQ9TWF0aC5yb3VuZChuKSsicHgiLGUuZWxlbWVudC5zZXRBdHRyaWJ1dGUoImRhdGEtc2NhbGUtb2ZmIiwieWVzIil9fSkpfSkpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX2NvbGxlY3RTY2FsZURhdGEoZSx0KXt2YXIgYTtyZXR1cm4gdDM5Nl9zY2FsZV9fZ2V0RWxlbWVudHNUb1NjYWxlKGUpLm1hcCgoZnVuY3Rpb24oZSl7dmFyIGE9ZS5xdWVyeVNlbGVjdG9yKCIudG4tbW9sZWN1bGUsIC50bi1hdG9tIiksbD10Mzk2X3NjYWxlX19nZXRFbGVtZW50VHlwZShlKSxuPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJjb250YWluZXIiKTtpZihufHwiZ3JvdXAiIT09bHx8KG49ImdyaWQiKSxhJiYiZ3JpZCI9PT1uKXJldHVybntlbGVtZW50OmUsZWxlbWVudENvcmU6YSxlbGVtVHlwZTpsLHNjYWxlRmFjdG9yOnR9fSkpLmZpbHRlcihCb29sZWFuKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19zY2FsZUlzT25seVNjYWxhYmxlQmxvY2soZSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1lLmVsZW1lbnQsYT1lLmVsZW1lbnRDb3JlLGw9ZS5lbGVtVHlwZSxuPWEuY2xvc2VzdCgiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKTtufHwodDM5Nl9zY2FsZV9fd3JhcEVsZW1lbnQoYSxjdXJyZW50U2NhbGVGYWN0b3IsInRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKSxuPWEuY2xvc2VzdCgiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKSksdC5zdHlsZS56b29tPSIiLHQzOTZfc2NhbGVfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlcih0LGEsbiksdDM5Nl9zY2FsZV9fcHJvY2Vzc0JhY2tncm91bmRGb3JTaGFwZSh0LGEsbCxjdXJyZW50U2NhbGVGYWN0b3IpfSkpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX2dldEVsZW1lbnRzVG9TY2FsZShlKXtyZXR1cm4gZT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmNoaWxkcmVuKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlJiYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2VsZW0iKXx8ZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwIikpfSkpOltdfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3VwZGF0ZUFydGJvYXJkU3RhdGUoZSx0KXtlLmNsYXNzTGlzdC5hZGQoInQzOTZfX2FydGJvYXJkX3NjYWxlIik7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxsO2lmKCEoImh1ZyI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHRtb2RlIikpKXt2YXIgbj0nPHN0eWxlIGNsYXNzPSJ0Mzk2X19zY2FsZS1zdHlsZSI+LnQtcmVjI3JlYycrYSsiIHsgb3ZlcmZsb3c6IHZpc2libGU7IH0jcmVjIithKyIgLnQzOTZfX2FydGJvYXJkOm5vdCgudDM5Nl9fYXJ0Ym9hcmQtZmxleCksI3JlYyIrYSsiIC50Mzk2X19hcnRib2FyZDpub3QoLnQzOTZfX2FydGJvYXJkLWZsZXgpIC50Mzk2X19jYXJyaWVyLCNyZWMiK2ErIiAudDM5Nl9fYXJ0Ym9hcmQ6bm90KC50Mzk2X19hcnRib2FyZC1mbGV4KSAudDM5Nl9fZmlsdGVyIHsgd2lkdGg6IDEwMHZ3ICFpbXBvcnRhbnQ7IG1heC13aWR0aDogMTAwJTt9I3JlYyIrYSsiIC50Mzk2X19jYXJyaWVyLCNyZWMiK2ErIiAudDM5Nl9fZmlsdGVyLCNyZWMiK2ErIiAudDM5Nl9fYXJ0Ym9hcmQge2hlaWdodDogIit0KyJweCAhaW1wb3J0YW50O308L3N0eWxlPiI7ZS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsbil9fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3dyYXBFbGVtZW50KGUsdCxhKXtpZihlKXt2YXIgbD1lLnBhcmVudE5vZGU7aWYobCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bi5jbGFzc0xpc3QuYWRkKGEpLG4uc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgiK3QrIikiLG4uYXBwZW5kQ2hpbGQoZSksbC5hcHBlbmRDaGlsZChuKX19fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlcihlLHQsYSl7Im5vbmUiPT09ZS5zdHlsZS5iYWNrZHJvcEZpbHRlciYmKGUuc3R5bGUuYmFja2Ryb3BGaWx0ZXI9IiIpO3ZhciBsPWdldENvbXB1dGVkU3R5bGUoZSkuYmFja2Ryb3BGaWx0ZXI7aWYobCl7ZS5zdHlsZS5iYWNrZHJvcEZpbHRlcj0ibm9uZSIsYS5zdHlsZS5iYWNrZHJvcEZpbHRlcj1sO3ZhciBuPWdldENvbXB1dGVkU3R5bGUodCkuYm9yZGVyUmFkaXVzOyIwcHgiIT09biYmKGEuc3R5bGUuYm9yZGVyUmFkaXVzPW4pfX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19wcm9jZXNzQmFja2dyb3VuZEZvclNoYXBlKGUsdCxhLGwpe2lmKCJzaGFwZSI9PT1hKXt2YXIgbj10JiZnZXRDb21wdXRlZFN0eWxlKHQpLG87aWYobilpZigobiYmbi5iYWNrZ3JvdW5kSW1hZ2V8fHQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsIikpJiYiZml4ZWQiPT09bi5iYWNrZ3JvdW5kQXR0YWNobWVudCl7ZS5yZW1vdmVDaGlsZCh0LnBhcmVudE5vZGUpLGUuYXBwZW5kQ2hpbGQodCk7dmFyIHI9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImhlaWdodCIpO3I9dDM5Nl9lbGVtX19nZXRIZWlnaHQoZSxyKSxyPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLCJoZWlnaHQiLHIpO3ZhciBjPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJ3aWR0aCIpO2M9dDM5Nl9lbGVtX19nZXRXaWR0aChlLGMpLGM9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUsIndpZHRoIixjKTt2YXIgaT1wYXJzZUZsb2F0KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJ0b3AiKSksXz1wYXJzZUZsb2F0KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJsZWZ0IikpO2Uuc3R5bGUudG9wPWkqbCsicHgiLGUuc3R5bGUubGVmdD1fKmwrInB4IixlLnN0eWxlLmhlaWdodD1yKmwrInB4IixlLnN0eWxlLndpZHRoPWMqbCsicHgiLGUuc2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIsInllcyIpfX19ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fZ2V0RWxlbWVudFR5cGUoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7cmV0dXJuIXQmJmUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1ncm91cCIpJiYodD0iZ3JvdXAiKSx0fXdpbmRvdy50Mzk2X2luaXRpYWxTY2FsZXx8KHdpbmRvdy50Mzk2X2luaXRpYWxTY2FsZT1mdW5jdGlvbigpe30pOwoKd2luZG93LlRpbGRhPXdpbmRvdy5UaWxkYXx8e30sZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dmFyIGU9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLHQ9LTEhPT1lLmluZGV4T2YoIm1zaWUiKSYmcGFyc2VJbnQoZS5zcGxpdCgibXNpZSIpWzFdKTtpZig4PT09dHx8OT09PXQpe3ZhciByPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWJ0biIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKTtlLnF1ZXJ5U2VsZWN0b3IoInRhYmxlIikmJnQmJi0xPT09dC5pbmRleE9mKCIjcG9wdXA6IikmJi0xPT09dC5pbmRleE9mKCIjcHJpY2U6IikmJmUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldC5nZXRBdHRyaWJ1dGUoImhyZWYiKTtlLnByZXZlbnREZWZhdWx0KCksd2luZG93LmxvY2F0aW9uLmhyZWY9dH0pKX0pKX10cnl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxpPWE/YS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY29va2llIik6bnVsbDthJiYibm8iPT09aXx8VGlsZGEuc2F2ZVVUTSgpfWNhdGNoKG4pe312YXIgbz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuciIpO2Z1bmN0aW9uIGMoZSl7dmFyIHQ9ZS50YXJnZXQuY2xvc2VzdCgiYS5qcy1jbGljay1zdGF0Iil8fGUudGFyZ2V0LmNsb3Nlc3QoIi5qcy1jbGljay16ZXJvLXN0YXQiKTtpZihlLnRhcmdldCYmdCl7dmFyIHI9ZS5jdXJyZW50VGFyZ2V0LGE7aWYodC5jbG9zZXN0KCIuciIpIT09cilyZXR1cm47dmFyIGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtZXZlbnQtbmFtZSIpLG89dC50ZXh0Q29udGVudCxjPXQuZ2V0QXR0cmlidXRlKCJocmVmIil8fCIiLGQ9dC5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLG47aWYoIWkpaT0iL3RpbGRhL2NsaWNrLyIrKHI/ci5nZXRBdHRyaWJ1dGUoImlkIik6IiIpKyIvP3VybD0iK2M7aWYoVGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzKGksbyksImh0dHAiPT09Yy5zdWJzdHJpbmcoMCw0KSYmLTE9PT1jLmluZGV4T2YoIi50eXBlZm9ybS5jb20vIikpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy5vcGVuKGMsIl9ibGFuayI9PT1kPyJfYmxhbmsiOiJfc2VsZiIpfSksIl9ibGFuayI9PT1kPzA6MzAwKSxlLnByZXZlbnREZWZhdWx0KCksITF9fUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24oZSl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsYyksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsYyl9KSk7dmFyIGQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQuanMtYW1vdW50Iik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkLChmdW5jdGlvbihlKXt2YXIgdD1lLnZhbHVlO3Q9dC5yZXBsYWNlKC8sL2csIi4iKSx0PXBhcnNlRmxvYXQodC5yZXBsYWNlKC9bXjAtOVwuXS9nLCIiKSksZS52YWx1ZT10fSkpfVRpbGRhLnNlbmRFY29tbWVyY2VFdmVudD1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXR8fDA9PT10Lmxlbmd0aClyZXR1cm4hMTtpZih2b2lkIDA9PT1lfHwiYWRkIiE9PWUmJiJyZW1vdmUiIT09ZSYmInB1cmNoYXNlIiE9PWUmJiJkZXRhaWwiIT09ZSlyZXR1cm4hMTtmb3IodmFyIHIsYT0iIixpPTAsbz1bXSxjLGQsbj0iIixtPSIiLGw9IiIsdT0wO3U8dC5sZW5ndGg7dSsrKXthPiIiJiYoYSs9IiwgIiksYSs9KGQ9dFt1XSkubmFtZSxpKz1kLnByaWNlLGM9IiIsdm9pZCAwIT09ZC5vcHRpb25zJiZkLm9wdGlvbnMubGVuZ3RoPjAmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZC5vcHRpb25zLChmdW5jdGlvbihlKXtjKz1lLm9wdGlvbisiOiAiK2UudmFyaWFudCsiOyAifSkpO3ZhciBwPXtuYW1lOmQubmFtZSxwcmljZTpkLnByaWNlLHZhcmlhbnQ6YyxxdWFudGl0eToxfTtkLmlkJiZkLmlkPjAmJihpZD1kLmlkLHAuaWQ9ZC5pZCksZC51aWQmJmQudWlkPjAmJihtPWQudWlkLHAudWlkPWQudWlkKSxkLnJlY2lkJiZkLnJlY2lkPjAmJihuPWQucmVjaWQscC5yZWNpZD1kLnJlY2lkKSxkLmxpZCYmZC5saWQ+MCYmKGw9ZC5saWQscC5saWQ9ZC5saWQpLGQuc2t1JiZkLnNrdT4wJiYocC5za3U9ZC5za3UpLG9bby5sZW5ndGhdPXB9dmFyIHA7ImFkZCIhPT1lJiYicmVtb3ZlIiE9PWV8fChyPSIvdGlsZGEvY2FydC8iK2UrIi8iLG4+MCYmKHIrPSIiK24pLG0+MD9yKz0iLXUiK206bD4wJiYocis9Ii0iK2wpKSwiZGV0YWlsIj09PWUmJihyPSIvdGlsZGEvcHJvZHVjdC9kZXRhaWwvIixtPjA/cis9bSsiLyI6KG4+MCYmKHIrPSJyIituKSxsPjAmJihyKz0iLWwiK2wpKSksInB1cmNoYXNlIj09PWUmJihyPSIvdGlsZGEvcmVjIituKyIvcGF5bWVudC8iKSwocD17ZWNvbW1lcmNlOnt9fSkuZWNvbW1lcmNlW2VdPXtwcm9kdWN0czpvfSxUaWxkYS5zZW5kRXZlbnRUb1N0YXRpc3RpY3MocixhLHAsaSl9LFRpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcz1mdW5jdGlvbihlLHQscixhKXt2YXIgaT0iLyI9PT1lLnN1YnN0cmluZygwLDEpLG89W10sYyxkOyhjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikpJiYoZD1udWxsIT09Yy5nZXRBdHRyaWJ1dGUoImRhdGEtZmItZXZlbnQiKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS1mYi1ldmVudCIpOndpbmRvdy5qUXVlcnkmJnZvaWQgMCE9PWpRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJmYi1ldmVudCIpP2pRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJmYi1ldmVudCIpOm51bGwpO3ZhciBuPSEoIWR8fCJub3NlbmQiIT09ZCksbT1jP2MuZ2V0QXR0cmlidXRlKCJkYXRhLXZrLWV2ZW50Iik6bnVsbDtjJiYobT1udWxsIT09Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdmstZXZlbnQiKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS12ay1ldmVudCIpOndpbmRvdy5qUXVlcnkmJnZvaWQgMCE9PWpRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJ2ay1ldmVudCIpP2pRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJ2ay1ldmVudCIpOm51bGwpO3ZhciBsPSEoIW18fCJub3NlbmQiIT09bSksdT0iIixwPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50NzA2Iik7aWYodT1jLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1jdXJyZW5jeSIpP2MuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWN1cnJlbmN5Iik6cCYmcC5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvamVjdC1jdXJyZW5jeS1jb2RlIik/cC5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvamVjdC1jdXJyZW5jeS1jb2RlIik6IlJVQiIscnx8KHI9d2luZG93LmxvY2F0aW9uLmhyZWYpLChhPWE/cGFyc2VGbG9hdChhKTowKT4wKWlmKHdpbmRvdy5kYXRhTGF5ZXJ8fCh3aW5kb3cuZGF0YUxheWVyPVtdKSwtMSE9PWUuaW5kZXhPZigiL3RpbGRhLyIpJiYtMSE9PWUuaW5kZXhPZigiL3BheW1lbnQvIikmJndpbmRvdy50aWxkYUZvcm0mJndpbmRvdy50aWxkYUZvcm0ub3JkZXJJZEZvclN0YXQ+IiIpcj17ZWNvbW1lcmNlOntwdXJjaGFzZTp7YWN0aW9uRmllbGQ6e2lkOndpbmRvdy50aWxkYUZvcm0ub3JkZXJJZEZvclN0YXQscmV2ZW51ZTp3aW5kb3cudGlsZGFGb3JtLmFtb3VudEZvclN0YXR9LHByb2R1Y3RzOndpbmRvdy50aWxkYUZvcm0uYXJQcm9kdWN0c0ZvclN0YXR9fX0sd2luZG93LnRpbGRhRm9ybS50aWxkYXBheW1lbnQmJndpbmRvdy50aWxkYUZvcm0udGlsZGFwYXltZW50LnByb21vY29kZSYmKHIuZWNvbW1lcmNlLnB1cmNoYXNlLmFjdGlvbkZpZWxkLmNvdXBvbj13aW5kb3cudGlsZGFGb3JtLnRpbGRhcGF5bWVudC5wcm9tb2NvZGUpLHIuZXZlbnQ9InB1cmNoYXNlIjtlbHNlIGlmKHImJnIuZWNvbW1lcmNlJiYoci5lY29tbWVyY2UuYWRkJiZyLmVjb21tZXJjZS5hZGQucHJvZHVjdHM/bz1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHM6ci5lY29tbWVyY2UucmVtb3ZlJiZyLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHM/bz1yLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHM6ci5lY29tbWVyY2UuZGV0YWlsJiZyLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMmJihvPXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cyksbyYmby5sZW5ndGg+MCkpe2Zvcih2YXIgcz0wO3M8by5sZW5ndGg7cysrKW9bc10uaWR8fChvW3NdLnVpZD9vW3NdLmlkPW9bc10udWlkOm9bc10uc2t1P29bc10uaWQ9b1tzXS5za3U6b1tzXS5yZWNpZCYmb1tzXS5saWQmJihvW3NdLmlkPW9bc10ucmVjaWQrIl8iK29bc10ubGlkKSk7ci5lY29tbWVyY2UuYWRkJiZyLmVjb21tZXJjZS5hZGQucHJvZHVjdHM/KHIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cz1vLHIuZXZlbnQ9ImFkZFRvQ2FydCIpOnIuZWNvbW1lcmNlLnJlbW92ZSYmci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzPyhyLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHM9byxyLmV2ZW50PSJyZW1vdmVGcm9tQ2FydCIpOnIuZWNvbW1lcmNlLmRldGFpbCYmci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzPyhyLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHM9byxyLmV2ZW50PSJ2aWV3UHJvZHVjdCIpOihpPyhyLmV2ZW50PSJwYWdlVmlldyIsci5ldmVudEFjdGlvbj1lKTpyLmV2ZW50PWUsci50aXRsZT10LHIudmFsdWU9YSl9dm9pZCAwIT09d2luZG93LmRhdGFMYXllciYmKGk/YT4wP3ImJnIuZWNvbW1lcmNlP3dpbmRvdy5kYXRhTGF5ZXIucHVzaChyKTp3aW5kb3cuZGF0YUxheWVyLnB1c2goe2V2ZW50OiJwYWdlVmlldyIsZXZlbnRBY3Rpb246ZSx0aXRsZTp0LHZhbHVlOmEscHJvZHVjdDpyfSk6d2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDoicGFnZVZpZXciLGV2ZW50QWN0aW9uOmUsdGl0bGU6dCxyZWZlcmVyOnJ9KTpyJiZyLmVjb21tZXJjZT93aW5kb3cuZGF0YUxheWVyLnB1c2gocik6d2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDplLGV2ZW50QWN0aW9uOnQsdmFsdWU6YSxyZWZlcmVyOnJ9KSk7dHJ5e3ZhciB2O2lmKHdpbmRvdy5ndGFnVHJhY2tlcklEJiYiZ3RhZyI9PT13aW5kb3cubWFpblRyYWNrZXIpaWYoaSlpZihyJiZyLmV2ZW50KWlmKCJwdXJjaGFzZSI9PT1yLmV2ZW50KXtmb3IodmFyIG89ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHMsdz0wLGc9MDtnPG8ubGVuZ3RoO2crKylpZigiZGVsaXZlcnkiPT09b1tnXS5pZCl7dz1vW2ddO2JyZWFrfWd0YWcoImV2ZW50IiwicHVyY2hhc2UiLHt0cmFuc2FjdGlvbl9pZDpyLmVjb21tZXJjZS5wdXJjaGFzZS5hY3Rpb25GaWVsZC5pZCx2YWx1ZTpwYXJzZUZsb2F0KGEpLnRvRml4ZWQoMiksY3VycmVuY3k6dSxzaGlwcGluZzp3LGl0ZW1zOnIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzfSl9ZWxzZSJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkP2d0YWcoImV2ZW50IiwiYWRkX3RvX2NhcnQiLHtpdGVtczpyLmVjb21tZXJjZS5hZGQucHJvZHVjdHN9KToicmVtb3ZlRnJvbUNhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UucmVtb3ZlP2d0YWcoImV2ZW50IiwicmVtb3ZlX2Zyb21fY2FydCIse2l0ZW1zOnIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0c30pOiJ2aWV3UHJvZHVjdCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5kZXRhaWwmJmd0YWcoImV2ZW50Iiwidmlld19pdGVtIix7aXRlbXM6ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzfSk7ZWxzZSEhd2luZG93Lmd0YWdUcmFja2VySUQmJi0xIT09d2luZG93Lmd0YWdUcmFja2VySUQuaW5kZXhPZigiVUEtIik/Z3RhZygiY29uZmlnIix3aW5kb3cuZ3RhZ1RyYWNrZXJJRCx7cGFnZV90aXRsZTp0LHBhZ2VfcGF0aDplfSk6Z3RhZygiZXZlbnQiLHdpbmRvdy5ndGFnVHJhY2tlcklELHtwYWdlX3RpdGxlOnQscGFnZV9wYXRoOmUsc2VuZF90bzp3aW5kb3cuZ3RhZ1RyYWNrZXJJRH0pO2Vsc2UgZ3RhZygiZXZlbnQiLGUse2V2ZW50X2NhdGVnb3J5OiJ0aWxkYSIsZXZlbnRfbGFiZWw6dCx2YWx1ZTphfSl9Y2F0Y2goeCl7fWlmKHdpbmRvdy5nYSYmInRpbGRhIiE9PXdpbmRvdy5tYWluVHJhY2tlciYmImd0YWciIT09d2luZG93Lm1haW5UcmFja2VyKWlmKGkpaWYociYmci5ldmVudCl7dHJ5e2lmKHdpbmRvdy5UaWxkYS5pc0xvYWRHQUVjb21tZXJjZXx8KHdpbmRvdy5UaWxkYS5pc0xvYWRHQUVjb21tZXJjZT0hMCxnYSgicmVxdWlyZSIsImVjIikpLGdhKCJzZXQiLCJjdXJyZW5jeUNvZGUiLHUpLCJwdXJjaGFzZSI9PT1yLmV2ZW50KXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0cy5sZW5ndGgsZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0c1tnXSxnYSgiZWM6YWRkUHJvZHVjdCIse2lkOmYuaWR8fGcsbmFtZTpmLm5hbWUscHJpY2U6cGFyc2VGbG9hdChmLnByaWNlKS50b0ZpeGVkKDIpLHF1YW50aXR5OmYucXVhbnRpdHl9KTtnYSgiZWM6c2V0QWN0aW9uIiwicHVyY2hhc2UiLHtpZDpyLmVjb21tZXJjZS5wdXJjaGFzZS5hY3Rpb25GaWVsZC5pZCxyZXZlbnVlOnBhcnNlRmxvYXQoYSkudG9GaXhlZCgyKX0pfWVsc2UgaWYoImFkZFRvQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5hZGQpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5sZW5ndGgsZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHNbZ10sZ2EoImVjOmFkZFByb2R1Y3QiLHtpZDpmLmlkfHxnLG5hbWU6Zi5uYW1lLHByaWNlOnBhcnNlRmxvYXQoZi5wcmljZSkudG9GaXhlZCgyKSxxdWFudGl0eTpmLnF1YW50aXR5fSk7Z2EoImVjOnNldEFjdGlvbiIsImFkZCIpfWVsc2UgaWYoInJlbW92ZUZyb21DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLnJlbW92ZSl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzLmxlbmd0aCxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0c1tnXSxnYSgiZWM6YWRkUHJvZHVjdCIse2lkOmYuaWR8fGcsbmFtZTpmLm5hbWUscHJpY2U6cGFyc2VGbG9hdChmLnByaWNlKS50b0ZpeGVkKDIpLHF1YW50aXR5OmYucXVhbnRpdHl9KTtnYSgiZWM6c2V0QWN0aW9uIiwicmVtb3ZlIil9ZWxzZSBpZigidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMubGVuZ3RoLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzW2ddLGdhKCJlYzphZGRQcm9kdWN0Iix7aWQ6Zi5pZHx8ZyxuYW1lOmYubmFtZSxwcmljZTpwYXJzZUZsb2F0KGYucHJpY2UpLnRvRml4ZWQoMikscXVhbnRpdHk6Zi5xdWFudGl0eX0pO2dhKCJlYzpzZXRBY3Rpb24iLCJkZXRhaWwiKX19Y2F0Y2goeCl7fWdhKCJzZW5kIix7aGl0VHlwZToicGFnZXZpZXciLHBhZ2U6ZSx0aXRsZTp0LHBhcmFtczpyfSl9ZWxzZSBnYSgic2VuZCIse2hpdFR5cGU6InBhZ2V2aWV3IixwYWdlOmUsdGl0bGU6dH0pO2Vsc2UgZ2EoInNlbmQiLHtoaXRUeXBlOiJldmVudCIsZXZlbnRDYXRlZ29yeToidGlsZGEiLGV2ZW50QWN0aW9uOmUsZXZlbnRMYWJlbDp0LGV2ZW50VmFsdWU6YX0pO2lmKHdpbmRvdy5tYWluTWV0cmlrYUlkJiZ3aW5kb3cubWFpbk1ldHJpa2FJZD4wJiYiZnVuY3Rpb24iPT10eXBlb2YgeW0paWYoaSl7dmFyIGg9e3RpdGxlOnR9O2E+MD8oaC5wYXJhbXM9e29yZGVyX3ByaWNlOmF9LHUmJihoLnBhcmFtcy5jdXJyZW5jeT11KSx5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwiaGl0IixlLGgpKTp5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwiaGl0IixlLGgpfWVsc2UgYT4wPyhoPXtvcmRlcl9wcmljZTphfSx1JiYoaC5jdXJyZW5jeT11KSx5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwicmVhY2hHb2FsIixlLGgpKTp5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwicmVhY2hHb2FsIixlKTtpZih3aW5kb3cubWFpbk1ldHJpa2E+IiImJndpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdJiYoaT9hPjA/d2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0uaGl0KGUse3RpdGxlOnQsb3JkZXJfcHJpY2U6YSxwYXJhbXM6cn0pOndpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLmhpdChlLHt0aXRsZTp0fSk6YT4wP3dpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLnJlYWNoR29hbChlLHt0aXRsZTp0LHBhcmFtczpyLG9yZGVyX3ByaWNlOmF9KTp3aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXS5yZWFjaEdvYWwoZSx7dGl0bGU6dCxyZWZlcmVyOnJ9KSksdm9pZCAwIT09d2luZG93LmZicSYmITE9PT1uKXRyeXtpZihpKWlmKC0xPT09ZS5pbmRleE9mKCJ0aWxkYS8iKXx8LTE9PT1lLmluZGV4T2YoIi9wYXltZW50LyIpJiYtMT09PWUuaW5kZXhPZigiL3N1Ym1pdHRlZC8iKSlpZihyJiZyLmV2ZW50JiZhPjApaWYoImFkZFRvQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5hZGQpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0c1tnXSxrLnB1c2goZi5pZHx8Zi51aWR8fGYubmFtZSk7d2luZG93LmZicSgidHJhY2siLCJBZGRUb0NhcnQiLHtjb250ZW50X2lkczprLGNvbnRlbnRfdHlwZToicHJvZHVjdCIsdmFsdWU6YSxjdXJyZW5jeTp1fSl9ZWxzZSBpZigidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHNbZ10say5wdXNoKGYuaWR8fGYudWlkfHxmLm5hbWUpO3dpbmRvdy5mYnEoInRyYWNrIiwiVmlld0NvbnRlbnQiLHtjb250ZW50X2lkczprLGNvbnRlbnRfdHlwZToicHJvZHVjdCIsdmFsdWU6YSxjdXJyZW5jeTp1fSl9ZWxzZSBlLmluZGV4T2YoInRpbGRhL3BvcHVwIiksd2luZG93LmZicSgidHJhY2siLCJWaWV3Q29udGVudCIse2NvbnRlbnRfbmFtZTp0LGNvbnRlbnRfY2F0ZWdvcnk6ZX0pO2Vsc2UgZS5pbmRleE9mKCJ0aWxkYS9wb3B1cCIpLHdpbmRvdy5mYnEoInRyYWNrIiwiVmlld0NvbnRlbnQiLHtjb250ZW50X25hbWU6dCxjb250ZW50X2NhdGVnb3J5OmV9KTtlbHNlIGE+MCYmdT93aW5kb3cuZmJxKCJ0cmFjayIsIkluaXRpYXRlQ2hlY2tvdXQiLHtjb250ZW50X25hbWU6dCxjb250ZW50X2NhdGVnb3J5OmUsdmFsdWU6YSxjdXJyZW5jeTp1fSk6d2luZG93LmZicSgidHJhY2siLCJMZWFkIix7Y29udGVudF9uYW1lOnQsY29udGVudF9jYXRlZ29yeTplfSk7ZWxzZSB3aW5kb3cuZmJxKCJ0cmFjayIsZSx7Y29udGVudF9uYW1lOnQsdmFsdWU6YX0pfWNhdGNoKHgpe31pZih2b2lkIDAhPT13aW5kb3cuVksmJnZvaWQgMCE9PXdpbmRvdy5WSy5SZXRhcmdldGluZyYmITE9PT1sKXRyeXtpZihpKXt2YXIgYyxfPShjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikpP2MuZ2V0QXR0cmlidXRlKCJkYXRhLXZrLXByaWNlLWxpc3QtaWQiKTpudWxsLGI9XyYmcGFyc2VJbnQoXyl8fDAsVD0iIixBPSExLEYsRixGLEYsRjtpZihyJiZyLmV2ZW50KWlmKEE9e3Byb2R1Y3RzOltdLGN1cnJlbmN5X2NvZGU6IiIsdG90YWxfcHJpY2U6MH0sInB1cmNoYXNlIj09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLnB1cmNoYXNlKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0iaW5pdF9jaGVja291dCJ9ZWxzZSBUPSJ0LXB1cmNoYXNlIjtlbHNlIGlmKCJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzW2ddLEEucHJvZHVjdHMucHVzaCh7aWQ6Zi5pZHx8Zi51aWR8fGYubmFtZSxwcmljZTpmLnByaWNlP2YucHJpY2U6MH0pLEEudG90YWxfcHJpY2U9YTtUPSJhZGRfdG9fY2FydCJ9ZWxzZSBUPSJ0LWFkZC10by1jYXJ0IixyLmVjb21tZXJjZS5hZGRbMF0mJnIuZWNvbW1lcmNlLmFkZFswXS51aWQmJihUKz0iLSIrci5lY29tbWVyY2UuYWRkWzBdLnVpZCk7ZWxzZSBpZigidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzW2ddLEEucHJvZHVjdHMucHVzaCh7aWQ6Zi5pZHx8Zi51aWR8fGYubmFtZSxwcmljZTpmLnByaWNlP2YucHJpY2U6MH0pLEEudG90YWxfcHJpY2U9YTtUPSJ2aWV3X3Byb2R1Y3QifWVsc2UgVD0idC12aWV3LXByb2R1Y3QiLHIuZWNvbW1lcmNlLmRldGFpbFswXSYmci5lY29tbWVyY2UuZGV0YWlsWzBdLnVpZCYmKFQrPSItIityLmVjb21tZXJjZS5kZXRhaWxbMF0udWlkKTtlbHNlIGlmKCJyZW1vdmVGcm9tQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5yZW1tb3ZlKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzW2ddLEEucHJvZHVjdHMucHVzaCh7aWQ6Zi5pZHx8Zi51aWR8fGYubmFtZSxwcmljZTpmLnByaWNlP2YucHJpY2U6MH0pLEEudG90YWxfcHJpY2U9YTtUPSJyZW1vdmVfZnJvbV9jYXJ0In1lbHNlIFQ9InQtcmVtb3ZlLXByb2R1Y3QiLHIuZWNvbW1lcmNlLnJlbW92ZVswXSYmci5lY29tbWVyY2UucmVtb3ZlWzBdLnVpZCYmKFQrPSItIityLmVjb21tZXJjZS5yZW1vdmVbMF0udWlkKTtlbHNlIFQ9ci5ldmVudDtlbHNlIGlmKC0xIT09ZS5pbmRleE9mKCJ0aWxkYS8iKSYmLTEhPT1lLmluZGV4T2YoIi9wYXltZW50LyIpKVQ9InQtcHVyY2hhc2UtIisoRj0oRj0oRj1lLnJlcGxhY2UoIi90aWxkYS8iLCIiKSkucmVwbGFjZSgidGlsZGEvIiwiIikpLnJlcGxhY2UoIi9wYXltZW50LyIsIiIpKTtlbHNlIGlmKC0xIT09ZS5pbmRleE9mKCJ0aWxkYS8iKSYmLTEhPT1lLmluZGV4T2YoIi9zdWJtaXR0ZWQvIikpVD0idC1sZWFkLSIrKEY9KEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoInRpbGRhLyIsIiIpKS5yZXBsYWNlKCIvc3VibWl0dGVkLyIsIiIpKTtlbHNlIGlmKC0xIT09ZS5pbmRleE9mKCJ0aWxkYS9wb3B1cCIpKVQ9InQtIisoRj0oRj1lLnJlcGxhY2UoIi90aWxkYS8iLCIiKSkucmVwbGFjZSgiLyIsIi0iKSk7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvY2xpY2siKSlUPSJ0LSIrKEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoIi8iLCItIikpO2Vsc2UgVD0idC0iKyhGPWUucmVwbGFjZSgiLyIsIi0iKSk7Yj4wJiZBJiZBLmN1cnJlbmN5X2NvZGU/KFZLLlJldGFyZ2V0aW5nLkV2ZW50KCJwdXJjaGFzZSIpLFZLLlJldGFyZ2V0aW5nLlByb2R1Y3RFdmVudChiLFQsQSkpOihWSy5SZXRhcmdldGluZy5FdmVudChUKSwidC1wdXJjaGFzZSI9PT1ULnN1YnN0cmluZygwLDEwKT9WSy5Hb2FsKCJwdXJjaGFzZSIpOiJ0LWxlYWQiPT09VC5zdWJzdHJpbmcoMCw2KSYmVksuR29hbCgibGVhZCIpKX1lbHNlIFZLLlJldGFyZ2V0aW5nLkV2ZW50KGUpfWNhdGNoKHgpe31pZih3aW5kb3cubWFpbk1haWxydUlkPiIwIil7dmFyIEU9d2luZG93Ll90bXJ8fCh3aW5kb3cuX3Rtcj1bXSk7aT9hPjA/RS5wdXNoKHtpZDoiIit3aW5kb3cubWFpbk1haWxydUlkLHR5cGU6InBhZ2VWaWV3Iix1cmw6ZSx2YWx1ZTphLHN0YXJ0OihuZXcgRGF0ZSkuZ2V0VGltZSgpfSk6RS5wdXNoKHtpZDoiIit3aW5kb3cubWFpbk1haWxydUlkLHR5cGU6InBhZ2VWaWV3Iix1cmw6ZSxzdGFydDoobmV3IERhdGUpLmdldFRpbWUoKX0pOmE+MD9FLnB1c2goe2lkOiIiK3dpbmRvdy5tYWluTWFpbHJ1SWQsdHlwZToicmVhY2hHb2FsIixnb2FsOmUsdmFsdWU6YX0pOkUucHVzaCh7aWQ6IiIrd2luZG93Lm1haW5NYWlscnVJZCx0eXBlOiJyZWFjaEdvYWwiLGdvYWw6ZX0pfSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudGlsZGFzdGF0JiYoaT8oZS5pbmRleE9mKCJwYXltZW50Iik+MCYmZS5pbmRleE9mKCJ0aWxkYS9mb3JtIik+LTEmJihlPWUucmVwbGFjZSgidGlsZGEvZm9ybSIsInRpbGRhL3JlYyIpKSx3aW5kb3cudGlsZGFzdGF0KCJwYWdldmlldyIse3BhZ2U6ZX0pKTp3aW5kb3cudGlsZGFzdGF0KCJwYWdldmlldyIse3BhZ2U6Ii90aWxkYS9ldmVudC8iK2V9KSl9LFRpbGRhLnNhdmVVVE09ZnVuY3Rpb24oKXt0cnl7dmFyIGU9d2luZG93LmxvY2F0aW9uLmhyZWYsdD0iIixyPSIiO2lmKC0xIT09ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInV0bV8iKSYmInN0cmluZyI9PXR5cGVvZih0PSh0PShlPWUudG9Mb3dlckNhc2UoKSkuc3BsaXQoIj8iKSlbMV0pKXt2YXIgYSxpPXQuc3BsaXQoIiYiKTtmb3IodmFyIG8gaW4gaSkiYW1wOyI9PT0oYT1pW29dLnNwbGl0KCI9IikpWzBdLnN1YnN0cmluZygwLDQpJiYoYVswXT1hWzBdLnN1YnN0cmluZyg0KSksInV0bV8iPT09YVswXS5zdWJzdHJpbmcoMCw0KSYmKHI9citpW29dKyJ8fHwiKTtpZihyLmxlbmd0aD4wKXt2YXIgYz1uZXcgRGF0ZTtjLnNldERhdGUoYy5nZXREYXRlKCkrMzApLGRvY3VtZW50LmNvb2tpZT0iVElMREFVVE09IitlbmNvZGVVUklDb21wb25lbnQocikrIjsgcGF0aD0vOyBleHBpcmVzPSIrYy50b1VUQ1N0cmluZygpfX19Y2F0Y2goZCl7fX0sImxvYWRpbmciIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9lKCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZSl9KCksRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc3x8KEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXM9RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUubW96TWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm9NYXRjaGVzU2VsZWN0b3IpLEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3R8fChFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzO3QmJjE9PT10Lm5vZGVUeXBlOyl7aWYoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcy5jYWxsKHQsZSkpcmV0dXJuIHQ7dD10LnBhcmVudEVsZW1lbnR8fHQucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH0pOwoKIWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtmdW5jdGlvbiB0KCl7dmFyIGU9TWF0aC5mbG9vcig4OTk5OTkqTWF0aC5yYW5kb20oKSkrMWU1O3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpKyIuIitlfWZ1bmN0aW9uIG4oZSl7dmFyIHQ9ZS5yZXBsYWNlKC8oW1wuJD8qfHt9XChcKVxbXF1cXFwvXCteXSkvZywiXFwkMSIpLG49bmV3IFJlZ0V4cCgiKD86Xnw7ICkiK3QrIj0oW147XSopIiksbz1kb2N1bWVudC5jb29raWUubWF0Y2gobik7aWYobylyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KG9bMV0pfWZ1bmN0aW9uIG8oZSx0LG4pe3ZhciBvPW4uZXhwaXJlcztpZighbylyZXR1cm4hMTtpZigibnVtYmVyIj09dHlwZW9mIG8pe3ZhciBpPShuZXcgRGF0ZSkuZ2V0VGltZSgpKzFlMypvOyhvPW5ldyBEYXRlKGkpKS50b1VUQ1N0cmluZyYmKG4uZXhwaXJlcz1vLnRvVVRDU3RyaW5nKCkpfXZhciBhPWUrIj0iKyh0PWVuY29kZVVSSUNvbXBvbmVudCh0KSk7Zm9yKHZhciByIGluIG4pYSs9IjsgIityLCEwIT09bltyXSYmKGErPSI9IituW3JdKTtkb2N1bWVudC5jb29raWU9YX1mdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9ITA7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJubyBjYWxsYmFjayBnaXZlbiIpO2Z1bmN0aW9uIG4oKXt0fHxlKHQ9ITApfWZ1bmN0aW9uIG8oKXt0JiZlKHQ9ITEpfSJoaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLChmdW5jdGlvbigpeyhkb2N1bWVudC5oaWRkZW4/bzpuKSgpfSkpLCJtb3pIaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1venZpc2liaWxpdHljaGFuZ2UiLChmdW5jdGlvbigpeyhkb2N1bWVudC5tb3pIaWRkZW4/bzpuKSgpfSkpLCJ3ZWJraXRIaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdHZpc2liaWxpdHljaGFuZ2UiLChmdW5jdGlvbigpeyhkb2N1bWVudC53ZWJraXRIaWRkZW4/bzpuKSgpfSkpLCJtc0hpZGRlbiJpbiBkb2N1bWVudCYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibXN2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQubXNIaWRkZW4/bzpuKSgpfSkpLCJvbmZvY3VzaW4iaW4gZG9jdW1lbnQmJihkb2N1bWVudC5vbmZvY3VzaW49bixkb2N1bWVudC5vbmZvY3Vzb3V0PW8pLHdpbmRvdy5vbnBhZ2VzaG93PXdpbmRvdy5vbmZvY3VzPW4sd2luZG93Lm9ucGFnZWhpZGU9d2luZG93Lm9uYmx1cj1vfWZ1bmN0aW9uIHIoKXt2YXIgZT13aW5kb3cucGFnZVlPZmZzZXQsdD13aW5kb3cuaW5uZXJIZWlnaHQsbj1NYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCksbz0wLGk9MDt2PSEwO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0LWhlYWRlciIpLHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQtZm9vdGVyIiksZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFjb3B5Iik7YSYmKG89YS5vZmZzZXRIZWlnaHQpLHImJihpPXIub2Zmc2V0SGVpZ2h0KSxkJiYoaSs9ZC5vZmZzZXRIZWlnaHQpO3ZhciBjPU1hdGguZmxvb3IoMTAwKihlLW8rdCkvKG4tby1pKSk7aWYoIShjPDEwKSlmb3IodmFyIHM9WzEwLDI1LDUwLDc1LDkwXSxsPTA7bDxzLmxlbmd0aDtsKyspe3ZhciB1PXNbbF0sZz1zLmxlbmd0aC0xO2lmKDA9PT1sJiZjPj11JiYhd1sicCIrdV0pbS5wYWdlPSIvdGlsZGEvc2Nyb2xsLyIrdSsiLyIsd2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciKSx3WyJwIit1XT0hMDtlbHNlIGlmKGM+PXUtMSl7aWYoMD09PXdbInAiK3VdKXttLnBhZ2U9Ii90aWxkYS9zY3JvbGwvIit1KyIvIix3aW5kb3cudGlsZGFzdGF0KCJwYWdldmlldyIpLHdbInAiK3VdPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHdbInAiK3VdKSx3WyJwIit1XT0tMX0pLDVlMyk7YnJlYWt9aWYoKGwhPT1nJiZjPHNbbCsxXXx8bD09PWcpJiYtMT09PXdbInAiK3VdKXt3WyJwIit1XT0wO2JyZWFrfX19fWZ1bmN0aW9uIGQoKXt2YXIgZT0wPT09d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluZGV4T2YoInd3dy4iKT93aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2xpY2UoNCk6d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO3JldHVybiBlLmxhc3RJbmRleE9mKCIuIik9PT1lLmxlbmd0aC0xJiYoZT1lLnNsaWNlKDAsLTEpKSxlK3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX1mdW5jdGlvbiBjKGUpe2Zvcih2YXIgdD1BcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7bisrKXRbbl09bjtyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNoYXJDb2RlQXQodCkudG9TdHJpbmcoMTYpfSkpLmpvaW4oIiIpfWZ1bmN0aW9uIHMoKXt2YXIgZT0obmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQ/ImNUIjoiY0YiKSsifCIrKG5hdmlnYXRvci5kZXZpY2VNZW1vcnk/ImRtIituYXZpZ2F0b3IuZGV2aWNlTWVtb3J5OiJkbSIpKyJ8IisobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k/ImhjIituYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeToiaGMiKSsifCIrKG5hdmlnYXRvci5sYW5ndWFnZXM/ImwiK25hdmlnYXRvci5sYW5ndWFnZXMuam9pbigiLCIpOiJsIikrInwiO2lmKG5hdmlnYXRvci5wbGF0Zm9ybXx8bmF2aWdhdG9yLmFwcE5hbWU/ZSs9KG5hdmlnYXRvci5wbGF0Zm9ybT8icCIrbmF2aWdhdG9yLnBsYXRmb3JtOiJwIikrInwiKyhuYXZpZ2F0b3IudmVuZG9yPyJ2IituYXZpZ2F0b3IudmVuZG9yOiJ2IikrInwiKyhuYXZpZ2F0b3IuYXBwQ29kZU5hbWU/ImEiK25hdmlnYXRvci5hcHBDb2RlTmFtZToiYSIpKyJ8IisobmF2aWdhdG9yLmFwcE5hbWU/Im4iK25hdmlnYXRvci5hcHBOYW1lOiJuIikrInwiOmUrPShuYXZpZ2F0b3IudXNlckFnZW50PyJ1YSIrbmF2aWdhdG9yLnVzZXJBZ2VudDoidWEiKSsifCIsbmF2aWdhdG9yLnBsdWdpbnMpe3ZhciB0LG4sbz0iIjtmb3Iobj1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg+MjA/MjA6bmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoLHQ9MDt0PG47dCsrKW5hdmlnYXRvci5wbHVnaW5zW3RdJiZuYXZpZ2F0b3IucGx1Z2luc1t0XS5maWxlbmFtZT9vKz1uYXZpZ2F0b3IucGx1Z2luc1t0XS5maWxlbmFtZTpuYXZpZ2F0b3IucGx1Z2luc1t0XSYmbmF2aWdhdG9yLnBsdWdpbnNbdF0ubmFtZSYmKG8rPW5hdmlnYXRvci5wbHVnaW5zW3RdLm5hbWUpO2UrPSJwbCIrbysifCJ9cmV0dXJuIGUrPSJwciIrd2luZG93LmRldmljZVBpeGVsUmF0aW8rInwiLGUrPSJ3Iisoc2NyZWVuJiZzY3JlZW4ud2lkdGg/c2NyZWVuLndpZHRoOndpbmRvdy5pbm5lcldpZHRoKSsiaCIrKHNjcmVlbiYmc2NyZWVuLmhlaWdodD9zY3JlZW4uaGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodCkrInwiLGUrPSJjRCIrKHNjcmVlbi5jb2xvckRlcHRoP3NjcmVlbi5jb2xvckRlcHRoOiIiKSsifCIsZSs9InRPIisobmV3IERhdGUpLmdldFRpbWV6b25lT2Zmc2V0KCkrInwiLGU9YyhlKz0ibVQiKyh2b2lkIDAhPT1uYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM/bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzOnZvaWQgMCE9PW5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzP25hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzOiIiKSsifCIpfWZ1bmN0aW9uIGwoKXt4PW4oInRpbGRhdWlkIiksRT1uKCJ0aWxkYXNpZCIpLGg/KHh8fCh4PSJzaW1wbGUiKSxFfHwoRT0ic2ltcGxlIikpOih4fHwoeD10KCkpLEV8fChFPXQoKSkpfWZ1bmN0aW9uIHUoKXt2YXIgZTtofHwobygidGlsZGF1aWQiLHgse2V4cGlyZXM6Nzc3NmUzLHBhdGg6Ii8ifSksbygidGlsZGFzaWQiLEUse2V4cGlyZXM6MTgwMCxwYXRoOiIvIn0pKX1mdW5jdGlvbiBnKHQpe2lmKG0udXNlcl9hZ2VudD4iIiYmLTEhPW0udXNlcl9hZ2VudC5pbmRleE9mKCJib3QiKSlyZXR1cm4hMTtpZigiaHR0cDoiIT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wmJiJodHRwczoiIT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wpcmV0dXJuIGNvbnNvbGUubG9nKCJUaWxkYVN0YXQ6IGNhbm5vdCB3b3JrIG9uIGxvY2FsIHBhZ2UiKSwhMTt2YXIgbjtsKCksdSgpLG0ucGFnZT1kKCksbS5yZWZlcnJlcj1kb2N1bWVudC5yZWZlcnJlcnx8IiIsbS51c2VyaWQ9eCxtLnNlc3Npb25pZD1FLG0udXNlcl9hZ2VudD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxtLnVzZXJfbGFuZ3VhZ2U9d2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UsZSYmKG0ucHJvamVjdGlkPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXByb2plY3QtaWQiKXx8IjAiLG0ucGFnZWlkPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXBhZ2UtaWQiKXx8IjAiLG0ucGFnZWFsaWFzPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXBhZ2UtYWxpYXMiKXx8IiIsbS5mb3Jtc2tleT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1mb3Jtc2tleSIpfHwiIiksbS5wYXJhbXM9e307dHJ5e249ZGVjb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpfWNhdGNoKGMpe249d2luZG93LmxvY2F0aW9uLnNlYXJjaH1pZihuPiI/IiYmKG0ucGFnZXF1ZXJ5PW4uc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCksfm0ucGFnZXF1ZXJ5LmluZGV4T2YoInV0bV8iKSkpe3ZhciBvLGk9bS5wYWdlcXVlcnkuc3BsaXQoIiYiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKGUpeyhvPWUuc3BsaXQoIj0iKSkubGVuZ3RoPjE/InV0bV9yZWZlcnJlciIhPT1vWzBdfHxtLnJlZmVycmVyJiYhfm0ucmVmZXJyZXIuaW5kZXhPZigib2hpbzgudiIpP20ucGFyYW1zW29bMF1dPW9bMV06bS5yZWZlcnJlcj1vWzFdOm0ucGFyYW1zW29bMF1dPSIifSkpfXZhciByPSExO2lmKC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHI9ITApLG0uaXNtb2JpbGU9cixkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFzdGF0c2NyaXB0IikmJihtLnRpbGRhc3RhdGNvZGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhc3RhdHNjcmlwdCIpLmtleSksayl0cnl7YSgoZnVuY3Rpb24oZSl7dj0hIWV9KSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3Y9ITB9KSwxZTMpKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJrZXlwcmVzcyIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSl9Y2F0Y2goYyl7fW0uZmluZ2VycHJpbnQ9cygpLFQ9ITB9ZnVuY3Rpb24gcChlKXt2YXIgdD0iaHR0cHM6Ly9zdGF0LnRpbGRhYXBpLiIrTCgpKyIvZXZlbnQvIixpO2h8fChuKCJ0aWxkYXNpZCIpfHwiIikhPW0uc2Vzc2lvbmlkJiZvKCJ0aWxkYXNpZCIsbS5zZXNzaW9uaWQse2V4cGlyZXM6MTgwMCxwYXRoOiIvIn0pOyIiPT09bS5yZWZlcnJlciYmKG0ucmVmZXJyZXI9bigicHJldmlvdXNVcmwiKXx8IiIpLG0udGlsZGF1dG09bigiVElMREFVVE0iKXx8IiIsbS5wYWdlfHwoY29uc29sZS5sb2coIlRpbGRhU3RhdDogcGFnZSBlbXB0eSIpLG0ucGFnZT1kKCksd2luZG93LmxvY2F0aW9uLmhhc2gmJjA9PT13aW5kb3cubG9jYXRpb24uaGFzaC5pbmRleE9mKCIjISIpJiYobS5wYWdlKz13aW5kb3cubG9jYXRpb24uaGFzaCkpLCIvIj09PW0ucGFnZS5zdWJzdHJpbmcoMCwxKSYmKG0ucGFnZT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUrbS5wYWdlKTt2YXIgYT1mKG0pLHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3Iub3BlbigiUE9TVCIsdCwhMCksci53aXRoQ3JlZGVudGlhbHM9ITEsci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiKSxyLm9uZXJyb3I9ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcigiVGlsZGFTdGF0OiBmYWlsIHBhZ2V2aWV3ICIpLGNvbnNvbGUuZXJyb3IoZSl9LHIudGltZW91dD0zZTMsci5zZW5kKGEpLG0ucGFnZSYmLTE9PT1tLnBhZ2UuaW5kZXhPZigidGlsZGEvc2Nyb2xsIikmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL3JlYWR0aW1lIikmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL2NsaWNrIikmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL2Nvb2tpZWVuYWJsZWQiKSYmKG0ucmVmZXJyZXI9bS5wYWdlLGh8fG8oInByZXZpb3VzVXJsIixtLnBhZ2Use3BhdGg6Ii8iLGV4cGlyZXM6MTgwMH0pKSxtLnBhZ2U9IiIsd2luZG93LnRpbGRhc3RhdGxvYWQ9ITB9ZnVuY3Rpb24gZihlKXt2YXIgdD0iIjtmb3IodmFyIG4gaW4gZSlpZigiIiE9dCYmIm9iamVjdCIhPXR5cGVvZiBlW25dJiYodCs9IiYiKSwib2JqZWN0Ij09dHlwZW9mIGVbbl0pe2lmKE9iamVjdC5rZXlzKGVbbl0pLmxlbmd0aClmb3IodmFyIG8gaW4gZVtuXSl0Kz0iJiIrbisiWyIrbysiXT0iK2VuY29kZVVSSUNvbXBvbmVudChlW25dW29dKX1lbHNlIHQrPW4rIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW25dKTtyZXR1cm4gdH13aW5kb3cudGlsZGFzdGF0PWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuITE7aWYoImNyZWF0ZSIhPT1lJiYhVClyZXR1cm4gc2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cudGlsZGFzdGF0KGUsdCl9KSwxZTMpLCExO3N3aXRjaCh0JiZpKG0sdCksZSl7Y2FzZSJjcmVhdGUiOmcodCk7YnJlYWs7Y2FzZSJwYWdldmlldyI6cCh0KTticmVhaztjYXNlInJlYWR0aW1lIjprJiYodiYmKG0ucGFnZT0iL3RpbGRhL3JlYWR0aW1lLyIsdj0hMSxwKHQpKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy50aWxkYXN0YXQoInJlYWR0aW1lIil9KSwxNWUzKSk7YnJlYWs7Y2FzZSJzY3JvbGwiOmsmJiJmdW5jdGlvbiI9PXR5cGVvZiB0X3Rocm90dGxlJiZ3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3IoKX0pLDFlMykpO2JyZWFrO2Nhc2UiY29va2llZW5hYmxlZCI6aD0hMSxsKCksdSgpLG0udXNlcmlkPXgsbS5zZXNzaW9uaWQ9RSxtLnBhZ2U9Ii90aWxkYS9jb29raWVlbmFibGVkLyIscCh0KTticmVhaztjYXNlImZpbmdlcnByaW50IjpyZXR1cm4gcygpfX07dmFyIG09e30sdz17cDEwOjAscDI1OjAscDUwOjAscDc1OjAscDkwOjB9LHY9ITAsaD0ibm8iPT09d2luZG93LnRpbGRhc3RhdGNvb2tpZSx5O2lmKCh3aW5kb3cudGlsZGFzdGF0Y29va2llfHxlJiYoaD0ibm8iPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY29va2llIikpLCJ5ZXMiPT09d2luZG93LnRpbGRhc3RhdGNvb2tpZWdkcHImJiExPT09aCkmJihoPSEwLCEwPT09bigidF9jb29raWVzQ29uc2VudEdpdmVuIikpKXt2YXIgYj1uKCJ0X2Nvb2tpZXNDYXRlZ29yaWVzIik7InN0cmluZyI9PXR5cGVvZiBiJiZiLmluZGV4T2YoImFuYWx5dGljcyIpPi0xJiYoaD0hMSl9dmFyIGs9InllcyI9PT13aW5kb3cudGlsZGFzdGF0c2Nyb2xsO3ZvaWQgMD09PXdpbmRvdy50aWxkYXN0YXRzY3JvbGwmJmUmJihrPSJ5ZXMiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtc3RhdC1zY3JvbGwiKSk7dmFyIHg9IiIsRT0iIixUPSExO3dpbmRvdy50aWxkYXN0YXQoImNyZWF0ZSIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7d2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciKSx3aW5kb3cudGlsZGFzdGF0KCJyZWFkdGltZSIpLHdpbmRvdy50aWxkYXN0YXQoInNjcm9sbCIpfSksNTAwKTt2YXIgaj1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtpZigoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cudF9qc2Vycm9ycyYmd2luZG93LnRfanNlcnJvcnMubGVuZ3RoPjB8fCJvYmplY3QiPT10eXBlb2Ygd2luZG93LnRfY2RuZXJyb3JzJiZ3aW5kb3cudF9jZG5lcnJvcnMubGVuZ3RoPjB8fCJvYmplY3QiPT10eXBlb2Ygd2luZG93LnRfYWpheGVycm9ycyYmd2luZG93LnRfYWpheGVycm9ycy5sZW5ndGg+MCkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0X2Vycm9yc19fc2VuZEpTRXJyb3JzKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLnNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIitMKCkrIi9qcy90aWxkYS1lcnJvcnMtMS4wLm1pbi5qcyIsZS5hc3luYz0hMCxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpLGNsZWFySW50ZXJ2YWwoail9fSksMmUzKSxPPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImxpbmtbcmVsKj0nc2hvcnRjdXQgaWNvbiddIiksXz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJsaW5rW2hyZWYqPSd0aWxkYS53cy9wcm9qZWN0J10iKS5sZW5ndGg7X3x8KF89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgibGlua1tocmVmKj0nd3MudGlsZGFjZG4uY29tL3Byb2plY3QnXSIpLmxlbmd0aCk7dmFyIEE9Tz9PLmdldEF0dHJpYnV0ZSgiaHJlZiIpOiIiLEg9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W3NyYyo9J2pzL3RpbGRhLXNjcmlwdHMnXSIpLEM9ISFIJiYtMT09PUguc3JjLmluZGV4T2YoInRpbGRhY2RuIiksSTsoQ3x8KEM9TyYmLTEhPT1BLmluZGV4T2YoInN0YXRpYy50aWxkYWNkbi4iK0woKSkmJi0xIT09QS5pbmRleE9mKCJ0aWxkYS4iKSYmLTEhPT1BLmluZGV4T2YoIi90aWxkYWZhdmljb24uaWNvIikmJiFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0YWJsZSNhbGxyZWNvcmRzIikmJiEoLTEhPT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5kZXhPZigiLnRpbGRhLndzIikpJiYhXyksdm9pZCAwPT09bmF2aWdhdG9yLnNlbmRCZWFjb258fC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxDKXx8MT09PU1hdGguZmxvb3IoNSpNYXRoLnJhbmRvbSgpKSYmUygoZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLmFzeW5jPSEwLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIitMKCkrIi9qcy90aWxkYS1wZXJmb3JtYW5jZS0xLjAubWluLmpzIixkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixlKX0pKTtmdW5jdGlvbiBTKGUpeyJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP2UoKTp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZSl9ZnVuY3Rpb24gTCgpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksdDtyZXR1cm4gZSYmZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcm9vdC16b25lIil8fCJjb20ifX0oKTsKCgogICAgKGZ1bmN0aW9uKG0sZSx0LHIsaSxrLGEpewogICAgICAgIG1baV09bVtpXXx8ZnVuY3Rpb24oKXsobVtpXS5hPW1baV0uYXx8W10pLnB1c2goYXJndW1lbnRzKX07CiAgICAgICAgbVtpXS5sPTEqbmV3IERhdGUoKTsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRvY3VtZW50LnNjcmlwdHMubGVuZ3RoOyBqKyspIHtpZiAoZG9jdW1lbnQuc2NyaXB0c1tqXS5zcmMgPT09IHIpIHsgcmV0dXJuOyB9fQogICAgICAgIGs9ZS5jcmVhdGVFbGVtZW50KHQpLGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXSxrLmFzeW5jPTEsay5zcmM9cixhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGssYSkKICAgIH0pKHdpbmRvdywgZG9jdW1lbnQsJ3NjcmlwdCcsJ2h0dHBzOi8vbWMueWFuZGV4LnJ1L21ldHJpa2EvdGFnLmpzP2lkPTEwNDExMDc0MicsICd5bScpOwoKICAgIHltKDEwNDExMDc0MiwgJ2luaXQnLCB7c3NyOnRydWUsIHdlYnZpc29yOnRydWUsIGNsaWNrbWFwOnRydWUsIGVjb21tZXJjZToiZGF0YUxheWVyIiwgYWNjdXJhdGVUcmFja0JvdW5jZTp0cnVlLCB0cmFja0xpbmtzOnRydWV9KTsKCnRfb25SZWFkeShmdW5jdGlvbigpIHtzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDg2OF9pbml0UG9wdXAnLGZ1bmN0aW9uKCkge3Q4NjhfaW5pdFBvcHVwKCcxMzE0ODYxODQxJyk7fSk7fSw1MDApO30pOwp0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdGlhbFNjYWxlJyxmdW5jdGlvbigpIHt0Mzk2X2luaXRpYWxTY2FsZSgnMTMxNDg2MTkyMScpO30pO3Rfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCcxMzE0ODYxOTIxJyk7fSk7fSk7CnRfb25GdW5jTG9hZCgndDM5Nl9pbml0aWFsU2NhbGUnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdGlhbFNjYWxlKCcxMzE0ODYxOTQxJyk7fSk7dF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzEzMTQ4NjE5NDEnKTt9KTt9KTsKdF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXRpYWxTY2FsZScsZnVuY3Rpb24oKSB7dDM5Nl9pbml0aWFsU2NhbGUoJzEzMTQ4NjIwMTEnKTt9KTt0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMTMxNDg2MjAxMScpO30pO30pOwp0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdGlhbFNjYWxlJyxmdW5jdGlvbigpIHt0Mzk2X2luaXRpYWxTY2FsZSgnMTMxNDg2MjAyMScpO30pO3Rfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCcxMzE0ODYyMDIxJyk7fSk7fSk7CnRfb25GdW5jTG9hZCgndDM5Nl9pbml0aWFsU2NhbGUnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdGlhbFNjYWxlKCcxMzE0ODYyMDMxJyk7fSk7dF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzEzMTQ4NjIwMzEnKTt9KTt9KTsKdF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXRpYWxTY2FsZScsZnVuY3Rpb24oKSB7dDM5Nl9pbml0aWFsU2NhbGUoJzEzMTQ4NjIwNDEnKTt9KTt0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMTMxNDg2MjA0MScpO30pO30pOwp0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdGlhbFNjYWxlJyxmdW5jdGlvbigpIHt0Mzk2X2luaXRpYWxTY2FsZSgnMTMxNDg2MjA1MScpO30pO3Rfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCcxMzE0ODYyMDUxJyk7fSk7fSk7CnRfb25GdW5jTG9hZCgndDM5Nl9pbml0aWFsU2NhbGUnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdGlhbFNjYWxlKCcxMzE0ODYyMDYxJyk7fSk7dF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzEzMTQ4NjIwNjEnKTt9KTt9KTsKdF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXRpYWxTY2FsZScsZnVuY3Rpb24oKSB7dDM5Nl9pbml0aWFsU2NhbGUoJzEzMTQ4NjIwNzEnKTt9KTt0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMTMxNDg2MjA3MScpO30pO30pOwp0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdGlhbFNjYWxlJyxmdW5jdGlvbigpIHt0Mzk2X2luaXRpYWxTY2FsZSgnMTMxNDg2MjA4MScpO30pO3Rfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCcxMzE0ODYyMDgxJyk7fSk7fSk7CnRfb25GdW5jTG9hZCgndDM5Nl9pbml0aWFsU2NhbGUnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdGlhbFNjYWxlKCcxMzE0ODYyMDkxJyk7fSk7dF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzEzMTQ4NjIwOTEnKTt9KTt9KTsKdF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXRpYWxTY2FsZScsZnVuY3Rpb24oKSB7dDM5Nl9pbml0aWFsU2NhbGUoJzEzMTQ4NjIxMDEnKTt9KTt0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMTMxNDg2MjEwMScpO30pO30pOwp0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdGlhbFNjYWxlJyxmdW5jdGlvbigpIHt0Mzk2X2luaXRpYWxTY2FsZSgnMTMxNDg2MjExMScpO30pO3Rfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCcxMzE0ODYyMTExJyk7fSk7fSk7CnRfb25GdW5jTG9hZCgndDM5Nl9pbml0aWFsU2NhbGUnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdGlhbFNjYWxlKCcxMzE0ODYyMTIxJyk7fSk7dF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzEzMTQ4NjIxMjEnKTt9KTt9KTs= | |
| js | /_next/static/widgets/footer.js | |
| js | /_next/static/widgets/subscribe.js?31381d5b6ea6 | |
| js | /assets/new/build/main-page.js?31381d5b6ea6 |
Серверные заголовки
Кол-во: 9
HTTP-заголовки ответа сервера
?
Заголовки сервера передают браузеру и поисковику служебную информацию: кеширование, безопасность (CSP, HSTS), сжатие (gzip). Правильная настройка ускоряет загрузку и повышает защищённость.
Найдены серверные заголовки 9шт. Подробнее про серверные заголовки.
Показать полный список серверных заголовков
| Ключ | Значение |
|---|---|
| Server | ddos-guard |
| Set-Cookie | __ddg8_=koI1KKsf9hM2dhss; Domain=.mann-ivanov-ferber.ru; Path=/; Expires=Thu, 20-Aug-2026 14:31:09 GMT |
| Content-Security-Policy | upgrade-insecure-requests; |
| Date | Thu, 20 Aug 2026 14:11:09 GMT |
| X-Powered-By | PHP/7.4.30 |
| Cache-Control | must-revalidate, max-age=0, private |
| x-test | GET |
| x-uuid | onL9UIfkdkWxM9yUQhye4J1ftDINuW5U1 |
| X-Frame-Options | SAMEORIGIN |
CMS
Система управления сайтом (движок)
?
CMS — это движок, на котором работает сайт (WordPress, 1C-Bitrix, Tilda и др.). Знание CMS помогает понять возможности SEO-оптимизации и подобрать подходящие инструменты. «Не определена» — вероятно, самописный сайт или нестандартная сборка.
Сайт работает на CMS Tilda.
Веб-сервер
Программное обеспечение сервера
?
Веб-сервер — это ПО, которое отдаёт страницы посетителям (nginx, Apache, IIS, LiteSpeed и др.). Определяется по серверным заголовкам ответа (Server, X-Powered-By и т.п.). «Не определён» — сервер намеренно скрывает эти заголовки, это нормальная практика безопасности.
Сайт работает на веб-сервере DDoS-Guard.
Мета-теги Готовность: 48%
Title
Красивые книги для осени
Заголовок страницы в браузере и поисковой выдаче
?
Title — главный SEO-заголовок страницы. Влияет на CTR в поиске и ранжирование. Оптимальная длина: 50–70 символов. Ключевые слова — ближе к началу.
Необходимо увеличить число символов в title (текущее значение мало: 24, минимум: 25, оптимально: от 40 до 45)
Дублей словоформ в title не найдено.
Description
Отмечаем неделю красоты в МИФе: любуемся, читаем, восторгаемся.
Описание страницы в поисковой выдаче (сниппет)
?
Meta Description — текст под заголовком в выдаче. Напрямую на позиции не влияет, но влияет на CTR. Оптимальная длина: 120–160 символов.
Необходимо увеличить число символов в description (текущее значение мало: 63, минимум: 80, оптимально: от 120 до 130)
Keywords
Список ключевых слов страницы (устаревший тег)
?
Meta Keywords не учитывается Яндексом и Google для ранжирования с 2009–2012 годов. Заполнение не обязательно, но не вредит. Конкурент может использовать содержимое для анализа.
Установите мета-тег keywords!
Канонический Url
Указывает поисковику основную версию страницы
?
Canonical (rel=canonical) предотвращает проблему дублей страниц. Должен точно совпадать с URL проверяемой страницы. Неправильный canonical может передать ссылочный вес на другую страницу.
Рекомендуем прописать канонический Url.
Robots
Ошибок нет
Директивы для поисковых роботов на уровне страницы
?
Meta Robots управляет индексацией конкретной страницы: index/noindex — индексировать ли, follow/nofollow — следовать ли по ссылкам. Noindex полностью исключает страницу из поиска.
Meta-тег robots не указан. Страница свободна для индексации.
Адаптивность
width=device-width, initial-scale=1.0
Настройка масштабирования на мобильных устройствах
?
Тег viewport (<meta name="viewport">) сообщает браузеру, как масштабировать страницу на мобильных. Стандарт: width=device-width, initial-scale=1. Отсутствие — признак отсутствия мобильной версии.
Meta-тег viewport со значением-константой width=device-width задаёт ширину страницы в соответствии с размером экрана.
Meta-тег viewport со значением initial-scale=1.0 определяет масштаб 1:1, т.е. «не масштабировать».
Разметка OpenGraph
Кол-во: 6
Мета-теги для красивых превью в соцсетях
?
OpenGraph (og:title, og:description, og:image) управляет тем, как страница выглядит при репосте в социальных сетях и мессенджерах. Отсутствие OG-тегов — невзрачный превью при шеринге.
Разметка OpenGraph задана. Страница оптимизирована под социальные сети.
Показать полный список og мета-тегов
| Тип | Значение |
|---|---|
| og:type | article |
| og:title | Красивые книги для осени |
| og:description | Отмечаем неделю красоты в МИФе: любуемся, читаем, восторгаемся. |
| og:image | https://www.mann-ivanov-ferber.ru/assets/media/1200x667_top autumn.jpg |
| og:site_name | Издательство &laquo;МИФ&raquo; |
| og:url | https://www.mann-ivanov-ferber.ru/top_for_autumn/ |
Все мета-теги
Кол-во: 11
Полный список мета-тегов страницы
?
Таблица всех meta-тегов, включая нестандартные. Позволяет найти опечатки, дубли и лишние теги.
Найдены мета-теги 11шт. Мета-теги не видимы для человека и предназначены для обмена информацией между веб-страницей и поисковыми системами, браузерами и другими веб-службами. С ними роботы 🤖 и устройства ведут себя более ожидаемо.
Показать полный список мета-тегов
| Тип | Название | Значение |
|---|---|---|
| name | viewport | width=device-width, initial-scale=1.0 |
| name | description | Отмечаем неделю красоты в МИФе: любуемся, читаем, восторгаемся. |
| name | keywords | |
| name | yandex-verification | 439047a0861cf992 |
| property | og:type | article |
| property | og:title | Красивые книги для осени |
| property | og:description | Отмечаем неделю красоты в МИФе: любуемся, читаем, восторгаемся. |
| property | og:image | https://www.mann-ivanov-ferber.ru/assets/media/1200x667_top autumn.jpg |
| property | og:site_name | Издательство &laquo;МИФ&raquo; |
| property | og:url | https://www.mann-ivanov-ferber.ru/top_for_autumn/ |
| property | fb:admins | 1093864394 |
Оптимизация Готовность: 68%
Структура
Ошибок нет
Семантические HTML-элементы страницы
?
Проверяет наличие основных структурных элементов: nav, header, footer, main. Корректная семантическая структура помогает поисковику понять архитектуру страницы.
Структура документа корректна (теги <html> и <body> присутствуют в одном экземпляре).
Контент
Есть ошибки
Объём и качество текстового содержимого
?
Анализирует объём полезного текста на странице. Слишком мало — страница может считаться малополезной. Слишком много — ухудшается читаемость и восприятие.
Абзацев с текстом 0 слишком мало. Добавьте больше абзацев с текстом (тег <p>)!
Среднее число слов в абзаце 0 слишком мало. Сделайте контент более читаемым!
Кол-во слов 626 не очень много. Добавьте побольше текста (хотя бы 800 слов)!
Слова из title 3 встречаются в тексте достаточно.
Кол-во знаков контента 4057 на странице оптимально.
Заголовки
Ошибок нет
Иерархия заголовков H1–H6
?
H1 должен быть один и содержать ключевой запрос. H2–H6 описывают подразделы. Пропуск уровней (H1 → H3) и несколько H1 — типичные ошибки, снижающие понятность страницы для поисковика.
На странице присутствуют заголовки <h1> 1. Это прекрасно.
Тошнота
2,65
Насколько одно слово доминирует в тексте
?
Классическая тошнота = √(частота самого повторяющегося слова). Норма до 7–8: текст воспринимается естественно. Выше — поисковик может счесть страницу переспамленной.
Тошнота страницы в пределах нормы 3.
Академич. тошнота
3,04%
Насколько текст перенасыщен ключевыми словами
?
Академическая тошнота = (частота слова / общее количество слов) × 100%. Показывает долю конкретного слова в тексте. Норма 5–15%.
Академическая тошнота не дотягивает до нормы 5-15%. Измените текст страницы!
Семантическое ядро
20
Наиболее часто встречающиеся слова на странице
?
Топ слов по частоте использования. Показывает, какие слова доминируют в тексте с точки зрения поисковика.
Контент страницы содержит осмысленный текст и слова.
Показать список слов
| Слово | Кол-во | Частота |
|---|---|---|
| комиксы | 7 | 1,12% |
| психология | 7 | 1,12% |
| литература | 5 | 0,80% |
| развитие | 5 | 0,80% |
| творчество | 5 | 0,80% |
| бизнес | 5 | 0,80% |
| подарки | 5 | 0,80% |
| обучение | 3 | 0,48% |
| подарочные | 3 | 0,48% |
| аудиокниги | 3 | 0,48% |
| истории | 3 | 0,48% |
| культура | 3 | 0,48% |
| искусство | 3 | 0,48% |
| саморазвитие | 3 | 0,48% |
| мышление | 3 | 0,48% |
| маркетинг | 3 | 0,48% |
| бизнеса | 3 | 0,48% |
| компаний | 3 | 0,48% |
| современная | 2 | 0,32% |
| родителей | 2 | 0,32% |
Индексация Готовность: 40%
Индексирование
Есть ошибки
Разрешено ли индексирование страницы
?
Проверяет, не закрыта ли страница от индексации через robots.txt, meta robots или X-Robots-Tag. Страница, закрытая от индексации, не появится в поисковой выдаче.
Анкоров на странице 243 слишком много. Проведите ревизию и оптимизацию ссылок сайта.
Robots.txt
Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 1627 байт. Загружен за: 34мсек.
Проверяемая страница не запрещена в robots.txt.
Robots.txt доступен по постоянному адресу
Показать содержимое robots.txt
User-agent: *
Disallow: *?
Disallow: /login/
Disallow: /cart/
Disallow: /assets/components/
Disallow: /assets/snippets/
Disallow: /assets/templates/site/elements/
Disallow: /b2b/index.php
Disallow: /b2b/library/index.php
Disallow: /b2b/liga/newsletter/$
Disallow: /b2b/liga/office-library/$
Disallow: /b2b/liga/office-library/case/$
Disallow: /b2b/presents/index.php
Disallow: /b2b/sponsorship/index.php
Disallow: /black-friday-week/
Disallow: /book/export/yml/yandex/catalog.xml
Disallow: /cgi-bin/
Disallow: /children-books-new/
Disallow: /connectors/
Disallow: /core/
Disallow: /index.php
Disallow: /kvest1/
Disallow: /kvest2/
Disallow: /kvest3/
Disallow: /kvest4/
Disallow: /kvest5/
Disallow: /kvest6/
Disallow: /kvest7/
Disallow: /kvest8/
Disallow: /kvest9/
Disallow: /kvest10/
Disallow: /kvest11/
Disallow: /kvest12/
Disallow: /kvest13/
Disallow: /kvest14/
Disallow: /kvest-dyra/
Disallow: /kvest-dyra1/
Disallow: /kvest-dyra2/
Disallow: /kvest-dyra3/
Disallow: /kvest-dyra4/
Disallow: /kvest-dyra5/
Disallow: /kvest-dyra6/
Disallow: /kvest-dyra7/
Disallow: /kvest-dyra8/
Disallow: /kvest-spat/
Disallow: /kvest-spat1/
Disallow: /kvest-spat2/
Disallow: /kvest-spat3/
Disallow: /kvest-spat4/
Disallow: /kvest-spat5/
Disallow: /kvest-spat6/
Disallow: /kvest-spat7/
Disallow: /kvest-spat8/
Disallow: /main/
Disallow: /manager/
Disallow: /socialstat/
Disallow: /socialstat.html
Disallow: /book/book/download.ajax
Allow: /assets/new/build/
User-agent: AdsBot-Google
Allow: *?
Allow: /books/selection/
User-agent: AdsBot-Google-Mobile
Allow: *?
Allow: /books/selection/
Sitemap: https://www.mann-ivanov-ferber.ru/sitemap.xml
Sitemap
Кол-во: 1
XML-карта сайта для поисковиков
?
Sitemap.xml помогает поисковику быстрее находить и индексировать страницы. Особенно важен для крупных сайтов и новых страниц, на которые ещё нет входящих ссылок.
Robots.txt содержит карту сайта. Это прекрасно!
Robots.txt не содержит ошибок в карте сайта.
Показать карту сайта
| Url | Статус |
|---|---|
| https://www.mann-ivanov-ferber.ru/sitemap.xml |
|
Внутренние ссылки
Не найдено
Ссылки на другие страницы своего сайта
?
Внутренние ссылки распределяют ссылочный вес между страницами и помогают поисковику обходить сайт. Пустые анкоры и ссылки на запрещённые robots.txt страницы — типичные ошибки.
Внутренних ссылок на странице 0 оптимально.
Внешние ссылки
Кол-во: 233
Ссылки на сторонние сайты
?
Исходящие внешние ссылки передают часть ссылочного веса на чужие сайты. Ссылки на авторитетные ресурсы безопасны; ссылки на мусорные сайты могут навредить репутации страницы.
Внешних ссылок на странице 233 слишком много. Спрячьте лишние ссылки в тег noindex или атрибут rel='nofollow'!
На странице ссылки с атрибутом rel='nofollow' 1.
Показать первые 100 внешних ссылок
| Url | Анкор |
|---|---|
| mann-ivanov-ferber.ru |
Книги
|
| mann-ivanov-ferber.ru |
Проза
|
| mann-ivanov-ferber.ru |
Остросюжетная проза
|
| mann-ivanov-ferber.ru |
Молодёжная литература
|
| mann-ivanov-ferber.ru |
Современная зарубежная литература
|
| mann-ivanov-ferber.ru |
Классическая литература
|
| mann-ivanov-ferber.ru |
Интеллектуальная проза
|
| mann-ivanov-ferber.ru |
Романы взросления
|
| mann-ivanov-ferber.ru |
Детство
|
| mann-ivanov-ferber.ru |
Художественная литература для детей
|
| mann-ivanov-ferber.ru |
Научно-познавательные книги для детей
|
| mann-ivanov-ferber.ru |
KUMON
|
| mann-ivanov-ferber.ru |
Чевостик
|
| mann-ivanov-ferber.ru |
Развитие и обучение детей
|
| mann-ivanov-ferber.ru |
Досуг и творчество детей
|
| mann-ivanov-ferber.ru |
Книги для подростков
|
| mann-ivanov-ferber.ru |
Для родителей
|
| mann-ivanov-ferber.ru |
Комиксы для детей
|
| mann-ivanov-ferber.ru |
Детское творчество
|
| mann-ivanov-ferber.ru |
Умные книжки
|
| mann-ivanov-ferber.ru |
Подготовка к школе
|
| mann-ivanov-ferber.ru |
Необычный формат
|
| mann-ivanov-ferber.ru |
Подарочные
|
| mann-ivanov-ferber.ru |
Психология
|
| mann-ivanov-ferber.ru |
Популярная психология
|
| mann-ivanov-ferber.ru |
Стресс и эмоции
|
| mann-ivanov-ferber.ru |
Любовь и отношения
|
| mann-ivanov-ferber.ru |
Осознанность и медитация
|
| mann-ivanov-ferber.ru |
Книги для родителей
|
| mann-ivanov-ferber.ru |
Быть подростком
|
| mann-ivanov-ferber.ru |
Защита от токсичности
|
| mann-ivanov-ferber.ru |
Бизнес
|
| mann-ivanov-ferber.ru |
Аудиокниги
|
| mann-ivanov-ferber.ru |
Менеджмент
|
| mann-ivanov-ferber.ru |
Продажи
|
| mann-ivanov-ferber.ru |
Истории успеха
|
| mann-ivanov-ferber.ru |
Развитие сотрудников
|
| mann-ivanov-ferber.ru |
Предпринимателю
|
| mann-ivanov-ferber.ru |
Управление компанией
|
| mann-ivanov-ferber.ru |
Стратегия
|
| mann-ivanov-ferber.ru |
Управление проектами
|
| mann-ivanov-ferber.ru |
Переговоры
|
| mann-ivanov-ferber.ru |
Публичные выступления
|
| mann-ivanov-ferber.ru |
Подбор персонала
|
| mann-ivanov-ferber.ru |
Российский бизнес
|
| mann-ivanov-ferber.ru |
ИТ
|
| mann-ivanov-ferber.ru |
Культура
|
| mann-ivanov-ferber.ru |
Биографии
|
| mann-ivanov-ferber.ru |
Серия «Таро МИФ»
|
| mann-ivanov-ferber.ru |
Серия «Мифы от и до»
|
| mann-ivanov-ferber.ru |
Подарочные книги
|
| mann-ivanov-ferber.ru |
Культурные истории, страноведение
|
| mann-ivanov-ferber.ru |
Искусство и архитектура
|
| mann-ivanov-ferber.ru |
Театр и кино, музыка, литература
|
| mann-ivanov-ferber.ru |
Серия «Главное в истории»
|
| mann-ivanov-ferber.ru |
Саморазвитие
|
| mann-ivanov-ferber.ru |
Спокойствие и душевное равновесие
|
| mann-ivanov-ferber.ru |
Аудиокниги
|
| mann-ivanov-ferber.ru |
Мечты и цели
|
| mann-ivanov-ferber.ru |
Мотивация
|
| mann-ivanov-ferber.ru |
Мозг и интеллект
|
| mann-ivanov-ferber.ru |
Продуктивность
|
| mann-ivanov-ferber.ru |
Психология
|
| mann-ivanov-ferber.ru |
Общение
|
| mann-ivanov-ferber.ru |
Сила воли
|
| mann-ivanov-ferber.ru |
Тайм-менеджмент
|
| mann-ivanov-ferber.ru |
Деньги
|
| mann-ivanov-ferber.ru |
Обучение
|
| mann-ivanov-ferber.ru |
Выбор профессии
|
| mann-ivanov-ferber.ru |
Принятие решений
|
| mann-ivanov-ferber.ru |
Осознанность
|
| mann-ivanov-ferber.ru |
Стиль жизни
|
| mann-ivanov-ferber.ru |
Современная магия
|
| mann-ivanov-ferber.ru |
Дом и сад
|
| mann-ivanov-ferber.ru |
Кулинария
|
| mann-ivanov-ferber.ru |
Творчество
|
| mann-ivanov-ferber.ru |
Вдохновение и мотивация
|
| mann-ivanov-ferber.ru |
Творчество «своими руками»
|
| mann-ivanov-ferber.ru |
Рисование для начинающих
|
| mann-ivanov-ferber.ru |
Рисование для продолжающих
|
| mann-ivanov-ferber.ru |
Шрифты и каллиграфия
|
| mann-ivanov-ferber.ru |
Писательство
|
| mann-ivanov-ferber.ru |
Фотомастерская
|
| mann-ivanov-ferber.ru |
Раскраски для взрослых и альбомы
|
| mann-ivanov-ferber.ru |
Легендарная серия Барбары Шер
|
| mann-ivanov-ferber.ru |
Психология творчества
|
| mann-ivanov-ferber.ru |
Дизайн
|
| mann-ivanov-ferber.ru |
Развитие творчества
|
| mann-ivanov-ferber.ru |
Творческий бизнес
|
| mann-ivanov-ferber.ru |
Визуальное мышление
|
| mann-ivanov-ferber.ru |
Творческое мышление
|
| mann-ivanov-ferber.ru |
МАК МИФ
|
| mann-ivanov-ferber.ru |
Комиксы
|
| mann-ivanov-ferber.ru |
Детские комиксы
|
| mann-ivanov-ferber.ru |
Взрослые комиксы
|
| mann-ivanov-ferber.ru |
Молодежные комиксы
|
| mann-ivanov-ferber.ru |
Серии
|
| mann-ivanov-ferber.ru |
Познавательные комиксы
|
| mann-ivanov-ferber.ru |
Здоровье и медицина
|
| mann-ivanov-ferber.ru |
Правильное питание
|
Конкуренты Готовность: 6%
Конкуренты в Яндексе
Кол-во: 0
Топ сайтов-конкурентов в Яндексе
?
Сайты, чаще всего появляющиеся в ТОПе Яндекса по запросам из семантического ядра этой страницы.
Мы не нашли у вас конкурентов в Яндексе. Сайт или очень молодой или плохо продвигается.
Конкурентов в ТОП-10 Яндекса не нашлось.
Показать конкурентов в Яндексе
| Url | % в ТОПе |
|---|---|
| www.mann-ivanov-ferber.ru | 11,11% |
Конкуренты в Google
Найдены конкуренты: 39
Топ сайтов-конкурентов в Google
?
Сайты, чаще всего появляющиеся в ТОПе Google по запросам из семантического ядра этой страницы.
Конкурентов в ТОП-10 Google не нашлось.
У вас есть конкуренты, которые догоняют вас в ТОП-10 Google. Ваш % от ТОП'а составляет 11.
Показать конкурентов в Google
| Url | % в ТОПе |
|---|---|
| www.mann-ivanov-ferber.ru | 11,11% |
| www.ozon.ru | 11,11% |
| ru.wikipedia.org | 7,41% |
| www.nur.kz | 3,70% |
ФЗ-152: ПД Готовность: 40%
РКН
ОК
Сайт не заблокирован
Контакты
https://www.mann-ivanov-ferber.ru/about/contact/
Страница с контактами найдена
Политика ПД
https://www.mann-ivanov-ferber.ru/policy/
Страница политики обработки ПД найдена
Согласие
https://www.mann-ivanov-ferber.ru/personal/
Страница согласия на обработку ПД найдена
Чекбокс согласия
Не найден
Чекбокс согласия на обработку ПД в формах сайта не найден
Куки-баннер
Найден
Баннер согласия с использованием cookie найден
Счётчики до согласия
ОК
Счётчики аналитики не собирают данные до согласия пользователя
ЗоЗПП: права потребителей Готовность: 55%
Наименование продавца
ОК
Полное наименование продавца на сайте
?
Ст. 9 ЗоЗПП: продавец обязан довести до покупателя фирменное наименование организации (ООО «…») или ФИО индивидуального предпринимателя. Укажите его в подвале сайта или на странице «Контакты».
Указано полное наименование продавца
Адрес продавца
ОК
Адрес (место нахождения) продавца
?
Ст. 9 ЗоЗПП: на сайте должен быть адрес места нахождения продавца. Добавьте его в подвал сайта или на страницу «Контакты».
Указан адрес места нахождения продавца
ОГРН / ОГРНИП
Нарушение
Сведения о государственной регистрации продавца
?
Для дистанционной продажи обязательны сведения о госрегистрации продавца. Укажите ОГРН (для ИП — ОГРНИП) рядом с реквизитами, обычно в подвале сайта.
Не указан ОГРН/ОГРНИП
ИНН
Нарушение
ИНН продавца
?
Укажите ИНН организации или индивидуального предпринимателя рядом с остальными реквизитами продавца.
Не указан ИНН
Публичная оферта
ОК
Публичная оферта или условия продажи
?
Правила дистанционной продажи (ПП РФ № 2463) требуют довести до покупателя условия договора до его заключения. Опубликуйте публичную оферту или условия продажи и дайте на них ссылку из подвала сайта.
Есть публичная оферта / условия продажи
Возврат и доставка
Нарушение
Порядок возврата и доставки товара
?
Ст. 26.1 ЗоЗПП: при дистанционной продаже покупатель вправе отказаться от товара в течение 7 дней после получения. Опишите порядок и сроки возврата, обмена и доставки на отдельной странице.
Не описан порядок возврата (ст. 26.1 — 7 дней для дистанционной продажи)
Цены в рублях
ОК
Цены товаров в рублях
?
Ст. 10 ЗоЗПП: цена товара указывается в рублях. Добавьте обозначение валюты (₽ или руб.) к ценам на сайте.
Цены указаны в рублях
Режим работы
Нарушение
Режим работы продавца
?
Ст. 9 ЗоЗПП: укажите режим работы продавца (например, «пн–пт с 9:00 до 18:00») — обычно в шапке или подвале сайта.
Не указан режим работы
ФЗ-149: рекомендательные технологии Готовность: 100%
Нарушения
Не выявлены
Рекомендательные блоки («с этим покупают», «похожие товары» и т.п.) на сайте не обнаружены — требования ст. 10.7 ФЗ-149 к сайту не применяются. Нарушений нет.
ФЗ-38: реклама Готовность: 100%
Нарушения
Не выявлены
Рекламных тематик с обязательными оговорками (медицина, БАД, кредиты и займы, новостройки) на сайте не обнаружено. Нарушений нет.
ФЗ-436: защита детей Готовность: 0%
Возрастная маркировка
Нарушение
Знак возрастной категории (0+, 6+, 12+, 16+ или 18+)
?
Ст. 11–12 ФЗ-436: информационная продукция (новости, видео, книги, игры, курсы) должна сопровождаться знаком возрастной категории. Разместите знак на видном месте — обычно в шапке или подвале сайта.
Информационная продукция без возрастной маркировки (ст. 11 ФЗ-436)
Вердикт
Страница https://www.mann-ivanov-ferber.ru/top_for_autumn/ готова к продвижению на 64%. Чтобы еще улучшить страницу и попасть на первые места поисковой выдачи необходимо:
Исправьте ошибки в мета-тегах.
Исправьте ошибки оптимизации.
Исправьте ошибки индексации.
Поделитесь с друзьями: