Анализ страницы https://www.mann-ivanov-ferber.ru/catalog/tag/new/
Основное Готовность: 75%
Домен
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-сертификат действителен до 29.03.2027 12:49:55.
Поздравляем! Сайт не содержится в реестре РКН.
Кодировка
utf-8
Кодировка символов страницы
?
Стандарт — UTF-8. Неправильная кодировка вызывает нечитаемые символы и мешает поисковику корректно распознать текст страницы.
Указана кодировка на странице utf-8.
Язык
ru
Атрибут lang в HTML-теге
?
Атрибут lang (<html lang="ru">) сообщает поисковикам и браузерам, на каком языке написана страница. Помогает при ранжировании в региональном поиске.
Указан язык документа ru.
Скорость загрузки
~0,75сек
Время отклика сервера (TTFB)
?
Time To First Byte — время до получения первого байта от сервера. Норма до 200 мс. Медленный отклик ухудшает пользовательский опыт и ранжирование: Яндекс и Google учитывают скорость страниц.
Скорость загрузки сайта 0,75сек оптимальна.
Объем документа
4601Кб
Размер HTML-кода страницы
?
Слишком большой HTML замедляет парсинг браузером и сканирование поисковым роботом. Рекомендуется не более 200 Кб.
Объем html-документа 4601Кб оптимален.
Структура html-документа корректна.
Ресурсы
Ресурсы: 27
Внешние ресурсы страницы (CSS, JS, изображения)
?
Количество и тип подключённых ресурсов влияют на скорость загрузки. Большое число запросов увеличивает время рендеринга страницы.
Кол-во файлов ресурсов 27 много для одной страницы. Приемлемо до 10. Проведите оптимизацию файлов ресурсов!
Показать полный список ресурсов
| Тип | Название | Значение |
|---|---|---|
| stylesheet | /_next/static/css/9eab0a839b7ba0a1.css | |
| stylesheet | /_next/static/css/9349f3b462cc41d1.css | |
| stylesheet | text/css | https://fonts.googleapis.com/css2?family=Cormorant:wght@300;400;600;700 |
| js | /_next/static/chunks/polyfills-42372ed130431b0a.js | |
| js | /_next/static/chunks/webpack-602ff47bf3a716cf.js | |
| js | /_next/static/chunks/framework-945b357d4a851f4b.js | |
| js | /_next/static/chunks/main-6b039f1afcb2bf93.js | |
| js | /_next/static/chunks/pages/_app-7a09180d4c910b96.js | |
| js | /_next/static/chunks/a79515f9-1925ed52e7c555a7.js | |
| js | /_next/static/chunks/239-b55debf7ec0d1c5a.js | |
| js | /_next/static/chunks/8409-10cb487fd26d35c9.js | |
| js | /_next/static/chunks/8452-281b2a391fb84208.js | |
| js | /_next/static/chunks/3009-192818f96457cd89.js | |
| js | /_next/static/chunks/9798-250885128ab44990.js | |
| js | /_next/static/chunks/4030-02d56d41f14f8944.js | |
| js | /_next/static/chunks/835-9af0e6a11e39bad5.js | |
| js | /_next/static/chunks/4845-87fc66fb00d338f1.js | |
| js | /_next/static/chunks/8713-b28a83944670cb87.js | |
| js | /_next/static/chunks/3881-67cc61e69caee789.js | |
| js | /_next/static/chunks/1341-f01252156175662c.js | |
| js | /_next/static/chunks/8005-a7aab3da2f29f3d3.js | |
| js | /_next/static/chunks/1802-b33a77d2f0703d08.js | |
| js | /_next/static/chunks/4972-f2642a37dff3129b.js | |
| js | /_next/static/chunks/pages/catalog/tag/%5Bslug%5D-e479d928d6ca8bac.js | |
| js | /_next/static/production-28.7.0-fe85ecb7-fi/_buildManifest.js | |
| js | /_next/static/production-28.7.0-fe85ecb7-fi/_ssgManifest.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/KGNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bz1hLHQuYXBwbHkocixsKX0pLGUpKToobz1hLHQuYXBwbHkocixsKSl9fWZ1bmN0aW9uIHRfZGVib3VuY2UodCxlLG4pe3ZhciBvO3JldHVybiBlfHwoZT0yNTApLGZ1bmN0aW9uKCl7dmFyIGk9bnx8dGhpcyxyPWFyZ3VtZW50cztjbGVhclRpbWVvdXQobyksbz1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuYXBwbHkoaSxyKX0pLGUpfX1mdW5jdGlvbiB0X29uRnVuY0xvYWQodCxlLG4pe3ZhciBvPTE1ZTMsaT10X2NoZWNrSXNFZGl0TW9kZSgpLHI9ZnVuY3Rpb24gdCgpe3JldHVybiFpfHxpJiZ0X2NoZWNrRWRpdG9ySXNSZWFkeSgpfSxhPWZ1bmN0aW9uIHQoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvd1tlXXx8Im9iamVjdCI9PXR5cGVvZiB3aW5kb3dbZV19O2lmKGEodCkmJnIoKSllKCk7ZWxzZXt2YXIgbD1EYXRlLm5vdygpLGQ9bmV3IEVycm9yKHQrIiBpcyB1bmRlZmluZWQiKSxzPWZ1bmN0aW9uIHQoKXt0aHJvdyBkfTtzZXRUaW1lb3V0KChmdW5jdGlvbiBpKCl7dmFyIGQ9RGF0ZS5ub3coKTthKHQpJiZyKCk/ZSgpOigiY29tcGxldGUiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSYmZC1sPm8mJiFhKHQpJiZzKCksc2V0VGltZW91dChpLG58fDEwMCkpfSkpfX1mdW5jdGlvbiB0X2NoZWNrSXNFZGl0TW9kZSgpe3ZhciB0PSExLGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtpZighZSlyZXR1cm4hMTt2YXIgbj1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik7cmV0dXJuISEodD1uJiYiZWRpdCI9PT1uKX1mdW5jdGlvbiB0X2NoZWNrRWRpdG9ySXNSZWFkeSgpe3ZhciB0PSExO2lmKCF0X2NoZWNrSXNFZGl0TW9kZSgpKXJldHVybiExO3ZhciBlPWRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5LXN0YXR1cyIpO3JldHVybiEhKHQ9ZSYmInJlYWR5Ij09PWUpfWZ1bmN0aW9uIHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fc2V0T2JqZWN0KCl7d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I9e307dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7dC5pc0luaXRlZD0hMSx0LnNjcm9sbEJhcldpZHRoPU1hdGguYWJzKHdpbmRvdy5pbm5lcldpZHRoLWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCksdC5kZWxheT0wLHQuY2FuY2VsVGltZW91dD1udWxsO3ZhciBlPVsidDQ1MCIsInQyODJfX2NvbnRhaW5lciIsInQyODJfX2NvbnRhaW5lcl9fYmdfb3BlbmVkIiwidDI4Ml9fbWVudV9fY29udGFpbmVyIiwidDgzMG0iLCJ0ODMwX19wYW5lbCIsInQ0NTFtIiwidDIwNF9fbWVudSIsInRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiLCJ0LW1lbnUtcG9wb3Zlcl9fYnVyZ2VybWVudV9fc2lkZWJhcl9yaWdodCIsInQtbWVudS1wb3BvdmVyX2Z1bGxzY3JlZW4iXSxuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTtuPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChuLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbG9zZXN0KCIudDEwOTMiKSYmIWUuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKGUpfSkpfSkpLHQuZml4ZWRFbGVtZW50cz1bXSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKGUpe2lmKCFlLmNsYXNzTGlzdC5jb250YWlucygidDk3NSIpKXt2YXIgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxvPW4uZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKSxpPXRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2hlY2tTaXplKG4sdC5zY3JvbGxCYXJXaWR0aCkscj1pLmlzRnVsbHNjcmVlbldpZHRoLGE9aS5pc0Z1bGxzY3JlZW5IZWlnaHQ7KCJmaXhlZCI9PT1vfHwiYWJzb2x1dGUiPT09byYmciYmIWEpJiZ0LmZpeGVkRWxlbWVudHMucHVzaCh7ZWw6ZSxjb21wdXRlZFN0eWxlOm59KX19KSl9ZnVuY3Rpb24gdF9zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yX19pbml0KCl7aWYoIXdpbmRvdy5pc01vYmlsZSYmIXRfY2hlY2tJc0VkaXRNb2RlKCkpe3dpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yfHx0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX3NldE9iamVjdCgpO3ZhciB0PXdpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yO2lmKHQuc2Nyb2xsQmFyV2lkdGg9TWF0aC5hYnMod2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSx0LmNhbmNlbFRpbWVvdXQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHQuY2FuY2VsVGltZW91dCksdC5jYW5jZWxUaW1lb3V0PW51bGwpLCF0LmlzSW5pdGVkJiZ0LnNjcm9sbEJhcldpZHRoKXt0LmlzSW5pdGVkPSEwO3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctcmlnaHQiKTtlPXBhcnNlSW50KGUucmVwbGFjZSgicHgiLCIiKSwxMCk7dmFyIG49ZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7biYmZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1wYWRkaW5nLXJpZ2h0IixuKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD10LnNjcm9sbEJhcldpZHRoK2UrInB4Iixkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodD0iMTAwdmgiLGRvY3VtZW50LmJvZHkuc3R5bGUubWluSGVpZ2h0PSIxMDB2aCIsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjt2YXIgbz1bXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQuZml4ZWRFbGVtZW50cywoZnVuY3Rpb24oZSl7dmFyIG49ZS5lbDtpZihkb2N1bWVudC5ib2R5LmNvbnRhaW5zKG4pJiYhbi5jbGFzc0xpc3QuY29udGFpbnMoInQ5NzUiKSYmIW4uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0OTc1Iikpe3ZhciBpPW4uY2xvc2VzdCgiLnIiKSxyPWUuY29tcHV0ZWRTdHlsZSxhPXIuZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKTtpZigiZml4ZWQiPT09YXx8ImFic29sdXRlIj09PWEpe3ZhciBsPXIuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNpdGlvbi1kdXJhdGlvbiIpO2wuaW5kZXhPZigibXMiKSsxPyhsPXBhcnNlSW50KGwucmVwbGFjZSgibXMiLCIiKSwxMCksby5wdXNoKGwpKTpsLmluZGV4T2YoInMiKSsxJiYobD0xZTMqcGFyc2VGbG9hdChsLnJlcGxhY2UoInMiLCIiKSksby5wdXNoKGwpKTt2YXIgZD1yLmdldFByb3BlcnR5VmFsdWUoInJpZ2h0Iik7ZD1wYXJzZUludChkLnJlcGxhY2UoInB4IiwiIiksMTApO3ZhciBzPW4uc3R5bGUucmlnaHQ7cyYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1yaWdodCIscyk7dmFyIGM9bi5zdHlsZS53aWR0aDtjJiZuLnNldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXdpZHRoIixjKTt2YXIgdT1pJiZwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoaSkuZ2V0UHJvcGVydHlWYWx1ZSgiem9vbSIpKXx8MSxtPXQuc2Nyb2xsQmFyV2lkdGgvdSxwPXRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2hlY2tTaXplKHIsdC5zY3JvbGxCYXJXaWR0aCksaD1wLmlzRnVsbHNjcmVlbldpZHRoLGY9cC5pc0Z1bGxzY3JlZW5IZWlnaHQsZz1wLmNvbXB1dGVkTWFyZ2luTnVtO2g9aHx8bi5jbGFzc0xpc3QuY29udGFpbnMoInQtbWVudS1wb3BvdmVyX2Z1bGx3aWR0aCIpfHxuLmNsYXNzTGlzdC5jb250YWlucygidC1tZW51LXBvcG92ZXIiKSYmdT4xLCFkJiYwIT09ZHx8ImF1dG8iPT09bi5zdHlsZS5yaWdodHx8ImFic29sdXRlIj09PWF8fGg/aCYmIWYmJihuLnN0eWxlLndpZHRoPSJjYWxjKDEwMHZ3IC8gIisod2luZG93LmlzU2FmYXJpPzE6dSkrIiAtICIrZysicHggLSAiK20rInB4KSIpOm4uc3R5bGUucmlnaHQ9bStkKyJweCJ9fX0pKSxvLmxlbmd0aCYmKHQuZGVsYXk9TWF0aC5tYXguYXBwbHkobnVsbCxvKSl9fX1mdW5jdGlvbiB0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX2NoZWNrU2l6ZSh0LGUpe3ZhciBuPXdpbmRvdyxvPW4uaW5uZXJXaWR0aCxpPW4uaW5uZXJIZWlnaHQscj10LmdldFByb3BlcnR5VmFsdWUoIndpZHRoIiksYT1wYXJzZUZsb2F0KHIpfHwwLGw9dC5nZXRQcm9wZXJ0eVZhbHVlKCJoZWlnaHQiKSxkPXBhcnNlRmxvYXQobCl8fDAscz10LmdldFByb3BlcnR5VmFsdWUoIm1hcmdpbi1sZWZ0IiksYz1wYXJzZUZsb2F0KHMpfHwwLHU9dC5nZXRQcm9wZXJ0eVZhbHVlKCJtYXJnaW4tcmlnaHQiKSxtLHA9YysocGFyc2VGbG9hdCh1KXx8MCksaCxmO3JldHVybntpc0Z1bGxzY3JlZW5XaWR0aDoiMTAwJSI9PT1yfHwiMTAwdnciPT09cnx8YT09PW98fGE9PT1vLWV8fGE9PT1vLXB8fGE9PT1vLXAtZSxpc0Z1bGxzY3JlZW5IZWlnaHQ6IjEwMCUiPT09bHx8IjEwMHZoIj09PWx8fCJhdXRvIj09PWx8fGQ9PT1pfHxkPT09aS1lLGNvbXB1dGVkTWFyZ2luTnVtOnB9fWZ1bmN0aW9uIHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2FuY2VsKCl7dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7dCYmdC5pc0luaXRlZCYmKHQuaXNJbml0ZWQ9ITEsdC5kZWxheT0wLGRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcGFkZGluZy1yaWdodCIpPyhkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1kb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXBhZGRpbmctcmlnaHQiKSk6ZG9jdW1lbnQuYm9keS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgicGFkZGluZy1yaWdodCIpLGRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoImhlaWdodCIpLGRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoIm1pbi1oZWlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJvdmVyZmxvdyIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5maXhlZEVsZW1lbnRzLChmdW5jdGlvbih0KXt2YXIgZT10LmVsLG49ZS5jbGFzc0xpc3QuY29udGFpbnMoInRuLWF0b21fX3N0aWNreS13cmFwcGVyIil8fGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIik7ZS5oYXNBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1yaWdodCIpPyhlLnN0eWxlLnJpZ2h0PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcmlnaHQiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXJpZ2h0IikpOmUuc3R5bGUucmVtb3ZlUHJvcGVydHkoInJpZ2h0IiksZS5oYXNBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC13aWR0aCIpPyhlLnN0eWxlLndpZHRoPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtd2lkdGgiKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXdpZHRoIikpOihlLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJ3aWR0aCIpLG4mJihlLnN0eWxlLndpZHRoPSJpbmhlcml0IikpfSkpKX1mdW5jdGlvbiB0X3RyaWdnZXJFdmVudCh0LGUpe3ZhciBuO2RvY3VtZW50LmNyZWF0ZUV2ZW50PyhuPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIikpLmluaXRFdmVudChlLCEwLCExKTpkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCYmKChuPWRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCkpLmV2ZW50VHlwZT1lKSxuLmV2ZW50TmFtZT1lLHQuZGlzcGF0Y2hFdmVudD90LmRpc3BhdGNoRXZlbnQobik6dC5maXJlRXZlbnQ/dC5maXJlRXZlbnQoIm9uIituLmV2ZW50VHlwZSxuKTp0W2VdP3RbZV0oKTp0WyJvbiIrZV0mJnRbIm9uIitlXSgpfWZ1bmN0aW9uIHRfZ2V0Um9vdFpvbmUoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGU7cmV0dXJuIHQmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXJvb3Qtem9uZSIpfHwiY29tIn1mdW5jdGlvbiB0X21vZGlmeVJvb3Rab25lKHQpe3JldHVybiB0JiZ0LmluY2x1ZGVzKCJzdGF0aWMudGlsZGFjZG4uY29tIik/dC5yZXBsYWNlKCJzdGF0aWMudGlsZGFjZG4uY29tIiwic3RhdGljLnRpbGRhY2RuLiIrdF9nZXRSb290Wm9uZSgpKTp0fWZ1bmN0aW9uIHRfbG9hZEpzRmlsZSh0LGUsbil7dm9pZCAwPT09biYmKG49MCk7dmFyIG89MyxpPTFlMyxyPXRfbW9kaWZ5Um9vdFpvbmUodCk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyY149IicrcisnIl0nKSllJiZlKCk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnR5cGU9InRleHQvamF2YXNjcmlwdCIsYS5zcmM9cixlJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe2UoKX0pKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZnVuY3Rpb24odCl7aWYoIShuPD0zKSl7dmFyIG89dC5tZXNzYWdlfHwiPG5vIGVycm9yIG1lc3NhZ2U+Ijt0aHJvdyBuZXcgRXJyb3IoIkZhaWxlZCB0byBsb2FkICIrcisiIHNjcmlwdDogIitvLHtjYXVzZTp0fSl9c2V0VGltZW91dCgoZnVuY3Rpb24oKXthLnJlbW92ZSgpLHRfbG9hZEpzRmlsZShyLGUsbisxKSxjb25zb2xlLndhcm4oIlJldHJ5aW5nIHRvIGxvYWQgIityKyIuIFJldHJ5OiAiKyhuKzEpKX0pLG4qaSl9KSksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhKX19ZnVuY3Rpb24gdF9sb2FkQ1NTRmlsZSh0LGUsbil7dm9pZCAwPT09biYmKG49MCk7dmFyIG89MyxpPTFlMyxyPXRfbW9kaWZ5Um9vdFpvbmUodCk7aWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tocmVmXj0iJytyKyciXScpKWUmJmUoKTtlbHNle3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTthLnJlbD0ic3R5bGVzaGVldCIsYS50eXBlPSJ0ZXh0L2NzcyIsYS5tZWRpYT0iYWxsIixhLmhyZWY9cixhLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLGUmJmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2lmKCEobjw9Mykpe3ZhciBvPXQubWVzc2FnZXx8IjxubyBlcnJvciBtZXNzYWdlPiI7dGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gbG9hZCAiK3IrIiBzdHlsZTogIitvLHtjYXVzZTp0fSl9c2V0VGltZW91dCgoZnVuY3Rpb24oKXthLnJlbW92ZSgpLHRfbG9hZENTU0ZpbGUocixlLG4rMSksY29uc29sZS53YXJuKCJSZXRyeWluZyB0byBsb2FkICIrcisiLiBSZXRyeTogIisobisxKSl9KSxuKmkpfSkpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYSl9fWZ1bmN0aW9uIHRfc2Nyb2xsVG8odCxlKXtpZih0KXt2YXIgbj1lfHx7fSxvPW4udXNlTmF0aXZlU2Nyb2xsVG8saT1uLmR1cmF0aW9uLHI9bi5iZWhhdmlvcixhPXZvaWQgMD09PXI/Imluc3RhbnQiOnIsbD1uLm9mZnNldCxkPXZvaWQgMD09PWw/MDpsLHM9TWF0aC5tYXgocGFyc2VJbnQodC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnNjcm9sbFktZCwxMCksMCk7b3x8Imluc3RhbnQiPT09YT93aW5kb3cuc2Nyb2xsVG8oe2xlZnQ6MCx0b3A6cyxiZWhhdmlvcjphfSk6dF9zbW9vdGhTY3JvbGxUbyhzLGkpfX1mdW5jdGlvbiB0X3Ntb290aFNjcm9sbFRvKHQsZSl7dm9pZCAwPT09ZSYmKGU9NTAwKTt2YXIgbj1kb2N1bWVudC5ib2R5LG89d2luZG93LnNjcm9sbFl8fHdpbmRvdy5wYWdlWU9mZnNldCxpPXQtbyxyPXBlcmZvcm1hbmNlLm5vdygpO2Z1bmN0aW9uIGEodCl7cmV0dXJuIE1hdGgucG93KHQsMil9ZnVuY3Rpb24gbCgpe3ZhciBkPXBlcmZvcm1hbmNlLm5vdygpLHM9TWF0aC5taW4oKGQtcikvZSwxKSxjPWEocyk7d2luZG93LnNjcm9sbFRvKDAsbytpKmMpLHM8MT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobCk6KG4ucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXNjcm9sbCIpLG4ucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXNjcm9sbGFibGUiKSx3aW5kb3cuc2Nyb2xsVG8oMCx0KSl9bi5zZXRBdHRyaWJ1dGUoImRhdGEtc2Nyb2xsIiwidHJ1ZSIpLG4uc2V0QXR0cmlidXRlKCJkYXRhLXNjcm9sbGFibGUiLCJ0cnVlIikscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGwpfXdpbmRvdy5icm93c2VyTGFuZz0od2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UpLnRvVXBwZXJDYXNlKCkuc2xpY2UoMCwyKSx3aW5kb3cudGlsZGFCcm93c2VyTGFuZz13aW5kb3cuYnJvd3NlckxhbmcsdF9vblJlYWR5KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYodCl2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wcm9qZWN0LWxhbmciKTtlJiYod2luZG93LmJyb3dzZXJMYW5nPWUpfSkpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxlPS0xIT09dC5pbmRleE9mKCJJbnN0YWdyYW0iKSxuPS0xIT09dC5pbmRleE9mKCJGQkFWIiksbz0tMSE9PXQuaW5kZXhPZigiWWFTZWFyY2hCcm93c2VyIiksaT0tMSE9PXQuaW5kZXhPZigiU2Ftc3VuZ0Jyb3dzZXIiKSxyPS0xIT09dC5pbmRleE9mKCJEdWNrRHVja0dvIiksYTtpZigtMSE9PXQuaW5kZXhPZigiQW5kcm9pZCIpJiYobnx8ZXx8b3x8aXx8cikpe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTtsLnN0eWxlLmxpbmVIZWlnaHQ9IjEwMHB4IixsLnN0eWxlLnBhZGRpbmc9IjAiLGwuc3R5bGUubWFyZ2luPSIwIixsLnN0eWxlLmhlaWdodD0iYXV0byIsbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUub3BhY2l0eT0iMC4wMDEiLGwuaW5uZXJUZXh0PSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpO3ZhciBkPTEwMC9sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobCksZDwuOTgmJmRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCc8c3R5bGU+LnQzOTYgW2RhdGEtZWxlbS10eXBlPSJ0ZXh0Il0gLnRuLWF0b20ge3pvb206ICcrMTAwKmQrIiU7fTwvc3R5bGU+Iil9d2luZG93LmlzaU9TJiYhd2luZG93Lk1TU3RyZWFtJiYoZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eSgiLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0IiwiMTAwJSIpLGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoInRleHQtc2l6ZS1hZGp1c3QiLCIxMDAlIikpfSkpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImh0bWwiKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXRpbGRhbGFiZWwiKSxuPXQub2Zmc2V0SGVpZ2h0O2lmKGRvY3VtZW50LmJvZHkmJihuPU1hdGgubWF4KGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LHQub2Zmc2V0SGVpZ2h0KSksKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYWNvcHkiKXx8ZSkmJmUucXVlcnlTZWxlY3RvckFsbCgiZGl2Iikpbis3MD53aW5kb3cuaW5uZXJIZWlnaHQmJmUmJmUuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IHBvaW50ZXItZXZlbnRzOiBhbGwgIWltcG9ydGFudDsgb3BhY2l0eTogMSAhaW1wb3J0YW50OyBtYXJnaW46IDAgIWltcG9ydGFudDsgei1pbmRleDogMSAhaW1wb3J0YW50Iik7ZWxzZXtmb3IodmFyIG89ZG9jdW1lbnQuYm9keS5jaGlsZE5vZGVzLGk9W10scj0wO3I8by5sZW5ndGg7cisrKXt2YXIgYT1vW3JdOzg9PT1hLm5vZGVUeXBlJiZpLnB1c2goYSl9Zm9yKHZhciByPTA7cjxpLmxlbmd0aDtyKyspLTEhPT1pW3JdLm5vZGVWYWx1ZS5pbmRleE9mKCIndCByZW1vdmUgdGhpcyBsIikmJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJhZnRlcmVuZCIsJzxkaXYgY2xhc3M9InQtdGlsZGFsYWJlbCB0LXRpbGRhbGFiZWwtZnJlZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7IHZpc2liaWxpdHk6IHZpc2libGUgIWltcG9ydGFudDsgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IHBvaW50ZXItZXZlbnRzOiBhbGwgIWltcG9ydGFudDsgb3BhY2l0eTogMSAhaW1wb3J0YW50OyBtYXJnaW46IDAgIWltcG9ydGFudDsgei1pbmRleDogOTk5MDAgIWltcG9ydGFudCI+PGRpdiBjbGFzcz0idC10aWxkYWxhYmVsLWZyZWVfX21haW4iPjxhIGhyZWY9Imh0dHBzOi8vdGlsZGEuY2MiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0icGFkZGluZy1ib3R0b206MTJweDsgZGlzcGxheTogYmxvY2s7Ij48aW1nIHN0eWxlPSJ3aWR0aDo0MHB4OyIgc3JjPSJodHRwczovL3N0YXRpYy50aWxkYWNkbi4nK3RfZ2V0Um9vdFpvbmUoKSsnL2ltZy90aWxkYWNvcHkucG5nIj48L2E+PGRpdiBzdHlsZT0icGFkZGluZy1ib3R0b206IDE1cHg7Ij5UaGlzIHNpdGUgd2FzIG1hZGUgb24gPGEgaHJlZj0iaHR0cHM6Ly90aWxkYS5jYyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmU7IGNvbG9yOmluaGVyaXQ7Ij5UaWxkYSDigJQgYSB3ZWJzaXRlIGJ1aWxkZXI8L2E+IHRoYXQgaGVscHMgdG8mbmJzcDtjcmVhdGUgYSZuYnNwO3dlYnNpdGUgd2l0aG91dCBhbnkgY29kZTwvZGl2PjxhIGhyZWY9Imh0dHBzOi8vdGlsZGEuY2MvcmVnaXN0cmF0aW9uLyIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDEwcHggMjBweDsgZm9udC1zaXplOiAxM3B4OyBib3JkZXItcmFkaXVzOiA1MHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmE4NjY5OyBjb2xvcjogI2ZmZjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyI+Q3JlYXRlIGEgd2Vic2l0ZTwvYT48L2Rpdj48ZGl2IGNsYXNzPSJ0LXRpbGRhbGFiZWwtZnJlZV9fbGlua3Mtd3IiPjxhIGNsYXNzPSJ0LXRpbGRhbGFiZWwtZnJlZV9fdHh0LWxpbmsiIGhyZWY9Imh0dHBzOi8vaGVscCcrKCJSVSI9PT13aW5kb3cuYnJvd3Nlckxhbmc/Ii1ydSI6IiIpKycudGlsZGEuY2Mvd2hpdGUtbGFiZWwiIHRhcmdldD0iX2JsYW5rIj4nKygiUlUiPT09d2luZG93LmJyb3dzZXJMYW5nPyLQmtCw0Log0YPQtNCw0LvQuNGC0Ywg0Y3RgtC+0YIg0LvQtdC50LHQuyI6IkhvdyB0byByZW1vdmUgdGhpcyBibG9jayIpKyI/PC9hPjwvZGl2PjwvZGl2PiIpfX0pLDUwMCl9KSksdF9vblJlYWR5KChmdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYoIXdpbmRvdy5pc01vYmlsZSYmdCYmInllcyIhPT10LmdldEF0dHJpYnV0ZSgiZGF0YS1ibG9ja3MtYW5pbWF0aW9ub2ZmIikmJiExPT09d2luZG93LmlzU2VhcmNoQm90KXtmb3IodmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIiKSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvLGk9KG89ZVtuXSkuZ2V0QXR0cmlidXRlKCJzdHlsZSIpO2kmJi0xIT09aS5pbmRleE9mKCJiYWNrZ3JvdW5kIikmJm8uc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGlvbmFwcGVhciIsIm9mZiIpfWZvcih2YXIgcj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRpb25hcHBlYXIiKSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1taW4iKSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1tYXgiKX0pKSxuPTA7bjxyLmxlbmd0aDtuKyspe3ZhciBvLGE9KG89cltuXSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCxsPXdpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQrMzAwO3RfYWRkQ2xhc3MobyxhPjFlMyYmYT5sPyJyX2hpZGRlbiI6InJfc2hvd2VkIiksdF9hZGRDbGFzcyhvLCJyX2FuaW0iKX1pZihyLmxlbmd0aCl7ZnVuY3Rpb24gZCgpe2Zvcih2YXIgdD1yLmxlbmd0aC0xO3Q+PTA7dC0tKXt2YXIgZT1yW3RdLG4sbz0wO2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDwobz1lLm9mZnNldEhlaWdodDw9MTAwP3dpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQ6d2luZG93LnBhZ2VZT2Zmc2V0K3dpbmRvdy5pbm5lckhlaWdodC0xMDApJiYodF9yZW1vdmVDbGFzcyhlLCJyX2hpZGRlbiIpLHRfYWRkQ2xhc3MoZSwicl9zaG93ZWQiKSwocj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChyKSkuc3BsaWNlKHQsMSkpfX12YXIgcz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yZWNvcmQtdHlwZT0iNDAwIl0sIFtkYXRhLXBhcmVudHRwbGlkPSI0MDAiXScpO2lmKHMubGVuZ3RoPjApdmFyIGM9MCx1PTAsbT1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXszMDA9PT0odSs9MSkmJmNsZWFySW50ZXJ2YWwobSk7Zm9yKHZhciB0PTA7dDxzLmxlbmd0aDt0Kyspe3ZhciBlOyJ5ZXMiPT09c1t0XS5nZXRBdHRyaWJ1dGUoImRhdGEtaGlkaW5nLWNvbXBsZXRlZCIpJiYoYys9MSl9Yz09PXMubGVuZ3RoJiYoZCgpLGNsZWFySW50ZXJ2YWwobSkpfSksMTAwKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe2QoKX0pLDIwMCkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0aWxkYXRhYjpjaGFuZ2UiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7ZCgpfSksMjAwKSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtkKCl9KSl9fXZhciBwPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImh0bWwiKSxoPWRvY3VtZW50LmJvZHk7Im5vbmUiPT09cC5zdHlsZS5kaXNwbGF5JiYocC5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3ZhciBmPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXRpbGRhbGFiZWwiKSxnOyhnPWg/TWF0aC5tYXgoaC5zY3JvbGxIZWlnaHQsaC5vZmZzZXRIZWlnaHQsaC5jbGllbnRIZWlnaHQscC5vZmZzZXRIZWlnaHQpOnAub2Zmc2V0SGVpZ2h0KSs3MDx3aW5kb3cuaW5uZXJIZWlnaHQ/ZiYmKGYuc3R5bGUuZGlzcGxheT0ibm9uZSIpOmYmJmYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQiKX0pKSxmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt3aW5kb3cud2luV2lkdGg9d2luZG93LmlubmVyV2lkdGgsd2luZG93LndpbkhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHR9ZnVuY3Rpb24gZSgpe3ZhciB0PXdpbmRvdy5pc01vYmlsZT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVyV2lkdGgsZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucltkYXRhLXNjcmVlbi1tYXhdLCAucltkYXRhLXNjcmVlbi1taW5dIiksbixvLGk7LTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkluc3RhZ3JhbSIpJiYodD1zY3JlZW4ud2lkdGgpO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgYT1lW3JdLGw9YS5pZC5yZXBsYWNlKCJyZWMiLCIiKTtpZigieWVzIj09PWEuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbm5lY3Qtd2l0aC10YWIiKXx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcG9wdXAtcmVjLWlkcz0iJytsKyciXScpKXJldHVybjtpPWdldENvbXB1dGVkU3R5bGUoYSkuZGlzcGxheSwobj1hLmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4IikpfHwobj0xZTQpLChvPWEuZ2V0QXR0cmlidXRlKCJkYXRhLXNjcmVlbi1taW4iKSl8fChvPTApLG49cGFyc2VJbnQobiksKG89cGFyc2VJbnQobykpPD1uJiYodDw9biYmdD5vPyJibG9jayIhPT1pJiYoYS5zdHlsZS5kaXNwbGF5PSJibG9jayIpOiJub25lIiE9PWkmJihhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSl9fXRfb25SZWFkeSgoZnVuY3Rpb24oKXt0KCksZSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dCgpfSksMjAwKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtlKCl9KSwyMDApKX0pKX0oKSxmdW5jdGlvbigpe3ZhciB0PS0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJJbnN0YWdyYW0iKTtmdW5jdGlvbiBlKCl7Zm9yKHZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNvdmVyX19jYXJyaWVyIiksZT0wLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG8saTtpZigoaT0obz10W25dKS5zdHlsZSkuaGVpZ2h0LmluZGV4T2YoInZoIik+LTEpe2U9cGFyc2VJbnQoaS5oZWlnaHQsMTApLzEwMDt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyLmlkPSJ0ZW1wRGl2IixyLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDB2aDt2aXNpYmlsaXR5OmhpZGRlbjsiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocik7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlbXBEaXYiKSxsPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoYSkuaGVpZ2h0LnJlcGxhY2UoInB4IiwiIikpO3RfcmVtb3ZlRWwoYSk7dmFyIGQ9TWF0aC5yb3VuZChsKmUpKyJweCIscz1vLmNsb3Nlc3QoIi50LWNvdmVyIik7aWYocyl7dmFyIGM9cy5xdWVyeVNlbGVjdG9yKCIudC1jb3Zlcl9fZmlsdGVyIiksdT1zLnF1ZXJ5U2VsZWN0b3IoIi50LWNvdmVyX193cmFwcGVyIik7cy5zdHlsZS5oZWlnaHQ9ZCxjJiYoYy5zdHlsZS5oZWlnaHQ9ZCksdSYmKHUuc3R5bGUuaGVpZ2h0PWQpfWkuaGVpZ2h0PWR9fXZhciBtPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWhlaWdodC1jb3JyZWN0LXZoXSIpLHA9d2luZG93LmlubmVySGVpZ2h0O2U9MDtmb3IodmFyIG49MDtuPG0ubGVuZ3RoO24rKyl7dmFyIG8saTsoaT0obz1tW25dKS5zdHlsZSkuaGVpZ2h0LmluZGV4T2YoInZoIik+LTEmJihlPXBhcnNlSW50KGkuaGVpZ2h0KS8xMDAsZD1wKihpc05hTihlKT8xOmUpKyJweCIsaS5oZWlnaHQ9ZCl9fWZ1bmN0aW9uIG4oKXt2YXIgZT10P3NjcmVlbi53aWR0aDp3aW5kb3cuaW5uZXJXaWR0aDt3aW5kb3cuaXNNb2JpbGUmJiF0JiYoZT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpO2Zvcih2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucjpub3QoW2RhdGEtcmVjb3JkLXR5cGU9IjM5NiJdLCBbZGF0YS1yZWNvcmQtdHlwZT0iMTAwMyJdLCBbZGF0YS1wYXJlbnR0cGxpZD0iMzk2Il0sIFtkYXRhLXBhcmVudHRwbGlkPSIxMDAzIl0pJyksbz1bXSxpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciByPW5baV0sYT1nZXRDb21wdXRlZFN0eWxlKHIpOyJub25lIiE9PWEuZGlzcGxheSYmImhpZGRlbiIhPT1hLnZpc2liaWxpdHkmJiIwIiE9PWEub3BhY2l0eSYmby5wdXNoKHIpfWZvcih2YXIgbD0wO2w8by5sZW5ndGg7bCsrKWZvcih2YXIgZD1vW2xdLHM9ZC5xdWVyeVNlbGVjdG9yQWxsKCdkaXY6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1tb2JpbGUtd2lkdGg9ImZhbHNlIl0pOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIpOm5vdCgudG4tYXRvbV9fcHJ4LXdyYXBwZXIpOm5vdCgudG4tYXRvbV9fdmlkZW9pZnJhbWUpOm5vdCgudG4tYXRvbV9fc3RpY2t5LXdyYXBwZXIpOm5vdCgudC1jYXRhbG9nX19yZWxldmFudHNfX2NvbnRhaW5lcik6bm90KC50LXNsZHNfX2l0ZW1zLXdyYXBwZXIpOm5vdCguanMtcHJvZHVjdC1jb250cm9scy13cmFwcGVyKTpub3QoLnQtc3RvcmVfX3JlbGV2YW50c19fY29udGFpbmVyKTpub3QoLnQtc2xkc19faXRlbXMtd3JhcHBlcik6bm90KC5qcy1wcm9kdWN0LWNvbnRyb2xzLXdyYXBwZXIpOm5vdCguanMtcHJvZHVjdC1lZGl0aW9uLW9wdGlvbik6bm90KC50LXByb2R1Y3RfX29wdGlvbi12YXJpYW50cyknKSxjPTA7YzxzLmxlbmd0aDtjKyspe3ZhciB1PXNbY107ZC5zdHlsZS53b3JkQnJlYWs9IiI7dmFyIG09dF9vdXRlcldpZHRoKHUpO2lmKG0+ZSl7aWYoInllcyI9PT11LmdldEF0dHJpYnV0ZSgiW2RhdGEtY3VzdG9tc3R5bGVdIikmJiJmYWxzZSI9PT11LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJbZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoXSIpKXJldHVybjtjb25zb2xlLmxvZygiQmxvY2sgbm90IG9wdGltaXplZCBmb3IgbW9iaWxlIHdpZHRoLiBCbG9jayB3aWR0aDoiK20rIiBCbG9jayBpZDoiK2QuZ2V0QXR0cmlidXRlKCJpZCIpKSxjb25zb2xlLmxvZyh1KSxkLnN0eWxlLm92ZXJmbG93PSJhdXRvIixkLnN0eWxlLndvcmRCcmVhaz1tLTM+ZT8iYnJlYWstd29yZCI6IiJ9fX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudC10ZXh0Om5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtbmFtZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtZGVzY3I6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1oZWFkaW5nOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtdGV4dC1pbXBhY3Q6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1zdWJ0aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXVwdGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pJyksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dLGk9by5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYoaSl7dmFyIHI9InJlbSI9PT1vLmdldEF0dHJpYnV0ZSgiZGF0YS1hdXRvLWNvcnJlY3QtZm9udC1zaXplIiksYTtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg+dClhPShhPWkucmVwbGFjZSgibGluZWhlaWdodCIsImxpbmUtaGVpZ2h0IikpLnJlcGxhY2UoImZvbnRzaXplIiwiZm9udC1zaXplIiksby5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKTtlbHNle2lmKC0xPT09aS5pbmRleE9mKCJmb250LXNpemUiKSljb250aW51ZTtpZihwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPDI2KWNvbnRpbnVlO2E9aS5yZXBsYWNlKCJsaW5lLWhlaWdodCIsImxpbmVoZWlnaHQiKSxhPXI/YS5yZXBsYWNlKC9mb250LXNpemUuKnB4Oy9naSwiZm9udC1zaXplOiAxLjZyZW07Iik6YS5yZXBsYWNlKCJmb250LXNpemUiLCJmb250c2l6ZSIpLG8uc2V0QXR0cmlidXRlKCJzdHlsZSIsYSl9fX19KHdpbmRvdy5pc01vYmlsZXx8d2luZG93LnBhcmVudC5pc1BhZ2VQcmV2aWV3KSYmKHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGUsNDAwKX0pKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dChlLDQwMCl9KSksd2luZG93LmlubmVyV2lkdGg8NDgwfHx3aW5kb3cuaXNNb2JpbGUmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDw0ODB8fHQmJnNjcmVlbi53aWR0aDw0ODA/KHRfb25SZWFkeSgoZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJyksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZmllbGRdIHNwYW4sIFtmaWVsZF0gc3Ryb25nLCBbZmllbGRdIGVtLCBbZmllbGRdIGEiKSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4yNiYmKGkuc3R5bGUuZm9udFNpemU9bnVsbCxpLnN0eWxlLmxpbmVIZWlnaHQ9bnVsbCl9Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4yNiYmKGkuc3R5bGUuZm9udFNpemU9bnVsbCl9byg0ODApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvKDQ4MCl9KSw1MDApfSkpfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixuKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bigpfSksNTAwKX0pKSk6KHdpbmRvdy5pbm5lcldpZHRoPDkwMHx8d2luZG93LmlzTW9iaWxlJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg8OTAwfHx0JiZzY3JlZW4ud2lkdGg8OTAwKSYmdF9vblJlYWR5KChmdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1jdXN0b21zdHlsZT0ieWVzIl0nKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltmaWVsZF0gc3BhbiwgW2ZpZWxkXSBzdHJvbmcsIFtmaWVsZF0gZW0sIFtmaWVsZF0gYSIpLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG89dFtuXTtwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPjMwJiYoby5zdHlsZS5mb250U2l6ZT1udWxsLG8uc3R5bGUubGluZUhlaWdodD1udWxsKX1mb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLmZvbnRTaXplLnJlcGxhY2UoInB4IiwiIikpPjMwJiYoby5zdHlsZS5mb250U2l6ZT1udWxsKX1mb3IodmFyIGk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnQtdGV4dDpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LW5hbWU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC10aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LWRlc2NyOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtaGVhZGluZzpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXRleHQtaW1wYWN0Om5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtc3VidGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC11cHRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKScpLG49MDtuPGkubGVuZ3RoO24rKyl7dmFyIG8scj0obz1pW25dKS5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYociYmci5pbmRleE9mKCJmb250LXNpemUiKT4tMSYmcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4zMClpZigicmVtIj09PW8uZ2V0QXR0cmlidXRlKCJkYXRhLWF1dG8tY29ycmVjdC1mb250LXNpemUiKSl7dmFyIGE9ci5yZXBsYWNlKC9mb250LXNpemUuKnB4Oy9naSwiZm9udC1zaXplOiAxLjZyZW07IikucmVwbGFjZSgibGluZS1oZWlnaHQiLCJsaW5laGVpZ2h0Iik7by5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKX1lbHNle3ZhciBhPXIucmVwbGFjZSgiZm9udC1zaXplIiwiZm9udHNpemUiKS5yZXBsYWNlKCJsaW5lLWhlaWdodCIsImxpbmVoZWlnaHQiKTtvLnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpfX19KSkpfSgpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZePSJodHRwIl1bdGFyZ2V0PSJfYmxhbmsiXScpLGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG49dFtlXSxvPW4uZ2V0QXR0cmlidXRlKCJyZWwiKXx8IiI7IiI9PT1vP24uc2V0QXR0cmlidXRlKCJyZWwiLCJub29wZW5lciIpOi0xPT09by5pbmRleE9mKCJub29wZW5lciIpJiZuLnNldEF0dHJpYnV0ZSgicmVsIixvKyIgbm9vcGVuZXIiKX19KSwyNTAwKX0pKSxmdW5jdGlvbih0LGUpe3Qub25lcnJvcj1mdW5jdGlvbihlLG4sbyxpLHIpeyJvYmplY3QiIT10eXBlb2YgdC50X2pzZXJyb3JzJiYodC50X2pzZXJyb3JzPVtdKSx0LnRfanNlcnJvcnMucHVzaCh7bWVzc2FnZTplLGZpbGVuYW1lOm4sbGluZW5vOm8sY29sbm86aSxlcnJvcjpyfSl9fSh3aW5kb3csTWF0aCksdF9vblJlYWR5KChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigicG9wdXBTaG93ZWQiLHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9faW5pdCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJwb3B1cEhpZGRlbiIsKGZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7dCYmKHQuY2FuY2VsVGltZW91dCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodC5jYW5jZWxUaW1lb3V0KSx0LmNhbmNlbFRpbWVvdXQ9bnVsbCksdC5jYW5jZWxUaW1lb3V0PXdpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2FuY2VsVGltZW91dD1udWxsLHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9fY2FuY2VsKCl9KSxNYXRoLm1pbigzMDAsdC5kZWxheSkpKX0pKX0pKSx3aW5kb3cuc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcjsKCndpbmRvdy5ub2pzY29kZT0hMApmdW5jdGlvbiB0X2xhenlsb2FkX3VwZGF0ZSgpeyJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfY292ZXImJmxhenlsb2FkX2NvdmVyLnVwZGF0ZSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfaW1nJiZsYXp5bG9hZF9pbWcudXBkYXRlKCksInVuZGVmaW5lZCIhPXR5cGVvZiBsYXp5bG9hZF9iZ2ltZyYmbGF6eWxvYWRfYmdpbWcudXBkYXRlKCksInVuZGVmaW5lZCIhPXR5cGVvZiBsYXp5bG9hZF9pZnJhbWUmJmxhenlsb2FkX2lmcmFtZS51cGRhdGUoKX1mdW5jdGlvbiB0X2xhenlsb2FkX3VwZGF0ZVJlc2l6ZV9lbGVtKGUpe2lmKHdpbmRvdy5qUXVlcnkmJmUgaW5zdGFuY2VvZiBqUXVlcnkpe2lmKDA9PWUubGVuZ3RoKXJldHVybjtlPWUuZ2V0KDApfWlmKG51bGwhPWUpe3ZhciB0PWUudGFnTmFtZTtpZigiSU1HIj09dCl2YXIgbz1lLmdldEF0dHJpYnV0ZSgic3JjIiksbj0iLS9yZXNpemUvIjtlbHNlIGlmKCJ1bmRlZmluZWQiIT10eXBlb2YgZ2V0Q29tcHV0ZWRTdHlsZSl7dmFyIG89Z2V0Q29tcHV0ZWRTdHlsZShlKVsiYmFja2dyb3VuZC1pbWFnZSJdLnJlcGxhY2UoInVybCgiLCIiKS5yZXBsYWNlKCIpIiwiIikucmVwbGFjZSgvIi9naSwiIiksaTtpZigiY29udGFpbiI9PWdldENvbXB1dGVkU3R5bGUoZSlbImJhY2tncm91bmQtc2l6ZSJdKXZhciBuPSItL2NvbnRhaW4vIjtlbHNlIHZhciBuPSItL2NvdmVyLyJ9ZWxzZSB2YXIgbj0iLS9jb3Zlci8iO2lmKCEobnVsbD09b3x8LTE9PT1vLmluZGV4T2Yobil8fG8uaW5kZXhPZigiLnN2ZyIpPjB8fG8uaW5kZXhPZigiLmdpZiIpPjB8fG8uaW5kZXhPZigiLmljbyIpPjB8fC0xPT09by5pbmRleE9mKCJ0aHVtYi50aWxkYWNkbi5jb20iKXx8by5pbmRleE9mKCItL2VtcHR5LyIpPjAmJm8uaW5kZXhPZigiLS9yZXNpemViLyIpPjApKXt2YXIgbD1vLmluZGV4T2Yobikrbi5sZW5ndGgsYT1vLmluZGV4T2YoIi8iLGwpO2lmKGw+MCYmYT4wKXt2YXIgcj1vLnNsaWNlKGwsYSkuc3BsaXQoIngiKSxzPWUuY2xpZW50V2lkdGgsYz1lLmNsaWVudEhlaWdodDtpZihzPjAmJmM+MCYmKHJbMF0+MHx8clsxXT4wKSYmKHJbMF0+MCYmcz5yWzBdfHxyWzFdPjAmJmM+clsxXSkmJihyWzBdPjAmJnMtclswXT4xMDB8fHJbMV0+MCYmYy1yWzFdPjEwMCkpe3ZhciBkPW8uc2xpY2UoMCxsKSsoclswXT4wP3M6IiIpKyJ4IisoclsxXT4wP2M6IiIpK28uc3Vic3RyaW5nKGEpOyJJTUciPT10P2Uuc2V0QXR0cmlidXRlKCJzcmMiLGQpOmUuc3R5bGUuYmFja2dyb3VuZEltYWdlPSJ1cmwoJyIrZCsiJykifX19fX0hZnVuY3Rpb24oZSx0KXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSx0KToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9dCgpOmUuTGF6eUxvYWQ9dCgpfSh3aW5kb3csKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe218fChoPXtlbGVtZW50c19zZWxlY3RvcjoiaW1nIixjb250YWluZXI6d2luZG93LHRocmVzaG9sZDozMDAsdGhyb3R0bGU6NTAsZGF0YV9zcmM6Im9yaWdpbmFsIixkYXRhX3NyY3NldDoib3JpZ2luYWwtc2V0IixjbGFzc19sb2FkaW5nOiJsb2FkaW5nIixjbGFzc19sb2FkZWQ6ImxvYWRlZCIsc2tpcF9pbnZpc2libGU6ITAsc2hvd193aGlsZV9sb2FkaW5nOiEwLGNhbGxiYWNrX2xvYWQ6bnVsbCxjYWxsYmFja19lcnJvcjpudWxsLGNhbGxiYWNrX3NldDpudWxsLGNhbGxiYWNrX3Byb2Nlc3NlZDpudWxsLHBsYWNlaG9sZGVyOiJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFBQUFBUC8vL3lINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQlJBQTcifSxwPSEhd2luZG93LmFkZEV2ZW50TGlzdGVuZXIsZj0hIXdpbmRvdy5hdHRhY2hFdmVudCxnPSEhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QsbT0hMCl9ZnVuY3Rpb24gdChlLHQsbyl7dmFyIG47cD9lLmFkZEV2ZW50TGlzdGVuZXIodCxvKTpmJiYoZS5hdHRhY2hFdmVudCgib24iK3QsKG49ZSxmdW5jdGlvbigpe28uY2FsbChuLHdpbmRvdy5ldmVudCl9KSksZT1udWxsKX1mdW5jdGlvbiBvKGUsdCxvKXtwP2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG8pOmYmJmUuZGV0YWNoRXZlbnQoIm9uIit0LG8pfWZ1bmN0aW9uIG4oZSx0LG8pe3ZhciBuLGksbDtmdW5jdGlvbiBhKCl7cmV0dXJuIHdpbmRvdy5pbm5lcldpZHRofHxuLmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aHx8ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aH1mdW5jdGlvbiByKCl7cmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodHx8bi5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fHxkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodH1mdW5jdGlvbiBzKGUpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCtpLW4uZG9jdW1lbnRFbGVtZW50LmNsaWVudFRvcH1mdW5jdGlvbiBjKGUpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQrbC1uLmRvY3VtZW50RWxlbWVudC5jbGllbnRMZWZ0fWZ1bmN0aW9uIGQoKXt2YXIgbjtyZXR1cm4obj10PT09d2luZG93P3IoKStpOnModCkrdC5vZmZzZXRIZWlnaHQpPD1zKGUpLW99ZnVuY3Rpb24gdSgpe3ZhciBuO3JldHVybihuPXQ9PT13aW5kb3c/YSgpK3dpbmRvdy5wYWdlWE9mZnNldDpjKHQpK2EoKSk8PWMoZSktb31mdW5jdGlvbiBfKCl7dmFyIG8sbj0xMjAwO3JldHVybihvPXQ9PT13aW5kb3c/aTpzKHQpKT49cyhlKStuK2Uub2Zmc2V0SGVpZ2h0fWZ1bmN0aW9uIGgoKXt2YXIgbjtyZXR1cm4obj10PT09d2luZG93P2w6Yyh0KSk+PWMoZSkrbytlLm9mZnNldFdpZHRofXJldHVybiBuPWUub3duZXJEb2N1bWVudCxpPXdpbmRvdy5wYWdlWU9mZnNldHx8bi5ib2R5LnNjcm9sbFRvcCxsPXdpbmRvdy5wYWdlWE9mZnNldHx8bi5ib2R5LnNjcm9sbExlZnQsImZpeGVkIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbnRlbnQtY292ZXItcGFyYWxsYXgiKSYmZS5jbG9zZXN0JiZlLmNsb3Nlc3QoIi50LWNvdmVyX19jb250YWluZXIiKSYmKGU9ZS5jbG9zZXN0KCIudC1jb3Zlcl9fY29udGFpbmVyIikpLCEoZCgpfHxfKCl8fHUoKXx8aCgpKX1mdW5jdGlvbiBpKCl7dmFyIGU7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9ZnVuY3Rpb24gbChlLHQpe3ZhciBvPXt9LG47Zm9yKG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYob1tuXT1lW25dKTtmb3IobiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJihvW25dPXRbbl0pO3JldHVybiBvfWZ1bmN0aW9uIGEoZSl7dmFyIHQ7dHJ5e3Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSl9Y2F0Y2gobCl7dmFyIG89W10sbixpPWUubGVuZ3RoO2ZvcihuPTA7bjxpO24rKylvLnB1c2goZVtuXSk7dD1vfXJldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuaXNTa2lwQnlQb3NpdGlvbj1udWxsPT09ZS5vZmZzZXRQYXJlbnQmJjA9PT1yKGUsIi50Mzk2X19jYXJyaWVyLXdyYXBwZXIiKS5sZW5ndGgmJiJmaXhlZCIhPT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1jb250ZW50LWNvdmVyLXBhcmFsbGF4IiksZS5pc05vdFVuZGVyU2NyZWVuUmFuZ2U9MD09PXIoZSwiLnQtcmVjW2RhdGEtc2NyZWVuLW1heF0iKS5sZW5ndGgmJjA9PT1yKGUsIi50LXJlY1tkYXRhLXNjcmVlbi1taW5dIikubGVuZ3RofSkpLHR9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbz1bXTsoZT1lLnBhcmVudE5vZGUpJiZlIT09ZG9jdW1lbnQ7KXQmJiFlLm1hdGNoZXModCl8fG8udW5zaGlmdChlKTtyZXR1cm4gb31mdW5jdGlvbiBzKGUsdCl7Zz9lLmNsYXNzTGlzdC5hZGQodCk6ZS5jbGFzc05hbWUrPShlLmNsYXNzTmFtZT8iICI6IiIpK3R9ZnVuY3Rpb24gYyhlLHQpe2c/ZS5jbGFzc0xpc3QucmVtb3ZlKHQpOmUuY2xhc3NOYW1lPWUuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgiKF58XFxzKykiK3QrIihcXHMrfCQpIiksIiAiKS5yZXBsYWNlKC9eXHMrLywiIikucmVwbGFjZSgvXHMrJC8sIiIpfWZ1bmN0aW9uIGQoZSx0LG8sbil7dmFyIGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtIituKSxsPXQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbyksYT1lLnRhZ05hbWU7cmV0dXJuIklNRyI9PT1hPyhsJiZlLnNldEF0dHJpYnV0ZSgic3Jjc2V0IixsKSx2b2lkKGkmJmUuc2V0QXR0cmlidXRlKCJzcmMiLGkpKSk6IklGUkFNRSI9PT1hP3ZvaWQoaSYmZS5zZXRBdHRyaWJ1dGUoInNyYyIsaSkpOnZvaWQoZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9InVybCgiK2krIikiKX1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBfKG8pe2UoKSx0aGlzLl9zZXR0aW5ncz1sKGgsbyksdGhpcy5fcXVlcnlPcmlnaW5Ob2RlPXRoaXMuX3NldHRpbmdzLmNvbnRhaW5lcj09PXdpbmRvdz9kb2N1bWVudDp0aGlzLl9zZXR0aW5ncy5jb250YWluZXIsdGhpcy5fcHJldmlvdXNMb29wVGltZT0wLHRoaXMuX2xvb3BUaW1lb3V0PW51bGwsdGhpcy5faGFuZGxlU2Nyb2xsRm49dSh0aGlzLmhhbmRsZVNjcm9sbCx0aGlzKSx0KHdpbmRvdywicmVzaXplIix0aGlzLl9oYW5kbGVTY3JvbGxGbiksdGhpcy51cGRhdGUoKX13aW5kb3cudF9sYXp5bG9hZF9zZXRTb3VyY2VzPWQ7dmFyIGgscCxmLGcsbT0hMTtyZXR1cm4gXy5wcm90b3R5cGUuX3Nob3dPbkxvYWQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe251bGwhPT1sJiYobC5jYWxsYmFja19sb2FkJiZsLmNhbGxiYWNrX2xvYWQoZSksZChlLGUsbC5kYXRhX3NyY3NldCxsLmRhdGFfc3JjKSxsLmNhbGxiYWNrX3NldCYmbC5jYWxsYmFja19zZXQoZSksYyhlLGwuY2xhc3NfbG9hZGluZykscyhlLGwuY2xhc3NfbG9hZGVkKSxvKGksImxvYWQiLG4pKX12YXIgaSxsPXRoaXMuX3NldHRpbmdzO2UuZ2V0QXR0cmlidXRlKCJzcmMiKXx8ZS5zZXRBdHRyaWJ1dGUoInNyYyIsbC5wbGFjZWhvbGRlciksdChpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLCJsb2FkIixuKSx0KGksImVycm9yIiwoZnVuY3Rpb24oKXtjKGUsbC5jbGFzc19sb2FkaW5nKSxsLmNhbGxiYWNrX2Vycm9yJiZsLmNhbGxiYWNrX2Vycm9yKGUpfSkpLHMoZSxsLmNsYXNzX2xvYWRpbmcpLGQoaSxlLGwuZGF0YV9zcmNzZXQsbC5kYXRhX3NyYyl9LF8ucHJvdG90eXBlLl9zaG93T25BcHBlYXI9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbigpe251bGwhPT1pJiYoaS5jYWxsYmFja19sb2FkJiZpLmNhbGxiYWNrX2xvYWQoZSksYyhlLGkuY2xhc3NfbG9hZGluZykscyhlLGkuY2xhc3NfbG9hZGVkKSxvKGUsImxvYWQiLG4pKX12YXIgaT10aGlzLl9zZXR0aW5nczsoIklNRyI9PT1lLnRhZ05hbWV8fCJJRlJBTUUiPT09ZS50YWdOYW1lKSYmKHQoZSwibG9hZCIsbiksdChlLCJlcnJvciIsKGZ1bmN0aW9uKCl7byhlLCJsb2FkIixuKSxjKGUsaS5jbGFzc19sb2FkaW5nKSxpLmNhbGxiYWNrX2Vycm9yJiZpLmNhbGxiYWNrX2Vycm9yKGUpfSkpLHMoZSxpLmNsYXNzX2xvYWRpbmcpKSxkKGUsZSxpLmRhdGFfc3Jjc2V0LGkuZGF0YV9zcmMpLGkuY2FsbGJhY2tfc2V0JiZpLmNhbGxiYWNrX3NldChlKX0sXy5wcm90b3R5cGUuX2xvb3BUaHJvdWdoRWxlbWVudHM9ZnVuY3Rpb24oKXt2YXIgZSx0LG89dGhpcy5fc2V0dGluZ3MsaT10aGlzLl9lbGVtZW50cyxsPWk/aS5sZW5ndGg6MCxhPVtdO2ZvcihlPTA7bD5lO2UrKyl0PWlbZV0sby5za2lwX2ludmlzaWJsZSYmdC5pc1NraXBCeVBvc2l0aW9ufHxuKHQsby5jb250YWluZXIsby50aHJlc2hvbGQpJiYoby5zaG93X3doaWxlX2xvYWRpbmc/dGhpcy5fc2hvd09uQXBwZWFyKHQpOnRoaXMuX3Nob3dPbkxvYWQodCksYS5wdXNoKGUpLHQud2FzUHJvY2Vzc2VkPSEwKTtmb3IoO2EubGVuZ3RoPjA7KWkuc3BsaWNlKGEucG9wKCksMSksby5jYWxsYmFja19wcm9jZXNzZWQmJm8uY2FsbGJhY2tfcHJvY2Vzc2VkKGkubGVuZ3RoKTswPT09bCYmdGhpcy5fc3RvcFNjcm9sbEhhbmRsZXIoKX0sXy5wcm90b3R5cGUuX3B1cmdlRWxlbWVudHM9ZnVuY3Rpb24oKXt2YXIgZSx0LG89dGhpcy5fZWxlbWVudHMsbj1vLmxlbmd0aCxpPVtdO2ZvcihlPTA7bj5lO2UrKykodD1vW2VdKS53YXNQcm9jZXNzZWQmJmkucHVzaChlKTtmb3IoO2kubGVuZ3RoPjA7KW8uc3BsaWNlKGkucG9wKCksMSl9LF8ucHJvdG90eXBlLl9zdGFydFNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oKXt0aGlzLl9pc0hhbmRsaW5nU2Nyb2xsfHwodGhpcy5faXNIYW5kbGluZ1Njcm9sbD0hMCx0KHRoaXMuX3NldHRpbmdzLmNvbnRhaW5lciwic2Nyb2xsIix0aGlzLl9oYW5kbGVTY3JvbGxGbikpfSxfLnByb3RvdHlwZS5fc3RvcFNjcm9sbEhhbmRsZXI9ZnVuY3Rpb24oKXt0aGlzLl9pc0hhbmRsaW5nU2Nyb2xsJiYodGhpcy5faXNIYW5kbGluZ1Njcm9sbD0hMSxvKHRoaXMuX3NldHRpbmdzLmNvbnRhaW5lciwic2Nyb2xsIix0aGlzLl9oYW5kbGVTY3JvbGxGbikpfSxfLnByb3RvdHlwZS5oYW5kbGVTY3JvbGw9ZnVuY3Rpb24oKXt2YXIgZSx0LG87dGhpcy5fc2V0dGluZ3MmJih0PWkoKSwwIT09KG89dGhpcy5fc2V0dGluZ3MudGhyb3R0bGUpPzA+PShlPW8tKHQtdGhpcy5fcHJldmlvdXNMb29wVGltZSkpfHxlPm8/KHRoaXMuX2xvb3BUaW1lb3V0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX2xvb3BUaW1lb3V0KSx0aGlzLl9sb29wVGltZW91dD1udWxsKSx0aGlzLl9wcmV2aW91c0xvb3BUaW1lPXQsdGhpcy5fbG9vcFRocm91Z2hFbGVtZW50cygpKTp0aGlzLl9sb29wVGltZW91dHx8KHRoaXMuX2xvb3BUaW1lb3V0PXNldFRpbWVvdXQodSgoZnVuY3Rpb24oKXt0aGlzLl9wcmV2aW91c0xvb3BUaW1lPWkoKSx0aGlzLl9sb29wVGltZW91dD1udWxsLHRoaXMuX2xvb3BUaHJvdWdoRWxlbWVudHMoKX0pLHRoaXMpLGUpKTp0aGlzLl9sb29wVGhyb3VnaEVsZW1lbnRzKCkpfSxfLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9lbGVtZW50cz1hKHRoaXMuX3F1ZXJ5T3JpZ2luTm9kZS5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuX3NldHRpbmdzLmVsZW1lbnRzX3NlbGVjdG9yKSksdGhpcy5fcHVyZ2VFbGVtZW50cygpLHRoaXMuX2xvb3BUaHJvdWdoRWxlbWVudHMoKSx0aGlzLl9zdGFydFNjcm9sbEhhbmRsZXIoKX0sXy5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe28od2luZG93LCJyZXNpemUiLHRoaXMuX2hhbmRsZVNjcm9sbEZuKSx0aGlzLl9sb29wVGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl9sb29wVGltZW91dCksdGhpcy5fbG9vcFRpbWVvdXQ9bnVsbCksdGhpcy5fc3RvcFNjcm9sbEhhbmRsZXIoKSx0aGlzLl9lbGVtZW50cz1udWxsLHRoaXMuX3F1ZXJ5T3JpZ2luTm9kZT1udWxsLHRoaXMuX3NldHRpbmdzPW51bGx9LF99KSksd2luZG93Lmxhenk9InkiLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2xhenlsb2FkX2NvdmVyPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWNvdmVyX19jYXJyaWVyIixzaG93X3doaWxlX2xvYWRpbmc6ITEsZGF0YV9zcmM6ImNvbnRlbnQtY292ZXItYmciLHBsYWNlaG9sZGVyOiIiLHRocmVzaG9sZDo3MDB9KX0pLDEwMCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpZihsYXp5bG9hZF9pbWc9bmV3IExhenlMb2FkKHtlbGVtZW50c19zZWxlY3RvcjoiLnQtaW1nIix0aHJlc2hvbGQ6ODAwfSksbGF6eWxvYWRfYmdpbWc9bmV3IExhenlMb2FkKHtlbGVtZW50c19zZWxlY3RvcjoiLnQtYmdpbWciLHNob3dfd2hpbGVfbG9hZGluZzohMSxwbGFjZWhvbGRlcjoiIix0aHJlc2hvbGQ6ODAwfSksbGF6eWxvYWRfaWZyYW1lPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWlmcmFtZSJ9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzbGlkZS5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bGF6eWxvYWRfY292ZXIudXBkYXRlKCksbGF6eWxvYWRfaW1nLnVwZGF0ZSgpLGxhenlsb2FkX2JnaW1nLnVwZGF0ZSgpfSksNTAwKX0pKSwvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFkb2N1bWVudC5ib2R5LmNsYXNzTGlzdCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc0xpc3QuYWRkKCJ0LW1iZml4IiksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1tYmZpeCIpO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5jbGFzc0xpc3QuYWRkKCJ0LW1iZml4X2hpZGUiKX0pLDUwKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe251bGwhPT10LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX0pLDFlMyl9fSksNTAwKX0pKTsKCmZ1bmN0aW9uIHRfYW5pbWF0ZV9faW5pdCgpe3RfYW5pbWF0ZV9fY2hlY2tBbmltYXRpb25BdmFpbGFiaWxpdHkoKSYmKHRfYW5pbWF0ZV9fZ2VuZXJhdGVTdHlsZXMoKSx0X2FuaW1hdGVfX3dyYXBUZXh0V2l0aE9wYWNpdHkoKSx0X2FuaW1hdGVfX2FkZE5vSG92ZXJDbGFzc1RvQnRucygpLHRfYW5pbWF0ZV9fcHJldmVudEhvcml6b250YWxTY3JvbGwoKSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg+PTEyMDAmJnRfYW5pbWF0ZV9fcGFyc2VOdW1iZXJUZXh0KCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX3N0YXJ0QW5pbWF0aW9uKCl9KSwxNTAwKSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja01vYmlsZSh0KXtyZXR1cm4gdC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2VsZW0sIC50Mzk2X19ncm91cCIpLGEsbjtyZXR1cm4hKCFlfHwieSIhPT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW1vYmlsZSIpKXx8KHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyIik/QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKSwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCIiKX0pKTp0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsIiIpLCExKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsZSl7aWYodCl7dmFyIGE9InQtYW5pbWF0ZSI7dC5jbGFzc0xpc3QucmVtb3ZlKGEpLGUmJigic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSksZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1hKyJfIitlO3QuY2xhc3NMaXN0LnJlbW92ZShuKX0pKSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcHJldmVudEhvcml6b250YWxTY3JvbGwoKXt2YXIgdCxlPUFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdJykpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkLCAudC1jb3ZlciIpJiZ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0PndpbmRvdy5pbm5lcldpZHRofSkpOyFlLmxlbmd0aHx8d2luZG93LmlubmVyV2lkdGg8OTgwfHxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2xvc2VzdCgiLnIiKS5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX292ZXJmbG93LXgtaGlkZGVuIil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja0FuaW1hdGlvbkF2YWlsYWJpbGl0eSgpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXJlY29yZHMiKSxlPXQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2tzLWFuaW1hdGlvbm9mZiIpOm51bGwsYT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKTpudWxsO2lmKC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwieWVzIj09PWV8fHRfYW5pbWF0ZV9fY2hlY2tJRSgpfHwiZWRpdCI9PT1hKXt2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCIiKX0pKSwhMX1yZXR1cm4hMH1mdW5jdGlvbiB0X2FuaW1hdGVfX2dlbmVyYXRlU3R5bGVzKCl7dmFyIHQ7aWYoISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDM5NiIpKXtmb3IodmFyIGU9dF9hbmltYXRlX19nZXRCcmVha3BvaW50c0FycigpLGE9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWludXAiXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWluZG93biJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5sZWZ0Il0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnJpZ2h0Il0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29tb3V0Il0ge29wYWNpdHk6IDA7LXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07dHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtOy13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xOSwgMSwgMC4yMiwgMSk7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO30nLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIi50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9ImZhZGVpbnVwIl0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLScraS5taW5SZXMrJz0iZmFkZWluZG93biJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9ImZhZGVpbmxlZnQiXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJmYWRlaW5yaWdodCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9Inpvb21pbiJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9Inpvb21vdXQiXSB7b3BhY2l0eTogMDstd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHksIHRyYW5zZm9ybTt0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAxczt0cmFuc2l0aW9uLWR1cmF0aW9uOiAxczstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xOSwgMSwgMC4yMiwgMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE5LCAxLCAwLjIyLCAxKTstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47fX0nKX1hKz0nLnQzOTYgLnQtdGl0bGUudC1hbmltYXRlIHstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDEuMnM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMS4yczt9LnQzOTYgLnQtZGVzY3IudC1hbmltYXRlLC50Mzk2IC50LXVwdGl0bGUudC1hbmltYXRlLC50Mzk2IC50LXN1YnRpdGxlLnQtYW5pbWF0ZSwudDM5NiAudC10ZXh0LnQtYW5pbWF0ZSB7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjdzO3RyYW5zaXRpb24tZHVyYXRpb246IDAuN3M7fS50Mzk2IC50LWl0ZW0udC1hbmltYXRlIHstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMC41czt9LnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbiJdIHtvcGFjaXR5OiAwO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbiJdIHtvcGFjaXR5OiAwO3RyYW5zZm9ybTogbm9uZTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW4iXSB7b3BhY2l0eTogMTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWluIl0ge29wYWNpdHk6IDE7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnVwIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbnVwIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW51cCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWludXAiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmRvd24iXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMTAwcHgpO3RyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC0xMDBweCk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW5kb3duIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMTAwcHgpO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmRvd24iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbmRvd24iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDBweCwgMCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoMTAwcHgsIDApO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlubGVmdCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDEwMHB4LCAwKTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDBweCwgMCk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlubGVmdCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9fScpfWErPScudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlucmlnaHQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIDApO3RyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDBweCwgMCk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW5yaWdodCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDBweCwgMCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwMHB4LCAwKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5yaWdodCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBub25lO3RyYW5zZm9ybTogbm9uZTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlucmlnaHQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdIHstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC45KTt0cmFuc2Zvcm06IHNjYWxlKDAuOSk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29taW4iXSB7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuOSk7dHJhbnNmb3JtOiBzY2FsZSgwLjkpO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21pbiJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTt0cmFuc2Zvcm06IHNjYWxlKDEpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29taW4iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7dHJhbnNmb3JtOiBzY2FsZSgxKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iem9vbW91dCJdIHstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4yKTt0cmFuc2Zvcm06IHNjYWxlKDEuMik7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29tb3V0Il0gey13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjIpO3RyYW5zZm9ybTogc2NhbGUoMS4yKTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29tb3V0Il0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO3RyYW5zZm9ybTogc2NhbGUoMSk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9Inpvb21vdXQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7dHJhbnNmb3JtOiBzY2FsZSgxKTt9fScpfWErPSIudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLWRpc3RhbmNlXSwudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXNjYWxlXXstd2Via2l0LXRyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O3RyYW5zZm9ybTogbm9uZSAhaW1wb3J0YW50O30iO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1kaXN0YW5jZS1yZXMtIitpLm1pblJlcysiXSwjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9Inpvb21vdXQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt9fScpfXZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksbz1kb2N1bWVudC5oZWFkfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJoZWFkIik7ci50ZXh0Q29udGVudD1hLG8uYXBwZW5kQ2hpbGQocil9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0QnJlYWtwb2ludHNBcnIoKXt2YXIgdD1bXSxlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yW2RhdGEtcmVjb3JkLXR5cGU9IjM5NiJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yW2RhdGEtcGFyZW50dHBsaWQ9IjM5NiJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnKSk7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSl7aWYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkIikpe3ZhciBhPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXNjcmVlbnMiKSxuPShhPShhPWE/YS5zcGxpdCgiLCIpOlsxMjAwLDk2MCw2NDAsNDgwLDMyMF0pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQsMTApfSkpKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybi0xPT09dC5pbmRleE9mKGUpfSkpO3Q9dC5jb25jYXQobil9fSkpLHQ9dF9hbmltYXRlX19zb3J0QXJyKHQpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeSh0LGUpe3ZhciBhPSIiLG49ITEsaT10W2UrMV0scj10W2VdLTEsbz1lPT09dC5sZW5ndGgtMSxzPWU9PT10Lmxlbmd0aC0yO3JldHVybiBvP249ITA6YSs9cz8iQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogIityKyJweCkgeyI6IkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICIraSsicHgpIGFuZCAobWF4LXdpZHRoOiAiK3IrInB4KSB7Iix7dGV4dDphLGlzQ29udGludWU6bixtaW5SZXM6aX19ZnVuY3Rpb24gdF9hbmltYXRlX19zb3J0QXJyKHQpe3JldHVybiB0LnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3N0YXJ0QW5pbWF0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIiKSxlPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCh0LChmdW5jdGlvbih0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1ncm91cD15ZXNdIil9KSksYT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcignLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49InllcyJdJyl9KSksbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7aWYobj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuISgieWVzIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtZ3JvdXAiKXx8InllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIil8fHQuZ2V0QXR0cmlidXRlKCJvYnNlcnZlci1yZWFkeSIpKX0pKSx3aW5kb3cuaW5uZXJXaWR0aDwxMjAwJiYoZT10X2FuaW1hdGVfX2NoZWNrTW9iaWxlKGUpLGE9dF9hbmltYXRlX19jaGVja01vYmlsZShhKSxuPXRfYW5pbWF0ZV9fY2hlY2tNb2JpbGUobikpLGUubGVuZ3RofHxuLmxlbmd0aHx8YS5sZW5ndGgpe3RfYW5pbWF0ZV9fc2V0QW5pbWF0aW9uU3RhdGUoZSxhLG4pLGU9dF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKGUpLG49dF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKG4pLGE9dF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKGEpO3ZhciBpPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiYvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSooc2FmYXJpfG1vYmlsZSkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYvKG9zIHx2ZXJzaW9uXC8pMTUoLnxfKVs0LTldL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93JiYhaSl7aWYoZS5sZW5ndGgpe3ZhciByPVtdO2UuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlIiksYSxuO2lmKCJmYWRlaW5kb3duIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3R5bGUiKSYmZS5jbG9zZXN0KCIudC1jb3ZlciIpKXt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGU6bm90KDpmaXJzdC1jaGlsZCkiKTtpJiYoZT1pKX1yLnB1c2goZSl9KSksci5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT17cm9vdE1hcmdpbjp0Lm9mZnNldEhlaWdodC81Ki0xKyJweCAwcHgifSxhO25ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHQuaXNJbnRlcnNlY3Rpbmcpe3ZhciBhPXQudGFyZ2V0O2UudW5vYnNlcnZlKGEpO3ZhciBuPWEuY2xvc2VzdCgiLnIiKS5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7bj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuISh0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpfHwieWVzIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtY2hhaW4iKSl9KSksdF9hbmltYXRlX19tYWtlU2VjdGlvbkJ1dHRvbldhaXQoYSksdF9hbmltYXRlX19zYXZlU2VjdGlvbkhlYWRlclN0YXJ0VGltZShhKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX3dhaXQiKSx0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKHQpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCExKX0pKX19KSl9KSxlKS5vYnNlcnZlKHQpfSkpfXZhciBvO2lmKG4ubGVuZ3RoJiZuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXt9LGE9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInRyaWdnZXItb2Zmc2V0Iik7YSYmKGUucm9vdE1hcmdpbj0iMHB4IDBweCAiKy0xKmEucmVwbGFjZSgicHgiLCIiKSsicHggMHB4Iik7dmFyIG49bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbih0LGUpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGE9dC50YXJnZXQ7aWYoIWEuZGVtYW5kVHJhbnNmb3JtJiZhLnN0eWxlLnRyYW5zZm9ybSlhLmRlbWFuZFRyYW5zZm9ybT1hLnN0eWxlLnRyYW5zZm9ybSxhLnN0eWxlLnRyYW5zZm9ybT0idW5zZXQiO2Vsc2V7dmFyIG49d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkudHJhbnNmb3JtO2Euc3R5bGUudHJhbnNmb3JtfHwibm9uZSI9PT1ufHwoYS5kZW1hbmRUcmFuc2Zvcm09bixhLnN0eWxlLnRyYW5zZm9ybT0idW5zZXQiKX1pZih0LmlzSW50ZXJzZWN0aW5nKXthLmNsb3Nlc3QoIi50MTA5MyIpfHxlLnVub2JzZXJ2ZShhKTt2YXIgaT1hLnN0eWxlLnRyYW5zaXRpb25EZWxheXx8IjBtcyI7aT0tMSE9PWkuaW5kZXhPZigibXMiKT9wYXJzZUludChpKSsyNTA6MWUzKnBhcnNlRmxvYXQoaSkrMjUwO3ZhciByPWZ1bmN0aW9uIHQoKXthLmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyhhKSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MoYSwhMCksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShhLCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKGEpfTthLmRlbWFuZFRyYW5zZm9ybSYmLTEhPT1hLmRlbWFuZFRyYW5zZm9ybS5pbmRleE9mKCJtYXRyaXgiKSYmKGEuc3R5bGUudHJhbnNmb3JtPSIiKSxhLmRlbWFuZFRyYW5zZm9ybSYmInVuc2V0Ij09PWEuc3R5bGUudHJhbnNmb3JtJiYoYS5zdHlsZS50cmFuc2Zvcm09YS5kZW1hbmRUcmFuc2Zvcm0sZGVsZXRlIGEuZGVtYW5kVHJhbnNmb3JtKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3IoKX0pLGkpfX0pKX0pLGUpO3QuZGF0YXNldC5vYnNlcnZlclJlYWR5PSEwLG4ub2JzZXJ2ZSh0KX0pKSxhLmxlbmd0aCkobz1mdW5jdGlvbiB0KCl7dF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHMoYSl9KSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7bygpfSkpKSxzZXRJbnRlcnZhbChvLDVlMyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2YXIgdCxlPXdpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQ7dF9hbmltYXRlX19hbmltYXRlQ2hhaW5zQmxvY2tzKGEsZSl9KSkpfWVsc2V7dmFyIG87KG89ZnVuY3Rpb24gdCgpe3RfYW5pbWF0ZV9fZ2V0R3JvdXBzT2Zmc2V0cyhlKSx0X2FuaW1hdGVfX2dldENoYWluT2Zmc2V0cyhhKSx0X2FuaW1hdGVfX2dldEVsZW1zT2Zmc2V0cyhuKX0pKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZShvKSksc2V0SW50ZXJ2YWwobyw1ZTMpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dmFyIHQ9dF9hbmltYXRlX19kZWxldGVBbmltYXRlZEVscyhlLG4pO249dFswXTt2YXIgaT10X2FuaW1hdGVfX2FuaW1hdGVPblNjcm9sbChlPXRbMV0sYSxuKTtpJiZpLmxlbmd0aCYmKGU9aVswXSxhPWlbMV0sbj1pWzJdKX0pKSl9QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwIik7ZSYmZS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LnBhZ2VZT2Zmc2V0K3dpbmRvdy5pbm5lckhlaWdodDtpZihlLmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlIikmJiJ5ZXMiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpfHxlLnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVbZGF0YS1hbmltYXRlLWNoYWluPXllc10iKSl7dmFyIGE9W2VdO3RfYW5pbWF0ZV9fc2V0QW5pbWF0aW9uU3RhdGVDaGFpbnMoYSksdF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHMoYT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSwoZnVuY3Rpb24odCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZV93YWl0Iil9KSkpLHRfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluc0Jsb2NrcyhhLHQpfX0pKSl9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZU9uU2Nyb2xsKHQsZSxhKXtpZih0Lmxlbmd0aHx8ZS5sZW5ndGh8fGEubGVuZ3RoKXt2YXIgbj13aW5kb3cucGFnZVlPZmZzZXQsaT1uK3dpbmRvdy5pbm5lckhlaWdodCxyLG8scztyZXR1cm5bdF9hbmltYXRlX19hbmltYXRlR3JvdXBzKHQsaSxuKSx0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbnNCbG9ja3MoZSxpLG4pLHRfYW5pbWF0ZV9fYW5pbWF0ZUVsZW1zKGEsaSxuKV19fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUdyb3Vwcyh0LGUpe3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHQuY3VyVG9wT2Zmc2V0PGUpe3ZhciBhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO2E9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGEsKGZ1bmN0aW9uKHQpe3JldHVybiEodC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKXx8InllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIikpfSkpLHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KHQpLHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUodCksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSl9KSl9fSkpLHR9ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlQ2hhaW5zQmxvY2tzKHQsZSl7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5pdGVtc09mZnNldHNbMF08ZSYmdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX3dhaXQiKS5sZW5ndGgmJih0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbkl0ZW1zT25TY3JvbGwodCxlKSx0Lml0ZW1zT2Zmc2V0cy5sZW5ndGgmJnRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uX19vdXRPZlR1cm4odCkpfSkpLHR9ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlRWxlbXModCxlLGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIG49dF9hbmltYXRlX19kZXRlY3RFbGVtVHJpZ2dlck9mZnNldCh0LGUpO3JldHVybiB0LmN1clRvcE9mZnNldDxuPyh0LmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpLCEwKTohKHQuY3VyVG9wT2Zmc2V0PGEpJiZ2b2lkIDB9KSksdH1mdW5jdGlvbiB0X2FuaW1hdGVfX2RlbGV0ZUFuaW1hdGVkRWxzKHQsZSl7dmFyIGE9d2luZG93LnBhZ2VZT2Zmc2V0LG49W10saT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmN1clRvcE9mZnNldDw9YSl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsWyJ3YWl0Iiwibm8taG92ZXIiXSl9KSl9ZWxzZSBuLnB1c2godCl9KSksZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmN1clRvcE9mZnNldDw9YT8odF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LFsid2FpdCIsIm5vLWhvdmVyIl0pLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCExKSk6aS5wdXNoKHQpfSkpLFtpLG5dfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluSXRlbXNPblNjcm9sbCh0LGUpe3ZhciBhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV93YWl0W2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIik7YT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTt2YXIgbj0wLGk9MCxyPXQuaXRlbXNPZmZzZXRzWzBdLG89LjE2LHM9dF9hbmltYXRlX19nZXREZWxheUZyb21QcmV2aW91c1Njcm9sbEV2ZW50KHQsbyksbD10X2FuaW1hdGVfX2dldFNlY3Rpb25IZWFkRGVhbHkodCk7YS5sZW5ndGgmJmFbMF0uY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKTtmb3IodmFyIG09MDttPGEubGVuZ3RoO20rKyl7dmFyIGM9YVttXSxfPXQuaXRlbXNPZmZzZXRzW21dO2lmKCEoXzxlKSlicmVhaztfIT09ciYmKGMuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKSxuPSsraSxyPV8pO3ZhciBmPW4qbytzK2w7Yy5zdHlsZS50cmFuc2l0aW9uRGVsYXk9ZisicyIsYy5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyhjLCExKSxjLnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiLERhdGUubm93KCkrMWUzKmYpLGNbMF09PT1hW2EubGVuZ3RoLTFdJiZ0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbih0LGYpLCtfPT0rciYmbisrLGEuc3BsaWNlKG0sMSksdC5pdGVtc09mZnNldHMuc3BsaWNlKG0sMSksbS0tfXRfYW5pbWF0ZV9fY2F0Y2hUcmFuc2l0aW9uRW5kRXZlbnQodCl9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRTZWN0aW9uSGVhZERlYWx5KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2VjdGlvbl9fdGl0bGUudC1hbmltYXRlIiksYT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNlY3Rpb25fX2Rlc2NyLnQtYW5pbWF0ZSIpLG49MDtpZihlKXt2YXIgaT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiKXx8MDtpZihEYXRlLm5vdygpLWk8PTE2MClyZXR1cm4gbj0uMTZ9aWYoYSl7dmFyIHI9YS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIil8fDA7aWYoRGF0ZS5ub3coKS1yPD0xNjApcmV0dXJuIG49LjE2fXJldHVybiBufWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0RGVsYXlGcm9tUHJldmlvdXNTY3JvbGxFdmVudCh0LGUpe3ZhciBhPSF0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfc3RhcnRlZCIpLmxlbmd0aCxuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93LnQtYW5pbWF0ZV9zdGFydGVkIik7aWYobj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfX2NoYWluX3Nob3dlZCIpfSkpLGF8fCFuLmxlbmd0aClyZXR1cm4gMDtpZihuLmxlbmd0aCl7dmFyIGkscixvPShuW24ubGVuZ3RoLTFdLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiKXx8MCktRGF0ZS5ub3coKTtyZXR1cm4gbzw9MD9lOm8vMWUzK2V9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LGUpe2lmKHQpe2lmKGUpe3ZhciBhPSJ0LWFuaW1hdGUtZm9yLXdyYXBwZXIiLG49dC5jbG9zZXN0KCIuIithKTtuJiZuLmNsYXNzTGlzdC5yZW1vdmUoYSl9dmFyIGk7aWYodC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfc3RhcnRlZCIpLCJmYWRlaW5sZWZ0Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3R5bGUiKSl7dmFyIHI9dC5jbG9zZXN0KCIudC1hbmltYXRlX19vdmVyZmxvdy14LWhpZGRlbiIpO3ImJiFyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXTpub3QoLnQtYW5pbWF0ZV9zdGFydGVkKScpJiZyLmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV9fb3ZlcmZsb3cteC1oaWRkZW4iKX19fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2F0Y2hUcmFuc2l0aW9uRW5kRXZlbnQodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3cudC1hbmltYXRlX3N0YXJ0ZWQiKTtlPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9fY2hhaW5fc2hvd2VkIil9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt2YXIgZTtbInRyYW5zaXRpb25lbmQiLCJ3ZWJraXRUcmFuc2l0aW9uRW5kIiwib1RyYW5zaXRpb25FbmQiLCJvdHJhbnNpdGlvbmVuZCIsIk1TVHJhbnNpdGlvbkVuZCJdLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuYWRkRXZlbnRMaXN0ZW5lcihlLChmdW5jdGlvbigpe3RfYW5pbWF0ZV9fYWRkRXZlbnRPbkFuaW1hdGVDaGFpbih0KX0pKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSwoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4odCl9KSl9KSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19wYXJzZU51bWJlclRleHQoKXt2YXIgdD13aW5kb3cucGFnZVlPZmZzZXQsZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0nYW5pbWF0ZWRudW1iZXInXSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSl7dmFyIGEsbj0iIixpPWUucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7bis9dC5nZXRBdHRyaWJ1dGUoInN0eWxlIil8fCIiLHQucmVtb3ZlQXR0cmlidXRlKCJzdHlsZSIpLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXJlZGFjdG9yLXN0eWxlIil9KSksZS5xdWVyeVNlbGVjdG9yQWxsKCdkaXZbZGF0YS1jdXN0b21zdHlsZT0ieWVzIl0nKS5sZW5ndGgpe3ZhciByPWUucXVlcnlTZWxlY3RvcignZGl2W2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJyk7YT1yP3IuaW5uZXJIVE1MOiIiO3ZhciBvPWUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpfHwiIixzPWUucXVlcnlTZWxlY3RvcigiZGl2W2RhdGEtY3VzdG9tc3R5bGVdIiksbD1zP3MuZ2V0QXR0cmlidXRlKCJzdHlsZSIpOiIiO2wmJihvKz1sKSxlLnNldEF0dHJpYnV0ZSgic3R5bGUiLG8pfWVsc2UgYT1lLmlubmVySFRNTDtpZihuPW4uc3BsaXQoIjsiKS5maWx0ZXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uc3BsaXQoIjsiKS5pbmRleE9mKHQpPT09ZX0pKS5qb2luKCI7IiksIShlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ8dC01MDApJiZhLmxlbmd0aCl7dmFyIG09YS5yZXBsYWNlKC88YnI+L2csIiAiKS5yZXBsYWNlKC9bXlxkLiwgXSsvZywiIikucmVwbGFjZSgvIChcLnwsKS9nLCIiKS5yZXBsYWNlKC8oXGQpKD89XGQpIC9nLCIkMSIpLnRyaW0oKSxjPW07aWYoLTE9PT1hLmluZGV4T2YobSkmJihjPW09bS5zcGxpdCgiICIpWzBdKSwiIiE9PW0pe2Uuc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbnVtYmVyLWNvdW50IixhKSx0X2FuaW1hdGVfX2NoYW5nZU51bWJlck9uWmVybyhlLGEucmVwbGFjZShjLCJudW0iKSk7dmFyIF89ZS5xdWVyeVNlbGVjdG9yQWxsKCJzcGFuIik7Xz1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoXywoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCIudC1hbmltYXRlX19udW1iZXIiKX0pKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKF8sKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJzdHlsZSIsbil9KSl9fX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NoYW5nZU51bWJlck9uWmVybyh0LGUpe3QuaW5uZXJIVE1MPWUucmVwbGFjZSgvbnVtL2csJzxzcGFuIGNsYXNzPSJ0LWFuaW1hdGVfX251bWJlciI+MDwvc3Bhbj4nKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpe2lmKCF0KXJldHVybiExO3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbnVtYmVyLWNvdW50IiksYT1bXSxuPXQucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpOyhuPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChuLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoIi50LWFuaW1hdGVfX251bWJlciIpfSkpKS5sZW5ndGgmJihhPW5bMF0uZ2V0QXR0cmlidXRlKCJzdHlsZSIpfHwiIik7dmFyIGk9W10scj1udWxsO2lmKGUpe3I9ZS5tYXRjaCgvXGQrXC5cZCt8XGQrLFxkKy9nKTt2YXIgbz1lLm1hdGNoKC9cZCsvZykscyxsO2UucmVwbGFjZSgvKFxkKSg/PSBcZCkgL2csIiQxIikuc3BsaXQoIiAiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpc05hTihwYXJzZUludCh0LnJlcGxhY2UoL1teXGQuLCBdKy9nLCIiKSwxMCkpfHxpLnB1c2godC5yZXBsYWNlKC9bXlxkLiwgXSsvZywiIikpfSkpfXZhciBtPTAsYz0hMSxfPSExO3QucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbnVtYmVyLWNvdW50IiksbnVsbCE9PXImJihfPS0xIT09clswXS5pbmRleE9mKCIsIikpLGkuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgYTtudWxsIT09ciYmKC0xIT09dC5pbmRleE9mKCIsIikmJihhPXQuc3BsaXQoIiwiKSksLTEhPT10LmluZGV4T2YoIi4iKSYmKGE9dC5zcGxpdCgiLiIpKSwtMT09PXQuaW5kZXhPZigiLCIpJiYtMT09PXQuaW5kZXhPZigiLiIpfHwobT1hWzFdLmxlbmd0aCxpW2VdPSthLmpvaW4oIi4iKSxjPSEwKSl9KSk7dmFyIGY9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlX19udW1iZXIiKTtpZihpWzBdKXt2YXIgZD1OdW1iZXIoaVswXSl8fDAsdT0wLHk9TWF0aC5wb3coMTAsbSk7YyYmKGQqPXksdSo9eSk7dmFyIHA9MTIsaD0wLGc9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7aWYodSs9ZC8xMDgsaD1jPyhNYXRoLnJvdW5kKHUpL3kpLnRvRml4ZWQobSkrIiI6TWF0aC5mbG9vcih1KSsiIixvLmxlbmd0aD4xJiYoaD1oLnJlcGxhY2UoLyhcZCkoPz0oXGR7M30pKyhbXlxkXXwkKSkvZywiJDEgIikpLF8mJihoPWgucmVwbGFjZSgvXC4vZywiLCIpKSxmJiYoZi50ZXh0Q29udGVudD1oKSx1Pj1kKXtjbGVhckludGVydmFsKGcpLHQuaW5uZXJIVE1MPWU7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCJzcGFuIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpfSkpfX0pLHApfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlKHQsZSxhKXt2YXIgbj13aW5kb3cucGFnZVlPZmZzZXQsaT1uK3dpbmRvdy5pbm5lckhlaWdodDt0X2FuaW1hdGVfX3NldEdyb3Vwc0Jsb2Nrc1N0YXRlKHQsbixpKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fYXNzaWduQ2hhaW5EZWxheSh0LGksbiksdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb25fX291dE9mVHVybih0KX0pKSx0X2FuaW1hdGVfX3NldEFuaW1FTGVtc1N0YXRlKGEsbixpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKHRfYW5pbWF0ZV9fcmVtb3ZlSW5saW5lQW5pbVN0eWxlcykpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0QW5pbUVMZW1zU3RhdGUodCxlLGEpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0O2lmKG48ZS01MDApcmV0dXJuIHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwibm8taG92ZXIiKSwiYW5pbWF0ZWRudW1iZXIiPT09dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInN0eWxlIikmJnRfYW5pbWF0ZV9fYW5pbWF0ZU51bWJlcnModCksITA7dmFyIGk9dF9hbmltYXRlX19kZXRlY3RFbGVtVHJpZ2dlck9mZnNldCh0LGEpO3RfYW5pbWF0ZV9fc2V0Q3VzdG9tQW5pbVNldHRpbmdzKHQsbixhKSxuPGkmJiF0LmNsb3Nlc3QoIi50MTA5MyIpJiYodF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMCksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpKSwobj49aXx8dC5jbG9zZXN0KCIudDEwOTMiKSkmJnQuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3dhaXQiKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldEdyb3Vwc0Jsb2Nrc1N0YXRlKHQsZSxhKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO249QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiEoInllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIikpfSkpO3ZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDt0X2FuaW1hdGVfX3JlbW92ZUFuaW1Gcm9tSGlkZGVuU2xpZGVzKHQpO3ZhciByPXRfYW5pbWF0ZV9fYXNzaWduU2VjdGlvbkRlbGF5KHQpO3RfYW5pbWF0ZV9fYXNzaWduR3JvdXBEZWxheSh0LHIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24obil7dmFyIHI9bi5jbG9zZXN0KCIudDM5N19fb2ZmIil8fG4uY2xvc2VzdCgiLnQzOTVfX29mZiIpfHxuLmNsb3Nlc3QoIi50NDAwX19vZmYiKTtpZihuLmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX25vLWhvdmVyIikmJnImJm4uY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX25vLWhvdmVyIiksaTw9ZS0xMDApcmV0dXJuIHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUodCksdF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyhuLCJuby1ob3ZlciIpLG4uc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIiLCEwO2k8YSYmaT5lLTEwMCYmKHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KHQpLG4uY2xhc3NMaXN0LmNvbnRhaW5zKCIudC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpfHwodF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyhuKSxyP24uY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3dhaXQiKTp0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MobiwhMSkpKSxpPj1hJiZuLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV93YWl0Iil9KSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRBbmltYXRpb25TdGF0ZUNoYWlucyh0KXtpZighdHx8IXQubGVuZ3RoKXJldHVybiExO3ZhciBlPXdpbmRvdy5wYWdlWU9mZnNldCxhPWUrd2luZG93LmlubmVySGVpZ2h0O0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19hc3NpZ25DaGFpbkRlbGF5KHQsYSxlKSx0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbl9fb3V0T2ZUdXJuKHQpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYXNzaWduU2VjdGlvbkRlbGF5KHQpe3ZhciBlPTAsYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX3RpdGxlLnQtYW5pbWF0ZSIpLG49dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX19kZXNjci50LWFuaW1hdGUiKTtyZXR1cm4gYS5sZW5ndGgmJihlPS4xNiksbi5sZW5ndGgmJihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWUrInMifSkpLGUrPS4xNiksZX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnbkdyb3VwRGVsYXkodCxlKXt2YXIgYT0wO2lmKHQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtYW5pbWF0ZS1vcmRlcl0iKS5sZW5ndGgpdF9hbmltYXRlX19hc3NpZ25PcmRlcmVkRWxlbXNEZWxheSh0LGUpO2Vsc2V7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1pbWcudC1hbmltYXRlIiksaT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXVwdGl0bGUudC1hbmltYXRlIikscj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXRpdGxlLnQtYW5pbWF0ZSIpO3I9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHIsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1zZWN0aW9uX190aXRsZSIpfSkpO3ZhciBvPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtZGVzY3IudC1hbmltYXRlIik7bz1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobywoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNlY3Rpb25fX2Rlc2NyIil9KSk7dmFyIHM9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1idG4udC1hbmltYXRlLCAudC1idG53cmFwcGVyLnQtYW5pbWF0ZSIpO3M9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHMsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsb3Nlc3QoIi50LXNlY3Rpb25fX2JvdHRvbXdyYXBwZXIiKX0pKTt2YXIgbD10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXRpbWVyLnQtYW5pbWF0ZSIpLG09dC5xdWVyeVNlbGVjdG9yQWxsKCJmb3JtLnQtYW5pbWF0ZSIpO24ubGVuZ3RoJiYoYT0uNSksci5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksci5sZW5ndGgmJihhKz0uMyksby5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksby5sZW5ndGgmJihhKz0uMyksaS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksaS5sZW5ndGgmJihhKz0uMyksKGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGgpJiYoYSs9LjIpLGwubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLGwubGVuZ3RoJiYoYSs9LjUpLHMubGVuZ3RoJiYoc1swXS5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyIpLDI9PT1zLmxlbmd0aCYmKGErPS40KSwyPT09cy5sZW5ndGgmJihzWzFdLnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIiksMCE9PW0ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG0sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnbk9yZGVyZWRFbGVtc0RlbGF5KHQsZSl7dmFyIGE9MDtlJiYoYT1lKTt2YXIgbj10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSIxIl0nKSxpPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjIiXScpLHI9dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iMyJdJyksbz10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI0Il0nKSxzPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjUiXScpLGw9dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iNiJdJyksbT10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI3Il0nKSxjPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjgiXScpLF89dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iOSJdJyk7bi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSksbi5sZW5ndGgmJmkubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoaVswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RoKSYmci5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShyWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RoKSYmby5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShvWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aCkmJnMubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2Uoc1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHMsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RoKSYmbC5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShsWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aHx8cy5sZW5ndGh8fGwubGVuZ3RoKSYmbS5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShtWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobSwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpLChuLmxlbmd0aHx8aS5sZW5ndGh8fHIubGVuZ3RofHxvLmxlbmd0aHx8cy5sZW5ndGh8fGwubGVuZ3RofHxtLmxlbmd0aCkmJmMubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoY1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RofHxsLmxlbmd0aHx8bS5sZW5ndGh8fGMubGVuZ3RoKSYmXy5sZW5ndGgmJihhKz0xKnRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZShfWzBdLCJkZWxheSIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoXywoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyJ9KSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYXNzaWduQ2hhaW5EZWxheSh0LGUsYSl7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIiksaT0wO2lmKG4ubGVuZ3RoKXt2YXIgcj1uWzBdLG89ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0O3IuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKTt2YXIgcz10X2FuaW1hdGVfX2dldEN1ckJsb2NrU2VjdGlvbkhlYWREZWxheSh0KTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKGwpe3ZhciBtPWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDtpZihtPGEpcmV0dXJuIHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3MobCwiIiksITA7aWYobTxlKXttIT09byYmKGwuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19jaGFpbl9maXJzdC1pbi1yb3ciKSxvPW0pO3ZhciBjPS4xNippK3MsXztsLnN0eWxlLnRyYW5zaXRpb25EZWxheT1jKyJzIix0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MobCwhMSksbC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKzFlMypjKSxyPT09bltuLmxlbmd0aC0xXSYmdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb24odCxjKSxpKyssWyJ0cmFuc2l0aW9uZW5kIiwid2Via2l0VHJhbnNpdGlvbkVuZCIsIm9UcmFuc2l0aW9uRW5kIiwib3RyYW5zaXRpb25lbmQiLCJNU1RyYW5zaXRpb25FbmQiXS5mb3JFYWNoKChmdW5jdGlvbih0KXtsLmFkZEV2ZW50TGlzdGVuZXIodCwoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4obCl9KSksbC5yZW1vdmVFdmVudExpc3RlbmVyKHQsKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19hZGRFdmVudE9uQW5pbWF0ZUNoYWluKGwpfSkpfSkpfWVsc2UgbC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfd2FpdCIpfSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCxlKXt2YXIgYSxuPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoIW4pcmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIitlKTt2YXIgaSxyPSJhYiIrbi5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxvLHMsbDt2b2lkIDAhPT13aW5kb3cudG5bcl0/KG89d2luZG93LnRuW3JdLmN1clJlc29sdXRpb24scz13aW5kb3cudG5bcl0uY3VyUmVzb2x1dGlvbl9tYXgsbD13aW5kb3cudG5bcl0uc2NyZWVucy5zbGljZSgpKToobz13aW5kb3cudG4uY3VyUmVzb2x1dGlvbixzPTEyMDAsbD1bMzIwLDQ4MCw2NDAsOTYwLDEyMDBdKTt2YXIgbT10LmNsb3Nlc3QoIi50Mzk2X19lbGVtLCAudDM5Nl9fZ3JvdXAiKSxjPW0mJm0uZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbW9iaWxlIik7aWYobz09PXMpYT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSk7ZWxzZXtpZigieSIhPT1jJiZvPDEyMDApcmV0dXJuIHQuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsbnVsbDthPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIitlKyItcmVzLSIrbyl9aWYoIWEmJiIiIT09YSlmb3IodmFyIF89MDtfPGwubGVuZ3RoO18rKyl7dmFyIGY9bFtfXTtpZighKGY8PW8pJiYoYT1mPT09cz90LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSk6dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS0iK2UrIi1yZXMtIitmKSkpYnJlYWt9cmV0dXJuIGF9ZnVuY3Rpb24gdF9hbmltYXRlX19oYXNXYWl0QW5pbWF0aW9uKHQpe3JldHVybiB0LmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfd2FpdCIpfHx0LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVfd2FpdCIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYWRkRXZlbnRPbkFuaW1hdGVDaGFpbih0KXt0LmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fc2hvd2VkIil9ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRDdXN0b21BbmltU2V0dGluZ3ModCxlLGEpe3ZhciBuPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpLGk9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsImRpc3RhbmNlIik7aWYoaSYmIiIhPT1pKXtzd2l0Y2goaT1pLnJlcGxhY2UoInB4IiwiIiksdC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IjBzIix0LnN0eWxlLnRyYW5zaXRpb25EZWxheT0iMHMiLG4pe2Nhc2UiZmFkZWludXAiOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgwLCIraSsicHgsMCkiO2JyZWFrO2Nhc2UiZmFkZWluZG93biI6dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKDAsLSIraSsicHgsMCkiO2JyZWFrO2Nhc2UiZmFkZWlubGVmdCI6dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIraSsicHgsMCwwKSI7YnJlYWs7Y2FzZSJmYWRlaW5yaWdodCI6dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKC0iK2krInB4LDAsMCkifXRfYW5pbWF0ZV9fZm9yY2VFbGVtSW5WaWV3UG9ydFJlcGFpbnQodCxlLGEpLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIifXZhciByPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzY2FsZSIpO3ImJih0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iMHMiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIwcyIsdC5zdHlsZS50cmFuc2Zvcm09InNjYWxlKCIrcisiKSIsdF9hbmltYXRlX19mb3JjZUVsZW1JblZpZXdQb3J0UmVwYWludCh0LGUsYSksdC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IiIsdC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IiIpO3ZhciBvPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJkZWxheSIpO28mJih0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1vKyJzIik7dmFyIHM9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsImR1cmF0aW9uIik7cyYmKHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPXMrInMiKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3JlbW92ZUlubGluZUFuaW1TdHlsZXMoKXtpZih3aW5kb3cuaW5uZXJXaWR0aDw5ODApe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50Mzk2X19lbGVtLnQtYW5pbWF0ZTpub3QoLnQtYW5pbWF0ZV93YWl0KSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2Zvcm09IiIsdC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IiIsdC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IiJ9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZm9yY2VFbGVtSW5WaWV3UG9ydFJlcGFpbnQodCxlLGEpe3QmJmU8YSs1MDAmJnQub2Zmc2V0SGVpZ2h0fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZGV0ZWN0RWxlbVRyaWdnZXJPZmZzZXQodCxlKXt2YXIgYT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwidHJpZ2dlci1vZmZzZXQiKSxuPWU7cmV0dXJuIGEmJihuPWUtMSooYT1hLnJlcGxhY2UoInB4IiwiIikpKSxufWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX190aXRsZS50LWFuaW1hdGUiKSxhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fZGVzY3IudC1hbmltYXRlIik7ZS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKX0pKSxhLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0YXJ0LXRpbWUiLERhdGUubm93KCkrMTYwKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEN1ckJsb2NrU2VjdGlvbkhlYWREZWxheSh0KXt2YXIgZT0wO3JldHVybiB0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX3RpdGxlLnQtYW5pbWF0ZSIpLmxlbmd0aCYmKGUrPS4xNiksdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX19kZXNjci50LWFuaW1hdGUiKS5sZW5ndGgmJihlKz0uMTYpLGV9ZnVuY3Rpb24gdF9hbmltYXRlX19tYWtlU2VjdGlvbkJ1dHRvbldhaXQodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIikubGVuZ3RoLGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX19ib3R0b213cmFwcGVyIC50LWJ0bi50LWFuaW1hdGUiKTtlLmxlbmd0aCYmYS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb24odCxlKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIik7YS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9ZSsuMTYrInMiLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIiksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITEpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uX19vdXRPZlR1cm4odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIiksYTsoZT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZSwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfc3RhcnRlZCIpfSkpKS5sZW5ndGh8fHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uKHQsLjE2KX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FkZE5vSG92ZXJDbGFzc1RvQnRucygpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWJ0bi50LWFuaW1hdGUiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX25vLWhvdmVyIil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KXtpZighdClyZXR1cm4hMTt2YXIgZT10LmNsYXNzTGlzdC5jb250YWlucygidC1idG4iKT90Om51bGw7ZSYmKGUub250cmFuc2l0aW9uZW5kPWZ1bmN0aW9uKHQpeyJvcGFjaXR5IiE9PXQucHJvcGVydHlOYW1lJiYidHJhbnNmb3JtIiE9PXQucHJvcGVydHlOYW1lfHwoZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfbm8taG92ZXIiKSxlLnN0eWxlLnRyYW5zaXRpb25EZWxheT0iIixlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iIix0aGlzLm9udHJhbnNpdGlvbmVuZD1udWxsKX0pfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0R3JvdXBzT2Zmc2V0cyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZSIpO2lmKGUpe3QuY3VyVG9wT2Zmc2V0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDt2YXIgYT10X2FuaW1hdGlvbl9fZ2V0Wm9vbSh0KTt3aW5kb3cuaXNPbmx5U2NhbGFibGV8fCh0LmN1clRvcE9mZnNldCo9YSl9fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uX19nZXRab29tKHQpe2lmKHZvaWQgMCE9PXQuc2NhbGVGYWN0b3IpcmV0dXJuIHQuc2NhbGVGYWN0b3I7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKTtpZighZSlyZXR1cm4gMTt2YXIgYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTIuNyJdJyk7cmV0dXJuIGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZF9zY2FsZSIpfHwhYSYmInVuZGVmaW5lZCIhPXR5cGVvZiB0Mzk2X2FiX19nZXRGaWVsZFZhbHVlJiYid2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoZSwidXBzY2FsZSIpP3dpbmRvdy50bl9zY2FsZV9mYWN0b3I6MX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldENoYWluT2Zmc2V0cyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV93YWl0W2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIik7dC5pdGVtc09mZnNldHM9W10sQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbihlLGEpe3QuaXRlbXNPZmZzZXRzW2FdPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldH0pKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEVsZW1zT2Zmc2V0cyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY3VyVG9wT2Zmc2V0PXdpbmRvdy5wYWdlWU9mZnNldCt0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDt2YXIgZT10X2FuaW1hdGlvbl9fZ2V0Wm9vbSh0KTt3aW5kb3cuaXNPbmx5U2NhbGFibGV8fCh0LmN1clRvcE9mZnNldCo9ZSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVBbmltRnJvbUhpZGRlblNsaWRlcyh0KXt2YXIgZTtpZih0LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsaWRlcyIpLmxlbmd0aCl7dmFyIGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGlkZXNfX2l0ZW0iKTthPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xpZGVzX19pdGVtX2FjdGl2ZSIpfSkpO3ZhciBuPVtdO2EuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlIik7ZSYmbi5wdXNoKGUpfSkpLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCJuby1ob3ZlciIpfSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3dyYXBUZXh0V2l0aE9wYWNpdHkoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC10aXRsZS50LWFuaW1hdGUsIC50LWRlc2NyLnQtYW5pbWF0ZSwgLnQtdXB0aXRsZS50LWFuaW1hdGUsIC50LXRleHQudC1hbmltYXRlIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgic3R5bGUiKTtpZihlJiYtMSE9PWUuaW5kZXhPZigib3BhY2l0eSIpKXt2YXIgYT10LnN0eWxlLm9wYWNpdHk7aWYoYSYmYT4wKXt0LnN0eWxlLm9wYWNpdHk9IiI7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bi5zdHlsZS5vcGFjaXR5PWE7dmFyIGk9dC5jaGlsZE5vZGVzO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9uZU5vZGUoITApO24uYXBwZW5kQ2hpbGQoZSl9KSksdC5pbm5lckhUTUw9IiIsdC5hcHBlbmRDaGlsZChuKX19fSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tJRSgpe3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LGU9dC5pbmRleE9mKCJNU0lFIiksYT0iIixuPSExO3JldHVybiBlPjAmJig4IT09KGE9cGFyc2VJbnQodC5zdWJzdHJpbmcoZSs1LHQuaW5kZXhPZigiLiIsZSkpKSkmJjkhPT1hfHwobj0hMCkpLG59ImxvYWRpbmciIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT90X2FuaW1hdGVfX2luaXQoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0X2FuaW1hdGVfX2luaXQpOwoKZnVuY3Rpb24gdDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1Zhcih0KXt0cnl7dmFyIGUsaT0vdmFyXCgoLS11Yy0oW14tXSspLShbXi1dKyktKFteLF0rKSksXHM/KC4qKVwpLy5leGVjKHQpO2lmKCFpKXJldHVybjt2YXIgcj1pWzBdLG89aVsxXSxuPWlbMl0sYT1pWzNdLGw9aVs0XSxkPWlbNV0sXyxzO2lmKCEociYmbiYmYSYmbCYmZCkpcmV0dXJuO3JldHVybntwYXJlbnQ6e2lkOmwsdHlwZTpufSxmYWxsYmFjazp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKG8pfHxkLGZpZWxkOmF9fWNhdGNoKHUpe2NvbnNvbGUuZXJyb3IoIkVycm9yIHRyeWluZyB0byBwYXJzZSBDU1MgVmFyaWFibGUiKX19ZnVuY3Rpb24gdDM5Nl9faGV4MnJnYmEodCxlKXtpZighdClyZXR1cm4hMTt2YXIgaT10Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKHQpO2kmJih0PWkuZmFsbGJhY2spO3ZhciByPXQucmVwbGFjZSgvIy8sIiIpO2lmKDM9PT1yLmxlbmd0aCl7dmFyIG89clswXSxuPXJbMV0sYT1yWzJdO3Q9IiMiK28rbytuK24rYSthfXZhciBsPXBhcnNlSW50KHQuc3Vic3RyaW5nKDEpLDE2KSxkLF8scztyZXR1cm5bKDE2NzExNjgwJmwpPj4xNiwoNjUyODAmbCk+PjgsMjU1JmwscGFyc2VGbG9hdChlKV19ZnVuY3Rpb24gdDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KXt2YXIgZT1bImdhbGxlcnkiXSxpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3JldHVybiBlLmluY2x1ZGVzKGkpfWZ1bmN0aW9uIHQzOTZfX2lzRmxleCh0KXt2YXIgZT10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpLGk9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKTtyZXR1cm4gZXx8aX1mdW5jdGlvbiB0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3Jkcygpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYodCl7dmFyIGU9WyIudDk1MV9fc2lkZWJhcl9zdGlja3kiLCIudDEyMDZfX2NvbnRlbnRfc3RpY2t5IiwiLnQ3NTRfX2NvbF9maXhlZCIsIi50Nzc2X19jb2xfZml4ZWQiLCIudDc4Nl9fY29sX2ZpeGVkIiwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2NvbF9maXhlZCIsIi50LWNhdGFsb2dfX3NpZGViYXJfc3RpY2t5Il07dDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCk7dmFyIGk9Qm9vbGVhbihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUuam9pbigiLCAiKSkpO3QuY2xhc3NMaXN0LnJlbW92ZSgidC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIiwidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKSx0LmNsYXNzTGlzdC5hZGQoaT8idC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIjoidC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4iKX19ZnVuY3Rpb24gdDM5Nl9fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlKCl7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiKSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0LmlkPSJ0Mzk2X19vdmVyZmxvdy1zdHlsZXMiLHQuaW5uZXJIVE1MPSIudC1yZWNvcmRzX19vdmVyZmxvdy1jbGlwIHsgb3ZlcmZsb3c6IGNsaXA7IH1cblx0XHRcdFx0XHRcdC50LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiB7IG92ZXJmbG93OiBoaWRkZW47IH0iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9fWZ1bmN0aW9uIHQzOTZfX2dldEFydGJvYXJkcyh0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGkscj1lJiYiZWRpdCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik/Jy5yZWNvcmRbZGF0YS1yZWNvcmQtdHlwZT0iJyt0KyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucmVjb3JkW2RhdGEtcGFyZW50dHBsaWQ9IicrdCsnIl0gLnI6bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc6Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHIpKX1mdW5jdGlvbiB0Mzk2X19nZXRaZXJvQmxvY2tzKCl7dmFyIHQ9W10uY29uY2F0KHQzOTZfX2dldEFydGJvYXJkcygiMzk2IiksdDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIxMjEiKSksZTtyZXR1cm4gdC5sZW5ndGg/dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntyZWNvcmQ6dC5jbG9zZXN0KCIucjpub3QoLnQzOTdfX29mZik6bm90KC50Mzk1X19vZmYpOm5vdCgudDQwMF9fb2ZmKSIpLGFydGJvYXJkOnR9fSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVjb3JkfSkpOltdfWZ1bmN0aW9uIHQzOTZfX2lzSW5zaWRlR3JvdXBXaXRoWm9vbSh0KXtmb3IodmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtlOyl7dmFyIGk7aWYoZS5zdHlsZS56b29tKXJldHVybiEwO2U9bnVsbD09KGk9ZS5wYXJlbnRFbGVtZW50KT92b2lkIDA6aS5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKX1yZXR1cm4hMX12YXIgdDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcj1mdW5jdGlvbiB0KCl7dmFyIGU9MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1TdHJpbmcoZSs9MSkucGFkU3RhcnQoNiwiMCIpO3JldHVybiIiK0RhdGUubm93KCkrdH19LHQzOTZfX2dldFVuaXF1ZUlkPXQzOTZfX3VuaXF1ZUlkX19nZW5lcmF0b3IoKTtmdW5jdGlvbiB0Mzk2X2lzQmxvY2tWaXNpYmxlKHQpe3ZhciBlPXdpbmRvdy5pbm5lcldpZHRoLGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1pbiIpLHI9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1heCIpO3JldHVybiEoaSYmZTxwYXJzZUludChpLDEwKSkmJiEociYmZT5wYXJzZUludChyLDEwKSl9dmFyIHQzOTZfX29uUmVhZHk9ZnVuY3Rpb24gdChlKXsibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP2UoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixlKX0sdDM5Nl9faHRtbFRleHREZWNvZGVyO2Z1bmN0aW9uIHQzOTZfX2RlY29kZUh0bWxUZXh0KHQpe3JldHVybiB0Pyh0Mzk2X19odG1sVGV4dERlY29kZXJ8fCh0Mzk2X19odG1sVGV4dERlY29kZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKSksdDM5Nl9faHRtbFRleHREZWNvZGVyLmlubmVySFRNTD10LHQzOTZfX2h0bWxUZXh0RGVjb2Rlci52YWx1ZSk6IiJ9ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRGb3JtSW5wdXRzVmFsdWUodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9faW5wdXRzLWRhdGEiKTtpZihlKXt2YXIgaT1lLmdldEF0dHJpYnV0ZSgiZGF0YS12YWx1ZSIpO2lmKGkpdHJ5e3JldHVybiBKU09OLnBhcnNlKGkpfWNhdGNoKG4pe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIGRhdGE6IixuLGkpLFtdfX12YXIgcj10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtdGV4dGFyZWEiKTtpZihyKXt2YXIgbz1yLnZhbHVlO2lmKG8pdHJ5e3JldHVybiBKU09OLnBhcnNlKG8pfWNhdGNoKG4pe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBwYXJzaW5nIGZvcm0gaW5wdXRzIHRleHRhcmVhIHZhbHVlOiIsbixvKSxbXX19cmV0dXJuW119ZnVuY3Rpb24gdDM5Nl9nZXRFbCh0KXtyZXR1cm4gd2luZG93LmpRdWVyeSYmdCBpbnN0YW5jZW9mIGpRdWVyeT90Lmxlbmd0aD90LmdldCgwKTpudWxsOnR9ZnVuY3Rpb24gdDM5Nl9fZG9lc0NsaWVudFJlY3RJbmNsdWRlWm9vbSgpe3RyeXt2YXIgdD0yLGU9NTAsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt2aXNpYmlsaXR5OmhpZGRlbjtwb2ludGVyLWV2ZW50czpub25lO3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7em9vbToyOyIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpKTt2YXIgcixvPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaSksMTAwPT09b31jYXRjaChuKXtyZXR1cm59fWZ1bmN0aW9uIHQzOTZfX2luaXRTY2FsZUZhY3RvckZsYWdzKCl7aWYodm9pZCAwPT09d2luZG93LnNob3VsZFVzZVNjYWxlRmFjdG9yKXt2b2lkIDA9PT13aW5kb3cudDM5Nl9fY2xpZW50UmVjdEluY2x1ZGVzWm9vbSYmKHdpbmRvdy50Mzk2X19jbGllbnRSZWN0SW5jbHVkZXNab29tPXQzOTZfX2RvZXNDbGllbnRSZWN0SW5jbHVkZVpvb20oKSk7dmFyIHQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0ZpcmVmb3hcLyhbMC05XSspXC4vKSxlPXQ/cGFyc2VJbnQodFsxXSwxMCk6MTI2LGk9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVwvKFswLTldKylcLi8pLHIsbz0oaSYmcGFyc2VJbnQoaVsxXSwxMCl8fDApPjEyN3x8d2luZG93LnQzOTZfX2NsaWVudFJlY3RJbmNsdWRlc1pvb207d2luZG93LmlzT25seVNjYWxhYmxlPWU8MTI2LHdpbmRvdy5zaG91bGRVc2VTY2FsZUZhY3Rvcj0hd2luZG93LmlzT25seVNjYWxhYmxlJiYhdCYmIW99fWZ1bmN0aW9uIHQzOTZfaW5pdCh0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxpPWU/ZS5xdWVyeVNlbGVjdG9yKCIudDM5NiIpOm51bGwscj1lP2UucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZihyKXt0Mzk2X2luaXRUTm9iaih0LHIpLHQzOTZfX2luaXRTY2FsZUZhY3RvckZsYWdzKCk7dmFyIG89IiIsbj10Mzk2X2RldGVjdFJlc29sdXRpb24odCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGw9YSYmImVkaXQiPT09YS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpO3ZvaWQgMD09PXdpbmRvdy50bi5pc0VkaXRNb2RlJiYod2luZG93LnRuLmlzRWRpdE1vZGU9bCksdDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsbik7dmFyIGQ9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsInVwc2NhbGUiKSxfPXQzOTZfX3NldEdsb2JhbFNjYWxlVmFyaWFibGVzKHQsbixkKTtpZih0Mzk2X19zZXRTY2FsZUZhY3RvckZvckVsZW1lbnRzKHQsXyksdDM5Nl91cGRhdGVUTm9iaih0KSx0Mzk2X2FydGJvYXJkX2J1aWxkKG8sdCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9faW5pdGlhbGl6ZUFydGJvYXJkT3ZlcmZsb3coYSxyKX0pKSx3aW5kb3cudGlsZGFNZW1iZXJzJiYiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBzPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJhdHRyaWJ1dGVzIj09PWUudHlwZSYmImNsYXNzIj09PWUuYXR0cmlidXRlTmFtZSYmZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bGstY291cnNlc19wYWdlIikmJih0Mzk2X2RvUmVzaXplKHQsITApLHMuZGlzY29ubmVjdCgpKX0pKX0pKTtzLm9ic2VydmUoZG9jdW1lbnQuYm9keSx7YXR0cmlidXRlczohMH0pfWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50ODMwIikmJnRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgZSxpO1sidDgzMF9fYWxscmVjb3Jkc19wYWRkIiwidDgzMF9fYWxscmVjb3Jkc19wYWRkLXNtYWxsIl0uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGEuY2xhc3NMaXN0LmNvbnRhaW5zKHQpfSkpP3QzOTZfZG9SZXNpemUodCwhMCk6YS5hZGRFdmVudExpc3RlbmVyKCJhbGxSZWNQYWRkaW5nSW5pdCIsKGZ1bmN0aW9uKCl7dDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKX0pKSxlJiZpJiZyJiYieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbm5lY3Qtd2l0aC10YWIiKSYmaS5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsKGZ1bmN0aW9uKCl7dDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyhyKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhyKSx0Mzk2X2RvUmVzaXplKHQsITApfSkpO3ZhciB1PSJodWciPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpLGM7aWYodSl7dmFyIGY9dF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHIpfSksMTAwKTtmKCksc2V0SW50ZXJ2YWwoZiwzZTMpLGRvY3VtZW50LmZvbnRzJiZkb2N1bWVudC5mb250cy5yZWFkeS50aGVuKGYpLHIucXVlcnlTZWxlY3RvckFsbCgiaW1nIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5vbmxvYWQ9Zn0pKSxuZXcgTXV0YXRpb25PYnNlcnZlcihmKS5vYnNlcnZlKHIse3N1YnRyZWU6ITAsY2hhcmFjdGVyRGF0YTohMCxjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6ITB9KSxuZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24odCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTsiY2hpbGRMaXN0Ij09PXQudHlwZSYmKEFycmF5LmZyb20odC5hZGRlZE5vZGVzKS5jb25jYXQoQXJyYXkuZnJvbSh0LnJlbW92ZWROb2RlcykpLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiAzIT09dC5ub2RlVHlwZSYmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIil8fHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cCIpKX0pKSYmZigpKX0pKX0pKS5vYnNlcnZlKHIse3N1YnRyZWU6ITAsY2hpbGRMaXN0OiEwfSl9KGEuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0MjM1X19iZWZvcmVyZWFkeSIpfHxlJiZlLmNsb3Nlc3QoIiNhbGxyZWNvcmRzdGFibGUiKXx8YS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZWNvcmQtdHlwZT0iMjYzIl0nKSkmJmkmJnImJmkuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKTt2YXIgZz0hIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50NjM1X190ZXh0aG9sZGVyIik7ZSYmZyYmaSYmciYmaS5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25Jbml0ZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKSxlJiZkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDQzMSIpJiZpJiZyJiZ0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X2RvUmVzaXplKHQsITApfSkpfSkpLC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJmkmJmkuY2xhc3NMaXN0LmFkZCgidDM5Nl9zYWZhcmkiKSxkJiYhbCYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X3NjYWxlQmxvY2siLChmdW5jdGlvbigpe3QzOTZfc2NhbGVCbG9jayh0KX0pKSxsfHwieSIhPT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsImZpeGVkLW5lZWQtanMiKXx8dF9vbkZ1bmNMb2FkKCJ0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fcHJvY2Vzc0ZpeGVkQXJ0Qm9hcmQocil9KSksdDM5Nl9fcHJvY2Vzc0Fic29sdXRlQXJ0Qm9hcmQociksdDM5Nl9fcHJvY2Vzc1RvcFNoaWZ0KHIsdCwhMSksd2luZG93LnQzOTZfX2lzTW9iaWxlfHx1fHx0Mzk2X19yZW1vdmVJbmxpbmVIZWlnaHQoW3Isci5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLHIucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpXSksbHx8dDM5Nl9faW50aWFsaXplVW5kZXJjdXQoZSl9fXdpbmRvdy50Mzk2X19pc01vYmlsZT0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIik+LTEsd2luZG93LnQzOTZfX2lzSVBhZD0ib250b3VjaGVuZCJpbiBkb2N1bWVudCYmLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkFwcGxlV2ViS2l0Iiksd2luZG93LnQzOTZfX2lzU2FmYXJpPS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LnQzOTZfX2lzVG91Y2hEZXZpY2U9Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQsd2luZG93LnQzOTZfX2lzSW5BcHBCcm93c2VyPS9XZWJWaWV3fChpUGhvbmV8aVBvZHxpUGFkKSg/IS4qU2FmYXJpKS9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy50Mzk2X19pc0ZhY2Vib29rTWVzc2VuZ2VySW5BcHA9L0ZCQU58RkJBVi9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZ3aW5kb3cudDM5Nl9faXNJbkFwcEJyb3dzZXIsd2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHA9L1xiSW5zdGFncmFtL2dpLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJndpbmRvdy50Mzk2X19pc0luQXBwQnJvd3Nlcix0X29uUmVhZHkodDM5Nl9fZ2xvYmFsSW5pdCk7dmFyIHQzOTZfd2FpdEZvckZpbmFsRXZlbnQ9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gZnVuY3Rpb24oZSxpLHIpe3ZhciBvPXJ8fCJEb24ndCBjYWxsIHRoaXMgdHdpY2Ugd2l0aG91dCBhIHVuaXF1ZUlkIjt0W29dJiZjbGVhclRpbWVvdXQodFtvXSksdFtvXT1zZXRUaW1lb3V0KGUsaSl9fSgpO2Z1bmN0aW9uIHQzOTZfX2hhbmRsZVJlc2l6ZU9wZW5lZFBvcHVwKCl7dDM5Nl9fd2FpdEZvclBvcHVwKCkudGhlbigoZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTtlJiZ0Mzk2X2RvUmVzaXplKGUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpfX0pKX1mdW5jdGlvbiB0Mzk2X19pbml0UG9wdXBSZXNpemUoKXtkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvcHVwU2hvd2VkIix0Mzk2X19oYW5kbGVSZXNpemVPcGVuZWRQb3B1cCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJwb3B1cFNob3dlZCIsdDM5Nl9faGFuZGxlUmVzaXplT3BlbmVkUG9wdXApfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd0hlaWdodCh0KXtyZXR1cm4gdDM5Nl9fc2hvdWxkVXNlVmlzdWFsVmlld3BvcnRIZWlnaHQoKSYmdDM5Nl9faXNJblBvcHVwKHQpP3dpbmRvdy52aXN1YWxWaWV3cG9ydC5oZWlnaHQ6dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLmhlaWdodDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd1dpZHRoKHQpe3JldHVybiB0Mzk2X19pc0luUG9wdXAodCk/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOnQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfX2dldFROV2luZG93SGVpZ2h0KCl7cmV0dXJuIHdpbmRvdy50Mzk2X19pc01vYmlsZXx8d2luZG93LnQzOTZfX2lzSVBhZD9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodH1mdW5jdGlvbiB0Mzk2X19nZXRUTldpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpO2lmKHQpcmV0dXJuIHQ7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGk9dDM5Nl9fZ2V0QXhpc1hQYWRkaW5nKCk7cmV0dXJuIGkmJihlLT1pKSxlfWZ1bmN0aW9uIHQzOTZfX2dldENTU1dpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpLGU7cmV0dXJuIHR8fCh3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc0lQYWR8fHdpbmRvdy50Mzk2X19pc1NhZmFyaT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVyV2lkdGgpfWZ1bmN0aW9uIHQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnModCl7dmFyIGUsaT0odHx8e30pLmZvcmNlVXBkYXRlLHI9dm9pZCAwIT09aSYmaSxvPSF3aW5kb3cudG4ud2luZG93X3dpZHRofHwhd2luZG93LnRuLndpbmRvd19oZWlnaHR8fCF3aW5kb3cudG4ud2luZG93X3dpZHRoX2NzcyxuO3JldHVybihyfHxvKSYmdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLHt3aWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoLGhlaWdodDp3aW5kb3cudG4ud2luZG93X2hlaWdodCxjc3NXaWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoX2Nzc319ZnVuY3Rpb24gdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpe3dpbmRvdy50bi53aW5kb3dfd2lkdGg9dDM5Nl9fZ2V0VE5XaW5kb3dXaWR0aCgpLHdpbmRvdy50bi53aW5kb3dfaGVpZ2h0PXQzOTZfX2dldFROV2luZG93SGVpZ2h0KCksd2luZG93LnRuLndpbmRvd193aWR0aF9jc3M9dDM5Nl9fZ2V0Q1NTV2luZG93V2lkdGgoKX1mdW5jdGlvbiB0Mzk2X19yZXZhbGlkYXRlRGltZW5zaW9ucygpe3ZhciB0LGU9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLndpZHRoLGkscjtyZXR1cm4gdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLGUhPT10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGh9ZnVuY3Rpb24gdDM5Nl9fcmVtb3ZlSW5saW5lSGVpZ2h0KHQpeyIxLjAiIT09d2luZG93LlROX1NDQUxFX0lOSVRJQUxfVkVSJiZ0LmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0JiYodC5zdHlsZS5oZWlnaHQ9IiIpfSkpfWZ1bmN0aW9uIHQzOTZfX2NsZWFySW5pdGlhbFNjYWxlU3R5bGVzKCl7aWYoIjEuMCI9PT13aW5kb3cuVE5fU0NBTEVfSU5JVElBTF9WRVIpe3ZhciB0PWZ1bmN0aW9uIHQoZSl7dmFyIGk7ZSYmKCJ2YXIoLS1pbml0aWFsLXNjYWxlLWhlaWdodCkiPT09ZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCJoZWlnaHQiKSYmZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiaGVpZ2h0IikpfSxlO3QzOTZfX2dldFplcm9CbG9ja3MoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgaT1lLmFydGJvYXJkO2kmJihpLnN0eWxlLnJlbW92ZVByb3BlcnR5KCItLWluaXRpYWwtc2NhbGUtaGVpZ2h0IiksdChpKSx0KGkucXVlcnlTZWxlY3RvcigiLnQzOTZfX2NhcnJpZXIiKSksdChpLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKSkpfSkpfX1mdW5jdGlvbiB0Mzk2X19nbG9iYWxJbml0KCl7d2luZG93LnRufHx0Mzk2X2luaXRUTm9ial9fY3JlYXRlRGVmYXVsdCgpLHQzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKChmdW5jdGlvbigpe3QzOTZfX2FwcGx5Rml4ZXNGb3JBbGxFbGVtZW50cygpLHQzOTZfX2luaXRpYWxpemVBbmNob3JMaW5rT3ZlcmZsb3dGaXgoKSx0Mzk2X19pbml0UG9wdXBSZXNpemUoKSx0Mzk2X19jbGVhckluaXRpYWxTY2FsZVN0eWxlcygpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHQzOTZfX29uUmVzaXplKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLHQzOTZfX29uT3JpZW50YXRpb25DaGFuZ2UpfSkpfWZ1bmN0aW9uIHQzOTZfX29uUmVzaXplKCl7dDM5Nl93YWl0Rm9yRmluYWxFdmVudCgoZnVuY3Rpb24oKXt2YXIgdDt0Mzk2X19yZXZhbGlkYXRlRGltZW5zaW9ucygpJiYodDM5Nl9fZ2V0WmVyb0Jsb2NrcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVjb3JkO2lmKGUmJnQzOTZfaXNCbG9ja1Zpc2libGUoZSkpdHJ5e3QzOTZfZG9SZXNpemUoZS5pZC5yZXBsYWNlKCJyZWMiLCIiKSl9Y2F0Y2goaSl7Y29uc29sZS5lcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHJlc2l6ZSAiK2UuaWQsaSl9fSkpLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ6ZXJvOndpbmRvdy13aWR0aC1jaGFuZ2VkIikpKX0pLDUwMCwiZ2xvYmFsX3Jlc2l6ZV96ZXJvX3VuaXF1ZV9pZCIpfWZ1bmN0aW9uIHQzOTZfX29uT3JpZW50YXRpb25DaGFuZ2UoKXt0Mzk2X3dhaXRGb3JGaW5hbEV2ZW50KChmdW5jdGlvbigpe3QzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKSx0Mzk2X19nZXRaZXJvQmxvY2tzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5yZWNvcmQ7ZSYmdDM5Nl9pc0Jsb2NrVmlzaWJsZShlKSYmdDM5Nl9kb1Jlc2l6ZShlLmlkLnJlcGxhY2UoInJlYyIsIiIpKX0pKX0pLDYwMCwiZ2xvYmFsX29yaWVudGF0aW9uY2hhbmdlX3plcm9fdW5pcXVlX2lkIil9ZnVuY3Rpb24gdDM5Nl9pc09ubHlTY2FsYWJsZUJyb3dzZXIoKXtyZXR1cm4gd2luZG93LmlzT25seVNjYWxhYmxlfWZ1bmN0aW9uIHQzOTZfX3NldEdsb2JhbFNjYWxlVmFyaWFibGVzKHQsZSxpKXt2YXIgcj0xLG89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksbj1vP28ucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZighbilyZXR1cm4gMTt2YXIgYT10Mzk2X2FiX19nZXRXaW5kb3dXaWR0aChuKSxsPWk/cGFyc2VGbG9hdCgoYS9lKS50b0ZpeGVkKDMpKToxLGQ9ImFiIit0O3dpbmRvdy50bltkXS5zY2FsZUZhY3Rvcj1sLHdpbmRvdy50bl9zY2FsZV9mYWN0b3I9bDt2YXIgXz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KTtyZXR1cm4gXyYmIXdpbmRvdy50bi5pc0VkaXRNb2RlJiZfLnN0eWxlLnNldFByb3BlcnR5KCItLXpvb20iLGwudG9TdHJpbmcoKSksbH1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzVG9wU2hpZnQodCxlLGkpeyJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3cudDM5Nl9fdXBkYXRlVG9wU2hpZnR8fCJ5IiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwic2hpZnQtcHJvY2Vzc2VkIikmJiJ5IiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiZml4ZWQtc2hpZnQiKXx8d2luZG93LnQzOTZfX3VwZGF0ZVRvcFNoaWZ0KGUsaSl9ZnVuY3Rpb24gdDM5Nl9kb1Jlc2l6ZSh0LGUpe2UmJnQzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKTt2YXIgaT10Mzk2X2lzT25seVNjYWxhYmxlQnJvd3NlcigpLHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG49dDM5Nl9kZXRlY3RSZXNvbHV0aW9uKHQpLGE7aWYodDM5Nl9yZW1vdmVFbGVtZW50RnJvbURPTShyP3IucXVlcnlTZWxlY3RvcigiLnQzOTZfX3NjYWxlLXN0eWxlIik6bnVsbCksaSl7dmFyIGw9cj9yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKTpbXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe2lmKCF0LmNsYXNzTGlzdC5jb250YWlucygidG4tYXRvbSIpfHwhdC5jbG9zZXN0KCIudG4tbW9sZWN1bGUiKSl7dmFyIGU9dC5jbG9zZXN0KCIudG4tYXRvbV9fc2NhbGUtd3JhcHBlciIpLGk9ZT9lLnBhcmVudE5vZGU6bnVsbDtpJiZpLnJlbW92ZUNoaWxkKGUpLGkmJmkuYXBwZW5kQ2hpbGQodCl9fSkpfWVsc2V7dmFyIGQ9cj9yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50Mzk2X19lbGVtLCAudDM5Nl9fZ3JvdXAiKTpbXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsKGZ1bmN0aW9uKHQpe3Quc3R5bGUuem9vbT0iIjt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik7ZSYmKGUuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSIiLGUuc3R5bGUuZm9udFNpemU9IiIsZS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD0iIil9KSl9dDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsbik7dmFyIF89cj9yLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGwscz0id2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoXywidXBzY2FsZSIpLHU9dDM5Nl9fc2V0R2xvYmFsU2NhbGVWYXJpYWJsZXModCxuLHMpO3QzOTZfX3NldFNjYWxlRmFjdG9yRm9yRWxlbWVudHModCx1KSx0Mzk2X3VwZGF0ZVROb2JqKHQpLHQzOTZfYWJfX3JlbmRlclZpZXcoXyk7dmFyIGM9bz9vLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik6IiI7cyYmImVkaXQiIT09YyYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X3NjYWxlQmxvY2siLChmdW5jdGlvbigpe3QzOTZfc2NhbGVCbG9jayh0KX0pKSwiZWRpdCIhPT1jJiYieSI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKF8sImZpeGVkLW5lZWQtanMiKSYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fcHJvY2Vzc0ZpeGVkQXJ0Qm9hcmQoXyl9KSksdDM5Nl9fcHJvY2Vzc0Fic29sdXRlQXJ0Qm9hcmQoXyksdDM5Nl9fcHJvY2Vzc1RvcFNoaWZ0KF8sdCwhMCksdDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyhfKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhfKSx0Mzk2X19hcHBseUZpeGVzRm9yQWxsRWxlbWVudHMoKSx0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KF8pLF8mJl8uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImFydEJvYXJkUmVzaXplZCIpKTt2YXIgZj0iaHVnIj09PV8uZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodG1vZGUiKTtfJiYhZiYmKHdpbmRvdy50Mzk2X19pc01vYmlsZXx8dDM5Nl9fcmVtb3ZlSW5saW5lSGVpZ2h0KFtfLF8ucXVlcnlTZWxlY3RvcigiLnQzOTZfX2NhcnJpZXIiKSxfLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKV0pKX1mdW5jdGlvbiB0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHQpe3ZhciBlLGk7aWYoImh1ZyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHRtb2RlIikpe3ZhciByPXQzOTZfX2dldEF1dG9IZWlnaHQodCksbz10Lm9mZnNldEhlaWdodDtpZighKE1hdGguYWJzKHItbyk8PS43KSl7dmFyIG4sYT0iYWIiK3QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksbD13aW5kb3cudG5bYV0uY3VyUmVzb2x1dGlvbixkO2w9PT13aW5kb3cudG5bYV0uY3VyUmVzb2x1dGlvbl9tYXg/dC5zZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0IixyKTp0LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHQtcmVzLSIrbCxyKSx0Mzk2X2FiX19yZW5kZXJWaWV3KHQpLG51bGw9PShlPXQuY2xvc2VzdCgiLnQzOTYiKSl8fGUuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInplcm86aGVpZ2h0LWNoYW5nZWQiKSl9fX1mdW5jdGlvbiB0Mzk2X19nZXRBdXRvSGVpZ2h0KHQpe3ZhciBlLGk9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxyPUFycmF5LmZyb20odC5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUgPiAudG4tZ3JvdXAsIDpzY29wZSA+IC50bi1lbGVtIikpLG89dC5zdHlsZS5oZWlnaHQsbjtpZih0Mzk2X19hdXRvSGVpZ2h0X19jYW5BdXRvY2FsY3VsYXRlSGVpZ2h0KHQscikmJm8pe3ZhciBhPXQuc3R5bGUuaGVpZ2h0O3Quc3R5bGUuaGVpZ2h0PSJhdXRvIixlPXQub2Zmc2V0SGVpZ2h0LHQuc3R5bGUuaGVpZ2h0PWF9ZWxzZSBlPXIucmVkdWNlKChmdW5jdGlvbihlLHIpe3ZhciBvPXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZShyLCJheGlzeSIpLG49dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHIsInRvcHVuaXRzIiksYT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUociwiaGVpZ2h0dW5pdHMiKTtpZigiJSI9PT1ufHwiJSI9PT1hfHwiYm90dG9tIj09PW98fCJjZW50ZXIiPT09bylyZXR1cm4gZTt2YXIgbD0wO2lmKCJnYWxsZXJ5Ij09PXIuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpJiYobD10Mzk2X19hdXRvSGVpZ2h0X19nZXRBZGRpdGlvbmFsT2Zmc2V0Rm9yR2FsbGVyeShyKSksaSl7dmFyIGQ9dDM5Nl9fYWJfX2dldFBhZGRpbmdWYWx1ZSh0LCJwYWRkaW5nYm90dG9tIik7bCs9cGFyc2VJbnQoZCwxMCl9dmFyIF89ci5vZmZzZXRUb3Arci5vZmZzZXRIZWlnaHQrbCxzLHUsYzsid2luZG93IiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwidXBzY2FsZSIpfHx3aW5kb3cudG4uaXNFZGl0TW9kZXx8dDM5Nl9fYXV0b0hlaWdodF9faXNFbGVtZW50UHJlc2NhbGVkKHIpfHwoXyo9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpKTtyZXR1cm4gXz5lP186ZX0pLC0xLzApO3JldHVybiBlPT09LTEvMD8wOmV9ZnVuY3Rpb24gdDM5Nl9fYXV0b0hlaWdodF9faXNFbGVtZW50UHJlc2NhbGVkKHQpe3JldHVybiEhdDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KXx8InllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZS1vZmYiKX1mdW5jdGlvbiB0Mzk2X19hdXRvSGVpZ2h0X19nZXRBZGRpdGlvbmFsT2Zmc2V0Rm9yR2FsbGVyeSh0KXt2YXIgZT0wLGk9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX190aXRsZSIpLHI9Im5vbmUiIT09dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHQsInNsZHNfZG90c2NvbnRyb2xzIiksbz0idW5kZXIiPT09dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHQsInNsZHNfYXJyb3djb250cm9scyIpO2lmKGl8fHJ8fG8pe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fdGl0bGUiKSxhPW4/bi5vZmZzZXRIZWlnaHQ6MCxsPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY2FwdGlvbi50LXNsZHNfX2NhcHRpb24tYWN0aXZlIiksZD1nZXRDb21wdXRlZFN0eWxlKGwpLF87ZSs9cGFyc2VJbnQoZC5tYXJnaW5Ub3AsMTApK2F9cmV0dXJuIGl8fCFyJiYhb3x8KGUtPTIwKSxlfWZ1bmN0aW9uIHQzOTZfX2F1dG9IZWlnaHRfX2NhbkF1dG9jYWxjdWxhdGVIZWlnaHQodCxlKXt2YXIgaSxyO2lmKCF0LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpKXJldHVybiExO2lmKGUuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuImdhbGxlcnkiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIil9KSkpe3ZhciBvPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiZmxleGRpcmVjdGlvbiIpLG49dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJmbGV4YWxpZ25pdGVtcyIpLGE9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJmbGV4anVzdGlmeWNvbnRlbnQiKSxsO3JldHVybiJyb3ciPT09byYmImZsZXgtZW5kIj09PW58fCJjb2x1bW4iPT09byYmImZsZXgtZW5kIj09PWF9cmV0dXJuITB9ZnVuY3Rpb24gdDM5Nl9fYWJfX2dldFBhZGRpbmdWYWx1ZSh0LGUpe3ZhciBpPSh0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsInBhZGRpbmciKXx8IjBweCAwcHggMHB4IDBweCIpLnNwbGl0KCIgIikscj17cGFkZGluZ3RvcDppWzBdLHBhZGRpbmdyaWdodDppWzFdLHBhZGRpbmdib3R0b206aVsyXSxwYWRkaW5nbGVmdDppWzNdfTtyZXR1cm4gcGFyc2VJbnQocltlXSwxMCl8fDB9ZnVuY3Rpb24gdDM5Nl9fcHJvY2Vzc0Fic29sdXRlQXJ0Qm9hcmQodCl7aWYodCl7dmFyIGU9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJwb3MiKTtpZigiZml4ZWQiIT09ZSl7dmFyIGk9InQzOTZfX2FydGJvYXJkLWZpeGVkLW5vLWJnIjtpZigiYWJzb2x1dGUiPT09ZSl7dmFyIHI9Z2V0Q29tcHV0ZWRTdHlsZSh0KSxvPXQucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpLG49IW98fCJub25lIj09PWdldENvbXB1dGVkU3R5bGUobykuYmFja2dyb3VuZEltYWdlLGEsbD0icmdiYSgwLCAwLCAwLCAwKSI9PT1yLmJhY2tncm91bmRDb2xvciYmIm5vbmUiPT09ci5iYWNrZ3JvdW5kSW1hZ2UmJm4/ImFkZCI6InJlbW92ZSI7dC5jbGFzc0xpc3RbbF0oaSl9ZWxzZSB0LmNsYXNzTGlzdC5yZW1vdmUoaSl9fX1mdW5jdGlvbiB0Mzk2X2RldGVjdFJlc29sdXRpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGUsaT10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkuY3NzV2lkdGgscj0iYWIiK3QsbztyZXR1cm4gd2luZG93LnRuW3JdLnNjcmVlbnMuZm9yRWFjaCgoZnVuY3Rpb24odCl7aT49dCYmKG89dCl9KSksdm9pZCAwPT09byYmKG89d2luZG93LnRuW3JdLnNjcmVlbnNbMF0pLG99ZnVuY3Rpb24gdDM5Nl9pbml0VE5vYmpfX2NyZWF0ZURlZmF1bHQoKXt3aW5kb3cudG49e30sd2luZG93LnRuLmFiX2ZpZWxkcz1bImhlaWdodCIsIndpZHRoIiwiYmdjb2xvciIsImJnaW1nIiwiYmdhdHRhY2htZW50IiwiYmdwb3NpdGlvbiIsImZpbHRlcm9wYWNpdHkiLCJmaWx0ZXJjb2xvciIsImZpbHRlcm9wYWNpdHkyIiwiZmlsdGVyY29sb3IyIiwiaGVpZ2h0X3ZoIiwidmFsaWduIl19ZnVuY3Rpb24gdDM5Nl9pbml0VE5vYmoodCxlKXtlJiYod2luZG93LnRufHx0Mzk2X2luaXRUTm9ial9fY3JlYXRlRGVmYXVsdCgpLHQzOTZfc2V0U2NyZWVuc1ROb2JqKHQsZSkpfWZ1bmN0aW9uIHQzOTZfc2V0U2NyZWVuc1ROb2JqKHQsZSl7dmFyIGk9ImFiIit0O3dpbmRvdy50bltpXT17fSx3aW5kb3cudG5baV0uc2NyZWVucz1bXTt2YXIgcj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1zY3JlZW5zIik7cj8ocj1yLnNwbGl0KCIsIikpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3dpbmRvdy50bltpXS5zY3JlZW5zLnB1c2gocGFyc2VJbnQodCwxMCkpfSkpOndpbmRvdy50bltpXS5zY3JlZW5zPVszMjAsNDgwLDY0MCw5NjAsMTIwMF19ZnVuY3Rpb24gdDM5Nl9fZ2V0QXhpc1hQYWRkaW5nKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlPUJvb2xlYW4od2luZG93LnRpbGRhTWVtYmVycyl8fCJhbGxyZWNvcmRzIj09PXdpbmRvdy56ZXJvX3dpbmRvd193aWR0aF9ob29rLGkscjtyZXR1cm4gdCYmZSYmW2RvY3VtZW50LmJvZHksdF0ucmVkdWNlKChmdW5jdGlvbih0LGUpe3ZhciBpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLnBhZGRpbmdMZWZ0LHI9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkucGFkZGluZ1JpZ2h0O3JldHVybiB0K3BhcnNlSW50KGksMTApK3BhcnNlSW50KHIsMTApfSksMCl8fDB9ZnVuY3Rpb24gdDM5Nl91cGRhdGVUTm9iaih0KXtmb3IodmFyIGUsaT10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGgscj0iYWIiK3Qsbz13aW5kb3cudG5bcl0uc2NyZWVucy5zbGljZSgpLnJldmVyc2UoKSxuPTA7bjxvLmxlbmd0aDtuKyspd2luZG93LnRuW3JdLmN1clJlc29sdXRpb249PT1vW25dJiYod2luZG93LnRuW3JdLmNhbnZhc19taW5fd2lkdGg9b1tuXSx3aW5kb3cudG5bcl0uY2FudmFzX21heF93aWR0aD0wPT09bj9pOm9bbi0xXSk7dmFyIGE9ImFsbHJlY29yZHMiPT09d2luZG93Lnplcm9fd2luZG93X3dpZHRoX2hvb2s7d2luZG93LnRuW3JdLmdyaWRfd2lkdGg9d2luZG93LnRuW3JdLmNhbnZhc19taW5fd2lkdGg7dmFyIGw9KGktd2luZG93LnRuW3JdLmdyaWRfd2lkdGgpLzI7d2luZG93LnRuW3JdLmdyaWRfb2Zmc2V0X2xlZnQ9bDwwJiZhPzA6bH1mdW5jdGlvbiB0Mzk2X3N3aXRjaFJlc29sdXRpb24odCxlKXt2YXIgaT0iYWIiK3Qscj13aW5kb3cudG5baV0uc2NyZWVuc1t3aW5kb3cudG5baV0uc2NyZWVucy5sZW5ndGgtMV07d2luZG93LnRuW2ldLmN1clJlc29sdXRpb249ZSx3aW5kb3cudG5baV0uY3VyUmVzb2x1dGlvbl9tYXg9cix3aW5kb3cudG4uY3VyUmVzb2x1dGlvbj1lLHdpbmRvdy50bi5jdXJSZXNvbHV0aW9uX21heD1yfWZ1bmN0aW9uIHQzOTZfYXJ0Ym9hcmRfYnVpbGQodCxlKXt2YXIgaT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIitlKSxyPWk/aS5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTpudWxsO2lmKHIpe3QzOTZfYWJfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcocik7dmFyIG89ci5xdWVyeVNlbGVjdG9yQWxsKCIudG4tZWxlbSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24odCl7dmFyIGk7c3dpdGNoKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpKXtjYXNlInRleHQiOnQzOTZfYWRkVGV4dChyLHQpO2JyZWFrO2Nhc2UiaW1hZ2UiOnQzOTZfYWRkSW1hZ2Uocix0KTticmVhaztjYXNlInNoYXBlIjp0Mzk2X2FkZFNoYXBlKHIsdCk7YnJlYWs7Y2FzZSJidXR0b24iOnQzOTZfYWRkQnV0dG9uKHIsdCk7YnJlYWs7Y2FzZSJ2aWRlbyI6dDM5Nl9hZGRWaWRlbyhyLHQpO2JyZWFrO2Nhc2UiaHRtbCI6dDM5Nl9hZGRIdG1sKHIsdCk7YnJlYWs7Y2FzZSJ0b29sdGlwIjp0Mzk2X2FkZFRvb2x0aXAocix0KTticmVhaztjYXNlImZvcm0iOnQzOTZfYWRkRm9ybShyLHQsZSk7YnJlYWs7Y2FzZSJnYWxsZXJ5Ijp0Mzk2X2FkZEdhbGxlcnkocix0LGUpO2JyZWFrO2Nhc2UidmVjdG9yIjp0Mzk2X2FkZFZlY3RvcihyLHQpfX0pKSxyLmNsYXNzTGlzdC5yZW1vdmUoInJlbmRlcmluZyIpLHIuY2xhc3NMaXN0LmFkZCgicmVuZGVyZWQiKSxyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJhcnRCb2FyZFJlbmRlcmVkIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSkpO3ZhciBuPXIuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLW92cmZsdyIpO2lmKFsidmlzaWJsZSIsInZpc2libGVYIl0uaW5jbHVkZXMobikmJih0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3JkcygpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigidFN0b3JlR2FsbGVyeUluaXRpYWxpemVkIiwoZnVuY3Rpb24oKXt0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3JkcygpfSkpKSwiYXV0byI9PT1uKXt2YXIgYT1NYXRoLmFicyhyLm9mZnNldEhlaWdodC1yLmNsaWVudEhlaWdodCk7MCE9PWEmJihyLnN0eWxlLnBhZGRpbmdCb3R0b209YSsicHgiKX1pZih3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc0lQYWQpe3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7bC50ZXh0Q29udGVudD0iQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjEzNjZweCkgYW5kIChvcmllbnRhdGlvbjpsYW5kc2NhcGUpIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjIpIHsudDM5Nl9fY2FycmllciB7YmFja2dyb3VuZC1hdHRhY2htZW50OnNjcm9sbCFpbXBvcnRhbnQ7fX0iLGkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLGwpfX19ZnVuY3Rpb24gdDM5Nl9hYl9fcmVuZGVyVmlldyh0KXtpZih0KXtmb3IodmFyIGU9d2luZG93LnRuLmFiX2ZpZWxkcyxpPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikscixvPTA7bzxlLmxlbmd0aDtvKyspdDM5Nl9hYl9fcmVuZGVyVmlld09uZUZpZWxkKHQsZVtvXSk7dmFyIG49dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHQiKSxhPXQzOTZfYWJfX2dldEhlaWdodCh0KSxsLGQ9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpLF89ISFpJiYiZWRpdCI9PT1pLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIikscz0id2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwidXBzY2FsZSIpLHUsYyxmO2lmKHI9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHRfdmgiKSxzJiYhXyYmciYmKHU9cGFyc2VJbnQobiwxMCkqZCksbj09PWF8fHUmJnU+PWEpYz0wO2Vsc2Ugc3dpdGNoKHQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwidmFsaWduIikpe2Nhc2UidG9wIjpkZWZhdWx0OmM9MDticmVhaztjYXNlImNlbnRlciI6Yz11P3BhcnNlRmxvYXQoKChhLXUpLzIpLnRvRml4ZWQoMSkpOnBhcnNlRmxvYXQoKChhLW4pLzIpLnRvRml4ZWQoMSkpO2JyZWFrO2Nhc2UiYm90dG9tIjpjPXU/cGFyc2VGbG9hdCgoYS11KS50b0ZpeGVkKDEpKTpwYXJzZUZsb2F0KChhLW4pLnRvRml4ZWQoMSkpO2JyZWFrO2Nhc2Uic3RyZXRjaCI6Yz0wLG49YX10LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1taW4tb2Zmc2V0LXRvcCIsYyksdC5zZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLWhlaWdodCIsbiksdC5zZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWF4LWhlaWdodCIsYSk7dmFyIGc9dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fZmlsdGVyIiksdz10LnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19jYXJyaWVyIikscDtpZihyPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0X3ZoIikscj1wYXJzZUZsb2F0KHIpLCh3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc0lQYWQpJiZyKXt2YXIgaD10Mzk2X2FiX19nZXRXaW5kb3dIZWlnaHQodCkqci8xMDA7dC5zdHlsZS5oZWlnaHQ9aCsicHgiLGcmJihnLnN0eWxlLmhlaWdodD1oKyJweCIpLHcmJih3LnN0eWxlLmhlaWdodD1oKyJweCIpfSJodWciPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpJiYhciYmKHQuc3R5bGUuaGVpZ2h0PW4rInB4IixnJiYoZy5zdHlsZS5oZWlnaHQ9bisicHgiKSx3JiYody5zdHlsZS5oZWlnaHQ9bisicHgiKSl9fWZ1bmN0aW9uIHQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3Rvcih0KXt2YXIgZT0iYWIiK3QsaTtyZXR1cm4gd2luZG93LnRuJiZ3aW5kb3cudG5bZV0mJndpbmRvdy50bltlXS5zY2FsZUZhY3Rvcnx8d2luZG93LnRuX3NjYWxlX2ZhY3Rvcn1mdW5jdGlvbiB0Mzk2X19zZXRTY2FsZUZhY3RvckZvckVsZW1lbnRzKHQsZSl7dmFyIGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCkscj1pP2kucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZihyKXt2YXIgbz1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50Mzk2X19lbGVtLCAudG4tZ3JvdXAiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3Quc2NhbGVGYWN0b3I9ZX0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRUZXh0KHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0idG9wLGxlZnQsd2lkdGgsaGVpZ2h0LGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyI7aS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSl9fWZ1bmN0aW9uIHQzOTZfYWRkSW1hZ2UodCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJpbWcsd2lkdGgsZmlsZXdpZHRoLGZpbGVoZWlnaHQsdG9wLGxlZnQsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIjtpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKTt2YXIgbz1pLnF1ZXJ5U2VsZWN0b3IoImltZyIpO28mJihvLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe2RvY3VtZW50LmNvbnRhaW5zKG8pJiYodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIiksby5zcmMmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuY29udGFpbnMobykmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKSx0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHQpKX0pLDJlMykpfSkpLG8uY29tcGxldGUmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKSxvLnNyYyYmc2V0VGltZW91dCgoZnVuY3Rpb24oKXtkb2N1bWVudC5jb250YWlucyhvKSYmKHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpLHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQodCkpfSksMmUzKSksby5hZGRFdmVudExpc3RlbmVyKCJ0dXdpZGdldF9kb25lIiwoZnVuY3Rpb24oKXt0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfY2hhbmdlRmlsdGVyT25TYWZhcmkoaSl9KSkpfX1mdW5jdGlvbiB0Mzk2X2FkZFNoYXBlKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7cis9ImNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSl9fWZ1bmN0aW9uIHQzOTZfY2hhbmdlRmlsdGVyT25TYWZhcmkodCl7dmFyIGU7aWYoL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHQzOTZfX2NoZWNrQ29udGFpbkJhY2tkcm9wRmlsdGVyKHQpJiYiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KSl7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpLHI7bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChmdW5jdGlvbihlLGkpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoZS5pc0ludGVyc2VjdGluZyl7dmFyIHI9ZS50YXJnZXQ7aS51bm9ic2VydmUociksdDM5Nl9fcHJvY2Vzc0JhY2tkcm9wRmlsdGVyT25JbWFnZSh0KX19KSl9KSkub2JzZXJ2ZShpKX19ZnVuY3Rpb24gdDM5Nl9fY2hlY2tDb250YWluQmFja2Ryb3BGaWx0ZXIodCl7aWYoIXQpcmV0dXJuITE7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkud2Via2l0QmFja2Ryb3BGaWx0ZXI7aWYoZSYmIm5vbmUiIT09ZSlyZXR1cm4hMDt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyLCAudG4tYXRvbV9fcHJ4LXdyYXBwZXIsIC50bi1hdG9tX19zdGlja3ktd3JhcHBlciIpO2lmKCFpKXJldHVybiExO3ZhciByPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGkpLndlYmtpdEJhY2tkcm9wRmlsdGVyO3JldHVybiByJiYibm9uZSIhPT1yfWZ1bmN0aW9uIHQzOTZfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCl7aWYodCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtb3B0cyIpLGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1wcngiKXx8dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1maXgiKSxyPWV8fGksbz10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZWxlbS0tYmFja2Ryb3AtZmlsdGVyLWltZy13cmFwcGVyZWQiKTtyJiZvfHwhcj90Mzk2X191cGRhdGVCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCk6dC5hZGRFdmVudExpc3RlbmVyKCJiYWNrZHJvcEZpbHRlckltZ1dyYXBwZXJlZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fdXBkYXRlQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpfSkpfX1mdW5jdGlvbiB0Mzk2X191cGRhdGVCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCl7aWYodCl7dmFyIGU9dCxpPWUucXVlcnlTZWxlY3RvcigiaW1nIikscj1lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyLCAudG4tYXRvbV9fcHJ4LXdyYXBwZXIsIC50bi1hdG9tX19zdGlja3ktd3JhcHBlciIpLG89IiI7ciYmKGU9cixvPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLndlYmtpdEJhY2tkcm9wRmlsdGVyfHwiIiksZS5zdHlsZS53ZWJraXRCYWNrZHJvcEZpbHRlcj0ibm9uZSIsdDM5Nl93YWl0Rm9yVXBsb2FkSW1nKGksKGZ1bmN0aW9uKCl7ZS5zdHlsZS53ZWJraXRCYWNrZHJvcEZpbHRlcj1vfSkpfX1mdW5jdGlvbiB0Mzk2X3dhaXRGb3JVcGxvYWRJbWcodCxlKXtpZigieSI9PT13aW5kb3cubGF6eSl2YXIgaT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2xhc3NMaXN0LmNvbnRhaW5zKCJsb2FkZWQiKSYmdC5jbGllbnRXaWR0aCYmdC5zcmM/KGUoKSxjbGVhclRpbWVvdXQoaSkpOnQzOTZfd2FpdEZvclVwbG9hZEltZyh0LGUpfSksMzAwKTtlbHNlIGUoKX1mdW5jdGlvbiB0Mzk2X2FkZEJ1dHRvbih0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoIWkpcmV0dXJuIG51bGw7dmFyIHI9InRvcCxsZWZ0LHdpZHRoLGhlaWdodCxjb250YWluZXIsYXhpc3gsYXhpc3ksY2FwdGlvbixsZWZ0dW5pdHMsdG9wdW5pdHMiO3JldHVybiBpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKSxpfWZ1bmN0aW9uIHQzOTZfYWRkVmlkZW8odCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJ3aWR0aCxoZWlnaHQsdG9wLGxlZnQsIjtyKz0iY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsaGVpZ2h0dW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIixpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKSx0X29uRnVuY0xvYWQoInQzOTZfaW5pdFZpZGVvIiwoZnVuY3Rpb24oKXt0Mzk2X2luaXRWaWRlbyhpKX0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRIdG1sKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7cis9ImNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSl9fWZ1bmN0aW9uIHQzOTZfYWRkVG9vbHRpcCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO3IrPSJjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxoZWlnaHR1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMsdGlwcG9zaXRpb24iLGkuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpLHRfb25GdW5jTG9hZCgidDM5Nl9pbml0VG9vbHRpcCIsKGZ1bmN0aW9uKCl7dDM5Nl9pbml0VG9vbHRpcChpKX0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRGb3JtKHQsZSxpKXt2YXIgcj10Mzk2X2dldEVsKGUpO2lmKHIpe3ZhciBvPSJ3aWR0aCx0b3AsbGVmdCwiO28rPSJpbnB1dHMsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIixyLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLG8pO3ZhciBuPXQzOTZfZWxlbV9fZ2V0Rm9ybUlucHV0c1ZhbHVlKHIpLGE9ci5nZXRBdHRyaWJ1dGUoImRhdGEtZmUtZWxlbS1pZCIpfHxyLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIik7dF9vbkZ1bmNMb2FkKCJ0X3plcm9Gb3Jtc19faW5pdCIsKGZ1bmN0aW9uKCl7dDM5Nl9lbGVtX19yZW5kZXJWaWV3KHIpLHRfemVyb0Zvcm1zX19pbml0KGksYSxuKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcocil9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkR2FsbGVyeSh0LGUsaSl7dmFyIHI9dDM5Nl9nZXRFbChlKTtpZihyKXt2YXIgbz0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7bys9ImltZ3MsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsaGVpZ2h0dW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIixyLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLG8pLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhyKTt2YXIgbj1yLmdldEF0dHJpYnV0ZSgiZGF0YS1mZS1lbGVtLWlkIil8fHIuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKTt0X29uRnVuY0xvYWQoInRfemVyb0dhbGxlcnlfX2luaXQiLChmdW5jdGlvbigpe3RfemVyb0dhbGxlcnlfX2luaXQoaSxuKX0pKX19ZnVuY3Rpb24gdDM5Nl9hZGRWZWN0b3IodCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJ3aWR0aCxmaWxld2lkdGgsZmlsZWhlaWdodCx0b3AsbGVmdCxjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiO2kuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpfX1mdW5jdGlvbiB0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCxlKXt2YXIgaT10Mzk2X2dldEVsKHQpO2lmKCFpKXJldHVybiBudWxsO2lmKGkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1ncm91cCIpKXJldHVybiB0Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGksZSk7dmFyIHI9aS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxvPXIuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksbj0iYWIiK28sYTt2b2lkIDA9PT13aW5kb3cudG5bbl0mJih0Mzk2X2luaXRUTm9iaihvLHIpLHQzOTZfc3dpdGNoUmVzb2x1dGlvbihvLHQzOTZfZGV0ZWN0UmVzb2x1dGlvbihvKSkpO3ZhciBsPXdpbmRvdy50bltuXS5jdXJSZXNvbHV0aW9uLGQ9d2luZG93LnRuW25dLmN1clJlc29sdXRpb25fbWF4LF89d2luZG93LnRuW25dLnNjcmVlbnMscztpZighKHM9bD09PWQ/aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtIitlKyItdmFsdWUiKTppLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC0iK2UrIi1yZXMtIitsKyItdmFsdWUiKSkmJiIiIT09cylmb3IodmFyIHU9MDt1PF8ubGVuZ3RoO3UrKyl7dmFyIGM9X1t1XTtpZighKGM8PWwpJiYocz1jPT09ZD9pLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC0iK2UrIi12YWx1ZSIpOmkuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLSIrZSsiLXJlcy0iK2MrIi12YWx1ZSIpKSlicmVha312YXIgZj10Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKHMpO3JldHVybiBmJiYocz1mLmZhbGxiYWNrKSxzfWZ1bmN0aW9uIHQzOTZfZWxlbV9fcmVuZGVyVmlldyh0KXt2YXIgZT10Mzk2X2dldEVsKHQpLGk9ZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiKToiIjtpJiYoaT1pLnNwbGl0KCIsIikpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCl9KSl9ZnVuY3Rpb24gdDM5Nl9ncm91cF9fcmVuZGVyVmlldyh0KXt2YXIgZT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIpOiIiO2UmJihlPWUuc3BsaXQoIiwiKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGk9dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LGUpO3N3aXRjaChlKXtjYXNlImxlZnQiOmk9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKHQsZSxpKSx0LnN0eWxlLmxlZnQ9cGFyc2VGbG9hdChpKS50b0ZpeGVkKDEpKyJweCI7YnJlYWs7Y2FzZSJ0b3AiOmk9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKHQsZSxpKSx0LnN0eWxlLnRvcD1wYXJzZUZsb2F0KGkpLnRvRml4ZWQoMSkrInB4IjticmVhaztjYXNlImNvbnRhaW5lciI6dDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQodCwibGVmdCIpLHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKHQsInRvcCIpfX0pKX1mdW5jdGlvbiB0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwodCk7aWYoaSl7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxvPXI/ci5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOiIiLG4sYT0id2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoaS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSwidXBzY2FsZSIpO2lmKCJ5ZXMiIT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtc2NhbGUtb2ZmIil8fCFhfHwiZWRpdCI9PT1vKXt2YXIgbD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSxlKSxkLF89WyJmaWxsIiwiaHVnIl0scz10Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKGkpO3N3aXRjaChlKXtjYXNlImxlZnQiOmw9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGksZSxsKSxsPXM/dDM5Nl9fem9vbWlmeVZhbHVlKGksbCk6cGFyc2VGbG9hdChsKS50b0ZpeGVkKDEpKyJweCIsaS5zdHlsZS5sZWZ0PWw7YnJlYWs7Y2FzZSJ0b3AiOmw9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGksZSxsKSxsPXM/dDM5Nl9fem9vbWlmeVZhbHVlKGksbCk6cGFyc2VGbG9hdChsKS50b0ZpeGVkKDEpKyJweCIsaS5zdHlsZS50b3A9bDticmVhaztjYXNlIndpZHRoIjpkPWkuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3ZhciB1PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ3aWR0aG1vZGUiKSxjO2lmKChjPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ0ZXh0Zml0IikpfHwoImJ1dHRvbiI9PT1kP2M9ImZpeGVkc2l6ZSI6InRleHQiPT09ZCYmKGM9ImF1dG9oZWlnaHQiKSksKCJ0ZXh0Ij09PWR8fCJidXR0b24iPT09ZCkmJiJhdXRvd2lkdGgiPT09YylyZXR1cm4gdm9pZChpLnN0eWxlLndpZHRoPSJhdXRvIik7aWYoXy5pbmNsdWRlcyh1KSlyZXR1cm4gdm9pZChpLnN0eWxlLndpZHRoPSIiKTtzd2l0Y2gobD10Mzk2X2VsZW1fX2dldFdpZHRoKGksbCksaS5zdHlsZS53aWR0aD1wYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4IixkKXtjYXNlInRvb2x0aXAiOnZhciBmPWkucXVlcnlTZWxlY3RvckFsbCgiLnRuLWF0b21fX3Bpbi1pY29uIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChmLChmdW5jdGlvbih0KXt2YXIgZT1wYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4Ijt0LnN0eWxlLndpZHRoPWUsdC5zdHlsZS5oZWlnaHQ9ZX0pKSxpLnN0eWxlLmhlaWdodD1wYXJzZUludChsKS50b0ZpeGVkKDEpKyJweCI7YnJlYWs7Y2FzZSJnYWxsZXJ5Ijp0Mzk2X2VsZW1fX3NldEdhbGxlcnlTaXplKGksIndpZHRoIixsKX1icmVhaztjYXNlImhlaWdodCI6ZD1pLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTt2YXIgZz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0bW9kZSIpLGM7aWYoKGM9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksInRleHRmaXQiKSl8fCgiYnV0dG9uIj09PWQ/Yz0iZml4ZWRzaXplIjoidGV4dCI9PT1kJiYoYz0iYXV0b2hlaWdodCIpKSwoInRleHQiPT09ZHx8ImJ1dHRvbiI9PT1kKSYmWyJhdXRvd2lkdGgiLCJhdXRvaGVpZ2h0Iiwic2luZ2xlbGluZSJdLmluY2x1ZGVzKGMpKXJldHVybiB2b2lkKGkuc3R5bGUuaGVpZ2h0PSJhdXRvIik7aWYoXy5pbmNsdWRlcyhnKSYmInRvb2x0aXAiIT09ZClyZXR1cm4gdm9pZChpLnN0eWxlLmhlaWdodD0iIik7aWYoInRvb2x0aXAiPT09ZClyZXR1cm47bD10Mzk2X2VsZW1fX2dldEhlaWdodChpLGwpLGkuc3R5bGUuaGVpZ2h0PXBhcnNlRmxvYXQobCkudG9GaXhlZCgxKSsicHgiLCJnYWxsZXJ5Ij09PWQmJnQzOTZfZWxlbV9fc2V0R2FsbGVyeVNpemUoaSwiaGVpZ2h0IixsKTticmVhaztjYXNlImNvbnRhaW5lciI6dDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwibGVmdCIpLHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpO2JyZWFrO2Nhc2UiaW5wdXRzIjp0cnl7bD10Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZShpKSx3aW5kb3cudF96ZXJvRm9ybXNfX3JlbmRlckZvcm0oaSxsKX1jYXRjaCh3KXt9fSJ3aWR0aCIhPT1lJiYiaGVpZ2h0IiE9PWUmJiJmb250c2l6ZSIhPT1lJiYiZm9udGZhbWlseSIhPT1lJiYibGV0dGVyc3BhY2luZyIhPT1lJiYiZm9udHdlaWdodCIhPT1lJiYiaW1nIiE9PWV8fCh0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJsZWZ0IiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIikpfX19ZnVuY3Rpb24gdDM5Nl9lbGVtX19zZXRHYWxsZXJ5U2l6ZSh0LGUsaSl7dmFyIHI9aSxvPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LCJib3JkZXJ3aWR0aCIpLG49dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsImJvcmRlcnN0eWxlIik7biYmbyYmIm5vbmUiIT09bnx8KG89MCksci09MipvO3ZhciBhPU1hdGgucm91bmQocGFyc2VGbG9hdChyKSkrInB4IjthPSJ3aWR0aCI9PT1lfHwiaGVpZ2h0Ij09PWU/dDM5Nl9fem9vbWlmeVZhbHVlKHQsYSx7cm91bmQ6ITB9KTp0Mzk2X196b29taWZ5VmFsdWUodCxhKTt2YXIgbD10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX21haW4iKSxkPXQucXVlcnlTZWxlY3RvckFsbCgiLnRuLWF0b21fX3NsZHMtaW1nIik7dC5zdHlsZVtlXT1hLGwmJihsLnN0eWxlW2VdPWEpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCwoZnVuY3Rpb24odCl7dC5zdHlsZVtlXT1hfSkpfWZ1bmN0aW9uIHQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZSh0LGUsaSl7dmFyIHI9dDM5Nl9nZXRFbCh0KTtpZighcilyZXR1cm4gbnVsbDt2YXIgbz1yLmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLG49by5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxhPSJhYiIrbixsPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywidmFsaWduIiksZD0id2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywidXBzY2FsZSIpLF89ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxzLHU9ImVkaXQiPT09KF8/Xy5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOiIiKSxjPXQzOTZfaXNPbmx5U2NhbGFibGVCcm93c2VyKCksZj0hdSYmZCYmYyxnPSF1JiZkJiYhYyx3PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShyLCJheGlzeSIpLHA9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsImF4aXN4IiksaD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUociwiY29udGFpbmVyIiksbT1yLmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSYmInBoeXNpY2FsIj09PXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUociwidHlwZSIpLGI9ci5wYXJlbnROb2RlLmNsb3Nlc3QoIi50bi1ncm91cCIpLHY9InBoeXNpY2FsIj09PXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoYiwidHlwZSIpO20mJihoPWh8fCJncmlkIik7dmFyIHk9cGFyc2VJbnQoaSksRixBLHgsUyxWLEUsSSxrPXQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3RvcihuKTtzd2l0Y2goZSl7Y2FzZSJsZWZ0Ijp2YXIgeixMPXQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aCxCO2lmKEY9ImdyaWQiPT09aD8iZ3JpZCI6IndpbmRvdyIsQT0iZ3JpZCI9PT1oP3dpbmRvdy50blthXS5ncmlkX29mZnNldF9sZWZ0OjAsVj0iZ3JpZCI9PT1oP3dpbmRvdy50blthXS5ncmlkX3dpZHRoOkwsIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsImxlZnR1bml0cyIpJiYoeT10Mzk2X3JvdW5kRmxvYXQoVip5LzEwMCkpLHYpe3ZhciBSPXBhcnNlSW50KHQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoYiwibGVmdCIpLDEwKSxUOyIlIj09PXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUoYiwibGVmdHVuaXRzIikmJihSPXQzOTZfcm91bmRGbG9hdChWKlIvMTAwKSkseS09UjticmVha30hdSYmZD8iZ3JpZCI9PT1oJiZjJiYoeSo9ayk6eT1BK3ksImNlbnRlciI9PT1wJiYoUz10Mzk2X2VsZW1fX2dldFdpZHRoKHIpLGYmJiJ3aW5kb3ciIT09RiYmKFYqPWssUyo9aykseT1WLzItUy8yK3kpLCJyaWdodCI9PT1wJiYoUz10Mzk2X2VsZW1fX2dldFdpZHRoKHIpLGYmJiJ3aW5kb3ciIT09RiYmKFYqPWssUyo9aykseT1WLVMreSksZiYmIndpbmRvdyIhPT1GJiYoeSs9KChTPXQzOTZfZWxlbV9fZ2V0V2lkdGgocikpKmstUykvMik7YnJlYWs7Y2FzZSJ0b3AiOnZhciBPPXIuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikscT1PP08uZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1pbi1vZmZzZXQtdG9wIik6IjAiLEg9Tz9PLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1taW4taGVpZ2h0Iik6IjAiLEM9Tz9PLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1tYXgtaGVpZ2h0Iik6IjAiLFc9ZnVuY3Rpb24gdChlKXt2YXIgaT10Mzk2X2VsZW1fX2dldEhlaWdodChlKTtpZihlJiYiaW1hZ2UiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIikpe3ZhciByPXQzOTZfZWxlbV9fZ2V0V2lkdGgoZSksbz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwiZmlsZXdpZHRoIiksbj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwiZmlsZWhlaWdodCIpLGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImltYWdlZml0Iil8fCJhdXRvIixsO2lmKG8mJm4mJiJhdXRvIj09PWEpaT1yLyhwYXJzZUludChvKS9wYXJzZUludChuKSl9cmV0dXJuIGl9LFA7aWYoRj0iZ3JpZCI9PT1oPyJncmlkIjoid2luZG93Iix4PSJncmlkIj09PWg/cGFyc2VGbG9hdChxKTowLEk9ImdyaWQiPT09aD9wYXJzZUZsb2F0KEgpOnBhcnNlRmxvYXQoQyksIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsInRvcHVuaXRzIikmJih5PUkqKHkvMTAwKSksdil7dmFyIE09cGFyc2VJbnQodDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShiLCJ0b3AiKSwxMCksTjsiJSI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsInRvcHVuaXRzIikmJihNPXQzOTZfcm91bmRGbG9hdChJKk0vMTAwKSkseS09TTticmVha31mJiYid2luZG93IiE9PUYmJih5Kj1rKSxnJiYid2luZG93IiE9PUYmJih4PSJzdHJldGNoIj09PWw/MDp4L2spLHk9eCt5O3ZhciBEPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoTywiaGVpZ2h0X3ZoIiksaj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKE8sImhlaWdodCIpLEc9dDM5Nl9hYl9fZ2V0SGVpZ2h0KE8pLFo7aWYoZCYmIXUmJkQmJihaPXBhcnNlSW50KGosMTApKmspLCJjZW50ZXIiPT09dyYmKEU9VyhyKSxmJiYid2luZG93IiE9PUYmJigic3RyZXRjaCIhPT1sP0kqPWs6ST1aP1o+Rz9aOkc6Ty5jbGllbnRIZWlnaHQsRSo9ayksdXx8IWR8fGN8fCJ3aW5kb3ciPT09Rnx8InN0cmV0Y2giIT09bHx8KEk9Wj9aPkc/WjpHOk8uY2xpZW50SGVpZ2h0LEkvPWspLHk9SS8yLUUvMit5KSwiYm90dG9tIj09PXcmJihFPVcociksZiYmIndpbmRvdyIhPT1GJiYoInN0cmV0Y2giIT09bD9JKj1rOkk9Wj9aPkc/WjpHOk8uY2xpZW50SGVpZ2h0LEUqPWspLHV8fCFkfHxjfHwid2luZG93Ij09PUZ8fCJzdHJldGNoIiE9PWx8fChJPVo/Wj5HP1o6RzpPLmNsaWVudEhlaWdodCxJLz1rKSx5PUktRSt5KSxmJiYid2luZG93IiE9PUYpe3ZhciBVPSgoRT1XKHIpKSprLUUpLzI7eSs9VT1NYXRoLnJvdW5kKFUpfX1yZXR1cm4geX1mdW5jdGlvbiB0Mzk2X2VsZW1fZmluZEZpcnN0TGV2ZWxQYXJlbnRHcm91cCh0KXtmb3IodmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtlOyl7dmFyIGk9ZS5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2lmKCFpKWJyZWFrO2U9aX1yZXR1cm4gZX1mdW5jdGlvbiB0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGkscj10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG89ImFiIityLG47dm9pZCAwPT09d2luZG93LnRuW29dJiYodDM5Nl9pbml0VE5vYmoocix0KSx0Mzk2X3N3aXRjaFJlc29sdXRpb24ocix0Mzk2X2RldGVjdFJlc29sdXRpb24ocikpKTt2YXIgYT13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbixsPXdpbmRvdy50bltvXS5jdXJSZXNvbHV0aW9uX21heCxkPXdpbmRvdy50bltvXS5zY3JlZW5zO2lmKG51bGw9PT0oaT1hPT09bD90LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLSIrZSsiLXJlcy0iK2EpKSlmb3IodmFyIF89MDtfPGQubGVuZ3RoO18rKyl7dmFyIHM9ZFtfXTtpZighKHM8PWEpJiZudWxsIT09KGk9cz09PWw/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtIitlKTp0LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UrIi1yZXMtIitzKSkpYnJlYWt9dmFyIHU9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihpKTtyZXR1cm4gdSYmKGk9dS5mYWxsYmFjayksaX1mdW5jdGlvbiB0Mzk2X2FiX19yZW5kZXJWaWV3T25lRmllbGQodCxlKXt0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsZSl9ZnVuY3Rpb24gdDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHQsZSl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIik/dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsZSk6dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LGUpfWZ1bmN0aW9uIHQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCxlKXtpZighdClyZXR1cm4gbnVsbDt2YXIgaSxyLG89ImFiIit0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG49d2luZG93LnRuW29dLmN1clJlc29sdXRpb24sYT13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbl9tYXgsbD13aW5kb3cudG5bb10uc2NyZWVucyxkPVsid2lkdGhtb2RlIiwiaGVpZ2h0bW9kZSIsImZsZXgiXS5pbmNsdWRlcyhlKT8iIjoiLXZhbHVlIjtpZihudWxsPT09KGk9bj09PWE/dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlK2QpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWdyb3VwLSIrZSsiLXJlcy0iK24rZCkpKWZvcih2YXIgXz0wO188bC5sZW5ndGg7XysrKXt2YXIgcz1sW19dO2lmKCEoczw9bikmJm51bGwhPT0oaT1zPT09YT90LmdldEF0dHJpYnV0ZSgiZGF0YS1ncm91cC0iK2UrZCk6dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlKyItcmVzLSIrcytkKSkpYnJlYWt9dmFyIHU9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihpKTtyZXR1cm4gdSYmKGk9dS5mYWxsYmFjayksaX1mdW5jdGlvbiB0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyh0KXtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1ncm91cCIpLGk9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUsKGZ1bmN0aW9uKHQpe3JldHVybiJwaHlzaWNhbCI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHQsInR5cGUiKX0pKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3QzOTZfZ3JvdXBfX3JlbmRlclZpZXcodCksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXdBdXRvbGF5b3V0KHQpfSkpfX1mdW5jdGlvbiB0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlld0F1dG9sYXlvdXQodCl7aWYodCYmdC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKSl7dmFyIGU9dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LCJ3aWR0aG1vZGUiKSxpPXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0bW9kZSIpOyJmaWxsIj09PWU/KHQuc3R5bGUud2lkdGg9IjEwMCUiLHQuc3R5bGUuZmxleFNocmluaz0iMSIpOih0LnN0eWxlLndpZHRoPSJodWciPT09ZT8ibWluLWNvbnRlbnQiOiIiLHQuc3R5bGUuaGVpZ2h0PSJodWciPT09aT8iaW5pdGlhbCI6IiIsdC5zdHlsZS5mbGV4U2hyaW5rPSIiKX19ZnVuY3Rpb24gdDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyh0KXtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1lbGVtIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0Mzk2X2VsZW1fX3JlbmRlclZpZXcodCl9KSl9fWZ1bmN0aW9uIHQzOTZfYWJfX2dldEhlaWdodCh0LGUpe3ZhciBpPWU7aXx8KGk9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHQiKSksaT1wYXJzZUZsb2F0KGkpO3ZhciByPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0X3ZoIik7aWYociYmKHI9cGFyc2VGbG9hdChyKSwhaXNOYU4ocikpKXt2YXIgbz10Mzk2X2FiX19nZXRXaW5kb3dIZWlnaHQodCkqci8xMDA7aTxvJiYoaT1vKX1yZXR1cm4gaX1mdW5jdGlvbiB0Mzk2X2VsZW1fX2dldFdpZHRoKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KSxyLG8sbj0iYWIiK2kuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksYT1lLGwsZCxfLHM7KGF8fChhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ3aWR0aCIpKSxhPXBhcnNlRmxvYXQoYSksIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksIndpZHRodW5pdHMiKSkmJihhPSJ3aW5kb3ciPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImNvbnRhaW5lciIpP3QzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aCphLzEwMDp3aW5kb3cudG5bbl0uZ3JpZF93aWR0aCphLzEwMCk7cmV0dXJuIGF9ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRIZWlnaHQodCxlKXt2YXIgaT10Mzk2X2dldEVsKHQpLHI9ZTtyfHwocj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0IikpLHI9cGFyc2VGbG9hdChyKTt2YXIgbz1pLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxuPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ0ZXh0Zml0IiksYTtpZihufHwoImJ1dHRvbiI9PT1vP249ImZpeGVkc2l6ZSI6InRleHQiPT09byYmKG49ImF1dG9oZWlnaHQiKSksInNoYXBlIj09PW98fCJ2aWRlbyI9PT1vfHwiaHRtbCI9PT1vfHwiZ2FsbGVyeSI9PT1vfHwoInRleHQiPT09b3x8ImJ1dHRvbiI9PT1vKSYmImZpeGVkc2l6ZSI9PT1uKXt2YXIgbDtpZigiJSI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0dW5pdHMiKSl7dmFyIGQ9aS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxfPWQ/ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLWhlaWdodCIpOiIwIixzPWQ/ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWF4LWhlaWdodCIpOiIwIix1PXBhcnNlRmxvYXQoXyksYz1wYXJzZUZsb2F0KHMpLGY7cj0id2luZG93Ij09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJjb250YWluZXIiKT9jKihyLzEwMCk6dSooci8xMDApfXJldHVybiByfWlmKCJ0ZXh0Ij09PW8pe3ZhciBnPWkucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtnJiYoZy5zdHlsZS5saW5lSGVpZ2h0PSIiKX1yZXR1cm4gaS5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gdDM5Nl9yb3VuZEZsb2F0KHQpe3JldHVybiBNYXRoLnJvdW5kKDEwMCp0KS8xMDB9ZnVuY3Rpb24gdDM5Nl9yZW1vdmVFbGVtZW50RnJvbURPTSh0KXt2YXIgZT10Mzk2X2dldEVsKHQpO2UmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIHQzOTZfX2dldEJsb2NrRWRpdG9yV2lkdGgoKXtpZighd2luZG93LnRuLmlzRWRpdE1vZGUpcmV0dXJuIDA7dmFyIHQsZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCItLXBhZ2Utdmlldy13aWR0aCIpO3JldHVybiBlJiYiMTAwJSIhPT1lP3BhcnNlSW50KGUsMTApOjB9ZnVuY3Rpb24gdDM5Nl9faXNBbGxaZXJvQmxvY2tzUmVuZGVyZWQodCxlKXt2b2lkIDA9PT1lJiYoZT0wKTt2YXIgaT10Mzk2X19nZXRaZXJvQmxvY2tzKCkscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG89ciYmImVkaXQiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpLG49InJlYWR5Ij09PWRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5LXN0YXR1cyIpLGE9ITE7aWYoaS5sZW5ndGh8fCFvfHxuKXtpZighaS5sZW5ndGgmJm8mJm4pcmV0dXJuIGU+MzA/dm9pZCB0KCk6dm9pZCBzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKHQsZSsxKX0pLDEwMCk7dmFyIGw9aS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmFydGJvYXJkfSkpLGQ7aWYobC5sZW5ndGg+MCYmbC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKXQoKTtlbHNle3ZhciBfPWwuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil9KSk7bC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKXx8ZS5hZGRFdmVudExpc3RlbmVyKCJhcnRCb2FyZFJlbmRlcmVkIiwoZnVuY3Rpb24oKXtfLnB1c2goZSksXy5sZW5ndGghPT1sLmxlbmd0aHx8YXx8dCgpfSkpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YT0hMCxfLmxlbmd0aCE9PWwubGVuZ3RoJiZ0KCl9KSwzZTMpfX1lbHNle3ZhciBzPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJyZWFkeSI9PT1lLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtcmVhZHktc3RhdHVzIikmJihzLmRpc2Nvbm5lY3QoKSx0Mzk2X19pc0FsbFplcm9CbG9ja3NSZW5kZXJlZCh0KSl9KSl9KSk7cy5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsiZGF0YS1yZWFkeS1zdGF0dXMiXX0pfX1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzRWxlbWVudHNUcmFuc2Zvcm0odCl7dmFyIGU9dDM5Nl9faW5pdEZhc3RET00oKSxpPVtdO2UucmVhZCgoZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO2lmKCJ0ZXh0Ij09PWV8fCJpbWFnZSI9PT1lfHwic2hhcGUiPT09ZXx8ImJ1dHRvbiI9PT1lfHwidmVjdG9yIj09PWUpe3ZhciByPWdldENvbXB1dGVkU3R5bGUodCksbz1yLmJhY2tkcm9wRmlsdGVyJiYibm9uZSIhPT1yLmJhY2tkcm9wRmlsdGVyfHxyLndlYmtpdEJhY2tkcm9wRmlsdGVyJiYibm9uZSIhPT1yLndlYmtpdEJhY2tkcm9wRmlsdGVyLG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdHlsZSIpO2lmKG8mJiFuKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIiksbD1hP3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnRyYW5zZm9ybToibm9uZSI7Im1hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKSI9PT1sJiYobD0ibm9uZSIpLCJub25lIiE9PWwmJmkucHVzaCh7ZWxlbWVudDp0LGF0b206YSxhdG9tVHJhbnNmb3JtOmx9KX19fSkpfSkpLGUud3JpdGUoKGZ1bmN0aW9uKCl7aS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmF0b20uc3R5bGUudHJhbnNmb3JtPSJub25lIix0LmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPXQuYXRvbVRyYW5zZm9ybX0pKX0pKX1mdW5jdGlvbiB0Mzk2X19maXhFbGVtZW50c0xpbmVIZWlnaHRzKHQpe3ZhciBlPXQzOTZfX2luaXRGYXN0RE9NKCksaT1bXTtlLnJlYWQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZTtpZigidGV4dCI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSl7dmFyIHI9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpO2lmKHImJiF0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20odCkpe3ZhciBvPXQuc3R5bGUuem9vbSxuPXIuc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3QsYT1yLnN0eWxlLmZvbnRTaXplLGw9dC5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtbGluZWhlaWdodHVuaXRzLXZhbHVlIil8fCIiO2kucHVzaCh7ZWxlbWVudDp0LGF0b206cix6b29tOm8sdGV4dFNpemVBZGp1c3Q6bixmb250U2l6ZTphLGlzUmVsYXRpdmVMaW5lSGVpZ2h0OiIlIj09PWx9KX19fSkpfSkpLGUud3JpdGUoKGZ1bmN0aW9uKCl7aS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmF0b20uc3R5bGUucmVtb3ZlUHJvcGVydHkoImxpbmUtaGVpZ2h0Iiksd2luZG93LnQzOTZfX2lzU2FmYXJpJiZ0Lnpvb20mJih0LmF0b20uc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9Im5vbmUiLHQuYXRvbS5zdHlsZS5mb250U2l6ZT0iIix0LmVsZW1lbnQuc3R5bGUuem9vbT0iIil9KSl9KSksZS5yZWFkKChmdW5jdGlvbigpe2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jb21wdXRlZExpbmVIZWlnaHQ9cGFyc2VGbG9hdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LmF0b20pLmxpbmVIZWlnaHQpfSkpfSkpLGUud3JpdGUoKGZ1bmN0aW9uKCl7aS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LmNvbXB1dGVkTGluZUhlaWdodDt3aW5kb3cudDM5Nl9faXNTYWZhcmkmJnQuem9vbSYmKHQuYXRvbS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD10LnRleHRTaXplQWRqdXN0LHQuYXRvbS5zdHlsZS5mb250U2l6ZT10LmZvbnRTaXplLHQuem9vbSYmKHQuZWxlbWVudC5zdHlsZS56b29tPXQuem9vbSkpLGUmJiFpc05hTihlKSYmKHQuYXRvbS5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1saC1weCIsTWF0aC5yb3VuZChlKSsicHgiKSx0LmlzUmVsYXRpdmVMaW5lSGVpZ2h0fHwodC5hdG9tLnN0eWxlLmxpbmVIZWlnaHQ9TWF0aC5yb3VuZChlKSsicHgiKSl9KSl9KSl9ZnVuY3Rpb24gdDM5Nl9fZml4RWxlbWVudHNGb250U2l6ZXModCl7dmFyIGU7aWYoIXdpbmRvdy50Mzk2X19pc01vYmlsZSYmd2luZG93LnQzOTZfX2lzSVBhZHx8d2luZG93LnQzOTZfX2lzRmFjZWJvb2tNZXNzZW5nZXJJbkFwcHx8d2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHApe3ZhciBpPXQzOTZfX2luaXRGYXN0RE9NKCkscj1bXTtpLnJlYWQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtpZigidGV4dCI9PT1lfHwiYnV0dG9uIj09PWUpe3ZhciBpPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtpZihpKXt2YXIgbz10Mzk2X2VsZW1fZmluZEZpcnN0TGV2ZWxQYXJlbnRHcm91cCh0KSxuPXtlbGVtZW50OnQsYXRvbTppLHpvb206MSxlbGVtZW50VHlwZTplfTtpZihvJiZvLnN0eWxlLnpvb20mJihuLnpvb209cGFyc2VGbG9hdChvLnN0eWxlLnpvb20pKSwxIT09bi56b29tKXt2YXIgYT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwiZm9udHNpemUiKTthJiYobi5maWVsZEZvbnRTaXplPXBhcnNlRmxvYXQoYSkpLHIucHVzaChuKX19fX0pKX0pKSxpLndyaXRlKChmdW5jdGlvbigpe3IuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hdG9tLnN0eWxlLmZvbnRTaXplPSIifSkpfSkpLGkucmVhZCgoZnVuY3Rpb24oKXtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodC5hdG9tKS5mb250U2l6ZSksaT10LmZpZWxkRm9udFNpemUmJk1hdGguYWJzKHQuZmllbGRGb250U2l6ZS1lKTw9LjAxLHI9TnVtYmVyLmlzSW50ZWdlcihlKTt0LmNvcnJlY3RGb250U2l6ZT1pfHxyPyJjYWxjKCIrZSsicHggKiB2YXIoLS16b29tLCAxKSkiOiJjYWxjKCIrZSsicHggKiB2YXIoLS16b29tLCAxKSAqIHZhcigtLXpvb20sIDEpKSJ9KSl9KSksaS53cml0ZSgoZnVuY3Rpb24oKXtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYXRvbS5zdHlsZS5mb250U2l6ZT10LmNvcnJlY3RGb250U2l6ZX0pKX0pKX19ZnVuY3Rpb24gdDM5Nl9faW5pdEZhc3RET00oKXtyZXR1cm57cmVhZDpmdW5jdGlvbiB0KGUpe2UoKX0sd3JpdGU6ZnVuY3Rpb24gdChlKXtlKCl9fX1mdW5jdGlvbiB0Mzk2X19hcHBseUZpeGVzRm9yQWxsRWxlbWVudHMoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudDM5Nl9fZWxlbSIpLGU9d2luZG93LnQzOTZfX2lzU2FmYXJpfHx3aW5kb3cudDM5Nl9faXNGYWNlYm9va01lc3NlbmdlckluQXBwfHx3aW5kb3cudDM5Nl9faXNJbnN0YWdyYW1JbkFwcDtkb2N1bWVudC5mb250cyYmZT9kb2N1bWVudC5mb250cy5yZWFkeS50aGVuKChmdW5jdGlvbigpe3QzOTZfX2ZpeEVsZW1lbnRzRm9udFNpemVzKHQpLHQzOTZfX2ZpeEVsZW1lbnRzTGluZUhlaWdodHModCl9KSk6dDM5Nl9fZml4RWxlbWVudHNMaW5lSGVpZ2h0cyh0KSx0Mzk2X19wcm9jZXNzRWxlbWVudHNUcmFuc2Zvcm0odCl9ZnVuY3Rpb24gdDM5Nl9fem9vbWlmeVZhbHVlKHQsZSxpKXt2b2lkIDA9PT1pJiYoaT17fSk7dmFyIHIsbz1lKyhTdHJpbmcoZSkuZW5kc1dpdGgoInB4Iik/IiI6InB4IiksbjtpZih0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20odCkpcmV0dXJuIG87dmFyIGE9d2luZG93LkNTUyYmd2luZG93LkNTUy5zdXBwb3J0cyYmQ1NTLnN1cHBvcnRzKCJ3aWR0aCIsInJvdW5kKDEwcHgsIDFweCkiKTtyZXR1cm4gaS5yb3VuZCYmYT8icm91bmQoIitvKyIgKiB2YXIoLS16b29tLCAxKSwgMXB4KSI6ImNhbGMoIitvKyIgKiB2YXIoLS16b29tLCAxKSkifWZ1bmN0aW9uIHQzOTZfX2lzSW5Qb3B1cCh0KXtpZighdClyZXR1cm4hMTt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLGkscjtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrZSkucGFyZW50Tm9kZS5jbGFzc0xpc3QuY29udGFpbnMoInQtcG9wdXBfX2NvbnRhaW5lciIpfWZ1bmN0aW9uIHQzOTZfX3dhaXRGb3JQb3B1cCgpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCl7dmFyIGU9MCxpPTU7ZnVuY3Rpb24gcigpe3ZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwX3Nob3ciKTtpP3QoaSk6ZT49NT90KG51bGwpOihlKyssc2V0VGltZW91dChyLDEwMCplKSl9cigpfSkpfWZ1bmN0aW9uIHQzOTZfX3Nob3VsZFVzZVZpc3VhbFZpZXdwb3J0SGVpZ2h0KCl7cmV0dXJuInZpc3VhbFZpZXdwb3J0ImluIHdpbmRvdyYmd2luZG93LnQzOTZfX2lzTW9iaWxlJiZ3aW5kb3cudDM5Nl9faXNTYWZhcml9ZnVuY3Rpb24gdDM5Nl9fZ2V0Um9vdFpvbmUoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGU7cmV0dXJuIHQmJnQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXJvb3Qtem9uZSIpfHwiY29tIn1mdW5jdGlvbiB0Mzk2X19pbnRpYWxpemVVbmRlcmN1dCh0KXtpZih0JiZ0LnF1ZXJ5U2VsZWN0b3IoIi5xbC11bmRlcmN1dCIpKXt2YXIgZSxpPSJodHRwczovL3N0YXRpYy50aWxkYWNkbi4iK3QzOTZfX2dldFJvb3Rab25lKCkrIi9qcy90aWxkYS11bmRlcmN1dC0xLjAubWluLmpzIjt0X29uRnVuY0xvYWQoInRfbG9hZEpzRmlsZSIsKGZ1bmN0aW9uKCl7dF9sb2FkSnNGaWxlKGksKGZ1bmN0aW9uKCl7dF9vbkZ1bmNMb2FkKCJ0X3F1aWxsVW5kZXJjdXRfcGFyc2VOb2RlcyIsKGZ1bmN0aW9uKCl7dF9xdWlsbFVuZGVyY3V0X3BhcnNlTm9kZXModCl9KSl9KSl9KSl9fWZ1bmN0aW9uIHQzOTZfX2luaXRpYWxpemVBcnRib2FyZE92ZXJmbG93KHQsZSl7aWYoZSYmdCl7dmFyIGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgib3ZlcmZsb3ciKTtpZigiYXV0byI9PT1pKXt2YXIgcj10LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iik7InkiIT09d2luZG93LmxhenkmJiJ5ZXMiIT09cnx8dF9vbkZ1bmNMb2FkKCJ0X2xhenlsb2FkX3VwZGF0ZSIsKGZ1bmN0aW9uKCl7ZS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUod2luZG93LnRfbGF6eWxvYWRfdXBkYXRlLDUwMCkpfSkpfSIiIT09d2luZG93LmxvY2F0aW9uLmhhc2gmJiJ2aXNpYmxlIj09PWkmJihlLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSJ9KSwxKSl9fWZ1bmN0aW9uIHQzOTZfX2luaXRpYWxpemVBbmNob3JMaW5rT3ZlcmZsb3dGaXgoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1hcnRib2FyZC1vdnJmbHc9InZpc2libGUiXScpO3QubGVuZ3RoJiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKGZ1bmN0aW9uKGUpe3ZhciBpO2UudGFyZ2V0LmNsb3Nlc3QoJ2FbaHJlZl49IiMiXScpJiYodC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4ifSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIn0pKX0pKSl9KSl9CgpmdW5jdGlvbiB0Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKHQpe3RyeXt2YXIgZSxuPS92YXJcKCgtLXVjLShbXi1dKyktKFteLV0rKS0oW14sXSspKSxccz8oLiopXCkvLmV4ZWModCk7aWYoIW4pcmV0dXJuO3ZhciBpPW5bMF0sYT1uWzFdLHI9blsyXSxvPW5bM10scz1uWzRdLF89bls1XSxsLGM7aWYoIShpJiZyJiZvJiZzJiZfKSlyZXR1cm47cmV0dXJue3BhcmVudDp7aWQ6cyx0eXBlOnJ9LGZhbGxiYWNrOndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoYSl8fF8sZmllbGQ6b319Y2F0Y2gobSl7Y29uc29sZS5lcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHBhcnNlIENTUyBWYXJpYWJsZSIpfX1mdW5jdGlvbiB0Mzk2X19oZXgycmdiYSh0LGUpe2lmKCF0KXJldHVybiExO3ZhciBuPXQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIodCk7biYmKHQ9bi5mYWxsYmFjayk7dmFyIGk9dC5yZXBsYWNlKC8jLywiIik7aWYoMz09PWkubGVuZ3RoKXt2YXIgYT1pWzBdLHI9aVsxXSxvPWlbMl07dD0iIyIrYSthK3IrcitvK299dmFyIHM9cGFyc2VJbnQodC5zdWJzdHJpbmcoMSksMTYpLF8sbCxjO3JldHVyblsoMTY3MTE2ODAmcyk+PjE2LCg2NTI4MCZzKT4+OCwyNTUmcyxwYXJzZUZsb2F0KGUpXX1mdW5jdGlvbiB0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpe3ZhciBlPVsiZ2FsbGVyeSJdLG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7cmV0dXJuIGUuaW5jbHVkZXMobil9ZnVuY3Rpb24gdDM5Nl9faXNGbGV4KHQpe3ZhciBlPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZC1mbGV4Iiksbj10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZ3JvdXAtZmxleCIpO3JldHVybiBlfHxufWZ1bmN0aW9uIHQzOTZfX3NldE92ZXJmbG93VG9BbGxSZWNvcmRzKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtpZih0KXt2YXIgZT1bIi50OTUxX19zaWRlYmFyX3N0aWNreSIsIi50MTIwNl9fY29udGVudF9zdGlja3kiLCIudDc1NF9fY29sX2ZpeGVkIiwiLnQ3NzZfX2NvbF9maXhlZCIsIi50Nzg2X19jb2xfZml4ZWQiLCIudC1zdG9yZV9fcHJvZC1wb3B1cF9fY29sX2ZpeGVkIiwiLnQtY2F0YWxvZ19fc2lkZWJhcl9zdGlja3kiXTt0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKTt2YXIgbj1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZS5qb2luKCIsICIpKSk7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiLCJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpLHQuY2xhc3NMaXN0LmFkZChuPyJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiOiJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpfX1mdW5jdGlvbiB0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQzOTZfX292ZXJmbG93LXN0eWxlcyIpKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3QuaWQ9InQzOTZfX292ZXJmbG93LXN0eWxlcyIsdC5pbm5lckhUTUw9Ii50LXJlY29yZHNfX292ZXJmbG93LWNsaXAgeyBvdmVyZmxvdzogY2xpcDsgfVxuXHRcdFx0XHRcdFx0LnQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdDM5Nl9fZ2V0QXJ0Ym9hcmRzKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbixpPWUmJiJlZGl0Ij09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKT8nLnJlY29yZFtkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdIC5yOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yZWNvcmRbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJzonLnJbZGF0YS1yZWNvcmQtdHlwZT0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucltkYXRhLXBhcmVudHRwbGlkPSInK3QrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnO3JldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoaSkpfWZ1bmN0aW9uIHQzOTZfX2dldFplcm9CbG9ja3MoKXt2YXIgdD1bXS5jb25jYXQodDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIzOTYiKSx0Mzk2X19nZXRBcnRib2FyZHMoIjEyMSIpKSxlO3JldHVybiB0Lmxlbmd0aD90Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3JlY29yZDp0LmNsb3Nlc3QoIi5yOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIiksYXJ0Ym9hcmQ6dH19KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZWNvcmR9KSk6W119ZnVuY3Rpb24gdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpe2Zvcih2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2U7KXt2YXIgbjtpZihlLnN0eWxlLnpvb20pcmV0dXJuITA7ZT1udWxsPT0obj1lLnBhcmVudEVsZW1lbnQpP3ZvaWQgMDpuLmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpfXJldHVybiExfXZhciB0Mzk2X191bmlxdWVJZF9fZ2VuZXJhdG9yPWZ1bmN0aW9uIHQoKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PVN0cmluZyhlKz0xKS5wYWRTdGFydCg2LCIwIik7cmV0dXJuIiIrRGF0ZS5ub3coKSt0fX0sdDM5Nl9fZ2V0VW5pcXVlSWQ9dDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcigpO2Z1bmN0aW9uIHQzOTZfaXNCbG9ja1Zpc2libGUodCl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgsbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIiksaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4Iik7cmV0dXJuIShuJiZlPHBhcnNlSW50KG4sMTApKSYmIShpJiZlPnBhcnNlSW50KGksMTApKX12YXIgdDM5Nl9fb25SZWFkeT1mdW5jdGlvbiB0KGUpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZSgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpfSx0Mzk2X19odG1sVGV4dERlY29kZXI7ZnVuY3Rpb24gdDM5Nl9fZGVjb2RlSHRtbFRleHQodCl7cmV0dXJuIHQ/KHQzOTZfX2h0bWxUZXh0RGVjb2Rlcnx8KHQzOTZfX2h0bWxUZXh0RGVjb2Rlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpKSx0Mzk2X19odG1sVGV4dERlY29kZXIuaW5uZXJIVE1MPXQsdDM5Nl9faHRtbFRleHREZWNvZGVyLnZhbHVlKToiIn1mdW5jdGlvbiB0Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtZGF0YSIpO2lmKGUpe3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXZhbHVlIik7aWYobil0cnl7cmV0dXJuIEpTT04ucGFyc2Uobil9Y2F0Y2gocil7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgZGF0YToiLHIsbiksW119fXZhciBpPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX2lucHV0cy10ZXh0YXJlYSIpO2lmKGkpe3ZhciBhPWkudmFsdWU7aWYoYSl0cnl7cmV0dXJuIEpTT04ucGFyc2UoYSl9Y2F0Y2gocil7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgdGV4dGFyZWEgdmFsdWU6IixyLGEpLFtdfX1yZXR1cm5bXX1mdW5jdGlvbiB0Mzk2X2dldEVsKHQpe3JldHVybiB3aW5kb3cualF1ZXJ5JiZ0IGluc3RhbmNlb2YgalF1ZXJ5P3QubGVuZ3RoP3QuZ2V0KDApOm51bGw6dH1mdW5jdGlvbiB0Mzk2X19kb2VzQ2xpZW50UmVjdEluY2x1ZGVab29tKCl7dHJ5e3ZhciB0PTIsZT01MCxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO3Zpc2liaWxpdHk6aGlkZGVuO3BvaW50ZXItZXZlbnRzOm5vbmU7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDt6b29tOjI7Iixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG4pO3ZhciBpLGE9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChuKSwxMDA9PT1hfWNhdGNoKHIpe3JldHVybn19ZnVuY3Rpb24gdDM5Nl9faW5pdFNjYWxlRmFjdG9yRmxhZ3MoKXtpZih2b2lkIDA9PT13aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3Ipe3ZvaWQgMD09PXdpbmRvdy50Mzk2X19jbGllbnRSZWN0SW5jbHVkZXNab29tJiYod2luZG93LnQzOTZfX2NsaWVudFJlY3RJbmNsdWRlc1pvb209dDM5Nl9fZG9lc0NsaWVudFJlY3RJbmNsdWRlWm9vbSgpKTt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRmlyZWZveFwvKFswLTldKylcLi8pLGU9dD9wYXJzZUludCh0WzFdLDEwKToxMjYsbj13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQ2hyb21lXC8oWzAtOV0rKVwuLyksaSxhPShuJiZwYXJzZUludChuWzFdLDEwKXx8MCk+MTI3fHx3aW5kb3cudDM5Nl9fY2xpZW50UmVjdEluY2x1ZGVzWm9vbTt3aW5kb3cuaXNPbmx5U2NhbGFibGU9ZTwxMjYsd2luZG93LnNob3VsZFVzZVNjYWxlRmFjdG9yPSF3aW5kb3cuaXNPbmx5U2NhbGFibGUmJiF0JiYhYX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NoZWNrVmlzaWJpbGl0eVBhZ2UoKXsidmlzaWJsZSI9PT1kb2N1bWVudC52aXNpYmlsaXR5U3RhdGUmJih0X2FuaW1hdGlvblNCU19fb25SZWFkeSh0X2FuaW1hdGlvblNCU19faW5pdCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdF9hbmltYXRpb25TQlNfX2NoZWNrVmlzaWJpbGl0eVBhZ2UpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fb25SZWFkeSh0KXsibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP3QoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdCgpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksZT10PyJlZGl0Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKTpudWxsO2V8fChlPUJvb2xlYW4oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZvcl9yZWRhY3Rvcl90b29sYmFyIikpKSwvQm90L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPDExfHxlfHwodF9hbmltYXRpb25TQlNfX3Byb2Nlc3NIb3Jpem9udGFsU2Nyb2xsKCksdF9hbmltYXRpb25TQlNfX2lzWmVyb0Jsb2Nrc1JlbmRlcmVkKChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX2lzSW5zdGFncmFtUmVuZGVyZWQoKGZ1bmN0aW9uKCl7dmFyIHQ7dDM5Nl9faW5pdFNjYWxlRmFjdG9yRmxhZ3MoKSx0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVscyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1hbmltYXRlLXNicy1ldmVudF0iKSkpLHRfYW5pbWF0aW9uU0JTX19pbml0QWxsUmVzKGUpfSkpfSkpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0hvcml6b250YWxTY3JvbGwoKXt2YXIgdD0nW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnQ9InNjcm9sbCJdJyxlPUFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KSksbixpO2UubGVuZ3RoJiYoZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpfSkpLnNvbWUoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLW92cmZsdyIpO3JldHVyblsidmlzaWJsZSIsInZpc2libGVYIl0uaW5jbHVkZXMoZSl9KSk/dDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKToodF9hbmltYXRpb25TQlNfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZXMoKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2xvc2VzdCgiLnIiKS5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGlvbi1zYnNfX292ZXJmbG93LXgiKX0pKSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZU92ZXJmbG93U3R5bGVzKCl7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzYnMtYW5pbWF0aW9uLWJsb2NrLW92ZXJmbG93Iikpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC5pZD0ic2JzLWFuaW1hdGlvbi1ibG9jay1vdmVyZmxvdyIsdC5pbm5lckhUTUw9Ii50LWFuaW1hdGlvbi1zYnNfX292ZXJmbG93LXggeyBvdmVyZmxvdy14OiBoaWRkZW47IH0iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pc1plcm9CbG9ja3NSZW5kZXJlZCh0KXt2YXIgZT10X2FuaW1hdGlvblNCU19fZ2V0QXJ0Ym9hcmRzKCIzOTYiKSxuPXRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHMoIjEyMSIpLGk9W10uY29uY2F0KGUsbik7aWYoaS5sZW5ndGgpe3ZhciBhPSExO2lmKGkuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKX0pKSl0KCk7ZWxzZSBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTIiXSwgc2NyaXB0W3NyYyo9InRpbGRhLWJsb2Nrcy0xIl0nKS5sZW5ndGgpdF9hbmltYXRpb25TQlNfX2JhY2t3YXJkQ29tcGF0aWJpbGl0eVdhaXQoaSxEYXRlLm5vdygpLHQpO2Vsc2V7dmFyIHI9aS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKX0pKTtpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfHxlLmFkZEV2ZW50TGlzdGVuZXIoImFydEJvYXJkUmVuZGVyZWQiLChmdW5jdGlvbigpe3IucHVzaChlKSxyLmxlbmd0aCE9PWkubGVuZ3RofHxhfHx0KCl9KSl9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXthPSEwLHIubGVuZ3RoIT09aS5sZW5ndGgmJnQoKX0pLDNlMyl9fX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QXJ0Ym9hcmRzKHQpe3ZhciBlPScucltkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yW2RhdGEtcGFyZW50dHBsaWQ9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc7cmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2JhY2t3YXJkQ29tcGF0aWJpbGl0eVdhaXQodCxlLG4pe2lmKHQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKX0pKSluKCk7ZWxzZXtpZihEYXRlLm5vdygpLWU+MWU0KXJldHVybiB2b2lkIGNvbnNvbGUud2FybigiYWxsIHplcm8tYmxvY2tzIGNhbid0IGJlIHJlbmRlcmVkIik7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdCh0LGUsbil9KSw1MDApfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19pc0luc3RhZ3JhbVJlbmRlcmVkKHQpe2lmKHdpbmRvdy5hbmltYXRpb25TQlNfX2lzSU9TJiYtMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIikpdmFyIGU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cuaW5uZXJXaWR0aCE9PXNjcmVlbi53aWR0aCYmd2luZG93LmlubmVySGVpZ2h0PndpbmRvdy5pbm5lcldpZHRoP3RfYW5pbWF0aW9uU0JTX2lzSW5zdGFncmFtUmVuZGVyZWQodCk6KGNsZWFyVGltZW91dChlKSx0KCkpfSksMTAwKTtlbHNlIHQoKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVscyh0KXt2YXIgZT0tMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIik7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKTtpZihuKXstMT09PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIikmJihuLnN0eWxlLldlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eT0iaGlkZGVuIixuLnN0eWxlLmJhY2tmYWNlVmlzaWJpbGl0eT0iaGlkZGVuIik7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLGE9dF9hbmltYXRpb25TQlNfX2dldEFuaW1PcHRpb25zKHQsInB1Ymxpc2hlZCIsbnVsbCk7aWYoIWkmJmEpe3ZhciByPWdldENvbXB1dGVkU3R5bGUobikuZGlzcGxheSxvO24uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1tb2xlY3VsZSIpJiYiZmxleCIhPT1yJiYobi5zdHlsZS5kaXNwbGF5PSJpbmhlcml0Iik7dmFyIHM9dF9hbmltYXRpb25TQlNfX2dldFNjYWxlV3JhcHBlcihuKSxfPXQuc3R5bGUudHJhbnNmb3JtLGw7XyYmLTEhPT1fLmluZGV4T2YoIm1hdHJpeCgiKSYmKHRfYW5pbWF0aW9uU0JTX193cmFwRWwoc3x8biwidG4tYXRvbV9fc2JzLXRyYW5zZm9ybS13cmFwcGVyIiksKGw9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLXRyYW5zZm9ybS13cmFwcGVyIikpLnN0eWxlLnRyYW5zZm9ybT1fLHQuc3R5bGUudHJhbnNmb3JtPSIiKSx0X2FuaW1hdGlvblNCU19fd3JhcEVsKChsPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy10cmFuc2Zvcm0td3JhcHBlciIpKXx8c3x8biwidG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLHRfYW5pbWF0aW9uU0JTX191cGRhdGVTdHlsZXNBZnRlcldyYXBwaW5nKHQsbHx8aSxlKX19fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRTY2FsZVdyYXBwZXIodCl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKSxuPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tIik7cmV0dXJuIGUmJm4/bnVsbDp0LmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3dyYXBBbmRVcGRhdGVFbE9uUmVzaXplKHQpe2lmKHQubGVuZ3RoKXt2YXIgZT10LmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKX0pKTtlLmxlbmd0aCYmdF9hbmltYXRpb25TQlNfX3dyYXBBbmRVcGRhdGVFbHMoZSl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRGaWx0ZXJWYWx1ZSh0LGUpe3ZhciBuPXQuZ2V0UHJvcGVydHlWYWx1ZShlKTtyZXR1cm4gbiYmIm5vbmUiIT09bnx8KG49dC5nZXRQcm9wZXJ0eVZhbHVlKCItd2Via2l0LSIrZSkpLG4mJiJub25lIiE9PW4/bjoiIn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlU3R5bGVzQWZ0ZXJXcmFwcGluZyh0LGUsbil7dmFyIGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIiksYT1nZXRDb21wdXRlZFN0eWxlKHQpLHI9dC5xdWVyeVNlbGVjdG9yKCIudG4tbW9sZWN1bGUsIC50bi1hdG9tIiksbz1nZXRDb21wdXRlZFN0eWxlKHIpLHM9YS5nZXRQcm9wZXJ0eVZhbHVlKCJib3JkZXItcmFkaXVzIik7InNoYXBlIiE9PWkmJiJidXR0b24iIT09aSYmImltYWdlIiE9PWl8fCFwYXJzZUludChzLDEwKXx8KGUuc3R5bGUuYm9yZGVyUmFkaXVzPXMpO3ZhciBfPVtdO1siZmlsdGVyIiwiYmFja2Ryb3AtZmlsdGVyIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49dF9hbmltYXRpb25TQlNfX2dldEZpbHRlclZhbHVlKGEsZSksaT1uPyIiOnRfYW5pbWF0aW9uU0JTX19nZXRGaWx0ZXJWYWx1ZShvLGUpLHM9bnx8aTtzJiZfLnB1c2goe2ZpbHRlcjplLHdlYmtpdEZpbHRlcjoiLXdlYmtpdC0iK2UsdmFsdWU6cyxzb3VyY2U6bj90OnJ9KX0pKTt2YXIgbD1vLnRyYW5zZm9ybSxjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO2MuaW5pdEV2ZW50KCJiYWNrZHJvcEZpbHRlckltZ1dyYXBwZXJlZCIsITAsITApLF8uZm9yRWFjaCgoZnVuY3Rpb24oYSl7d2luZG93LnRfYW5pbWF0aW9uU0JTX19pc0ZpcmVmb3gmJihlLnN0eWxlLmJhY2tmYWNlVmlzaWJpbGl0eT0idmlzaWJsZSIpLGUuc3R5bGVbYS53ZWJraXRGaWx0ZXJdPWEudmFsdWUsZS5zdHlsZVthLmZpbHRlcl09YS52YWx1ZSxhLnNvdXJjZS5zdHlsZVthLndlYmtpdEZpbHRlcl09Im5vbmUiLGEuc291cmNlLnN0eWxlW2EuZmlsdGVyXT0ibm9uZSIsImltYWdlIj09PWkmJndpbmRvdy50X2FuaW1hdGlvblNCU19faXNTYWZhcmkmJih0LmRpc3BhdGNoRXZlbnQoYyksdC5jbGFzc0xpc3QuYWRkKCJ0Mzk2X19lbGVtLS1iYWNrZHJvcC1maWx0ZXItaW1nLXdyYXBwZXJlZCIpKSxuJiYiYmFja2Ryb3AtZmlsdGVyIj09PWEuZmlsdGVyJiYoci5zdHlsZVthLndlYmtpdEZpbHRlcl09ImluaGVyaXQiLHIuc3R5bGVbYS5maWx0ZXJdPSJpbmhlcml0IiksIm5vbmUiPT09bCYmKHIuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVaKDApIil9KSk7dmFyIG09Xy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4iYmFja2Ryb3AtZmlsdGVyIj09PXQuZmlsdGVyfSkpO24mJm0mJnRfYW5pbWF0aW9uU0JTX19jaHJvbWVGaXhCYWNrZHJvcEZpbHRlcihyLGUpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jaHJvbWVGaXhCYWNrZHJvcEZpbHRlcih0LGUpe3ZhciBuPWdldENvbXB1dGVkU3R5bGUodCksaT1uLmdldFByb3BlcnR5VmFsdWUoImJhY2tncm91bmQtY29sb3IiKSxhPW4uZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpLHI9bi5nZXRQcm9wZXJ0eVZhbHVlKCJib3gtc2hhZG93Iik7aWYoInJnYmEoMCwgMCwgMCwgMCkiIT09aSYmIjEiIT09YSl7dmFyIG89aS5zdWJzdHJpbmcoaS5pbmRleE9mKCIoIikrMSxpLmluZGV4T2YoIikiKSkscz10X2FuaW1hdGlvblNCU19fcHJvY2Vzc0JveFNoYWRvd1JHQihyLGEpO3MmJihlLnN0eWxlLmJveFNoYWRvdz1zLHQuc3R5bGUuYm94U2hhZG93PSJub25lIiksZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYmEoIitvKyIsIithKyIpIix0LnN0eWxlLm9wYWNpdHk9IjEiLHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJ0cmFuc3BhcmVudCIsdC5zdHlsZS5iYWNrZHJvcEZpbHRlcj0iaW5pdGlhbCIsdC5zdHlsZS5XZWJraXRCYWNrZHJvcEZpbHRlcj0iaW5pdGlhbCJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzQm94U2hhZG93UkdCKHQsZSl7aWYoIXQpcmV0dXJuITE7aWYoLTE9PT10LmluZGV4T2YoInJnYmEiKSYmLTE9PT10LmluZGV4T2YoInJnYiIpfHwiMSI9PT1lKXJldHVybiExO3ZhciBuPXQuc3Vic3RyaW5nKHQuaW5kZXhPZigiKCIpKzEsdC5pbmRleE9mKCIpIikpLGk9bi5zcGxpdCgiLCAiKTszPT09aS5sZW5ndGg/aS5wdXNoKGUpOmlbM10qPWU7dmFyIGE9dC5yZXBsYWNlKG4saS5qb2luKCIsICIpKTtyZXR1cm4tMSE9PWEuaW5kZXhPZigicmdiKCIpJiYoYT1hLnJlcGxhY2UoInJnYigiLCJyZ2JhKCIpKSxhfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0QWxsUmVzKHQpe3ZhciBlPXtlbGVtZW50czpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1hbmltYXRlLXNicy1ldmVudF0iKSksc2Nyb2xsVG9wOndpbmRvdy5wYWdlWU9mZnNldCxpc0VkaXRNb2RlOnQsY2xpY2tlZFRyaWdnZXJFbHM6W10saG92ZXJUcmlnZ2VyRWxzOltdfTtpZihlLmVsZW1lbnRzLmxlbmd0aCl7dF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YShlKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXMoZSk7dmFyIG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxpPSEhbiYmInllcyI9PT1uLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iik7KCJ5Ij09PXdpbmRvdy5sYXp5fHxpKSYmdF9vbkZ1bmNMb2FkKCJ0X2xhenlsb2FkX3VwZGF0ZSIsKGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pKTt2YXIgYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyhlLmVsZW1lbnRzKSxyLG89L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKCJSZXNpemVPYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBzPXRfYW5pbWF0aW9uU0JTX19nZXRBbGxCcmVha3BvaW50cygpLF87dF9hbmltYXRpb25TQlNfX2NyZWF0ZVJlc2l6ZU9ic2VydmVyKHticmVha3BvaW50czpzLGN1cnJlbnRSZXM6dF9hbmltYXRpb25TQlNfX2dldEN1cnJlbnRSZXMocyxvKSxpc01vYmlsZTpvfSxkKX1lbHNlIG8/d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2QoKX0pLDMwMCl9KSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZCk7dmFyIGw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQzOTYiKSxjO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCl7dC5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsZCl9KSksd2luZG93LnRfYW5pbWF0aW9uU0JTX19pc1NhZmFyaSl7ZnVuY3Rpb24gbSgpezAhPT13aW5kb3cucGFnZVlPZmZzZXQmJmQoKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixtKX13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixtKX10X2FuaW1hdGlvblNCU19fdHJpZ2dlck5vU2Nyb2xsQW5pbWF0aW9uKGUsYSksZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnQ9InNjcm9sbCJdJykubGVuZ3RoJiYodF9hbmltYXRpb25TQlNfX3RyaWdnZXJTY3JvbGxBbmltKGUpLHRfYW5pbWF0aW9uU0JTX19jaGVja0ZyYW1lKGUpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfX2NoYW5nZUVsVmFsdWVzKGUpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ImNvbXBsZXRlIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJnRfYW5pbWF0aW9uU0JTX19jaGFuZ2VFbFZhbHVlcyhlKX0pLDNlMyl9ZnVuY3Rpb24gZCgpe2NsZWFyVGltZW91dChyKSxyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnRdIikpO3RfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKGUsImVsZW1lbnRzIix0KSx0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVsT25SZXNpemUoZS5lbGVtZW50cyksdF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YShlKSx0X2FuaW1hdGlvblNCU19fdHJpZ2dlclNjcm9sbEFuaW0oZSksYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyhlLmVsZW1lbnRzKSx0X2FuaW1hdGlvblNCU19fdHJpZ2dlck5vU2Nyb2xsQW5pbWF0aW9uKGUsYSksdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzKGUpfSksNTAwKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEFuaW1FbHNPblZpZXcodCl7cmV0dXJuIHQuZmlsdGVyKChmdW5jdGlvbih0KXt2YXIgZT0iZGF0YS1hbmltYXRlLXNicy1ldmVudCI7cmV0dXJuImludG92aWV3Ij09PXQuZ2V0QXR0cmlidXRlKGUpfHwiYmxvY2tpbnRvdmlldyI9PT10LmdldEF0dHJpYnV0ZShlKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QWxsQnJlYWtwb2ludHMoKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuciAudDM5Nl9fYXJ0Ym9hcmQiKSksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0UmVzT3B0cyh0KSxpPW4uYnJlYWtwb2ludHMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4tMT09PWUuaW5kZXhPZih0KX0pKTstMT09PShlPWUuY29uY2F0KGkpKS5pbmRleE9mKG4ucmVzTWF4KSYmZS5wdXNoKG4ucmVzTWF4KX0pKSxlLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0Q3VycmVudFJlcyh0LGUpe3ZhciBuLGk9ZXx8Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQmJi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJBcHBsZVdlYktpdCIpP2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDp3aW5kb3cuaW5uZXJXaWR0aDtyZXR1cm4gdC5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gaT50fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsZSxuKXt0W2VdPW59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEtleUZvckFuaW1hdGVkT2JqZWN0KHQsZSxuKXt0W2VdfHx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LGUsbil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NyZWF0ZVJlc2l6ZU9ic2VydmVyKHQsZSl7dmFyIG49ZG9jdW1lbnQuYm9keS5nZXRDbGllbnRSZWN0cygpLGk9blswXS5oZWlnaHQsYTtuZXcgUmVzaXplT2JzZXJ2ZXIoKGZ1bmN0aW9uKGEpe2EuZm9yRWFjaCgoZnVuY3Rpb24oYSl7aWYoIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWJvZHlfc2Nyb2xsLWxvY2tlZCIpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtYm9keV9wb3B1cHNob3dlZCIpKXt2YXIgcj10X2FuaW1hdGlvblNCU19fZ2V0Q3VycmVudFJlcyh0LmJyZWFrcG9pbnRzLHQuaXNNb2JpbGUpO2EuY29udGVudFJlY3QuaGVpZ2h0PT09aSYmdC5jdXJyZW50UmVzPT09cnx8KHQuY3VycmVudFJlcz1yLGk9blswXS5oZWlnaHQsZSgpKX19KSl9KSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hhbmdlRWxWYWx1ZXModCl7dC5lbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbihlKXtkb2N1bWVudC5jb250YWlucyhlKSYmKHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKGUsdCksInNjcm9sbCI9PT1lLmFuaW1UeXBlJiZ0X2FuaW1hdGlvblNCU19fdXBkYXRlU3RlcHNWYWx1ZXMoZSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jaGVja0ZyYW1lKHQpe3ZhciBlOyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lJiYodF9hbmltYXRpb25TQlNfX2NoZWNrUG9zQ2hhbmdlcyh0KSYmdF9hbmltYXRpb25TQlNfX3RyaWdnZXJTY3JvbGxBbmltKHQpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fY2hlY2tGcmFtZSh0KX0pKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NoZWNrUG9zQ2hhbmdlcyh0KXt2YXIgZT10LnNjcm9sbFRvcCxuPXdpbmRvdy5wYWdlWU9mZnNldDtyZXR1cm4gbjwwJiZ3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzU2FmYXJpJiYobj0wKSx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LCJzY3JvbGxUb3AiLG4pLGUhPT1ufWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX190cmlnZ2VyU2Nyb2xsQW5pbSh0KXt0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCJzY3JvbGwiPT09ZS5hbmltVHlwZSl7dmFyIG49e29wYWNpdHk6MSxibHVyOjAsZml4OiExLGZpeGVkU2hpZnRZOjAsdHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxzY2FsZVg6MSxzY2FsZVk6MSxyb3RhdGU6MH07dF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNoZWNrU3RlcHModCxlLG4pLHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25VcGRhdGVUcmFuc2Zvcm0oZSxuKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNoZWNrU3RlcHModCxlLG4pe2Uuc3RlcHMuZm9yRWFjaCgoZnVuY3Rpb24oaSxhKXt2YXIgcj10LnNjcm9sbFRvcCtlLnRyaWdnZXJPZmZzZXQsbz10X2FuaW1hdGlvblNCU19fZ2V0Wm9vbShlKTtlLnNjYWxlZERpZmZlcmVuY2UmJihyKz1lLnNjYWxlZERpZmZlcmVuY2UpO3ZhciBzPXI+PWkuc3RhcnQsXz1yPGkuc3RhcnQsbD1pLmVuZDw9cixjPWkuZW5kPnI7aWYocyYmYyl7aS5zdGF0ZT0ic3RhcnRlZCIsZS53cmFwcGVyRWwmJihlLndyYXBwZXJFbC5zdHlsZS53aWxsQ2hhbmdlPSJ0cmFuc2Zvcm0iKTt2YXIgbT1yLWkuc3RhcnQsZD0wPT09aS5kaXN0PzE6bS9pLmRpc3Q7bi5wcmV2VW5maXhlZERpc3Q9aS5wcmV2VW5maXhlZERpc3QsdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNhbGNTdGVwU3R5bGVzKG4saSxkLGEsbyl9bCYmKGkuc3RhdGU9ImZpbmlzaGVkIixlLndyYXBwZXJFbCYmKGUud3JhcHBlckVsLnN0eWxlLndpbGxDaGFuZ2U9IiIpLHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25DYWxjU3RlcFN0eWxlcyhuLGksMSxhLG8pKSwhX3x8InN0YXJ0ZWQiIT09aS5zdGF0ZSYmImZpbmlzaGVkIiE9PWkuc3RhdGV8fChpLnN0YXRlPSJ1bmFjdGl2ZSIsZS53cmFwcGVyRWwmJihlLndyYXBwZXJFbC5zdHlsZS53aWxsQ2hhbmdlPSIiKSx0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2FsY1N0ZXBTdHlsZXMobixpLDAsYSxvKSl9KSksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpLGUuc3RlcHNbMV0mJjA9PT1lLnN0ZXBzWzFdLmRpc3QmJjA9PT1lLnN0ZXBzWzFdLnN0eWxlcy5vcGFjaXR5JiYidW5hY3RpdmUiPT09ZS5zdGVwc1sxXS5zdGF0ZSYmKG4ub3BhY2l0eT0wKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2FsY1N0ZXBTdHlsZXModCxlLG4saSxhKXtpZighMD09PWUuc3R5bGVzLmZpeCYmInN0YXJ0ZWQiPT09ZS5zdGF0ZSYmKHQuZml4PSEwLHQuZml4ZWRTaGlmdFk9MCksITA9PT1lLnN0eWxlcy5maXgmJiJmaW5pc2hlZCI9PT1lLnN0YXRlJiYodC5maXg9ITEsdC5maXhlZFNoaWZ0WSs9ZS5kaXN0L2EpLCEwPT09ZS5zdHlsZXMuZml4JiYidW5hY3RpdmUiPT09ZS5zdGF0ZSl7aWYoaT4wJiYhMD09PXQuZml4KXJldHVybjt0LmZpeD0hMX10Lm9wYWNpdHkrPW4qKGUuc3R5bGVzLm9wYWNpdHktdC5vcGFjaXR5KSx0LmJsdXIrPW4qKGUuc3R5bGVzLmJsdXItdC5ibHVyKSx0LnRyYW5zbGF0ZVgrPW4qZS5zdHlsZXMubW92ZVgsdC50cmFuc2xhdGVZKz1uKmUuc3R5bGVzLm1vdmVZLHQuc2NhbGVYKz1uKihlLnN0eWxlcy5zY2FsZVgtdC5zY2FsZVgpLHQuc2NhbGVZKz1uKihlLnN0eWxlcy5zY2FsZVktdC5zY2FsZVkpLHQucm90YXRlKz1uKmUuc3R5bGVzLnJvdGF0ZX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uVXBkYXRlVHJhbnNmb3JtKHQsZSl7aWYodC53cmFwcGVyRWwpe3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpLGk9Z2V0Q29tcHV0ZWRTdHlsZSh0KS53aWxsQ2hhbmdlLGE9d2luZG93LmlzT25seVNjYWxhYmxlfHx0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpO2lmKCEwPT09ZS5maXgmJiJmaXhlZCIhPT10LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbil7dmFyIHI9dC50cmlnZ2VyT2Zmc2V0LWUucHJldlVuZml4ZWREaXN0O2F8fChyLz1uKSx0LnNjYWxlZERpZmZlcmVuY2UmJihyKz10LnNjYWxlZERpZmZlcmVuY2UpLHQud3JhcHBlckVsLnN0eWxlLnRvcD1yKyJweCIsdC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb249ImZpeGVkIixpJiYiYXV0byIhPT1pJiYodC5zdHlsZS53aWxsQ2hhbmdlPSJ1bnNldCIpLHQuekluZGV4JiYodC53cmFwcGVyRWwuc3R5bGUuekluZGV4PXQuekluZGV4KX0hMT09PWUuZml4JiYiZml4ZWQiPT09dC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb24mJih0LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbj0iIix0LndyYXBwZXJFbC5zdHlsZS50b3A9IiIsdC53cmFwcGVyRWwuc3R5bGUuekluZGV4PSIiLHQuekluZGV4JiYodC5zdHlsZS56SW5kZXg9dC56SW5kZXgpLHQuc3R5bGUud2lsbENoYW5nZT0iIiksdC53cmFwcGVyRWwuc3R5bGUub3BhY2l0eT1lLm9wYWNpdHkudG9TdHJpbmcoKTt2YXIgbz0iIjtpZihlLnRyYW5zbGF0ZVgpe3ZhciBzPWUudHJhbnNsYXRlWDthJiYocyo9biksbys9InRyYW5zbGF0ZVgoIitzLnRvRml4ZWQoMikrInB4KSJ9aWYoMCE9PWUudHJhbnNsYXRlWXx8MCE9PWUuZml4ZWRTaGlmdFkpe3ZhciBfPWUudHJhbnNsYXRlWStlLmZpeGVkU2hpZnRZO2EmJihfKj1uKSxvKz0idHJhbnNsYXRlWSgiK18udG9GaXhlZCgyKSsicHgpIn0xPT09ZS5zY2FsZVgmJjE9PT1lLnNjYWxlWXx8KG8rPSJzY2FsZSgiK2Uuc2NhbGVYKyIsIitlLnNjYWxlWSsiKSIpLDAhPT1lLnJvdGF0ZSYmKG8rPSJyb3RhdGUoIitlLnJvdGF0ZSsiZGVnKSIpLHQud3JhcHBlckVsLnN0eWxlLnRyYW5zZm9ybT1vfHwic2NhbGUoMSkifX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXModCl7dmFyIGU9IiI7aWYodC5lbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbih0KXtpZigic2Nyb2xsIiE9PXQuYW5pbVR5cGUpe3ZhciBuPXt0aW1lRHVyYXRpb246MH0saT1bXSxhPXRfYW5pbWF0aW9uU0JTX19jcmVhdGVFbXB0eVN0eWxlT3B0aW9uc0ZvcktleWZyYW1lcyh0LnN0ZXBzKTt0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvbWJpbmVPYmplY3RzKHQuc3RlcHMsaSxuLGEpLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdEZyYW1lcyhpKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvdW50UGVyY2VudChpLG4pLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdE9wYWNpdHlPbkZpcnN0U3RlcCh0LGkpO3ZhciByPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0VHh0U3R5bGVzKHQsaSksbztpZihuLnRpbWVEdXJhdGlvbi89MWUzLHIpaWYoZSs9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRGaW5hbENzcyh0LG4sciksImhvdmVyIj09PXQuYW5pbVR5cGV8fCJjbGljayI9PT10LmFuaW1UeXBlKSghdC5sb29wfHwibG9vcHdpdGhyZXZlcnNlIj09PXQubG9vcCkmJihlKz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldFJldmVyc2VBbmltKHQpKX19KSksZSl7aWYodC5pc0VkaXRNb2RlKXJldHVybiBlO3ZhciBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5zYnMtYW5pbS1rZXlmcmFtZXMiKTtuP24udGV4dENvbnRlbnQhPT1lJiYobi50ZXh0Q29udGVudD1lKTooKG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgic2JzLWFuaW0ta2V5ZnJhbWVzIiksbi50ZXh0Q29udGVudD1lLGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLG4pKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NyZWF0ZUVtcHR5U3R5bGVPcHRpb25zRm9yS2V5ZnJhbWVzKHQpe3JldHVybnttb3ZlWDp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuc3R5bGVzLm1vdmVYfSkpLG1vdmVZOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5zdHlsZXMubW92ZVl9KSksc2NhbGVYOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5zdHlsZXMuc2NhbGVYfSkpLHNjYWxlWTp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQuc3R5bGVzLnNjYWxlWX0pKSxyb3RhdGU6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10LnN0eWxlcy5yb3RhdGV9KSksYmx1cjp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuc3R5bGVzLmJsdXJ9KSksb3BhY2l0eTp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQuc3R5bGVzLm9wYWNpdHl9KSksZml4OnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiExPT09dC5zdHlsZXMuZml4fSkpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvbWJpbmVPYmplY3RzKHQsZSxuLGkpe3QuZm9yRWFjaCgoZnVuY3Rpb24oYSxyKXt2YXIgbz17fTtmb3IodmFyIHMgaW4gby5zdHlsZXM9YS5zdHlsZXMsaSlpW3NdJiZkZWxldGUgby5zdHlsZXNbc107Int9IiE9PUpTT04uc3RyaW5naWZ5KG8uc3R5bGVzKSYmKG8udGltZT0xKmEudGltZXx8MCxyIT09dC5sZW5ndGgtMSYmKG8uZWFzZT10W3IrMV0uZWFzZSksZS5wdXNoKG8pLG4udGltZUR1cmF0aW9uKz1vLnRpbWUpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdEZyYW1lcyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKGUsbil7dmFyIGk9bj09PXQubGVuZ3RoLTEsYT0wPT09bixyPWk/bnVsbDp0W24rMV0sbz1hP251bGw6dFtuLTFdO2Zvcih2YXIgcyBpbiBlLnN0eWxlcylhfHxzIGluIG8uc3R5bGVzfHx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2FkZFN0eWxlVG9LZXlmcmFtZShlLG8scywwKSxpfHwocyBpbiByLnN0eWxlcz8ibW92ZVgiIT09cyYmIm1vdmVZIiE9PXMmJiJyb3RhdGUiIT09c3x8dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19yZWNhbGN1bGF0ZVZhbHVlKGUscixzKTp0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2FkZFN0eWxlVG9LZXlmcmFtZShlLHIscywxKSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19hZGRTdHlsZVRvS2V5ZnJhbWUodCxlLG4saSl7ImJsdXIiIT09biYmInJvdGF0ZSIhPT1uJiYibW92ZVgiIT09biYmIm1vdmVZIiE9PW58fChlLnN0eWxlc1tuXT0wPT09aT8wOnQuc3R5bGVzW25dKSwib3BhY2l0eSIhPT1uJiYic2NhbGVYIiE9PW4mJiJzY2FsZVkiIT09bnx8KGUuc3R5bGVzW25dPTA9PT1pPzE6dC5zdHlsZXNbbl0pfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fcmVjYWxjdWxhdGVWYWx1ZSh0LGUsbil7c3dpdGNoKG4pe2Nhc2Uicm90YXRlIjplLnN0eWxlcy5yb3RhdGUrPXQuc3R5bGVzLnJvdGF0ZTticmVhaztjYXNlIm1vdmVYIjplLnN0eWxlcy5tb3ZlWCs9dC5zdHlsZXMubW92ZVg7YnJlYWs7Y2FzZSJtb3ZlWSI6ZS5zdHlsZXMubW92ZVkrPXQuc3R5bGVzLm1vdmVZfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvdW50UGVyY2VudCh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dLGE7aWYoMD09PW4pMD09PWUudGltZUR1cmF0aW9uP2kucGVyY2VudD0wOihhPSgxMDAqaS50aW1lL2UudGltZUR1cmF0aW9uKS50b0ZpeGVkKDIpLGkucGVyY2VudD1wYXJzZUZsb2F0KGEpKTtlbHNlIGlmKG49PT10Lmxlbmd0aC0xKWkucGVyY2VudD0xMDA7ZWxzZXt2YXIgcj10W24tMV0ucGVyY2VudDtpZigwPT09ZS50aW1lRHVyYXRpb24paS5wZXJjZW50PTA7ZWxzZXtpZihhPSgxMDAqaS50aW1lL2UudGltZUR1cmF0aW9uK3IpLnRvRml4ZWQoMiksMTAwPT09cGFyc2VJbnQoYSwxMCkmJm49PT10Lmxlbmd0aC0yJiYwIT09biljb250aW51ZTtpLnBlcmNlbnQ9cGFyc2VGbG9hdChhKX1pLnBlcmNlbnQ9PT1yJiYoaS5wZXJjZW50Kz0xKSxpLnBlcmNlbnQ+MTAwJiYoaS5wZXJjZW50PTk5KX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdE9wYWNpdHlPbkZpcnN0U3RlcCh0LGUpe3ZhciBuPWVbMV07dCYmdC5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpO3ZhciBpPXQ/dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpOm51bGw7biYmMD09PW4udGltZSYmMD09PW4uc3R5bGVzLm9wYWNpdHk/KGkmJihpLnN0eWxlLm9wYWNpdHk9IjAiKSxlWzBdLnN0eWxlcy5vcGFjaXR5PTApOmkmJiIwIj09PWkuc3R5bGUub3BhY2l0eSYmaSYmKGkuc3R5bGUub3BhY2l0eT0iIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRNb3ZlQmFzZSh0KXtpZih0X2FuaW1hdGlvblNCU19faXNGaXJlZm94JiZ0LndyYXBwZXJFbCl7dmFyIGU9Z2V0Q29tcHV0ZWRTdHlsZSh0LndyYXBwZXJFbCksbj1wYXJzZUZsb2F0KGUud2lkdGgpLGk9cGFyc2VGbG9hdChlLmhlaWdodCk7cmV0dXJue3dpZHRoOk51bWJlci5pc0Zpbml0ZShuKT9uOjAsaGVpZ2h0Ok51bWJlci5pc0Zpbml0ZShpKT9pOjB9fXJldHVybiBudWxsfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0VHJhbnNsYXRlKHQsZSxuKXtyZXR1cm4gbj8idHJhbnNsYXRlIit0KyIoIitNYXRoLnJvdW5kKGUvbioxMDApKyIlKSI6InRyYW5zbGF0ZSIrdCsiKCIrTWF0aC5yb3VuZChlKSsicHgpIn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldFR4dFN0eWxlcyh0LGUpe3ZhciBuPSIiLGk9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRNb3ZlQmFzZSh0KTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNoYW5nZXN8fChlLmNoYW5nZXM9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRGcmFtZUNoYW5nZXModCxlLGkpKSxuKz0ibnVtYmVyIj09dHlwZW9mIGUucGVyY2VudD9lLnBlcmNlbnQrIiUgeyIrZS5jaGFuZ2VzKyJ9XG4iOiIifSkpLG59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19zaG91bGRVc2Vab29tKHQsZSl7dmFyIG4saTtpZih0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpKXJldHVybiF0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20odCk7dmFyIGEscj10X2FuaW1hdGlvblNCU19fZ2V0U2NhbGVXcmFwcGVyKHQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpKTtyZXR1cm4hKDEhPT1lJiYhcil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRGcmFtZUNoYW5nZXModCxlLG4pe3ZhciBpPSIiLGE9IiIscj17eDoxLHk6MSxjaGFuZ2VkOiExfSxvPTEscz10Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpOyh3aW5kb3cuaXNPbmx5U2NhbGFibGV8fHMpJiYobz10X2FuaW1hdGlvblNCU19fZ2V0Wm9vbSh0KSk7dmFyIF89dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19zaG91bGRVc2Vab29tKHQsbyk7Zm9yKHZhciBsIGluIF98fChvPTEpLGUuc3R5bGVzKXN3aXRjaChsKXtjYXNlIm9wYWNpdHkiOmkrPSJvcGFjaXR5OiIrZS5zdHlsZXMub3BhY2l0eSsiOyI7YnJlYWs7Y2FzZSJzY2FsZVgiOnIueD1lLnN0eWxlcy5zY2FsZVgsci5jaGFuZ2VkPSEwO2JyZWFrO2Nhc2Uic2NhbGVZIjpyLnk9ZS5zdHlsZXMuc2NhbGVZLHIuY2hhbmdlZD0hMDticmVhaztjYXNlIm1vdmVYIjphKz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldFRyYW5zbGF0ZSgiWCIsZS5zdHlsZXMubW92ZVgqbyxuJiZuLndpZHRoKTticmVhaztjYXNlIm1vdmVZIjphKz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldFRyYW5zbGF0ZSgiWSIsZS5zdHlsZXMubW92ZVkqbyxuJiZuLmhlaWdodCk7YnJlYWs7Y2FzZSJyb3RhdGUiOmErPSJyb3RhdGUoIitlLnN0eWxlcy5yb3RhdGUrImRlZykifWlmKCEwPT09ci5jaGFuZ2VkJiYoYSs9InNjYWxlKCIrci54KyIsIityLnkrIikiKSwiIiE9PWEmJihpKz0idHJhbnNmb3JtOiIrYSsiOyIpLHZvaWQgMCE9PWUuZWFzZSlzd2l0Y2goaSs9ImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IixlLmVhc2Upe2Nhc2UiZWFzZUluIjppKz0iZWFzZS1pbjsiO2JyZWFrO2Nhc2UiZWFzZU91dCI6aSs9ImVhc2Utb3V0OyI7YnJlYWs7Y2FzZSJlYXNlSW5PdXQiOmkrPSJlYXNlLWluLW91dDsiO2JyZWFrO2Nhc2UiYm91bmNlRmluIjppKz0iY3ViaWMtYmV6aWVyKDAuMzQsMS42MSwwLjcsMSk7IjticmVhaztkZWZhdWx0OmkrPSIiPT09ZS5lYXNlLnRyaW0oKT8ibGluZWFyOyI6ZS5lYXNlKyI7In1yZXR1cm4gaX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldEZpbmFsQ3NzKHQsZSxuKXt2YXIgaT0iIixhPXQudW5pcXVlSUQscj0iLnQtc2JzLWFuaW1fc3RhcnRlZCAjIit0LnVuaXF1ZUlELG87InB1Ymxpc2hlZCIhPT13aW5kb3cudGlsZGFtb2RlJiYodC50aW1lRHVyYXRpb249ZS50aW1lRHVyYXRpb24pLGkrPXIrIiB7XG5hbmltYXRpb246ICIrYSsiICIrKDA9PT1lLnRpbWVEdXJhdGlvbj8xZS01OmUudGltZUR1cmF0aW9uKSsicyI7dmFyIHM9dC5sb29wJiYtMSE9PXQubG9vcC5pbmRleE9mKCJsb29wIik7cmV0dXJuIHMmJihpKz0iIGluZmluaXRlIiksaSs9IiBsaW5lYXIiLHM/Imxvb3B3aXRocmV2ZXJzZSI9PT10Lmxvb3AmJihpKz0iIGFsdGVybmF0ZSIpOmkrPSIgZm9yd2FyZHMiLGkrPSI7XG5iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbkBrZXlmcmFtZXMgIithKyIge1xuIituKyJ9XG5cbiJ9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRSZXZlcnNlQW5pbSh0KXt2YXIgZT10X2FuaW1hdGlvblNCU19fZ2V0QXR0cmlidXRlU2VsZWN0b3IodCksbixpLGE9IlsiK2UuYXR0cmlidXRlKyc9IicrZS5pZCsnIl0nLHI7cmV0dXJuIiMiKyh0LmNsb3Nlc3QoIi50LXJlYyIpP3QuY2xvc2VzdCgiLnQtcmVjIikuZ2V0QXR0cmlidXRlKCJpZCIpOiIiKSsiICIrYSsiLnQtc2JzLWFuaW1fc3RhcnRlZC50LXNicy1hbmltX3JldmVyc2VkIC50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIHstd2Via2l0LWFuaW1hdGlvbi1kaXJlY3Rpb246IHJldmVyc2U7YW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTt9In1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QXR0cmlidXRlU2VsZWN0b3IodCl7dmFyIGU9e2ZlZWQ6ImRhdGEtZmUtZWxlbS1pZCIsZ3JvdXA6ImRhdGEtZ3JvdXAtaWQiLGVsZW1lbnQ6ImRhdGEtZWxlbS1pZCJ9LG49T2JqZWN0LmtleXMoZSkuZmluZCgoZnVuY3Rpb24obil7cmV0dXJuIHQuaGFzQXR0cmlidXRlKGVbbl0pfSkpO3JldHVybiBuJiZlW25dP3thdHRyaWJ1dGU6ZVtuXSxpZDp0LmdldEF0dHJpYnV0ZShlW25dKXx8IiJ9OnthdHRyaWJ1dGU6IiIsaWQ6IiJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyh0LGUsbil7aWYoIXQpcmV0dXJuIiI7dmFyIGk9WyJzYnMiLCJvcHRzIl07bnx8KG49ImVkaXQiPT09ZT9pLmpvaW4oIiIpOmkuam9pbigiLSIpKTt2YXIgYT0iZWRpdCI9PT1lPyJmaWVsZCI6ImFuaW1hdGUiLHI9ImVkaXQiPT09ZT8iLXZhbHVlIjoiIixvPSJlZGl0Ij09PWU/ImRhdGEtZmllbGQtYW5pbW1vYmlsZS12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1tb2JpbGUiLHM9InkiPT09dC5nZXRBdHRyaWJ1dGUobyksXyxsPXRfYW5pbWF0aW9uU0JTX19nZXRSZXNPcHRzKHQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikpLGM9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlQXR0cihhLG4sciwhMSk7aWYobC5yZXM9PT1sLnJlc01heClyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoYyk7aWYoIXMmJiJlZGl0IiE9PWUmJmwucmVzPDEyMDApcmV0dXJuIHQuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsdC5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpLCIiO3ZhciBtPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUF0dHIoYSxuLHIsbC5yZXMpLGQ9dC5nZXRBdHRyaWJ1dGUobSk7cmV0dXJuIGR8fChsLmJyZWFrcG9pbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCEoZTw9bC5yZXN8fGQpKXt2YXIgaT10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVBdHRyKGEsbixyLGUpO2Q9dC5nZXRBdHRyaWJ1dGUoaSl9fSkpLGR8fHQuZ2V0QXR0cmlidXRlKGMpfHwiIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlQXR0cih0LGUsbixpKXt2YXIgYT0iZGF0YS0iK3QrIi0iK2U7cmV0dXJuIGkmJihhKz0iLXJlcy0iK2kpLGErPW59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFJlc09wdHModCl7dmFyIGU9WzEyMDAsOTYwLDY0MCw0ODAsMzIwXTtpZighd2luZG93LnRuKXt2YXIgbixpPXdpbmRvdy5pbm5lcldpZHRoO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe258fGk+PXQmJihuPXQpfSkpLHtyZXM6bnx8MzIwLHJlc01heDoxMjAwLGJyZWFrcG9pbnRzOlszMjAsNDgwLDY0MCw5NjBdfX12YXIgYT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIik6IiIsbjtyZXR1cm4gYSYmd2luZG93LnRuWyJhYiIrYV0/e3Jlczp3aW5kb3cudDM5Nl9kZXRlY3RSZXNvbHV0aW9uP3QzOTZfZGV0ZWN0UmVzb2x1dGlvbihhKTp3aW5kb3cudG5bImFiIithXS5jdXJSZXNvbHV0aW9uLHJlc01heDp3aW5kb3cudG5bImFiIithXS5jdXJSZXNvbHV0aW9uX21heCxicmVha3BvaW50czp3aW5kb3cudG5bImFiIithXS5zY3JlZW5zLnNsaWNlKDAsLTEpfTp3aW5kb3cudG4uc2NyZWVucz97cmVzOndpbmRvdy50bi5jdXJSZXNvbHV0aW9uLHJlc01heDp3aW5kb3cudG4udG9wUmVzb2x1dGlvbixicmVha3BvaW50czp3aW5kb3cudG4uc2NyZWVucy5zbGljZSgwLC0xKX06e3JlczpuPXRfYW5pbWF0aW9uU0JTX19nZXRDdXJyZW50UmVzKGUsd2luZG93LmlzTW9iaWxlKSxyZXNNYXg6MTIwMCxicmVha3BvaW50czpbMzIwLDQ4MCw2NDAsOTYwXX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YSh0KXt0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoInNjcm9sbCIhPT1lLmFuaW1UeXBlfHwhbnx8ImZpeGVkIiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobiwicG9zIikpe3ZhciBpPXQuaXNFZGl0TW9kZT8iZGF0YS1maWVsZC1zYnNldmVudC12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiO2UuYW5pbVR5cGU9ZS5nZXRBdHRyaWJ1dGUoaSk7dmFyIGE9dC5pc0VkaXRNb2RlPyJkYXRhLWZpZWxkLXNic3RyZy12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtdHJnIjtlLnRyaWdnZXI9cGFyc2VGbG9hdChlLmdldEF0dHJpYnV0ZShhKSksaXNOYU4oZS50cmlnZ2VyKSYmKGUudHJpZ2dlcj0xKSxlLnRyaWdnZXJFbGVtcz10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnMoZSwicHVibGlzaGVkIiwic2JzLXRyZ2VscyIpLGUud3JhcHBlckVsPWUucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKTt2YXIgcj10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnMoZSx0LmlzRWRpdE1vZGU/ImVkaXQiOiJwdWJsaXNoZWQiLG51bGwpO2lmKGUuc3RhdHVzPXImJiJudWxsIiE9PXI/ImFjdGl2ZSI6ImlubmFjdGl2ZSIsImlubmFjdGl2ZSIhPT1lLnN0YXR1cyl7LTEhPT1yLmluZGV4T2YoImZpeGVkIikmJihlLnpJbmRleD1nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoInotaW5kZXgiKSkscj1yLnJlcGxhY2UoLycvZywnIicpLHRfYW5pbWF0aW9uU0JTX19hZGREZWxheVRvU3RlcHMocj1KU09OLnBhcnNlKHIpKTt2YXIgbz10LmlzRWRpdE1vZGU/ImRhdGEtZmllbGQtc2JzbG9vcC12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtbG9vcCI7ZS5sb29wPWUuZ2V0QXR0cmlidXRlKG8pfHwiIix0X2FuaW1hdGlvblNCU19fc2V0QW5kQ2FjaGVFbFRvcFBvcyhlLHQpO3ZhciBzPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKGUpO2Uuc3RlcHM9W107dmFyIF89MDtyLmZvckVhY2goKGZ1bmN0aW9uKHQsbil7dmFyIGk9e3N0YXRlOiJ1bmFjdGl2ZSJ9O2kuc3R5bGVzPXRfYW5pbWF0aW9uU0JTX19jcmVhdGVTdGVwU3R5bGVzKHQpLCJzY3JvbGwiPT09ZS5hbmltVHlwZT8oaS5wcmV2VW5maXhlZERpc3Q9XyxpLmRpc3Q9dC5kaSpzLCExPT09aS5zdHlsZXMuZml4JiYoXys9aS5kaXN0KSxpLnN0YXJ0PTA9PT1uP2UudG9wT2Zmc2V0OmUuc3RlcHNbbi0xXS5lbmQsaS5lbmQ9aS5zdGFydCtpLmRpc3QpOihpLnRpbWU9dC50aSxpLmVhc2U9dC5lYSksZS5zdGVwcy5wdXNoKGkpfSkpLCFlLndyYXBwZXJFbHx8ZS53cmFwcGVyRWwuaWQmJmUudW5pcXVlSUR8fHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZVVuaXF1ZUlERm9yRWwoZSksdF9hbmltYXRpb25TQlNfX3VwZGF0ZUluZm9PbkltZ0xvYWQoZSx0KSx0X2FuaW1hdGlvblNCU19fdXBkYXRlTW92ZUFuZFJvdGF0ZVN0ZXBzU3R5bGVzKGUuc3RlcHMpfX19KSk7dmFyIGU9dC5lbGVtZW50cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe2lmKCJpbm5hY3RpdmUiPT09dC5zdGF0dXMpe3ZhciBlPXRfYW5pbWF0aW9uU0JTX19nZXRTaXplQmFzZWRPbkRpbWVuc2lvbk1vZGUodCksbj1lLndpZHRoLGk9ZS5oZWlnaHQ7dC53cmFwcGVyRWwmJnQud3JhcHBlckVsLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKSx0LndyYXBwZXJFbCYmKHQud3JhcHBlckVsLnN0eWxlLmRpc3BsYXk9ImluaGVyaXQiKSx0LndyYXBwZXJFbCYmKHQud3JhcHBlckVsLnN0eWxlLndpZHRoPW4pLHQud3JhcHBlckVsJiYodC53cmFwcGVyRWwuc3R5bGUuaGVpZ2h0PWkpfXJldHVybiJpbm5hY3RpdmUiIT09dC5zdGF0dXN9KSk7dF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCwiZWxlbWVudHMiLGUpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZVVuaXF1ZUlERm9yRWwodCl7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQsIC50bi1hcnRib2FyZCIpLG49IiI7ZSYmKG49ZS5nZXRBdHRyaWJ1dGUoImRhdGEtcmVjb3JkLWlkIil8fGUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpO3ZhciBpLGE9dF9hbmltYXRpb25TQlNfX2dldEF0dHJpYnV0ZVNlbGVjdG9yKHQpLmlkO3QudW5pcXVlSUQ9InNicy0iK24rIi0iK2EsdC53cmFwcGVyRWwuaWQ9dC51bmlxdWVJRH1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlSW5mb09uSW1nTG9hZCh0LGUpe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiaW1nIik7biYmKG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfX3VwZGF0ZVZhbHVlc0F0ZXJJTUdMb2FkaW5nKHQsZSl9KSksbi5jb21wbGV0ZSYmdF9hbmltYXRpb25TQlNfX3VwZGF0ZVZhbHVlc0F0ZXJJTUdMb2FkaW5nKHQsZSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVWYWx1ZXNBdGVySU1HTG9hZGluZyh0LGUpe3RfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKHQsZSksInNjcm9sbCI9PT10LmFuaW1UeXBlJiZ0X2FuaW1hdGlvblNCU19fdXBkYXRlU3RlcHNWYWx1ZXModCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0ZXBzVmFsdWVzKHQpe3Quc3RlcHMuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXtlLnN0YXJ0PTA9PT1uP3QudG9wT2Zmc2V0OnQuc3RlcHNbbi0xXS5lbmQsZS5lbmQ9ZS5zdGFydCtlLmRpc3R9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEFuZENhY2hlRWxUb3BQb3ModCxlKXt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0Wm9vbSh0KSxpLGE9WyJzY3JvbGwiLCJpbnRvdmlldyIsImJsb2NraW50b3ZpZXciXS5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuYW5pbVR5cGUhPT1lfSkpO2lmKCFlLmlzRWRpdE1vZGUmJiFhKXt2YXIgcj10X2FuaW1hdGlvblNCU19fZ2V0VG9wT2Zmc2V0KHQpO3IrPXRfYW5pbWF0aW9uU0JTX19hY2N1bXVsYXRlUGFyZW50R3JvdXBPZmZzZXQodCksInNjcm9sbCIhPT10LmFuaW1UeXBlJiYiaW50b3ZpZXciIT09dC5hbmltVHlwZXx8d2luZG93LmlzT25seVNjYWxhYmxlfHx0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpfHwocio9bik7dmFyIG89dC5jbG9zZXN0KCIuciIpLHM9bz9vLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ6MCxfPW8mJnBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUobykucGFkZGluZ1RvcCwxMCl8fDA7dC5wYXJlbnRSZWNUb3BQb3M9cyx0LnRvcE9mZnNldD1zK3IrXyx0X2FuaW1hdGlvblNCU19fc2V0U2NhbGVkRGlmZmVyZW5jZSh0LG4pLHRfYW5pbWF0aW9uU0JTX19zZXRUcmlnZ2VyT2Zmc2V0KHQpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0VG9wT2Zmc2V0KHQpe2lmKCF0KXJldHVybiAwO2lmKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWZlLWVsZW0taWQiKSlyZXR1cm4gdC5vZmZzZXRUb3A7dmFyIGU9cGFyc2VJbnQodC5zdHlsZS50b3AsMTApO3JldHVybiBpc05hTihlKT90Lm9mZnNldFRvcHx8MDplfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hY2N1bXVsYXRlUGFyZW50R3JvdXBPZmZzZXQodCl7Zm9yKHZhciBlPTAsbj10LnBhcmVudEVsZW1lbnQuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIik7bjspZSs9dF9hbmltYXRpb25TQlNfX2dldFRvcE9mZnNldChuKSxuPW4ucGFyZW50RWxlbWVudC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtyZXR1cm4gZX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0U2NhbGVkRGlmZmVyZW5jZSh0LGUpe2lmKCF0LnNjYWxlZERpZmZlcmVuY2UmJndpbmRvdy5pc09ubHlTY2FsYWJsZSYmImZpeGVkIiE9PXQud3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uJiZ0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpKXt2YXIgbj10LndyYXBwZXJFbD90LndyYXBwZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ6MCxpPU1hdGguYWJzKChuKmUtbikvMik7aT1NYXRoLnJvdW5kKGkpLHQuc2NhbGVkRGlmZmVyZW5jZT1pfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWRkRGVsYXlUb1N0ZXBzKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgbj10W2VdO2lmKDAhPT1lJiYocGFyc2VJbnQobi5kZCwxMCl8fHBhcnNlSW50KG4uZHQsMTApKSl7dmFyIGk9T2JqZWN0LmNyZWF0ZSh0W2UtMV0pO3ZvaWQgMCE9PW4uZHQ/aS50aT1uLmR0OmkuZGk9bi5kZCx0LnNwbGljZShlLDAsaSksZSsrfX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZU1vdmVBbmRSb3RhdGVTdGVwc1N0eWxlcyh0KXt2YXIgZT10WzBdLnN0eWxlcy5tb3ZlWCxuPXRbMF0uc3R5bGVzLm1vdmVZLGk9dFswXS5zdHlsZXMucm90YXRlO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGE9dC5zdHlsZXM7YS5tb3ZlWC09ZSxlKz1hLm1vdmVYLGEubW92ZVktPW4sbis9YS5tb3ZlWSxhLnJvdGF0ZS09aSxpKz1hLnJvdGF0ZX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY3JlYXRlU3RlcFN0eWxlcyh0KXtyZXR1cm57bW92ZVg6cGFyc2VJbnQodC5teCwxMCl8fDAsbW92ZVk6cGFyc2VJbnQodC5teSwxMCl8fDAsc2NhbGVYOmlzTmFOKHBhcnNlRmxvYXQodC5zeCkpPzE6cGFyc2VGbG9hdCh0LnN4KSxzY2FsZVk6aXNOYU4ocGFyc2VGbG9hdCh0LnN5KSk/MTpwYXJzZUZsb2F0KHQuc3kpLG9wYWNpdHk6aXNOYU4ocGFyc2VGbG9hdCh0Lm9wKSk/MTpwYXJzZUZsb2F0KHQub3ApLHJvdGF0ZTpwYXJzZUludCh0LnJvLDEwKXx8MCxibHVyOnBhcnNlSW50KHQuYmwsMTApfHwwLGZpeDoiZml4ZWQiPT09dC5maX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldFRyaWdnZXJPZmZzZXQodCl7dmFyIGU9d2luZG93LmlubmVySGVpZ2h0LG49dF9hbmltYXRpb25TQlNfX2dldFpvb20odCk7dC50cmlnZ2VyT2Zmc2V0PXBhcnNlSW50KHRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyh0LCJwdWJsaXNoZWQiLCJzYnMtdHJnb2ZzdCIpLDEwKSwod2luZG93LmlzT25seVNjYWxhYmxlfHwic2Nyb2xsIj09PXQuYW5pbVR5cGV8fHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCkpJiYodC50cmlnZ2VyT2Zmc2V0Kj1uKSx0LnRyaWdnZXJPZmZzZXR8fCh0LnRyaWdnZXJPZmZzZXQ9MCksLjUhPT10LnRyaWdnZXImJjEhPT10LnRyaWdnZXJ8fCh0LnRyaWdnZXJPZmZzZXQrPWUqdC50cmlnZ2VyLCgiaW50b3ZpZXciPT09dC5hbmltVHlwZXx8InNjcm9sbCI9PT10LmFuaW1UeXBlKSYmdC50cmlnZ2VyT2Zmc2V0PnQudG9wT2Zmc2V0JiZ0LnRyaWdnZXJPZmZzZXQ8PWUqdC50cmlnZ2VyJiYodC50cmlnZ2VyT2Zmc2V0PXQudG9wT2Zmc2V0LHQuc2NhbGVkRGlmZmVyZW5jZSYmKHQudHJpZ2dlck9mZnNldDwwfHx0LnRyaWdnZXJPZmZzZXQ9PT10LnNjYWxlZERpZmZlcmVuY2UpJiYodC5zY2FsZWREaWZmZXJlbmNlPTApKSwiYmxvY2tpbnRvdmlldyI9PT10LmFuaW1UeXBlJiZ0LnRyaWdnZXJPZmZzZXQ+dC5wYXJlbnRSZWNUb3BQb3MmJnQudHJpZ2dlck9mZnNldDw9ZSp0LnRyaWdnZXImJih0LnRyaWdnZXJPZmZzZXQ9dC5wYXJlbnRSZWNUb3BQb3MpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdHJpZ2dlck5vU2Nyb2xsQW5pbWF0aW9uKHQsZSl7dF9hbmltYXRpb25TQlNfX3Byb2Nlc3NFbHNJbnRvVmlldyh0LGUpLHRfYW5pbWF0aW9uU0JTX19yZW1vdmVIb3ZlckNsaWNrVHJpZ2dlcnModCksdF9hbmltYXRpb25TQlNfX2luaXRDbGlja1RyaWdnZXJzKHQpLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2Vycyh0KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0Vsc0ludG9WaWV3KHQsZSl7dF9hbmltYXRpb25TQlNfX3VwZGF0ZUludG9WaWV3RWxzU3RhdGUoZSk7dmFyIG49MDt0X2FuaW1hdGlvblNCU19fc2V0S2V5Rm9yQW5pbWF0ZWRPYmplY3QodCwib25TY3JvbGxVcGRhdGVFbHNJbnRvVmlldyIsKGZ1bmN0aW9uKCl7bnx8KG49c2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgZTt0X2FuaW1hdGlvblNCU19fdXBkYXRlSW50b1ZpZXdFbHNTdGF0ZSh0X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyh0LmVsZW1lbnRzKSksbj0wfSksMjAwKSl9KSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdC5vblNjcm9sbFVwZGF0ZUVsc0ludG9WaWV3KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0Lm9uU2Nyb2xsVXBkYXRlRWxzSW50b1ZpZXcpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19yZW1vdmVIb3ZlckNsaWNrVHJpZ2dlcnModCl7dmFyIGU9WyJqcy1zYnMtYW5pbS10cmlnZ2VyX2NsaWNrIiwianMtc2JzLWFuaW0tdHJpZ2dlcl9ob3ZlciJdLG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLiIrZS5qb2luKCIsIC4iKSk7bi5sZW5ndGgmJigobj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChuKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNsYXNzTGlzdC5yZW1vdmUoZSl9KSl9KSksdC5jbGlja2VkVHJpZ2dlckVscy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdENsaWNrQ2FsbGJhY2spLHRfYW5pbWF0aW9uU0JTX19yZW1vdmVUcmlnZ2VyTGlzdCh0LCJjbGljayIpfSkpLHQuaG92ZXJUcmlnZ2VyRWxzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSx0X2FuaW1hdGlvblNCU19fcmVtb3ZlVHJpZ2dlckxpc3QodCwiaG92ZXIiKX0pKSx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LCJjbGlja2VkVHJpZ2dlckVscyIsW10pLHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsImhvdmVyVHJpZ2dlckVscyIsW10pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcmVtb3ZlVHJpZ2dlckxpc3QodCxlKXt0WyJ0cmlnZ2VyTGlzdC1vbi0iK2VdJiYodFsidHJpZ2dlckxpc3Qtb24tIitlXT1bXSksdFsidHJpZ2dlck9uY2VMaXN0LW9uLSIrZV0mJih0WyJ0cmlnZ2VyT25jZUxpc3Qtb24tIitlXT1bXSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRDbGlja1RyaWdnZXJzKHQpe3ZhciBlPXQuZWxlbWVudHMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4iY2xpY2siPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKX0pKTtpZihlLmxlbmd0aCl7dF9hbmltYXRpb25TQlNfX2Nvbm5lY3RUcmlnZ2Vyc1dpdGhBbmltRWxzKGUpO3ZhciBuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5qcy1zYnMtYW5pbS10cmlnZ2VyX2NsaWNrIikpO2lmKG4ubGVuZ3RoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImpzLXNicy1hbmltLXRyaWdnZXItc3R5bGVzIikpe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7aS5pZD0ianMtc2JzLWFuaW0tdHJpZ2dlci1zdHlsZXMiLGkudGV4dENvbnRlbnQ9Ii5qcy1zYnMtYW5pbS10cmlnZ2VyX2NsaWNrIHsgY3Vyc29yOiBwb2ludGVyOyB9Iixkb2N1bWVudC5oZWFkLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixpKX10LmNsaWNrZWRUcmlnZ2VyRWxzPW4sbi5mb3JFYWNoKChmdW5jdGlvbih0KXt0X2FuaW1hdGlvblNCU19fcHJldmVudEFuaW1hdGVkUGFyZW50VHJpZ2dlcih0KSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdENsaWNrQ2FsbGJhY2spLHQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tDYWxsYmFjayl9KSl9fX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdENsaWNrQ2FsbGJhY2soKXt2YXIgdD10aGlzWyJ0cmlnZ2VyTGlzdC1vbi1jbGljayJdfHxbXSxlPXRoaXNbInRyaWdnZXJPbmNlTGlzdC1vbi1jbGljayJdfHxbXTsodC5sZW5ndGh8fGUubGVuZ3RoKSYmKHRfYW5pbWF0aW9uU0JTX19wbGF5T25jZUFuaW1hdGlvbih0aGlzLGUsImNsaWNrIiksdC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9zdGFydGVkIikmJiF0LmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9yZXZlcnNlZCIpP3RfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PbkVuZCh0KTp0X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25TdGFydCh0KX0pKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3BsYXlPbmNlQW5pbWF0aW9uKHQsZSxuKXtpZihlJiZlLmxlbmd0aCl7dF9hbmltYXRpb25TQlNfX2FjdGlvbk9uU3RhcnQoZSk7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7aS5pbml0RXZlbnQoInVwZGF0ZUFuaW1PbmNlIiwhMCwhMCksZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmRpc3BhdGNoRXZlbnQoaSl9KSksdFsidHJpZ2dlck9uY2VMaXN0LW9uLSIrbl09W119fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2Vycyh0KXt2YXIgZT10LmVsZW1lbnRzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuImhvdmVyIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50Iil9KSk7aWYoZS5sZW5ndGgpe3RfYW5pbWF0aW9uU0JTX19jb25uZWN0VHJpZ2dlcnNXaXRoQW5pbUVscyhlKTt2YXIgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtc2JzLWFuaW0tdHJpZ2dlcl9ob3ZlciIpO249QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobiksdC5ob3ZlclRyaWdnZXJFbHM9bixuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfYW5pbWF0aW9uU0JTX19wcmV2ZW50QW5pbWF0ZWRQYXJlbnRUcmlnZ2VyKHQpLHdpbmRvdy5hbmltYXRpb25TQlNfX2lzSU9TPyh0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpKToodC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlcikpfSkpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcHJldmVudEFuaW1hdGVkUGFyZW50VHJpZ2dlcih0KXtpZigibm9uZSIhPT1nZXRDb21wdXRlZFN0eWxlKHQpLnBvaW50ZXJFdmVudHMpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpO2UmJih0LnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiLGUuc3R5bGUucG9pbnRlckV2ZW50cz0iYXV0byIpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlcih0KXt2YXIgZT10LmN1cnJlbnRUYXJnZXQsbj10LmN1cnJlbnRUYXJnZXRbInRyaWdnZXJMaXN0LW9uLWhvdmVyIl0saT10LmN1cnJlbnRUYXJnZXRbInRyaWdnZXJPbmNlTGlzdC1vbi1ob3ZlciJdO2Z1bmN0aW9uIGEodCl7ZS5jbG9zZXN0KCIudDM5Nl9fZWxlbSIpIT09dC50YXJnZXQuY2xvc2VzdCgiLnQzOTZfX2VsZW0iKSYmKHRfYW5pbWF0aW9uU0JTX19hY3Rpb25PbkVuZChuKSxlLmNsYXNzTGlzdC5yZW1vdmUoInQtaG92ZXItbW9iLWFjdGl2ZSIpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixhKSl9KG4mJm4ubGVuZ3RofHxpJiZpLmxlbmd0aCkmJih0X2FuaW1hdGlvblNCU19fcGxheU9uY2VBbmltYXRpb24oZSxpLCJob3ZlciIpLG4mJm4ubGVuZ3RoJiYoIm1vdXNlZW50ZXIiPT09dC50eXBlJiZ0X2FuaW1hdGlvblNCU19fYWN0aW9uT25TdGFydChuKSwibW91c2VsZWF2ZSI9PT10LnR5cGUmJnRfYW5pbWF0aW9uU0JTX19hY3Rpb25PbkVuZChuKSwiY2xpY2siPT09dC50eXBlJiYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQtaG92ZXItbW9iLWFjdGl2ZSIpfHwoc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fYWN0aW9uT25TdGFydChuKSxlLmNsYXNzTGlzdC5hZGQoInQtaG92ZXItbW9iLWFjdGl2ZSIpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGEpfSkpKSkpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY29ubmVjdFRyaWdnZXJzV2l0aEFuaW1FbHModCl7dmFyIGU9dFswXS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQudHJpZ2dlckVsZW1zO2lmKG4pe3ZhciBpPW4/bi5zcGxpdCgiLCIpOltdLGE9dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxyPWE/YS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKToiIjtpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPXIrbixhO3RfYW5pbWF0aW9uU0JTX19wcm9jZXNzVHJpZ2dlcnNFbGVtTGlzdChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fIitpKyIsIC50bi1ncm91cF9fIitpKSx0LGUpfSkpfWVsc2V7dmFyIG87dF9hbmltYXRpb25TQlNfX3Byb2Nlc3NUcmlnZ2Vyc0VsZW1MaXN0KHQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKSx0LGUpfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcHJvY2Vzc1RyaWdnZXJzRWxlbUxpc3QodCxlLG4pe3ZhciBpO3QmJigib25jZSI9PT1lLmxvb3A/ZS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fc3RhcnRlZCIpfHx0X2FuaW1hdGlvblNCU19faW5pdFRyaWdnZXJzTGlzdCh0LCJ0cmlnZ2VyT25jZUxpc3QiLG4sZSk6dF9hbmltYXRpb25TQlNfX2luaXRUcmlnZ2Vyc0xpc3QodCwidHJpZ2dlckxpc3QiLG4sZSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0VHJpZ2dlcnNMaXN0KHQsZSxuLGkpe3RbZSsiLW9uLSIrbl0/LTE9PT10W2UrIi1vbi0iK25dLmluZGV4T2YoaSkmJnRbZSsiLW9uLSIrbl0ucHVzaChpKTp0W2UrIi1vbi0iK25dPVtpXSx0W2UrIi1vbi0iK25dLmxlbmd0aCYmIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1zYnMtYW5pbS10cmlnZ2VyXyIrbikmJnQuY2xhc3NMaXN0LmFkZCgianMtc2JzLWFuaW0tdHJpZ2dlcl8iK24pLGkuYWRkRXZlbnRMaXN0ZW5lcigidXBkYXRlQW5pbU9uY2UiLChmdW5jdGlvbigpe3RbZSsiLW9uLSIrbl09dFtlKyItb24tIituXS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09aX0pKSx0WyJ0cmlnZ2VyTGlzdC1vbi0iK25dJiZ0WyJ0cmlnZ2VyTGlzdC1vbi0iK25dLmxlbmd0aHx8dC5jbGFzc0xpc3QucmVtb3ZlKCJqcy1zYnMtYW5pbS10cmlnZ2VyXyIrbil9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FjdGlvbk9uU3RhcnQodCl7dC5mb3JFYWNoKHRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PblN0YXJ0KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25TdGFydCh0KXt0LmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9wbGF5aW5nIik/dC5zZXRBdHRyaWJ1dGUoImRhdGEtcGxhbm5lZC1kaXIiLCJwbGF5Iik6dF9hbmltYXRpb25TQlNfX3BsYXlBbmltYXRpb24odCwhMSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FjdGlvbk9uRW5kKHQpe3QuZm9yRWFjaCh0X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25FbmQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRBY3Rpb25PbkVuZCh0KXt2YXIgZT10Lmxvb3Asbj0ibm9yZXZlcnNlIj09PWUmJiJob3ZlciI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpO2UmJi0xIT09ZS5pbmRleE9mKCJsb29wIik/dC5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25pdGVyYXRpb24iLHRfYW5pbWF0aW9uU0JTX19zZXRJdGVyYXRpb25BbmltYXRpb24pOnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3BsYXlpbmciKSYmIW4/dC5zZXRBdHRyaWJ1dGUoImRhdGEtcGxhbm5lZC1kaXIiLCJyZXZlcnNlIik6bnx8dF9hbmltYXRpb25TQlNfX3BsYXlBbmltYXRpb24odCwhMCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEl0ZXJhdGlvbkFuaW1hdGlvbih0KXt2YXIgZT10LnRhcmdldC5jbG9zZXN0KCIudDM5Nl9fZWxlbSIpO2lmKGUpe2lmKCJsb29wd2l0aHJldmVyc2UiPT09ZS5sb29wKXt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0QW5pbWF0aW9uRnVsbFRpbWUoZSwhMCksaSxhO2lmKDFlMyp0LmVsYXBzZWRUaW1lL24lMiE9MClyZXR1cm59ZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKSxlLmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fcmV2ZXJzZWQiKSxlLmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fcGxheWluZyIpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uaXRlcmF0aW9uIix0X2FuaW1hdGlvblNCU19fc2V0SXRlcmF0aW9uQW5pbWF0aW9uKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FuaW1hdGlvbkVuZCh0KXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsdF9hbmltYXRpb25TQlNfX2FuaW1hdGlvbkVuZGluZ0V2ZW50KSx0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsdF9hbmltYXRpb25TQlNfX2FuaW1hdGlvbkVuZGluZ0V2ZW50KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYW5pbWF0aW9uRW5kaW5nRXZlbnQoKXt0aGlzLmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fcGxheWluZyIpO3ZhciB0PXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLXBsYW5uZWQtZGlyIik7InBsYXkiPT09dCYmdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fcmV2ZXJzZWQiKT90X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0aGlzLCExKToicmV2ZXJzZSIhPT10fHx0aGlzLmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9yZXZlcnNlZCIpfHx0X2FuaW1hdGlvblNCU19fcGxheUFuaW1hdGlvbih0aGlzLCEwKSx0aGlzLnNldEF0dHJpYnV0ZSgiZGF0YS1wbGFubmVkLWRpciIsIiIpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBbmltYXRpb25GdWxsVGltZSh0LGUpe3ZhciBuLGk7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLW9wdHMiKT9KU09OLnBhcnNlKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLW9wdHMiKS5zcGxpdCgiJyIpLmpvaW4oJyInKSkucmVkdWNlKChmdW5jdGlvbih0LG4pe3JldHVybiBlJiYodCs9cGFyc2VJbnQobi5kdCwxMCl8fDApLHQrKHBhcnNlSW50KG4udGksMTApfHwwKX0pLDApOjB9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3BsYXlBbmltYXRpb24odCxlKXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fc3RhcnRlZCIpLGV8fHQuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9yZXZlcnNlZCIpLHRfYW5pbWF0aW9uU0JTX19mb3JjZVJlcGFpbnQodCk7dmFyIG49dF9hbmltYXRpb25TQlNfX2dldEFuaW1hdGlvbkZ1bGxUaW1lKHQsITEpLGk9WyJ0LXNicy1hbmltX3N0YXJ0ZWQiXTtlJiZpLnB1c2goInQtc2JzLWFuaW1fcmV2ZXJzZWQiKSxuPjAmJmkucHVzaCgidC1zYnMtYW5pbV9wbGF5aW5nIiksaS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNsYXNzTGlzdC5hZGQoZSl9KSksdF9hbmltYXRpb25TQlNfX2FuaW1hdGlvbkVuZCh0KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZm9yY2VSZXBhaW50KHQpe3Qub2Zmc2V0V2lkdGh9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZUludG9WaWV3RWxzU3RhdGUodCl7dCYmdC5sZW5ndGgmJnQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoZG9jdW1lbnQuY29udGFpbnModCkpe3ZhciBlPXdpbmRvdy5wYWdlWU9mZnNldCt0LnRyaWdnZXJPZmZzZXQsbj0iYmxvY2tpbnRvdmlldyI9PT10LmFuaW1UeXBlP2U+PXQucGFyZW50UmVjVG9wUG9zOmU+PXQudG9wT2Zmc2V0LGk9dC5jbG9zZXN0KCIudDM5NiIpLnBhcmVudEVsZW1lbnQsYSxyPVsidDM5N19fb2ZmIiwidDM5NV9fb2ZmIiwidDQwMF9fb2ZmIl0uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGkuY2xhc3NMaXN0LmNvbnRhaW5zKHQpfSkpO24mJiFyJiYodC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fc3RhcnRlZCIpfHx0LmNsYXNzTGlzdC5hZGQoInQtc2JzLWFuaW1fc3RhcnRlZCIpKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFpvb20odCl7aWYodm9pZCAwIT09dC5zY2FsZUZhY3RvcilyZXR1cm4gdC5zY2FsZUZhY3Rvcjt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpO2lmKCFlKXJldHVybiAxO3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIik7cmV0dXJuIGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZF9zY2FsZSIpfHwhd2luZG93LmFuaW1hdGlvblNCU19faXNPbGRQYWdlJiYidW5kZWZpbmVkIiE9dHlwZW9mIHQzOTZfYWJfX2dldEZpZWxkVmFsdWUmJiJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShlLCJ1cHNjYWxlIik/biYmd2luZG93LnRuWyJhYiIrbl0mJndpbmRvdy50blsiYWIiK25dLnNjYWxlRmFjdG9yfHx3aW5kb3cudG5fc2NhbGVfZmFjdG9yOjF9ZnVuY3Rpb24gdF9hbmltYXRlU2JzX193cmFwQXRvbUVscygpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtc2JzLWV2ZW50XSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpO2lmKGUmJiFlLmNsb3Nlc3QoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIikpe3RfYW5pbWF0aW9uU0JTX193cmFwRWwoZSwidG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO3ZhciBuPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpLGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuZ2V0UHJvcGVydHlWYWx1ZSgiYm9yZGVyLXJhZGl1cyIpO2lmKCJzaGFwZSI9PT1uJiZpJiZwYXJzZUludChpKSl7dmFyIGE9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO2EmJihhLnN0eWxlLmJvcmRlclJhZGl1cz1pKX19fSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZVNic19fY2FzaEVsc0luZm8odCl7dmFyIGU9dC5lbHM7dC50cmlnZ2VyRWxlbXNBdHRyTmFtZT0iZWRpdCI9PT10Lm1vZGU/ImRhdGEtZmllbGQtc2JzdHJnZWxzLXZhbHVlIjoiZGF0YS1hbmltYXRlLXNicy10cmdlbHMiLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSl7ZS5zdGF0ZT0idW5hY3RpdmUiLGUuYW5pbVR5cGU9ImVkaXQiPT09dC5tb2RlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXNic2V2ZW50LXZhbHVlIik6ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKSxlLmNoYW5nZVR5cGU9InNjcm9sbCI9PT1lLmFuaW1UeXBlPyJzY3JvbGwiOiJ0aW1lIixlLnRyaWdnZXI9ImVkaXQiPT09dC5tb2RlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXNic3RyZy12YWx1ZSIpOmUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLXRyZyIpLGUudHJpZ2dlcj1lLnRyaWdnZXI/ZS50cmlnZ2VyOjEsZS50cmlnZ2VyRWxlbXM9ZS5nZXRBdHRyaWJ1dGUodC50cmlnZ2VyRWxlbXNBdHRyTmFtZSksZS53cmFwcGVyRWw9ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpLGUuc3RlcHM9W107dmFyIG49ImVkaXQiPT09dC5tb2RlP2UuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLXNic29wdHMtdmFsdWUiKTplLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1vcHRzIik7aWYobil7LTEhPT1uLmluZGV4T2YoImZpeGVkIikmJihlLnpJbmRleD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5nZXRQcm9wZXJ0eVZhbHVlKCJ6LWluZGV4IikpLG49bi5yZXBsYWNlKC8nL2csJyInKTt2YXIgaT1KU09OLnBhcnNlKG4pO3RfYW5pbWF0aW9uU0JTX19hZGREZWxheVRvU3RlcHMoaSksZS5sb29wPSJlZGl0Ij09PXQubW9kZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC1zYnNsb29wLXZhbHVlIik6ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtbG9vcCIpLHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKGUsdCk7Zm9yKHZhciBhPTAscj0wO3I8aS5sZW5ndGg7cisrKXt2YXIgbz17c3RhdGU6InVuYWN0aXZlIn07by5zdHlsZXM9dF9hbmltYXRpb25TQlNfX2NyZWF0ZVN0ZXBTdHlsZXMoaVtyXSksInNjcm9sbCI9PT1lLmNoYW5nZVR5cGU/KG8ucHJldlVuZml4ZWREaXN0PWEsby5kaXN0PWlbcl0uZGksITE9PT1vLnN0eWxlcy5maXgmJihhKz1OdW1iZXIoby5kaXN0KSksby5zdGFydD0wPT09cj9lLnRvcE9mZnNldDplLnN0ZXBzW3ItMV0uZW5kLG8uZW5kPW8uc3RhcnQrMSpvLmRpc3QpOihvLnRpbWU9aVtyXS50aSxvLmVhc2U9aVtyXS5lYSksZS5zdGVwcy5wdXNoKG8pfXRfYW5pbWF0aW9uU0JTX191cGRhdGVJbmZvT25JbWdMb2FkKGUsdCksdF9hbmltYXRpb25TQlNfX3VwZGF0ZU1vdmVBbmRSb3RhdGVTdGVwc1N0eWxlcyhlLnN0ZXBzKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRlU2JzX19yZXNldCh0KXtmb3IodmFyIGU9dC5lbHMsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaT1lW25dLmFuaW1UeXBlO2lmKCJpbnRvdmlldyI9PT1pfHwiYmxvY2tpbnRvdmlldyI9PT1pfHwiY2xpY2siPT09aXx8ImhvdmVyIj09PWkpe2Vbbl0uY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9zdGFydGVkIik7dmFyIGE9ZVtuXS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO2EmJihhLnN0eWxlLm9wYWNpdHk9IiIpfWVsc2V7ZVtuXS5zdGF0ZT0icmVzZXRlZCI7dmFyIHI9ZVtuXS53cmFwcGVyRWw7ciYmKHIuc3R5bGUudHJhbnNmb3JtPSIiLHIuc3R5bGUucG9zaXRpb249IiIsci5zdHlsZS50b3A9IiIsci5zdHlsZS5vcGFjaXR5PSIiKX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRTaXplQmFzZWRPbkRpbWVuc2lvbk1vZGUodCl7aWYoIXQpcmV0dXJue3dpZHRoOiJpbmhlcml0IixoZWlnaHQ6ImluaGVyaXQifTt2YXIgZT10LnBhcmVudE5vZGUuY2xvc2VzdCgiLnRuLWdyb3VwIil8fHQucGFyZW50Tm9kZSxuLGksYTtyZXR1cm4gZSYmdDM5Nl9faXNGbGV4KGUpP3t3aWR0aDoiZmlsbCI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwid2lkdGhtb2RlIik/IjEwMCUiOiJpbmhlcml0IixoZWlnaHQ6ImZpbGwiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodG1vZGUiKT8iMTAwJSI6ImluaGVyaXQifTp7d2lkdGg6ImluaGVyaXQiLGhlaWdodDoiaW5oZXJpdCJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX193cmFwRWwodCxlKXtpZighdClyZXR1cm4hMTt2YXIgbj10LnBhcmVudE5vZGUsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxhPXRfYW5pbWF0aW9uU0JTX19nZXRTaXplQmFzZWRPbkRpbWVuc2lvbk1vZGUobikscj1hLndpZHRoLG89YS5oZWlnaHQ7InN0cmluZyI9PXR5cGVvZiBlP2kuY2xhc3NMaXN0LmFkZChlKTplLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuY2xhc3NMaXN0LmFkZCh0KX0pKSxpLnN0eWxlLmRpc3BsYXk9ImluaGVyaXQiLGkuc3R5bGUud2lkdGg9cixpLnN0eWxlLmhlaWdodD1vLGkuYXBwZW5kQ2hpbGQodCksbiYmbi5hcHBlbmRDaGlsZChpKX13aW5kb3cudF9hbmltYXRpb25TQlNfX2lzRmlyZWZveD0tMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuc2VhcmNoKCJGaXJlZm94Iiksd2luZG93LnRfYW5pbWF0aW9uU0JTX19pc1NhZmFyaT0vXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy5hbmltYXRpb25TQlNfX2lzSU9TPS9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQmJi9NYWNpbnRvc2gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LmFuaW1hdGlvblNCU19faXNPbGRQYWdlPUJvb2xlYW4oZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9InRpbGRhLWJsb2Nrcy0yLjciXScpKSwidmlzaWJsZSI9PT1kb2N1bWVudC52aXNpYmlsaXR5U3RhdGU/ImxvYWRpbmciIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT90X2FuaW1hdGlvblNCU19faW5pdCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHRfYW5pbWF0aW9uU0JTX19pbml0KTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSk7CgpmdW5jdGlvbiB0Mzk2X3NjYWxlQmxvY2soZSl7dmFyIHQ9dDM5Nl9kZXRlY3RSZXNvbHV0aW9uKGUpLGw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrZSk7aWYobCl7dmFyIGE7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3I/YT10Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3IoZSk6KGE9d2luZG93LnRuJiZ3aW5kb3cudG5bImFiIitlXSYmd2luZG93LnRuWyJhYiIrZV0uc2NhbGVGYWN0b3IpfHwoYT13aW5kb3cudG5fc2NhbGVfZmFjdG9yKTt2YXIgbz1sLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpLG49dDM5Nl9zY2FsZV9fY29sbGVjdFNjYWxlRGF0YShvLGEpO2lmKG8pe3ZhciByPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywiaGVpZ2h0IiksaT1NYXRoLmZsb29yKHIqYSksYyxfO2lmKHQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywiaGVpZ2h0X3ZoIikpe3ZhciBzPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobywiaGVpZ2h0IiksZD10Mzk2X2FiX19nZXRIZWlnaHQobyksbT1zKmE7aT1tPj1kP206ZH1pZih0Mzk2X3NjYWxlX191cGRhdGVBcnRib2FyZFN0YXRlKG8saSksMCE9PW4ubGVuZ3RoKWlmKHQzOTZfaXNPbmx5U2NhbGFibGVCcm93c2VyKCkpdDM5Nl9zY2FsZV9fc2NhbGVJc09ubHlTY2FsYWJsZUJsb2NrKG4pO2Vsc2V7dmFyIHU9bi5maWx0ZXIoKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZWxlbVR5cGU7cmV0dXJuInRleHQiPT09dHx8ImJ1dHRvbiI9PT10fSkpLGg9bi5maWx0ZXIoKGZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiJzaGFwZSI9PT1lLmVsZW1UeXBlfSkpLHA9L14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxmO3AmJnQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVRleHRFbGVtZW50cyh1KSx0Mzk2X3NjYWxlX19zY2hlZHVsZV9fc2NhbGVTaGFwZUVsZW1lbnRzKGgpLG4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIGw9ZS5lbGVtZW50LG89ZS5lbGVtZW50Q29yZSxuPWUuZWxlbVR5cGUscj0iZ2FsbGVyeSI9PT1uLGk9InZpZGVvIj09PW47InllcyI9PT1sLmdldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZS1vZmYiKXx8cnx8KGwuc3R5bGUuem9vbT1hKSxyJiYobC5zdHlsZS56b29tPW51bGwpLCJ0ZXh0Ij09PW4mJnQ8MTIwMCYmbyYmIXAmJihvLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSJhdXRvIiksbyYmKG8uc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJjZW50ZXIiKX0pKSxBcnJheS5mcm9tKG8ucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlID4gLnQzOTZfX2VsZW0sIDpzY29wZSA+IC50Mzk2X19ncm91cCIpKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdDsoImxlZnQiIT09dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKGUsImF4aXN4Iil8fCJ0b3AiIT09dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKGUsImF4aXN5IikpJiYodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoZSwibGVmdCIpLHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGUsInRvcCIpKX0pKX19fX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19zY2hlZHVsZV9fc2NhbGVUZXh0RWxlbWVudHMoZSl7d2luZG93LnRufHwod2luZG93LnRuPXt9KSx3aW5kb3cudG4uc2NoZWR1bGVkVGV4dEVsZW1lbnRzRm9yU2NhbGV8fCh3aW5kb3cudG4uc2NoZWR1bGVkVGV4dEVsZW1lbnRzRm9yU2NhbGU9W10pLHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZT13aW5kb3cudG4uc2NoZWR1bGVkVGV4dEVsZW1lbnRzRm9yU2NhbGUuY29uY2F0KGUpLGNsZWFyVGltZW91dCh3aW5kb3cudG4udGV4dEVsZW1lbnRzU2NhbGVUaW1lciksd2luZG93LnRuLnRleHRFbGVtZW50c1NjYWxlVGltZXI9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X3NjYWxlX19zY2FsZVRleHRFbGVtZW50cyh3aW5kb3cudG4uc2NoZWR1bGVkVGV4dEVsZW1lbnRzRm9yU2NhbGUpLHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZT1bXX0pLDEpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjYWxlVGV4dEVsZW1lbnRzKGUpe3ZhciB0PXQzOTZfX2luaXRGYXN0RE9NKCk7dC53cml0ZSgoZnVuY3Rpb24oKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UuZWxlbWVudENvcmUuc3R5bGUuZm9udFNpemU9IiIsZS5lbGVtZW50Q29yZS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD0ibm9uZSIsZS5jYWNoZWRab29tPWUuZWxlbWVudC5zdHlsZS56b29tLGUuc2NhbGVGYWN0b3I8MSYmKGUuZWxlbWVudC5zdHlsZS56b29tPSIiKX0pKX0pKSx0LnJlYWQoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmZpZWxkRm9udFNpemU9cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZS5lbGVtZW50LCJmb250c2l6ZSIpKSxlLmN1cnJlbnRGb250U2l6ZT1wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoZS5lbGVtZW50Q29yZSkuZm9udFNpemUpfSkpfSkpLHQud3JpdGUoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnNjYWxlRmFjdG9yPDEmJihlLmVsZW1lbnQuc3R5bGUuem9vbT1lLmNhY2hlZFpvb20pO3ZhciB0PSFpc05hTihlLmZpZWxkRm9udFNpemUpLGw9TWF0aC5hYnMoZS5jdXJyZW50Rm9udFNpemUtTWF0aC5yb3VuZChlLmN1cnJlbnRGb250U2l6ZSkpLGE7aWYodD9lLmZpZWxkRm9udFNpemUtZS5jdXJyZW50Rm9udFNpemU+PTE6bD4uMDEpe3ZhciBvPXQ/ZS5maWVsZEZvbnRTaXplOmUuY3VycmVudEZvbnRTaXplKmUuc2NhbGVGYWN0b3I7ZS5lbGVtZW50Q29yZS5zdHlsZS5mb250U2l6ZT1NYXRoLnJvdW5kKG8qZS5zY2FsZUZhY3RvcikrInB4In1lbHNlIGUuZWxlbWVudENvcmUuc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9IiJ9KSl9KSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NoZWR1bGVfX3NjYWxlU2hhcGVFbGVtZW50cyhlKXt3aW5kb3cudG58fCh3aW5kb3cudG49e30pLHdpbmRvdy50bi5zY2hlZHVsZWRTaGFwZUVsZW1lbnRzRm9yU2NhbGV8fCh3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlPVtdKSx3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlPXdpbmRvdy50bi5zY2hlZHVsZWRTaGFwZUVsZW1lbnRzRm9yU2NhbGUuY29uY2F0KGUpLGNsZWFyVGltZW91dCh3aW5kb3cudG4uc2hhcGVFbGVtZW50c1NjYWxlVGltZXIpLHdpbmRvdy50bi5zaGFwZUVsZW1lbnRzU2NhbGVUaW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfc2NhbGVfX3NjYWxlU2hhcGVFbGVtZW50cyh3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlKSx3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlPVtdfSksMSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NhbGVTaGFwZUVsZW1lbnRzKGUpe3ZhciB0PXQzOTZfX2luaXRGYXN0RE9NKCk7dC5yZWFkKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUuZWxlbWVudCwiaGVpZ2h0Iik7dD10Mzk2X2VsZW1fX2dldEhlaWdodChlLmVsZW1lbnQsdCksdD10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZS5lbGVtZW50LCJoZWlnaHQiLHQpO3ZhciBsPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLmVsZW1lbnQsIndpZHRoIik7bD10Mzk2X2VsZW1fX2dldFdpZHRoKGUuZWxlbWVudCxsKSxsPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLmVsZW1lbnQsIndpZHRoIixsKTt2YXIgYT1wYXJzZUZsb2F0KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLmVsZW1lbnQsInRvcCIpKTthPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLmVsZW1lbnQsInRvcCIsYSk7dmFyIG89cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZS5lbGVtZW50LCJsZWZ0IikpO289dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUuZWxlbWVudCwibGVmdCIsbyksZS5zaGFwZVNpemU9e3RvcDphLGxlZnQ6byx3aWR0aDpsLGhlaWdodDp0fX0pKX0pKTt2YXIgbD1lLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2hhcGVTaXplLndpZHRoPD0yfHxlLnNoYXBlU2l6ZS5oZWlnaHQ8PTJ9KSk7dC5yZWFkKChmdW5jdGlvbigpe2wuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZS5lbGVtZW50Q29yZSk7ZS5ib3JkZXJXaWR0aD10LmJvcmRlcldpZHRoLGUuaXNJbWFnZT0ibm9uZSIhPT10LmJhY2tncm91bmRJbWFnZSxlLmlzQW5pbWF0ZWQ9ZS5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpfSkpfSkpLHQud3JpdGUoKGZ1bmN0aW9uKCl7bC5mb3JFYWNoKChmdW5jdGlvbihlKXtpZigiMHB4Ij09PWUuYm9yZGVyV2lkdGgmJiFlLmlzSW1hZ2UmJiFlLmlzQW5pbWF0ZWQpe2UuZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiem9vbSIpO3ZhciB0PWUuc2hhcGVTaXplLndpZHRoKmUuc2NhbGVGYWN0b3IsbD1lLnNoYXBlU2l6ZS5oZWlnaHQqZS5zY2FsZUZhY3RvcixhPWUuc2hhcGVTaXplLnRvcCplLnNjYWxlRmFjdG9yLG89ZS5zaGFwZVNpemUubGVmdCplLnNjYWxlRmFjdG9yO2UuZWxlbWVudC5zdHlsZS53aWR0aD1wYXJzZUZsb2F0KHQpKyJweCIsZS5lbGVtZW50LnN0eWxlLmhlaWdodD1wYXJzZUZsb2F0KGwpKyJweCIsZS5lbGVtZW50LnN0eWxlLnRvcD1NYXRoLnJvdW5kKGEpKyJweCIsZS5lbGVtZW50LnN0eWxlLmxlZnQ9TWF0aC5yb3VuZChvKSsicHgiLGUuZWxlbWVudC5zZXRBdHRyaWJ1dGUoImRhdGEtc2NhbGUtb2ZmIiwieWVzIil9fSkpfSkpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX2NvbGxlY3RTY2FsZURhdGEoZSx0KXt2YXIgbDtyZXR1cm4gdDM5Nl9zY2FsZV9fZ2V0RWxlbWVudHNUb1NjYWxlKGUpLm1hcCgoZnVuY3Rpb24oZSl7dmFyIGw9ZS5xdWVyeVNlbGVjdG9yKCIudG4tbW9sZWN1bGUsIC50bi1hdG9tIiksYT10Mzk2X3NjYWxlX19nZXRFbGVtZW50VHlwZShlKSxvPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJjb250YWluZXIiKTtpZihvfHwiZ3JvdXAiIT09YXx8KG89ImdyaWQiKSxsJiYiZ3JpZCI9PT1vKXJldHVybntlbGVtZW50OmUsZWxlbWVudENvcmU6bCxlbGVtVHlwZTphLHNjYWxlRmFjdG9yOnR9fSkpLmZpbHRlcihCb29sZWFuKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19zY2FsZUlzT25seVNjYWxhYmxlQmxvY2soZSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1lLmVsZW1lbnQsbD1lLmVsZW1lbnRDb3JlLGE9ZS5lbGVtVHlwZSxvPWwuY2xvc2VzdCgiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKTtvfHwodDM5Nl9zY2FsZV9fd3JhcEVsZW1lbnQobCxjdXJyZW50U2NhbGVGYWN0b3IsInRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKSxvPWwuY2xvc2VzdCgiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKSksdC5zdHlsZS56b29tPSIiLHQzOTZfc2NhbGVfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlcih0LGwsbyksdDM5Nl9zY2FsZV9fcHJvY2Vzc0JhY2tncm91bmRGb3JTaGFwZSh0LGwsYSxjdXJyZW50U2NhbGVGYWN0b3IpfSkpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX2dldEVsZW1lbnRzVG9TY2FsZShlKXtyZXR1cm4gZT9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmNoaWxkcmVuKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlJiYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2VsZW0iKXx8ZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwIikpfSkpOltdfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3VwZGF0ZUFydGJvYXJkU3RhdGUoZSx0KXtlLmNsYXNzTGlzdC5hZGQoInQzOTZfX2FydGJvYXJkX3NjYWxlIik7dmFyIGw9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxhO2lmKCEoImh1ZyI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHRtb2RlIikpKXt2YXIgbz0nPHN0eWxlIGNsYXNzPSJ0Mzk2X19zY2FsZS1zdHlsZSI+LnQtcmVjI3JlYycrbCsiIHsgb3ZlcmZsb3c6IHZpc2libGU7IH0jcmVjIitsKyIgLnQzOTZfX2FydGJvYXJkOm5vdCgudDM5Nl9fYXJ0Ym9hcmQtZmxleCksI3JlYyIrbCsiIC50Mzk2X19hcnRib2FyZDpub3QoLnQzOTZfX2FydGJvYXJkLWZsZXgpIC50Mzk2X19jYXJyaWVyLCNyZWMiK2wrIiAudDM5Nl9fYXJ0Ym9hcmQ6bm90KC50Mzk2X19hcnRib2FyZC1mbGV4KSAudDM5Nl9fZmlsdGVyIHsgd2lkdGg6IDEwMHZ3ICFpbXBvcnRhbnQ7IG1heC13aWR0aDogMTAwJTt9I3JlYyIrbCsiIC50Mzk2X19jYXJyaWVyLCNyZWMiK2wrIiAudDM5Nl9fZmlsdGVyLCNyZWMiK2wrIiAudDM5Nl9fYXJ0Ym9hcmQge2hlaWdodDogIit0KyJweCAhaW1wb3J0YW50O308L3N0eWxlPiI7ZS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIsbyl9fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3dyYXBFbGVtZW50KGUsdCxsKXtpZihlKXt2YXIgYT1lLnBhcmVudE5vZGU7aWYoYSl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7by5jbGFzc0xpc3QuYWRkKGwpLG8uc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgiK3QrIikiLG8uYXBwZW5kQ2hpbGQoZSksYS5hcHBlbmRDaGlsZChvKX19fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlcihlLHQsbCl7Im5vbmUiPT09ZS5zdHlsZS5iYWNrZHJvcEZpbHRlciYmKGUuc3R5bGUuYmFja2Ryb3BGaWx0ZXI9IiIpO3ZhciBhPWdldENvbXB1dGVkU3R5bGUoZSkuYmFja2Ryb3BGaWx0ZXI7aWYoYSl7ZS5zdHlsZS5iYWNrZHJvcEZpbHRlcj0ibm9uZSIsbC5zdHlsZS5iYWNrZHJvcEZpbHRlcj1hO3ZhciBvPWdldENvbXB1dGVkU3R5bGUodCkuYm9yZGVyUmFkaXVzOyIwcHgiIT09byYmKGwuc3R5bGUuYm9yZGVyUmFkaXVzPW8pfX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19wcm9jZXNzQmFja2dyb3VuZEZvclNoYXBlKGUsdCxsLGEpe2lmKCJzaGFwZSI9PT1sKXt2YXIgbz10JiZnZXRDb21wdXRlZFN0eWxlKHQpLG47aWYobylpZigobyYmby5iYWNrZ3JvdW5kSW1hZ2V8fHQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsIikpJiYiZml4ZWQiPT09by5iYWNrZ3JvdW5kQXR0YWNobWVudCl7ZS5yZW1vdmVDaGlsZCh0LnBhcmVudE5vZGUpLGUuYXBwZW5kQ2hpbGQodCk7dmFyIHI9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImhlaWdodCIpO3I9dDM5Nl9lbGVtX19nZXRIZWlnaHQoZSxyKSxyPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLCJoZWlnaHQiLHIpO3ZhciBpPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJ3aWR0aCIpO2k9dDM5Nl9lbGVtX19nZXRXaWR0aChlLGkpLGk9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUsIndpZHRoIixpKTt2YXIgYz1wYXJzZUZsb2F0KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJ0b3AiKSksXz1wYXJzZUZsb2F0KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJsZWZ0IikpO2Uuc3R5bGUudG9wPWMqYSsicHgiLGUuc3R5bGUubGVmdD1fKmErInB4IixlLnN0eWxlLmhlaWdodD1yKmErInB4IixlLnN0eWxlLndpZHRoPWkqYSsicHgiLGUuc2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIsInllcyIpfX19ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fZ2V0RWxlbWVudFR5cGUoZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7cmV0dXJuIXQmJmUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1ncm91cCIpJiYodD0iZ3JvdXAiKSx0fXdpbmRvdy50Mzk2X2luaXRpYWxTY2FsZXx8KHdpbmRvdy50Mzk2X2luaXRpYWxTY2FsZT1mdW5jdGlvbigpe30pOwoKd2luZG93LlRpbGRhPXdpbmRvdy5UaWxkYXx8e30sZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dmFyIGU9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLHQ9LTEhPT1lLmluZGV4T2YoIm1zaWUiKSYmcGFyc2VJbnQoZS5zcGxpdCgibXNpZSIpWzFdKTtpZig4PT09dHx8OT09PXQpe3ZhciByPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWJ0biIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwociwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKTtlLnF1ZXJ5U2VsZWN0b3IoInRhYmxlIikmJnQmJi0xPT09dC5pbmRleE9mKCIjcG9wdXA6IikmJi0xPT09dC5pbmRleE9mKCIjcHJpY2U6IikmJmUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldC5nZXRBdHRyaWJ1dGUoImhyZWYiKTtlLnByZXZlbnREZWZhdWx0KCksd2luZG93LmxvY2F0aW9uLmhyZWY9dH0pKX0pKX10cnl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxpPWE/YS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY29va2llIik6bnVsbDthJiYibm8iPT09aXx8VGlsZGEuc2F2ZVVUTSgpfWNhdGNoKG4pe312YXIgbz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuciIpO2Z1bmN0aW9uIGMoZSl7dmFyIHQ9ZS50YXJnZXQuY2xvc2VzdCgiYS5qcy1jbGljay1zdGF0Iil8fGUudGFyZ2V0LmNsb3Nlc3QoIi5qcy1jbGljay16ZXJvLXN0YXQiKTtpZihlLnRhcmdldCYmdCl7dmFyIHI9ZS5jdXJyZW50VGFyZ2V0LGE7aWYodC5jbG9zZXN0KCIuciIpIT09cilyZXR1cm47dmFyIGk9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtZXZlbnQtbmFtZSIpLG89dC50ZXh0Q29udGVudCxjPXQuZ2V0QXR0cmlidXRlKCJocmVmIil8fCIiLGQ9dC5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLG47aWYoIWkpaT0iL3RpbGRhL2NsaWNrLyIrKHI/ci5nZXRBdHRyaWJ1dGUoImlkIik6IiIpKyIvP3VybD0iK2M7aWYoVGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzKGksbyksImh0dHAiPT09Yy5zdWJzdHJpbmcoMCw0KSYmLTE9PT1jLmluZGV4T2YoIi50eXBlZm9ybS5jb20vIikpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy5vcGVuKGMsIl9ibGFuayI9PT1kPyJfYmxhbmsiOiJfc2VsZiIpfSksIl9ibGFuayI9PT1kPzA6MzAwKSxlLnByZXZlbnREZWZhdWx0KCksITF9fUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobywoZnVuY3Rpb24oZSl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsYyksZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsYyl9KSk7dmFyIGQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiaW5wdXQuanMtYW1vdW50Iik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkLChmdW5jdGlvbihlKXt2YXIgdD1lLnZhbHVlO3Q9dC5yZXBsYWNlKC8sL2csIi4iKSx0PXBhcnNlRmxvYXQodC5yZXBsYWNlKC9bXjAtOVwuXS9nLCIiKSksZS52YWx1ZT10fSkpfVRpbGRhLnNlbmRFY29tbWVyY2VFdmVudD1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXR8fDA9PT10Lmxlbmd0aClyZXR1cm4hMTtpZih2b2lkIDA9PT1lfHwiYWRkIiE9PWUmJiJyZW1vdmUiIT09ZSYmInB1cmNoYXNlIiE9PWUmJiJkZXRhaWwiIT09ZSlyZXR1cm4hMTtmb3IodmFyIHIsYT0iIixpPTAsbz1bXSxjLGQsbj0iIixtPSIiLGw9IiIsdT0wO3U8dC5sZW5ndGg7dSsrKXthPiIiJiYoYSs9IiwgIiksYSs9KGQ9dFt1XSkubmFtZSxpKz1kLnByaWNlLGM9IiIsdm9pZCAwIT09ZC5vcHRpb25zJiZkLm9wdGlvbnMubGVuZ3RoPjAmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZC5vcHRpb25zLChmdW5jdGlvbihlKXtjKz1lLm9wdGlvbisiOiAiK2UudmFyaWFudCsiOyAifSkpO3ZhciBwPXtuYW1lOmQubmFtZSxwcmljZTpkLnByaWNlLHZhcmlhbnQ6YyxxdWFudGl0eToxfTtkLmlkJiZkLmlkPjAmJihpZD1kLmlkLHAuaWQ9ZC5pZCksZC51aWQmJmQudWlkPjAmJihtPWQudWlkLHAudWlkPWQudWlkKSxkLnJlY2lkJiZkLnJlY2lkPjAmJihuPWQucmVjaWQscC5yZWNpZD1kLnJlY2lkKSxkLmxpZCYmZC5saWQ+MCYmKGw9ZC5saWQscC5saWQ9ZC5saWQpLGQuc2t1JiZkLnNrdT4wJiYocC5za3U9ZC5za3UpLG9bby5sZW5ndGhdPXB9dmFyIHA7ImFkZCIhPT1lJiYicmVtb3ZlIiE9PWV8fChyPSIvdGlsZGEvY2FydC8iK2UrIi8iLG4+MCYmKHIrPSIiK24pLG0+MD9yKz0iLXUiK206bD4wJiYocis9Ii0iK2wpKSwiZGV0YWlsIj09PWUmJihyPSIvdGlsZGEvcHJvZHVjdC9kZXRhaWwvIixtPjA/cis9bSsiLyI6KG4+MCYmKHIrPSJyIituKSxsPjAmJihyKz0iLWwiK2wpKSksInB1cmNoYXNlIj09PWUmJihyPSIvdGlsZGEvcmVjIituKyIvcGF5bWVudC8iKSwocD17ZWNvbW1lcmNlOnt9fSkuZWNvbW1lcmNlW2VdPXtwcm9kdWN0czpvfSxUaWxkYS5zZW5kRXZlbnRUb1N0YXRpc3RpY3MocixhLHAsaSl9LFRpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcz1mdW5jdGlvbihlLHQscixhKXt2YXIgaT0iLyI9PT1lLnN1YnN0cmluZygwLDEpLG89W10sYyxkOyhjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikpJiYoZD1udWxsIT09Yy5nZXRBdHRyaWJ1dGUoImRhdGEtZmItZXZlbnQiKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS1mYi1ldmVudCIpOndpbmRvdy5qUXVlcnkmJnZvaWQgMCE9PWpRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJmYi1ldmVudCIpP2pRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJmYi1ldmVudCIpOm51bGwpO3ZhciBuPSEoIWR8fCJub3NlbmQiIT09ZCksbT1jP2MuZ2V0QXR0cmlidXRlKCJkYXRhLXZrLWV2ZW50Iik6bnVsbDtjJiYobT1udWxsIT09Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdmstZXZlbnQiKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS12ay1ldmVudCIpOndpbmRvdy5qUXVlcnkmJnZvaWQgMCE9PWpRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJ2ay1ldmVudCIpP2pRdWVyeSgiI2FsbHJlY29yZHMiKS5kYXRhKCJ2ay1ldmVudCIpOm51bGwpO3ZhciBsPSEoIW18fCJub3NlbmQiIT09bSksdT0iIixwPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50NzA2Iik7aWYodT1jLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1jdXJyZW5jeSIpP2MuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWN1cnJlbmN5Iik6cCYmcC5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvamVjdC1jdXJyZW5jeS1jb2RlIik/cC5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvamVjdC1jdXJyZW5jeS1jb2RlIik6IlJVQiIscnx8KHI9d2luZG93LmxvY2F0aW9uLmhyZWYpLChhPWE/cGFyc2VGbG9hdChhKTowKT4wKWlmKHdpbmRvdy5kYXRhTGF5ZXJ8fCh3aW5kb3cuZGF0YUxheWVyPVtdKSwtMSE9PWUuaW5kZXhPZigiL3RpbGRhLyIpJiYtMSE9PWUuaW5kZXhPZigiL3BheW1lbnQvIikmJndpbmRvdy50aWxkYUZvcm0mJndpbmRvdy50aWxkYUZvcm0ub3JkZXJJZEZvclN0YXQ+IiIpcj17ZWNvbW1lcmNlOntwdXJjaGFzZTp7YWN0aW9uRmllbGQ6e2lkOndpbmRvdy50aWxkYUZvcm0ub3JkZXJJZEZvclN0YXQscmV2ZW51ZTp3aW5kb3cudGlsZGFGb3JtLmFtb3VudEZvclN0YXR9LHByb2R1Y3RzOndpbmRvdy50aWxkYUZvcm0uYXJQcm9kdWN0c0ZvclN0YXR9fX0sd2luZG93LnRpbGRhRm9ybS50aWxkYXBheW1lbnQmJndpbmRvdy50aWxkYUZvcm0udGlsZGFwYXltZW50LnByb21vY29kZSYmKHIuZWNvbW1lcmNlLnB1cmNoYXNlLmFjdGlvbkZpZWxkLmNvdXBvbj13aW5kb3cudGlsZGFGb3JtLnRpbGRhcGF5bWVudC5wcm9tb2NvZGUpLHIuZXZlbnQ9InB1cmNoYXNlIjtlbHNlIGlmKHImJnIuZWNvbW1lcmNlJiYoci5lY29tbWVyY2UuYWRkJiZyLmVjb21tZXJjZS5hZGQucHJvZHVjdHM/bz1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHM6ci5lY29tbWVyY2UucmVtb3ZlJiZyLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHM/bz1yLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHM6ci5lY29tbWVyY2UuZGV0YWlsJiZyLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMmJihvPXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cyksbyYmby5sZW5ndGg+MCkpe2Zvcih2YXIgcz0wO3M8by5sZW5ndGg7cysrKW9bc10uaWR8fChvW3NdLnVpZD9vW3NdLmlkPW9bc10udWlkOm9bc10uc2t1P29bc10uaWQ9b1tzXS5za3U6b1tzXS5yZWNpZCYmb1tzXS5saWQmJihvW3NdLmlkPW9bc10ucmVjaWQrIl8iK29bc10ubGlkKSk7ci5lY29tbWVyY2UuYWRkJiZyLmVjb21tZXJjZS5hZGQucHJvZHVjdHM/KHIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cz1vLHIuZXZlbnQ9ImFkZFRvQ2FydCIpOnIuZWNvbW1lcmNlLnJlbW92ZSYmci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzPyhyLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHM9byxyLmV2ZW50PSJyZW1vdmVGcm9tQ2FydCIpOnIuZWNvbW1lcmNlLmRldGFpbCYmci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzPyhyLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHM9byxyLmV2ZW50PSJ2aWV3UHJvZHVjdCIpOihpPyhyLmV2ZW50PSJwYWdlVmlldyIsci5ldmVudEFjdGlvbj1lKTpyLmV2ZW50PWUsci50aXRsZT10LHIudmFsdWU9YSl9dm9pZCAwIT09d2luZG93LmRhdGFMYXllciYmKGk/YT4wP3ImJnIuZWNvbW1lcmNlP3dpbmRvdy5kYXRhTGF5ZXIucHVzaChyKTp3aW5kb3cuZGF0YUxheWVyLnB1c2goe2V2ZW50OiJwYWdlVmlldyIsZXZlbnRBY3Rpb246ZSx0aXRsZTp0LHZhbHVlOmEscHJvZHVjdDpyfSk6d2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDoicGFnZVZpZXciLGV2ZW50QWN0aW9uOmUsdGl0bGU6dCxyZWZlcmVyOnJ9KTpyJiZyLmVjb21tZXJjZT93aW5kb3cuZGF0YUxheWVyLnB1c2gocik6d2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDplLGV2ZW50QWN0aW9uOnQsdmFsdWU6YSxyZWZlcmVyOnJ9KSk7dHJ5e3ZhciB2O2lmKHdpbmRvdy5ndGFnVHJhY2tlcklEJiYiZ3RhZyI9PT13aW5kb3cubWFpblRyYWNrZXIpaWYoaSlpZihyJiZyLmV2ZW50KWlmKCJwdXJjaGFzZSI9PT1yLmV2ZW50KXtmb3IodmFyIG89ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHMsdz0wLGc9MDtnPG8ubGVuZ3RoO2crKylpZigiZGVsaXZlcnkiPT09b1tnXS5pZCl7dz1vW2ddO2JyZWFrfWd0YWcoImV2ZW50IiwicHVyY2hhc2UiLHt0cmFuc2FjdGlvbl9pZDpyLmVjb21tZXJjZS5wdXJjaGFzZS5hY3Rpb25GaWVsZC5pZCx2YWx1ZTpwYXJzZUZsb2F0KGEpLnRvRml4ZWQoMiksY3VycmVuY3k6dSxzaGlwcGluZzp3LGl0ZW1zOnIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzfSl9ZWxzZSJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkP2d0YWcoImV2ZW50IiwiYWRkX3RvX2NhcnQiLHtpdGVtczpyLmVjb21tZXJjZS5hZGQucHJvZHVjdHN9KToicmVtb3ZlRnJvbUNhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UucmVtb3ZlP2d0YWcoImV2ZW50IiwicmVtb3ZlX2Zyb21fY2FydCIse2l0ZW1zOnIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0c30pOiJ2aWV3UHJvZHVjdCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5kZXRhaWwmJmd0YWcoImV2ZW50Iiwidmlld19pdGVtIix7aXRlbXM6ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzfSk7ZWxzZSEhd2luZG93Lmd0YWdUcmFja2VySUQmJi0xIT09d2luZG93Lmd0YWdUcmFja2VySUQuaW5kZXhPZigiVUEtIik/Z3RhZygiY29uZmlnIix3aW5kb3cuZ3RhZ1RyYWNrZXJJRCx7cGFnZV90aXRsZTp0LHBhZ2VfcGF0aDplfSk6Z3RhZygiZXZlbnQiLHdpbmRvdy5ndGFnVHJhY2tlcklELHtwYWdlX3RpdGxlOnQscGFnZV9wYXRoOmUsc2VuZF90bzp3aW5kb3cuZ3RhZ1RyYWNrZXJJRH0pO2Vsc2UgZ3RhZygiZXZlbnQiLGUse2V2ZW50X2NhdGVnb3J5OiJ0aWxkYSIsZXZlbnRfbGFiZWw6dCx2YWx1ZTphfSl9Y2F0Y2goeCl7fWlmKHdpbmRvdy5nYSYmInRpbGRhIiE9PXdpbmRvdy5tYWluVHJhY2tlciYmImd0YWciIT09d2luZG93Lm1haW5UcmFja2VyKWlmKGkpaWYociYmci5ldmVudCl7dHJ5e2lmKHdpbmRvdy5UaWxkYS5pc0xvYWRHQUVjb21tZXJjZXx8KHdpbmRvdy5UaWxkYS5pc0xvYWRHQUVjb21tZXJjZT0hMCxnYSgicmVxdWlyZSIsImVjIikpLGdhKCJzZXQiLCJjdXJyZW5jeUNvZGUiLHUpLCJwdXJjaGFzZSI9PT1yLmV2ZW50KXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0cy5sZW5ndGgsZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0c1tnXSxnYSgiZWM6YWRkUHJvZHVjdCIse2lkOmYuaWR8fGcsbmFtZTpmLm5hbWUscHJpY2U6cGFyc2VGbG9hdChmLnByaWNlKS50b0ZpeGVkKDIpLHF1YW50aXR5OmYucXVhbnRpdHl9KTtnYSgiZWM6c2V0QWN0aW9uIiwicHVyY2hhc2UiLHtpZDpyLmVjb21tZXJjZS5wdXJjaGFzZS5hY3Rpb25GaWVsZC5pZCxyZXZlbnVlOnBhcnNlRmxvYXQoYSkudG9GaXhlZCgyKX0pfWVsc2UgaWYoImFkZFRvQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5hZGQpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5sZW5ndGgsZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHNbZ10sZ2EoImVjOmFkZFByb2R1Y3QiLHtpZDpmLmlkfHxnLG5hbWU6Zi5uYW1lLHByaWNlOnBhcnNlRmxvYXQoZi5wcmljZSkudG9GaXhlZCgyKSxxdWFudGl0eTpmLnF1YW50aXR5fSk7Z2EoImVjOnNldEFjdGlvbiIsImFkZCIpfWVsc2UgaWYoInJlbW92ZUZyb21DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLnJlbW92ZSl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzLmxlbmd0aCxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0c1tnXSxnYSgiZWM6YWRkUHJvZHVjdCIse2lkOmYuaWR8fGcsbmFtZTpmLm5hbWUscHJpY2U6cGFyc2VGbG9hdChmLnByaWNlKS50b0ZpeGVkKDIpLHF1YW50aXR5OmYucXVhbnRpdHl9KTtnYSgiZWM6c2V0QWN0aW9uIiwicmVtb3ZlIil9ZWxzZSBpZigidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMubGVuZ3RoLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzW2ddLGdhKCJlYzphZGRQcm9kdWN0Iix7aWQ6Zi5pZHx8ZyxuYW1lOmYubmFtZSxwcmljZTpwYXJzZUZsb2F0KGYucHJpY2UpLnRvRml4ZWQoMikscXVhbnRpdHk6Zi5xdWFudGl0eX0pO2dhKCJlYzpzZXRBY3Rpb24iLCJkZXRhaWwiKX19Y2F0Y2goeCl7fWdhKCJzZW5kIix7aGl0VHlwZToicGFnZXZpZXciLHBhZ2U6ZSx0aXRsZTp0LHBhcmFtczpyfSl9ZWxzZSBnYSgic2VuZCIse2hpdFR5cGU6InBhZ2V2aWV3IixwYWdlOmUsdGl0bGU6dH0pO2Vsc2UgZ2EoInNlbmQiLHtoaXRUeXBlOiJldmVudCIsZXZlbnRDYXRlZ29yeToidGlsZGEiLGV2ZW50QWN0aW9uOmUsZXZlbnRMYWJlbDp0LGV2ZW50VmFsdWU6YX0pO2lmKHdpbmRvdy5tYWluTWV0cmlrYUlkJiZ3aW5kb3cubWFpbk1ldHJpa2FJZD4wJiYiZnVuY3Rpb24iPT10eXBlb2YgeW0paWYoaSl7dmFyIGg9e3RpdGxlOnR9O2E+MD8oaC5wYXJhbXM9e29yZGVyX3ByaWNlOmF9LHUmJihoLnBhcmFtcy5jdXJyZW5jeT11KSx5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwiaGl0IixlLGgpKTp5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwiaGl0IixlLGgpfWVsc2UgYT4wPyhoPXtvcmRlcl9wcmljZTphfSx1JiYoaC5jdXJyZW5jeT11KSx5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwicmVhY2hHb2FsIixlLGgpKTp5bSh3aW5kb3cubWFpbk1ldHJpa2FJZCwicmVhY2hHb2FsIixlKTtpZih3aW5kb3cubWFpbk1ldHJpa2E+IiImJndpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdJiYoaT9hPjA/d2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0uaGl0KGUse3RpdGxlOnQsb3JkZXJfcHJpY2U6YSxwYXJhbXM6cn0pOndpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLmhpdChlLHt0aXRsZTp0fSk6YT4wP3dpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLnJlYWNoR29hbChlLHt0aXRsZTp0LHBhcmFtczpyLG9yZGVyX3ByaWNlOmF9KTp3aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXS5yZWFjaEdvYWwoZSx7dGl0bGU6dCxyZWZlcmVyOnJ9KSksdm9pZCAwIT09d2luZG93LmZicSYmITE9PT1uKXRyeXtpZihpKWlmKC0xPT09ZS5pbmRleE9mKCJ0aWxkYS8iKXx8LTE9PT1lLmluZGV4T2YoIi9wYXltZW50LyIpJiYtMT09PWUuaW5kZXhPZigiL3N1Ym1pdHRlZC8iKSlpZihyJiZyLmV2ZW50JiZhPjApaWYoImFkZFRvQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5hZGQpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0c1tnXSxrLnB1c2goZi5pZHx8Zi51aWR8fGYubmFtZSk7d2luZG93LmZicSgidHJhY2siLCJBZGRUb0NhcnQiLHtjb250ZW50X2lkczprLGNvbnRlbnRfdHlwZToicHJvZHVjdCIsdmFsdWU6YSxjdXJyZW5jeTp1fSl9ZWxzZSBpZigidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHNbZ10say5wdXNoKGYuaWR8fGYudWlkfHxmLm5hbWUpO3dpbmRvdy5mYnEoInRyYWNrIiwiVmlld0NvbnRlbnQiLHtjb250ZW50X2lkczprLGNvbnRlbnRfdHlwZToicHJvZHVjdCIsdmFsdWU6YSxjdXJyZW5jeTp1fSl9ZWxzZSBlLmluZGV4T2YoInRpbGRhL3BvcHVwIiksd2luZG93LmZicSgidHJhY2siLCJWaWV3Q29udGVudCIse2NvbnRlbnRfbmFtZTp0LGNvbnRlbnRfY2F0ZWdvcnk6ZX0pO2Vsc2UgZS5pbmRleE9mKCJ0aWxkYS9wb3B1cCIpLHdpbmRvdy5mYnEoInRyYWNrIiwiVmlld0NvbnRlbnQiLHtjb250ZW50X25hbWU6dCxjb250ZW50X2NhdGVnb3J5OmV9KTtlbHNlIGE+MCYmdT93aW5kb3cuZmJxKCJ0cmFjayIsIkluaXRpYXRlQ2hlY2tvdXQiLHtjb250ZW50X25hbWU6dCxjb250ZW50X2NhdGVnb3J5OmUsdmFsdWU6YSxjdXJyZW5jeTp1fSk6d2luZG93LmZicSgidHJhY2siLCJMZWFkIix7Y29udGVudF9uYW1lOnQsY29udGVudF9jYXRlZ29yeTplfSk7ZWxzZSB3aW5kb3cuZmJxKCJ0cmFjayIsZSx7Y29udGVudF9uYW1lOnQsdmFsdWU6YX0pfWNhdGNoKHgpe31pZih2b2lkIDAhPT13aW5kb3cuVksmJnZvaWQgMCE9PXdpbmRvdy5WSy5SZXRhcmdldGluZyYmITE9PT1sKXRyeXtpZihpKXt2YXIgYyxfPShjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikpP2MuZ2V0QXR0cmlidXRlKCJkYXRhLXZrLXByaWNlLWxpc3QtaWQiKTpudWxsLGI9XyYmcGFyc2VJbnQoXyl8fDAsVD0iIixBPSExLEYsRixGLEYsRjtpZihyJiZyLmV2ZW50KWlmKEE9e3Byb2R1Y3RzOltdLGN1cnJlbmN5X2NvZGU6IiIsdG90YWxfcHJpY2U6MH0sInB1cmNoYXNlIj09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLnB1cmNoYXNlKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0iaW5pdF9jaGVja291dCJ9ZWxzZSBUPSJ0LXB1cmNoYXNlIjtlbHNlIGlmKCJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzW2ddLEEucHJvZHVjdHMucHVzaCh7aWQ6Zi5pZHx8Zi51aWR8fGYubmFtZSxwcmljZTpmLnByaWNlP2YucHJpY2U6MH0pLEEudG90YWxfcHJpY2U9YTtUPSJhZGRfdG9fY2FydCJ9ZWxzZSBUPSJ0LWFkZC10by1jYXJ0IixyLmVjb21tZXJjZS5hZGRbMF0mJnIuZWNvbW1lcmNlLmFkZFswXS51aWQmJihUKz0iLSIrci5lY29tbWVyY2UuYWRkWzBdLnVpZCk7ZWxzZSBpZigidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzW2ddLEEucHJvZHVjdHMucHVzaCh7aWQ6Zi5pZHx8Zi51aWR8fGYubmFtZSxwcmljZTpmLnByaWNlP2YucHJpY2U6MH0pLEEudG90YWxfcHJpY2U9YTtUPSJ2aWV3X3Byb2R1Y3QifWVsc2UgVD0idC12aWV3LXByb2R1Y3QiLHIuZWNvbW1lcmNlLmRldGFpbFswXSYmci5lY29tbWVyY2UuZGV0YWlsWzBdLnVpZCYmKFQrPSItIityLmVjb21tZXJjZS5kZXRhaWxbMF0udWlkKTtlbHNlIGlmKCJyZW1vdmVGcm9tQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5yZW1tb3ZlKWlmKGE+MCYmYj4wKXt2YXIgZjtBLmN1cnJlbmN5X2NvZGU9dTtmb3IodmFyIHk9ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzW2ddLEEucHJvZHVjdHMucHVzaCh7aWQ6Zi5pZHx8Zi51aWR8fGYubmFtZSxwcmljZTpmLnByaWNlP2YucHJpY2U6MH0pLEEudG90YWxfcHJpY2U9YTtUPSJyZW1vdmVfZnJvbV9jYXJ0In1lbHNlIFQ9InQtcmVtb3ZlLXByb2R1Y3QiLHIuZWNvbW1lcmNlLnJlbW92ZVswXSYmci5lY29tbWVyY2UucmVtb3ZlWzBdLnVpZCYmKFQrPSItIityLmVjb21tZXJjZS5yZW1vdmVbMF0udWlkKTtlbHNlIFQ9ci5ldmVudDtlbHNlIGlmKC0xIT09ZS5pbmRleE9mKCJ0aWxkYS8iKSYmLTEhPT1lLmluZGV4T2YoIi9wYXltZW50LyIpKVQ9InQtcHVyY2hhc2UtIisoRj0oRj0oRj1lLnJlcGxhY2UoIi90aWxkYS8iLCIiKSkucmVwbGFjZSgidGlsZGEvIiwiIikpLnJlcGxhY2UoIi9wYXltZW50LyIsIiIpKTtlbHNlIGlmKC0xIT09ZS5pbmRleE9mKCJ0aWxkYS8iKSYmLTEhPT1lLmluZGV4T2YoIi9zdWJtaXR0ZWQvIikpVD0idC1sZWFkLSIrKEY9KEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoInRpbGRhLyIsIiIpKS5yZXBsYWNlKCIvc3VibWl0dGVkLyIsIiIpKTtlbHNlIGlmKC0xIT09ZS5pbmRleE9mKCJ0aWxkYS9wb3B1cCIpKVQ9InQtIisoRj0oRj1lLnJlcGxhY2UoIi90aWxkYS8iLCIiKSkucmVwbGFjZSgiLyIsIi0iKSk7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvY2xpY2siKSlUPSJ0LSIrKEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoIi8iLCItIikpO2Vsc2UgVD0idC0iKyhGPWUucmVwbGFjZSgiLyIsIi0iKSk7Yj4wJiZBJiZBLmN1cnJlbmN5X2NvZGU/KFZLLlJldGFyZ2V0aW5nLkV2ZW50KCJwdXJjaGFzZSIpLFZLLlJldGFyZ2V0aW5nLlByb2R1Y3RFdmVudChiLFQsQSkpOihWSy5SZXRhcmdldGluZy5FdmVudChUKSwidC1wdXJjaGFzZSI9PT1ULnN1YnN0cmluZygwLDEwKT9WSy5Hb2FsKCJwdXJjaGFzZSIpOiJ0LWxlYWQiPT09VC5zdWJzdHJpbmcoMCw2KSYmVksuR29hbCgibGVhZCIpKX1lbHNlIFZLLlJldGFyZ2V0aW5nLkV2ZW50KGUpfWNhdGNoKHgpe31pZih3aW5kb3cubWFpbk1haWxydUlkPiIwIil7dmFyIEU9d2luZG93Ll90bXJ8fCh3aW5kb3cuX3Rtcj1bXSk7aT9hPjA/RS5wdXNoKHtpZDoiIit3aW5kb3cubWFpbk1haWxydUlkLHR5cGU6InBhZ2VWaWV3Iix1cmw6ZSx2YWx1ZTphLHN0YXJ0OihuZXcgRGF0ZSkuZ2V0VGltZSgpfSk6RS5wdXNoKHtpZDoiIit3aW5kb3cubWFpbk1haWxydUlkLHR5cGU6InBhZ2VWaWV3Iix1cmw6ZSxzdGFydDoobmV3IERhdGUpLmdldFRpbWUoKX0pOmE+MD9FLnB1c2goe2lkOiIiK3dpbmRvdy5tYWluTWFpbHJ1SWQsdHlwZToicmVhY2hHb2FsIixnb2FsOmUsdmFsdWU6YX0pOkUucHVzaCh7aWQ6IiIrd2luZG93Lm1haW5NYWlscnVJZCx0eXBlOiJyZWFjaEdvYWwiLGdvYWw6ZX0pfSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudGlsZGFzdGF0JiYoaT8oZS5pbmRleE9mKCJwYXltZW50Iik+MCYmZS5pbmRleE9mKCJ0aWxkYS9mb3JtIik+LTEmJihlPWUucmVwbGFjZSgidGlsZGEvZm9ybSIsInRpbGRhL3JlYyIpKSx3aW5kb3cudGlsZGFzdGF0KCJwYWdldmlldyIse3BhZ2U6ZX0pKTp3aW5kb3cudGlsZGFzdGF0KCJwYWdldmlldyIse3BhZ2U6Ii90aWxkYS9ldmVudC8iK2V9KSl9LFRpbGRhLnNhdmVVVE09ZnVuY3Rpb24oKXt0cnl7dmFyIGU9d2luZG93LmxvY2F0aW9uLmhyZWYsdD0iIixyPSIiO2lmKC0xIT09ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInV0bV8iKSYmInN0cmluZyI9PXR5cGVvZih0PSh0PShlPWUudG9Mb3dlckNhc2UoKSkuc3BsaXQoIj8iKSlbMV0pKXt2YXIgYSxpPXQuc3BsaXQoIiYiKTtmb3IodmFyIG8gaW4gaSkiYW1wOyI9PT0oYT1pW29dLnNwbGl0KCI9IikpWzBdLnN1YnN0cmluZygwLDQpJiYoYVswXT1hWzBdLnN1YnN0cmluZyg0KSksInV0bV8iPT09YVswXS5zdWJzdHJpbmcoMCw0KSYmKHI9citpW29dKyJ8fHwiKTtpZihyLmxlbmd0aD4wKXt2YXIgYz1uZXcgRGF0ZTtjLnNldERhdGUoYy5nZXREYXRlKCkrMzApLGRvY3VtZW50LmNvb2tpZT0iVElMREFVVE09IitlbmNvZGVVUklDb21wb25lbnQocikrIjsgcGF0aD0vOyBleHBpcmVzPSIrYy50b1VUQ1N0cmluZygpfX19Y2F0Y2goZCl7fX0sImxvYWRpbmciIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9lKCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZSl9KCksRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc3x8KEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXM9RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUubW96TWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm9NYXRjaGVzU2VsZWN0b3IpLEVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3R8fChFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzO3QmJjE9PT10Lm5vZGVUeXBlOyl7aWYoRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcy5jYWxsKHQsZSkpcmV0dXJuIHQ7dD10LnBhcmVudEVsZW1lbnR8fHQucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH0pOwoKIWZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtmdW5jdGlvbiB0KCl7dmFyIGU9TWF0aC5mbG9vcig4OTk5OTkqTWF0aC5yYW5kb20oKSkrMWU1O3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpKyIuIitlfWZ1bmN0aW9uIG4oZSl7dmFyIHQ9ZS5yZXBsYWNlKC8oW1wuJD8qfHt9XChcKVxbXF1cXFwvXCteXSkvZywiXFwkMSIpLG49bmV3IFJlZ0V4cCgiKD86Xnw7ICkiK3QrIj0oW147XSopIiksbz1kb2N1bWVudC5jb29raWUubWF0Y2gobik7aWYobylyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KG9bMV0pfWZ1bmN0aW9uIG8oZSx0LG4pe3ZhciBvPW4uZXhwaXJlcztpZighbylyZXR1cm4hMTtpZigibnVtYmVyIj09dHlwZW9mIG8pe3ZhciBpPShuZXcgRGF0ZSkuZ2V0VGltZSgpKzFlMypvOyhvPW5ldyBEYXRlKGkpKS50b1VUQ1N0cmluZyYmKG4uZXhwaXJlcz1vLnRvVVRDU3RyaW5nKCkpfXZhciBhPWUrIj0iKyh0PWVuY29kZVVSSUNvbXBvbmVudCh0KSk7Zm9yKHZhciByIGluIG4pYSs9IjsgIityLCEwIT09bltyXSYmKGErPSI9IituW3JdKTtkb2N1bWVudC5jb29raWU9YX1mdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9ITA7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJubyBjYWxsYmFjayBnaXZlbiIpO2Z1bmN0aW9uIG4oKXt0fHxlKHQ9ITApfWZ1bmN0aW9uIG8oKXt0JiZlKHQ9ITEpfSJoaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLChmdW5jdGlvbigpeyhkb2N1bWVudC5oaWRkZW4/bzpuKSgpfSkpLCJtb3pIaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1venZpc2liaWxpdHljaGFuZ2UiLChmdW5jdGlvbigpeyhkb2N1bWVudC5tb3pIaWRkZW4/bzpuKSgpfSkpLCJ3ZWJraXRIaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndlYmtpdHZpc2liaWxpdHljaGFuZ2UiLChmdW5jdGlvbigpeyhkb2N1bWVudC53ZWJraXRIaWRkZW4/bzpuKSgpfSkpLCJtc0hpZGRlbiJpbiBkb2N1bWVudCYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibXN2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQubXNIaWRkZW4/bzpuKSgpfSkpLCJvbmZvY3VzaW4iaW4gZG9jdW1lbnQmJihkb2N1bWVudC5vbmZvY3VzaW49bixkb2N1bWVudC5vbmZvY3Vzb3V0PW8pLHdpbmRvdy5vbnBhZ2VzaG93PXdpbmRvdy5vbmZvY3VzPW4sd2luZG93Lm9ucGFnZWhpZGU9d2luZG93Lm9uYmx1cj1vfWZ1bmN0aW9uIHIoKXt2YXIgZT13aW5kb3cucGFnZVlPZmZzZXQsdD13aW5kb3cuaW5uZXJIZWlnaHQsbj1NYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCksbz0wLGk9MDt2PSEwO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0LWhlYWRlciIpLHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQtZm9vdGVyIiksZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFjb3B5Iik7YSYmKG89YS5vZmZzZXRIZWlnaHQpLHImJihpPXIub2Zmc2V0SGVpZ2h0KSxkJiYoaSs9ZC5vZmZzZXRIZWlnaHQpO3ZhciBjPU1hdGguZmxvb3IoMTAwKihlLW8rdCkvKG4tby1pKSk7aWYoIShjPDEwKSlmb3IodmFyIHM9WzEwLDI1LDUwLDc1LDkwXSxsPTA7bDxzLmxlbmd0aDtsKyspe3ZhciB1PXNbbF0sZz1zLmxlbmd0aC0xO2lmKDA9PT1sJiZjPj11JiYhd1sicCIrdV0pbS5wYWdlPSIvdGlsZGEvc2Nyb2xsLyIrdSsiLyIsd2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciKSx3WyJwIit1XT0hMDtlbHNlIGlmKGM+PXUtMSl7aWYoMD09PXdbInAiK3VdKXttLnBhZ2U9Ii90aWxkYS9zY3JvbGwvIit1KyIvIix3aW5kb3cudGlsZGFzdGF0KCJwYWdldmlldyIpLHdbInAiK3VdPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHdbInAiK3VdKSx3WyJwIit1XT0tMX0pLDVlMyk7YnJlYWt9aWYoKGwhPT1nJiZjPHNbbCsxXXx8bD09PWcpJiYtMT09PXdbInAiK3VdKXt3WyJwIit1XT0wO2JyZWFrfX19fWZ1bmN0aW9uIGQoKXt2YXIgZT0wPT09d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluZGV4T2YoInd3dy4iKT93aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuc2xpY2UoNCk6d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO3JldHVybiBlLmxhc3RJbmRleE9mKCIuIik9PT1lLmxlbmd0aC0xJiYoZT1lLnNsaWNlKDAsLTEpKSxlK3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX1mdW5jdGlvbiBjKGUpe2Zvcih2YXIgdD1BcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7bisrKXRbbl09bjtyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNoYXJDb2RlQXQodCkudG9TdHJpbmcoMTYpfSkpLmpvaW4oIiIpfWZ1bmN0aW9uIHMoKXt2YXIgZT0obmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQ/ImNUIjoiY0YiKSsifCIrKG5hdmlnYXRvci5kZXZpY2VNZW1vcnk/ImRtIituYXZpZ2F0b3IuZGV2aWNlTWVtb3J5OiJkbSIpKyJ8IisobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k/ImhjIituYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeToiaGMiKSsifCIrKG5hdmlnYXRvci5sYW5ndWFnZXM/ImwiK25hdmlnYXRvci5sYW5ndWFnZXMuam9pbigiLCIpOiJsIikrInwiO2lmKG5hdmlnYXRvci5wbGF0Zm9ybXx8bmF2aWdhdG9yLmFwcE5hbWU/ZSs9KG5hdmlnYXRvci5wbGF0Zm9ybT8icCIrbmF2aWdhdG9yLnBsYXRmb3JtOiJwIikrInwiKyhuYXZpZ2F0b3IudmVuZG9yPyJ2IituYXZpZ2F0b3IudmVuZG9yOiJ2IikrInwiKyhuYXZpZ2F0b3IuYXBwQ29kZU5hbWU/ImEiK25hdmlnYXRvci5hcHBDb2RlTmFtZToiYSIpKyJ8IisobmF2aWdhdG9yLmFwcE5hbWU/Im4iK25hdmlnYXRvci5hcHBOYW1lOiJuIikrInwiOmUrPShuYXZpZ2F0b3IudXNlckFnZW50PyJ1YSIrbmF2aWdhdG9yLnVzZXJBZ2VudDoidWEiKSsifCIsbmF2aWdhdG9yLnBsdWdpbnMpe3ZhciB0LG4sbz0iIjtmb3Iobj1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg+MjA/MjA6bmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoLHQ9MDt0PG47dCsrKW5hdmlnYXRvci5wbHVnaW5zW3RdJiZuYXZpZ2F0b3IucGx1Z2luc1t0XS5maWxlbmFtZT9vKz1uYXZpZ2F0b3IucGx1Z2luc1t0XS5maWxlbmFtZTpuYXZpZ2F0b3IucGx1Z2luc1t0XSYmbmF2aWdhdG9yLnBsdWdpbnNbdF0ubmFtZSYmKG8rPW5hdmlnYXRvci5wbHVnaW5zW3RdLm5hbWUpO2UrPSJwbCIrbysifCJ9cmV0dXJuIGUrPSJwciIrd2luZG93LmRldmljZVBpeGVsUmF0aW8rInwiLGUrPSJ3Iisoc2NyZWVuJiZzY3JlZW4ud2lkdGg/c2NyZWVuLndpZHRoOndpbmRvdy5pbm5lcldpZHRoKSsiaCIrKHNjcmVlbiYmc2NyZWVuLmhlaWdodD9zY3JlZW4uaGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodCkrInwiLGUrPSJjRCIrKHNjcmVlbi5jb2xvckRlcHRoP3NjcmVlbi5jb2xvckRlcHRoOiIiKSsifCIsZSs9InRPIisobmV3IERhdGUpLmdldFRpbWV6b25lT2Zmc2V0KCkrInwiLGU9YyhlKz0ibVQiKyh2b2lkIDAhPT1uYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM/bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzOnZvaWQgMCE9PW5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzP25hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzOiIiKSsifCIpfWZ1bmN0aW9uIGwoKXt4PW4oInRpbGRhdWlkIiksRT1uKCJ0aWxkYXNpZCIpLGg/KHh8fCh4PSJzaW1wbGUiKSxFfHwoRT0ic2ltcGxlIikpOih4fHwoeD10KCkpLEV8fChFPXQoKSkpfWZ1bmN0aW9uIHUoKXt2YXIgZTtofHwobygidGlsZGF1aWQiLHgse2V4cGlyZXM6Nzc3NmUzLHBhdGg6Ii8ifSksbygidGlsZGFzaWQiLEUse2V4cGlyZXM6MTgwMCxwYXRoOiIvIn0pKX1mdW5jdGlvbiBnKHQpe2lmKG0udXNlcl9hZ2VudD4iIiYmLTEhPW0udXNlcl9hZ2VudC5pbmRleE9mKCJib3QiKSlyZXR1cm4hMTtpZigiaHR0cDoiIT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wmJiJodHRwczoiIT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wpcmV0dXJuIGNvbnNvbGUubG9nKCJUaWxkYVN0YXQ6IGNhbm5vdCB3b3JrIG9uIGxvY2FsIHBhZ2UiKSwhMTt2YXIgbjtsKCksdSgpLG0ucGFnZT1kKCksbS5yZWZlcnJlcj1kb2N1bWVudC5yZWZlcnJlcnx8IiIsbS51c2VyaWQ9eCxtLnNlc3Npb25pZD1FLG0udXNlcl9hZ2VudD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxtLnVzZXJfbGFuZ3VhZ2U9d2luZG93Lm5hdmlnYXRvci51c2VyTGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UsZSYmKG0ucHJvamVjdGlkPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXByb2plY3QtaWQiKXx8IjAiLG0ucGFnZWlkPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXBhZ2UtaWQiKXx8IjAiLG0ucGFnZWFsaWFzPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXBhZ2UtYWxpYXMiKXx8IiIsbS5mb3Jtc2tleT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1mb3Jtc2tleSIpfHwiIiksbS5wYXJhbXM9e307dHJ5e249ZGVjb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpfWNhdGNoKGMpe249d2luZG93LmxvY2F0aW9uLnNlYXJjaH1pZihuPiI/IiYmKG0ucGFnZXF1ZXJ5PW4uc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCksfm0ucGFnZXF1ZXJ5LmluZGV4T2YoInV0bV8iKSkpe3ZhciBvLGk9bS5wYWdlcXVlcnkuc3BsaXQoIiYiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKGUpeyhvPWUuc3BsaXQoIj0iKSkubGVuZ3RoPjE/InV0bV9yZWZlcnJlciIhPT1vWzBdfHxtLnJlZmVycmVyJiYhfm0ucmVmZXJyZXIuaW5kZXhPZigib2hpbzgudiIpP20ucGFyYW1zW29bMF1dPW9bMV06bS5yZWZlcnJlcj1vWzFdOm0ucGFyYW1zW29bMF1dPSIifSkpfXZhciByPSExO2lmKC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKHI9ITApLG0uaXNtb2JpbGU9cixkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFzdGF0c2NyaXB0IikmJihtLnRpbGRhc3RhdGNvZGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhc3RhdHNjcmlwdCIpLmtleSksayl0cnl7YSgoZnVuY3Rpb24oZSl7dj0hIWV9KSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3Y9ITB9KSwxZTMpKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJrZXlwcmVzcyIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSl9Y2F0Y2goYyl7fW0uZmluZ2VycHJpbnQ9cygpLFQ9ITB9ZnVuY3Rpb24gcChlKXt2YXIgdD0iaHR0cHM6Ly9zdGF0LnRpbGRhYXBpLiIrTCgpKyIvZXZlbnQvIixpO2h8fChuKCJ0aWxkYXNpZCIpfHwiIikhPW0uc2Vzc2lvbmlkJiZvKCJ0aWxkYXNpZCIsbS5zZXNzaW9uaWQse2V4cGlyZXM6MTgwMCxwYXRoOiIvIn0pOyIiPT09bS5yZWZlcnJlciYmKG0ucmVmZXJyZXI9bigicHJldmlvdXNVcmwiKXx8IiIpLG0udGlsZGF1dG09bigiVElMREFVVE0iKXx8IiIsbS5wYWdlfHwoY29uc29sZS5sb2coIlRpbGRhU3RhdDogcGFnZSBlbXB0eSIpLG0ucGFnZT1kKCksd2luZG93LmxvY2F0aW9uLmhhc2gmJjA9PT13aW5kb3cubG9jYXRpb24uaGFzaC5pbmRleE9mKCIjISIpJiYobS5wYWdlKz13aW5kb3cubG9jYXRpb24uaGFzaCkpLCIvIj09PW0ucGFnZS5zdWJzdHJpbmcoMCwxKSYmKG0ucGFnZT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUrbS5wYWdlKTt2YXIgYT1mKG0pLHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3Iub3BlbigiUE9TVCIsdCwhMCksci53aXRoQ3JlZGVudGlhbHM9ITEsci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiKSxyLm9uZXJyb3I9ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcigiVGlsZGFTdGF0OiBmYWlsIHBhZ2V2aWV3ICIpLGNvbnNvbGUuZXJyb3IoZSl9LHIudGltZW91dD0zZTMsci5zZW5kKGEpLG0ucGFnZSYmLTE9PT1tLnBhZ2UuaW5kZXhPZigidGlsZGEvc2Nyb2xsIikmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL3JlYWR0aW1lIikmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL2NsaWNrIikmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL2Nvb2tpZWVuYWJsZWQiKSYmKG0ucmVmZXJyZXI9bS5wYWdlLGh8fG8oInByZXZpb3VzVXJsIixtLnBhZ2Use3BhdGg6Ii8iLGV4cGlyZXM6MTgwMH0pKSxtLnBhZ2U9IiIsd2luZG93LnRpbGRhc3RhdGxvYWQ9ITB9ZnVuY3Rpb24gZihlKXt2YXIgdD0iIjtmb3IodmFyIG4gaW4gZSlpZigiIiE9dCYmIm9iamVjdCIhPXR5cGVvZiBlW25dJiYodCs9IiYiKSwib2JqZWN0Ij09dHlwZW9mIGVbbl0pe2lmKE9iamVjdC5rZXlzKGVbbl0pLmxlbmd0aClmb3IodmFyIG8gaW4gZVtuXSl0Kz0iJiIrbisiWyIrbysiXT0iK2VuY29kZVVSSUNvbXBvbmVudChlW25dW29dKX1lbHNlIHQrPW4rIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW25dKTtyZXR1cm4gdH13aW5kb3cudGlsZGFzdGF0PWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuITE7aWYoImNyZWF0ZSIhPT1lJiYhVClyZXR1cm4gc2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cudGlsZGFzdGF0KGUsdCl9KSwxZTMpLCExO3N3aXRjaCh0JiZpKG0sdCksZSl7Y2FzZSJjcmVhdGUiOmcodCk7YnJlYWs7Y2FzZSJwYWdldmlldyI6cCh0KTticmVhaztjYXNlInJlYWR0aW1lIjprJiYodiYmKG0ucGFnZT0iL3RpbGRhL3JlYWR0aW1lLyIsdj0hMSxwKHQpKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy50aWxkYXN0YXQoInJlYWR0aW1lIil9KSwxNWUzKSk7YnJlYWs7Y2FzZSJzY3JvbGwiOmsmJiJmdW5jdGlvbiI9PXR5cGVvZiB0X3Rocm90dGxlJiZ3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3IoKX0pLDFlMykpO2JyZWFrO2Nhc2UiY29va2llZW5hYmxlZCI6aD0hMSxsKCksdSgpLG0udXNlcmlkPXgsbS5zZXNzaW9uaWQ9RSxtLnBhZ2U9Ii90aWxkYS9jb29raWVlbmFibGVkLyIscCh0KTticmVhaztjYXNlImZpbmdlcnByaW50IjpyZXR1cm4gcygpfX07dmFyIG09e30sdz17cDEwOjAscDI1OjAscDUwOjAscDc1OjAscDkwOjB9LHY9ITAsaD0ibm8iPT09d2luZG93LnRpbGRhc3RhdGNvb2tpZSx5O2lmKCh3aW5kb3cudGlsZGFzdGF0Y29va2llfHxlJiYoaD0ibm8iPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY29va2llIikpLCJ5ZXMiPT09d2luZG93LnRpbGRhc3RhdGNvb2tpZWdkcHImJiExPT09aCkmJihoPSEwLCEwPT09bigidF9jb29raWVzQ29uc2VudEdpdmVuIikpKXt2YXIgYj1uKCJ0X2Nvb2tpZXNDYXRlZ29yaWVzIik7InN0cmluZyI9PXR5cGVvZiBiJiZiLmluZGV4T2YoImFuYWx5dGljcyIpPi0xJiYoaD0hMSl9dmFyIGs9InllcyI9PT13aW5kb3cudGlsZGFzdGF0c2Nyb2xsO3ZvaWQgMD09PXdpbmRvdy50aWxkYXN0YXRzY3JvbGwmJmUmJihrPSJ5ZXMiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtc3RhdC1zY3JvbGwiKSk7dmFyIHg9IiIsRT0iIixUPSExO3dpbmRvdy50aWxkYXN0YXQoImNyZWF0ZSIpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7d2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciKSx3aW5kb3cudGlsZGFzdGF0KCJyZWFkdGltZSIpLHdpbmRvdy50aWxkYXN0YXQoInNjcm9sbCIpfSksNTAwKTt2YXIgaj1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtpZigoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cudF9qc2Vycm9ycyYmd2luZG93LnRfanNlcnJvcnMubGVuZ3RoPjB8fCJvYmplY3QiPT10eXBlb2Ygd2luZG93LnRfY2RuZXJyb3JzJiZ3aW5kb3cudF9jZG5lcnJvcnMubGVuZ3RoPjB8fCJvYmplY3QiPT10eXBlb2Ygd2luZG93LnRfYWpheGVycm9ycyYmd2luZG93LnRfYWpheGVycm9ycy5sZW5ndGg+MCkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0X2Vycm9yc19fc2VuZEpTRXJyb3JzKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLnNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIitMKCkrIi9qcy90aWxkYS1lcnJvcnMtMS4wLm1pbi5qcyIsZS5hc3luYz0hMCxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpLGNsZWFySW50ZXJ2YWwoail9fSksMmUzKSxPPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImxpbmtbcmVsKj0nc2hvcnRjdXQgaWNvbiddIiksXz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJsaW5rW2hyZWYqPSd0aWxkYS53cy9wcm9qZWN0J10iKS5sZW5ndGg7X3x8KF89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgibGlua1tocmVmKj0nd3MudGlsZGFjZG4uY29tL3Byb2plY3QnXSIpLmxlbmd0aCk7dmFyIEE9Tz9PLmdldEF0dHJpYnV0ZSgiaHJlZiIpOiIiLEg9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W3NyYyo9J2pzL3RpbGRhLXNjcmlwdHMnXSIpLEM9ISFIJiYtMT09PUguc3JjLmluZGV4T2YoInRpbGRhY2RuIiksSTsoQ3x8KEM9TyYmLTEhPT1BLmluZGV4T2YoInN0YXRpYy50aWxkYWNkbi4iK0woKSkmJi0xIT09QS5pbmRleE9mKCJ0aWxkYS4iKSYmLTEhPT1BLmluZGV4T2YoIi90aWxkYWZhdmljb24uaWNvIikmJiFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0YWJsZSNhbGxyZWNvcmRzIikmJiEoLTEhPT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUuaW5kZXhPZigiLnRpbGRhLndzIikpJiYhXyksdm9pZCAwPT09bmF2aWdhdG9yLnNlbmRCZWFjb258fC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxDKXx8MT09PU1hdGguZmxvb3IoNSpNYXRoLnJhbmRvbSgpKSYmUygoZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLmFzeW5jPSEwLGUudHlwZT0idGV4dC9qYXZhc2NyaXB0IixlLnNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIitMKCkrIi9qcy90aWxkYS1wZXJmb3JtYW5jZS0xLjAubWluLmpzIixkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixlKX0pKTtmdW5jdGlvbiBTKGUpeyJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP2UoKTp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZSl9ZnVuY3Rpb24gTCgpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksdDtyZXR1cm4gZSYmZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcm9vdC16b25lIil8fCJjb20ifX0oKTsKCnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCczMTI1NTUwNTAxJyk7fSk7fSk7CihmdW5jdGlvbigpIHt2YXIgYXJ0Ym9hcmQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3JlYzMwMDAxMDczMDEgLnQzOTZfX2FydGJvYXJkJyk7aWYoIWFydGJvYXJkKSByZXR1cm47dmFyIGlzRHJhZ2dpbmc9ZmFsc2U7dmFyIHN0YXJ0WD0wO3ZhciBzY3JvbGxMZWZ0PTA7dmFyIHZlbG9jaXR5PTA7dmFyIGxhc3RYPTA7dmFyIGxhc3RUaW1lPTA7dmFyIHJhZklkPW51bGw7ZnVuY3Rpb24gb25GcmFtZSgpIHtpZighaXNEcmFnZ2luZyYmTWF0aC5hYnModmVsb2NpdHkpPjAuNSkge2FydGJvYXJkLnNjcm9sbExlZnQtPXZlbG9jaXR5O3ZlbG9jaXR5Kj0wLjk0O3JhZklkPXJlcXVlc3RBbmltYXRpb25GcmFtZShvbkZyYW1lKTt9IGVsc2Uge3JhZklkPW51bGw7dmVsb2NpdHk9MDt9fQpmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7aWYoZS5idXR0b24hPT0wKSByZXR1cm47aXNEcmFnZ2luZz10cnVlO3N0YXJ0WD1lLnBhZ2VYO3Njcm9sbExlZnQ9YXJ0Ym9hcmQuc2Nyb2xsTGVmdDt2ZWxvY2l0eT0wO2xhc3RYPWUucGFnZVg7bGFzdFRpbWU9RGF0ZS5ub3coKTthcnRib2FyZC5jbGFzc0xpc3QuYWRkKCdpcy1kcmFnZ2luZycpO2UucHJldmVudERlZmF1bHQoKTt9CmZ1bmN0aW9uIG9uTW91c2VNb3ZlKGUpIHtpZighaXNEcmFnZ2luZykgcmV0dXJuO3ZhciB4PWUucGFnZVg7YXJ0Ym9hcmQuc2Nyb2xsTGVmdD1zY3JvbGxMZWZ0ICsoc3RhcnRYIC0geCkqMS4yO3ZhciBub3c9RGF0ZS5ub3coKTt2YXIgZHQ9bm93IC0gbGFzdFRpbWU7aWYoZHQ+MCkgdmVsb2NpdHk9KHggLSBsYXN0WCkvZHQqMTY7bGFzdFg9eDtsYXN0VGltZT1ub3c7fQpmdW5jdGlvbiBvbk1vdXNlVXAoKSB7aWYoIWlzRHJhZ2dpbmcpIHJldHVybjtpc0RyYWdnaW5nPWZhbHNlO2FydGJvYXJkLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRyYWdnaW5nJyk7aWYoTWF0aC5hYnModmVsb2NpdHkpPjEmJiFyYWZJZCkge3JhZklkPXJlcXVlc3RBbmltYXRpb25GcmFtZShvbkZyYW1lKTt9fQphcnRib2FyZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLG9uTW91c2VEb3duKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxvbk1vdXNlTW92ZSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLG9uTW91c2VVcCk7dmFyIHRYPTAsdFNMPTA7YXJ0Ym9hcmQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsZnVuY3Rpb24oZSkge3RYPWUudG91Y2hlc1swXS5wYWdlWDt0U0w9YXJ0Ym9hcmQuc2Nyb2xsTGVmdDt9LHtwYXNzaXZlOnRydWV9KTthcnRib2FyZC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLGZ1bmN0aW9uKGUpIHthcnRib2FyZC5zY3JvbGxMZWZ0PXRTTCArKHRYIC0gZS50b3VjaGVzWzBdLnBhZ2VYKSoxLjE7fSx7cGFzc2l2ZTp0cnVlfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZSkge2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xvc2VzdCYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5jbG9zZXN0KCcjcmVjMzAwMDEwNzMwMScpKSByZXR1cm47fSk7dmFyIGltZ3M9YXJ0Ym9hcmQucXVlcnlTZWxlY3RvckFsbCgnaW1nJyk7Zm9yKHZhciBpPTA7aTxpbWdzLmxlbmd0aDtpKyspIHtpbWdzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsZnVuY3Rpb24oZXYpIHtldi5wcmV2ZW50RGVmYXVsdCgpO30pO319KSgpOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMzAwMDEwNzMwMScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMzExOTgyMjMwMScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnMzEyNTQ4MDYwMScpO30pO30pOw== |
Серверные заголовки
Кол-во: 10
HTTP-заголовки ответа сервера
?
Заголовки сервера передают браузеру и поисковику служебную информацию: кеширование, безопасность (CSP, HSTS), сжатие (gzip). Правильная настройка ускоряет загрузку и повышает защищённость.
Найдены серверные заголовки 10шт. Подробнее про серверные заголовки.
Показать полный список серверных заголовков
| Ключ | Значение |
|---|---|
| Server | ddos-guard |
| Set-Cookie | __ddg8_=TxGeDbw1nhCMNPMj; Domain=.mann-ivanov-ferber.ru; Path=/; Expires=Thu, 20-Aug-2026 14:30:58 GMT |
| Content-Security-Policy | upgrade-insecure-requests; |
| Date | Thu, 20 Aug 2026 14:10:58 GMT |
| x-nextjs-cache | HIT |
| X-Powered-By | Next.js |
| Cache-Control | s-maxage=3600, stale-while-revalidate |
| Vary | Accept-Encoding |
| x-upstream | unix:/var/run/haproxy/newfront.sock |
| 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 (текущее значение мало: 14, минимум: 25, оптимально: от 40 до 45)
Дублей словоформ в title не найдено.
Description
Новинки, бестселлеры, курсы
Описание страницы в поисковой выдаче (сниппет)
?
Meta Description — текст под заголовком в выдаче. Напрямую на позиции не влияет, но влияет на CTR. Оптимальная длина: 120–160 символов.
Необходимо увеличить число символов в description (текущее значение мало: 27, минимум: 80, оптимально: от 120 до 130)
Keywords
скидки, книги, курсы, МИФ, подарки, купить книги, купить курсы, книги к школе, книги за полцены, бизнес книги
Список ключевых слов страницы (устаревший тег)
?
Meta Keywords не учитывается Яндексом и Google для ранжирования с 2009–2012 годов. Заполнение не обязательно, но не вредит. Конкурент может использовать содержимое для анализа.
Keywords установлены.
Канонический Url
https://www.mann-ivanov-ferber.ru/catalog/tag/new/
Указывает поисковику основную версию страницы
?
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:description | Новинки, бестселлеры, курсы |
| og:title | https://www.mann-ivanov-ferber.ru/assets/media/banners2026/sadis-5/1200x667.jpg |
| og:image | https://www.mann-ivanov-ferber.ru/assets/templates/site/img/logo-big.jpg |
| og:site_name | Издательство МИФ |
| og:url | https://www.mann-ivanov-ferber.ru/catalog/tag/new/ |
Все мета-теги
Кол-во: 13
Полный список мета-тегов страницы
?
Таблица всех meta-тегов, включая нестандартные. Позволяет найти опечатки, дубли и лишние теги.
Найдены мета-теги 13шт. Мета-теги не видимы для человека и предназначены для обмена информацией между веб-страницей и поисковыми системами, браузерами и другими веб-службами. С ними роботы 🤖 и устройства ведут себя более ожидаемо.
Показать полный список мета-тегов
| Тип | Название | Значение |
|---|---|---|
| name | viewport | width=device-width, initial-scale=1.0 |
| name | description | Новинки, бестселлеры, курсы |
| name | keywords | скидки, книги, курсы, МИФ, подарки, купить книги, купить курсы, книги к школе, книги за полцены, бизнес книги |
| name | yandex-verification | 439047a0861cf992 |
| name | theme-color | #fff |
| name | next-head-count | 19 |
| property | og:type | article |
| property | og:description | Новинки, бестселлеры, курсы |
| property | og:title | https://www.mann-ivanov-ferber.ru/assets/media/banners2026/sadis-5/1200x667.jpg |
| property | og:image | https://www.mann-ivanov-ferber.ru/assets/templates/site/img/logo-big.jpg |
| property | og:site_name | Издательство МИФ |
| property | og:url | https://www.mann-ivanov-ferber.ru/catalog/tag/new/ |
| property | fb:admins | 1093864394 |
Оптимизация Готовность: 40%
Структура
Ошибок нет
Семантические HTML-элементы страницы
?
Проверяет наличие основных структурных элементов: nav, header, footer, main. Корректная семантическая структура помогает поисковику понять архитектуру страницы.
Структура документа корректна (теги <html> и <body> присутствуют в одном экземпляре).
Контент
Есть ошибки
Объём и качество текстового содержимого
?
Анализирует объём полезного текста на странице. Слишком мало — страница может считаться малополезной. Слишком много — ухудшается читаемость и восприятие.
Слова из title 2 встречаются в тексте редко. Добавьте в контент страницы слова из тега <title>!
Абзацев с текстом 0 слишком мало. Добавьте больше абзацев с текстом (тег <p>)!
Среднее число слов в абзаце 0 слишком мало. Сделайте контент более читаемым!
Кол-во знаков контента 5752 на странице оптимально.
Кол-во слов 989 на странице оптимально.
Заголовки
Ошибок нет
Иерархия заголовков H1–H6
?
H1 должен быть один и содержать ключевой запрос. H2–H6 описывают подразделы. Пропуск уровней (H1 → H3) и несколько H1 — типичные ошибки, снижающие понятность страницы для поисковика.
На странице присутствуют заголовки <h1> 1. Это прекрасно.
Тошнота
6,40
Насколько одно слово доминирует в тексте
?
Классическая тошнота = √(частота самого повторяющегося слова). Норма до 7–8: текст воспринимается естественно. Выше — поисковик может счесть страницу переспамленной.
Тошнота превышает норму 3. Измените текст страницы!
Академич. тошнота
2,12%
Насколько текст перенасыщен ключевыми словами
?
Академическая тошнота = (частота слова / общее количество слов) × 100%. Показывает долю конкретного слова в тексте. Норма 5–15%.
Академическая тошнота не дотягивает до нормы 5-15%. Измените текст страницы!
Семантическое ядро
20
Наиболее часто встречающиеся слова на странице
?
Топ слов по частоте использования. Показывает, какие слова доминируют в тексте с точки зрения поисковика.
Контент страницы содержит осмысленный текст и слова.
Показать список слов
| Слово | Кол-во | Частота |
|---|---|---|
| новинка | 41 | 4,15% |
| посмотреть | 14 | 1,42% |
| старта | 7 | 0,71% |
| практикум | 5 | 0,51% |
| история | 5 | 0,51% |
| издательство | 4 | 0,40% |
| августа | 4 | 0,40% |
| истории | 4 | 0,40% |
| сборник | 4 | 0,40% |
| рассказов | 4 | 0,40% |
| рекомендуемые | 3 | 0,30% |
| классика | 3 | 0,30% |
| сентября | 3 | 0,30% |
| бизнеса | 2 | 0,20% |
| любовь | 2 | 0,20% |
| сначала | 2 | 0,20% |
| психология | 2 | 0,20% |
| текстов | 2 | 0,20% |
| тексты | 2 | 0,20% |
| россии | 2 | 0,20% |
Индексация Готовность: 60%
Индексирование
Ошибок нет
Разрешено ли индексирование страницы
?
Проверяет, не закрыта ли страница от индексации через robots.txt, meta robots или X-Robots-Tag. Страница, закрытая от индексации, не появится в поисковой выдаче.
Анкоров на странице 121 оптимально. Поисковые роботы обязательно проиндексируют сайт.
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 |
|
Внутренние ссылки
Кол-во: 16
Ссылки на другие страницы своего сайта
?
Внутренние ссылки распределяют ссылочный вес между страницами и помогают поисковику обходить сайт. Пустые анкоры и ссылки на запрещённые robots.txt страницы — типичные ошибки.
Внутренних ссылок на странице 16 оптимально.
Внутренние ссылки не запрещены к индексации в robots.txt.
На странице присутствуют изображения 14.
Показать внутренние ссылки
| Url | Анкор | Состояние |
|---|---|---|
| / |
Главная
|
|
| /courses/product/editor/ |
Посмотреть
|
|
| /courses/product/readingclass/ |
Посмотреть
|
|
| /courses/product/bookreviews/ |
Посмотреть
|
|
| /courses/product/odyssey/ |
Посмотреть
|
|
| /courses/product/dialogue/ |
Посмотреть
|
|
| /courses/product/proza/ |
Посмотреть
|
|
| /courses/product/coffeezag/ |
Посмотреть
|
|
| /courses/product/copywriting/ |
Посмотреть
|
|
| /courses/product/leader/ |
Посмотреть
|
|
| /courses/product/author/ |
Посмотреть
|
|
| /courses/product/simplerules/ |
Посмотреть
|
|
| /courses/product/aistart/ |
Посмотреть
|
|
| /courses/product/aicreators/ |
Посмотреть
|
|
| /courses/product/angara/ |
Посмотреть
|
|
| /tel:88007756741 |
8 800 775-67-41
|
|
Внешние ссылки
Кол-во: 48
Ссылки на сторонние сайты
?
Исходящие внешние ссылки передают часть ссылочного веса на чужие сайты. Ссылки на авторитетные ресурсы безопасны; ссылки на мусорные сайты могут навредить репутации страницы.
Внешних ссылок на странице 48 слишком много. Спрячьте лишние ссылки в тег noindex или атрибут rel='nofollow'!
На странице ссылки с атрибутом rel='nofollow' 5.
Показать внешние ссылки
| Url | Анкор |
|---|---|
| mann-ivanov-ferber.ru |
<span class="sc-8b7333fd-0 gSFZfO"></span><span class="sc-598f2266-0 sc-33e4fbaa-0 fOyTIV lhwllj"></span>
|
| mann-ivanov-ferber.ru |
<span class="sc-8b7333fd-0 gSFZfO"></span><span class="sc-598f2266-0 sc-c9c534bd-0 jiHsDl gDzyJr"></span>
|
| mann-ivanov-ferber.ru |
<span class="sc-8b7333fd-0 gSFZfO">0</span><span class="sc-598f2266-0 sc-595272e4-0 fOyTIV faoqoh"></span>
|
| mann-ivanov-ferber.ru |
Книги
|
| mann-ivanov-ferber.ru |
Курсы и мероприятия
|
| mann-ivanov-ferber.ru |
Акция
|
| mann-ivanov-ferber.ru |
Для бизнеса
|
| mann-ivanov-ferber.ru |
Издательство
|
| blog.mann-ivanov-ferber.ru |
Блоги
|
| mann-ivanov-ferber.ru |
Книги
|
| mann-ivanov-ferber.ru |
<div class="tn-atom__button-content"> <span class="tn-atom__button-text">Условия акции</span> </div> <span class="tn-atom__button-border"></span>
|
| mann-ivanov-ferber.ru |
<div class="tn-atom__button-content"> <span class="tn-atom__button-text">Посмотреть</span> </div> <span class="tn-atom__button-border"></span>
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3232-6637-4832-a638-313339326231/image.png" src="https://thb.tildacdn.com/tild3232-6637-4832-a638-313339326231/-/resize/20x/image.png" alt="" imgfield="tn_img_1786739363068000005">
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3231-3066-4332-a530-643130393266/image.png" src="https://thb.tildacdn.com/tild3231-3066-4332-a530-643130393266/-/resize/20x/image.png" alt="" imgfield="tn_img_1786824130954000003">
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3162-3736-4139-b430-376637636362/image.png" src="https://thb.tildacdn.com/tild3162-3736-4139-b430-376637636362/-/resize/20x/image.png" alt="" imgfield="tn_img_1786824133512000004">
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3438-6562-4566-a562-343730366262/image.png" src="https://thb.tildacdn.com/tild3438-6562-4566-a562-343730366262/-/resize/20x/image.png" alt="" imgfield="tn_img_1786824136963000005">
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3239-6664-4762-a235-663438393238/image.png" src="https://thb.tildacdn.com/tild3239-6664-4762-a235-663438393238/-/resize/20x/image.png" alt="" imgfield="tn_img_1786824147382000006">
|
| mann-ivanov-ferber.ru |
<div class="tn-atom__button-content"> <span class="tn-atom__button-text">Посмотреть</span> </div> <span class="tn-atom__button-border"></span>
|
| mann-ivanov-ferber.ru |
<div class="tn-atom__button-content"> <span class="tn-atom__button-text">Посмотреть</span> </div> <span class="tn-atom__button-border"></span>
|
| mann-ivanov-ferber.ru |
<div class="tn-atom__button-content"> <span class="tn-atom__button-text">Посмотреть</span> </div> <span class="tn-atom__button-border"></span>
|
| mann-ivanov-ferber.ru |
<div class="tn-atom__button-content"> <span class="tn-atom__button-text">Посмотреть</span> </div> <span class="tn-atom__button-border"></span>
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3666-6261-4261-b364-346136363338/5633af7bbca6dc5f7d9f.png" src="https://thb.tildacdn.com/tild3666-6261-4261-b364-346136363338/-/resize/20x/5633af7bbca6dc5f7d9f.png" alt="" imgfield="tn_img_1786823488873000002">
|
| mann-ivanov-ferber.ru |
<div class="tn-atom__button-content"> <span class="tn-atom__button-text">Посмотреть</span> </div> <span class="tn-atom__button-border"></span>
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3232-6637-4832-a638-313339326231/image.png" src="https://thb.tildacdn.com/tild3232-6637-4832-a638-313339326231/-/resize/20x/image.png" alt="" imgfield="tn_img_1786739363068000005">
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3231-3066-4332-a530-643130393266/image.png" src="https://thb.tildacdn.com/tild3231-3066-4332-a530-643130393266/-/resize/20x/image.png" alt="" imgfield="tn_img_1786824130954000003">
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3162-3736-4139-b430-376637636362/image.png" src="https://thb.tildacdn.com/tild3162-3736-4139-b430-376637636362/-/resize/20x/image.png" alt="" imgfield="tn_img_1786824133512000004">
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3438-6562-4566-a562-343730366262/image.png" src="https://thb.tildacdn.com/tild3438-6562-4566-a562-343730366262/-/resize/20x/image.png" alt="" imgfield="tn_img_1786824136963000005">
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3239-6664-4762-a235-663438393238/image.png" src="https://thb.tildacdn.com/tild3239-6664-4762-a235-663438393238/-/resize/20x/image.png" alt="" imgfield="tn_img_1786824147382000006">
|
| mann-ivanov-ferber.ru |
<div class="tn-atom__button-content"> <span class="tn-atom__button-text">Посмотреть</span> </div> <span class="tn-atom__button-border"></span>
|
| mann-ivanov-ferber.ru |
<div class="tn-atom__button-content"> <span class="tn-atom__button-text">Посмотреть</span> </div> <span class="tn-atom__button-border"></span>
|
| mann-ivanov-ferber.ru |
<div class="tn-atom__button-content"> <span class="tn-atom__button-text">Посмотреть</span> </div> <span class="tn-atom__button-border"></span>
|
| mann-ivanov-ferber.ru |
<div class="tn-atom__button-content"> <span class="tn-atom__button-text">Посмотреть</span> </div> <span class="tn-atom__button-border"></span>
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3666-6261-4261-b364-346136363338/5633af7bbca6dc5f7d9f.png" src="https://thb.tildacdn.com/tild3666-6261-4261-b364-346136363338/-/resize/20x/5633af7bbca6dc5f7d9f.png" alt="" imgfield="tn_img_1786823488873000002">
|
| mann-ivanov-ferber.ru |
<img class="tn-atom__img" src="https://static.tildacdn.com/tild3164-6232-4431-b330-383666396161/noroot.png" alt="" imgfield="tn_img_1787067209290000001">
|
| 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 |
Политика конфиденциальности
|
| youtube.com |
<span class="sc-6e602881-0 ljiGzd sc-45b866c1-0 XAjgM"></span>
|
| vk.com |
<span class="sc-6e602881-0 gtCUAG sc-45b866c1-0 XAjgM"></span>
|
| ok.ru |
<span class="sc-6e602881-0 cLwZVv sc-45b866c1-0 XAjgM"></span>
|
| telegram.me |
<span class="sc-6e602881-0 kQoOBE sc-45b866c1-0 XAjgM"></span>
|
Конкуренты Готовность: 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/
Страница с контактами найдена
Политика ПД
https://www.mann-ivanov-ferber.ru/policy/
Страница политики обработки ПД найдена
Согласие
https://www.mann-ivanov-ferber.ru/personal/
Страница согласия на обработку ПД найдена
Чекбокс согласия
Не найден
Чекбокс согласия на обработку ПД в формах сайта не найден
Счётчики до согласия
ОК
Счётчики аналитики не собирают данные до согласия пользователя
ЗоЗПП: права потребителей Готовность: 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/catalog/tag/new/ готова к продвижению на 56%. Чтобы еще улучшить страницу и попасть на первые места поисковой выдачи необходимо:
Исправьте ошибки в мета-тегах.
Исправьте ошибки оптимизации.
Исправьте ошибки индексации.
Поделитесь с друзьями: