Анализ страницы https://www.mann-ivanov-ferber.ru/about/
Основное Готовность: 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-сертификат действителен до 07.10.2026 22:44:18.
Поздравляем! Сайт не содержится в реестре РКН.
Кодировка
UTF-8
Кодировка символов страницы
?
Стандарт — UTF-8. Неправильная кодировка вызывает нечитаемые символы и мешает поисковику корректно распознать текст страницы.
Указана кодировка на странице UTF-8.
Язык
ru
Атрибут lang в HTML-теге
?
Атрибут lang (<html lang="ru">) сообщает поисковикам и браузерам, на каком языке написана страница. Помогает при ранжировании в региональном поиске.
Указан язык документа ru.
Скорость загрузки
~0,40сек
Время отклика сервера (TTFB)
?
Time To First Byte — время до получения первого байта от сервера. Норма до 200 мс. Медленный отклик ухудшает пользовательский опыт и ранжирование: Яндекс и Google учитывают скорость страниц.
Скорость загрузки сайта 0,40сек оптимальна.
Объем документа
975Кб
Размер HTML-кода страницы
?
Слишком большой HTML замедляет парсинг браузером и сканирование поисковым роботом. Рекомендуется не более 200 Кб.
Объем html-документа 975Кб оптимален.
Структура 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:wght@300;400;600;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,LyohIGpRdWVyeSB2MS4xMC4yIHwgKGMpIDIwMDUsIDIwMTMgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UKKi8KKGZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPXR5cGVvZiB0LG89ZS5sb2NhdGlvbixhPWUuZG9jdW1lbnQscz1hLmRvY3VtZW50RWxlbWVudCxsPWUualF1ZXJ5LHU9ZS4kLGM9e30scD1bXSxmPSIxLjEwLjIiLGQ9cC5jb25jYXQsaD1wLnB1c2gsZz1wLnNsaWNlLG09cC5pbmRleE9mLHk9Yy50b1N0cmluZyx2PWMuaGFzT3duUHJvcGVydHksYj1mLnRyaW0seD1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgeC5mbi5pbml0KGUsdCxyKX0sdz0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxUPS9cUysvZyxDPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZyxOPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8saz0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLEU9L15bXF0sOnt9XHNdKiQvLFM9Lyg/Ol58OnwsKSg/OlxzKlxbKSsvZyxBPS9cXCg/OlsiXFxcL2JmbnJ0XXx1W1xkYS1mQS1GXXs0fSkvZyxqPS8iW14iXFxcclxuXSoifHRydWV8ZmFsc2V8bnVsbHwtPyg/OlxkK1wufClcZCsoPzpbZUVdWystXT9cZCt8KS9nLEQ9L14tbXMtLyxMPS8tKFtcZGEtel0pL2dpLEg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfSxxPWZ1bmN0aW9uKGUpeyhhLmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWUudHlwZXx8ImNvbXBsZXRlIj09PWEucmVhZHlTdGF0ZSkmJihfKCkseC5yZWFkeSgpKX0sXz1mdW5jdGlvbigpe2EuYWRkRXZlbnRMaXN0ZW5lcj8oYS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixxLCExKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHEsITEpKTooYS5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixxKSxlLmRldGFjaEV2ZW50KCJvbmxvYWQiLHEpKX07eC5mbj14LnByb3RvdHlwZT17anF1ZXJ5OmYsY29uc3RydWN0b3I6eCxpbml0OmZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvO2lmKCFlKXJldHVybiB0aGlzO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoaT0iPCI9PT1lLmNoYXJBdCgwKSYmIj4iPT09ZS5jaGFyQXQoZS5sZW5ndGgtMSkmJmUubGVuZ3RoPj0zP1tudWxsLGUsbnVsbF06Ti5leGVjKGUpLCFpfHwhaVsxXSYmbilyZXR1cm4hbnx8bi5qcXVlcnk/KG58fHIpLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3RvcihuKS5maW5kKGUpO2lmKGlbMV0pe2lmKG49biBpbnN0YW5jZW9mIHg/blswXTpuLHgubWVyZ2UodGhpcyx4LnBhcnNlSFRNTChpWzFdLG4mJm4ubm9kZVR5cGU/bi5vd25lckRvY3VtZW50fHxuOmEsITApKSxrLnRlc3QoaVsxXSkmJnguaXNQbGFpbk9iamVjdChuKSlmb3IoaSBpbiBuKXguaXNGdW5jdGlvbih0aGlzW2ldKT90aGlzW2ldKG5baV0pOnRoaXMuYXR0cihpLG5baV0pO3JldHVybiB0aGlzfWlmKG89YS5nZXRFbGVtZW50QnlJZChpWzJdKSxvJiZvLnBhcmVudE5vZGUpe2lmKG8uaWQhPT1pWzJdKXJldHVybiByLmZpbmQoZSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPW99cmV0dXJuIHRoaXMuY29udGV4dD1hLHRoaXMuc2VsZWN0b3I9ZSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcyk6eC5pc0Z1bmN0aW9uKGUpP3IucmVhZHkoZSk6KGUuc2VsZWN0b3IhPT10JiYodGhpcy5zZWxlY3Rvcj1lLnNlbGVjdG9yLHRoaXMuY29udGV4dD1lLmNvbnRleHQpLHgubWFrZUFycmF5KGUsdGhpcykpfSxzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGcuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3RoaXMudG9BcnJheSgpOjA+ZT90aGlzW3RoaXMubGVuZ3RoK2VdOnRoaXNbZV19LHB1c2hTdGFjazpmdW5jdGlvbihlKXt2YXIgdD14Lm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gdC5wcmV2T2JqZWN0PXRoaXMsdC5jb250ZXh0PXRoaXMuY29udGV4dCx0fSxlYWNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguZWFjaCh0aGlzLGUsdCl9LHJlYWR5OmZ1bmN0aW9uKGUpe3JldHVybiB4LnJlYWR5LnByb21pc2UoKS5kb25lKGUpLHRoaXN9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGcuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoMD5lP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJnQ+bj9bdGhpc1tuXV06W10pfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpoLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSx4LmZuLmluaXQucHJvdG90eXBlPXguZm4seC5leHRlbmQ9eC5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSxuLHIsaSxvLGEscz1hcmd1bWVudHNbMF18fHt9LGw9MSx1PWFyZ3VtZW50cy5sZW5ndGgsYz0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgcyYmKGM9cyxzPWFyZ3VtZW50c1sxXXx8e30sbD0yKSwib2JqZWN0Ij09dHlwZW9mIHN8fHguaXNGdW5jdGlvbihzKXx8KHM9e30pLHU9PT1sJiYocz10aGlzLC0tbCk7dT5sO2wrKylpZihudWxsIT0obz1hcmd1bWVudHNbbF0pKWZvcihpIGluIG8pZT1zW2ldLHI9b1tpXSxzIT09ciYmKGMmJnImJih4LmlzUGxhaW5PYmplY3Qocil8fChuPXguaXNBcnJheShyKSkpPyhuPyhuPSExLGE9ZSYmeC5pc0FycmF5KGUpP2U6W10pOmE9ZSYmeC5pc1BsYWluT2JqZWN0KGUpP2U6e30sc1tpXT14LmV4dGVuZChjLGEscikpOnIhPT10JiYoc1tpXT1yKSk7cmV0dXJuIHN9LHguZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhmK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vQ29uZmxpY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIGUuJD09PXgmJihlLiQ9dSksdCYmZS5qUXVlcnk9PT14JiYoZS5qUXVlcnk9bCkseH0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oZSl7ZT94LnJlYWR5V2FpdCsrOngucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihlKXtpZihlPT09ITA/IS0teC5yZWFkeVdhaXQ6IXguaXNSZWFkeSl7aWYoIWEuYm9keSlyZXR1cm4gc2V0VGltZW91dCh4LnJlYWR5KTt4LmlzUmVhZHk9ITAsZSE9PSEwJiYtLXgucmVhZHlXYWl0PjB8fChuLnJlc29sdmVXaXRoKGEsW3hdKSx4LmZuLnRyaWdnZXImJngoYSkudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5IikpfX0saXNGdW5jdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT09eC50eXBlKGUpfSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJhcnJheSI9PT14LnR5cGUoZSl9LGlzV2luZG93OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT1lLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGUpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2NbeS5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIG47aWYoIWV8fCJvYmplY3QiIT09eC50eXBlKGUpfHxlLm5vZGVUeXBlfHx4LmlzV2luZG93KGUpKXJldHVybiExO3RyeXtpZihlLmNvbnN0cnVjdG9yJiYhdi5jYWxsKGUsImNvbnN0cnVjdG9yIikmJiF2LmNhbGwoZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChyKXtyZXR1cm4hMX1pZih4LnN1cHBvcnQub3duTGFzdClmb3IobiBpbiBlKXJldHVybiB2LmNhbGwoZSxuKTtmb3IobiBpbiBlKTtyZXR1cm4gbj09PXR8fHYuY2FsbChlLG4pfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IEVycm9yKGUpfSxwYXJzZUhUTUw6ZnVuY3Rpb24oZSx0LG4pe2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0PXR8fGE7dmFyIHI9ay5leGVjKGUpLGk9IW4mJltdO3JldHVybiByP1t0LmNyZWF0ZUVsZW1lbnQoclsxXSldOihyPXguYnVpbGRGcmFnbWVudChbZV0sdCxpKSxpJiZ4KGkpLnJlbW92ZSgpLHgubWVyZ2UoW10sci5jaGlsZE5vZGVzKSl9LHBhcnNlSlNPTjpmdW5jdGlvbihuKXtyZXR1cm4gZS5KU09OJiZlLkpTT04ucGFyc2U/ZS5KU09OLnBhcnNlKG4pOm51bGw9PT1uP246InN0cmluZyI9PXR5cGVvZiBuJiYobj14LnRyaW0obiksbiYmRS50ZXN0KG4ucmVwbGFjZShBLCJAIikucmVwbGFjZShqLCJdIikucmVwbGFjZShTLCIiKSkpP0Z1bmN0aW9uKCJyZXR1cm4gIituKSgpOih4LmVycm9yKCJJbnZhbGlkIEpTT046ICIrbiksdCl9LHBhcnNlWE1MOmZ1bmN0aW9uKG4pe3ZhciByLGk7aWYoIW58fCJzdHJpbmciIT10eXBlb2YgbilyZXR1cm4gbnVsbDt0cnl7ZS5ET01QYXJzZXI/KGk9bmV3IERPTVBhcnNlcixyPWkucGFyc2VGcm9tU3RyaW5nKG4sInRleHQveG1sIikpOihyPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksci5hc3luYz0iZmFsc2UiLHIubG9hZFhNTChuKSl9Y2F0Y2gobyl7cj10fXJldHVybiByJiZyLmRvY3VtZW50RWxlbWVudCYmIXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHx4LmVycm9yKCJJbnZhbGlkIFhNTDogIituKSxyfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKHQpe3QmJngudHJpbSh0KSYmKGUuZXhlY1NjcmlwdHx8ZnVuY3Rpb24odCl7ZS5ldmFsLmNhbGwoZSx0KX0pKHQpfSxjYW1lbENhc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShELCJtcy0iKS5yZXBsYWNlKEwsSCl9LG5vZGVOYW1lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT0wLG89ZS5sZW5ndGgsYT1NKGUpO2lmKG4pe2lmKGEpe2Zvcig7bz5pO2krKylpZihyPXQuYXBwbHkoZVtpXSxuKSxyPT09ITEpYnJlYWt9ZWxzZSBmb3IoaSBpbiBlKWlmKHI9dC5hcHBseShlW2ldLG4pLHI9PT0hMSlicmVha31lbHNlIGlmKGEpe2Zvcig7bz5pO2krKylpZihyPXQuY2FsbChlW2ldLGksZVtpXSkscj09PSExKWJyZWFrfWVsc2UgZm9yKGkgaW4gZSlpZihyPXQuY2FsbChlW2ldLGksZVtpXSkscj09PSExKWJyZWFrO3JldHVybiBlfSx0cmltOmImJiFiLmNhbGwoIlx1ZmVmZlx1MDBhMCIpP2Z1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmIuY2FsbChlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoQywiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoTShPYmplY3QoZSkpP3gubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOmguY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih0KXtpZihtKXJldHVybiBtLmNhbGwodCxlLG4pO2ZvcihyPXQubGVuZ3RoLG49bj8wPm4/TWF0aC5tYXgoMCxyK24pOm46MDtyPm47bisrKWlmKG4gaW4gdCYmdFtuXT09PWUpcmV0dXJuIG59cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGUsbil7dmFyIHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPTA7aWYoIm51bWJlciI9PXR5cGVvZiByKWZvcig7cj5vO28rKyllW2krK109bltvXTtlbHNlIHdoaWxlKG5bb10hPT10KWVbaSsrXT1uW28rK107cmV0dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1bXSxvPTAsYT1lLmxlbmd0aDtmb3Iobj0hIW47YT5vO28rKylyPSEhdChlW29dLG8pLG4hPT1yJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT0wLG89ZS5sZW5ndGgsYT1NKGUpLHM9W107aWYoYSlmb3IoO28+aTtpKyspcj10KGVbaV0saSxuKSxudWxsIT1yJiYoc1tzLmxlbmd0aF09cik7ZWxzZSBmb3IoaSBpbiBlKXI9dChlW2ldLGksbiksbnVsbCE9ciYmKHNbcy5sZW5ndGhdPXIpO3JldHVybiBkLmFwcGx5KFtdLHMpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oZSxuKXt2YXIgcixpLG87cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuJiYobz1lW25dLG49ZSxlPW8pLHguaXNGdW5jdGlvbihlKT8ocj1nLmNhbGwoYXJndW1lbnRzLDIpLGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShufHx0aGlzLHIuY29uY2F0KGcuY2FsbChhcmd1bWVudHMpKSl9LGkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHx4Lmd1aWQrKyxpKTp0fSxhY2Nlc3M6ZnVuY3Rpb24oZSxuLHIsaSxvLGEscyl7dmFyIGw9MCx1PWUubGVuZ3RoLGM9bnVsbD09cjtpZigib2JqZWN0Ij09PXgudHlwZShyKSl7bz0hMDtmb3IobCBpbiByKXguYWNjZXNzKGUsbixsLHJbbF0sITAsYSxzKX1lbHNlIGlmKGkhPT10JiYobz0hMCx4LmlzRnVuY3Rpb24oaSl8fChzPSEwKSxjJiYocz8obi5jYWxsKGUsaSksbj1udWxsKTooYz1uLG49ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBjLmNhbGwoeChlKSxuKX0pKSxuKSlmb3IoO3U+bDtsKyspbihlW2xdLHIscz9pOmkuY2FsbChlW2xdLGwsbihlW2xdLHIpKSk7cmV0dXJuIG8/ZTpjP24uY2FsbChlKTp1P24oZVswXSxyKTphfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sc3dhcDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9e307Zm9yKG8gaW4gdClhW29dPWUuc3R5bGVbb10sZS5zdHlsZVtvXT10W29dO2k9bi5hcHBseShlLHJ8fFtdKTtmb3IobyBpbiB0KWUuc3R5bGVbb109YVtvXTtyZXR1cm4gaX19KSx4LnJlYWR5LnByb21pc2U9ZnVuY3Rpb24odCl7aWYoIW4paWYobj14LkRlZmVycmVkKCksImNvbXBsZXRlIj09PWEucmVhZHlTdGF0ZSlzZXRUaW1lb3V0KHgucmVhZHkpO2Vsc2UgaWYoYS5hZGRFdmVudExpc3RlbmVyKWEuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIscSwhMSksZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixxLCExKTtlbHNle2EuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIscSksZS5hdHRhY2hFdmVudCgib25sb2FkIixxKTt2YXIgcj0hMTt0cnl7cj1udWxsPT1lLmZyYW1lRWxlbWVudCYmYS5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goaSl7fXImJnIuZG9TY3JvbGwmJmZ1bmN0aW9uIG8oKXtpZigheC5pc1JlYWR5KXt0cnl7ci5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGUpe3JldHVybiBzZXRUaW1lb3V0KG8sNTApfV8oKSx4LnJlYWR5KCl9fSgpfXJldHVybiBuLnByb21pc2UodCl9LHguZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2NbIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gTShlKXt2YXIgdD1lLmxlbmd0aCxuPXgudHlwZShlKTtyZXR1cm4geC5pc1dpbmRvdyhlKT8hMToxPT09ZS5ub2RlVHlwZSYmdD8hMDoiYXJyYXkiPT09bnx8ImZ1bmN0aW9uIiE9PW4mJigwPT09dHx8Im51bWJlciI9PXR5cGVvZiB0JiZ0PjAmJnQtMSBpbiBlKX1yPXgoYSksZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsbCx1LGMscCxmLGQsaCxnLG0seSx2LGI9InNpenpsZSIrLW5ldyBEYXRlLHc9ZS5kb2N1bWVudCxUPTAsQz0wLE49c3QoKSxrPXN0KCksRT1zdCgpLFM9ITEsQT1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dD8oUz0hMCwwKTowfSxqPXR5cGVvZiB0LEQ9MTw8MzEsTD17fS5oYXNPd25Qcm9wZXJ0eSxIPVtdLHE9SC5wb3AsXz1ILnB1c2gsTT1ILnB1c2gsTz1ILnNsaWNlLEY9SC5pbmRleE9mfHxmdW5jdGlvbihlKXt2YXIgdD0wLG49dGhpcy5sZW5ndGg7Zm9yKDtuPnQ7dCsrKWlmKHRoaXNbdF09PT1lKXJldHVybiB0O3JldHVybi0xfSxCPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsUD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsUj0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLFc9Ui5yZXBsYWNlKCJ3IiwidyMiKSwkPSJcXFsiK1ArIiooIitSKyIpIitQKyIqKD86KFsqXiR8IX5dPz0pIitQKyIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIitXKyIpfCl8KSIrUCsiKlxcXSIsST0iOigiK1IrIikoPzpcXCgoKFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woKD86XFxcXC58W15cXFxcKClbXFxdXXwiKyQucmVwbGFjZSgzLDgpKyIpKil8LiopXFwpfCkiLHo9UmVnRXhwKCJeIitQKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK1ArIiskIiwiZyIpLFg9UmVnRXhwKCJeIitQKyIqLCIrUCsiKiIpLFU9UmVnRXhwKCJeIitQKyIqKFs+K35dfCIrUCsiKSIrUCsiKiIpLFY9UmVnRXhwKFArIipbK35dIiksWT1SZWdFeHAoIj0iK1ArIiooW15cXF0nXCJdKikiK1ArIipcXF0iLCJnIiksSj1SZWdFeHAoSSksRz1SZWdFeHAoIl4iK1crIiQiKSxRPXtJRDpSZWdFeHAoIl4jKCIrUisiKSIpLENMQVNTOlJlZ0V4cCgiXlxcLigiK1IrIikiKSxUQUc6UmVnRXhwKCJeKCIrUi5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6UmVnRXhwKCJeIiskKSxQU0VVRE86UmVnRXhwKCJeIitJKSxDSElMRDpSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrUCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrUCsiKig/OihbKy1dfCkiK1ArIiooXFxkKyl8KSkiK1ArIipcXCl8KSIsImkiKSxib29sOlJlZ0V4cCgiXig/OiIrQisiKSQiLCJpIiksbmVlZHNDb250ZXh0OlJlZ0V4cCgiXiIrUCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitQKyIqKCg/Oi1cXGQpP1xcZCopIitQKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxLPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxaPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sZXQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSx0dD0vXmhcZCQvaSxudD0vJ3xcXC9nLHJ0PVJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitQKyI/fCgiK1ArIil8LikiLCJpZyIpLGl0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPT1yfHxuP3Q6MD5yP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxyPj4xMCw1NjMyMHwxMDIzJnIpfTt0cnl7TS5hcHBseShIPU8uY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksSFt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChvdCl7TT17YXBwbHk6SC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtfLmFwcGx5KGUsTy5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gYXQoZSx0LG4saSl7dmFyIG8sYSxzLGwsdSxjLGQsbSx5LHg7aWYoKHQ/dC5vd25lckRvY3VtZW50fHx0OncpIT09ZiYmcCh0KSx0PXR8fGYsbj1ufHxbXSwhZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBuO2lmKDEhPT0obD10Lm5vZGVUeXBlKSYmOSE9PWwpcmV0dXJuW107aWYoaCYmIWkpe2lmKG89Wi5leGVjKGUpKWlmKHM9b1sxXSl7aWYoOT09PWwpe2lmKGE9dC5nZXRFbGVtZW50QnlJZChzKSwhYXx8IWEucGFyZW50Tm9kZSlyZXR1cm4gbjtpZihhLmlkPT09cylyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZSBpZih0Lm93bmVyRG9jdW1lbnQmJihhPXQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChzKSkmJnYodCxhKSYmYS5pZD09PXMpcmV0dXJuIG4ucHVzaChhKSxufWVsc2V7aWYob1syXSlyZXR1cm4gTS5hcHBseShuLHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLG47aWYoKHM9b1szXSkmJnIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBNLmFwcGx5KG4sdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHMpKSxufWlmKHIucXNhJiYoIWd8fCFnLnRlc3QoZSkpKXtpZihtPWQ9Yix5PXQseD05PT09bCYmZSwxPT09bCYmIm9iamVjdCIhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe2M9bXQoZSksKGQ9dC5nZXRBdHRyaWJ1dGUoImlkIikpP209ZC5yZXBsYWNlKG50LCJcXCQmIik6dC5zZXRBdHRyaWJ1dGUoImlkIixtKSxtPSJbaWQ9JyIrbSsiJ10gIix1PWMubGVuZ3RoO3doaWxlKHUtLSljW3VdPW0reXQoY1t1XSk7eT1WLnRlc3QoZSkmJnQucGFyZW50Tm9kZXx8dCx4PWMuam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBNLmFwcGx5KG4seS5xdWVyeVNlbGVjdG9yQWxsKHgpKSxufWNhdGNoKFQpe31maW5hbGx5e2R8fHQucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGt0KGUucmVwbGFjZSh6LCIkMSIpLHQsbixpKX1mdW5jdGlvbiBzdCgpe3ZhciBlPVtdO2Z1bmN0aW9uIHQobixyKXtyZXR1cm4gZS5wdXNoKG4rPSIgIik+by5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W25dPXJ9cmV0dXJuIHR9ZnVuY3Rpb24gbHQoZSl7cmV0dXJuIGVbYl09ITAsZX1mdW5jdGlvbiB1dChlKXt2YXIgdD1mLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2gobil7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGN0KGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLHI9ZS5sZW5ndGg7d2hpbGUoci0tKW8uYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIHB0KGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmKH50LnNvdXJjZUluZGV4fHxEKS0ofmUuc291cmNlSW5kZXh8fEQpO2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBmdChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1uJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBkdChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09bnx8ImJ1dHRvbiI9PT1uKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gaHQoZSl7cmV0dXJuIGx0KGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LGx0KGZ1bmN0aW9uKG4scil7dmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKW5baT1vW2FdXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9cz1hdC5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHQ/IkhUTUwiIT09dC5ub2RlTmFtZTohMX0scj1hdC5zdXBwb3J0PXt9LHA9YXQuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIG49ZT9lLm93bmVyRG9jdW1lbnR8fGU6dyxpPW4uZGVmYXVsdFZpZXc7cmV0dXJuIG4hPT1mJiY5PT09bi5ub2RlVHlwZSYmbi5kb2N1bWVudEVsZW1lbnQ/KGY9bixkPW4uZG9jdW1lbnRFbGVtZW50LGg9IXMobiksaSYmaS5hdHRhY2hFdmVudCYmaSE9PWkudG9wJiZpLmF0dGFjaEV2ZW50KCJvbmJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXtwKCl9KSxyLmF0dHJpYnV0ZXM9dXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksci5nZXRFbGVtZW50c0J5VGFnTmFtZT11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChuLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J2EnPjwvZGl2PjxkaXYgY2xhc3M9J2EgaSc+PC9kaXY+IixlLmZpcnN0Q2hpbGQuY2xhc3NOYW1lPSJpIiwyPT09ZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpIikubGVuZ3RofSksci5nZXRCeUlkPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBkLmFwcGVuZENoaWxkKGUpLmlkPWIsIW4uZ2V0RWxlbWVudHNCeU5hbWV8fCFuLmdldEVsZW1lbnRzQnlOYW1lKGIpLmxlbmd0aH0pLHIuZ2V0QnlJZD8oby5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQhPT1qJiZoKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuJiZuLnBhcmVudE5vZGU/W25dOltdfX0sby5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHJ0LGl0KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJpZCIpPT09dH19KTooZGVsZXRlIG8uZmluZC5JRCxvLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UocnQsaXQpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj10eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT09aiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09dH19KSxvLmZpbmQuVEFHPXIuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdHlwZW9mIG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1qP24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6dH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sby5maW5kLkNMQVNTPXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSxuKXtyZXR1cm4gdHlwZW9mIG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PWomJmg/bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpOnR9LG09W10sZz1bXSwoci5xc2E9Sy50ZXN0KG4ucXVlcnlTZWxlY3RvckFsbCkpJiYodXQoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8Zy5wdXNoKCJcXFsiK1ArIiooPzp2YWx1ZXwiK0IrIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxnLnB1c2goIjpjaGVja2VkIil9KSx1dChmdW5jdGlvbihlKXt2YXIgdD1uLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxlLmFwcGVuZENoaWxkKHQpLnNldEF0dHJpYnV0ZSgidCIsIiIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3RePScnXSIpLmxlbmd0aCYmZy5wdXNoKCJbKl4kXT0iK1ArIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fGcucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxnLnB1c2goIiwuKjoiKX0pKSwoci5tYXRjaGVzU2VsZWN0b3I9Sy50ZXN0KHk9ZC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGQubW96TWF0Y2hlc1NlbGVjdG9yfHxkLm9NYXRjaGVzU2VsZWN0b3J8fGQubXNNYXRjaGVzU2VsZWN0b3IpKSYmdXQoZnVuY3Rpb24oZSl7ci5kaXNjb25uZWN0ZWRNYXRjaD15LmNhbGwoZSwiZGl2IikseS5jYWxsKGUsIltzIT0nJ106eCIpLG0ucHVzaCgiIT0iLEkpfSksZz1nLmxlbmd0aCYmUmVnRXhwKGcuam9pbigifCIpKSxtPW0ubGVuZ3RoJiZSZWdFeHAobS5qb2luKCJ8IikpLHY9Sy50ZXN0KGQuY29udGFpbnMpfHxkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sQT1kLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIFM9ITAsMDt2YXIgaT10LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpO3JldHVybiBpPzEmaXx8IXIuc29ydERldGFjaGVkJiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpPT09aT9lPT09bnx8dih3LGUpPy0xOnQ9PT1ufHx2KHcsdCk/MTpjP0YuY2FsbChjLGUpLUYuY2FsbChjLHQpOjA6NCZpPy0xOjE6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxfTpmdW5jdGlvbihlLHQpe3ZhciByLGk9MCxvPWUucGFyZW50Tm9kZSxhPXQucGFyZW50Tm9kZSxzPVtlXSxsPVt0XTtpZihlPT09dClyZXR1cm4gUz0hMCwwO2lmKCFvfHwhYSlyZXR1cm4gZT09PW4/LTE6dD09PW4/MTpvPy0xOmE/MTpjP0YuY2FsbChjLGUpLUYuY2FsbChjLHQpOjA7aWYobz09PWEpcmV0dXJuIHB0KGUsdCk7cj1lO3doaWxlKHI9ci5wYXJlbnROb2RlKXMudW5zaGlmdChyKTtyPXQ7d2hpbGUocj1yLnBhcmVudE5vZGUpbC51bnNoaWZ0KHIpO3doaWxlKHNbaV09PT1sW2ldKWkrKztyZXR1cm4gaT9wdChzW2ldLGxbaV0pOnNbaV09PT13Py0xOmxbaV09PT13PzE6MH0sbik6Zn0sYXQubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBhdChlLG51bGwsbnVsbCx0KX0sYXQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoKGUub3duZXJEb2N1bWVudHx8ZSkhPT1mJiZwKGUpLHQ9dC5yZXBsYWNlKFksIj0nJDEnXSIpLCEoIXIubWF0Y2hlc1NlbGVjdG9yfHwhaHx8bSYmbS50ZXN0KHQpfHxnJiZnLnRlc3QodCkpKXRyeXt2YXIgbj15LmNhbGwoZSx0KTtpZihufHxyLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2goaSl7fXJldHVybiBhdCh0LGYsbnVsbCxbZV0pLmxlbmd0aD4wfSxhdC5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT09ZiYmcChlKSx2KGUsdCl9LGF0LmF0dHI9ZnVuY3Rpb24oZSxuKXsoZS5vd25lckRvY3VtZW50fHxlKSE9PWYmJnAoZSk7dmFyIGk9by5hdHRySGFuZGxlW24udG9Mb3dlckNhc2UoKV0sYT1pJiZMLmNhbGwoby5hdHRySGFuZGxlLG4udG9Mb3dlckNhc2UoKSk/aShlLG4sIWgpOnQ7cmV0dXJuIGE9PT10P3IuYXR0cmlidXRlc3x8IWg/ZS5nZXRBdHRyaWJ1dGUobik6KGE9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pKSYmYS5zcGVjaWZpZWQ/YS52YWx1ZTpudWxsOmF9LGF0LmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxhdC51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LG49W10saT0wLG89MDtpZihTPSFyLmRldGVjdER1cGxpY2F0ZXMsYz0hci5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChBKSxTKXt3aGlsZSh0PWVbbysrXSl0PT09ZVtvXSYmKGk9bi5wdXNoKG8pKTt3aGlsZShpLS0pZS5zcGxpY2UobltpXSwxKX1yZXR1cm4gZX0sYT1hdC5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1hKGUpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIGZvcig7dD1lW3JdO3IrKyluKz1hKHQpO3JldHVybiBufSxvPWF0LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmx0LG1hdGNoOlEsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZShydCxpdCksZVszXT0oZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UocnQsaXQpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxhdC5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZhdC5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIG4scj0hZVs1XSYmZVsyXTtyZXR1cm4gUS5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10mJmVbNF0hPT10P2VbMl09ZVs0XTpyJiZKLnRlc3QocikmJihuPW10KHIsITApKSYmKG49ci5pbmRleE9mKCIpIixyLmxlbmd0aC1uKS1yLmxlbmd0aCkmJihlWzBdPWVbMF0uc2xpY2UoMCxuKSxlWzJdPXIuc2xpY2UoMCxuKSksZS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShydCxpdCkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9TltlKyIgIl07cmV0dXJuIHR8fCh0PVJlZ0V4cCgiKF58IitQKyIpIitlKyIoIitQKyJ8JCkiKSkmJk4oZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGUhPT1qJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyKXt2YXIgaT1hdC5hdHRyKHIsZSk7cmV0dXJuIG51bGw9PWk/IiE9Ij09PXQ6dD8oaSs9IiIsIj0iPT09dD9pPT09bjoiIT0iPT09dD9pIT09bjoiXj0iPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOiIqPSI9PT10P24mJmkuaW5kZXhPZihuKT4tMToiJD0iPT09dD9uJiZpLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT10PygiICIraSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PXQ/aT09PW58fGkuc2xpY2UoMCxuLmxlbmd0aCsxKT09PW4rIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNsaWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09aT9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLGwpe3ZhciB1LGMscCxmLGQsaCxnPW8hPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsbT10LnBhcmVudE5vZGUseT1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksdj0hbCYmIXM7aWYobSl7aWYobyl7d2hpbGUoZyl7cD10O3doaWxlKHA9cFtnXSlpZihzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXk6MT09PXAubm9kZVR5cGUpcmV0dXJuITE7aD1nPSJvbmx5Ij09PWUmJiFoJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKGg9W2E/bS5maXJzdENoaWxkOm0ubGFzdENoaWxkXSxhJiZ2KXtjPW1bYl18fChtW2JdPXt9KSx1PWNbZV18fFtdLGQ9dVswXT09PVQmJnVbMV0sZj11WzBdPT09VCYmdVsyXSxwPWQmJm0uY2hpbGROb2Rlc1tkXTt3aGlsZShwPSsrZCYmcCYmcFtnXXx8KGY9ZD0wKXx8aC5wb3AoKSlpZigxPT09cC5ub2RlVHlwZSYmKytmJiZwPT09dCl7Y1tlXT1bVCxkLGZdO2JyZWFrfX1lbHNlIGlmKHYmJih1PSh0W2JdfHwodFtiXT17fSkpW2VdKSYmdVswXT09PVQpZj11WzFdO2Vsc2Ugd2hpbGUocD0rK2QmJnAmJnBbZ118fChmPWQ9MCl8fGgucG9wKCkpaWYoKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSkmJisrZiYmKHYmJigocFtiXXx8KHBbYl09e30pKVtlXT1bVCxmXSkscD09PXQpKWJyZWFrO3JldHVybiBmLT1pLGY9PT1yfHwwPT09ZiVyJiZmL3I+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1vLnBzZXVkb3NbZV18fG8uc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxhdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiByW2JdP3IodCk6ci5sZW5ndGg+MT8obj1bZSxlLCIiLHRdLG8uc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2x0KGZ1bmN0aW9uKGUsbil7dmFyIGksbz1yKGUsdCksYT1vLmxlbmd0aDt3aGlsZShhLS0paT1GLmNhbGwoZSxvW2FdKSxlW2ldPSEobltpXT1vW2FdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiByKGUsMCxuKX0pOnJ9fSxwc2V1ZG9zOntub3Q6bHQoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxyPWwoZS5yZXBsYWNlKHosIiQxIikpO3JldHVybiByW2JdP2x0KGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLGE9cihlLG51bGwsaSxbXSkscz1lLmxlbmd0aDt3aGlsZShzLS0pKG89YVtzXSkmJihlW3NdPSEodFtzXT1vKSl9KTpmdW5jdGlvbihlLGksbyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxvLG4pLCFuLnBvcCgpfX0pLGhhczpsdChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGF0KGUsdCkubGVuZ3RoPjB9fSksY29udGFpbnM6bHQoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybih0LnRleHRDb250ZW50fHx0LmlubmVyVGV4dHx8YSh0KSkuaW5kZXhPZihlKT4tMX19KSxsYW5nOmx0KGZ1bmN0aW9uKGUpe3JldHVybiBHLnRlc3QoZXx8IiIpfHxhdC5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIitlKSxlPWUucmVwbGFjZShydCxpdCkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXt2YXIgbjtkbyBpZihuPWg/dC5sYW5nOnQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHx0LmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBuPW4udG9Mb3dlckNhc2UoKSxuPT09ZXx8MD09PW4uaW5kZXhPZihlKyItIik7d2hpbGUoKHQ9dC5wYXJlbnROb2RlKSYmMT09PXQubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbih0KXt2YXIgbj1lLmxvY2F0aW9uJiZlLmxvY2F0aW9uLmhhc2g7cmV0dXJuIG4mJm4uc2xpY2UoMSk9PT10LmlkfSxyb290OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09ZH0sZm9jdXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1mLmFjdGl2ZUVsZW1lbnQmJighZi5oYXNGb2N1c3x8Zi5oYXNGb2N1cygpKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmISFlLmNoZWNrZWR8fCJvcHRpb24iPT09dCYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxlLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGUpe2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVOYW1lPiJAInx8Mz09PWUubm9kZVR5cGV8fDQ9PT1lLm5vZGVUeXBlKXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIW8ucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0dC50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gZXQudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8dC50b0xvd2VyQ2FzZSgpPT09ZS50eXBlKX0sZmlyc3Q6aHQoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Omh0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTpodChmdW5jdGlvbihlLHQsbil7cmV0dXJuWzA+bj9uK3Q6bl19KSxldmVuOmh0KGZ1bmN0aW9uKGUsdCl7dmFyIG49MDtmb3IoO3Q+bjtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpodChmdW5jdGlvbihlLHQpe3ZhciBuPTE7Zm9yKDt0Pm47bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxsdDpodChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7LS1yPj0wOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDpodChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7dD4rK3I7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0sby5wc2V1ZG9zLm50aD1vLnBzZXVkb3MuZXE7Zm9yKG4gaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pby5wc2V1ZG9zW25dPWZ0KG4pO2ZvcihuIGlue3N1Ym1pdDohMCxyZXNldDohMH0pby5wc2V1ZG9zW25dPWR0KG4pO2Z1bmN0aW9uIGd0KCl7fWd0LnByb3RvdHlwZT1vLmZpbHRlcnM9by5wc2V1ZG9zLG8uc2V0RmlsdGVycz1uZXcgZ3Q7ZnVuY3Rpb24gbXQoZSx0KXt2YXIgbixyLGksYSxzLGwsdSxjPWtbZSsiICJdO2lmKGMpcmV0dXJuIHQ/MDpjLnNsaWNlKDApO3M9ZSxsPVtdLHU9by5wcmVGaWx0ZXI7d2hpbGUocyl7KCFufHwocj1YLmV4ZWMocykpKSYmKHImJihzPXMuc2xpY2UoclswXS5sZW5ndGgpfHxzKSxsLnB1c2goaT1bXSkpLG49ITEsKHI9VS5leGVjKHMpKSYmKG49ci5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOnJbMF0ucmVwbGFjZSh6LCIgIil9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtmb3IoYSBpbiBvLmZpbHRlcikhKHI9UVthXS5leGVjKHMpKXx8dVthXSYmIShyPXVbYV0ocikpfHwobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6YSxtYXRjaGVzOnJ9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gdD9zLmxlbmd0aDpzP2F0LmVycm9yKGUpOmsoZSxsKS5zbGljZSgwKX1mdW5jdGlvbiB5dChlKXt2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjtmb3IoO24+dDt0Kyspcis9ZVt0XS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiB2dChlLHQsbil7dmFyIHI9dC5kaXIsbz1uJiYicGFyZW50Tm9kZSI9PT1yLGE9QysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixpKXt3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fG8pcmV0dXJuIGUodCxuLGkpfTpmdW5jdGlvbih0LG4scyl7dmFyIGwsdSxjLHA9VCsiICIrYTtpZihzKXt3aGlsZSh0PXRbcl0paWYoKDE9PT10Lm5vZGVUeXBlfHxvKSYmZSh0LG4scykpcmV0dXJuITB9ZWxzZSB3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fG8paWYoYz10W2JdfHwodFtiXT17fSksKHU9Y1tyXSkmJnVbMF09PT1wKXtpZigobD11WzFdKT09PSEwfHxsPT09aSlyZXR1cm4gbD09PSEwfWVsc2UgaWYodT1jW3JdPVtwXSx1WzFdPWUodCxuLHMpfHxpLHVbMV09PT0hMClyZXR1cm4hMH19ZnVuY3Rpb24gYnQoZSl7cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUubGVuZ3RoO3doaWxlKGktLSlpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24geHQoZSx0LG4scixpKXt2YXIgbyxhPVtdLHM9MCxsPWUubGVuZ3RoLHU9bnVsbCE9dDtmb3IoO2w+cztzKyspKG89ZVtzXSkmJighbnx8bihvLHIsaSkpJiYoYS5wdXNoKG8pLHUmJnQucHVzaChzKSk7cmV0dXJuIGF9ZnVuY3Rpb24gd3QoZSx0LG4scixpLG8pe3JldHVybiByJiYhcltiXSYmKHI9d3QocikpLGkmJiFpW2JdJiYoaT13dChpLG8pKSxsdChmdW5jdGlvbihvLGEscyxsKXt2YXIgdSxjLHAsZj1bXSxkPVtdLGg9YS5sZW5ndGgsZz1vfHxOdCh0fHwiKiIscy5ub2RlVHlwZT9bc106cyxbXSksbT0hZXx8IW8mJnQ/Zzp4dChnLGYsZSxzLGwpLHk9bj9pfHwobz9lOmh8fHIpP1tdOmE6bTtpZihuJiZuKG0seSxzLGwpLHIpe3U9eHQoeSxkKSxyKHUsW10scyxsKSxjPXUubGVuZ3RoO3doaWxlKGMtLSkocD11W2NdKSYmKHlbZFtjXV09IShtW2RbY11dPXApKX1pZihvKXtpZihpfHxlKXtpZihpKXt1PVtdLGM9eS5sZW5ndGg7d2hpbGUoYy0tKShwPXlbY10pJiZ1LnB1c2gobVtjXT1wKTtpKG51bGwseT1bXSx1LGwpfWM9eS5sZW5ndGg7d2hpbGUoYy0tKShwPXlbY10pJiYodT1pP0YuY2FsbChvLHApOmZbY10pPi0xJiYob1t1XT0hKGFbdV09cCkpfX1lbHNlIHk9eHQoeT09PWE/eS5zcGxpY2UoaCx5Lmxlbmd0aCk6eSksaT9pKG51bGwsYSx5LGwpOk0uYXBwbHkoYSx5KX0pfWZ1bmN0aW9uIFR0KGUpe3ZhciB0LG4scixpPWUubGVuZ3RoLGE9by5yZWxhdGl2ZVtlWzBdLnR5cGVdLHM9YXx8by5yZWxhdGl2ZVsiICJdLGw9YT8xOjAsYz12dChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LHMsITApLHA9dnQoZnVuY3Rpb24oZSl7cmV0dXJuIEYuY2FsbCh0LGUpPi0xfSxzLCEwKSxmPVtmdW5jdGlvbihlLG4scil7cmV0dXJuIWEmJihyfHxuIT09dSl8fCgodD1uKS5ub2RlVHlwZT9jKGUsbixyKTpwKGUsbixyKSl9XTtmb3IoO2k+bDtsKyspaWYobj1vLnJlbGF0aXZlW2VbbF0udHlwZV0pZj1bdnQoYnQoZiksbildO2Vsc2V7aWYobj1vLmZpbHRlcltlW2xdLnR5cGVdLmFwcGx5KG51bGwsZVtsXS5tYXRjaGVzKSxuW2JdKXtmb3Iocj0rK2w7aT5yO3IrKylpZihvLnJlbGF0aXZlW2Vbcl0udHlwZV0pYnJlYWs7cmV0dXJuIHd0KGw+MSYmYnQoZiksbD4xJiZ5dChlLnNsaWNlKDAsbC0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbbC0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKHosIiQxIiksbixyPmwmJlR0KGUuc2xpY2UobCxyKSksaT5yJiZUdChlPWUuc2xpY2UocikpLGk+ciYmeXQoZSkpfWYucHVzaChuKX1yZXR1cm4gYnQoZil9ZnVuY3Rpb24gQ3QoZSx0KXt2YXIgbj0wLHI9dC5sZW5ndGg+MCxhPWUubGVuZ3RoPjAscz1mdW5jdGlvbihzLGwsYyxwLGQpe3ZhciBoLGcsbSx5PVtdLHY9MCxiPSIwIix4PXMmJltdLHc9bnVsbCE9ZCxDPXUsTj1zfHxhJiZvLmZpbmQuVEFHKCIqIixkJiZsLnBhcmVudE5vZGV8fGwpLGs9VCs9bnVsbD09Qz8xOk1hdGgucmFuZG9tKCl8fC4xO2Zvcih3JiYodT1sIT09ZiYmbCxpPW4pO251bGwhPShoPU5bYl0pO2IrKyl7aWYoYSYmaCl7Zz0wO3doaWxlKG09ZVtnKytdKWlmKG0oaCxsLGMpKXtwLnB1c2goaCk7YnJlYWt9dyYmKFQ9ayxpPSsrbil9ciYmKChoPSFtJiZoKSYmdi0tLHMmJngucHVzaChoKSl9aWYodis9YixyJiZiIT09dil7Zz0wO3doaWxlKG09dFtnKytdKW0oeCx5LGwsYyk7aWYocyl7aWYodj4wKXdoaWxlKGItLSl4W2JdfHx5W2JdfHwoeVtiXT1xLmNhbGwocCkpO3k9eHQoeSl9TS5hcHBseShwLHkpLHcmJiFzJiZ5Lmxlbmd0aD4wJiZ2K3QubGVuZ3RoPjEmJmF0LnVuaXF1ZVNvcnQocCl9cmV0dXJuIHcmJihUPWssdT1DKSx4fTtyZXR1cm4gcj9sdChzKTpzfWw9YXQuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1bXSxvPUVbZSsiICJdO2lmKCFvKXt0fHwodD1tdChlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pbz1UdCh0W25dKSxvW2JdP3IucHVzaChvKTppLnB1c2gobyk7bz1FKGUsQ3QoaSxyKSl9cmV0dXJuIG99O2Z1bmN0aW9uIE50KGUsdCxuKXt2YXIgcj0wLGk9dC5sZW5ndGg7Zm9yKDtpPnI7cisrKWF0KGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiBrdChlLHQsbixpKXt2YXIgYSxzLHUsYyxwLGY9bXQoZSk7aWYoIWkmJjE9PT1mLmxlbmd0aCl7aWYocz1mWzBdPWZbMF0uc2xpY2UoMCkscy5sZW5ndGg+MiYmIklEIj09PSh1PXNbMF0pLnR5cGUmJnIuZ2V0QnlJZCYmOT09PXQubm9kZVR5cGUmJmgmJm8ucmVsYXRpdmVbc1sxXS50eXBlXSl7aWYodD0oby5maW5kLklEKHUubWF0Y2hlc1swXS5yZXBsYWNlKHJ0LGl0KSx0KXx8W10pWzBdLCF0KXJldHVybiBuO2U9ZS5zbGljZShzLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1hPVEubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpzLmxlbmd0aDt3aGlsZShhLS0pe2lmKHU9c1thXSxvLnJlbGF0aXZlW2M9dS50eXBlXSlicmVhaztpZigocD1vLmZpbmRbY10pJiYoaT1wKHUubWF0Y2hlc1swXS5yZXBsYWNlKHJ0LGl0KSxWLnRlc3Qoc1swXS50eXBlKSYmdC5wYXJlbnROb2RlfHx0KSkpe2lmKHMuc3BsaWNlKGEsMSksZT1pLmxlbmd0aCYmeXQocyksIWUpcmV0dXJuIE0uYXBwbHkobixpKSxuO2JyZWFrfX19cmV0dXJuIGwoZSxmKShpLHQsIWgsbixWLnRlc3QoZSkpLG59ci5zb3J0U3RhYmxlPWIuc3BsaXQoIiIpLnNvcnQoQSkuam9pbigiIik9PT1iLHIuZGV0ZWN0RHVwbGljYXRlcz1TLHAoKSxyLnNvcnREZXRhY2hlZD11dChmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGYuY3JlYXRlRWxlbWVudCgiZGl2IikpfSksdXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8Y3QoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gcj90OmUuZ2V0QXR0cmlidXRlKG4sInR5cGUiPT09bi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxyLmF0dHJpYnV0ZXMmJnV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGN0KCJ2YWx1ZSIsZnVuY3Rpb24oZSxuLHIpe3JldHVybiByfHwiaW5wdXQiIT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3Q6ZS5kZWZhdWx0VmFsdWV9KSx1dChmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8Y3QoQixmdW5jdGlvbihlLG4scil7dmFyIGk7cmV0dXJuIHI/dDooaT1lLmdldEF0dHJpYnV0ZU5vZGUobikpJiZpLnNwZWNpZmllZD9pLnZhbHVlOmVbbl09PT0hMD9uLnRvTG93ZXJDYXNlKCk6bnVsbH0pLHguZmluZD1hdCx4LmV4cHI9YXQuc2VsZWN0b3JzLHguZXhwclsiOiJdPXguZXhwci5wc2V1ZG9zLHgudW5pcXVlPWF0LnVuaXF1ZVNvcnQseC50ZXh0PWF0LmdldFRleHQseC5pc1hNTERvYz1hdC5pc1hNTCx4LmNvbnRhaW5zPWF0LmNvbnRhaW5zfShlKTt2YXIgTz17fTtmdW5jdGlvbiBGKGUpe3ZhciB0PU9bZV09e307cmV0dXJuIHguZWFjaChlLm1hdGNoKFQpfHxbXSxmdW5jdGlvbihlLG4pe3Rbbl09ITB9KSx0fXguQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9InN0cmluZyI9PXR5cGVvZiBlP09bZV18fEYoZSk6eC5leHRlbmQoe30sZSk7dmFyIG4scixpLG8sYSxzLGw9W10sdT0hZS5vbmNlJiZbXSxjPWZ1bmN0aW9uKHQpe2ZvcihyPWUubWVtb3J5JiZ0LGk9ITAsYT1zfHwwLHM9MCxvPWwubGVuZ3RoLG49ITA7bCYmbz5hO2ErKylpZihsW2FdLmFwcGx5KHRbMF0sdFsxXSk9PT0hMSYmZS5zdG9wT25GYWxzZSl7cj0hMTticmVha31uPSExLGwmJih1P3UubGVuZ3RoJiZjKHUuc2hpZnQoKSk6cj9sPVtdOnAuZGlzYWJsZSgpKX0scD17YWRkOmZ1bmN0aW9uKCl7aWYobCl7dmFyIHQ9bC5sZW5ndGg7KGZ1bmN0aW9uIGkodCl7eC5lYWNoKHQsZnVuY3Rpb24odCxuKXt2YXIgcj14LnR5cGUobik7ImZ1bmN0aW9uIj09PXI/ZS51bmlxdWUmJnAuaGFzKG4pfHxsLnB1c2gobik6biYmbi5sZW5ndGgmJiJzdHJpbmciIT09ciYmaShuKX0pfSkoYXJndW1lbnRzKSxuP289bC5sZW5ndGg6ciYmKHM9dCxjKHIpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGwmJnguZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgcjt3aGlsZSgocj14LmluQXJyYXkodCxsLHIpKT4tMSlsLnNwbGljZShyLDEpLG4mJihvPj1yJiZvLS0sYT49ciYmYS0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT94LmluQXJyYXkoZSxsKT4tMTohKCFsfHwhbC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBsPVtdLG89MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGw9dT1yPXQsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hbH0sbG9jazpmdW5jdGlvbigpe3JldHVybiB1PXQscnx8cC5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIXV9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIWx8fGkmJiF1fHwodD10fHxbXSx0PVtlLHQuc2xpY2U/dC5zbGljZSgpOnRdLG4/dS5wdXNoKHQpOmModCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gcC5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9fTtyZXR1cm4gcH0seC5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciB0PVtbInJlc29sdmUiLCJkb25lIix4LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLHguQ2FsbGJhY2tzKCJtZW1vcnkiKV1dLG49InBlbmRpbmciLHI9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG59LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4geC5EZWZlcnJlZChmdW5jdGlvbihuKXt4LmVhY2godCxmdW5jdGlvbih0LG8pe3ZhciBhPW9bMF0scz14LmlzRnVuY3Rpb24oZVt0XSkmJmVbdF07aVtvWzFdXShmdW5jdGlvbigpe3ZhciBlPXMmJnMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJnguaXNGdW5jdGlvbihlLnByb21pc2UpP2UucHJvbWlzZSgpLmRvbmUobi5yZXNvbHZlKS5mYWlsKG4ucmVqZWN0KS5wcm9ncmVzcyhuLm5vdGlmeSk6blthKyJXaXRoIl0odGhpcz09PXI/bi5wcm9taXNlKCk6dGhpcyxzP1tlXTphcmd1bWVudHMpfSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/eC5leHRlbmQoZSxyKTpyfX0saT17fTtyZXR1cm4gci5waXBlPXIudGhlbix4LmVhY2godCxmdW5jdGlvbihlLG8pe3ZhciBhPW9bMl0scz1vWzNdO3Jbb1sxXV09YS5hZGQscyYmYS5hZGQoZnVuY3Rpb24oKXtuPXN9LHRbMV5lXVsyXS5kaXNhYmxlLHRbMl1bMl0ubG9jayksaVtvWzBdXT1mdW5jdGlvbigpe3JldHVybiBpW29bMF0rIldpdGgiXSh0aGlzPT09aT9yOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxpW29bMF0rIldpdGgiXT1hLmZpcmVXaXRofSksci5wcm9taXNlKGkpLGUmJmUuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWcuY2FsbChhcmd1bWVudHMpLHI9bi5sZW5ndGgsaT0xIT09cnx8ZSYmeC5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/cjowLG89MT09PWk/ZTp4LkRlZmVycmVkKCksYT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3RbZV09dGhpcyxuW2VdPWFyZ3VtZW50cy5sZW5ndGg+MT9nLmNhbGwoYXJndW1lbnRzKTpyLG49PT1zP28ubm90aWZ5V2l0aCh0LG4pOi0taXx8by5yZXNvbHZlV2l0aCh0LG4pfX0scyxsLHU7aWYocj4xKWZvcihzPUFycmF5KHIpLGw9QXJyYXkociksdT1BcnJheShyKTtyPnQ7dCsrKW5bdF0mJnguaXNGdW5jdGlvbihuW3RdLnByb21pc2UpP25bdF0ucHJvbWlzZSgpLmRvbmUoYSh0LHUsbikpLmZhaWwoby5yZWplY3QpLnByb2dyZXNzKGEodCxsLHMpKTotLWk7cmV0dXJuIGl8fG8ucmVzb2x2ZVdpdGgodSxuKSxvLnByb21pc2UoKX19KSx4LnN1cHBvcnQ9ZnVuY3Rpb24odCl7dmFyIG4scixvLHMsbCx1LGMscCxmLGQ9YS5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZihkLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLGQuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLG49ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpfHxbXSxyPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSwhcnx8IXIuc3R5bGV8fCFuLmxlbmd0aClyZXR1cm4gdDtzPWEuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksdT1zLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLG89ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxyLnN0eWxlLmNzc1RleHQ9InRvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41Iix0LmdldFNldEF0dHJpYnV0ZT0idCIhPT1kLmNsYXNzTmFtZSx0LmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1kLmZpcnN0Q2hpbGQubm9kZVR5cGUsdC50Ym9keT0hZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsdC5odG1sU2VyaWFsaXplPSEhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCx0LnN0eWxlPS90b3AvLnRlc3Qoci5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLHQuaHJlZk5vcm1hbGl6ZWQ9Ii9hIj09PXIuZ2V0QXR0cmlidXRlKCJocmVmIiksdC5vcGFjaXR5PS9eMC41Ly50ZXN0KHIuc3R5bGUub3BhY2l0eSksdC5jc3NGbG9hdD0hIXIuc3R5bGUuY3NzRmxvYXQsdC5jaGVja09uPSEhby52YWx1ZSx0Lm9wdFNlbGVjdGVkPXUuc2VsZWN0ZWQsdC5lbmN0eXBlPSEhYS5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSx0Lmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09YS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCx0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsdC5zaHJpbmtXcmFwQmxvY2tzPSExLHQucGl4ZWxQb3NpdGlvbj0hMSx0LmRlbGV0ZUV4cGFuZG89ITAsdC5ub0Nsb25lRXZlbnQ9ITAsdC5yZWxpYWJsZU1hcmdpblJpZ2h0PSEwLHQuYm94U2l6aW5nUmVsaWFibGU9ITAsby5jaGVja2VkPSEwLHQubm9DbG9uZUNoZWNrZWQ9by5jbG9uZU5vZGUoITApLmNoZWNrZWQscy5kaXNhYmxlZD0hMCx0Lm9wdERpc2FibGVkPSF1LmRpc2FibGVkO3RyeXtkZWxldGUgZC50ZXN0fWNhdGNoKGgpe3QuZGVsZXRlRXhwYW5kbz0hMX1vPWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxvLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSx0LmlucHV0PSIiPT09by5nZXRBdHRyaWJ1dGUoInZhbHVlIiksby52YWx1ZT0idCIsby5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHQucmFkaW9WYWx1ZT0idCI9PT1vLnZhbHVlLG8uc2V0QXR0cmlidXRlKCJjaGVja2VkIiwidCIpLG8uc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGw9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbC5hcHBlbmRDaGlsZChvKSx0LmFwcGVuZENoZWNrZWQ9by5jaGVja2VkLHQuY2hlY2tDbG9uZT1sLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxkLmF0dGFjaEV2ZW50JiYoZC5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXt0Lm5vQ2xvbmVFdmVudD0hMX0pLGQuY2xvbmVOb2RlKCEwKS5jbGljaygpKTtmb3IoZiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWQuc2V0QXR0cmlidXRlKGM9Im9uIitmLCJ0IiksdFtmKyJCdWJibGVzIl09YyBpbiBlfHxkLmF0dHJpYnV0ZXNbY10uZXhwYW5kbz09PSExO2Quc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixkLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsdC5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWQuc3R5bGUuYmFja2dyb3VuZENsaXA7Zm9yKGYgaW4geCh0KSlicmVhaztyZXR1cm4gdC5vd25MYXN0PSIwIiE9PWYseChmdW5jdGlvbigpe3ZhciBuLHIsbyxzPSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7IixsPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTtsJiYobj1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG4uc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0Oi05OTk5cHg7bWFyZ2luLXRvcDoxcHgiLGwuYXBwZW5kQ2hpbGQobikuYXBwZW5kQ2hpbGQoZCksZC5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLG89ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxvWzBdLnN0eWxlLmNzc1RleHQ9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUiLHA9MD09PW9bMF0ub2Zmc2V0SGVpZ2h0LG9bMF0uc3R5bGUuZGlzcGxheT0iIixvWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQucmVsaWFibGVIaWRkZW5PZmZzZXRzPXAmJjA9PT1vWzBdLm9mZnNldEhlaWdodCxkLmlubmVySFRNTD0iIixkLnN0eWxlLmNzc1RleHQ9ImJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjElOyIseC5zd2FwKGwsbnVsbCE9bC5zdHlsZS56b29tP3t6b29tOjF9Ont9LGZ1bmN0aW9uKCl7dC5ib3hTaXppbmc9ND09PWQub2Zmc2V0V2lkdGh9KSxlLmdldENvbXB1dGVkU3R5bGUmJih0LnBpeGVsUG9zaXRpb249IjElIiE9PShlLmdldENvbXB1dGVkU3R5bGUoZCxudWxsKXx8e30pLnRvcCx0LmJveFNpemluZ1JlbGlhYmxlPSI0cHgiPT09KGUuZ2V0Q29tcHV0ZWRTdHlsZShkLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxyPWQuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJkaXYiKSksci5zdHlsZS5jc3NUZXh0PWQuc3R5bGUuY3NzVGV4dD1zLHIuc3R5bGUubWFyZ2luUmlnaHQ9ci5zdHlsZS53aWR0aD0iMCIsZC5zdHlsZS53aWR0aD0iMXB4Iix0LnJlbGlhYmxlTWFyZ2luUmlnaHQ9IXBhcnNlRmxvYXQoKGUuZ2V0Q29tcHV0ZWRTdHlsZShyLG51bGwpfHx7fSkubWFyZ2luUmlnaHQpKSx0eXBlb2YgZC5zdHlsZS56b29tIT09aSYmKGQuaW5uZXJIVE1MPSIiLGQuc3R5bGUuY3NzVGV4dD1zKyJ3aWR0aDoxcHg7cGFkZGluZzoxcHg7ZGlzcGxheTppbmxpbmU7em9vbToxIix0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9Mz09PWQub2Zmc2V0V2lkdGgsZC5zdHlsZS5kaXNwbGF5PSJibG9jayIsZC5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IixkLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9IjVweCIsdC5zaHJpbmtXcmFwQmxvY2tzPTMhPT1kLm9mZnNldFdpZHRoLHQuaW5saW5lQmxvY2tOZWVkc0xheW91dCYmKGwuc3R5bGUuem9vbT0xKSksbC5yZW1vdmVDaGlsZChuKSxuPWQ9bz1yPW51bGwpfSksbj1zPWw9dT1yPW89bnVsbCx0Cn0oe30pO3ZhciBCPS8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkkLyxQPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUihlLG4scixpKXtpZih4LmFjY2VwdERhdGEoZSkpe3ZhciBvLGEscz14LmV4cGFuZG8sbD1lLm5vZGVUeXBlLHU9bD94LmNhY2hlOmUsYz1sP2Vbc106ZVtzXSYmcztpZihjJiZ1W2NdJiYoaXx8dVtjXS5kYXRhKXx8ciE9PXR8fCJzdHJpbmciIT10eXBlb2YgbilyZXR1cm4gY3x8KGM9bD9lW3NdPXAucG9wKCl8fHguZ3VpZCsrOnMpLHVbY118fCh1W2NdPWw/e306e3RvSlNPTjp4Lm5vb3B9KSwoIm9iamVjdCI9PXR5cGVvZiBufHwiZnVuY3Rpb24iPT10eXBlb2YgbikmJihpP3VbY109eC5leHRlbmQodVtjXSxuKTp1W2NdLmRhdGE9eC5leHRlbmQodVtjXS5kYXRhLG4pKSxhPXVbY10saXx8KGEuZGF0YXx8KGEuZGF0YT17fSksYT1hLmRhdGEpLHIhPT10JiYoYVt4LmNhbWVsQ2FzZShuKV09ciksInN0cmluZyI9PXR5cGVvZiBuPyhvPWFbbl0sbnVsbD09byYmKG89YVt4LmNhbWVsQ2FzZShuKV0pKTpvPWEsb319ZnVuY3Rpb24gVyhlLHQsbil7aWYoeC5hY2NlcHREYXRhKGUpKXt2YXIgcixpLG89ZS5ub2RlVHlwZSxhPW8/eC5jYWNoZTplLHM9bz9lW3guZXhwYW5kb106eC5leHBhbmRvO2lmKGFbc10pe2lmKHQmJihyPW4/YVtzXTphW3NdLmRhdGEpKXt4LmlzQXJyYXkodCk/dD10LmNvbmNhdCh4Lm1hcCh0LHguY2FtZWxDYXNlKSk6dCBpbiByP3Q9W3RdOih0PXguY2FtZWxDYXNlKHQpLHQ9dCBpbiByP1t0XTp0LnNwbGl0KCIgIikpLGk9dC5sZW5ndGg7d2hpbGUoaS0tKWRlbGV0ZSByW3RbaV1dO2lmKG4/IUkocik6IXguaXNFbXB0eU9iamVjdChyKSlyZXR1cm59KG58fChkZWxldGUgYVtzXS5kYXRhLEkoYVtzXSkpKSYmKG8/eC5jbGVhbkRhdGEoW2VdLCEwKTp4LnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8YSE9YS53aW5kb3c/ZGVsZXRlIGFbc106YVtzXT1udWxsKX19fXguZXh0ZW5kKHtjYWNoZTp7fSxub0RhdGE6e2FwcGxldDohMCxlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCJ9LGhhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5ub2RlVHlwZT94LmNhY2hlW2VbeC5leHBhbmRvXV06ZVt4LmV4cGFuZG9dLCEhZSYmIUkoZSl9LGRhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBSKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe3JldHVybiBXKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUihlLHQsbiwhMCl9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFcoZSx0LCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihlKXtpZihlLm5vZGVUeXBlJiYxIT09ZS5ub2RlVHlwZSYmOSE9PWUubm9kZVR5cGUpcmV0dXJuITE7dmFyIHQ9ZS5ub2RlTmFtZSYmeC5ub0RhdGFbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4hdHx8dCE9PSEwJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09dH19KSx4LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLG4pe3ZhciByLGksbz1udWxsLGE9MCxzPXRoaXNbMF07aWYoZT09PXQpe2lmKHRoaXMubGVuZ3RoJiYobz14LmRhdGEocyksMT09PXMubm9kZVR5cGUmJiF4Ll9kYXRhKHMsInBhcnNlZEF0dHJzIikpKXtmb3Iocj1zLmF0dHJpYnV0ZXM7ci5sZW5ndGg+YTthKyspaT1yW2FdLm5hbWUsMD09PWkuaW5kZXhPZigiZGF0YS0iKSYmKGk9eC5jYW1lbENhc2UoaS5zbGljZSg1KSksJChzLGksb1tpXSkpO3guX2RhdGEocywicGFyc2VkQXR0cnMiLCEwKX1yZXR1cm4gb31yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5kYXRhKHRoaXMsZSl9KTphcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5kYXRhKHRoaXMsZSxuKX0pOnM/JChzLGUseC5kYXRhKHMsZSkpOm51bGx9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3gucmVtb3ZlRGF0YSh0aGlzLGUpfSl9fSk7ZnVuY3Rpb24gJChlLG4scil7aWYocj09PXQmJjE9PT1lLm5vZGVUeXBlKXt2YXIgaT0iZGF0YS0iK24ucmVwbGFjZShQLCItJDEiKS50b0xvd2VyQ2FzZSgpO2lmKHI9ZS5nZXRBdHRyaWJ1dGUoaSksInN0cmluZyI9PXR5cGVvZiByKXt0cnl7cj0idHJ1ZSI9PT1yPyEwOiJmYWxzZSI9PT1yPyExOiJudWxsIj09PXI/bnVsbDorcisiIj09PXI/K3I6Qi50ZXN0KHIpP3gucGFyc2VKU09OKHIpOnJ9Y2F0Y2gobyl7fXguZGF0YShlLG4scil9ZWxzZSByPXR9cmV0dXJuIHJ9ZnVuY3Rpb24gSShlKXt2YXIgdDtmb3IodCBpbiBlKWlmKCgiZGF0YSIhPT10fHwheC5pc0VtcHR5T2JqZWN0KGVbdF0pKSYmInRvSlNPTiIhPT10KXJldHVybiExO3JldHVybiEwfXguZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLG4scil7dmFyIGk7cmV0dXJuIGU/KG49KG58fCJmeCIpKyJxdWV1ZSIsaT14Ll9kYXRhKGUsbiksciYmKCFpfHx4LmlzQXJyYXkocik/aT14Ll9kYXRhKGUsbix4Lm1ha2VBcnJheShyKSk6aS5wdXNoKHIpKSxpfHxbXSk6dH0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj14LnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPXguX3F1ZXVlSG9va3MoZSx0KSxhPWZ1bmN0aW9uKCl7eC5kZXF1ZXVlKGUsdCl9OyJpbnByb2dyZXNzIj09PWkmJihpPW4uc2hpZnQoKSxyLS0pLGkmJigiZngiPT09dCYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIG8uc3RvcCxpLmNhbGwoZSxhLG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIHguX2RhdGEoZSxuKXx8eC5fZGF0YShlLG4se2VtcHR5OnguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe3guX3JlbW92ZURhdGEoZSx0KyJxdWV1ZSIpLHguX3JlbW92ZURhdGEoZSxuKX0pfSl9fSkseC5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsbil7dmFyIHI9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihuPWUsZT0iZngiLHItLSkscj5hcmd1bWVudHMubGVuZ3RoP3gucXVldWUodGhpc1swXSxlKTpuPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXgucXVldWUodGhpcyxlLG4pO3guX3F1ZXVlSG9va3ModGhpcyxlKSwiZngiPT09ZSYmImlucHJvZ3Jlc3MiIT09dFswXSYmeC5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVsYXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT14LmZ4P3guZnguc3BlZWRzW2VdfHxlOmUsdD10fHwiZngiLHRoaXMucXVldWUodCxmdW5jdGlvbih0LG4pe3ZhciByPXNldFRpbWVvdXQodCxlKTtuLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQocil9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSxuKXt2YXIgcixpPTEsbz14LkRlZmVycmVkKCksYT10aGlzLHM9dGhpcy5sZW5ndGgsbD1mdW5jdGlvbigpey0taXx8by5yZXNvbHZlV2l0aChhLFthXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKG49ZSxlPXQpLGU9ZXx8ImZ4Ijt3aGlsZShzLS0pcj14Ll9kYXRhKGFbc10sZSsicXVldWVIb29rcyIpLHImJnIuZW1wdHkmJihpKyssci5lbXB0eS5hZGQobCkpO3JldHVybiBsKCksby5wcm9taXNlKG4pfX0pO3ZhciB6LFgsVT0vW1x0XHJcblxmXS9nLFY9L1xyL2csWT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSxKPS9eKD86YXxhcmVhKSQvaSxHPS9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2ksUT14LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLEs9eC5zdXBwb3J0LmlucHV0O3guZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguYWNjZXNzKHRoaXMseC5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LnJlbW92ZUF0dHIodGhpcyxlKX0pfSxwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguYWNjZXNzKHRoaXMseC5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiBlPXgucHJvcEZpeFtlXXx8ZSx0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1tlXT10LGRlbGV0ZSB0aGlzW2VdfWNhdGNoKG4pe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhPTAscz10aGlzLmxlbmd0aCxsPSJzdHJpbmciPT10eXBlb2YgZSYmZTtpZih4LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt4KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLHQsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGwpZm9yKHQ9KGV8fCIiKS5tYXRjaChUKXx8W107cz5hO2ErKylpZihuPXRoaXNbYV0scj0xPT09bi5ub2RlVHlwZSYmKG4uY2xhc3NOYW1lPygiICIrbi5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKFUsIiAiKToiICIpKXtvPTA7d2hpbGUoaT10W28rK10pMD5yLmluZGV4T2YoIiAiK2krIiAiKSYmKHIrPWkrIiAiKTtuLmNsYXNzTmFtZT14LnRyaW0ocil9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYT0wLHM9dGhpcy5sZW5ndGgsbD0wPT09YXJndW1lbnRzLmxlbmd0aHx8InN0cmluZyI9PXR5cGVvZiBlJiZlO2lmKHguaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykucmVtb3ZlQ2xhc3MoZS5jYWxsKHRoaXMsdCx0aGlzLmNsYXNzTmFtZSkpfSk7aWYobClmb3IodD0oZXx8IiIpLm1hdGNoKFQpfHxbXTtzPmE7YSsrKWlmKG49dGhpc1thXSxyPTE9PT1uLm5vZGVUeXBlJiYobi5jbGFzc05hbWU/KCIgIituLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoVSwiICIpOiIiKSl7bz0wO3doaWxlKGk9dFtvKytdKXdoaWxlKHIuaW5kZXhPZigiICIraSsiICIpPj0wKXI9ci5yZXBsYWNlKCIgIitpKyIgIiwiICIpO24uY2xhc3NOYW1lPWU/eC50cmltKHIpOiIifXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlO3JldHVybiJib29sZWFuIj09dHlwZW9mIHQmJiJzdHJpbmciPT09bj90P3RoaXMuYWRkQ2xhc3MoZSk6dGhpcy5yZW1vdmVDbGFzcyhlKTp4LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3godGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbix0aGlzLmNsYXNzTmFtZSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCJzdHJpbmciPT09bil7dmFyIHQscj0wLG89eCh0aGlzKSxhPWUubWF0Y2goVCl8fFtdO3doaWxlKHQ9YVtyKytdKW8uaGFzQ2xhc3ModCk/by5yZW1vdmVDbGFzcyh0KTpvLmFkZENsYXNzKHQpfWVsc2Uobj09PWl8fCJib29sZWFuIj09PW4pJiYodGhpcy5jbGFzc05hbWUmJnguX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxlPT09ITE/IiI6eC5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdD0iICIrZSsiICIsbj0wLHI9dGhpcy5sZW5ndGg7Zm9yKDtyPm47bisrKWlmKDE9PT10aGlzW25dLm5vZGVUeXBlJiYoIiAiK3RoaXNbbl0uY2xhc3NOYW1lKyIgIikucmVwbGFjZShVLCIgIikuaW5kZXhPZih0KT49MClyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGUpe3ZhciBuLHIsaSxvPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGk9eC5pc0Z1bmN0aW9uKGUpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgbzsxPT09dGhpcy5ub2RlVHlwZSYmKG89aT9lLmNhbGwodGhpcyxuLHgodGhpcykudmFsKCkpOmUsbnVsbD09bz9vPSIiOiJudW1iZXIiPT10eXBlb2Ygbz9vKz0iIjp4LmlzQXJyYXkobykmJihvPXgubWFwKG8sZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSxyPXgudmFsSG9va3NbdGhpcy50eXBlXXx8eC52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLHImJiJzZXQiaW4gciYmci5zZXQodGhpcyxvLCJ2YWx1ZSIpIT09dHx8KHRoaXMudmFsdWU9bykpfSk7aWYobylyZXR1cm4gcj14LnZhbEhvb2tzW28udHlwZV18fHgudmFsSG9va3Nbby5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxyJiYiZ2V0ImluIHImJihuPXIuZ2V0KG8sInZhbHVlIikpIT09dD9uOihuPW8udmFsdWUsInN0cmluZyI9PXR5cGVvZiBuP24ucmVwbGFjZShWLCIiKTpudWxsPT1uPyIiOm4pfX19KSx4LmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXguZmluZC5hdHRyKGUsInZhbHVlIik7cmV0dXJuIG51bGwhPXQ/dDplLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9ZS5vcHRpb25zLGk9ZS5zZWxlY3RlZEluZGV4LG89InNlbGVjdC1vbmUiPT09ZS50eXBlfHwwPmksYT1vP251bGw6W10scz1vP2krMTpyLmxlbmd0aCxsPTA+aT9zOm8/aTowO2Zvcig7cz5sO2wrKylpZihuPXJbbF0sISghbi5zZWxlY3RlZCYmbCE9PWl8fCh4LnN1cHBvcnQub3B0RGlzYWJsZWQ/bi5kaXNhYmxlZDpudWxsIT09bi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpfHxuLnBhcmVudE5vZGUuZGlzYWJsZWQmJngubm9kZU5hbWUobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD14KG4pLnZhbCgpLG8pcmV0dXJuIHQ7YS5wdXNoKHQpfXJldHVybiBhfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89eC5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pcj1pW2FdLChyLnNlbGVjdGVkPXguaW5BcnJheSh4KHIpLnZhbCgpLG8pPj0wKSYmKG49ITApO3JldHVybiBufHwoZS5zZWxlY3RlZEluZGV4PS0xKSxvfX19LGF0dHI6ZnVuY3Rpb24oZSxuLHIpe3ZhciBvLGEscz1lLm5vZGVUeXBlO2lmKGUmJjMhPT1zJiY4IT09cyYmMiE9PXMpcmV0dXJuIHR5cGVvZiBlLmdldEF0dHJpYnV0ZT09PWk/eC5wcm9wKGUsbixyKTooMT09PXMmJnguaXNYTUxEb2MoZSl8fChuPW4udG9Mb3dlckNhc2UoKSxvPXguYXR0ckhvb2tzW25dfHwoeC5leHByLm1hdGNoLmJvb2wudGVzdChuKT9YOnopKSxyPT09dD9vJiYiZ2V0ImluIG8mJm51bGwhPT0oYT1vLmdldChlLG4pKT9hOihhPXguZmluZC5hdHRyKGUsbiksbnVsbD09YT90OmEpOm51bGwhPT1yP28mJiJzZXQiaW4gbyYmKGE9by5zZXQoZSxyLG4pKSE9PXQ/YTooZS5zZXRBdHRyaWJ1dGUobixyKyIiKSxyKTooeC5yZW1vdmVBdHRyKGUsbiksdCkpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPTAsbz10JiZ0Lm1hdGNoKFQpO2lmKG8mJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49b1tpKytdKXI9eC5wcm9wRml4W25dfHxuLHguZXhwci5tYXRjaC5ib29sLnRlc3Qobik/SyYmUXx8IUcudGVzdChuKT9lW3JdPSExOmVbeC5jYW1lbENhc2UoImRlZmF1bHQtIituKV09ZVtyXT0hMTp4LmF0dHIoZSxuLCIiKSxlLnJlbW92ZUF0dHJpYnV0ZShRP246cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIXguc3VwcG9ydC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmeC5ub2RlTmFtZShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8sYSxzPWUubm9kZVR5cGU7aWYoZSYmMyE9PXMmJjghPT1zJiYyIT09cylyZXR1cm4gYT0xIT09c3x8IXguaXNYTUxEb2MoZSksYSYmKG49eC5wcm9wRml4W25dfHxuLG89eC5wcm9wSG9va3Nbbl0pLHIhPT10P28mJiJzZXQiaW4gbyYmKGk9by5zZXQoZSxyLG4pKSE9PXQ/aTplW25dPXI6byYmImdldCJpbiBvJiZudWxsIT09KGk9by5nZXQoZSxuKSk/aTplW25dfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9eC5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpZLnRlc3QoZS5ub2RlTmFtZSl8fEoudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX19KSxYPXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PT09ITE/eC5yZW1vdmVBdHRyKGUsbik6SyYmUXx8IUcudGVzdChuKT9lLnNldEF0dHJpYnV0ZSghUSYmeC5wcm9wRml4W25dfHxuLG4pOmVbeC5jYW1lbENhc2UoImRlZmF1bHQtIituKV09ZVtuXT0hMCxufX0seC5lYWNoKHguZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGUsbil7dmFyIHI9eC5leHByLmF0dHJIYW5kbGVbbl18fHguZmluZC5hdHRyO3guZXhwci5hdHRySGFuZGxlW25dPUsmJlF8fCFHLnRlc3Qobik/ZnVuY3Rpb24oZSxuLGkpe3ZhciBvPXguZXhwci5hdHRySGFuZGxlW25dLGE9aT90Oih4LmV4cHIuYXR0ckhhbmRsZVtuXT10KSE9cihlLG4saSk/bi50b0xvd2VyQ2FzZSgpOm51bGw7cmV0dXJuIHguZXhwci5hdHRySGFuZGxlW25dPW8sYX06ZnVuY3Rpb24oZSxuLHIpe3JldHVybiByP3Q6ZVt4LmNhbWVsQ2FzZSgiZGVmYXVsdC0iK24pXT9uLnRvTG93ZXJDYXNlKCk6bnVsbH19KSxLJiZRfHwoeC5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihlLG4scil7cmV0dXJuIHgubm9kZU5hbWUoZSwiaW5wdXQiKT8oZS5kZWZhdWx0VmFsdWU9bix0KTp6JiZ6LnNldChlLG4scil9fSksUXx8KHo9e3NldDpmdW5jdGlvbihlLG4scil7dmFyIGk9ZS5nZXRBdHRyaWJ1dGVOb2RlKHIpO3JldHVybiBpfHxlLnNldEF0dHJpYnV0ZU5vZGUoaT1lLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKHIpKSxpLnZhbHVlPW4rPSIiLCJ2YWx1ZSI9PT1yfHxuPT09ZS5nZXRBdHRyaWJ1dGUocik/bjp0fX0seC5leHByLmF0dHJIYW5kbGUuaWQ9eC5leHByLmF0dHJIYW5kbGUubmFtZT14LmV4cHIuYXR0ckhhbmRsZS5jb29yZHM9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpO3JldHVybiByP3Q6KGk9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pKSYmIiIhPT1pLnZhbHVlP2kudmFsdWU6bnVsbH0seC52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihlLG4pe3ZhciByPWUuZ2V0QXR0cmlidXRlTm9kZShuKTtyZXR1cm4gciYmci5zcGVjaWZpZWQ/ci52YWx1ZTp0fSxzZXQ6ei5zZXR9LHguYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZT17c2V0OmZ1bmN0aW9uKGUsdCxuKXt6LnNldChlLCIiPT09dD8hMTp0LG4pfX0seC5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihlLG4pe3guYXR0ckhvb2tzW25dPXtzZXQ6ZnVuY3Rpb24oZSxyKXtyZXR1cm4iIj09PXI/KGUuc2V0QXR0cmlidXRlKG4sImF1dG8iKSxyKTp0fX19KSkseC5zdXBwb3J0LmhyZWZOb3JtYWxpemVkfHx4LmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oZSx0KXt4LnByb3BIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSh0LDQpfX19KSx4LnN1cHBvcnQuc3R5bGV8fCh4LmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLnN0eWxlLmNzc1RleHR8fHR9LHNldDpmdW5jdGlvbihlLHQpe3JldHVybiBlLnN0eWxlLmNzc1RleHQ9dCsiIn19KSx4LnN1cHBvcnQub3B0U2VsZWN0ZWR8fCh4LnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KSxudWxsfX0pLHguZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7eC5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLHguc3VwcG9ydC5lbmN0eXBlfHwoeC5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIikseC5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7eC52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIHguaXNBcnJheShuKT9lLmNoZWNrZWQ9eC5pbkFycmF5KHgoZSkudmFsKCksbik+PTA6dH19LHguc3VwcG9ydC5jaGVja09ufHwoeC52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmUudmFsdWV9KX0pO3ZhciBaPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaSxldD0vXmtleS8sdHQ9L14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLG50PS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxydD0vXihbXi5dKikoPzpcLiguKyl8KSQvO2Z1bmN0aW9uIGl0KCl7cmV0dXJuITB9ZnVuY3Rpb24gb3QoKXtyZXR1cm4hMX1mdW5jdGlvbiBhdCgpe3RyeXtyZXR1cm4gYS5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319eC5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihlLG4scixvLGEpe3ZhciBzLGwsdSxjLHAsZixkLGgsZyxtLHksdj14Ll9kYXRhKGUpO2lmKHYpe3IuaGFuZGxlciYmKGM9cixyPWMuaGFuZGxlcixhPWMuc2VsZWN0b3IpLHIuZ3VpZHx8KHIuZ3VpZD14Lmd1aWQrKyksKGw9di5ldmVudHMpfHwobD12LmV2ZW50cz17fSksKGY9di5oYW5kbGUpfHwoZj12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIHg9PT1pfHxlJiZ4LmV2ZW50LnRyaWdnZXJlZD09PWUudHlwZT90OnguZXZlbnQuZGlzcGF0Y2guYXBwbHkoZi5lbGVtLGFyZ3VtZW50cyl9LGYuZWxlbT1lKSxuPShufHwiIikubWF0Y2goVCl8fFsiIl0sdT1uLmxlbmd0aDt3aGlsZSh1LS0pcz1ydC5leGVjKG5bdV0pfHxbXSxnPXk9c1sxXSxtPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZyYmKHA9eC5ldmVudC5zcGVjaWFsW2ddfHx7fSxnPShhP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxnLHA9eC5ldmVudC5zcGVjaWFsW2ddfHx7fSxkPXguZXh0ZW5kKHt0eXBlOmcsb3JpZ1R5cGU6eSxkYXRhOm8saGFuZGxlcjpyLGd1aWQ6ci5ndWlkLHNlbGVjdG9yOmEsbmVlZHNDb250ZXh0OmEmJnguZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChhKSxuYW1lc3BhY2U6bS5qb2luKCIuIil9LGMpLChoPWxbZ10pfHwoaD1sW2ddPVtdLGguZGVsZWdhdGVDb3VudD0wLHAuc2V0dXAmJnAuc2V0dXAuY2FsbChlLG8sbSxmKSE9PSExfHwoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcihnLGYsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9uIitnLGYpKSkscC5hZGQmJihwLmFkZC5jYWxsKGUsZCksZC5oYW5kbGVyLmd1aWR8fChkLmhhbmRsZXIuZ3VpZD1yLmd1aWQpKSxhP2guc3BsaWNlKGguZGVsZWdhdGVDb3VudCsrLDAsZCk6aC5wdXNoKGQpLHguZXZlbnQuZ2xvYmFsW2ddPSEwKTtlPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsbCx1LGMscCxmLGQsaCxnLG09eC5oYXNEYXRhKGUpJiZ4Ll9kYXRhKGUpO2lmKG0mJihjPW0uZXZlbnRzKSl7dD0odHx8IiIpLm1hdGNoKFQpfHxbIiJdLHU9dC5sZW5ndGg7d2hpbGUodS0tKWlmKHM9cnQuZXhlYyh0W3VdKXx8W10sZD1nPXNbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQpe3A9eC5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShyP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxkLGY9Y1tkXXx8W10scz1zWzJdJiZSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksbD1vPWYubGVuZ3RoO3doaWxlKG8tLSlhPWZbb10sIWkmJmchPT1hLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1hLmd1aWR8fHMmJiFzLnRlc3QoYS5uYW1lc3BhY2UpfHxyJiZyIT09YS5zZWxlY3RvciYmKCIqKiIhPT1yfHwhYS5zZWxlY3Rvcil8fChmLnNwbGljZShvLDEpLGEuc2VsZWN0b3ImJmYuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGUsYSkpO2wmJiFmLmxlbmd0aCYmKHAudGVhcmRvd24mJnAudGVhcmRvd24uY2FsbChlLGgsbS5oYW5kbGUpIT09ITF8fHgucmVtb3ZlRXZlbnQoZSxkLG0uaGFuZGxlKSxkZWxldGUgY1tkXSl9ZWxzZSBmb3IoZCBpbiBjKXguZXZlbnQucmVtb3ZlKGUsZCt0W3VdLG4sciwhMCk7eC5pc0VtcHR5T2JqZWN0KGMpJiYoZGVsZXRlIG0uaGFuZGxlLHguX3JlbW92ZURhdGEoZSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihuLHIsaSxvKXt2YXIgcyxsLHUsYyxwLGYsZCxoPVtpfHxhXSxnPXYuY2FsbChuLCJ0eXBlIik/bi50eXBlOm4sbT12LmNhbGwobiwibmFtZXNwYWNlIik/bi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZih1PWY9aT1pfHxhLDMhPT1pLm5vZGVUeXBlJiY4IT09aS5ub2RlVHlwZSYmIW50LnRlc3QoZyt4LmV2ZW50LnRyaWdnZXJlZCkmJihnLmluZGV4T2YoIi4iKT49MCYmKG09Zy5zcGxpdCgiLiIpLGc9bS5zaGlmdCgpLG0uc29ydCgpKSxsPTA+Zy5pbmRleE9mKCI6IikmJiJvbiIrZyxuPW5beC5leHBhbmRvXT9uOm5ldyB4LkV2ZW50KGcsIm9iamVjdCI9PXR5cGVvZiBuJiZuKSxuLmlzVHJpZ2dlcj1vPzI6MyxuLm5hbWVzcGFjZT1tLmpvaW4oIi4iKSxuLm5hbWVzcGFjZV9yZT1uLm5hbWVzcGFjZT9SZWdFeHAoIihefFxcLikiK20uam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxuLnJlc3VsdD10LG4udGFyZ2V0fHwobi50YXJnZXQ9aSkscj1udWxsPT1yP1tuXTp4Lm1ha2VBcnJheShyLFtuXSkscD14LmV2ZW50LnNwZWNpYWxbZ118fHt9LG98fCFwLnRyaWdnZXJ8fHAudHJpZ2dlci5hcHBseShpLHIpIT09ITEpKXtpZighbyYmIXAubm9CdWJibGUmJiF4LmlzV2luZG93KGkpKXtmb3IoYz1wLmRlbGVnYXRlVHlwZXx8ZyxudC50ZXN0KGMrZyl8fCh1PXUucGFyZW50Tm9kZSk7dTt1PXUucGFyZW50Tm9kZSloLnB1c2godSksZj11O2Y9PT0oaS5vd25lckRvY3VtZW50fHxhKSYmaC5wdXNoKGYuZGVmYXVsdFZpZXd8fGYucGFyZW50V2luZG93fHxlKX1kPTA7d2hpbGUoKHU9aFtkKytdKSYmIW4uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSluLnR5cGU9ZD4xP2M6cC5iaW5kVHlwZXx8ZyxzPSh4Ll9kYXRhKHUsImV2ZW50cyIpfHx7fSlbbi50eXBlXSYmeC5fZGF0YSh1LCJoYW5kbGUiKSxzJiZzLmFwcGx5KHUscikscz1sJiZ1W2xdLHMmJnguYWNjZXB0RGF0YSh1KSYmcy5hcHBseSYmcy5hcHBseSh1LHIpPT09ITEmJm4ucHJldmVudERlZmF1bHQoKTtpZihuLnR5cGU9ZywhbyYmIW4uaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShoLnBvcCgpLHIpPT09ITEpJiZ4LmFjY2VwdERhdGEoaSkmJmwmJmlbZ10mJiF4LmlzV2luZG93KGkpKXtmPWlbbF0sZiYmKGlbbF09bnVsbCkseC5ldmVudC50cmlnZ2VyZWQ9Zzt0cnl7aVtnXSgpfWNhdGNoKHkpe314LmV2ZW50LnRyaWdnZXJlZD10LGYmJihpW2xdPWYpfXJldHVybiBuLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe2U9eC5ldmVudC5maXgoZSk7dmFyIG4scixpLG8sYSxzPVtdLGw9Zy5jYWxsKGFyZ3VtZW50cyksdT0oeC5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30pW2UudHlwZV18fFtdLGM9eC5ldmVudC5zcGVjaWFsW2UudHlwZV18fHt9O2lmKGxbMF09ZSxlLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWMucHJlRGlzcGF0Y2h8fGMucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGUpIT09ITEpe3M9eC5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsZSx1KSxuPTA7d2hpbGUoKG89c1tuKytdKSYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7ZS5jdXJyZW50VGFyZ2V0PW8uZWxlbSxhPTA7d2hpbGUoKGk9by5oYW5kbGVyc1thKytdKSYmIWUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkoIWUubmFtZXNwYWNlX3JlfHxlLm5hbWVzcGFjZV9yZS50ZXN0KGkubmFtZXNwYWNlKSkmJihlLmhhbmRsZU9iaj1pLGUuZGF0YT1pLmRhdGEscj0oKHguZXZlbnQuc3BlY2lhbFtpLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8aS5oYW5kbGVyKS5hcHBseShvLmVsZW0sbCksciE9PXQmJihlLnJlc3VsdD1yKT09PSExJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gYy5wb3N0RGlzcGF0Y2gmJmMucG9zdERpc3BhdGNoLmNhbGwodGhpcyxlKSxlLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxvLGEscz1bXSxsPW4uZGVsZWdhdGVDb3VudCx1PWUudGFyZ2V0O2lmKGwmJnUubm9kZVR5cGUmJighZS5idXR0b258fCJjbGljayIhPT1lLnR5cGUpKWZvcig7dSE9dGhpczt1PXUucGFyZW50Tm9kZXx8dGhpcylpZigxPT09dS5ub2RlVHlwZSYmKHUuZGlzYWJsZWQhPT0hMHx8ImNsaWNrIiE9PWUudHlwZSkpe2ZvcihvPVtdLGE9MDtsPmE7YSsrKWk9blthXSxyPWkuc2VsZWN0b3IrIiAiLG9bcl09PT10JiYob1tyXT1pLm5lZWRzQ29udGV4dD94KHIsdGhpcykuaW5kZXgodSk+PTA6eC5maW5kKHIsdGhpcyxudWxsLFt1XSkubGVuZ3RoKSxvW3JdJiZvLnB1c2goaSk7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTp1LGhhbmRsZXJzOm99KX1yZXR1cm4gbi5sZW5ndGg+bCYmcy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6bi5zbGljZShsKX0pLHN9LGZpeDpmdW5jdGlvbihlKXtpZihlW3guZXhwYW5kb10pcmV0dXJuIGU7dmFyIHQsbixyLGk9ZS50eXBlLG89ZSxzPXRoaXMuZml4SG9va3NbaV07c3x8KHRoaXMuZml4SG9va3NbaV09cz10dC50ZXN0KGkpP3RoaXMubW91c2VIb29rczpldC50ZXN0KGkpP3RoaXMua2V5SG9va3M6e30pLHI9cy5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChzLnByb3BzKTp0aGlzLnByb3BzLGU9bmV3IHguRXZlbnQobyksdD1yLmxlbmd0aDt3aGlsZSh0LS0pbj1yW3RdLGVbbl09b1tuXTtyZXR1cm4gZS50YXJnZXR8fChlLnRhcmdldD1vLnNyY0VsZW1lbnR8fGEpLDM9PT1lLnRhcmdldC5ub2RlVHlwZSYmKGUudGFyZ2V0PWUudGFyZ2V0LnBhcmVudE5vZGUpLGUubWV0YUtleT0hIWUubWV0YUtleSxzLmZpbHRlcj9zLmZpbHRlcihlLG8pOmV9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lLndoaWNoJiYoZS53aGljaD1udWxsIT10LmNoYXJDb2RlP3QuY2hhckNvZGU6dC5rZXlDb2RlKSxlfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSxuKXt2YXIgcixpLG8scz1uLmJ1dHRvbixsPW4uZnJvbUVsZW1lbnQ7cmV0dXJuIG51bGw9PWUucGFnZVgmJm51bGwhPW4uY2xpZW50WCYmKGk9ZS50YXJnZXQub3duZXJEb2N1bWVudHx8YSxvPWkuZG9jdW1lbnRFbGVtZW50LHI9aS5ib2R5LGUucGFnZVg9bi5jbGllbnRYKyhvJiZvLnNjcm9sbExlZnR8fHImJnIuc2Nyb2xsTGVmdHx8MCktKG8mJm8uY2xpZW50TGVmdHx8ciYmci5jbGllbnRMZWZ0fHwwKSxlLnBhZ2VZPW4uY2xpZW50WSsobyYmby5zY3JvbGxUb3B8fHImJnIuc2Nyb2xsVG9wfHwwKS0obyYmby5jbGllbnRUb3B8fHImJnIuY2xpZW50VG9wfHwwKSksIWUucmVsYXRlZFRhcmdldCYmbCYmKGUucmVsYXRlZFRhcmdldD1sPT09ZS50YXJnZXQ/bi50b0VsZW1lbnQ6bCksZS53aGljaHx8cz09PXR8fChlLndoaWNoPTEmcz8xOjImcz8zOjQmcz8yOjApLGV9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09YXQoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChlKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1hdCgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp0fSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4geC5ub2RlTmFtZSh0aGlzLCJpbnB1dCIpJiYiY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrPyh0aGlzLmNsaWNrKCksITEpOnR9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiB4Lm5vZGVOYW1lKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXtlLnJlc3VsdCE9PXQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXguZXh0ZW5kKG5ldyB4LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7cj94LmV2ZW50LnRyaWdnZXIoaSxudWxsLHQpOnguZXZlbnQuZGlzcGF0Y2guY2FsbCh0LGkpLGkuaXNEZWZhdWx0UHJldmVudGVkKCkmJm4ucHJldmVudERlZmF1bHQoKX19LHgucmVtb3ZlRXZlbnQ9YS5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITEpfTpmdW5jdGlvbihlLHQsbil7dmFyIHI9Im9uIit0O2UuZGV0YWNoRXZlbnQmJih0eXBlb2YgZVtyXT09PWkmJihlW3JdPW51bGwpLGUuZGV0YWNoRXZlbnQocixuKSl9LHguRXZlbnQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHguRXZlbnQ/KGUmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fGUucmV0dXJuVmFsdWU9PT0hMXx8ZS5nZXRQcmV2ZW50RGVmYXVsdCYmZS5nZXRQcmV2ZW50RGVmYXVsdCgpP2l0Om90KTp0aGlzLnR5cGU9ZSxuJiZ4LmV4dGVuZCh0aGlzLG4pLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHx4Lm5vdygpLHRoaXNbeC5leHBhbmRvXT0hMCx0KTpuZXcgeC5FdmVudChlLG4pfSx4LkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOm90LGlzUHJvcGFnYXRpb25TdG9wcGVkOm90LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOm90LHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWl0LGUmJihlLnByZXZlbnREZWZhdWx0P2UucHJldmVudERlZmF1bHQoKTplLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9aXQsZSYmKGUuc3RvcFByb3BhZ2F0aW9uJiZlLnN0b3BQcm9wYWdhdGlvbigpLGUuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1pdCx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0seC5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oZSx0KXt4LmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTp0LGJpbmRUeXBlOnQsaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcyxpPWUucmVsYXRlZFRhcmdldCxvPWUuaGFuZGxlT2JqO3JldHVybighaXx8aSE9PXImJiF4LmNvbnRhaW5zKHIsaSkpJiYoZS50eXBlPW8ub3JpZ1R5cGUsbj1vLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10KSxufX19KSx4LnN1cHBvcnQuc3VibWl0QnViYmxlc3x8KHguZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHgubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOih4LmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGUpe3ZhciBuPWUudGFyZ2V0LHI9eC5ub2RlTmFtZShuLCJpbnB1dCIpfHx4Lm5vZGVOYW1lKG4sImJ1dHRvbiIpP24uZm9ybTp0O3ImJiF4Ll9kYXRhKHIsInN1Ym1pdEJ1YmJsZXMiKSYmKHguZXZlbnQuYWRkKHIsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlPSEwfSkseC5fZGF0YShyLCJzdWJtaXRCdWJibGVzIiwhMCkpfSksdCl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlJiYoZGVsZXRlIGUuX3N1Ym1pdF9idWJibGUsdGhpcy5wYXJlbnROb2RlJiYhZS5pc1RyaWdnZXImJnguZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGUsITApKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4geC5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6KHguZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0IiksdCl9fSkseC5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fCh4LmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBaLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKHguZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpeyJjaGVja2VkIj09PWUub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSkseC5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oZSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhZS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLHguZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxlLCEwKX0pKSwhMSk6KHguZXZlbnQuYWRkKHRoaXMsImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O1oudGVzdCh0Lm5vZGVOYW1lKSYmIXguX2RhdGEodCwiY2hhbmdlQnViYmxlcyIpJiYoeC5ldmVudC5hZGQodCwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpeyF0aGlzLnBhcmVudE5vZGV8fGUuaXNTaW11bGF0ZWR8fGUuaXNUcmlnZ2VyfHx4LmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxlLCEwKX0pLHguX2RhdGEodCwiY2hhbmdlQnViYmxlcyIsITApKX0pLHQpfSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG49ZS50YXJnZXQ7cmV0dXJuIHRoaXMhPT1ufHxlLmlzU2ltdWxhdGVkfHxlLmlzVHJpZ2dlcnx8InJhZGlvIiE9PW4udHlwZSYmImNoZWNrYm94IiE9PW4udHlwZT9lLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0fSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiB4LmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFaLnRlc3QodGhpcy5ub2RlTmFtZSl9fSkseC5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHx4LmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPWZ1bmN0aW9uKGUpe3guZXZlbnQuc2ltdWxhdGUodCxlLnRhcmdldCx4LmV2ZW50LmZpeChlKSwhMCl9O3guZXZlbnQuc3BlY2lhbFt0XT17c2V0dXA6ZnVuY3Rpb24oKXswPT09bisrJiZhLmFkZEV2ZW50TGlzdGVuZXIoZSxyLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXswPT09LS1uJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxyLCEwKX19fSkseC5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIGUpeyJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXQpO2ZvcihhIGluIGUpdGhpcy5vbihhLG4scixlW2FdLG8pO3JldHVybiB0aGlzfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dCk6bnVsbD09aSYmKCJzdHJpbmciPT10eXBlb2Ygbj8oaT1yLHI9dCk6KGk9cixyPW4sbj10KSksaT09PSExKWk9b3Q7ZWxzZSBpZighaSlyZXR1cm4gdGhpcztyZXR1cm4gMT09PW8mJihzPWksaT1mdW5jdGlvbihlKXtyZXR1cm4geCgpLm9mZihlKSxzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saS5ndWlkPXMuZ3VpZHx8KHMuZ3VpZD14Lmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe3guZXZlbnQuYWRkKHRoaXMsZSxpLHIsbil9KX0sb25lOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKGUsdCxuLHIsMSl9LG9mZjpmdW5jdGlvbihlLG4scil7dmFyIGksbztpZihlJiZlLnByZXZlbnREZWZhdWx0JiZlLmhhbmRsZU9iailyZXR1cm4gaT1lLmhhbmRsZU9iaix4KGUuZGVsZWdhdGVUYXJnZXQpLm9mZihpLm5hbWVzcGFjZT9pLm9yaWdUeXBlKyIuIitpLm5hbWVzcGFjZTppLm9yaWdUeXBlLGkuc2VsZWN0b3IsaS5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKG8gaW4gZSl0aGlzLm9mZihvLG4sZVtvXSk7cmV0dXJuIHRoaXN9cmV0dXJuKG49PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pJiYocj1uLG49dCkscj09PSExJiYocj1vdCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5ldmVudC5yZW1vdmUodGhpcyxlLHIsbil9KX0sdHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpc1swXTtyZXR1cm4gcj94LmV2ZW50LnRyaWdnZXIoZSxuLHIsITApOnR9fSk7dmFyIHN0PS9eLlteOiNcW1wuLF0qJC8sbHQ9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sdXQ9eC5leHByLm1hdGNoLm5lZWRzQ29udGV4dCxjdD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTt4LmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9dGhpcyxpPXIubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soeChlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO2k+dDt0KyspaWYoeC5jb250YWlucyhyW3RdLHRoaXMpKXJldHVybiEwfSkpO2Zvcih0PTA7aT50O3QrKyl4LmZpbmQoZSxyW3RdLG4pO3JldHVybiBuPXRoaXMucHVzaFN0YWNrKGk+MT94LnVuaXF1ZShuKTpuKSxuLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrZTplLG59LGhhczpmdW5jdGlvbihlKXt2YXIgdCxuPXgoZSx0aGlzKSxyPW4ubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7cj50O3QrKylpZih4LmNvbnRhaW5zKHRoaXMsblt0XSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGV8fFtdLCEwKSl9LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZnQodGhpcyxlfHxbXSwhMSkpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIWZ0KHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZ1dC50ZXN0KGUpP3goZSk6ZXx8W10sITEpLmxlbmd0aH0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT11dC50ZXN0KGUpfHwic3RyaW5nIiE9dHlwZW9mIGU/eChlLHR8fHRoaXMuY29udGV4dCk6MDtmb3IoO2k+cjtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZigxMT5uLm5vZGVUeXBlJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZ4LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtuPW8ucHVzaChuKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soby5sZW5ndGg+MT94LnVuaXF1ZShvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP3guaW5BcnJheSh0aGlzWzBdLHgoZSkpOnguaW5BcnJheShlLmpxdWVyeT9lWzBdOmUsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj0ic3RyaW5nIj09dHlwZW9mIGU/eChlLHQpOngubWFrZUFycmF5KGUmJmUubm9kZVR5cGU/W2VdOmUpLHI9eC5tZXJnZSh0aGlzLmdldCgpLG4pO3JldHVybiB0aGlzLnB1c2hTdGFjayh4LnVuaXF1ZShyKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pO2Z1bmN0aW9uIHB0KGUsdCl7ZG8gZT1lW3RdO3doaWxlKGUmJjEhPT1lLm5vZGVUeXBlKTtyZXR1cm4gZX14LmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJjExIT09dC5ub2RlVHlwZT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4geC5kaXIoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHB0KGUsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oZSl7cmV0dXJuIHB0KGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB4LmRpcihlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB4LmRpcihlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4geC5kaXIoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmRpcihlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4geC5zaWJsaW5nKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4geC5zaWJsaW5nKGUuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB4Lm5vZGVOYW1lKGUsImlmcmFtZSIpP2UuY29udGVudERvY3VtZW50fHxlLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6eC5tZXJnZShbXSxlLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oZSx0KXt4LmZuW2VdPWZ1bmN0aW9uKG4scil7dmFyIGk9eC5tYXAodGhpcyx0LG4pO3JldHVybiJVbnRpbCIhPT1lLnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYoaT14LmZpbHRlcihyLGkpKSx0aGlzLmxlbmd0aD4xJiYoY3RbZV18fChpPXgudW5pcXVlKGkpKSxsdC50ZXN0KGUpJiYoaT1pLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGkpfX0pLHguZXh0ZW5kKHtmaWx0ZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRbMF07cmV0dXJuIG4mJihlPSI6bm90KCIrZSsiKSIpLDE9PT10Lmxlbmd0aCYmMT09PXIubm9kZVR5cGU/eC5maW5kLm1hdGNoZXNTZWxlY3RvcihyLGUpP1tyXTpbXTp4LmZpbmQubWF0Y2hlcyhlLHguZ3JlcCh0LGZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pKX0sZGlyOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1bXSxvPWVbbl07d2hpbGUobyYmOSE9PW8ubm9kZVR5cGUmJihyPT09dHx8MSE9PW8ubm9kZVR5cGV8fCF4KG8pLmlzKHIpKSkxPT09by5ub2RlVHlwZSYmaS5wdXNoKG8pLG89b1tuXTtyZXR1cm4gaX0sc2libGluZzpmdW5jdGlvbihlLHQpe3ZhciBuPVtdO2Zvcig7ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59fSk7ZnVuY3Rpb24gZnQoZSx0LG4pe2lmKHguaXNGdW5jdGlvbih0KSlyZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSxyKXtyZXR1cm4hIXQuY2FsbChlLHIsZSkhPT1ufSk7aWYodC5ub2RlVHlwZSlyZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoc3QudGVzdCh0KSlyZXR1cm4geC5maWx0ZXIodCxlLG4pO3Q9eC5maWx0ZXIodCxlKX1yZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHguaW5BcnJheShlLHQpPj0wIT09bn0pfWZ1bmN0aW9uIGR0KGUpe3ZhciB0PWh0LnNwbGl0KCJ8Iiksbj1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihuLmNyZWF0ZUVsZW1lbnQpd2hpbGUodC5sZW5ndGgpbi5jcmVhdGVFbGVtZW50KHQucG9wKCkpO3JldHVybiBufXZhciBodD0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZ3Q9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxtdD1SZWdFeHAoIjwoPzoiK2h0KyIpW1xccy8+XSIsImkiKSx5dD0vXlxzKy8sdnQ9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSxidD0vPChbXHc6XSspLyx4dD0vPHRib2R5L2ksd3Q9Lzx8JiM/XHcrOy8sVHQ9LzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSxDdD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxOdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxrdD0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksRXQ9L150cnVlXC8oLiopLyxTdD0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2csQXQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4iXSxwYXJhbTpbMSwiPG9iamVjdD4iLCI8L29iamVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0Onguc3VwcG9ydC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19LGp0PWR0KGEpLER0PWp0LmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgiZGl2IikpO0F0Lm9wdGdyb3VwPUF0Lm9wdGlvbixBdC50Ym9keT1BdC50Zm9vdD1BdC5jb2xncm91cD1BdC5jYXB0aW9uPUF0LnRoZWFkLEF0LnRoPUF0LnRkLHguZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD94LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxhKS5jcmVhdGVUZXh0Tm9kZShlKSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1MdCh0aGlzLGUpO3QuYXBwZW5kQ2hpbGQoZSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PUx0KHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lP3guZmlsdGVyKGUsdGhpcyk6dGhpcyxpPTA7Zm9yKDtudWxsIT0obj1yW2ldKTtpKyspdHx8MSE9PW4ubm9kZVR5cGV8fHguY2xlYW5EYXRhKEZ0KG4pKSxuLnBhcmVudE5vZGUmJih0JiZ4LmNvbnRhaW5zKG4ub3duZXJEb2N1bWVudCxuKSYmX3QoRnQobiwic2NyaXB0IikpLG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7dmFyIGUsdD0wO2Zvcig7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKXsxPT09ZS5ub2RlVHlwZSYmeC5jbGVhbkRhdGEoRnQoZSwhMSkpO3doaWxlKGUuZmlyc3RDaGlsZCllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7ZS5vcHRpb25zJiZ4Lm5vZGVOYW1lKGUsInNlbGVjdCIpJiYoZS5vcHRpb25zLmxlbmd0aD0wKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsPT1lPyExOmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB4LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3ZhciBuPXRoaXNbMF18fHt9LHI9MCxpPXRoaXMubGVuZ3RoO2lmKGU9PT10KXJldHVybiAxPT09bi5ub2RlVHlwZT9uLmlubmVySFRNTC5yZXBsYWNlKGd0LCIiKTp0O2lmKCEoInN0cmluZyIhPXR5cGVvZiBlfHxUdC50ZXN0KGUpfHwheC5zdXBwb3J0Lmh0bWxTZXJpYWxpemUmJm10LnRlc3QoZSl8fCF4LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJnl0LnRlc3QoZSl8fEF0WyhidC5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2U9ZS5yZXBsYWNlKHZ0LCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtpPnI7cisrKW49dGhpc1tyXXx8e30sMT09PW4ubm9kZVR5cGUmJih4LmNsZWFuRGF0YShGdChuLCExKSksbi5pbm5lckhUTUw9ZSk7bj0wfWNhdGNoKG8pe319biYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBlPXgubWFwKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuW2UubmV4dFNpYmxpbmcsZS5wYXJlbnROb2RlXX0pLHQ9MDtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24obil7dmFyIHI9ZVt0KytdLGk9ZVt0KytdO2kmJihyJiZyLnBhcmVudE5vZGUhPT1pJiYocj10aGlzLm5leHRTaWJsaW5nKSx4KHRoaXMpLnJlbW92ZSgpLGkuaW5zZXJ0QmVmb3JlKG4scikpfSwhMCksdD90aGlzOnRoaXMucmVtb3ZlKCl9LGRldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW1vdmUoZSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGUsdCxuKXtlPWQuYXBwbHkoW10sZSk7dmFyIHIsaSxvLGEscyxsLHU9MCxjPXRoaXMubGVuZ3RoLHA9dGhpcyxmPWMtMSxoPWVbMF0sZz14LmlzRnVuY3Rpb24oaCk7aWYoZ3x8ISgxPj1jfHwic3RyaW5nIiE9dHlwZW9mIGh8fHguc3VwcG9ydC5jaGVja0Nsb25lKSYmTnQudGVzdChoKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHIpe3ZhciBpPXAuZXEocik7ZyYmKGVbMF09aC5jYWxsKHRoaXMscixpLmh0bWwoKSkpLGkuZG9tTWFuaXAoZSx0LG4pfSk7aWYoYyYmKGw9eC5idWlsZEZyYWdtZW50KGUsdGhpc1swXS5vd25lckRvY3VtZW50LCExLCFuJiZ0aGlzKSxyPWwuZmlyc3RDaGlsZCwxPT09bC5jaGlsZE5vZGVzLmxlbmd0aCYmKGw9cikscikpe2ZvcihhPXgubWFwKEZ0KGwsInNjcmlwdCIpLEh0KSxvPWEubGVuZ3RoO2M+dTt1KyspaT1sLHUhPT1mJiYoaT14LmNsb25lKGksITAsITApLG8mJngubWVyZ2UoYSxGdChpLCJzY3JpcHQiKSkpLHQuY2FsbCh0aGlzW3VdLGksdSk7aWYobylmb3Iocz1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQseC5tYXAoYSxxdCksdT0wO28+dTt1KyspaT1hW3VdLGt0LnRlc3QoaS50eXBlfHwiIikmJiF4Ll9kYXRhKGksImdsb2JhbEV2YWwiKSYmeC5jb250YWlucyhzLGkpJiYoaS5zcmM/eC5fZXZhbFVybChpLnNyYyk6eC5nbG9iYWxFdmFsKChpLnRleHR8fGkudGV4dENvbnRlbnR8fGkuaW5uZXJIVE1MfHwiIikucmVwbGFjZShTdCwiIikpKTtsPXI9bnVsbH1yZXR1cm4gdGhpc319KTtmdW5jdGlvbiBMdChlLHQpe3JldHVybiB4Lm5vZGVOYW1lKGUsInRhYmxlIikmJngubm9kZU5hbWUoMT09PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8ZS5hcHBlbmRDaGlsZChlLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6ZX1mdW5jdGlvbiBIdChlKXtyZXR1cm4gZS50eXBlPShudWxsIT09eC5maW5kLmF0dHIoZSwidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gcXQoZSl7dmFyIHQ9RXQuZXhlYyhlLnR5cGUpO3JldHVybiB0P2UudHlwZT10WzFdOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBfdChlLHQpe3ZhciBuLHI9MDtmb3IoO251bGwhPShuPWVbcl0pO3IrKyl4Ll9kYXRhKG4sImdsb2JhbEV2YWwiLCF0fHx4Ll9kYXRhKHRbcl0sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24gTXQoZSx0KXtpZigxPT09dC5ub2RlVHlwZSYmeC5oYXNEYXRhKGUpKXt2YXIgbixyLGksbz14Ll9kYXRhKGUpLGE9eC5fZGF0YSh0LG8pLHM9by5ldmVudHM7aWYocyl7ZGVsZXRlIGEuaGFuZGxlLGEuZXZlbnRzPXt9O2ZvcihuIGluIHMpZm9yKHI9MCxpPXNbbl0ubGVuZ3RoO2k+cjtyKyspeC5ldmVudC5hZGQodCxuLHNbbl1bcl0pfWEuZGF0YSYmKGEuZGF0YT14LmV4dGVuZCh7fSxhLmRhdGEpKX19ZnVuY3Rpb24gT3QoZSx0KXt2YXIgbixyLGk7aWYoMT09PXQubm9kZVR5cGUpe2lmKG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCF4LnN1cHBvcnQubm9DbG9uZUV2ZW50JiZ0W3guZXhwYW5kb10pe2k9eC5fZGF0YSh0KTtmb3IociBpbiBpLmV2ZW50cyl4LnJlbW92ZUV2ZW50KHQscixpLmhhbmRsZSk7dC5yZW1vdmVBdHRyaWJ1dGUoeC5leHBhbmRvKX0ic2NyaXB0Ij09PW4mJnQudGV4dCE9PWUudGV4dD8oSHQodCkudGV4dD1lLnRleHQscXQodCkpOiJvYmplY3QiPT09bj8odC5wYXJlbnROb2RlJiYodC5vdXRlckhUTUw9ZS5vdXRlckhUTUwpLHguc3VwcG9ydC5odG1sNUNsb25lJiZlLmlubmVySFRNTCYmIXgudHJpbSh0LmlubmVySFRNTCkmJih0LmlubmVySFRNTD1lLmlubmVySFRNTCkpOiJpbnB1dCI9PT1uJiZDdC50ZXN0KGUudHlwZSk/KHQuZGVmYXVsdENoZWNrZWQ9dC5jaGVja2VkPWUuY2hlY2tlZCx0LnZhbHVlIT09ZS52YWx1ZSYmKHQudmFsdWU9ZS52YWx1ZSkpOiJvcHRpb24iPT09bj90LmRlZmF1bHRTZWxlY3RlZD10LnNlbGVjdGVkPWUuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09bnx8InRleHRhcmVhIj09PW4pJiYodC5kZWZhdWx0VmFsdWU9ZS5kZWZhdWx0VmFsdWUpfX14LmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24oZSl7dmFyIG4scj0wLGk9W10sbz14KGUpLGE9by5sZW5ndGgtMTtmb3IoO2E+PXI7cisrKW49cj09PWE/dGhpczp0aGlzLmNsb25lKCEwKSx4KG9bcl0pW3RdKG4pLGguYXBwbHkoaSxuLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaSl9fSk7ZnVuY3Rpb24gRnQoZSxuKXt2YXIgcixvLGE9MCxzPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09aT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKG58fCIqIik6dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbCE9PWk/ZS5xdWVyeVNlbGVjdG9yQWxsKG58fCIqIik6dDtpZighcylmb3Iocz1bXSxyPWUuY2hpbGROb2Rlc3x8ZTtudWxsIT0obz1yW2FdKTthKyspIW58fHgubm9kZU5hbWUobyxuKT9zLnB1c2gobyk6eC5tZXJnZShzLEZ0KG8sbikpO3JldHVybiBuPT09dHx8biYmeC5ub2RlTmFtZShlLG4pP3gubWVyZ2UoW2VdLHMpOnN9ZnVuY3Rpb24gQnQoZSl7Q3QudGVzdChlLnR5cGUpJiYoZS5kZWZhdWx0Q2hlY2tlZD1lLmNoZWNrZWQpfXguZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyxsPXguY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpO2lmKHguc3VwcG9ydC5odG1sNUNsb25lfHx4LmlzWE1MRG9jKGUpfHwhbXQudGVzdCgiPCIrZS5ub2RlTmFtZSsiPiIpP289ZS5jbG9uZU5vZGUoITApOihEdC5pbm5lckhUTUw9ZS5vdXRlckhUTUwsRHQucmVtb3ZlQ2hpbGQobz1EdC5maXJzdENoaWxkKSksISh4LnN1cHBvcnQubm9DbG9uZUV2ZW50JiZ4LnN1cHBvcnQubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHguaXNYTUxEb2MoZSkpKWZvcihyPUZ0KG8pLHM9RnQoZSksYT0wO251bGwhPShpPXNbYV0pOysrYSlyW2FdJiZPdChpLHJbYV0pO2lmKHQpaWYobilmb3Iocz1zfHxGdChlKSxyPXJ8fEZ0KG8pLGE9MDtudWxsIT0oaT1zW2FdKTthKyspTXQoaSxyW2FdKTtlbHNlIE10KGUsbyk7cmV0dXJuIHI9RnQobywic2NyaXB0Iiksci5sZW5ndGg+MCYmX3QociwhbCYmRnQoZSwic2NyaXB0IikpLHI9cz1pPW51bGwsb30sYnVpbGRGcmFnbWVudDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyxsLHUsYyxwPWUubGVuZ3RoLGY9ZHQodCksZD1bXSxoPTA7Zm9yKDtwPmg7aCsrKWlmKG89ZVtoXSxvfHwwPT09bylpZigib2JqZWN0Ij09PXgudHlwZShvKSl4Lm1lcmdlKGQsby5ub2RlVHlwZT9bb106byk7ZWxzZSBpZih3dC50ZXN0KG8pKXtzPXN8fGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSksbD0oYnQuZXhlYyhvKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxjPUF0W2xdfHxBdC5fZGVmYXVsdCxzLmlubmVySFRNTD1jWzFdK28ucmVwbGFjZSh2dCwiPCQxPjwvJDI+IikrY1syXSxpPWNbMF07d2hpbGUoaS0tKXM9cy5sYXN0Q2hpbGQ7aWYoIXguc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmeXQudGVzdChvKSYmZC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUoeXQuZXhlYyhvKVswXSkpLCF4LnN1cHBvcnQudGJvZHkpe289InRhYmxlIiE9PWx8fHh0LnRlc3Qobyk/Ijx0YWJsZT4iIT09Y1sxXXx8eHQudGVzdChvKT8wOnM6cy5maXJzdENoaWxkLGk9byYmby5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShpLS0peC5ub2RlTmFtZSh1PW8uY2hpbGROb2Rlc1tpXSwidGJvZHkiKSYmIXUuY2hpbGROb2Rlcy5sZW5ndGgmJm8ucmVtb3ZlQ2hpbGQodSl9eC5tZXJnZShkLHMuY2hpbGROb2Rlcykscy50ZXh0Q29udGVudD0iIjt3aGlsZShzLmZpcnN0Q2hpbGQpcy5yZW1vdmVDaGlsZChzLmZpcnN0Q2hpbGQpO3M9Zi5sYXN0Q2hpbGR9ZWxzZSBkLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7cyYmZi5yZW1vdmVDaGlsZChzKSx4LnN1cHBvcnQuYXBwZW5kQ2hlY2tlZHx8eC5ncmVwKEZ0KGQsImlucHV0IiksQnQpLGg9MDt3aGlsZShvPWRbaCsrXSlpZigoIXJ8fC0xPT09eC5pbkFycmF5KG8scikpJiYoYT14LmNvbnRhaW5zKG8ub3duZXJEb2N1bWVudCxvKSxzPUZ0KGYuYXBwZW5kQ2hpbGQobyksInNjcmlwdCIpLGEmJl90KHMpLG4pKXtpPTA7d2hpbGUobz1zW2krK10pa3QudGVzdChvLnR5cGV8fCIiKSYmbi5wdXNoKG8pfXJldHVybiBzPW51bGwsZn0sY2xlYW5EYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEscz0wLGw9eC5leHBhbmRvLHU9eC5jYWNoZSxjPXguc3VwcG9ydC5kZWxldGVFeHBhbmRvLGY9eC5ldmVudC5zcGVjaWFsO2Zvcig7bnVsbCE9KG49ZVtzXSk7cysrKWlmKCh0fHx4LmFjY2VwdERhdGEobikpJiYobz1uW2xdLGE9byYmdVtvXSkpe2lmKGEuZXZlbnRzKWZvcihyIGluIGEuZXZlbnRzKWZbcl0/eC5ldmVudC5yZW1vdmUobixyKTp4LnJlbW92ZUV2ZW50KG4scixhLmhhbmRsZSk7CnVbb10mJihkZWxldGUgdVtvXSxjP2RlbGV0ZSBuW2xdOnR5cGVvZiBuLnJlbW92ZUF0dHJpYnV0ZSE9PWk/bi5yZW1vdmVBdHRyaWJ1dGUobCk6bltsXT1udWxsLHAucHVzaChvKSl9fSxfZXZhbFVybDpmdW5jdGlvbihlKXtyZXR1cm4geC5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfX0pLHguZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe2lmKHguaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykud3JhcEFsbChlLmNhbGwodGhpcyx0KSl9KTtpZih0aGlzWzBdKXt2YXIgdD14KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdENoaWxkJiYxPT09ZS5maXJzdENoaWxkLm5vZGVUeXBlKWU9ZS5maXJzdENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHguaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD14LmlzRnVuY3Rpb24oZSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt4KHRoaXMpLndyYXBBbGwodD9lLmNhbGwodGhpcyxuKTplKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7eC5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fHgodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pO3ZhciBQdCxSdCxXdCwkdD0vYWxwaGFcKFteKV0qXCkvaSxJdD0vb3BhY2l0eVxzKj1ccyooW14pXSopLyx6dD0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC8sWHQ9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFV0PS9ebWFyZ2luLyxWdD1SZWdFeHAoIl4oIit3KyIpKC4qKSQiLCJpIiksWXQ9UmVnRXhwKCJeKCIrdysiKSg/IXB4KVthLXolXSskIiwiaSIpLEp0PVJlZ0V4cCgiXihbKy1dKT0oIit3KyIpIiwiaSIpLEd0PXtCT0RZOiJibG9jayJ9LFF0PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxLdD17bGV0dGVyU3BhY2luZzowLGZvbnRXZWlnaHQ6NDAwfSxadD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGVuPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl07ZnVuY3Rpb24gdG4oZSx0KXtpZih0IGluIGUpcmV0dXJuIHQ7dmFyIG49dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLHI9dCxpPWVuLmxlbmd0aDt3aGlsZShpLS0paWYodD1lbltpXStuLHQgaW4gZSlyZXR1cm4gdDtyZXR1cm4gcn1mdW5jdGlvbiBubihlLHQpe3JldHVybiBlPXR8fGUsIm5vbmUiPT09eC5jc3MoZSwiZGlzcGxheSIpfHwheC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl9ZnVuY3Rpb24gcm4oZSx0KXt2YXIgbixyLGksbz1bXSxhPTAscz1lLmxlbmd0aDtmb3IoO3M+YTthKyspcj1lW2FdLHIuc3R5bGUmJihvW2FdPXguX2RhdGEociwib2xkZGlzcGxheSIpLG49ci5zdHlsZS5kaXNwbGF5LHQ/KG9bYV18fCJub25lIiE9PW58fChyLnN0eWxlLmRpc3BsYXk9IiIpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZubihyKSYmKG9bYV09eC5fZGF0YShyLCJvbGRkaXNwbGF5IixsbihyLm5vZGVOYW1lKSkpKTpvW2FdfHwoaT1ubihyKSwobiYmIm5vbmUiIT09bnx8IWkpJiZ4Ll9kYXRhKHIsIm9sZGRpc3BsYXkiLGk/bjp4LmNzcyhyLCJkaXNwbGF5IikpKSk7Zm9yKGE9MDtzPmE7YSsrKXI9ZVthXSxyLnN0eWxlJiYodCYmIm5vbmUiIT09ci5zdHlsZS5kaXNwbGF5JiYiIiE9PXIuc3R5bGUuZGlzcGxheXx8KHIuc3R5bGUuZGlzcGxheT10P29bYV18fCIiOiJub25lIikpO3JldHVybiBlfXguZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSxuKXtyZXR1cm4geC5hY2Nlc3ModGhpcyxmdW5jdGlvbihlLG4scil7dmFyIGksbyxhPXt9LHM9MDtpZih4LmlzQXJyYXkobikpe2ZvcihvPVJ0KGUpLGk9bi5sZW5ndGg7aT5zO3MrKylhW25bc11dPXguY3NzKGUsbltzXSwhMSxvKTtyZXR1cm4gYX1yZXR1cm4gciE9PXQ/eC5zdHlsZShlLG4scik6eC5jc3MoZSxuKX0sZSxuLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gcm4odGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gcm4odGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bm4odGhpcyk/eCh0aGlzKS5zaG93KCk6eCh0aGlzKS5oaWRlKCl9KX19KSx4LmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPVd0KGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOnguc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oZSxuLHIsaSl7aWYoZSYmMyE9PWUubm9kZVR5cGUmJjghPT1lLm5vZGVUeXBlJiZlLnN0eWxlKXt2YXIgbyxhLHMsbD14LmNhbWVsQ2FzZShuKSx1PWUuc3R5bGU7aWYobj14LmNzc1Byb3BzW2xdfHwoeC5jc3NQcm9wc1tsXT10bih1LGwpKSxzPXguY3NzSG9va3Nbbl18fHguY3NzSG9va3NbbF0scj09PXQpcmV0dXJuIHMmJiJnZXQiaW4gcyYmKG89cy5nZXQoZSwhMSxpKSkhPT10P286dVtuXTtpZihhPXR5cGVvZiByLCJzdHJpbmciPT09YSYmKG89SnQuZXhlYyhyKSkmJihyPShvWzFdKzEpKm9bMl0rcGFyc2VGbG9hdCh4LmNzcyhlLG4pKSxhPSJudW1iZXIiKSwhKG51bGw9PXJ8fCJudW1iZXIiPT09YSYmaXNOYU4ocil8fCgibnVtYmVyIiE9PWF8fHguY3NzTnVtYmVyW2xdfHwocis9InB4IikseC5zdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1yfHwwIT09bi5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fCh1W25dPSJpbmhlcml0IikscyYmInNldCJpbiBzJiYocj1zLnNldChlLHIsaSkpPT09dCkpKXRyeXt1W25dPXJ9Y2F0Y2goYyl7fX19LGNzczpmdW5jdGlvbihlLG4scixpKXt2YXIgbyxhLHMsbD14LmNhbWVsQ2FzZShuKTtyZXR1cm4gbj14LmNzc1Byb3BzW2xdfHwoeC5jc3NQcm9wc1tsXT10bihlLnN0eWxlLGwpKSxzPXguY3NzSG9va3Nbbl18fHguY3NzSG9va3NbbF0scyYmImdldCJpbiBzJiYoYT1zLmdldChlLCEwLHIpKSxhPT09dCYmKGE9V3QoZSxuLGkpKSwibm9ybWFsIj09PWEmJm4gaW4gS3QmJihhPUt0W25dKSwiIj09PXJ8fHI/KG89cGFyc2VGbG9hdChhKSxyPT09ITB8fHguaXNOdW1lcmljKG8pP298fDA6YSk6YX19KSxlLmdldENvbXB1dGVkU3R5bGU/KFJ0PWZ1bmN0aW9uKHQpe3JldHVybiBlLmdldENvbXB1dGVkU3R5bGUodCxudWxsKX0sV3Q9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8sYSxzPXJ8fFJ0KGUpLGw9cz9zLmdldFByb3BlcnR5VmFsdWUobil8fHNbbl06dCx1PWUuc3R5bGU7cmV0dXJuIHMmJigiIiE9PWx8fHguY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwobD14LnN0eWxlKGUsbikpLFl0LnRlc3QobCkmJlV0LnRlc3QobikmJihpPXUud2lkdGgsbz11Lm1pbldpZHRoLGE9dS5tYXhXaWR0aCx1Lm1pbldpZHRoPXUubWF4V2lkdGg9dS53aWR0aD1sLGw9cy53aWR0aCx1LndpZHRoPWksdS5taW5XaWR0aD1vLHUubWF4V2lkdGg9YSkpLGx9KTphLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihSdD1mdW5jdGlvbihlKXtyZXR1cm4gZS5jdXJyZW50U3R5bGV9LFd0PWZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvLGEscz1yfHxSdChlKSxsPXM/c1tuXTp0LHU9ZS5zdHlsZTtyZXR1cm4gbnVsbD09bCYmdSYmdVtuXSYmKGw9dVtuXSksWXQudGVzdChsKSYmIXp0LnRlc3QobikmJihpPXUubGVmdCxvPWUucnVudGltZVN0eWxlLGE9byYmby5sZWZ0LGEmJihvLmxlZnQ9ZS5jdXJyZW50U3R5bGUubGVmdCksdS5sZWZ0PSJmb250U2l6ZSI9PT1uPyIxZW0iOmwsbD11LnBpeGVsTGVmdCsicHgiLHUubGVmdD1pLGEmJihvLmxlZnQ9YSkpLCIiPT09bD8iYXV0byI6bH0pO2Z1bmN0aW9uIG9uKGUsdCxuKXt2YXIgcj1WdC5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsxXS0obnx8MCkpKyhyWzJdfHwicHgiKTp0fWZ1bmN0aW9uIGFuKGUsdCxuLHIsaSl7dmFyIG89bj09PShyPyJib3JkZXIiOiJjb250ZW50Iik/NDoid2lkdGgiPT09dD8xOjAsYT0wO2Zvcig7ND5vO28rPTIpIm1hcmdpbiI9PT1uJiYoYSs9eC5jc3MoZSxuK1p0W29dLCEwLGkpKSxyPygiY29udGVudCI9PT1uJiYoYS09eC5jc3MoZSwicGFkZGluZyIrWnRbb10sITAsaSkpLCJtYXJnaW4iIT09biYmKGEtPXguY3NzKGUsImJvcmRlciIrWnRbb10rIldpZHRoIiwhMCxpKSkpOihhKz14LmNzcyhlLCJwYWRkaW5nIitadFtvXSwhMCxpKSwicGFkZGluZyIhPT1uJiYoYSs9eC5jc3MoZSwiYm9yZGVyIitadFtvXSsiV2lkdGgiLCEwLGkpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gc24oZSx0LG4pe3ZhciByPSEwLGk9IndpZHRoIj09PXQ/ZS5vZmZzZXRXaWR0aDplLm9mZnNldEhlaWdodCxvPVJ0KGUpLGE9eC5zdXBwb3J0LmJveFNpemluZyYmImJvcmRlci1ib3giPT09eC5jc3MoZSwiYm94U2l6aW5nIiwhMSxvKTtpZigwPj1pfHxudWxsPT1pKXtpZihpPVd0KGUsdCxvKSwoMD5pfHxudWxsPT1pKSYmKGk9ZS5zdHlsZVt0XSksWXQudGVzdChpKSlyZXR1cm4gaTtyPWEmJih4LnN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGV8fGk9PT1lLnN0eWxlW3RdKSxpPXBhcnNlRmxvYXQoaSl8fDB9cmV0dXJuIGkrYW4oZSx0LG58fChhPyJib3JkZXIiOiJjb250ZW50IikscixvKSsicHgifWZ1bmN0aW9uIGxuKGUpe3ZhciB0PWEsbj1HdFtlXTtyZXR1cm4gbnx8KG49dW4oZSx0KSwibm9uZSIhPT1uJiZufHwoUHQ9KFB0fHx4KCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikuY3NzKCJjc3NUZXh0IiwiZGlzcGxheTpibG9jayAhaW1wb3J0YW50IikpLmFwcGVuZFRvKHQuZG9jdW1lbnRFbGVtZW50KSx0PShQdFswXS5jb250ZW50V2luZG93fHxQdFswXS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LHQud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLHQuY2xvc2UoKSxuPXVuKGUsdCksUHQuZGV0YWNoKCkpLEd0W2VdPW4pLG59ZnVuY3Rpb24gdW4oZSx0KXt2YXIgbj14KHQuY3JlYXRlRWxlbWVudChlKSkuYXBwZW5kVG8odC5ib2R5KSxyPXguY3NzKG5bMF0sImRpc3BsYXkiKTtyZXR1cm4gbi5yZW1vdmUoKSxyfXguZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSxuKXt4LmNzc0hvb2tzW25dPXtnZXQ6ZnVuY3Rpb24oZSxyLGkpe3JldHVybiByPzA9PT1lLm9mZnNldFdpZHRoJiZYdC50ZXN0KHguY3NzKGUsImRpc3BsYXkiKSk/eC5zd2FwKGUsUXQsZnVuY3Rpb24oKXtyZXR1cm4gc24oZSxuLGkpfSk6c24oZSxuLGkpOnR9LHNldDpmdW5jdGlvbihlLHQscil7dmFyIGk9ciYmUnQoZSk7cmV0dXJuIG9uKGUsdCxyP2FuKGUsbixyLHguc3VwcG9ydC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PXguY3NzKGUsImJveFNpemluZyIsITEsaSksaSk6MCl9fX0pLHguc3VwcG9ydC5vcGFjaXR5fHwoeC5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSXQudGVzdCgodCYmZS5jdXJyZW50U3R5bGU/ZS5jdXJyZW50U3R5bGUuZmlsdGVyOmUuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6dD8iMSI6IiJ9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuPWUuc3R5bGUscj1lLmN1cnJlbnRTdHlsZSxpPXguaXNOdW1lcmljKHQpPyJhbHBoYShvcGFjaXR5PSIrMTAwKnQrIikiOiIiLG89ciYmci5maWx0ZXJ8fG4uZmlsdGVyfHwiIjtuLnpvb209MSwodD49MXx8IiI9PT10KSYmIiI9PT14LnRyaW0oby5yZXBsYWNlKCR0LCIiKSkmJm4ucmVtb3ZlQXR0cmlidXRlJiYobi5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09dHx8ciYmIXIuZmlsdGVyKXx8KG4uZmlsdGVyPSR0LnRlc3Qobyk/by5yZXBsYWNlKCR0LGkpOm8rIiAiK2kpfX0pLHgoZnVuY3Rpb24oKXt4LnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KHguY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihlLG4pe3JldHVybiBuP3guc3dhcChlLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxXdCxbZSwibWFyZ2luUmlnaHQiXSk6dH19KSwheC5zdXBwb3J0LnBpeGVsUG9zaXRpb24mJnguZm4ucG9zaXRpb24mJnguZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLG4pe3guY3NzSG9va3Nbbl09e2dldDpmdW5jdGlvbihlLHIpe3JldHVybiByPyhyPVd0KGUsbiksWXQudGVzdChyKT94KGUpLnBvc2l0aW9uKClbbl0rInB4IjpyKTp0fX19KX0pLHguZXhwciYmeC5leHByLmZpbHRlcnMmJih4LmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIDA+PWUub2Zmc2V0V2lkdGgmJjA+PWUub2Zmc2V0SGVpZ2h0fHwheC5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmIm5vbmUiPT09KGUuc3R5bGUmJmUuc3R5bGUuZGlzcGxheXx8eC5jc3MoZSwiZGlzcGxheSIpKX0seC5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4heC5leHByLmZpbHRlcnMuaGlkZGVuKGUpfSkseC5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oZSx0KXt4LmNzc0hvb2tzW2UrdF09e2V4cGFuZDpmdW5jdGlvbihuKXt2YXIgcj0wLGk9e30sbz0ic3RyaW5nIj09dHlwZW9mIG4/bi5zcGxpdCgiICIpOltuXTtmb3IoOzQ+cjtyKyspaVtlK1p0W3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LFV0LnRlc3QoZSl8fCh4LmNzc0hvb2tzW2UrdF0uc2V0PW9uKX0pO3ZhciBjbj0vJTIwL2cscG49L1xbXF0kLyxmbj0vXHI/XG4vZyxkbj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksaG49L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO3guZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4geC5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXgucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP3gubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXgodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZobi50ZXN0KHRoaXMubm9kZU5hbWUpJiYhZG4udGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IUN0LnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49eCh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOnguaXNBcnJheShuKT94Lm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoZm4sIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKGZuLCJcclxuIil9fSkuZ2V0KCl9fSkseC5wYXJhbT1mdW5jdGlvbihlLG4pe3ZhciByLGk9W10sbz1mdW5jdGlvbihlLHQpe3Q9eC5pc0Z1bmN0aW9uKHQpP3QoKTpudWxsPT10PyIiOnQsaVtpLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQodCl9O2lmKG49PT10JiYobj14LmFqYXhTZXR0aW5ncyYmeC5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLHguaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF4LmlzUGxhaW5PYmplY3QoZSkpeC5lYWNoKGUsZnVuY3Rpb24oKXtvKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHIgaW4gZSlnbihyLGVbcl0sbixvKTtyZXR1cm4gaS5qb2luKCImIikucmVwbGFjZShjbiwiKyIpfTtmdW5jdGlvbiBnbihlLHQsbixyKXt2YXIgaTtpZih4LmlzQXJyYXkodCkpeC5lYWNoKHQsZnVuY3Rpb24odCxpKXtufHxwbi50ZXN0KGUpP3IoZSxpKTpnbihlKyJbIisoIm9iamVjdCI9PXR5cGVvZiBpP3Q6IiIpKyJdIixpLG4scil9KTtlbHNlIGlmKG58fCJvYmplY3QiIT09eC50eXBlKHQpKXIoZSx0KTtlbHNlIGZvcihpIGluIHQpZ24oZSsiWyIraSsiXSIsdFtpXSxuLHIpfXguZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe3guZm5bdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24odCxudWxsLGUsbik6dGhpcy50cmlnZ2VyKHQpfX0pLHguZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX0sYmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9fSk7dmFyIG1uLHluLHZuPXgubm93KCksYm49L1w/Lyx4bj0vIy4qJC8sd249LyhbPyZdKV89W14mXSovLFRuPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvZ20sQ249L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sTm49L14oPzpHRVR8SEVBRCkkLyxrbj0vXlwvXC8vLEVuPS9eKFtcdy4rLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKyl8KXwpLyxTbj14LmZuLmxvYWQsQW49e30sam49e30sRG49IiovIi5jb25jYXQoIioiKTt0cnl7eW49by5ocmVmfWNhdGNoKExuKXt5bj1hLmNyZWF0ZUVsZW1lbnQoImEiKSx5bi5ocmVmPSIiLHluPXluLmhyZWZ9bW49RW4uZXhlYyh5bi50b0xvd2VyQ2FzZSgpKXx8W107ZnVuY3Rpb24gSG4oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7InN0cmluZyIhPXR5cGVvZiB0JiYobj10LHQ9IioiKTt2YXIgcixpPTAsbz10LnRvTG93ZXJDYXNlKCkubWF0Y2goVCl8fFtdO2lmKHguaXNGdW5jdGlvbihuKSl3aGlsZShyPW9baSsrXSkiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIHFuKGUsbixyLGkpe3ZhciBvPXt9LGE9ZT09PWpuO2Z1bmN0aW9uIHMobCl7dmFyIHU7cmV0dXJuIG9bbF09ITAseC5lYWNoKGVbbF18fFtdLGZ1bmN0aW9uKGUsbCl7dmFyIGM9bChuLHIsaSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBjfHxhfHxvW2NdP2E/ISh1PWMpOnQ6KG4uZGF0YVR5cGVzLnVuc2hpZnQoYykscyhjKSwhMSl9KSx1fXJldHVybiBzKG4uZGF0YVR5cGVzWzBdKXx8IW9bIioiXSYmcygiKiIpfWZ1bmN0aW9uIF9uKGUsbil7dmFyIHIsaSxvPXguYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoaSBpbiBuKW5baV0hPT10JiYoKG9baV0/ZTpyfHwocj17fSkpW2ldPW5baV0pO3JldHVybiByJiZ4LmV4dGVuZCghMCxlLHIpLGV9eC5mbi5sb2FkPWZ1bmN0aW9uKGUsbixyKXtpZigic3RyaW5nIiE9dHlwZW9mIGUmJlNuKXJldHVybiBTbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGksbyxhLHM9dGhpcyxsPWUuaW5kZXhPZigiICIpO3JldHVybiBsPj0wJiYoaT1lLnNsaWNlKGwsZS5sZW5ndGgpLGU9ZS5zbGljZSgwLGwpKSx4LmlzRnVuY3Rpb24obik/KHI9bixuPXQpOm4mJiJvYmplY3QiPT10eXBlb2YgbiYmKGE9IlBPU1QiKSxzLmxlbmd0aD4wJiZ4LmFqYXgoe3VybDplLHR5cGU6YSxkYXRhVHlwZToiaHRtbCIsZGF0YTpufSkuZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyxzLmh0bWwoaT94KCI8ZGl2PiIpLmFwcGVuZCh4LnBhcnNlSFRNTChlKSkuZmluZChpKTplKX0pLmNvbXBsZXRlKHImJmZ1bmN0aW9uKGUsdCl7cy5lYWNoKHIsb3x8W2UucmVzcG9uc2VUZXh0LHQsZV0pfSksdGhpc30seC5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXt4LmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSkseC5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOnluLHR5cGU6IkdFVCIsaXNMb2NhbDpDbi50ZXN0KG1uWzFdKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkRuLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6eC5wYXJzZUpTT04sInRleHQgeG1sIjp4LnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9fbihfbihlLHguYWpheFNldHRpbmdzKSx0KTpfbih4LmFqYXhTZXR0aW5ncyxlKX0sYWpheFByZWZpbHRlcjpIbihBbiksYWpheFRyYW5zcG9ydDpIbihqbiksYWpheDpmdW5jdGlvbihlLG4peyJvYmplY3QiPT10eXBlb2YgZSYmKG49ZSxlPXQpLG49bnx8e307dmFyIHIsaSxvLGEscyxsLHUsYyxwPXguYWpheFNldHVwKHt9LG4pLGY9cC5jb250ZXh0fHxwLGQ9cC5jb250ZXh0JiYoZi5ub2RlVHlwZXx8Zi5qcXVlcnkpP3goZik6eC5ldmVudCxoPXguRGVmZXJyZWQoKSxnPXguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLG09cC5zdGF0dXNDb2RlfHx7fSx5PXt9LHY9e30sYj0wLHc9ImNhbmNlbGVkIixDPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoMj09PWIpe2lmKCFjKXtjPXt9O3doaWxlKHQ9VG4uZXhlYyhhKSljW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PWNbZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09Yj9hOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGJ8fChlPXZbbl09dltuXXx8ZSx5W2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGJ8fChwLm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZigyPmIpZm9yKHQgaW4gZSltW3RdPVttW3RdLGVbdF1dO2Vsc2UgQy5hbHdheXMoZVtDLnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHx3O3JldHVybiB1JiZ1LmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYoaC5wcm9taXNlKEMpLmNvbXBsZXRlPWcuYWRkLEMuc3VjY2Vzcz1DLmRvbmUsQy5lcnJvcj1DLmZhaWwscC51cmw9KChlfHxwLnVybHx8eW4pKyIiKS5yZXBsYWNlKHhuLCIiKS5yZXBsYWNlKGtuLG1uWzFdKyIvLyIpLHAudHlwZT1uLm1ldGhvZHx8bi50eXBlfHxwLm1ldGhvZHx8cC50eXBlLHAuZGF0YVR5cGVzPXgudHJpbShwLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goVCl8fFsiIl0sbnVsbD09cC5jcm9zc0RvbWFpbiYmKHI9RW4uZXhlYyhwLnVybC50b0xvd2VyQ2FzZSgpKSxwLmNyb3NzRG9tYWluPSEoIXJ8fHJbMV09PT1tblsxXSYmclsyXT09PW1uWzJdJiYoclszXXx8KCJodHRwOiI9PT1yWzFdPyI4MCI6IjQ0MyIpKT09PShtblszXXx8KCJodHRwOiI9PT1tblsxXT8iODAiOiI0NDMiKSkpKSxwLmRhdGEmJnAucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2YgcC5kYXRhJiYocC5kYXRhPXgucGFyYW0ocC5kYXRhLHAudHJhZGl0aW9uYWwpKSxxbihBbixwLG4sQyksMj09PWIpcmV0dXJuIEM7bD1wLmdsb2JhbCxsJiYwPT09eC5hY3RpdmUrKyYmeC5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxwLnR5cGU9cC50eXBlLnRvVXBwZXJDYXNlKCkscC5oYXNDb250ZW50PSFObi50ZXN0KHAudHlwZSksbz1wLnVybCxwLmhhc0NvbnRlbnR8fChwLmRhdGEmJihvPXAudXJsKz0oYm4udGVzdChvKT8iJiI6Ij8iKStwLmRhdGEsZGVsZXRlIHAuZGF0YSkscC5jYWNoZT09PSExJiYocC51cmw9d24udGVzdChvKT9vLnJlcGxhY2Uod24sIiQxXz0iK3ZuKyspOm8rKGJuLnRlc3Qobyk/IiYiOiI/IikrIl89Iit2bisrKSkscC5pZk1vZGlmaWVkJiYoeC5sYXN0TW9kaWZpZWRbb10mJkMuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHgubGFzdE1vZGlmaWVkW29dKSx4LmV0YWdbb10mJkMuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIseC5ldGFnW29dKSksKHAuZGF0YSYmcC5oYXNDb250ZW50JiZwLmNvbnRlbnRUeXBlIT09ITF8fG4uY29udGVudFR5cGUpJiZDLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIscC5jb250ZW50VHlwZSksQy5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHAuZGF0YVR5cGVzWzBdJiZwLmFjY2VwdHNbcC5kYXRhVHlwZXNbMF1dP3AuYWNjZXB0c1twLmRhdGFUeXBlc1swXV0rKCIqIiE9PXAuZGF0YVR5cGVzWzBdPyIsICIrRG4rIjsgcT0wLjAxIjoiIik6cC5hY2NlcHRzWyIqIl0pO2ZvcihpIGluIHAuaGVhZGVycylDLnNldFJlcXVlc3RIZWFkZXIoaSxwLmhlYWRlcnNbaV0pO2lmKHAuYmVmb3JlU2VuZCYmKHAuYmVmb3JlU2VuZC5jYWxsKGYsQyxwKT09PSExfHwyPT09YikpcmV0dXJuIEMuYWJvcnQoKTt3PSJhYm9ydCI7Zm9yKGkgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pQ1tpXShwW2ldKTtpZih1PXFuKGpuLHAsbixDKSl7Qy5yZWFkeVN0YXRlPTEsbCYmZC50cmlnZ2VyKCJhamF4U2VuZCIsW0MscF0pLHAuYXN5bmMmJnAudGltZW91dD4wJiYocz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Qy5hYm9ydCgidGltZW91dCIpfSxwLnRpbWVvdXQpKTt0cnl7Yj0xLHUuc2VuZCh5LGspfWNhdGNoKE4pe2lmKCEoMj5iKSl0aHJvdyBOO2soLTEsTil9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayhlLG4scixpKXt2YXIgYyx5LHYsdyxULE49bjsyIT09YiYmKGI9MixzJiZjbGVhclRpbWVvdXQocyksdT10LGE9aXx8IiIsQy5yZWFkeVN0YXRlPWU+MD80OjAsYz1lPj0yMDAmJjMwMD5lfHwzMDQ9PT1lLHImJih3PU1uKHAsQyxyKSksdz1PbihwLHcsQyxjKSxjPyhwLmlmTW9kaWZpZWQmJihUPUMuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxUJiYoeC5sYXN0TW9kaWZpZWRbb109VCksVD1DLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksVCYmKHguZXRhZ1tvXT1UKSksMjA0PT09ZXx8IkhFQUQiPT09cC50eXBlP049Im5vY29udGVudCI6MzA0PT09ZT9OPSJub3Rtb2RpZmllZCI6KE49dy5zdGF0ZSx5PXcuZGF0YSx2PXcuZXJyb3IsYz0hdikpOih2PU4sKGV8fCFOKSYmKE49ImVycm9yIiwwPmUmJihlPTApKSksQy5zdGF0dXM9ZSxDLnN0YXR1c1RleHQ9KG58fE4pKyIiLGM/aC5yZXNvbHZlV2l0aChmLFt5LE4sQ10pOmgucmVqZWN0V2l0aChmLFtDLE4sdl0pLEMuc3RhdHVzQ29kZShtKSxtPXQsbCYmZC50cmlnZ2VyKGM/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbQyxwLGM/eTp2XSksZy5maXJlV2l0aChmLFtDLE5dKSxsJiYoZC50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtDLHBdKSwtLXguYWN0aXZlfHx4LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gQ30sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHguZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLG4pe3JldHVybiB4LmdldChlLHQsbiwic2NyaXB0Iil9fSkseC5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsbil7eFtuXT1mdW5jdGlvbihlLHIsaSxvKXtyZXR1cm4geC5pc0Z1bmN0aW9uKHIpJiYobz1vfHxpLGk9cixyPXQpLHguYWpheCh7dXJsOmUsdHlwZTpuLGRhdGFUeXBlOm8sZGF0YTpyLHN1Y2Nlc3M6aX0pfX0pO2Z1bmN0aW9uIE1uKGUsbixyKXt2YXIgaSxvLGEscyxsPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSxvPT09dCYmKG89ZS5taW1lVHlwZXx8bi5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKG8pZm9yKHMgaW4gbClpZihsW3NdJiZsW3NdLnRlc3Qobykpe3UudW5zaGlmdChzKTticmVha31pZih1WzBdaW4gcilhPXVbMF07ZWxzZXtmb3IocyBpbiByKXtpZighdVswXXx8ZS5jb252ZXJ0ZXJzW3MrIiAiK3VbMF1dKXthPXM7YnJlYWt9aXx8KGk9cyl9YT1hfHxpfXJldHVybiBhPyhhIT09dVswXSYmdS51bnNoaWZ0KGEpLHJbYV0pOnR9ZnVuY3Rpb24gT24oZSx0LG4scil7dmFyIGksbyxhLHMsbCx1PXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihhIGluIGUuY29udmVydGVycyl1W2EudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2FdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIWwmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLGw9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89bDtlbHNlIGlmKCIqIiE9PWwmJmwhPT1vKXtpZihhPXVbbCsiICIrb118fHVbIiogIitvXSwhYSlmb3IoaSBpbiB1KWlmKHM9aS5zcGxpdCgiICIpLHNbMV09PT1vJiYoYT11W2wrIiAiK3NbMF1dfHx1WyIqICIrc1swXV0pKXthPT09ITA/YT11W2ldOnVbaV0hPT0hMCYmKG89c1swXSxjLnVuc2hpZnQoc1sxXSkpO2JyZWFrfWlmKGEhPT0hMClpZihhJiZlWyJ0aHJvd3MiXSl0PWEodCk7ZWxzZSB0cnl7dD1hKHQpfWNhdGNoKHApe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmE/cDoiTm8gY29udmVyc2lvbiBmcm9tICIrbCsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX14LmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiB4Lmdsb2JhbEV2YWwoZSksZX19fSkseC5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2UuY2FjaGU9PT10JiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIixlLmdsb2JhbD0hMSl9KSx4LmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oZSl7aWYoZS5jcm9zc0RvbWFpbil7dmFyIG4scj1hLmhlYWR8fHgoImhlYWQiKVswXXx8YS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24odCxpKXtuPWEuY3JlYXRlRWxlbWVudCgic2NyaXB0Iiksbi5hc3luYz0hMCxlLnNjcmlwdENoYXJzZXQmJihuLmNoYXJzZXQ9ZS5zY3JpcHRDaGFyc2V0KSxuLnNyYz1lLnVybCxuLm9ubG9hZD1uLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihlLHQpeyh0fHwhbi5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KG4ucmVhZHlTdGF0ZSkpJiYobi5vbmxvYWQ9bi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxuLnBhcmVudE5vZGUmJm4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSxuPW51bGwsdHx8aSgyMDAsInN1Y2Nlc3MiKSl9LHIuaW5zZXJ0QmVmb3JlKG4sci5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuLm9ubG9hZCh0LCEwKX19fX0pO3ZhciBGbj1bXSxCbj0vKD0pXD8oPz0mfCQpfFw/XD8vO3guYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT1Gbi5wb3AoKXx8eC5leHBhbmRvKyJfIit2bisrO3JldHVybiB0aGlzW2VdPSEwLGV9fSkseC5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihuLHIsaSl7dmFyIG8sYSxzLGw9bi5qc29ucCE9PSExJiYoQm4udGVzdChuLnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiBuLmRhdGEmJiEobi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZCbi50ZXN0KG4uZGF0YSkmJiJkYXRhIik7cmV0dXJuIGx8fCJqc29ucCI9PT1uLmRhdGFUeXBlc1swXT8obz1uLmpzb25wQ2FsbGJhY2s9eC5pc0Z1bmN0aW9uKG4uanNvbnBDYWxsYmFjayk/bi5qc29ucENhbGxiYWNrKCk6bi5qc29ucENhbGxiYWNrLGw/bltsXT1uW2xdLnJlcGxhY2UoQm4sIiQxIitvKTpuLmpzb25wIT09ITEmJihuLnVybCs9KGJuLnRlc3Qobi51cmwpPyImIjoiPyIpK24uanNvbnArIj0iK28pLG4uY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBzfHx4LmVycm9yKG8rIiB3YXMgbm90IGNhbGxlZCIpLHNbMF19LG4uZGF0YVR5cGVzWzBdPSJqc29uIixhPWVbb10sZVtvXT1mdW5jdGlvbigpe3M9YXJndW1lbnRzfSxpLmFsd2F5cyhmdW5jdGlvbigpe2Vbb109YSxuW29dJiYobi5qc29ucENhbGxiYWNrPXIuanNvbnBDYWxsYmFjayxGbi5wdXNoKG8pKSxzJiZ4LmlzRnVuY3Rpb24oYSkmJmEoc1swXSkscz1hPXR9KSwic2NyaXB0Iik6dH0pO3ZhciBQbixSbixXbj0wLCRuPWUuQWN0aXZlWE9iamVjdCYmZnVuY3Rpb24oKXt2YXIgZTtmb3IoZSBpbiBQbilQbltlXSh0LCEwKX07ZnVuY3Rpb24gSW4oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKHQpe319ZnVuY3Rpb24gem4oKXt0cnl7cmV0dXJuIG5ldyBlLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2godCl7fX14LmFqYXhTZXR0aW5ncy54aHI9ZS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmSW4oKXx8em4oKX06SW4sUm49eC5hamF4U2V0dGluZ3MueGhyKCkseC5zdXBwb3J0LmNvcnM9ISFSbiYmIndpdGhDcmVkZW50aWFscyJpbiBSbixSbj14LnN1cHBvcnQuYWpheD0hIVJuLFJuJiZ4LmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24obil7aWYoIW4uY3Jvc3NEb21haW58fHguc3VwcG9ydC5jb3JzKXt2YXIgcjtyZXR1cm57c2VuZDpmdW5jdGlvbihpLG8pe3ZhciBhLHMsbD1uLnhocigpO2lmKG4udXNlcm5hbWU/bC5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jLG4udXNlcm5hbWUsbi5wYXNzd29yZCk6bC5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jKSxuLnhockZpZWxkcylmb3IocyBpbiBuLnhockZpZWxkcylsW3NdPW4ueGhyRmllbGRzW3NdO24ubWltZVR5cGUmJmwub3ZlcnJpZGVNaW1lVHlwZSYmbC5vdmVycmlkZU1pbWVUeXBlKG4ubWltZVR5cGUpLG4uY3Jvc3NEb21haW58fGlbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGlbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKHMgaW4gaSlsLnNldFJlcXVlc3RIZWFkZXIocyxpW3NdKX1jYXRjaCh1KXt9bC5zZW5kKG4uaGFzQ29udGVudCYmbi5kYXRhfHxudWxsKSxyPWZ1bmN0aW9uKGUsaSl7dmFyIHMsdSxjLHA7dHJ5e2lmKHImJihpfHw0PT09bC5yZWFkeVN0YXRlKSlpZihyPXQsYSYmKGwub25yZWFkeXN0YXRlY2hhbmdlPXgubm9vcCwkbiYmZGVsZXRlIFBuW2FdKSxpKTQhPT1sLnJlYWR5U3RhdGUmJmwuYWJvcnQoKTtlbHNle3A9e30scz1sLnN0YXR1cyx1PWwuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksInN0cmluZyI9PXR5cGVvZiBsLnJlc3BvbnNlVGV4dCYmKHAudGV4dD1sLnJlc3BvbnNlVGV4dCk7dHJ5e2M9bC5zdGF0dXNUZXh0fWNhdGNoKGYpe2M9IiJ9c3x8IW4uaXNMb2NhbHx8bi5jcm9zc0RvbWFpbj8xMjIzPT09cyYmKHM9MjA0KTpzPXAudGV4dD8yMDA6NDA0fX1jYXRjaChkKXtpfHxvKC0xLGQpfXAmJm8ocyxjLHAsdSl9LG4uYXN5bmM/ND09PWwucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KHIpOihhPSsrV24sJG4mJihQbnx8KFBuPXt9LHgoZSkudW5sb2FkKCRuKSksUG5bYV09ciksbC5vbnJlYWR5c3RhdGVjaGFuZ2U9cik6cigpfSxhYm9ydDpmdW5jdGlvbigpe3ImJnIodCwhMCl9fX19KTt2YXIgWG4sVW4sVm49L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFluPVJlZ0V4cCgiXig/OihbKy1dKT18KSgiK3crIikoW2EteiVdKikkIiwiaSIpLEpuPS9xdWV1ZUhvb2tzJC8sR249W25yXSxRbj17IioiOltmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4oZSx0KSxyPW4uY3VyKCksaT1Zbi5leGVjKHQpLG89aSYmaVszXXx8KHguY3NzTnVtYmVyW2VdPyIiOiJweCIpLGE9KHguY3NzTnVtYmVyW2VdfHwicHgiIT09byYmK3IpJiZZbi5leGVjKHguY3NzKG4uZWxlbSxlKSkscz0xLGw9MjA7aWYoYSYmYVszXSE9PW8pe289b3x8YVszXSxpPWl8fFtdLGE9K3J8fDE7ZG8gcz1zfHwiLjUiLGEvPXMseC5zdHlsZShuLmVsZW0sZSxhK28pO3doaWxlKHMhPT0ocz1uLmN1cigpL3IpJiYxIT09cyYmLS1sKX1yZXR1cm4gaSYmKGE9bi5zdGFydD0rYXx8K3J8fDAsbi51bml0PW8sbi5lbmQ9aVsxXT9hKyhpWzFdKzEpKmlbMl06K2lbMl0pLG59XX07ZnVuY3Rpb24gS24oKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe1huPXR9KSxYbj14Lm5vdygpfWZ1bmN0aW9uIFpuKGUsdCxuKXt2YXIgcixpPShRblt0XXx8W10pLmNvbmNhdChRblsiKiJdKSxvPTAsYT1pLmxlbmd0aDtmb3IoO2E+bztvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGVyKGUsdCxuKXt2YXIgcixpLG89MCxhPUduLmxlbmd0aCxzPXguRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgbC5lbGVtfSksbD1mdW5jdGlvbigpe2lmKGkpcmV0dXJuITE7dmFyIHQ9WG58fEtuKCksbj1NYXRoLm1heCgwLHUuc3RhcnRUaW1lK3UuZHVyYXRpb24tdCkscj1uL3UuZHVyYXRpb258fDAsbz0xLXIsYT0wLGw9dS50d2VlbnMubGVuZ3RoO2Zvcig7bD5hO2ErKyl1LnR3ZWVuc1thXS5ydW4obyk7cmV0dXJuIHMubm90aWZ5V2l0aChlLFt1LG8sbl0pLDE+byYmbD9uOihzLnJlc29sdmVXaXRoKGUsW3VdKSwhMSl9LHU9cy5wcm9taXNlKHtlbGVtOmUscHJvcHM6eC5leHRlbmQoe30sdCksb3B0czp4LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fX0sbiksb3JpZ2luYWxQcm9wZXJ0aWVzOnQsb3JpZ2luYWxPcHRpb25zOm4sc3RhcnRUaW1lOlhufHxLbigpLGR1cmF0aW9uOm4uZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKHQsbil7dmFyIHI9eC5Ud2VlbihlLHUub3B0cyx0LG4sdS5vcHRzLnNwZWNpYWxFYXNpbmdbdF18fHUub3B0cy5lYXNpbmcpO3JldHVybiB1LnR3ZWVucy5wdXNoKHIpLHJ9LHN0b3A6ZnVuY3Rpb24odCl7dmFyIG49MCxyPXQ/dS50d2VlbnMubGVuZ3RoOjA7aWYoaSlyZXR1cm4gdGhpcztmb3IoaT0hMDtyPm47bisrKXUudHdlZW5zW25dLnJ1bigxKTtyZXR1cm4gdD9zLnJlc29sdmVXaXRoKGUsW3UsdF0pOnMucmVqZWN0V2l0aChlLFt1LHRdKSx0aGlzfX0pLGM9dS5wcm9wcztmb3IodHIoYyx1Lm9wdHMuc3BlY2lhbEVhc2luZyk7YT5vO28rKylpZihyPUduW29dLmNhbGwodSxlLGMsdS5vcHRzKSlyZXR1cm4gcjtyZXR1cm4geC5tYXAoYyxabix1KSx4LmlzRnVuY3Rpb24odS5vcHRzLnN0YXJ0KSYmdS5vcHRzLnN0YXJ0LmNhbGwoZSx1KSx4LmZ4LnRpbWVyKHguZXh0ZW5kKGwse2VsZW06ZSxhbmltOnUscXVldWU6dS5vcHRzLnF1ZXVlfSkpLHUucHJvZ3Jlc3ModS5vcHRzLnByb2dyZXNzKS5kb25lKHUub3B0cy5kb25lLHUub3B0cy5jb21wbGV0ZSkuZmFpbCh1Lm9wdHMuZmFpbCkuYWx3YXlzKHUub3B0cy5hbHdheXMpfWZ1bmN0aW9uIHRyKGUsdCl7dmFyIG4scixpLG8sYTtmb3IobiBpbiBlKWlmKHI9eC5jYW1lbENhc2UobiksaT10W3JdLG89ZVtuXSx4LmlzQXJyYXkobykmJihpPW9bMV0sbz1lW25dPW9bMF0pLG4hPT1yJiYoZVtyXT1vLGRlbGV0ZSBlW25dKSxhPXguY3NzSG9va3Nbcl0sYSYmImV4cGFuZCJpbiBhKXtvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdO2ZvcihuIGluIG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSl9ZWxzZSB0W3JdPWl9eC5BbmltYXRpb249eC5leHRlbmQoZXIse3R3ZWVuZXI6ZnVuY3Rpb24oZSx0KXt4LmlzRnVuY3Rpb24oZSk/KHQ9ZSxlPVsiKiJdKTplPWUuc3BsaXQoIiAiKTt2YXIgbixyPTAsaT1lLmxlbmd0aDtmb3IoO2k+cjtyKyspbj1lW3JdLFFuW25dPVFuW25dfHxbXSxRbltuXS51bnNoaWZ0KHQpfSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P0duLnVuc2hpZnQoZSk6R24ucHVzaChlKX19KTtmdW5jdGlvbiBucihlLHQsbil7dmFyIHIsaSxvLGEscyxsLHU9dGhpcyxjPXt9LHA9ZS5zdHlsZSxmPWUubm9kZVR5cGUmJm5uKGUpLGQ9eC5fZGF0YShlLCJmeHNob3ciKTtuLnF1ZXVlfHwocz14Ll9xdWV1ZUhvb2tzKGUsImZ4IiksbnVsbD09cy51bnF1ZXVlZCYmKHMudW5xdWV1ZWQ9MCxsPXMuZW1wdHkuZmlyZSxzLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtzLnVucXVldWVkfHxsKCl9KSxzLnVucXVldWVkKyssdS5hbHdheXMoZnVuY3Rpb24oKXt1LmFsd2F5cyhmdW5jdGlvbigpe3MudW5xdWV1ZWQtLSx4LnF1ZXVlKGUsImZ4IikubGVuZ3RofHxzLmVtcHR5LmZpcmUoKX0pfSkpLDE9PT1lLm5vZGVUeXBlJiYoImhlaWdodCJpbiB0fHwid2lkdGgiaW4gdCkmJihuLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSwiaW5saW5lIj09PXguY3NzKGUsImRpc3BsYXkiKSYmIm5vbmUiPT09eC5jc3MoZSwiZmxvYXQiKSYmKHguc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0JiYiaW5saW5lIiE9PWxuKGUubm9kZU5hbWUpP3Auem9vbT0xOnAuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihwLm92ZXJmbG93PSJoaWRkZW4iLHguc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzfHx1LmFsd2F5cyhmdW5jdGlvbigpe3Aub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxwLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLHAub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSk7Zm9yKHIgaW4gdClpZihpPXRbcl0sVm4uZXhlYyhpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShmPyJoaWRlIjoic2hvdyIpKWNvbnRpbnVlO2Nbcl09ZCYmZFtyXXx8eC5zdHlsZShlLHIpfWlmKCF4LmlzRW1wdHlPYmplY3QoYykpe2Q/ImhpZGRlbiJpbiBkJiYoZj1kLmhpZGRlbik6ZD14Ll9kYXRhKGUsImZ4c2hvdyIse30pLG8mJihkLmhpZGRlbj0hZiksZj94KGUpLnNob3coKTp1LmRvbmUoZnVuY3Rpb24oKXt4KGUpLmhpZGUoKX0pLHUuZG9uZShmdW5jdGlvbigpe3ZhciB0O3guX3JlbW92ZURhdGEoZSwiZnhzaG93Iik7Zm9yKHQgaW4gYyl4LnN0eWxlKGUsdCxjW3RdKX0pO2ZvcihyIGluIGMpYT1abihmP2Rbcl06MCxyLHUpLHIgaW4gZHx8KGRbcl09YS5zdGFydCxmJiYoYS5lbmQ9YS5zdGFydCxhLnN0YXJ0PSJ3aWR0aCI9PT1yfHwiaGVpZ2h0Ij09PXI/MTowKSl9fWZ1bmN0aW9uIHJyKGUsdCxuLHIsaSl7cmV0dXJuIG5ldyByci5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXguVHdlZW49cnIscnIucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjpycixpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHwic3dpbmciLHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoeC5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPXJyLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpyci5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1yci5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9dD10aGlzLm9wdGlvbnMuZHVyYXRpb24/eC5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpyci5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxyci5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9cnIucHJvdG90eXBlLHJyLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbnVsbD09ZS5lbGVtW2UucHJvcF18fGUuZWxlbS5zdHlsZSYmbnVsbCE9ZS5lbGVtLnN0eWxlW2UucHJvcF0/KHQ9eC5jc3MoZS5lbGVtLGUucHJvcCwiIiksdCYmImF1dG8iIT09dD90OjApOmUuZWxlbVtlLnByb3BdfSxzZXQ6ZnVuY3Rpb24oZSl7eC5meC5zdGVwW2UucHJvcF0/eC5meC5zdGVwW2UucHJvcF0oZSk6ZS5lbGVtLnN0eWxlJiYobnVsbCE9ZS5lbGVtLnN0eWxlW3guY3NzUHJvcHNbZS5wcm9wXV18fHguY3NzSG9va3NbZS5wcm9wXSk/eC5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCk6ZS5lbGVtW2UucHJvcF09ZS5ub3d9fX0scnIucHJvcEhvb2tzLnNjcm9sbFRvcD1yci5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSx4LmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUsdCl7dmFyIG49eC5mblt0XTt4LmZuW3RdPWZ1bmN0aW9uKGUscixpKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoaXIodCwhMCksZSxyLGkpfX0pLHguZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKG5uKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT14LmlzRW1wdHlPYmplY3QoZSksbz14LnNwZWVkKHQsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIHQ9ZXIodGhpcyx4LmV4dGVuZCh7fSxlKSxvKTsoaXx8eC5fZGF0YSh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fG8ucXVldWU9PT0hMT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KHIpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihyPW4sbj1lLGU9dCksbiYmZSE9PSExJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PSEwLG49bnVsbCE9ZSYmZSsicXVldWVIb29rcyIsbz14LnRpbWVycyxhPXguX2RhdGEodGhpcyk7aWYobilhW25dJiZhW25dLnN0b3AmJmkoYVtuXSk7ZWxzZSBmb3IobiBpbiBhKWFbbl0mJmFbbl0uc3RvcCYmSm4udGVzdChuKSYmaShhW25dKTtmb3Iobj1vLmxlbmd0aDtuLS07KW9bbl0uZWxlbSE9PXRoaXN8fG51bGwhPWUmJm9bbl0ucXVldWUhPT1lfHwob1tuXS5hbmltLnN0b3AociksdD0hMSxvLnNwbGljZShuLDEpKTsodHx8IXIpJiZ4LmRlcXVldWUodGhpcyxlKX0pfSxmaW5pc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT0hMSYmKGU9ZXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbj14Ll9kYXRhKHRoaXMpLHI9bltlKyJxdWV1ZSJdLGk9bltlKyJxdWV1ZUhvb2tzIl0sbz14LnRpbWVycyxhPXI/ci5sZW5ndGg6MDtmb3Iobi5maW5pc2g9ITAseC5xdWV1ZSh0aGlzLGUsW10pLGkmJmkuc3RvcCYmaS5zdG9wLmNhbGwodGhpcywhMCksdD1vLmxlbmd0aDt0LS07KW9bdF0uZWxlbT09PXRoaXMmJm9bdF0ucXVldWU9PT1lJiYob1t0XS5hbmltLnN0b3AoITApLG8uc3BsaWNlKHQsMSkpO2Zvcih0PTA7YT50O3QrKylyW3RdJiZyW3RdLmZpbmlzaCYmclt0XS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgbi5maW5pc2h9KX19KTtmdW5jdGlvbiBpcihlLHQpe3ZhciBuLHI9e2hlaWdodDplfSxpPTA7Zm9yKHQ9dD8xOjA7ND5pO2krPTItdCluPVp0W2ldLHJbIm1hcmdpbiIrbl09clsicGFkZGluZyIrbl09ZTtyZXR1cm4gdCYmKHIub3BhY2l0eT1yLndpZHRoPWUpLHJ9eC5lYWNoKHtzbGlkZURvd246aXIoInNob3ciKSxzbGlkZVVwOmlyKCJoaWRlIiksc2xpZGVUb2dnbGU6aXIoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oZSx0KXt4LmZuW2VdPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdGhpcy5hbmltYXRlKHQsZSxuLHIpfX0pLHguc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJiJvYmplY3QiPT10eXBlb2YgZT94LmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fHguaXNGdW5jdGlvbihlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYheC5pc0Z1bmN0aW9uKHQpJiZ0fTtyZXR1cm4gci5kdXJhdGlvbj14LmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2Ygci5kdXJhdGlvbj9yLmR1cmF0aW9uOnIuZHVyYXRpb24gaW4geC5meC5zcGVlZHM/eC5meC5zcGVlZHNbci5kdXJhdGlvbl06eC5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PXIucXVldWV8fHIucXVldWU9PT0hMCkmJihyLnF1ZXVlPSJmeCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe3guaXNGdW5jdGlvbihyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmeC5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LHguZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn19LHgudGltZXJzPVtdLHguZng9cnIucHJvdG90eXBlLmluaXQseC5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsbj14LnRpbWVycyxyPTA7Zm9yKFhuPXgubm93KCk7bi5sZW5ndGg+cjtyKyspZT1uW3JdLGUoKXx8bltyXSE9PWV8fG4uc3BsaWNlKHItLSwxKTtuLmxlbmd0aHx8eC5meC5zdG9wKCksWG49dH0seC5meC50aW1lcj1mdW5jdGlvbihlKXtlKCkmJngudGltZXJzLnB1c2goZSkmJnguZnguc3RhcnQoKX0seC5meC5pbnRlcnZhbD0xMyx4LmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7VW58fChVbj1zZXRJbnRlcnZhbCh4LmZ4LnRpY2sseC5meC5pbnRlcnZhbCkpfSx4LmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKFVuKSxVbj1udWxsfSx4LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx4LmZ4LnN0ZXA9e30seC5leHByJiZ4LmV4cHIuZmlsdGVycyYmKHguZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGUpe3JldHVybiB4LmdyZXAoeC50aW1lcnMsZnVuY3Rpb24odCl7cmV0dXJuIGU9PT10LmVsZW19KS5sZW5ndGh9KSx4LmZuLm9mZnNldD1mdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt4Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIG4scixvPXt0b3A6MCxsZWZ0OjB9LGE9dGhpc1swXSxzPWEmJmEub3duZXJEb2N1bWVudDtpZihzKXJldHVybiBuPXMuZG9jdW1lbnRFbGVtZW50LHguY29udGFpbnMobixhKT8odHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09aSYmKG89YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkscj1vcihzKSx7dG9wOm8udG9wKyhyLnBhZ2VZT2Zmc2V0fHxuLnNjcm9sbFRvcCktKG4uY2xpZW50VG9wfHwwKSxsZWZ0Om8ubGVmdCsoci5wYWdlWE9mZnNldHx8bi5zY3JvbGxMZWZ0KS0obi5jbGllbnRMZWZ0fHwwKX0pOm99LHgub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXguY3NzKGUsInBvc2l0aW9uIik7InN0YXRpYyI9PT1yJiYoZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgaT14KGUpLG89aS5vZmZzZXQoKSxhPXguY3NzKGUsInRvcCIpLHM9eC5jc3MoZSwibGVmdCIpLGw9KCJhYnNvbHV0ZSI9PT1yfHwiZml4ZWQiPT09cikmJnguaW5BcnJheSgiYXV0byIsW2Esc10pPi0xLHU9e30sYz17fSxwLGY7bD8oYz1pLnBvc2l0aW9uKCkscD1jLnRvcCxmPWMubGVmdCk6KHA9cGFyc2VGbG9hdChhKXx8MCxmPXBhcnNlRmxvYXQocyl8fDApLHguaXNGdW5jdGlvbih0KSYmKHQ9dC5jYWxsKGUsbixvKSksbnVsbCE9dC50b3AmJih1LnRvcD10LnRvcC1vLnRvcCtwKSxudWxsIT10LmxlZnQmJih1LmxlZnQ9dC5sZWZ0LW8ubGVmdCtmKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSx1KTppLmNzcyh1KX19LHguZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbj17dG9wOjAsbGVmdDowfSxyPXRoaXNbMF07cmV0dXJuImZpeGVkIj09PXguY3NzKHIsInBvc2l0aW9uIik/dD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihlPXRoaXMub2Zmc2V0UGFyZW50KCksdD10aGlzLm9mZnNldCgpLHgubm9kZU5hbWUoZVswXSwiaHRtbCIpfHwobj1lLm9mZnNldCgpKSxuLnRvcCs9eC5jc3MoZVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxuLmxlZnQrPXguY3NzKGVbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOnQudG9wLW4udG9wLXguY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LW4ubGVmdC14LmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnR8fHM7d2hpbGUoZSYmIXgubm9kZU5hbWUoZSwiaHRtbCIpJiYic3RhdGljIj09PXguY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8c30pfX0pLHguZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihlLG4pe3ZhciByPS9ZLy50ZXN0KG4pO3guZm5bZV09ZnVuY3Rpb24oaSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSxpLG8pe3ZhciBhPW9yKGUpO3JldHVybiBvPT09dD9hP24gaW4gYT9hW25dOmEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W2ldOmVbaV06KGE/YS5zY3JvbGxUbyhyP3goYSkuc2Nyb2xsTGVmdCgpOm8scj9vOngoYSkuc2Nyb2xsVG9wKCkpOmVbaV09byx0KX0sZSxpLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSk7ZnVuY3Rpb24gb3IoZSl7cmV0dXJuIHguaXNXaW5kb3coZSk/ZTo5PT09ZS5ub2RlVHlwZT9lLmRlZmF1bHRWaWV3fHxlLnBhcmVudFdpbmRvdzohMX14LmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihlLG4pe3guZWFjaCh7cGFkZGluZzoiaW5uZXIiK2UsY29udGVudDpuLCIiOiJvdXRlciIrZX0sZnVuY3Rpb24ocixpKXt4LmZuW2ldPWZ1bmN0aW9uKGksbyl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aCYmKHJ8fCJib29sZWFuIiE9dHlwZW9mIGkpLHM9cnx8KGk9PT0hMHx8bz09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4geC5hY2Nlc3ModGhpcyxmdW5jdGlvbihuLHIsaSl7dmFyIG87cmV0dXJuIHguaXNXaW5kb3cobik/bi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrZV06OT09PW4ubm9kZVR5cGU/KG89bi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgobi5ib2R5WyJzY3JvbGwiK2VdLG9bInNjcm9sbCIrZV0sbi5ib2R5WyJvZmZzZXQiK2VdLG9bIm9mZnNldCIrZV0sb1siY2xpZW50IitlXSkpOmk9PT10P3guY3NzKG4scixzKTp4LnN0eWxlKG4scixpLHMpfSxuLGE/aTp0LGEsbnVsbCl9fSl9KSx4LmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHguZm4uYW5kU2VsZj14LmZuLmFkZEJhY2ssIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz14OihlLmpRdWVyeT1lLiQ9eCwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4geH0pKX0pKHdpbmRvdyk7CgpmdW5jdGlvbiB0X29uUmVhZHkodCl7ImxvYWRpbmciIT1kb2N1bWVudC5yZWFkeVN0YXRlP3QoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0KX1mdW5jdGlvbiB0X2FkZENsYXNzKHQsZSl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3Q/dC5jbGFzc0xpc3QuYWRkKGUpOnQuY2xhc3NOYW1lKz0odC5jbGFzc05hbWU/IiAiOiIiKStlfWZ1bmN0aW9uIHRfcmVtb3ZlQ2xhc3ModCxlKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdD90LmNsYXNzTGlzdC5yZW1vdmUoZSk6dC5jbGFzc05hbWU9dC5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKCIoXnxcXHMrKSIrZSsiKFxccyt8JCkiKSwiICIpLnJlcGxhY2UoL15ccysvLCIiKS5yZXBsYWNlKC9ccyskLywiIil9ZnVuY3Rpb24gdF9yZW1vdmVFbCh0KXt0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX1mdW5jdGlvbiB0X291dGVyV2lkdGgodCl7dmFyIGU9Z2V0Q29tcHV0ZWRTdHlsZSh0KSxuPWUud2lkdGgsbz1lLm1hcmdpbkxlZnQsaT1lLm1hcmdpblJpZ2h0O3JldHVybiJhdXRvIj09PW4mJihuPTApLCJhdXRvIj09PW8mJihvPTApLCJhdXRvIj09PWkmJihpPTApLG49cGFyc2VJbnQobikrcGFyc2VJbnQobykrcGFyc2VJbnQoaSl9dmFyIHZlcnNpb24sdmVyc2lvbjsod2luZG93LmlzU2VhcmNoQm90PSExLC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYod2luZG93LmlzU2VhcmNoQm90PSEwKSx3aW5kb3cuaXNNb2JpbGU9ITEsd2luZG93LiRpc01vYmlsZT0hMSwvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJih3aW5kb3cuaXNNb2JpbGU9ITAsd2luZG93LiRpc01vYmlsZT0hMCksd2luZG93LmlzVGFibGV0PS8oaXBhZHx0YWJsZXR8KGFuZHJvaWQoPyEuKm1vYmlsZSkpfCh3aW5kb3dzKD8hLipwaG9uZSkoLip0b3VjaCkpfGtpbmRsZXxwbGF5Ym9va3xzaWxrfChwdWZmaW4oPyEuKihJUHxBUHxXUCkpKSkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy5pc2lPUz0hMSwvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJih3aW5kb3cuaXNpT1M9ITApLHdpbmRvdy5pc2lPU0Nocm9tZT0hIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goIkNyaU9TIiksd2luZG93LmlzRmlyZWZveD0vZmlyZWZveC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LmlzT3BlcmE9ISF3aW5kb3cub3ByJiYhIXdpbmRvdy5vcHIuYWRkb25zfHwhIXdpbmRvdy5vcGVyYXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCIgT1BSLyIpPj0wLHdpbmRvdy5pc2lPU1ZlcnNpb249IiIsd2luZG93LmlzaU9TKSYmKG51bGwhPT0odmVyc2lvbj1uYXZpZ2F0b3IuYXBwVmVyc2lvbi5tYXRjaCgvT1MgKFxkKylfKFxkKylfPyhcZCspPy8pKSYmKHdpbmRvdy5pc2lPU1ZlcnNpb249W3BhcnNlSW50KHZlcnNpb25bMV0sMTApLHBhcnNlSW50KHZlcnNpb25bMl0sMTApLHBhcnNlSW50KHZlcnNpb25bM118fDAsMTApXSkpOyh3aW5kb3cuaXNTYWZhcmk9ITEsL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHdpbmRvdy5pc1NhZmFyaT0hMCksd2luZG93LmlzSUU9ISFkb2N1bWVudC5kb2N1bWVudE1vZGUsd2luZG93LmlzU2FmYXJpVmVyc2lvbj0iIix3aW5kb3cuaXNTYWZhcmkpJiYobnVsbCE9PSh2ZXJzaW9uPW5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9WZXJzaW9uXC8oXGQrKVwuKFxkKylcLj8oXGQrKT8gU2FmYXJpLykpJiYod2luZG93LmlzU2FmYXJpVmVyc2lvbj1bcGFyc2VJbnQodmVyc2lvblsxXSwxMCkscGFyc2VJbnQodmVyc2lvblsyXSwxMCkscGFyc2VJbnQodmVyc2lvblszXXx8MCwxMCldKSk7ZnVuY3Rpb24gdF90aHJvdHRsZSh0LGUsbil7dmFyIG8saTtyZXR1cm4gZXx8KGU9MjUwKSxmdW5jdGlvbigpe3ZhciByPW58fHRoaXMsYT0rbmV3IERhdGUsbD1hcmd1bWVudHM7byYmYTxvK2U/KGNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bz1hLHQuYXBwbHkocixsKX0pLGUpKToobz1hLHQuYXBwbHkocixsKSl9fWZ1bmN0aW9uIHRfb25GdW5jTG9hZCh0LGUsbil7dmFyIG89MTVlMyxpPXRfY2hlY2tJc0VkaXRNb2RlKCkscj1mdW5jdGlvbiB0KCl7cmV0dXJuIWl8fGkmJnRfY2hlY2tFZGl0b3JJc1JlYWR5KCl9LGE9ZnVuY3Rpb24gdChlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93W2VdfHwib2JqZWN0Ij09dHlwZW9mIHdpbmRvd1tlXX07aWYoYSh0KSYmcigpKWUoKTtlbHNle3ZhciBsPURhdGUubm93KCksZD1uZXcgRXJyb3IodCsiIGlzIHVuZGVmaW5lZCIpLHM9ZnVuY3Rpb24gdCgpe3Rocm93IGR9O3NldFRpbWVvdXQoKGZ1bmN0aW9uIGkoKXt2YXIgZD1EYXRlLm5vdygpO2EodCkmJnIoKT9lKCk6KCJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlJiZkLWw+byYmIWEodCkmJnMoKSxzZXRUaW1lb3V0KGksbnx8MTAwKSl9KSl9fWZ1bmN0aW9uIHRfY2hlY2tJc0VkaXRNb2RlKCl7dmFyIHQ9ITEsZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKCFlKXJldHVybiExO3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKTtyZXR1cm4hISh0PW4mJiJlZGl0Ij09PW4pfWZ1bmN0aW9uIHRfY2hlY2tFZGl0b3JJc1JlYWR5KCl7dmFyIHQ9ITE7aWYoIXRfY2hlY2tJc0VkaXRNb2RlKCkpcmV0dXJuITE7dmFyIGU9ZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoImRhdGEtcmVhZHktc3RhdHVzIik7cmV0dXJuISEodD1lJiYicmVhZHkiPT09ZSl9ZnVuY3Rpb24gdF9zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yX19zZXRPYmplY3QoKXt3aW5kb3cuc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcj17fTt2YXIgdD13aW5kb3cuc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcjt0LmlzSW5pdGVkPSExLHQuc2Nyb2xsQmFyV2lkdGg9TWF0aC5hYnMod2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSx0LmRlbGF5PTAsdC5jYW5jZWxUaW1lb3V0PW51bGw7dmFyIGU9WyJ0NDUwIiwidDI4Ml9fY29udGFpbmVyIiwidDI4Ml9fY29udGFpbmVyX19iZ19vcGVuZWQiLCJ0MjgyX19tZW51X19jb250YWluZXIiLCJ0ODMwbSIsInQ4MzBfX3BhbmVsIiwidDQ1MW0iLCJ0MjA0X19tZW51IiwidG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciJdLG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiKiIpO249QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsb3Nlc3QoIi50MTA5MyIpJiYhZS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoZSl9KSl9KSksdC5maXhlZEVsZW1lbnRzPVtdLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24oZSl7aWYoIWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0OTc1Iikpe3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLG89bi5nZXRQcm9wZXJ0eVZhbHVlKCJwb3NpdGlvbiIpLGk9bi5nZXRQcm9wZXJ0eVZhbHVlKCJ3aWR0aCIpLHI9bi5nZXRQcm9wZXJ0eVZhbHVlKCJoZWlnaHQiKSxhPSIxMDAlIj09PWl8fGk9PT13aW5kb3cuaW5uZXJXaWR0aCsicHgifHxpPT09d2luZG93LmlubmVyV2lkdGgtdC5zY3JvbGxCYXJXaWR0aCsicHgifHwiMTAwdnciPT09aSxsPSIxMDAlIj09PXJ8fHI9PT13aW5kb3cuaW5uZXJIZWlnaHQrInB4Inx8cj09PXdpbmRvdy5pbm5lckhlaWdodC10LnNjcm9sbEJhcldpZHRoKyJweCJ8fCJhdXRvIj09PXJ8fCIxMDB2aCI9PT1yOygiZml4ZWQiPT09b3x8ImFic29sdXRlIj09PW8mJmEmJiFsKSYmdC5maXhlZEVsZW1lbnRzLnB1c2goe2VsOmUsY29tcHV0ZWRTdHlsZTpufSl9fSkpfWZ1bmN0aW9uIHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9faW5pdCgpe2lmKCF3aW5kb3cuaXNNb2JpbGUpe3dpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yfHx0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX3NldE9iamVjdCgpO3ZhciB0PXdpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yO2lmKHQuc2Nyb2xsQmFyV2lkdGg9TWF0aC5hYnMod2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSx0LmNhbmNlbFRpbWVvdXQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHQuY2FuY2VsVGltZW91dCksdC5jYW5jZWxUaW1lb3V0PW51bGwpLCF0LmlzSW5pdGVkJiZ0LnNjcm9sbEJhcldpZHRoKXt0LmlzSW5pdGVkPSEwO3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctcmlnaHQiKTtlPXBhcnNlSW50KGUucmVwbGFjZSgicHgiLCIiKSwxMCk7dmFyIG49ZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7biYmZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1wYWRkaW5nLXJpZ2h0IixuKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD10LnNjcm9sbEJhcldpZHRoK2UrInB4Iixkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodD0iMTAwdmgiLGRvY3VtZW50LmJvZHkuc3R5bGUubWluSGVpZ2h0PSIxMDB2aCIsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjt2YXIgbz1bXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQuZml4ZWRFbGVtZW50cywoZnVuY3Rpb24oZSl7dmFyIG49ZS5lbDtpZihkb2N1bWVudC5ib2R5LmNvbnRhaW5zKG4pJiYhbi5jbGFzc0xpc3QuY29udGFpbnMoInQ5NzUiKSYmIW4uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0OTc1Iikpe3ZhciBpPWUuY29tcHV0ZWRTdHlsZSxyPWkuZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKTtpZigiZml4ZWQiPT09cnx8ImFic29sdXRlIj09PXIpe3ZhciBhPWkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNpdGlvbi1kdXJhdGlvbiIpO2EuaW5kZXhPZigibXMiKSsxPyhhPXBhcnNlSW50KGEucmVwbGFjZSgibXMiLCIiKSwxMCksby5wdXNoKGEpKTphLmluZGV4T2YoInMiKSsxJiYoYT0xZTMqcGFyc2VGbG9hdChhLnJlcGxhY2UoInMiLCIiKSksby5wdXNoKGEpKTt2YXIgbD1pLmdldFByb3BlcnR5VmFsdWUoInJpZ2h0Iik7bD1wYXJzZUludChsLnJlcGxhY2UoInB4IiwiIiksMTApO3ZhciBkPWkuZ2V0UHJvcGVydHlWYWx1ZSgid2lkdGgiKSxzPWkuZ2V0UHJvcGVydHlWYWx1ZSgiaGVpZ2h0IiksYz1uLnN0eWxlLnJpZ2h0O2MmJm4uc2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcmlnaHQiLGMpO3ZhciB1PW4uc3R5bGUud2lkdGg7dSYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC13aWR0aCIsdSk7dmFyIG09IjEwMCUiPT09ZHx8ZD09PXdpbmRvdy5pbm5lcldpZHRoKyJweCJ8fGQ9PT13aW5kb3cuaW5uZXJXaWR0aC10LnNjcm9sbEJhcldpZHRoKyJweCJ8fCIxMDB2dyI9PT1kLHA9IjEwMCUiPT09c3x8cz09PXdpbmRvdy5pbm5lckhlaWdodCsicHgifHxzPT09d2luZG93LmlubmVySGVpZ2h0LXQuc2Nyb2xsQmFyV2lkdGgrInB4Inx8ImF1dG8iPT09c3x8IjEwMHZoIj09PXM7IWwmJjAhPT1sfHwiYXV0byI9PT1uLnN0eWxlLnJpZ2h0fHwiYWJzb2x1dGUiPT09cnx8bT9tJiYhcCYmKG4uc3R5bGUud2lkdGg9ImNhbGMoMTAwdncgLSAiK3Quc2Nyb2xsQmFyV2lkdGgrInB4KSIpOm4uc3R5bGUucmlnaHQ9dC5zY3JvbGxCYXJXaWR0aCtsKyJweCJ9fX0pKSxvLmxlbmd0aCYmKHQuZGVsYXk9TWF0aC5tYXguYXBwbHkobnVsbCxvKSl9fX1mdW5jdGlvbiB0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX2NhbmNlbCgpe3ZhciB0PXdpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yO3QmJnQuaXNJbml0ZWQmJih0LmlzSW5pdGVkPSExLHQuZGVsYXk9MCxkb2N1bWVudC5ib2R5Lmhhc0F0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXBhZGRpbmctcmlnaHQiKT8oZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9ZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1wYWRkaW5nLXJpZ2h0IiksZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1wYWRkaW5nLXJpZ2h0IikpOmRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoInBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJtaW4taGVpZ2h0IiksZG9jdW1lbnQuYm9keS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgib3ZlcmZsb3ciKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQuZml4ZWRFbGVtZW50cywoZnVuY3Rpb24odCl7dmFyIGU9dC5lbCxuPWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tX19zdGlja3ktd3JhcHBlciIpfHxlLmNsYXNzTGlzdC5jb250YWlucygidG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO2UuaGFzQXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcmlnaHQiKT8oZS5zdHlsZS5yaWdodD1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXJpZ2h0IiksZS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1yaWdodCIpKTplLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJyaWdodCIpLGUuaGFzQXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtd2lkdGgiKT8oZS5zdHlsZS53aWR0aD1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXdpZHRoIiksZS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC13aWR0aCIpKTooZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgid2lkdGgiKSxuJiYoZS5zdHlsZS53aWR0aD0iaW5oZXJpdCIpKX0pKSl9ZnVuY3Rpb24gdF90cmlnZ2VyRXZlbnQodCxlKXt2YXIgbjtkb2N1bWVudC5jcmVhdGVFdmVudD8obj1kb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpKS5pbml0RXZlbnQoZSwhMCwhMSk6ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QmJigobj1kb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpKS5ldmVudFR5cGU9ZSksbi5ldmVudE5hbWU9ZSx0LmRpc3BhdGNoRXZlbnQ/dC5kaXNwYXRjaEV2ZW50KG4pOnQuZmlyZUV2ZW50P3QuZmlyZUV2ZW50KCJvbiIrbi5ldmVudFR5cGUsbik6dFtlXT90W2VdKCk6dFsib24iK2VdJiZ0WyJvbiIrZV0oKX1mdW5jdGlvbiB0X2dldFJvb3Rab25lKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlO3JldHVybiB0JiZ0LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1yb290LXpvbmUiKXx8ImNvbSJ9ZnVuY3Rpb24gdF9tb2RpZnlSb290Wm9uZSh0KXtyZXR1cm4gdCYmdC5pbmNsdWRlcygic3RhdGljLnRpbGRhY2RuLmNvbSIpP3QucmVwbGFjZSgic3RhdGljLnRpbGRhY2RuLmNvbSIsInN0YXRpYy50aWxkYWNkbi4iK3RfZ2V0Um9vdFpvbmUoKSk6dH1mdW5jdGlvbiB0X2xvYWRKc0ZpbGUodCxlLG4pe3ZvaWQgMD09PW4mJihuPTApO3ZhciBvPTMsaT0xZTMscj10X21vZGlmeVJvb3Rab25lKHQpO2lmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmNePSInK3IrJyJdJykpZSYmZSgpO2Vsc2V7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLGEuc3JjPXIsZSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXtlKCl9KSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2lmKCEobjw9Mykpe3ZhciBvPXQubWVzc2FnZXx8IjxubyBlcnJvciBtZXNzYWdlPiI7dGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gbG9hZCAiK3IrIiBzY3JpcHQ6ICIrbyx7Y2F1c2U6dH0pfXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YS5yZW1vdmUoKSx0X2xvYWRKc0ZpbGUocixlLG4rMSksY29uc29sZS53YXJuKCJSZXRyeWluZyB0byBsb2FkICIrcisiLiBSZXRyeTogIisobisxKSl9KSxuKmkpfSkpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYSl9fWZ1bmN0aW9uIHRfbG9hZENTU0ZpbGUodCxlLG4pe3ZvaWQgMD09PW4mJihuPTApO3ZhciBvPTMsaT0xZTMscj10X21vZGlmeVJvb3Rab25lKHQpO2lmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZl49IicrcisnIl0nKSllJiZlKCk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7YS5yZWw9InN0eWxlc2hlZXQiLGEudHlwZT0idGV4dC9jc3MiLGEubWVkaWE9ImFsbCIsYS5ocmVmPXIsYS5jcm9zc09yaWdpbj0iYW5vbnltb3VzIixlJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLChmdW5jdGlvbih0KXtpZighKG48PTMpKXt2YXIgbz10Lm1lc3NhZ2V8fCI8bm8gZXJyb3IgbWVzc2FnZT4iO3Rocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGxvYWQgIityKyIgc3R5bGU6ICIrbyx7Y2F1c2U6dH0pfXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YS5yZW1vdmUoKSx0X2xvYWRDU1NGaWxlKHIsZSxuKzEpLGNvbnNvbGUud2FybigiUmV0cnlpbmcgdG8gbG9hZCAiK3IrIi4gUmV0cnk6ICIrKG4rMSkpfSksbippKX0pKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGEpfX1mdW5jdGlvbiB0X3Njcm9sbFRvKHQsZSl7aWYodCl7dmFyIG49ZXx8e30sbz1uLnVzZU5hdGl2ZVNjcm9sbFRvLGk9bi5kdXJhdGlvbixyPW4uYmVoYXZpb3IsYT12b2lkIDA9PT1yPyJpbnN0YW50IjpyLGw9bi5vZmZzZXQsZD12b2lkIDA9PT1sPzA6bCxzPU1hdGgubWF4KHBhcnNlSW50KHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5zY3JvbGxZLWQsMTApLDApO298fCJpbnN0YW50Ij09PWE/d2luZG93LnNjcm9sbFRvKHtsZWZ0OjAsdG9wOnMsYmVoYXZpb3I6YX0pOnRfc21vb3RoU2Nyb2xsVG8ocyxpKX19ZnVuY3Rpb24gdF9zbW9vdGhTY3JvbGxUbyh0LGUpe3ZvaWQgMD09PWUmJihlPTUwMCk7dmFyIG49ZG9jdW1lbnQuYm9keSxvPXdpbmRvdy5zY3JvbGxZfHx3aW5kb3cucGFnZVlPZmZzZXQsaT10LW8scj1wZXJmb3JtYW5jZS5ub3coKTtmdW5jdGlvbiBhKHQpe3JldHVybiBNYXRoLnBvdyh0LDIpfWZ1bmN0aW9uIGwoKXt2YXIgZD1wZXJmb3JtYW5jZS5ub3coKSxzPU1hdGgubWluKChkLXIpL2UsMSksYz1hKHMpO3dpbmRvdy5zY3JvbGxUbygwLG8raSpjKSxzPDE/cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGwpOihuLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1zY3JvbGwiKSxuLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1zY3JvbGxhYmxlIiksd2luZG93LnNjcm9sbFRvKDAsdCkpfW4uc2V0QXR0cmlidXRlKCJkYXRhLXNjcm9sbCIsInRydWUiKSxuLnNldEF0dHJpYnV0ZSgiZGF0YS1zY3JvbGxhYmxlIiwidHJ1ZSIpLHJlcXVlc3RBbmltYXRpb25GcmFtZShsKX13aW5kb3cuYnJvd3Nlckxhbmc9KHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlKS50b1VwcGVyQ2FzZSgpLnNsaWNlKDAsMiksd2luZG93LnRpbGRhQnJvd3Nlckxhbmc9d2luZG93LmJyb3dzZXJMYW5nLHRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKHQpdmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcHJvamVjdC1sYW5nIik7ZSYmKHdpbmRvdy5icm93c2VyTGFuZz1lKX0pKSx0X29uUmVhZHkoKGZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsZT0tMSE9PXQuaW5kZXhPZigiSW5zdGFncmFtIiksbj0tMSE9PXQuaW5kZXhPZigiRkJBViIpLG89LTEhPT10LmluZGV4T2YoIllhU2VhcmNoQnJvd3NlciIpLGk9LTEhPT10LmluZGV4T2YoIlNhbXN1bmdCcm93c2VyIikscj0tMSE9PXQuaW5kZXhPZigiRHVja0R1Y2tHbyIpLGE7aWYoLTEhPT10LmluZGV4T2YoIkFuZHJvaWQiKSYmKG58fGV8fG98fGl8fHIpKXt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7bC5zdHlsZS5saW5lSGVpZ2h0PSIxMDBweCIsbC5zdHlsZS5wYWRkaW5nPSIwIixsLnN0eWxlLm1hcmdpbj0iMCIsbC5zdHlsZS5oZWlnaHQ9ImF1dG8iLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLm9wYWNpdHk9IjAuMDAxIixsLmlubmVyVGV4dD0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTt2YXIgZD0xMDAvbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7bC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpLGQ8Ljk4JiZkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPHN0eWxlPi50Mzk2IFtkYXRhLWVsZW0tdHlwZT0idGV4dCJdIC50bi1hdG9tIHt6b29tOiAnKzEwMCpkKyIlO308L3N0eWxlPiIpfXdpbmRvdy5pc2lPUyYmIXdpbmRvdy5NU1N0cmVhbSYmKGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoIi13ZWJraXQtdGV4dC1zaXplLWFkanVzdCIsIjEwMCUiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCJ0ZXh0LXNpemUtYWRqdXN0IiwiMTAwJSIpKX0pKSx0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJodG1sIiksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC10aWxkYWxhYmVsIiksbj10Lm9mZnNldEhlaWdodDtpZihkb2N1bWVudC5ib2R5JiYobj1NYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCx0Lm9mZnNldEhlaWdodCkpLChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFjb3B5Iil8fGUpJiZlLnF1ZXJ5U2VsZWN0b3JBbGwoImRpdiIpKW4rNzA+d2luZG93LmlubmVySGVpZ2h0JiZlJiZlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB2aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7IHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBwb2ludGVyLWV2ZW50czogYWxsICFpbXBvcnRhbnQ7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgbWFyZ2luOiAwICFpbXBvcnRhbnQ7IHotaW5kZXg6IDEgIWltcG9ydGFudCIpO2Vsc2V7Zm9yKHZhciBvPWRvY3VtZW50LmJvZHkuY2hpbGROb2RlcyxpPVtdLHI9MDtyPG8ubGVuZ3RoO3IrKyl7dmFyIGE9b1tyXTs4PT09YS5ub2RlVHlwZSYmaS5wdXNoKGEpfWZvcih2YXIgcj0wO3I8aS5sZW5ndGg7cisrKS0xIT09aVtyXS5ub2RlVmFsdWUuaW5kZXhPZigiJ3QgcmVtb3ZlIHRoaXMgbCIpJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJlbmQiLCc8ZGl2IGNsYXNzPSJ0LXRpbGRhbGFiZWwgdC10aWxkYWxhYmVsLWZyZWUiIHN0eWxlPSJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB2aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7IHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBwb2ludGVyLWV2ZW50czogYWxsICFpbXBvcnRhbnQ7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgbWFyZ2luOiAwICFpbXBvcnRhbnQ7IHotaW5kZXg6IDk5OTAwICFpbXBvcnRhbnQiPjxkaXYgY2xhc3M9InQtdGlsZGFsYWJlbC1mcmVlX19tYWluIj48YSBocmVmPSJodHRwczovL3RpbGRhLmNjIiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9InBhZGRpbmctYm90dG9tOjEycHg7IGRpc3BsYXk6IGJsb2NrOyI+PGltZyBzdHlsZT0id2lkdGg6NDBweDsiIHNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uJyt0X2dldFJvb3Rab25lKCkrJy9pbWcvdGlsZGFjb3B5LnBuZyI+PC9hPjxkaXYgc3R5bGU9InBhZGRpbmctYm90dG9tOiAxNXB4OyI+VGhpcyBzaXRlIHdhcyBtYWRlIG9uIDxhIGhyZWY9Imh0dHBzOi8vdGlsZGEuY2MiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjppbmhlcml0OyI+VGlsZGEg4oCUIGEgd2Vic2l0ZSBidWlsZGVyPC9hPiB0aGF0IGhlbHBzIHRvJm5ic3A7Y3JlYXRlIGEmbmJzcDt3ZWJzaXRlIHdpdGhvdXQgYW55IGNvZGU8L2Rpdj48YSBocmVmPSJodHRwczovL3RpbGRhLmNjL3JlZ2lzdHJhdGlvbi8iIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiAxMHB4IDIwcHg7IGZvbnQtc2l6ZTogMTNweDsgYm9yZGVyLXJhZGl1czogNTBweDsgYmFja2dyb3VuZC1jb2xvcjogI2ZhODY2OTsgY29sb3I6ICNmZmY7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsiPkNyZWF0ZSBhIHdlYnNpdGU8L2E+PC9kaXY+PGRpdiBjbGFzcz0idC10aWxkYWxhYmVsLWZyZWVfX2xpbmtzLXdyIj48YSBjbGFzcz0idC10aWxkYWxhYmVsLWZyZWVfX3R4dC1saW5rIiBocmVmPSJodHRwczovL2hlbHAnKygiUlUiPT09d2luZG93LmJyb3dzZXJMYW5nPyItcnUiOiIiKSsnLnRpbGRhLmNjL3doaXRlLWxhYmVsIiB0YXJnZXQ9Il9ibGFuayI+JysoIlJVIj09PXdpbmRvdy5icm93c2VyTGFuZz8i0JrQsNC6INGD0LTQsNC70LjRgtGMINGN0YLQvtGCINC70LXQudCx0LsiOiJIb3cgdG8gcmVtb3ZlIHRoaXMgYmxvY2siKSsiPzwvYT48L2Rpdj48L2Rpdj4iKX19KSw1MDApfSkpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKCF3aW5kb3cuaXNNb2JpbGUmJnQmJiJ5ZXMiIT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2tzLWFuaW1hdGlvbm9mZiIpJiYhMT09PXdpbmRvdy5pc1NlYXJjaEJvdCl7Zm9yKHZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yIiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbyxpPShvPWVbbl0pLmdldEF0dHJpYnV0ZSgic3R5bGUiKTtpJiYtMSE9PWkuaW5kZXhPZigiYmFja2dyb3VuZC1jb2xvciIpJiZvLnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRpb25hcHBlYXIiLCJvZmYiKX1mb3IodmFyIHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hdC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0aW9uYXBwZWFyIikmJiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIikmJiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4Iil9KSksbj0wO248ci5sZW5ndGg7bisrKXt2YXIgbyxhPShvPXJbbl0pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQsbD13aW5kb3cucGFnZVlPZmZzZXQrd2luZG93LmlubmVySGVpZ2h0KzMwMDt0X2FkZENsYXNzKG8sYT4xZTMmJmE+bD8icl9oaWRkZW4iOiJyX3Nob3dlZCIpLHRfYWRkQ2xhc3Mobywicl9hbmltIil9aWYoci5sZW5ndGgpe2Z1bmN0aW9uIGQoKXtmb3IodmFyIHQ9ci5sZW5ndGgtMTt0Pj0wO3QtLSl7dmFyIGU9clt0XSxuLG89MDtlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ8KG89ZS5vZmZzZXRIZWlnaHQ8PTEwMD93aW5kb3cucGFnZVlPZmZzZXQrd2luZG93LmlubmVySGVpZ2h0OndpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQtMTAwKSYmKHRfcmVtb3ZlQ2xhc3MoZSwicl9oaWRkZW4iKSx0X2FkZENsYXNzKGUsInJfc2hvd2VkIiksKHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocikpLnNwbGljZSh0LDEpKX19dmFyIHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcmVjb3JkLXR5cGU9IjQwMCJdLCBbZGF0YS1wYXJlbnR0cGxpZD0iNDAwIl0nKTtpZihzLmxlbmd0aD4wKXZhciBjPTAsdT0wLG09c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7MzAwPT09KHUrPTEpJiZjbGVhckludGVydmFsKG0pO2Zvcih2YXIgdD0wO3Q8cy5sZW5ndGg7dCsrKXt2YXIgZTsieWVzIj09PXNbdF0uZ2V0QXR0cmlidXRlKCJkYXRhLWhpZGluZy1jb21wbGV0ZWQiKSYmKGMrPTEpfWM9PT1zLmxlbmd0aCYmKGQoKSxjbGVhckludGVydmFsKG0pKX0pLDEwMCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtkKCl9KSwyMDApKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGlsZGF0YWI6Y2hhbmdlIix0X3Rocm90dGxlKChmdW5jdGlvbigpe2QoKX0pLDIwMCkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZCgpfSkpfX12YXIgcD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJodG1sIiksaD1kb2N1bWVudC5ib2R5OyJub25lIj09PXAuc3R5bGUuZGlzcGxheSYmKHAuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt2YXIgdz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC10aWxkYWxhYmVsIiksZjsoZj1oP01hdGgubWF4KGguc2Nyb2xsSGVpZ2h0LGgub2Zmc2V0SGVpZ2h0LGguY2xpZW50SGVpZ2h0LHAub2Zmc2V0SGVpZ2h0KTpwLm9mZnNldEhlaWdodCkrNzA8d2luZG93LmlubmVySGVpZ2h0P3cmJih3LnN0eWxlLmRpc3BsYXk9Im5vbmUiKTp3JiZ3LnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Iil9KSksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7d2luZG93LndpbldpZHRoPXdpbmRvdy5pbm5lcldpZHRoLHdpbmRvdy53aW5IZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0fWZ1bmN0aW9uIGUoKXt2YXIgdD13aW5kb3cuaXNNb2JpbGU/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOndpbmRvdy5pbm5lcldpZHRoLGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJbZGF0YS1zY3JlZW4tbWF4XSwgLnJbZGF0YS1zY3JlZW4tbWluXSIpLG4sbyxpOy0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJJbnN0YWdyYW0iKSYmKHQ9c2NyZWVuLndpZHRoKTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGE9ZVtyXSxsPWEuaWQucmVwbGFjZSgicmVjIiwiIik7aWYoInllcyI9PT1hLmdldEF0dHJpYnV0ZSgiZGF0YS1jb25uZWN0LXdpdGgtdGFiIil8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBvcHVwLXJlYy1pZHM9IicrbCsnIl0nKSlyZXR1cm47aT1nZXRDb21wdXRlZFN0eWxlKGEpLmRpc3BsYXksKG49YS5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1heCIpKXx8KG49MWU0KSwobz1hLmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIikpfHwobz0wKSxuPXBhcnNlSW50KG4pLChvPXBhcnNlSW50KG8pKTw9biYmKHQ8PW4mJnQ+bz8iYmxvY2siIT09aSYmKGEuc3R5bGUuZGlzcGxheT0iYmxvY2siKToibm9uZSIhPT1pJiYoYS5zdHlsZS5kaXNwbGF5PSJub25lIikpfX10X29uUmVhZHkoKGZ1bmN0aW9uKCl7dCgpLGUoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3QoKX0pLDIwMCkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7ZSgpfSksMjAwKSl9KSl9KCksZnVuY3Rpb24oKXt2YXIgdD0tMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIik7ZnVuY3Rpb24gZSgpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1jb3Zlcl9fY2FycmllciIpLGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBvLGk7aWYoKGk9KG89dFtuXSkuc3R5bGUpLmhlaWdodC5pbmRleE9mKCJ2aCIpPi0xKXtlPXBhcnNlSW50KGkuaGVpZ2h0LDEwKS8xMDA7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ci5pZD0idGVtcERpdiIsci5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwdmg7dmlzaWJpbGl0eTpoaWRkZW47Iixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHIpO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZW1wRGl2IiksbD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGEpLmhlaWdodC5yZXBsYWNlKCJweCIsIiIpKTt0X3JlbW92ZUVsKGEpO3ZhciBkPU1hdGgucm91bmQobCplKSsicHgiLHM9by5jbG9zZXN0KCIudC1jb3ZlciIpO2lmKHMpe3ZhciBjPXMucXVlcnlTZWxlY3RvcigiLnQtY292ZXJfX2ZpbHRlciIpLHU9cy5xdWVyeVNlbGVjdG9yKCIudC1jb3Zlcl9fd3JhcHBlciIpO3Muc3R5bGUuaGVpZ2h0PWQsYyYmKGMuc3R5bGUuaGVpZ2h0PWQpLHUmJih1LnN0eWxlLmhlaWdodD1kKX1pLmhlaWdodD1kfX12YXIgbT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1oZWlnaHQtY29ycmVjdC12aF0iKSxwPXdpbmRvdy5pbm5lckhlaWdodDtlPTA7Zm9yKHZhciBuPTA7bjxtLmxlbmd0aDtuKyspe3ZhciBvLGk7KGk9KG89bVtuXSkuc3R5bGUpLmhlaWdodC5pbmRleE9mKCJ2aCIpPi0xJiYoZT1wYXJzZUludChpLmhlaWdodCkvMTAwLGQ9cCooaXNOYU4oZSk/MTplKSsicHgiLGkuaGVpZ2h0PWQpfX1mdW5jdGlvbiBuKCl7dmFyIGU9dD9zY3JlZW4ud2lkdGg6d2luZG93LmlubmVyV2lkdGg7d2luZG93LmlzTW9iaWxlJiYhdCYmKGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTtmb3IodmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnI6bm90KFtkYXRhLXJlY29yZC10eXBlPSIzOTYiXSwgW2RhdGEtcmVjb3JkLXR5cGU9IjEwMDMiXSwgW2RhdGEtcGFyZW50dHBsaWQ9IjM5NiJdLCBbZGF0YS1wYXJlbnR0cGxpZD0iMTAwMyJdKScpLG89W10saT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgcj1uW2ldLGE9Z2V0Q29tcHV0ZWRTdHlsZShyKTsibm9uZSIhPT1hLmRpc3BsYXkmJiJoaWRkZW4iIT09YS52aXNpYmlsaXR5JiYiMCIhPT1hLm9wYWNpdHkmJm8ucHVzaChyKX1mb3IodmFyIGw9MDtsPG8ubGVuZ3RoO2wrKylmb3IodmFyIGQ9b1tsXSxzPWQucXVlcnlTZWxlY3RvckFsbCgnZGl2Om5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoPSJmYWxzZSJdKTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KC50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyKTpub3QoLnRuLWF0b21fX3ByeC13cmFwcGVyKTpub3QoLnRuLWF0b21fX3ZpZGVvaWZyYW1lKTpub3QoLnRuLWF0b21fX3N0aWNreS13cmFwcGVyKTpub3QoLnQtY2F0YWxvZ19fcmVsZXZhbnRzX19jb250YWluZXIpOm5vdCgudC1zbGRzX19pdGVtcy13cmFwcGVyKTpub3QoLmpzLXByb2R1Y3QtY29udHJvbHMtd3JhcHBlcik6bm90KC50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lcik6bm90KC50LXNsZHNfX2l0ZW1zLXdyYXBwZXIpOm5vdCguanMtcHJvZHVjdC1jb250cm9scy13cmFwcGVyKTpub3QoLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb24pOm5vdCgudC1wcm9kdWN0X19vcHRpb24tdmFyaWFudHMpJyksYz0wO2M8cy5sZW5ndGg7YysrKXt2YXIgdT1zW2NdO2Quc3R5bGUud29yZEJyZWFrPSIiO3ZhciBtPXRfb3V0ZXJXaWR0aCh1KTtpZihtPmUpe2lmKCJ5ZXMiPT09dS5nZXRBdHRyaWJ1dGUoIltkYXRhLWN1c3RvbXN0eWxlXSIpJiYiZmFsc2UiPT09dS5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgiW2RhdGEtYXV0by1jb3JyZWN0LW1vYmlsZS13aWR0aF0iKSlyZXR1cm47Y29uc29sZS5sb2coIkJsb2NrIG5vdCBvcHRpbWl6ZWQgZm9yIG1vYmlsZSB3aWR0aC4gQmxvY2sgd2lkdGg6IittKyIgQmxvY2sgaWQ6IitkLmdldEF0dHJpYnV0ZSgiaWQiKSksY29uc29sZS5sb2codSksZC5zdHlsZS5vdmVyZmxvdz0iYXV0byIsZC5zdHlsZS53b3JkQnJlYWs9bS0zPmU/ImJyZWFrLXdvcmQiOiIifX19ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnQtdGV4dDpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LW5hbWU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC10aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LWRlc2NyOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtaGVhZGluZzpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXRleHQtaW1wYWN0Om5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtc3VidGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC11cHRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKScpLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXSxpPW8uZ2V0QXR0cmlidXRlKCJzdHlsZSIpO2lmKGkpe3ZhciByPSJyZW0iPT09by5nZXRBdHRyaWJ1dGUoImRhdGEtYXV0by1jb3JyZWN0LWZvbnQtc2l6ZSIpLGE7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoPnQpYT0oYT1pLnJlcGxhY2UoImxpbmVoZWlnaHQiLCJsaW5lLWhlaWdodCIpKS5yZXBsYWNlKCJmb250c2l6ZSIsImZvbnQtc2l6ZSIpLG8uc2V0QXR0cmlidXRlKCJzdHlsZSIsYSk7ZWxzZXtpZigtMT09PWkuaW5kZXhPZigiZm9udC1zaXplIikpY29udGludWU7aWYocGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKTwyNiljb250aW51ZTthPWkucmVwbGFjZSgibGluZS1oZWlnaHQiLCJsaW5laGVpZ2h0IiksYT1yP2EucmVwbGFjZSgvZm9udC1zaXplLipweDsvZ2ksImZvbnQtc2l6ZTogMS42cmVtOyIpOmEucmVwbGFjZSgiZm9udC1zaXplIiwiZm9udHNpemUiKSxvLnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpfX19fSh3aW5kb3cuaXNNb2JpbGV8fHdpbmRvdy5wYXJlbnQuaXNQYWdlUHJldmlldykmJih0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dChlLDQwMCl9KSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoZSw0MDApfSkpLHdpbmRvdy5pbm5lcldpZHRoPDQ4MHx8d2luZG93LmlzTW9iaWxlJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg8NDgwfHx0JiZzY3JlZW4ud2lkdGg8NDgwPyh0X29uUmVhZHkoKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1c3RvbXN0eWxlPSJ5ZXMiXScpLGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2ZpZWxkXSBzcGFuLCBbZmllbGRdIHN0cm9uZywgW2ZpZWxkXSBlbSwgW2ZpZWxkXSBhIiksbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dO3BhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoaSkuZm9udFNpemUucmVwbGFjZSgicHgiLCIiKSk+MjYmJihpLnN0eWxlLmZvbnRTaXplPW51bGwsaS5zdHlsZS5saW5lSGVpZ2h0PW51bGwpfWZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaT1lW25dO3BhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoaSkuZm9udFNpemUucmVwbGFjZSgicHgiLCIiKSk+MjYmJihpLnN0eWxlLmZvbnRTaXplPW51bGwpfW8oNDgwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7byg0ODApfSksNTAwKX0pKX0pKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsbiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe24oKX0pLDUwMCl9KSkpOih3aW5kb3cuaW5uZXJXaWR0aDw5MDB8fHdpbmRvdy5pc01vYmlsZSYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoPDkwMHx8dCYmc2NyZWVuLndpZHRoPDkwMCkmJnRfb25SZWFkeSgoZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJyksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZmllbGRdIHNwYW4sIFtmaWVsZF0gc3Ryb25nLCBbZmllbGRdIGVtLCBbZmllbGRdIGEiKSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBvPXRbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4zMCYmKG8uc3R5bGUuZm9udFNpemU9bnVsbCxvLnN0eWxlLmxpbmVIZWlnaHQ9bnVsbCl9Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvPWVbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4zMCYmKG8uc3R5bGUuZm9udFNpemU9bnVsbCl9Zm9yKHZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LXRleHQ6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1uYW1lOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtdGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1kZXNjcjpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LWhlYWRpbmc6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC10ZXh0LWltcGFjdDpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXN1YnRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtdXB0aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSknKSxuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBvLHI9KG89aVtuXSkuZ2V0QXR0cmlidXRlKCJzdHlsZSIpO2lmKHImJnIuaW5kZXhPZigiZm9udC1zaXplIik+LTEmJnBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUobykuZm9udFNpemUucmVwbGFjZSgicHgiLCIiKSk+MzApaWYoInJlbSI9PT1vLmdldEF0dHJpYnV0ZSgiZGF0YS1hdXRvLWNvcnJlY3QtZm9udC1zaXplIikpe3ZhciBhPXIucmVwbGFjZSgvZm9udC1zaXplLipweDsvZ2ksImZvbnQtc2l6ZTogMS42cmVtOyIpLnJlcGxhY2UoImxpbmUtaGVpZ2h0IiwibGluZWhlaWdodCIpO28uc2V0QXR0cmlidXRlKCJzdHlsZSIsYSl9ZWxzZXt2YXIgYT1yLnJlcGxhY2UoImZvbnQtc2l6ZSIsImZvbnRzaXplIikucmVwbGFjZSgibGluZS1oZWlnaHQiLCJsaW5laGVpZ2h0Iik7by5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKX19fSkpKX0oKSx0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmXj0iaHR0cCJdW3RhcmdldD0iX2JsYW5rIl0nKSxlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV0sbz1uLmdldEF0dHJpYnV0ZSgicmVsIil8fCIiOyIiPT09bz9uLnNldEF0dHJpYnV0ZSgicmVsIiwibm9vcGVuZXIiKTotMT09PW8uaW5kZXhPZigibm9vcGVuZXIiKSYmbi5zZXRBdHRyaWJ1dGUoInJlbCIsbysiIG5vb3BlbmVyIil9fSksMjUwMCl9KSksZnVuY3Rpb24odCxlKXt0Lm9uZXJyb3I9ZnVuY3Rpb24oZSxuLG8saSxyKXsib2JqZWN0IiE9dHlwZW9mIHQudF9qc2Vycm9ycyYmKHQudF9qc2Vycm9ycz1bXSksdC50X2pzZXJyb3JzLnB1c2goe21lc3NhZ2U6ZSxmaWxlbmFtZTpuLGxpbmVubzpvLGNvbG5vOmksZXJyb3I6cn0pfX0od2luZG93LE1hdGgpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoInBvcHVwU2hvd2VkIix0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX2luaXQpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigicG9wdXBIaWRkZW4iLChmdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yO3QmJih0LmNhbmNlbFRpbWVvdXQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHQuY2FuY2VsVGltZW91dCksdC5jYW5jZWxUaW1lb3V0PW51bGwpLHQuY2FuY2VsVGltZW91dD13aW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmNhbmNlbFRpbWVvdXQ9bnVsbCx0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX2NhbmNlbCgpfSksTWF0aC5taW4oMzAwLHQuZGVsYXkpKSl9KSl9KSksd2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7Cgp3aW5kb3cubm9qc2NvZGU9ITAKZnVuY3Rpb24gdF9sYXp5bG9hZF91cGRhdGUoKXsidW5kZWZpbmVkIiE9dHlwZW9mIGxhenlsb2FkX2NvdmVyJiZsYXp5bG9hZF9jb3Zlci51cGRhdGUoKSwidW5kZWZpbmVkIiE9dHlwZW9mIGxhenlsb2FkX2ltZyYmbGF6eWxvYWRfaW1nLnVwZGF0ZSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfYmdpbWcmJmxhenlsb2FkX2JnaW1nLnVwZGF0ZSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfaWZyYW1lJiZsYXp5bG9hZF9pZnJhbWUudXBkYXRlKCl9ZnVuY3Rpb24gdF9sYXp5bG9hZF91cGRhdGVSZXNpemVfZWxlbShlKXtpZih3aW5kb3cualF1ZXJ5JiZlIGluc3RhbmNlb2YgalF1ZXJ5KXtpZigwPT1lLmxlbmd0aClyZXR1cm47ZT1lLmdldCgwKX1pZihudWxsIT1lKXt2YXIgdD1lLnRhZ05hbWU7aWYoIklNRyI9PXQpdmFyIG89ZS5nZXRBdHRyaWJ1dGUoInNyYyIpLG49Ii0vcmVzaXplLyI7ZWxzZSBpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdldENvbXB1dGVkU3R5bGUpe3ZhciBvPWdldENvbXB1dGVkU3R5bGUoZSlbImJhY2tncm91bmQtaW1hZ2UiXS5yZXBsYWNlKCJ1cmwoIiwiIikucmVwbGFjZSgiKSIsIiIpLnJlcGxhY2UoLyIvZ2ksIiIpLGk7aWYoImNvbnRhaW4iPT1nZXRDb21wdXRlZFN0eWxlKGUpWyJiYWNrZ3JvdW5kLXNpemUiXSl2YXIgbj0iLS9jb250YWluLyI7ZWxzZSB2YXIgbj0iLS9jb3Zlci8ifWVsc2UgdmFyIG49Ii0vY292ZXIvIjtpZighKG51bGw9PW98fC0xPT09by5pbmRleE9mKG4pfHxvLmluZGV4T2YoIi5zdmciKT4wfHxvLmluZGV4T2YoIi5naWYiKT4wfHxvLmluZGV4T2YoIi5pY28iKT4wfHwtMT09PW8uaW5kZXhPZigidGh1bWIudGlsZGFjZG4uY29tIil8fG8uaW5kZXhPZigiLS9lbXB0eS8iKT4wJiZvLmluZGV4T2YoIi0vcmVzaXplYi8iKT4wKSl7dmFyIGw9by5pbmRleE9mKG4pK24ubGVuZ3RoLGE9by5pbmRleE9mKCIvIixsKTtpZihsPjAmJmE+MCl7dmFyIHI9by5zbGljZShsLGEpLnNwbGl0KCJ4Iikscz1lLmNsaWVudFdpZHRoLGM9ZS5jbGllbnRIZWlnaHQ7aWYocz4wJiZjPjAmJihyWzBdPjB8fHJbMV0+MCkmJihyWzBdPjAmJnM+clswXXx8clsxXT4wJiZjPnJbMV0pJiYoclswXT4wJiZzLXJbMF0+MTAwfHxyWzFdPjAmJmMtclsxXT4xMDApKXt2YXIgZD1vLnNsaWNlKDAsbCkrKHJbMF0+MD9zOiIiKSsieCIrKHJbMV0+MD9jOiIiKStvLnN1YnN0cmluZyhhKTsiSU1HIj09dD9lLnNldEF0dHJpYnV0ZSgic3JjIixkKTplLnN0eWxlLmJhY2tncm91bmRJbWFnZT0idXJsKCciK2QrIicpIn19fX19IWZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sdCk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXQoKTplLkxhenlMb2FkPXQoKX0od2luZG93LChmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXttfHwoaD17ZWxlbWVudHNfc2VsZWN0b3I6ImltZyIsY29udGFpbmVyOndpbmRvdyx0aHJlc2hvbGQ6MzAwLHRocm90dGxlOjUwLGRhdGFfc3JjOiJvcmlnaW5hbCIsZGF0YV9zcmNzZXQ6Im9yaWdpbmFsLXNldCIsY2xhc3NfbG9hZGluZzoibG9hZGluZyIsY2xhc3NfbG9hZGVkOiJsb2FkZWQiLHNraXBfaW52aXNpYmxlOiEwLHNob3dfd2hpbGVfbG9hZGluZzohMCxjYWxsYmFja19sb2FkOm51bGwsY2FsbGJhY2tfZXJyb3I6bnVsbCxjYWxsYmFja19zZXQ6bnVsbCxjYWxsYmFja19wcm9jZXNzZWQ6bnVsbCxwbGFjZWhvbGRlcjoiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBQUFBQVAvLy95SDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUJSQUE3In0scD0hIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyLGY9ISF3aW5kb3cuYXR0YWNoRXZlbnQsZz0hIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LG09ITApfWZ1bmN0aW9uIHQoZSx0LG8pe3ZhciBuO3A/ZS5hZGRFdmVudExpc3RlbmVyKHQsbyk6ZiYmKGUuYXR0YWNoRXZlbnQoIm9uIit0LChuPWUsZnVuY3Rpb24oKXtvLmNhbGwobix3aW5kb3cuZXZlbnQpfSkpLGU9bnVsbCl9ZnVuY3Rpb24gbyhlLHQsbyl7cD9lLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxvKTpmJiZlLmRldGFjaEV2ZW50KCJvbiIrdCxvKX1mdW5jdGlvbiBuKGUsdCxvKXt2YXIgbixpLGw7ZnVuY3Rpb24gYSgpe3JldHVybiB3aW5kb3cuaW5uZXJXaWR0aHx8bi5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGh9ZnVuY3Rpb24gcigpe3JldHVybiB3aW5kb3cuaW5uZXJIZWlnaHR8fG4uZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AraS1uLmRvY3VtZW50RWxlbWVudC5jbGllbnRUb3B9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0K2wtbi5kb2N1bWVudEVsZW1lbnQuY2xpZW50TGVmdH1mdW5jdGlvbiBkKCl7dmFyIG47cmV0dXJuKG49dD09PXdpbmRvdz9yKCkraTpzKHQpK3Qub2Zmc2V0SGVpZ2h0KTw9cyhlKS1vfWZ1bmN0aW9uIHUoKXt2YXIgbjtyZXR1cm4obj10PT09d2luZG93P2EoKSt3aW5kb3cucGFnZVhPZmZzZXQ6Yyh0KSthKCkpPD1jKGUpLW99ZnVuY3Rpb24gXygpe3ZhciBvLG49MTIwMDtyZXR1cm4obz10PT09d2luZG93P2k6cyh0KSk+PXMoZSkrbitlLm9mZnNldEhlaWdodH1mdW5jdGlvbiBoKCl7dmFyIG47cmV0dXJuKG49dD09PXdpbmRvdz9sOmModCkpPj1jKGUpK28rZS5vZmZzZXRXaWR0aH1yZXR1cm4gbj1lLm93bmVyRG9jdW1lbnQsaT13aW5kb3cucGFnZVlPZmZzZXR8fG4uYm9keS5zY3JvbGxUb3AsbD13aW5kb3cucGFnZVhPZmZzZXR8fG4uYm9keS5zY3JvbGxMZWZ0LCJmaXhlZCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1jb250ZW50LWNvdmVyLXBhcmFsbGF4IikmJmUuY2xvc2VzdCYmZS5jbG9zZXN0KCIudC1jb3Zlcl9fY29udGFpbmVyIikmJihlPWUuY2xvc2VzdCgiLnQtY292ZXJfX2NvbnRhaW5lciIpKSwhKGQoKXx8XygpfHx1KCl8fGgoKSl9ZnVuY3Rpb24gaSgpe3ZhciBlO3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbz17fSxuO2ZvcihuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKG9bbl09ZVtuXSk7Zm9yKG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYob1tuXT10W25dKTtyZXR1cm4gb31mdW5jdGlvbiBhKGUpe3ZhciB0O3RyeXt0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpfWNhdGNoKGwpe3ZhciBvPVtdLG4saT1lLmxlbmd0aDtmb3Iobj0wO248aTtuKyspby5wdXNoKGVbbl0pO3Q9b31yZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmlzU2tpcEJ5UG9zaXRpb249bnVsbD09PWUub2Zmc2V0UGFyZW50JiYwPT09cihlLCIudDM5Nl9fY2Fycmllci13cmFwcGVyIikubGVuZ3RoJiYiZml4ZWQiIT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtY29udGVudC1jb3Zlci1wYXJhbGxheCIpLGUuaXNOb3RVbmRlclNjcmVlblJhbmdlPTA9PT1yKGUsIi50LXJlY1tkYXRhLXNjcmVlbi1tYXhdIikubGVuZ3RoJiYwPT09cihlLCIudC1yZWNbZGF0YS1zY3JlZW4tbWluXSIpLmxlbmd0aH0pKSx0fWZ1bmN0aW9uIHIoZSx0KXtmb3IodmFyIG89W107KGU9ZS5wYXJlbnROb2RlKSYmZSE9PWRvY3VtZW50Oyl0JiYhZS5tYXRjaGVzKHQpfHxvLnVuc2hpZnQoZSk7cmV0dXJuIG99ZnVuY3Rpb24gcyhlLHQpe2c/ZS5jbGFzc0xpc3QuYWRkKHQpOmUuY2xhc3NOYW1lKz0oZS5jbGFzc05hbWU/IiAiOiIiKSt0fWZ1bmN0aW9uIGMoZSx0KXtnP2UuY2xhc3NMaXN0LnJlbW92ZSh0KTplLmNsYXNzTmFtZT1lLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoIihefFxccyspIit0KyIoXFxzK3wkKSIpLCIgIikucmVwbGFjZSgvXlxzKy8sIiIpLnJlcGxhY2UoL1xzKyQvLCIiKX1mdW5jdGlvbiBkKGUsdCxvLG4pe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbiksbD10LmdldEF0dHJpYnV0ZSgiZGF0YS0iK28pLGE9ZS50YWdOYW1lO3JldHVybiJJTUciPT09YT8obCYmZS5zZXRBdHRyaWJ1dGUoInNyY3NldCIsbCksdm9pZChpJiZlLnNldEF0dHJpYnV0ZSgic3JjIixpKSkpOiJJRlJBTUUiPT09YT92b2lkKGkmJmUuc2V0QXR0cmlidXRlKCJzcmMiLGkpKTp2b2lkKGUuc3R5bGUuYmFja2dyb3VuZEltYWdlPSJ1cmwoIitpKyIpIil9ZnVuY3Rpb24gdShlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19ZnVuY3Rpb24gXyhvKXtlKCksdGhpcy5fc2V0dGluZ3M9bChoLG8pLHRoaXMuX3F1ZXJ5T3JpZ2luTm9kZT10aGlzLl9zZXR0aW5ncy5jb250YWluZXI9PT13aW5kb3c/ZG9jdW1lbnQ6dGhpcy5fc2V0dGluZ3MuY29udGFpbmVyLHRoaXMuX3ByZXZpb3VzTG9vcFRpbWU9MCx0aGlzLl9sb29wVGltZW91dD1udWxsLHRoaXMuX2hhbmRsZVNjcm9sbEZuPXUodGhpcy5oYW5kbGVTY3JvbGwsdGhpcyksdCh3aW5kb3csInJlc2l6ZSIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pLHRoaXMudXBkYXRlKCl9d2luZG93LnRfbGF6eWxvYWRfc2V0U291cmNlcz1kO3ZhciBoLHAsZixnLG09ITE7cmV0dXJuIF8ucHJvdG90eXBlLl9zaG93T25Mb2FkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXtudWxsIT09bCYmKGwuY2FsbGJhY2tfbG9hZCYmbC5jYWxsYmFja19sb2FkKGUpLGQoZSxlLGwuZGF0YV9zcmNzZXQsbC5kYXRhX3NyYyksbC5jYWxsYmFja19zZXQmJmwuY2FsbGJhY2tfc2V0KGUpLGMoZSxsLmNsYXNzX2xvYWRpbmcpLHMoZSxsLmNsYXNzX2xvYWRlZCksbyhpLCJsb2FkIixuKSl9dmFyIGksbD10aGlzLl9zZXR0aW5ncztlLmdldEF0dHJpYnV0ZSgic3JjIil8fGUuc2V0QXR0cmlidXRlKCJzcmMiLGwucGxhY2Vob2xkZXIpLHQoaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSwibG9hZCIsbiksdChpLCJlcnJvciIsKGZ1bmN0aW9uKCl7YyhlLGwuY2xhc3NfbG9hZGluZyksbC5jYWxsYmFja19lcnJvciYmbC5jYWxsYmFja19lcnJvcihlKX0pKSxzKGUsbC5jbGFzc19sb2FkaW5nKSxkKGksZSxsLmRhdGFfc3Jjc2V0LGwuZGF0YV9zcmMpfSxfLnByb3RvdHlwZS5fc2hvd09uQXBwZWFyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXtudWxsIT09aSYmKGkuY2FsbGJhY2tfbG9hZCYmaS5jYWxsYmFja19sb2FkKGUpLGMoZSxpLmNsYXNzX2xvYWRpbmcpLHMoZSxpLmNsYXNzX2xvYWRlZCksbyhlLCJsb2FkIixuKSl9dmFyIGk9dGhpcy5fc2V0dGluZ3M7KCJJTUciPT09ZS50YWdOYW1lfHwiSUZSQU1FIj09PWUudGFnTmFtZSkmJih0KGUsImxvYWQiLG4pLHQoZSwiZXJyb3IiLChmdW5jdGlvbigpe28oZSwibG9hZCIsbiksYyhlLGkuY2xhc3NfbG9hZGluZyksaS5jYWxsYmFja19lcnJvciYmaS5jYWxsYmFja19lcnJvcihlKX0pKSxzKGUsaS5jbGFzc19sb2FkaW5nKSksZChlLGUsaS5kYXRhX3NyY3NldCxpLmRhdGFfc3JjKSxpLmNhbGxiYWNrX3NldCYmaS5jYWxsYmFja19zZXQoZSl9LF8ucHJvdG90eXBlLl9sb29wVGhyb3VnaEVsZW1lbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXMuX3NldHRpbmdzLGk9dGhpcy5fZWxlbWVudHMsbD1pP2kubGVuZ3RoOjAsYT1bXTtmb3IoZT0wO2w+ZTtlKyspdD1pW2VdLG8uc2tpcF9pbnZpc2libGUmJnQuaXNTa2lwQnlQb3NpdGlvbnx8bih0LG8uY29udGFpbmVyLG8udGhyZXNob2xkKSYmKG8uc2hvd193aGlsZV9sb2FkaW5nP3RoaXMuX3Nob3dPbkFwcGVhcih0KTp0aGlzLl9zaG93T25Mb2FkKHQpLGEucHVzaChlKSx0Lndhc1Byb2Nlc3NlZD0hMCk7Zm9yKDthLmxlbmd0aD4wOylpLnNwbGljZShhLnBvcCgpLDEpLG8uY2FsbGJhY2tfcHJvY2Vzc2VkJiZvLmNhbGxiYWNrX3Byb2Nlc3NlZChpLmxlbmd0aCk7MD09PWwmJnRoaXMuX3N0b3BTY3JvbGxIYW5kbGVyKCl9LF8ucHJvdG90eXBlLl9wdXJnZUVsZW1lbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXMuX2VsZW1lbnRzLG49by5sZW5ndGgsaT1bXTtmb3IoZT0wO24+ZTtlKyspKHQ9b1tlXSkud2FzUHJvY2Vzc2VkJiZpLnB1c2goZSk7Zm9yKDtpLmxlbmd0aD4wOylvLnNwbGljZShpLnBvcCgpLDEpfSxfLnByb3RvdHlwZS5fc3RhcnRTY3JvbGxIYW5kbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNIYW5kbGluZ1Njcm9sbHx8KHRoaXMuX2lzSGFuZGxpbmdTY3JvbGw9ITAsdCh0aGlzLl9zZXR0aW5ncy5jb250YWluZXIsInNjcm9sbCIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pKX0sXy5wcm90b3R5cGUuX3N0b3BTY3JvbGxIYW5kbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNIYW5kbGluZ1Njcm9sbCYmKHRoaXMuX2lzSGFuZGxpbmdTY3JvbGw9ITEsbyh0aGlzLl9zZXR0aW5ncy5jb250YWluZXIsInNjcm9sbCIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pKX0sXy5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsPWZ1bmN0aW9uKCl7dmFyIGUsdCxvO3RoaXMuX3NldHRpbmdzJiYodD1pKCksMCE9PShvPXRoaXMuX3NldHRpbmdzLnRocm90dGxlKT8wPj0oZT1vLSh0LXRoaXMuX3ByZXZpb3VzTG9vcFRpbWUpKXx8ZT5vPyh0aGlzLl9sb29wVGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl9sb29wVGltZW91dCksdGhpcy5fbG9vcFRpbWVvdXQ9bnVsbCksdGhpcy5fcHJldmlvdXNMb29wVGltZT10LHRoaXMuX2xvb3BUaHJvdWdoRWxlbWVudHMoKSk6dGhpcy5fbG9vcFRpbWVvdXR8fCh0aGlzLl9sb29wVGltZW91dD1zZXRUaW1lb3V0KHUoKGZ1bmN0aW9uKCl7dGhpcy5fcHJldmlvdXNMb29wVGltZT1pKCksdGhpcy5fbG9vcFRpbWVvdXQ9bnVsbCx0aGlzLl9sb29wVGhyb3VnaEVsZW1lbnRzKCl9KSx0aGlzKSxlKSk6dGhpcy5fbG9vcFRocm91Z2hFbGVtZW50cygpKX0sXy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudHM9YSh0aGlzLl9xdWVyeU9yaWdpbk5vZGUucXVlcnlTZWxlY3RvckFsbCh0aGlzLl9zZXR0aW5ncy5lbGVtZW50c19zZWxlY3RvcikpLHRoaXMuX3B1cmdlRWxlbWVudHMoKSx0aGlzLl9sb29wVGhyb3VnaEVsZW1lbnRzKCksdGhpcy5fc3RhcnRTY3JvbGxIYW5kbGVyKCl9LF8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtvKHdpbmRvdywicmVzaXplIix0aGlzLl9oYW5kbGVTY3JvbGxGbiksdGhpcy5fbG9vcFRpbWVvdXQmJihjbGVhclRpbWVvdXQodGhpcy5fbG9vcFRpbWVvdXQpLHRoaXMuX2xvb3BUaW1lb3V0PW51bGwpLHRoaXMuX3N0b3BTY3JvbGxIYW5kbGVyKCksdGhpcy5fZWxlbWVudHM9bnVsbCx0aGlzLl9xdWVyeU9yaWdpbk5vZGU9bnVsbCx0aGlzLl9zZXR0aW5ncz1udWxsfSxffSkpLHdpbmRvdy5sYXp5PSJ5Iix0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtsYXp5bG9hZF9jb3Zlcj1uZXcgTGF6eUxvYWQoe2VsZW1lbnRzX3NlbGVjdG9yOiIudC1jb3Zlcl9fY2FycmllciIsc2hvd193aGlsZV9sb2FkaW5nOiExLGRhdGFfc3JjOiJjb250ZW50LWNvdmVyLWJnIixwbGFjZWhvbGRlcjoiIix0aHJlc2hvbGQ6NzAwfSl9KSwxMDApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYobGF6eWxvYWRfaW1nPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWltZyIsdGhyZXNob2xkOjgwMH0pLGxhenlsb2FkX2JnaW1nPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWJnaW1nIixzaG93X3doaWxlX2xvYWRpbmc6ITEscGxhY2Vob2xkZXI6IiIsdGhyZXNob2xkOjgwMH0pLGxhenlsb2FkX2lmcmFtZT1uZXcgTGF6eUxvYWQoe2VsZW1lbnRzX3NlbGVjdG9yOiIudC1pZnJhbWUifSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2xpZGUuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2xhenlsb2FkX2NvdmVyLnVwZGF0ZSgpLGxhenlsb2FkX2ltZy51cGRhdGUoKSxsYXp5bG9hZF9iZ2ltZy51cGRhdGUoKX0pLDUwMCl9KSksL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3Qpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NMaXN0LmFkZCgidC1tYmZpeCIpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtbWJmaXgiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2xhc3NMaXN0LmFkZCgidC1tYmZpeF9oaWRlIil9KSw1MCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtudWxsIT09dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9KSwxZTMpfX0pLDUwMCl9KSk7CgpmdW5jdGlvbiB0X2FuaW1hdGVfX2luaXQoKXt0X2FuaW1hdGVfX2NoZWNrQW5pbWF0aW9uQXZhaWxhYmlsaXR5KCkmJih0X2FuaW1hdGVfX2dlbmVyYXRlU3R5bGVzKCksdF9hbmltYXRlX193cmFwVGV4dFdpdGhPcGFjaXR5KCksdF9hbmltYXRlX19hZGROb0hvdmVyQ2xhc3NUb0J0bnMoKSx0X2FuaW1hdGVfX3ByZXZlbnRIb3Jpem9udGFsU2Nyb2xsKCksZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoPj0xMjAwJiZ0X2FuaW1hdGVfX3BhcnNlTnVtYmVyVGV4dCgpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19zdGFydEFuaW1hdGlvbigpfSksMTUwMCkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tNb2JpbGUodCl7cmV0dXJuIHQuZmlsdGVyKChmdW5jdGlvbih0KXt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19lbGVtLCAudDM5Nl9fZ3JvdXAiKSxhLG47cmV0dXJuISghZXx8InkiIT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1tb2JpbGUiKSl8fCh0LmNsYXNzTGlzdC5jb250YWlucygiciIpP0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIiksKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwiIil9KSk6dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCIiKSwhMSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LGUpe2lmKHQpe3ZhciBhPSJ0LWFuaW1hdGUiO3QuY2xhc3NMaXN0LnJlbW92ZShhKSxlJiYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49YSsiXyIrZTt0LmNsYXNzTGlzdC5yZW1vdmUobil9KSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3ByZXZlbnRIb3Jpem9udGFsU2Nyb2xsKCl7dmFyIHQsZT1BcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXScpKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCwgLnQtY292ZXIiKSYmdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodD53aW5kb3cuaW5uZXJXaWR0aH0pKTshZS5sZW5ndGh8fHdpbmRvdy5pbm5lcldpZHRoPDk4MHx8ZS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTt0LmNsb3Nlc3QoIi5yIikuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19vdmVyZmxvdy14LWhpZGRlbiIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tBbmltYXRpb25BdmFpbGFiaWxpdHkoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1yZWNvcmRzIiksZT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2Nrcy1hbmltYXRpb25vZmYiKTpudWxsLGE9dD90LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik6bnVsbDtpZigvQm90L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8InllcyI9PT1lfHx0X2FuaW1hdGVfX2NoZWNrSUUoKXx8ImVkaXQiPT09YSl7dmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO3JldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwiIil9KSksITF9cmV0dXJuITB9ZnVuY3Rpb24gdF9hbmltYXRlX19nZW5lcmF0ZVN0eWxlcygpe3ZhciB0O2lmKCEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQzOTYiKSl7Zm9yKHZhciBlPXRfYW5pbWF0ZV9fZ2V0QnJlYWtwb2ludHNBcnIoKSxhPScudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWluIl0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnVwIl0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmRvd24iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5yaWdodCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29taW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iem9vbW91dCJdIHtvcGFjaXR5OiAwOy13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtO3RyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHksIHRyYW5zZm9ybTstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDFzO3RyYW5zaXRpb24tZHVyYXRpb246IDFzOy13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE5LCAxLCAwLjIyLCAxKTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpOy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjt9JyxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJmYWRlaW51cCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9ImZhZGVpbmRvd24iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJmYWRlaW5sZWZ0Il0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLScraS5taW5SZXMrJz0iZmFkZWlucmlnaHQiXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJ6b29taW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJ6b29tb3V0Il0ge29wYWNpdHk6IDA7LXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07dHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtOy13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xOSwgMSwgMC4yMiwgMSk7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO319Jyl9YSs9Jy50Mzk2IC50LXRpdGxlLnQtYW5pbWF0ZSB7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAxLjJzO3RyYW5zaXRpb24tZHVyYXRpb246IDEuMnM7fS50Mzk2IC50LWRlc2NyLnQtYW5pbWF0ZSwudDM5NiAudC11cHRpdGxlLnQtYW5pbWF0ZSwudDM5NiAudC1zdWJ0aXRsZS50LWFuaW1hdGUsLnQzOTYgLnQtdGV4dC50LWFuaW1hdGUgey13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC43czt0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjdzO30udDM5NiAudC1pdGVtLnQtYW5pbWF0ZSB7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjVzO3RyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7fS50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW4iXSB7b3BhY2l0eTogMDt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW4iXSB7b3BhY2l0eTogMDt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWluIl0ge29wYWNpdHk6IDE7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbiJdIHtvcGFjaXR5OiAxO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW51cCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAxMDBweCk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW51cCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAxMDBweCk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWludXAiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbnVwIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5kb3duIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMTAwcHgpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWluZG93biJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC0xMDBweCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTEwMHB4KTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5kb3duIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW5kb3duIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5sZWZ0Il0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTAwcHgsIDApO3RyYW5zZm9ybTogdHJhbnNsYXRlKDEwMHB4LCAwKTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbmxlZnQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDBweCwgMCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoMTAwcHgsIDApO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbmxlZnQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnJpZ2h0Il0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwMHB4LCAwKTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIDApO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlucmlnaHQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIDApO3RyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDBweCwgMCk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlucmlnaHQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbnJpZ2h0Il0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29taW4iXSB7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuOSk7dHJhbnNmb3JtOiBzY2FsZSgwLjkpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iem9vbWluIl0gey13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjkpO3RyYW5zZm9ybTogc2NhbGUoMC45KTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29taW4iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7dHJhbnNmb3JtOiBzY2FsZSgxKTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iem9vbWluIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO3RyYW5zZm9ybTogc2NhbGUoMSk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21vdXQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMik7dHJhbnNmb3JtOiBzY2FsZSgxLjIpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iem9vbW91dCJdIHstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4yKTt0cmFuc2Zvcm06IHNjYWxlKDEuMik7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iem9vbW91dCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTt0cmFuc2Zvcm06IHNjYWxlKDEpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29tb3V0Il0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO3RyYW5zZm9ybTogc2NhbGUoMSk7fX0nKX1hKz0iLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1kaXN0YW5jZV0sLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zY2FsZV17LXdlYmtpdC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt9Ijtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtZGlzdGFuY2UtcmVzLSIraS5taW5SZXMrIl0sI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29tb3V0Il0gey13ZWJraXQtdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7dHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7fX0nKX12YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLG89ZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO3IudGV4dENvbnRlbnQ9YSxvLmFwcGVuZENoaWxkKHIpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEJyZWFrcG9pbnRzQXJyKCl7dmFyIHQ9W10sZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucltkYXRhLXJlY29yZC10eXBlPSIzOTYiXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucltkYXRhLXBhcmVudHRwbGlkPSIzOTYiXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJykpO3JldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUpe2lmKGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZCIpKXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1zY3JlZW5zIiksbj0oYT0oYT1hP2Euc3BsaXQoIiwiKTpbMTIwMCw5NjAsNjQwLDQ4MCwzMjBdKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUludCh0LDEwKX0pKSkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4tMT09PXQuaW5kZXhPZihlKX0pKTt0PXQuY29uY2F0KG4pfX0pKSx0PXRfYW5pbWF0ZV9fc29ydEFycih0KX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkodCxlKXt2YXIgYT0iIixuPSExLGk9dFtlKzFdLHI9dFtlXS0xLG89ZT09PXQubGVuZ3RoLTEscz1lPT09dC5sZW5ndGgtMjtyZXR1cm4gbz9uPSEwOmErPXM/IkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICIrcisicHgpIHsiOiJAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAiK2krInB4KSBhbmQgKG1heC13aWR0aDogIityKyJweCkgeyIse3RleHQ6YSxpc0NvbnRpbnVlOm4sbWluUmVzOml9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc29ydEFycih0KXtyZXR1cm4gdC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBlLXR9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19zdGFydEFuaW1hdGlvbigpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yIiksZT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtZ3JvdXA9eWVzXSIpfSkpLGE9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHQsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3IoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLWNoYWluPSJ5ZXMiXScpfSkpLG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO2lmKG49QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiEoInllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWdyb3VwIil8fCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpfHx0LmdldEF0dHJpYnV0ZSgib2JzZXJ2ZXItcmVhZHkiKSl9KSksd2luZG93LmlubmVyV2lkdGg8MTIwMCYmKGU9dF9hbmltYXRlX19jaGVja01vYmlsZShlKSxhPXRfYW5pbWF0ZV9fY2hlY2tNb2JpbGUoYSksbj10X2FuaW1hdGVfX2NoZWNrTW9iaWxlKG4pKSxlLmxlbmd0aHx8bi5sZW5ndGh8fGEubGVuZ3RoKXt0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlKGUsYSxuKSxlPXRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbihlKSxuPXRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbihuKSxhPXRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbihhKTt2YXIgaT0idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmL14oKD8hY2hyb21lfGFuZHJvaWQpLikqKHNhZmFyaXxtb2JpbGUpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmLyhvcyB8dmVyc2lvblwvKTE1KC58XylbNC05XS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdyYmIWkpe2lmKGUubGVuZ3RoKXt2YXIgcj1bXTtlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZSIpLGEsbjtpZigiZmFkZWluZG93biI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0eWxlIikmJmUuY2xvc2VzdCgiLnQtY292ZXIiKSl7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlOm5vdCg6Zmlyc3QtY2hpbGQpIik7aSYmKGU9aSl9ci5wdXNoKGUpfSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9e3Jvb3RNYXJnaW46dC5vZmZzZXRIZWlnaHQvNSotMSsicHggMHB4In0sYTtuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKHQsZSl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmlzSW50ZXJzZWN0aW5nKXt2YXIgYT10LnRhcmdldDtlLnVub2JzZXJ2ZShhKTt2YXIgbj1hLmNsb3Nlc3QoIi5yIikucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO249QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiEodC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKXx8InllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIikpfSkpLHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KGEpLHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUoYSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSl9KSl9fSkpfSksZSkub2JzZXJ2ZSh0KX0pKX12YXIgbztpZihuLmxlbmd0aCYmbi5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT17fSxhPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJ0cmlnZ2VyLW9mZnNldCIpO2EmJihlLnJvb3RNYXJnaW49IjBweCAwcHggIistMSphLnJlcGxhY2UoInB4IiwiIikrInB4IDBweCIpO3ZhciBuPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBhPXQudGFyZ2V0O2lmKCFhLmRlbWFuZFRyYW5zZm9ybSYmYS5zdHlsZS50cmFuc2Zvcm0pYS5kZW1hbmRUcmFuc2Zvcm09YS5zdHlsZS50cmFuc2Zvcm0sYS5zdHlsZS50cmFuc2Zvcm09InVuc2V0IjtlbHNle3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnRyYW5zZm9ybTthLnN0eWxlLnRyYW5zZm9ybXx8Im5vbmUiPT09bnx8KGEuZGVtYW5kVHJhbnNmb3JtPW4sYS5zdHlsZS50cmFuc2Zvcm09InVuc2V0Iil9aWYodC5pc0ludGVyc2VjdGluZyl7YS5jbG9zZXN0KCIudDEwOTMiKXx8ZS51bm9ic2VydmUoYSk7dmFyIGk9YS5zdHlsZS50cmFuc2l0aW9uRGVsYXl8fCIwbXMiO2k9LTEhPT1pLmluZGV4T2YoIm1zIik/cGFyc2VJbnQoaSkrMjUwOjFlMypwYXJzZUZsb2F0KGkpKzI1MDt2YXIgcj1mdW5jdGlvbiB0KCl7YS5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnMoYSksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKGEsITApLCJhbmltYXRlZG51bWJlciI9PT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoYSwic3R5bGUiKSYmdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyhhKX07YS5kZW1hbmRUcmFuc2Zvcm0mJi0xIT09YS5kZW1hbmRUcmFuc2Zvcm0uaW5kZXhPZigibWF0cml4IikmJihhLnN0eWxlLnRyYW5zZm9ybT0iIiksYS5kZW1hbmRUcmFuc2Zvcm0mJiJ1bnNldCI9PT1hLnN0eWxlLnRyYW5zZm9ybSYmKGEuc3R5bGUudHJhbnNmb3JtPWEuZGVtYW5kVHJhbnNmb3JtLGRlbGV0ZSBhLmRlbWFuZFRyYW5zZm9ybSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyKCl9KSxpKX19KSl9KSxlKTt0LmRhdGFzZXQub2JzZXJ2ZXJSZWFkeT0hMCxuLm9ic2VydmUodCl9KSksYS5sZW5ndGgpKG89ZnVuY3Rpb24gdCgpe3RfYW5pbWF0ZV9fZ2V0Q2hhaW5PZmZzZXRzKGEpfSkoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKChmdW5jdGlvbigpe28oKX0pKSksc2V0SW50ZXJ2YWwobyw1ZTMpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dmFyIHQsZT13aW5kb3cucGFnZVlPZmZzZXQrd2luZG93LmlubmVySGVpZ2h0O3RfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluc0Jsb2NrcyhhLGUpfSkpKX1lbHNle3ZhciBvOyhvPWZ1bmN0aW9uIHQoKXt0X2FuaW1hdGVfX2dldEdyb3Vwc09mZnNldHMoZSksdF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHMoYSksdF9hbmltYXRlX19nZXRFbGVtc09mZnNldHMobil9KSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUobykpLHNldEludGVydmFsKG8sNWUzKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3ZhciB0PXRfYW5pbWF0ZV9fZGVsZXRlQW5pbWF0ZWRFbHMoZSxuKTtuPXRbMF07dmFyIGk9dF9hbmltYXRlX19hbmltYXRlT25TY3JvbGwoZT10WzFdLGEsbik7aSYmaS5sZW5ndGgmJihlPWlbMF0sYT1pWzFdLG49aVsyXSl9KSkpfUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpO2UmJmUuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQ7aWYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZSIpJiYieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtY2hhaW4iKXx8ZS5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIikpe3ZhciBhPVtlXTt0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlQ2hhaW5zKGEpLHRfYW5pbWF0ZV9fZ2V0Q2hhaW5PZmZzZXRzKGE9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGEsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVfd2FpdCIpfSkpKSx0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbnNCbG9ja3MoYSx0KX19KSkpfSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVPblNjcm9sbCh0LGUsYSl7aWYodC5sZW5ndGh8fGUubGVuZ3RofHxhLmxlbmd0aCl7dmFyIG49d2luZG93LnBhZ2VZT2Zmc2V0LGk9bit3aW5kb3cuaW5uZXJIZWlnaHQscixvLHM7cmV0dXJuW3RfYW5pbWF0ZV9fYW5pbWF0ZUdyb3Vwcyh0LGksbiksdF9hbmltYXRlX19hbmltYXRlQ2hhaW5zQmxvY2tzKGUsaSxuKSx0X2FuaW1hdGVfX2FuaW1hdGVFbGVtcyhhLGksbildfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVHcm91cHModCxlKXtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmN1clRvcE9mZnNldDxlKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKTthPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLChmdW5jdGlvbih0KXtyZXR1cm4hKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIil8fCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpKX0pKSx0X2FuaW1hdGVfX21ha2VTZWN0aW9uQnV0dG9uV2FpdCh0KSx0X2FuaW1hdGVfX3NhdmVTZWN0aW9uSGVhZGVyU3RhcnRUaW1lKHQpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITEpfSkpfX0pKSx0fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluc0Jsb2Nrcyh0LGUpe3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaXRlbXNPZmZzZXRzWzBdPGUmJnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV93YWl0IikubGVuZ3RoJiYodF9hbmltYXRlX19hbmltYXRlQ2hhaW5JdGVtc09uU2Nyb2xsKHQsZSksdC5pdGVtc09mZnNldHMubGVuZ3RoJiZ0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbl9fb3V0T2ZUdXJuKHQpKX0pKSx0fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUVsZW1zKHQsZSxhKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBuPXRfYW5pbWF0ZV9fZGV0ZWN0RWxlbVRyaWdnZXJPZmZzZXQodCxlKTtyZXR1cm4gdC5jdXJUb3BPZmZzZXQ8bj8odC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITEpLCJhbmltYXRlZG51bWJlciI9PT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic3R5bGUiKSYmdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyh0KSwhMCk6ISh0LmN1clRvcE9mZnNldDxhKSYmdm9pZCAwfSkpLHR9ZnVuY3Rpb24gdF9hbmltYXRlX19kZWxldGVBbmltYXRlZEVscyh0LGUpe3ZhciBhPXdpbmRvdy5wYWdlWU9mZnNldCxuPVtdLGk9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodC5jdXJUb3BPZmZzZXQ8PWEpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LFsid2FpdCIsIm5vLWhvdmVyIl0pfSkpfWVsc2Ugbi5wdXNoKHQpfSkpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jdXJUb3BPZmZzZXQ8PWE/KHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCxbIndhaXQiLCJuby1ob3ZlciJdKSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSkpOmkucHVzaCh0KX0pKSxbaSxuXX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbkl0ZW1zT25TY3JvbGwodCxlKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfd2FpdFtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpO2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSk7dmFyIG49MCxpPTAscj10Lml0ZW1zT2Zmc2V0c1swXSxvPS4xNixzPXRfYW5pbWF0ZV9fZ2V0RGVsYXlGcm9tUHJldmlvdXNTY3JvbGxFdmVudCh0LG8pLGw9dF9hbmltYXRlX19nZXRTZWN0aW9uSGVhZERlYWx5KHQpO2EubGVuZ3RoJiZhWzBdLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iik7Zm9yKHZhciBtPTA7bTxhLmxlbmd0aDttKyspe3ZhciBjPWFbbV0sXz10Lml0ZW1zT2Zmc2V0c1ttXTtpZighKF88ZSkpYnJlYWs7XyE9PXImJihjLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iiksbj0rK2kscj1fKTt2YXIgZj1uKm8rcytsO2Muc3R5bGUudHJhbnNpdGlvbkRlbGF5PWYrInMiLGMuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX3dhaXQiKSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MoYywhMSksYy5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKzFlMypmKSxjWzBdPT09YVthLmxlbmd0aC0xXSYmdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb24odCxmKSwrXz09K3ImJm4rKyxhLnNwbGljZShtLDEpLHQuaXRlbXNPZmZzZXRzLnNwbGljZShtLDEpLG0tLX10X2FuaW1hdGVfX2NhdGNoVHJhbnNpdGlvbkVuZEV2ZW50KHQpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0U2VjdGlvbkhlYWREZWFseSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNlY3Rpb25fX3RpdGxlLnQtYW5pbWF0ZSIpLGE9dC5xdWVyeVNlbGVjdG9yKCIudC1zZWN0aW9uX19kZXNjci50LWFuaW1hdGUiKSxuPTA7aWYoZSl7dmFyIGk9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIil8fDA7aWYoRGF0ZS5ub3coKS1pPD0xNjApcmV0dXJuIG49LjE2fWlmKGEpe3ZhciByPWEuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIpfHwwO2lmKERhdGUubm93KCktcjw9MTYwKXJldHVybiBuPS4xNn1yZXR1cm4gbn1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldERlbGF5RnJvbVByZXZpb3VzU2Nyb2xsRXZlbnQodCxlKXt2YXIgYT0hdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX3N0YXJ0ZWQiKS5sZW5ndGgsbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfX2NoYWluX2ZpcnN0LWluLXJvdy50LWFuaW1hdGVfc3RhcnRlZCIpO2lmKG49QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX19jaGFpbl9zaG93ZWQiKX0pKSxhfHwhbi5sZW5ndGgpcmV0dXJuIDA7aWYobi5sZW5ndGgpe3ZhciBpLHIsbz0obltuLmxlbmd0aC0xXS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIil8fDApLURhdGUubm93KCk7cmV0dXJuIG88PTA/ZTpvLzFlMytlfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCxlKXtpZih0KXtpZihlKXt2YXIgYT0idC1hbmltYXRlLWZvci13cmFwcGVyIixuPXQuY2xvc2VzdCgiLiIrYSk7biYmbi5jbGFzc0xpc3QucmVtb3ZlKGEpfXZhciBpO2lmKHQuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3N0YXJ0ZWQiKSwiZmFkZWlubGVmdCI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0eWxlIikpe3ZhciByPXQuY2xvc2VzdCgiLnQtYW5pbWF0ZV9fb3ZlcmZsb3cteC1oaWRkZW4iKTtyJiYhci5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5sZWZ0Il06bm90KC50LWFuaW1hdGVfc3RhcnRlZCknKSYmci5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfX292ZXJmbG93LXgtaGlkZGVuIil9fX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NhdGNoVHJhbnNpdGlvbkVuZEV2ZW50KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93LnQtYW5pbWF0ZV9zdGFydGVkIik7ZT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZSwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfX2NoYWluX3Nob3dlZCIpfSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dmFyIGU7WyJ0cmFuc2l0aW9uZW5kIiwid2Via2l0VHJhbnNpdGlvbkVuZCIsIm9UcmFuc2l0aW9uRW5kIiwib3RyYW5zaXRpb25lbmQiLCJNU1RyYW5zaXRpb25FbmQiXS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmFkZEV2ZW50TGlzdGVuZXIoZSwoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4odCl9KSksdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19hZGRFdmVudE9uQW5pbWF0ZUNoYWluKHQpfSkpfSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcGFyc2VOdW1iZXJUZXh0KCl7dmFyIHQ9d2luZG93LnBhZ2VZT2Zmc2V0LGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9J2FuaW1hdGVkbnVtYmVyJ10iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUpe3ZhciBhLG49IiIsaT1lLnF1ZXJ5U2VsZWN0b3JBbGwoInNwYW4iKTtpZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe24rPXQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpfHwiIix0LnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKSx0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1yZWRhY3Rvci1zdHlsZSIpfSkpLGUucXVlcnlTZWxlY3RvckFsbCgnZGl2W2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJykubGVuZ3RoKXt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3IoJ2RpdltkYXRhLWN1c3RvbXN0eWxlPSJ5ZXMiXScpO2E9cj9yLmlubmVySFRNTDoiIjt2YXIgbz1lLmdldEF0dHJpYnV0ZSgic3R5bGUiKXx8IiIscz1lLnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWN1c3RvbXN0eWxlXSIpLGw9cz9zLmdldEF0dHJpYnV0ZSgic3R5bGUiKToiIjtsJiYobys9bCksZS5zZXRBdHRyaWJ1dGUoInN0eWxlIixvKX1lbHNlIGE9ZS5pbm5lckhUTUw7aWYobj1uLnNwbGl0KCI7IikuZmlsdGVyKChmdW5jdGlvbih0LGUpe3JldHVybiBuLnNwbGl0KCI7IikuaW5kZXhPZih0KT09PWV9KSkuam9pbigiOyIpLCEoZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0PHQtNTAwKSYmYS5sZW5ndGgpe3ZhciBtPWEucmVwbGFjZSgvPGJyPi9nLCIgIikucmVwbGFjZSgvW15cZC4sIF0rL2csIiIpLnJlcGxhY2UoLyAoXC58LCkvZywiIikucmVwbGFjZSgvKFxkKSg/PVxkKSAvZywiJDEiKS50cmltKCksYz1tO2lmKC0xPT09YS5pbmRleE9mKG0pJiYoYz1tPW0uc3BsaXQoIiAiKVswXSksIiIhPT1tKXtlLnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW51bWJlci1jb3VudCIsYSksdF9hbmltYXRlX19jaGFuZ2VOdW1iZXJPblplcm8oZSxhLnJlcGxhY2UoYywibnVtIikpO3ZhciBfPWUucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpO189QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKF8sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygiLnQtYW5pbWF0ZV9fbnVtYmVyIil9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChfLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgic3R5bGUiLG4pfSkpfX19KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGFuZ2VOdW1iZXJPblplcm8odCxlKXt0LmlubmVySFRNTD1lLnJlcGxhY2UoL251bS9nLCc8c3BhbiBjbGFzcz0idC1hbmltYXRlX19udW1iZXIiPjA8L3NwYW4+Jyl9ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyh0KXtpZighdClyZXR1cm4hMTt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW51bWJlci1jb3VudCIpLGE9W10sbj10LnF1ZXJ5U2VsZWN0b3JBbGwoInNwYW4iKTsobj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCIudC1hbmltYXRlX19udW1iZXIiKX0pKSkubGVuZ3RoJiYoYT1uWzBdLmdldEF0dHJpYnV0ZSgic3R5bGUiKXx8IiIpO3ZhciBpPVtdLHI9bnVsbDtpZihlKXtyPWUubWF0Y2goL1xkK1wuXGQrfFxkKyxcZCsvZyk7dmFyIG89ZS5tYXRjaCgvXGQrL2cpLHMsbDtlLnJlcGxhY2UoLyhcZCkoPz0gXGQpIC9nLCIkMSIpLnNwbGl0KCIgIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7aXNOYU4ocGFyc2VJbnQodC5yZXBsYWNlKC9bXlxkLiwgXSsvZywiIiksMTApKXx8aS5wdXNoKHQucmVwbGFjZSgvW15cZC4sIF0rL2csIiIpKX0pKX12YXIgbT0wLGM9ITEsXz0hMTt0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW51bWJlci1jb3VudCIpLG51bGwhPT1yJiYoXz0tMSE9PXJbMF0uaW5kZXhPZigiLCIpKSxpLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dmFyIGE7bnVsbCE9PXImJigtMSE9PXQuaW5kZXhPZigiLCIpJiYoYT10LnNwbGl0KCIsIikpLC0xIT09dC5pbmRleE9mKCIuIikmJihhPXQuc3BsaXQoIi4iKSksLTE9PT10LmluZGV4T2YoIiwiKSYmLTE9PT10LmluZGV4T2YoIi4iKXx8KG09YVsxXS5sZW5ndGgsaVtlXT0rYS5qb2luKCIuIiksYz0hMCkpfSkpO3ZhciBmPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZV9fbnVtYmVyIik7aWYoaVswXSl7dmFyIGQ9TnVtYmVyKGlbMF0pfHwwLHU9MCx5PU1hdGgucG93KDEwLG0pO2MmJihkKj15LHUqPXkpO3ZhciBwPTEyLGg9MCxnPXNldEludGVydmFsKChmdW5jdGlvbigpe2lmKHUrPWQvMTA4LGg9Yz8oTWF0aC5yb3VuZCh1KS95KS50b0ZpeGVkKG0pKyIiOk1hdGguZmxvb3IodSkrIiIsby5sZW5ndGg+MSYmKGg9aC5yZXBsYWNlKC8oXGQpKD89KFxkezN9KSsoW15cZF18JCkpL2csIiQxICIpKSxfJiYoaD1oLnJlcGxhY2UoL1wuL2csIiwiKSksZiYmKGYudGV4dENvbnRlbnQ9aCksdT49ZCl7Y2xlYXJJbnRlcnZhbChnKSx0LmlubmVySFRNTD1lO3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKX0pKX19KSxwKX19ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRBbmltYXRpb25TdGF0ZSh0LGUsYSl7dmFyIG49d2luZG93LnBhZ2VZT2Zmc2V0LGk9bit3aW5kb3cuaW5uZXJIZWlnaHQ7dF9hbmltYXRlX19zZXRHcm91cHNCbG9ja3NTdGF0ZSh0LG4saSksZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0X2FuaW1hdGVfX2Fzc2lnbkNoYWluRGVsYXkodCxpLG4pLHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uX19vdXRPZlR1cm4odCl9KSksdF9hbmltYXRlX19zZXRBbmltRUxlbXNTdGF0ZShhLG4saSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSh0X2FuaW1hdGVfX3JlbW92ZUlubGluZUFuaW1TdHlsZXMpKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldEFuaW1FTGVtc1N0YXRlKHQsZSxhKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDtpZihuPGUtNTAwKXJldHVybiB0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsIm5vLWhvdmVyIiksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpLCEwO3ZhciBpPXRfYW5pbWF0ZV9fZGV0ZWN0RWxlbVRyaWdnZXJPZmZzZXQodCxhKTt0X2FuaW1hdGVfX3NldEN1c3RvbUFuaW1TZXR0aW5ncyh0LG4sYSksbjxpJiYhdC5jbG9zZXN0KCIudDEwOTMiKSYmKHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITApLCJhbmltYXRlZG51bWJlciI9PT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic3R5bGUiKSYmdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyh0KSksKG4+PWl8fHQuY2xvc2VzdCgiLnQxMDkzIikpJiZ0LmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV93YWl0Iil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRHcm91cHNCbG9ja3NTdGF0ZSh0LGUsYSl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKTtuPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChuLChmdW5jdGlvbih0KXtyZXR1cm4hKCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpKX0pKTt2YXIgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7dF9hbmltYXRlX19yZW1vdmVBbmltRnJvbUhpZGRlblNsaWRlcyh0KTt2YXIgcj10X2FuaW1hdGVfX2Fzc2lnblNlY3Rpb25EZWxheSh0KTt0X2FuaW1hdGVfX2Fzc2lnbkdyb3VwRGVsYXkodCxyKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKG4pe3ZhciByPW4uY2xvc2VzdCgiLnQzOTdfX29mZiIpfHxuLmNsb3Nlc3QoIi50Mzk1X19vZmYiKXx8bi5jbG9zZXN0KCIudDQwMF9fb2ZmIik7aWYobi5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9uby1ob3ZlciIpJiZyJiZuLmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV9uby1ob3ZlciIpLGk8PWUtMTAwKXJldHVybiB0X2FuaW1hdGVfX3NhdmVTZWN0aW9uSGVhZGVyU3RhcnRUaW1lKHQpLHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3Mobiwibm8taG92ZXIiKSxuLnN0eWxlLnRyYW5zaXRpb25EZWxheT0iIiwhMDtpPGEmJmk+ZS0xMDAmJih0X2FuaW1hdGVfX21ha2VTZWN0aW9uQnV0dG9uV2FpdCh0KSxuLmNsYXNzTGlzdC5jb250YWlucygiLnQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKXx8KHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnMobikscj9uLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV93YWl0Iik6dF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKG4sITEpKSksaT49YSYmbi5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfd2FpdCIpfSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0QW5pbWF0aW9uU3RhdGVDaGFpbnModCl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4hMTt2YXIgZT13aW5kb3cucGFnZVlPZmZzZXQsYT1lK3dpbmRvdy5pbm5lckhlaWdodDtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fYXNzaWduQ2hhaW5EZWxheSh0LGEsZSksdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb25fX291dE9mVHVybih0KX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnblNlY3Rpb25EZWxheSh0KXt2YXIgZT0wLGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX190aXRsZS50LWFuaW1hdGUiKSxuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fZGVzY3IudC1hbmltYXRlIik7cmV0dXJuIGEubGVuZ3RoJiYoZT0uMTYpLG4ubGVuZ3RoJiYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1lKyJzIn0pKSxlKz0uMTYpLGV9ZnVuY3Rpb24gdF9hbmltYXRlX19hc3NpZ25Hcm91cERlbGF5KHQsZSl7dmFyIGE9MDtpZih0LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtb3JkZXJdIikubGVuZ3RoKXRfYW5pbWF0ZV9fYXNzaWduT3JkZXJlZEVsZW1zRGVsYXkodCxlKTtlbHNle3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtaW1nLnQtYW5pbWF0ZSIpLGk9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC11cHRpdGxlLnQtYW5pbWF0ZSIpLHI9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC10aXRsZS50LWFuaW1hdGUiKTtyPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChyLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2VjdGlvbl9fdGl0bGUiKX0pKTt2YXIgbz10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWRlc2NyLnQtYW5pbWF0ZSIpO289QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG8sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1zZWN0aW9uX19kZXNjciIpfSkpO3ZhciBzPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYnRuLnQtYW5pbWF0ZSwgLnQtYnRud3JhcHBlci50LWFuaW1hdGUiKTtzPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChzLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbG9zZXN0KCIudC1zZWN0aW9uX19ib3R0b213cmFwcGVyIil9KSk7dmFyIGw9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC10aW1lci50LWFuaW1hdGUiKSxtPXQucXVlcnlTZWxlY3RvckFsbCgiZm9ybS50LWFuaW1hdGUiKTtuLmxlbmd0aCYmKGE9LjUpLHIubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLHIubGVuZ3RoJiYoYSs9LjMpLG8ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLG8ubGVuZ3RoJiYoYSs9LjMpLGkubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLGkubGVuZ3RoJiYoYSs9LjMpLChpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RoKSYmKGErPS4yKSxsLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSxsLmxlbmd0aCYmKGErPS41KSxzLmxlbmd0aCYmKHNbMF0uc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMiKSwyPT09cy5sZW5ndGgmJihhKz0uNCksMj09PXMubGVuZ3RoJiYoc1sxXS5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyIpLDAhPT1tLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKX19ZnVuY3Rpb24gdF9hbmltYXRlX19hc3NpZ25PcmRlcmVkRWxlbXNEZWxheSh0LGUpe3ZhciBhPTA7ZSYmKGE9ZSk7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iMSJdJyksaT10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSIyIl0nKSxyPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjMiXScpLG89dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iNCJdJykscz10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI1Il0nKSxsPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjYiXScpLG09dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iNyJdJyksYz10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI4Il0nKSxfPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjkiXScpO24ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLG4ubGVuZ3RoJiZpLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKGlbMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aCkmJnIubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoclswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aCkmJm8ubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2Uob1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGgpJiZzLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHNbMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RofHxzLmxlbmd0aCkmJmwubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UobFswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RofHxsLmxlbmd0aCkmJm0ubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UobVswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG0sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RofHxsLmxlbmd0aHx8bS5sZW5ndGgpJiZjLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKGNbMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RofHxzLmxlbmd0aHx8bC5sZW5ndGh8fG0ubGVuZ3RofHxjLmxlbmd0aCkmJl8ubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoX1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKF8sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnbkNoYWluRGVsYXkodCxlLGEpe3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpLGk9MDtpZihuLmxlbmd0aCl7dmFyIHI9blswXSxvPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDtyLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iik7dmFyIHM9dF9hbmltYXRlX19nZXRDdXJCbG9ja1NlY3Rpb25IZWFkRGVsYXkodCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbihsKXt2YXIgbT1sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7aWYobTxhKXJldHVybiB0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKGwsIiIpLCEwO2lmKG08ZSl7bSE9PW8mJihsLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iiksbz1tKTt2YXIgYz0uMTYqaStzLF87bC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YysicyIsdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKGwsITEpLGwuc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIsRGF0ZS5ub3coKSsxZTMqYykscj09PW5bbi5sZW5ndGgtMV0mJnRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uKHQsYyksaSsrLFsidHJhbnNpdGlvbmVuZCIsIndlYmtpdFRyYW5zaXRpb25FbmQiLCJvVHJhbnNpdGlvbkVuZCIsIm90cmFuc2l0aW9uZW5kIiwiTVNUcmFuc2l0aW9uRW5kIl0uZm9yRWFjaCgoZnVuY3Rpb24odCl7bC5hZGRFdmVudExpc3RlbmVyKHQsKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19hZGRFdmVudE9uQW5pbWF0ZUNoYWluKGwpfSkpLGwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LChmdW5jdGlvbigpe3RfYW5pbWF0ZV9fYWRkRXZlbnRPbkFuaW1hdGVDaGFpbihsKX0pKX0pKX1lbHNlIGwuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3dhaXQiKX0pKX19ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsZSl7dmFyIGEsbj10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpO2lmKCFuKXJldHVybiB0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSk7dmFyIGkscj0iYWIiK24uZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksbyxzLGw7dm9pZCAwIT09d2luZG93LnRuW3JdPyhvPXdpbmRvdy50bltyXS5jdXJSZXNvbHV0aW9uLHM9d2luZG93LnRuW3JdLmN1clJlc29sdXRpb25fbWF4LGw9d2luZG93LnRuW3JdLnNjcmVlbnMuc2xpY2UoKSk6KG89d2luZG93LnRuLmN1clJlc29sdXRpb24scz0xMjAwLGw9WzMyMCw0ODAsNjQwLDk2MCwxMjAwXSk7dmFyIG09dC5jbG9zZXN0KCIudDM5Nl9fZWxlbSwgLnQzOTZfX2dyb3VwIiksYz1tJiZtLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW1vYmlsZSIpO2lmKG89PT1zKWE9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS0iK2UpO2Vsc2V7aWYoInkiIT09YyYmbzwxMjAwKXJldHVybiB0LnN0eWxlLnRyYW5zaXRpb249Im5vbmUiLG51bGw7YT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSsiLXJlcy0iK28pfWlmKCFhJiYiIiE9PWEpZm9yKHZhciBfPTA7XzxsLmxlbmd0aDtfKyspe3ZhciBmPWxbX107aWYoIShmPD1vKSYmKGE9Zj09PXM/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS0iK2UpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIitlKyItcmVzLSIrZikpKWJyZWFrfXJldHVybiBhfWZ1bmN0aW9uIHRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbih0KXtyZXR1cm4gdC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX3dhaXQiKXx8dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlX3dhaXQiKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4odCl7dC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX2NoYWluX3Nob3dlZCIpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0Q3VzdG9tQW5pbVNldHRpbmdzKHQsZSxhKXt2YXIgbj10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic3R5bGUiKSxpPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJkaXN0YW5jZSIpO2lmKGkmJiIiIT09aSl7c3dpdGNoKGk9aS5yZXBsYWNlKCJweCIsIiIpLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIwcyIsdC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IjBzIixuKXtjYXNlImZhZGVpbnVwIjp0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlM2QoMCwiK2krInB4LDApIjticmVhaztjYXNlImZhZGVpbmRvd24iOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgwLC0iK2krInB4LDApIjticmVhaztjYXNlImZhZGVpbmxlZnQiOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgiK2krInB4LDAsMCkiO2JyZWFrO2Nhc2UiZmFkZWlucmlnaHQiOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgtIitpKyJweCwwLDApIn10X2FuaW1hdGVfX2ZvcmNlRWxlbUluVmlld1BvcnRSZXBhaW50KHQsZSxhKSx0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iIix0LnN0eWxlLnRyYW5zaXRpb25EZWxheT0iIn12YXIgcj10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic2NhbGUiKTtyJiYodC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IjBzIix0LnN0eWxlLnRyYW5zaXRpb25EZWxheT0iMHMiLHQuc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgiK3IrIikiLHRfYW5pbWF0ZV9fZm9yY2VFbGVtSW5WaWV3UG9ydFJlcGFpbnQodCxlLGEpLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIiKTt2YXIgbz10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwiZGVsYXkiKTtvJiYodC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9bysicyIpO3ZhciBzPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJkdXJhdGlvbiIpO3MmJih0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj1zKyJzIil9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVJbmxpbmVBbmltU3R5bGVzKCl7aWYod2luZG93LmlubmVyV2lkdGg8OTgwKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudDM5Nl9fZWxlbS50LWFuaW1hdGU6bm90KC50LWFuaW1hdGVfd2FpdCkiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNmb3JtPSIiLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIifSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2ZvcmNlRWxlbUluVmlld1BvcnRSZXBhaW50KHQsZSxhKXt0JiZlPGErNTAwJiZ0Lm9mZnNldEhlaWdodH1mdW5jdGlvbiB0X2FuaW1hdGVfX2RldGVjdEVsZW1UcmlnZ2VyT2Zmc2V0KHQsZSl7dmFyIGE9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInRyaWdnZXItb2Zmc2V0Iiksbj1lO3JldHVybiBhJiYobj1lLTEqKGE9YS5yZXBsYWNlKCJweCIsIiIpKSksbn1mdW5jdGlvbiB0X2FuaW1hdGVfX3NhdmVTZWN0aW9uSGVhZGVyU3RhcnRUaW1lKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fdGl0bGUudC1hbmltYXRlIiksYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX2Rlc2NyLnQtYW5pbWF0ZSIpO2UubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIsRGF0ZS5ub3coKSl9KSksYS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKzE2MCl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRDdXJCbG9ja1NlY3Rpb25IZWFkRGVsYXkodCl7dmFyIGU9MDtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX190aXRsZS50LWFuaW1hdGUiKS5sZW5ndGgmJihlKz0uMTYpLHQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fZGVzY3IudC1hbmltYXRlIikubGVuZ3RoJiYoZSs9LjE2KSxlfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpLmxlbmd0aCxhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fYm90dG9td3JhcHBlciAudC1idG4udC1hbmltYXRlIik7ZS5sZW5ndGgmJmEubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uKHQsZSl7dmFyIGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpO2EubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWUrLjE2KyJzIix0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKHQpLHQuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCExKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbl9fb3V0T2ZUdXJuKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpLGE7KGU9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX3N0YXJ0ZWQiKX0pKSkubGVuZ3RofHx0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbih0LC4xNil9ZnVuY3Rpb24gdF9hbmltYXRlX19hZGROb0hvdmVyQ2xhc3NUb0J0bnMoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1idG4udC1hbmltYXRlIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9uby1ob3ZlciIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCl7aWYoIXQpcmV0dXJuITE7dmFyIGU9dC5jbGFzc0xpc3QuY29udGFpbnMoInQtYnRuIik/dDpudWxsO2UmJihlLm9udHJhbnNpdGlvbmVuZD1mdW5jdGlvbih0KXsib3BhY2l0eSIhPT10LnByb3BlcnR5TmFtZSYmInRyYW5zZm9ybSIhPT10LnByb3BlcnR5TmFtZXx8KGUuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX25vLWhvdmVyIiksZS5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IiIsZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IiIsdGhpcy5vbnRyYW5zaXRpb25lbmQ9bnVsbCl9KX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEdyb3Vwc09mZnNldHModCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGUiKTtpZihlKXt0LmN1clRvcE9mZnNldD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7dmFyIGE9dF9hbmltYXRpb25fX2dldFpvb20odCk7d2luZG93LmlzT25seVNjYWxhYmxlfHwodC5jdXJUb3BPZmZzZXQqPWEpfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvbl9fZ2V0Wm9vbSh0KXtpZih2b2lkIDAhPT10LnNjYWxlRmFjdG9yKXJldHVybiB0LnNjYWxlRmFjdG9yO3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoIWUpcmV0dXJuIDE7dmFyIGE9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9InRpbGRhLWJsb2Nrcy0yLjciXScpO3JldHVybiBlLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmRfc2NhbGUiKXx8IWEmJiJ1bmRlZmluZWQiIT10eXBlb2YgdDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSYmIndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKGUsInVwc2NhbGUiKT93aW5kb3cudG5fc2NhbGVfZmFjdG9yOjF9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHModCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfd2FpdFtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpO3QuaXRlbXNPZmZzZXRzPVtdLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSxhKXt0Lml0ZW1zT2Zmc2V0c1thXT1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXR9KSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRFbGVtc09mZnNldHModCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmN1clRvcE9mZnNldD13aW5kb3cucGFnZVlPZmZzZXQrdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7dmFyIGU9dF9hbmltYXRpb25fX2dldFpvb20odCk7d2luZG93LmlzT25seVNjYWxhYmxlfHwodC5jdXJUb3BPZmZzZXQqPWUpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbUZyb21IaWRkZW5TbGlkZXModCl7dmFyIGU7aWYodC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGlkZXMiKS5sZW5ndGgpe3ZhciBhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xpZGVzX19pdGVtIik7YT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsaWRlc19faXRlbV9hY3RpdmUiKX0pKTt2YXIgbj1bXTthLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZSIpO2UmJm4ucHVzaChlKX0pKSxuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwibm8taG92ZXIiKX0pKX19ZnVuY3Rpb24gdF9hbmltYXRlX193cmFwVGV4dFdpdGhPcGFjaXR5KCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtdGl0bGUudC1hbmltYXRlLCAudC1kZXNjci50LWFuaW1hdGUsIC50LXVwdGl0bGUudC1hbmltYXRlLCAudC10ZXh0LnQtYW5pbWF0ZSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYoZSYmLTEhPT1lLmluZGV4T2YoIm9wYWNpdHkiKSl7dmFyIGE9dC5zdHlsZS5vcGFjaXR5O2lmKGEmJmE+MCl7dC5zdHlsZS5vcGFjaXR5PSIiO3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uc3R5bGUub3BhY2l0eT1hO3ZhciBpPXQuY2hpbGROb2RlcztBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvbmVOb2RlKCEwKTtuLmFwcGVuZENoaWxkKGUpfSkpLHQuaW5uZXJIVE1MPSIiLHQuYXBwZW5kQ2hpbGQobil9fX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NoZWNrSUUoKXt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxlPXQuaW5kZXhPZigiTVNJRSIpLGE9IiIsbj0hMTtyZXR1cm4gZT4wJiYoOCE9PShhPXBhcnNlSW50KHQuc3Vic3RyaW5nKGUrNSx0LmluZGV4T2YoIi4iLGUpKSkpJiY5IT09YXx8KG49ITApKSxufSJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dF9hbmltYXRlX19pbml0KCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsdF9hbmltYXRlX19pbml0KTsKCmZ1bmN0aW9uIHQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIodCl7dHJ5e3ZhciBlLGk9L3ZhclwoKC0tdWMtKFteLV0rKS0oW14tXSspLShbXixdKykpLFxzPyguKilcKS8uZXhlYyh0KTtpZighaSlyZXR1cm47dmFyIHI9aVswXSxvPWlbMV0sbj1pWzJdLGE9aVszXSxsPWlbNF0sZD1pWzVdLF8scztpZighKHImJm4mJmEmJmwmJmQpKXJldHVybjtyZXR1cm57cGFyZW50OntpZDpsLHR5cGU6bn0sZmFsbGJhY2s6d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZShvKXx8ZCxmaWVsZDphfX1jYXRjaCh1KXtjb25zb2xlLmVycm9yKCJFcnJvciB0cnlpbmcgdG8gcGFyc2UgQ1NTIFZhcmlhYmxlIil9fWZ1bmN0aW9uIHQzOTZfX2hleDJyZ2JhKHQsZSl7aWYoIXQpcmV0dXJuITE7dmFyIGk9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1Zhcih0KTtpJiYodD1pLmZhbGxiYWNrKTt2YXIgcj10LnJlcGxhY2UoLyMvLCIiKTtpZigzPT09ci5sZW5ndGgpe3ZhciBvPXJbMF0sbj1yWzFdLGE9clsyXTt0PSIjIitvK28rbituK2ErYX12YXIgbD1wYXJzZUludCh0LnN1YnN0cmluZygxKSwxNiksZCxfLHM7cmV0dXJuWygxNjcxMTY4MCZsKT4+MTYsKDY1MjgwJmwpPj44LDI1NSZsLHBhcnNlRmxvYXQoZSldfWZ1bmN0aW9uIHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCl7dmFyIGU9WyJnYWxsZXJ5Il0saT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtyZXR1cm4gZS5pbmNsdWRlcyhpKX1mdW5jdGlvbiB0Mzk2X19pc0ZsZXgodCl7dmFyIGU9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxpPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cC1mbGV4Iik7cmV0dXJuIGV8fGl9ZnVuY3Rpb24gdDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKHQpe3ZhciBlPVsiLnQ5NTFfX3NpZGViYXJfc3RpY2t5IiwiLnQxMjA2X19jb250ZW50X3N0aWNreSIsIi50NzU0X19jb2xfZml4ZWQiLCIudDc3Nl9fY29sX2ZpeGVkIiwiLnQ3ODZfX2NvbF9maXhlZCIsIi50LXN0b3JlX19wcm9kLXBvcHVwX19jb2xfZml4ZWQiXTt0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKTt2YXIgaT1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZS5qb2luKCIsICIpKSk7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiLCJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpLHQuY2xhc3NMaXN0LmFkZChpPyJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiOiJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpfX1mdW5jdGlvbiB0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQzOTZfX292ZXJmbG93LXN0eWxlcyIpKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3QuaWQ9InQzOTZfX292ZXJmbG93LXN0eWxlcyIsdC5pbm5lckhUTUw9Ii50LXJlY29yZHNfX292ZXJmbG93LWNsaXAgeyBvdmVyZmxvdzogY2xpcDsgfVxuXHRcdFx0XHRcdFx0LnQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdDM5Nl9fZ2V0QXJ0Ym9hcmRzKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksaSxyPWUmJiJlZGl0Ij09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKT8nLnJlY29yZFtkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdIC5yOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yZWNvcmRbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJzonLnJbZGF0YS1yZWNvcmQtdHlwZT0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucltkYXRhLXBhcmVudHRwbGlkPSInK3QrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnO3JldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocikpfWZ1bmN0aW9uIHQzOTZfX2dldFplcm9CbG9ja3MoKXt2YXIgdD1bXS5jb25jYXQodDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIzOTYiKSx0Mzk2X19nZXRBcnRib2FyZHMoIjEyMSIpKSxlO3JldHVybiB0Lmxlbmd0aD90Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3JlY29yZDp0LmNsb3Nlc3QoIi5yOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIiksYXJ0Ym9hcmQ6dH19KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZWNvcmR9KSk6W119ZnVuY3Rpb24gdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpe2Zvcih2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2U7KXt2YXIgaTtpZihlLnN0eWxlLnpvb20pcmV0dXJuITA7ZT1udWxsPT0oaT1lLnBhcmVudEVsZW1lbnQpP3ZvaWQgMDppLmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpfXJldHVybiExfXZhciB0Mzk2X191bmlxdWVJZF9fZ2VuZXJhdG9yPWZ1bmN0aW9uIHQoKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PVN0cmluZyhlKz0xKS5wYWRTdGFydCg2LCIwIik7cmV0dXJuIiIrRGF0ZS5ub3coKSt0fX0sdDM5Nl9fZ2V0VW5pcXVlSWQ9dDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcigpO2Z1bmN0aW9uIHQzOTZfaXNCbG9ja1Zpc2libGUodCl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgsaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIikscj10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4Iik7cmV0dXJuIShpJiZlPHBhcnNlSW50KGksMTApKSYmIShyJiZlPnBhcnNlSW50KHIsMTApKX12YXIgdDM5Nl9fb25SZWFkeT1mdW5jdGlvbiB0KGUpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZSgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpfTtmdW5jdGlvbiB0Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtdGV4dGFyZWEiKTtpZihlKXt2YXIgaT1lLnZhbHVlO2lmKGkpdHJ5e3JldHVybiBKU09OLnBhcnNlKGkpfWNhdGNoKG4pe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIHRleHRhcmVhIHZhbHVlOiIsbixpKSxbXX19dmFyIHI9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9faW5wdXRzLWRhdGEiKTtpZihyKXt2YXIgbz1yLmdldEF0dHJpYnV0ZSgiZGF0YS12YWx1ZSIpO2lmKG8pdHJ5e3JldHVybiBKU09OLnBhcnNlKG8pfWNhdGNoKG4pe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIGRhdGE6IixuLG8pLFtdfX1yZXR1cm5bXX1mdW5jdGlvbiB0Mzk2X2luaXQodCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksaT1lP2UucXVlcnlTZWxlY3RvcigiLnQzOTYiKTpudWxsLHI9ZT9lLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGw7aWYocil7dDM5Nl9pbml0VE5vYmoodCxyKSx0Mzk2X19pbml0T25seVNjYWxhYmxlKCk7dmFyIG89IiIsbj10Mzk2X2RldGVjdFJlc29sdXRpb24odCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGw9YSYmImVkaXQiPT09YS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpO3ZvaWQgMD09PXdpbmRvdy50bi5pc0VkaXRNb2RlJiYod2luZG93LnRuLmlzRWRpdE1vZGU9bCksdDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsbik7dmFyIGQ9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsInVwc2NhbGUiKSxfPXQzOTZfX3NldEdsb2JhbFNjYWxlVmFyaWFibGVzKHQsbixkKTtpZih0Mzk2X19zZXRTY2FsZUZhY3RvckZvckVsZW1lbnRzKHQsXyksdDM5Nl91cGRhdGVUTm9iaih0KSx0Mzk2X2FydGJvYXJkX2J1aWxkKG8sdCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9faW5pdGlhbGl6ZUFydGJvYXJkT3ZlcmZsb3coYSxyKX0pKSx3aW5kb3cudGlsZGFNZW1iZXJzJiYiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBzPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJhdHRyaWJ1dGVzIj09PWUudHlwZSYmImNsYXNzIj09PWUuYXR0cmlidXRlTmFtZSYmZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bGstY291cnNlc19wYWdlIikmJih0Mzk2X2RvUmVzaXplKHQsITApLHMuZGlzY29ubmVjdCgpKX0pKX0pKTtzLm9ic2VydmUoZG9jdW1lbnQuYm9keSx7YXR0cmlidXRlczohMH0pfWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50ODMwIikmJnRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgZSxpO1sidDgzMF9fYWxscmVjb3Jkc19wYWRkIiwidDgzMF9fYWxscmVjb3Jkc19wYWRkLXNtYWxsIl0uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGEuY2xhc3NMaXN0LmNvbnRhaW5zKHQpfSkpP3QzOTZfZG9SZXNpemUodCwhMCk6YS5hZGRFdmVudExpc3RlbmVyKCJhbGxSZWNQYWRkaW5nSW5pdCIsKGZ1bmN0aW9uKCl7dDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKX0pKSxlJiZpJiZyJiYieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbm5lY3Qtd2l0aC10YWIiKSYmaS5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsKGZ1bmN0aW9uKCl7dDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyhyKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhyKSx0Mzk2X2RvUmVzaXplKHQsITApfSkpO3ZhciB1PSJodWciPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpLGM7aWYodSl7dmFyIGY9dF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHIpfSksMTAwKTtmKCksc2V0SW50ZXJ2YWwoZiwzZTMpLGRvY3VtZW50LmZvbnRzJiZkb2N1bWVudC5mb250cy5yZWFkeS50aGVuKGYpLHIucXVlcnlTZWxlY3RvckFsbCgiaW1nIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5vbmxvYWQ9Zn0pKSxuZXcgTXV0YXRpb25PYnNlcnZlcihmKS5vYnNlcnZlKHIse3N1YnRyZWU6ITAsY2hhcmFjdGVyRGF0YTohMCxjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6ITB9KSxuZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24odCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTsiY2hpbGRMaXN0Ij09PXQudHlwZSYmKEFycmF5LmZyb20odC5hZGRlZE5vZGVzKS5jb25jYXQoQXJyYXkuZnJvbSh0LnJlbW92ZWROb2RlcykpLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiAzIT09dC5ub2RlVHlwZSYmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIil8fHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cCIpKX0pKSYmZigpKX0pKX0pKS5vYnNlcnZlKHIse3N1YnRyZWU6ITAsY2hpbGRMaXN0OiEwfSl9KGEuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0MjM1X19iZWZvcmVyZWFkeSIpfHxlJiZlLmNsb3Nlc3QoIiNhbGxyZWNvcmRzdGFibGUiKXx8YS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZWNvcmQtdHlwZT0iMjYzIl0nKSkmJmkmJnImJmkuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKTt2YXIgZz0hIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50NjM1X190ZXh0aG9sZGVyIik7ZSYmZyYmaSYmciYmaS5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25Jbml0ZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKSxlJiZkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDQzMSIpJiZpJiZyJiZ0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X2RvUmVzaXplKHQsITApfSkpfSkpLC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJmkmJmkuY2xhc3NMaXN0LmFkZCgidDM5Nl9zYWZhcmkiKSxkJiYhbCYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X3NjYWxlQmxvY2siLChmdW5jdGlvbigpe3QzOTZfc2NhbGVCbG9jayh0KX0pKSxsfHwieSIhPT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsImZpeGVkLW5lZWQtanMiKXx8dF9vbkZ1bmNMb2FkKCJ0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fcHJvY2Vzc0ZpeGVkQXJ0Qm9hcmQocil9KSksdDM5Nl9fcHJvY2Vzc0Fic29sdXRlQXJ0Qm9hcmQociksdDM5Nl9fcHJvY2Vzc1RvcFNoaWZ0KHIsdCwhMSksd2luZG93LnQzOTZfX2lzTW9iaWxlfHx1fHx0Mzk2X19yZW1vdmVJbmxpbmVIZWlnaHQoW3Isci5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLHIucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpXSksbHx8dDM5Nl9faW50aWFsaXplVW5kZXJjdXQoZSl9fXdpbmRvdy50Mzk2X19pc01vYmlsZT0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIik+LTEsd2luZG93LnQzOTZfX2lzSVBhZD0ib250b3VjaGVuZCJpbiBkb2N1bWVudCYmLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkFwcGxlV2ViS2l0Iiksd2luZG93LnQzOTZfX2lzU2FmYXJpPS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LnQzOTZfX2lzVG91Y2hEZXZpY2U9Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQsd2luZG93LnQzOTZfX2lzSW5BcHBCcm93c2VyPS9XZWJWaWV3fChpUGhvbmV8aVBvZHxpUGFkKSg/IS4qU2FmYXJpKS9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy50Mzk2X19pc0ZhY2Vib29rTWVzc2VuZ2VySW5BcHA9L0ZCQU58RkJBVi9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZ3aW5kb3cudDM5Nl9faXNJbkFwcEJyb3dzZXIsd2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHA9L1xiSW5zdGFncmFtL2dpLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJndpbmRvdy50Mzk2X19pc0luQXBwQnJvd3Nlcix0X29uUmVhZHkodDM5Nl9fZ2xvYmFsSW5pdCk7dmFyIHQzOTZfd2FpdEZvckZpbmFsRXZlbnQ9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gZnVuY3Rpb24oZSxpLHIpe3ZhciBvPXJ8fCJEb24ndCBjYWxsIHRoaXMgdHdpY2Ugd2l0aG91dCBhIHVuaXF1ZUlkIjt0W29dJiZjbGVhclRpbWVvdXQodFtvXSksdFtvXT1zZXRUaW1lb3V0KGUsaSl9fSgpO2Z1bmN0aW9uIHQzOTZfX2hhbmRsZVJlc2l6ZU9wZW5lZFBvcHVwKCl7dDM5Nl9fd2FpdEZvclBvcHVwKCkudGhlbigoZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTtlJiZ0Mzk2X2RvUmVzaXplKGUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpfX0pKX1mdW5jdGlvbiB0Mzk2X19pbml0UG9wdXBSZXNpemUoKXtkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvcHVwU2hvd2VkIix0Mzk2X19oYW5kbGVSZXNpemVPcGVuZWRQb3B1cCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJwb3B1cFNob3dlZCIsdDM5Nl9faGFuZGxlUmVzaXplT3BlbmVkUG9wdXApfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd0hlaWdodCh0KXtyZXR1cm4gdDM5Nl9fc2hvdWxkVXNlVmlzdWFsVmlld3BvcnRIZWlnaHQoKSYmdDM5Nl9faXNJblBvcHVwKHQpP3dpbmRvdy52aXN1YWxWaWV3cG9ydC5oZWlnaHQ6dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLmhlaWdodDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd1dpZHRoKHQpe3JldHVybiB0Mzk2X19pc0luUG9wdXAodCk/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOnQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfX2dldFROV2luZG93SGVpZ2h0KCl7cmV0dXJuIHdpbmRvdy50Mzk2X19pc01vYmlsZXx8d2luZG93LnQzOTZfX2lzSVBhZD9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodH1mdW5jdGlvbiB0Mzk2X19nZXRUTldpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpO2lmKHQpcmV0dXJuIHQ7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGk9dDM5Nl9fZ2V0QXhpc1hQYWRkaW5nKCk7cmV0dXJuIGkmJihlLT1pKSxlfWZ1bmN0aW9uIHQzOTZfX2dldENTU1dpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpLGU7cmV0dXJuIHR8fCh3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc0lQYWR8fHdpbmRvdy50Mzk2X19pc1NhZmFyaT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVyV2lkdGgpfWZ1bmN0aW9uIHQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnModCl7dmFyIGUsaT0odHx8e30pLmZvcmNlVXBkYXRlLHI9dm9pZCAwIT09aSYmaSxvPSF3aW5kb3cudG4ud2luZG93X3dpZHRofHwhd2luZG93LnRuLndpbmRvd19oZWlnaHR8fCF3aW5kb3cudG4ud2luZG93X3dpZHRoX2NzcyxuO3JldHVybihyfHxvKSYmdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLHt3aWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoLGhlaWdodDp3aW5kb3cudG4ud2luZG93X2hlaWdodCxjc3NXaWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoX2Nzc319ZnVuY3Rpb24gdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpe3dpbmRvdy50bi53aW5kb3dfd2lkdGg9dDM5Nl9fZ2V0VE5XaW5kb3dXaWR0aCgpLHdpbmRvdy50bi53aW5kb3dfaGVpZ2h0PXQzOTZfX2dldFROV2luZG93SGVpZ2h0KCksd2luZG93LnRuLndpbmRvd193aWR0aF9jc3M9dDM5Nl9fZ2V0Q1NTV2luZG93V2lkdGgoKX1mdW5jdGlvbiB0Mzk2X19yZXZhbGlkYXRlRGltZW5zaW9ucygpe3ZhciB0LGU9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLndpZHRoLGkscjtyZXR1cm4gdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLGUhPT10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGh9ZnVuY3Rpb24gdDM5Nl9fcmVtb3ZlSW5saW5lSGVpZ2h0KHQpeyIxLjAiIT09d2luZG93LlROX1NDQUxFX0lOSVRJQUxfVkVSJiZ0LmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0JiYodC5zdHlsZS5oZWlnaHQ9IiIpfSkpfWZ1bmN0aW9uIHQzOTZfX2NsZWFySW5pdGlhbFNjYWxlU3R5bGVzKCl7aWYoIjEuMCI9PT13aW5kb3cuVE5fU0NBTEVfSU5JVElBTF9WRVIpe3ZhciB0PWZ1bmN0aW9uIHQoZSl7dmFyIGk7ZSYmKCJ2YXIoLS1pbml0aWFsLXNjYWxlLWhlaWdodCkiPT09ZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCJoZWlnaHQiKSYmZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiaGVpZ2h0IikpfSxlO3QzOTZfX2dldFplcm9CbG9ja3MoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgaT1lLmFydGJvYXJkO2kmJihpLnN0eWxlLnJlbW92ZVByb3BlcnR5KCItLWluaXRpYWwtc2NhbGUtaGVpZ2h0IiksdChpKSx0KGkucXVlcnlTZWxlY3RvcigiLnQzOTZfX2NhcnJpZXIiKSksdChpLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKSkpfSkpfX1mdW5jdGlvbiB0Mzk2X19nbG9iYWxJbml0KCl7d2luZG93LnRufHx0Mzk2X2luaXRUTm9ial9fY3JlYXRlRGVmYXVsdCgpLHQzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKChmdW5jdGlvbigpe3QzOTZfX2FwcGx5Rml4ZXNGb3JBbGxFbGVtZW50cygpLHQzOTZfX2luaXRpYWxpemVBbmNob3JMaW5rT3ZlcmZsb3dGaXgoKSx0Mzk2X19pbml0UG9wdXBSZXNpemUoKSx0Mzk2X19jbGVhckluaXRpYWxTY2FsZVN0eWxlcygpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHQzOTZfX29uUmVzaXplKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLHQzOTZfX29uT3JpZW50YXRpb25DaGFuZ2UpfSkpfWZ1bmN0aW9uIHQzOTZfX29uUmVzaXplKCl7dDM5Nl93YWl0Rm9yRmluYWxFdmVudCgoZnVuY3Rpb24oKXt2YXIgdDt0Mzk2X19yZXZhbGlkYXRlRGltZW5zaW9ucygpJiYodDM5Nl9fZ2V0WmVyb0Jsb2NrcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVjb3JkO2lmKGUmJnQzOTZfaXNCbG9ja1Zpc2libGUoZSkpdHJ5e3QzOTZfZG9SZXNpemUoZS5pZC5yZXBsYWNlKCJyZWMiLCIiKSl9Y2F0Y2goaSl7Y29uc29sZS5lcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHJlc2l6ZSAiK2UuaWQsaSl9fSkpLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ6ZXJvOndpbmRvdy13aWR0aC1jaGFuZ2VkIikpKX0pLDUwMCwiZ2xvYmFsX3Jlc2l6ZV96ZXJvX3VuaXF1ZV9pZCIpfWZ1bmN0aW9uIHQzOTZfX29uT3JpZW50YXRpb25DaGFuZ2UoKXt0Mzk2X3dhaXRGb3JGaW5hbEV2ZW50KChmdW5jdGlvbigpe3QzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKSx0Mzk2X19nZXRaZXJvQmxvY2tzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5yZWNvcmQ7ZSYmdDM5Nl9pc0Jsb2NrVmlzaWJsZShlKSYmdDM5Nl9kb1Jlc2l6ZShlLmlkLnJlcGxhY2UoInJlYyIsIiIpKX0pKX0pLDYwMCwiZ2xvYmFsX29yaWVudGF0aW9uY2hhbmdlX3plcm9fdW5pcXVlX2lkIil9ZnVuY3Rpb24gdDM5Nl9pc09ubHlTY2FsYWJsZUJyb3dzZXIoKXtyZXR1cm4gd2luZG93LmlzT25seVNjYWxhYmxlfWZ1bmN0aW9uIHQzOTZfX2luaXRPbmx5U2NhbGFibGUoKXtpZih2b2lkIDA9PT13aW5kb3cuaXNPbmx5U2NhbGFibGUpe3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9GaXJlZm94XC8oWzAtOV0rKVwuLyksZT10P3BhcnNlSW50KHRbMV0sMTApOjEyNixpPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhbMC05XSspXC4vKSxyPWkmJnBhcnNlSW50KGlbMV0sMTApfHwwO3dpbmRvdy5pc09ubHlTY2FsYWJsZT1lPDEyNix3aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3I9IXdpbmRvdy5pc09ubHlTY2FsYWJsZSYmIXQmJnI8PTEyN319ZnVuY3Rpb24gdDM5Nl9fc2V0R2xvYmFsU2NhbGVWYXJpYWJsZXModCxlLGkpe3ZhciByPTEsbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxuPW8/by5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTpudWxsO2lmKCFuKXJldHVybiAxO3ZhciBhPXQzOTZfYWJfX2dldFdpbmRvd1dpZHRoKG4pLGw9aT9wYXJzZUZsb2F0KChhL2UpLnRvRml4ZWQoMykpOjEsZD0iYWIiK3Q7d2luZG93LnRuW2RdLnNjYWxlRmFjdG9yPWwsd2luZG93LnRuX3NjYWxlX2ZhY3Rvcj1sO3ZhciBfPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpO3JldHVybiBfJiYhd2luZG93LnRuLmlzRWRpdE1vZGUmJl8uc3R5bGUuc2V0UHJvcGVydHkoIi0tem9vbSIsbC50b1N0cmluZygpKSxsfWZ1bmN0aW9uIHQzOTZfX3Byb2Nlc3NUb3BTaGlmdCh0LGUsaSl7ImZ1bmN0aW9uIiE9dHlwZW9mIHdpbmRvdy50Mzk2X191cGRhdGVUb3BTaGlmdHx8InkiIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJzaGlmdC1wcm9jZXNzZWQiKSYmInkiIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJmaXhlZC1zaGlmdCIpfHx3aW5kb3cudDM5Nl9fdXBkYXRlVG9wU2hpZnQoZSxpKX1mdW5jdGlvbiB0Mzk2X2RvUmVzaXplKHQsZSl7ZSYmdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpO3ZhciBpPXQzOTZfaXNPbmx5U2NhbGFibGVCcm93c2VyKCkscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxvPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbj10Mzk2X2RldGVjdFJlc29sdXRpb24odCksYTtpZih0Mzk2X3JlbW92ZUVsZW1lbnRGcm9tRE9NKHI/ci5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fc2NhbGUtc3R5bGUiKTpudWxsKSxpKXt2YXIgbD1yP3IucXVlcnlTZWxlY3RvckFsbCgiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpOltdO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCl7aWYoIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tIil8fCF0LmNsb3Nlc3QoIi50bi1tb2xlY3VsZSIpKXt2YXIgZT10LmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIiksaT1lP2UucGFyZW50Tm9kZTpudWxsO2kmJmkucmVtb3ZlQ2hpbGQoZSksaSYmaS5hcHBlbmRDaGlsZCh0KX19KSl9ZWxzZXt2YXIgZD1yP3IucXVlcnlTZWxlY3RvckFsbCgiLnQzOTZfX2VsZW0sIC50Mzk2X19ncm91cCIpOltdO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCwoZnVuY3Rpb24odCl7dC5zdHlsZS56b29tPSIiO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtlJiYoZS5zdHlsZS50cmFuc2Zvcm1PcmlnaW49IiIsZS5zdHlsZS5mb250U2l6ZT0iIixlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSIiKX0pKX10Mzk2X3N3aXRjaFJlc29sdXRpb24odCxuKTt2YXIgXz1yP3IucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbCxzPSJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShfLCJ1cHNjYWxlIiksdT10Mzk2X19zZXRHbG9iYWxTY2FsZVZhcmlhYmxlcyh0LG4scyk7dDM5Nl9fc2V0U2NhbGVGYWN0b3JGb3JFbGVtZW50cyh0LHUpLHQzOTZfdXBkYXRlVE5vYmoodCksdDM5Nl9hYl9fcmVuZGVyVmlldyhfKTt2YXIgYz1vP28uZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKToiIjtzJiYiZWRpdCIhPT1jJiZ0X29uRnVuY0xvYWQoInQzOTZfc2NhbGVCbG9jayIsKGZ1bmN0aW9uKCl7dDM5Nl9zY2FsZUJsb2NrKHQpfSkpLCJlZGl0IiE9PWMmJiJ5Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoXywiZml4ZWQtbmVlZC1qcyIpJiZ0X29uRnVuY0xvYWQoInQzOTZfX3Byb2Nlc3NGaXhlZEFydEJvYXJkIiwoZnVuY3Rpb24oKXt0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZChfKX0pKSx0Mzk2X19wcm9jZXNzQWJzb2x1dGVBcnRCb2FyZChfKSx0Mzk2X19wcm9jZXNzVG9wU2hpZnQoXyx0LCEwKSx0Mzk2X2FsbGVsZW1zX19yZW5kZXJWaWV3KF8pLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3KF8pLHQzOTZfX2FwcGx5Rml4ZXNGb3JBbGxFbGVtZW50cygpLHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQoXyksXyYmXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYXJ0Qm9hcmRSZXNpemVkIikpO3ZhciBmPSJodWciPT09Xy5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpO18mJiFmJiYod2luZG93LnQzOTZfX2lzTW9iaWxlfHx0Mzk2X19yZW1vdmVJbmxpbmVIZWlnaHQoW18sXy5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLF8ucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpXSkpfWZ1bmN0aW9uIHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQodCl7dmFyIGUsaTtpZigiaHVnIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodG1vZGUiKSl7dmFyIHI9dDM5Nl9fZ2V0QXV0b0hlaWdodCh0KSxvPXQub2Zmc2V0SGVpZ2h0O2lmKCEoTWF0aC5hYnMoci1vKTw9LjcpKXt2YXIgbixhPSJhYiIrdC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxsPXdpbmRvdy50blthXS5jdXJSZXNvbHV0aW9uLGQ7bD09PXdpbmRvdy50blthXS5jdXJSZXNvbHV0aW9uX21heD90LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHQiLHIpOnQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodC1yZXMtIitsLHIpLHQzOTZfYWJfX3JlbmRlclZpZXcodCksbnVsbD09KGU9dC5jbG9zZXN0KCIudDM5NiIpKXx8ZS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiemVybzpoZWlnaHQtY2hhbmdlZCIpKX19fWZ1bmN0aW9uIHQzOTZfX2dldEF1dG9IZWlnaHQodCl7dmFyIGUsaT10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpLHI9QXJyYXkuZnJvbSh0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpzY29wZSA+IC50bi1ncm91cCwgOnNjb3BlID4gLnRuLWVsZW0iKSksbz10LnN0eWxlLmhlaWdodCxuO2lmKHQzOTZfX2F1dG9IZWlnaHRfX2NhbkF1dG9jYWxjdWxhdGVIZWlnaHQodCxyKSYmbyl7dmFyIGE9dC5zdHlsZS5oZWlnaHQ7dC5zdHlsZS5oZWlnaHQ9ImF1dG8iLGU9dC5vZmZzZXRIZWlnaHQsdC5zdHlsZS5oZWlnaHQ9YX1lbHNlIGU9ci5yZWR1Y2UoKGZ1bmN0aW9uKGUscil7dmFyIG89dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHIsImF4aXN5Iiksbj10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUociwidG9wdW5pdHMiKSxhPXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZShyLCJoZWlnaHR1bml0cyIpO2lmKCIlIj09PW58fCIlIj09PWF8fCJib3R0b20iPT09b3x8ImNlbnRlciI9PT1vKXJldHVybiBlO3ZhciBsPTA7aWYoImdhbGxlcnkiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIikmJihsPXQzOTZfX2F1dG9IZWlnaHRfX2dldEFkZGl0aW9uYWxPZmZzZXRGb3JHYWxsZXJ5KHIpKSxpKXt2YXIgZD10Mzk2X19hYl9fZ2V0UGFkZGluZ1ZhbHVlKHQsInBhZGRpbmdib3R0b20iKTtsKz1wYXJzZUludChkLDEwKX12YXIgXz1yLm9mZnNldFRvcCtyLm9mZnNldEhlaWdodCtsLHMsdSxjOyJ3aW5kb3ciIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJ1cHNjYWxlIil8fHdpbmRvdy50bi5pc0VkaXRNb2RlfHwoXyo9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpKTtyZXR1cm4gXz5lP186ZX0pLC0xLzApO3JldHVybiBlPT09LTEvMD8wOmV9ZnVuY3Rpb24gdDM5Nl9fYXV0b0hlaWdodF9fZ2V0QWRkaXRpb25hbE9mZnNldEZvckdhbGxlcnkodCl7dmFyIGU9MCxpPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fdGl0bGUiKSxyPSJub25lIiE9PXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZSh0LCJzbGRzX2RvdHNjb250cm9scyIpLG89InVuZGVyIj09PXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZSh0LCJzbGRzX2Fycm93Y29udHJvbHMiKTtpZihpfHxyfHxvKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX3RpdGxlIiksYT1uP24ub2Zmc2V0SGVpZ2h0OjAsbD10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NhcHRpb24udC1zbGRzX19jYXB0aW9uLWFjdGl2ZSIpLGQ9Z2V0Q29tcHV0ZWRTdHlsZShsKSxfO2UrPXBhcnNlSW50KGQubWFyZ2luVG9wLDEwKSthfXJldHVybiBpfHwhciYmIW98fChlLT0yMCksZX1mdW5jdGlvbiB0Mzk2X19hdXRvSGVpZ2h0X19jYW5BdXRvY2FsY3VsYXRlSGVpZ2h0KHQsZSl7dmFyIGkscjtpZighdC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSlyZXR1cm4hMTtpZihlLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiJnYWxsZXJ5Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpfSkpKXt2YXIgbz10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImZsZXhkaXJlY3Rpb24iKSxuPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiZmxleGFsaWduaXRlbXMiKSxhPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiZmxleGp1c3RpZnljb250ZW50IiksbDtyZXR1cm4icm93Ij09PW8mJiJmbGV4LWVuZCI9PT1ufHwiY29sdW1uIj09PW8mJiJmbGV4LWVuZCI9PT1hfXJldHVybiEwfWZ1bmN0aW9uIHQzOTZfX2FiX19nZXRQYWRkaW5nVmFsdWUodCxlKXt2YXIgaT0odDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJwYWRkaW5nIil8fCIwcHggMHB4IDBweCAwcHgiKS5zcGxpdCgiICIpLHI9e3BhZGRpbmd0b3A6aVswXSxwYWRkaW5ncmlnaHQ6aVsxXSxwYWRkaW5nYm90dG9tOmlbMl0scGFkZGluZ2xlZnQ6aVszXX07cmV0dXJuIHBhcnNlSW50KHJbZV0sMTApfHwwfWZ1bmN0aW9uIHQzOTZfX3Byb2Nlc3NBYnNvbHV0ZUFydEJvYXJkKHQpe2lmKHQpe3ZhciBlPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwicG9zIik7aWYoImZpeGVkIiE9PWUpe3ZhciBpPSJ0Mzk2X19hcnRib2FyZC1maXhlZC1uby1iZyI7aWYoImFic29sdXRlIj09PWUpe3ZhciByPWdldENvbXB1dGVkU3R5bGUodCksbz10LnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKSxuPSFvfHwibm9uZSI9PT1nZXRDb21wdXRlZFN0eWxlKG8pLmJhY2tncm91bmRJbWFnZSxhLGw9InJnYmEoMCwgMCwgMCwgMCkiPT09ci5iYWNrZ3JvdW5kQ29sb3ImJiJub25lIj09PXIuYmFja2dyb3VuZEltYWdlJiZuPyJhZGQiOiJyZW1vdmUiO3QuY2xhc3NMaXN0W2xdKGkpfWVsc2UgdC5jbGFzc0xpc3QucmVtb3ZlKGkpfX19ZnVuY3Rpb24gdDM5Nl9kZXRlY3RSZXNvbHV0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO3ZhciBlLGk9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLmNzc1dpZHRoLHI9ImFiIit0LG87cmV0dXJuIHdpbmRvdy50bltyXS5zY3JlZW5zLmZvckVhY2goKGZ1bmN0aW9uKHQpe2k+PXQmJihvPXQpfSkpLHZvaWQgMD09PW8mJihvPXdpbmRvdy50bltyXS5zY3JlZW5zWzBdKSxvfWZ1bmN0aW9uIHQzOTZfaW5pdFROb2JqX19jcmVhdGVEZWZhdWx0KCl7d2luZG93LnRuPXt9LHdpbmRvdy50bi5hYl9maWVsZHM9WyJoZWlnaHQiLCJ3aWR0aCIsImJnY29sb3IiLCJiZ2ltZyIsImJnYXR0YWNobWVudCIsImJncG9zaXRpb24iLCJmaWx0ZXJvcGFjaXR5IiwiZmlsdGVyY29sb3IiLCJmaWx0ZXJvcGFjaXR5MiIsImZpbHRlcmNvbG9yMiIsImhlaWdodF92aCIsInZhbGlnbiJdfWZ1bmN0aW9uIHQzOTZfaW5pdFROb2JqKHQsZSl7ZSYmKHdpbmRvdy50bnx8dDM5Nl9pbml0VE5vYmpfX2NyZWF0ZURlZmF1bHQoKSx0Mzk2X3NldFNjcmVlbnNUTm9iaih0LGUpKX1mdW5jdGlvbiB0Mzk2X3NldFNjcmVlbnNUTm9iaih0LGUpe3ZhciBpPSJhYiIrdDt3aW5kb3cudG5baV09e30sd2luZG93LnRuW2ldLnNjcmVlbnM9W107dmFyIHI9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtc2NyZWVucyIpO3I/KHI9ci5zcGxpdCgiLCIpKS5mb3JFYWNoKChmdW5jdGlvbih0KXt3aW5kb3cudG5baV0uc2NyZWVucy5wdXNoKHBhcnNlSW50KHQsMTApKX0pKTp3aW5kb3cudG5baV0uc2NyZWVucz1bMzIwLDQ4MCw2NDAsOTYwLDEyMDBdfWZ1bmN0aW9uIHQzOTZfX2dldEF4aXNYUGFkZGluZygpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksZT1Cb29sZWFuKHdpbmRvdy50aWxkYU1lbWJlcnMpfHwiYWxscmVjb3JkcyI9PT13aW5kb3cuemVyb193aW5kb3dfd2lkdGhfaG9vayxpLHI7cmV0dXJuIHQmJmUmJltkb2N1bWVudC5ib2R5LHRdLnJlZHVjZSgoZnVuY3Rpb24odCxlKXt2YXIgaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5wYWRkaW5nTGVmdCxyPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLnBhZGRpbmdSaWdodDtyZXR1cm4gdCtwYXJzZUludChpLDEwKStwYXJzZUludChyLDEwKX0pLDApfHwwfWZ1bmN0aW9uIHQzOTZfdXBkYXRlVE5vYmoodCl7Zm9yKHZhciBlLGk9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLndpZHRoLHI9ImFiIit0LG89d2luZG93LnRuW3JdLnNjcmVlbnMuc2xpY2UoKS5yZXZlcnNlKCksbj0wO248by5sZW5ndGg7bisrKXdpbmRvdy50bltyXS5jdXJSZXNvbHV0aW9uPT09b1tuXSYmKHdpbmRvdy50bltyXS5jYW52YXNfbWluX3dpZHRoPW9bbl0sd2luZG93LnRuW3JdLmNhbnZhc19tYXhfd2lkdGg9MD09PW4/aTpvW24tMV0pO3ZhciBhPSJhbGxyZWNvcmRzIj09PXdpbmRvdy56ZXJvX3dpbmRvd193aWR0aF9ob29rO3dpbmRvdy50bltyXS5ncmlkX3dpZHRoPXdpbmRvdy50bltyXS5jYW52YXNfbWluX3dpZHRoO3ZhciBsPShpLXdpbmRvdy50bltyXS5ncmlkX3dpZHRoKS8yO3dpbmRvdy50bltyXS5ncmlkX29mZnNldF9sZWZ0PWw8MCYmYT8wOmx9ZnVuY3Rpb24gdDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsZSl7dmFyIGk9ImFiIit0LHI9d2luZG93LnRuW2ldLnNjcmVlbnNbd2luZG93LnRuW2ldLnNjcmVlbnMubGVuZ3RoLTFdO3dpbmRvdy50bltpXS5jdXJSZXNvbHV0aW9uPWUsd2luZG93LnRuW2ldLmN1clJlc29sdXRpb25fbWF4PXIsd2luZG93LnRuLmN1clJlc29sdXRpb249ZSx3aW5kb3cudG4uY3VyUmVzb2x1dGlvbl9tYXg9cn1mdW5jdGlvbiB0Mzk2X2FydGJvYXJkX2J1aWxkKHQsZSl7dmFyIGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrZSkscj1pP2kucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZihyKXt0Mzk2X2FiX19yZW5kZXJWaWV3KHIpLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3KHIpO3ZhciBvPXIucXVlcnlTZWxlY3RvckFsbCgiLnRuLWVsZW0iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3ZhciBpO3N3aXRjaCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSl7Y2FzZSJ0ZXh0Ijp0Mzk2X2FkZFRleHQocix0KTticmVhaztjYXNlImltYWdlIjp0Mzk2X2FkZEltYWdlKHIsdCk7YnJlYWs7Y2FzZSJzaGFwZSI6dDM5Nl9hZGRTaGFwZShyLHQpO2JyZWFrO2Nhc2UiYnV0dG9uIjp0Mzk2X2FkZEJ1dHRvbihyLHQpO2JyZWFrO2Nhc2UidmlkZW8iOnQzOTZfYWRkVmlkZW8ocix0KTticmVhaztjYXNlImh0bWwiOnQzOTZfYWRkSHRtbChyLHQpO2JyZWFrO2Nhc2UidG9vbHRpcCI6dDM5Nl9hZGRUb29sdGlwKHIsdCk7YnJlYWs7Y2FzZSJmb3JtIjp0Mzk2X2FkZEZvcm0ocix0LGUpO2JyZWFrO2Nhc2UiZ2FsbGVyeSI6dDM5Nl9hZGRHYWxsZXJ5KHIsdCxlKTticmVhaztjYXNlInZlY3RvciI6dDM5Nl9hZGRWZWN0b3Iocix0KX19KSksci5jbGFzc0xpc3QucmVtb3ZlKCJyZW5kZXJpbmciKSxyLmNsYXNzTGlzdC5hZGQoInJlbmRlcmVkIiksci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgiYXJ0Qm9hcmRSZW5kZXJlZCIse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pKTt2YXIgbj1yLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1vdnJmbHciKTtpZihbInZpc2libGUiLCJ2aXNpYmxlWCJdLmluY2x1ZGVzKG4pJiYodDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoInRTdG9yZUdhbGxlcnlJbml0aWFsaXplZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKX0pKSksImF1dG8iPT09bil7dmFyIGE9TWF0aC5hYnMoci5vZmZzZXRIZWlnaHQtci5jbGllbnRIZWlnaHQpOzAhPT1hJiYoci5zdHlsZS5wYWRkaW5nQm90dG9tPWErInB4Iil9aWYod2luZG93LnQzOTZfX2lzTW9iaWxlfHx3aW5kb3cudDM5Nl9faXNJUGFkKXt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2wudGV4dENvbnRlbnQ9IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxMzY2cHgpIGFuZCAob3JpZW50YXRpb246bGFuZHNjYXBlKSBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzoyKSB7LnQzOTZfX2NhcnJpZXIge2JhY2tncm91bmQtYXR0YWNobWVudDpzY3JvbGwhaW1wb3J0YW50O319IixpLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixsKX19fWZ1bmN0aW9uIHQzOTZfYWJfX3JlbmRlclZpZXcodCl7aWYodCl7Zm9yKHZhciBlPXdpbmRvdy50bi5hYl9maWVsZHMsaT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHIsbz0wO288ZS5sZW5ndGg7bysrKXQzOTZfYWJfX3JlbmRlclZpZXdPbmVGaWVsZCh0LGVbb10pO3ZhciBuPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0IiksYT10Mzk2X2FiX19nZXRIZWlnaHQodCksbCxkPXQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3Rvcih0LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpKSxfPSEhaSYmImVkaXQiPT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpLHM9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsInVwc2NhbGUiKSx1LGMsZjtpZihyPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0X3ZoIikscyYmIV8mJnImJih1PXBhcnNlSW50KG4sMTApKmQpLG49PT1hfHx1JiZ1Pj1hKWM9MDtlbHNlIHN3aXRjaCh0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsInZhbGlnbiIpKXtjYXNlInRvcCI6ZGVmYXVsdDpjPTA7YnJlYWs7Y2FzZSJjZW50ZXIiOmM9dT9wYXJzZUZsb2F0KCgoYS11KS8yKS50b0ZpeGVkKDEpKTpwYXJzZUZsb2F0KCgoYS1uKS8yKS50b0ZpeGVkKDEpKTticmVhaztjYXNlImJvdHRvbSI6Yz11P3BhcnNlRmxvYXQoKGEtdSkudG9GaXhlZCgxKSk6cGFyc2VGbG9hdCgoYS1uKS50b0ZpeGVkKDEpKTticmVhaztjYXNlInN0cmV0Y2giOmM9MCxuPWF9dC5zZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLW9mZnNldC10b3AiLGMpLHQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1pbi1oZWlnaHQiLG4pLHQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1heC1oZWlnaHQiLGEpO3ZhciBnPXQucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpLHc9dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLHA7aWYocj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodF92aCIpLHI9cGFyc2VGbG9hdChyKSwod2luZG93LnQzOTZfX2lzTW9iaWxlfHx3aW5kb3cudDM5Nl9faXNJUGFkKSYmcil7dmFyIGg9dDM5Nl9hYl9fZ2V0V2luZG93SGVpZ2h0KHQpKnIvMTAwO3Quc3R5bGUuaGVpZ2h0PWgrInB4IixnJiYoZy5zdHlsZS5oZWlnaHQ9aCsicHgiKSx3JiYody5zdHlsZS5oZWlnaHQ9aCsicHgiKX0iaHVnIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodG1vZGUiKSYmIXImJih0LnN0eWxlLmhlaWdodD1uKyJweCIsZyYmKGcuc3R5bGUuaGVpZ2h0PW4rInB4IiksdyYmKHcuc3R5bGUuaGVpZ2h0PW4rInB4IikpfX1mdW5jdGlvbiB0Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3IodCl7dmFyIGU9ImFiIit0LGk7cmV0dXJuIHdpbmRvdy50biYmd2luZG93LnRuW2VdJiZ3aW5kb3cudG5bZV0uc2NhbGVGYWN0b3J8fHdpbmRvdy50bl9zY2FsZV9mYWN0b3J9ZnVuY3Rpb24gdDM5Nl9fc2V0U2NhbGVGYWN0b3JGb3JFbGVtZW50cyh0LGUpe3ZhciBpPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpLHI9aT9pLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGw7aWYocil7dmFyIG89ci5xdWVyeVNlbGVjdG9yQWxsKCIudDM5Nl9fZWxlbSwgLnRuLWdyb3VwIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LnNjYWxlRmFjdG9yPWV9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkVGV4dCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9InRvcCxsZWZ0LHdpZHRoLGhlaWdodCxjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiO2kuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpfX1mdW5jdGlvbiB0Mzk2X2FkZEltYWdlKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0iaW1nLHdpZHRoLGZpbGV3aWR0aCxmaWxlaGVpZ2h0LHRvcCxsZWZ0LGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyI7aS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSk7dmFyIG89aS5xdWVyeVNlbGVjdG9yKCJpbWciKTtvJiYoby5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXtkb2N1bWVudC5jb250YWlucyhvKSYmKHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpLG8uc3JjJiZzZXRUaW1lb3V0KChmdW5jdGlvbigpe2RvY3VtZW50LmNvbnRhaW5zKG8pJiYodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIiksdDM5Nl9fdXBkYXRlQXV0b0hlaWdodCh0KSl9KSwyZTMpKX0pKSxvLmNvbXBsZXRlJiYodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIiksby5zcmMmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuY29udGFpbnMobykmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKSx0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHQpKX0pLDJlMykpLG8uYWRkRXZlbnRMaXN0ZW5lcigidHV3aWRnZXRfZG9uZSIsKGZ1bmN0aW9uKCl7dDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIil9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X2NoYW5nZUZpbHRlck9uU2FmYXJpKGkpfSkpKX19ZnVuY3Rpb24gdDM5Nl9hZGRTaGFwZSh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO3IrPSJjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxoZWlnaHR1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiLGkuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpfX1mdW5jdGlvbiB0Mzk2X2NoYW5nZUZpbHRlck9uU2FmYXJpKHQpe3ZhciBlO2lmKC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJih0Mzk2X19jaGVja0NvbnRhaW5CYWNrZHJvcEZpbHRlcih0KSYmIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdykpe3ZhciBpPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKSxyO25ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24oZSxpKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUuaXNJbnRlcnNlY3Rpbmcpe3ZhciByPWUudGFyZ2V0O2kudW5vYnNlcnZlKHIpLHQzOTZfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCl9fSkpfSkpLm9ic2VydmUoaSl9fWZ1bmN0aW9uIHQzOTZfX2NoZWNrQ29udGFpbkJhY2tkcm9wRmlsdGVyKHQpe2lmKCF0KXJldHVybiExO3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLndlYmtpdEJhY2tkcm9wRmlsdGVyO2lmKGUmJiJub25lIiE9PWUpcmV0dXJuITA7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciwgLnRuLWF0b21fX3ByeC13cmFwcGVyLCAudG4tYXRvbV9fc3RpY2t5LXdyYXBwZXIiKTtpZighaSlyZXR1cm4hMTt2YXIgcj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpKS53ZWJraXRCYWNrZHJvcEZpbHRlcjtyZXR1cm4gciYmIm5vbmUiIT09cn1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpe2lmKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLW9wdHMiKSxpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtcHJ4Iil8fHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtZml4Iikscj1lfHxpLG89dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2VsZW0tLWJhY2tkcm9wLWZpbHRlci1pbWctd3JhcHBlcmVkIik7ciYmb3x8IXI/dDM5Nl9fdXBkYXRlQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpOnQuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2Ryb3BGaWx0ZXJJbWdXcmFwcGVyZWQiLChmdW5jdGlvbigpe3QzOTZfX3VwZGF0ZUJhY2tkcm9wRmlsdGVyT25JbWFnZSh0KX0pKX19ZnVuY3Rpb24gdDM5Nl9fdXBkYXRlQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpe2lmKHQpe3ZhciBlPXQsaT1lLnF1ZXJ5U2VsZWN0b3IoImltZyIpLHI9ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciwgLnRuLWF0b21fX3ByeC13cmFwcGVyLCAudG4tYXRvbV9fc3RpY2t5LXdyYXBwZXIiKSxvPSIiO3ImJihlPXIsbz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS53ZWJraXRCYWNrZHJvcEZpbHRlcnx8IiIpLGUuc3R5bGUud2Via2l0QmFja2Ryb3BGaWx0ZXI9Im5vbmUiLHQzOTZfd2FpdEZvclVwbG9hZEltZyhpLChmdW5jdGlvbigpe2Uuc3R5bGUud2Via2l0QmFja2Ryb3BGaWx0ZXI9b30pKX19ZnVuY3Rpb24gdDM5Nl93YWl0Rm9yVXBsb2FkSW1nKHQsZSl7aWYoInkiPT09d2luZG93LmxhenkpdmFyIGk9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmNsYXNzTGlzdC5jb250YWlucygibG9hZGVkIikmJnQuY2xpZW50V2lkdGgmJnQuc3JjPyhlKCksY2xlYXJUaW1lb3V0KGkpKTp0Mzk2X3dhaXRGb3JVcGxvYWRJbWcodCxlKX0pLDMwMCk7ZWxzZSBlKCl9ZnVuY3Rpb24gdDM5Nl9hZGRCdXR0b24odCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKCFpKXJldHVybiBudWxsO3ZhciByPSJ0b3AsbGVmdCx3aWR0aCxoZWlnaHQsY29udGFpbmVyLGF4aXN4LGF4aXN5LGNhcHRpb24sbGVmdHVuaXRzLHRvcHVuaXRzIjtyZXR1cm4gaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSksaX1mdW5jdGlvbiB0Mzk2X2FkZFZpZGVvKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7cis9ImNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSksdF9vbkZ1bmNMb2FkKCJ0Mzk2X2luaXRWaWRlbyIsKGZ1bmN0aW9uKCl7dDM5Nl9pbml0VmlkZW8oaSl9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkSHRtbCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO3IrPSJjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxoZWlnaHR1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiLGkuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpfX1mdW5jdGlvbiB0Mzk2X2FkZFRvb2x0aXAodCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJ3aWR0aCxoZWlnaHQsdG9wLGxlZnQsIjtyKz0iY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsaGVpZ2h0dW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzLHRpcHBvc2l0aW9uIixpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKSx0X29uRnVuY0xvYWQoInQzOTZfaW5pdFRvb2x0aXAiLChmdW5jdGlvbigpe3QzOTZfaW5pdFRvb2x0aXAoaSl9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkRm9ybSh0LGUsaSl7dmFyIHI9dDM5Nl9nZXRFbChlKTtpZihyKXt2YXIgbz0id2lkdGgsdG9wLGxlZnQsIjtvKz0iaW5wdXRzLGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsci5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixvKTt2YXIgbj10Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZShyKSxhPXIuZ2V0QXR0cmlidXRlKCJkYXRhLWZlLWVsZW0taWQiKXx8ci5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpO3Rfb25GdW5jTG9hZCgidF96ZXJvRm9ybXNfX2luaXQiLChmdW5jdGlvbigpe3QzOTZfZWxlbV9fcmVuZGVyVmlldyhyKSx0X3plcm9Gb3Jtc19faW5pdChpLGEsbiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KHIpfSkpfX1mdW5jdGlvbiB0Mzk2X2FkZEdhbGxlcnkodCxlLGkpe3ZhciByPXQzOTZfZ2V0RWwoZSk7aWYocil7dmFyIG89IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO28rPSJpbWdzLGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsci5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixvKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcocik7dmFyIG49ci5nZXRBdHRyaWJ1dGUoImRhdGEtZmUtZWxlbS1pZCIpfHxyLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIik7dF9vbkZ1bmNMb2FkKCJ0X3plcm9HYWxsZXJ5X19pbml0IiwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19pbml0KGksbil9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkVmVjdG9yKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsZmlsZXdpZHRoLGZpbGVoZWlnaHQsdG9wLGxlZnQsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIjtpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKX19ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KTtpZighaSlyZXR1cm4gbnVsbDtpZihpLmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSlyZXR1cm4gdDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShpLGUpO3ZhciByPWkuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIiksbz1yLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG49ImFiIitvLGE7dm9pZCAwPT09d2luZG93LnRuW25dJiYodDM5Nl9pbml0VE5vYmoobyxyKSx0Mzk2X3N3aXRjaFJlc29sdXRpb24obyx0Mzk2X2RldGVjdFJlc29sdXRpb24obykpKTt2YXIgbD13aW5kb3cudG5bbl0uY3VyUmVzb2x1dGlvbixkPXdpbmRvdy50bltuXS5jdXJSZXNvbHV0aW9uX21heCxfPXdpbmRvdy50bltuXS5zY3JlZW5zLHM7aWYoIShzPWw9PT1kP2kuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLSIrZSsiLXZhbHVlIik6aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtIitlKyItcmVzLSIrbCsiLXZhbHVlIikpJiYiIiE9PXMpZm9yKHZhciB1PTA7dTxfLmxlbmd0aDt1Kyspe3ZhciBjPV9bdV07aWYoIShjPD1sKSYmKHM9Yz09PWQ/aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtIitlKyItdmFsdWUiKTppLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC0iK2UrIi1yZXMtIitjKyItdmFsdWUiKSkpYnJlYWt9dmFyIGY9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihzKTtyZXR1cm4gZiYmKHM9Zi5mYWxsYmFjayksc31mdW5jdGlvbiB0Mzk2X2VsZW1fX3JlbmRlclZpZXcodCl7dmFyIGU9dDM5Nl9nZXRFbCh0KSxpPWU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIik6IiI7aSYmKGk9aS5zcGxpdCgiLCIpKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChlLHQpfSkpfWZ1bmN0aW9uIHQzOTZfZ3JvdXBfX3JlbmRlclZpZXcodCl7dmFyIGU9dD90LmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiKToiIjtlJiYoZT1lLnNwbGl0KCIsIikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBpPXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCxlKTtzd2l0Y2goZSl7Y2FzZSJsZWZ0IjppPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZSh0LGUsaSksdC5zdHlsZS5sZWZ0PXBhcnNlRmxvYXQoaSkudG9GaXhlZCgxKSsicHgiO2JyZWFrO2Nhc2UidG9wIjppPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZSh0LGUsaSksdC5zdHlsZS50b3A9cGFyc2VGbG9hdChpKS50b0ZpeGVkKDEpKyJweCI7YnJlYWs7Y2FzZSJjb250YWluZXIiOnQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKHQsImxlZnQiKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZCh0LCJ0b3AiKX19KSl9ZnVuY3Rpb24gdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQodCxlKXt2YXIgaT10Mzk2X2dldEVsKHQpO2lmKGkpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbz1yP3IuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKToiIixuLGE9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKGkuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIiksInVwc2NhbGUiKTtpZigieWVzIiE9PWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIpfHwhYXx8ImVkaXQiPT09byl7dmFyIGw9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksZSksZCxfPVsiZmlsbCIsImh1ZyJdLHM9dDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbShpKTtzd2l0Y2goZSl7Y2FzZSJsZWZ0IjpsPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShpLGUsbCksbD1zP3QzOTZfX3pvb21pZnlWYWx1ZShpLGwpOnBhcnNlRmxvYXQobCkudG9GaXhlZCgxKSsicHgiLGkuc3R5bGUubGVmdD1sO2JyZWFrO2Nhc2UidG9wIjpsPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShpLGUsbCksbD1zP3QzOTZfX3pvb21pZnlWYWx1ZShpLGwpOnBhcnNlRmxvYXQobCkudG9GaXhlZCgxKSsicHgiLGkuc3R5bGUudG9wPWw7YnJlYWs7Y2FzZSJ3aWR0aCI6ZD1pLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTt2YXIgdT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwid2lkdGhtb2RlIiksYztpZigoYz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwidGV4dGZpdCIpKXx8KCJidXR0b24iPT09ZD9jPSJmaXhlZHNpemUiOiJ0ZXh0Ij09PWQmJihjPSJhdXRvaGVpZ2h0IikpLCgidGV4dCI9PT1kfHwiYnV0dG9uIj09PWQpJiYiYXV0b3dpZHRoIj09PWMpcmV0dXJuIHZvaWQoaS5zdHlsZS53aWR0aD0iYXV0byIpO2lmKF8uaW5jbHVkZXModSkpcmV0dXJuIHZvaWQoaS5zdHlsZS53aWR0aD0iIik7c3dpdGNoKGw9dDM5Nl9lbGVtX19nZXRXaWR0aChpLGwpLGkuc3R5bGUud2lkdGg9cGFyc2VGbG9hdChsKS50b0ZpeGVkKDEpKyJweCIsZCl7Y2FzZSJ0b29sdGlwIjp2YXIgZj1pLnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1hdG9tX19waW4taWNvbiIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZiwoZnVuY3Rpb24odCl7dmFyIGU9cGFyc2VGbG9hdChsKS50b0ZpeGVkKDEpKyJweCI7dC5zdHlsZS53aWR0aD1lLHQuc3R5bGUuaGVpZ2h0PWV9KSksaS5zdHlsZS5oZWlnaHQ9cGFyc2VJbnQobCkudG9GaXhlZCgxKSsicHgiO2JyZWFrO2Nhc2UiZ2FsbGVyeSI6dDM5Nl9lbGVtX19zZXRHYWxsZXJ5U2l6ZShpLCJ3aWR0aCIsbCl9YnJlYWs7Y2FzZSJoZWlnaHQiOmQ9aS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7dmFyIGc9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImhlaWdodG1vZGUiKSxjO2lmKChjPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ0ZXh0Zml0IikpfHwoImJ1dHRvbiI9PT1kP2M9ImZpeGVkc2l6ZSI6InRleHQiPT09ZCYmKGM9ImF1dG9oZWlnaHQiKSksKCJ0ZXh0Ij09PWR8fCJidXR0b24iPT09ZCkmJlsiYXV0b3dpZHRoIiwiYXV0b2hlaWdodCIsInNpbmdsZWxpbmUiXS5pbmNsdWRlcyhjKSlyZXR1cm4gdm9pZChpLnN0eWxlLmhlaWdodD0iYXV0byIpO2lmKF8uaW5jbHVkZXMoZykmJiJ0b29sdGlwIiE9PWQpcmV0dXJuIHZvaWQoaS5zdHlsZS5oZWlnaHQ9IiIpO2lmKCJ0b29sdGlwIj09PWQpcmV0dXJuO2w9dDM5Nl9lbGVtX19nZXRIZWlnaHQoaSxsKSxpLnN0eWxlLmhlaWdodD1wYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4IiwiZ2FsbGVyeSI9PT1kJiZ0Mzk2X2VsZW1fX3NldEdhbGxlcnlTaXplKGksImhlaWdodCIsbCk7YnJlYWs7Y2FzZSJjb250YWluZXIiOnQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksImxlZnQiKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKTticmVhaztjYXNlImlucHV0cyI6dHJ5e2w9dDM5Nl9lbGVtX19nZXRGb3JtSW5wdXRzVmFsdWUoaSksd2luZG93LnRfemVyb0Zvcm1zX19yZW5kZXJGb3JtKGksbCl9Y2F0Y2godyl7fX0id2lkdGgiIT09ZSYmImhlaWdodCIhPT1lJiYiZm9udHNpemUiIT09ZSYmImZvbnRmYW1pbHkiIT09ZSYmImxldHRlcnNwYWNpbmciIT09ZSYmImZvbnR3ZWlnaHQiIT09ZSYmImltZyIhPT1lfHwodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwibGVmdCIpLHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpKX19fWZ1bmN0aW9uIHQzOTZfZWxlbV9fc2V0R2FsbGVyeVNpemUodCxlLGkpe3ZhciByPWksbz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwiYm9yZGVyd2lkdGgiKSxuPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LCJib3JkZXJzdHlsZSIpO24mJm8mJiJub25lIiE9PW58fChvPTApLHItPTIqbzt2YXIgYT1NYXRoLnJvdW5kKHBhcnNlRmxvYXQocikpKyJweCI7YT0id2lkdGgiPT09ZXx8ImhlaWdodCI9PT1lP3QzOTZfX3pvb21pZnlWYWx1ZSh0LGEse3JvdW5kOiEwfSk6dDM5Nl9fem9vbWlmeVZhbHVlKHQsYSk7dmFyIGw9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19tYWluIiksZD10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1hdG9tX19zbGRzLWltZyIpO3Quc3R5bGVbZV09YSxsJiYobC5zdHlsZVtlXT1hKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsKGZ1bmN0aW9uKHQpe3Quc3R5bGVbZV09YX0pKX1mdW5jdGlvbiB0Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUodCxlLGkpe3ZhciByPXQzOTZfZ2V0RWwodCk7aWYoIXIpcmV0dXJuIG51bGw7dmFyIG89ci5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxuPW8uZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksYT0iYWIiK24sbD10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sInZhbGlnbiIpLGQ9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sInVwc2NhbGUiKSxfPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikscyx1PSJlZGl0Ij09PShfP18uZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKToiIiksYz10Mzk2X2lzT25seVNjYWxhYmxlQnJvd3NlcigpLGY9IXUmJmQmJmMsZz0hdSYmZCYmIWMsdz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUociwiYXhpc3kiKSxwPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShyLCJheGlzeCIpLGg9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsImNvbnRhaW5lciIpLG09ci5jbGFzc0xpc3QuY29udGFpbnMoInRuLWdyb3VwIikmJiJwaHlzaWNhbCI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHIsInR5cGUiKSxiPXIucGFyZW50Tm9kZS5jbG9zZXN0KCIudG4tZ3JvdXAiKSx2PSJwaHlzaWNhbCI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsInR5cGUiKTttJiYoaD1ofHwiZ3JpZCIpO3ZhciB5PXBhcnNlSW50KGkpLEYsQSxTLHgsVixFLEksaz10Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3Iobik7c3dpdGNoKGUpe2Nhc2UibGVmdCI6dmFyIHosTD10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGgsQjtpZihGPSJncmlkIj09PWg/ImdyaWQiOiJ3aW5kb3ciLEE9ImdyaWQiPT09aD93aW5kb3cudG5bYV0uZ3JpZF9vZmZzZXRfbGVmdDowLFY9ImdyaWQiPT09aD93aW5kb3cudG5bYV0uZ3JpZF93aWR0aDpMLCIlIj09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShyLCJsZWZ0dW5pdHMiKSYmKHk9dDM5Nl9yb3VuZEZsb2F0KFYqeS8xMDApKSx2KXt2YXIgTz1wYXJzZUludCh0Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsImxlZnQiKSwxMCkscTsiJSI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsImxlZnR1bml0cyIpJiYoTz10Mzk2X3JvdW5kRmxvYXQoVipPLzEwMCkpLHktPU87YnJlYWt9IXUmJmQ/ImdyaWQiPT09aCYmYyYmKHkqPWspOnk9QSt5LCJjZW50ZXIiPT09cCYmKHg9dDM5Nl9lbGVtX19nZXRXaWR0aChyKSxmJiYid2luZG93IiE9PUYmJihWKj1rLHgqPWspLHk9Vi8yLXgvMit5KSwicmlnaHQiPT09cCYmKHg9dDM5Nl9lbGVtX19nZXRXaWR0aChyKSxmJiYid2luZG93IiE9PUYmJihWKj1rLHgqPWspLHk9Vi14K3kpLGYmJiJ3aW5kb3ciIT09RiYmKHkrPSgoeD10Mzk2X2VsZW1fX2dldFdpZHRoKHIpKSprLXgpLzIpO2JyZWFrO2Nhc2UidG9wIjp2YXIgUj1yLmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLFQ9Uj9SLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1taW4tb2Zmc2V0LXRvcCIpOiIwIixXPVI/Ui5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLWhlaWdodCIpOiIwIixIPVI/Ui5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWF4LWhlaWdodCIpOiIwIixDPWZ1bmN0aW9uIHQoZSl7dmFyIGk9dDM5Nl9lbGVtX19nZXRIZWlnaHQoZSk7aWYoZSYmImltYWdlIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpKXt2YXIgcj10Mzk2X2VsZW1fX2dldFdpZHRoKGUpLG89dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImZpbGV3aWR0aCIpLG49dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImZpbGVoZWlnaHQiKSxhO2lmKG8mJm4paT1yLyhwYXJzZUludChvKS9wYXJzZUludChuKSl9cmV0dXJuIGl9LFA7aWYoRj0iZ3JpZCI9PT1oPyJncmlkIjoid2luZG93IixTPSJncmlkIj09PWg/cGFyc2VGbG9hdChUKTowLEk9ImdyaWQiPT09aD9wYXJzZUZsb2F0KFcpOnBhcnNlRmxvYXQoSCksIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsInRvcHVuaXRzIikmJih5PUkqKHkvMTAwKSksdil7dmFyIE09cGFyc2VJbnQodDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShiLCJ0b3AiKSwxMCksTjsiJSI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsInRvcHVuaXRzIikmJihNPXQzOTZfcm91bmRGbG9hdChJKk0vMTAwKSkseS09TTticmVha31mJiYid2luZG93IiE9PUYmJih5Kj1rKSxnJiYid2luZG93IiE9PUYmJihTPSJzdHJldGNoIj09PWw/MDpTL2spLHk9Uyt5O3ZhciBEPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoUiwiaGVpZ2h0X3ZoIiksaj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKFIsImhlaWdodCIpLEc9dDM5Nl9hYl9fZ2V0SGVpZ2h0KFIpLFo7aWYoZCYmIXUmJkQmJihaPXBhcnNlSW50KGosMTApKmspLCJjZW50ZXIiPT09dyYmKEU9QyhyKSxmJiYid2luZG93IiE9PUYmJigic3RyZXRjaCIhPT1sP0kqPWs6ST1aP1o+Rz9aOkc6Ui5jbGllbnRIZWlnaHQsRSo9ayksdXx8IWR8fGN8fCJ3aW5kb3ciPT09Rnx8InN0cmV0Y2giIT09bHx8KEk9Wj9aPkc/WjpHOlIuY2xpZW50SGVpZ2h0LEkvPWspLHk9SS8yLUUvMit5KSwiYm90dG9tIj09PXcmJihFPUMociksZiYmIndpbmRvdyIhPT1GJiYoInN0cmV0Y2giIT09bD9JKj1rOkk9Wj9aPkc/WjpHOlIuY2xpZW50SGVpZ2h0LEUqPWspLHV8fCFkfHxjfHwid2luZG93Ij09PUZ8fCJzdHJldGNoIiE9PWx8fChJPVo/Wj5HP1o6RzpSLmNsaWVudEhlaWdodCxJLz1rKSx5PUktRSt5KSxmJiYid2luZG93IiE9PUYpe3ZhciBVPSgoRT1DKHIpKSprLUUpLzI7eSs9VT1NYXRoLnJvdW5kKFUpfX1yZXR1cm4geX1mdW5jdGlvbiB0Mzk2X2VsZW1fZmluZEZpcnN0TGV2ZWxQYXJlbnRHcm91cCh0KXtmb3IodmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtlOyl7dmFyIGk9ZS5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2lmKCFpKWJyZWFrO2U9aX1yZXR1cm4gZX1mdW5jdGlvbiB0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGkscj10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG89ImFiIityLG47dm9pZCAwPT09d2luZG93LnRuW29dJiYodDM5Nl9pbml0VE5vYmoocix0KSx0Mzk2X3N3aXRjaFJlc29sdXRpb24ocix0Mzk2X2RldGVjdFJlc29sdXRpb24ocikpKTt2YXIgYT13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbixsPXdpbmRvdy50bltvXS5jdXJSZXNvbHV0aW9uX21heCxkPXdpbmRvdy50bltvXS5zY3JlZW5zO2lmKG51bGw9PT0oaT1hPT09bD90LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLSIrZSsiLXJlcy0iK2EpKSlmb3IodmFyIF89MDtfPGQubGVuZ3RoO18rKyl7dmFyIHM9ZFtfXTtpZighKHM8PWEpJiZudWxsIT09KGk9cz09PWw/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtIitlKTp0LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UrIi1yZXMtIitzKSkpYnJlYWt9dmFyIHU9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihpKTtyZXR1cm4gdSYmKGk9dS5mYWxsYmFjayksaX1mdW5jdGlvbiB0Mzk2X2FiX19yZW5kZXJWaWV3T25lRmllbGQodCxlKXt0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsZSl9ZnVuY3Rpb24gdDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHQsZSl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIik/dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsZSk6dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LGUpfWZ1bmN0aW9uIHQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCxlKXtpZighdClyZXR1cm4gbnVsbDt2YXIgaSxyLG89ImFiIit0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG49d2luZG93LnRuW29dLmN1clJlc29sdXRpb24sYT13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbl9tYXgsbD13aW5kb3cudG5bb10uc2NyZWVucyxkPVsid2lkdGhtb2RlIiwiaGVpZ2h0bW9kZSIsImZsZXgiXS5pbmNsdWRlcyhlKT8iIjoiLXZhbHVlIjtpZihudWxsPT09KGk9bj09PWE/dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlK2QpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWdyb3VwLSIrZSsiLXJlcy0iK24rZCkpKWZvcih2YXIgXz0wO188bC5sZW5ndGg7XysrKXt2YXIgcz1sW19dO2lmKCEoczw9bikmJm51bGwhPT0oaT1zPT09YT90LmdldEF0dHJpYnV0ZSgiZGF0YS1ncm91cC0iK2UrZCk6dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlKyItcmVzLSIrcytkKSkpYnJlYWt9dmFyIHU9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihpKTtyZXR1cm4gdSYmKGk9dS5mYWxsYmFjayksaX1mdW5jdGlvbiB0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyh0KXtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1ncm91cCIpLGk9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUsKGZ1bmN0aW9uKHQpe3JldHVybiJwaHlzaWNhbCI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHQsInR5cGUiKX0pKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3QzOTZfZ3JvdXBfX3JlbmRlclZpZXcodCksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXdBdXRvbGF5b3V0KHQpfSkpfX1mdW5jdGlvbiB0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlld0F1dG9sYXlvdXQodCl7aWYodCYmdC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKSl7dmFyIGU9dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LCJ3aWR0aG1vZGUiKSxpPXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0bW9kZSIpOyJmaWxsIj09PWU/KHQuc3R5bGUud2lkdGg9IjEwMCUiLHQuc3R5bGUuZmxleFNocmluaz0iMSIpOih0LnN0eWxlLndpZHRoPSJodWciPT09ZT8ibWluLWNvbnRlbnQiOiIiLHQuc3R5bGUuaGVpZ2h0PSJodWciPT09aT8iaW5pdGlhbCI6IiIsdC5zdHlsZS5mbGV4U2hyaW5rPSIiKX19ZnVuY3Rpb24gdDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyh0KXtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1lbGVtIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0Mzk2X2VsZW1fX3JlbmRlclZpZXcodCl9KSl9fWZ1bmN0aW9uIHQzOTZfYWJfX2dldEhlaWdodCh0LGUpe3ZhciBpPWU7aXx8KGk9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHQiKSksaT1wYXJzZUZsb2F0KGkpO3ZhciByPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0X3ZoIik7aWYociYmKHI9cGFyc2VGbG9hdChyKSwhaXNOYU4ocikpKXt2YXIgbz10Mzk2X2FiX19nZXRXaW5kb3dIZWlnaHQodCkqci8xMDA7aTxvJiYoaT1vKX1yZXR1cm4gaX1mdW5jdGlvbiB0Mzk2X2VsZW1fX2dldFdpZHRoKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KSxyLG8sbj0iYWIiK2kuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksYT1lLGwsZCxfLHM7KGF8fChhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ3aWR0aCIpKSxhPXBhcnNlRmxvYXQoYSksIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksIndpZHRodW5pdHMiKSkmJihhPSJ3aW5kb3ciPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImNvbnRhaW5lciIpP3QzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aCphLzEwMDp3aW5kb3cudG5bbl0uZ3JpZF93aWR0aCphLzEwMCk7cmV0dXJuIGF9ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRIZWlnaHQodCxlKXt2YXIgaT10Mzk2X2dldEVsKHQpLHI9ZTtyfHwocj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0IikpLHI9cGFyc2VGbG9hdChyKTt2YXIgbz1pLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxuPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ0ZXh0Zml0IiksYTtpZihufHwoImJ1dHRvbiI9PT1vP249ImZpeGVkc2l6ZSI6InRleHQiPT09byYmKG49ImF1dG9oZWlnaHQiKSksInNoYXBlIj09PW98fCJ2aWRlbyI9PT1vfHwiaHRtbCI9PT1vfHwiZ2FsbGVyeSI9PT1vfHwoInRleHQiPT09b3x8ImJ1dHRvbiI9PT1vKSYmImZpeGVkc2l6ZSI9PT1uKXt2YXIgbDtpZigiJSI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0dW5pdHMiKSl7dmFyIGQ9aS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxfPWQ/ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLWhlaWdodCIpOiIwIixzPWQ/ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWF4LWhlaWdodCIpOiIwIix1PXBhcnNlRmxvYXQoXyksYz1wYXJzZUZsb2F0KHMpLGY7cj0id2luZG93Ij09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJjb250YWluZXIiKT9jKihyLzEwMCk6dSooci8xMDApfXJldHVybiByfWlmKCJ0ZXh0Ij09PW8pe3ZhciBnPWkucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtnJiYoZy5zdHlsZS5saW5lSGVpZ2h0PSIiKX1yZXR1cm4gaS5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gdDM5Nl9yb3VuZEZsb2F0KHQpe3JldHVybiBNYXRoLnJvdW5kKDEwMCp0KS8xMDB9ZnVuY3Rpb24gdDM5Nl9yZW1vdmVFbGVtZW50RnJvbURPTSh0KXt2YXIgZT10Mzk2X2dldEVsKHQpO2UmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIHQzOTZfZ2V0RWwodCl7cmV0dXJuIHdpbmRvdy5qUXVlcnkmJnQgaW5zdGFuY2VvZiBqUXVlcnk/dC5sZW5ndGg/dC5nZXQoMCk6bnVsbDp0fWZ1bmN0aW9uIHQzOTZfX2dldEJsb2NrRWRpdG9yV2lkdGgoKXtpZighd2luZG93LnRuLmlzRWRpdE1vZGUpcmV0dXJuIDA7dmFyIHQsZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCItLXBhZ2Utdmlldy13aWR0aCIpO3JldHVybiBlJiYiMTAwJSIhPT1lP3BhcnNlSW50KGUsMTApOjB9ZnVuY3Rpb24gdDM5Nl9faXNBbGxaZXJvQmxvY2tzUmVuZGVyZWQodCxlKXt2b2lkIDA9PT1lJiYoZT0wKTt2YXIgaT10Mzk2X19nZXRaZXJvQmxvY2tzKCkscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG89ciYmImVkaXQiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpLG49InJlYWR5Ij09PWRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5LXN0YXR1cyIpLGE9ITE7aWYoaS5sZW5ndGh8fCFvfHxuKXtpZighaS5sZW5ndGgmJm8mJm4pcmV0dXJuIGU+MzA/dm9pZCB0KCk6dm9pZCBzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKHQsZSsxKX0pLDEwMCk7dmFyIGw9aS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmFydGJvYXJkfSkpLGQ7aWYobC5sZW5ndGg+MCYmbC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKXQoKTtlbHNle3ZhciBfPWwuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil9KSk7bC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKXx8ZS5hZGRFdmVudExpc3RlbmVyKCJhcnRCb2FyZFJlbmRlcmVkIiwoZnVuY3Rpb24oKXtfLnB1c2goZSksXy5sZW5ndGghPT1sLmxlbmd0aHx8YXx8dCgpfSkpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YT0hMCxfLmxlbmd0aCE9PWwubGVuZ3RoJiZ0KCl9KSwzZTMpfX1lbHNle3ZhciBzPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJyZWFkeSI9PT1lLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtcmVhZHktc3RhdHVzIikmJihzLmRpc2Nvbm5lY3QoKSx0Mzk2X19pc0FsbFplcm9CbG9ja3NSZW5kZXJlZCh0KSl9KSl9KSk7cy5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsiZGF0YS1yZWFkeS1zdGF0dXMiXX0pfX1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzRWxlbWVudHNUcmFuc2Zvcm0odCl7dmFyIGU9dDM5Nl9faW5pdEZhc3RET00oKSxpPVtdO2UucmVhZCgoZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO2lmKCJ0ZXh0Ij09PWV8fCJpbWFnZSI9PT1lfHwic2hhcGUiPT09ZXx8ImJ1dHRvbiI9PT1lfHwidmVjdG9yIj09PWUpe3ZhciByPWdldENvbXB1dGVkU3R5bGUodCksbz1yLmJhY2tkcm9wRmlsdGVyJiYibm9uZSIhPT1yLmJhY2tkcm9wRmlsdGVyfHxyLndlYmtpdEJhY2tkcm9wRmlsdGVyJiYibm9uZSIhPT1yLndlYmtpdEJhY2tkcm9wRmlsdGVyLG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdHlsZSIpO2lmKG8mJiFuKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIiksbD1hP3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnRyYW5zZm9ybToibm9uZSI7Im1hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKSI9PT1sJiYobD0ibm9uZSIpLCJub25lIiE9PWwmJmkucHVzaCh7ZWxlbWVudDp0LGF0b206YSxhdG9tVHJhbnNmb3JtOmx9KX19fSkpfSkpLGUud3JpdGUoKGZ1bmN0aW9uKCl7aS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmF0b20uc3R5bGUudHJhbnNmb3JtPSJub25lIix0LmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPXQuYXRvbVRyYW5zZm9ybX0pKX0pKX1mdW5jdGlvbiB0Mzk2X19maXhFbGVtZW50c0xpbmVIZWlnaHRzKHQpe3ZhciBlPXQzOTZfX2luaXRGYXN0RE9NKCksaT1bXTtlLnJlYWQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZTtpZigidGV4dCI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSl7dmFyIHI9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpO2lmKHImJiF0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20odCkpe3ZhciBvPXQuc3R5bGUuem9vbSxuPXIuc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3QsYT1yLnN0eWxlLmZvbnRTaXplO2kucHVzaCh7ZWxlbWVudDp0LGF0b206cix6b29tOm8sdGV4dFNpemVBZGp1c3Q6bixmb250U2l6ZTphfSl9fX0pKX0pKSxlLndyaXRlKChmdW5jdGlvbigpe2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hdG9tLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJsaW5lLWhlaWdodCIpLHdpbmRvdy50Mzk2X19pc1NhZmFyaSYmdC56b29tJiYodC5hdG9tLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSJub25lIix0LmF0b20uc3R5bGUuZm9udFNpemU9IiIsdC5lbGVtZW50LnN0eWxlLnpvb209IiIpfSkpfSkpLGUucmVhZCgoZnVuY3Rpb24oKXtpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY29tcHV0ZWRMaW5lSGVpZ2h0PXBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodC5hdG9tKS5saW5lSGVpZ2h0KX0pKX0pKSxlLndyaXRlKChmdW5jdGlvbigpe2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5jb21wdXRlZExpbmVIZWlnaHQ7d2luZG93LnQzOTZfX2lzU2FmYXJpJiZ0Lnpvb20mJih0LmF0b20uc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9dC50ZXh0U2l6ZUFkanVzdCx0LmF0b20uc3R5bGUuZm9udFNpemU9dC5mb250U2l6ZSx0Lnpvb20mJih0LmVsZW1lbnQuc3R5bGUuem9vbT10Lnpvb20pKSxlJiYhaXNOYU4oZSkmJih0LmF0b20uc3R5bGUubGluZUhlaWdodD1NYXRoLnJvdW5kKGUpKyJweCIpfSkpfSkpfWZ1bmN0aW9uIHQzOTZfX2ZpeEVsZW1lbnRzRm9udFNpemVzKHQpe3ZhciBlO2lmKCF3aW5kb3cudDM5Nl9faXNNb2JpbGUmJndpbmRvdy50Mzk2X19pc0lQYWR8fHdpbmRvdy50Mzk2X19pc0ZhY2Vib29rTWVzc2VuZ2VySW5BcHB8fHdpbmRvdy50Mzk2X19pc0luc3RhZ3JhbUluQXBwKXt2YXIgaT10Mzk2X19pbml0RmFzdERPTSgpLHI9W107aS5yZWFkKChmdW5jdGlvbigpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7aWYoInRleHQiPT09ZXx8ImJ1dHRvbiI9PT1lKXt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik7aWYoaSl7dmFyIG89dDM5Nl9lbGVtX2ZpbmRGaXJzdExldmVsUGFyZW50R3JvdXAodCksbj17ZWxlbWVudDp0LGF0b206aSx6b29tOjEsZWxlbWVudFR5cGU6ZX07aWYobyYmby5zdHlsZS56b29tJiYobi56b29tPXBhcnNlRmxvYXQoby5zdHlsZS56b29tKSksMSE9PW4uem9vbSl7dmFyIGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsImZvbnRzaXplIik7YSYmKG4uZmllbGRGb250U2l6ZT1wYXJzZUZsb2F0KGEpKSxyLnB1c2gobil9fX19KSl9KSksaS53cml0ZSgoZnVuY3Rpb24oKXtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYXRvbS5zdHlsZS5mb250U2l6ZT0iIn0pKX0pKSxpLnJlYWQoKGZ1bmN0aW9uKCl7ci5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1wYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQuYXRvbSkuZm9udFNpemUpLGk9dC5maWVsZEZvbnRTaXplJiZNYXRoLmFicyh0LmZpZWxkRm9udFNpemUtZSk8PS4wMSxyPU51bWJlci5pc0ludGVnZXIoZSk7dC5jb3JyZWN0Rm9udFNpemU9aXx8cj8iY2FsYygiK2UrInB4ICogdmFyKC0tem9vbSwgMSkpIjoiY2FsYygiK2UrInB4ICogdmFyKC0tem9vbSwgMSkgKiB2YXIoLS16b29tLCAxKSkifSkpfSkpLGkud3JpdGUoKGZ1bmN0aW9uKCl7ci5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmF0b20uc3R5bGUuZm9udFNpemU9dC5jb3JyZWN0Rm9udFNpemV9KSl9KSl9fWZ1bmN0aW9uIHQzOTZfX2luaXRGYXN0RE9NKCl7cmV0dXJue3JlYWQ6ZnVuY3Rpb24gdChlKXtlKCl9LHdyaXRlOmZ1bmN0aW9uIHQoZSl7ZSgpfX19ZnVuY3Rpb24gdDM5Nl9fYXBwbHlGaXhlc0ZvckFsbEVsZW1lbnRzKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQzOTZfX2VsZW0iKSxlPXdpbmRvdy50Mzk2X19pc1NhZmFyaXx8d2luZG93LnQzOTZfX2lzRmFjZWJvb2tNZXNzZW5nZXJJbkFwcHx8d2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHA7ZG9jdW1lbnQuZm9udHMmJmU/ZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbigoZnVuY3Rpb24oKXt0Mzk2X19maXhFbGVtZW50c0ZvbnRTaXplcyh0KSx0Mzk2X19maXhFbGVtZW50c0xpbmVIZWlnaHRzKHQpfSkpOnQzOTZfX2ZpeEVsZW1lbnRzTGluZUhlaWdodHModCksdDM5Nl9fcHJvY2Vzc0VsZW1lbnRzVHJhbnNmb3JtKHQpfWZ1bmN0aW9uIHQzOTZfX3pvb21pZnlWYWx1ZSh0LGUsaSl7dm9pZCAwPT09aSYmKGk9e30pO3ZhciByLG89ZSsoU3RyaW5nKGUpLmVuZHNXaXRoKCJweCIpPyIiOiJweCIpLG47aWYodDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpKXJldHVybiBvO3ZhciBhPXdpbmRvdy5DU1MmJndpbmRvdy5DU1Muc3VwcG9ydHMmJkNTUy5zdXBwb3J0cygid2lkdGgiLCJyb3VuZCgxMHB4LCAxcHgpIik7cmV0dXJuIGkucm91bmQmJmE/InJvdW5kKCIrbysiICogdmFyKC0tem9vbSwgMSksIDFweCkiOiJjYWxjKCIrbysiICogdmFyKC0tem9vbSwgMSkpIn1mdW5jdGlvbiB0Mzk2X19pc0luUG9wdXAodCl7aWYoIXQpcmV0dXJuITE7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxpLHI7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpLnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXBvcHVwX19jb250YWluZXIiKX1mdW5jdGlvbiB0Mzk2X193YWl0Rm9yUG9wdXAoKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3ZhciBlPTAsaT01O2Z1bmN0aW9uIHIoKXt2YXIgaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cF9zaG93Iik7aT90KGkpOmU+PTU/dChudWxsKTooZSsrLHNldFRpbWVvdXQociwxMDAqZSkpfXIoKX0pKX1mdW5jdGlvbiB0Mzk2X19zaG91bGRVc2VWaXN1YWxWaWV3cG9ydEhlaWdodCgpe3JldHVybiJ2aXN1YWxWaWV3cG9ydCJpbiB3aW5kb3cmJndpbmRvdy50Mzk2X19pc01vYmlsZSYmd2luZG93LnQzOTZfX2lzU2FmYXJpfWZ1bmN0aW9uIHQzOTZfX2dldFJvb3Rab25lKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlO3JldHVybiB0JiZ0LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1yb290LXpvbmUiKXx8ImNvbSJ9ZnVuY3Rpb24gdDM5Nl9faW50aWFsaXplVW5kZXJjdXQodCl7aWYodCYmdC5xdWVyeVNlbGVjdG9yKCIucWwtdW5kZXJjdXQiKSl7dmFyIGUsaT0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIit0Mzk2X19nZXRSb290Wm9uZSgpKyIvanMvdGlsZGEtdW5kZXJjdXQtMS4wLm1pbi5qcyI7dF9vbkZ1bmNMb2FkKCJ0X2xvYWRKc0ZpbGUiLChmdW5jdGlvbigpe3RfbG9hZEpzRmlsZShpLChmdW5jdGlvbigpe3Rfb25GdW5jTG9hZCgidF9xdWlsbFVuZGVyY3V0X3BhcnNlTm9kZXMiLChmdW5jdGlvbigpe3RfcXVpbGxVbmRlcmN1dF9wYXJzZU5vZGVzKHQpfSkpfSkpfSkpfX1mdW5jdGlvbiB0Mzk2X19pbml0aWFsaXplQXJ0Ym9hcmRPdmVyZmxvdyh0LGUpe2lmKGUmJnQpe3ZhciBpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoIm92ZXJmbG93Iik7aWYoImF1dG8iPT09aSl7dmFyIHI9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpOyJ5IiE9PXdpbmRvdy5sYXp5JiYieWVzIiE9PXJ8fHRfb25GdW5jTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe2UuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKHdpbmRvdy50X2xhenlsb2FkX3VwZGF0ZSw1MDApKX0pKX0iIiE9PXdpbmRvdy5sb2NhdGlvbi5oYXNoJiYidmlzaWJsZSI9PT1pJiYoZS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Uuc3R5bGUub3ZlcmZsb3c9InZpc2libGUifSksMSkpfX1mdW5jdGlvbiB0Mzk2X19pbml0aWFsaXplQW5jaG9yTGlua092ZXJmbG93Rml4KCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXJ0Ym9hcmQtb3ZyZmx3PSJ2aXNpYmxlIl0nKTt0Lmxlbmd0aCYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbihlKXt2YXIgaTtlLnRhcmdldC5jbG9zZXN0KCdhW2hyZWZePSIjIl0nKSYmKHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSJ9KSl9KSkpfSkpfQoKaWYod2luZG93LnRfem9vbV9faXNNb2JpbGU9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy50X3pvb21fX2lzTW9iaWxlfHwod2luZG93LnRfem9vbV9faXNNb2JpbGU9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNYWNpbnRvc2giKSYmIm9udG91Y2hlbmQiaW4gZG9jdW1lbnQpLHdpbmRvdy50X3pvb21fX2lzaU9TPS9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx3aW5kb3cudF96b29tX19pT1NNYWpvclZlcnNpb249MCx3aW5kb3cudF96b29tX19pc2lPUyl7dmFyIHZlcnNpb249bmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL09TIChcZCspXyhcZCspXz8oXGQrKT8vKTtudWxsIT09dmVyc2lvbiYmKHdpbmRvdy50X3pvb21fX2lPU01ham9yVmVyc2lvbj1wYXJzZUludCh2ZXJzaW9uWzFdLDEwKSl9ZnVuY3Rpb24gdF9pbml0Wm9vbSgpe3ZhciB0O2lmKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3dyYXBwZXIiKSl7d2luZG93LnR6b29taW5pdGVkPSEwLHdpbmRvdy50em9vbW9wZW5vbmNlPSExLHdpbmRvdy5pc0RvdWJsZXRhcFNjYWxlQWRkZWQ9ITE7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtem9vbWFibGVdIiksbz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiKSYmIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfX3RodW1ic19nYWxsZXJ5IikmJiIiIT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtaW1nLXpvb20tdXJsIil9KSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5hZGQoInQtem9vbWFibGUiKX0pKTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyLmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX193cmFwcGVyIik7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bi5jbGFzc0xpc3QuYWRkKCJ0LXpvb21lcl9fY29udGFpbmVyIik7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5jbGFzc0xpc3QuYWRkKCJ0LXpvb21lcl9fYmciKTt2YXIgaT10X3pvb21fX2NyZWF0ZUNsb3NlQnRuKCksbD10X3pvb21fX2NyZWF0ZVNjYWxlQnRuKCk7ci5hcHBlbmRDaGlsZChuKSxyLmFwcGVuZENoaWxkKGEpLHIuYXBwZW5kQ2hpbGQoaSksci5hcHBlbmRDaGlsZChsKSxkb2N1bWVudC5ib2R5JiZkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixyKSx0X3pvb21fX2luaXRGdWxsU2NyZWVuSW1nT25DbGljaygpLHRfem9vbV9fY2xvc2VBbmRTbGlkZUNhcm91c2VsKCl9fWZ1bmN0aW9uIHRfem9vbV9fYXBwZW5kUHJlbG9hZGVyVG9FbGVtZW50KHQpe2lmKHQmJiJ5Ij09PXdpbmRvdy5sYXp5KXt2YXIgZT0nXG5cdFx0PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIj5cblx0XHRcdDxnIGZpbGw9IiNjNWM1YzUiPlxuXHRcdFx0XHQ8cmVjdCBjbGFzcz0idC1pY29uLWxvYWRlci1yZWN0IiB4PSIxNCIgd2lkdGg9IjQiIGhlaWdodD0iMTEiIHJ4PSIyIiAvPlxuXHRcdFx0XHQ8cmVjdCBjbGFzcz0idC1pY29uLWxvYWRlci1yZWN0IiB4PSIxNCIgd2lkdGg9IjQiIGhlaWdodD0iMTEiIHJ4PSIyIiB0cmFuc2Zvcm09InJvdGF0ZSg0NSAxNiAxNikiIC8+XG5cdFx0XHRcdDxyZWN0IGNsYXNzPSJ0LWljb24tbG9hZGVyLXJlY3QiIHg9IjE0IiB3aWR0aD0iNCIgaGVpZ2h0PSIxMSIgcng9IjIiIHRyYW5zZm9ybT0icm90YXRlKDkwIDE2IDE2KSIgLz5cblx0XHRcdFx0PHJlY3QgY2xhc3M9InQtaWNvbi1sb2FkZXItcmVjdCIgeD0iMTQiIHdpZHRoPSI0IiBoZWlnaHQ9IjExIiByeD0iMiIgdHJhbnNmb3JtPSJyb3RhdGUoMTM1IDE2IDE2KSIgLz5cblx0XHRcdFx0PHJlY3QgY2xhc3M9InQtaWNvbi1sb2FkZXItcmVjdCIgeD0iMTQiIHdpZHRoPSI0IiBoZWlnaHQ9IjExIiByeD0iMiIgdHJhbnNmb3JtPSJyb3RhdGUoMTgwIDE2IDE2KSIgLz5cblx0XHRcdFx0PHJlY3QgY2xhc3M9InQtaWNvbi1sb2FkZXItcmVjdCIgeD0iMTQiIHdpZHRoPSI0IiBoZWlnaHQ9IjExIiByeD0iMiIgdHJhbnNmb3JtPSJyb3RhdGUoMjI1IDE2IDE2KSIgLz5cblx0XHRcdFx0PHJlY3QgY2xhc3M9InQtaWNvbi1sb2FkZXItcmVjdCIgeD0iMTQiIHdpZHRoPSI0IiBoZWlnaHQ9IjExIiByeD0iMiIgdHJhbnNmb3JtPSJyb3RhdGUoMjcwIDE2IDE2KSIgLz5cblx0XHRcdFx0PHJlY3QgY2xhc3M9InQtaWNvbi1sb2FkZXItcmVjdCIgeD0iMTQiIHdpZHRoPSI0IiBoZWlnaHQ9IjExIiByeD0iMiIgdHJhbnNmb3JtPSJyb3RhdGUoMzE1IDE2IDE2KSIgLz5cblx0XHRcdDwvZz5cblx0XHQ8L3N2Zz5cblx0JyxvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uY2xhc3NMaXN0LmFkZCgidC16b29tZXItbG9hZGVyIiksby5pbm5lckhUTUw9ZSx0LmFwcGVuZChvKX19ZnVuY3Rpb24gdF96b29tX19jcmVhdGVDbG9zZUJ0bigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuY2xhc3NMaXN0LmFkZCgidC16b29tZXJfX2Nsb3NlIiksdC5zdHlsZS5kaXNwbGF5PSJub25lIjt2YXIgZT0iIjtyZXR1cm4gZSs9Jzxzdmcgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiB2aWV3Qm94PSIwIDAgMjMgMjMiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+JyxlKz0nPHBhdGggZD0iTTEuNDE0MjEgLTAuMDAwMTUxMDM4TDAgMS40MTQwNkwyMS4yMTMyIDIyLjYyNzNMMjIuNjI3NCAyMS4yMTMxTDEuNDE0MjEgLTAuMDAwMTUxMDM4WiIgZmlsbD0iYmxhY2siLz4nLGUrPSc8cGF0aCBkPSJNMjIuNjI5MSAxLjQxNDIxTDIxLjIxNDggMEwwLjAwMTY0MDY4IDIxLjIxMzJMMS40MTU4NSAyMi42Mjc0TDIyLjYyOTEgMS40MTQyMVoiIGZpbGw9ImJsYWNrIi8+JyxlKz0iPC9zdmc+Iix0Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIixlKSx0fWZ1bmN0aW9uIHRfem9vbV9fY3JlYXRlU2NhbGVCdG4oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX19zY2FsZSIpLHQuY2xhc3NMaXN0LmFkZCgic2hvd2VkIik7dmFyIGU9IiI7cmV0dXJuIGUrPSc8c3ZnIGNsYXNzPSJpY29uLWluY3JlYXNlIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyNSAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4nLGUrPSc8cGF0aCBkPSJNMjIuODMyIDIyTDE3Ljg1OTIgMTcuMDI3MyIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0ic3F1YXJlIi8+JyxlKz0nPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00LjU4NTkxIDMuNzUxMUMwLjkxNzc2OCA3LjQxOTI0IDAuOTE3NzY4IDEzLjM2NyA0LjU4NTkxIDE3LjAzNTJDOC4yNTQwNSAyMC43MDMzIDE0LjIwMTkgMjAuNzAzMyAxNy44NyAxNy4wMzUyQzIxLjUzODEgMTMuMzY3IDIxLjUzODEgNy40MTkyNCAxNy44NyAzLjc1MTFDMTQuMjAxOSAwLjA4Mjk2NTMgOC4yNTQwNSAwLjA4Mjk2NTMgNC41ODU5MSAzLjc1MTFaIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjIiLz4nLGUrPSc8cGF0aCBkPSJNNi4yNTc4MSAxMC4zOTMxSDE2LjIwMzUiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMiIvPicsZSs9JzxwYXRoIGQ9Ik0xMS4yMzA1IDE1LjM2NjJWNS40MjA1MyIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIyIi8+JyxlKz0iPC9zdmc+IixlKz0nPHN2ZyBjbGFzcz0iaWNvbi1kZWNyZWFzZSIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+JyxlKz0nPHBhdGggZD0iTTIxLjk5NjEgMjJMMTcuMDIzMyAxNy4wMjczIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiLz4nLGUrPSc8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMuNzQ5OTcgMy43NTExQzAuMDgxODMwOCA3LjQxOTI0IDAuMDgxODMwOCAxMy4zNjcgMy43NDk5NyAxNy4wMzUyQzcuNDE4MTEgMjAuNzAzMyAxMy4zNjU5IDIwLjcwMzMgMTcuMDM0MSAxNy4wMzUyQzIwLjcwMjIgMTMuMzY3IDIwLjcwMjIgNy40MTkyNCAxNy4wMzQxIDMuNzUxMUMxMy4zNjU5IDAuMDgyOTY1MyA3LjQxODExIDAuMDgyOTY1MyAzLjc0OTk3IDMuNzUxMVoiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMiIvPicsZSs9JzxwYXRoIGQ9Ik01LjQxNzk3IDEwLjM5MzFIMTUuMzYzNyIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIyIi8+JyxlKz0iPC9zdmc+Iix0Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIixlKSx0fWZ1bmN0aW9uIHRfem9vbV9faW5pdEZ1bGxTY3JlZW5JbWdPbkNsaWNrKCl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldC5jbG9zZXN0KCcudC16b29tYWJsZTpub3QoW2RhdGEtaW1nLXpvb20tdXJsPSIiXSksIC50LXNsZHNfX3RodW1ic19nYWxsZXJ5LXpvb21hYmxlJyk7ZSYmdF96b29tSGFuZGxlcihlKX0pKTt2YXIgdD13aW5kb3cudF96b29tX19pc01vYmlsZT8ib3JpZW50YXRpb25jaGFuZ2UiOiJyZXNpemUiO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKHQsKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtem9vbWVyX19zaG93IikmJnRfem9vbV9jaGVja0ZvclNjYWxlKCl9KSl9ZnVuY3Rpb24gdF96b29tX19jbG9zZUFuZFNsaWRlQ2Fyb3VzZWwoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX2Nsb3NlIik7dCYmKHQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbigpe3Rfem9vbV9jbG9zZSgpfSkpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLChmdW5jdGlvbih0KXtpZihkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygidC16b29tZXJfX3Nob3ciKSlzd2l0Y2godC5rZXlDb2RlKXtjYXNlIDI3OnQucHJldmVudERlZmF1bHQoKSx0X3pvb21fY2xvc2UoKTticmVhaztjYXNlIDM3OnRfem9vbV9fc2V0RXZlbnRPbkJ0bigicHJldiIpO2JyZWFrO2Nhc2UgMzk6dF96b29tX19zZXRFdmVudE9uQnRuKCJuZXh0Iil9fSkpKX1mdW5jdGlvbiB0X3pvb21IYW5kbGVyKHQpe3ZhciBlO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgidC16b29tZXJfX3Nob3ciKSxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cF9zaG93IikmJmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgidC16b29tZXJfX2FjdGl2ZSIpO3ZhciBvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fY29udGFpbmVyIikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyLmNsYXNzTGlzdC5hZGQoInQtY2Fyb3VzZWxfX3pvb21lZCIpO3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uY2xhc3NMaXN0LmFkZCgidC1jYXJvdXNlbF9fem9vbWVyX19zbGlkZXMiKTt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmNsYXNzTGlzdC5hZGQoInQtY2Fyb3VzZWxfX3pvb21lcl9faW5uZXIiKTt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLmNsYXNzTGlzdC5hZGQoInQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKSxhLmFwcGVuZENoaWxkKGkpLHRfem9vbV9fYXBwZW5kUHJlbG9hZGVyVG9FbGVtZW50KGEpO3ZhciBsPXRfem9vbV9jcmVhdGVTbGlkZXJBcnJvdygibGVmdCIpLGM9dF96b29tX2NyZWF0ZVNsaWRlckFycm93KCJyaWdodCIpO24uYXBwZW5kQ2hpbGQobCksbi5hcHBlbmRDaGlsZChjKSxuLmFwcGVuZENoaWxkKGEpLHIuYXBwZW5kQ2hpbGQobiksbyYmKG8uaW5uZXJIVE1MPSIiKSxvJiZvLmFwcGVuZENoaWxkKHIpO3ZhciBzPXQuY2xvc2VzdCgiLnIiKSxfO2lmKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX190cmFjayIpfHwhcylyZXR1cm4hMTt0X3pvb21fX2FkZGluZ0ltZ3NJbnRvQ2Fyb3VzZWwodCk7dmFyIGQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX19jbG9zZSIpO3JldHVybiBkJiYoZC5zdHlsZS5kaXNwbGF5PSJmbGV4IiksdF96b29tX3NldE1vZGFsQ29sb3Iocyx0KSx0X3pvb21fX2NyZWF0ZUFuZExvb3BTbGlkZXIodCksdF96b29tX19nZXRFdmVudE9uQnRuKCksZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJ0LXpvb21lcl9fc2hvd19maXhlZCIpLHRfem9vbV9faW5pdFNpbmdsZVpvb20oKSx0X3pvb21fY2hlY2tGb3JTY2FsZSgpLHRfem9vbV9sb2NrU2Nyb2xsKCksd2luZG93LnRfem9vbV9faXNNb2JpbGU/KHRfem9vbV9pbml0U3dpcGUoKSx0X3pvb21faW5pdENsb3NlU3dpcGUoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLHRfem9vbV9fdXBkYXRlQWN0aXZlU2xpZGVQb3MpKTp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3pvb21fX3VwZGF0ZUFjdGl2ZVNsaWRlUG9zKSx3aW5kb3cudHpvb21vcGVub25jZT0hMCx0X3pvb21fX2luaXRFdmVudHNvbk1vYmlsZSgpLCEwfWZ1bmN0aW9uIHRfem9vbV9fdXBkYXRlQWN0aXZlU2xpZGVQb3MoKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX3RyYWNrIik7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX19pdGVtLmFjdGl2ZSIpLm9mZnNldExlZnQ7dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoIistZSsicHgpIn19KSwzMDApfWZ1bmN0aW9uIHRfem9vbV9jcmVhdGVTbGlkZXJBcnJvdyh0KXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTGlzdC5hZGQoInQtY2Fyb3VzZWxfX3pvb21lcl9fY29udHJvbCIpLGUuY2xhc3NMaXN0LmFkZCgidC1jYXJvdXNlbF9fem9vbWVyX19jb250cm9sXyIrdCksZS5zZXRBdHRyaWJ1dGUoImRhdGEtem9vbWVyLXNsaWRlIiwibGVmdCI9PT10PyJwcmV2IjoibmV4dCIpO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uY2xhc3NMaXN0LmFkZCgidC1jYXJvdXNlbF9fem9vbWVyX19hcnJvd19fd3JhcHBlciIpLG8uY2xhc3NMaXN0LmFkZCgidC1jYXJvdXNlbF9fem9vbWVyX19hcnJvd19fd3JhcHBlcl8iK3QpO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiByLmNsYXNzTGlzdC5hZGQoInQtY2Fyb3VzZWxfX3pvb21lcl9fYXJyb3ciKSxyLmNsYXNzTGlzdC5hZGQoInQtY2Fyb3VzZWxfX3pvb21lcl9fYXJyb3dfIit0KSxyLmNsYXNzTGlzdC5hZGQoInQtY2Fyb3VzZWxfX3pvb21lcl9fYXJyb3dfc21hbGwiKSxvLmFwcGVuZENoaWxkKHIpLGUuYXBwZW5kQ2hpbGQobyksZX1mdW5jdGlvbiB0X3pvb21faW5pdFN3aXBlKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtY2Fyb3VzZWxfX3pvb21lcl9faXRlbSIpLGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX193cmFwcGVyIik7aWYodC5sZW5ndGg+MSl7dmFyIG89bmV3IEhhbW1lcihlLHtkb21FdmVudHM6ITAsaW5wdXRDbGFzczpIYW1tZXIuVG91Y2hJbnB1dCxjc3NQcm9wczp7dG91Y2hDb2xsb3V0OiJkZWZhdWx0In0scmVjb2duaXplcnM6W1tIYW1tZXIuUGFuLHtkaXJlY3Rpb246SGFtbWVyLkRJUkVDVElPTl9IT1JJWk9OVEFMfV1dfSkscj1udWxsLG49ITE7d2luZG93LnR6b29tb3Blbm9uY2V8fChvLm9uKCJwYW5zdGFydCIsKGZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKSxvOyJ5IiE9PXQuZ2V0QXR0cmlidXRlKCJkYXRhLW9uLXRyYW5zaXRpb24iKT90JiYocj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQsdC5zdHlsZS50cmFuc2l0aW9uPSJub25lIik6cj1udWxsLG49dF96b29tX19pc1NjYWxlZChlKX0pKSxvLm9uKCJwYW5tb3ZlIiwoZnVuY3Rpb24odCl7dmFyIG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKSxhPW8uZ2V0QXR0cmlidXRlKCJkYXRhLW9uLXRyYW5zaXRpb24iKSxpPWUuZ2V0QXR0cmlidXRlKCJkYXRhLW9uLWRyYWciKSxsO2lmKCJ5IiE9PWEmJiJ5IiE9PWkmJjE9PT10Lm1heFBvaW50ZXJzJiYhbiYmKE1hdGguYWJzKHQuZGVsdGFYKT40MCYmby5zZXRBdHRyaWJ1dGUoImRhdGEtb24tZHJhZyIsInkiKSxyKSl7dmFyIGM9cit0LmRlbHRhWDtvLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgiK2MrInB4KSJ9fSkpLG8ub24oInBhbmVuZCIsKGZ1bmN0aW9uKG8pe3ZhciByPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX3RyYWNrIik7ci5zZXRBdHRyaWJ1dGUoImRhdGEtb24tZHJhZyIsIiIpO3ZhciBhPXIuZ2V0QXR0cmlidXRlKCJkYXRhLW9uLXRyYW5zaXRpb24iKSxpPWUuZ2V0QXR0cmlidXRlKCJkYXRhLW9uLWRyYWciKTtpZigieSIhPT1hJiYieSIhPT1pJiYxPT09by5tYXhQb2ludGVycyYmIW4pe3Iuc3R5bGUudHJhbnNpdGlvbj0iIjt2YXIgbD1NYXRoLmFicyhvLnZlbG9jaXR5WCksYz1yLm9mZnNldExlZnQscz10WzBdLm9mZnNldFdpZHRoLF89ci5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX19pdGVtLmFjdGl2ZSIpLm9mZnNldExlZnQsZCxtPShzLU1hdGguYWJzKGMrXykpL2wvMWUzO20+LjY/bT0uNjptPC4yJiYobT0uMiksci5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249bSsicyIsby52ZWxvY2l0eVg8LS41fHxvLmRlbHRhWDwtODA/KHRfem9vbV91bnNjYWxlKCksdF96b29tX3Nob3dTbGlkZSgibmV4dCIpLHRfem9vbV9jaGVja0ZvclNjYWxlKCkpOm8udmVsb2NpdHlYPi41fHxvLmRlbHRhWD44MD8odF96b29tX3Vuc2NhbGUoKSx0X3pvb21fc2hvd1NsaWRlKCJwcmV2IiksdF96b29tX2NoZWNrRm9yU2NhbGUoKSk6dF96b29tX3Nob3dTbGlkZSgpfX0pKSl9fWZ1bmN0aW9uIHRfem9vbV9faW5pdEV2ZW50c29uTW9iaWxlKCl7aWYod2luZG93LnRfem9vbV9faXNNb2JpbGUpe3Rfem9vbV9zZXRIaWRlQ29udHJvbHNUaW1lcigpO3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fd3JhcHBlciIpLGU7WyJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJtb3VzZW1vdmUiXS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmFkZEV2ZW50TGlzdGVuZXIoZSx0X3pvb21fc2V0SGlkZUNvbnRyb2xzVGltZXIpfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsdF96b29tX191cGRhdGVTbGlkZXNIZWlnaHQpfX1mdW5jdGlvbiB0X3pvb21fX3VwZGF0ZVNsaWRlc0hlaWdodCgpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0gLnQtY2Fyb3VzZWxfX3pvb21lcl9faW1nIiksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3dyYXBwZXIiKTtpZihlJiZ0Lmxlbmd0aCl7dmFyIG89ZS5nZXRBdHRyaWJ1dGUoImRhdGEtbWF4LWNvbW1lbnQtaGVpZ2h0Iik7bz1wYXJzZUludChvLDEwKSxpc05hTihvKXx8c2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX19pdGVtLmFjdGl2ZSIpO2lmKHIpe3ZhciBuLGE9ZS5vZmZzZXRIZWlnaHQtci5vZmZzZXRIZWlnaHQrbyxpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQtYTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3Quc3R5bGUubWF4SGVpZ2h0PWkrInB4In0pKX19KSwzMDApfX1mdW5jdGlvbiB0X3pvb21fX2luaXRTaW5nbGVab29tKCl7dmFyIHQ7aWYoMT09PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0iKS5sZW5ndGgpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2NvbnRyb2wiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKHQpe3Quc3R5bGUuZGlzcGxheT0ibm9uZSJ9KSl9fWZ1bmN0aW9uIHRfem9vbV9fZ2V0RXZlbnRPbkJ0bigpe3ZhciB0O1t7bmFtZToicmlnaHQiLGRpcmVjdGlvbjoibmV4dCJ9LHtuYW1lOiJsZWZ0IixkaXJlY3Rpb246InByZXYifV0uZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fY29udHJvbF8iK3QubmFtZSkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbigpe3Rfem9vbV9fc2V0RXZlbnRPbkJ0bih0LmRpcmVjdGlvbil9KSl9KSl9ZnVuY3Rpb24gdF96b29tX19zZXRFdmVudE9uQnRuKHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX3RyYWNrIiksbz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3dyYXBwZXIiKSxyPWUuZ2V0QXR0cmlidXRlKCJkYXRhLW9uLXRyYW5zaXRpb24iKSxuPW8uZ2V0QXR0cmlidXRlKCJkYXRhLW9uLWRyYWciKTsieSIhPT1yJiYieSIhPT1uJiYodF96b29tX3Vuc2NhbGUoKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfem9vbV9zaG93U2xpZGUodCksdF96b29tX2NoZWNrRm9yU2NhbGUoKX0pKSl9ZnVuY3Rpb24gdF96b29tX19hZGRpbmdJbWdzSW50b0Nhcm91c2VsKHQpe3ZhciBlPXQuY2xvc2VzdCgiLnIiKSxvPWU/ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC16b29tYWJsZTpub3QoLnQtc2xkc19fdGh1bWJzX2dhbGxlcnkpOm5vdCgudG4tYXRvbV9fc2xkcy1pbWcpIik6W10scjtpZihlP2UucXVlcnlTZWxlY3RvcigiLnQtc2xkcyIpOm51bGwpe3ZhciBuPXQuY2xvc2VzdCgiLnQtc2xkcyIpO24mJihvPW4ucXVlcnlTZWxlY3RvckFsbCgiLnQtem9vbWFibGU6bm90KC50LXNsZHNfX3RodW1ic19nYWxsZXJ5KSIpKSxuJiZuLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X192aWRlby13cmFwcGVyIikmJihvPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG8pKS5zcGxpY2UoLTEsMSl9dmFyIGE9dF96b29tX19nZXRab29tRGVzY3JpcHRpb25Gb250RmFtaWx5KGUpLGk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKSxsPSJ5Ij09PXdpbmRvdy5sYXp5O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCxlKXt2YXIgcj10LmdldEF0dHJpYnV0ZSgiZGF0YS1pbWctem9vbS11cmwiKSxuPSIiLGM9IiIscz1yP3Iuc3BsaXQoIiwiKToiIixfLGQ7IklNRyIhPT10Lm5vZGVOYW1lJiYiRElWIiE9PXQubm9kZU5hbWV8fChuPXQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfHwiIixjPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWltZy16b29tLWRlc2NyIil8fCIiKSxuJiYoKF89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX190aXRsZSIpLF8uY2xhc3NMaXN0LmFkZCgidC1kZXNjciIpLF8uY2xhc3NMaXN0LmFkZCgidC1kZXNjcl94eHMiKSxfLnRleHRDb250ZW50PW4sYSYmYS50aXRsZUZvbnRGYW1pbHkmJihfLnN0eWxlLmZvbnRGYW1pbHk9YS50aXRsZUZvbnRGYW1pbHkpKSxjJiYoKGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX19kZXNjciIpLGQuY2xhc3NMaXN0LmFkZCgidC1kZXNjciIpLGQuY2xhc3NMaXN0LmFkZCgidC1kZXNjcl94eHMiKSxkLnRleHRDb250ZW50PWMsYSYmYS5kZXNjckZvbnRGYW1pbHkmJihkLnN0eWxlLmZvbnRGYW1pbHk9YS5kZXNjckZvbnRGYW1pbHkpKTt2YXIgbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTttLmNsYXNzTGlzdC5hZGQoInQtY2Fyb3VzZWxfX3pvb21lcl9faXRlbSIpO3ZhciB1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3UuY2xhc3NMaXN0LmFkZCgidC1jYXJvdXNlbF9fem9vbWVyX193cmFwcGVyIik7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7aWYoZi5jbGFzc0xpc3QuYWRkKCJ0LWNhcm91c2VsX196b29tZXJfX2ltZyIpLGw/KGYuY2xhc3NMaXN0LmFkZCgidC1pbWciKSxmLnNldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbCIscyksMCE9PWUmJmUhPT1vLmxlbmd0aC0xfHxmLnNldEF0dHJpYnV0ZSgiZGF0YS1sYXp5LXJ1bGUiLCJza2lwIikpOmYuc3JjPXMsbS5hcHBlbmRDaGlsZCh1KSx1LmFwcGVuZENoaWxkKGYpLG58fGN8fHdpbmRvdy50X3pvb21fX2lzTW9iaWxlKXt2YXIgcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtwLmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX19jb21tZW50cyIpLG4mJnAuYXBwZW5kQ2hpbGQoXyksYyYmcC5hcHBlbmRDaGlsZChkKSxtLmFwcGVuZENoaWxkKHApfWkuYXBwZW5kQ2hpbGQobSl9KSl9ZnVuY3Rpb24gdF96b29tX19nZXRab29tRGVzY3JpcHRpb25Gb250RmFtaWx5KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcignLnQ4MjdfX292ZXJsYXktdGl0bGUsIC50OTc5X19vdmVybGF5LXRpdGxlLCAudC1zbGRzX190aXRsZSwgLnQ2MDNfX3RpdGxlLCBbaXRlbXByb3A9Im5hbWUiXScpLG89dC5xdWVyeVNlbGVjdG9yKCcudDgyN19fb3ZlcmxheS1kZXNjciwgLnQ5NzlfX292ZXJsYXktZGVzY3IsIC50LXNsZHNfX2Rlc2NyLCAudDYwM19fZGVzY3IsIFtpdGVtcHJvcD0iZGVzY3JpcHRpb24iXScpLHIsbjtyZXR1cm57dGl0bGVGb250RmFtaWx5OmUmJmdldENvbXB1dGVkU3R5bGUoZSkuZm9udEZhbWlseXx8IiIsZGVzY3JGb250RmFtaWx5Om8mJmdldENvbXB1dGVkU3R5bGUobykuZm9udEZhbWlseXx8IiJ9fWZ1bmN0aW9uIHRfem9vbV9fY3JlYXRlQW5kTG9vcFNsaWRlcih0KXt2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX190cmFjayIpLG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX193cmFwcGVyIikscj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1jYXJvdXNlbF9fem9vbWVyX19pdGVtIik7aWYobyYmci5sZW5ndGgpe3ZhciBuPW8ub2Zmc2V0SGVpZ2h0LXJbMF0ub2Zmc2V0SGVpZ2h0LGE9MDt3aW5kb3cudF96b29tX19pc01vYmlsZSYmKGE9QXJyYXkucHJvdG90eXBlLnJlZHVjZS5jYWxsKHIsKGZ1bmN0aW9uKHQsZSl7dmFyIG89ZS5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX2NvbW1lbnRzIikscj1vP28ub2Zmc2V0SGVpZ2h0OjA7cmV0dXJuIHI+dD9yOnR9KSwwKSxvLnNldEF0dHJpYnV0ZSgiZGF0YS1tYXgtY29tbWVudC1oZWlnaHQiLGEpKTt2YXIgaT0ieSI9PT13aW5kb3cubGF6eTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9faW1nIiksbz1pPyJkYXRhLW9yaWdpbmFsIjoic3JjIixyPWUuZ2V0QXR0cmlidXRlKG8pLGw9dC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX2NvbW1lbnRzIiksYz1sP2wub2Zmc2V0SGVpZ2h0OjA7d2luZG93LnRfem9vbV9faXNNb2JpbGUmJihjPWEpO3ZhciBzPW4rYztsJiYobC5zdHlsZS5oZWlnaHQ9YysicHgiKSxlLnN0eWxlLm1heEhlaWdodD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LXMrInB4Ijt2YXIgXz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1jYXJvdXNlbF9fem9vbWVyX19hcnJvd19fd3JhcHBlciIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoXywoZnVuY3Rpb24odCl7dC5zdHlsZS50b3A9Yz8iY2FsYyg1MCUgLSAiK2MvMisicHgpIjoiNTAlIn0pKX0pKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKHQsZSl7dC5zZXRBdHRyaWJ1dGUoImRhdGEtem9vbWVyLXNsaWRlLW51bWJlciIsZSl9KSksci5sZW5ndGg+MSYmdF96b29tX2xvb3BTbGlkZXIoKTt2YXIgbD10LmdldEF0dHJpYnV0ZSgiZGF0YS1pbWctem9vbS11cmwiKSxjLHM9Ii50LWNhcm91c2VsX196b29tZXJfX2ltZ1siKyhpPyJkYXRhLW9yaWdpbmFsIjoic3JjIikrJz0iJytsKyciXScsXz1sP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iocyk6bnVsbCxkPV8/Xy5jbG9zZXN0KCIudC1jYXJvdXNlbF9fem9vbWVyX19pdGVtIik6bnVsbDtpZihkKXt2YXIgbT0hIWQmJmQub2Zmc2V0TGVmdDtkLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLHRfem9vbV9faGlkZUlubmFjdGl2ZVNsaWRlcyhkLGUpLGUuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsZS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoIistbSsicHgpIixzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Uuc3R5bGUudHJhbnNpdGlvbj0iIn0pLDIwMCl9aSYmKHRfb25GdW5jTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLHRfbGF6eWxvYWRfdXBkYXRlKSxkJiZ0X3pvb21fX3ByZWxvYWROZXh0U2xpZGUoZCxlKSl9fWZ1bmN0aW9uIHRfem9vbV9faGlkZUlubmFjdGl2ZVNsaWRlcyh0LGUpe2lmKHQpe3ZhciBvPXRfem9vbV9fZ2V0U2xpZGVMaXN0KGUpO2lmKCEoby5sZW5ndGg8PTYpKXt2YXIgcj10X3pvb21fX2dldEN1cnJlbnRTbGlkZUluZGV4KHQpLG49W3JdO24ucHVzaCgwPT09cj9vLmxlbmd0aDpyLTEpLG4ucHVzaChyPT09by5sZW5ndGg/MDpyKzEpO3ZhciBhPSJ0LWNhcm91c2VsX196b29tZXJfX2l0ZW0taW5uYWN0aXZlIjtvLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXRfem9vbV9fZ2V0Q3VycmVudFNsaWRlSW5kZXgodCksbz0tMSE9PW4uaW5kZXhPZihlKT8icmVtb3ZlIjoiYWRkIjt0LmNsYXNzTGlzdFtvXShhKX0pKX19fWZ1bmN0aW9uIHRfem9vbV9fZ2V0U2xpZGVMaXN0KHQpe3JldHVybiBBcnJheS5mcm9tKHQucXVlcnlTZWxlY3RvckFsbCgiLnQtY2Fyb3VzZWxfX3pvb21lcl9faXRlbTpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpIikpfWZ1bmN0aW9uIHRfem9vbV9fcHJlbG9hZE5leHRTbGlkZSh0LGUpe3ZhciBvPXRfem9vbV9fZ2V0Q3VycmVudFNsaWRlSW5kZXgodCkscj10X3pvb21fX2dldFNsaWRlTGlzdChlKSxuPXJbbysxXXx8clswXTtpZihuKXt2YXIgYT1uLnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2ltZyIpLGk9ImxvYWRlZCI7YSYmIWEuY2xhc3NMaXN0LmNvbnRhaW5zKGkpJiZ0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfc2V0U291cmNlcyIsKGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF9zZXRTb3VyY2VzKGEsYSwib3JpZ2luYWwtc2V0Iiwib3JpZ2luYWwiKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe2EuY2xhc3NMaXN0LmFkZChpKX0pKX0pKX19ZnVuY3Rpb24gdF96b29tX19nZXRDdXJyZW50U2xpZGVJbmRleCh0KXtyZXR1cm4gdCYmcGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoImRhdGEtem9vbWVyLXNsaWRlLW51bWJlciIpLDEwKXx8MH1mdW5jdGlvbiB0X3pvb21fc2hvd1NsaWRlKHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX3RyYWNrIiksbz1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0iKSxyPWUucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9faXRlbS5hY3RpdmUiKSxuPTAsYT0ieSI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1jYWNoZWQtem9vbSIpO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCxlKXt0PT09ciYmKG49ZSl9KSksIm5leHQiPT09dHx8InByZXYiPT09dCl7dmFyIGk9Im5leHQiPT09dD9uKzE6by5sZW5ndGgrKG4tMSk7bj1pJW8ubGVuZ3RoLGUuc2V0QXR0cmlidXRlKCJkYXRhLW9uLXRyYW5zaXRpb24iLCJ5Iiksd2luZG93LnRfem9vbV9faXNNb2JpbGUmJiIwcyI9PT1nZXRDb21wdXRlZFN0eWxlKGUpLnRyYW5zaXRpb25EdXJhdGlvbiYmIWEmJihlLnN0eWxlLnRyYW5zaXRpb249IiIpfXZhciBsPW9bbl0sYz1sLm9mZnNldExlZnQ7aWYoci5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSxsLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLGUuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKCIrLWMrInB4KSIsdF96b29tX19oaWRlSW5uYWN0aXZlU2xpZGVzKGwsZSksYSl7ZS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtY2FjaGVkLXpvb20iKTt2YXIgcz1uZXcgRXZlbnQoInRyYW5zaXRpb25lbmQiKTtlLmRpc3BhdGNoRXZlbnQocyl9aWYoInkiPT09d2luZG93Lmxhenkpe3Rfem9vbV9fcHJlbG9hZE5leHRTbGlkZShsLGUpLHRfb25GdW5jTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLHRfbGF6eWxvYWRfdXBkYXRlKTt2YXIgXz1sLnF1ZXJ5U2VsZWN0b3IoImltZyIpO18mJiFfLnNyYyYmc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIix0X2xhenlsb2FkX3VwZGF0ZSl9KSwyMDApfX1mdW5jdGlvbiB0X3pvb21fdHJhbnNpdEZvckxvb3AodCl7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKSxvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0iKSxyLG47dCYmKCJzdGFydCI9PT10JiYocj1vLmxlbmd0aC0yKSwiZW5kIj09PXQmJihyPTEpLG49b1tyXS5vZmZzZXRMZWZ0LEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCxlKXtlPT09cj90LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpOnQuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIil9KSksZS5zdHlsZS50cmFuc2l0aW9uPSJub25lIixlLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgiKy1uKyJweCkiLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5zdHlsZS50cmFuc2l0aW9uPSIiLCJ5Ij09PXdpbmRvdy5sYXp5JiZ0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIix0X2xhenlsb2FkX3VwZGF0ZSl9KSkpfWZ1bmN0aW9uIHRfem9vbV9sb29wU2xpZGVyKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKSxlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtY2Fyb3VzZWxfX3pvb21lcl9faXRlbSIpLG89ZVswXS5jbG9uZU5vZGUoITApLHI9ZVtlLmxlbmd0aC0xXS5jbG9uZU5vZGUoITApO28uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIiksci5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSx0X3pvb21fX3VwZGF0ZUNsb25lZEltZ1NyYyhlWzBdLGVbZS5sZW5ndGgtMV0sbyxyKSx0Lmluc2VydEJlZm9yZShyLHQuZmlyc3RDaGlsZCksdC5hcHBlbmRDaGlsZChvKTt2YXIgbj0oZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0iKSkubGVuZ3RoLGE7WyJ0cmFuc2l0aW9uZW5kIiwid2Via2l0VHJhbnNpdGlvbkVuZCIsIm9UcmFuc2l0aW9uRW5kIl0uZm9yRWFjaCgoZnVuY3Rpb24obyl7dC5hZGRFdmVudExpc3RlbmVyKG8sKGZ1bmN0aW9uKCl7dmFyIG89MDtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKHQsZSl7dC5jbGFzc0xpc3QuY29udGFpbnMoImFjdGl2ZSIpJiYobz1lKX0pKSwwPT09byYmdF96b29tX3RyYW5zaXRGb3JMb29wKCJzdGFydCIpLG89PT1uLTEmJnRfem9vbV90cmFuc2l0Rm9yTG9vcCgiZW5kIiksdC5zZXRBdHRyaWJ1dGUoImRhdGEtb24tdHJhbnNpdGlvbiIsIiIpfSkpfSkpfWZ1bmN0aW9uIHRfem9vbV9fdXBkYXRlQ2xvbmVkSW1nU3JjKHQsZSxvLHIpe2lmKCJ5Ij09PXdpbmRvdy5sYXp5KXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoImltZyIpLGE9ZS5xdWVyeVNlbGVjdG9yKCJpbWciKSxpPW8ucXVlcnlTZWxlY3RvcigiaW1nIiksbD1yLnF1ZXJ5U2VsZWN0b3IoImltZyIpLGM9W24sYSxpLGxdO2lmKCFjLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiF0fSkpJiYiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBzPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbih0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlOyJhdHRyaWJ1dGVzIj09PXQudHlwZSYmInNyYyI9PT10LmF0dHJpYnV0ZU5hbWUmJih0LnRhcmdldD09PW4mJihlPWkpLHQudGFyZ2V0PT09YSYmKGU9bCksdC50YXJnZXQ9PT1pJiYoZT1uKSx0LnRhcmdldD09PWwmJihlPWEpLHQudGFyZ2V0LnNyYyYmIWUuc3JjJiYoZS5zcmM9dC50YXJnZXQuc3JjKSl9KSl9KSk7Yy5mb3JFYWNoKChmdW5jdGlvbih0KXtzLm9ic2VydmUodCx7YXR0cmlidXRlczohMH0pfSkpfX19ZnVuY3Rpb24gdF96b29tX2luaXRDbG9zZVN3aXBlKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX193cmFwcGVyIiksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX190cmFjayIpLG89ITEscixuPW5ldyBIYW1tZXIodCx7ZG9tRXZlbnRzOiEwLGlucHV0Q2xhc3M6SGFtbWVyLlRvdWNoSW5wdXQsY3NzUHJvcHM6e3RvdWNoQ29sbG91dDoiZGVmYXVsdCJ9LHJlY29nbml6ZXJzOltbSGFtbWVyLlBhbix7ZGlyZWN0aW9uOkhhbW1lci5ESVJFQ1RJT05fVkVSVElDQUx9XV19KTtuLm9uKCJwYW5zdGFydCIsKGZ1bmN0aW9uKCl7cj10Lm9mZnNldFRvcCx0LnN0eWxlLnBvc2l0aW9uPSJub25lIixvPXRfem9vbV9faXNTY2FsZWQodCl9KSksbi5vbigicGFubW92ZSIsKGZ1bmN0aW9uKG4pe3ZhciBhPU1hdGguYWJzKG4uZGVsdGFZKTtpZigoInkiIT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtb24tZHJhZyIpfHwieSI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1vbi1kcmFnIikpJiYobi5hbmdsZT4tMTIwJiZuLmFuZ2xlPC02MHx8bi5hbmdsZTwxMjAmJm4uYW5nbGU+NjApJiYxPT09bi5tYXhQb2ludGVycyYmIW8pe2E+NDAmJnQuc2V0QXR0cmlidXRlKCJkYXRhLW9uLWRyYWciLCJ5Iik7dmFyIGk9cituLmRlbHRhWTt0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWSgiK2krInB4KSJ9fSkpLG4ub24oInBhbmVuZCIsdF96b29tX2Nsb3NlU3dpcGVIYW5kbGVyKX1mdW5jdGlvbiB0X3pvb21fY2xvc2VTd2lwZUhhbmRsZXIodCl7dmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX193cmFwcGVyIiksbz0zMDAscj10X3pvb21fX2lzU2NhbGVkKGUpO2Uuc3R5bGUudHJhbnNpdGlvbj0idHJhbnNmb3JtIDMwMG1zIGVhc2Utb3V0IixNYXRoLmFicyh0LmRlbHRhWSk8NDAmJihlLnN0eWxlLnRyYW5zZm9ybT0iIiksInkiIT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtb24tZHJhZyIpfHwxIT09dC5tYXhQb2ludGVyc3x8cnx8KHQuZGVsdGFZPC0yMDB8fHQudmVsb2NpdHlZPC0uMz8oZS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVkoLTEwMHZoKSIsc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3pvb21fY2xvc2UoKSxlLnN0eWxlLnRyYW5zZm9ybT0iIn0pLG8pKTp0LmRlbHRhWT4yMDB8fHQudmVsb2NpdHlZPi4zPyhlLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWSgxMDB2aCkiLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF96b29tX2Nsb3NlKCksZS5zdHlsZS50cmFuc2Zvcm09IiJ9KSxvKSk6ZS5zdHlsZS50cmFuc2Zvcm09IiIpLGUuc2V0QXR0cmlidXRlKCJkYXRhLW9uLWRyYWciLCIiKX1mdW5jdGlvbiB0X3pvb21fY2hlY2tGb3JTY2FsZSgpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0uYWN0aXZlIC50LWNhcm91c2VsX196b29tZXJfX2ltZzpub3QoLmxvYWRlZCkiKTtpZih0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG89ISFlJiYieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKTtpZigieSI9PT13aW5kb3cubGF6eXx8byl7dmFyIHI9RGF0ZS5ub3coKTt0X3pvb21fX3dhaXRJbWdGb3JTY2FsZSh0LHIsKGZ1bmN0aW9uKCl7dF96b29tX2NoZWNrVG9TY2FsZUluaXQodCl9KSl9ZWxzZSB0LmNvbXBsZXRlP3Rfem9vbV9jaGVja1RvU2NhbGVJbml0KHQpOnQub25sb2FkPWZ1bmN0aW9uKCl7dF96b29tX2NoZWNrVG9TY2FsZUluaXQodCl9fX1mdW5jdGlvbiB0X3pvb21fX3dhaXRJbWdGb3JTY2FsZSh0LGUsbyl7aWYodC5zcmMmJnQubmF0dXJhbFdpZHRoJiZ0Lm5hdHVyYWxIZWlnaHQpbygpO2Vsc2UgaWYoRGF0ZS5ub3coKS1lPDNlMylzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfem9vbV9fd2FpdEltZ0ZvclNjYWxlKHQsZSxvKX0pLDUwMCk7ZWxzZXt2YXIgcj10Lm5hdHVyYWxXaWR0aCxuPXQubmF0dXJhbEhlaWdodDtjb25zb2xlLndhcm4oInpvb21lZCBpbWFnZSBpc24ndCBjb21wbGV0ZSwgbmF0dXJhbCB3aWR0aDogIityKyIsIG5hdHVyYWwgaGVpZ2h0OiAiK24pLG8oKX19ZnVuY3Rpb24gdF96b29tX2NoZWNrVG9TY2FsZUluaXQodCl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgsbz13aW5kb3cuaW5uZXJIZWlnaHQscj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3dyYXBwZXIiKTtyLmNsYXNzTGlzdC5yZW1vdmUoInpvb21lci1uby1zY2FsZSIpO3ZhciBuPXQuaGFzQXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXN2Zy1oZWlnaHQiKXx8dC5oYXNBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtc3ZnLXdpZHRoIiksYT1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC1zdmctaGVpZ2h0IiksMTApfHx0Lm5hdHVyYWxIZWlnaHQsaT1wYXJzZUludCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC1zdmctd2lkdGgiKSwxMCl8fHQubmF0dXJhbFdpZHRoOy0xPT09dC5zcmMuaW5kZXhPZigiLnN2ZyIpfHx3aW5kb3cuaXNJRXx8bj9vPGF8fGU8aT8oIXdpbmRvdy5pc0RvdWJsZXRhcFNjYWxlQWRkZWQmJndpbmRvdy50X3pvb21fX2lzTW9iaWxlJiZ0X3pvb21fZG91YmxldGFwU2NhbGVJbml0KCksdF96b29tX3NjYWxlX2luaXQoKSk6KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fc2NhbGUiKS5zdHlsZS5kaXNwbGF5PSIiLHIuY2xhc3NMaXN0LmFkZCgiem9vbWVyLW5vLXNjYWxlIikpOnRfem9vbV9mZXRjaFNWRyh0LG8sZSl9ZnVuY3Rpb24gdF96b29tX2ZldGNoU1ZHKHQsZSxvKXt2YXIgcj10LnNyYztmZXRjaChyKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdC50ZXh0KCl9KSkudGhlbigoZnVuY3Rpb24ocil7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsbiksbi5pbm5lckhUTUw9cjt2YXIgYT1uLnF1ZXJ5U2VsZWN0b3IoInN2ZyIpLGk9TWF0aC5yb3VuZChhLmdldEJCb3goKS53aWR0aCksbD1NYXRoLnJvdW5kKGEuZ2V0QkJveCgpLmhlaWdodCksYz1pL2wscz01ZTM7aT5zJiYoaT1zLGw9TWF0aC5yb3VuZChpL2MpKSx0LnNldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC1zdmctd2lkdGgiLGkpLHQuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXN2Zy1oZWlnaHQiLGwpO3ZhciBfPWU8bHx8bzxpLGQ9YS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksbT1hLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksdTsoZHx8bSkmJiFffHwodC5zdHlsZS53aWR0aD1pKyJweCIsdC5zdHlsZS5oZWlnaHQ9bCsicHgiKSxfPyghd2luZG93LmlzRG91YmxldGFwU2NhbGVBZGRlZCYmd2luZG93LnRfem9vbV9faXNNb2JpbGUmJnRfem9vbV9kb3VibGV0YXBTY2FsZUluaXQoKSx0X3pvb21fc2NhbGVfaW5pdCgpKTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3NjYWxlIikuc3R5bGUuZGlzcGxheT0iIixkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG4pfSkpfWZ1bmN0aW9uIHRfem9vbV9zY2FsZV9pbml0KCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX193cmFwcGVyIiksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC16b29tZXJfX3NjYWxlIik7ZS5zdHlsZS5kaXNwbGF5PSJibG9jayIsInkiIT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtem9vbS1zY2FsZS1pbml0IikmJihlLnNldEF0dHJpYnV0ZSgiZGF0YS16b29tLXNjYWxlLWluaXQiLCJ5IiksdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKGZ1bmN0aW9uKGUpe3ZhciBvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0uYWN0aXZlIC50LWNhcm91c2VsX196b29tZXJfX2ltZyIpLHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9fdHJhY2siKSxuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2lubmVyIiksYT0hdC5jbGFzc0xpc3QuY29udGFpbnMoInpvb21lci1uby1zY2FsZSIpOyh3aW5kb3cudF96b29tX19pc01vYmlsZSYmZS50YXJnZXQuY2xvc2VzdCgiLnQtem9vbWVyX19zY2FsZSIpJiZhfHwhd2luZG93LnRfem9vbV9faXNNb2JpbGUmJmEmJiFlLnRhcmdldC5jbG9zZXN0KCIudC16b29tZXJfX2Nsb3NlLCAudC1jYXJvdXNlbF9fem9vbWVyX19jb250cm9sIikpJiYoci5zZXRBdHRyaWJ1dGUoImRhdGEtb24tdHJhbnNpdGlvbiIsIiIpLHIuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsci5zdHlsZS50cmFuc2Zvcm09Im5vbmUiLG8uc3R5bGUubWF4SGVpZ2h0PSIiLHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzY2FsZS1hY3RpdmUiKT90X3pvb21fdW5zY2FsZSgpOih0LmNsYXNzTGlzdC5hZGQoInNjYWxlLWFjdGl2ZSIpLG4uY2xhc3NMaXN0LmFkZCgic2NhbGUtYWN0aXZlIiksd2luZG93LnRfem9vbV9faXNNb2JpbGU/dF96b29tX21vYmlsZVpvb21Qb3NpdGlvbmluZ0luaXQobyk6dF96b29tX2Rlc2t0b3Bab29tUG9zaXRpb25pbmdJbml0KG8sZSkpKX0pLCExKSl9ZnVuY3Rpb24gdF96b29tX2RvdWJsZXRhcFNjYWxlSW5pdCgpe3dpbmRvdy5pc0RvdWJsZXRhcFNjYWxlQWRkZWQ9ITA7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX193cmFwcGVyIiksZTtuZXcgSGFtbWVyKHQse2RvbUV2ZW50czohMCxpbnB1dENsYXNzOkhhbW1lci5Ub3VjaElucHV0LGNzc1Byb3BzOnt0b3VjaENvbGxvdXQ6ImRlZmF1bHQifSxyZWNvZ25pemVyczpbW0hhbW1lci5UYXBdXX0pLm9uKCJ0YXAiLChmdW5jdGlvbihlKXtpZigyPT09ZS50YXBDb3VudCYmZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtem9vbWVyX19zaG93IikmJiFlLnRhcmdldC5jbG9zZXN0KCIudC1jYXJvdXNlbF9fem9vbWVyX19jb250cm9sIikpe3ZhciBvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0uYWN0aXZlIC50LWNhcm91c2VsX196b29tZXJfX2ltZyIpLHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2Fyb3VzZWxfX3pvb21lcl9faW5uZXIiKSxuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX3RyYWNrIik7by5zdHlsZS5tYXhIZWlnaHQ9IiIsbi5zdHlsZS50cmFuc2l0aW9uPSJub25lIixuLnN0eWxlLnRyYW5zZm9ybT0ibm9uZSIsdC5jbGFzc0xpc3QuY29udGFpbnMoInNjYWxlLWFjdGl2ZSIpP3Rfem9vbV91bnNjYWxlKCk6KHQuY2xhc3NMaXN0LmFkZCgic2NhbGUtYWN0aXZlIiksci5jbGFzc0xpc3QuYWRkKCJzY2FsZS1hY3RpdmUiKSx0X3pvb21fbW9iaWxlWm9vbVBvc2l0aW9uaW5nSW5pdChvKSl9fSkpfWZ1bmN0aW9uIHRfem9vbV9kZXNrdG9wWm9vbVBvc2l0aW9uaW5nSW5pdCh0LGUpe3ZhciBvPSh3aW5kb3cuaW5uZXJXaWR0aC10Lm9mZnNldFdpZHRoKS8yLHI9KHdpbmRvdy5pbm5lckhlaWdodC10Lm9mZnNldEhlaWdodCkvMixuLGEsaSxsLGM9dC5nZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtc3ZnLXdpZHRoIil8fHQubmF0dXJhbFdpZHRoLHM9dC5nZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtc3ZnLWhlaWdodCIpfHx0Lm5hdHVyYWxIZWlnaHQ7ZnVuY3Rpb24gXyh0LGUpe2k9MTAwKih2b2lkIDAhPT10LnRvdWNoZXM/dC50b3VjaGVzWzBdLmNsaWVudFg6dC5jbGllbnRYKS93aW5kb3cuaW5uZXJXaWR0aCxsPS1pKihlLm9mZnNldFdpZHRoLXdpbmRvdy5pbm5lcldpZHRoKS8xMDAsZS5zdHlsZS5sZWZ0PWwrInB4In1mdW5jdGlvbiBkKHQsZSl7bj0xMDAqKHZvaWQgMCE9PXQudG91Y2hlcz90LnRvdWNoZXNbMF0uY2xpZW50WTp0LmNsaWVudFkpL3dpbmRvdy5pbm5lckhlaWdodCxhPS1uKihlLm9mZnNldEhlaWdodC13aW5kb3cuaW5uZXJIZWlnaHQpLzEwMCxlLnN0eWxlLnRvcD1hKyJweCJ9dC5zdHlsZS5sZWZ0PW8rInB4Iix0LnN0eWxlLnRvcD1yKyJweCIsd2luZG93LmlubmVyV2lkdGg8YyYmd2luZG93LmlubmVySGVpZ2h0PHM/KGk9MTAwKmUuY2xpZW50WC93aW5kb3cuaW5uZXJXaWR0aCxsPS1pKihjLXdpbmRvdy5pbm5lcldpZHRoKS8xMDAsbj0xMDAqZS5jbGllbnRZL3dpbmRvdy5pbm5lckhlaWdodCxhPS1uKihzLXdpbmRvdy5pbm5lckhlaWdodCkvMTAwLHQuc3R5bGUubGVmdD1sKyJweCIsdC5zdHlsZS50b3A9YSsicHgiLHdpbmRvdy50X3pvb21fX2lzTW9iaWxlP3Qub250b3VjaG1vdmU9ZnVuY3Rpb24oZSl7XyhlLHQpLGQoZSx0KX06dC5vbm1vdXNlbW92ZT1mdW5jdGlvbihlKXtfKGUsdCksZChlLHQpfSk6d2luZG93LmlubmVyV2lkdGg8Yz8oaT0xMDAqZS5jbGllbnRYL3dpbmRvdy5pbm5lcldpZHRoLGw9LWkqKGMtd2luZG93LmlubmVyV2lkdGgpLzEwMCx0LnN0eWxlLmxlZnQ9bCsicHgiLHdpbmRvdy50X3pvb21fX2lzTW9iaWxlP3Qub250b3VjaG1vdmU9ZnVuY3Rpb24oZSl7XyhlLHQpfTp0Lm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKGUpe18oZSx0KX0pOndpbmRvdy5pbm5lckhlaWdodDxzJiYobj0xMDAqZS5jbGllbnRZL3dpbmRvdy5pbm5lckhlaWdodCxhPS1uKihzLXdpbmRvdy5pbm5lckhlaWdodCkvMTAwLHQuc3R5bGUudG9wPWErInB4Iix3aW5kb3cudF96b29tX19pc01vYmlsZT90Lm9udG91Y2htb3ZlPWZ1bmN0aW9uKGUpe2QoZSx0KX06dC5vbm1vdXNlbW92ZT1mdW5jdGlvbihlKXtkKGUsdCl9KX1mdW5jdGlvbiB0X3pvb21fbW9iaWxlWm9vbVBvc2l0aW9uaW5nSW5pdCh0KXt2YXIgZT0od2luZG93LmlubmVyV2lkdGgtdC5vZmZzZXRXaWR0aCkvMixvPSh3aW5kb3cuaW5uZXJIZWlnaHQtdC5vZmZzZXRIZWlnaHQpLzI7dC5zdHlsZS5sZWZ0PWUrInB4Iix0LnN0eWxlLnRvcD1vKyJweCI7dmFyIHI9e3g6MCx5OjB9LG49e30sYT17fTt0Lm9udG91Y2hzdGFydD1mdW5jdGlvbih0KXtuPXRfem9vbV9nZXRUb3VjaEV2ZW50WFkodCl9LHQub250b3VjaG1vdmU9ZnVuY3Rpb24oaSl7dmFyIGw9dF96b29tX2dldFRvdWNoRXZlbnRYWShpKSxjPTEuNSxzPShsLngtbi54KSpjLF89KGwueS1uLnkpKmM7YS54PXIueCtzLGEueT1yLnkrXyxhLng+LWUmJihhLng9LWUpLGEueDxlJiYoYS54PWUpLGEueT4tbyYmKGEueT0tbyksYS55PG8mJihhLnk9byksdC5vZmZzZXRIZWlnaHQ8d2luZG93LmlubmVySGVpZ2h0JiYoYS55PTApLHQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUoIithLngrInB4LCAiK2EueSsicHgpIn0sdC5vbnRvdWNoZW5kPWZ1bmN0aW9uKCl7ci54PWEueCxyLnk9YS55fSx0Lm9udG91Y2hjYW5jZWw9ZnVuY3Rpb24oKXtyLng9YS54LHIueT1hLnl9fWZ1bmN0aW9uIHRfem9vbV9nZXRUb3VjaEV2ZW50WFkodCl7dmFyIGU9e3g6MCx5OjB9O2lmKFsidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwidG91Y2hjYW5jZWwiXS5pbmNsdWRlcyh0LnR5cGUpKXt2YXIgbz10LnRvdWNoZXNbMF18fHQuY2hhbmdlZFRvdWNoZXNbMF07ZS54PW8ucGFnZVgsZS55PW8ucGFnZVl9cmV0dXJuIGV9ZnVuY3Rpb24gdF96b29tX2Nsb3NlKCl7dF96b29tX3Vuc2NhbGUoKSxkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoInQtem9vbWVyX19zaG93IiksZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXpvb21lcl9fc2hvd19maXhlZCIpO3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fY29udGFpbmVyIik7dCYmKHQuaW5uZXJIVE1MPSIiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgidC16b29tZXJfX2FjdGl2ZSIpfSksMjAwKSx0X3pvb21fdW5sb2NrU2Nyb2xsKCksd2luZG93LnRfem9vbV9faXNNb2JpbGU/KHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsdF96b29tX191cGRhdGVTbGlkZXNIZWlnaHQpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsdF96b29tX191cGRhdGVBY3RpdmVTbGlkZVBvcykpOndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfem9vbV9fdXBkYXRlQWN0aXZlU2xpZGVQb3MpfWZ1bmN0aW9uIHRfem9vbV91bnNjYWxlKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtem9vbWVyX193cmFwcGVyLnNjYWxlLWFjdGl2ZSwgLnQtY2Fyb3VzZWxfX3pvb21lcl9faW5uZXIuc2NhbGUtYWN0aXZlIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInNjYWxlLWFjdGl2ZSIpfSkpO3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhcm91c2VsX196b29tZXJfX2l0ZW0uYWN0aXZlIiksbz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX190cmFjayIpLHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX193cmFwcGVyIik7aWYoZSl7dmFyIG49ZS5xdWVyeVNlbGVjdG9yKCIudC1jYXJvdXNlbF9fem9vbWVyX19pbWciKSxhPWUucXVlcnlTZWxlY3RvcigiLnQtem9vbWVyX19jb21tZW50cyIpO2lmKHIpe3ZhciBpPXIub2Zmc2V0SGVpZ2h0LWUub2Zmc2V0SGVpZ2h0LGw9YT9hLm9mZnNldEhlaWdodDowO3dpbmRvdy50X3pvb21fX2lzTW9iaWxlJiYobD1yLmdldEF0dHJpYnV0ZSgiZGF0YS1tYXgtY29tbWVudC1oZWlnaHQiKXx8bCk7dmFyIGM9aStsO24ub25tb3VzZW1vdmU9bnVsbCxuLm9udG91Y2htb3ZlPW51bGwsbi5zdHlsZS50cmFuc2Zvcm09IiIsbi5zdHlsZS5sZWZ0PSIiLG4uc3R5bGUudG9wPSIiLG4uc3R5bGUubWF4SGVpZ2h0PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQtYysicHgifX1pZih2b2lkIDAhPT1lLm9mZnNldExlZnQmJnZvaWQgMCE9PWUub2Zmc2V0VG9wKXt2YXIgcz1lLm9mZnNldExlZnQ7by5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoIistcysicHgpIn10Lmxlbmd0aCYmby5zZXRBdHRyaWJ1dGUoImRhdGEtY2FjaGVkLXpvb20iLCJ5Iiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtvLnN0eWxlLnRyYW5zaXRpb249IiJ9KSwxMDApfWZ1bmN0aW9uIHRfem9vbV9sb2NrU2Nyb2xsKCl7dmFyIHQ9LyhhbmRyb2lkKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksZTtpZigod2luZG93LnRfem9vbV9faXNpT1MmJjExPT09d2luZG93LnRfem9vbV9faU9TTWFqb3JWZXJzaW9uJiYhd2luZG93Lk1TU3RyZWFtfHx0KSYmIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWJvZHlfc2Nyb2xsLWxvY2tlZCIpKXt2YXIgbz13aW5kb3cucGFnZVlPZmZzZXQ7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJ0LWJvZHlfc2Nyb2xsLWxvY2tlZCIpLGRvY3VtZW50LmJvZHkuc3R5bGUudG9wPSItIitvKyJweCIsZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoImRhdGEtcG9wdXAtc2Nyb2xsdG9wIixvLnRvU3RyaW5nKCkpfX1mdW5jdGlvbiB0X3pvb21fdW5sb2NrU2Nyb2xsKCl7dmFyIHQ9LyhhbmRyb2lkKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksZTtpZigod2luZG93LnRfem9vbV9faXNpT1MmJjExPT09d2luZG93LnRfem9vbV9faU9TTWFqb3JWZXJzaW9uJiYhd2luZG93Lk1TU3RyZWFtfHx0KSYmZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtYm9keV9zY3JvbGwtbG9ja2VkIikpe3ZhciBvPWRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCJkYXRhLXBvcHVwLXNjcm9sbHRvcCIpO2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgidC1ib2R5X3Njcm9sbC1sb2NrZWQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD0iIixkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1wb3B1cC1zY3JvbGx0b3AiKSx3aW5kb3cuc2Nyb2xsVG8oMCxOdW1iZXIobykpfX1mdW5jdGlvbiB0X3pvb21fc2V0TW9kYWxDb2xvcih0LGUpe3ZhciBvPSIjZmZmZmZmIixyPSIjMDAwMDAwIixuPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWJnLWNvbG9yIiksYT1ufHxvLGk7YT0tMSE9PWEuaW5kZXhPZigiLWdyYWRpZW50KCIpP3Rfem9vbV9nZXRGaXJzdENvbG9yRnJvbUdyYWRpZW50KGEpOnRfem9vbV9oZXhUb1JnYihhKSxkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpIT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2F0YWxvZ19fcHJvZHVjdC1zbmlwcGV0LCAudC1zdG9yZV9fcHJvZHVjdC1zbmlwcGV0IikmJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikuY29udGFpbnMoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2F0YWxvZ19fcHJvZHVjdC1zbmlwcGV0LCAudC1zdG9yZV9fcHJvZHVjdC1zbmlwcGV0IikpJiZ0JiYoYT10LnN0eWxlLmJhY2tncm91bmRDb2xvcik7dmFyIGw9ZS5jbG9zZXN0KCIudC1wb3B1cCIpO2lmKGwpe3ZhciBjPWwuc3R5bGUuYmFja2dyb3VuZENvbG9yO2MmJihhPWMpfXZhciBzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXpvb21lcl9fY29udGFpbmVyIiksXz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC16b29tZXJfX3dyYXBwZXIgc3ZnIiksZD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC16b29tZXJfX2Nsb3NlLCAudC16b29tZXJfX3NjYWxlIiksbT1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2Fycm93X193cmFwcGVyIiksdSxmLHA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtem9vbWVyX190aXRsZSwgLnQtem9vbWVyX19kZXNjciIpLHk9ImJsYWNrIj09PXRfem9vbV9sdW1hX3JnYihhKT9yOm87eT09PXI/KHU9byxmPSJyZ2JhKDEsIDEsIDEsIDAuMykiLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobSwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QuYWRkKCJ0LWNhcm91c2VsX196b29tZXJfX2Fycm93X193cmFwcGVyX2RhcmsiKX0pKSk6KHU9cixmPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMykiLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobSwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWNhcm91c2VsX196b29tZXJfX2Fycm93X193cmFwcGVyX2RhcmsiKX0pKSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkLChmdW5jdGlvbih0KXt0LnN0eWxlLmJhY2tncm91bmQ9Zn0pKSxzLnN0eWxlLmJhY2tncm91bmRDb2xvcj15LHMuc3R5bGUuY29sb3I9dSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKF8sKGZ1bmN0aW9uKHQpeyJub25lIj09PXQuZ2V0QXR0cmlidXRlKCJmaWxsIik/dC5zZXRBdHRyaWJ1dGUoImZpbGwiLCJub25lIik6dC5zZXRBdHRyaWJ1dGUoImZpbGwiLHUpO3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgicGF0aCIpO2UubGVuZ3RoPjAmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dC5nZXRBdHRyaWJ1dGUoInN0cm9rZSIpJiZ0LnNldEF0dHJpYnV0ZSgic3Ryb2tlIix1KSx0LmdldEF0dHJpYnV0ZSgiZmlsbCIpJiZ0LnNldEF0dHJpYnV0ZSgiZmlsbCIsdSl9KSl9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChwLChmdW5jdGlvbih0KXt0LnN0eWxlLmNvbG9yPXV9KSl9ZnVuY3Rpb24gdF96b29tX2x1bWFfcmdiKHQpe2lmKCF0KXJldHVybiIiO3ZhciBlPUFycmF5LmlzQXJyYXkodCk7aWYodm9pZCAwPT09dClyZXR1cm4iYmxhY2siO2lmKDAhPT10LmluZGV4T2YoInJnYiIpJiYhZSlyZXR1cm4iYmxhY2siO3ZhciBvPWU/dDp0LnNwbGl0KCIoIilbMV0uc3BsaXQoIikiKVswXS5zcGxpdCgiLCIpO3JldHVybiBvLmxlbmd0aDwzfHwuMjEyNipvWzBdKy43MTUyKm9bMV0rLjA3MjIqb1syXTwxMjg/ImJsYWNrIjoid2hpdGUifWZ1bmN0aW9uIHRfem9vbV9oZXhUb1JnYih0KXt2YXIgZT1bMjU1LDI1NSwyNTVdO2lmKCF0fHwic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIGU7dmFyIG8scj0vXnZhclwoKC0tdWMtY29sb3ItY29sb3ItW2EtekEtWjAtOV0rKSxccyooLispXCkkLy5leGVjKHQpLG49dDtpZihyJiZyWzFdKXt2YXIgYT1yWzFdLGk7bj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKGEpfHxyWzJdfXZhciBsPS9eIz8oW2EtZjAtOV17Mn0pKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkkL2kuZXhlYyhuKSxjO3JldHVybiBsP2wuc3BsaWNlKDEpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQsMTYpfSkpOmV9ZnVuY3Rpb24gdF96b29tX2dldEZpcnN0Q29sb3JGcm9tR3JhZGllbnQodCl7dmFyIGU9WzI1NSwyNTUsMjU1XTtpZighdHx8InN0cmluZyIhPXR5cGVvZiB0KXJldHVybiBlO3ZhciBvLHI9Lyg/OnZhclwoKC0tdWMtY29sb3ItY29sb3ItW2EtekEtWjAtOV0rKSwpPyg/OihyZ2IpYT9cKChbMC05XSspLChbMC05XSspLChbMC05XSspKD86LFswLTkuJV0rKT9cKSl8KD86KCMpKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pKS8uZXhlYyh0KSxuLGE7aWYoIXIpcmV0dXJuIGU7aWYoclsyXSYmclszXSYmcls0XSYmcls1XSluPXJbMl0sYT1bclszXSxyWzRdLHJbNV1dO2Vsc2V7aWYoIShyWzZdJiZyWzddJiZyWzhdJiZyWzldKSlyZXR1cm4gZTtuPXJbNl0sYT1bcls3XSxyWzhdLHJbOV1dfXZhciBpPXJbMV07aWYoaSl7dmFyIGwsYz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKGkpO2lmKGMpe3ZhciBzPS9ecmdiYT9cKChbMC05XSspLFxzKihbMC05XSspLFxzKihbMC05XSspKD86LFxzKlswLTkuJV0rKT9cKSQvaS5leGVjKGMpLF89L14jKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pJC9pLmV4ZWMoYyk7cyYmKGE9cy5zcGxpY2UoMSksbj0icmdiIiksXyYmKGE9Xy5zcGxpY2UoMSksbj0iIyIpfX1yZXR1cm4gYS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUludCh0LCIjIj09PW4/MTY6MTApfSkpfWZ1bmN0aW9uIHRfem9vbV9zZXRIaWRlQ29udHJvbHNUaW1lcigpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhcm91c2VsX196b29tZXJfX2Fycm93X193cmFwcGVyLCAudC16b29tZXJfX3NjYWxlIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtem9vbWVyX19oaWRlLWFuaW1hdGlvbiIpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5hZGQoInQtem9vbWVyX19oaWRlLWFuaW1hdGlvbiIpfSkpfSkpfWZ1bmN0aW9uIHRfem9vbV9faXNTY2FsZWQodCl7cmV0dXJuIHdpbmRvdy52aXN1YWxWaWV3cG9ydCYmMSE9PXdpbmRvdy52aXN1YWxWaWV3cG9ydC5zY2FsZXx8dC5jbGFzc0xpc3QuY29udGFpbnMoInNjYWxlLWFjdGl2ZSIpfXRfb25SZWFkeSgoZnVuY3Rpb24oKXt3aW5kb3cudHpvb21pbml0ZWR8fHRfaW5pdFpvb20oKX0pKTsKCmZ1bmN0aW9uIHRfdmlkZW9QbGF5ZXJfX2luaXQoZSx0KXtyZXR1cm4ibXA0Ij09PXR8fCJ3ZWJtIj09PXQ/dF92aWRlb19faW5pdFBsYXllcl9faHRtbFZpZGVvKGUsdCk6InJ1dHViZSI9PT10P3RfdmlkZW9fX2luaXRQbGF5ZXJfX3J1dHViZShlKToidmt2aWRlbyI9PT10P3RfdmlkZW9fX2luaXRQbGF5ZXJfX3ZrdmlkZW8oZSk6InlvdXR1YmUiPT09dD90X3ZpZGVvX19pbml0UGxheWVyX195b3V0dWJlKGUpOiJ2aW1lbyI9PT10P3RfdmlkZW9fX2luaXRQbGF5ZXJfX3ZpbWVvKGUpOiJraW5lc2NvcGUiPT09dD90X3ZpZGVvX19pbml0UGxheWVyX19raW5lc2NvcGUoZSk6ImJvb21zdHJlYW0iPT09dD90X3ZpZGVvX19pbml0UGxheWVyX19ib29tc3RyZWFtKGUpOihjb25zb2xlLndhcm4oInVuc3VwcG9ydGVkIHZpZGVvIHR5cGU6Iix0KSxQcm9taXNlLnJlamVjdChudWxsKSl9ZnVuY3Rpb24gdF92aWRlb19fZG9SdXR1YmVDb21tYW5kKGUsdCl7ZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHt0eXBlOiJwbGF5ZXI6Iit0LGRhdGE6e319KSwiKiIpfWZ1bmN0aW9uIHRfdmlkZW9fX2RvVmltZW9Db21tYW5kKGUsdCl7ZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHttZXRob2Q6dCx2YWx1ZToidHJ1ZSJ9KSwiKiIpfWZ1bmN0aW9uIHRfdmlkZW9fX2RvQm9vbXN0cmVhbUNvbW1hbmQoZSx0LG8pe2UuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7Y29kZTpvLG1ldGhvZDoiYWN0aW9uIixhY3Rpb246dCxkYXRhOiIifSwiKiIpfWZ1bmN0aW9uIHRfdmlkZW9fX2dldFBsYXllcihlKXt2YXIgdDtyZXR1cm4gZS5UaWxkYVZpZGVvUGxheWVyfHxudWxsfWZ1bmN0aW9uIHRfdmlkZW9fX2luaXRQbGF5ZXJfX3lvdXR1YmUoZSl7dmFyIHQ9InlvdXR1YmUiO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxpKXt2YXIgbj1lLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO2lmKCFuKXJldHVybiBpKG5ldyBFcnJvcih0KyI6IElGcmFtZSBFbGVtZW50IG5vdCBGb3VuZCIpKTt0X29uRnVuY0xvYWQoInRfbG9hZEpzRmlsZSIsKGZ1bmN0aW9uKCl7dF9sb2FkSnNGaWxlKCJodHRwczovL3d3dy55b3V0dWJlLmNvbS9pZnJhbWVfYXBpIil9KSksdF9vbkZ1bmNMb2FkKCJZVCIsKGZ1bmN0aW9uKCl7dmFyIGk9bi5pZDtpZighWVQuUGxheWVyKXJldHVybiBzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RfdmlkZW9fX2luaXRQbGF5ZXJfX3lvdXR1YmUoZSkudGhlbihvKX0pLDMwMCk7dmFyIHI9bmV3IFlULlBsYXllcihpLHtldmVudHM6e29uUmVhZHk6ZnVuY3Rpb24gaShyKXt2YXIgYT1yLnRhcmdldCxkPXt2aWRlb1R5cGU6dCxwYXVzZTpmdW5jdGlvbiBlKCl7cmV0dXJuIGEucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uIGUoKXtyZXR1cm4gYS5wbGF5VmlkZW8oKX0sbXV0ZTpmdW5jdGlvbiBlKCl7cmV0dXJuIGNvbnNvbGUud2Fybih0KyIgTXV0ZSBpcyBub3QgaW1wbGVtZW50ZWQiKX0sdW5tdXRlOmZ1bmN0aW9uIGUoKXtyZXR1cm4gY29uc29sZS53YXJuKHQrIiBVbm11dGUgaXMgbm90IGltcGxlbWVudGVkIil9LHZpZGVvRWw6bixwbGF5ZXI6YX07cmV0dXJuIGUuVGlsZGFWaWRlb1BsYXllcj1kLG8oZCl9fX0pfSkpfSkpfWZ1bmN0aW9uIHRfdmlkZW9fX2luaXRQbGF5ZXJfX3ZpbWVvKGUpe3ZhciB0PSJ2aW1lbyI7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe3ZhciBuPWUucXVlcnlTZWxlY3RvcigiaWZyYW1lIik7aWYoIW4pcmV0dXJuIGkobmV3IEVycm9yKHQrIjogSUZyYW1lIEVsZW1lbnQgbm90IEZvdW5kIikpO3ZhciByPXtwYXVzZTpmdW5jdGlvbiBlKCl7cmV0dXJuIHRfdmlkZW9fX2RvVmltZW9Db21tYW5kKG4sInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24gZSgpe3JldHVybiB0X3ZpZGVvX19kb1ZpbWVvQ29tbWFuZChuLCJwbGF5Iil9LG11dGU6ZnVuY3Rpb24gZSgpe3JldHVybiBjb25zb2xlLndhcm4odCsiIE11dGUgaXMgbm90IGltcGxlbWVudGVkIil9LHVubXV0ZTpmdW5jdGlvbiBlKCl7cmV0dXJuIGNvbnNvbGUud2Fybih0KyIgVW5tdXRlIGlzIG5vdCBpbXBsZW1lbnRlZCIpfSx2aWRlb0VsOm4sdmlkZW9UeXBlOnR9O2UuVGlsZGFWaWRlb1BsYXllcj1yLG8ocil9KSl9ZnVuY3Rpb24gdF92aWRlb19faW5pdFBsYXllcl9fa2luZXNjb3BlKGUpe3ZhciB0PSJraW5lc2NvcGUiO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxpKXt2YXIgbj1lLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO2lmKCFuKXJldHVybiBpKG5ldyBFcnJvcih0KyI6IElGcmFtZSBFbGVtZW50IG5vdCBGb3VuZCIpKTt0X29uRnVuY0xvYWQoInRfbG9hZEpzRmlsZSIsKGZ1bmN0aW9uKCl7dF9sb2FkSnNGaWxlKCJodHRwczovL3BsYXllci5raW5lc2NvcGUuaW8vbGF0ZXN0L2lmcmFtZS5wbGF5ZXIuanMiKX0pKSx0X29uRnVuY0xvYWQoIktpbmVzY29wZSIsKGZ1bmN0aW9uKCl7dmFyIGk9bi5pZCxyPW4uc3JjO0tpbmVzY29wZS5JZnJhbWVQbGF5ZXIuY3JlYXRlKGkse3VybDpyfSkudGhlbigoZnVuY3Rpb24oaSl7dmFyIHI9e3BhdXNlOmZ1bmN0aW9uIGUoKXtyZXR1cm4gaS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uIGUoKXtyZXR1cm4gaS5wbGF5KCl9LG11dGU6ZnVuY3Rpb24gZSgpe3JldHVybiBjb25zb2xlLndhcm4odCsiIE11dGUgaXMgbm90IGltcGxlbWVudGVkIil9LHVubXV0ZTpmdW5jdGlvbiBlKCl7cmV0dXJuIGNvbnNvbGUud2Fybih0KyIgVW5tdXRlIGlzIG5vdCBpbXBsZW1lbnRlZCIpfSxwbGF5ZXI6aSx2aWRlb0VsOm4sdmlkZW9UeXBlOnR9O2UuVGlsZGFWaWRlb1BsYXllcj1yLG8ocil9KSl9KSl9KSl9ZnVuY3Rpb24gdF92aWRlb19faW5pdFBsYXllcl9fdmt2aWRlbyhlKXt2YXIgdD0idmt2aWRlbyI7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe3ZhciBuPWUucXVlcnlTZWxlY3RvcigiaWZyYW1lIik7aWYoIW4pcmV0dXJuIGkobmV3IEVycm9yKHQrIjogSUZyYW1lIEVsZW1lbnQgbm90IEZvdW5kIikpO3Rfb25GdW5jTG9hZCgidF9sb2FkSnNGaWxlIiwoZnVuY3Rpb24oKXt0X2xvYWRKc0ZpbGUoImh0dHBzOi8vdmt2aWRlby5ydS9qcy9hcGkvdmlkZW9wbGF5ZXIuanMiKX0pKSx0X29uRnVuY0xvYWQoIlZLIiwoZnVuY3Rpb24oKXt2YXIgaT1WSy5WaWRlb1BsYXllcihuKSxyPXt2aWRlb1R5cGU6dCxwYXVzZTpmdW5jdGlvbiBlKCl7cmV0dXJuIGkucGF1c2UoKX0scGxheTpmdW5jdGlvbiBlKCl7cmV0dXJuIGkucGxheSgpfSxtdXRlOmZ1bmN0aW9uIGUoKXtyZXR1cm4gaS5tdXRlKCl9LHVubXV0ZTpmdW5jdGlvbiBlKCl7cmV0dXJuIGkudW5tdXRlKCl9LHZpZGVvRWw6bixwbGF5ZXI6aX07cmV0dXJuIGUuVGlsZGFWaWRlb1BsYXllcj1yLG8ocil9KSl9KSl9ZnVuY3Rpb24gdF92aWRlb19faW5pdFBsYXllcl9fcnV0dWJlKGUpe3ZhciB0PSJydXR1YmUiO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxpKXt2YXIgbj1lLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO2lmKCFuKXJldHVybiBpKG5ldyBFcnJvcih0KyI6IElGcmFtZSBFbGVtZW50IG5vdCBGb3VuZCIpKTt2YXIgcj17dmlkZW9UeXBlOnQscGF1c2U6ZnVuY3Rpb24gZSgpe3JldHVybiB0X3ZpZGVvX19kb1J1dHViZUNvbW1hbmQobiwicGF1c2UiKX0scGxheTpmdW5jdGlvbiBlKCl7cmV0dXJuIHRfdmlkZW9fX2RvUnV0dWJlQ29tbWFuZChuLCJwbGF5Iil9LG11dGU6ZnVuY3Rpb24gZSgpe3JldHVybiBjb25zb2xlLndhcm4odCsiIE11dGUgaXMgbm90IGltcGxlbWVudGVkIil9LHVubXV0ZTpmdW5jdGlvbiBlKCl7cmV0dXJuIGNvbnNvbGUud2Fybih0KyIgVW5tdXRlIGlzIG5vdCBpbXBsZW1lbnRlZCIpfSx2aWRlb0VsOm59O3JldHVybiBlLlRpbGRhVmlkZW9QbGF5ZXI9cixvKHIpfSkpfWZ1bmN0aW9uIHRfdmlkZW9fX2luaXRQbGF5ZXJfX2h0bWxWaWRlbyhlLHQpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxpKXt2YXIgbj1lLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIik7aWYoIW4pcmV0dXJuIGkobmV3IEVycm9yKHQrIjogVmlkZW8gRWxlbWVudCBub3QgRm91bmQiKSk7dmFyIHI9e3ZpZGVvVHlwZTp0LHBhdXNlOmZ1bmN0aW9uIGUoKXtyZXR1cm4gbi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uIGUoKXtyZXR1cm4gbi5wbGF5KCl9LG11dGU6ZnVuY3Rpb24gZSgpe3JldHVybiBjb25zb2xlLndhcm4odCsiIE11dGUgaXMgbm90IGltcGxlbWVudGVkIil9LHVubXV0ZTpmdW5jdGlvbiBlKCl7cmV0dXJuIGNvbnNvbGUud2Fybih0KyIgVW5tdXRlIGlzIG5vdCBpbXBsZW1lbnRlZCIpfSx2aWRlb0VsOm59O3JldHVybiBlLlRpbGRhVmlkZW9QbGF5ZXI9cixvKHIpfSkpfWZ1bmN0aW9uIHRfdmlkZW9fX2luaXRQbGF5ZXJfX2Jvb21zdHJlYW0oZSl7dmFyIHQ9ImJvb21zdHJlYW0iO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxpKXt2YXIgbj1lLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpO2lmKCFuKXJldHVybiBpKG5ldyBFcnJvcih0KyI6IElGcmFtZSBFbGVtZW50IG5vdCBGb3VuZCIpKTt2YXIgcixhPS9ib29tc3RyZWFtLmNvbVwvKD86YmFsYW5jZXJcLyk/KFtBLVphLXowLTktXSspLyxkPW4uc3JjLm1hdGNoKGEpO2lmKCFkKXJldHVybiBpKG5ldyBFcnJvcih0KyI6IFZpZGVvSUQgbm90IEZvdW5kIikpO3ZhciBsPXtwYXVzZTpmdW5jdGlvbiBlKCl7cmV0dXJuIHRfdmlkZW9fX2RvQm9vbXN0cmVhbUNvbW1hbmQobiwicGF1c2UiLGRbMV0pfSxwbGF5OmZ1bmN0aW9uIGUoKXtyZXR1cm4gdF92aWRlb19fZG9Cb29tc3RyZWFtQ29tbWFuZChuLCJwbGF5IixkWzFdKX0sbXV0ZTpmdW5jdGlvbiBlKCl7cmV0dXJuIGNvbnNvbGUud2Fybih0KyIgTXV0ZSBpcyBub3QgaW1wbGVtZW50ZWQiKX0sdW5tdXRlOmZ1bmN0aW9uIGUoKXtyZXR1cm4gY29uc29sZS53YXJuKHQrIiBVbm11dGUgaXMgbm90IGltcGxlbWVudGVkIil9LHZpZGVvRWw6bix2aWRlb1R5cGU6dH07cmV0dXJuIGUuVGlsZGFWaWRlb1BsYXllcj1sLG8obCl9KSl9ZnVuY3Rpb24gdF92aWRlb19sYXp5bG9hZF9pbml0KCl7aWYoIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdyl7dmFyIGUsdD0zMDA7L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYodD0xNTApO3ZhciBvPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXZpZGVvLWxhenlsb2FkOm5vdCgudC12aWRlby1uby1sYXp5bG9hZCkiKSxpPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24oZSx0KXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUuaXNJbnRlcnNlY3Rpbmcpe3ZhciBvPWUudGFyZ2V0O3QudW5vYnNlcnZlKG8pLHRfdmlkZW9fbGF6eWxvYWRfX2FkZFZpZGVvKG8pfX0pKX0pLHtyb290TWFyZ2luOnQrInB4IDBweCJ9KTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKGUpe2kub2JzZXJ2ZShlKX0pKX1lbHNlIHRfdmlkZW9fbGF6eWxvYWRfX2FkZFZpZGVvV2l0aENoZWNrVmlld3BvcnQoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3RfdmlkZW9fbGF6eWxvYWRfX2FkZFZpZGVvV2l0aENoZWNrVmlld3BvcnQoKX0pLDMwMCkpfWZ1bmN0aW9uIHRfdmlkZW9fbGF6eWxvYWRfX2FkZFZpZGVvV2l0aENoZWNrVmlld3BvcnQoKXt2YXIgZT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LHQ9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLG89NzAwLGk7dCYmKG89MzUwKSxpPWRvY3VtZW50LmRvY3VtZW50TW9kZTw5P0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXZpZGVvLWxhenlsb2FkOm5vdCgudC12aWRlby1uby1sYXp5bG9hZCkiKSkuZmlsdGVyKChmdW5jdGlvbihlKXt2YXIgdD1lLmNsb3Nlc3QoIi5yIik7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk1X19vZmYiKSYmIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk3X19vZmYiKSYmIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0NDAwX19vZmYiKX0pKTpkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucjpub3QoLnQzOTVfX29mZik6bm90KC50Mzk3X19vZmYpOm5vdCgudDQwMF9fb2ZmKSAudC12aWRlby1sYXp5bG9hZDpub3QoLnQtdmlkZW8tbm8tbGF6eWxvYWQpIiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt2YXIgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49aS50b3Ascj1pLmJvdHRvbTsobj4wJiZuPGUrb3x8cj4wJiZyPGUrbykmJnRfdmlkZW9fbGF6eWxvYWRfX2FkZFZpZGVvKHQpfSkpfWZ1bmN0aW9uIHRfdmlkZW9fbGF6eWxvYWRfX2FkZFZpZGVvKGUpe3ZhciB0PXdpbmRvdy5tYXRjaE1lZGlhKCIobWF4LXdpZHRoOiA2NDBweCkiKS5tYXRjaGVzLG89ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LWxvYWQiKSxpPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvbGF6eS10eXBlIiksbj1lLmdldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktaWQiKSxyPW4/bi50cmltKCk6IiI7InlvdXR1YmUiPT09aSYmInN0cmluZyI9PXR5cGVvZiByJiYocj0ocj1yLnJlcGxhY2UoL152PS8sIiIpKS5yZXBsYWNlKC9bJj9dKyQvLCIiKSk7dmFyIGE9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LWhhc2giKSxkPWE/YS50cmltKCk6IiIsbCx1PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2NrbGF6eS1pZCIpfHwiIixjPSJ5b3V0dWJlaWZyYW1lIixzPSJraW5lc2NvcGVpZnJhbWUiLF89ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LXR3by1pZCIpO18mJihjKz0iXyIrXysiXyIpO3ZhciB2PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvbGF6eS1ub2NvbnRyb2xzIiksbT1lLmdldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktcGxheSIpLHk9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LW11dGUiKSxmPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvbGF6eS1hcGkiKSxwPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvbGF6eS1pbWFnZSIpLGg9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LWlubGluZSIpLHc9IiIsYj0iMTAwJSIsZz1lLmdldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktaGVpZ2h0Iiksej1lLmdldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktbW9iLWhlaWdodCIpO2lmKCF0JiZnJiYtMT09PWcuaW5kZXhPZigidmgiKSYmKGI9ZyksdCYmeiYmLTE9PT16LmluZGV4T2YoInZoIikmJihiPXopLCJmYWxzZSI9PT1vJiYhZS5jbGFzc0xpc3QuY29udGFpbnMoInQtdmlkZW9fX2lzbG9hZCIpKWlmKGUuc2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvbGF6eS1sb2FkIiwidHJ1ZSIpLCJ5b3V0dWJlIj09PWkpe3ZhciBBPSIiOy0xIT09ci5pbmRleE9mKCJ2ZC50aWxkYS5jYyIpP0E9cjoodys9InJlbD0wJmZtdD0xOCZodG1sNT0xJnNob3dpbmZvPTAiLHcrPW0/IiZhdXRvcGxheT0xIjoiIix3Kz15PyImbXV0ZT0xIjoiIix3Kz0ieWVzIj09PXY/IiZjb250cm9scz0wIjoiIixBPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8iKyhyPShyKz0tMSE9PXIuaW5kZXhPZigiPyIpPyImIjoiPyIpLnJlcGxhY2UoImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3Nob3J0cy8iLCIiKSkrKHcrPWY/IiZlbmFibGVqc2FwaT0xIjoiIikpO3ZhciBQPWMrdTtlLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsJzxpZnJhbWUgaWQ9IicrUCsnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSInK2IrJyIgc3JjPSInK0ErJyIgZnJhbWVib3JkZXI9IjAiJysobT8nIGFsbG93PSJhdXRvcGxheSInOiIiKSsiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4iKX1lbHNlIGlmKCJ2aW1lbyI9PT1pKXt2YXIgRT0vKD86aHR0cHM/OlwvXC8pPyg/Ond3d1wuKT8oPzp2aW1lb1wuY29tXC98cGxheWVyXC52aW1lb1wuY29tXC92aWRlb1wvfGFwaVwudmltZW9cLmNvbVwvdmlkZW9zXC8pPyhcZCspLyxWPXIubWF0Y2goRSk7cj1WJiZWWzFdP1ZbMV06cix3PWQ/IiZoPSIrZDoiIix3Kz1tPyImYXV0b3BsYXk9MSI6IiIsdys9eT8iJm11dGVkPTEiOiIiLHcrPWY/IiZhcGk9MSI6IiIsZS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCc8aWZyYW1lIHNyYz0iLy9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLycrcisiP3RpdGxlPTAmYnlsaW5lPTAmcG9ydHJhaXQ9MCZiYWRnZT0wJmNvbG9yPWZmZmZmZiIrdysnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSInK2IrJyIgZnJhbWVib3JkZXI9IjAiJysobT8nIGFsbG93PSJhdXRvcGxheSInOiIiKSsid2Via2l0YWxsb3dmdWxsc2NyZWVuIG1vemFsbG93ZnVsbHNjcmVlbiBhbGxvd2Z1bGxzY3JlZW4+PC9pZnJhbWU+Iil9ZWxzZSBpZigia2luZXNjb3BlIj09PWkpe3crPW0/IiZhdXRvcGxheT0xIjoiIix3Kz15PyImbXV0ZWQ9MSI6IiIsLTE9PT1yLmluZGV4T2YoIj8iKSYmKHc9dy5yZXBsYWNlKCImIiwiPyIpKTt2YXIgUD1zK3U7ZS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCc8aWZyYW1lIGlkPSInK1ArJyIgc3JjPSJodHRwczovL2tpbmVzY29wZS5pby9lbWJlZC8nK3IrdysnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSInK2IrJyIgZnJhbWVib3JkZXI9IjAiIHNjcm9sbGluZz0ibm8iIGFsbG93PSJmdWxsc2NyZWVuOyBwaWN0dXJlLWluLXBpY3R1cmU7IGVuY3J5cHRlZC1tZWRpYTsiPjwvaWZyYW1lPicpfWVsc2UgaWYoInJ1dHViZSI9PT1pKXcrPWQ/IiZwPSIrZDoiIix3Kz1tPyImYXV0b3BsYXk9MSI6IiIsdz0odys9eT8iJm11dGVkPTEiOiIiKS5yZXBsYWNlKCImIiwiPyIpLGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwnPGlmcmFtZSBzcmM9Imh0dHBzOi8vcnV0dWJlLnJ1L2VtYmVkLycrcit3KyciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IicrYisnIiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJubyIgYWxsb3c9ImNsaXBib2FyZC13cml0ZTsgYXV0b3BsYXk7IGZ1bGxzY3JlZW47IHBpY3R1cmUtaW4tcGljdHVyZTsgZW5jcnlwdGVkLW1lZGlhOyIgd2Via2l0QWxsb3dGdWxsU2NyZWVuIG1vemFsbG93ZnVsbHNjcmVlbiBhbGxvd0Z1bGxTY3JlZW4+PC9pZnJhbWU+Jyk7ZWxzZSBpZigidmt2aWRlbyI9PT1pKXt2YXIgTT0vKD86dmlkZW98dmlkZW9fZXh0XC5waHBcP29pZD18Y2xpcD0/fCkoLT9cZCspXyhcZCspfG9pZD0oLT9cZCspJmlkPShcZCspKD86Lio/aGFzaD0oW2EtZjAtOV0rKSk/LyxUPXIubWF0Y2goTSksRj0iIixMPSIiO1QmJihGPVRbMV18fFRbM10sTD1UWzJdfHxUWzRdLCFkJiZUWzVdJiYoZD1UWzVdKSksdys9bT8iJmF1dG9wbGF5PTEiOiIiLHcrPXk/IiZtdXRlZD0xIjoiIix3Kz1kPyImaGFzaD0iK2Q6IiIsdys9Zj8iJmpzX2FwaT0xIjoiIixlLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsJzxpZnJhbWUgc3JjPSJodHRwczovL3ZrdmlkZW8ucnUvdmlkZW9fZXh0LnBocD9vaWQ9JytGKyImaWQ9IitMKyImaGQ9MiIrdysnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSInK2IrJyIgZnJhbWVib3JkZXI9IjAiIHNjcm9sbGluZz0ibm8iIGFsbG93PSJhdXRvcGxheTsgZW5jcnlwdGVkLW1lZGlhOyBmdWxsc2NyZWVuOyBwaWN0dXJlLWluLXBpY3R1cmU7Ij48L2lmcmFtZT4nKX1lbHNlIGlmKCJib29tc3RyZWFtIj09PWkpaWYodys9bT8iJmF1dG9zdGFydD0xIjoiIix3PSh3Kz15PyImdm9sdW1lPTAiOiIiKS5yZXBsYWNlKCImIiwiPyIpLHIuaW5jbHVkZXMoIi5tcDQiKSl7dmFyIGs9J1xuXHRcdFx0XHQ8dmlkZW9cblx0XHRcdFx0XHR3aWR0aD0iMTAwJSJcblx0XHRcdFx0XHRoZWlnaHQ9IicrYisnIlxuXHRcdFx0XHRcdGNvbnRyb2xzXG5cdFx0XHRcdFx0JysobT8iYXV0b3BsYXkiOiIiKSsiXG5cdFx0XHRcdFx0IisoeT8ibXV0ZWQiOiIiKSsiXG5cdFx0XHRcdFx0IisoaD8icGxheXNpbmxpbmUiOiIiKSsiXG5cdFx0XHRcdFx0IisocD8ncG9zdGVyPSInK3ArJyInOiIiKSsnXG5cdFx0XHRcdD5cblx0XHRcdFx0XHQ8c291cmNlIHNyYz0iJytyKyciIHR5cGU9InZpZGVvL21wNCI+XG5cdFx0XHRcdFx0WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHZpZGVvIHRhZy5cblx0XHRcdFx0PC92aWRlbz5cblx0XHRcdCc7ZS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLGspfWVsc2UgZS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLCc8aWZyYW1lIHNyYz0iJytyK3crJyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iJytiKyciIGZyYW1lYm9yZGVyPSIwIiBzY3JvbGxpbmc9Im5vIiBhbGxvdz0iYXV0b3BsYXk7IGVuY3J5cHRlZC1tZWRpYTsgZnVsbHNjcmVlbjsgcGljdHVyZS1pbi1waWN0dXJlOyIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPicpO2Vsc2UgaWYoIm1wNCI9PT1pKXt2YXIgUz0nXG5cdFx0XHRcdDx2aWRlb1xuXHRcdFx0XHRcdHdpZHRoPSIxMDAlIlxuXHRcdFx0XHRcdGhlaWdodD0iJytiKyciXG5cdFx0XHRcdFx0Y29udHJvbHNcblx0XHRcdFx0XHQnKyhtPyJhdXRvcGxheSI6IiIpKyJcblx0XHRcdFx0XHQiKyh5PyJtdXRlZCI6IiIpKyJcblx0XHRcdFx0XHQiKyhoPyJwbGF5c2lubGluZSI6IiIpKyJcblx0XHRcdFx0XHQiKyhwPydwb3N0ZXI9IicrcCsnIic6IiIpKydcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxzb3VyY2Ugc3JjPSInK3IrJyIgdHlwZT0idmlkZW8vbXA0Ij5cblx0XHRcdFx0XHRZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdmlkZW8gdGFnLlxuXHRcdFx0XHQ8L3ZpZGVvPlxuXHRcdFx0JztlLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJiZWdpbiIsUyl9ZWxzZSBpZigid2VibSI9PT1pKXt2YXIgSD0nXG5cdFx0XHRcdDx2aWRlb1xuXHRcdFx0XHRcdHdpZHRoPSIxMDAlIlxuXHRcdFx0XHRcdGhlaWdodD0iJytiKyciXG5cdFx0XHRcdFx0Y29udHJvbHNcblx0XHRcdFx0XHQnKyhtPyJhdXRvcGxheSI6IiIpKyJcblx0XHRcdFx0XHQiKyh5PyJtdXRlZCI6IiIpKyJcblx0XHRcdFx0XHQiKyhoPyJwbGF5c2lubGluZSI6IiIpKyJcblx0XHRcdFx0XHQiKyhwPydwb3N0ZXI9IicrcCsnIic6IiIpKydcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxzb3VyY2Ugc3JjPSInK3IrJyIgdHlwZT0idmlkZW8vd2VibSI+XG5cdFx0XHRcdFx0WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHZpZGVvIHRhZy5cblx0XHRcdFx0PC92aWRlbz5cblx0XHRcdCc7ZS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyYmVnaW4iLEgpfWVsc2UiaWZyYW1lIj09PWkmJmUuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmJlZ2luIiwnPGlmcmFtZSBzcmM9IicrcisnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSInK2IrJyIgZnJhbWVib3JkZXI9IjAiIHNjcm9sbGluZz0ibm8iIGFsbG93PSJhdXRvcGxheTsgZW5jcnlwdGVkLW1lZGlhOyBmdWxsc2NyZWVuOyBwaWN0dXJlLWluLXBpY3R1cmU7Ij48L2lmcmFtZT4nKTtpZihlLmNsb3Nlc3QoIi50MTE2LCAudDExNDgiKXx8IjU0MHB4IiE9PWd8fHRfdmlkZW9fbGF6eWxvYWRfX3NldEhlaWdodChlKSxnJiZ6JiYod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKGZ1bmN0aW9uKCl7dF92aWRlb19sYXp5bG9hZF9fc2V0TW9iaWxlSGVpZ2h0KGUpfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsKGZ1bmN0aW9uKCl7dF92aWRlb19sYXp5bG9hZF9fc2V0TW9iaWxlSGVpZ2h0KGUpfSkpKSxtJiYicnV0dWJlIj09PWkpe3ZhciBqPWUucXVlcnlTZWxlY3RvcigiaWZyYW1lIik7aWYoIWopcmV0dXJuO2Z1bmN0aW9uIHEoZSl7aWYoZSYmZS5kYXRhJiYic3RyaW5nIj09dHlwZW9mIGUuZGF0YSl7dmFyIHQ9SlNPTi5wYXJzZShlLmRhdGEpOyJwbGF5ZXI6cmVhZHkiPT09dC50eXBlJiZ0LmRhdGEmJnQuZGF0YS52aWRlb0lkPT09ciYmKHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixxKSx0X3ZpZGVvX19kb1J1dHViZUNvbW1hbmQoaiwicGxheSIpKX19dF92aWRlb19fZG9SdXR1YmVDb21tYW5kKGosImNoYW5nZVN0YXRlIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHEpfX1mdW5jdGlvbiB0X3ZpZGVvX2xhenlsb2FkX19yZW1vdmVWaWRlbyhlKXtlLmlubmVySFRNTD0iIixlLnNldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktbG9hZCIsImZhbHNlIil9ZnVuY3Rpb24gdF92aWRlb19sYXp5bG9hZF9fc2V0SGVpZ2h0KGUpe2lmKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvbGF6eS10eXBlIiksbz1lLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpOyJtcDQiIT09dCYmIndlYm0iIT09dHx8KG89ZS5xdWVyeVNlbGVjdG9yKCJ2aWRlbyIpKTt2YXIgaT1NYXRoLnJvdW5kKC41NjI1KmUub2Zmc2V0V2lkdGgpO2Uuc3R5bGUuaGVpZ2h0PWkrInB4IixvJiYoby5zdHlsZS5oZWlnaHQ9aSsicHgiKX19ZnVuY3Rpb24gdF92aWRlb19sYXp5bG9hZF9fc2V0TW9iaWxlSGVpZ2h0KGUpe3ZhciB0PXdpbmRvdy5tYXRjaE1lZGlhKCIobWF4LXdpZHRoOiA2NDBweCkiKS5tYXRjaGVzLG89ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LWhlaWdodCIpLGk9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LW1vYi1oZWlnaHQiKTtpZihlKXt2YXIgbj1lLnF1ZXJ5U2VsZWN0b3IoImlmcmFtZSIpfHxuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIik7aWYobil7dmFyIHI9dD9pOm87bi5zZXRBdHRyaWJ1dGUoImhlaWdodCIscil9fX1mdW5jdGlvbiB0X3ZpZGVvX19jcmVhdGVQbGF5ZXIoZSx0KXt2YXIgbz10X3ZpZGVvX19nZXRQbGF5ZXIoZSk7aWYobylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG8pO3ZhciBpPWUucXVlcnlTZWxlY3RvcigiLnQtdmlkZW8tbGF6eWxvYWQiKTt0X3ZpZGVvX2xhenlsb2FkX19vdmVyd3JpdGVQYXJhbXMoaSx0KTt2YXIgbj1pLmdldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktdHlwZSIpO3JldHVybiB0X3ZpZGVvX2xhenlsb2FkX19hZGRWaWRlbyhpKSx0X3ZpZGVvUGxheWVyX19pbml0KGUsbil9ZnVuY3Rpb24gdF92aWRlb19sYXp5bG9hZF9fb3ZlcndyaXRlUGFyYW1zKGUsdCl7dmFyIG89dHx8e30saT1vLnZpZGVvSWQsbj1vLnZpZGVvSGFzaCxyPW8udmlkZW9UeXBlLGE9by52aWRlb0Jsb2NrSWQsZD1vLmNvbnRyb2xzLGw9by5wbGF5c2lubGluZSx1PW8uYXV0b3BsYXksYz12b2lkIDAhPT11JiZ1LHM9by5tdXRlLF89dm9pZCAwIT09cyYmcyx2PW8uanNBcGksbT12b2lkIDA9PT12fHx2O3JldHVybiByJiZlLnNldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktdHlwZSIsciksaSYmZS5zZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LWlkIixpKSxuJiZlLnNldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktaGFzaCIsbiksYSYmZS5zZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2tsYXp5LWlkIixhKSxjJiZlLnNldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktcGxheSIsInRydWUiKSxfJiZlLnNldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktbXV0ZSIsInRydWUiKSwhMD09PWQmJmUuc2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvbGF6eS1ub2NvbnRyb2xzIiwiZmFsc2UiKSwhMT09PWQmJmUuc2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvbGF6eS1ub2NvbnRyb2xzIiwieWVzIiksbSYmZS5zZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LWFwaSIsInRydWUiKSxsJiZlLnNldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktaW5saW5lIiwidHJ1ZSIpLGV9d2luZG93LnRfdmlkZW9fX2NyZWF0ZVBsYXllcj10X3ZpZGVvX19jcmVhdGVQbGF5ZXIsd2luZG93LnRfdmlkZW9fbGF6eWxvYWRfX3JlbW92ZVZpZGVvPXRfdmlkZW9fbGF6eWxvYWRfX3JlbW92ZVZpZGVvLHRfb25SZWFkeSgoZnVuY3Rpb24oKXt0X29uRnVuY0xvYWQoInRfdmlkZW9fbGF6eWxvYWRfaW5pdCIsKGZ1bmN0aW9uKCl7dmFyIGU7ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtdmlkZW8tbGF6eWxvYWQ6bm90KC50LXZpZGVvLW5vLWxhenlsb2FkKSIpLmxlbmd0aCYmdF92aWRlb19sYXp5bG9hZF9pbml0KCl9KSl9KSk7CgovKiEgSGFtbWVyLkpTIC0gdjIuMC44IC0gMjAxNi0wNC0yMwogKiBodHRwOi8vaGFtbWVyanMuZ2l0aHViLmlvLwogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTYgSm9yaWsgVGFuZ2VsZGVyOwogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYixjLGQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKGEsYixjKXtyZXR1cm4gc2V0VGltZW91dChqKGEsYyksYil9ZnVuY3Rpb24gZihhLGIsYyl7cmV0dXJuIEFycmF5LmlzQXJyYXkoYSk/KGcoYSxjW2JdLGMpLCEwKTohMX1mdW5jdGlvbiBnKGEsYixjKXt2YXIgZTtpZihhKWlmKGEuZm9yRWFjaClhLmZvckVhY2goYixjKTtlbHNlIGlmKGEubGVuZ3RoIT09ZClmb3IoZT0wO2U8YS5sZW5ndGg7KWIuY2FsbChjLGFbZV0sZSxhKSxlKys7ZWxzZSBmb3IoZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIuY2FsbChjLGFbZV0sZSxhKX1mdW5jdGlvbiBoKGIsYyxkKXt2YXIgZT0iREVQUkVDQVRFRCBNRVRIT0Q6ICIrYysiXG4iK2QrIiBBVCBcbiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGM9bmV3IEVycm9yKCJnZXQtc3RhY2stdHJhY2UiKSxkPWMmJmMuc3RhY2s/Yy5zdGFjay5yZXBsYWNlKC9eW15cKF0rP1tcbiRdL2dtLCIiKS5yZXBsYWNlKC9eXHMrYXRccysvZ20sIiIpLnJlcGxhY2UoL15PYmplY3QuPGFub255bW91cz5ccypcKC9nbSwie2Fub255bW91c30oKUAiKToiVW5rbm93biBTdGFjayBUcmFjZSIsZj1hLmNvbnNvbGUmJihhLmNvbnNvbGUud2Fybnx8YS5jb25zb2xlLmxvZyk7cmV0dXJuIGYmJmYuY2FsbChhLmNvbnNvbGUsZSxkKSxiLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gaShhLGIsYyl7dmFyIGQsZT1iLnByb3RvdHlwZTtkPWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSksZC5jb25zdHJ1Y3Rvcj1hLGQuX3N1cGVyPWUsYyYmbGEoZCxjKX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiBrKGEsYil7cmV0dXJuIHR5cGVvZiBhPT1vYT9hLmFwcGx5KGI/YlswXXx8ZDpkLGIpOmF9ZnVuY3Rpb24gbChhLGIpe3JldHVybiBhPT09ZD9iOmF9ZnVuY3Rpb24gbShhLGIsYyl7ZyhxKGIpLGZ1bmN0aW9uKGIpe2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMsITEpfSl9ZnVuY3Rpb24gbihhLGIsYyl7ZyhxKGIpLGZ1bmN0aW9uKGIpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSl9ZnVuY3Rpb24gbyhhLGIpe2Zvcig7YTspe2lmKGE9PWIpcmV0dXJuITA7YT1hLnBhcmVudE5vZGV9cmV0dXJuITF9ZnVuY3Rpb24gcChhLGIpe3JldHVybiBhLmluZGV4T2YoYik+LTF9ZnVuY3Rpb24gcShhKXtyZXR1cm4gYS50cmltKCkuc3BsaXQoL1xzKy9nKX1mdW5jdGlvbiByKGEsYixjKXtpZihhLmluZGV4T2YmJiFjKXJldHVybiBhLmluZGV4T2YoYik7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDspe2lmKGMmJmFbZF1bY109PWJ8fCFjJiZhW2RdPT09YilyZXR1cm4gZDtkKyt9cmV0dXJuLTF9ZnVuY3Rpb24gcyhhKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKX1mdW5jdGlvbiB0KGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPTA7ZjxhLmxlbmd0aDspe3ZhciBnPWI/YVtmXVtiXTphW2ZdO3IoZSxnKTwwJiZkLnB1c2goYVtmXSksZVtmXT1nLGYrK31yZXR1cm4gYyYmKGQ9Yj9kLnNvcnQoZnVuY3Rpb24oYSxjKXtyZXR1cm4gYVtiXT5jW2JdfSk6ZC5zb3J0KCkpLGR9ZnVuY3Rpb24gdShhLGIpe2Zvcih2YXIgYyxlLGY9YlswXS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSksZz0wO2c8bWEubGVuZ3RoOyl7aWYoYz1tYVtnXSxlPWM/YytmOmIsZSBpbiBhKXJldHVybiBlO2crK31yZXR1cm4gZH1mdW5jdGlvbiB2KCl7cmV0dXJuIHVhKyt9ZnVuY3Rpb24gdyhiKXt2YXIgYz1iLm93bmVyRG9jdW1lbnR8fGI7cmV0dXJuIGMuZGVmYXVsdFZpZXd8fGMucGFyZW50V2luZG93fHxhfWZ1bmN0aW9uIHgoYSxiKXt2YXIgYz10aGlzO3RoaXMubWFuYWdlcj1hLHRoaXMuY2FsbGJhY2s9Yix0aGlzLmVsZW1lbnQ9YS5lbGVtZW50LHRoaXMudGFyZ2V0PWEub3B0aW9ucy5pbnB1dFRhcmdldCx0aGlzLmRvbUhhbmRsZXI9ZnVuY3Rpb24oYil7ayhhLm9wdGlvbnMuZW5hYmxlLFthXSkmJmMuaGFuZGxlcihiKX0sdGhpcy5pbml0KCl9ZnVuY3Rpb24geShhKXt2YXIgYixjPWEub3B0aW9ucy5pbnB1dENsYXNzO3JldHVybiBuZXcoYj1jP2M6eGE/TTp5YT9QOndhP1I6TCkoYSx6KX1mdW5jdGlvbiB6KGEsYixjKXt2YXIgZD1jLnBvaW50ZXJzLmxlbmd0aCxlPWMuY2hhbmdlZFBvaW50ZXJzLmxlbmd0aCxmPWImRWEmJmQtZT09PTAsZz1iJihHYXxIYSkmJmQtZT09PTA7Yy5pc0ZpcnN0PSEhZixjLmlzRmluYWw9ISFnLGYmJihhLnNlc3Npb249e30pLGMuZXZlbnRUeXBlPWIsQShhLGMpLGEuZW1pdCgiaGFtbWVyLmlucHV0IixjKSxhLnJlY29nbml6ZShjKSxhLnNlc3Npb24ucHJldklucHV0PWN9ZnVuY3Rpb24gQShhLGIpe3ZhciBjPWEuc2Vzc2lvbixkPWIucG9pbnRlcnMsZT1kLmxlbmd0aDtjLmZpcnN0SW5wdXR8fChjLmZpcnN0SW5wdXQ9RChiKSksZT4xJiYhYy5maXJzdE11bHRpcGxlP2MuZmlyc3RNdWx0aXBsZT1EKGIpOjE9PT1lJiYoYy5maXJzdE11bHRpcGxlPSExKTt2YXIgZj1jLmZpcnN0SW5wdXQsZz1jLmZpcnN0TXVsdGlwbGUsaD1nP2cuY2VudGVyOmYuY2VudGVyLGk9Yi5jZW50ZXI9RShkKTtiLnRpbWVTdGFtcD1yYSgpLGIuZGVsdGFUaW1lPWIudGltZVN0YW1wLWYudGltZVN0YW1wLGIuYW5nbGU9SShoLGkpLGIuZGlzdGFuY2U9SChoLGkpLEIoYyxiKSxiLm9mZnNldERpcmVjdGlvbj1HKGIuZGVsdGFYLGIuZGVsdGFZKTt2YXIgaj1GKGIuZGVsdGFUaW1lLGIuZGVsdGFYLGIuZGVsdGFZKTtiLm92ZXJhbGxWZWxvY2l0eVg9ai54LGIub3ZlcmFsbFZlbG9jaXR5WT1qLnksYi5vdmVyYWxsVmVsb2NpdHk9cWEoai54KT5xYShqLnkpP2oueDpqLnksYi5zY2FsZT1nP0soZy5wb2ludGVycyxkKToxLGIucm90YXRpb249Zz9KKGcucG9pbnRlcnMsZCk6MCxiLm1heFBvaW50ZXJzPWMucHJldklucHV0P2IucG9pbnRlcnMubGVuZ3RoPmMucHJldklucHV0Lm1heFBvaW50ZXJzP2IucG9pbnRlcnMubGVuZ3RoOmMucHJldklucHV0Lm1heFBvaW50ZXJzOmIucG9pbnRlcnMubGVuZ3RoLEMoYyxiKTt2YXIgaz1hLmVsZW1lbnQ7byhiLnNyY0V2ZW50LnRhcmdldCxrKSYmKGs9Yi5zcmNFdmVudC50YXJnZXQpLGIudGFyZ2V0PWt9ZnVuY3Rpb24gQihhLGIpe3ZhciBjPWIuY2VudGVyLGQ9YS5vZmZzZXREZWx0YXx8e30sZT1hLnByZXZEZWx0YXx8e30sZj1hLnByZXZJbnB1dHx8e307Yi5ldmVudFR5cGUhPT1FYSYmZi5ldmVudFR5cGUhPT1HYXx8KGU9YS5wcmV2RGVsdGE9e3g6Zi5kZWx0YVh8fDAseTpmLmRlbHRhWXx8MH0sZD1hLm9mZnNldERlbHRhPXt4OmMueCx5OmMueX0pLGIuZGVsdGFYPWUueCsoYy54LWQueCksYi5kZWx0YVk9ZS55KyhjLnktZC55KX1mdW5jdGlvbiBDKGEsYil7dmFyIGMsZSxmLGcsaD1hLmxhc3RJbnRlcnZhbHx8YixpPWIudGltZVN0YW1wLWgudGltZVN0YW1wO2lmKGIuZXZlbnRUeXBlIT1IYSYmKGk+RGF8fGgudmVsb2NpdHk9PT1kKSl7dmFyIGo9Yi5kZWx0YVgtaC5kZWx0YVgsaz1iLmRlbHRhWS1oLmRlbHRhWSxsPUYoaSxqLGspO2U9bC54LGY9bC55LGM9cWEobC54KT5xYShsLnkpP2wueDpsLnksZz1HKGosayksYS5sYXN0SW50ZXJ2YWw9Yn1lbHNlIGM9aC52ZWxvY2l0eSxlPWgudmVsb2NpdHlYLGY9aC52ZWxvY2l0eVksZz1oLmRpcmVjdGlvbjtiLnZlbG9jaXR5PWMsYi52ZWxvY2l0eVg9ZSxiLnZlbG9jaXR5WT1mLGIuZGlyZWN0aW9uPWd9ZnVuY3Rpb24gRChhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5wb2ludGVycy5sZW5ndGg7KWJbY109e2NsaWVudFg6cGEoYS5wb2ludGVyc1tjXS5jbGllbnRYKSxjbGllbnRZOnBhKGEucG9pbnRlcnNbY10uY2xpZW50WSl9LGMrKztyZXR1cm57dGltZVN0YW1wOnJhKCkscG9pbnRlcnM6YixjZW50ZXI6RShiKSxkZWx0YVg6YS5kZWx0YVgsZGVsdGFZOmEuZGVsdGFZfX1mdW5jdGlvbiBFKGEpe3ZhciBiPWEubGVuZ3RoO2lmKDE9PT1iKXJldHVybnt4OnBhKGFbMF0uY2xpZW50WCkseTpwYShhWzBdLmNsaWVudFkpfTtmb3IodmFyIGM9MCxkPTAsZT0wO2I+ZTspYys9YVtlXS5jbGllbnRYLGQrPWFbZV0uY2xpZW50WSxlKys7cmV0dXJue3g6cGEoYy9iKSx5OnBhKGQvYil9fWZ1bmN0aW9uIEYoYSxiLGMpe3JldHVybnt4OmIvYXx8MCx5OmMvYXx8MH19ZnVuY3Rpb24gRyhhLGIpe3JldHVybiBhPT09Yj9JYTpxYShhKT49cWEoYik/MD5hP0phOkthOjA+Yj9MYTpNYX1mdW5jdGlvbiBIKGEsYixjKXtjfHwoYz1RYSk7dmFyIGQ9YltjWzBdXS1hW2NbMF1dLGU9YltjWzFdXS1hW2NbMV1dO3JldHVybiBNYXRoLnNxcnQoZCpkK2UqZSl9ZnVuY3Rpb24gSShhLGIsYyl7Y3x8KGM9UWEpO3ZhciBkPWJbY1swXV0tYVtjWzBdXSxlPWJbY1sxXV0tYVtjWzFdXTtyZXR1cm4gMTgwKk1hdGguYXRhbjIoZSxkKS9NYXRoLlBJfWZ1bmN0aW9uIEooYSxiKXtyZXR1cm4gSShiWzFdLGJbMF0sUmEpK0koYVsxXSxhWzBdLFJhKX1mdW5jdGlvbiBLKGEsYil7cmV0dXJuIEgoYlswXSxiWzFdLFJhKS9IKGFbMF0sYVsxXSxSYSl9ZnVuY3Rpb24gTCgpe3RoaXMuZXZFbD1UYSx0aGlzLmV2V2luPVVhLHRoaXMucHJlc3NlZD0hMSx4LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBNKCl7dGhpcy5ldkVsPVhhLHRoaXMuZXZXaW49WWEseC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5zdG9yZT10aGlzLm1hbmFnZXIuc2Vzc2lvbi5wb2ludGVyRXZlbnRzPVtdfWZ1bmN0aW9uIE4oKXt0aGlzLmV2VGFyZ2V0PSRhLHRoaXMuZXZXaW49X2EsdGhpcy5zdGFydGVkPSExLHguYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIE8oYSxiKXt2YXIgYz1zKGEudG91Y2hlcyksZD1zKGEuY2hhbmdlZFRvdWNoZXMpO3JldHVybiBiJihHYXxIYSkmJihjPXQoYy5jb25jYXQoZCksImlkZW50aWZpZXIiLCEwKSksW2MsZF19ZnVuY3Rpb24gUCgpe3RoaXMuZXZUYXJnZXQ9YmIsdGhpcy50YXJnZXRJZHM9e30seC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gUShhLGIpe3ZhciBjPXMoYS50b3VjaGVzKSxkPXRoaXMudGFyZ2V0SWRzO2lmKGImKEVhfEZhKSYmMT09PWMubGVuZ3RoKXJldHVybiBkW2NbMF0uaWRlbnRpZmllcl09ITAsW2MsY107dmFyIGUsZixnPXMoYS5jaGFuZ2VkVG91Y2hlcyksaD1bXSxpPXRoaXMudGFyZ2V0O2lmKGY9Yy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIG8oYS50YXJnZXQsaSl9KSxiPT09RWEpZm9yKGU9MDtlPGYubGVuZ3RoOylkW2ZbZV0uaWRlbnRpZmllcl09ITAsZSsrO2ZvcihlPTA7ZTxnLmxlbmd0aDspZFtnW2VdLmlkZW50aWZpZXJdJiZoLnB1c2goZ1tlXSksYiYoR2F8SGEpJiZkZWxldGUgZFtnW2VdLmlkZW50aWZpZXJdLGUrKztyZXR1cm4gaC5sZW5ndGg/W3QoZi5jb25jYXQoaCksImlkZW50aWZpZXIiLCEwKSxoXTp2b2lkIDB9ZnVuY3Rpb24gUigpe3guYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBhPWoodGhpcy5oYW5kbGVyLHRoaXMpO3RoaXMudG91Y2g9bmV3IFAodGhpcy5tYW5hZ2VyLGEpLHRoaXMubW91c2U9bmV3IEwodGhpcy5tYW5hZ2VyLGEpLHRoaXMucHJpbWFyeVRvdWNoPW51bGwsdGhpcy5sYXN0VG91Y2hlcz1bXX1mdW5jdGlvbiBTKGEsYil7YSZFYT8odGhpcy5wcmltYXJ5VG91Y2g9Yi5jaGFuZ2VkUG9pbnRlcnNbMF0uaWRlbnRpZmllcixULmNhbGwodGhpcyxiKSk6YSYoR2F8SGEpJiZULmNhbGwodGhpcyxiKX1mdW5jdGlvbiBUKGEpe3ZhciBiPWEuY2hhbmdlZFBvaW50ZXJzWzBdO2lmKGIuaWRlbnRpZmllcj09PXRoaXMucHJpbWFyeVRvdWNoKXt2YXIgYz17eDpiLmNsaWVudFgseTpiLmNsaWVudFl9O3RoaXMubGFzdFRvdWNoZXMucHVzaChjKTt2YXIgZD10aGlzLmxhc3RUb3VjaGVzLGU9ZnVuY3Rpb24oKXt2YXIgYT1kLmluZGV4T2YoYyk7YT4tMSYmZC5zcGxpY2UoYSwxKX07c2V0VGltZW91dChlLGNiKX19ZnVuY3Rpb24gVShhKXtmb3IodmFyIGI9YS5zcmNFdmVudC5jbGllbnRYLGM9YS5zcmNFdmVudC5jbGllbnRZLGQ9MDtkPHRoaXMubGFzdFRvdWNoZXMubGVuZ3RoO2QrKyl7dmFyIGU9dGhpcy5sYXN0VG91Y2hlc1tkXSxmPU1hdGguYWJzKGItZS54KSxnPU1hdGguYWJzKGMtZS55KTtpZihkYj49ZiYmZGI+PWcpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gVihhLGIpe3RoaXMubWFuYWdlcj1hLHRoaXMuc2V0KGIpfWZ1bmN0aW9uIFcoYSl7aWYocChhLGpiKSlyZXR1cm4gamI7dmFyIGI9cChhLGtiKSxjPXAoYSxsYik7cmV0dXJuIGImJmM/amI6Ynx8Yz9iP2tiOmxiOnAoYSxpYik/aWI6aGJ9ZnVuY3Rpb24gWCgpe2lmKCFmYilyZXR1cm4hMTt2YXIgYj17fSxjPWEuQ1NTJiZhLkNTUy5zdXBwb3J0cztyZXR1cm5bImF1dG8iLCJtYW5pcHVsYXRpb24iLCJwYW4teSIsInBhbi14IiwicGFuLXggcGFuLXkiLCJub25lIl0uZm9yRWFjaChmdW5jdGlvbihkKXtiW2RdPWM/YS5DU1Muc3VwcG9ydHMoInRvdWNoLWFjdGlvbiIsZCk6ITB9KSxifWZ1bmN0aW9uIFkoYSl7dGhpcy5vcHRpb25zPWxhKHt9LHRoaXMuZGVmYXVsdHMsYXx8e30pLHRoaXMuaWQ9digpLHRoaXMubWFuYWdlcj1udWxsLHRoaXMub3B0aW9ucy5lbmFibGU9bCh0aGlzLm9wdGlvbnMuZW5hYmxlLCEwKSx0aGlzLnN0YXRlPW5iLHRoaXMuc2ltdWx0YW5lb3VzPXt9LHRoaXMucmVxdWlyZUZhaWw9W119ZnVuY3Rpb24gWihhKXtyZXR1cm4gYSZzYj8iY2FuY2VsIjphJnFiPyJlbmQiOmEmcGI/Im1vdmUiOmEmb2I/InN0YXJ0IjoiIn1mdW5jdGlvbiAkKGEpe3JldHVybiBhPT1NYT8iZG93biI6YT09TGE/InVwIjphPT1KYT8ibGVmdCI6YT09S2E/InJpZ2h0IjoiIn1mdW5jdGlvbiBfKGEsYil7dmFyIGM9Yi5tYW5hZ2VyO3JldHVybiBjP2MuZ2V0KGEpOmF9ZnVuY3Rpb24gYWEoKXtZLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBiYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnBYPW51bGwsdGhpcy5wWT1udWxsfWZ1bmN0aW9uIGNhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGRhKCl7WS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fdGltZXI9bnVsbCx0aGlzLl9pbnB1dD1udWxsfWZ1bmN0aW9uIGVhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGZhKCl7YWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGdhKCl7WS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wVGltZT0hMSx0aGlzLnBDZW50ZXI9ITEsdGhpcy5fdGltZXI9bnVsbCx0aGlzLl9pbnB1dD1udWxsLHRoaXMuY291bnQ9MH1mdW5jdGlvbiBoYShhLGIpe3JldHVybiBiPWJ8fHt9LGIucmVjb2duaXplcnM9bChiLnJlY29nbml6ZXJzLGhhLmRlZmF1bHRzLnByZXNldCksbmV3IGlhKGEsYil9ZnVuY3Rpb24gaWEoYSxiKXt0aGlzLm9wdGlvbnM9bGEoe30saGEuZGVmYXVsdHMsYnx8e30pLHRoaXMub3B0aW9ucy5pbnB1dFRhcmdldD10aGlzLm9wdGlvbnMuaW5wdXRUYXJnZXR8fGEsdGhpcy5oYW5kbGVycz17fSx0aGlzLnNlc3Npb249e30sdGhpcy5yZWNvZ25pemVycz1bXSx0aGlzLm9sZENzc1Byb3BzPXt9LHRoaXMuZWxlbWVudD1hLHRoaXMuaW5wdXQ9eSh0aGlzKSx0aGlzLnRvdWNoQWN0aW9uPW5ldyBWKHRoaXMsdGhpcy5vcHRpb25zLnRvdWNoQWN0aW9uKSxqYSh0aGlzLCEwKSxnKHRoaXMub3B0aW9ucy5yZWNvZ25pemVycyxmdW5jdGlvbihhKXt2YXIgYj10aGlzLmFkZChuZXcgYVswXShhWzFdKSk7YVsyXSYmYi5yZWNvZ25pemVXaXRoKGFbMl0pLGFbM10mJmIucmVxdWlyZUZhaWx1cmUoYVszXSl9LHRoaXMpfWZ1bmN0aW9uIGphKGEsYil7dmFyIGM9YS5lbGVtZW50O2lmKGMuc3R5bGUpe3ZhciBkO2coYS5vcHRpb25zLmNzc1Byb3BzLGZ1bmN0aW9uKGUsZil7ZD11KGMuc3R5bGUsZiksYj8oYS5vbGRDc3NQcm9wc1tkXT1jLnN0eWxlW2RdLGMuc3R5bGVbZF09ZSk6Yy5zdHlsZVtkXT1hLm9sZENzc1Byb3BzW2RdfHwiIn0pLGJ8fChhLm9sZENzc1Byb3BzPXt9KX19ZnVuY3Rpb24ga2EoYSxjKXt2YXIgZD1iLmNyZWF0ZUV2ZW50KCJFdmVudCIpO2QuaW5pdEV2ZW50KGEsITAsITApLGQuZ2VzdHVyZT1jLGMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZCl9dmFyIGxhLG1hPVsiIiwid2Via2l0IiwiTW96IiwiTVMiLCJtcyIsIm8iXSxuYT1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG9hPSJmdW5jdGlvbiIscGE9TWF0aC5yb3VuZCxxYT1NYXRoLmFicyxyYT1EYXRlLm5vdztsYT0iZnVuY3Rpb24iIT10eXBlb2YgT2JqZWN0LmFzc2lnbj9mdW5jdGlvbihhKXtpZihhPT09ZHx8bnVsbD09PWEpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7Zm9yKHZhciBiPU9iamVjdChhKSxjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl7dmFyIGU9YXJndW1lbnRzW2NdO2lmKGUhPT1kJiZudWxsIT09ZSlmb3IodmFyIGYgaW4gZSllLmhhc093blByb3BlcnR5KGYpJiYoYltmXT1lW2ZdKX1yZXR1cm4gYn06T2JqZWN0LmFzc2lnbjt2YXIgc2E9aChmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKGIpLGY9MDtmPGUubGVuZ3RoOykoIWN8fGMmJmFbZVtmXV09PT1kKSYmKGFbZVtmXV09YltlW2ZdXSksZisrO3JldHVybiBhfSwiZXh0ZW5kIiwiVXNlIGBhc3NpZ25gLiIpLHRhPWgoZnVuY3Rpb24oYSxiKXtyZXR1cm4gc2EoYSxiLCEwKX0sIm1lcmdlIiwiVXNlIGBhc3NpZ25gLiIpLHVhPTEsdmE9L21vYmlsZXx0YWJsZXR8aXAoYWR8aG9uZXxvZCl8YW5kcm9pZC9pLHdhPSJvbnRvdWNoc3RhcnQiaW4gYSx4YT11KGEsIlBvaW50ZXJFdmVudCIpIT09ZCx5YT13YSYmdmEudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx6YT0idG91Y2giLEFhPSJwZW4iLEJhPSJtb3VzZSIsQ2E9ImtpbmVjdCIsRGE9MjUsRWE9MSxGYT0yLEdhPTQsSGE9OCxJYT0xLEphPTIsS2E9NCxMYT04LE1hPTE2LE5hPUphfEthLE9hPUxhfE1hLFBhPU5hfE9hLFFhPVsieCIsInkiXSxSYT1bImNsaWVudFgiLCJjbGllbnRZIl07eC5wcm90b3R5cGU9e2hhbmRsZXI6ZnVuY3Rpb24oKXt9LGluaXQ6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJm0odGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJm0odGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJm0odyh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZXZFbCYmbih0aGlzLmVsZW1lbnQsdGhpcy5ldkVsLHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldlRhcmdldCYmbih0aGlzLnRhcmdldCx0aGlzLmV2VGFyZ2V0LHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldldpbiYmbih3KHRoaXMuZWxlbWVudCksdGhpcy5ldldpbix0aGlzLmRvbUhhbmRsZXIpfX07dmFyIFNhPXttb3VzZWRvd246RWEsbW91c2Vtb3ZlOkZhLG1vdXNldXA6R2F9LFRhPSJtb3VzZWRvd24iLFVhPSJtb3VzZW1vdmUgbW91c2V1cCI7aShMLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSl7dmFyIGI9U2FbYS50eXBlXTtiJkVhJiYwPT09YS5idXR0b24mJih0aGlzLnByZXNzZWQ9ITApLGImRmEmJjEhPT1hLndoaWNoJiYoYj1HYSksdGhpcy5wcmVzc2VkJiYoYiZHYSYmKHRoaXMucHJlc3NlZD0hMSksdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsYix7cG9pbnRlcnM6W2FdLGNoYW5nZWRQb2ludGVyczpbYV0scG9pbnRlclR5cGU6QmEsc3JjRXZlbnQ6YX0pKX19KTt2YXIgVmE9e3BvaW50ZXJkb3duOkVhLHBvaW50ZXJtb3ZlOkZhLHBvaW50ZXJ1cDpHYSxwb2ludGVyY2FuY2VsOkhhLHBvaW50ZXJvdXQ6SGF9LFdhPXsyOnphLDM6QWEsNDpCYSw1OkNhfSxYYT0icG9pbnRlcmRvd24iLFlhPSJwb2ludGVybW92ZSBwb2ludGVydXAgcG9pbnRlcmNhbmNlbCI7YS5NU1BvaW50ZXJFdmVudCYmIWEuUG9pbnRlckV2ZW50JiYoWGE9Ik1TUG9pbnRlckRvd24iLFlhPSJNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCIpLGkoTSx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc3RvcmUsYz0hMSxkPWEudHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoIm1zIiwiIiksZT1WYVtkXSxmPVdhW2EucG9pbnRlclR5cGVdfHxhLnBvaW50ZXJUeXBlLGc9Zj09emEsaD1yKGIsYS5wb2ludGVySWQsInBvaW50ZXJJZCIpO2UmRWEmJigwPT09YS5idXR0b258fGcpPzA+aCYmKGIucHVzaChhKSxoPWIubGVuZ3RoLTEpOmUmKEdhfEhhKSYmKGM9ITApLDA+aHx8KGJbaF09YSx0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixlLHtwb2ludGVyczpiLGNoYW5nZWRQb2ludGVyczpbYV0scG9pbnRlclR5cGU6ZixzcmNFdmVudDphfSksYyYmYi5zcGxpY2UoaCwxKSl9fSk7dmFyIFphPXt0b3VjaHN0YXJ0OkVhLHRvdWNobW92ZTpGYSx0b3VjaGVuZDpHYSx0b3VjaGNhbmNlbDpIYX0sJGE9InRvdWNoc3RhcnQiLF9hPSJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCI7aShOLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSl7dmFyIGI9WmFbYS50eXBlXTtpZihiPT09RWEmJih0aGlzLnN0YXJ0ZWQ9ITApLHRoaXMuc3RhcnRlZCl7dmFyIGM9Ty5jYWxsKHRoaXMsYSxiKTtiJihHYXxIYSkmJmNbMF0ubGVuZ3RoLWNbMV0ubGVuZ3RoPT09MCYmKHRoaXMuc3RhcnRlZD0hMSksdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsYix7cG9pbnRlcnM6Y1swXSxjaGFuZ2VkUG9pbnRlcnM6Y1sxXSxwb2ludGVyVHlwZTp6YSxzcmNFdmVudDphfSl9fX0pO3ZhciBhYj17dG91Y2hzdGFydDpFYSx0b3VjaG1vdmU6RmEsdG91Y2hlbmQ6R2EsdG91Y2hjYW5jZWw6SGF9LGJiPSJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCI7aShQLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSl7dmFyIGI9YWJbYS50eXBlXSxjPVEuY2FsbCh0aGlzLGEsYik7YyYmdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsYix7cG9pbnRlcnM6Y1swXSxjaGFuZ2VkUG9pbnRlcnM6Y1sxXSxwb2ludGVyVHlwZTp6YSxzcmNFdmVudDphfSl9fSk7dmFyIGNiPTI1MDAsZGI9MjU7aShSLHgse2hhbmRsZXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWMucG9pbnRlclR5cGU9PXphLGU9Yy5wb2ludGVyVHlwZT09QmE7aWYoIShlJiZjLnNvdXJjZUNhcGFiaWxpdGllcyYmYy5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50cykpe2lmKGQpUy5jYWxsKHRoaXMsYixjKTtlbHNlIGlmKGUmJlUuY2FsbCh0aGlzLGMpKXJldHVybjt0aGlzLmNhbGxiYWNrKGEsYixjKX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnRvdWNoLmRlc3Ryb3koKSx0aGlzLm1vdXNlLmRlc3Ryb3koKX19KTt2YXIgZWI9dShuYS5zdHlsZSwidG91Y2hBY3Rpb24iKSxmYj1lYiE9PWQsZ2I9ImNvbXB1dGUiLGhiPSJhdXRvIixpYj0ibWFuaXB1bGF0aW9uIixqYj0ibm9uZSIsa2I9InBhbi14IixsYj0icGFuLXkiLG1iPVgoKTtWLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKGEpe2E9PWdiJiYoYT10aGlzLmNvbXB1dGUoKSksZmImJnRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlJiZtYlthXSYmKHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlW2ViXT1hKSx0aGlzLmFjdGlvbnM9YS50b0xvd2VyQ2FzZSgpLnRyaW0oKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5zZXQodGhpcy5tYW5hZ2VyLm9wdGlvbnMudG91Y2hBY3Rpb24pfSxjb21wdXRlOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIGcodGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLGZ1bmN0aW9uKGIpe2soYi5vcHRpb25zLmVuYWJsZSxbYl0pJiYoYT1hLmNvbmNhdChiLmdldFRvdWNoQWN0aW9uKCkpKX0pLFcoYS5qb2luKCIgIikpfSxwcmV2ZW50RGVmYXVsdHM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zcmNFdmVudCxjPWEub2Zmc2V0RGlyZWN0aW9uO2lmKHRoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZClyZXR1cm4gdm9pZCBiLnByZXZlbnREZWZhdWx0KCk7dmFyIGQ9dGhpcy5hY3Rpb25zLGU9cChkLGpiKSYmIW1iW2piXSxmPXAoZCxsYikmJiFtYltsYl0sZz1wKGQsa2IpJiYhbWJba2JdO2lmKGUpe3ZhciBoPTE9PT1hLnBvaW50ZXJzLmxlbmd0aCxpPWEuZGlzdGFuY2U8MixqPWEuZGVsdGFUaW1lPDI1MDtpZihoJiZpJiZqKXJldHVybn1yZXR1cm4gZyYmZj92b2lkIDA6ZXx8ZiYmYyZOYXx8ZyYmYyZPYT90aGlzLnByZXZlbnRTcmMoYik6dm9pZCAwfSxwcmV2ZW50U3JjOmZ1bmN0aW9uKGEpe3RoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZD0hMCxhLnByZXZlbnREZWZhdWx0KCl9fTt2YXIgbmI9MSxvYj0yLHBiPTQscWI9OCxyYj1xYixzYj0xNix0Yj0zMjtZLnByb3RvdHlwZT17ZGVmYXVsdHM6e30sc2V0OmZ1bmN0aW9uKGEpe3JldHVybiBsYSh0aGlzLm9wdGlvbnMsYSksdGhpcy5tYW5hZ2VyJiZ0aGlzLm1hbmFnZXIudG91Y2hBY3Rpb24udXBkYXRlKCksdGhpc30scmVjb2duaXplV2l0aDpmdW5jdGlvbihhKXtpZihmKGEsInJlY29nbml6ZVdpdGgiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBiPXRoaXMuc2ltdWx0YW5lb3VzO3JldHVybiBhPV8oYSx0aGlzKSxiW2EuaWRdfHwoYlthLmlkXT1hLGEucmVjb2duaXplV2l0aCh0aGlzKSksdGhpc30sZHJvcFJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGYoYSwiZHJvcFJlY29nbml6ZVdpdGgiLHRoaXMpP3RoaXM6KGE9XyhhLHRoaXMpLGRlbGV0ZSB0aGlzLnNpbXVsdGFuZW91c1thLmlkXSx0aGlzKX0scmVxdWlyZUZhaWx1cmU6ZnVuY3Rpb24oYSl7aWYoZihhLCJyZXF1aXJlRmFpbHVyZSIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5yZXF1aXJlRmFpbDtyZXR1cm4gYT1fKGEsdGhpcyksLTE9PT1yKGIsYSkmJihiLnB1c2goYSksYS5yZXF1aXJlRmFpbHVyZSh0aGlzKSksdGhpc30sZHJvcFJlcXVpcmVGYWlsdXJlOmZ1bmN0aW9uKGEpe2lmKGYoYSwiZHJvcFJlcXVpcmVGYWlsdXJlIix0aGlzKSlyZXR1cm4gdGhpczthPV8oYSx0aGlzKTt2YXIgYj1yKHRoaXMucmVxdWlyZUZhaWwsYSk7cmV0dXJuIGI+LTEmJnRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGIsMSksdGhpc30saGFzUmVxdWlyZUZhaWx1cmVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVxdWlyZUZhaWwubGVuZ3RoPjB9LGNhblJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7cmV0dXJuISF0aGlzLnNpbXVsdGFuZW91c1thLmlkXX0sZW1pdDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGIpe2MubWFuYWdlci5lbWl0KGIsYSl9dmFyIGM9dGhpcyxkPXRoaXMuc3RhdGU7cWI+ZCYmYihjLm9wdGlvbnMuZXZlbnQrWihkKSksYihjLm9wdGlvbnMuZXZlbnQpLGEuYWRkaXRpb25hbEV2ZW50JiZiKGEuYWRkaXRpb25hbEV2ZW50KSxkPj1xYiYmYihjLm9wdGlvbnMuZXZlbnQrWihkKSl9LHRyeUVtaXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY2FuRW1pdCgpP3RoaXMuZW1pdChhKTp2b2lkKHRoaXMuc3RhdGU9dGIpfSxjYW5FbWl0OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aDspe2lmKCEodGhpcy5yZXF1aXJlRmFpbFthXS5zdGF0ZSYodGJ8bmIpKSlyZXR1cm4hMTthKyt9cmV0dXJuITB9LHJlY29nbml6ZTpmdW5jdGlvbihhKXt2YXIgYj1sYSh7fSxhKTtyZXR1cm4gayh0aGlzLm9wdGlvbnMuZW5hYmxlLFt0aGlzLGJdKT8odGhpcy5zdGF0ZSYocmJ8c2J8dGIpJiYodGhpcy5zdGF0ZT1uYiksdGhpcy5zdGF0ZT10aGlzLnByb2Nlc3MoYiksdm9pZCh0aGlzLnN0YXRlJihvYnxwYnxxYnxzYikmJnRoaXMudHJ5RW1pdChiKSkpOih0aGlzLnJlc2V0KCksdm9pZCh0aGlzLnN0YXRlPXRiKSl9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7fSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe30scmVzZXQ6ZnVuY3Rpb24oKXt9fSxpKGFhLFkse2RlZmF1bHRzOntwb2ludGVyczoxfSxhdHRyVGVzdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMucG9pbnRlcnM7cmV0dXJuIDA9PT1ifHxhLnBvaW50ZXJzLmxlbmd0aD09PWJ9LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5zdGF0ZSxjPWEuZXZlbnRUeXBlLGQ9YiYob2J8cGIpLGU9dGhpcy5hdHRyVGVzdChhKTtyZXR1cm4gZCYmKGMmSGF8fCFlKT9ifHNiOmR8fGU/YyZHYT9ifHFiOmImb2I/YnxwYjpvYjp0Yn19KSxpKGJhLGFhLHtkZWZhdWx0czp7ZXZlbnQ6InBhbiIsdGhyZXNob2xkOjEwLHBvaW50ZXJzOjEsZGlyZWN0aW9uOlBhfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucy5kaXJlY3Rpb24sYj1bXTtyZXR1cm4gYSZOYSYmYi5wdXNoKGxiKSxhJk9hJiZiLnB1c2goa2IpLGJ9LGRpcmVjdGlvblRlc3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGM9ITAsZD1hLmRpc3RhbmNlLGU9YS5kaXJlY3Rpb24sZj1hLmRlbHRhWCxnPWEuZGVsdGFZO3JldHVybiBlJmIuZGlyZWN0aW9ufHwoYi5kaXJlY3Rpb24mTmE/KGU9MD09PWY/SWE6MD5mP0phOkthLGM9ZiE9dGhpcy5wWCxkPU1hdGguYWJzKGEuZGVsdGFYKSk6KGU9MD09PWc/SWE6MD5nP0xhOk1hLGM9ZyE9dGhpcy5wWSxkPU1hdGguYWJzKGEuZGVsdGFZKSkpLGEuZGlyZWN0aW9uPWUsYyYmZD5iLnRocmVzaG9sZCYmZSZiLmRpcmVjdGlvbn0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGFhLnByb3RvdHlwZS5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJih0aGlzLnN0YXRlJm9ifHwhKHRoaXMuc3RhdGUmb2IpJiZ0aGlzLmRpcmVjdGlvblRlc3QoYSkpfSxlbWl0OmZ1bmN0aW9uKGEpe3RoaXMucFg9YS5kZWx0YVgsdGhpcy5wWT1hLmRlbHRhWTt2YXIgYj0kKGEuZGlyZWN0aW9uKTtiJiYoYS5hZGRpdGlvbmFsRXZlbnQ9dGhpcy5vcHRpb25zLmV2ZW50K2IpLHRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLGEpfX0pLGkoY2EsYWEse2RlZmF1bHRzOntldmVudDoicGluY2giLHRocmVzaG9sZDowLHBvaW50ZXJzOjJ9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2piXX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyxhKSYmKE1hdGguYWJzKGEuc2NhbGUtMSk+dGhpcy5vcHRpb25zLnRocmVzaG9sZHx8dGhpcy5zdGF0ZSZvYil9LGVtaXQ6ZnVuY3Rpb24oYSl7aWYoMSE9PWEuc2NhbGUpe3ZhciBiPWEuc2NhbGU8MT8iaW4iOiJvdXQiO2EuYWRkaXRpb25hbEV2ZW50PXRoaXMub3B0aW9ucy5ldmVudCtifXRoaXMuX3N1cGVyLmVtaXQuY2FsbCh0aGlzLGEpfX0pLGkoZGEsWSx7ZGVmYXVsdHM6e2V2ZW50OiJwcmVzcyIscG9pbnRlcnM6MSx0aW1lOjI1MSx0aHJlc2hvbGQ6OX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm5baGJdfSxwcm9jZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucyxjPWEucG9pbnRlcnMubGVuZ3RoPT09Yi5wb2ludGVycyxkPWEuZGlzdGFuY2U8Yi50aHJlc2hvbGQsZj1hLmRlbHRhVGltZT5iLnRpbWU7aWYodGhpcy5faW5wdXQ9YSwhZHx8IWN8fGEuZXZlbnRUeXBlJihHYXxIYSkmJiFmKXRoaXMucmVzZXQoKTtlbHNlIGlmKGEuZXZlbnRUeXBlJkVhKXRoaXMucmVzZXQoKSx0aGlzLl90aW1lcj1lKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1yYix0aGlzLnRyeUVtaXQoKX0sYi50aW1lLHRoaXMpO2Vsc2UgaWYoYS5ldmVudFR5cGUmR2EpcmV0dXJuIHJiO3JldHVybiB0Yn0scmVzZXQ6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpfSxlbWl0OmZ1bmN0aW9uKGEpe3RoaXMuc3RhdGU9PT1yYiYmKGEmJmEuZXZlbnRUeXBlJkdhP3RoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCsidXAiLGEpOih0aGlzLl9pbnB1dC50aW1lU3RhbXA9cmEoKSx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdGhpcy5faW5wdXQpKSl9fSksaShlYSxhYSx7ZGVmYXVsdHM6e2V2ZW50OiJyb3RhdGUiLHRocmVzaG9sZDowLHBvaW50ZXJzOjJ9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2piXX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyxhKSYmKE1hdGguYWJzKGEucm90YXRpb24pPnRoaXMub3B0aW9ucy50aHJlc2hvbGR8fHRoaXMuc3RhdGUmb2IpfX0pLGkoZmEsYWEse2RlZmF1bHRzOntldmVudDoic3dpcGUiLHRocmVzaG9sZDoxMCx2ZWxvY2l0eTouMyxkaXJlY3Rpb246TmF8T2EscG9pbnRlcnM6MX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gYmEucHJvdG90eXBlLmdldFRvdWNoQWN0aW9uLmNhbGwodGhpcyl9LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy5vcHRpb25zLmRpcmVjdGlvbjtyZXR1cm4gYyYoTmF8T2EpP2I9YS5vdmVyYWxsVmVsb2NpdHk6YyZOYT9iPWEub3ZlcmFsbFZlbG9jaXR5WDpjJk9hJiYoYj1hLm92ZXJhbGxWZWxvY2l0eVkpLHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyxhKSYmYyZhLm9mZnNldERpcmVjdGlvbiYmYS5kaXN0YW5jZT50aGlzLm9wdGlvbnMudGhyZXNob2xkJiZhLm1heFBvaW50ZXJzPT10aGlzLm9wdGlvbnMucG9pbnRlcnMmJnFhKGIpPnRoaXMub3B0aW9ucy52ZWxvY2l0eSYmYS5ldmVudFR5cGUmR2F9LGVtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9JChhLm9mZnNldERpcmVjdGlvbik7YiYmdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50K2IsYSksdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LGEpfX0pLGkoZ2EsWSx7ZGVmYXVsdHM6e2V2ZW50OiJ0YXAiLHBvaW50ZXJzOjEsdGFwczoxLGludGVydmFsOjMwMCx0aW1lOjI1MCx0aHJlc2hvbGQ6OSxwb3NUaHJlc2hvbGQ6MTB9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2liXX0scHJvY2VzczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYz1hLnBvaW50ZXJzLmxlbmd0aD09PWIucG9pbnRlcnMsZD1hLmRpc3RhbmNlPGIudGhyZXNob2xkLGY9YS5kZWx0YVRpbWU8Yi50aW1lO2lmKHRoaXMucmVzZXQoKSxhLmV2ZW50VHlwZSZFYSYmMD09PXRoaXMuY291bnQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtpZihkJiZmJiZjKXtpZihhLmV2ZW50VHlwZSE9R2EpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTt2YXIgZz10aGlzLnBUaW1lP2EudGltZVN0YW1wLXRoaXMucFRpbWU8Yi5pbnRlcnZhbDohMCxoPSF0aGlzLnBDZW50ZXJ8fEgodGhpcy5wQ2VudGVyLGEuY2VudGVyKTxiLnBvc1RocmVzaG9sZDt0aGlzLnBUaW1lPWEudGltZVN0YW1wLHRoaXMucENlbnRlcj1hLmNlbnRlcixoJiZnP3RoaXMuY291bnQrPTE6dGhpcy5jb3VudD0xLHRoaXMuX2lucHV0PWE7dmFyIGk9dGhpcy5jb3VudCViLnRhcHM7aWYoMD09PWkpcmV0dXJuIHRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCk/KHRoaXMuX3RpbWVyPWUoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPXJiLHRoaXMudHJ5RW1pdCgpfSxiLmludGVydmFsLHRoaXMpLG9iKTpyYn1yZXR1cm4gdGJ9LGZhaWxUaW1lb3V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpbWVyPWUoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPXRifSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwsdGhpcyksdGJ9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbigpe3RoaXMuc3RhdGU9PXJiJiYodGhpcy5faW5wdXQudGFwQ291bnQ9dGhpcy5jb3VudCx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdGhpcy5faW5wdXQpKX19KSxoYS5WRVJTSU9OPSIyLjAuOCIsaGEuZGVmYXVsdHM9e2RvbUV2ZW50czohMSx0b3VjaEFjdGlvbjpnYixlbmFibGU6ITAsaW5wdXRUYXJnZXQ6bnVsbCxpbnB1dENsYXNzOm51bGwscHJlc2V0OltbZWEse2VuYWJsZTohMX1dLFtjYSx7ZW5hYmxlOiExfSxbInJvdGF0ZSJdXSxbZmEse2RpcmVjdGlvbjpOYX1dLFtiYSx7ZGlyZWN0aW9uOk5hfSxbInN3aXBlIl1dLFtnYV0sW2dhLHtldmVudDoiZG91YmxldGFwIix0YXBzOjJ9LFsidGFwIl1dLFtkYV1dLGNzc1Byb3BzOnt1c2VyU2VsZWN0OiJub25lIix0b3VjaFNlbGVjdDoibm9uZSIsdG91Y2hDYWxsb3V0OiJub25lIixjb250ZW50Wm9vbWluZzoibm9uZSIsdXNlckRyYWc6Im5vbmUiLHRhcEhpZ2hsaWdodENvbG9yOiJyZ2JhKDAsMCwwLDApIn19O3ZhciB1Yj0xLHZiPTI7aWEucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGxhKHRoaXMub3B0aW9ucyxhKSxhLnRvdWNoQWN0aW9uJiZ0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpLGEuaW5wdXRUYXJnZXQmJih0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmlucHV0LnRhcmdldD1hLmlucHV0VGFyZ2V0LHRoaXMuaW5wdXQuaW5pdCgpKSx0aGlzfSxzdG9wOmZ1bmN0aW9uKGEpe3RoaXMuc2Vzc2lvbi5zdG9wcGVkPWE/dmI6dWJ9LHJlY29nbml6ZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnNlc3Npb247aWYoIWIuc3RvcHBlZCl7dGhpcy50b3VjaEFjdGlvbi5wcmV2ZW50RGVmYXVsdHMoYSk7dmFyIGMsZD10aGlzLnJlY29nbml6ZXJzLGU9Yi5jdXJSZWNvZ25pemVyOyghZXx8ZSYmZS5zdGF0ZSZyYikmJihlPWIuY3VyUmVjb2duaXplcj1udWxsKTtmb3IodmFyIGY9MDtmPGQubGVuZ3RoOyljPWRbZl0sYi5zdG9wcGVkPT09dmJ8fGUmJmMhPWUmJiFjLmNhblJlY29nbml6ZVdpdGgoZSk/Yy5yZXNldCgpOmMucmVjb2duaXplKGEpLCFlJiZjLnN0YXRlJihvYnxwYnxxYikmJihlPWIuY3VyUmVjb2duaXplcj1jKSxmKyt9fSxnZXQ6ZnVuY3Rpb24oYSl7aWYoYSBpbnN0YW5jZW9mIFkpcmV0dXJuIGE7Zm9yKHZhciBiPXRoaXMucmVjb2duaXplcnMsYz0wO2M8Yi5sZW5ndGg7YysrKWlmKGJbY10ub3B0aW9ucy5ldmVudD09YSlyZXR1cm4gYltjXTtyZXR1cm4gbnVsbH0sYWRkOmZ1bmN0aW9uKGEpe2lmKGYoYSwiYWRkIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLmdldChhLm9wdGlvbnMuZXZlbnQpO3JldHVybiBiJiZ0aGlzLnJlbW92ZShiKSx0aGlzLnJlY29nbml6ZXJzLnB1c2goYSksYS5tYW5hZ2VyPXRoaXMsdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSxhfSxyZW1vdmU6ZnVuY3Rpb24oYSl7aWYoZihhLCJyZW1vdmUiLHRoaXMpKXJldHVybiB0aGlzO2lmKGE9dGhpcy5nZXQoYSkpe3ZhciBiPXRoaXMucmVjb2duaXplcnMsYz1yKGIsYSk7LTEhPT1jJiYoYi5zcGxpY2UoYywxKSx0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpKX1yZXR1cm4gdGhpc30sb246ZnVuY3Rpb24oYSxiKXtpZihhIT09ZCYmYiE9PWQpe3ZhciBjPXRoaXMuaGFuZGxlcnM7cmV0dXJuIGcocShhKSxmdW5jdGlvbihhKXtjW2FdPWNbYV18fFtdLGNbYV0ucHVzaChiKX0pLHRoaXN9fSxvZmY6ZnVuY3Rpb24oYSxiKXtpZihhIT09ZCl7dmFyIGM9dGhpcy5oYW5kbGVycztyZXR1cm4gZyhxKGEpLGZ1bmN0aW9uKGEpe2I/Y1thXSYmY1thXS5zcGxpY2UocihjW2FdLGIpLDEpOmRlbGV0ZSBjW2FdfSksdGhpc319LGVtaXQ6ZnVuY3Rpb24oYSxiKXt0aGlzLm9wdGlvbnMuZG9tRXZlbnRzJiZrYShhLGIpO3ZhciBjPXRoaXMuaGFuZGxlcnNbYV0mJnRoaXMuaGFuZGxlcnNbYV0uc2xpY2UoKTtpZihjJiZjLmxlbmd0aCl7Yi50eXBlPWEsYi5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe2Iuc3JjRXZlbnQucHJldmVudERlZmF1bHQoKX07Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDspY1tkXShiKSxkKyt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50JiZqYSh0aGlzLCExKSx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmVsZW1lbnQ9bnVsbH19LGxhKGhhLHtJTlBVVF9TVEFSVDpFYSxJTlBVVF9NT1ZFOkZhLElOUFVUX0VORDpHYSxJTlBVVF9DQU5DRUw6SGEsU1RBVEVfUE9TU0lCTEU6bmIsU1RBVEVfQkVHQU46b2IsU1RBVEVfQ0hBTkdFRDpwYixTVEFURV9FTkRFRDpxYixTVEFURV9SRUNPR05JWkVEOnJiLFNUQVRFX0NBTkNFTExFRDpzYixTVEFURV9GQUlMRUQ6dGIsRElSRUNUSU9OX05PTkU6SWEsRElSRUNUSU9OX0xFRlQ6SmEsRElSRUNUSU9OX1JJR0hUOkthLERJUkVDVElPTl9VUDpMYSxESVJFQ1RJT05fRE9XTjpNYSxESVJFQ1RJT05fSE9SSVpPTlRBTDpOYSxESVJFQ1RJT05fVkVSVElDQUw6T2EsRElSRUNUSU9OX0FMTDpQYSxNYW5hZ2VyOmlhLElucHV0OngsVG91Y2hBY3Rpb246VixUb3VjaElucHV0OlAsTW91c2VJbnB1dDpMLFBvaW50ZXJFdmVudElucHV0Ok0sVG91Y2hNb3VzZUlucHV0OlIsU2luZ2xlVG91Y2hJbnB1dDpOLFJlY29nbml6ZXI6WSxBdHRyUmVjb2duaXplcjphYSxUYXA6Z2EsUGFuOmJhLFN3aXBlOmZhLFBpbmNoOmNhLFJvdGF0ZTplYSxQcmVzczpkYSxvbjptLG9mZjpuLGVhY2g6ZyxtZXJnZTp0YSxleHRlbmQ6c2EsYXNzaWduOmxhLGluaGVyaXQ6aSxiaW5kRm46aixwcmVmaXhlZDp1fSk7dmFyIHdiPSJ1bmRlZmluZWQiIT10eXBlb2YgYT9hOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O3diLkhhbW1lcj1oYSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiBoYX0pOiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1oYTphW2NdPWhhfSh3aW5kb3csZG9jdW1lbnQsIkhhbW1lciIpOwpmdW5jdGlvbiB0X3NsaWRlcl9faW5pdChlLHQpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpO2lmKHIpe3ZhciBpPXIucXVlcnlTZWxlY3RvcigiLiIrdCsiX19zbGlkZXIiKTtpZihpKXt2YXIgbj1pLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodCsiX19pdGVtIik7aWYobi5sZW5ndGgpe3Rfc2xpZGVyX19jYWxjTWF4U2xpZGVIZWlnaHQodCxpKTt2YXIgbD1yLnF1ZXJ5U2VsZWN0b3IoIi4iK3QrIl9fY29udHJvbF9sZWZ0IiksZD1yLnF1ZXJ5U2VsZWN0b3IoIi4iK3QrIl9fY29udHJvbF9yaWdodCIpLGE9ITEsbz1mdW5jdGlvbiBlKHQpe2F8fChhPSEwLHRfc2xpZGVyX19uZXh0U2xpZGUoaSxuLHQpLnRoZW4oKGZ1bmN0aW9uKCl7YT0hMX0pKSl9O2wmJmwuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLG8uYmluZChudWxsLCJiYWNrd2FyZHMiKSksZCYmZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsby5iaW5kKG51bGwsImZvcndhcmRzIikpO3ZhciBzPXBhcnNlSW50KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLXRpbWVvdXQiKSwxMCl8fDAsdT17dGltZW91dElkOm51bGx9LGM9dF9zbGlkZXJfX3N0b3BBdXRvU2xpZGVzLmJpbmQobnVsbCx1KSxfPXRfc2xpZGVyX19zdGFydEF1dG9TbGlkZXMuYmluZChudWxsLGksbixzLHUpLGY7aWYocyl7aS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixjKSxpLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLF8pLGkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixjLHtvbmNlOiEwfSksaS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjKTt2YXIgdj1mdW5jdGlvbiBlKHQscixpKXt0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHIpLHQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsaSksdC5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsciksdC5hZGRFdmVudExpc3RlbmVyKCJibHVyIixpKX0sbTtsJiZ2KGwsYyxfKSxkJiZ2KGQsYyxfKSxuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKGUpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5pc0ludGVyc2VjdGluZz8oaS5zZXRBdHRyaWJ1dGUoImRhdGEtdmlzaWJsZSIsInRydWUiKSxfKCkpOihpLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS12aXNpYmxlIiksYygpKX0pKX0pLHt0aHJlc2hvbGQ6LjF9KS5vYnNlcnZlKGkpfXIucXVlcnlTZWxlY3RvckFsbCgiLiIrdCsiX19wbGF5LWJ0biIpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfc2xpZGVyX19oYW5kbGVQbGF5Q2xpY2suYmluZChudWxsLGksZSxjLHQpKX0pKTt2YXIgZz1yLnF1ZXJ5U2VsZWN0b3IoIi4iK3QpO2cmJlsidGlsZGFjbGFtcDp1cGRhdGUiLCJkaXNwbGF5Q2hhbmdlZCJdLmZvckVhY2goKGZ1bmN0aW9uKGUpe2cuYWRkRXZlbnRMaXN0ZW5lcihlLChmdW5jdGlvbigpe3Rfc2xpZGVyX19jYWxjTWF4U2xpZGVIZWlnaHQodCxpKX0pKX0pKSxpLmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3Rfc2xpZGVyX19oYW5kbGVXaGVlbChpLG4pfSksMzAwKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0X3NsaWRlcl9fY2FsY01heFNsaWRlSGVpZ2h0KHQsaSl9KSwzMDApKSx0X3NsaWRlcl9fZHJhZ1NsaWRlKHQsaSksdF9zbGlkZXJfX2luaXRDaGFuZ2VMaXN0ZW5lckluRWRpdE1vZGUoaSxuKX19fX1mdW5jdGlvbiB0X3NsaWRlcl9fZHJhZ1NsaWRlKGUsdCl7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxpO2lmKCEociYmImVkaXQiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpKSl7dmFyIG49e3N0YXJ0U2Nyb2xsTGVmdDowLHN0YXJ0Q2xpZW50WDowLGlzRHJhZ2dpbmc6ITEsbWluRGVsdGE6MTB9LGw9ZnVuY3Rpb24gcihpKXtpLnByZXZlbnREZWZhdWx0KCk7dmFyIGw9aS5jbGllbnRYLW4uc3RhcnRDbGllbnRYO24uaXNEcmFnZ2luZz8odC5zY3JvbGxMZWZ0PW4uc3RhcnRTY3JvbGxMZWZ0LTEuNSpsLHQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoIndoZWVsIikpKTpNYXRoLmFicyhsKT5uLm1pbkRlbHRhJiYodC5jbGFzc0xpc3QuYWRkKGUrIl9fc2xpZGVyX2RyYWdnaW5nIiksbi5pc0RyYWdnaW5nPSEwKX0sZD1mdW5jdGlvbiByKCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixsKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIixkKSxuLnN0YXJ0U2Nyb2xsTGVmdD0wLG4uc3RhcnRDbGllbnRYPTAsbi5pc0RyYWdnaW5nPSExLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidXNlci1zZWxlY3QiKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoIi13ZWJraXQtdXNlci1zZWxlY3QiKSx0LmNsYXNzTGlzdC5yZW1vdmUoZSsiX19zbGlkZXJfZHJhZ2dpbmciKX07dC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLChmdW5jdGlvbihlKXtuLnN0YXJ0U2Nyb2xsTGVmdD10LnNjcm9sbExlZnQsbi5zdGFydENsaWVudFg9ZS5jbGllbnRYLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsbCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsZCksZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCJ1c2VyLXNlbGVjdCIsIm5vbmUiKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoIi13ZWJraXQtdXNlci1zZWxlY3QiLCJub25lIil9KSl9fWZ1bmN0aW9uIHRfc2xpZGVyX19pbml0Q2hhbmdlTGlzdGVuZXJJbkVkaXRNb2RlKGUsdCl7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxpLG47ciYmImVkaXQiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpJiYiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cmJm5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihyKXtyLmZvckVhY2goKGZ1bmN0aW9uKHIpe2lmKCJjaGlsZExpc3QiPT09ci50eXBlJiYoci5hZGRlZE5vZGVzLmxlbmd0aHx8ci5yZW1vdmVkTm9kZXMubGVuZ3RoKSl7dmFyIGk9cGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoImRhdGEtYWN0aXZlLXNsaWRlLWluZGV4IiksMTApfHwwLG49dFtpXTtpZihuKXt2YXIgbD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxkPXBhcnNlSW50KGwuZ2V0UHJvcGVydHlWYWx1ZSgicGFkZGluZy1sZWZ0IiksMTApfHwwO2Uuc2Nyb2xsTGVmdD1uLm9mZnNldExlZnQtZH19fSkpfSkpLm9ic2VydmUoZSx7Y2hpbGRMaXN0OiEwfSl9ZnVuY3Rpb24gdF9zbGlkZXJfX3N0YXJ0QXV0b1NsaWRlcyhlLHQscixpKXtpLnRpbWVvdXRJZHx8InRydWUiIT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdmlzaWJsZSIpfHwidHJ1ZSI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS12aWRlby1wbGF5aW5nIil8fChpLnRpbWVvdXRJZD13aW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3NsaWRlcl9fbmV4dFNsaWRlKGUsdCwiZm9yd2FyZHMiKS50aGVuKChmdW5jdGlvbigpe2kudGltZW91dElkJiYoaS50aW1lb3V0SWQ9bnVsbCx0X3NsaWRlcl9fc3RhcnRBdXRvU2xpZGVzKGUsdCxyLGkpKX0pKX0pLHIpKX1mdW5jdGlvbiB0X3NsaWRlcl9fc3RvcEF1dG9TbGlkZXMoZSl7d2luZG93LmNsZWFyVGltZW91dChlLnRpbWVvdXRJZCksZS50aW1lb3V0SWQ9bnVsbH1mdW5jdGlvbiB0X3NsaWRlcl9fbmV4dFNsaWRlKGUsdCxyKXt2b2lkIDA9PT1yJiYocj0iZm9yd2FyZHMiKTt2YXIgaT10X3NsaWRlcl9fZ2V0Q3VycmVudFNsaWRlSW5kZXgodD1BcnJheS5mcm9tKHQpKSxuPXRbaV0sbD10X3NsaWRlcl9fZ2V0TmV4dFNsaWRlSW5kZXgoZSx0LHIsaSksZD10W2xdO24uc2V0QXR0cmlidXRlKCJhcmlhLWN1cnJlbnQiLCJmYWxzZSIpLGQuc2V0QXR0cmlidXRlKCJhcmlhLWN1cnJlbnQiLCJ0cnVlIik7dmFyIGE9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSksbz1wYXJzZUludChhLmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctbGVmdCIpLDEwKXx8MDshbyYmZS5jbGFzc0xpc3QuY29udGFpbnMoInQxMTQ4X19zbGlkZXJfb3ZlcmZsb3ciKSYmKG89cGFyc2VJbnQoYS5nZXRQcm9wZXJ0eVZhbHVlKCJtYXJnaW4tbGVmdCIpLDEwKXx8MCk7dmFyIHM9ZC5vZmZzZXRMZWZ0LW87cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJkYXRhLWFjdGl2ZS1zbGlkZS1pbmRleCIsbCksdF9zbGlkZXJfX3Ntb290aE1vdmVUb05leHRTbGlkZShlLHMpLG5ldyBQcm9taXNlKChmdW5jdGlvbihlKXt2YXIgdD02MDA7d2luZG93LnNldFRpbWVvdXQoZSx0KX0pKX1mdW5jdGlvbiB0X3NsaWRlcl9fc21vb3RoTW92ZVRvTmV4dFNsaWRlKGUsdCxyKXtpZih2b2lkIDA9PT1yJiYocj02MDApLGUpe3ZhciBpPWUuc2Nyb2xsTGVmdCxuPXQtaTtpZihuKXtlLnN0eWxlLnNjcm9sbFNuYXBUeXBlPSJub25lIjt2YXIgbD1lLnNjcm9sbExlZnQsZD1wZXJmb3JtYW5jZS5ub3coKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYSl9fWZ1bmN0aW9uIGEoaSl7dmFyIG89aS1kLHM9TWF0aC5taW4oby9yLDEpO2Uuc2Nyb2xsTGVmdD1sK24qdF9zbGlkZXJfX2FkanVzdGVkRWFzaW5nKHMpLHM8MT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYSk6KGUuc2Nyb2xsTGVmdD10LGUuc3R5bGUuc2Nyb2xsU25hcFR5cGU9IiIpfX1mdW5jdGlvbiB0X3NsaWRlcl9fYWRqdXN0ZWRFYXNpbmcoZSl7dmFyIHQ9LjA1LHI9TWF0aC5taW4oZSt0KigxLWUpLDEpO3JldHVybiByPC41PzQqTWF0aC5wb3cociwzKToxLU1hdGgucG93KC0yKnIrMiwzKS8yfWZ1bmN0aW9uIHRfc2xpZGVyX19nZXROZXh0U2xpZGVJbmRleChlLHQscixpKXt2YXIgbj0iZm9yd2FyZHMiPT09cixsLGQ9aSsobj8xOi0xKSxhO2lmKGQ+PXQubGVuZ3RoJiYoZD0wKSxkPDAmJihkPXQubGVuZ3RoLTEpLGUuc2Nyb2xsV2lkdGgtZS5zY3JvbGxMZWZ0LWUuY2xpZW50V2lkdGg8MSlpZihuKWQ9MDtlbHNlIGZvcig7ZD4wOyl7dmFyIG87aWYodFtkXS5vZmZzZXRMZWZ0PGUuc2Nyb2xsTGVmdClicmVhaztkLS19cmV0dXJuIGR9ZnVuY3Rpb24gdF9zbGlkZXJfX2dldEN1cnJlbnRTbGlkZUluZGV4KGUpe3JldHVybiBNYXRoLm1heChlLmZpbmRJbmRleCh0KSwwKTtmdW5jdGlvbiB0KGUpe3JldHVybiJ0cnVlIj09PWUuZ2V0QXR0cmlidXRlKCJhcmlhLWN1cnJlbnQiKX19ZnVuY3Rpb24gdF9zbGlkZXJfX2hhbmRsZVdoZWVsKGUsdCl7dmFyIHI9KHQ9QXJyYXkuZnJvbSh0KSkuZmluZEluZGV4KChmdW5jdGlvbihlKXtyZXR1cm4idHJ1ZSI9PT1lLmdldEF0dHJpYnV0ZSgiYXJpYS1jdXJyZW50Iil9KSksaSxuOy0xPT09ciYmKHI9MCksdFtyXS5zZXRBdHRyaWJ1dGUoImFyaWEtY3VycmVudCIsImZhbHNlIik7Zm9yKHZhciBsPWUuc2Nyb2xsTGVmdCxkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLGE9cGFyc2VJbnQoZC5nZXRQcm9wZXJ0eVZhbHVlKCJwYWRkaW5nLWxlZnQiKSwxMCl8fDAsbz10Lm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUub2Zmc2V0TGVmdC1sfSkpLHM9e30sdT1vLmZpbHRlcigoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT49YS0xJiYoc1t0XT1lLCEwKX0pKSxjPU1hdGgubWluLmFwcGx5KG51bGwsdSksXz0tMSxmPTAsdj1PYmplY3QuZW50cmllcyhzKTtmPHYubGVuZ3RoO2YrKyl7dmFyIG09dltmXTtpZihtWzFdPT09Yyl7Xz0rbVswXTticmVha319LTE9PT1fJiYoXz0wKSx0W19dLnNldEF0dHJpYnV0ZSgiYXJpYS1jdXJyZW50IiwidHJ1ZSIpLGUuc2V0QXR0cmlidXRlKCJkYXRhLWFjdGl2ZS1zbGlkZS1pbmRleCIsXyl9ZnVuY3Rpb24gdF9zbGlkZXJfX2hhbmRsZVBsYXlDbGljayhlLHQscixpKXtpZighdC5kaXNhYmxlZCl7dF9zbGlkZXJfX3N0b3BWaWRlb3MoZSxpKSx0LmRpc2FibGVkPSEwO3ZhciBuPXQuY2xvc2VzdCgiLiIraSsiX19pdGVtIik7aWYobil7dmFyIGw9bi5xdWVyeVNlbGVjdG9yKCIudC12aWRlby1sYXp5bG9hZCIpO2wmJihlLnNldEF0dHJpYnV0ZSgiZGF0YS12aWRlby1wbGF5aW5nIiwidHJ1ZSIpLHIoKSx0X29uRnVuY0xvYWQoInRfdmlkZW9fbGF6eWxvYWRfX2FkZFZpZGVvIiwoZnVuY3Rpb24oKXtuLmNsYXNzTGlzdC5hZGQoaSsiX19pdGVtX3ZpZGVvLXBsYXlpbmciKSx0X3ZpZGVvX2xhenlsb2FkX19hZGRWaWRlbyhsKX0pKSl9fX1mdW5jdGlvbiB0X3NsaWRlcl9fc3RvcFZpZGVvcyhlLHQpe3ZhciByO2UucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXZpZGVvLXBsYXlpbmciKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIi4iK3QrIl9faXRlbSIpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LnJlbW92ZSh0KyJfX2l0ZW1fdmlkZW8tcGxheWluZyIpO3ZhciByPWUucXVlcnlTZWxlY3RvcigiLiIrdCsiX192aWRlbyAudC12aWRlby1sYXp5bG9hZCIpO3ImJihyLmlubmVySFRNTD0iIixyLnNldEF0dHJpYnV0ZSgiZGF0YS12aWRlb2xhenktbG9hZCIsImZhbHNlIikpO3ZhciBpPWUucXVlcnlTZWxlY3RvcigiLiIrdCsiX19wbGF5LWJ0biIpO2kmJihpLmRpc2FibGVkPSExKX0pKX1mdW5jdGlvbiB0X3NsaWRlcl9fY2FsY01heFNsaWRlSGVpZ2h0KGUsdCl7aWYoInQxMTg2Ij09PWUpe3ZhciByPXQucXVlcnlTZWxlY3RvckFsbCgiLiIrZSsiX19jYXJkIiksaT0wO3IuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5zdHlsZS5oZWlnaHQ9IiJ9KSksci5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1lLnF1ZXJ5U2VsZWN0b3IoIi50LXRleHQtY2xhbXBfX2lubmVyIik7dCYmInRydWUiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtZXhwYW5kZWQiKXx8ZS5jbGllbnRIZWlnaHQ+aSYmKGk9ZS5jbGllbnRIZWlnaHQpfSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yKCIudC10ZXh0LWNsYW1wX19pbm5lciIpO3QmJiJ0cnVlIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWV4cGFuZGVkIil8fChlLnN0eWxlLmhlaWdodD1pKyJweCIpfSkpfX0KCmZ1bmN0aW9uIHRfc2xkc0luaXQodCxlKXt2YXIgcz10X3NsZHNfX2dldFJlYyh0KTtpZihzKXt2YXIgcj1zLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxpO2lmKHIpaWYoIXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbml0aWFsaXplZCIpKXt2YXIgYT1yLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSxsPXMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKTtpZihsKXtlJiZlLnJhbmRvbVNvcnQmJihsPXRfc2xkc19yYW5kb21Tb3J0RWxlbWVudHMobCkpO3ZhciBkPWwubGVuZ3RoLG89bFswXSxuPWxbbC5sZW5ndGgtMV0sYz13aW5kb3cuaW5uZXJXaWR0aCxfPXBhcnNlSW50KHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKSwxMCl8fDAsdT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpLHA9cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIpKSxmO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCxlKXt0LnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIsZSsxKX0pKSwidHJ1ZSIhPT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKXtwfHwwPT09cHx8KHA9MzAwKSxpc05hTihwKSYmci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRyYW5zaXRpb24iLCIzMDAiKSxyLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLWZhc3QiKXx8ci5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1zbG93Iil8fHIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpfHxyLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1mYXN0Iik7dmFyIG09Xzt0X3NsZHNfc2V0SXRlbXNJblJvdyh0KSx0X3NsZHNfY2hhbmdlSW1hZ2VVcmwodCk7dmFyIHk9OD09PWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OT09PWRvY3VtZW50LmRvY3VtZW50TW9kZTt5JiYoci5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtZmFzdCIpLHIuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLXNsb3ciKSxyLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1ub25lIiksci5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfaWUiKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiLCJ0cnVlIiksci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIsMSkpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbml0aWFsaXplZCIsInRydWUiKSxyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKXx8ci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIixkKTt2YXIgdj0xLGc9ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpO2c/dj1wYXJzZUludChnLDEwKTpyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiwxKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLCIiKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYW5pbWF0ZWQiLCIiKSxhfHx0X3NsZHNfX2NyZWF0ZUR1bW1pZXMobyxuLHIpLF89cGFyc2VJbnQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MDt2YXIgaD1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X3dyYXBwZXItcmlnaHQiKTtoLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChoLChmdW5jdGlvbih0KXt0LnN0eWxlLmRpc3BsYXk9ImZhbHNlIj09PXUmJmQtXzw9MD8ibm9uZSI6IiJ9KSksYXx8dF9zbGRzX1NsaWRlcldpZHRoKHQpLCJ0cnVlIj09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IikmJnRfc2xkc19TbGlkZXJIZWlnaHQodCksdF9zbGRzX1NsaWRlckFycm93c0hlaWdodCh0KSx0X3NsZHNfQWN0aXZlU2xpZGUodCx2LGQpLHRfc2xkc19BY3RpdmVDYXB0aW9uKHQsdixkKSxhP2M+OTYwJiYoInRydWUiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtZmVlZHMtcG9zdHMtbG9hZGVkIik/KHRfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQscyxlKSx0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQsZSkpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZlZWRzTG9hZFBvc3RzIiwoZnVuY3Rpb24oKXt0X3NsZHNfX2luaXRGZWVkc1NsaWRlcih0LHMsZSksdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LGUpfSkpKTooeXx8dF9zbGRzX29uSGFtbWVyTG9hZCgiSGFtbWVyIiwoZnVuY3Rpb24oKXt0X3NsZHNfaW5pdFNsaWRlclN3aXBlKHQsZCxjKX0pKSx0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQsZSksdF9zbGRzX3VwZGF0ZVNsaWRlcih0KSksci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRpbWVvdXQiKT4wP3Rfc2xkc19pbml0QXV0b1BsYXkodCx2LGQsZSk6ci5hZGRFdmVudExpc3RlbmVyKCJzbGlkZUF1dG9wbGF5VGltZXJSZWFkeSIsKGZ1bmN0aW9uKCl7ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRpbWVvdXQiKT4wJiZ0X3NsZHNfaW5pdEF1dG9QbGF5KHQsdixkLGUpfSkpLHMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbS1sb2FkZWQiKS5sZW5ndGg8ZCsyJiZ0X3NsZHNfVXBkYXRlSW1hZ2VzKHQsdiksInllcyI9PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hcnJvd3MtbmVhcnBpYyIpJiZ0X3NsZHNfcG9zaXRpb25BcnJvd3ModCk7dmFyIGI9cy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzIik7Yi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYiwoZnVuY3Rpb24odCl7dC5zdHlsZS52aXNpYmlsaXR5PSIifSkpLHRfc2xkc19fc2V0VGFiaW5kZXhGb3JGb2N1c2FibGVFbGVtZW50cyh0KSxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIix0X3NsZHNfdXBkYXRlT25EaXNwbGF5Q2hhbmdlKSxzLmFkZEV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIix0X3NsZHNfdXBkYXRlT25EaXNwbGF5Q2hhbmdlKHQsbSkpLGEmJihzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIix0X3NsZHNfdXBkYXRlRmVlZHNTbGlkZXJPblJlc2l6ZSkscy5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZUZlZWRzU2xpZGVyT25SZXNpemUodCxzLGUpfSkpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zbGRzX3NldEl0ZW1zSW5Sb3codCxtKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpLHRfc2xkc19wb3NpdGlvbkFycm93cyh0KSxhJiZ0X3NsZHNfdXBkYXRlRmVlZHNTbGlkZXJPblJlc2l6ZSh0LHMsZSl9KSwxMDApfSkpKSx3aW5kb3cudF9zbGRzX19pc2lPUyYmKCJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP3Rfc2xkc19faGlkZU1vYmlsZVNsaWRlcyhzLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIikpOndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXt0X3NsZHNfX2hpZGVNb2JpbGVTbGlkZXMocy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpKX0pKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpeyJ0cnVlIj09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IikmJnRfc2xkc19VcGRhdGVTbGlkZXJIZWlnaHQodCksdF9zbGRzX1VwZGF0ZVNsaWRlckFycm93c0hlaWdodCh0KX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfc2xkc19VcGRhdGVTbGlkZXJBcnJvd3NIZWlnaHQodCl9KSw1MDApO3ZhciBBPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhbGxyZWNvcmRzIik7QSYmQS5hZGRFdmVudExpc3RlbmVyKCJhbGxSZWNQYWRkaW5nSW5pdCIsKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZVNsaWRlcih0KX0pKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF9zbGRzX19yZW1vdmVBdXRvcGxheUJ5VmlkZW8pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3NsZHNfX3JlbW92ZUF1dG9wbGF5QnlWaWRlbyl9fX19fWZ1bmN0aW9uIHRfc2xkc19fcmVtb3ZlQXV0b3BsYXlCeVZpZGVvKHQpe3ZhciBlPXQudGFyZ2V0LmNsb3Nlc3QoIi50LXNsZHNfX2l0ZW0iKSxzPW51bGw9PWU/dm9pZCAwOmUucXVlcnlTZWxlY3RvcigiW2RhdGEtc2xpZGVyLXZpZGVvLXR5cGVdLCBbZGF0YS12aWRlb2xhenktdHlwZV0sIGlmcmFtZSIpO2lmKHMpe3ZhciByPXMuY2xvc2VzdCgiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGk7aWYocilyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaW50ZXJ2YWwtaWQiKSYmKHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwieWVzIiksci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iLCJ5IikpfX1mdW5jdGlvbiB0X3NsZHNfX2luaXRGZWVkc1NsaWRlcih0LGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKHMpe3ZhciByPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKSxpPXBhcnNlSW50KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpLDEwKXx8MCxhPXJbMF0sbD1yW3IubGVuZ3RoLTFdLGQ9cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKTt0X3NsZHNfX2NyZWF0ZUR1bW1pZXMoYSxsLHMpLHRfc2xkc191cGRhdGVTbGlkZXIodCk7dmFyIG89cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MCxuPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIpO24ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc3R5bGUuZGlzcGxheT0iZmFsc2UiPT09ZCYmaS1vPD0wPyJub25lIjoiIn0pKSwidHJ1ZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodCIpJiZ0X3NsZHNfU2xpZGVySGVpZ2h0KHQpfX1mdW5jdGlvbiB0X3NsZHNfX2NyZWF0ZUR1bW1pZXModCxlLHMpe3ZhciByLGk9cy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpLmxlbmd0aCxhPXBhcnNlSW50KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKSwxMCl8fDAsbD1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpLGQ9cy5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIiksbz0hMSxuPSExLGMsXztpZih0JiYoYz10LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXpvb21hYmxlPSJ5ZXMiXScpKSYmKG89ITAsYy5jbGFzc0xpc3QuY29udGFpbnMoInQtem9vbWFibGUiKSYmYy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXpvb21hYmxlIiksYy5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiKSksZSYmKF89ZS5xdWVyeVNlbGVjdG9yKCdbZGF0YS16b29tYWJsZT0ieWVzIl0nKSkmJihuPSEwLF8uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXpvb21hYmxlIikmJl8uY2xhc3NMaXN0LnJlbW92ZSgidC16b29tYWJsZSIpLF8ucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXpvb21hYmxlIikpLGUmJjA9PXMucXVlcnlTZWxlY3RvckFsbCgnLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSIwIl0nKS5sZW5ndGgpe3ZhciB1PWUuY2xvbmVOb2RlKCEwKTt1LnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIsIjAiKSx1LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIik7dmFyIHA9dC5wYXJlbnROb2RlO3AuaW5zZXJ0QmVmb3JlKHUsdCk7dmFyIGY9cC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1zbGlkZS1pbmRleD0iMCJdIFtmaWVsZF0nKTtmLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChmLChmdW5jdGlvbih0KXt0LnJlbW92ZUF0dHJpYnV0ZSgiZmllbGQiKX0pKX1pZighZCYmdCYmIXMucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSInKyhpKzEpKyciXScpKXt2YXIgbT10LmNsb25lTm9kZSghMCk7aWYobS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiLGkrMSksbS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksbS5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpLGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmVuZCIsbSksZS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW0tbG9hZGVkIiksYT4wJiYidHJ1ZSI9PT1sKWZvcih2YXIgeT10LHY9ZSxnPTA7ZzxhLTE7ZysrKXt2YXIgaD15Lm5leHRFbGVtZW50U2libGluZy5jbG9uZU5vZGUoITApO2guc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IixpK2crMSksdi5uZXh0RWxlbWVudFNpYmxpbmcuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmVuZCIsaCksdj12Lm5leHRFbGVtZW50U2libGluZyx5PXkubmV4dEVsZW1lbnRTaWJsaW5nfX1vJiZjJiYoYy5jbGFzc0xpc3QuYWRkKCJ0LXpvb21hYmxlIiksYy5zZXRBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiLCJ5ZXMiKSksbiYmXyYmKF8uY2xhc3NMaXN0LmFkZCgidC16b29tYWJsZSIpLF8uc2V0QXR0cmlidXRlKCJkYXRhLXpvb21hYmxlIiwieWVzIikpfWZ1bmN0aW9uIHRfc2xkc19faGlkZU1vYmlsZVNsaWRlcyh0KXtpZih0KXt2YXIgZT10LmNsb3Nlc3QoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxzPWUmJmdldENvbXB1dGVkU3R5bGUoZSk7aWYoIXN8fCJzY3JvbGwiIT09cy5vdmVyZmxvd1h8fCJmbGV4IiE9PXMuZGlzcGxheSl7dmFyIHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpKSxpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aD45NjA/NTozO2lmKCEoci5sZW5ndGg8PTIqaSkpe2Zvcih2YXIgYT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIpLGw9W2E9cGFyc2VJbnQoYSwxMCldLGQ9MTtkPGk7ZCsrKWErZDw9ci5sZW5ndGg/bC5wdXNoKGErZCk6bC5wdXNoKGQpLGEtZD4wP2wucHVzaChhLWQpOmwucHVzaChyLmxlbmd0aCsxLWQpO3ZhciBvPSJ0LXNsZHNfX2l0ZW0taW5uYWN0aXZlIjtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlO2wuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IiksMTApPT09ZX0pKT90LmNsYXNzTGlzdC5yZW1vdmUobyk6dC5jbGFzc0xpc3QuYWRkKG8pfSkpfX19fWZ1bmN0aW9uIHRfc2xkc191cGRhdGVPbkRpc3BsYXlDaGFuZ2UodCxlKXt0X3Rocm90dGxlKChmdW5jdGlvbigpe3Rfc2xkc19zZXRJdGVtc0luUm93KHQsZSksdF9zbGRzX3VwZGF0ZVNsaWRlcih0KSx0X3NsZHNfcG9zaXRpb25BcnJvd3ModCl9KSl9ZnVuY3Rpb24gdF9zbGRzX3VwZGF0ZUZlZWRzU2xpZGVyT25SZXNpemUodCxlLHMpe3ZhciByPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGk7ciYmKHIuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1mZWVkLWNvbnRhaW5lciIpJiYod2luZG93LmlubmVyV2lkdGg+OTYwPyJ0cnVlIj09PXIuZ2V0QXR0cmlidXRlKCJkYXRhLWZlZWRzLXBvc3RzLWxvYWRlZCIpPyh0X3NsZHNfX2luaXRGZWVkc1NsaWRlcih0LGUscyksdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LHMpKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmZWVkc0xvYWRQb3N0cyIsKGZ1bmN0aW9uKCl7dF9zbGRzX19pbml0RmVlZHNTbGlkZXIodCxlLHMpLHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxzKX0pKTpyLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgwKSIpKX1mdW5jdGlvbiB0X3NsZHNfc2V0SXRlbXNJblJvdyh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciByPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGksYTtpZihyKShyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iil8fDApJiYod2luZG93LmlubmVyV2lkdGg8PTk2MCYmKGE9Miksd2luZG93LmlubmVyV2lkdGg8PTY0MCYmKGE9MSksd2luZG93LmlubmVyV2lkdGg+OTYwJiYoYT1lKSksYSYmci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIsYSl9fWZ1bmN0aW9uIHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxlKXt2YXIgcz10X3NsZHNfX2dldFJlYyh0KTtpZihzKXt2YXIgcj1zLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihyKXt2YXIgaT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iil8fDAsYT1zLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciAudC1zbGRzX19pdGVtIiksbD1zLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLGQ9aT4wJiZhJiZsP2Eub2Zmc2V0V2lkdGg6bC5vZmZzZXRXaWR0aCxvO2lmKCJ0cnVlIiE9PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpe3Iuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKC0iK2QrInB4KSI7dmFyIG49cy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyIik7bi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24oaSl7aS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKGZ1bmN0aW9uKCl7dmFyIGk9dF9zbGRzX2dldEN1cnJlbnRUcmFuc2xhdGUocyksYT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYW5pbWF0ZWQiKSxsPXBhcnNlRmxvYXQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSxkPXBhcnNlRmxvYXQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLG89ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSxuPSIiLGM7IiI9PWEmJihyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItYW5pbWF0ZWQiLCJ5ZXMiKSwibGVmdCI9PT10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1kaXJlY3Rpb24iKT8iZmFsc2UiPT1vJiYxPT1sP2w9MTpsLS06ImZhbHNlIj09byYmbD09ZD9sPWQ6bCsrLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGwpLGwhPWQrMSYmMCE9bHx8KG49InllcyIpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsbiksdF9zbGlkZU1vdmVXaXRob3V0QW5pbWF0aW9uKHQsITEsZSxpKSk7dF9zbGRzX3VwZGF0ZVNsaWRlcih0KX0pKX0pKTt2YXIgYz1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2J1bGxldCIpO2MubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsKGZ1bmN0aW9uKGkpe2kuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbigpe3ZhciBhPXBhcnNlSW50KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWJ1bGxldC1mb3IiKSwxMCksbDtpZihwYXJzZUludChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiksMTApIT09YSl7dmFyIGQ9dF9zbGRzX2dldEN1cnJlbnRUcmFuc2xhdGUocyk7ci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYSksdF9zbGlkZU1vdmVXaXRob3V0QW5pbWF0aW9uKHQsITEsZSxkKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpfX0pKX0pKX19fX1mdW5jdGlvbiB0X3NsZHNfYW5pbWF0ZSh0LGUscyl7dmFyIHI9cGVyZm9ybWFuY2Uubm93KCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbiBpKGEpe3ZhciBsPShhLXIpL3M7bD4xJiYobD0xKTt2YXIgZD10KGwpO2UoZCksbDwxP3JlcXVlc3RBbmltYXRpb25GcmFtZShpKToieSIhPT13aW5kb3cubGF6eSYmInllcyIhPT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYWxscmVjb3JkcyIpLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iil8fHRfc2xkc19vbkhhbW1lckxvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpfSkpfWZ1bmN0aW9uIHRfc2xpZGVfTW92ZUFuaW1hdGlvbih0LGUscyxyKXtpZih0KXt0LnN0eWxlLnRyYW5zaXRpb249ImhlaWdodCBlYXNlLWluLW91dCAuNXMsIHRyYW5zZm9ybSBlYXNlLWluLW91dCAwcyI7dmFyIGk9LU1hdGguYWJzKGUqcyksYT0tcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZSh0KS50cmFuc2Zvcm0ubWF0Y2goL1xkKy8pWzBdKSxsPWEtaTswIT09bCYmdF9zbGRzX2FuaW1hdGUoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksKGZ1bmN0aW9uKGUpe3Quc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKCIrKGEtbCplKSsicHgpIn0pLHIpfX1mdW5jdGlvbiB0X3NsaWRlTW92ZVdpdGhvdXRBbmltYXRpb24odCxlLHMpe3ZhciByPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHIpe3ZhciBpPXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKGkpe3ZhciBhPXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSxsLGQ9KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCk+MD9yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciAudC1zbGRzX19pdGVtIikub2Zmc2V0V2lkdGg6ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKS5vZmZzZXRXaWR0aCxvPXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLG49aS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1ub25lIik7YT5vKzEmJihhPTEpO3ZhciBjPXIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIiksXz10X3NsZHNfZ2V0RXZlbnRzRm9yWmVyb0Jsb2NrKCksdT1fLm1vdmVTbGlkZVN0YXJ0RXZlbnQscD1fLm1vdmVTbGlkZUVuZEV2ZW50O2lmKGMmJnIuZGlzcGF0Y2hFdmVudCh1KSxuKXt2YXIgZj1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIiksbT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0iKTtpZihmJiYwPT09ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtX2R1bW15IikubGVuZ3RoKXt2YXIgeT1mLmNsb25lTm9kZSghMCksdjt5LmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbV9kdW1teSIpLHkuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix5LnN0eWxlLmxlZnQ9ZCphKyJweCIsaS5hcHBlbmRDaGlsZCh5KSwodj1yLmNsYXNzTGlzdC5jb250YWlucygianMtcHJvZHVjdCIpP3I6ci5xdWVyeVNlbGVjdG9yKCIudC1jYXRhbG9nLCAudC1zdG9yZSIpfHxyLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0IikpPyh0X3NsZHNfZmFkZU91dCh5LDE1MCwoZnVuY3Rpb24oKXtudWxsIT09eS5wYXJlbnROb2RlJiZ5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeSl9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLChmdW5jdGlvbih0KXt0X3NsZHNfZmFkZUluKHQsMTUwKX0pKSk6KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobSwoZnVuY3Rpb24odCl7dC5zdHlsZS5vcGFjaXR5PTB9KSksdF9zbGRzX2ZhZGVPdXQoeSw0MDAsKGZ1bmN0aW9uKCl7bnVsbCE9PXkucGFyZW50Tm9kZSYmeS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHkpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLChmdW5jdGlvbih0KXt0X3NsZHNfZmFkZUluKHQpfSkpLGMmJnIuZGlzcGF0Y2hFdmVudChwKX0pLDUwKSl9aS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtY2FuY2VsIil9dF9zbGlkZU1vdmUodCxlLHMpLG4mJmkuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLWNhbmNlbCIpLGMmJnIuZGlzcGF0Y2hFdmVudChwKX19fWZ1bmN0aW9uIHRfc2xpZGVNb3ZlSW5zdGFudGx5KHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihpKXt2YXIgYT1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKSksbCxkPShpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iil8fDApPjA/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLm9mZnNldFdpZHRoOnIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIikub2Zmc2V0V2lkdGgsbz1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpKSxuPWkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpO2lmKGE+bysxJiYoYT0xKSxuKXt2YXIgYz1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIik7aWYoYyYmMD09PXIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbV9kdW1teSIpLmxlbmd0aCl7dmFyIF89Yy5jbG9uZU5vZGUoITApO18uY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtX2R1bW15IiksXy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLF8uc3R5bGUubGVmdD1kKmErInB4IixpLmFwcGVuZENoaWxkKF8pLHRfc2xkc19mYWRlT3V0KF8sNDAwLChmdW5jdGlvbigpe251bGwhPT1fLnBhcmVudE5vZGUmJl8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChfKX0pKX1pLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZCIpLGkuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLWNhbmNlbCIpfWVsc2UgaS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQiKSxpLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1jYW5jZWwiKTt0X3NsaWRlTW92ZSh0LGUscyksaS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQiKSxpLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1jYW5jZWwiKX19fWZ1bmN0aW9uIHRfc2xpZGVNb3ZlKHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihpKXt2YXIgYT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIiksbD1pLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSxkPXBhcnNlSW50KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCksbz1wYXJzZUludChpLmdldEF0dHJpYnV0ZSgiZGF0YS1mZWVkLXNob3ctY291bnQiKXx8MCksbj1kPjA/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLm9mZnNldFdpZHRoOnIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIikub2Zmc2V0V2lkdGgsYz1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIikpLF89cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIikpLHU9cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSkscD1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiKSxmPWkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpLG09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRpbWVvdXQiKT4wLHk9ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvd193cmFwcGVyLXJpZ2h0Iiksdj1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93X3dyYXBwZXItbGVmdCIpLGc7Im9mZiI9PT1pLmdldEF0dHJpYnV0ZSgiYXJpYS1saXZlIikmJmkuc2V0QXR0cmlidXRlKCJhcmlhLWxpdmUiLCJwb2xpdGUiKTt2YXIgaD0wO2lmKC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpe3ZhciBiPW5hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9WZXJzaW9uXC8oXGQrKVwuKFxkKylcLj8oXGQrKT8gU2FmYXJpLyk7bnVsbCE9PWImJihoPXBhcnNlSW50KGJbMV0sMTApKX12YXIgQT0hIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goIkNyaU9TIiksUztpZihjfHwwPT09Y3x8KGM9MzAwKSxfPnUrMSYmKF89MSxpLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiwxKSksInRydWUiIT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSl7aWYoeSlpZihsKXt2YXIgdz1hW2EubGVuZ3RoLTFdLEU9cGFyc2VJbnQody5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiKSwxMCk7aWYoZDx1JiZ0X3NsZHNfZmFkZUluKHksMzAwKSxFPHUmJmQ+MCYmKF89PUUtbysxfHxFPT09bykpe3ZhciBxPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO3EuaW5pdEV2ZW50KCJmZWVkc0xhc3RTbGlkZSIsITAsITApLGkuZGlzcGF0Y2hFdmVudChxKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmZWVkc0xvYWRTbGlkZSIsKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZVNsaWRlcih0KSwiZnVuY3Rpb24iPT10eXBlb2YgdF9hbmltYXRlX19zdGFydEFuaW1hdGlvbiYmdF9hbmltYXRlX19zdGFydEFuaW1hdGlvbigpfSkpLHRfc2xkc19mYWRlSW4oeSwzMDApfWVsc2UgRT09PXUmJl89PT11LWQrMSYmdF9zbGRzX2ZhZGVPdXQoeSwzMDApfWVsc2UiZmFsc2UiPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYoXz09dXx8ZD4xJiZfPT11LWQrMSk/dF9zbGRzX2ZhZGVPdXQoeSwzMDApOnRfc2xkc19mYWRlSW4oeSwzMDApO3YmJigiZmFsc2UiPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYxPT1fP3Rfc2xkc19mYWRlT3V0KHYsMzAwKTp0X3NsZHNfZmFkZUluKHYsMzAwKSksaS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQiKSxoPj0xMyYmQSYmIWY/dF9zbGlkZV9Nb3ZlQW5pbWF0aW9uKGksXyxuLGMpOmkuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKC0iK24qXysicHgpIix0X3RyaWdnZXJFdmVudChpLCJzbGlkZUNoYW5nZVN0YXJ0Iiksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZCIpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hbmltYXRlZCIsIiIpLCJ5ZXMiPT0ocD1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiKSkmJihfPT11KzEmJihfPTEpLDA9PV8mJihfPXUpLGg+PTEzJiZBJiYhZj90X3NsaWRlX01vdmVBbmltYXRpb24oaSxfLG4sMCk6aS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoLSIrbipfKyJweCkiLCEwIT09ZiYmdF9zbGRzX0FjdGl2ZVNsaWRlKHQsXyx1LHMpLGkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLF8pKSwoInkiPT09d2luZG93Lmxhenl8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhbGxyZWNvcmRzIikmJiJ5ZXMiPT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FsbHJlY29yZHMiKS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpKSYmdF9zbGRzX29uSGFtbWVyTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KSksIWUmJm0mJnRfc2xkc19pbml0QXV0b1BsYXkodCxfLHUscyl9KSxjKSx0X3NsZHNfQWN0aXZlQnVsbGV0KHQsXyx1LHMpLHRfc2xkc19BY3RpdmVTbGlkZSh0LF8sdSksInRydWUiPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiKSYmdF9zbGRzX1NsaWRlckhlaWdodCh0KSx0X3NsZHNfU2xpZGVyQXJyb3dzSGVpZ2h0KHQpLHRfc2xkc19BY3RpdmVDYXB0aW9uKHQsXyx1KSxyLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0tbG9hZGVkIikubGVuZ3RoPHUrMiYmdF9zbGRzX1VwZGF0ZUltYWdlcyh0LF8pLHRfdHJpZ2dlckV2ZW50KGksInNsaWRlQ2hhbmdlRW5kIil9fX19ZnVuY3Rpb24gdF9zbGRzX3VwZGF0ZVNsaWRlcih0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt0X3NsZHNfU2xpZGVyV2lkdGgodCk7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYocyl7dmFyIHI9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MSxpPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKSxhPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIiksbD1yPjAmJmEmJmk/aS5vZmZzZXRXaWR0aDphLm9mZnNldFdpZHRoLGQ9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpLDEwKSxvPXBhcnNlSW50KHMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpLDEwKSxuPXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIiksYz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93X3dyYXBwZXItcmlnaHQiKTtpZihkPm8rMSYmKGQ9MSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiwxKSksYyYmImZhbHNlIj09PW4pe3ZhciBfLHU9by1yPD0wfHxkK3ItMT09PW87Yy5zdHlsZS5kaXNwbGF5PXU/Im5vbmUiOiIifXMuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKC0iK2wqZCsicHgpIiwidHJ1ZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodCIpJiZ0X3NsZHNfVXBkYXRlU2xpZGVySGVpZ2h0KHQpLHRfc2xkc19VcGRhdGVTbGlkZXJBcnJvd3NIZWlnaHQodCksInkiPT09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKSYmcy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iLCIiKX19fWZ1bmN0aW9uIHRfc2xkc19VcGRhdGVJbWFnZXModCxlKXt2YXIgcz10X3NsZHNfX2dldFJlYyh0KTtpZihzKXt2YXIgcj1zLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iJytlKyciXScpO3ImJihyLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbS1sb2FkZWQiKSxyLm5leHRFbGVtZW50U2libGluZyYmci5uZXh0RWxlbWVudFNpYmxpbmcuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtLWxvYWRlZCIpLHIucHJldmlvdXNFbGVtZW50U2libGluZyYmci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbS1sb2FkZWQiKSl9fWZ1bmN0aW9uIHRfc2xkc19BY3RpdmVDYXB0aW9uKHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2NhcHRpb24iKSxhPXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19fY2FwdGlvbltkYXRhLXNsaWRlLWNhcHRpb249IicrZSsnIl0nKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX19jYXB0aW9uLWFjdGl2ZSIpfSkpLDA9PWU/YT1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2NhcHRpb25bZGF0YS1zbGlkZS1jYXB0aW9uPSInK3MrJyJdJyk6ZT09cysxJiYoYT1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2NhcHRpb25bZGF0YS1zbGlkZS1jYXB0aW9uPSIxIl0nKSksYSYmYS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2NhcHRpb24tYWN0aXZlIil9fWZ1bmN0aW9uIHRfc2xkc19zY3JvbGxJbWFnZXModCxlKXt2YXIgcz10X3NsZHNfX2dldFJlYyh0KTtpZihzKXt2YXIgcj0oZTwwPyIiOiItIikrTWF0aC5hYnMoZSkudG9TdHJpbmcoKTtzLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoIityKyJweCkifX1mdW5jdGlvbiB0X3NsZHNfQWN0aXZlQnVsbGV0KHQsZSxzLHIpe3ZhciBpO2lmKHImJnIudGh1bWJzYnVsbGV0R2FsbGVyeSl7dmFyIGE9cGFyc2VJbnQoci5zdG9yZU9wdGlvbnMucG9wdXBfb3B0cy5jb2x1bW5zKSxsPStyLnN0b3JlT3B0aW9ucy5zbGlkZXJfc2xpZGVzT3B0cy5yYXRpbzsidF9zdG9yZV9wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQiaW4gd2luZG93P2k9dF9zdG9yZV9wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQoYSxsLDYwLDEwKToidF9jYXRhbG9nX3Byb2RQb3B1cF9nYWxsZXJ5X2NhbGNNYXhUaHVtYnNDb3VudCJpbiB3aW5kb3cmJihpPXRfY2F0YWxvZ19wcm9kUG9wdXBfZ2FsbGVyeV9jYWxjTWF4VGh1bWJzQ291bnQoYSxsLDYwLDEwKSl9dmFyIGQ9dF9zbGRzX19nZXRSZWModCk7aWYoZCl7dmFyIG89ZC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19idWxsZXQiKSxuPWQucXVlcnlTZWxlY3RvcignLnQtc2xkc19fYnVsbGV0W2RhdGEtc2xpZGUtYnVsbGV0LWZvcj0iJytlKyciXScpO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX2J1bGxldF9hY3RpdmUiKTt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF9ib2R5Iik7ZSYmZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtY3VycmVudCIpfSkpLHImJnIudGh1bWJzYnVsbGV0R2FsbGVyeSYmZT49aSYmZSE9cysxfHxzPj1pJiYwPT1lP249ZC5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19idWxsZXRbZGF0YS1zbGlkZS1idWxsZXQtZm9yPSInK2krJyJdJyk6MD09ZT9uPWQucXVlcnlTZWxlY3RvcignLnQtc2xkc19fYnVsbGV0W2RhdGEtc2xpZGUtYnVsbGV0LWZvcj0iJytzKyciXScpOmU9PXMrMSYmKG49ZC5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19idWxsZXRbZGF0YS1zbGlkZS1idWxsZXQtZm9yPSIxIl0nKSksbil7bi5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2J1bGxldF9hY3RpdmUiKTt2YXIgYz1uLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF9ib2R5Iik7YyYmYy5zZXRBdHRyaWJ1dGUoImFyaWEtY3VycmVudCIsITApfX19ZnVuY3Rpb24gdF9zbGRzX0FjdGl2ZVNsaWRlKHQsZSxzKXt2YXIgcj10X3NsZHNfX2dldFJlYyh0KTtpZihyKXt2YXIgaT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxhPXIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbSIpLGw9ci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IicrZSsnIl0nKSxkPSEhaSYmaS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1ub25lIiksbz1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXZpZGVvLWxhenlsb2FkIik7aWYoby5sZW5ndGgpdF9vbkZ1bmNMb2FkKCJ0X3ZpZGVvX19nZXRQbGF5ZXIiLChmdW5jdGlvbigpe28uZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7aWYoImZhbHNlIiE9PXQuZ2V0QXR0cmlidXRlKCJkYXRhLXZpZGVvbGF6eS1sb2FkIikpe3ZhciBzPXQuY2xvc2VzdCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKTtpZihzKXt2YXIgcj10X3ZpZGVvX19nZXRQbGF5ZXIocyk7cj9yLnBhdXNlKCk6dF9zbGRzX19wcm9jY2Vzc1ZpZGVvKHMpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiB0LnBhdXNlKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpfX19KSl9KSk7ZWxzZXt2YXIgbj1yLnF1ZXJ5U2VsZWN0b3JBbGwoImlmcmFtZSIpLGM9ci5xdWVyeVNlbGVjdG9yQWxsKCJ2aWRlbyIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zcmMmJigtMSE9PXQuc3JjLmluZGV4T2YoIiZlbmFibGVqc2FwaT0xIikmJnQuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgneyJldmVudCI6ImNvbW1hbmQiLCJmdW5jIjoicGF1c2VWaWRlbyIsImFyZ3MiOiIifScsIioiKSwtMT09PXQuc3JjLmluZGV4T2YoInZpbWVvIil8fC0xPT09dC5zcmMuaW5kZXhPZigiJmFtcDthcGk9MSIpJiYtMT09PXQuc3JjLmluZGV4T2YoIiZhcGk9MSIpfHx0LmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3sibWV0aG9kIjoicGF1c2UiLCJ2YWx1ZSI6InRydWUifScsIioiKSl9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLChmdW5jdGlvbih0KXt0LnBhdXNlKCl9KSl9aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19faXRlbV9hY3RpdmUiKSx0LnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIil9KSksMD09ZSYmITE9PT1kKXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSInK3MrJyJdJykuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtX2FjdGl2ZSIpLHIuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsImZhbHNlIik7ZWxzZSBpZigwPT1lJiYhMD09PWQpbD1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iJytzKyciXScpO2Vsc2UgaWYoZT09cysxJiYhMT09PWQpe3ZhciBfPXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSIxIl0nKTtfJiYoXy5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksXy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwiZmFsc2UiKSl9ZWxzZSBlPT1zKzEmJiEwPT09ZCYmKGw9ci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IjEiXScpKTtsJiYobC5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksbC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwiZmFsc2UiKSksd2luZG93LnRfc2xkc19faXNpT1MmJnRfc2xkc19faGlkZU1vYmlsZVNsaWRlcyhsKSx0X3NsZHNfX3NldFRhYmluZGV4Rm9yRm9jdXNhYmxlRWxlbWVudHModCl9fWZ1bmN0aW9uIHRfc2xkc19fc2V0VGFiaW5kZXhGb3JGb2N1c2FibGVFbGVtZW50cyh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxyPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKTtpZihyKXt2YXIgaT0nYSwgYnV0dG9uLCBpbnB1dDpub3QoW3R5cGU9ImhpZGRlbiJdKSwgc2VsZWN0LCB0ZXh0YXJlYSwgdmlkZW8sIGlmcmFtZScsYT1zLnF1ZXJ5U2VsZWN0b3JBbGwoaSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpfSkpO3ZhciBsPXIucXVlcnlTZWxlY3RvckFsbChpKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIjAiKX0pKX19fWZ1bmN0aW9uIHRfc2xkc19TbGlkZXJXaWR0aCh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpO2lmKHMpe3ZhciByPWdldENvbXB1dGVkU3R5bGUocyksaT1wYXJzZUludChyLnBhZGRpbmdMZWZ0KXx8MCxhPXBhcnNlSW50KHIucGFkZGluZ1JpZ2h0KXx8MCxsPXMuY2xpZW50V2lkdGgtKGkrYSksZD1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIikubGVuZ3RoLG89ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksbjtpZigidHJ1ZSIhPW8uZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpe3ZhciBjPTA7byYmKGM9by5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLG8uc3R5bGUud2lkdGg9bCpkKyJweCIpLHdpbmRvdy5pbm5lcldpZHRoPD02NDA/Yz0xOndpbmRvdy5pbm5lcldpZHRoPD05NjAmJmM+MSYmKGM9Mik7dmFyIF89Yz4xP2wvYzpsO2lmKF8+MCl7dmFyIHU9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIik7byYmKHU9by5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIikpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodSwoZnVuY3Rpb24odCl7dC5zdHlsZS53aWR0aD1fKyJweCJ9KSl9fX19fWZ1bmN0aW9uIHRfc2xkc19TbGlkZXJIZWlnaHQodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtcy13cmFwcGVyOm5vdChbZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQ9ImZhbHNlIl0pJyk7aWYocyl7dmFyIHI9cy5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIiksaT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIiksYTtpZihpKXt2YXIgbD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGkpLnBhZGRpbmdUb3ApfHwwLGQ9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5wYWRkaW5nQm90dG9tKXx8MDthPWkuY2xpZW50SGVpZ2h0LShsK2QpfWEmJnMmJihzLnN0eWxlLmhlaWdodD1yPyIiOmErInB4Iil9fX1mdW5jdGlvbiB0X3NsZHNfVXBkYXRlU2xpZGVySGVpZ2h0KHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbXMtd3JhcHBlcjpub3QoW2RhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0PSJmYWxzZSJdKScpO2lmKHMpe3ZhciByPXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1mZWVkLWNvbnRhaW5lciIpLGk9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLGE7aWYoaSl7dmFyIGw9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5wYWRkaW5nVG9wKXx8MCxkPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoaSkucGFkZGluZ0JvdHRvbSl8fDA7YT1pLmNsaWVudEhlaWdodC0obCtkKX0wIT09YSYmcyYmKHMuc3R5bGUuaGVpZ2h0PXI/IiI6YSsicHgiKX19fWZ1bmN0aW9uIHRfc2xkc19TbGlkZXJBcnJvd3NIZWlnaHQodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLHI9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGksYT0wO2lmKHMpe3ZhciBsO3MucXVlcnlTZWxlY3RvcigiW2RhdGEtc2xpZGVyLXZpZGVvLXR5cGVdIikmJnImJihhPTQwKTt2YXIgZD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHMpLnBhZGRpbmdUb3ApfHwwLG89cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShzKS5wYWRkaW5nQm90dG9tKXx8MDtpPXMuY2xpZW50SGVpZ2h0LShkK28pLWF9dmFyIG49ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyIik7aSYmbi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS5oZWlnaHQ9aSsicHgiO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ciKTtlJiYoZS5zdHlsZS5tYXJnaW5Ub3A9YS8yKyJweCIpfSkpLHRfc2xkc19maXhBcnJvd3NJbkNhdGFsb2coZSxzLG4scil9fWZ1bmN0aW9uIHRfc2xkc19VcGRhdGVTbGlkZXJBcnJvd3NIZWlnaHQodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpLHI9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGksYT0wO2lmKHMpe3ZhciBsO3MucXVlcnlTZWxlY3RvcigiW2RhdGEtc2xpZGVyLXZpZGVvLXR5cGVdIikmJnImJihhPTQwKTt2YXIgZD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHMpLnBhZGRpbmdUb3ApfHwwLG89cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShzKS5wYWRkaW5nQm90dG9tKXx8MDtpPXMuY2xpZW50SGVpZ2h0LShkK28pLWF9dmFyIG49ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyIik7aSYmbi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS5oZWlnaHQ9aSsicHgiO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ciKTtlJiYoZS5zdHlsZS5tYXJnaW5Ub3A9YS8yKyJweCIpfSkpLHRfc2xkc19maXhBcnJvd3NJbkNhdGFsb2coZSxzLG4scil9fWZ1bmN0aW9uIHRfc2xkc19maXhBcnJvd3NJbkNhdGFsb2codCxlLHMscil7aWYoZSYmciYmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWNhdGFsb2dfX3JlbGV2YW50cy1ncmlkLWNvbnQiKXx8dC5jbGFzc0xpc3QuY29udGFpbnMoInQtc3RvcmVfX3JlbGV2YW50cy1ncmlkLWNvbnQiKSkpe3ZhciBpPWUucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtaW1nIik7aWYoaSl7dmFyIGE9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaSksbD0ocGFyc2VGbG9hdChhLm1hcmdpblRvcCl8fDApKyhwYXJzZUZsb2F0KGEubWFyZ2luQm90dG9tKXx8MCksZD1NYXRoLmNlaWwoaS5vZmZzZXRIZWlnaHQrbCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzLChmdW5jdGlvbih0KXt2YXIgZT10Lm9mZnNldEhlaWdodCxzPShkLWUpLzI7dC5zdHlsZS50b3A9cysicHgiLHQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVZKDApIn0pKX19fWZ1bmN0aW9uIHRfc2xkc19pbml0QXV0b1BsYXkodCxlLHMscil7dmFyIGk9Im9iamVjdCI9PXR5cGVvZiB0LGE9aT90WzBdOmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyZWMiK3QpO2lmKGEpe3ZhciBsPWEucXVlcnlTZWxlY3RvcigiLnQtc2xkcyIpLGQ9YS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYoZCl7dmFyIG89cGFyc2VGbG9hdChkLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIpKSxuPSIiLGM9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWludGVydmFsLWlkIiksXz1lLHU7aWYoYyYmY2xlYXJJbnRlcnZhbChjKSwidHJ1ZSIhPT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKXt2YXIgcDshL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZsJiYobC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLChmdW5jdGlvbigpe2Quc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwieWVzIil9KSksbC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsKGZ1bmN0aW9uKCl7InkiIT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKSYmZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCIiKX0pKSk7dmFyIGY9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LG09ZithLm9mZnNldEhlaWdodCx5LHY7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCxtPWYrYS5vZmZzZXRIZWlnaHR9KSkpLHZvaWQgMCE9PWRvY3VtZW50LmhpZGRlbj8oeT0iaGlkZGVuIix2PSJ2aXNpYmlsaXR5Y2hhbmdlIik6dm9pZCAwIT09ZG9jdW1lbnQubXNIaWRkZW4/KHk9Im1zSGlkZGVuIix2PSJtc3Zpc2liaWxpdHljaGFuZ2UiKTp2b2lkIDAhPT1kb2N1bWVudC53ZWJraXRIaWRkZW4mJih5PSJ3ZWJraXRIaWRkZW4iLHY9IndlYmtpdHZpc2liaWxpdHljaGFuZ2UiKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHYsKGZ1bmN0aW9uKCl7aWYoZG9jdW1lbnRbeV0pZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKTtlbHNle3ZhciB0PWdldENvbXB1dGVkU3R5bGUoYSkuZGlzcGxheSxlPXdpbmRvdy5wYWdlWU9mZnNldCxzPWUrd2luZG93LmlubmVySGVpZ2h0O2Y9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LChtPWYrYS5vZmZzZXRIZWlnaHQpPmUmJmY8cyYmIm5vbmUiIT09dCYmInkiIT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKSYmZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCIiKX19KSwhMSksMT09PWEubGVuZ3RoJiZ3aW5kb3cuYmluZCgic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3ZhciB0PWdldENvbXB1dGVkU3R5bGUoYSkuZGlzcGxheSxlPXdpbmRvdy5wYWdlWU9mZnNldCxzPWUrd2luZG93LmlubmVySGVpZ2h0OyJub25lIiE9PXQ/KGY9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LChtPWYrYS5vZmZzZXRIZWlnaHQpPmUmJmY8cyYmInkiIT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQtYnktdmlkZW8iKT9kLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIsIiIpOiIiPT09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiKSYmZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKSk6aXx8ZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKX0pKSk7dmFyIGc9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7dmFyIGU9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiKSxpPWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hdXRvcGxheS1pZ25vcmUtaG92ZXIiKSxsPWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3VjaCIpLG89dF9zbGRzX2dldEN1cnJlbnRUcmFuc2xhdGUoYSk7InllcyIhPWUmJiJ5ZXMiIT1pJiYieWVzIiE9bCYmKCJmYWxzZSI9PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJl89PXM/Xz1zOl8rKyxkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixfKSxfIT1zKzEmJjAhPV98fChuPSJ5ZXMiKSx0X3NsaWRlTW92ZVdpdGhvdXRBbmltYXRpb24odCwhMCxyLG8pLHRfc2xkc191cGRhdGVTbGlkZXIodCksInllcyI9PW4mJihfPT1zKzEmJihfPTEpLDA9PV8mJihfPXMpLGQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLF8pKSxkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLG4pKX0pLG8pO2Quc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbnRlcnZhbC1pZCIsZyl9fX19ZnVuY3Rpb24gdF9zbGRzX3Bvc2l0aW9uQXJyb3dzKHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3dfY29udGFpbmVyLW91dHNpZGUiKSxyPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbSIpO2lmKHIpe3ZhciBpPXIub2Zmc2V0V2lkdGgsYT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LWxlZnQiKT9lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LWxlZnQiKS5vZmZzZXRXaWR0aDowLGw9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1yaWdodCIpP2UucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctcmlnaHQiKS5vZmZzZXRXaWR0aDowO3MmJihzLnN0eWxlLm1heFdpZHRoPWErbCtpKzEyMCsicHgiKX19fWZ1bmN0aW9uIHRfc2xkc19pbml0U2xpZGVyU3dpcGUodCxlLHMscil7dmFyIGk9dF9zbGRzX19nZXRSZWModCk7aWYoaSl7dmFyIGE9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19tYWluIik7aWYoYSl7dmFyIGw9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYobCl7dmFyIGQsbz0hMSxuPSExLGMsXztpZigidHJ1ZSIhPT1sLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKWlmKCJ0cnVlIiE9PWwuZ2V0QXR0cmlidXRlKCJkYXRhLXN3aXBlci1pbml0aWFsaXplZCIpKXtkZWxldGUgSGFtbWVyLmRlZmF1bHRzLmNzc1Byb3BzLnVzZXJTZWxlY3Qsd2luZG93LmhhbW1lcj1uZXcgSGFtbWVyKGEse2RvbUV2ZW50czohMCxpbnB1dENsYXNzOkhhbW1lci5Ub3VjaElucHV0LHJlY29nbml6ZXJzOltbSGFtbWVyLlBhbix7ZGlyZWN0aW9uOkhhbW1lci5ESVJFQ1RJT05fSE9SSVpPTlRBTH1dXX0pLGwuc2V0QXR0cmlidXRlKCJkYXRhLXN3aXBlci1pbml0aWFsaXplZCIsInRydWUiKTt2YXIgdT1mdW5jdGlvbiB0KGUpe3dpbmRvdy5wYWdlWU9mZnNldD5pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSt3aW5kb3cucGFnZVlPZmZzZXR8fHdpbmRvdy5wYWdlWU9mZnNldCtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0PGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldD9sLnNldEF0dHJpYnV0ZShlLCJ5ZXMiKToieSIhPT1sLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIpJiZsLnNldEF0dHJpYnV0ZShlLCIiKX0scD0ib250b3VjaGVuZCJpbiBkb2N1bWVudD8iZGF0YS1zbGlkZXItdG91Y2giOiJkYXRhLXNsaWRlci1zdG9wcGVkIixmO2lmKCJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3cpbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbih0KXt2YXIgZT10WzBdO2wuc2V0QXR0cmlidXRlKHAsZS5pc0ludGVyc2VjdGluZz8iIjoieWVzIil9KSkub2JzZXJ2ZShpKTtlbHNlIHUocCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsKGZ1bmN0aW9uKCl7bz0hMCxjbGVhclRpbWVvdXQoZCksZD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3UocCksbz0hMX0pLDI1MCl9KSk7aWYoMSE9ZSl7dmFyIG09ZnVuY3Rpb24gdChlKXtyZXR1cm4hbnx8KGUucHJldmVudERlZmF1bHQoKSwhMSl9LHk9aS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2VsZW0iKSx2PXRfc2xkc19nZXRFdmVudHNGb3JaZXJvQmxvY2soKSxnPXYubW92ZVNsaWRlU3RhcnRFdmVudCxoPXYubW92ZVNsaWRlRW5kRXZlbnQ7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsbSx7cGFzc2l2ZTohMX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLG0se3Bhc3NpdmU6ITF9KSx3aW5kb3cuaGFtbWVyLm9uKCJwYW4iLChmdW5jdGlvbihlKXtpZihvKXJldHVybiExO249ITAseSYmaS5kaXNwYXRjaEV2ZW50KGcpO3ZhciBzPWkucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGE9cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpfHwwLGw9YT4xLGQ9bD9pLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciAudC1zbGRzX19pdGVtIikub2Zmc2V0V2lkdGg6aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKS5vZmZzZXRXaWR0aCxjPXBhcnNlRmxvYXQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSxfPXBhcnNlRmxvYXQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLHU9IiIscD1lLmRlbHRhWCxmPTEwMC9fKmUuZGVsdGFYL3dpbmRvdy5pbm5lcldpZHRoLG09MzAsdjtpZigidHJ1ZSI9PT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKXJldHVybiExO2lmKHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3VjaCIsInllcyIpLHRfc2xkc19zY3JvbGxJbWFnZXModCxkKmMtcCksZS5pc0ZpbmFsKXtpZihlLnZlbG9jaXR5WD4uNCkiZmFsc2UiPT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYxPT1jP2M9MTpjLS0scy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYyksMD09YyYmKHU9InllcyIpLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsdSksdF9zbGlkZU1vdmUodCwhMSxyKTtlbHNlIGlmKGUudmVsb2NpdHlYPC0uNCl7aWYoImZhbHNlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmKGM9PV98fGwmJmM9PV8tYSsxKSljPWw/Xy1hOl87ZWxzZXt2YXIgaD1pLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIiksYj1oW2gubGVuZ3RoLTFdLEE9cGFyc2VGbG9hdChiLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIpLDEwKTtpZihBPF8mJmM9PUEpe3ZhciBTPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO1MuaW5pdEV2ZW50KCJmZWVkc0xhc3RTbGlkZSIsITAsITApLHMuZGlzcGF0Y2hFdmVudChTKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmZWVkc0xvYWRTbGlkZSIsKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZVNsaWRlcih0KX0pKX1jKyt9cy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYyksYz09XysxJiYodT0ieWVzIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIix1KSx0X3NsaWRlTW92ZSh0LCExLHIpfWVsc2UgZjw9LTMwL18/KCJmYWxzZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJihjPT1ffHxsJiZjPT1fLWErMSk/Yz1sP18tYTpfOmMrKyxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixjKSxjPT1fKzEmJih1PSJ5ZXMiKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLHUpLHRfc2xpZGVNb3ZlKHQsITEscikpOmY+PW0vXz8oImZhbHNlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmMT09Yz9jPTE6Yy0tLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGMpLDA9PWMmJih1PSJ5ZXMiKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLHUpLHRfc2xpZGVNb3ZlKHQsITEscikpOnRfc2xpZGVNb3ZlKHQsITEscik7cy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdWNoIiwiIiksbj0hMX1yZXR1cm4hMH0pKSx3aW5kb3cuaGFtbWVyLm9uKCJwYW5lbmQiLChmdW5jdGlvbigpe3kmJmkuZGlzcGF0Y2hFdmVudChoKSx0X3NsaWRlTW92ZSh0LCExLHIpLG49ITF9KSl9fX19fX1mdW5jdGlvbiB0X3NsZHNfZ2V0Q3VycmVudFRyYW5zbGF0ZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihlKXt2YXIgcz1nZXRDb21wdXRlZFN0eWxlKGUpLnRyYW5zZm9ybTtpZih2b2lkIDAhPT1zJiYiIiE9PXMpe3ZhciByPXMubWF0Y2goL1xkKy9nKTtpZihudWxsIT09cilyZXR1cm4gcGFyc2VJbnQoclswXSwxMCl9fX1mdW5jdGlvbiB0X3NsZHNfY2hhbmdlSW1hZ2VVcmwodCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxzPWUmJiJ5ZXMiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpLHI9dF9zbGRzX19nZXRSZWModCksaTtyJiYoaT1zP3IucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faW1nOm5vdChbZGF0YS1vcmlnaW5hbF0pIik6ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pbWciKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNyYyIpO2UmJih0LnNldEF0dHJpYnV0ZSgic3JjIixlKSx0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1zcmMiKSl9KSkpfWZ1bmN0aW9uIHRfc2xkc19vbkhhbW1lckxvYWQodCxlLHMpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3dbdF0pZSgpO2Vsc2UgdmFyIHI9RGF0ZS5ub3coKSxpPXNldFRpbWVvdXQoKGZ1bmN0aW9uIGEoKXt2YXIgbD1EYXRlLm5vdygpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3dbdF0pe2lmKGwtcj43ZTMpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyB1bmRlZmluZWQiKTtpPXNldFRpbWVvdXQoYSxzfHwxMDApfWVsc2UgZSgpfSkpfWZ1bmN0aW9uIHRfc2xkc19mYWRlT3V0KHQsZSxzKXtpZigibm9uZSIhPT10LnN0eWxlLmRpc3BsYXkmJiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1mYWRlb3V0LXRpbWVvdXQiKSl7dmFyIHI9MSxpPXBhcnNlSW50KGUpLGEsbD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXt0LnN0eWxlLm9wYWNpdHk9ciwoci09LjEpPD0uMSYmKGNsZWFySW50ZXJ2YWwobCksdC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtZmFkZW91dC10aW1lb3V0IiksdC5zdHlsZS5kaXNwbGF5PSJub25lIiwiZnVuY3Rpb24iPT10eXBlb2YgcyYmcygpKX0pLGk+MD9pLzEwOjQwKTt0LnNldEF0dHJpYnV0ZSgiZGF0YS1mYWRlb3V0LXRpbWVvdXQiLGwpfX1mdW5jdGlvbiB0X3NsZHNfZmFkZUluKHQsZSxzKXtpZigoIjEiIT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5vcGFjaXR5JiYiIiE9PWdldENvbXB1dGVkU3R5bGUodCkub3BhY2l0eXx8Im5vbmUiPT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5kaXNwbGF5KSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLWZhZGVpbi10aW1lb3V0Iikpe3ZhciByPTAsaT1wYXJzZUludChlKSxhPWk+MD9pLzEwOjQwO3Quc3R5bGUub3BhY2l0eT1yLHQuc3R5bGUuZGlzcGxheT0iYmxvY2siO3ZhciBsPXNldEludGVydmFsKChmdW5jdGlvbigpe3Quc3R5bGUub3BhY2l0eT1yLChyKz0uMSk+PTEmJihjbGVhckludGVydmFsKGwpLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWZhZGVpbi10aW1lb3V0IiksImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMoKSl9KSxhKTt0LnNldEF0dHJpYnV0ZSgiZGF0YS1mYWRlaW4tdGltZW91dCIsbCl9fWZ1bmN0aW9uIHRfc2xkc19yYW5kb21Tb3J0RWxlbWVudHModCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCk7aWYoIWUubGVuZ3RoKXJldHVybltdO2Uuc29ydCgoZnVuY3Rpb24oKXtyZXR1cm4uNS1NYXRoLnJhbmRvbSgpfSkpO3ZhciBzPXRbMF0ucGFyZW50Tm9kZTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbih0KXtzLmFwcGVuZENoaWxkKHQpfSkpLGV9ZnVuY3Rpb24gdF9zbGRzX19wcm9jY2Vzc1ZpZGVvKHQpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxzKXt0X29uRnVuY0xvYWQoInRfdmlkZW9fX2NyZWF0ZVBsYXllciIsKGZ1bmN0aW9uKCl7dF92aWRlb19fY3JlYXRlUGxheWVyKHQpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfSkpLmNhdGNoKChmdW5jdGlvbih0KXtyZXR1cm4gcyh0KX0pKX0pKX0pKX1mdW5jdGlvbiB0X3NsZHNfZ2V0RXZlbnRzRm9yWmVyb0Jsb2NrKCl7dmFyIHQsZTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50Pyh0PW5ldyBDdXN0b21FdmVudCgidGlsZGFTbGRzTW92ZVNsaWRlU3RhcnQiKSxlPW5ldyBDdXN0b21FdmVudCgidGlsZGFTbGRzTW92ZVNsaWRlRW5kIikpOigodD1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSkuaW5pdEN1c3RvbUV2ZW50KCJ0aWxkYVNsZHNNb3ZlU2xpZGVTdGFydCIsITAsITApLChlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpKS5pbml0Q3VzdG9tRXZlbnQoInRpbGRhU2xkc01vdmVTbGlkZUVuZCIsITAsITApKSx7bW92ZVNsaWRlU3RhcnRFdmVudDp0LG1vdmVTbGlkZUVuZEV2ZW50OmV9fWZ1bmN0aW9uIHRfc2xkc19fZ2V0UmVjKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcmVjIit0KTp0IGluc3RhbmNlb2YgRWxlbWVudD90OnRbMF19ZnVuY3Rpb24gdF90cmlnZ2VyRXZlbnQodCxlKXt2YXIgcztkb2N1bWVudC5jcmVhdGVFdmVudD8ocz1kb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpKS5pbml0RXZlbnQoZSwhMCwhMSk6ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QmJigocz1kb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpKS5ldmVudFR5cGU9ZSkscy5ldmVudE5hbWU9ZSx0LmRpc3BhdGNoRXZlbnQ/dC5kaXNwYXRjaEV2ZW50KHMpOnQuZmlyZUV2ZW50P3QuZmlyZUV2ZW50KCJvbiIrcy5ldmVudFR5cGUscyk6dFtlXT90W2VdKCk6dFsib24iK2VdJiZ0WyJvbiIrZV0oKX13aW5kb3cudF9zbGRzX19pc2lPUz0vaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTWFjaW50b3NoIikmJiJvbnRvdWNoZW5kImluIGRvY3VtZW50O3ZhciBERUJVRz0hMTtmdW5jdGlvbiBzZXRJbXBvcnRhbnRTdHlsZSh0LGUscyl7dC5zdHlsZS5zZXRQcm9wZXJ0eShlLHMsImltcG9ydGFudCIpfWZ1bmN0aW9uIGdldEdhbGxlcnlDb250YWluZXIoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpO2lmKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtY2F0YWxvZ19fcmVsZXZhbnRzX19jb250YWluZXIsIC50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lciIpO2lmKGUpcmV0dXJuIGV9cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LWNhdGFsb2dfX3JlbGV2YW50c19fY29udGFpbmVyLCAudC1zdG9yZV9fcmVsZXZhbnRzX19jb250YWluZXIiKX1mdW5jdGlvbiBhcHBseUJhc2VTdHlsZXModCl7Zm9yKHZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKSxzPTA7czxlLmxlbmd0aDtzKyspZm9yKHZhciByLGk9ZVtzXS5xdWVyeVNlbGVjdG9yQWxsKCIudC1jYXRhbG9nX19jYXJkX190ZXh0d3JhcHBlciwgLnQtc3RvcmVfX2NhcmRfX3RleHR3cmFwcGVyIiksYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgbD1pW2FdO3NldEltcG9ydGFudFN0eWxlKGwsIm1hcmdpbi1ib3R0b20iLCIwcHgiKSxzZXRJbXBvcnRhbnRTdHlsZShsLCJtYXJnaW4tdG9wIiwiYXV0byIpLHNldEltcG9ydGFudFN0eWxlKGwsImp1c3RpZnktY29udGVudCIsImZsZXgtc3RhcnQiKTt2YXIgZD1sLnF1ZXJ5U2VsZWN0b3IoIi5qcy1jYXRhbG9nLXByb2QtbmFtZSwgLmpzLXN0b3JlLXByb2QtbmFtZSIpO2QmJihzZXRJbXBvcnRhbnRTdHlsZShkLCJkaXNwbGF5IiwiLXdlYmtpdC1ib3giKSxzZXRJbXBvcnRhbnRTdHlsZShkLCItd2Via2l0LWJveC1vcmllbnQiLCJ2ZXJ0aWNhbCIpLHNldEltcG9ydGFudFN0eWxlKGQsIi13ZWJraXQtbGluZS1jbGFtcCIsIjIiKSxzZXRJbXBvcnRhbnRTdHlsZShkLCJvdmVyZmxvdyIsImhpZGRlbiIpLHNldEltcG9ydGFudFN0eWxlKGQsInRleHQtb3ZlcmZsb3ciLCJlbGxpcHNpcyIpLHNldEltcG9ydGFudFN0eWxlKGQsImxpbmUtaGVpZ2h0IiwiMS41Iiksc2V0SW1wb3J0YW50U3R5bGUoZCwibWF4LWhlaWdodCIsImNhbGMoMS41ZW0gKiAyKSIpLHNldEltcG9ydGFudFN0eWxlKGQsInBhZGRpbmctYm90dG9tIiwidW5zZXQiKSk7dmFyIG89bC5xdWVyeVNlbGVjdG9yKCIuanMtY2F0YWxvZy1wcm9kLWRlc2NyLCAuanMtc3RvcmUtcHJvZC1kZXNjciIpO28mJihzZXRJbXBvcnRhbnRTdHlsZShvLCJkaXNwbGF5IiwiLXdlYmtpdC1ib3giKSxzZXRJbXBvcnRhbnRTdHlsZShvLCItd2Via2l0LWJveC1vcmllbnQiLCJ2ZXJ0aWNhbCIpLHNldEltcG9ydGFudFN0eWxlKG8sIi13ZWJraXQtbGluZS1jbGFtcCIsIjEiKSxzZXRJbXBvcnRhbnRTdHlsZShvLCJvdmVyZmxvdyIsImhpZGRlbiIpLHNldEltcG9ydGFudFN0eWxlKG8sInRleHQtb3ZlcmZsb3ciLCJlbGxpcHNpcyIpLHNldEltcG9ydGFudFN0eWxlKG8sInBhZGRpbmctYm90dG9tIiwidW5zZXQiKSl9REVCVUcmJmNvbnNvbGUuaW5mbygi0JHQsNC30L7QstGL0LUg0YHRgtC40LvQuCDQv9GA0LjQvNC10L3QtdC90YsuIil9ZnVuY3Rpb24gZ2V0UmVmZXJlbmNlSGVpZ2h0KCl7dmFyIHQ9Z2V0R2FsbGVyeUNvbnRhaW5lcigpO2lmKCF0KXJldHVybiAwO3Qub2Zmc2V0SGVpZ2h0O2Zvcih2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1wcm9kdWN0Iikscz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgcj1lW3NdO2lmKCJub25lIiE9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHIpLmRpc3BsYXkmJjAhPT1yLm9mZnNldEhlaWdodCYmci5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdC1pbWciKSl7dmFyIGk9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7cmV0dXJuIERFQlVHJiZjb25zb2xlLmluZm8oItCe0L/QvtGA0L3QsNGPINC60LDRgNGC0L7Rh9C60LAg0L3QsNC50LTQtdC90LAuINCS0YvRgdC+0YLQsDoiLGkpLGl9fXJldHVybiBERUJVRyYmY29uc29sZS5pbmZvKCLQndC1INC90LDQudC00LXQvdCwINCy0LjQtNC40LzQsNGPINC60LDRgNGC0L7Rh9C60LAg0YEg0LjQt9C+0LHRgNCw0LbQtdC90LjQtdC8LiIpLDB9ZnVuY3Rpb24gdXBkYXRlTm9JbWFnZUNhcmRIZWlnaHRzKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe3ZhciB0PWdldFJlZmVyZW5jZUhlaWdodCgpO2lmKCEodDw9MCkpe3ZhciBlPWdldEdhbGxlcnlDb250YWluZXIoKTtpZihlKWZvcih2YXIgcz1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1wcm9kdWN0Iikscj0wO3I8cy5sZW5ndGg7cisrKXt2YXIgaT1zW3JdO2kucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QtaW1nIik/aS5zdHlsZS5oZWlnaHQ9IiI6KGkuc3R5bGUuY3NzVGV4dCs9IjsgaGVpZ2h0OiAiK3QrInB4ICFpbXBvcnRhbnQ7IixERUJVRyYmY29uc29sZS5pbmZvKCLQo9GB0YLQsNC90L7QstC70LXQvdCwINCy0YvRgdC+0YLQsCDQtNC70Y8g0LrQsNGA0YLQvtGH0LrQuCDQsdC10Lcg0LjQt9C+0LHRgNCw0LbQtdC90LjRjzoiLHQpKX19fSkpfWZ1bmN0aW9uIGF0dGFjaEltYWdlTG9hZExpc3RlbmVycygpe3ZhciB0PWdldEdhbGxlcnlDb250YWluZXIoKTtpZih0KWZvcih2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1wcm9kdWN0LWltZyIpLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9ZVtzXTtyLmNvbXBsZXRlfHxyLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe0RFQlVHJiZjb25zb2xlLmluZm8oItCY0LfQvtCx0YDQsNC20LXQvdC40LUg0LfQsNCz0YDRg9C30LjQu9C+0YHRjCwg0L7QsdC90L7QstC70Y/QtdC8INCy0YvRgdC+0YLRgyIpLHVwZGF0ZU5vSW1hZ2VDYXJkSGVpZ2h0cygpfSkpfX1mdW5jdGlvbiBhZGRFbXB0eURlc2NyUGxhY2Vob2xkZXIodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIuanMtY2F0YWxvZy1wcm9kLWRlc2NyLnQtY2F0YWxvZ19fY2FyZF9fZGVzY3IsIC5qcy1zdG9yZS1wcm9kLWRlc2NyLnQtc3RvcmVfX2NhcmRfX2Rlc2NyIik7aWYoZSl7dmFyIHM9Z2V0Q29tcHV0ZWRTdHlsZShlKSxyPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LGk9cy5wYWRkaW5nVG9wO3QucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighdC5xdWVyeVNlbGVjdG9yKCIuanMtY2F0YWxvZy1wcm9kLWRlc2NyLnQtY2F0YWxvZ19fY2FyZF9fZGVzY3IsIC5qcy1zdG9yZS1wcm9kLWRlc2NyLnQtc3RvcmVfX2NhcmRfX2Rlc2NyIikpe3ZhciBzPXQucXVlcnlTZWxlY3RvcigiLnQtY2F0YWxvZ19fY2FyZF9fdGV4dHdyYXBwZXIsIC50LXN0b3JlX19jYXJkX190ZXh0d3JhcHBlciIpLGE9cyYmcy5xdWVyeVNlbGVjdG9yKCIuanMtY2F0YWxvZy1wcmljZS13cmFwcGVyLCAuanMtc3RvcmUtcHJpY2Utd3JhcHBlciIpO2lmKHMmJmEpe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NOYW1lPWUuY2xhc3NOYW1lLGwuc3R5bGUuc2V0UHJvcGVydHkoImhlaWdodCIscisicHgiLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLXRvcCIsaSwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgibWFyZ2luLWJvdHRvbSIsIjBweCIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoImRpc3BsYXkiLCItd2Via2l0LWJveCIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoIi13ZWJraXQtYm94LW9yaWVudCIsInZlcnRpY2FsIiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgiLXdlYmtpdC1saW5lLWNsYW1wIiwiMSIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoIm92ZXJmbG93IiwiaGlkZGVuIiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgidGV4dC1vdmVyZmxvdyIsImVsbGlwc2lzIiwiaW1wb3J0YW50Iikscy5pbnNlcnRCZWZvcmUobCxhKX19fSkpfX1mdW5jdGlvbiBpbml0R2FsbGVyeSgpe3ZhciB0PWdldEdhbGxlcnlDb250YWluZXIoKTtpZih0KXt0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1zdHlsZXMtYXBwbGllZCIpLGFwcGx5QmFzZVN0eWxlcyh0KSx0LmRhdGFzZXQuc3R5bGVzQXBwbGllZD0idHJ1ZSIsYWRkRW1wdHlEZXNjclBsYWNlaG9sZGVyKHQpLERFQlVHJiZjb25zb2xlLmluZm8oItCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINCz0LDQu9C10YDQtdC4INC30LDQstC10YDRiNC10L3QsC4iKTtmb3IodmFyIGU9WzUwMCwxZTMsMTUwMF0scz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgcjtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2F0dGFjaEltYWdlTG9hZExpc3RlbmVycygpLHVwZGF0ZU5vSW1hZ2VDYXJkSGVpZ2h0cygpfSksZVtzXSl9fWVsc2UgREVCVUcmJmNvbnNvbGUuaW5mbygi0JrQvtC90YLQtdC50L3QtdGAINCz0LDQu9C10YDQtdC4INC90LUg0L3QsNC50LTQtdC9LiIpfWZ1bmN0aW9uIG9ic2VydmVQb3B1cCgpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwIiksZTt0JiYoIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdz9uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBzPTA7czx0Lmxlbmd0aDtzKyspe3ZhciByO2lmKHRbc10uaXNJbnRlcnNlY3Rpbmcpe0RFQlVHJiZjb25zb2xlLmluZm8oItCf0L7Qv9Cw0L8g0LLQuNC00LjQvC4g0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LPQsNC70LXRgNC10Lgg0YfQtdGA0LXQtyAxNTAwINC80YEiKSxlLmRpc2Nvbm5lY3QoKSxzZXRUaW1lb3V0KGluaXRHYWxsZXJ5LDE1MDApO2JyZWFrfX19KSkub2JzZXJ2ZSh0KTpzZXRUaW1lb3V0KGluaXRHYWxsZXJ5LDE1MDApKX1mdW5jdGlvbiBvblJlc2l6ZSgpe0RFQlVHJiZjb25zb2xlLmluZm8oIlJlc2l6ZSDigJMg0L7QsdC90L7QstC70LXQvdC40LUg0LLRi9GB0L7RgtGLINC60LDRgNGC0L7Rh9C10LoiKSx1cGRhdGVOb0ltYWdlQ2FyZEhlaWdodHMoKX1mdW5jdGlvbiBvblBvcHN0YXRlKCl7REVCVUcmJmNvbnNvbGUuaW5mbygiUG9wc3RhdGUg4oCTINC40L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINCz0LDQu9C10YDQtdC4Iiksc2V0VGltZW91dChpbml0R2FsbGVyeSw1MDApfWZ1bmN0aW9uIG9uUGFnZXNob3codCl7dC5wZXJzaXN0ZWQmJihERUJVRyYmY29uc29sZS5pbmZvKCJQYWdlc2hvdyAo0LjQtyDQutGN0YjQsCkg4oCTINC40L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPINCz0LDQu9C10YDQtdC4IiksaW5pdEdhbGxlcnkoKSl9ZnVuY3Rpb24gb25XaW5kb3dMb2FkKCl7aW5pdEdhbGxlcnkoKSxvYnNlcnZlUG9wdXAoKX1pZih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixvblJlc2l6ZSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIixvblBvcHN0YXRlKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicGFnZXNob3ciLG9uUGFnZXNob3cpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixvbldpbmRvd0xvYWQpLGRvY3VtZW50LmJvZHkmJiJNdXRhdGlvbk9ic2VydmVyImluIHdpbmRvdyl7dmFyIGRvbU9ic2VydmVyPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbigpe2luaXRHYWxsZXJ5KCl9KSk7ZG9tT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pfXZhciBwb2xsQ291bnQ9MCxwb2xsSW50ZXJ2YWw9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7aW5pdEdhbGxlcnkoKSwrK3BvbGxDb3VudD49MjAmJmNsZWFySW50ZXJ2YWwocG9sbEludGVydmFsKX0pLDUwMCk7CgpmdW5jdGlvbiB0Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKGUpe3RyeXt2YXIgdCxyPS92YXJcKCgtLXVjLShbXi1dKyktKFteLV0rKS0oW14sXSspKSxccz8oLiopXCkvLmV4ZWMoZSk7aWYoIXIpcmV0dXJuO3ZhciBsPXJbMF0sYT1yWzFdLG89clsyXSxzPXJbM10sXz1yWzRdLG49cls1XSxpLGQ7aWYoIShsJiZvJiZzJiZfJiZuKSlyZXR1cm47cmV0dXJue3BhcmVudDp7aWQ6Xyx0eXBlOm99LGZhbGxiYWNrOndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoYSl8fG4sZmllbGQ6c319Y2F0Y2goYyl7Y29uc29sZS5lcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHBhcnNlIENTUyBWYXJpYWJsZSIpfX1mdW5jdGlvbiB0Mzk2X19oZXgycmdiYShlLHQpe2lmKCFlKXJldHVybiExO3ZhciByPXQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIoZSk7ciYmKGU9ci5mYWxsYmFjayk7dmFyIGw9ZS5yZXBsYWNlKC8jLywiIik7aWYoMz09PWwubGVuZ3RoKXt2YXIgYT1sWzBdLG89bFsxXSxzPWxbMl07ZT0iIyIrYSthK28rbytzK3N9dmFyIF89cGFyc2VJbnQoZS5zdWJzdHJpbmcoMSksMTYpLG4saSxkO3JldHVyblsoMTY3MTE2ODAmXyk+PjE2LCg2NTI4MCZfKT4+OCwyNTUmXyxwYXJzZUZsb2F0KHQpXX1mdW5jdGlvbiB0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKGUpe3ZhciB0PVsiZ2FsbGVyeSJdLHI9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7cmV0dXJuIHQuaW5jbHVkZXMocil9ZnVuY3Rpb24gdDM5Nl9faXNGbGV4KGUpe3ZhciB0PWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZC1mbGV4Iikscj1lLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZ3JvdXAtZmxleCIpO3JldHVybiB0fHxyfWZ1bmN0aW9uIHQzOTZfX3NldE92ZXJmbG93VG9BbGxSZWNvcmRzKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtpZihlKXt2YXIgdD1bIi50OTUxX19zaWRlYmFyX3N0aWNreSIsIi50MTIwNl9fY29udGVudF9zdGlja3kiLCIudDc1NF9fY29sX2ZpeGVkIiwiLnQ3NzZfX2NvbF9maXhlZCIsIi50Nzg2X19jb2xfZml4ZWQiLCIudC1zdG9yZV9fcHJvZC1wb3B1cF9fY29sX2ZpeGVkIl07dDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCk7dmFyIHI9Qm9vbGVhbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQuam9pbigiLCAiKSkpO2UuY2xhc3NMaXN0LnJlbW92ZSgidC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIiwidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKSxlLmNsYXNzTGlzdC5hZGQocj8idC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIjoidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKX19ZnVuY3Rpb24gdDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCl7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiKSl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtlLmlkPSJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiLGUuaW5uZXJIVE1MPSIudC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIHsgb3ZlcmZsb3c6IGNsaXA7IH1cblx0XHRcdFx0XHRcdC50LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiB7IG92ZXJmbG93OiBoaWRkZW47IH0iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZSl9fWZ1bmN0aW9uIHQzOTZfX2dldEFydGJvYXJkcyhlKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHIsbD10JiYiZWRpdCI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik/Jy5yZWNvcmRbZGF0YS1yZWNvcmQtdHlwZT0iJytlKyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucmVjb3JkW2RhdGEtcGFyZW50dHBsaWQ9IicrZSsnIl0gLnI6bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc6Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrZSsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJbZGF0YS1wYXJlbnR0cGxpZD0iJytlKyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGwpKX1mdW5jdGlvbiB0Mzk2X19nZXRaZXJvQmxvY2tzKCl7dmFyIGU9W10uY29uY2F0KHQzOTZfX2dldEFydGJvYXJkcygiMzk2IiksdDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIxMjEiKSksdDtyZXR1cm4gZS5sZW5ndGg/ZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybntyZWNvcmQ6ZS5jbG9zZXN0KCIucjpub3QoLnQzOTdfX29mZik6bm90KC50Mzk1X19vZmYpOm5vdCgudDQwMF9fb2ZmKSIpLGFydGJvYXJkOmV9fSkpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVjb3JkfSkpOltdfWZ1bmN0aW9uIHQzOTZfX2lzSW5zaWRlR3JvdXBXaXRoWm9vbShlKXtmb3IodmFyIHQ9ZS5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTt0Oyl7dmFyIHI7aWYodC5zdHlsZS56b29tKXJldHVybiEwO3Q9bnVsbD09KHI9dC5wYXJlbnRFbGVtZW50KT92b2lkIDA6ci5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKX1yZXR1cm4hMX12YXIgdDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcj1mdW5jdGlvbiBlKCl7dmFyIHQ9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1TdHJpbmcodCs9MSkucGFkU3RhcnQoNiwiMCIpO3JldHVybiIiK0RhdGUubm93KCkrZX19LHQzOTZfX2dldFVuaXF1ZUlkPXQzOTZfX3VuaXF1ZUlkX19nZW5lcmF0b3IoKTtmdW5jdGlvbiB0Mzk2X2lzQmxvY2tWaXNpYmxlKGUpe3ZhciB0PXdpbmRvdy5pbm5lcldpZHRoLHI9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1pbiIpLGw9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1heCIpO3JldHVybiEociYmdDxwYXJzZUludChyLDEwKSkmJiEobCYmdD5wYXJzZUludChsLDEwKSl9dmFyIHQzOTZfX29uUmVhZHk9ZnVuY3Rpb24gZSh0KXsibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP3QoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0KX07ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRGb3JtSW5wdXRzVmFsdWUoZSl7dmFyIHQ9ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9faW5wdXRzLWRhdGEiKTtpZih0KXt2YXIgcj10LmdldEF0dHJpYnV0ZSgiZGF0YS12YWx1ZSIpO2lmKHIpdHJ5e3JldHVybiBKU09OLnBhcnNlKHIpfWNhdGNoKG8pe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIGRhdGE6IixvLHIpLFtdfX12YXIgbD1lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtdGV4dGFyZWEiKTtpZihsKXt2YXIgYT1sLnZhbHVlO2lmKGEpdHJ5e3JldHVybiBKU09OLnBhcnNlKGEpfWNhdGNoKG8pe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIHRleHRhcmVhIHZhbHVlOiIsbyxhKSxbXX19cmV0dXJuW119ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9faW5pdChlLHQpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpLGw9Jy50bi1lbGVtW2RhdGEtZmUtZWxlbS1pZD0iJyt0KyciXSwgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK3QrJyJdJyxhPXI/ci5xdWVyeVNlbGVjdG9yKGwpOm51bGw7aWYoIWEpcmV0dXJuITE7dmFyIG89ImZ1bmN0aW9uIj09dHlwZW9mIGpRdWVyeTt0X29uRnVuY0xvYWQoInRfc2xkc0luaXQiLChmdW5jdGlvbigpe3Rfb25GdW5jTG9hZCgidDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlIiwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19wcm9jZXNzR2FsbGVyeVdpdGhHZW9MYW5kaW5nKHIsKGZ1bmN0aW9uKCl7dF96ZXJvR2FsbGVyeV9fcmVuZGVyKGE9ci5xdWVyeVNlbGVjdG9yKGwpKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcobz8kKGEpOmEpLHRfc2xkc0luaXQobz8kKGEpOlthXSksdF9vbkZ1bmNMb2FkKCJ0X3NsZHNfdXBkYXRlU2xpZGVyIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rfc2xkc191cGRhdGVTbGlkZXIobz8kKGEpOlthXSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyX25leHQoYSxlKX0pKX0pKX0pKX0pKSxbImVkaXQiLCJ6ZXJvIl0uaW5jbHVkZXMod2luZG93LnRpbGRhbW9kZSl8fCJ5IiE9PWEuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXpvb21hYmxlLXZhbHVlIil8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXpvb21lcl9fd3JhcHBlciIpLmxlbmd0aHx8dF9vbkZ1bmNMb2FkKCJ0X2luaXRab29tIiwoZnVuY3Rpb24oKXt0X2luaXRab29tKCl9KSksdF96ZXJvR2FsbGVyeV9faGFuZGxlTW92ZVNsaWRlcihhKTt2YXIgdD1yLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2Iik7dCYmKCJ1bmRlZmluZWQiIT10eXBlb2YgalF1ZXJ5PygkKHQpLnVuYmluZCgiZGlzcGxheUNoYW5nZWQiLHRfemVyb0dhbGxlcnlfX3VwZGF0ZVNsaWRlckhhbmRsZXIpLCQodCkuYmluZCgiZGlzcGxheUNoYW5nZWQiLHRfemVyb0dhbGxlcnlfX3VwZGF0ZVNsaWRlckhhbmRsZXIpKToodC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsdF96ZXJvR2FsbGVyeV9fdXBkYXRlU2xpZGVySGFuZGxlciksdC5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsdF96ZXJvR2FsbGVyeV9fdXBkYXRlU2xpZGVySGFuZGxlcikpKTt2YXIgcz1hLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHMiKTtzJiYocy5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIil9KSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2xvYmFsSW5pdCgpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInplcm86d2luZG93LXdpZHRoLWNoYW5nZWQiLChmdW5jdGlvbigpe3ZhciBlO3RfemVyb0dhbGxlcnlfX29uUmVzaXplKHQzOTZfX2dldFplcm9CbG9ja3MoKSl9KSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fb25SZXNpemUoZSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1lLnJlY29yZCxyO3QmJih0Mzk2X2lzQmxvY2tWaXNpYmxlKHQpJiZ0LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWVsZW0tdHlwZT0iZ2FsbGVyeSJdJykuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dF9zbGRzX3VwZGF0ZVNsaWRlcihlKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJfbmV4dChlLHQuaWQucmVwbGFjZSgicmVjIiwiIikpfSkpKX0pKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19oYW5kbGVNb3ZlU2xpZGVyKGUpe3ZhciB0O2lmKCEoL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwib250b3VjaGVuZCJpbiBkb2N1bWVudCkpe3ZhciByPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGw9ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIiksYT1wYXJzZUZsb2F0KHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIikpO2F8fDA9PT1hfHwoYT0zMDApO3ZhciBvPTE0MDt0X3plcm9HYWxsZXJ5X19zZXRTbGlkZXNPcGFjaXR5KGwsIjAiKSxlLmFkZEV2ZW50TGlzdGVuZXIoInRpbGRhU2xkc01vdmVTbGlkZVN0YXJ0IiwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19zZXRTbGlkZXNPcGFjaXR5KGwsIjEiKX0pKSxlLmFkZEV2ZW50TGlzdGVuZXIoInRpbGRhU2xkc01vdmVTbGlkZUVuZCIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19zZXRTbGlkZXNPcGFjaXR5KGwsIjAiKX0pLGErbyl9KSl9fWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3NldFNsaWRlc09wYWNpdHkoZSx0KXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIil8fChlLnN0eWxlLm9wYWNpdHk9dCl9KSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fcHJvY2Vzc0dhbGxlcnlXaXRoR2VvTGFuZGluZyhlLHQpe3ZhciByPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50ODA0IiksbD0hIWUudGV4dENvbnRlbnQmJi0xIT09ZS50ZXh0Q29udGVudC5pbmRleE9mKCIlJSIpLGE9ZS5xdWVyeVNlbGVjdG9yKCJbZGF0YS1yZXBsYWNlLWtleV0iKSxvPSJwdWJsaXNoZWQiIT09dF96ZXJvR2FsbGVyeV9fZ2V0VGlsZGFNb2RlKCk7IXJ8fCFsfHxhfHxvP3QoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZXBsYWNpbmdDb21wbGV0ZWQiLHQpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3VwZGF0ZVNsaWRlckhhbmRsZXIoZSl7dF9zbGRzX3VwZGF0ZVNsaWRlcihlLnRhcmdldCl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2V0VGlsZGFNb2RlKCl7aWYodm9pZCAwIT09d2luZG93LnRpbGRhbW9kZSlyZXR1cm4gd2luZG93LnRpbGRhbW9kZTt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHQ7c3dpdGNoKGU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOiIiKXtjYXNlImVkaXQiOndpbmRvdy50aWxkYW1vZGU9ImVkaXQiO2JyZWFrO2Nhc2UicHJldmlldyI6d2luZG93LnRpbGRhbW9kZT0icHJldmlldyI7YnJlYWs7ZGVmYXVsdDp3aW5kb3cudGlsZGFtb2RlPSJwdWJsaXNoZWQifXJldHVybiB3aW5kb3cudGlsZGFtb2RlfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3JlbmRlcihlKXt3aW5kb3cualF1ZXJ5JiZlIGluc3RhbmNlb2YgalF1ZXJ5JiYoZT1lLmxlbmd0aD9lLmdldCgwKTpudWxsKTt2YXIgdD1lP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLWltZ3MtdmFsdWUiKToiIjtpZighdCl7dmFyIHI9ZT9lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zbGRzLWltZ3MtdGV4dGFyZWEiKTpudWxsO3Q9cj9yLnZhbHVlOiIifXZhciBsPSJmdW5jdGlvbiI9PXR5cGVvZiBqUXVlcnksYT10P0pTT04ucGFyc2UodCk6W107YT1hLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIXRfemVyb0dhbGxlcnlfX2lzRW1wdHlPYmooZSl9KSk7dmFyIG89ZT9lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik6bnVsbDtvJiYoby5pbm5lckhUTUw9JzxkaXYgY2xhc3M9InQtc2xkcyIgc3R5bGU9InZpc2liaWxpdHk6IGhpZGRlbjsiPjxkaXYgY2xhc3M9InQtc2xkc19fbWFpbiI+PGRpdiBjbGFzcz0idC1zbGRzX19jb250YWluZXIiPjxkaXYgY2xhc3M9InQtc2xkc19faXRlbXMtd3JhcHBlciIgZGF0YS1zbGlkZXItdHJhbnNpdGlvbj0iIiBkYXRhLXNsaWRlci13aXRoLWN5Y2xlPSJ0cnVlIiBkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodD0idHJ1ZSIgZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoPSJmYWxzZSIgIGRhdGEtc2xpZGVyLWlzLXByZXZpZXc9InRydWUiPjwvZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9InQtc2xkc19fYnVsbGV0X3dyYXBwZXIiPjwvZGl2PjxkaXYgY2xhc3M9InQtc2xkc19fY2FwdGlvbl9fY29udGFpbmVyIj48L2Rpdj48ZGl2IGNsYXNzPSJ0LXNsZHNfX2Fycm93X2NvbnRhaW5lciI+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvd193cmFwcGVyIHQtc2xkc19fYXJyb3dfd3JhcHBlci1sZWZ0IiBkYXRhLXNsaWRlLWRpcmVjdGlvbj0ibGVmdCIgc3R5bGU9ImhlaWdodDogNDg4cHg7Ij48ZGl2IGNsYXNzPSJ0LXNsZHNfX2Fycm93IHQtc2xkc19fYXJyb3ctbGVmdCI+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvd19ib2R5IHQtc2xkc19fYXJyb3dfYm9keS1sZWZ0Ij48c3ZnIGNsYXNzPSJ0LW51bGxfX3NsZHMtYXJyb3cgdC1udWxsX19zbGRzLWFycm93XzEiIHdpZHRoPSI5NCIgaGVpZ2h0PSI5NCIgdmlld0JveD0iMCAwIDk0IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0zOSA2OEw2MCA0N0wzOSAyNiIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PC9zdmc+PHN2ZyBjbGFzcz0idC1udWxsX19zbGRzLWFycm93IHQtbnVsbF9fc2xkcy1hcnJvd18yIiAgd2lkdGg9Ijk0IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgOTQgOTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTYzIDQ3LjkxN0gzMCIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PHBhdGggZD0iTTQ2LjkxNyA2NEw2MyA0Ny45MTdMNDYuOTE3IDMxLjgzNCIgc3Ryb2tlPSJibGFjayIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+PC9zdmc+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvd193cmFwcGVyIHQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIgZGF0YS1zbGlkZS1kaXJlY3Rpb249InJpZ2h0IiBzdHlsZT0iaGVpZ2h0OiA0ODhweDsiPjxkaXYgY2xhc3M9InQtc2xkc19fYXJyb3cgdC1zbGRzX19hcnJvdy1yaWdodCAiPjxkaXYgY2xhc3M9InQtc2xkc19fYXJyb3dfYm9keSB0LXNsZHNfX2Fycm93X2JvZHktcmlnaHQiPjxzdmcgY2xhc3M9InQtbnVsbF9fc2xkcy1hcnJvdyB0LW51bGxfX3NsZHMtYXJyb3dfMSIgd2lkdGg9Ijk0IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgOTQgOTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTM5IDY4TDYwIDQ3TDM5IDI2IiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48L3N2Zz48c3ZnIGNsYXNzPSJ0LW51bGxfX3NsZHMtYXJyb3cgdC1udWxsX19zbGRzLWFycm93XzIiICB3aWR0aD0iOTQiIGhlaWdodD0iOTQiIHZpZXdCb3g9IjAgMCA5NCA5NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNjMgNDcuOTE3SDMwIiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48cGF0aCBkPSJNNDYuOTE3IDY0TDYzIDQ3LjkxN0w0Ni45MTcgMzEuODM0IiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48L3N2Zz48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTtmb3IodmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksXz0icHVibGlzaGVkIj09PXRfemVyb0dhbGxlcnlfX2dldFRpbGRhTW9kZSgpJiYieSI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInpvb21hYmxlIiksbj0hMSxpPXRfemVyb0dhbGxlcnlfX2lzTGF6eUxvYWRpbmdPbkVsZW0oZSxsKSxkPTA7ZDxhLmxlbmd0aDtkKyspe3ZhciBjPWFbZF0sdT10X3plcm9HYWxsZXJ5X19nZXRWaWRlb0tleXMoKS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gY1tlXX0pKTsodXx8Yy5saV9pbWd1cmwpJiYobj0hMCksXz1fJiYhYy5saV9pbWd1cmwmJiF1LGMuem9vbWFibGU9XyxjLndpdGhMYXp5PWk7dmFyIHk9dF96ZXJvR2FsbGVyeV9fZ2VuZXJhdGVTbGlkZShjLGQpO3kmJihudWxsPT1zfHxzLmFwcGVuZENoaWxkKHkpKTt2YXIgbT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF93cmFwcGVyIik7aWYobSl7dmFyIHA9JzxkaXYgY2xhc3M9InQtc2xkc19fYnVsbGV0JysoMD09PWQ/IiB0LXNsZHNfX2J1bGxldF9hY3RpdmUiOiIiKSsnIiBkYXRhLXNsaWRlLWJ1bGxldC1mb3I9IicrKGQrMSkrJyI+PGRpdiBjbGFzcz0idC1zbGRzX19idWxsZXRfYm9keSIgc3R5bGU9IndpZHRoOiAxMHB4OyBoZWlnaHQ6IDEwcHg7YmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ij48L2Rpdj48L2Rpdj4nO20uaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLHApfXRfemVyb0dhbGxlcnlfX2FwcGVuZENhcHRpb24oZSxjLGQpfWlmKCFfJiYhbil7dmFyIGc9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19jb250YWluZXIiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGcsKGZ1bmN0aW9uKGUpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfemVyb0dhbGxlcnlfX3NldFNpZGVIYW5kbGVycyksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF96ZXJvR2FsbGVyeV9fc2V0U2lkZUhhbmRsZXJzKX0pKX1pJiZ0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2FwcGVuZENhcHRpb24oZSx0LHIpe3ZhciBsPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY2FwdGlvbl9fY29udGFpbmVyIik7bnVsbD09bHx8bC5hcHBlbmRDaGlsZCh0X3plcm9HYWxsZXJ5X19jcmVhdGVDYXB0aW9uKHQscikpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2NyZWF0ZUNhcHRpb24oZSx0KXt2YXIgcj1lLmxpX2ltZ3RpdGxlfHwiIixsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19jYXB0aW9uIiksMD09PXQmJmwuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19jYXB0aW9uLWFjdGl2ZSIpLGwuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWNhcHRpb24iLHQrMSk7dmFyIGEsbz1yLnN0YXJ0c1dpdGgoIjxzcGFuIGRhdGEtcmVwbGFjZS1rZXkiKSYmci5lbmRzV2l0aCgiPC9zcGFuPiIpP3I6dF96ZXJvR2FsbGVyeV9fZXNjYXBlSHRtbChyKTtyZXR1cm4gbC5pbm5lckhUTUw9bz8nPGRpdiBjbGFzcz0idC1zbGRzX19jYXB0aW9uX3dyYXBwZXIiPjxkaXYgY2xhc3M9InQtc2xkc19fdGl0bGUiPicrbysiPC9kaXY+PC9kaXY+IjoiIixsfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dlbmVyYXRlU2xpZGUoZSx0KXt2YXIgcixsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGE9WyJ0LXNsZHNfX2l0ZW0iXTswPT09dCYmYS5wdXNoKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksKHI9bC5jbGFzc0xpc3QpLmFkZC5hcHBseShyLGEpLGwuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4Iix0KzEpO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBvLmNsYXNzTGlzdC5hZGQoInQtd2lkdGgiLCJ0LW51bGxfX3NsZHMtd3JhcHBlciIsInQtc2xkc19fd3JhcHBlciIsInQtc2xkc19fd3JhcHBlcl8xMDAiLCJ0LWFsaWduX2NlbnRlciIpLGwuYXBwZW5kQ2hpbGQobyksZS5saV9pbWdhbHQmJihvLmlubmVySFRNTD0nPG1ldGEgaXRlbXByb3A9ImltYWdlIiBjb250ZW50PSInK3RfemVyb0dhbGxlcnlfX2VzY2FwZUh0bWwoZS5saV9pbWcpKyciPlxuXHRcdFx0PG1ldGEgaXRlbXByb3A9ImNhcHRpb24iIGNvbnRlbnQ9IicrdF96ZXJvR2FsbGVyeV9fZXNjYXBlSHRtbChlLmxpX2ltZ2FsdCkrJyI+XG5cdFx0XHQnKSxvLmFwcGVuZENoaWxkKHRfemVyb0dhbGxlcnlfX2dlbmVyYXRlU2xpZGVDb250ZW50KGUsdCkpLGx9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2VuZXJhdGVTbGlkZUNvbnRlbnQoZSx0KXt2YXIgcj10X3plcm9HYWxsZXJ5X19nZXRWaWRlb0tleXMoKS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKSxsPWUubGlfaW1ndXJsJiYhcixhPWUubGlfaW1ndGFyZ2V0JiYhcixvPWUubGlfaW1nbm9mb2xsb3cmJiFyLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsPyJhIjoiZGl2Iik7aWYocy5zZXRBdHRyaWJ1dGUoImRhdGEtaW1nLWxpZCIsZS5saWQpLGwmJnMuc2V0QXR0cmlidXRlKCJocmVmIixlLmxpX2ltZ3VybCksYSYmcy5zZXRBdHRyaWJ1dGUoInRhcmdldCIsIl9ibGFuayIpLG8mJnMuc2V0QXR0cmlidXRlKCJyZWwiLCJub2ZvbGxvdyIpLGUuem9vbWFibGUmJihzLnNldEF0dHJpYnV0ZSgiZGF0YS16b29tLXRhcmdldCIsdCsxKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS16b29tYWJsZSIsInllcyIpLHMuc2V0QXR0cmlidXRlKCJkYXRhLWltZy16b29tLXVybCIsZS5saV9pbWcpLHMuY2xhc3NMaXN0LmFkZCgidC16b29tYWJsZSIpKSxlLndpdGhMYXp5JiYocy5jbGFzc0xpc3QuYWRkKCJ0LWJnaW1nIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwiLGUubGlfaW1nKSkscy5jbGFzc0xpc3QuYWRkKCJ0bi1hdG9tX19zbGRzLWltZyIpLHMuc3R5bGUuYmFja2dyb3VuZEltYWdlPXRfemVyb0dhbGxlcnlfX3BhcnNlSW1hZ2VVcmwoZS5saV9pbWcsZS53aXRoTGF6eSkscil7dmFyIF89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Xy5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X192aWRlby13cmFwcGVyIiksXy5hcHBlbmRDaGlsZChzKTt2YXIgbj10X3plcm9HYWxsZXJ5X19jcmVhdGVQbGF5QnV0dG9uRm9yVmlkZW8oZSk7cmV0dXJuIG4mJl8uYXBwZW5kQ2hpbGQobiksX31yZXR1cm4gc31mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19wYXJzZUltYWdlVXJsKGUsdCl7aWYoIWUpcmV0dXJuIiI7aWYoIXR8fGUuaW5jbHVkZXMoIi5zdmciKXx8IWUuaW5jbHVkZXMoImh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIpKXJldHVybiJ1cmwoIitlKyIpIjt2YXIgcj1lLnNwbGl0KCIvIik7cmV0dXJuIHIuc3BsaWNlKC0xLDAsIi0vcmVzaXplLzIweC8iKSwidXJsKCIrci5qb2luKCIvIikrIikifWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2NyZWF0ZVBsYXlCdXR0b25Gb3JWaWRlbyhlKXt2YXIgdD10X3plcm9HYWxsZXJ5X19nZXRWaWRlb0tleXMoKS5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKSxyPShudWxsPT10P3ZvaWQgMDp0LnJlcGxhY2UoImxpXyIsIiIpKXx8IiIsbD1lW3RdfHwiIjtpZighcnx8IWwpcmV0dXJuIG51bGw7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGEuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fcGxheSIpLGEuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci12aWRlby10eXBlIixyKSxhLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdmlkZW8tdXJsIixsKSxhLmlubmVySFRNTD0nPHN2ZyB2aWV3Qm94PSIwIDAgNjAgNjAiPlxuXHRcdFx0XHRcdFx0XHRcdFx0PGcgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9IiIgZmlsbC1ydWxlPSJldmVub2RkIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PGcgY2xhc3M9InRuLWVsZW1fX2dhbGxlcnlfX3BsYXlfaWNvbl9fY29sb3ItaG9sZGVyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNjkxLjAwMDAwMCwgLTM1MTQuMDAwMDAwKSIgZmlsbD0iI0ZGRkZGRiI+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHBhdGggZD0iTTcyMSwzNTc0IEM3MzcuNTY4NTQyLDM1NzQgNzUxLDM1NjAuNTY4NTQgNzUxLDM1NDQgQzc1MSwzNTI3LjQzMTQ2IDczNy41Njg1NDIsMzUxNCA3MjEsMzUxNCBDNzA0LjQzMTQ1OCwzNTE0IDY5MSwzNTI3LjQzMTQ2IDY5MSwzNTQ0IEM2OTEsMzU2MC41Njg1NCA3MDQuNDMxNDU4LDM1NzQgNzIxLDM1NzQgWiBNNzE1LDM1MzQgTDczMiwzNTQ0LjUgTDcxNSwzNTU1IEw3MTUsMzUzNCBaIj48L3BhdGg+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZz5cblx0XHRcdFx0XHRcdFx0XHRcdDwvZz5cblx0XHRcdFx0XHRcdFx0XHQ8L3N2Zz4nLGEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfemVyb0dhbGxlcnlfX3BsYXlWaWRlbyksYX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19zZXRTaWRlSGFuZGxlcnMoZSl7dmFyIHQ9ZS50YXJnZXQscj10LmNsb3Nlc3QoIi50LXNsZHMiKSxsPWUub2Zmc2V0WCxhPXQub2Zmc2V0V2lkdGgsbz1yP3IucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctbGVmdCIpOm51bGwscz1yP3IucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctcmlnaHQiKTpudWxsO2w8PTYwJiZvJiZvLmNsaWNrKCksYS1sPD02MCYmcy5jbGljaygpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2lzRW1wdHlPYmooZSl7aWYoIWUpcmV0dXJuITA7dmFyIHQ9W107Zm9yKHZhciByIGluIGUpZVtyXXx8dC5wdXNoKCJ5Iik7cmV0dXJuIHQubGVuZ3RoPT09T2JqZWN0LmtleXMoZSkubGVuZ3RofWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3JlbmRlcl9uZXh0KGUsdCl7dmFyIHI7WyJzbGRzX2Fycm93c2l6ZSIsInNsZHNfYXJyb3dsaW5lc2l6ZSIsInNsZHNfYXJyb3djb2xvciIsInNsZHNfYXJyb3djb2xvcmhvdmVyIiwic2xkc19hcnJvd2JnY29sb3IiLCJzbGRzX2Fycm93Ymdjb2xvcmhvdmVyIiwic2xkc19hcnJvd2Jnb3BhY2l0eSIsInNsZHNfYXJyb3diZ29wYWNpdHlob3ZlciIsInNsZHNfZG90c3NpemUiLCJzbGRzX2RvdHNiZ2NvbG9yIiwic2xkc19kb3RzYmdjb2xvcmFjdGl2ZSIsInNsZHNfbG9vcCIsInNsZHNfc3BlZWQiLCJzbGRzX2F1dG9wbGF5Iiwic2xkc19hcnJvd2NvbnRyb2xzIiwic2xkc19kb3RzY29udHJvbHMiLCJzbGRzX3N0cmV0Y2giLCJzbGRzX3BsYXlpY29uc2l6ZSIsInNsZHNfcGxheWljb25jb2xvciIsInNsZHNfY2FwdGlvbnRvcG1hcmdpbiIsInNsZHNfZG90c3ZtYXJnaW4iLCJzbGRzX2NhcHRpb253aWR0aCIsInNsZHNfYXJyb3dobWFyZ2luIiwic2xkc19hcnJvd3ZtYXJnaW4iLCJzbGRzX2RvdHNobWFyZ2luIiwic2xkc19hcnJvd2FsaWduIiwic2xkc19hcnJvd2JldHdlZW5tYXJnaW4iLCJzbGRzX2Fycm93dHlwZSIsInNsZHNfY3Vyc29yY29udHJvbCIsInNsZHNfaW1ncG9zaXRpb24iLCJzbGRzX2Fycm93Ym9yZGVyIl0uZm9yRWFjaCgoZnVuY3Rpb24ocil7dF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCxyKX0pKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZXRBcnJvd1NpemUoZSl7dmFyIHQ7cmV0dXJue3M6MzAsbTo0MCxsOjQ1LHhsOjUwfVtlXX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LHIpe3ZhciBsPSJmdW5jdGlvbiI9PXR5cGVvZiBqUXVlcnk7aWYoZG9jdW1lbnQuY29udGFpbnMoZSkpe3ZhciBhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSxyKSxvPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIikscz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93X2NvbnRhaW5lciIpLF89ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19idWxsZXRfd3JhcHBlciIpLG49ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksaT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93IiksZD1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LXJpZ2h0IiksYz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LWxlZnQiKSx1PWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYnVsbGV0X2JvZHkiKSx5LG0scCxnLHYsZix3O3N3aXRjaCh2b2lkIDA9PT1hJiYoYT0iIikscil7Y2FzZSJzbGRzX2ltZ3Bvc2l0aW9uIjp2YXIgYjthfHwoYT0iY2VudGVyIGNlbnRlciIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9fcG9zaXRpb24tc3R5bGVzIikpLG8mJigodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19wb3NpdGlvbi1zdHlsZXMiKSx3LnRleHRDb250ZW50PSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnRuLWF0b21fX3NsZHMtaW1ne2JhY2tncm91bmQtcG9zaXRpb246ICcrYSsiO30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKTticmVhaztjYXNlInNsZHNfc3RyZXRjaCI6dmFyIGg7YXx8KGE9ImNvdmVyIiksdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X19zdHJldGNoLXN0eWxlcyIpKSxvJiYoKHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fc3RyZXRjaC1zdHlsZXMiKSx3LnRleHRDb250ZW50PSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnRuLWF0b21fX3NsZHMtaW1nIHtiYWNrZ3JvdW5kLXNpemU6ICcrYSsiO30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKTticmVhaztjYXNlInNsZHNfY3Vyc29yY29udHJvbCI6YXx8KGE9Im5vbmUiKSxlLmNsYXNzTGlzdC5yZW1vdmUoInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLWN1cnNvciIpLCJvbiI9PT1hJiZlLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLWN1cnNvciIpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2NvbnRyb2xzIjppZihhfHwoYT0ibmVhciIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtaW4iLCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy1uZWFyIiwidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3Mtbm9uZSIsInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLWFib3ZlIiwidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtdW5kZXIiKSxlLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLSIrYSksImFib3ZlIj09PWF8fCJ1bmRlciI9PT1hKXt5PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd3NpemUiKTt2YXIgej10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3diZXR3ZWVubWFyZ2luIik7aWYoenx8KHo9IjEwIikseXx8KHk9InMiKSx5PXRfemVyb0dhbGxlcnlfX2dldEFycm93U2l6ZSh5KSxzKXt2YXIgRz0yKnkrcGFyc2VJbnQoeiwxMCk7cy5zdHlsZS53aWR0aD10Mzk2X196b29taWZ5VmFsdWUoZSxHKX19ZWxzZSBzJiYocy5zdHlsZS53aWR0aD0iMTAwJSIpLHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGw/JChlKTplLCJib3JkZXJ3aWR0aCIpOyJpbiI9PT1hJiZlLnF1ZXJ5U2VsZWN0b3IoIltkYXRhLXNsaWRlci12aWRlby10eXBlXSIpJiZlLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX3dpdGgtdmlkZW8iKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93aG1hcmdpbiIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3d2bWFyZ2luIiksInVuZGVyIj09PWEmJnRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfY2FwdGlvbnRvcG1hcmdpbiIpO2JyZWFrO2Nhc2Uic2xkc19kb3RzaG1hcmdpbiI6dmFyIFM7YXx8KGE9IjIwIiksdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X19idWxsZXQtaG1hcmdpbi1zdHlsZXMiKSksbyYmKCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2J1bGxldC1obWFyZ2luLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudC1zbGRzX19idWxsZXQge3BhZGRpbmc6IDEwcHggJythLzIrInB4O21hcmdpbjogMHB4O30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKTticmVhaztjYXNlInNsZHNfZG90c2NvbnRyb2xzIjphfHwoYT0ibm9uZSIpLF8mJihfLnN0eWxlLmRpc3BsYXk9ImJsb2NrIiksdj1wYXJzZUludCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c3NpemUiKSwxMCksIm5lYXIiPT09YSYmXyYmKF8uc3R5bGUuYm90dG9tPS0yMC12KyJweCIpLCJpbiI9PT1hJiZfJiYoXy5zdHlsZS5ib3R0b209IjAiKSwibm9uZSI9PT1hJiZfJiYoXy5zdHlsZS5kaXNwbGF5PSJub25lIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19kb3Rzdm1hcmdpbiIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3d2bWFyZ2luIik7YnJlYWs7Y2FzZSJzbGRzX3BsYXlpY29uc2l6ZSI6dmFyIEE7YXx8KGE9IjcwIiksdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X19pY29uLXNpemUtc3R5bGVzIikpLG8mJigodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19pY29uLXNpemUtc3R5bGVzIiksdy50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50bi1lbGVtX19nYWxsZXJ5X19wbGF5IHt3aWR0aDogJytwYXJzZUludChhLDEwKSsicHg7aGVpZ2h0OiAiK3BhcnNlSW50KGEsMTApKyJweDtsZWZ0OiBjYWxjKDUwJSAtICIrcGFyc2VJbnQoYSwxMCkvMisicHgpO3RvcDogY2FsYyg1MCUgLSAiK3BhcnNlSW50KGEsMTApLzIrInB4KTt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIix3KSk7YnJlYWs7Y2FzZSJzbGRzX3BsYXlpY29uY29sb3IiOnZhciBFO2F8fChhPSIjZmZmIiksdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X19pY29uLWNvbG9yLXN0eWxlcyIpKSxvJiYoKHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9faWNvbi1jb2xvci1zdHlsZXMiKSx3LnRleHRDb250ZW50PSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnRuLWVsZW1fX2dhbGxlcnlfX3BsYXlfaWNvbl9fY29sb3ItaG9sZGVyIHtmaWxsOiAnK2ErIjt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIix3KSk7YnJlYWs7Y2FzZSJzbGRzX2Fycm93dHlwZSI6YXx8KGE9IjEiKTt2YXIgTD1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LW51bGxfX3NsZHMtYXJyb3ciKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKEwsKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KSk7dmFyIGs9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1udWxsX19zbGRzLWFycm93XyIrYSk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChrLChmdW5jdGlvbihlKXtlLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0pKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93c2l6ZSIpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2JvcmRlciI6dmFyIFY7aWYoYXx8KGE9Im5vbmUiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX2Fycm93LWJvcmRlci1zdHlsZXMiKSksIm5vbmUiIT09YSl7dmFyIEY9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93bGluZXNpemUiKXx8IjEiLHg9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29sb3IiKXx8IiMyMjIiLHE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29sb3Job3ZlciIpfHx4O28mJigodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19hcnJvdy1ib3JkZXItc3R5bGVzIiksdy50ZXh0Q29udGVudD0nLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnQtc2xkc19fYXJyb3dfYm9keTpiZWZvcmUge2JvcmRlcjogJytGKyJweCBzb2xpZCAiK3grJzt9LnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnQtc2xkc19fYXJyb3dfYm9keTpob3ZlcjpiZWZvcmUge2JvcmRlcjogJytGKyJweCBzb2xpZCAiK3ErIjt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIix3KSl9YnJlYWs7Y2FzZSJzbGRzX2Fycm93c2l6ZSI6YXx8KGE9InMiKSxhPXRfemVyb0dhbGxlcnlfX2dldEFycm93U2l6ZShhKTt2YXIgQz1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X2JvZHkiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKEMsKGZ1bmN0aW9uKHQpe3Quc3R5bGUuc2V0UHJvcGVydHkoIndpZHRoIix0Mzk2X196b29taWZ5VmFsdWUoZSxwYXJzZUludChhLDEwKSksImltcG9ydGFudCIpfSkpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3diZ2NvbG9yIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JldHdlZW5tYXJnaW4iKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93dm1hcmdpbiIpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2xpbmVzaXplIjphfHwoYT0iMSIpO3ZhciBPPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfYm9keSBwb2x5bGluZSwgLnQtc2xkc19fYXJyb3dfYm9keSBwYXRoIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChPLChmdW5jdGlvbihlKXtlLnN0eWxlLnN0cm9rZVdpZHRoPXBhcnNlSW50KGEsMTApKyJweCJ9KSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JvcmRlciIpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2NvbG9yIjphfHwoYT0iIzIyMiIpO3ZhciBJPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfY29udGFpbmVyIHBvbHlsaW5lLCAudC1zbGRzX19hcnJvd19jb250YWluZXIgcGF0aCIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoSSwoZnVuY3Rpb24oZSl7ZS5zdHlsZS5zdHJva2U9YX0pKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Ym9yZGVyIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2NvbG9yaG92ZXIiKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Ymdjb2xvciIpO2JyZWFrO2Nhc2Uic2xkc19kb3RzYmdjb2xvciI6YXx8KGE9IiNmZmYiKSxmPS0xIT09YS5pbmRleE9mKCItZ3JhZGllbnQoIiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh1LChmdW5jdGlvbihlKXtmP2Uuc3R5bGUuYmFja2dyb3VuZEltYWdlPWE6ZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9YX0pKTticmVhaztjYXNlInNsZHNfZG90c2JnY29sb3JhY3RpdmUiOnZhciBCO2lmKGF8fChhPSIjMjIyIiksZj0tMSE9PWEuaW5kZXhPZigiLWdyYWRpZW50KCIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19idWxsZXRfd3JhcHBlciBzdHlsZSIpKSxfKXt3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dmFyIE09IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXScsaj0oTSs9IiAudC1zbGRzX19idWxsZXRfYWN0aXZlIC50LXNsZHNfX2J1bGxldF9ib2R5IikrInsiO2orPWY/ImJhY2tncm91bmQtaW1hZ2U6ICIrYSsiICFpbXBvcnRhbnQ7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IjoiYmFja2dyb3VuZC1jb2xvcjogIithKyIgIWltcG9ydGFudDsgYmFja2dyb3VuZC1pbWFnZTogbm9uZSAhaW1wb3J0YW50OyIsais9In0iLHcudGV4dENvbnRlbnQ9aixfLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIix3KX1icmVhaztjYXNlInNsZHNfYXV0b3BsYXkiOmlmKGF8fChhPSIwIiksbiYmKG4uc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10aW1lb3V0IiwoMWUzKnBhcnNlRmxvYXQoYSkpLnRvU3RyaW5nKCkpLHRfb25GdW5jTG9hZCgidF9zbGlkZU1vdmUiLChmdW5jdGlvbigpe3Rfc2xpZGVNb3ZlKGw/JChlKTplKX0pKSwxZTMqcGFyc2VGbG9hdChhKSkpe3ZhciBIPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO0guaW5pdEV2ZW50KCJzbGlkZUF1dG9wbGF5VGltZXJSZWFkeSIsITAsITApLG4uZGlzcGF0Y2hFdmVudChIKX1icmVhaztjYXNlInNsZHNfYXJyb3diZ2NvbG9yIjp2YXIgVD10X3plcm9HYWxsZXJ5X19nZXRBcnJvd1NpemUoeT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3dzaXplIikpLFI9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93YmdvcGFjaXR5Iik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXthPyh0LnN0eWxlLndpZHRoPXQzOTZfX3pvb21pZnlWYWx1ZShlLFQpLHQuc3R5bGUuaGVpZ2h0PXQzOTZfX3pvb21pZnlWYWx1ZShlLFQpLHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPVI/InJnYmEoIit0Mzk2X19oZXgycmdiYShhLFIpKyIpIjphKToodC5zdHlsZS53aWR0aD10Mzk2X196b29taWZ5VmFsdWUoZSxUKSx0LnN0eWxlLmhlaWdodD10Mzk2X196b29taWZ5VmFsdWUoZSxUKSx0LnN0eWxlLmJhY2tncm91bmRDb2xvcj0idHJhbnNwYXJlbnQiKX0pKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Ymdjb2xvcmhvdmVyIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93YmdvcGFjaXR5Ijp0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Ymdjb2xvciIpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2FsaWduIjphfHwoYT0iY2VudGVyIikscyYmKHMuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX19hcnJvd19jb250YWluZXItbGVmdCIsInQtc2xkc19fYXJyb3dfY29udGFpbmVyLWNlbnRlciIsInQtc2xkc19fYXJyb3dfY29udGFpbmVyLXJpZ2h0Iikscy5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2Fycm93X2NvbnRhaW5lci0iK2EpKTticmVhaztjYXNlInNsZHNfZG90c3NpemUiOmF8fChhPSIxMCIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodSwoZnVuY3Rpb24odCl7dC5zdHlsZS53aWR0aD10Mzk2X196b29taWZ5VmFsdWUoZSxhKSx0LnN0eWxlLmhlaWdodD10Mzk2X196b29taWZ5VmFsdWUoZSxhKX0pKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2RvdHNjb250cm9scyIpO2JyZWFrO2Nhc2Uic2xkc19sb29wIjphfHwoYT0ibG9vcCIpLCJub25lIj09PWEmJihuJiZuLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIsImZhbHNlIikscyYmcy5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX25vY3ljbGUiKSksImxvb3AiPT09YSYmKG4mJm4uc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIiwidHJ1ZSIpLHMmJnMuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX19ub2N5Y2xlIikpO2JyZWFrO2Nhc2Uic2xkc19zcGVlZCI6YXx8KGE9Im5vbmUiKSwibm9uZSI9PT1hJiZuJiYobi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRyYW5zaXRpb24iLCIiKSxuLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1zbG93Iiksbi5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtZmFzdCIpLG4uY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSksInNsb3ciPT09YSYmbiYmKG4uc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIiwiNTAwIiksbi5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtZmFzdCIpLG4uY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSxuLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1zbG93IikpLCJmYXN0Ij09PWEmJm4mJihuLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIsIjMwMCIpLG4uY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLXNsb3ciKSxuLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1ub25lIiksbi5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtZmFzdCIpKTticmVhaztjYXNlInNsZHNfYXJyb3djb2xvcmhvdmVyIjp0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Ym9yZGVyIiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt2YXIgcj10LnF1ZXJ5U2VsZWN0b3JBbGwoInBvbHlsaW5lLCBwYXRoIik7dC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwoZnVuY3Rpb24oKXthfHwoYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb2xvcmhvdmVyIikpLGF8fChhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbG9yIikpLGF8fChhPSIjMjIyIiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLChmdW5jdGlvbihlKXtlLnN0eWxlLnN0cm9rZT1hfSkpfSkpLHQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29sb3IiKTt0fHwodD0iIzIyMiIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24oZSl7ZS5zdHlsZS5zdHJva2U9dH0pKX0pKX0pKTticmVhaztjYXNlInNsZHNfYXJyb3diZ2NvbG9yaG92ZXIiOkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwoZnVuY3Rpb24oKXt2YXIgcj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3diZ29wYWNpdHlob3ZlciIpO3J8fChyPSIxLjAiKSxhfHwoYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3diZ2NvbG9yIikpLGF8fChhPSJ0cmFuc3BhcmVudCIpO3ZhciBvPWE7InRyYW5zcGFyZW50IiE9PWEmJihvPSJyZ2JhKCIrdDM5Nl9faGV4MnJnYmEoYSxyKSsiKSIpLHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPW99KSksdC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwoZnVuY3Rpb24oKXt2YXIgcj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3diZ2NvbG9yIik7aWYocnx8KHI9InRyYW5zcGFyZW50IiksInRyYW5zcGFyZW50IiE9PXIpe3ZhciBhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2Jnb3BhY2l0eSIpO2F8fChhPSIxLjAiKSxyPSJyZ2JhKCIrdDM5Nl9faGV4MnJnYmEocixhKSsiKSJ9dC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9cn0pKX0pKTticmVhaztjYXNlInNsZHNfZG90c3ZtYXJnaW4iOmF8fChhPSIxNiIpLHA9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHNjb250cm9scyIpLF8mJigibmVhciI9PT1wPyhfLnN0eWxlLm1hcmdpbkJvdHRvbT0tYSsicHgiLF8uc3R5bGUucGFkZGluZ0JvdHRvbT0iMCIpOihfLnN0eWxlLm1hcmdpbkJvdHRvbT0iMCIsXy5zdHlsZS5wYWRkaW5nQm90dG9tPWErInB4IikpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfY2FwdGlvbnRvcG1hcmdpbiIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3d2bWFyZ2luIik7YnJlYWs7Y2FzZSJzbGRzX2NhcHRpb250b3BtYXJnaW4iOnZhciBXPXQzOTZfZ2V0RWwobD8kKGUpOmUpLFo9bnVsbD09Vz92b2lkIDA6Vy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX190aXRsZSIpO2EmJlp8fChhPSIyMCIpLHA9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHNjb250cm9scyIpLG09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29udHJvbHMiKTt2YXIgUD0wLFE7aWYoIm5lYXIiPT09cCYmKChnPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3Rzdm1hcmdpbiIpKXx8KGc9IjE2IiksKHY9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHNzaXplIikpfHwodj0iMTAiKSxQPTIwK3BhcnNlSW50KHYsMTApK3BhcnNlSW50KGcsMTApKSwidW5kZXIiPT09bSl7dmFyIFU9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93c2l6ZSIpLE49dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93dm1hcmdpbiIpO058fChOPSIxMCIpLFV8fChVPSJzIiksVT10X3plcm9HYWxsZXJ5X19nZXRBcnJvd1NpemUoVSksUD1QK3BhcnNlSW50KFUsMTApK3BhcnNlSW50KE4sMTApfXRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9fY2FwdGlvbi1wb3NpdGlvbi1zdHlsZXMiKSksbyYmKCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2NhcHRpb24tcG9zaXRpb24tc3R5bGVzIiksdy50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50LXNsZHNfX2NhcHRpb24ge21hcmdpbi10b3A6ICcrKFArcGFyc2VJbnQoYSwxMCkpKyJweDt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIix3KSk7YnJlYWs7Y2FzZSJzbGRzX2NhcHRpb253aWR0aCI6dmFyIEs7YXx8KGE9IjgwIiksdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X19jYXB0aW9uLXdpZHRoLXN0eWxlcyIpKSxvJiYoKHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fY2FwdGlvbi13aWR0aC1zdHlsZXMiKSx3LnRleHRDb250ZW50PSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnQtc2xkc19fY2FwdGlvbiB7d2lkdGg6ICcrcGFyc2VJbnQoYSwxMCkrIiU7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdykpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2htYXJnaW4iOmF8fChhPSIzMCIpLG09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29udHJvbHMiKSxkJiZjJiYoIm5lYXIiPT09bT8oZC5zdHlsZS5sZWZ0PXQzOTZfX3pvb21pZnlWYWx1ZShlLGEpLGQuc3R5bGUucmlnaHQ9ImF1dG8iLGMuc3R5bGUubGVmdD0iYXV0byIsYy5zdHlsZS5yaWdodD10Mzk2X196b29taWZ5VmFsdWUoZSxhKSk6KGQuc3R5bGUubGVmdD0iYXV0byIsZC5zdHlsZS5yaWdodD10Mzk2X196b29taWZ5VmFsdWUoZSxhKSxjLnN0eWxlLmxlZnQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsYSksYy5zdHlsZS5yaWdodD0iYXV0byIpKTticmVhaztjYXNlInNsZHNfYXJyb3d2bWFyZ2luIjphfHwoYT0iMTAiKTt2YXIgSj17fTtpZigiYWJvdmUiPT09KG09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29udHJvbHMiKSkpSi50b3A9LWErInB4IixKLmJvdHRvbT0iYXV0byIsQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbihlKXtlLnN0eWxlLm1hcmdpblRvcD0iMCJ9KSk7ZWxzZSBpZigidW5kZXIiPT09bSl7dmFyIEQ9MDsibmVhciI9PT0ocD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c2NvbnRyb2xzIikpJiYoZz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c3ZtYXJnaW4iKSx2PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3Rzc2l6ZSIpLEQ9MjArcGFyc2VJbnQodiwxMCkrcGFyc2VJbnQoZywxMCkpLGE9cGFyc2VJbnQoYSwxMCkrRCxKLmJvdHRvbT0tYSsicHgiLEoudG9wPSJhdXRvIixBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKGUpe2Uuc3R5bGUubWFyZ2luVG9wPSIwIn0pKX1lbHNlIEoudG9wPSIiLEouYm90dG9tPSIiO3MmJihzLnN0eWxlLnRvcD1KLnRvcCxzLnN0eWxlLmJvdHRvbT1KLmJvdHRvbSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19jYXB0aW9udG9wbWFyZ2luIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93YmV0d2Vlbm1hcmdpbiI6YXx8KGE9IjEwIiksKCJhYm92ZSI9PT0obT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb250cm9scyIpKXx8InVuZGVyIj09PW0pJiZkJiZjJiYoZC5zdHlsZS5tYXJnaW5MZWZ0PWEvMisicHgiLGMuc3R5bGUubWFyZ2luUmlnaHQ9YS8yKyJweCIsdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2NvbnRyb2xzIikpfX19ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlKXtlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19wbGF5VmlkZW8oZSl7dmFyIHQ9ZS5jdXJyZW50VGFyZ2V0O2lmKHQpe3ZhciByLGwsYT10X3plcm9HYWxsZXJ5X19nZW5lcmF0ZVZpZGVvKHQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci12aWRlby10eXBlIiksdC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXZpZGVvLXVybCIpKTthJiZ0LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoYSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF96ZXJvR2FsbGVyeV9fcGxheVZpZGVvKX19ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2VuZXJhdGVWaWRlbyhlLHQpe2lmKCFlfHwhdClyZXR1cm4gbnVsbDt2YXIgcj1bInlvdXR1YmUiLCJ2aW1lbyJdLmluY2x1ZGVzKGUpLGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19mcmFtZSIpO3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocj8iaWZyYW1lIjoidmlkZW8iKTtyZXR1cm4gYS5jbGFzc0xpc3QuYWRkKHI/InRuLWVsZW1fX2dhbGxlcnlfX2lmcmFtZSI6InRuLWVsZW1fX2dhbGxlcnlfX3ZpZGVvIiksYS5zcmM9dF96ZXJvR2FsbGVyeV9fZ2V0VVJMQnlWaWRlb1R5cGUodCxlKSxyPyhhLmFsbG93PSJhdXRvcGxheSIsYS5zZXRBdHRyaWJ1dGUoImFsbG93ZnVsbHNjcmVlbiIsIiIpKTooYS5zZXRBdHRyaWJ1dGUoImNvbnRyb2xzIiwiY29udHJvbHMiKSxhLnNldEF0dHJpYnV0ZSgiYXV0b3BsYXkiLCJhdXRvcGxheSIpLGEuc2V0QXR0cmlidXRlKCJwbGF5c2lubGluZSIsInBsYXlzaW5saW5lIikpLGwuYXBwZW5kQ2hpbGQoYSksbH1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZXRVUkxCeVZpZGVvVHlwZShlLHQpe3JldHVybiJ2aW1lbyI9PT10PyJodHRwczovL3BsYXllci52aW1lby5jb20vdmlkZW8vIitlKyI/aD0mYXBpPTEmYXV0b3BsYXk9MSI6InlvdXR1YmUiPT09dD8iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvIitlKyI/YXV0b3BsYXk9MSZlbmFibGVqc2FwaT0xIjplfHwiIn1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19pc0xhenlMb2FkaW5nT25FbGVtKGUsdCl7dmFyIHI9InkiPT09d2luZG93Lmxhenk7aWYoIXIpe3ZhciBsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7cj0hIWwmJiJ5ZXMiPT09bC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpfXJldHVybiEhciYmInkiIT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQ/JChlKTplLCJsYXp5b2ZmIil9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2V0VmlkZW9LZXlzKCl7cmV0dXJuWyJsaV92aW1lbyIsImxpX3lvdXR1YmUiLCJsaV9tcDQiLCJsaV93ZWJtIl19ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZXNjYXBlSHRtbChlKXtyZXR1cm4gZS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjMDM5OyIpfXQzOTZfX29uUmVhZHkodF96ZXJvR2FsbGVyeV9fZ2xvYmFsSW5pdCksd2luZG93LnRpbGRhX3plcm9fZ2FsbGVyeV9qc192ZXI9MTsKCmZ1bmN0aW9uIHQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIodCl7dHJ5e3ZhciBlLG49L3ZhclwoKC0tdWMtKFteLV0rKS0oW14tXSspLShbXixdKykpLFxzPyguKilcKS8uZXhlYyh0KTtpZighbilyZXR1cm47dmFyIGk9blswXSxhPW5bMV0scj1uWzJdLG89blszXSxzPW5bNF0sbD1uWzVdLF8sYztpZighKGkmJnImJm8mJnMmJmwpKXJldHVybjtyZXR1cm57cGFyZW50OntpZDpzLHR5cGU6cn0sZmFsbGJhY2s6d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZShhKXx8bCxmaWVsZDpvfX1jYXRjaChtKXtjb25zb2xlLmVycm9yKCJFcnJvciB0cnlpbmcgdG8gcGFyc2UgQ1NTIFZhcmlhYmxlIil9fWZ1bmN0aW9uIHQzOTZfX2hleDJyZ2JhKHQsZSl7aWYoIXQpcmV0dXJuITE7dmFyIG49dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1Zhcih0KTtuJiYodD1uLmZhbGxiYWNrKTt2YXIgaT10LnJlcGxhY2UoLyMvLCIiKTtpZigzPT09aS5sZW5ndGgpe3ZhciBhPWlbMF0scj1pWzFdLG89aVsyXTt0PSIjIithK2ErcityK28rb312YXIgcz1wYXJzZUludCh0LnN1YnN0cmluZygxKSwxNiksbCxfLGM7cmV0dXJuWygxNjcxMTY4MCZzKT4+MTYsKDY1MjgwJnMpPj44LDI1NSZzLHBhcnNlRmxvYXQoZSldfWZ1bmN0aW9uIHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCl7dmFyIGU9WyJnYWxsZXJ5Il0sbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtyZXR1cm4gZS5pbmNsdWRlcyhuKX1mdW5jdGlvbiB0Mzk2X19pc0ZsZXgodCl7dmFyIGU9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxuPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cC1mbGV4Iik7cmV0dXJuIGV8fG59ZnVuY3Rpb24gdDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKHQpe3ZhciBlPVsiLnQ5NTFfX3NpZGViYXJfc3RpY2t5IiwiLnQxMjA2X19jb250ZW50X3N0aWNreSIsIi50NzU0X19jb2xfZml4ZWQiLCIudDc3Nl9fY29sX2ZpeGVkIiwiLnQ3ODZfX2NvbF9maXhlZCIsIi50LXN0b3JlX19wcm9kLXBvcHVwX19jb2xfZml4ZWQiXTt0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKTt2YXIgbj1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZS5qb2luKCIsICIpKSk7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiLCJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpLHQuY2xhc3NMaXN0LmFkZChuPyJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiOiJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpfX1mdW5jdGlvbiB0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQzOTZfX292ZXJmbG93LXN0eWxlcyIpKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3QuaWQ9InQzOTZfX292ZXJmbG93LXN0eWxlcyIsdC5pbm5lckhUTUw9Ii50LXJlY29yZHNfX292ZXJmbG93LWNsaXAgeyBvdmVyZmxvdzogY2xpcDsgfVxuXHRcdFx0XHRcdFx0LnQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdDM5Nl9fZ2V0QXJ0Ym9hcmRzKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbixpPWUmJiJlZGl0Ij09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKT8nLnJlY29yZFtkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdIC5yOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yZWNvcmRbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJzonLnJbZGF0YS1yZWNvcmQtdHlwZT0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucltkYXRhLXBhcmVudHRwbGlkPSInK3QrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnO3JldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoaSkpfWZ1bmN0aW9uIHQzOTZfX2dldFplcm9CbG9ja3MoKXt2YXIgdD1bXS5jb25jYXQodDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIzOTYiKSx0Mzk2X19nZXRBcnRib2FyZHMoIjEyMSIpKSxlO3JldHVybiB0Lmxlbmd0aD90Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3JlY29yZDp0LmNsb3Nlc3QoIi5yOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIiksYXJ0Ym9hcmQ6dH19KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZWNvcmR9KSk6W119ZnVuY3Rpb24gdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpe2Zvcih2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2U7KXt2YXIgbjtpZihlLnN0eWxlLnpvb20pcmV0dXJuITA7ZT1udWxsPT0obj1lLnBhcmVudEVsZW1lbnQpP3ZvaWQgMDpuLmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpfXJldHVybiExfXZhciB0Mzk2X191bmlxdWVJZF9fZ2VuZXJhdG9yPWZ1bmN0aW9uIHQoKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PVN0cmluZyhlKz0xKS5wYWRTdGFydCg2LCIwIik7cmV0dXJuIiIrRGF0ZS5ub3coKSt0fX0sdDM5Nl9fZ2V0VW5pcXVlSWQ9dDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcigpO2Z1bmN0aW9uIHQzOTZfaXNCbG9ja1Zpc2libGUodCl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgsbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIiksaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4Iik7cmV0dXJuIShuJiZlPHBhcnNlSW50KG4sMTApKSYmIShpJiZlPnBhcnNlSW50KGksMTApKX12YXIgdDM5Nl9fb25SZWFkeT1mdW5jdGlvbiB0KGUpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZSgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpfTtmdW5jdGlvbiB0Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtZGF0YSIpO2lmKGUpe3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXZhbHVlIik7aWYobil0cnl7cmV0dXJuIEpTT04ucGFyc2Uobil9Y2F0Y2gocil7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgZGF0YToiLHIsbiksW119fXZhciBpPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX2lucHV0cy10ZXh0YXJlYSIpO2lmKGkpe3ZhciBhPWkudmFsdWU7aWYoYSl0cnl7cmV0dXJuIEpTT04ucGFyc2UoYSl9Y2F0Y2gocil7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgdGV4dGFyZWEgdmFsdWU6IixyLGEpLFtdfX1yZXR1cm5bXX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSgpeyJ2aXNpYmxlIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmKHRfYW5pbWF0aW9uU0JTX19vblJlYWR5KHRfYW5pbWF0aW9uU0JTX19pbml0KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19vblJlYWR5KHQpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0KCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlPXQ/ImVkaXQiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOm51bGw7ZXx8KGU9Qm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9yX3JlZGFjdG9yX3Rvb2xiYXIiKSkpLC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxkb2N1bWVudC5kb2N1bWVudE1vZGU8MTF8fGV8fCh0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0hvcml6b250YWxTY3JvbGwoKSx0X2FuaW1hdGlvblNCU19faXNaZXJvQmxvY2tzUmVuZGVyZWQoKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfaXNJbnN0YWdyYW1SZW5kZXJlZCgoZnVuY3Rpb24oKXt2YXIgdDt0X2FuaW1hdGlvblNCU19fc2V0QXV0b1NjYWxlSW5mbygpLHRfYW5pbWF0aW9uU0JTX193cmFwQW5kVXBkYXRlRWxzKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtc2JzLWV2ZW50XSIpKSksdF9hbmltYXRpb25TQlNfX2luaXRBbGxSZXMoZSl9KSl9KSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzSG9yaXpvbnRhbFNjcm9sbCgpe3ZhciB0PSdbZGF0YS1hbmltYXRlLXNicy1ldmVudD0ic2Nyb2xsIl0nLGU9QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpKSxuLGk7ZS5sZW5ndGgmJihlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIil9KSkuc29tZSgoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtb3ZyZmx3Iik7cmV0dXJuWyJ2aXNpYmxlIiwidmlzaWJsZVgiXS5pbmNsdWRlcyhlKX0pKT90Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3JkcygpOih0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlcygpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7dC5jbG9zZXN0KCIuciIpLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0aW9uLXNic19fb3ZlcmZsb3cteCIpfSkpKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZXMoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNicy1hbmltYXRpb24tYmxvY2stb3ZlcmZsb3ciKSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0LmlkPSJzYnMtYW5pbWF0aW9uLWJsb2NrLW92ZXJmbG93Iix0LmlubmVySFRNTD0iLnQtYW5pbWF0aW9uLXNic19fb3ZlcmZsb3cteCB7IG92ZXJmbG93LXg6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEF1dG9TY2FsZUluZm8oKXtpZih2b2lkIDA9PT13aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3Ipe3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9GaXJlZm94XC8oWzAtOV0rKVwuLyksZT10P3BhcnNlSW50KHRbMV0sMTApOjEyNixuPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhbMC05XSspXC4vKSxpPW4mJnBhcnNlSW50KG5bMV0sMTApfHwwO3dpbmRvdy5pc09ubHlTY2FsYWJsZT1lPDEyNix3aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3I9IXdpbmRvdy5pc09ubHlTY2FsYWJsZSYmIXQmJmk8PTEyN319ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2lzWmVyb0Jsb2Nrc1JlbmRlcmVkKHQpe3ZhciBlPXRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHMoIjM5NiIpLG49dF9hbmltYXRpb25TQlNfX2dldEFydGJvYXJkcygiMTIxIiksaT1bXS5jb25jYXQoZSxuKTtpZihpLmxlbmd0aCl7dmFyIGE9ITE7aWYoaS5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKXQoKTtlbHNlIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdFtzcmMqPSJ0aWxkYS1ibG9ja3MtMiJdLCBzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTEiXScpLmxlbmd0aCl0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdChpLERhdGUubm93KCksdCk7ZWxzZXt2YXIgcj1pLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpO2kuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil8fGUuYWRkRXZlbnRMaXN0ZW5lcigiYXJ0Qm9hcmRSZW5kZXJlZCIsKGZ1bmN0aW9uKCl7ci5wdXNoKGUpLHIubGVuZ3RoIT09aS5sZW5ndGh8fGF8fHQoKX0pKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2E9ITAsci5sZW5ndGghPT1pLmxlbmd0aCYmdCgpfSksM2UzKX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHModCl7dmFyIGU9Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGUpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdCh0LGUsbil7aWYodC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKW4oKTtlbHNle2lmKERhdGUubm93KCktZT4xZTQpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJhbGwgemVyby1ibG9ja3MgY2FuJ3QgYmUgcmVuZGVyZWQiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX19iYWNrd2FyZENvbXBhdGliaWxpdHlXYWl0KHQsZSxuKX0pLDUwMCl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX2lzSW5zdGFncmFtUmVuZGVyZWQodCl7aWYod2luZG93LmFuaW1hdGlvblNCU19faXNJT1MmJi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJJbnN0YWdyYW0iKSl2YXIgZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy5pbm5lcldpZHRoIT09c2NyZWVuLndpZHRoJiZ3aW5kb3cuaW5uZXJIZWlnaHQ+d2luZG93LmlubmVyV2lkdGg/dF9hbmltYXRpb25TQlNfaXNJbnN0YWdyYW1SZW5kZXJlZCh0KTooY2xlYXJUaW1lb3V0KGUpLHQoKSl9KSwxMDApO2Vsc2UgdCgpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX193cmFwQW5kVXBkYXRlRWxzKHQpe3ZhciBlPS0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpO2lmKG4pey0xPT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSYmKG4uc3R5bGUuV2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5PSJoaWRkZW4iLG4uc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5PSJoaWRkZW4iKTt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnModCwicHVibGlzaGVkIixudWxsKTtpZighaSYmYSl7dmFyIHI9Z2V0Q29tcHV0ZWRTdHlsZShuKS5kaXNwbGF5LG87bi5jbGFzc0xpc3QuY29udGFpbnMoInRuLW1vbGVjdWxlIikmJiJmbGV4IiE9PXImJihuLnN0eWxlLmRpc3BsYXk9ImluaGVyaXQiKTt2YXIgcz10X2FuaW1hdGlvblNCU19fZ2V0U2NhbGVXcmFwcGVyKG4pLGw9dC5zdHlsZS50cmFuc2Zvcm0sXztsJiYtMSE9PWwuaW5kZXhPZigibWF0cml4KCIpJiYodF9hbmltYXRpb25TQlNfX3dyYXBFbChzfHxuLCJ0bi1hdG9tX19zYnMtdHJhbnNmb3JtLXdyYXBwZXIiKSwoXz10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtdHJhbnNmb3JtLXdyYXBwZXIiKSkuc3R5bGUudHJhbnNmb3JtPWwsdC5zdHlsZS50cmFuc2Zvcm09IiIpLHRfYW5pbWF0aW9uU0JTX193cmFwRWwoKF89dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLXRyYW5zZm9ybS13cmFwcGVyIikpfHxzfHxuLCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0eWxlc0FmdGVyV3JhcHBpbmcodCxffHxpLGUpfX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFNjYWxlV3JhcHBlcih0KXtpZighdClyZXR1cm4gbnVsbDt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpLG49dC5jbGFzc0xpc3QuY29udGFpbnMoInRuLWF0b20iKTtyZXR1cm4gZSYmbj9udWxsOnQuY2xvc2VzdCgiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVsT25SZXNpemUodCl7aWYodC5sZW5ndGgpe3ZhciBlPXQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hdC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpfSkpO2UubGVuZ3RoJiZ0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVscyhlKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0eWxlc0FmdGVyV3JhcHBpbmcodCxlLG4pe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpLGE9Z2V0Q29tcHV0ZWRTdHlsZSh0KSxyPXQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpLG89Z2V0Q29tcHV0ZWRTdHlsZShyKSxzPWEuZ2V0UHJvcGVydHlWYWx1ZSgiYm9yZGVyLXJhZGl1cyIpOyJzaGFwZSIhPT1pJiYiYnV0dG9uIiE9PWkmJiJpbWFnZSIhPT1pfHwhcGFyc2VJbnQocywxMCl8fChlLnN0eWxlLmJvcmRlclJhZGl1cz1zKTtmb3IodmFyIGw9WyJmaWx0ZXIiLCJiYWNrZHJvcC1maWx0ZXIiXSxfPVtdLGM9MDtjPGwubGVuZ3RoO2MrKyl7dmFyIG09bFtjXSxkPSItd2Via2l0LSIrbSx1PWEuZ2V0UHJvcGVydHlWYWx1ZShtKSxTPW8uZ2V0UHJvcGVydHlWYWx1ZShtKSxmLHA7KCF1fHwibm9uZSI9PT11fHwoIVN8fCJub25lIj09PVMpKSYmKHU9YS5nZXRQcm9wZXJ0eVZhbHVlKGQpKTt2YXIgZz11fHxTO2cmJiJub25lIiE9PWcmJl8ucHVzaCh7ZmlsdGVyOm0sd2Via2l0RmlsdGVyOmQsdmFsdWU6Z30pfXZhciB2PWdldENvbXB1dGVkU3R5bGUocikudHJhbnNmb3JtLHk9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7eS5pbml0RXZlbnQoImJhY2tkcm9wRmlsdGVySW1nV3JhcHBlcmVkIiwhMCwhMCksXy5mb3JFYWNoKChmdW5jdGlvbihhKXt3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzRmlyZWZveCYmKGUuc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5PSJ2aXNpYmxlIiksZS5zdHlsZVthLndlYmtpdEZpbHRlcl09YS52YWx1ZSxlLnN0eWxlW2EuZmlsdGVyXT1hLnZhbHVlLHQuc3R5bGVbYS53ZWJraXRGaWx0ZXJdPSJub25lIix0LnN0eWxlW2EuZmlsdGVyXT0ibm9uZSIsImltYWdlIj09PWkmJndpbmRvdy50X2FuaW1hdGlvblNCU19faXNTYWZhcmkmJih0LmRpc3BhdGNoRXZlbnQoeSksdC5jbGFzc0xpc3QuYWRkKCJ0Mzk2X19lbGVtLS1iYWNrZHJvcC1maWx0ZXItaW1nLXdyYXBwZXJlZCIpKSxuJiYiYmFja2Ryb3AtZmlsdGVyIj09PWEuZmlsdGVyJiYoci5zdHlsZVthLndlYmtpdEZpbHRlcl09ImluaGVyaXQiLHIuc3R5bGVbYS5maWx0ZXJdPSJpbmhlcml0IiksIm5vbmUiPT09diYmKHIuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVaKDApIil9KSk7dmFyIGI9Xy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4iYmFja2Ryb3AtZmlsdGVyIj09PXQuZmlsdGVyfSkpO24mJmImJnRfYW5pbWF0aW9uU0JTX19jaHJvbWVGaXhCYWNrZHJvcEZpbHRlcihyLGUpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jaHJvbWVGaXhCYWNrZHJvcEZpbHRlcih0LGUpe3ZhciBuPWdldENvbXB1dGVkU3R5bGUodCksaT1uLmdldFByb3BlcnR5VmFsdWUoImJhY2tncm91bmQtY29sb3IiKSxhPW4uZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpLHI9bi5nZXRQcm9wZXJ0eVZhbHVlKCJib3gtc2hhZG93Iik7aWYoInJnYmEoMCwgMCwgMCwgMCkiIT09aSYmIjEiIT09YSl7dmFyIG89aS5zdWJzdHJpbmcoaS5pbmRleE9mKCIoIikrMSxpLmluZGV4T2YoIikiKSkscz10X2FuaW1hdGlvblNCU19fcHJvY2Vzc0JveFNoYWRvd1JHQihyLGEpO3MmJihlLnN0eWxlLmJveFNoYWRvdz1zLHQuc3R5bGUuYm94U2hhZG93PSJub25lIiksZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYmEoIitvKyIsIithKyIpIix0LnN0eWxlLm9wYWNpdHk9IjEiLHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJ0cmFuc3BhcmVudCIsdC5zdHlsZS5iYWNrZHJvcEZpbHRlcj0iaW5pdGlhbCIsdC5zdHlsZS5XZWJraXRCYWNrZHJvcEZpbHRlcj0iaW5pdGlhbCJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzQm94U2hhZG93UkdCKHQsZSl7aWYoIXQpcmV0dXJuITE7aWYoLTE9PT10LmluZGV4T2YoInJnYmEiKSYmLTE9PT10LmluZGV4T2YoInJnYiIpfHwiMSI9PT1lKXJldHVybiExO3ZhciBuPXQuc3Vic3RyaW5nKHQuaW5kZXhPZigiKCIpKzEsdC5pbmRleE9mKCIpIikpLGk9bi5zcGxpdCgiLCAiKTszPT09aS5sZW5ndGg/aS5wdXNoKGUpOmlbM10qPWU7dmFyIGE9dC5yZXBsYWNlKG4saS5qb2luKCIsICIpKTtyZXR1cm4tMSE9PWEuaW5kZXhPZigicmdiKCIpJiYoYT1hLnJlcGxhY2UoInJnYigiLCJyZ2JhKCIpKSxhfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0QWxsUmVzKHQpe3ZhciBlPXtlbGVtZW50czpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1hbmltYXRlLXNicy1ldmVudF0iKSksc2Nyb2xsVG9wOndpbmRvdy5wYWdlWU9mZnNldCxpc0VkaXRNb2RlOnQsY2xpY2tlZFRyaWdnZXJFbHM6W10saG92ZXJUcmlnZ2VyRWxzOltdfTtpZihlLmVsZW1lbnRzLmxlbmd0aCl7dF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YShlKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXMoZSk7dmFyIG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxpPSEhbiYmInllcyI9PT1uLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iik7KCJ5Ij09PXdpbmRvdy5sYXp5fHxpKSYmdF9vbkZ1bmNMb2FkKCJ0X2xhenlsb2FkX3VwZGF0ZSIsKGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pKTt2YXIgYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyhlLmVsZW1lbnRzKSxyLG89L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKCJSZXNpemVPYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBzPXRfYW5pbWF0aW9uU0JTX19nZXRBbGxCcmVha3BvaW50cygpLGw7dF9hbmltYXRpb25TQlNfX2NyZWF0ZVJlc2l6ZU9ic2VydmVyKHticmVha3BvaW50czpzLGN1cnJlbnRSZXM6dF9hbmltYXRpb25TQlNfX2dldEN1cnJlbnRSZXMocyxvKSxpc01vYmlsZTpvfSxkKX1lbHNlIG8/d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2QoKX0pLDMwMCl9KSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZCk7dmFyIF89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQzOTYiKSxjO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoXywoZnVuY3Rpb24odCl7dC5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsZCl9KSksd2luZG93LnRfYW5pbWF0aW9uU0JTX19pc1NhZmFyaSl7ZnVuY3Rpb24gbSgpezAhPT13aW5kb3cucGFnZVlPZmZzZXQmJmQoKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixtKX13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixtKX10X2FuaW1hdGlvblNCU19fdHJpZ2dlck5vU2Nyb2xsQW5pbWF0aW9uKGUsYSksZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnQ9InNjcm9sbCJdJykubGVuZ3RoJiYodF9hbmltYXRpb25TQlNfX3RyaWdnZXJTY3JvbGxBbmltKGUpLHRfYW5pbWF0aW9uU0JTX19jaGVja0ZyYW1lKGUpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfX2NoYW5nZUVsVmFsdWVzKGUpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ImNvbXBsZXRlIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJnRfYW5pbWF0aW9uU0JTX19jaGFuZ2VFbFZhbHVlcyhlKX0pLDNlMyl9ZnVuY3Rpb24gZCgpe2NsZWFyVGltZW91dChyKSxyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnRdIikpO3RfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKGUsImVsZW1lbnRzIix0KSx0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVsT25SZXNpemUoZS5lbGVtZW50cyksdF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YShlKSx0X2FuaW1hdGlvblNCU19fdHJpZ2dlclNjcm9sbEFuaW0oZSksYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyhlLmVsZW1lbnRzKSx0X2FuaW1hdGlvblNCU19fdHJpZ2dlck5vU2Nyb2xsQW5pbWF0aW9uKGUsYSksdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzKGUpfSksNTAwKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEFuaW1FbHNPblZpZXcodCl7cmV0dXJuIHQuZmlsdGVyKChmdW5jdGlvbih0KXt2YXIgZT0iZGF0YS1hbmltYXRlLXNicy1ldmVudCI7cmV0dXJuImludG92aWV3Ij09PXQuZ2V0QXR0cmlidXRlKGUpfHwiYmxvY2tpbnRvdmlldyI9PT10LmdldEF0dHJpYnV0ZShlKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QWxsQnJlYWtwb2ludHMoKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuciAudDM5Nl9fYXJ0Ym9hcmQiKSksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0UmVzT3B0cyh0KSxpPW4uYnJlYWtwb2ludHMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4tMT09PWUuaW5kZXhPZih0KX0pKTstMT09PShlPWUuY29uY2F0KGkpKS5pbmRleE9mKG4ucmVzTWF4KSYmZS5wdXNoKG4ucmVzTWF4KX0pKSxlLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0Q3VycmVudFJlcyh0LGUpe3ZhciBuLGk9ZXx8Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQmJi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJBcHBsZVdlYktpdCIpP2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDp3aW5kb3cuaW5uZXJXaWR0aDtyZXR1cm4gdC5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gaT50fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsZSxuKXt0W2VdPW59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEtleUZvckFuaW1hdGVkT2JqZWN0KHQsZSxuKXt0W2VdfHx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LGUsbil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NyZWF0ZVJlc2l6ZU9ic2VydmVyKHQsZSl7dmFyIG49ZG9jdW1lbnQuYm9keS5nZXRDbGllbnRSZWN0cygpLGk9blswXS5oZWlnaHQsYTtuZXcgUmVzaXplT2JzZXJ2ZXIoKGZ1bmN0aW9uKGEpe2EuZm9yRWFjaCgoZnVuY3Rpb24oYSl7aWYoIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWJvZHlfc2Nyb2xsLWxvY2tlZCIpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtYm9keV9wb3B1cHNob3dlZCIpKXt2YXIgcj10X2FuaW1hdGlvblNCU19fZ2V0Q3VycmVudFJlcyh0LmJyZWFrcG9pbnRzLHQuaXNNb2JpbGUpO2EuY29udGVudFJlY3QuaGVpZ2h0PT09aSYmdC5jdXJyZW50UmVzPT09cnx8KHQuY3VycmVudFJlcz1yLGk9blswXS5oZWlnaHQsZSgpKX19KSl9KSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hhbmdlRWxWYWx1ZXModCl7dC5lbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbihlKXtkb2N1bWVudC5jb250YWlucyhlKSYmKHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKGUsdCksInNjcm9sbCI9PT1lLmFuaW1UeXBlJiZ0X2FuaW1hdGlvblNCU19fdXBkYXRlU3RlcHNWYWx1ZXMoZSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jaGVja0ZyYW1lKHQpe3ZhciBlOyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lJiYodF9hbmltYXRpb25TQlNfX2NoZWNrUG9zQ2hhbmdlcyh0KSYmdF9hbmltYXRpb25TQlNfX3RyaWdnZXJTY3JvbGxBbmltKHQpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fY2hlY2tGcmFtZSh0KX0pKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NoZWNrUG9zQ2hhbmdlcyh0KXt2YXIgZT10LnNjcm9sbFRvcCxuPXdpbmRvdy5wYWdlWU9mZnNldDtyZXR1cm4gbjwwJiZ3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzU2FmYXJpJiYobj0wKSx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LCJzY3JvbGxUb3AiLG4pLGUhPT1ufWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX190cmlnZ2VyU2Nyb2xsQW5pbSh0KXt0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCJzY3JvbGwiPT09ZS5hbmltVHlwZSl7dmFyIG49e29wYWNpdHk6MSxibHVyOjAsZml4OiExLGZpeGVkU2hpZnRZOjAsdHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxzY2FsZVg6MSxzY2FsZVk6MSxyb3RhdGU6MH07dF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNoZWNrU3RlcHModCxlLG4pLHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25VcGRhdGVUcmFuc2Zvcm0oZSxuKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNoZWNrU3RlcHModCxlLG4pe2Uuc3RlcHMuZm9yRWFjaCgoZnVuY3Rpb24oaSxhKXt2YXIgcj10LnNjcm9sbFRvcCtlLnRyaWdnZXJPZmZzZXQsbz10X2FuaW1hdGlvblNCU19fZ2V0Wm9vbShlKTtlLnNjYWxlZERpZmZlcmVuY2UmJihyKz1lLnNjYWxlZERpZmZlcmVuY2UpO3ZhciBzPXI+PWkuc3RhcnQsbD1yPGkuc3RhcnQsXz1pLmVuZDw9cixjPWkuZW5kPnI7aWYocyYmYyl7aS5zdGF0ZT0ic3RhcnRlZCIsZS53cmFwcGVyRWwmJihlLndyYXBwZXJFbC5zdHlsZS53aWxsQ2hhbmdlPSJ0cmFuc2Zvcm0iKTt2YXIgbT1yLWkuc3RhcnQsZD0wPT09aS5kaXN0PzE6bS9pLmRpc3Q7bi5wcmV2VW5maXhlZERpc3Q9aS5wcmV2VW5maXhlZERpc3QsdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNhbGNTdGVwU3R5bGVzKG4saSxkLGEsbyl9XyYmKGkuc3RhdGU9ImZpbmlzaGVkIixlLndyYXBwZXJFbCYmKGUud3JhcHBlckVsLnN0eWxlLndpbGxDaGFuZ2U9IiIpLHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25DYWxjU3RlcFN0eWxlcyhuLGksMSxhLG8pKSwhbHx8InN0YXJ0ZWQiIT09aS5zdGF0ZSYmImZpbmlzaGVkIiE9PWkuc3RhdGV8fChpLnN0YXRlPSJ1bmFjdGl2ZSIsZS53cmFwcGVyRWwmJihlLndyYXBwZXJFbC5zdHlsZS53aWxsQ2hhbmdlPSIiKSx0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2FsY1N0ZXBTdHlsZXMobixpLDAsYSxvKSl9KSksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpLGUuc3RlcHNbMV0mJjA9PT1lLnN0ZXBzWzFdLmRpc3QmJjA9PT1lLnN0ZXBzWzFdLnN0eWxlcy5vcGFjaXR5JiYidW5hY3RpdmUiPT09ZS5zdGVwc1sxXS5zdGF0ZSYmKG4ub3BhY2l0eT0wKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2FsY1N0ZXBTdHlsZXModCxlLG4saSxhKXtpZighMD09PWUuc3R5bGVzLmZpeCYmInN0YXJ0ZWQiPT09ZS5zdGF0ZSYmKHQuZml4PSEwLHQuZml4ZWRTaGlmdFk9MCksITA9PT1lLnN0eWxlcy5maXgmJiJmaW5pc2hlZCI9PT1lLnN0YXRlJiYodC5maXg9ITEsdC5maXhlZFNoaWZ0WSs9ZS5kaXN0L2EpLCEwPT09ZS5zdHlsZXMuZml4JiYidW5hY3RpdmUiPT09ZS5zdGF0ZSl7aWYoaT4wJiYhMD09PXQuZml4KXJldHVybjt0LmZpeD0hMX10Lm9wYWNpdHkrPW4qKGUuc3R5bGVzLm9wYWNpdHktdC5vcGFjaXR5KSx0LmJsdXIrPW4qKGUuc3R5bGVzLmJsdXItdC5ibHVyKSx0LnRyYW5zbGF0ZVgrPW4qZS5zdHlsZXMubW92ZVgsdC50cmFuc2xhdGVZKz1uKmUuc3R5bGVzLm1vdmVZLHQuc2NhbGVYKz1uKihlLnN0eWxlcy5zY2FsZVgtdC5zY2FsZVgpLHQuc2NhbGVZKz1uKihlLnN0eWxlcy5zY2FsZVktdC5zY2FsZVkpLHQucm90YXRlKz1uKmUuc3R5bGVzLnJvdGF0ZX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uVXBkYXRlVHJhbnNmb3JtKHQsZSl7aWYodC53cmFwcGVyRWwpe3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpLGk9Z2V0Q29tcHV0ZWRTdHlsZSh0KS53aWxsQ2hhbmdlLGE9d2luZG93LmlzT25seVNjYWxhYmxlfHx0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpO2lmKCEwPT09ZS5maXgmJiJmaXhlZCIhPT10LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbil7dmFyIHI9dC50cmlnZ2VyT2Zmc2V0LWUucHJldlVuZml4ZWREaXN0O2F8fChyLz1uKSx0LnNjYWxlZERpZmZlcmVuY2UmJihyKz10LnNjYWxlZERpZmZlcmVuY2UpLHQud3JhcHBlckVsLnN0eWxlLnRvcD1yKyJweCIsdC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb249ImZpeGVkIixpJiYiYXV0byIhPT1pJiYodC5zdHlsZS53aWxsQ2hhbmdlPSJ1bnNldCIpLHQuekluZGV4JiYodC53cmFwcGVyRWwuc3R5bGUuekluZGV4PXQuekluZGV4KX0hMT09PWUuZml4JiYiZml4ZWQiPT09dC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb24mJih0LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbj0iIix0LndyYXBwZXJFbC5zdHlsZS50b3A9IiIsdC53cmFwcGVyRWwuc3R5bGUuekluZGV4PSIiLHQuekluZGV4JiYodC5zdHlsZS56SW5kZXg9dC56SW5kZXgpLHQuc3R5bGUud2lsbENoYW5nZT0iIiksdC53cmFwcGVyRWwuc3R5bGUub3BhY2l0eT1lLm9wYWNpdHkudG9TdHJpbmcoKTt2YXIgbz0iIjtpZihlLnRyYW5zbGF0ZVgpe3ZhciBzPWUudHJhbnNsYXRlWDthJiYocyo9biksbys9InRyYW5zbGF0ZVgoIitzLnRvRml4ZWQoMikrInB4KSJ9aWYoMCE9PWUudHJhbnNsYXRlWXx8MCE9PWUuZml4ZWRTaGlmdFkpe3ZhciBsPWUudHJhbnNsYXRlWStlLmZpeGVkU2hpZnRZO2EmJihsKj1uKSxvKz0idHJhbnNsYXRlWSgiK2wudG9GaXhlZCgyKSsicHgpIn0xPT09ZS5zY2FsZVgmJjE9PT1lLnNjYWxlWXx8KG8rPSJzY2FsZSgiK2Uuc2NhbGVYKyIsIitlLnNjYWxlWSsiKSIpLDAhPT1lLnJvdGF0ZSYmKG8rPSJyb3RhdGUoIitlLnJvdGF0ZSsiZGVnKSIpLHQud3JhcHBlckVsLnN0eWxlLnRyYW5zZm9ybT1vfHwic2NhbGUoMSkifX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXModCl7dmFyIGU9IiI7aWYodC5lbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbih0KXtpZigic2Nyb2xsIiE9PXQuYW5pbVR5cGUpe3ZhciBuPXt0aW1lRHVyYXRpb246MH0saT1bXSxhPXRfYW5pbWF0aW9uU0JTX19jcmVhdGVFbXB0eVN0eWxlT3B0aW9uc0ZvcktleWZyYW1lcyh0LnN0ZXBzKTt0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvbWJpbmVPYmplY3RzKHQuc3RlcHMsaSxuLGEpLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdEZyYW1lcyhpKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvdW50UGVyY2VudChpLG4pLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdE9wYWNpdHlPbkZpcnN0U3RlcCh0LGkpO3ZhciByPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0VHh0U3R5bGVzKHQsaSksbztpZihuLnRpbWVEdXJhdGlvbi89MWUzLHIpaWYoZSs9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRGaW5hbENzcyh0LG4sciksImhvdmVyIj09PXQuYW5pbVR5cGV8fCJjbGljayI9PT10LmFuaW1UeXBlKSghdC5sb29wfHwibG9vcHdpdGhyZXZlcnNlIj09PXQubG9vcCkmJihlKz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldFJldmVyc2VBbmltKHQpKX19KSksZSl7aWYodC5pc0VkaXRNb2RlKXJldHVybiBlO3ZhciBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5zYnMtYW5pbS1rZXlmcmFtZXMiKTtuP24udGV4dENvbnRlbnQhPT1lJiYobi50ZXh0Q29udGVudD1lKTooKG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgic2JzLWFuaW0ta2V5ZnJhbWVzIiksbi50ZXh0Q29udGVudD1lLGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLG4pKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NyZWF0ZUVtcHR5U3R5bGVPcHRpb25zRm9yS2V5ZnJhbWVzKHQpe3JldHVybnttb3ZlWDp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuc3R5bGVzLm1vdmVYfSkpLG1vdmVZOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5zdHlsZXMubW92ZVl9KSksc2NhbGVYOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5zdHlsZXMuc2NhbGVYfSkpLHNjYWxlWTp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQuc3R5bGVzLnNjYWxlWX0pKSxyb3RhdGU6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10LnN0eWxlcy5yb3RhdGV9KSksYmx1cjp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuc3R5bGVzLmJsdXJ9KSksb3BhY2l0eTp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQuc3R5bGVzLm9wYWNpdHl9KSksZml4OnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiExPT09dC5zdHlsZXMuZml4fSkpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvbWJpbmVPYmplY3RzKHQsZSxuLGkpe3QuZm9yRWFjaCgoZnVuY3Rpb24oYSxyKXt2YXIgbz17fTtmb3IodmFyIHMgaW4gby5zdHlsZXM9YS5zdHlsZXMsaSlpW3NdJiZkZWxldGUgby5zdHlsZXNbc107Int9IiE9PUpTT04uc3RyaW5naWZ5KG8uc3R5bGVzKSYmKG8udGltZT0xKmEudGltZXx8MCxyIT09dC5sZW5ndGgtMSYmKG8uZWFzZT10W3IrMV0uZWFzZSksZS5wdXNoKG8pLG4udGltZUR1cmF0aW9uKz1vLnRpbWUpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdEZyYW1lcyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKGUsbil7dmFyIGk9bj09PXQubGVuZ3RoLTEsYT0wPT09bixyPWk/bnVsbDp0W24rMV0sbz1hP251bGw6dFtuLTFdO2Zvcih2YXIgcyBpbiBlLnN0eWxlcylhfHxzIGluIG8uc3R5bGVzfHx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2FkZFN0eWxlVG9LZXlmcmFtZShlLG8scywwKSxpfHwocyBpbiByLnN0eWxlcz8ibW92ZVgiIT09cyYmIm1vdmVZIiE9PXMmJiJyb3RhdGUiIT09c3x8dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19yZWNhbGN1bGF0ZVZhbHVlKGUscixzKTp0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2FkZFN0eWxlVG9LZXlmcmFtZShlLHIscywxKSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19hZGRTdHlsZVRvS2V5ZnJhbWUodCxlLG4saSl7ImJsdXIiIT09biYmInJvdGF0ZSIhPT1uJiYibW92ZVgiIT09biYmIm1vdmVZIiE9PW58fChlLnN0eWxlc1tuXT0wPT09aT8wOnQuc3R5bGVzW25dKSwib3BhY2l0eSIhPT1uJiYic2NhbGVYIiE9PW4mJiJzY2FsZVkiIT09bnx8KGUuc3R5bGVzW25dPTA9PT1pPzE6dC5zdHlsZXNbbl0pfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fcmVjYWxjdWxhdGVWYWx1ZSh0LGUsbil7c3dpdGNoKG4pe2Nhc2Uicm90YXRlIjplLnN0eWxlcy5yb3RhdGUrPXQuc3R5bGVzLnJvdGF0ZTticmVhaztjYXNlIm1vdmVYIjplLnN0eWxlcy5tb3ZlWCs9dC5zdHlsZXMubW92ZVg7YnJlYWs7Y2FzZSJtb3ZlWSI6ZS5zdHlsZXMubW92ZVkrPXQuc3R5bGVzLm1vdmVZfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvdW50UGVyY2VudCh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dLGE7aWYoMD09PW4pMD09PWUudGltZUR1cmF0aW9uP2kucGVyY2VudD0wOihhPSgxMDAqaS50aW1lL2UudGltZUR1cmF0aW9uKS50b0ZpeGVkKDIpLGkucGVyY2VudD1wYXJzZUZsb2F0KGEpKTtlbHNlIGlmKG49PT10Lmxlbmd0aC0xKWkucGVyY2VudD0xMDA7ZWxzZXt2YXIgcj10W24tMV0ucGVyY2VudDtpZigwPT09ZS50aW1lRHVyYXRpb24paS5wZXJjZW50PTA7ZWxzZXtpZihhPSgxMDAqaS50aW1lL2UudGltZUR1cmF0aW9uK3IpLnRvRml4ZWQoMiksMTAwPT09cGFyc2VJbnQoYSwxMCkmJm49PT10Lmxlbmd0aC0yJiYwIT09biljb250aW51ZTtpLnBlcmNlbnQ9cGFyc2VGbG9hdChhKX1pLnBlcmNlbnQ9PT1yJiYoaS5wZXJjZW50Kz0xKSxpLnBlcmNlbnQ+MTAwJiYoaS5wZXJjZW50PTk5KX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdE9wYWNpdHlPbkZpcnN0U3RlcCh0LGUpe3ZhciBuPWVbMV07dCYmdC5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpO3ZhciBpPXQ/dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpOm51bGw7biYmMD09PW4udGltZSYmMD09PW4uc3R5bGVzLm9wYWNpdHk/KGkmJihpLnN0eWxlLm9wYWNpdHk9IjAiKSxlWzBdLnN0eWxlcy5vcGFjaXR5PTApOmkmJiIwIj09PWkuc3R5bGUub3BhY2l0eSYmaSYmKGkuc3R5bGUub3BhY2l0eT0iIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRUeHRTdHlsZXModCxlKXt2YXIgbj0iIjtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNoYW5nZXN8fChlLmNoYW5nZXM9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRGcmFtZUNoYW5nZXModCxlKSksbis9Im51bWJlciI9PXR5cGVvZiBlLnBlcmNlbnQ/ZS5wZXJjZW50KyIlIHsiK2UuY2hhbmdlcysifVxuIjoiIn0pKSxufWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fc2hvdWxkVXNlWm9vbSh0LGUpe3ZhciBuLGk7aWYodDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KSlyZXR1cm4hdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpO3ZhciBhLHI9dF9hbmltYXRpb25TQlNfX2dldFNjYWxlV3JhcHBlcih0LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKSk7cmV0dXJuISgxIT09ZSYmIXIpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0RnJhbWVDaGFuZ2VzKHQsZSl7dmFyIG49IiIsaT0iIixhPXt4OjEseToxLGNoYW5nZWQ6ITF9LHI9MSxvPXQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCk7KHdpbmRvdy5pc09ubHlTY2FsYWJsZXx8bykmJihyPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpKTt2YXIgcz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX3Nob3VsZFVzZVpvb20odCxyKTtmb3IodmFyIGwgaW4gc3x8KHI9MSksZS5zdHlsZXMpc3dpdGNoKGwpe2Nhc2Uib3BhY2l0eSI6bis9Im9wYWNpdHk6IitlLnN0eWxlcy5vcGFjaXR5KyI7IjticmVhaztjYXNlInNjYWxlWCI6YS54PWUuc3R5bGVzLnNjYWxlWCxhLmNoYW5nZWQ9ITA7YnJlYWs7Y2FzZSJzY2FsZVkiOmEueT1lLnN0eWxlcy5zY2FsZVksYS5jaGFuZ2VkPSEwO2JyZWFrO2Nhc2UibW92ZVgiOmkrPSJ0cmFuc2xhdGVYKCIrTWF0aC5yb3VuZChlLnN0eWxlcy5tb3ZlWCpyKSsicHgpIjticmVhaztjYXNlIm1vdmVZIjppKz0idHJhbnNsYXRlWSgiK01hdGgucm91bmQoZS5zdHlsZXMubW92ZVkqcikrInB4KSI7YnJlYWs7Y2FzZSJyb3RhdGUiOmkrPSJyb3RhdGUoIitlLnN0eWxlcy5yb3RhdGUrImRlZykifWlmKCEwPT09YS5jaGFuZ2VkJiYoaSs9InNjYWxlKCIrYS54KyIsIithLnkrIikiKSwiIiE9PWkmJihuKz0idHJhbnNmb3JtOiIraSsiOyIpLHZvaWQgMCE9PWUuZWFzZSlzd2l0Y2gobis9ImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IixlLmVhc2Upe2Nhc2UiZWFzZUluIjpuKz0iZWFzZS1pbjsiO2JyZWFrO2Nhc2UiZWFzZU91dCI6bis9ImVhc2Utb3V0OyI7YnJlYWs7Y2FzZSJlYXNlSW5PdXQiOm4rPSJlYXNlLWluLW91dDsiO2JyZWFrO2Nhc2UiYm91bmNlRmluIjpuKz0iY3ViaWMtYmV6aWVyKDAuMzQsMS42MSwwLjcsMSk7IjticmVhaztkZWZhdWx0Om4rPSIiPT09ZS5lYXNlLnRyaW0oKT8ibGluZWFyOyI6ZS5lYXNlKyI7In1yZXR1cm4gbn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldEZpbmFsQ3NzKHQsZSxuKXt2YXIgaT0iIixhPXQudW5pcXVlSUQscj0iLnQtc2JzLWFuaW1fc3RhcnRlZCAjIit0LnVuaXF1ZUlELG87InB1Ymxpc2hlZCIhPT13aW5kb3cudGlsZGFtb2RlJiYodC50aW1lRHVyYXRpb249ZS50aW1lRHVyYXRpb24pLGkrPXIrIiB7XG5hbmltYXRpb246ICIrYSsiICIrKDA9PT1lLnRpbWVEdXJhdGlvbj8xZS01OmUudGltZUR1cmF0aW9uKSsicyI7dmFyIHM9dC5sb29wJiYtMSE9PXQubG9vcC5pbmRleE9mKCJsb29wIik7cmV0dXJuIHMmJihpKz0iIGluZmluaXRlIiksaSs9IiBsaW5lYXIiLHM/Imxvb3B3aXRocmV2ZXJzZSI9PT10Lmxvb3AmJihpKz0iIGFsdGVybmF0ZSIpOmkrPSIgZm9yd2FyZHMiLGkrPSI7XG5iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbkBrZXlmcmFtZXMgIithKyIge1xuIituKyJ9XG5cbiJ9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRSZXZlcnNlQW5pbSh0KXt2YXIgZT10X2FuaW1hdGlvblNCU19fZ2V0QXR0cmlidXRlU2VsZWN0b3IodCksbixpLGE9IlsiK2UuYXR0cmlidXRlKyc9IicrZS5pZCsnIl0nLHI7cmV0dXJuIiMiKyh0LmNsb3Nlc3QoIi50LXJlYyIpP3QuY2xvc2VzdCgiLnQtcmVjIikuZ2V0QXR0cmlidXRlKCJpZCIpOiIiKSsiICIrYSsiLnQtc2JzLWFuaW1fc3RhcnRlZC50LXNicy1hbmltX3JldmVyc2VkIC50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIHstd2Via2l0LWFuaW1hdGlvbi1kaXJlY3Rpb246IHJldmVyc2U7YW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTt9In1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QXR0cmlidXRlU2VsZWN0b3IodCl7dmFyIGU9e2ZlZWQ6ImRhdGEtZmUtZWxlbS1pZCIsZ3JvdXA6ImRhdGEtZ3JvdXAtaWQiLGVsZW1lbnQ6ImRhdGEtZWxlbS1pZCJ9LG49T2JqZWN0LmtleXMoZSkuZmluZCgoZnVuY3Rpb24obil7cmV0dXJuIHQuaGFzQXR0cmlidXRlKGVbbl0pfSkpO3JldHVybiBuJiZlW25dP3thdHRyaWJ1dGU6ZVtuXSxpZDp0LmdldEF0dHJpYnV0ZShlW25dKXx8IiJ9OnthdHRyaWJ1dGU6IiIsaWQ6IiJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyh0LGUsbil7aWYoIXQpcmV0dXJuIiI7dmFyIGk9WyJzYnMiLCJvcHRzIl07bnx8KG49ImVkaXQiPT09ZT9pLmpvaW4oIiIpOmkuam9pbigiLSIpKTt2YXIgYT0iZWRpdCI9PT1lPyJmaWVsZCI6ImFuaW1hdGUiLHI9ImVkaXQiPT09ZT8iLXZhbHVlIjoiIixvPSJlZGl0Ij09PWU/ImRhdGEtZmllbGQtYW5pbW1vYmlsZS12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1tb2JpbGUiLHM9InkiPT09dC5nZXRBdHRyaWJ1dGUobyksbCxfPXRfYW5pbWF0aW9uU0JTX19nZXRSZXNPcHRzKHQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikpLGM9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlQXR0cihhLG4sciwhMSk7aWYoXy5yZXM9PT1fLnJlc01heClyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoYyk7aWYoIXMmJiJlZGl0IiE9PWUmJl8ucmVzPDEyMDApcmV0dXJuIHQuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsdC5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpLCIiO3ZhciBtPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUF0dHIoYSxuLHIsXy5yZXMpLGQ9dC5nZXRBdHRyaWJ1dGUobSk7cmV0dXJuIGR8fChfLmJyZWFrcG9pbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCEoZTw9Xy5yZXN8fGQpKXt2YXIgaT10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVBdHRyKGEsbixyLGUpO2Q9dC5nZXRBdHRyaWJ1dGUoaSl9fSkpLGR8fHQuZ2V0QXR0cmlidXRlKGMpfHwiIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlQXR0cih0LGUsbixpKXt2YXIgYT0iZGF0YS0iK3QrIi0iK2U7cmV0dXJuIGkmJihhKz0iLXJlcy0iK2kpLGErPW59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFJlc09wdHModCl7dmFyIGU9WzEyMDAsOTYwLDY0MCw0ODAsMzIwXTtpZighd2luZG93LnRuKXt2YXIgbixpPXdpbmRvdy5pbm5lcldpZHRoO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe258fGk+PXQmJihuPXQpfSkpLHtyZXM6bnx8MzIwLHJlc01heDoxMjAwLGJyZWFrcG9pbnRzOlszMjAsNDgwLDY0MCw5NjBdfX12YXIgYT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIik6IiIsbjtyZXR1cm4gYSYmd2luZG93LnRuWyJhYiIrYV0/e3Jlczp3aW5kb3cudDM5Nl9kZXRlY3RSZXNvbHV0aW9uP3QzOTZfZGV0ZWN0UmVzb2x1dGlvbihhKTp3aW5kb3cudG5bImFiIithXS5jdXJSZXNvbHV0aW9uLHJlc01heDp3aW5kb3cudG5bImFiIithXS5jdXJSZXNvbHV0aW9uX21heCxicmVha3BvaW50czp3aW5kb3cudG5bImFiIithXS5zY3JlZW5zLnNsaWNlKDAsLTEpfTp3aW5kb3cudG4uc2NyZWVucz97cmVzOndpbmRvdy50bi5jdXJSZXNvbHV0aW9uLHJlc01heDp3aW5kb3cudG4udG9wUmVzb2x1dGlvbixicmVha3BvaW50czp3aW5kb3cudG4uc2NyZWVucy5zbGljZSgwLC0xKX06e3JlczpuPXRfYW5pbWF0aW9uU0JTX19nZXRDdXJyZW50UmVzKGUsd2luZG93LmlzTW9iaWxlKSxyZXNNYXg6MTIwMCxicmVha3BvaW50czpbMzIwLDQ4MCw2NDAsOTYwXX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YSh0KXt0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoInNjcm9sbCIhPT1lLmFuaW1UeXBlfHwhbnx8ImZpeGVkIiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobiwicG9zIikpe3ZhciBpPXQuaXNFZGl0TW9kZT8iZGF0YS1maWVsZC1zYnNldmVudC12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiO2UuYW5pbVR5cGU9ZS5nZXRBdHRyaWJ1dGUoaSk7dmFyIGE9dC5pc0VkaXRNb2RlPyJkYXRhLWZpZWxkLXNic3RyZy12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtdHJnIjtlLnRyaWdnZXI9cGFyc2VGbG9hdChlLmdldEF0dHJpYnV0ZShhKSksaXNOYU4oZS50cmlnZ2VyKSYmKGUudHJpZ2dlcj0xKSxlLnRyaWdnZXJFbGVtcz10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnMoZSwicHVibGlzaGVkIiwic2JzLXRyZ2VscyIpLGUud3JhcHBlckVsPWUucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKTt2YXIgcj10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnMoZSx0LmlzRWRpdE1vZGU/ImVkaXQiOiJwdWJsaXNoZWQiLG51bGwpO2lmKGUuc3RhdHVzPXI/ImFjdGl2ZSI6ImlubmFjdGl2ZSIsImlubmFjdGl2ZSIhPT1lLnN0YXR1cyl7LTEhPT1yLmluZGV4T2YoImZpeGVkIikmJihlLnpJbmRleD1nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoInotaW5kZXgiKSkscj1yLnJlcGxhY2UoLycvZywnIicpLHRfYW5pbWF0aW9uU0JTX19hZGREZWxheVRvU3RlcHMocj1KU09OLnBhcnNlKHIpKTt2YXIgbz10LmlzRWRpdE1vZGU/ImRhdGEtZmllbGQtc2JzbG9vcC12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtbG9vcCI7ZS5sb29wPWUuZ2V0QXR0cmlidXRlKG8pfHwiIix0X2FuaW1hdGlvblNCU19fc2V0QW5kQ2FjaGVFbFRvcFBvcyhlLHQpO3ZhciBzPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKGUpO2Uuc3RlcHM9W107dmFyIGw9MDtyLmZvckVhY2goKGZ1bmN0aW9uKHQsbil7dmFyIGk9e3N0YXRlOiJ1bmFjdGl2ZSJ9O2kuc3R5bGVzPXRfYW5pbWF0aW9uU0JTX19jcmVhdGVTdGVwU3R5bGVzKHQpLCJzY3JvbGwiPT09ZS5hbmltVHlwZT8oaS5wcmV2VW5maXhlZERpc3Q9bCxpLmRpc3Q9dC5kaSpzLCExPT09aS5zdHlsZXMuZml4JiYobCs9aS5kaXN0KSxpLnN0YXJ0PTA9PT1uP2UudG9wT2Zmc2V0OmUuc3RlcHNbbi0xXS5lbmQsaS5lbmQ9aS5zdGFydCtpLmRpc3QpOihpLnRpbWU9dC50aSxpLmVhc2U9dC5lYSksZS5zdGVwcy5wdXNoKGkpfSkpLCFlLndyYXBwZXJFbHx8ZS53cmFwcGVyRWwuaWQmJmUudW5pcXVlSUR8fHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZVVuaXF1ZUlERm9yRWwoZSksdF9hbmltYXRpb25TQlNfX3VwZGF0ZUluZm9PbkltZ0xvYWQoZSx0KSx0X2FuaW1hdGlvblNCU19fdXBkYXRlTW92ZUFuZFJvdGF0ZVN0ZXBzU3R5bGVzKGUuc3RlcHMpfX19KSk7dmFyIGU9dC5lbGVtZW50cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe2lmKCJpbm5hY3RpdmUiPT09dC5zdGF0dXMpe3ZhciBlPXRfYW5pbWF0aW9uU0JTX19nZXRTaXplQmFzZWRPbkRpbWVuc2lvbk1vZGUodCksbj1lLndpZHRoLGk9ZS5oZWlnaHQ7dC53cmFwcGVyRWwmJnQud3JhcHBlckVsLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKSx0LndyYXBwZXJFbCYmKHQud3JhcHBlckVsLnN0eWxlLmRpc3BsYXk9InRhYmxlIiksdC53cmFwcGVyRWwmJih0LndyYXBwZXJFbC5zdHlsZS53aWR0aD1uKSx0LndyYXBwZXJFbCYmKHQud3JhcHBlckVsLnN0eWxlLmhlaWdodD1pKX1yZXR1cm4iaW5uYWN0aXZlIiE9PXQuc3RhdHVzfSkpO3RfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsImVsZW1lbnRzIixlKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVVbmlxdWVJREZvckVsKHQpe3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkLCAudG4tYXJ0Ym9hcmQiKSxuPSIiO2UmJihuPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXJlY29yZC1pZCIpfHxlLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpKTt2YXIgaSxhPXRfYW5pbWF0aW9uU0JTX19nZXRBdHRyaWJ1dGVTZWxlY3Rvcih0KS5pZDt0LnVuaXF1ZUlEPSJzYnMtIituKyItIithLHQud3JhcHBlckVsLmlkPXQudW5pcXVlSUR9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZUluZm9PbkltZ0xvYWQodCxlKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoImltZyIpO24mJihuLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX191cGRhdGVWYWx1ZXNBdGVySU1HTG9hZGluZyh0LGUpfSkpLG4uY29tcGxldGUmJnRfYW5pbWF0aW9uU0JTX191cGRhdGVWYWx1ZXNBdGVySU1HTG9hZGluZyh0LGUpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlVmFsdWVzQXRlcklNR0xvYWRpbmcodCxlKXt0X2FuaW1hdGlvblNCU19fc2V0QW5kQ2FjaGVFbFRvcFBvcyh0LGUpLCJzY3JvbGwiPT09dC5hbmltVHlwZSYmdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0ZXBzVmFsdWVzKHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVTdGVwc1ZhbHVlcyh0KXt0LnN0ZXBzLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7ZS5zdGFydD0wPT09bj90LnRvcE9mZnNldDp0LnN0ZXBzW24tMV0uZW5kLGUuZW5kPWUuc3RhcnQrZS5kaXN0fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKHQsZSl7dmFyIG49dF9hbmltYXRpb25TQlNfX2dldFpvb20odCksaSxhPVsic2Nyb2xsIiwiaW50b3ZpZXciLCJibG9ja2ludG92aWV3Il0uZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFuaW1UeXBlIT09ZX0pKTtpZighZS5pc0VkaXRNb2RlJiYhYSl7dmFyIHI9dF9hbmltYXRpb25TQlNfX2dldFRvcE9mZnNldCh0KTtyKz10X2FuaW1hdGlvblNCU19fYWNjdW11bGF0ZVBhcmVudEdyb3VwT2Zmc2V0KHQpLCJzY3JvbGwiIT09dC5hbmltVHlwZSYmImludG92aWV3IiE9PXQuYW5pbVR5cGV8fHdpbmRvdy5pc09ubHlTY2FsYWJsZXx8dDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KXx8KHIqPW4pO3ZhciBvPXQuY2xvc2VzdCgiLnIiKSxzPW8/by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0OjAsbD1vJiZwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLnBhZGRpbmdUb3AsMTApfHwwO3QucGFyZW50UmVjVG9wUG9zPXMsdC50b3BPZmZzZXQ9cytyK2wsdF9hbmltYXRpb25TQlNfX3NldFNjYWxlZERpZmZlcmVuY2UodCxuKSx0X2FuaW1hdGlvblNCU19fc2V0VHJpZ2dlck9mZnNldCh0KX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFRvcE9mZnNldCh0KXtpZighdClyZXR1cm4gMDtpZih0LmdldEF0dHJpYnV0ZSgiZGF0YS1mZS1lbGVtLWlkIikpcmV0dXJuIHQub2Zmc2V0VG9wO3ZhciBlPXBhcnNlSW50KHQuc3R5bGUudG9wLDEwKTtyZXR1cm4gaXNOYU4oZSk/dC5vZmZzZXRUb3B8fDA6ZX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWNjdW11bGF0ZVBhcmVudEdyb3VwT2Zmc2V0KHQpe2Zvcih2YXIgZT0wLG49dC5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO247KWUrPXRfYW5pbWF0aW9uU0JTX19nZXRUb3BPZmZzZXQobiksbj1uLnBhcmVudEVsZW1lbnQuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIik7cmV0dXJuIGV9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldFNjYWxlZERpZmZlcmVuY2UodCxlKXtpZighdC5zY2FsZWREaWZmZXJlbmNlJiZ3aW5kb3cuaXNPbmx5U2NhbGFibGUmJiJmaXhlZCIhPT10LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbiYmdDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KSl7dmFyIG49dC53cmFwcGVyRWw/dC53cmFwcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0OjAsaT1NYXRoLmFicygobiplLW4pLzIpO2k9TWF0aC5yb3VuZChpKSx0LnNjYWxlZERpZmZlcmVuY2U9aX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FkZERlbGF5VG9TdGVwcyh0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG49dFtlXTtpZigwIT09ZSYmKHBhcnNlSW50KG4uZGQsMTApfHxwYXJzZUludChuLmR0LDEwKSkpe3ZhciBpPU9iamVjdC5jcmVhdGUodFtlLTFdKTt2b2lkIDAhPT1uLmR0P2kudGk9bi5kdDppLmRpPW4uZGQsdC5zcGxpY2UoZSwwLGkpLGUrK319fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVNb3ZlQW5kUm90YXRlU3RlcHNTdHlsZXModCl7dmFyIGU9dFswXS5zdHlsZXMubW92ZVgsbj10WzBdLnN0eWxlcy5tb3ZlWSxpPXRbMF0uc3R5bGVzLnJvdGF0ZTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBhPXQuc3R5bGVzO2EubW92ZVgtPWUsZSs9YS5tb3ZlWCxhLm1vdmVZLT1uLG4rPWEubW92ZVksYS5yb3RhdGUtPWksaSs9YS5yb3RhdGV9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NyZWF0ZVN0ZXBTdHlsZXModCl7cmV0dXJue21vdmVYOnBhcnNlSW50KHQubXgsMTApfHwwLG1vdmVZOnBhcnNlSW50KHQubXksMTApfHwwLHNjYWxlWDppc05hTihwYXJzZUZsb2F0KHQuc3gpKT8xOnBhcnNlRmxvYXQodC5zeCksc2NhbGVZOmlzTmFOKHBhcnNlRmxvYXQodC5zeSkpPzE6cGFyc2VGbG9hdCh0LnN5KSxvcGFjaXR5OmlzTmFOKHBhcnNlRmxvYXQodC5vcCkpPzE6cGFyc2VGbG9hdCh0Lm9wKSxyb3RhdGU6cGFyc2VJbnQodC5ybywxMCl8fDAsYmx1cjpwYXJzZUludCh0LmJsLDEwKXx8MCxmaXg6ImZpeGVkIj09PXQuZml9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRUcmlnZ2VyT2Zmc2V0KHQpe3ZhciBlPXdpbmRvdy5pbm5lckhlaWdodCxuPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpO3QudHJpZ2dlck9mZnNldD1wYXJzZUludCh0X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnModCwicHVibGlzaGVkIiwic2JzLXRyZ29mc3QiKSwxMCksKHdpbmRvdy5pc09ubHlTY2FsYWJsZXx8InNjcm9sbCI9PT10LmFuaW1UeXBlfHx0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpKSYmKHQudHJpZ2dlck9mZnNldCo9biksdC50cmlnZ2VyT2Zmc2V0fHwodC50cmlnZ2VyT2Zmc2V0PTApLC41IT09dC50cmlnZ2VyJiYxIT09dC50cmlnZ2VyfHwodC50cmlnZ2VyT2Zmc2V0Kz1lKnQudHJpZ2dlciwoImludG92aWV3Ij09PXQuYW5pbVR5cGV8fCJzY3JvbGwiPT09dC5hbmltVHlwZSkmJnQudHJpZ2dlck9mZnNldD50LnRvcE9mZnNldCYmdC50cmlnZ2VyT2Zmc2V0PD1lKnQudHJpZ2dlciYmKHQudHJpZ2dlck9mZnNldD10LnRvcE9mZnNldCx0LnNjYWxlZERpZmZlcmVuY2UmJih0LnRyaWdnZXJPZmZzZXQ8MHx8dC50cmlnZ2VyT2Zmc2V0PT09dC5zY2FsZWREaWZmZXJlbmNlKSYmKHQuc2NhbGVkRGlmZmVyZW5jZT0wKSksImJsb2NraW50b3ZpZXciPT09dC5hbmltVHlwZSYmdC50cmlnZ2VyT2Zmc2V0PnQucGFyZW50UmVjVG9wUG9zJiZ0LnRyaWdnZXJPZmZzZXQ8PWUqdC50cmlnZ2VyJiYodC50cmlnZ2VyT2Zmc2V0PXQucGFyZW50UmVjVG9wUG9zKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3RyaWdnZXJOb1Njcm9sbEFuaW1hdGlvbih0LGUpe3RfYW5pbWF0aW9uU0JTX19wcm9jZXNzRWxzSW50b1ZpZXcodCxlKSx0X2FuaW1hdGlvblNCU19fcmVtb3ZlSG92ZXJDbGlja1RyaWdnZXJzKHQpLHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tUcmlnZ2Vycyh0KSx0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlcnModCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Byb2Nlc3NFbHNJbnRvVmlldyh0LGUpe3RfYW5pbWF0aW9uU0JTX191cGRhdGVJbnRvVmlld0Vsc1N0YXRlKGUpO3ZhciBuPTA7dF9hbmltYXRpb25TQlNfX3NldEtleUZvckFuaW1hdGVkT2JqZWN0KHQsIm9uU2Nyb2xsVXBkYXRlRWxzSW50b1ZpZXciLChmdW5jdGlvbigpe258fChuPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIGU7dF9hbmltYXRpb25TQlNfX3VwZGF0ZUludG9WaWV3RWxzU3RhdGUodF9hbmltYXRpb25TQlNfX2dldEFuaW1FbHNPblZpZXcodC5lbGVtZW50cykpLG49MH0pLDIwMCkpfSkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHQub25TY3JvbGxVcGRhdGVFbHNJbnRvVmlldyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdC5vblNjcm9sbFVwZGF0ZUVsc0ludG9WaWV3KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcmVtb3ZlSG92ZXJDbGlja1RyaWdnZXJzKHQpe3ZhciBlPVsianMtc2JzLWFuaW0tdHJpZ2dlcl9jbGljayIsImpzLXNicy1hbmltLXRyaWdnZXJfaG92ZXIiXSxuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi4iK2Uuam9pbigiLCAuIikpO24ubGVuZ3RoJiYoKG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobikpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5jbGFzc0xpc3QucmVtb3ZlKGUpfSkpfSkpLHQuY2xpY2tlZFRyaWdnZXJFbHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRDbGlja0NhbGxiYWNrKSx0X2FuaW1hdGlvblNCU19fcmVtb3ZlVHJpZ2dlckxpc3QodCwiY2xpY2siKX0pKSx0LmhvdmVyVHJpZ2dlckVscy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdF9hbmltYXRpb25TQlNfX3JlbW92ZVRyaWdnZXJMaXN0KHQsImhvdmVyIil9KSksdF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCwiY2xpY2tlZFRyaWdnZXJFbHMiLFtdKSx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LCJob3ZlclRyaWdnZXJFbHMiLFtdKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3JlbW92ZVRyaWdnZXJMaXN0KHQsZSl7dFsidHJpZ2dlckxpc3Qtb24tIitlXSYmKHRbInRyaWdnZXJMaXN0LW9uLSIrZV09W10pLHRbInRyaWdnZXJPbmNlTGlzdC1vbi0iK2VdJiYodFsidHJpZ2dlck9uY2VMaXN0LW9uLSIrZV09W10pfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tUcmlnZ2Vycyh0KXt2YXIgZT10LmVsZW1lbnRzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuImNsaWNrIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50Iil9KSk7aWYoZS5sZW5ndGgpe3RfYW5pbWF0aW9uU0JTX19jb25uZWN0VHJpZ2dlcnNXaXRoQW5pbUVscyhlKTt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtc2JzLWFuaW0tdHJpZ2dlcl9jbGljayIpKTtpZihuLmxlbmd0aCl7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJqcy1zYnMtYW5pbS10cmlnZ2VyLXN0eWxlcyIpKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2kuaWQ9ImpzLXNicy1hbmltLXRyaWdnZXItc3R5bGVzIixpLnRleHRDb250ZW50PSIuanMtc2JzLWFuaW0tdHJpZ2dlcl9jbGljayB7IGN1cnNvcjogcG9pbnRlcjsgfSIsZG9jdW1lbnQuaGVhZC5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsaSl9dC5jbGlja2VkVHJpZ2dlckVscz1uLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dF9hbmltYXRpb25TQlNfX3ByZXZlbnRBbmltYXRlZFBhcmVudFRyaWdnZXIodCksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRDbGlja0NhbGxiYWNrKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdENsaWNrQ2FsbGJhY2spfSkpfX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRDbGlja0NhbGxiYWNrKCl7dmFyIHQ9dGhpc1sidHJpZ2dlckxpc3Qtb24tY2xpY2siXXx8W10sZT10aGlzWyJ0cmlnZ2VyT25jZUxpc3Qtb24tY2xpY2siXXx8W107KHQubGVuZ3RofHxlLmxlbmd0aCkmJih0X2FuaW1hdGlvblNCU19fcGxheU9uY2VBbmltYXRpb24odGhpcyxlLCJjbGljayIpLHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fc3RhcnRlZCIpJiYhdC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fcmV2ZXJzZWQiKT90X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25FbmQodCk6dF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uU3RhcnQodCl9KSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wbGF5T25jZUFuaW1hdGlvbih0LGUsbil7aWYoZSYmZS5sZW5ndGgpe3RfYW5pbWF0aW9uU0JTX19hY3Rpb25PblN0YXJ0KGUpO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO2kuaW5pdEV2ZW50KCJ1cGRhdGVBbmltT25jZSIsITAsITApLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5kaXNwYXRjaEV2ZW50KGkpfSkpLHRbInRyaWdnZXJPbmNlTGlzdC1vbi0iK25dPVtdfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlcnModCl7dmFyIGU9dC5lbGVtZW50cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiJob3ZlciI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpfSkpO2lmKGUubGVuZ3RoKXt0X2FuaW1hdGlvblNCU19fY29ubmVjdFRyaWdnZXJzV2l0aEFuaW1FbHMoZSk7dmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXNicy1hbmltLXRyaWdnZXJfaG92ZXIiKTtuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG4pLHQuaG92ZXJUcmlnZ2VyRWxzPW4sbi5mb3JFYWNoKChmdW5jdGlvbih0KXt0X2FuaW1hdGlvblNCU19fcHJldmVudEFuaW1hdGVkUGFyZW50VHJpZ2dlcih0KSx3aW5kb3cuYW5pbWF0aW9uU0JTX19pc0lPUz8odC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSk6KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpKX0pKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3ByZXZlbnRBbmltYXRlZFBhcmVudFRyaWdnZXIodCl7aWYoIm5vbmUiIT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5wb2ludGVyRXZlbnRzKXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKTtlJiYodC5zdHlsZS5wb2ludGVyRXZlbnRzPSJub25lIixlLnN0eWxlLnBvaW50ZXJFdmVudHM9ImF1dG8iKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIodCl7dmFyIGU9dC5jdXJyZW50VGFyZ2V0LG49dC5jdXJyZW50VGFyZ2V0WyJ0cmlnZ2VyTGlzdC1vbi1ob3ZlciJdLGk9dC5jdXJyZW50VGFyZ2V0WyJ0cmlnZ2VyT25jZUxpc3Qtb24taG92ZXIiXTtmdW5jdGlvbiBhKHQpe2UuY2xvc2VzdCgiLnQzOTZfX2VsZW0iKSE9PXQudGFyZ2V0LmNsb3Nlc3QoIi50Mzk2X19lbGVtIikmJih0X2FuaW1hdGlvblNCU19fYWN0aW9uT25FbmQobiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LWhvdmVyLW1vYi1hY3RpdmUiKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsYSkpfShuJiZuLmxlbmd0aHx8aSYmaS5sZW5ndGgpJiYodF9hbmltYXRpb25TQlNfX3BsYXlPbmNlQW5pbWF0aW9uKGUsaSwiaG92ZXIiKSxuJiZuLmxlbmd0aCYmKCJtb3VzZWVudGVyIj09PXQudHlwZSYmdF9hbmltYXRpb25TQlNfX2FjdGlvbk9uU3RhcnQobiksIm1vdXNlbGVhdmUiPT09dC50eXBlJiZ0X2FuaW1hdGlvblNCU19fYWN0aW9uT25FbmQobiksImNsaWNrIj09PXQudHlwZSYmKGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWhvdmVyLW1vYi1hY3RpdmUiKXx8KHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfX2FjdGlvbk9uU3RhcnQobiksZS5jbGFzc0xpc3QuYWRkKCJ0LWhvdmVyLW1vYi1hY3RpdmUiKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixhKX0pKSkpKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2Nvbm5lY3RUcmlnZ2Vyc1dpdGhBbmltRWxzKHQpe3ZhciBlPXRbMF0uZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50Iik7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LnRyaWdnZXJFbGVtcztpZihuKXt2YXIgaT1uP24uc3BsaXQoIiwiKTpbXSxhPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikscj1hP2EuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIik6IiI7aS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgaT1yK24sYTt0X2FuaW1hdGlvblNCU19fcHJvY2Vzc1RyaWdnZXJzRWxlbUxpc3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fXyIraSsiLCAudG4tZ3JvdXBfXyIraSksdCxlKX0pKX1lbHNle3ZhciBvO3RfYW5pbWF0aW9uU0JTX19wcm9jZXNzVHJpZ2dlcnNFbGVtTGlzdCh0LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksdCxlKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Byb2Nlc3NUcmlnZ2Vyc0VsZW1MaXN0KHQsZSxuKXt2YXIgaTt0JiYoIm9uY2UiPT09ZS5sb29wP2UuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKXx8dF9hbmltYXRpb25TQlNfX2luaXRUcmlnZ2Vyc0xpc3QodCwidHJpZ2dlck9uY2VMaXN0IixuLGUpOnRfYW5pbWF0aW9uU0JTX19pbml0VHJpZ2dlcnNMaXN0KHQsInRyaWdnZXJMaXN0IixuLGUpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdFRyaWdnZXJzTGlzdCh0LGUsbixpKXt0W2UrIi1vbi0iK25dPy0xPT09dFtlKyItb24tIituXS5pbmRleE9mKGkpJiZ0W2UrIi1vbi0iK25dLnB1c2goaSk6dFtlKyItb24tIituXT1baV0sdFtlKyItb24tIituXS5sZW5ndGgmJiF0LmNsYXNzTGlzdC5jb250YWlucygianMtc2JzLWFuaW0tdHJpZ2dlcl8iK24pJiZ0LmNsYXNzTGlzdC5hZGQoImpzLXNicy1hbmltLXRyaWdnZXJfIituKSxpLmFkZEV2ZW50TGlzdGVuZXIoInVwZGF0ZUFuaW1PbmNlIiwoZnVuY3Rpb24oKXt0W2UrIi1vbi0iK25dPXRbZSsiLW9uLSIrbl0uZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWl9KSksdFsidHJpZ2dlckxpc3Qtb24tIituXSYmdFsidHJpZ2dlckxpc3Qtb24tIituXS5sZW5ndGh8fHQuY2xhc3NMaXN0LnJlbW92ZSgianMtc2JzLWFuaW0tdHJpZ2dlcl8iK24pfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hY3Rpb25PblN0YXJ0KHQpe3QuZm9yRWFjaCh0X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25TdGFydCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uU3RhcnQodCl7dC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fcGxheWluZyIpP3Quc2V0QXR0cmlidXRlKCJkYXRhLXBsYW5uZWQtZGlyIiwicGxheSIpOnRfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHQsITEpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hY3Rpb25PbkVuZCh0KXt0LmZvckVhY2godF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uRW5kKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25FbmQodCl7dmFyIGU9dC5sb29wLG49Im5vcmV2ZXJzZSI9PT1lJiYiaG92ZXIiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKTtlJiYtMSE9PWUuaW5kZXhPZigibG9vcCIpP3QuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uaXRlcmF0aW9uIix0X2FuaW1hdGlvblNCU19fc2V0SXRlcmF0aW9uQW5pbWF0aW9uKTp0LmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9wbGF5aW5nIikmJiFuP3Quc2V0QXR0cmlidXRlKCJkYXRhLXBsYW5uZWQtZGlyIiwicmV2ZXJzZSIpOm58fHRfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHQsITApfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRJdGVyYXRpb25BbmltYXRpb24odCl7dmFyIGU9dC50YXJnZXQuY2xvc2VzdCgiLnQzOTZfX2VsZW0iKTtpZihlKXtpZigibG9vcHdpdGhyZXZlcnNlIj09PWUubG9vcCl7dmFyIG49dF9hbmltYXRpb25TQlNfX2dldEFuaW1hdGlvbkZ1bGxUaW1lKGUsITApLGksYTtpZigxZTMqdC5lbGFwc2VkVGltZS9uJTIhPTApcmV0dXJufWUuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9zdGFydGVkIiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3JldmVyc2VkIiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3BsYXlpbmciKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbml0ZXJhdGlvbiIsdF9hbmltYXRpb25TQlNfX3NldEl0ZXJhdGlvbkFuaW1hdGlvbil9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hbmltYXRpb25FbmQodCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHRfYW5pbWF0aW9uU0JTX19hbmltYXRpb25FbmRpbmdFdmVudCksdC5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHRfYW5pbWF0aW9uU0JTX19hbmltYXRpb25FbmRpbmdFdmVudCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FuaW1hdGlvbkVuZGluZ0V2ZW50KCl7dGhpcy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3BsYXlpbmciKTt2YXIgdD10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1wbGFubmVkLWRpciIpOyJwbGF5Ij09PXQmJnRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3JldmVyc2VkIik/dF9hbmltYXRpb25TQlNfX3BsYXlBbmltYXRpb24odGhpcywhMSk6InJldmVyc2UiIT09dHx8dGhpcy5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fcmV2ZXJzZWQiKXx8dF9hbmltYXRpb25TQlNfX3BsYXlBbmltYXRpb24odGhpcywhMCksdGhpcy5zZXRBdHRyaWJ1dGUoImRhdGEtcGxhbm5lZC1kaXIiLCIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QW5pbWF0aW9uRnVsbFRpbWUodCxlKXt2YXIgbixpO3JldHVybiB0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1vcHRzIik/SlNPTi5wYXJzZSh0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1vcHRzIikuc3BsaXQoIiciKS5qb2luKCciJykpLnJlZHVjZSgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSYmKHQrPXBhcnNlSW50KG4uZHQsMTApfHwwKSx0KyhwYXJzZUludChuLnRpLDEwKXx8MCl9KSwwKTowfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHQsZSl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKSxlfHx0LmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fcmV2ZXJzZWQiKSx0X2FuaW1hdGlvblNCU19fZm9yY2VSZXBhaW50KHQpO3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltYXRpb25GdWxsVGltZSh0LCExKSxpPVsidC1zYnMtYW5pbV9zdGFydGVkIl07ZSYmaS5wdXNoKCJ0LXNicy1hbmltX3JldmVyc2VkIiksbj4wJiZpLnB1c2goInQtc2JzLWFuaW1fcGxheWluZyIpLGkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5jbGFzc0xpc3QuYWRkKGUpfSkpLHRfYW5pbWF0aW9uU0JTX19hbmltYXRpb25FbmQodCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2ZvcmNlUmVwYWludCh0KXt0Lm9mZnNldFdpZHRofWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVJbnRvVmlld0Vsc1N0YXRlKHQpe3QmJnQubGVuZ3RoJiZ0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKGRvY3VtZW50LmNvbnRhaW5zKHQpKXt2YXIgZT13aW5kb3cucGFnZVlPZmZzZXQrdC50cmlnZ2VyT2Zmc2V0LG49ImJsb2NraW50b3ZpZXciPT09dC5hbmltVHlwZT9lPj10LnBhcmVudFJlY1RvcFBvczplPj10LnRvcE9mZnNldCxpPXQuY2xvc2VzdCgiLnQzOTYiKS5wYXJlbnRFbGVtZW50LGEscj1bInQzOTdfX29mZiIsInQzOTVfX29mZiIsInQ0MDBfX29mZiJdLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBpLmNsYXNzTGlzdC5jb250YWlucyh0KX0pKTtuJiYhciYmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKXx8dC5jbGFzc0xpc3QuYWRkKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKSl9fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpe2lmKHZvaWQgMCE9PXQuc2NhbGVGYWN0b3IpcmV0dXJuIHQuc2NhbGVGYWN0b3I7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKTtpZighZSlyZXR1cm4gMTt2YXIgbj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpO3JldHVybiBlLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmRfc2NhbGUiKXx8IXdpbmRvdy5hbmltYXRpb25TQlNfX2lzT2xkUGFnZSYmInVuZGVmaW5lZCIhPXR5cGVvZiB0Mzk2X2FiX19nZXRGaWVsZFZhbHVlJiYid2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoZSwidXBzY2FsZSIpP24mJndpbmRvdy50blsiYWIiK25dJiZ3aW5kb3cudG5bImFiIituXS5zY2FsZUZhY3Rvcnx8d2luZG93LnRuX3NjYWxlX2ZhY3RvcjoxfWZ1bmN0aW9uIHRfYW5pbWF0ZVNic19fd3JhcEF0b21FbHMoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1hbmltYXRlLXNicy1ldmVudF0iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtpZihlJiYhZS5jbG9zZXN0KCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpKXt0X2FuaW1hdGlvblNCU19fd3JhcEVsKGUsInRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKTt2YXIgbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmdldFByb3BlcnR5VmFsdWUoImJvcmRlci1yYWRpdXMiKTtpZigic2hhcGUiPT09biYmaSYmcGFyc2VJbnQoaSkpe3ZhciBhPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKTthJiYoYS5zdHlsZS5ib3JkZXJSYWRpdXM9aSl9fX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVTYnNfX2Nhc2hFbHNJbmZvKHQpe3ZhciBlPXQuZWxzO3QudHJpZ2dlckVsZW1zQXR0ck5hbWU9ImVkaXQiPT09dC5tb2RlPyJkYXRhLWZpZWxkLXNic3RyZ2Vscy12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtdHJnZWxzIixBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUpe2Uuc3RhdGU9InVuYWN0aXZlIixlLmFuaW1UeXBlPSJlZGl0Ij09PXQubW9kZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC1zYnNldmVudC12YWx1ZSIpOmUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50IiksZS5jaGFuZ2VUeXBlPSJzY3JvbGwiPT09ZS5hbmltVHlwZT8ic2Nyb2xsIjoidGltZSIsZS50cmlnZ2VyPSJlZGl0Ij09PXQubW9kZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC1zYnN0cmctdmFsdWUiKTplLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy10cmciKSxlLnRyaWdnZXI9ZS50cmlnZ2VyP2UudHJpZ2dlcjoxLGUudHJpZ2dlckVsZW1zPWUuZ2V0QXR0cmlidXRlKHQudHJpZ2dlckVsZW1zQXR0ck5hbWUpLGUud3JhcHBlckVsPWUucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKSxlLnN0ZXBzPVtdO3ZhciBuPSJlZGl0Ij09PXQubW9kZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC1zYnNvcHRzLXZhbHVlIik6ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtb3B0cyIpO2lmKG4pey0xIT09bi5pbmRleE9mKCJmaXhlZCIpJiYoZS56SW5kZXg9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgiei1pbmRleCIpKSxuPW4ucmVwbGFjZSgvJy9nLCciJyk7dmFyIGk9SlNPTi5wYXJzZShuKTt0X2FuaW1hdGlvblNCU19fYWRkRGVsYXlUb1N0ZXBzKGkpLGUubG9vcD0iZWRpdCI9PT10Lm1vZGU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtc2JzbG9vcC12YWx1ZSIpOmUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWxvb3AiKSx0X2FuaW1hdGlvblNCU19fc2V0QW5kQ2FjaGVFbFRvcFBvcyhlLHQpO2Zvcih2YXIgYT0wLHI9MDtyPGkubGVuZ3RoO3IrKyl7dmFyIG89e3N0YXRlOiJ1bmFjdGl2ZSJ9O28uc3R5bGVzPXRfYW5pbWF0aW9uU0JTX19jcmVhdGVTdGVwU3R5bGVzKGlbcl0pLCJzY3JvbGwiPT09ZS5jaGFuZ2VUeXBlPyhvLnByZXZVbmZpeGVkRGlzdD1hLG8uZGlzdD1pW3JdLmRpLCExPT09by5zdHlsZXMuZml4JiYoYSs9TnVtYmVyKG8uZGlzdCkpLG8uc3RhcnQ9MD09PXI/ZS50b3BPZmZzZXQ6ZS5zdGVwc1tyLTFdLmVuZCxvLmVuZD1vLnN0YXJ0KzEqby5kaXN0KTooby50aW1lPWlbcl0udGksby5lYXNlPWlbcl0uZWEpLGUuc3RlcHMucHVzaChvKX10X2FuaW1hdGlvblNCU19fdXBkYXRlSW5mb09uSW1nTG9hZChlLHQpLHRfYW5pbWF0aW9uU0JTX191cGRhdGVNb3ZlQW5kUm90YXRlU3RlcHNTdHlsZXMoZS5zdGVwcyl9fSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZVNic19fcmVzZXQodCl7Zm9yKHZhciBlPXQuZWxzLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk9ZVtuXS5hbmltVHlwZTtpZigiaW50b3ZpZXciPT09aXx8ImJsb2NraW50b3ZpZXciPT09aXx8ImNsaWNrIj09PWl8fCJob3ZlciI9PT1pKXtlW25dLmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fc3RhcnRlZCIpO3ZhciBhPWVbbl0ucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKTthJiYoYS5zdHlsZS5vcGFjaXR5PSIiKX1lbHNle2Vbbl0uc3RhdGU9InJlc2V0ZWQiO3ZhciByPWVbbl0ud3JhcHBlckVsO3ImJihyLnN0eWxlLnRyYW5zZm9ybT0iIixyLnN0eWxlLnBvc2l0aW9uPSIiLHIuc3R5bGUudG9wPSIiLHIuc3R5bGUub3BhY2l0eT0iIil9fX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0U2l6ZUJhc2VkT25EaW1lbnNpb25Nb2RlKHQpe2lmKCF0KXJldHVybnt3aWR0aDoiaW5oZXJpdCIsaGVpZ2h0OiJpbmhlcml0In07dmFyIGU9dC5wYXJlbnROb2RlLmNsb3Nlc3QoIi50bi1ncm91cCIpfHx0LnBhcmVudE5vZGUsbixpLGE7cmV0dXJuIGUmJnQzOTZfX2lzRmxleChlKT97d2lkdGg6ImZpbGwiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsIndpZHRobW9kZSIpPyIxMDAlIjoiaW5oZXJpdCIsaGVpZ2h0OiJmaWxsIj09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHRtb2RlIik/IjEwMCUiOiJpbmhlcml0In06e3dpZHRoOiJpbmhlcml0IixoZWlnaHQ6ImluaGVyaXQifX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fd3JhcEVsKHQsZSl7aWYoIXQpcmV0dXJuITE7dmFyIG49dC5wYXJlbnROb2RlLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYT0iaW1hZ2UiPT09dC5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxyPXQzOTZfX2lzRmxleCh0LnBhcmVudEVsZW1lbnQpLG89dF9hbmltYXRpb25TQlNfX2dldFNpemVCYXNlZE9uRGltZW5zaW9uTW9kZShuKSxzPW8ud2lkdGgsbD1vLmhlaWdodCxfPS9maXJlZm94fEZpcmVmb3gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7InN0cmluZyI9PXR5cGVvZiBlP2kuY2xhc3NMaXN0LmFkZChlKTplLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuY2xhc3NMaXN0LmFkZCh0KX0pKSxpLnN0eWxlLmRpc3BsYXk9YXx8X3x8cj8iaW5oZXJpdCI6InRhYmxlIixpLnN0eWxlLndpZHRoPXMsaS5zdHlsZS5oZWlnaHQ9bCxpLmFwcGVuZENoaWxkKHQpLG4mJm4uYXBwZW5kQ2hpbGQoaSl9d2luZG93LnRfYW5pbWF0aW9uU0JTX19pc0ZpcmVmb3g9LTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LnNlYXJjaCgiRmlyZWZveCIpLHdpbmRvdy50X2FuaW1hdGlvblNCU19faXNTYWZhcmk9L14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx3aW5kb3cuYW5pbWF0aW9uU0JTX19pc0lPUz0vaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fCJvbnRvdWNoZW5kImluIGRvY3VtZW50JiYvTWFjaW50b3NoLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy5hbmltYXRpb25TQlNfX2lzT2xkUGFnZT1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMqPSJ0aWxkYS1ibG9ja3MtMi43Il0nKSksInZpc2libGUiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlPyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dF9hbmltYXRpb25TQlNfX2luaXQoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0X2FuaW1hdGlvblNCU19faW5pdCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdF9hbmltYXRpb25TQlNfX2NoZWNrVmlzaWJpbGl0eVBhZ2UpOwoKZnVuY3Rpb24gdDM5Nl9zY2FsZUJsb2NrKGUpe3ZhciB0PXQzOTZfZGV0ZWN0UmVzb2x1dGlvbihlKSxsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpO2lmKGwpe3ZhciBhOyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yP2E9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKGUpOihhPXdpbmRvdy50biYmd2luZG93LnRuWyJhYiIrZV0mJndpbmRvdy50blsiYWIiK2VdLnNjYWxlRmFjdG9yKXx8KGE9d2luZG93LnRuX3NjYWxlX2ZhY3Rvcik7dmFyIG89bC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKSxuPXQzOTZfc2NhbGVfX2NvbGxlY3RTY2FsZURhdGEobyxhKTtpZihvKXt2YXIgcj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sImhlaWdodCIpLGk9TWF0aC5mbG9vcihyKmEpLGMsXztpZih0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sImhlaWdodF92aCIpKXt2YXIgcz10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sImhlaWdodCIpLGQ9dDM5Nl9hYl9fZ2V0SGVpZ2h0KG8pLHU9cyphO2k9dT49ZD91OmR9aWYodDM5Nl9zY2FsZV9fdXBkYXRlQXJ0Ym9hcmRTdGF0ZShvLGkpLDAhPT1uLmxlbmd0aClpZih0Mzk2X2lzT25seVNjYWxhYmxlQnJvd3NlcigpKXQzOTZfc2NhbGVfX3NjYWxlSXNPbmx5U2NhbGFibGVCbG9jayhuKTtlbHNle3ZhciBtPW4uZmlsdGVyKChmdW5jdGlvbihlKXt2YXIgdD1lLmVsZW1UeXBlO3JldHVybiJ0ZXh0Ij09PXR8fCJidXR0b24iPT09dH0pKSxoPW4uZmlsdGVyKChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4ic2hhcGUiPT09ZS5lbGVtVHlwZX0pKSxwPS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksZjtwJiZ0Mzk2X3NjYWxlX19zY2hlZHVsZV9fc2NhbGVUZXh0RWxlbWVudHMobSksdDM5Nl9zY2FsZV9fc2NoZWR1bGVfX3NjYWxlU2hhcGVFbGVtZW50cyhoKSxuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBsPWUuZWxlbWVudCxvPWUuZWxlbWVudENvcmUsbj1lLmVsZW1UeXBlLHI9ImdhbGxlcnkiPT09bjsieWVzIj09PWwuZ2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIpfHxyfHwobC5zdHlsZS56b29tPWEpLHImJihsLnN0eWxlLnpvb209bnVsbCksInRleHQiPT09biYmdDwxMjAwJiZvJiYhcCYmKG8uc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9ImF1dG8iKSxvJiYoby5zdHlsZS50cmFuc2Zvcm1PcmlnaW49ImNlbnRlciIpfSkpLEFycmF5LmZyb20oby5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUgPiAudDM5Nl9fZWxlbSwgOnNjb3BlID4gLnQzOTZfX2dyb3VwIikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0OygibGVmdCIhPT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUoZSwiYXhpc3giKXx8InRvcCIhPT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUoZSwiYXhpc3kiKSkmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChlLCJsZWZ0IiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoZSwidG9wIikpfSkpfX19fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVRleHRFbGVtZW50cyhlKXt3aW5kb3cudG58fCh3aW5kb3cudG49e30pLHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZXx8KHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZT1bXSksd2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlPXdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZS5jb25jYXQoZSksY2xlYXJUaW1lb3V0KHdpbmRvdy50bi50ZXh0RWxlbWVudHNTY2FsZVRpbWVyKSx3aW5kb3cudG4udGV4dEVsZW1lbnRzU2NhbGVUaW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfc2NhbGVfX3NjYWxlVGV4dEVsZW1lbnRzKHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZSksd2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlPVtdfSksMSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NhbGVUZXh0RWxlbWVudHMoZSl7dmFyIHQ9dDM5Nl9faW5pdEZhc3RET00oKTt0LndyaXRlKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5lbGVtZW50LnN0eWxlLnpvb209IiJ9KSl9KSksdC5yZWFkKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5jYWNoZWRGb250U2l6ZT1wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoZS5lbGVtZW50Q29yZSkuZm9udFNpemUpLGUuY2FjaGVkVGV4dFNpemVBZGp1c3Q9ZS5lbGVtZW50Q29yZS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdH0pKX0pKSx0LndyaXRlKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5lbGVtZW50Q29yZS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD0ibm9uZSIsZS5lbGVtZW50LnN0eWxlLnpvb209ZS5zY2FsZUZhY3Rvcn0pKX0pKSx0LnJlYWQoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmN1cnJlbnRGb250U2l6ZT1wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoZS5lbGVtZW50Q29yZSkuZm9udFNpemUpfSkpfSkpLHQud3JpdGUoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmFicyhlLmNhY2hlZEZvbnRTaXplLWUuY3VycmVudEZvbnRTaXplKTtlLmVsZW1lbnRDb3JlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PXQ+PTE/Im5vbmUiOmUuY2FjaGVkVGV4dFNpemVBZGp1c3QsdD49MSYmKGUuZWxlbWVudENvcmUuc3R5bGUuZm9udFNpemU9TWF0aC5yb3VuZChlLmNhY2hlZEZvbnRTaXplKmUuc2NhbGVGYWN0b3IpKyJweCIpfSkpfSkpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVNoYXBlRWxlbWVudHMoZSl7d2luZG93LnRufHwod2luZG93LnRuPXt9KSx3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlfHwod2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZT1bXSksd2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZT13aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlLmNvbmNhdChlKSxjbGVhclRpbWVvdXQod2luZG93LnRuLnNoYXBlRWxlbWVudHNTY2FsZVRpbWVyKSx3aW5kb3cudG4uc2hhcGVFbGVtZW50c1NjYWxlVGltZXI9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X3NjYWxlX19zY2FsZVNoYXBlRWxlbWVudHMod2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZSksd2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZT1bXX0pLDEpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjYWxlU2hhcGVFbGVtZW50cyhlKXt2YXIgdD10Mzk2X19pbml0RmFzdERPTSgpO3QucmVhZCgoZnVuY3Rpb24oKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLmVsZW1lbnQsImhlaWdodCIpO3Q9dDM5Nl9lbGVtX19nZXRIZWlnaHQoZS5lbGVtZW50LHQpLHQ9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUuZWxlbWVudCwiaGVpZ2h0Iix0KTt2YXIgbD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZS5lbGVtZW50LCJ3aWR0aCIpO2w9dDM5Nl9lbGVtX19nZXRXaWR0aChlLmVsZW1lbnQsbCksbD10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZS5lbGVtZW50LCJ3aWR0aCIsbCk7dmFyIGE9cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZS5lbGVtZW50LCJ0b3AiKSk7YT10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZS5lbGVtZW50LCJ0b3AiLGEpO3ZhciBvPXBhcnNlRmxvYXQodDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUuZWxlbWVudCwibGVmdCIpKTtvPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLmVsZW1lbnQsImxlZnQiLG8pLGUuc2hhcGVTaXplPXt0b3A6YSxsZWZ0Om8sd2lkdGg6bCxoZWlnaHQ6dH19KSl9KSk7dmFyIGw9ZS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNoYXBlU2l6ZS53aWR0aDw9Mnx8ZS5zaGFwZVNpemUuaGVpZ2h0PD0yfSkpO3QucmVhZCgoZnVuY3Rpb24oKXtsLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUuZWxlbWVudENvcmUpO2UuYm9yZGVyV2lkdGg9dC5ib3JkZXJXaWR0aCxlLmlzSW1hZ2U9Im5vbmUiIT09dC5iYWNrZ3JvdW5kSW1hZ2UsZS5pc0FuaW1hdGVkPWUuZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKX0pKX0pKSx0LndyaXRlKChmdW5jdGlvbigpe2wuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoIjBweCI9PT1lLmJvcmRlcldpZHRoJiYhZS5pc0ltYWdlJiYhZS5pc0FuaW1hdGVkKXtlLmVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoInpvb20iKTt2YXIgdD1lLnNoYXBlU2l6ZS53aWR0aCplLnNjYWxlRmFjdG9yLGw9ZS5zaGFwZVNpemUuaGVpZ2h0KmUuc2NhbGVGYWN0b3IsYT1lLnNoYXBlU2l6ZS50b3AqZS5zY2FsZUZhY3RvcixvPWUuc2hhcGVTaXplLmxlZnQqZS5zY2FsZUZhY3RvcjtlLmVsZW1lbnQuc3R5bGUud2lkdGg9cGFyc2VGbG9hdCh0KSsicHgiLGUuZWxlbWVudC5zdHlsZS5oZWlnaHQ9cGFyc2VGbG9hdChsKSsicHgiLGUuZWxlbWVudC5zdHlsZS50b3A9TWF0aC5yb3VuZChhKSsicHgiLGUuZWxlbWVudC5zdHlsZS5sZWZ0PU1hdGgucm91bmQobykrInB4IixlLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIsInllcyIpfX0pKX0pKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19jb2xsZWN0U2NhbGVEYXRhKGUsdCl7dmFyIGw7cmV0dXJuIHQzOTZfc2NhbGVfX2dldEVsZW1lbnRzVG9TY2FsZShlKS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBsPWUucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpLGE9dDM5Nl9zY2FsZV9fZ2V0RWxlbWVudFR5cGUoZSksbz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwiY29udGFpbmVyIik7aWYob3x8Imdyb3VwIiE9PWF8fChvPSJncmlkIiksbCYmImdyaWQiPT09bylyZXR1cm57ZWxlbWVudDplLGVsZW1lbnRDb3JlOmwsZWxlbVR5cGU6YSxzY2FsZUZhY3Rvcjp0fX0pKS5maWx0ZXIoQm9vbGVhbil9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NhbGVJc09ubHlTY2FsYWJsZUJsb2NrKGUpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5lbGVtZW50LGw9ZS5lbGVtZW50Q29yZSxhPWUuZWxlbVR5cGUsbz1sLmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIik7b3x8KHQzOTZfc2NhbGVfX3dyYXBFbGVtZW50KGwsY3VycmVudFNjYWxlRmFjdG9yLCJ0bi1hdG9tX19zY2FsZS13cmFwcGVyIiksbz1sLmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIikpLHQuc3R5bGUuem9vbT0iIix0Mzk2X3NjYWxlX19wcm9jZXNzQmFja2Ryb3BGaWx0ZXIodCxsLG8pLHQzOTZfc2NhbGVfX3Byb2Nlc3NCYWNrZ3JvdW5kRm9yU2hhcGUodCxsLGEsY3VycmVudFNjYWxlRmFjdG9yKX0pKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19nZXRFbGVtZW50c1RvU2NhbGUoZSl7cmV0dXJuIGU/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5jaGlsZHJlbikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIil8fGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cCIpKX0pKTpbXX1mdW5jdGlvbiB0Mzk2X3NjYWxlX191cGRhdGVBcnRib2FyZFN0YXRlKGUsdCl7ZS5jbGFzc0xpc3QuYWRkKCJ0Mzk2X19hcnRib2FyZF9zY2FsZSIpO3ZhciBsPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksYTtpZighKCJodWciPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpKSl7dmFyIG89JzxzdHlsZSBjbGFzcz0idDM5Nl9fc2NhbGUtc3R5bGUiPi50LXJlYyNyZWMnK2wrIiB7IG92ZXJmbG93OiB2aXNpYmxlOyB9I3JlYyIrbCsiIC50Mzk2X19hcnRib2FyZDpub3QoLnQzOTZfX2FydGJvYXJkLWZsZXgpLCNyZWMiK2wrIiAudDM5Nl9fYXJ0Ym9hcmQ6bm90KC50Mzk2X19hcnRib2FyZC1mbGV4KSAudDM5Nl9fY2FycmllciwjcmVjIitsKyIgLnQzOTZfX2FydGJvYXJkOm5vdCgudDM5Nl9fYXJ0Ym9hcmQtZmxleCkgLnQzOTZfX2ZpbHRlciB7IHdpZHRoOiAxMDB2dyAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDEwMCU7fSNyZWMiK2wrIiAudDM5Nl9fY2FycmllciwjcmVjIitsKyIgLnQzOTZfX2ZpbHRlciwjcmVjIitsKyIgLnQzOTZfX2FydGJvYXJkIHtoZWlnaHQ6ICIrdCsicHggIWltcG9ydGFudDt9PC9zdHlsZT4iO2UuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLG8pfX1mdW5jdGlvbiB0Mzk2X3NjYWxlX193cmFwRWxlbWVudChlLHQsbCl7aWYoZSl7dmFyIGE9ZS5wYXJlbnROb2RlO2lmKGEpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uY2xhc3NMaXN0LmFkZChsKSxvLnN0eWxlLnRyYW5zZm9ybT0ic2NhbGUoIit0KyIpIixvLmFwcGVuZENoaWxkKGUpLGEuYXBwZW5kQ2hpbGQobyl9fX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19wcm9jZXNzQmFja2Ryb3BGaWx0ZXIoZSx0LGwpeyJub25lIj09PWUuc3R5bGUuYmFja2Ryb3BGaWx0ZXImJihlLnN0eWxlLmJhY2tkcm9wRmlsdGVyPSIiKTt2YXIgYT1nZXRDb21wdXRlZFN0eWxlKGUpLmJhY2tkcm9wRmlsdGVyO2lmKGEpe2Uuc3R5bGUuYmFja2Ryb3BGaWx0ZXI9Im5vbmUiLGwuc3R5bGUuYmFja2Ryb3BGaWx0ZXI9YTt2YXIgbz1nZXRDb21wdXRlZFN0eWxlKHQpLmJvcmRlclJhZGl1czsiMHB4IiE9PW8mJihsLnN0eWxlLmJvcmRlclJhZGl1cz1vKX19ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fcHJvY2Vzc0JhY2tncm91bmRGb3JTaGFwZShlLHQsbCxhKXtpZigic2hhcGUiPT09bCl7dmFyIG89dCYmZ2V0Q29tcHV0ZWRTdHlsZSh0KSxuO2lmKG8paWYoKG8mJm8uYmFja2dyb3VuZEltYWdlfHx0LmdldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbCIpKSYmImZpeGVkIj09PW8uYmFja2dyb3VuZEF0dGFjaG1lbnQpe2UucmVtb3ZlQ2hpbGQodC5wYXJlbnROb2RlKSxlLmFwcGVuZENoaWxkKHQpO3ZhciByPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJoZWlnaHQiKTtyPXQzOTZfZWxlbV9fZ2V0SGVpZ2h0KGUscikscj10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZSwiaGVpZ2h0IixyKTt2YXIgaT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwid2lkdGgiKTtpPXQzOTZfZWxlbV9fZ2V0V2lkdGgoZSxpKSxpPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLCJ3aWR0aCIsaSk7dmFyIGM9cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwidG9wIikpLF89cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwibGVmdCIpKTtlLnN0eWxlLnRvcD1jKmErInB4IixlLnN0eWxlLmxlZnQ9XyphKyJweCIsZS5zdHlsZS5oZWlnaHQ9ciphKyJweCIsZS5zdHlsZS53aWR0aD1pKmErInB4IixlLnNldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZS1vZmYiLCJ5ZXMiKX19fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX2dldEVsZW1lbnRUeXBlKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3JldHVybiF0JiZlLmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSYmKHQ9Imdyb3VwIiksdH13aW5kb3cudDM5Nl9pbml0aWFsU2NhbGV8fCh3aW5kb3cudDM5Nl9pbml0aWFsU2NhbGU9ZnVuY3Rpb24oKXt9KTsKCndpbmRvdy5UaWxkYT13aW5kb3cuVGlsZGF8fHt9LGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSx0PS0xIT09ZS5pbmRleE9mKCJtc2llIikmJnBhcnNlSW50KGUuc3BsaXQoIm1zaWUiKVsxXSk7aWYoOD09PXR8fDk9PT10KXt2YXIgcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1idG4iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJocmVmIik7ZS5xdWVyeVNlbGVjdG9yKCJ0YWJsZSIpJiZ0JiYtMT09PXQuaW5kZXhPZigiI3BvcHVwOiIpJiYtMT09PXQuaW5kZXhPZigiI3ByaWNlOiIpJiZlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJocmVmIik7ZS5wcmV2ZW50RGVmYXVsdCgpLHdpbmRvdy5sb2NhdGlvbi5ocmVmPXR9KSl9KSl9dHJ5e3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksaT1hP2EuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWNvb2tpZSIpOm51bGw7YSYmIm5vIj09PWl8fFRpbGRhLnNhdmVVVE0oKX1jYXRjaChuKXt9dmFyIG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIiKTtmdW5jdGlvbiBjKGUpe3ZhciB0PWUudGFyZ2V0LmNsb3Nlc3QoImEuanMtY2xpY2stc3RhdCIpfHxlLnRhcmdldC5jbG9zZXN0KCIuanMtY2xpY2stemVyby1zdGF0Iik7aWYoZS50YXJnZXQmJnQpe3ZhciByPWUuY3VycmVudFRhcmdldCxhO2lmKHQuY2xvc2VzdCgiLnIiKSE9PXIpcmV0dXJuO3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWV2ZW50LW5hbWUiKSxvPXQudGV4dENvbnRlbnQsYz10LmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIixkPXQuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSxuO2lmKCFpKWk9Ii90aWxkYS9jbGljay8iKyhyP3IuZ2V0QXR0cmlidXRlKCJpZCIpOiIiKSsiLz91cmw9IitjO2lmKFRpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcyhpLG8pLCJodHRwIj09PWMuc3Vic3RyaW5nKDAsNCkmJi0xPT09Yy5pbmRleE9mKCIudHlwZWZvcm0uY29tLyIpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cub3BlbihjLCJfYmxhbmsiPT09ZD8iX2JsYW5rIjoiX3NlbGYiKX0pLCJfYmxhbmsiPT09ZD8wOjMwMCksZS5wcmV2ZW50RGVmYXVsdCgpLCExfX1BcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKGUpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGMpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGMpfSkpO3ZhciBkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0LmpzLWFtb3VudCIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS52YWx1ZTt0PXQucmVwbGFjZSgvLC9nLCIuIiksdD1wYXJzZUZsb2F0KHQucmVwbGFjZSgvW14wLTlcLl0vZywiIikpLGUudmFsdWU9dH0pKX1UaWxkYS5zZW5kRWNvbW1lcmNlRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10fHwwPT09dC5sZW5ndGgpcmV0dXJuITE7aWYodm9pZCAwPT09ZXx8ImFkZCIhPT1lJiYicmVtb3ZlIiE9PWUmJiJwdXJjaGFzZSIhPT1lJiYiZGV0YWlsIiE9PWUpcmV0dXJuITE7Zm9yKHZhciByLGE9IiIsaT0wLG89W10sYyxkLG49IiIsbT0iIixsPSIiLHU9MDt1PHQubGVuZ3RoO3UrKyl7YT4iIiYmKGErPSIsICIpLGErPShkPXRbdV0pLm5hbWUsaSs9ZC5wcmljZSxjPSIiLHZvaWQgMCE9PWQub3B0aW9ucyYmZC5vcHRpb25zLmxlbmd0aD4wJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQub3B0aW9ucywoZnVuY3Rpb24oZSl7Yys9ZS5vcHRpb24rIjogIitlLnZhcmlhbnQrIjsgIn0pKTt2YXIgcD17bmFtZTpkLm5hbWUscHJpY2U6ZC5wcmljZSx2YXJpYW50OmMscXVhbnRpdHk6MX07ZC5pZCYmZC5pZD4wJiYoaWQ9ZC5pZCxwLmlkPWQuaWQpLGQudWlkJiZkLnVpZD4wJiYobT1kLnVpZCxwLnVpZD1kLnVpZCksZC5yZWNpZCYmZC5yZWNpZD4wJiYobj1kLnJlY2lkLHAucmVjaWQ9ZC5yZWNpZCksZC5saWQmJmQubGlkPjAmJihsPWQubGlkLHAubGlkPWQubGlkKSxkLnNrdSYmZC5za3U+MCYmKHAuc2t1PWQuc2t1KSxvW28ubGVuZ3RoXT1wfXZhciBwOyJhZGQiIT09ZSYmInJlbW92ZSIhPT1lfHwocj0iL3RpbGRhL2NhcnQvIitlKyIvIixuPjAmJihyKz0iIituKSxtPjA/cis9Ii11IittOmw+MCYmKHIrPSItIitsKSksImRldGFpbCI9PT1lJiYocj0iL3RpbGRhL3Byb2R1Y3QvZGV0YWlsLyIsbT4wP3IrPW0rIi8iOihuPjAmJihyKz0iciIrbiksbD4wJiYocis9Ii1sIitsKSkpLCJwdXJjaGFzZSI9PT1lJiYocj0iL3RpbGRhL3JlYyIrbisiL3BheW1lbnQvIiksKHA9e2Vjb21tZXJjZTp7fX0pLmVjb21tZXJjZVtlXT17cHJvZHVjdHM6b30sVGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzKHIsYSxwLGkpfSxUaWxkYS5zZW5kRXZlbnRUb1N0YXRpc3RpY3M9ZnVuY3Rpb24oZSx0LHIsYSl7dmFyIGk9Ii8iPT09ZS5zdWJzdHJpbmcoMCwxKSxvPVtdLGMsZDsoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpKSYmKGQ9bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkYXRhLWZiLWV2ZW50Iik/Yy5nZXRBdHRyaWJ1dGUoImRhdGEtZmItZXZlbnQiKTp3aW5kb3cualF1ZXJ5JiZ2b2lkIDAhPT1qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgiZmItZXZlbnQiKT9qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgiZmItZXZlbnQiKTpudWxsKTt2YXIgbj0hKCFkfHwibm9zZW5kIiE9PWQpLG09Yz9jLmdldEF0dHJpYnV0ZSgiZGF0YS12ay1ldmVudCIpOm51bGw7YyYmKG09bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkYXRhLXZrLWV2ZW50Iik/Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdmstZXZlbnQiKTp3aW5kb3cualF1ZXJ5JiZ2b2lkIDAhPT1qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgidmstZXZlbnQiKT9qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgidmstZXZlbnQiKTpudWxsKTt2YXIgbD0hKCFtfHwibm9zZW5kIiE9PW0pLHU9IiIscD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDcwNiIpO2lmKHU9Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY3VycmVuY3kiKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1jdXJyZW5jeSIpOnAmJnAuZ2V0QXR0cmlidXRlKCJkYXRhLXByb2plY3QtY3VycmVuY3ktY29kZSIpP3AuZ2V0QXR0cmlidXRlKCJkYXRhLXByb2plY3QtY3VycmVuY3ktY29kZSIpOiJSVUIiLHJ8fChyPXdpbmRvdy5sb2NhdGlvbi5ocmVmKSwoYT1hP3BhcnNlRmxvYXQoYSk6MCk+MClpZih3aW5kb3cuZGF0YUxheWVyfHwod2luZG93LmRhdGFMYXllcj1bXSksLTEhPT1lLmluZGV4T2YoIi90aWxkYS8iKSYmLTEhPT1lLmluZGV4T2YoIi9wYXltZW50LyIpJiZ3aW5kb3cudGlsZGFGb3JtJiZ3aW5kb3cudGlsZGFGb3JtLm9yZGVySWRGb3JTdGF0PiIiKXI9e2Vjb21tZXJjZTp7cHVyY2hhc2U6e2FjdGlvbkZpZWxkOntpZDp3aW5kb3cudGlsZGFGb3JtLm9yZGVySWRGb3JTdGF0LHJldmVudWU6d2luZG93LnRpbGRhRm9ybS5hbW91bnRGb3JTdGF0fSxwcm9kdWN0czp3aW5kb3cudGlsZGFGb3JtLmFyUHJvZHVjdHNGb3JTdGF0fX19LHdpbmRvdy50aWxkYUZvcm0udGlsZGFwYXltZW50JiZ3aW5kb3cudGlsZGFGb3JtLnRpbGRhcGF5bWVudC5wcm9tb2NvZGUmJihyLmVjb21tZXJjZS5wdXJjaGFzZS5hY3Rpb25GaWVsZC5jb3Vwb249d2luZG93LnRpbGRhRm9ybS50aWxkYXBheW1lbnQucHJvbW9jb2RlKSxyLmV2ZW50PSJwdXJjaGFzZSI7ZWxzZSBpZihyJiZyLmVjb21tZXJjZSYmKHIuZWNvbW1lcmNlLmFkZCYmci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzP289ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzOnIuZWNvbW1lcmNlLnJlbW92ZSYmci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzP289ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzOnIuZWNvbW1lcmNlLmRldGFpbCYmci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzJiYobz1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMpLG8mJm8ubGVuZ3RoPjApKXtmb3IodmFyIHM9MDtzPG8ubGVuZ3RoO3MrKylvW3NdLmlkfHwob1tzXS51aWQ/b1tzXS5pZD1vW3NdLnVpZDpvW3NdLnNrdT9vW3NdLmlkPW9bc10uc2t1Om9bc10ucmVjaWQmJm9bc10ubGlkJiYob1tzXS5pZD1vW3NdLnJlY2lkKyJfIitvW3NdLmxpZCkpO3IuZWNvbW1lcmNlLmFkZCYmci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzPyhyLmVjb21tZXJjZS5hZGQucHJvZHVjdHM9byxyLmV2ZW50PSJhZGRUb0NhcnQiKTpyLmVjb21tZXJjZS5yZW1vdmUmJnIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0cz8oci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzPW8sci5ldmVudD0icmVtb3ZlRnJvbUNhcnQiKTpyLmVjb21tZXJjZS5kZXRhaWwmJnIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cz8oci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzPW8sci5ldmVudD0idmlld1Byb2R1Y3QiKTooaT8oci5ldmVudD0icGFnZVZpZXciLHIuZXZlbnRBY3Rpb249ZSk6ci5ldmVudD1lLHIudGl0bGU9dCxyLnZhbHVlPWEpfXZvaWQgMCE9PXdpbmRvdy5kYXRhTGF5ZXImJihpP2E+MD9yJiZyLmVjb21tZXJjZT93aW5kb3cuZGF0YUxheWVyLnB1c2gocik6d2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDoicGFnZVZpZXciLGV2ZW50QWN0aW9uOmUsdGl0bGU6dCx2YWx1ZTphLHByb2R1Y3Q6cn0pOndpbmRvdy5kYXRhTGF5ZXIucHVzaCh7ZXZlbnQ6InBhZ2VWaWV3IixldmVudEFjdGlvbjplLHRpdGxlOnQscmVmZXJlcjpyfSk6ciYmci5lY29tbWVyY2U/d2luZG93LmRhdGFMYXllci5wdXNoKHIpOndpbmRvdy5kYXRhTGF5ZXIucHVzaCh7ZXZlbnQ6ZSxldmVudEFjdGlvbjp0LHZhbHVlOmEscmVmZXJlcjpyfSkpO3RyeXt2YXIgdjtpZih3aW5kb3cuZ3RhZ1RyYWNrZXJJRCYmImd0YWciPT09d2luZG93Lm1haW5UcmFja2VyKWlmKGkpaWYociYmci5ldmVudClpZigicHVyY2hhc2UiPT09ci5ldmVudCl7Zm9yKHZhciBvPXIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzLHc9MCxnPTA7ZzxvLmxlbmd0aDtnKyspaWYoImRlbGl2ZXJ5Ij09PW9bZ10uaWQpe3c9b1tnXTticmVha31ndGFnKCJldmVudCIsInB1cmNoYXNlIix7dHJhbnNhY3Rpb25faWQ6ci5lY29tbWVyY2UucHVyY2hhc2UuYWN0aW9uRmllbGQuaWQsdmFsdWU6cGFyc2VGbG9hdChhKS50b0ZpeGVkKDIpLGN1cnJlbmN5OnUsc2hpcHBpbmc6dyxpdGVtczpyLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0c30pfWVsc2UiYWRkVG9DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmFkZD9ndGFnKCJldmVudCIsImFkZF90b19jYXJ0Iix7aXRlbXM6ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzfSk6InJlbW92ZUZyb21DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLnJlbW92ZT9ndGFnKCJldmVudCIsInJlbW92ZV9mcm9tX2NhcnQiLHtpdGVtczpyLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHN9KToidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsJiZndGFnKCJldmVudCIsInZpZXdfaXRlbSIse2l0ZW1zOnIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0c30pO2Vsc2UhIXdpbmRvdy5ndGFnVHJhY2tlcklEJiYtMSE9PXdpbmRvdy5ndGFnVHJhY2tlcklELmluZGV4T2YoIlVBLSIpP2d0YWcoImNvbmZpZyIsd2luZG93Lmd0YWdUcmFja2VySUQse3BhZ2VfdGl0bGU6dCxwYWdlX3BhdGg6ZX0pOmd0YWcoImV2ZW50Iix3aW5kb3cuZ3RhZ1RyYWNrZXJJRCx7cGFnZV90aXRsZTp0LHBhZ2VfcGF0aDplLHNlbmRfdG86d2luZG93Lmd0YWdUcmFja2VySUR9KTtlbHNlIGd0YWcoImV2ZW50IixlLHtldmVudF9jYXRlZ29yeToidGlsZGEiLGV2ZW50X2xhYmVsOnQsdmFsdWU6YX0pfWNhdGNoKHgpe31pZih3aW5kb3cuZ2EmJiJ0aWxkYSIhPT13aW5kb3cubWFpblRyYWNrZXImJiJndGFnIiE9PXdpbmRvdy5tYWluVHJhY2tlcilpZihpKWlmKHImJnIuZXZlbnQpe3RyeXtpZih3aW5kb3cuVGlsZGEuaXNMb2FkR0FFY29tbWVyY2V8fCh3aW5kb3cuVGlsZGEuaXNMb2FkR0FFY29tbWVyY2U9ITAsZ2EoInJlcXVpcmUiLCJlYyIpKSxnYSgic2V0IiwiY3VycmVuY3lDb2RlIix1KSwicHVyY2hhc2UiPT09ci5ldmVudCl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHMubGVuZ3RoLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHNbZ10sZ2EoImVjOmFkZFByb2R1Y3QiLHtpZDpmLmlkfHxnLG5hbWU6Zi5uYW1lLHByaWNlOnBhcnNlRmxvYXQoZi5wcmljZSkudG9GaXhlZCgyKSxxdWFudGl0eTpmLnF1YW50aXR5fSk7Z2EoImVjOnNldEFjdGlvbiIsInB1cmNoYXNlIix7aWQ6ci5lY29tbWVyY2UucHVyY2hhc2UuYWN0aW9uRmllbGQuaWQscmV2ZW51ZTpwYXJzZUZsb2F0KGEpLnRvRml4ZWQoMil9KX1lbHNlIGlmKCJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHMubGVuZ3RoLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzW2ddLGdhKCJlYzphZGRQcm9kdWN0Iix7aWQ6Zi5pZHx8ZyxuYW1lOmYubmFtZSxwcmljZTpwYXJzZUZsb2F0KGYucHJpY2UpLnRvRml4ZWQoMikscXVhbnRpdHk6Zi5xdWFudGl0eX0pO2dhKCJlYzpzZXRBY3Rpb24iLCJhZGQiKX1lbHNlIGlmKCJyZW1vdmVGcm9tQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5yZW1vdmUpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0cy5sZW5ndGgsZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHNbZ10sZ2EoImVjOmFkZFByb2R1Y3QiLHtpZDpmLmlkfHxnLG5hbWU6Zi5uYW1lLHByaWNlOnBhcnNlRmxvYXQoZi5wcmljZSkudG9GaXhlZCgyKSxxdWFudGl0eTpmLnF1YW50aXR5fSk7Z2EoImVjOnNldEFjdGlvbiIsInJlbW92ZSIpfWVsc2UgaWYoInZpZXdQcm9kdWN0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmRldGFpbCl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzLmxlbmd0aCxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0c1tnXSxnYSgiZWM6YWRkUHJvZHVjdCIse2lkOmYuaWR8fGcsbmFtZTpmLm5hbWUscHJpY2U6cGFyc2VGbG9hdChmLnByaWNlKS50b0ZpeGVkKDIpLHF1YW50aXR5OmYucXVhbnRpdHl9KTtnYSgiZWM6c2V0QWN0aW9uIiwiZGV0YWlsIil9fWNhdGNoKHgpe31nYSgic2VuZCIse2hpdFR5cGU6InBhZ2V2aWV3IixwYWdlOmUsdGl0bGU6dCxwYXJhbXM6cn0pfWVsc2UgZ2EoInNlbmQiLHtoaXRUeXBlOiJwYWdldmlldyIscGFnZTplLHRpdGxlOnR9KTtlbHNlIGdhKCJzZW5kIix7aGl0VHlwZToiZXZlbnQiLGV2ZW50Q2F0ZWdvcnk6InRpbGRhIixldmVudEFjdGlvbjplLGV2ZW50TGFiZWw6dCxldmVudFZhbHVlOmF9KTtpZih3aW5kb3cubWFpbk1ldHJpa2FJZCYmd2luZG93Lm1haW5NZXRyaWthSWQ+MCYmImZ1bmN0aW9uIj09dHlwZW9mIHltKWlmKGkpe3ZhciBoPXt0aXRsZTp0fTthPjA/KGgucGFyYW1zPXtvcmRlcl9wcmljZTphfSx1JiYoaC5wYXJhbXMuY3VycmVuY3k9dSkseW0od2luZG93Lm1haW5NZXRyaWthSWQsImhpdCIsZSxoKSk6eW0od2luZG93Lm1haW5NZXRyaWthSWQsImhpdCIsZSxoKX1lbHNlIGE+MD8oaD17b3JkZXJfcHJpY2U6YX0sdSYmKGguY3VycmVuY3k9dSkseW0od2luZG93Lm1haW5NZXRyaWthSWQsInJlYWNoR29hbCIsZSxoKSk6eW0od2luZG93Lm1haW5NZXRyaWthSWQsInJlYWNoR29hbCIsZSk7aWYod2luZG93Lm1haW5NZXRyaWthPiIiJiZ3aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXSYmKGk/YT4wP3dpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLmhpdChlLHt0aXRsZTp0LG9yZGVyX3ByaWNlOmEscGFyYW1zOnJ9KTp3aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXS5oaXQoZSx7dGl0bGU6dH0pOmE+MD93aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXS5yZWFjaEdvYWwoZSx7dGl0bGU6dCxwYXJhbXM6cixvcmRlcl9wcmljZTphfSk6d2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0ucmVhY2hHb2FsKGUse3RpdGxlOnQscmVmZXJlcjpyfSkpLHZvaWQgMCE9PXdpbmRvdy5mYnEmJiExPT09bil0cnl7aWYoaSlpZigtMT09PWUuaW5kZXhPZigidGlsZGEvIil8fC0xPT09ZS5pbmRleE9mKCIvcGF5bWVudC8iKSYmLTE9PT1lLmluZGV4T2YoIi9zdWJtaXR0ZWQvIikpaWYociYmci5ldmVudCYmYT4wKWlmKCJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHNbZ10say5wdXNoKGYuaWR8fGYudWlkfHxmLm5hbWUpO3dpbmRvdy5mYnEoInRyYWNrIiwiQWRkVG9DYXJ0Iix7Y29udGVudF9pZHM6ayxjb250ZW50X3R5cGU6InByb2R1Y3QiLHZhbHVlOmEsY3VycmVuY3k6dX0pfWVsc2UgaWYoInZpZXdQcm9kdWN0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmRldGFpbCl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzW2ddLGsucHVzaChmLmlkfHxmLnVpZHx8Zi5uYW1lKTt3aW5kb3cuZmJxKCJ0cmFjayIsIlZpZXdDb250ZW50Iix7Y29udGVudF9pZHM6ayxjb250ZW50X3R5cGU6InByb2R1Y3QiLHZhbHVlOmEsY3VycmVuY3k6dX0pfWVsc2UgZS5pbmRleE9mKCJ0aWxkYS9wb3B1cCIpLHdpbmRvdy5mYnEoInRyYWNrIiwiVmlld0NvbnRlbnQiLHtjb250ZW50X25hbWU6dCxjb250ZW50X2NhdGVnb3J5OmV9KTtlbHNlIGUuaW5kZXhPZigidGlsZGEvcG9wdXAiKSx3aW5kb3cuZmJxKCJ0cmFjayIsIlZpZXdDb250ZW50Iix7Y29udGVudF9uYW1lOnQsY29udGVudF9jYXRlZ29yeTplfSk7ZWxzZSBhPjAmJnU/d2luZG93LmZicSgidHJhY2siLCJJbml0aWF0ZUNoZWNrb3V0Iix7Y29udGVudF9uYW1lOnQsY29udGVudF9jYXRlZ29yeTplLHZhbHVlOmEsY3VycmVuY3k6dX0pOndpbmRvdy5mYnEoInRyYWNrIiwiTGVhZCIse2NvbnRlbnRfbmFtZTp0LGNvbnRlbnRfY2F0ZWdvcnk6ZX0pO2Vsc2Ugd2luZG93LmZicSgidHJhY2siLGUse2NvbnRlbnRfbmFtZTp0LHZhbHVlOmF9KX1jYXRjaCh4KXt9aWYodm9pZCAwIT09d2luZG93LlZLJiZ2b2lkIDAhPT13aW5kb3cuVksuUmV0YXJnZXRpbmcmJiExPT09bCl0cnl7aWYoaSl7dmFyIGMsXz0oYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS12ay1wcmljZS1saXN0LWlkIik6bnVsbCxiPV8mJnBhcnNlSW50KF8pfHwwLFQ9IiIsQT0hMSxGLEYsRixGLEY7aWYociYmci5ldmVudClpZihBPXtwcm9kdWN0czpbXSxjdXJyZW5jeV9jb2RlOiIiLHRvdGFsX3ByaWNlOjB9LCJwdXJjaGFzZSI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5wdXJjaGFzZSlpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHNbZ10sQS5wcm9kdWN0cy5wdXNoKHtpZDpmLmlkfHxmLnVpZHx8Zi5uYW1lLHByaWNlOmYucHJpY2U/Zi5wcmljZTowfSksQS50b3RhbF9wcmljZT1hO1Q9ImluaXRfY2hlY2tvdXQifWVsc2UgVD0idC1wdXJjaGFzZSI7ZWxzZSBpZigiYWRkVG9DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmFkZClpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0iYWRkX3RvX2NhcnQifWVsc2UgVD0idC1hZGQtdG8tY2FydCIsci5lY29tbWVyY2UuYWRkWzBdJiZyLmVjb21tZXJjZS5hZGRbMF0udWlkJiYoVCs9Ii0iK3IuZWNvbW1lcmNlLmFkZFswXS51aWQpO2Vsc2UgaWYoInZpZXdQcm9kdWN0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmRldGFpbClpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0idmlld19wcm9kdWN0In1lbHNlIFQ9InQtdmlldy1wcm9kdWN0IixyLmVjb21tZXJjZS5kZXRhaWxbMF0mJnIuZWNvbW1lcmNlLmRldGFpbFswXS51aWQmJihUKz0iLSIrci5lY29tbWVyY2UuZGV0YWlsWzBdLnVpZCk7ZWxzZSBpZigicmVtb3ZlRnJvbUNhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UucmVtbW92ZSlpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0icmVtb3ZlX2Zyb21fY2FydCJ9ZWxzZSBUPSJ0LXJlbW92ZS1wcm9kdWN0IixyLmVjb21tZXJjZS5yZW1vdmVbMF0mJnIuZWNvbW1lcmNlLnJlbW92ZVswXS51aWQmJihUKz0iLSIrci5lY29tbWVyY2UucmVtb3ZlWzBdLnVpZCk7ZWxzZSBUPXIuZXZlbnQ7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvIikmJi0xIT09ZS5pbmRleE9mKCIvcGF5bWVudC8iKSlUPSJ0LXB1cmNoYXNlLSIrKEY9KEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoInRpbGRhLyIsIiIpKS5yZXBsYWNlKCIvcGF5bWVudC8iLCIiKSk7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvIikmJi0xIT09ZS5pbmRleE9mKCIvc3VibWl0dGVkLyIpKVQ9InQtbGVhZC0iKyhGPShGPShGPWUucmVwbGFjZSgiL3RpbGRhLyIsIiIpKS5yZXBsYWNlKCJ0aWxkYS8iLCIiKSkucmVwbGFjZSgiL3N1Ym1pdHRlZC8iLCIiKSk7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvcG9wdXAiKSlUPSJ0LSIrKEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoIi8iLCItIikpO2Vsc2UgaWYoLTEhPT1lLmluZGV4T2YoInRpbGRhL2NsaWNrIikpVD0idC0iKyhGPShGPWUucmVwbGFjZSgiL3RpbGRhLyIsIiIpKS5yZXBsYWNlKCIvIiwiLSIpKTtlbHNlIFQ9InQtIisoRj1lLnJlcGxhY2UoIi8iLCItIikpO2I+MCYmQSYmQS5jdXJyZW5jeV9jb2RlPyhWSy5SZXRhcmdldGluZy5FdmVudCgicHVyY2hhc2UiKSxWSy5SZXRhcmdldGluZy5Qcm9kdWN0RXZlbnQoYixULEEpKTooVksuUmV0YXJnZXRpbmcuRXZlbnQoVCksInQtcHVyY2hhc2UiPT09VC5zdWJzdHJpbmcoMCwxMCk/VksuR29hbCgicHVyY2hhc2UiKToidC1sZWFkIj09PVQuc3Vic3RyaW5nKDAsNikmJlZLLkdvYWwoImxlYWQiKSl9ZWxzZSBWSy5SZXRhcmdldGluZy5FdmVudChlKX1jYXRjaCh4KXt9aWYod2luZG93Lm1haW5NYWlscnVJZD4iMCIpe3ZhciBFPXdpbmRvdy5fdG1yfHwod2luZG93Ll90bXI9W10pO2k/YT4wP0UucHVzaCh7aWQ6IiIrd2luZG93Lm1haW5NYWlscnVJZCx0eXBlOiJwYWdlVmlldyIsdXJsOmUsdmFsdWU6YSxzdGFydDoobmV3IERhdGUpLmdldFRpbWUoKX0pOkUucHVzaCh7aWQ6IiIrd2luZG93Lm1haW5NYWlscnVJZCx0eXBlOiJwYWdlVmlldyIsdXJsOmUsc3RhcnQ6KG5ldyBEYXRlKS5nZXRUaW1lKCl9KTphPjA/RS5wdXNoKHtpZDoiIit3aW5kb3cubWFpbk1haWxydUlkLHR5cGU6InJlYWNoR29hbCIsZ29hbDplLHZhbHVlOmF9KTpFLnB1c2goe2lkOiIiK3dpbmRvdy5tYWluTWFpbHJ1SWQsdHlwZToicmVhY2hHb2FsIixnb2FsOmV9KX0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnRpbGRhc3RhdCYmKGk/KGUuaW5kZXhPZigicGF5bWVudCIpPjAmJmUuaW5kZXhPZigidGlsZGEvZm9ybSIpPi0xJiYoZT1lLnJlcGxhY2UoInRpbGRhL2Zvcm0iLCJ0aWxkYS9yZWMiKSksd2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciLHtwYWdlOmV9KSk6d2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciLHtwYWdlOiIvdGlsZGEvZXZlbnQvIitlfSkpfSxUaWxkYS5zYXZlVVRNPWZ1bmN0aW9uKCl7dHJ5e3ZhciBlPXdpbmRvdy5sb2NhdGlvbi5ocmVmLHQ9IiIscj0iIjtpZigtMSE9PWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ1dG1fIikmJiJzdHJpbmciPT10eXBlb2YodD0odD0oZT1lLnRvTG93ZXJDYXNlKCkpLnNwbGl0KCI/IikpWzFdKSl7dmFyIGEsaT10LnNwbGl0KCImIik7Zm9yKHZhciBvIGluIGkpImFtcDsiPT09KGE9aVtvXS5zcGxpdCgiPSIpKVswXS5zdWJzdHJpbmcoMCw0KSYmKGFbMF09YVswXS5zdWJzdHJpbmcoNCkpLCJ1dG1fIj09PWFbMF0uc3Vic3RyaW5nKDAsNCkmJihyPXIraVtvXSsifHx8Iik7aWYoci5sZW5ndGg+MCl7dmFyIGM9bmV3IERhdGU7Yy5zZXREYXRlKGMuZ2V0RGF0ZSgpKzMwKSxkb2N1bWVudC5jb29raWU9IlRJTERBVVRNPSIrZW5jb2RlVVJJQ29tcG9uZW50KHIpKyI7IHBhdGg9LzsgZXhwaXJlcz0iK2MudG9VVENTdHJpbmcoKX19fWNhdGNoKGQpe319LCJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZSgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpfSgpLEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXN8fChFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzPUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm1vek1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5vTWF0Y2hlc1NlbGVjdG9yKSxFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0fHwoRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpczt0JiYxPT09dC5ub2RlVHlwZTspe2lmKEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMuY2FsbCh0LGUpKXJldHVybiB0O3Q9dC5wYXJlbnRFbGVtZW50fHx0LnBhcmVudE5vZGV9cmV0dXJuIG51bGx9KTsKCiFmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7ZnVuY3Rpb24gdCgpe3ZhciBlPU1hdGguZmxvb3IoODk5OTk5Kk1hdGgucmFuZG9tKCkpKzFlNTtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKSsiLiIrZX1mdW5jdGlvbiBuKGUpe3ZhciB0PWUucmVwbGFjZSgvKFtcLiQ/Knx7fVwoXClcW1xdXFxcL1wrXl0pL2csIlxcJDEiKSxuPW5ldyBSZWdFeHAoIig/Ol58OyApIit0KyI9KFteO10qKSIpLG89ZG9jdW1lbnQuY29va2llLm1hdGNoKG4pO2lmKG8pcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChvWzFdKX1mdW5jdGlvbiBvKGUsdCxuKXt2YXIgbz1uLmV4cGlyZXM7aWYoIW8pcmV0dXJuITE7aWYoIm51bWJlciI9PXR5cGVvZiBvKXt2YXIgaT0obmV3IERhdGUpLmdldFRpbWUoKSsxZTMqbzsobz1uZXcgRGF0ZShpKSkudG9VVENTdHJpbmcmJihuLmV4cGlyZXM9by50b1VUQ1N0cmluZygpKX12YXIgYT1lKyI9IisodD1lbmNvZGVVUklDb21wb25lbnQodCkpO2Zvcih2YXIgciBpbiBuKWErPSI7ICIrciwhMCE9PW5bcl0mJihhKz0iPSIrbltyXSk7ZG9jdW1lbnQuY29va2llPWF9ZnVuY3Rpb24gaShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBhKGUpe3ZhciB0PSEwO2lmKCFlKXRocm93IG5ldyBFcnJvcigibm8gY2FsbGJhY2sgZ2l2ZW4iKTtmdW5jdGlvbiBuKCl7dHx8ZSh0PSEwKX1mdW5jdGlvbiBvKCl7dCYmZSh0PSExKX0iaGlkZGVuImluIGRvY3VtZW50JiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQuaGlkZGVuP286bikoKX0pKSwibW96SGlkZGVuImluIGRvY3VtZW50JiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3p2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQubW96SGlkZGVuP286bikoKX0pKSwid2Via2l0SGlkZGVuImluIGRvY3VtZW50JiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQud2Via2l0SGlkZGVuP286bikoKX0pKSwibXNIaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1zdmlzaWJpbGl0eWNoYW5nZSIsKGZ1bmN0aW9uKCl7KGRvY3VtZW50Lm1zSGlkZGVuP286bikoKX0pKSwib25mb2N1c2luImluIGRvY3VtZW50JiYoZG9jdW1lbnQub25mb2N1c2luPW4sZG9jdW1lbnQub25mb2N1c291dD1vKSx3aW5kb3cub25wYWdlc2hvdz13aW5kb3cub25mb2N1cz1uLHdpbmRvdy5vbnBhZ2VoaWRlPXdpbmRvdy5vbmJsdXI9b31mdW5jdGlvbiByKCl7dmFyIGU9d2luZG93LnBhZ2VZT2Zmc2V0LHQ9d2luZG93LmlubmVySGVpZ2h0LG49TWF0aC5tYXgoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpLG89MCxpPTA7dj0hMDt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidC1oZWFkZXIiKSxyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0LWZvb3RlciIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhY29weSIpO2EmJihvPWEub2Zmc2V0SGVpZ2h0KSxyJiYoaT1yLm9mZnNldEhlaWdodCksZCYmKGkrPWQub2Zmc2V0SGVpZ2h0KTt2YXIgYz1NYXRoLmZsb29yKDEwMCooZS1vK3QpLyhuLW8taSkpO2lmKCEoYzwxMCkpZm9yKHZhciBzPVsxMCwyNSw1MCw3NSw5MF0sbD0wO2w8cy5sZW5ndGg7bCsrKXt2YXIgdT1zW2xdLGc9cy5sZW5ndGgtMTtpZigwPT09bCYmYz49dSYmIXdbInAiK3VdKW0ucGFnZT0iL3RpbGRhL3Njcm9sbC8iK3UrIi8iLHdpbmRvdy50aWxkYXN0YXQoInBhZ2V2aWV3Iiksd1sicCIrdV09ITA7ZWxzZSBpZihjPj11LTEpe2lmKDA9PT13WyJwIit1XSl7bS5wYWdlPSIvdGlsZGEvc2Nyb2xsLyIrdSsiLyIsd2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciKSx3WyJwIit1XT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2NsZWFyVGltZW91dCh3WyJwIit1XSksd1sicCIrdV09LTF9KSw1ZTMpO2JyZWFrfWlmKChsIT09ZyYmYzxzW2wrMV18fGw9PT1nKSYmLTE9PT13WyJwIit1XSl7d1sicCIrdV09MDticmVha319fX1mdW5jdGlvbiBkKCl7dmFyIGU9MD09PXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5pbmRleE9mKCJ3d3cuIik/d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNsaWNlKDQpOndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtyZXR1cm4gZS5sYXN0SW5kZXhPZigiLiIpPT09ZS5sZW5ndGgtMSYmKGU9ZS5zbGljZSgwLC0xKSksZSt3aW5kb3cubG9jYXRpb24ucGF0aG5hbWV9ZnVuY3Rpb24gYyhlKXtmb3IodmFyIHQ9QXJyYXkoZS5sZW5ndGgpLG49MDtuPGUubGVuZ3RoO24rKyl0W25dPW47cmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0LChmdW5jdGlvbih0KXtyZXR1cm4gZS5jaGFyQ29kZUF0KHQpLnRvU3RyaW5nKDE2KX0pKS5qb2luKCIiKX1mdW5jdGlvbiBzKCl7dmFyIGU9KG5hdmlnYXRvci5jb29raWVFbmFibGVkPyJjVCI6ImNGIikrInwiKyhuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5PyJkbSIrbmF2aWdhdG9yLmRldmljZU1lbW9yeToiZG0iKSsifCIrKG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5PyJoYyIrbmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k6ImhjIikrInwiKyhuYXZpZ2F0b3IubGFuZ3VhZ2VzPyJsIituYXZpZ2F0b3IubGFuZ3VhZ2VzLmpvaW4oIiwiKToibCIpKyJ8IjtpZihuYXZpZ2F0b3IucGxhdGZvcm18fG5hdmlnYXRvci5hcHBOYW1lP2UrPShuYXZpZ2F0b3IucGxhdGZvcm0/InAiK25hdmlnYXRvci5wbGF0Zm9ybToicCIpKyJ8IisobmF2aWdhdG9yLnZlbmRvcj8idiIrbmF2aWdhdG9yLnZlbmRvcjoidiIpKyJ8IisobmF2aWdhdG9yLmFwcENvZGVOYW1lPyJhIituYXZpZ2F0b3IuYXBwQ29kZU5hbWU6ImEiKSsifCIrKG5hdmlnYXRvci5hcHBOYW1lPyJuIituYXZpZ2F0b3IuYXBwTmFtZToibiIpKyJ8IjplKz0obmF2aWdhdG9yLnVzZXJBZ2VudD8idWEiK25hdmlnYXRvci51c2VyQWdlbnQ6InVhIikrInwiLG5hdmlnYXRvci5wbHVnaW5zKXt2YXIgdCxuLG89IiI7Zm9yKG49bmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoPjIwPzIwOm5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aCx0PTA7dDxuO3QrKyluYXZpZ2F0b3IucGx1Z2luc1t0XSYmbmF2aWdhdG9yLnBsdWdpbnNbdF0uZmlsZW5hbWU/bys9bmF2aWdhdG9yLnBsdWdpbnNbdF0uZmlsZW5hbWU6bmF2aWdhdG9yLnBsdWdpbnNbdF0mJm5hdmlnYXRvci5wbHVnaW5zW3RdLm5hbWUmJihvKz1uYXZpZ2F0b3IucGx1Z2luc1t0XS5uYW1lKTtlKz0icGwiK28rInwifXJldHVybiBlKz0icHIiK3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKyJ8IixlKz0idyIrKHNjcmVlbiYmc2NyZWVuLndpZHRoP3NjcmVlbi53aWR0aDp3aW5kb3cuaW5uZXJXaWR0aCkrImgiKyhzY3JlZW4mJnNjcmVlbi5oZWlnaHQ/c2NyZWVuLmhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHQpKyJ8IixlKz0iY0QiKyhzY3JlZW4uY29sb3JEZXB0aD9zY3JlZW4uY29sb3JEZXB0aDoiIikrInwiLGUrPSJ0TyIrKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpKyJ8IixlPWMoZSs9Im1UIisodm9pZCAwIT09bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzP25hdmlnYXRvci5tYXhUb3VjaFBvaW50czp2b2lkIDAhPT1uYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50cz9uYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50czoiIikrInwiKX1mdW5jdGlvbiBsKCl7eD1uKCJ0aWxkYXVpZCIpLEU9bigidGlsZGFzaWQiKSxoPyh4fHwoeD0ic2ltcGxlIiksRXx8KEU9InNpbXBsZSIpKTooeHx8KHg9dCgpKSxFfHwoRT10KCkpKX1mdW5jdGlvbiB1KCl7dmFyIGU7aHx8KG8oInRpbGRhdWlkIix4LHtleHBpcmVzOjc3NzZlMyxwYXRoOiIvIn0pLG8oInRpbGRhc2lkIixFLHtleHBpcmVzOjE4MDAscGF0aDoiLyJ9KSl9ZnVuY3Rpb24gZyh0KXtpZihtLnVzZXJfYWdlbnQ+IiImJi0xIT1tLnVzZXJfYWdlbnQuaW5kZXhPZigiYm90IikpcmV0dXJuITE7aWYoImh0dHA6IiE9d2luZG93LmxvY2F0aW9uLnByb3RvY29sJiYiaHR0cHM6IiE9d2luZG93LmxvY2F0aW9uLnByb3RvY29sKXJldHVybiBjb25zb2xlLmxvZygiVGlsZGFTdGF0OiBjYW5ub3Qgd29yayBvbiBsb2NhbCBwYWdlIiksITE7dmFyIG47bCgpLHUoKSxtLnBhZ2U9ZCgpLG0ucmVmZXJyZXI9ZG9jdW1lbnQucmVmZXJyZXJ8fCIiLG0udXNlcmlkPXgsbS5zZXNzaW9uaWQ9RSxtLnVzZXJfYWdlbnQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsbS51c2VyX2xhbmd1YWdlPXdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlLGUmJihtLnByb2plY3RpZD1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wcm9qZWN0LWlkIil8fCIwIixtLnBhZ2VpZD1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wYWdlLWlkIil8fCIwIixtLnBhZ2VhbGlhcz1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wYWdlLWFsaWFzIil8fCIiLG0uZm9ybXNrZXk9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtZm9ybXNrZXkiKXx8IiIpLG0ucGFyYW1zPXt9O3RyeXtuPWRlY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uc2VhcmNoKX1jYXRjaChjKXtuPXdpbmRvdy5sb2NhdGlvbi5zZWFyY2h9aWYobj4iPyImJihtLnBhZ2VxdWVyeT1uLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpLH5tLnBhZ2VxdWVyeS5pbmRleE9mKCJ1dG1fIikpKXt2YXIgbyxpPW0ucGFnZXF1ZXJ5LnNwbGl0KCImIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbihlKXsobz1lLnNwbGl0KCI9IikpLmxlbmd0aD4xPyJ1dG1fcmVmZXJyZXIiIT09b1swXXx8bS5yZWZlcnJlciYmIX5tLnJlZmVycmVyLmluZGV4T2YoIm9oaW84LnYiKT9tLnBhcmFtc1tvWzBdXT1vWzFdOm0ucmVmZXJyZXI9b1sxXTptLnBhcmFtc1tvWzBdXT0iIn0pKX12YXIgcj0hMTtpZigvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihyPSEwKSxtLmlzbW9iaWxlPXIsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhc3RhdHNjcmlwdCIpJiYobS50aWxkYXN0YXRjb2RlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYXN0YXRzY3JpcHQiKS5rZXkpLGspdHJ5e2EoKGZ1bmN0aW9uKGUpe3Y9ISFlfSkpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dj0hMH0pLDFlMykpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigia2V5cHJlc3MiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dj0hMH0pLDFlMykpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dj0hMH0pLDFlMykpfWNhdGNoKGMpe31tLmZpbmdlcnByaW50PXMoKSxUPSEwfWZ1bmN0aW9uIHAoZSl7dmFyIHQ9Imh0dHBzOi8vc3RhdC50aWxkYWFwaS4iK0woKSsiL2V2ZW50LyIsaTtofHwobigidGlsZGFzaWQiKXx8IiIpIT1tLnNlc3Npb25pZCYmbygidGlsZGFzaWQiLG0uc2Vzc2lvbmlkLHtleHBpcmVzOjE4MDAscGF0aDoiLyJ9KTsiIj09PW0ucmVmZXJyZXImJihtLnJlZmVycmVyPW4oInByZXZpb3VzVXJsIil8fCIiKSxtLnRpbGRhdXRtPW4oIlRJTERBVVRNIil8fCIiLG0ucGFnZXx8KGNvbnNvbGUubG9nKCJUaWxkYVN0YXQ6IHBhZ2UgZW1wdHkiKSxtLnBhZ2U9ZCgpLHdpbmRvdy5sb2NhdGlvbi5oYXNoJiYwPT09d2luZG93LmxvY2F0aW9uLmhhc2guaW5kZXhPZigiIyEiKSYmKG0ucGFnZSs9d2luZG93LmxvY2F0aW9uLmhhc2gpKSwiLyI9PT1tLnBhZ2Uuc3Vic3RyaW5nKDAsMSkmJihtLnBhZ2U9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lK20ucGFnZSk7dmFyIGE9ZihtKSxyPW5ldyBYTUxIdHRwUmVxdWVzdDtyLm9wZW4oIlBPU1QiLHQsITApLHIud2l0aENyZWRlbnRpYWxzPSExLHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iiksci5vbmVycm9yPWZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoIlRpbGRhU3RhdDogZmFpbCBwYWdldmlldyAiKSxjb25zb2xlLmVycm9yKGUpfSxyLnRpbWVvdXQ9M2UzLHIuc2VuZChhKSxtLnBhZ2UmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL3Njcm9sbCIpJiYtMT09PW0ucGFnZS5pbmRleE9mKCJ0aWxkYS9yZWFkdGltZSIpJiYtMT09PW0ucGFnZS5pbmRleE9mKCJ0aWxkYS9jbGljayIpJiYtMT09PW0ucGFnZS5pbmRleE9mKCJ0aWxkYS9jb29raWVlbmFibGVkIikmJihtLnJlZmVycmVyPW0ucGFnZSxofHxvKCJwcmV2aW91c1VybCIsbS5wYWdlLHtwYXRoOiIvIixleHBpcmVzOjE4MDB9KSksbS5wYWdlPSIiLHdpbmRvdy50aWxkYXN0YXRsb2FkPSEwfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpaWYoIiIhPXQmJiJvYmplY3QiIT10eXBlb2YgZVtuXSYmKHQrPSImIiksIm9iamVjdCI9PXR5cGVvZiBlW25dKXtpZihPYmplY3Qua2V5cyhlW25dKS5sZW5ndGgpZm9yKHZhciBvIGluIGVbbl0pdCs9IiYiK24rIlsiK28rIl09IitlbmNvZGVVUklDb21wb25lbnQoZVtuXVtvXSl9ZWxzZSB0Kz1uKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtuXSk7cmV0dXJuIHR9d2luZG93LnRpbGRhc3RhdD1mdW5jdGlvbihlLHQpe2lmKCFlKXJldHVybiExO2lmKCJjcmVhdGUiIT09ZSYmIVQpcmV0dXJuIHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7d2luZG93LnRpbGRhc3RhdChlLHQpfSksMWUzKSwhMTtzd2l0Y2godCYmaShtLHQpLGUpe2Nhc2UiY3JlYXRlIjpnKHQpO2JyZWFrO2Nhc2UicGFnZXZpZXciOnAodCk7YnJlYWs7Y2FzZSJyZWFkdGltZSI6ayYmKHYmJihtLnBhZ2U9Ii90aWxkYS9yZWFkdGltZS8iLHY9ITEscCh0KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cudGlsZGFzdGF0KCJyZWFkdGltZSIpfSksMTVlMykpO2JyZWFrO2Nhc2Uic2Nyb2xsIjprJiYiZnVuY3Rpb24iPT10eXBlb2YgdF90aHJvdHRsZSYmd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtyKCl9KSwxZTMpKTticmVhaztjYXNlImNvb2tpZWVuYWJsZWQiOmg9ITEsbCgpLHUoKSxtLnVzZXJpZD14LG0uc2Vzc2lvbmlkPUUsbS5wYWdlPSIvdGlsZGEvY29va2llZW5hYmxlZC8iLHAodCk7YnJlYWs7Y2FzZSJmaW5nZXJwcmludCI6cmV0dXJuIHMoKX19O3ZhciBtPXt9LHc9e3AxMDowLHAyNTowLHA1MDowLHA3NTowLHA5MDowfSx2PSEwLGg9Im5vIj09PXdpbmRvdy50aWxkYXN0YXRjb29raWUseTtpZigod2luZG93LnRpbGRhc3RhdGNvb2tpZXx8ZSYmKGg9Im5vIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWNvb2tpZSIpKSwieWVzIj09PXdpbmRvdy50aWxkYXN0YXRjb29raWVnZHByJiYhMT09PWgpJiYoaD0hMCwhMD09PW4oInRfY29va2llc0NvbnNlbnRHaXZlbiIpKSl7dmFyIGI9bigidF9jb29raWVzQ2F0ZWdvcmllcyIpOyJzdHJpbmciPT10eXBlb2YgYiYmYi5pbmRleE9mKCJhbmFseXRpY3MiKT4tMSYmKGg9ITEpfXZhciBrPSJ5ZXMiPT09d2luZG93LnRpbGRhc3RhdHNjcm9sbDt2b2lkIDA9PT13aW5kb3cudGlsZGFzdGF0c2Nyb2xsJiZlJiYoaz0ieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXN0YXQtc2Nyb2xsIikpO3ZhciB4PSIiLEU9IiIsVD0hMTt3aW5kb3cudGlsZGFzdGF0KCJjcmVhdGUiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy50aWxkYXN0YXQoInBhZ2V2aWV3Iiksd2luZG93LnRpbGRhc3RhdCgicmVhZHRpbWUiKSx3aW5kb3cudGlsZGFzdGF0KCJzY3JvbGwiKX0pLDUwMCk7dmFyIGo9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7aWYoKCJvYmplY3QiPT10eXBlb2Ygd2luZG93LnRfanNlcnJvcnMmJndpbmRvdy50X2pzZXJyb3JzLmxlbmd0aD4wfHwib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy50X2NkbmVycm9ycyYmd2luZG93LnRfY2RuZXJyb3JzLmxlbmd0aD4wfHwib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy50X2FqYXhlcnJvcnMmJndpbmRvdy50X2FqYXhlcnJvcnMubGVuZ3RoPjApJiYiZnVuY3Rpb24iIT10eXBlb2YgdF9lcnJvcnNfX3NlbmRKU0Vycm9ycyl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5zcmM9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrTCgpKyIvanMvdGlsZGEtZXJyb3JzLTEuMC5taW4uanMiLGUuYXN5bmM9ITAsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKSxjbGVhckludGVydmFsKGopfX0pLDJlMyksTz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJsaW5rW3JlbCo9J3Nob3J0Y3V0IGljb24nXSIpLF89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgibGlua1tocmVmKj0ndGlsZGEud3MvcHJvamVjdCddIikubGVuZ3RoO198fChfPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImxpbmtbaHJlZio9J3dzLnRpbGRhY2RuLmNvbS9wcm9qZWN0J10iKS5sZW5ndGgpO3ZhciBBPU8/Ty5nZXRBdHRyaWJ1dGUoImhyZWYiKToiIixIPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtzcmMqPSdqcy90aWxkYS1zY3JpcHRzJ10iKSxDPSEhSCYmLTE9PT1ILnNyYy5pbmRleE9mKCJ0aWxkYWNkbiIpLEk7KEN8fChDPU8mJi0xIT09QS5pbmRleE9mKCJzdGF0aWMudGlsZGFjZG4uIitMKCkpJiYtMSE9PUEuaW5kZXhPZigidGlsZGEuIikmJi0xIT09QS5pbmRleE9mKCIvdGlsZGFmYXZpY29uLmljbyIpJiYhZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGFibGUjYWxscmVjb3JkcyIpJiYhKC0xIT09d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluZGV4T2YoIi50aWxkYS53cyIpKSYmIV8pLHZvaWQgMD09PW5hdmlnYXRvci5zZW5kQmVhY29ufHwvQm90L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8Qyl8fDE9PT1NYXRoLmZsb29yKDUqTWF0aC5yYW5kb20oKSkmJlMoKGZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5hc3luYz0hMCxlLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZS5zcmM9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrTCgpKyIvanMvdGlsZGEtcGVyZm9ybWFuY2UtMS4wLm1pbi5qcyIsZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsZSl9KSk7ZnVuY3Rpb24gUyhlKXsiY29tcGxldGUiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9lKCk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUpfWZ1bmN0aW9uIEwoKXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHQ7cmV0dXJuIGUmJmUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXJvb3Qtem9uZSIpfHwiY29tIn19KCk7Cgp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMTYyNDk4MDQyMScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMTc0NzczMTI1MScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0X3NsaWRlcl9faW5pdCcsZnVuY3Rpb24oKSB7dF9zbGlkZXJfX2luaXQoJzE3MjU2MjExMDEnLCd0MTE0OCcpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMTc1ODc3NjkxMScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMTc0NTc1NDQ5MScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMTc0OTkxMDA0MScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMTc0ODg4MTExMScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMTYyNDk5OTY2MScpO30pO30pOwoKKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICQoJy50bi1lbGVtW2RhdGEtZWxlbS1pZD0iMTc0MDU5MDgxNzk4NSJdJykub24oJ2NsaWNrJywgaGFuZGxlcik7CgoKICAgIGZ1bmN0aW9uIGhhbmRsZXIoKXsKICAgICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOiQoJyNyZWM4NzI0MjQ5MjcnKS5vZmZzZXQoKS50b3B9KTsKCiAgICB9CgoKfSgpKTsK | |
| 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_=Nds0AC4utaKFS7XJ; Domain=.mann-ivanov-ferber.ru; Path=/; Expires=Thu, 20-Aug-2026 15:15:56 GMT |
| Content-Security-Policy | upgrade-insecure-requests; |
| Date | Thu, 20 Aug 2026 14:55:56 GMT |
| X-Powered-By | PHP/7.4.30 |
| Cache-Control | must-revalidate, max-age=0, private |
| x-test | GET |
| x-uuid | 9cnrnlOYKOCKdcFpR0EXLn7sLHG87flo2 |
| X-Frame-Options | SAMEORIGIN |
CMS
Система управления сайтом (движок)
?
CMS — это движок, на котором работает сайт (WordPress, 1C-Bitrix, Tilda и др.). Знание CMS помогает понять возможности SEO-оптимизации и подобрать подходящие инструменты. «Не определена» — вероятно, самописный сайт или нестандартная сборка.
Сайт работает на CMS Tilda.
Веб-сервер
Программное обеспечение сервера
?
Веб-сервер — это ПО, которое отдаёт страницы посетителям (nginx, Apache, IIS, LiteSpeed и др.). Определяется по серверным заголовкам ответа (Server, X-Powered-By и т.п.). «Не определён» — сервер намеренно скрывает эти заголовки, это нормальная практика безопасности.
Сайт работает на веб-сервере DDoS-Guard.
Мета-теги Готовность: 50%
Title
Об издательстве МИФ
Заголовок страницы в браузере и поисковой выдаче
?
Title — главный SEO-заголовок страницы. Влияет на CTR в поиске и ранжирование. Оптимальная длина: 50–70 символов. Ключевые слова — ближе к началу.
Необходимо увеличить число символов в title (текущее значение мало: 19, минимум: 25, оптимально: от 40 до 45)
Дублей словоформ в title не найдено.
Description
МИФ — самое необычное издательство и самые увлеченные читатели. Мы — и те и другие, потому что делаем деловые, творческие и детские книги как для себя.
Описание страницы в поисковой выдаче (сниппет)
?
Meta Description — текст под заголовком в выдаче. Напрямую на позиции не влияет, но влияет на CTR. Оптимальная длина: 120–160 символов.
Необходимо уменьшить число символов в description (текущее значение: 151, оптимально: от 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 | http://www.mann-ivanov-ferber.ru/assets/images/about/main/change.png |
| og:site_name | Издательство &laquo;МИФ&raquo; |
| og:url | https://www.mann-ivanov-ferber.ru/about/ |
Все мета-теги
Кол-во: 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 | http://www.mann-ivanov-ferber.ru/assets/images/about/main/change.png |
| property | og:site_name | Издательство &laquo;МИФ&raquo; |
| property | og:url | https://www.mann-ivanov-ferber.ru/about/ |
| property | fb:admins | 1093864394 |
Оптимизация Готовность: 68%
Структура
Ошибок нет
Семантические HTML-элементы страницы
?
Проверяет наличие основных структурных элементов: nav, header, footer, main. Корректная семантическая структура помогает поисковику понять архитектуру страницы.
Структура документа корректна (теги <html> и <body> присутствуют в одном экземпляре).
Контент
Есть ошибки
Объём и качество текстового содержимого
?
Анализирует объём полезного текста на странице. Слишком мало — страница может считаться малополезной. Слишком много — ухудшается читаемость и восприятие.
Абзацев с текстом 0 слишком мало. Добавьте больше абзацев с текстом (тег <p>)!
Среднее число слов в абзаце 0 слишком мало. Сделайте контент более читаемым!
Кол-во слов 555 не очень много. Добавьте побольше текста (хотя бы 800 слов)!
Слова из title 3 встречаются в тексте достаточно.
Кол-во знаков контента 3797 на странице оптимально.
Заголовки
Ошибок нет
Иерархия заголовков H1–H6
?
H1 должен быть один и содержать ключевой запрос. H2–H6 описывают подразделы. Пропуск уровней (H1 → H3) и несколько H1 — типичные ошибки, снижающие понятность страницы для поисковика.
На странице присутствуют заголовки <h1> 1. Это прекрасно.
Тошнота
2,65
Насколько одно слово доминирует в тексте
?
Классическая тошнота = √(частота самого повторяющегося слова). Норма до 7–8: текст воспринимается естественно. Выше — поисковик может счесть страницу переспамленной.
Тошнота страницы в пределах нормы 3.
Академич. тошнота
3,42%
Насколько текст перенасыщен ключевыми словами
?
Академическая тошнота = (частота слова / общее количество слов) × 100%. Показывает долю конкретного слова в тексте. Норма 5–15%.
Академическая тошнота не дотягивает до нормы 5-15%. Измените текст страницы!
Семантическое ядро
20
Наиболее часто встречающиеся слова на странице
?
Топ слов по частоте использования. Показывает, какие слова доминируют в тексте с точки зрения поисковика.
Контент страницы содержит осмысленный текст и слова.
Показать список слов
| Слово | Кол-во | Частота |
|---|---|---|
| комиксы | 7 | 1,26% |
| психология | 7 | 1,26% |
| литература | 5 | 0,90% |
| развитие | 5 | 0,90% |
| творчество | 5 | 0,90% |
| бизнес | 5 | 0,90% |
| подарки | 5 | 0,90% |
| обучение | 3 | 0,54% |
| подарочные | 3 | 0,54% |
| аудиокниги | 3 | 0,54% |
| истории | 3 | 0,54% |
| культура | 3 | 0,54% |
| искусство | 3 | 0,54% |
| саморазвитие | 3 | 0,54% |
| мышление | 3 | 0,54% |
| маркетинг | 3 | 0,54% |
| бизнеса | 3 | 0,54% |
| компаний | 3 | 0,54% |
| современная | 2 | 0,36% |
| родителей | 2 | 0,36% |
Индексация Готовность: 40%
Индексирование
Есть ошибки
Разрешено ли индексирование страницы
?
Проверяет, не закрыта ли страница от индексации через robots.txt, meta robots или X-Robots-Tag. Страница, закрытая от индексации, не появится в поисковой выдаче.
Анкоров на странице 213 слишком много. Проведите ревизию и оптимизацию ссылок сайта.
Robots.txt
Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 1627 байт. Загружен за: 20мсек.
Проверяемая страница не запрещена в 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 оптимально.
Внешние ссылки
Кол-во: 203
Ссылки на сторонние сайты
?
Исходящие внешние ссылки передают часть ссылочного веса на чужие сайты. Ссылки на авторитетные ресурсы безопасны; ссылки на мусорные сайты могут навредить репутации страницы.
Внешних ссылок на странице 203 слишком много. Спрячьте лишние ссылки в тег 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 найден
Счётчики до согласия
ОК
Счётчики аналитики не собирают данные до согласия пользователя
ЗоЗПП: права потребителей Готовность: 100%
Нарушения
Не выявлены
Признаков дистанционной продажи товаров (интернет-магазина) не обнаружено — требования ЗоЗПП о раскрытии информации продавца к сайту не применяются. Нарушений нет.
ФЗ-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/about/ готова к продвижению на 64%. Чтобы еще улучшить страницу и попасть на первые места поисковой выдачи необходимо:
Исправьте ошибки в мета-тегах.
Исправьте ошибки оптимизации.
Исправьте ошибки индексации.
Поделитесь с друзьями: