Анализ страницы https://www.mann-ivanov-ferber.ru/mify-ot-i-do
Основное Готовность: 75%
Домен
mann-ivanov-ferber.ru
Состояние доменного имени
?
Проверяем корректность доменного имени и наличие технических проблем на уровне домена.
Длина домена велика. Но если вы продвигаете запрос, входящий в название домена, то это хорошо.
Домен второго уровня идеален для продвижения.
Регистратор домена - REGRU-RU
Дата регистрации домена 27.10.2004 (более 20 лет назад)
Ответ сервера
200 Успешный ответ
HTTP-код ответа и цепочка редиректов
?
Код 200 — страница доступна. Коды 3xx — редиректы (цепочки замедляют загрузку и размывают ссылочный вес). Коды 4xx/5xx — ошибки, поисковик не сможет проиндексировать страницу.
Сервер настроен корректно.
Цепочка редиректов:
https://www.mann-ivanov-ferber.ru/mify-ot-i-do
301 MovedPermanently
https://www.mann-ivanov-ferber.ru/catalog/tag/mify-ot-i-do/
200 OK
Безопасность
Сайт безопасен
Использование 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,93сек
Время отклика сервера (TTFB)
?
Time To First Byte — время до получения первого байта от сервера. Норма до 200 мс. Медленный отклик ухудшает пользовательский опыт и ранжирование: Яндекс и Google учитывают скорость страниц.
Скорость загрузки сайта 0,93сек оптимальна.
Объем документа
4327Кб
Размер HTML-кода страницы
?
Слишком большой HTML замедляет парсинг браузером и сканирование поисковым роботом. Рекомендуется не более 200 Кб.
Объем html-документа 4327Кб оптимален.
Структура 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/KGNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bz1hLHQuYXBwbHkocixsKX0pLGUpKToobz1hLHQuYXBwbHkocixsKSl9fWZ1bmN0aW9uIHRfb25GdW5jTG9hZCh0LGUsbil7dmFyIG89MTVlMyxpPXRfY2hlY2tJc0VkaXRNb2RlKCkscj1mdW5jdGlvbiB0KCl7cmV0dXJuIWl8fGkmJnRfY2hlY2tFZGl0b3JJc1JlYWR5KCl9LGE9ZnVuY3Rpb24gdChlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93W2VdfHwib2JqZWN0Ij09dHlwZW9mIHdpbmRvd1tlXX07aWYoYSh0KSYmcigpKWUoKTtlbHNle3ZhciBsPURhdGUubm93KCksZD1uZXcgRXJyb3IodCsiIGlzIHVuZGVmaW5lZCIpLHM9ZnVuY3Rpb24gdCgpe3Rocm93IGR9O3NldFRpbWVvdXQoKGZ1bmN0aW9uIGkoKXt2YXIgZD1EYXRlLm5vdygpO2EodCkmJnIoKT9lKCk6KCJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlJiZkLWw+byYmIWEodCkmJnMoKSxzZXRUaW1lb3V0KGksbnx8MTAwKSl9KSl9fWZ1bmN0aW9uIHRfY2hlY2tJc0VkaXRNb2RlKCl7dmFyIHQ9ITEsZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKCFlKXJldHVybiExO3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKTtyZXR1cm4hISh0PW4mJiJlZGl0Ij09PW4pfWZ1bmN0aW9uIHRfY2hlY2tFZGl0b3JJc1JlYWR5KCl7dmFyIHQ9ITE7aWYoIXRfY2hlY2tJc0VkaXRNb2RlKCkpcmV0dXJuITE7dmFyIGU9ZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoImRhdGEtcmVhZHktc3RhdHVzIik7cmV0dXJuISEodD1lJiYicmVhZHkiPT09ZSl9ZnVuY3Rpb24gdF9zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yX19zZXRPYmplY3QoKXt3aW5kb3cuc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcj17fTt2YXIgdD13aW5kb3cuc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcjt0LmlzSW5pdGVkPSExLHQuc2Nyb2xsQmFyV2lkdGg9TWF0aC5hYnMod2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSx0LmRlbGF5PTAsdC5jYW5jZWxUaW1lb3V0PW51bGw7dmFyIGU9WyJ0NDUwIiwidDI4Ml9fY29udGFpbmVyIiwidDI4Ml9fY29udGFpbmVyX19iZ19vcGVuZWQiLCJ0MjgyX19tZW51X19jb250YWluZXIiLCJ0ODMwbSIsInQ4MzBfX3BhbmVsIiwidDQ1MW0iLCJ0MjA0X19tZW51IiwidG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciJdLG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiKiIpO249QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsb3Nlc3QoIi50MTA5MyIpJiYhZS5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoZSl9KSl9KSksdC5maXhlZEVsZW1lbnRzPVtdLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24oZSl7aWYoIWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0OTc1Iikpe3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLG89bi5nZXRQcm9wZXJ0eVZhbHVlKCJwb3NpdGlvbiIpLGk9bi5nZXRQcm9wZXJ0eVZhbHVlKCJ3aWR0aCIpLHI9bi5nZXRQcm9wZXJ0eVZhbHVlKCJoZWlnaHQiKSxhPSIxMDAlIj09PWl8fGk9PT13aW5kb3cuaW5uZXJXaWR0aCsicHgifHxpPT09d2luZG93LmlubmVyV2lkdGgtdC5zY3JvbGxCYXJXaWR0aCsicHgifHwiMTAwdnciPT09aSxsPSIxMDAlIj09PXJ8fHI9PT13aW5kb3cuaW5uZXJIZWlnaHQrInB4Inx8cj09PXdpbmRvdy5pbm5lckhlaWdodC10LnNjcm9sbEJhcldpZHRoKyJweCJ8fCJhdXRvIj09PXJ8fCIxMDB2aCI9PT1yOygiZml4ZWQiPT09b3x8ImFic29sdXRlIj09PW8mJmEmJiFsKSYmdC5maXhlZEVsZW1lbnRzLnB1c2goe2VsOmUsY29tcHV0ZWRTdHlsZTpufSl9fSkpfWZ1bmN0aW9uIHRfc2Nyb2xsQmFyV2lkdGhDb21wZW5zYXRvcl9faW5pdCgpe2lmKCF3aW5kb3cuaXNNb2JpbGUpe3dpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yfHx0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX3NldE9iamVjdCgpO3ZhciB0PXdpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yO2lmKHQuc2Nyb2xsQmFyV2lkdGg9TWF0aC5hYnMod2luZG93LmlubmVyV2lkdGgtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSx0LmNhbmNlbFRpbWVvdXQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHQuY2FuY2VsVGltZW91dCksdC5jYW5jZWxUaW1lb3V0PW51bGwpLCF0LmlzSW5pdGVkJiZ0LnNjcm9sbEJhcldpZHRoKXt0LmlzSW5pdGVkPSEwO3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoInBhZGRpbmctcmlnaHQiKTtlPXBhcnNlSW50KGUucmVwbGFjZSgicHgiLCIiKSwxMCk7dmFyIG49ZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7biYmZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1wYWRkaW5nLXJpZ2h0IixuKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD10LnNjcm9sbEJhcldpZHRoK2UrInB4Iixkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodD0iMTAwdmgiLGRvY3VtZW50LmJvZHkuc3R5bGUubWluSGVpZ2h0PSIxMDB2aCIsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjt2YXIgbz1bXTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQuZml4ZWRFbGVtZW50cywoZnVuY3Rpb24oZSl7dmFyIG49ZS5lbDtpZihkb2N1bWVudC5ib2R5LmNvbnRhaW5zKG4pJiYhbi5jbGFzc0xpc3QuY29udGFpbnMoInQ5NzUiKSYmIW4uY2xhc3NMaXN0LmNvbnRhaW5zKCJ0OTc1Iikpe3ZhciBpPWUuY29tcHV0ZWRTdHlsZSxyPWkuZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKTtpZigiZml4ZWQiPT09cnx8ImFic29sdXRlIj09PXIpe3ZhciBhPWkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNpdGlvbi1kdXJhdGlvbiIpO2EuaW5kZXhPZigibXMiKSsxPyhhPXBhcnNlSW50KGEucmVwbGFjZSgibXMiLCIiKSwxMCksby5wdXNoKGEpKTphLmluZGV4T2YoInMiKSsxJiYoYT0xZTMqcGFyc2VGbG9hdChhLnJlcGxhY2UoInMiLCIiKSksby5wdXNoKGEpKTt2YXIgbD1pLmdldFByb3BlcnR5VmFsdWUoInJpZ2h0Iik7bD1wYXJzZUludChsLnJlcGxhY2UoInB4IiwiIiksMTApO3ZhciBkPWkuZ2V0UHJvcGVydHlWYWx1ZSgid2lkdGgiKSxzPWkuZ2V0UHJvcGVydHlWYWx1ZSgiaGVpZ2h0IiksYz1uLnN0eWxlLnJpZ2h0O2MmJm4uc2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcmlnaHQiLGMpO3ZhciB1PW4uc3R5bGUud2lkdGg7dSYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC13aWR0aCIsdSk7dmFyIG09IjEwMCUiPT09ZHx8ZD09PXdpbmRvdy5pbm5lcldpZHRoKyJweCJ8fGQ9PT13aW5kb3cuaW5uZXJXaWR0aC10LnNjcm9sbEJhcldpZHRoKyJweCJ8fCIxMDB2dyI9PT1kLHA9IjEwMCUiPT09c3x8cz09PXdpbmRvdy5pbm5lckhlaWdodCsicHgifHxzPT09d2luZG93LmlubmVySGVpZ2h0LXQuc2Nyb2xsQmFyV2lkdGgrInB4Inx8ImF1dG8iPT09c3x8IjEwMHZoIj09PXM7IWwmJjAhPT1sfHwiYXV0byI9PT1uLnN0eWxlLnJpZ2h0fHwiYWJzb2x1dGUiPT09cnx8bT9tJiYhcCYmKG4uc3R5bGUud2lkdGg9ImNhbGMoMTAwdncgLSAiK3Quc2Nyb2xsQmFyV2lkdGgrInB4KSIpOm4uc3R5bGUucmlnaHQ9dC5zY3JvbGxCYXJXaWR0aCtsKyJweCJ9fX0pKSxvLmxlbmd0aCYmKHQuZGVsYXk9TWF0aC5tYXguYXBwbHkobnVsbCxvKSl9fX1mdW5jdGlvbiB0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX2NhbmNlbCgpe3ZhciB0PXdpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yO3QmJnQuaXNJbml0ZWQmJih0LmlzSW5pdGVkPSExLHQuZGVsYXk9MCxkb2N1bWVudC5ib2R5Lmhhc0F0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXBhZGRpbmctcmlnaHQiKT8oZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ9ZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1wYWRkaW5nLXJpZ2h0IiksZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1wYWRkaW5nLXJpZ2h0IikpOmRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoInBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJoZWlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJtaW4taGVpZ2h0IiksZG9jdW1lbnQuYm9keS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgib3ZlcmZsb3ciKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQuZml4ZWRFbGVtZW50cywoZnVuY3Rpb24odCl7dmFyIGU9dC5lbCxuPWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tX19zdGlja3ktd3JhcHBlciIpfHxlLmNsYXNzTGlzdC5jb250YWlucygidG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpO2UuaGFzQXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtcmlnaHQiKT8oZS5zdHlsZS5yaWdodD1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXJpZ2h0IiksZS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC1yaWdodCIpKTplLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJyaWdodCIpLGUuaGFzQXR0cmlidXRlKCJkYXRhLXRpbGRhLWluaXRpYWwtd2lkdGgiKT8oZS5zdHlsZS53aWR0aD1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1pbml0aWFsLXdpZHRoIiksZS5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtdGlsZGEtaW5pdGlhbC13aWR0aCIpKTooZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgid2lkdGgiKSxuJiYoZS5zdHlsZS53aWR0aD0iaW5oZXJpdCIpKX0pKSl9ZnVuY3Rpb24gdF90cmlnZ2VyRXZlbnQodCxlKXt2YXIgbjtkb2N1bWVudC5jcmVhdGVFdmVudD8obj1kb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpKS5pbml0RXZlbnQoZSwhMCwhMSk6ZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QmJigobj1kb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpKS5ldmVudFR5cGU9ZSksbi5ldmVudE5hbWU9ZSx0LmRpc3BhdGNoRXZlbnQ/dC5kaXNwYXRjaEV2ZW50KG4pOnQuZmlyZUV2ZW50P3QuZmlyZUV2ZW50KCJvbiIrbi5ldmVudFR5cGUsbik6dFtlXT90W2VdKCk6dFsib24iK2VdJiZ0WyJvbiIrZV0oKX1mdW5jdGlvbiB0X2dldFJvb3Rab25lKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlO3JldHVybiB0JiZ0LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1yb290LXpvbmUiKXx8ImNvbSJ9ZnVuY3Rpb24gdF9tb2RpZnlSb290Wm9uZSh0KXtyZXR1cm4gdCYmdC5pbmNsdWRlcygic3RhdGljLnRpbGRhY2RuLmNvbSIpP3QucmVwbGFjZSgic3RhdGljLnRpbGRhY2RuLmNvbSIsInN0YXRpYy50aWxkYWNkbi4iK3RfZ2V0Um9vdFpvbmUoKSk6dH1mdW5jdGlvbiB0X2xvYWRKc0ZpbGUodCxlLG4pe3ZvaWQgMD09PW4mJihuPTApO3ZhciBvPTMsaT0xZTMscj10X21vZGlmeVJvb3Rab25lKHQpO2lmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmNePSInK3IrJyJdJykpZSYmZSgpO2Vsc2V7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLGEuc3JjPXIsZSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXtlKCl9KSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGZ1bmN0aW9uKHQpe2lmKCEobjw9Mykpe3ZhciBvPXQubWVzc2FnZXx8IjxubyBlcnJvciBtZXNzYWdlPiI7dGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gbG9hZCAiK3IrIiBzY3JpcHQ6ICIrbyx7Y2F1c2U6dH0pfXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YS5yZW1vdmUoKSx0X2xvYWRKc0ZpbGUocixlLG4rMSksY29uc29sZS53YXJuKCJSZXRyeWluZyB0byBsb2FkICIrcisiLiBSZXRyeTogIisobisxKSl9KSxuKmkpfSkpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYSl9fWZ1bmN0aW9uIHRfbG9hZENTU0ZpbGUodCxlLG4pe3ZvaWQgMD09PW4mJihuPTApO3ZhciBvPTMsaT0xZTMscj10X21vZGlmeVJvb3Rab25lKHQpO2lmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZl49IicrcisnIl0nKSllJiZlKCk7ZWxzZXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7YS5yZWw9InN0eWxlc2hlZXQiLGEudHlwZT0idGV4dC9jc3MiLGEubWVkaWE9ImFsbCIsYS5ocmVmPXIsYS5jcm9zc09yaWdpbj0iYW5vbnltb3VzIixlJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLChmdW5jdGlvbih0KXtpZighKG48PTMpKXt2YXIgbz10Lm1lc3NhZ2V8fCI8bm8gZXJyb3IgbWVzc2FnZT4iO3Rocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIGxvYWQgIityKyIgc3R5bGU6ICIrbyx7Y2F1c2U6dH0pfXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YS5yZW1vdmUoKSx0X2xvYWRDU1NGaWxlKHIsZSxuKzEpLGNvbnNvbGUud2FybigiUmV0cnlpbmcgdG8gbG9hZCAiK3IrIi4gUmV0cnk6ICIrKG4rMSkpfSksbippKX0pKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGEpfX1mdW5jdGlvbiB0X3Njcm9sbFRvKHQsZSl7aWYodCl7dmFyIG49ZXx8e30sbz1uLnVzZU5hdGl2ZVNjcm9sbFRvLGk9bi5kdXJhdGlvbixyPW4uYmVoYXZpb3IsYT12b2lkIDA9PT1yPyJpbnN0YW50IjpyLGw9bi5vZmZzZXQsZD12b2lkIDA9PT1sPzA6bCxzPU1hdGgubWF4KHBhcnNlSW50KHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5zY3JvbGxZLWQsMTApLDApO298fCJpbnN0YW50Ij09PWE/d2luZG93LnNjcm9sbFRvKHtsZWZ0OjAsdG9wOnMsYmVoYXZpb3I6YX0pOnRfc21vb3RoU2Nyb2xsVG8ocyxpKX19ZnVuY3Rpb24gdF9zbW9vdGhTY3JvbGxUbyh0LGUpe3ZvaWQgMD09PWUmJihlPTUwMCk7dmFyIG49ZG9jdW1lbnQuYm9keSxvPXdpbmRvdy5zY3JvbGxZfHx3aW5kb3cucGFnZVlPZmZzZXQsaT10LW8scj1wZXJmb3JtYW5jZS5ub3coKTtmdW5jdGlvbiBhKHQpe3JldHVybiBNYXRoLnBvdyh0LDIpfWZ1bmN0aW9uIGwoKXt2YXIgZD1wZXJmb3JtYW5jZS5ub3coKSxzPU1hdGgubWluKChkLXIpL2UsMSksYz1hKHMpO3dpbmRvdy5zY3JvbGxUbygwLG8raSpjKSxzPDE/cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGwpOihuLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1zY3JvbGwiKSxuLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1zY3JvbGxhYmxlIiksd2luZG93LnNjcm9sbFRvKDAsdCkpfW4uc2V0QXR0cmlidXRlKCJkYXRhLXNjcm9sbCIsInRydWUiKSxuLnNldEF0dHJpYnV0ZSgiZGF0YS1zY3JvbGxhYmxlIiwidHJ1ZSIpLHJlcXVlc3RBbmltYXRpb25GcmFtZShsKX13aW5kb3cuYnJvd3Nlckxhbmc9KHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlKS50b1VwcGVyQ2FzZSgpLnNsaWNlKDAsMiksd2luZG93LnRpbGRhQnJvd3Nlckxhbmc9d2luZG93LmJyb3dzZXJMYW5nLHRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKHQpdmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtcHJvamVjdC1sYW5nIik7ZSYmKHdpbmRvdy5icm93c2VyTGFuZz1lKX0pKSx0X29uUmVhZHkoKGZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsZT0tMSE9PXQuaW5kZXhPZigiSW5zdGFncmFtIiksbj0tMSE9PXQuaW5kZXhPZigiRkJBViIpLG89LTEhPT10LmluZGV4T2YoIllhU2VhcmNoQnJvd3NlciIpLGk9LTEhPT10LmluZGV4T2YoIlNhbXN1bmdCcm93c2VyIikscj0tMSE9PXQuaW5kZXhPZigiRHVja0R1Y2tHbyIpLGE7aWYoLTEhPT10LmluZGV4T2YoIkFuZHJvaWQiKSYmKG58fGV8fG98fGl8fHIpKXt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7bC5zdHlsZS5saW5lSGVpZ2h0PSIxMDBweCIsbC5zdHlsZS5wYWRkaW5nPSIwIixsLnN0eWxlLm1hcmdpbj0iMCIsbC5zdHlsZS5oZWlnaHQ9ImF1dG8iLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLm9wYWNpdHk9IjAuMDAxIixsLmlubmVyVGV4dD0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTt2YXIgZD0xMDAvbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7bC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpLGQ8Ljk4JiZkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlZW5kIiwnPHN0eWxlPi50Mzk2IFtkYXRhLWVsZW0tdHlwZT0idGV4dCJdIC50bi1hdG9tIHt6b29tOiAnKzEwMCpkKyIlO308L3N0eWxlPiIpfXdpbmRvdy5pc2lPUyYmIXdpbmRvdy5NU1N0cmVhbSYmKGRvY3VtZW50LmJvZHkuc3R5bGUuc2V0UHJvcGVydHkoIi13ZWJraXQtdGV4dC1zaXplLWFkanVzdCIsIjEwMCUiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnNldFByb3BlcnR5KCJ0ZXh0LXNpemUtYWRqdXN0IiwiMTAwJSIpKX0pKSx0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJodG1sIiksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC10aWxkYWxhYmVsIiksbj10Lm9mZnNldEhlaWdodDtpZihkb2N1bWVudC5ib2R5JiYobj1NYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCx0Lm9mZnNldEhlaWdodCkpLChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGlsZGFjb3B5Iil8fGUpJiZlLnF1ZXJ5U2VsZWN0b3JBbGwoImRpdiIpKW4rNzA+d2luZG93LmlubmVySGVpZ2h0JiZlJiZlLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB2aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7IHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBwb2ludGVyLWV2ZW50czogYWxsICFpbXBvcnRhbnQ7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgbWFyZ2luOiAwICFpbXBvcnRhbnQ7IHotaW5kZXg6IDEgIWltcG9ydGFudCIpO2Vsc2V7Zm9yKHZhciBvPWRvY3VtZW50LmJvZHkuY2hpbGROb2RlcyxpPVtdLHI9MDtyPG8ubGVuZ3RoO3IrKyl7dmFyIGE9b1tyXTs4PT09YS5ub2RlVHlwZSYmaS5wdXNoKGEpfWZvcih2YXIgcj0wO3I8aS5sZW5ndGg7cisrKS0xIT09aVtyXS5ub2RlVmFsdWUuaW5kZXhPZigiJ3QgcmVtb3ZlIHRoaXMgbCIpJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJlbmQiLCc8ZGl2IGNsYXNzPSJ0LXRpbGRhbGFiZWwgdC10aWxkYWxhYmVsLWZyZWUiIHN0eWxlPSJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyB2aXNpYmlsaXR5OiB2aXNpYmxlICFpbXBvcnRhbnQ7IHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OyB3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBwb2ludGVyLWV2ZW50czogYWxsICFpbXBvcnRhbnQ7IG9wYWNpdHk6IDEgIWltcG9ydGFudDsgbWFyZ2luOiAwICFpbXBvcnRhbnQ7IHotaW5kZXg6IDk5OTAwICFpbXBvcnRhbnQiPjxkaXYgY2xhc3M9InQtdGlsZGFsYWJlbC1mcmVlX19tYWluIj48YSBocmVmPSJodHRwczovL3RpbGRhLmNjIiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9InBhZGRpbmctYm90dG9tOjEycHg7IGRpc3BsYXk6IGJsb2NrOyI+PGltZyBzdHlsZT0id2lkdGg6NDBweDsiIHNyYz0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uJyt0X2dldFJvb3Rab25lKCkrJy9pbWcvdGlsZGFjb3B5LnBuZyI+PC9hPjxkaXYgc3R5bGU9InBhZGRpbmctYm90dG9tOiAxNXB4OyI+VGhpcyBzaXRlIHdhcyBtYWRlIG9uIDxhIGhyZWY9Imh0dHBzOi8vdGlsZGEuY2MiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjppbmhlcml0OyI+VGlsZGEg4oCUIGEgd2Vic2l0ZSBidWlsZGVyPC9hPiB0aGF0IGhlbHBzIHRvJm5ic3A7Y3JlYXRlIGEmbmJzcDt3ZWJzaXRlIHdpdGhvdXQgYW55IGNvZGU8L2Rpdj48YSBocmVmPSJodHRwczovL3RpbGRhLmNjL3JlZ2lzdHJhdGlvbi8iIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiAxMHB4IDIwcHg7IGZvbnQtc2l6ZTogMTNweDsgYm9yZGVyLXJhZGl1czogNTBweDsgYmFja2dyb3VuZC1jb2xvcjogI2ZhODY2OTsgY29sb3I6ICNmZmY7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsiPkNyZWF0ZSBhIHdlYnNpdGU8L2E+PC9kaXY+PGRpdiBjbGFzcz0idC10aWxkYWxhYmVsLWZyZWVfX2xpbmtzLXdyIj48YSBjbGFzcz0idC10aWxkYWxhYmVsLWZyZWVfX3R4dC1saW5rIiBocmVmPSJodHRwczovL2hlbHAnKygiUlUiPT09d2luZG93LmJyb3dzZXJMYW5nPyItcnUiOiIiKSsnLnRpbGRhLmNjL3doaXRlLWxhYmVsIiB0YXJnZXQ9Il9ibGFuayI+JysoIlJVIj09PXdpbmRvdy5icm93c2VyTGFuZz8i0JrQsNC6INGD0LTQsNC70LjRgtGMINGN0YLQvtGCINC70LXQudCx0LsiOiJIb3cgdG8gcmVtb3ZlIHRoaXMgYmxvY2siKSsiPzwvYT48L2Rpdj48L2Rpdj4iKX19KSw1MDApfSkpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKCF3aW5kb3cuaXNNb2JpbGUmJnQmJiJ5ZXMiIT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYmxvY2tzLWFuaW1hdGlvbm9mZiIpJiYhMT09PXdpbmRvdy5pc1NlYXJjaEJvdCl7Zm9yKHZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yIiksbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbyxpPShvPWVbbl0pLmdldEF0dHJpYnV0ZSgic3R5bGUiKTtpJiYtMSE9PWkuaW5kZXhPZigiYmFja2dyb3VuZC1jb2xvciIpJiZvLnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRpb25hcHBlYXIiLCJvZmYiKX1mb3IodmFyIHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hdC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0aW9uYXBwZWFyIikmJiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIikmJiF0LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4Iil9KSksbj0wO248ci5sZW5ndGg7bisrKXt2YXIgbyxhPShvPXJbbl0pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQsbD13aW5kb3cucGFnZVlPZmZzZXQrd2luZG93LmlubmVySGVpZ2h0KzMwMDt0X2FkZENsYXNzKG8sYT4xZTMmJmE+bD8icl9oaWRkZW4iOiJyX3Nob3dlZCIpLHRfYWRkQ2xhc3Mobywicl9hbmltIil9aWYoci5sZW5ndGgpe2Z1bmN0aW9uIGQoKXtmb3IodmFyIHQ9ci5sZW5ndGgtMTt0Pj0wO3QtLSl7dmFyIGU9clt0XSxuLG89MDtlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ8KG89ZS5vZmZzZXRIZWlnaHQ8PTEwMD93aW5kb3cucGFnZVlPZmZzZXQrd2luZG93LmlubmVySGVpZ2h0OndpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQtMTAwKSYmKHRfcmVtb3ZlQ2xhc3MoZSwicl9oaWRkZW4iKSx0X2FkZENsYXNzKGUsInJfc2hvd2VkIiksKHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocikpLnNwbGljZSh0LDEpKX19dmFyIHM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtcmVjb3JkLXR5cGU9IjQwMCJdLCBbZGF0YS1wYXJlbnR0cGxpZD0iNDAwIl0nKTtpZihzLmxlbmd0aD4wKXZhciBjPTAsdT0wLG09c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7MzAwPT09KHUrPTEpJiZjbGVhckludGVydmFsKG0pO2Zvcih2YXIgdD0wO3Q8cy5sZW5ndGg7dCsrKXt2YXIgZTsieWVzIj09PXNbdF0uZ2V0QXR0cmlidXRlKCJkYXRhLWhpZGluZy1jb21wbGV0ZWQiKSYmKGMrPTEpfWM9PT1zLmxlbmd0aCYmKGQoKSxjbGVhckludGVydmFsKG0pKX0pLDEwMCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtkKCl9KSwyMDApKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGlsZGF0YWI6Y2hhbmdlIix0X3Rocm90dGxlKChmdW5jdGlvbigpe2QoKX0pLDIwMCkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZCgpfSkpfX12YXIgcD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJodG1sIiksaD1kb2N1bWVudC5ib2R5OyJub25lIj09PXAuc3R5bGUuZGlzcGxheSYmKHAuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt2YXIgdz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC10aWxkYWxhYmVsIiksZjsoZj1oP01hdGgubWF4KGguc2Nyb2xsSGVpZ2h0LGgub2Zmc2V0SGVpZ2h0LGguY2xpZW50SGVpZ2h0LHAub2Zmc2V0SGVpZ2h0KTpwLm9mZnNldEhlaWdodCkrNzA8d2luZG93LmlubmVySGVpZ2h0P3cmJih3LnN0eWxlLmRpc3BsYXk9Im5vbmUiKTp3JiZ3LnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Iil9KSksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7d2luZG93LndpbldpZHRoPXdpbmRvdy5pbm5lcldpZHRoLHdpbmRvdy53aW5IZWlnaHQ9d2luZG93LmlubmVySGVpZ2h0fWZ1bmN0aW9uIGUoKXt2YXIgdD13aW5kb3cuaXNNb2JpbGU/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOndpbmRvdy5pbm5lcldpZHRoLGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJbZGF0YS1zY3JlZW4tbWF4XSwgLnJbZGF0YS1zY3JlZW4tbWluXSIpLG4sbyxpOy0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJJbnN0YWdyYW0iKSYmKHQ9c2NyZWVuLndpZHRoKTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGE9ZVtyXSxsPWEuaWQucmVwbGFjZSgicmVjIiwiIik7aWYoInllcyI9PT1hLmdldEF0dHJpYnV0ZSgiZGF0YS1jb25uZWN0LXdpdGgtdGFiIil8fGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBvcHVwLXJlYy1pZHM9IicrbCsnIl0nKSlyZXR1cm47aT1nZXRDb21wdXRlZFN0eWxlKGEpLmRpc3BsYXksKG49YS5nZXRBdHRyaWJ1dGUoImRhdGEtc2NyZWVuLW1heCIpKXx8KG49MWU0KSwobz1hLmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIikpfHwobz0wKSxuPXBhcnNlSW50KG4pLChvPXBhcnNlSW50KG8pKTw9biYmKHQ8PW4mJnQ+bz8iYmxvY2siIT09aSYmKGEuc3R5bGUuZGlzcGxheT0iYmxvY2siKToibm9uZSIhPT1pJiYoYS5zdHlsZS5kaXNwbGF5PSJub25lIikpfX10X29uUmVhZHkoKGZ1bmN0aW9uKCl7dCgpLGUoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3QoKX0pLDIwMCkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7ZSgpfSksMjAwKSl9KSl9KCksZnVuY3Rpb24oKXt2YXIgdD0tMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIik7ZnVuY3Rpb24gZSgpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1jb3Zlcl9fY2FycmllciIpLGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBvLGk7aWYoKGk9KG89dFtuXSkuc3R5bGUpLmhlaWdodC5pbmRleE9mKCJ2aCIpPi0xKXtlPXBhcnNlSW50KGkuaGVpZ2h0LDEwKS8xMDA7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ci5pZD0idGVtcERpdiIsci5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwdmg7dmlzaWJpbGl0eTpoaWRkZW47Iixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHIpO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZW1wRGl2IiksbD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGEpLmhlaWdodC5yZXBsYWNlKCJweCIsIiIpKTt0X3JlbW92ZUVsKGEpO3ZhciBkPU1hdGgucm91bmQobCplKSsicHgiLHM9by5jbG9zZXN0KCIudC1jb3ZlciIpO2lmKHMpe3ZhciBjPXMucXVlcnlTZWxlY3RvcigiLnQtY292ZXJfX2ZpbHRlciIpLHU9cy5xdWVyeVNlbGVjdG9yKCIudC1jb3Zlcl9fd3JhcHBlciIpO3Muc3R5bGUuaGVpZ2h0PWQsYyYmKGMuc3R5bGUuaGVpZ2h0PWQpLHUmJih1LnN0eWxlLmhlaWdodD1kKX1pLmhlaWdodD1kfX12YXIgbT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1oZWlnaHQtY29ycmVjdC12aF0iKSxwPXdpbmRvdy5pbm5lckhlaWdodDtlPTA7Zm9yKHZhciBuPTA7bjxtLmxlbmd0aDtuKyspe3ZhciBvLGk7KGk9KG89bVtuXSkuc3R5bGUpLmhlaWdodC5pbmRleE9mKCJ2aCIpPi0xJiYoZT1wYXJzZUludChpLmhlaWdodCkvMTAwLGQ9cCooaXNOYU4oZSk/MTplKSsicHgiLGkuaGVpZ2h0PWQpfX1mdW5jdGlvbiBuKCl7dmFyIGU9dD9zY3JlZW4ud2lkdGg6d2luZG93LmlubmVyV2lkdGg7d2luZG93LmlzTW9iaWxlJiYhdCYmKGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTtmb3IodmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnI6bm90KFtkYXRhLXJlY29yZC10eXBlPSIzOTYiXSwgW2RhdGEtcmVjb3JkLXR5cGU9IjEwMDMiXSwgW2RhdGEtcGFyZW50dHBsaWQ9IjM5NiJdLCBbZGF0YS1wYXJlbnR0cGxpZD0iMTAwMyJdKScpLG89W10saT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgcj1uW2ldLGE9Z2V0Q29tcHV0ZWRTdHlsZShyKTsibm9uZSIhPT1hLmRpc3BsYXkmJiJoaWRkZW4iIT09YS52aXNpYmlsaXR5JiYiMCIhPT1hLm9wYWNpdHkmJm8ucHVzaChyKX1mb3IodmFyIGw9MDtsPG8ubGVuZ3RoO2wrKylmb3IodmFyIGQ9b1tsXSxzPWQucXVlcnlTZWxlY3RvckFsbCgnZGl2Om5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbW9iaWxlLXdpZHRoPSJmYWxzZSJdKTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KC50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyKTpub3QoLnRuLWF0b21fX3ByeC13cmFwcGVyKTpub3QoLnRuLWF0b21fX3ZpZGVvaWZyYW1lKTpub3QoLnRuLWF0b21fX3N0aWNreS13cmFwcGVyKTpub3QoLnQtY2F0YWxvZ19fcmVsZXZhbnRzX19jb250YWluZXIpOm5vdCgudC1zbGRzX19pdGVtcy13cmFwcGVyKTpub3QoLmpzLXByb2R1Y3QtY29udHJvbHMtd3JhcHBlcik6bm90KC50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lcik6bm90KC50LXNsZHNfX2l0ZW1zLXdyYXBwZXIpOm5vdCguanMtcHJvZHVjdC1jb250cm9scy13cmFwcGVyKTpub3QoLmpzLXByb2R1Y3QtZWRpdGlvbi1vcHRpb24pOm5vdCgudC1wcm9kdWN0X19vcHRpb24tdmFyaWFudHMpJyksYz0wO2M8cy5sZW5ndGg7YysrKXt2YXIgdT1zW2NdO2Quc3R5bGUud29yZEJyZWFrPSIiO3ZhciBtPXRfb3V0ZXJXaWR0aCh1KTtpZihtPmUpe2lmKCJ5ZXMiPT09dS5nZXRBdHRyaWJ1dGUoIltkYXRhLWN1c3RvbXN0eWxlXSIpJiYiZmFsc2UiPT09dS5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgiW2RhdGEtYXV0by1jb3JyZWN0LW1vYmlsZS13aWR0aF0iKSlyZXR1cm47Y29uc29sZS5sb2coIkJsb2NrIG5vdCBvcHRpbWl6ZWQgZm9yIG1vYmlsZSB3aWR0aC4gQmxvY2sgd2lkdGg6IittKyIgQmxvY2sgaWQ6IitkLmdldEF0dHJpYnV0ZSgiaWQiKSksY29uc29sZS5sb2codSksZC5zdHlsZS5vdmVyZmxvdz0iYXV0byIsZC5zdHlsZS53b3JkQnJlYWs9bS0zPmU/ImJyZWFrLXdvcmQiOiIifX19ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnQtdGV4dDpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LW5hbWU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC10aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LWRlc2NyOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtaGVhZGluZzpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXRleHQtaW1wYWN0Om5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtc3VidGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC11cHRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKScpLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXSxpPW8uZ2V0QXR0cmlidXRlKCJzdHlsZSIpO2lmKGkpe3ZhciByPSJyZW0iPT09by5nZXRBdHRyaWJ1dGUoImRhdGEtYXV0by1jb3JyZWN0LWZvbnQtc2l6ZSIpLGE7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoPnQpYT0oYT1pLnJlcGxhY2UoImxpbmVoZWlnaHQiLCJsaW5lLWhlaWdodCIpKS5yZXBsYWNlKCJmb250c2l6ZSIsImZvbnQtc2l6ZSIpLG8uc2V0QXR0cmlidXRlKCJzdHlsZSIsYSk7ZWxzZXtpZigtMT09PWkuaW5kZXhPZigiZm9udC1zaXplIikpY29udGludWU7aWYocGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKTwyNiljb250aW51ZTthPWkucmVwbGFjZSgibGluZS1oZWlnaHQiLCJsaW5laGVpZ2h0IiksYT1yP2EucmVwbGFjZSgvZm9udC1zaXplLipweDsvZ2ksImZvbnQtc2l6ZTogMS42cmVtOyIpOmEucmVwbGFjZSgiZm9udC1zaXplIiwiZm9udHNpemUiKSxvLnNldEF0dHJpYnV0ZSgic3R5bGUiLGEpfX19fSh3aW5kb3cuaXNNb2JpbGV8fHdpbmRvdy5wYXJlbnQuaXNQYWdlUHJldmlldykmJih0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dChlLDQwMCl9KSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoZSw0MDApfSkpLHdpbmRvdy5pbm5lcldpZHRoPDQ4MHx8d2luZG93LmlzTW9iaWxlJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg8NDgwfHx0JiZzY3JlZW4ud2lkdGg8NDgwPyh0X29uUmVhZHkoKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWN1c3RvbXN0eWxlPSJ5ZXMiXScpLGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2ZpZWxkXSBzcGFuLCBbZmllbGRdIHN0cm9uZywgW2ZpZWxkXSBlbSwgW2ZpZWxkXSBhIiksbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dO3BhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoaSkuZm9udFNpemUucmVwbGFjZSgicHgiLCIiKSk+MjYmJihpLnN0eWxlLmZvbnRTaXplPW51bGwsaS5zdHlsZS5saW5lSGVpZ2h0PW51bGwpfWZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaT1lW25dO3BhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoaSkuZm9udFNpemUucmVwbGFjZSgicHgiLCIiKSk+MjYmJihpLnN0eWxlLmZvbnRTaXplPW51bGwpfW8oNDgwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7byg0ODApfSksNTAwKX0pKX0pKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsbiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe24oKX0pLDUwMCl9KSkpOih3aW5kb3cuaW5uZXJXaWR0aDw5MDB8fHdpbmRvdy5pc01vYmlsZSYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoPDkwMHx8dCYmc2NyZWVuLndpZHRoPDkwMCkmJnRfb25SZWFkeSgoZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJyksZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZmllbGRdIHNwYW4sIFtmaWVsZF0gc3Ryb25nLCBbZmllbGRdIGVtLCBbZmllbGRdIGEiKSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBvPXRbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4zMCYmKG8uc3R5bGUuZm9udFNpemU9bnVsbCxvLnN0eWxlLmxpbmVIZWlnaHQ9bnVsbCl9Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBvPWVbbl07cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShvKS5mb250U2l6ZS5yZXBsYWNlKCJweCIsIiIpKT4zMCYmKG8uc3R5bGUuZm9udFNpemU9bnVsbCl9Zm9yKHZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LXRleHQ6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1uYW1lOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtdGl0bGU6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC1kZXNjcjpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LWhlYWRpbmc6bm90KC50bi1lbGVtKTpub3QoLnRuLWF0b20pOm5vdChbZGF0YS1hdXRvLWNvcnJlY3QtbGluZS1oZWlnaHQ9ImZhbHNlIl0pLCAudC10ZXh0LWltcGFjdDpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSksIC50LXN1YnRpdGxlOm5vdCgudG4tZWxlbSk6bm90KC50bi1hdG9tKTpub3QoW2RhdGEtYXV0by1jb3JyZWN0LWxpbmUtaGVpZ2h0PSJmYWxzZSJdKSwgLnQtdXB0aXRsZTpub3QoLnRuLWVsZW0pOm5vdCgudG4tYXRvbSk6bm90KFtkYXRhLWF1dG8tY29ycmVjdC1saW5lLWhlaWdodD0iZmFsc2UiXSknKSxuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBvLHI9KG89aVtuXSkuZ2V0QXR0cmlidXRlKCJzdHlsZSIpO2lmKHImJnIuaW5kZXhPZigiZm9udC1zaXplIik+LTEmJnBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUobykuZm9udFNpemUucmVwbGFjZSgicHgiLCIiKSk+MzApaWYoInJlbSI9PT1vLmdldEF0dHJpYnV0ZSgiZGF0YS1hdXRvLWNvcnJlY3QtZm9udC1zaXplIikpe3ZhciBhPXIucmVwbGFjZSgvZm9udC1zaXplLipweDsvZ2ksImZvbnQtc2l6ZTogMS42cmVtOyIpLnJlcGxhY2UoImxpbmUtaGVpZ2h0IiwibGluZWhlaWdodCIpO28uc2V0QXR0cmlidXRlKCJzdHlsZSIsYSl9ZWxzZXt2YXIgYT1yLnJlcGxhY2UoImZvbnQtc2l6ZSIsImZvbnRzaXplIikucmVwbGFjZSgibGluZS1oZWlnaHQiLCJsaW5laGVpZ2h0Iik7by5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKX19fSkpKX0oKSx0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYVtocmVmXj0iaHR0cCJdW3RhcmdldD0iX2JsYW5rIl0nKSxlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV0sbz1uLmdldEF0dHJpYnV0ZSgicmVsIil8fCIiOyIiPT09bz9uLnNldEF0dHJpYnV0ZSgicmVsIiwibm9vcGVuZXIiKTotMT09PW8uaW5kZXhPZigibm9vcGVuZXIiKSYmbi5zZXRBdHRyaWJ1dGUoInJlbCIsbysiIG5vb3BlbmVyIil9fSksMjUwMCl9KSksZnVuY3Rpb24odCxlKXt0Lm9uZXJyb3I9ZnVuY3Rpb24oZSxuLG8saSxyKXsib2JqZWN0IiE9dHlwZW9mIHQudF9qc2Vycm9ycyYmKHQudF9qc2Vycm9ycz1bXSksdC50X2pzZXJyb3JzLnB1c2goe21lc3NhZ2U6ZSxmaWxlbmFtZTpuLGxpbmVubzpvLGNvbG5vOmksZXJyb3I6cn0pfX0od2luZG93LE1hdGgpLHRfb25SZWFkeSgoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoInBvcHVwU2hvd2VkIix0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX2luaXQpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigicG9wdXBIaWRkZW4iLChmdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5zY3JvbGxCYXJXaWR0aENvbXBlbnNhdG9yO3QmJih0LmNhbmNlbFRpbWVvdXQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHQuY2FuY2VsVGltZW91dCksdC5jYW5jZWxUaW1lb3V0PW51bGwpLHQuY2FuY2VsVGltZW91dD13aW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmNhbmNlbFRpbWVvdXQ9bnVsbCx0X3Njcm9sbEJhcldpZHRoQ29tcGVuc2F0b3JfX2NhbmNlbCgpfSksTWF0aC5taW4oMzAwLHQuZGVsYXkpKSl9KSl9KSksd2luZG93LnNjcm9sbEJhcldpZHRoQ29tcGVuc2F0b3I7Cgp3aW5kb3cubm9qc2NvZGU9ITAKZnVuY3Rpb24gdF9sYXp5bG9hZF91cGRhdGUoKXsidW5kZWZpbmVkIiE9dHlwZW9mIGxhenlsb2FkX2NvdmVyJiZsYXp5bG9hZF9jb3Zlci51cGRhdGUoKSwidW5kZWZpbmVkIiE9dHlwZW9mIGxhenlsb2FkX2ltZyYmbGF6eWxvYWRfaW1nLnVwZGF0ZSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfYmdpbWcmJmxhenlsb2FkX2JnaW1nLnVwZGF0ZSgpLCJ1bmRlZmluZWQiIT10eXBlb2YgbGF6eWxvYWRfaWZyYW1lJiZsYXp5bG9hZF9pZnJhbWUudXBkYXRlKCl9ZnVuY3Rpb24gdF9sYXp5bG9hZF91cGRhdGVSZXNpemVfZWxlbShlKXtpZih3aW5kb3cualF1ZXJ5JiZlIGluc3RhbmNlb2YgalF1ZXJ5KXtpZigwPT1lLmxlbmd0aClyZXR1cm47ZT1lLmdldCgwKX1pZihudWxsIT1lKXt2YXIgdD1lLnRhZ05hbWU7aWYoIklNRyI9PXQpdmFyIG89ZS5nZXRBdHRyaWJ1dGUoInNyYyIpLG49Ii0vcmVzaXplLyI7ZWxzZSBpZigidW5kZWZpbmVkIiE9dHlwZW9mIGdldENvbXB1dGVkU3R5bGUpe3ZhciBvPWdldENvbXB1dGVkU3R5bGUoZSlbImJhY2tncm91bmQtaW1hZ2UiXS5yZXBsYWNlKCJ1cmwoIiwiIikucmVwbGFjZSgiKSIsIiIpLnJlcGxhY2UoLyIvZ2ksIiIpLGk7aWYoImNvbnRhaW4iPT1nZXRDb21wdXRlZFN0eWxlKGUpWyJiYWNrZ3JvdW5kLXNpemUiXSl2YXIgbj0iLS9jb250YWluLyI7ZWxzZSB2YXIgbj0iLS9jb3Zlci8ifWVsc2UgdmFyIG49Ii0vY292ZXIvIjtpZighKG51bGw9PW98fC0xPT09by5pbmRleE9mKG4pfHxvLmluZGV4T2YoIi5zdmciKT4wfHxvLmluZGV4T2YoIi5naWYiKT4wfHxvLmluZGV4T2YoIi5pY28iKT4wfHwtMT09PW8uaW5kZXhPZigidGh1bWIudGlsZGFjZG4uY29tIil8fG8uaW5kZXhPZigiLS9lbXB0eS8iKT4wJiZvLmluZGV4T2YoIi0vcmVzaXplYi8iKT4wKSl7dmFyIGw9by5pbmRleE9mKG4pK24ubGVuZ3RoLGE9by5pbmRleE9mKCIvIixsKTtpZihsPjAmJmE+MCl7dmFyIHI9by5zbGljZShsLGEpLnNwbGl0KCJ4Iikscz1lLmNsaWVudFdpZHRoLGM9ZS5jbGllbnRIZWlnaHQ7aWYocz4wJiZjPjAmJihyWzBdPjB8fHJbMV0+MCkmJihyWzBdPjAmJnM+clswXXx8clsxXT4wJiZjPnJbMV0pJiYoclswXT4wJiZzLXJbMF0+MTAwfHxyWzFdPjAmJmMtclsxXT4xMDApKXt2YXIgZD1vLnNsaWNlKDAsbCkrKHJbMF0+MD9zOiIiKSsieCIrKHJbMV0+MD9jOiIiKStvLnN1YnN0cmluZyhhKTsiSU1HIj09dD9lLnNldEF0dHJpYnV0ZSgic3JjIixkKTplLnN0eWxlLmJhY2tncm91bmRJbWFnZT0idXJsKCciK2QrIicpIn19fX19IWZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sdCk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPXQoKTplLkxhenlMb2FkPXQoKX0od2luZG93LChmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXttfHwoaD17ZWxlbWVudHNfc2VsZWN0b3I6ImltZyIsY29udGFpbmVyOndpbmRvdyx0aHJlc2hvbGQ6MzAwLHRocm90dGxlOjUwLGRhdGFfc3JjOiJvcmlnaW5hbCIsZGF0YV9zcmNzZXQ6Im9yaWdpbmFsLXNldCIsY2xhc3NfbG9hZGluZzoibG9hZGluZyIsY2xhc3NfbG9hZGVkOiJsb2FkZWQiLHNraXBfaW52aXNpYmxlOiEwLHNob3dfd2hpbGVfbG9hZGluZzohMCxjYWxsYmFja19sb2FkOm51bGwsY2FsbGJhY2tfZXJyb3I6bnVsbCxjYWxsYmFja19zZXQ6bnVsbCxjYWxsYmFja19wcm9jZXNzZWQ6bnVsbCxwbGFjZWhvbGRlcjoiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBQUFBQVAvLy95SDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUJSQUE3In0scD0hIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyLGY9ISF3aW5kb3cuYXR0YWNoRXZlbnQsZz0hIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LG09ITApfWZ1bmN0aW9uIHQoZSx0LG8pe3ZhciBuO3A/ZS5hZGRFdmVudExpc3RlbmVyKHQsbyk6ZiYmKGUuYXR0YWNoRXZlbnQoIm9uIit0LChuPWUsZnVuY3Rpb24oKXtvLmNhbGwobix3aW5kb3cuZXZlbnQpfSkpLGU9bnVsbCl9ZnVuY3Rpb24gbyhlLHQsbyl7cD9lLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxvKTpmJiZlLmRldGFjaEV2ZW50KCJvbiIrdCxvKX1mdW5jdGlvbiBuKGUsdCxvKXt2YXIgbixpLGw7ZnVuY3Rpb24gYSgpe3JldHVybiB3aW5kb3cuaW5uZXJXaWR0aHx8bi5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGh9ZnVuY3Rpb24gcigpe3JldHVybiB3aW5kb3cuaW5uZXJIZWlnaHR8fG4uZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AraS1uLmRvY3VtZW50RWxlbWVudC5jbGllbnRUb3B9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0K2wtbi5kb2N1bWVudEVsZW1lbnQuY2xpZW50TGVmdH1mdW5jdGlvbiBkKCl7dmFyIG47cmV0dXJuKG49dD09PXdpbmRvdz9yKCkraTpzKHQpK3Qub2Zmc2V0SGVpZ2h0KTw9cyhlKS1vfWZ1bmN0aW9uIHUoKXt2YXIgbjtyZXR1cm4obj10PT09d2luZG93P2EoKSt3aW5kb3cucGFnZVhPZmZzZXQ6Yyh0KSthKCkpPD1jKGUpLW99ZnVuY3Rpb24gXygpe3ZhciBvLG49MTIwMDtyZXR1cm4obz10PT09d2luZG93P2k6cyh0KSk+PXMoZSkrbitlLm9mZnNldEhlaWdodH1mdW5jdGlvbiBoKCl7dmFyIG47cmV0dXJuKG49dD09PXdpbmRvdz9sOmModCkpPj1jKGUpK28rZS5vZmZzZXRXaWR0aH1yZXR1cm4gbj1lLm93bmVyRG9jdW1lbnQsaT13aW5kb3cucGFnZVlPZmZzZXR8fG4uYm9keS5zY3JvbGxUb3AsbD13aW5kb3cucGFnZVhPZmZzZXR8fG4uYm9keS5zY3JvbGxMZWZ0LCJmaXhlZCI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1jb250ZW50LWNvdmVyLXBhcmFsbGF4IikmJmUuY2xvc2VzdCYmZS5jbG9zZXN0KCIudC1jb3Zlcl9fY29udGFpbmVyIikmJihlPWUuY2xvc2VzdCgiLnQtY292ZXJfX2NvbnRhaW5lciIpKSwhKGQoKXx8XygpfHx1KCl8fGgoKSl9ZnVuY3Rpb24gaSgpe3ZhciBlO3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfWZ1bmN0aW9uIGwoZSx0KXt2YXIgbz17fSxuO2ZvcihuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKG9bbl09ZVtuXSk7Zm9yKG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYob1tuXT10W25dKTtyZXR1cm4gb31mdW5jdGlvbiBhKGUpe3ZhciB0O3RyeXt0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpfWNhdGNoKGwpe3ZhciBvPVtdLG4saT1lLmxlbmd0aDtmb3Iobj0wO248aTtuKyspby5wdXNoKGVbbl0pO3Q9b31yZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmlzU2tpcEJ5UG9zaXRpb249bnVsbD09PWUub2Zmc2V0UGFyZW50JiYwPT09cihlLCIudDM5Nl9fY2Fycmllci13cmFwcGVyIikubGVuZ3RoJiYiZml4ZWQiIT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtY29udGVudC1jb3Zlci1wYXJhbGxheCIpLGUuaXNOb3RVbmRlclNjcmVlblJhbmdlPTA9PT1yKGUsIi50LXJlY1tkYXRhLXNjcmVlbi1tYXhdIikubGVuZ3RoJiYwPT09cihlLCIudC1yZWNbZGF0YS1zY3JlZW4tbWluXSIpLmxlbmd0aH0pKSx0fWZ1bmN0aW9uIHIoZSx0KXtmb3IodmFyIG89W107KGU9ZS5wYXJlbnROb2RlKSYmZSE9PWRvY3VtZW50Oyl0JiYhZS5tYXRjaGVzKHQpfHxvLnVuc2hpZnQoZSk7cmV0dXJuIG99ZnVuY3Rpb24gcyhlLHQpe2c/ZS5jbGFzc0xpc3QuYWRkKHQpOmUuY2xhc3NOYW1lKz0oZS5jbGFzc05hbWU/IiAiOiIiKSt0fWZ1bmN0aW9uIGMoZSx0KXtnP2UuY2xhc3NMaXN0LnJlbW92ZSh0KTplLmNsYXNzTmFtZT1lLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoIihefFxccyspIit0KyIoXFxzK3wkKSIpLCIgIikucmVwbGFjZSgvXlxzKy8sIiIpLnJlcGxhY2UoL1xzKyQvLCIiKX1mdW5jdGlvbiBkKGUsdCxvLG4pe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrbiksbD10LmdldEF0dHJpYnV0ZSgiZGF0YS0iK28pLGE9ZS50YWdOYW1lO3JldHVybiJJTUciPT09YT8obCYmZS5zZXRBdHRyaWJ1dGUoInNyY3NldCIsbCksdm9pZChpJiZlLnNldEF0dHJpYnV0ZSgic3JjIixpKSkpOiJJRlJBTUUiPT09YT92b2lkKGkmJmUuc2V0QXR0cmlidXRlKCJzcmMiLGkpKTp2b2lkKGUuc3R5bGUuYmFja2dyb3VuZEltYWdlPSJ1cmwoIitpKyIpIil9ZnVuY3Rpb24gdShlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19ZnVuY3Rpb24gXyhvKXtlKCksdGhpcy5fc2V0dGluZ3M9bChoLG8pLHRoaXMuX3F1ZXJ5T3JpZ2luTm9kZT10aGlzLl9zZXR0aW5ncy5jb250YWluZXI9PT13aW5kb3c/ZG9jdW1lbnQ6dGhpcy5fc2V0dGluZ3MuY29udGFpbmVyLHRoaXMuX3ByZXZpb3VzTG9vcFRpbWU9MCx0aGlzLl9sb29wVGltZW91dD1udWxsLHRoaXMuX2hhbmRsZVNjcm9sbEZuPXUodGhpcy5oYW5kbGVTY3JvbGwsdGhpcyksdCh3aW5kb3csInJlc2l6ZSIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pLHRoaXMudXBkYXRlKCl9d2luZG93LnRfbGF6eWxvYWRfc2V0U291cmNlcz1kO3ZhciBoLHAsZixnLG09ITE7cmV0dXJuIF8ucHJvdG90eXBlLl9zaG93T25Mb2FkPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXtudWxsIT09bCYmKGwuY2FsbGJhY2tfbG9hZCYmbC5jYWxsYmFja19sb2FkKGUpLGQoZSxlLGwuZGF0YV9zcmNzZXQsbC5kYXRhX3NyYyksbC5jYWxsYmFja19zZXQmJmwuY2FsbGJhY2tfc2V0KGUpLGMoZSxsLmNsYXNzX2xvYWRpbmcpLHMoZSxsLmNsYXNzX2xvYWRlZCksbyhpLCJsb2FkIixuKSl9dmFyIGksbD10aGlzLl9zZXR0aW5ncztlLmdldEF0dHJpYnV0ZSgic3JjIil8fGUuc2V0QXR0cmlidXRlKCJzcmMiLGwucGxhY2Vob2xkZXIpLHQoaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSwibG9hZCIsbiksdChpLCJlcnJvciIsKGZ1bmN0aW9uKCl7YyhlLGwuY2xhc3NfbG9hZGluZyksbC5jYWxsYmFja19lcnJvciYmbC5jYWxsYmFja19lcnJvcihlKX0pKSxzKGUsbC5jbGFzc19sb2FkaW5nKSxkKGksZSxsLmRhdGFfc3Jjc2V0LGwuZGF0YV9zcmMpfSxfLnByb3RvdHlwZS5fc2hvd09uQXBwZWFyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oKXtudWxsIT09aSYmKGkuY2FsbGJhY2tfbG9hZCYmaS5jYWxsYmFja19sb2FkKGUpLGMoZSxpLmNsYXNzX2xvYWRpbmcpLHMoZSxpLmNsYXNzX2xvYWRlZCksbyhlLCJsb2FkIixuKSl9dmFyIGk9dGhpcy5fc2V0dGluZ3M7KCJJTUciPT09ZS50YWdOYW1lfHwiSUZSQU1FIj09PWUudGFnTmFtZSkmJih0KGUsImxvYWQiLG4pLHQoZSwiZXJyb3IiLChmdW5jdGlvbigpe28oZSwibG9hZCIsbiksYyhlLGkuY2xhc3NfbG9hZGluZyksaS5jYWxsYmFja19lcnJvciYmaS5jYWxsYmFja19lcnJvcihlKX0pKSxzKGUsaS5jbGFzc19sb2FkaW5nKSksZChlLGUsaS5kYXRhX3NyY3NldCxpLmRhdGFfc3JjKSxpLmNhbGxiYWNrX3NldCYmaS5jYWxsYmFja19zZXQoZSl9LF8ucHJvdG90eXBlLl9sb29wVGhyb3VnaEVsZW1lbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXMuX3NldHRpbmdzLGk9dGhpcy5fZWxlbWVudHMsbD1pP2kubGVuZ3RoOjAsYT1bXTtmb3IoZT0wO2w+ZTtlKyspdD1pW2VdLG8uc2tpcF9pbnZpc2libGUmJnQuaXNTa2lwQnlQb3NpdGlvbnx8bih0LG8uY29udGFpbmVyLG8udGhyZXNob2xkKSYmKG8uc2hvd193aGlsZV9sb2FkaW5nP3RoaXMuX3Nob3dPbkFwcGVhcih0KTp0aGlzLl9zaG93T25Mb2FkKHQpLGEucHVzaChlKSx0Lndhc1Byb2Nlc3NlZD0hMCk7Zm9yKDthLmxlbmd0aD4wOylpLnNwbGljZShhLnBvcCgpLDEpLG8uY2FsbGJhY2tfcHJvY2Vzc2VkJiZvLmNhbGxiYWNrX3Byb2Nlc3NlZChpLmxlbmd0aCk7MD09PWwmJnRoaXMuX3N0b3BTY3JvbGxIYW5kbGVyKCl9LF8ucHJvdG90eXBlLl9wdXJnZUVsZW1lbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXMuX2VsZW1lbnRzLG49by5sZW5ndGgsaT1bXTtmb3IoZT0wO24+ZTtlKyspKHQ9b1tlXSkud2FzUHJvY2Vzc2VkJiZpLnB1c2goZSk7Zm9yKDtpLmxlbmd0aD4wOylvLnNwbGljZShpLnBvcCgpLDEpfSxfLnByb3RvdHlwZS5fc3RhcnRTY3JvbGxIYW5kbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNIYW5kbGluZ1Njcm9sbHx8KHRoaXMuX2lzSGFuZGxpbmdTY3JvbGw9ITAsdCh0aGlzLl9zZXR0aW5ncy5jb250YWluZXIsInNjcm9sbCIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pKX0sXy5wcm90b3R5cGUuX3N0b3BTY3JvbGxIYW5kbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNIYW5kbGluZ1Njcm9sbCYmKHRoaXMuX2lzSGFuZGxpbmdTY3JvbGw9ITEsbyh0aGlzLl9zZXR0aW5ncy5jb250YWluZXIsInNjcm9sbCIsdGhpcy5faGFuZGxlU2Nyb2xsRm4pKX0sXy5wcm90b3R5cGUuaGFuZGxlU2Nyb2xsPWZ1bmN0aW9uKCl7dmFyIGUsdCxvO3RoaXMuX3NldHRpbmdzJiYodD1pKCksMCE9PShvPXRoaXMuX3NldHRpbmdzLnRocm90dGxlKT8wPj0oZT1vLSh0LXRoaXMuX3ByZXZpb3VzTG9vcFRpbWUpKXx8ZT5vPyh0aGlzLl9sb29wVGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl9sb29wVGltZW91dCksdGhpcy5fbG9vcFRpbWVvdXQ9bnVsbCksdGhpcy5fcHJldmlvdXNMb29wVGltZT10LHRoaXMuX2xvb3BUaHJvdWdoRWxlbWVudHMoKSk6dGhpcy5fbG9vcFRpbWVvdXR8fCh0aGlzLl9sb29wVGltZW91dD1zZXRUaW1lb3V0KHUoKGZ1bmN0aW9uKCl7dGhpcy5fcHJldmlvdXNMb29wVGltZT1pKCksdGhpcy5fbG9vcFRpbWVvdXQ9bnVsbCx0aGlzLl9sb29wVGhyb3VnaEVsZW1lbnRzKCl9KSx0aGlzKSxlKSk6dGhpcy5fbG9vcFRocm91Z2hFbGVtZW50cygpKX0sXy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudHM9YSh0aGlzLl9xdWVyeU9yaWdpbk5vZGUucXVlcnlTZWxlY3RvckFsbCh0aGlzLl9zZXR0aW5ncy5lbGVtZW50c19zZWxlY3RvcikpLHRoaXMuX3B1cmdlRWxlbWVudHMoKSx0aGlzLl9sb29wVGhyb3VnaEVsZW1lbnRzKCksdGhpcy5fc3RhcnRTY3JvbGxIYW5kbGVyKCl9LF8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtvKHdpbmRvdywicmVzaXplIix0aGlzLl9oYW5kbGVTY3JvbGxGbiksdGhpcy5fbG9vcFRpbWVvdXQmJihjbGVhclRpbWVvdXQodGhpcy5fbG9vcFRpbWVvdXQpLHRoaXMuX2xvb3BUaW1lb3V0PW51bGwpLHRoaXMuX3N0b3BTY3JvbGxIYW5kbGVyKCksdGhpcy5fZWxlbWVudHM9bnVsbCx0aGlzLl9xdWVyeU9yaWdpbk5vZGU9bnVsbCx0aGlzLl9zZXR0aW5ncz1udWxsfSxffSkpLHdpbmRvdy5sYXp5PSJ5Iix0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtsYXp5bG9hZF9jb3Zlcj1uZXcgTGF6eUxvYWQoe2VsZW1lbnRzX3NlbGVjdG9yOiIudC1jb3Zlcl9fY2FycmllciIsc2hvd193aGlsZV9sb2FkaW5nOiExLGRhdGFfc3JjOiJjb250ZW50LWNvdmVyLWJnIixwbGFjZWhvbGRlcjoiIix0aHJlc2hvbGQ6NzAwfSl9KSwxMDApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYobGF6eWxvYWRfaW1nPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWltZyIsdGhyZXNob2xkOjgwMH0pLGxhenlsb2FkX2JnaW1nPW5ldyBMYXp5TG9hZCh7ZWxlbWVudHNfc2VsZWN0b3I6Ii50LWJnaW1nIixzaG93X3doaWxlX2xvYWRpbmc6ITEscGxhY2Vob2xkZXI6IiIsdGhyZXNob2xkOjgwMH0pLGxhenlsb2FkX2lmcmFtZT1uZXcgTGF6eUxvYWQoe2VsZW1lbnRzX3NlbGVjdG9yOiIudC1pZnJhbWUifSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2xpZGUuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2xhenlsb2FkX2NvdmVyLnVwZGF0ZSgpLGxhenlsb2FkX2ltZy51cGRhdGUoKSxsYXp5bG9hZF9iZ2ltZy51cGRhdGUoKX0pLDUwMCl9KSksL0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3Qpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NMaXN0LmFkZCgidC1tYmZpeCIpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtbWJmaXgiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuY2xhc3NMaXN0LmFkZCgidC1tYmZpeF9oaWRlIil9KSw1MCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtudWxsIT09dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9KSwxZTMpfX0pLDUwMCl9KSk7CgpmdW5jdGlvbiB0X2FuaW1hdGVfX2luaXQoKXt0X2FuaW1hdGVfX2NoZWNrQW5pbWF0aW9uQXZhaWxhYmlsaXR5KCkmJih0X2FuaW1hdGVfX2dlbmVyYXRlU3R5bGVzKCksdF9hbmltYXRlX193cmFwVGV4dFdpdGhPcGFjaXR5KCksdF9hbmltYXRlX19hZGROb0hvdmVyQ2xhc3NUb0J0bnMoKSx0X2FuaW1hdGVfX3ByZXZlbnRIb3Jpem9udGFsU2Nyb2xsKCksZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoPj0xMjAwJiZ0X2FuaW1hdGVfX3BhcnNlTnVtYmVyVGV4dCgpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19zdGFydEFuaW1hdGlvbigpfSksMTUwMCkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tNb2JpbGUodCl7cmV0dXJuIHQuZmlsdGVyKChmdW5jdGlvbih0KXt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19lbGVtLCAudDM5Nl9fZ3JvdXAiKSxhLG47cmV0dXJuISghZXx8InkiIT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1tb2JpbGUiKSl8fCh0LmNsYXNzTGlzdC5jb250YWlucygiciIpP0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlIiksKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwiIil9KSk6dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LCIiKSwhMSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LGUpe2lmKHQpe3ZhciBhPSJ0LWFuaW1hdGUiO3QuY2xhc3NMaXN0LnJlbW92ZShhKSxlJiYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49YSsiXyIrZTt0LmNsYXNzTGlzdC5yZW1vdmUobil9KSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3ByZXZlbnRIb3Jpem9udGFsU2Nyb2xsKCl7dmFyIHQsZT1BcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXScpKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCwgLnQtY292ZXIiKSYmdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodD53aW5kb3cuaW5uZXJXaWR0aH0pKTshZS5sZW5ndGh8fHdpbmRvdy5pbm5lcldpZHRoPDk4MHx8ZS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTt0LmNsb3Nlc3QoIi5yIikuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19vdmVyZmxvdy14LWhpZGRlbiIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tBbmltYXRpb25BdmFpbGFiaWxpdHkoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1yZWNvcmRzIiksZT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLWJsb2Nrcy1hbmltYXRpb25vZmYiKTpudWxsLGE9dD90LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik6bnVsbDtpZigvQm90L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8InllcyI9PT1lfHx0X2FuaW1hdGVfX2NoZWNrSUUoKXx8ImVkaXQiPT09YSl7dmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO3JldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwiIil9KSksITF9cmV0dXJuITB9ZnVuY3Rpb24gdF9hbmltYXRlX19nZW5lcmF0ZVN0eWxlcygpe3ZhciB0O2lmKCEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQzOTYiKSl7Zm9yKHZhciBlPXRfYW5pbWF0ZV9fZ2V0QnJlYWtwb2ludHNBcnIoKSxhPScudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWluIl0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnVwIl0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmRvd24iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlubGVmdCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5yaWdodCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29taW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZT0iem9vbW91dCJdIHtvcGFjaXR5OiAwOy13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtO3RyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHksIHRyYW5zZm9ybTstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDFzO3RyYW5zaXRpb24tZHVyYXRpb246IDFzOy13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjE5LCAxLCAwLjIyLCAxKTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpOy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjt9JyxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJmYWRlaW51cCJdLC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0nK2kubWluUmVzKyc9ImZhZGVpbmRvd24iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJmYWRlaW5sZWZ0Il0sLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLScraS5taW5SZXMrJz0iZmFkZWlucmlnaHQiXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJ6b29taW4iXSwudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtJytpLm1pblJlcysnPSJ6b29tb3V0Il0ge29wYWNpdHk6IDA7LXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5LCB0cmFuc2Zvcm07dHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtOy13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7dHJhbnNpdGlvbi1kdXJhdGlvbjogMXM7LXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMTksIDEsIDAuMjIsIDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4xOSwgMSwgMC4yMiwgMSk7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO319Jyl9YSs9Jy50Mzk2IC50LXRpdGxlLnQtYW5pbWF0ZSB7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAxLjJzO3RyYW5zaXRpb24tZHVyYXRpb246IDEuMnM7fS50Mzk2IC50LWRlc2NyLnQtYW5pbWF0ZSwudDM5NiAudC11cHRpdGxlLnQtYW5pbWF0ZSwudDM5NiAudC1zdWJ0aXRsZS50LWFuaW1hdGUsLnQzOTYgLnQtdGV4dC50LWFuaW1hdGUgey13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC43czt0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjdzO30udDM5NiAudC1pdGVtLnQtYW5pbWF0ZSB7LXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjVzO3RyYW5zaXRpb24tZHVyYXRpb246IDAuNXM7fS50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW4iXSB7b3BhY2l0eTogMDt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW4iXSB7b3BhY2l0eTogMDt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWluIl0ge29wYWNpdHk6IDE7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbiJdIHtvcGFjaXR5OiAxO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW51cCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAxMDBweCk7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW51cCJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAxMDBweCk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWludXAiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbnVwIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5kb3duIl0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTEwMHB4KTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtMTAwcHgpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWluZG93biJdIHstd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIC0xMDBweCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgLTEwMHB4KTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5kb3duIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJmYWRlaW5kb3duIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5sZWZ0Il0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTAwcHgsIDApO3RyYW5zZm9ybTogdHJhbnNsYXRlKDEwMHB4LCAwKTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbmxlZnQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxMDBweCwgMCk7dHJhbnNmb3JtOiB0cmFuc2xhdGUoMTAwcHgsIDApO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbmxlZnQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbmxlZnQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9ImZhZGVpbnJpZ2h0Il0gey13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTEwMHB4LCAwKTt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIDApO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iZmFkZWlucmlnaHQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtMTAwcHgsIDApO3RyYW5zZm9ybTogdHJhbnNsYXRlKC0xMDBweCwgMCk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iZmFkZWlucmlnaHQiXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogbm9uZTt0cmFuc2Zvcm06IG5vbmU7fSc7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpOyhpPXRfYW5pbWF0ZV9fZ2V0TWVkaWFRdWVyeShlLG4pKS5pc0NvbnRpbnVlfHwoYSs9aS50ZXh0KyIjYWxscmVjb3JkcyAudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlLXJlcy0iK2kubWluUmVzKyc9ImZhZGVpbnJpZ2h0Il0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7dHJhbnNmb3JtOiBub25lO319Jyl9YSs9Jy50Mzk2IC50LWFuaW1hdGVbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29taW4iXSB7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuOSk7dHJhbnNmb3JtOiBzY2FsZSgwLjkpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iem9vbWluIl0gey13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjkpO3RyYW5zZm9ybTogc2NhbGUoMC45KTt9fScpfWErPScudDM5NiAudC1hbmltYXRlX3N0YXJ0ZWRbZGF0YS1hbmltYXRlLXN0eWxlPSJ6b29taW4iXSB7b3BhY2l0eTogMTstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7dHJhbnNmb3JtOiBzY2FsZSgxKTt9Jztmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iem9vbWluIl0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO3RyYW5zZm9ybTogc2NhbGUoMSk7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9Inpvb21vdXQiXSB7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMik7dHJhbnNmb3JtOiBzY2FsZSgxLjIpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGUtcmVzLSIraS5taW5SZXMrJz0iem9vbW91dCJdIHstd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4yKTt0cmFuc2Zvcm06IHNjYWxlKDEuMik7fX0nKX1hKz0nLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZT0iem9vbW91dCJdIHtvcGFjaXR5OiAxOy13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTt0cmFuc2Zvcm06IHNjYWxlKDEpO30nO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgaTsoaT10X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkoZSxuKSkuaXNDb250aW51ZXx8KGErPWkudGV4dCsiI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29tb3V0Il0ge29wYWNpdHk6IDE7LXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO3RyYW5zZm9ybTogc2NhbGUoMSk7fX0nKX1hKz0iLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1kaXN0YW5jZV0sLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zY2FsZV17LXdlYmtpdC10cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt0cmFuc2Zvcm06IG5vbmUgIWltcG9ydGFudDt9Ijtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk7KGk9dF9hbmltYXRlX19nZXRNZWRpYVF1ZXJ5KGUsbikpLmlzQ29udGludWV8fChhKz1pLnRleHQrIiNhbGxyZWNvcmRzIC50Mzk2IC50LWFuaW1hdGVfc3RhcnRlZFtkYXRhLWFuaW1hdGUtZGlzdGFuY2UtcmVzLSIraS5taW5SZXMrIl0sI2FsbHJlY29yZHMgLnQzOTYgLnQtYW5pbWF0ZV9zdGFydGVkW2RhdGEtYW5pbWF0ZS1zdHlsZS1yZXMtIitpLm1pblJlcysnPSJ6b29tb3V0Il0gey13ZWJraXQtdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7dHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7fX0nKX12YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLG89ZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO3IudGV4dENvbnRlbnQ9YSxvLmFwcGVuZENoaWxkKHIpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEJyZWFrcG9pbnRzQXJyKCl7dmFyIHQ9W10sZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucltkYXRhLXJlY29yZC10eXBlPSIzOTYiXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucltkYXRhLXBhcmVudHRwbGlkPSIzOTYiXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJykpO3JldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUpe2lmKGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19hcnRib2FyZCIpKXt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1zY3JlZW5zIiksbj0oYT0oYT1hP2Euc3BsaXQoIiwiKTpbMTIwMCw5NjAsNjQwLDQ4MCwzMjBdKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBwYXJzZUludCh0LDEwKX0pKSkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4tMT09PXQuaW5kZXhPZihlKX0pKTt0PXQuY29uY2F0KG4pfX0pKSx0PXRfYW5pbWF0ZV9fc29ydEFycih0KX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldE1lZGlhUXVlcnkodCxlKXt2YXIgYT0iIixuPSExLGk9dFtlKzFdLHI9dFtlXS0xLG89ZT09PXQubGVuZ3RoLTEscz1lPT09dC5sZW5ndGgtMjtyZXR1cm4gbz9uPSEwOmErPXM/IkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICIrcisicHgpIHsiOiJAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAiK2krInB4KSBhbmQgKG1heC13aWR0aDogIityKyJweCkgeyIse3RleHQ6YSxpc0NvbnRpbnVlOm4sbWluUmVzOml9fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc29ydEFycih0KXtyZXR1cm4gdC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBlLXR9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19zdGFydEFuaW1hdGlvbigpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5yIiksZT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtZ3JvdXA9eWVzXSIpfSkpLGE9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHQsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3IoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLWNoYWluPSJ5ZXMiXScpfSkpLG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO2lmKG49QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiEoInllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWdyb3VwIil8fCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpfHx0LmdldEF0dHJpYnV0ZSgib2JzZXJ2ZXItcmVhZHkiKSl9KSksd2luZG93LmlubmVyV2lkdGg8MTIwMCYmKGU9dF9hbmltYXRlX19jaGVja01vYmlsZShlKSxhPXRfYW5pbWF0ZV9fY2hlY2tNb2JpbGUoYSksbj10X2FuaW1hdGVfX2NoZWNrTW9iaWxlKG4pKSxlLmxlbmd0aHx8bi5sZW5ndGh8fGEubGVuZ3RoKXt0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlKGUsYSxuKSxlPXRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbihlKSxuPXRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbihuKSxhPXRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbihhKTt2YXIgaT0idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmL14oKD8hY2hyb21lfGFuZHJvaWQpLikqKHNhZmFyaXxtb2JpbGUpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmLyhvcyB8dmVyc2lvblwvKTE1KC58XylbNC05XS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7aWYoIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdyYmIWkpe2lmKGUubGVuZ3RoKXt2YXIgcj1bXTtlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZSIpLGEsbjtpZigiZmFkZWluZG93biI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0eWxlIikmJmUuY2xvc2VzdCgiLnQtY292ZXIiKSl7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlOm5vdCg6Zmlyc3QtY2hpbGQpIik7aSYmKGU9aSl9ci5wdXNoKGUpfSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9e3Jvb3RNYXJnaW46dC5vZmZzZXRIZWlnaHQvNSotMSsicHggMHB4In0sYTtuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKHQsZSl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmlzSW50ZXJzZWN0aW5nKXt2YXIgYT10LnRhcmdldDtlLnVub2JzZXJ2ZShhKTt2YXIgbj1hLmNsb3Nlc3QoIi5yIikucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO249QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiEodC5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKXx8InllcyI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLWNoYWluIikpfSkpLHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KGEpLHRfYW5pbWF0ZV9fc2F2ZVNlY3Rpb25IZWFkZXJTdGFydFRpbWUoYSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV93YWl0IiksdF9hbmltYXRlX19yZW1vdmVOb0hvdmVyQ2xhc3NGcm9tQnRucyh0KSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSl9KSl9fSkpfSksZSkub2JzZXJ2ZSh0KX0pKX12YXIgbztpZihuLmxlbmd0aCYmbi5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT17fSxhPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJ0cmlnZ2VyLW9mZnNldCIpO2EmJihlLnJvb3RNYXJnaW49IjBweCAwcHggIistMSphLnJlcGxhY2UoInB4IiwiIikrInB4IDBweCIpO3ZhciBuPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBhPXQudGFyZ2V0O2lmKCFhLmRlbWFuZFRyYW5zZm9ybSYmYS5zdHlsZS50cmFuc2Zvcm0pYS5kZW1hbmRUcmFuc2Zvcm09YS5zdHlsZS50cmFuc2Zvcm0sYS5zdHlsZS50cmFuc2Zvcm09InVuc2V0IjtlbHNle3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnRyYW5zZm9ybTthLnN0eWxlLnRyYW5zZm9ybXx8Im5vbmUiPT09bnx8KGEuZGVtYW5kVHJhbnNmb3JtPW4sYS5zdHlsZS50cmFuc2Zvcm09InVuc2V0Iil9aWYodC5pc0ludGVyc2VjdGluZyl7YS5jbG9zZXN0KCIudDEwOTMiKXx8ZS51bm9ic2VydmUoYSk7dmFyIGk9YS5zdHlsZS50cmFuc2l0aW9uRGVsYXl8fCIwbXMiO2k9LTEhPT1pLmluZGV4T2YoIm1zIik/cGFyc2VJbnQoaSkrMjUwOjFlMypwYXJzZUZsb2F0KGkpKzI1MDt2YXIgcj1mdW5jdGlvbiB0KCl7YS5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnMoYSksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKGEsITApLCJhbmltYXRlZG51bWJlciI9PT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoYSwic3R5bGUiKSYmdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyhhKX07YS5kZW1hbmRUcmFuc2Zvcm0mJi0xIT09YS5kZW1hbmRUcmFuc2Zvcm0uaW5kZXhPZigibWF0cml4IikmJihhLnN0eWxlLnRyYW5zZm9ybT0iIiksYS5kZW1hbmRUcmFuc2Zvcm0mJiJ1bnNldCI9PT1hLnN0eWxlLnRyYW5zZm9ybSYmKGEuc3R5bGUudHJhbnNmb3JtPWEuZGVtYW5kVHJhbnNmb3JtLGRlbGV0ZSBhLmRlbWFuZFRyYW5zZm9ybSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyKCl9KSxpKX19KSl9KSxlKTt0LmRhdGFzZXQub2JzZXJ2ZXJSZWFkeT0hMCxuLm9ic2VydmUodCl9KSksYS5sZW5ndGgpKG89ZnVuY3Rpb24gdCgpe3RfYW5pbWF0ZV9fZ2V0Q2hhaW5PZmZzZXRzKGEpfSkoKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKChmdW5jdGlvbigpe28oKX0pKSksc2V0SW50ZXJ2YWwobyw1ZTMpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dmFyIHQsZT13aW5kb3cucGFnZVlPZmZzZXQrd2luZG93LmlubmVySGVpZ2h0O3RfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluc0Jsb2NrcyhhLGUpfSkpKX1lbHNle3ZhciBvOyhvPWZ1bmN0aW9uIHQoKXt0X2FuaW1hdGVfX2dldEdyb3Vwc09mZnNldHMoZSksdF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHMoYSksdF9hbmltYXRlX19nZXRFbGVtc09mZnNldHMobil9KSgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUobykpLHNldEludGVydmFsKG8sNWUzKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3ZhciB0PXRfYW5pbWF0ZV9fZGVsZXRlQW5pbWF0ZWRFbHMoZSxuKTtuPXRbMF07dmFyIGk9dF9hbmltYXRlX19hbmltYXRlT25TY3JvbGwoZT10WzFdLGEsbik7aSYmaS5sZW5ndGgmJihlPWlbMF0sYT1pWzFdLG49aVsyXSl9KSkpfUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cCIpO2UmJmUuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3ZhciB0PXdpbmRvdy5wYWdlWU9mZnNldCt3aW5kb3cuaW5uZXJIZWlnaHQ7aWYoZS5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZSIpJiYieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtY2hhaW4iKXx8ZS5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1jaGFpbj15ZXNdIikpe3ZhciBhPVtlXTt0X2FuaW1hdGVfX3NldEFuaW1hdGlvblN0YXRlQ2hhaW5zKGEpLHRfYW5pbWF0ZV9fZ2V0Q2hhaW5PZmZzZXRzKGE9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGEsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGVfd2FpdCIpfSkpKSx0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbnNCbG9ja3MoYSx0KX19KSkpfSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVPblNjcm9sbCh0LGUsYSl7aWYodC5sZW5ndGh8fGUubGVuZ3RofHxhLmxlbmd0aCl7dmFyIG49d2luZG93LnBhZ2VZT2Zmc2V0LGk9bit3aW5kb3cuaW5uZXJIZWlnaHQscixvLHM7cmV0dXJuW3RfYW5pbWF0ZV9fYW5pbWF0ZUdyb3Vwcyh0LGksbiksdF9hbmltYXRlX19hbmltYXRlQ2hhaW5zQmxvY2tzKGUsaSxuKSx0X2FuaW1hdGVfX2FuaW1hdGVFbGVtcyhhLGksbildfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVHcm91cHModCxlKXtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmN1clRvcE9mZnNldDxlKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKTthPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChhLChmdW5jdGlvbih0KXtyZXR1cm4hKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfX2J0bi13YWl0LWNoYWluIil8fCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpKX0pKSx0X2FuaW1hdGVfX21ha2VTZWN0aW9uQnV0dG9uV2FpdCh0KSx0X2FuaW1hdGVfX3NhdmVTZWN0aW9uSGVhZGVyU3RhcnRUaW1lKHQpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITEpfSkpfX0pKSx0fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUNoYWluc0Jsb2Nrcyh0LGUpe3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuaXRlbXNPZmZzZXRzWzBdPGUmJnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV93YWl0IikubGVuZ3RoJiYodF9hbmltYXRlX19hbmltYXRlQ2hhaW5JdGVtc09uU2Nyb2xsKHQsZSksdC5pdGVtc09mZnNldHMubGVuZ3RoJiZ0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbl9fb3V0T2ZUdXJuKHQpKX0pKSx0fWZ1bmN0aW9uIHRfYW5pbWF0ZV9fYW5pbWF0ZUVsZW1zKHQsZSxhKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBuPXRfYW5pbWF0ZV9fZGV0ZWN0RWxlbVRyaWdnZXJPZmZzZXQodCxlKTtyZXR1cm4gdC5jdXJUb3BPZmZzZXQ8bj8odC5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfd2FpdCIpLHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITEpLCJhbmltYXRlZG51bWJlciI9PT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic3R5bGUiKSYmdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyh0KSwhMCk6ISh0LmN1clRvcE9mZnNldDxhKSYmdm9pZCAwfSkpLHR9ZnVuY3Rpb24gdF9hbmltYXRlX19kZWxldGVBbmltYXRlZEVscyh0LGUpe3ZhciBhPXdpbmRvdy5wYWdlWU9mZnNldCxuPVtdLGk9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodC5jdXJUb3BPZmZzZXQ8PWEpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dF9hbmltYXRlX19yZW1vdmVBbmltYXRpb25DbGFzcyh0LFsid2FpdCIsIm5vLWhvdmVyIl0pfSkpfWVsc2Ugbi5wdXNoKHQpfSkpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jdXJUb3BPZmZzZXQ8PWE/KHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCxbIndhaXQiLCJuby1ob3ZlciJdKSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCwhMSkpOmkucHVzaCh0KX0pKSxbaSxuXX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FuaW1hdGVDaGFpbkl0ZW1zT25TY3JvbGwodCxlKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfd2FpdFtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpO2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSk7dmFyIG49MCxpPTAscj10Lml0ZW1zT2Zmc2V0c1swXSxvPS4xNixzPXRfYW5pbWF0ZV9fZ2V0RGVsYXlGcm9tUHJldmlvdXNTY3JvbGxFdmVudCh0LG8pLGw9dF9hbmltYXRlX19nZXRTZWN0aW9uSGVhZERlYWx5KHQpO2EubGVuZ3RoJiZhWzBdLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iik7Zm9yKHZhciBtPTA7bTxhLmxlbmd0aDttKyspe3ZhciBjPWFbbV0sXz10Lml0ZW1zT2Zmc2V0c1ttXTtpZighKF88ZSkpYnJlYWs7XyE9PXImJihjLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iiksbj0rK2kscj1fKTt2YXIgZj1uKm8rcytsO2Muc3R5bGUudHJhbnNpdGlvbkRlbGF5PWYrInMiLGMuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX3dhaXQiKSx0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3MoYywhMSksYy5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKzFlMypmKSxjWzBdPT09YVthLmxlbmd0aC0xXSYmdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb24odCxmKSwrXz09K3ImJm4rKyxhLnNwbGljZShtLDEpLHQuaXRlbXNPZmZzZXRzLnNwbGljZShtLDEpLG0tLX10X2FuaW1hdGVfX2NhdGNoVHJhbnNpdGlvbkVuZEV2ZW50KHQpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fZ2V0U2VjdGlvbkhlYWREZWFseSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LXNlY3Rpb25fX3RpdGxlLnQtYW5pbWF0ZSIpLGE9dC5xdWVyeVNlbGVjdG9yKCIudC1zZWN0aW9uX19kZXNjci50LWFuaW1hdGUiKSxuPTA7aWYoZSl7dmFyIGk9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIil8fDA7aWYoRGF0ZS5ub3coKS1pPD0xNjApcmV0dXJuIG49LjE2fWlmKGEpe3ZhciByPWEuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIpfHwwO2lmKERhdGUubm93KCktcjw9MTYwKXJldHVybiBuPS4xNn1yZXR1cm4gbn1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldERlbGF5RnJvbVByZXZpb3VzU2Nyb2xsRXZlbnQodCxlKXt2YXIgYT0hdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX3N0YXJ0ZWQiKS5sZW5ndGgsbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfX2NoYWluX2ZpcnN0LWluLXJvdy50LWFuaW1hdGVfc3RhcnRlZCIpO2lmKG49QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG4sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX19jaGFpbl9zaG93ZWQiKX0pKSxhfHwhbi5sZW5ndGgpcmV0dXJuIDA7aWYobi5sZW5ndGgpe3ZhciBpLHIsbz0obltuLmxlbmd0aC0xXS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIil8fDApLURhdGUubm93KCk7cmV0dXJuIG88PTA/ZTpvLzFlMytlfX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldFN0YXJ0QW5pbWF0aW9uQ2xhc3ModCxlKXtpZih0KXtpZihlKXt2YXIgYT0idC1hbmltYXRlLWZvci13cmFwcGVyIixuPXQuY2xvc2VzdCgiLiIrYSk7biYmbi5jbGFzc0xpc3QucmVtb3ZlKGEpfXZhciBpO2lmKHQuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3N0YXJ0ZWQiKSwiZmFkZWlubGVmdCI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXN0eWxlIikpe3ZhciByPXQuY2xvc2VzdCgiLnQtYW5pbWF0ZV9fb3ZlcmZsb3cteC1oaWRkZW4iKTtyJiYhci5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hbmltYXRlLXN0eWxlPSJmYWRlaW5sZWZ0Il06bm90KC50LWFuaW1hdGVfc3RhcnRlZCknKSYmci5jbGFzc0xpc3QucmVtb3ZlKCJ0LWFuaW1hdGVfX292ZXJmbG93LXgtaGlkZGVuIil9fX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NhdGNoVHJhbnNpdGlvbkVuZEV2ZW50KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93LnQtYW5pbWF0ZV9zdGFydGVkIik7ZT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZSwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWFuaW1hdGVfX2NoYWluX3Nob3dlZCIpfSkpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24odCl7dmFyIGU7WyJ0cmFuc2l0aW9uZW5kIiwid2Via2l0VHJhbnNpdGlvbkVuZCIsIm9UcmFuc2l0aW9uRW5kIiwib3RyYW5zaXRpb25lbmQiLCJNU1RyYW5zaXRpb25FbmQiXS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmFkZEV2ZW50TGlzdGVuZXIoZSwoZnVuY3Rpb24oKXt0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4odCl9KSksdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19hZGRFdmVudE9uQW5pbWF0ZUNoYWluKHQpfSkpfSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcGFyc2VOdW1iZXJUZXh0KCl7dmFyIHQ9d2luZG93LnBhZ2VZT2Zmc2V0LGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtc3R5bGU9J2FuaW1hdGVkbnVtYmVyJ10iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUpe3ZhciBhLG49IiIsaT1lLnF1ZXJ5U2VsZWN0b3JBbGwoInNwYW4iKTtpZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe24rPXQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpfHwiIix0LnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKSx0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1yZWRhY3Rvci1zdHlsZSIpfSkpLGUucXVlcnlTZWxlY3RvckFsbCgnZGl2W2RhdGEtY3VzdG9tc3R5bGU9InllcyJdJykubGVuZ3RoKXt2YXIgcj1lLnF1ZXJ5U2VsZWN0b3IoJ2RpdltkYXRhLWN1c3RvbXN0eWxlPSJ5ZXMiXScpO2E9cj9yLmlubmVySFRNTDoiIjt2YXIgbz1lLmdldEF0dHJpYnV0ZSgic3R5bGUiKXx8IiIscz1lLnF1ZXJ5U2VsZWN0b3IoImRpdltkYXRhLWN1c3RvbXN0eWxlXSIpLGw9cz9zLmdldEF0dHJpYnV0ZSgic3R5bGUiKToiIjtsJiYobys9bCksZS5zZXRBdHRyaWJ1dGUoInN0eWxlIixvKX1lbHNlIGE9ZS5pbm5lckhUTUw7aWYobj1uLnNwbGl0KCI7IikuZmlsdGVyKChmdW5jdGlvbih0LGUpe3JldHVybiBuLnNwbGl0KCI7IikuaW5kZXhPZih0KT09PWV9KSkuam9pbigiOyIpLCEoZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0PHQtNTAwKSYmYS5sZW5ndGgpe3ZhciBtPWEucmVwbGFjZSgvPGJyPi9nLCIgIikucmVwbGFjZSgvW15cZC4sIF0rL2csIiIpLnJlcGxhY2UoLyAoXC58LCkvZywiIikucmVwbGFjZSgvKFxkKSg/PVxkKSAvZywiJDEiKS50cmltKCksYz1tO2lmKC0xPT09YS5pbmRleE9mKG0pJiYoYz1tPW0uc3BsaXQoIiAiKVswXSksIiIhPT1tKXtlLnNldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW51bWJlci1jb3VudCIsYSksdF9hbmltYXRlX19jaGFuZ2VOdW1iZXJPblplcm8oZSxhLnJlcGxhY2UoYywibnVtIikpO3ZhciBfPWUucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpO189QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKF8sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygiLnQtYW5pbWF0ZV9fbnVtYmVyIil9KSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChfLChmdW5jdGlvbih0KXt0LnNldEF0dHJpYnV0ZSgic3R5bGUiLG4pfSkpfX19KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19jaGFuZ2VOdW1iZXJPblplcm8odCxlKXt0LmlubmVySFRNTD1lLnJlcGxhY2UoL251bS9nLCc8c3BhbiBjbGFzcz0idC1hbmltYXRlX19udW1iZXIiPjA8L3NwYW4+Jyl9ZnVuY3Rpb24gdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyh0KXtpZighdClyZXR1cm4hMTt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW51bWJlci1jb3VudCIpLGE9W10sbj10LnF1ZXJ5U2VsZWN0b3JBbGwoInNwYW4iKTsobj1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCIudC1hbmltYXRlX19udW1iZXIiKX0pKSkubGVuZ3RoJiYoYT1uWzBdLmdldEF0dHJpYnV0ZSgic3R5bGUiKXx8IiIpO3ZhciBpPVtdLHI9bnVsbDtpZihlKXtyPWUubWF0Y2goL1xkK1wuXGQrfFxkKyxcZCsvZyk7dmFyIG89ZS5tYXRjaCgvXGQrL2cpLHMsbDtlLnJlcGxhY2UoLyhcZCkoPz0gXGQpIC9nLCIkMSIpLnNwbGl0KCIgIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7aXNOYU4ocGFyc2VJbnQodC5yZXBsYWNlKC9bXlxkLiwgXSsvZywiIiksMTApKXx8aS5wdXNoKHQucmVwbGFjZSgvW15cZC4sIF0rL2csIiIpKX0pKX12YXIgbT0wLGM9ITEsXz0hMTt0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW51bWJlci1jb3VudCIpLG51bGwhPT1yJiYoXz0tMSE9PXJbMF0uaW5kZXhPZigiLCIpKSxpLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dmFyIGE7bnVsbCE9PXImJigtMSE9PXQuaW5kZXhPZigiLCIpJiYoYT10LnNwbGl0KCIsIikpLC0xIT09dC5pbmRleE9mKCIuIikmJihhPXQuc3BsaXQoIi4iKSksLTE9PT10LmluZGV4T2YoIiwiKSYmLTE9PT10LmluZGV4T2YoIi4iKXx8KG09YVsxXS5sZW5ndGgsaVtlXT0rYS5qb2luKCIuIiksYz0hMCkpfSkpO3ZhciBmPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZV9fbnVtYmVyIik7aWYoaVswXSl7dmFyIGQ9TnVtYmVyKGlbMF0pfHwwLHU9MCx5PU1hdGgucG93KDEwLG0pO2MmJihkKj15LHUqPXkpO3ZhciBwPTEyLGg9MCxnPXNldEludGVydmFsKChmdW5jdGlvbigpe2lmKHUrPWQvMTA4LGg9Yz8oTWF0aC5yb3VuZCh1KS95KS50b0ZpeGVkKG0pKyIiOk1hdGguZmxvb3IodSkrIiIsby5sZW5ndGg+MSYmKGg9aC5yZXBsYWNlKC8oXGQpKD89KFxkezN9KSsoW15cZF18JCkpL2csIiQxICIpKSxfJiYoaD1oLnJlcGxhY2UoL1wuL2csIiwiKSksZiYmKGYudGV4dENvbnRlbnQ9aCksdT49ZCl7Y2xlYXJJbnRlcnZhbChnKSx0LmlubmVySFRNTD1lO3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgic3BhbiIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoInN0eWxlIixhKX0pKX19KSxwKX19ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRBbmltYXRpb25TdGF0ZSh0LGUsYSl7dmFyIG49d2luZG93LnBhZ2VZT2Zmc2V0LGk9bit3aW5kb3cuaW5uZXJIZWlnaHQ7dF9hbmltYXRlX19zZXRHcm91cHNCbG9ja3NTdGF0ZSh0LG4saSksZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0X2FuaW1hdGVfX2Fzc2lnbkNoYWluRGVsYXkodCxpLG4pLHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uX19vdXRPZlR1cm4odCl9KSksdF9hbmltYXRlX19zZXRBbmltRUxlbXNTdGF0ZShhLG4saSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSh0X2FuaW1hdGVfX3JlbW92ZUlubGluZUFuaW1TdHlsZXMpKX1mdW5jdGlvbiB0X2FuaW1hdGVfX3NldEFuaW1FTGVtc1N0YXRlKHQsZSxhKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDtpZihuPGUtNTAwKXJldHVybiB0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKHQsIm5vLWhvdmVyIiksImFuaW1hdGVkbnVtYmVyIj09PXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJzdHlsZSIpJiZ0X2FuaW1hdGVfX2FuaW1hdGVOdW1iZXJzKHQpLCEwO3ZhciBpPXRfYW5pbWF0ZV9fZGV0ZWN0RWxlbVRyaWdnZXJPZmZzZXQodCxhKTt0X2FuaW1hdGVfX3NldEN1c3RvbUFuaW1TZXR0aW5ncyh0LG4sYSksbjxpJiYhdC5jbG9zZXN0KCIudDEwOTMiKSYmKHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCksdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKHQsITApLCJhbmltYXRlZG51bWJlciI9PT10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic3R5bGUiKSYmdF9hbmltYXRlX19hbmltYXRlTnVtYmVycyh0KSksKG4+PWl8fHQuY2xvc2VzdCgiLnQxMDkzIikpJiZ0LmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV93YWl0Iil9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19zZXRHcm91cHNCbG9ja3NTdGF0ZSh0LGUsYSl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGUiKTtuPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChuLChmdW5jdGlvbih0KXtyZXR1cm4hKCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1jaGFpbiIpKX0pKTt2YXIgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7dF9hbmltYXRlX19yZW1vdmVBbmltRnJvbUhpZGRlblNsaWRlcyh0KTt2YXIgcj10X2FuaW1hdGVfX2Fzc2lnblNlY3Rpb25EZWxheSh0KTt0X2FuaW1hdGVfX2Fzc2lnbkdyb3VwRGVsYXkodCxyKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKG4pe3ZhciByPW4uY2xvc2VzdCgiLnQzOTdfX29mZiIpfHxuLmNsb3Nlc3QoIi50Mzk1X19vZmYiKXx8bi5jbG9zZXN0KCIudDQwMF9fb2ZmIik7aWYobi5jbGFzc0xpc3QuY29udGFpbnMoInQtYW5pbWF0ZV9uby1ob3ZlciIpJiZyJiZuLmNsYXNzTGlzdC5yZW1vdmUoInQtYW5pbWF0ZV9uby1ob3ZlciIpLGk8PWUtMTAwKXJldHVybiB0X2FuaW1hdGVfX3NhdmVTZWN0aW9uSGVhZGVyU3RhcnRUaW1lKHQpLHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3Mobiwibm8taG92ZXIiKSxuLnN0eWxlLnRyYW5zaXRpb25EZWxheT0iIiwhMDtpPGEmJmk+ZS0xMDAmJih0X2FuaW1hdGVfX21ha2VTZWN0aW9uQnV0dG9uV2FpdCh0KSxuLmNsYXNzTGlzdC5jb250YWlucygiLnQtYW5pbWF0ZV9fYnRuLXdhaXQtY2hhaW4iKXx8KHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnMobikscj9uLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV93YWl0Iik6dF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKG4sITEpKSksaT49YSYmbi5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfd2FpdCIpfSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0QW5pbWF0aW9uU3RhdGVDaGFpbnModCl7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4hMTt2YXIgZT13aW5kb3cucGFnZVlPZmZzZXQsYT1lK3dpbmRvdy5pbm5lckhlaWdodDtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fYXNzaWduQ2hhaW5EZWxheSh0LGEsZSksdF9hbmltYXRlX19jaGVja1NlY3Rpb25CdXR0b25BbmltYXRpb25fX291dE9mVHVybih0KX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnblNlY3Rpb25EZWxheSh0KXt2YXIgZT0wLGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX190aXRsZS50LWFuaW1hdGUiKSxuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fZGVzY3IudC1hbmltYXRlIik7cmV0dXJuIGEubGVuZ3RoJiYoZT0uMTYpLG4ubGVuZ3RoJiYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1lKyJzIn0pKSxlKz0uMTYpLGV9ZnVuY3Rpb24gdF9hbmltYXRlX19hc3NpZ25Hcm91cERlbGF5KHQsZSl7dmFyIGE9MDtpZih0LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtb3JkZXJdIikubGVuZ3RoKXRfYW5pbWF0ZV9fYXNzaWduT3JkZXJlZEVsZW1zRGVsYXkodCxlKTtlbHNle3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtaW1nLnQtYW5pbWF0ZSIpLGk9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC11cHRpdGxlLnQtYW5pbWF0ZSIpLHI9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC10aXRsZS50LWFuaW1hdGUiKTtyPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChyLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2VjdGlvbl9fdGl0bGUiKX0pKTt2YXIgbz10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWRlc2NyLnQtYW5pbWF0ZSIpO289QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG8sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1zZWN0aW9uX19kZXNjciIpfSkpO3ZhciBzPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYnRuLnQtYW5pbWF0ZSwgLnQtYnRud3JhcHBlci50LWFuaW1hdGUiKTtzPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChzLChmdW5jdGlvbih0KXtyZXR1cm4hdC5jbG9zZXN0KCIudC1zZWN0aW9uX19ib3R0b213cmFwcGVyIil9KSk7dmFyIGw9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC10aW1lci50LWFuaW1hdGUiKSxtPXQucXVlcnlTZWxlY3RvckFsbCgiZm9ybS50LWFuaW1hdGUiKTtuLmxlbmd0aCYmKGE9LjUpLHIubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLHIubGVuZ3RoJiYoYSs9LjMpLG8ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLG8ubGVuZ3RoJiYoYSs9LjMpLGkubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLGkubGVuZ3RoJiYoYSs9LjMpLChpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RoKSYmKGErPS4yKSxsLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSxsLmxlbmd0aCYmKGErPS41KSxzLmxlbmd0aCYmKHNbMF0uc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMiKSwyPT09cy5sZW5ndGgmJihhKz0uNCksMj09PXMubGVuZ3RoJiYoc1sxXS5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YSsicyIpLDAhPT1tLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKX19ZnVuY3Rpb24gdF9hbmltYXRlX19hc3NpZ25PcmRlcmVkRWxlbXNEZWxheSh0LGUpe3ZhciBhPTA7ZSYmKGE9ZSk7dmFyIG49dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iMSJdJyksaT10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSIyIl0nKSxyPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjMiXScpLG89dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iNCJdJykscz10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI1Il0nKSxsPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjYiXScpLG09dC5xdWVyeVNlbGVjdG9yQWxsKCcudC1hbmltYXRlW2RhdGEtYW5pbWF0ZS1vcmRlcj0iNyJdJyksYz10LnF1ZXJ5U2VsZWN0b3JBbGwoJy50LWFuaW1hdGVbZGF0YS1hbmltYXRlLW9yZGVyPSI4Il0nKSxfPXQucXVlcnlTZWxlY3RvckFsbCgnLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtb3JkZXI9IjkiXScpO24ubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG4sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpLG4ubGVuZ3RoJiZpLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKGlbMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aCkmJnIubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoclswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aCkmJm8ubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2Uob1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGgpJiZzLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHNbMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RofHxzLmxlbmd0aCkmJmwubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UobFswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGwsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RofHxsLmxlbmd0aCkmJm0ubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UobVswXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG0sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKSwobi5sZW5ndGh8fGkubGVuZ3RofHxyLmxlbmd0aHx8by5sZW5ndGh8fHMubGVuZ3RofHxsLmxlbmd0aHx8bS5sZW5ndGgpJiZjLmxlbmd0aCYmKGErPTEqdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKGNbMF0sImRlbGF5IiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zaXRpb25EZWxheT1hKyJzIn0pKSksKG4ubGVuZ3RofHxpLmxlbmd0aHx8ci5sZW5ndGh8fG8ubGVuZ3RofHxzLmxlbmd0aHx8bC5sZW5ndGh8fG0ubGVuZ3RofHxjLmxlbmd0aCkmJl8ubGVuZ3RoJiYoYSs9MSp0X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UoX1swXSwiZGVsYXkiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKF8sKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWErInMifSkpKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2Fzc2lnbkNoYWluRGVsYXkodCxlLGEpe3ZhciBuPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpLGk9MDtpZihuLmxlbmd0aCl7dmFyIHI9blswXSxvPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldDtyLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iik7dmFyIHM9dF9hbmltYXRlX19nZXRDdXJCbG9ja1NlY3Rpb25IZWFkRGVsYXkodCk7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbihsKXt2YXIgbT1sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7aWYobTxhKXJldHVybiB0X2FuaW1hdGVfX3JlbW92ZUFuaW1hdGlvbkNsYXNzKGwsIiIpLCEwO2lmKG08ZSl7bSE9PW8mJihsLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9fY2hhaW5fZmlyc3QtaW4tcm93Iiksbz1tKTt2YXIgYz0uMTYqaStzLF87bC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9YysicyIsdF9hbmltYXRlX19zZXRTdGFydEFuaW1hdGlvbkNsYXNzKGwsITEpLGwuc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIsRGF0ZS5ub3coKSsxZTMqYykscj09PW5bbi5sZW5ndGgtMV0mJnRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uKHQsYyksaSsrLFsidHJhbnNpdGlvbmVuZCIsIndlYmtpdFRyYW5zaXRpb25FbmQiLCJvVHJhbnNpdGlvbkVuZCIsIm90cmFuc2l0aW9uZW5kIiwiTVNUcmFuc2l0aW9uRW5kIl0uZm9yRWFjaCgoZnVuY3Rpb24odCl7bC5hZGRFdmVudExpc3RlbmVyKHQsKGZ1bmN0aW9uKCl7dF9hbmltYXRlX19hZGRFdmVudE9uQW5pbWF0ZUNoYWluKGwpfSkpLGwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LChmdW5jdGlvbigpe3RfYW5pbWF0ZV9fYWRkRXZlbnRPbkFuaW1hdGVDaGFpbihsKX0pKX0pKX1lbHNlIGwuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX3dhaXQiKX0pKX19ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsZSl7dmFyIGEsbj10LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpO2lmKCFuKXJldHVybiB0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSk7dmFyIGkscj0iYWIiK24uZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksbyxzLGw7dm9pZCAwIT09d2luZG93LnRuW3JdPyhvPXdpbmRvdy50bltyXS5jdXJSZXNvbHV0aW9uLHM9d2luZG93LnRuW3JdLmN1clJlc29sdXRpb25fbWF4LGw9d2luZG93LnRuW3JdLnNjcmVlbnMuc2xpY2UoKSk6KG89d2luZG93LnRuLmN1clJlc29sdXRpb24scz0xMjAwLGw9WzMyMCw0ODAsNjQwLDk2MCwxMjAwXSk7dmFyIG09dC5jbG9zZXN0KCIudDM5Nl9fZWxlbSwgLnQzOTZfX2dyb3VwIiksYz1tJiZtLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLW1vYmlsZSIpO2lmKG89PT1zKWE9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS0iK2UpO2Vsc2V7aWYoInkiIT09YyYmbzwxMjAwKXJldHVybiB0LnN0eWxlLnRyYW5zaXRpb249Im5vbmUiLG51bGw7YT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrZSsiLXJlcy0iK28pfWlmKCFhJiYiIiE9PWEpZm9yKHZhciBfPTA7XzxsLmxlbmd0aDtfKyspe3ZhciBmPWxbX107aWYoIShmPD1vKSYmKGE9Zj09PXM/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS0iK2UpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIitlKyItcmVzLSIrZikpKWJyZWFrfXJldHVybiBhfWZ1bmN0aW9uIHRfYW5pbWF0ZV9faGFzV2FpdEFuaW1hdGlvbih0KXtyZXR1cm4gdC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX3dhaXQiKXx8dC5xdWVyeVNlbGVjdG9yKCIudC1hbmltYXRlX3dhaXQiKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2FkZEV2ZW50T25BbmltYXRlQ2hhaW4odCl7dC5jbGFzc0xpc3QuYWRkKCJ0LWFuaW1hdGVfX2NoYWluX3Nob3dlZCIpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fc2V0Q3VzdG9tQW5pbVNldHRpbmdzKHQsZSxhKXt2YXIgbj10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic3R5bGUiKSxpPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJkaXN0YW5jZSIpO2lmKGkmJiIiIT09aSl7c3dpdGNoKGk9aS5yZXBsYWNlKCJweCIsIiIpLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIwcyIsdC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IjBzIixuKXtjYXNlImZhZGVpbnVwIjp0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlM2QoMCwiK2krInB4LDApIjticmVhaztjYXNlImZhZGVpbmRvd24iOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgwLC0iK2krInB4LDApIjticmVhaztjYXNlImZhZGVpbmxlZnQiOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgiK2krInB4LDAsMCkiO2JyZWFrO2Nhc2UiZmFkZWlucmlnaHQiOnQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUzZCgtIitpKyJweCwwLDApIn10X2FuaW1hdGVfX2ZvcmNlRWxlbUluVmlld1BvcnRSZXBhaW50KHQsZSxhKSx0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iIix0LnN0eWxlLnRyYW5zaXRpb25EZWxheT0iIn12YXIgcj10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwic2NhbGUiKTtyJiYodC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IjBzIix0LnN0eWxlLnRyYW5zaXRpb25EZWxheT0iMHMiLHQuc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgiK3IrIikiLHRfYW5pbWF0ZV9fZm9yY2VFbGVtSW5WaWV3UG9ydFJlcGFpbnQodCxlLGEpLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIiKTt2YXIgbz10X2FuaW1hdGVfX2dldEF0dHJCeVJlc0Jhc2UodCwiZGVsYXkiKTtvJiYodC5zdHlsZS50cmFuc2l0aW9uRGVsYXk9bysicyIpO3ZhciBzPXRfYW5pbWF0ZV9fZ2V0QXR0ckJ5UmVzQmFzZSh0LCJkdXJhdGlvbiIpO3MmJih0LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj1zKyJzIil9ZnVuY3Rpb24gdF9hbmltYXRlX19yZW1vdmVJbmxpbmVBbmltU3R5bGVzKCl7aWYod2luZG93LmlubmVyV2lkdGg8OTgwKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudDM5Nl9fZWxlbS50LWFuaW1hdGU6bm90KC50LWFuaW1hdGVfd2FpdCkiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNmb3JtPSIiLHQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIiLHQuc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIifSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVfX2ZvcmNlRWxlbUluVmlld1BvcnRSZXBhaW50KHQsZSxhKXt0JiZlPGErNTAwJiZ0Lm9mZnNldEhlaWdodH1mdW5jdGlvbiB0X2FuaW1hdGVfX2RldGVjdEVsZW1UcmlnZ2VyT2Zmc2V0KHQsZSl7dmFyIGE9dF9hbmltYXRlX19nZXRBdHRyQnlSZXNCYXNlKHQsInRyaWdnZXItb2Zmc2V0Iiksbj1lO3JldHVybiBhJiYobj1lLTEqKGE9YS5yZXBsYWNlKCJweCIsIiIpKSksbn1mdW5jdGlvbiB0X2FuaW1hdGVfX3NhdmVTZWN0aW9uSGVhZGVyU3RhcnRUaW1lKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fdGl0bGUudC1hbmltYXRlIiksYT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNlY3Rpb25fX2Rlc2NyLnQtYW5pbWF0ZSIpO2UubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc3RhcnQtdGltZSIsRGF0ZS5ub3coKSl9KSksYS5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYSwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdGFydC10aW1lIixEYXRlLm5vdygpKzE2MCl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRDdXJCbG9ja1NlY3Rpb25IZWFkRGVsYXkodCl7dmFyIGU9MDtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zZWN0aW9uX190aXRsZS50LWFuaW1hdGUiKS5sZW5ndGgmJihlKz0uMTYpLHQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fZGVzY3IudC1hbmltYXRlIikubGVuZ3RoJiYoZSs9LjE2KSxlfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fbWFrZVNlY3Rpb25CdXR0b25XYWl0KHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpLmxlbmd0aCxhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2VjdGlvbl9fYm90dG9td3JhcHBlciAudC1idG4udC1hbmltYXRlIik7ZS5sZW5ndGgmJmEubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LmFkZCgidC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fY2hlY2tTZWN0aW9uQnV0dG9uQW5pbWF0aW9uKHQsZSl7dmFyIGE9dC5xdWVyeVNlbGVjdG9yQWxsKCIudC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpO2EubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNpdGlvbkRlbGF5PWUrLjE2KyJzIix0X2FuaW1hdGVfX3JlbW92ZU5vSG92ZXJDbGFzc0Zyb21CdG5zKHQpLHQuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX19idG4td2FpdC1jaGFpbiIpLHRfYW5pbWF0ZV9fc2V0U3RhcnRBbmltYXRpb25DbGFzcyh0LCExKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbl9fb3V0T2ZUdXJuKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtYW5pbWF0ZVtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpLGE7KGU9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUsKGZ1bmN0aW9uKHQpe3JldHVybiF0LmNsYXNzTGlzdC5jb250YWlucygidC1hbmltYXRlX3N0YXJ0ZWQiKX0pKSkubGVuZ3RofHx0X2FuaW1hdGVfX2NoZWNrU2VjdGlvbkJ1dHRvbkFuaW1hdGlvbih0LC4xNil9ZnVuY3Rpb24gdF9hbmltYXRlX19hZGROb0hvdmVyQ2xhc3NUb0J0bnMoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1idG4udC1hbmltYXRlIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZV9uby1ob3ZlciIpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcmVtb3ZlTm9Ib3ZlckNsYXNzRnJvbUJ0bnModCl7aWYoIXQpcmV0dXJuITE7dmFyIGU9dC5jbGFzc0xpc3QuY29udGFpbnMoInQtYnRuIik/dDpudWxsO2UmJihlLm9udHJhbnNpdGlvbmVuZD1mdW5jdGlvbih0KXsib3BhY2l0eSIhPT10LnByb3BlcnR5TmFtZSYmInRyYW5zZm9ybSIhPT10LnByb3BlcnR5TmFtZXx8KGUuY2xhc3NMaXN0LnJlbW92ZSgidC1hbmltYXRlX25vLWhvdmVyIiksZS5zdHlsZS50cmFuc2l0aW9uRGVsYXk9IiIsZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IiIsdGhpcy5vbnRyYW5zaXRpb25lbmQ9bnVsbCl9KX1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldEdyb3Vwc09mZnNldHModCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50LWFuaW1hdGUiKTtpZihlKXt0LmN1clRvcE9mZnNldD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQ7dmFyIGE9dF9hbmltYXRpb25fX2dldFpvb20odCk7d2luZG93LmlzT25seVNjYWxhYmxlfHwodC5jdXJUb3BPZmZzZXQqPWEpfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvbl9fZ2V0Wm9vbSh0KXtpZih2b2lkIDAhPT10LnNjYWxlRmFjdG9yKXJldHVybiB0LnNjYWxlRmFjdG9yO3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoIWUpcmV0dXJuIDE7dmFyIGE9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9InRpbGRhLWJsb2Nrcy0yLjciXScpO3JldHVybiBlLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmRfc2NhbGUiKXx8IWEmJiJ1bmRlZmluZWQiIT10eXBlb2YgdDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSYmIndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKGUsInVwc2NhbGUiKT93aW5kb3cudG5fc2NhbGVfZmFjdG9yOjF9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRDaGFpbk9mZnNldHModCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWFuaW1hdGVfd2FpdFtkYXRhLWFuaW1hdGUtY2hhaW49eWVzXSIpO3QuaXRlbXNPZmZzZXRzPVtdLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSxhKXt0Lml0ZW1zT2Zmc2V0c1thXT1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXR9KSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRlX19nZXRFbGVtc09mZnNldHModCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmN1clRvcE9mZnNldD13aW5kb3cucGFnZVlPZmZzZXQrdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7dmFyIGU9dF9hbmltYXRpb25fX2dldFpvb20odCk7d2luZG93LmlzT25seVNjYWxhYmxlfHwodC5jdXJUb3BPZmZzZXQqPWUpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZV9fcmVtb3ZlQW5pbUZyb21IaWRkZW5TbGlkZXModCl7dmFyIGU7aWYodC5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGlkZXMiKS5sZW5ndGgpe3ZhciBhPXQucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xpZGVzX19pdGVtIik7YT1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoYSwoZnVuY3Rpb24odCl7cmV0dXJuIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsaWRlc19faXRlbV9hY3RpdmUiKX0pKTt2YXIgbj1bXTthLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtYW5pbWF0ZSIpO2UmJm4ucHVzaChlKX0pKSxuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RfYW5pbWF0ZV9fcmVtb3ZlQW5pbWF0aW9uQ2xhc3ModCwibm8taG92ZXIiKX0pKX19ZnVuY3Rpb24gdF9hbmltYXRlX193cmFwVGV4dFdpdGhPcGFjaXR5KCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtdGl0bGUudC1hbmltYXRlLCAudC1kZXNjci50LWFuaW1hdGUsIC50LXVwdGl0bGUudC1hbmltYXRlLCAudC10ZXh0LnQtYW5pbWF0ZSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoInN0eWxlIik7aWYoZSYmLTEhPT1lLmluZGV4T2YoIm9wYWNpdHkiKSl7dmFyIGE9dC5zdHlsZS5vcGFjaXR5O2lmKGEmJmE+MCl7dC5zdHlsZS5vcGFjaXR5PSIiO3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uc3R5bGUub3BhY2l0eT1hO3ZhciBpPXQuY2hpbGROb2RlcztBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvbmVOb2RlKCEwKTtuLmFwcGVuZENoaWxkKGUpfSkpLHQuaW5uZXJIVE1MPSIiLHQuYXBwZW5kQ2hpbGQobil9fX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVfX2NoZWNrSUUoKXt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxlPXQuaW5kZXhPZigiTVNJRSIpLGE9IiIsbj0hMTtyZXR1cm4gZT4wJiYoOCE9PShhPXBhcnNlSW50KHQuc3Vic3RyaW5nKGUrNSx0LmluZGV4T2YoIi4iLGUpKSkpJiY5IT09YXx8KG49ITApKSxufSJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dF9hbmltYXRlX19pbml0KCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsdF9hbmltYXRlX19pbml0KTsKCmZ1bmN0aW9uIHQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIodCl7dHJ5e3ZhciBlLGk9L3ZhclwoKC0tdWMtKFteLV0rKS0oW14tXSspLShbXixdKykpLFxzPyguKilcKS8uZXhlYyh0KTtpZighaSlyZXR1cm47dmFyIHI9aVswXSxvPWlbMV0sbj1pWzJdLGE9aVszXSxsPWlbNF0sZD1pWzVdLF8scztpZighKHImJm4mJmEmJmwmJmQpKXJldHVybjtyZXR1cm57cGFyZW50OntpZDpsLHR5cGU6bn0sZmFsbGJhY2s6d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZShvKXx8ZCxmaWVsZDphfX1jYXRjaCh1KXtjb25zb2xlLmVycm9yKCJFcnJvciB0cnlpbmcgdG8gcGFyc2UgQ1NTIFZhcmlhYmxlIil9fWZ1bmN0aW9uIHQzOTZfX2hleDJyZ2JhKHQsZSl7aWYoIXQpcmV0dXJuITE7dmFyIGk9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1Zhcih0KTtpJiYodD1pLmZhbGxiYWNrKTt2YXIgcj10LnJlcGxhY2UoLyMvLCIiKTtpZigzPT09ci5sZW5ndGgpe3ZhciBvPXJbMF0sbj1yWzFdLGE9clsyXTt0PSIjIitvK28rbituK2ErYX12YXIgbD1wYXJzZUludCh0LnN1YnN0cmluZygxKSwxNiksZCxfLHM7cmV0dXJuWygxNjcxMTY4MCZsKT4+MTYsKDY1MjgwJmwpPj44LDI1NSZsLHBhcnNlRmxvYXQoZSldfWZ1bmN0aW9uIHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCl7dmFyIGU9WyJnYWxsZXJ5Il0saT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtyZXR1cm4gZS5pbmNsdWRlcyhpKX1mdW5jdGlvbiB0Mzk2X19pc0ZsZXgodCl7dmFyIGU9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxpPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cC1mbGV4Iik7cmV0dXJuIGV8fGl9ZnVuY3Rpb24gdDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKHQpe3ZhciBlPVsiLnQ5NTFfX3NpZGViYXJfc3RpY2t5IiwiLnQxMjA2X19jb250ZW50X3N0aWNreSIsIi50NzU0X19jb2xfZml4ZWQiLCIudDc3Nl9fY29sX2ZpeGVkIiwiLnQ3ODZfX2NvbF9maXhlZCIsIi50LXN0b3JlX19wcm9kLXBvcHVwX19jb2xfZml4ZWQiXTt0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKTt2YXIgaT1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZS5qb2luKCIsICIpKSk7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiLCJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpLHQuY2xhc3NMaXN0LmFkZChpPyJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiOiJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpfX1mdW5jdGlvbiB0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQzOTZfX292ZXJmbG93LXN0eWxlcyIpKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3QuaWQ9InQzOTZfX292ZXJmbG93LXN0eWxlcyIsdC5pbm5lckhUTUw9Ii50LXJlY29yZHNfX292ZXJmbG93LWNsaXAgeyBvdmVyZmxvdzogY2xpcDsgfVxuXHRcdFx0XHRcdFx0LnQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdDM5Nl9fZ2V0QXJ0Ym9hcmRzKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksaSxyPWUmJiJlZGl0Ij09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKT8nLnJlY29yZFtkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdIC5yOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yZWNvcmRbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJzonLnJbZGF0YS1yZWNvcmQtdHlwZT0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucltkYXRhLXBhcmVudHRwbGlkPSInK3QrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnO3JldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocikpfWZ1bmN0aW9uIHQzOTZfX2dldFplcm9CbG9ja3MoKXt2YXIgdD1bXS5jb25jYXQodDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIzOTYiKSx0Mzk2X19nZXRBcnRib2FyZHMoIjEyMSIpKSxlO3JldHVybiB0Lmxlbmd0aD90Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3JlY29yZDp0LmNsb3Nlc3QoIi5yOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIiksYXJ0Ym9hcmQ6dH19KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZWNvcmR9KSk6W119ZnVuY3Rpb24gdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpe2Zvcih2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2U7KXt2YXIgaTtpZihlLnN0eWxlLnpvb20pcmV0dXJuITA7ZT1udWxsPT0oaT1lLnBhcmVudEVsZW1lbnQpP3ZvaWQgMDppLmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpfXJldHVybiExfXZhciB0Mzk2X191bmlxdWVJZF9fZ2VuZXJhdG9yPWZ1bmN0aW9uIHQoKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PVN0cmluZyhlKz0xKS5wYWRTdGFydCg2LCIwIik7cmV0dXJuIiIrRGF0ZS5ub3coKSt0fX0sdDM5Nl9fZ2V0VW5pcXVlSWQ9dDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcigpO2Z1bmN0aW9uIHQzOTZfaXNCbG9ja1Zpc2libGUodCl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgsaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIikscj10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4Iik7cmV0dXJuIShpJiZlPHBhcnNlSW50KGksMTApKSYmIShyJiZlPnBhcnNlSW50KHIsMTApKX12YXIgdDM5Nl9fb25SZWFkeT1mdW5jdGlvbiB0KGUpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZSgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpfTtmdW5jdGlvbiB0Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtZGF0YSIpO2lmKGUpe3ZhciBpPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXZhbHVlIik7aWYoaSl0cnl7cmV0dXJuIEpTT04ucGFyc2UoaSl9Y2F0Y2gobil7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgZGF0YToiLG4saSksW119fXZhciByPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX2lucHV0cy10ZXh0YXJlYSIpO2lmKHIpe3ZhciBvPXIudmFsdWU7aWYobyl0cnl7cmV0dXJuIEpTT04ucGFyc2Uobyl9Y2F0Y2gobil7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgdGV4dGFyZWEgdmFsdWU6IixuLG8pLFtdfX1yZXR1cm5bXX1mdW5jdGlvbiB0Mzk2X2luaXQodCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrdCksaT1lP2UucXVlcnlTZWxlY3RvcigiLnQzOTYiKTpudWxsLHI9ZT9lLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGw7aWYocil7dDM5Nl9pbml0VE5vYmoodCxyKSx0Mzk2X19pbml0T25seVNjYWxhYmxlKCk7dmFyIG89IiIsbj10Mzk2X2RldGVjdFJlc29sdXRpb24odCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLGw9YSYmImVkaXQiPT09YS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpO3ZvaWQgMD09PXdpbmRvdy50bi5pc0VkaXRNb2RlJiYod2luZG93LnRuLmlzRWRpdE1vZGU9bCksdDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsbik7dmFyIGQ9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsInVwc2NhbGUiKSxfPXQzOTZfX3NldEdsb2JhbFNjYWxlVmFyaWFibGVzKHQsbixkKTtpZih0Mzk2X19zZXRTY2FsZUZhY3RvckZvckVsZW1lbnRzKHQsXyksdDM5Nl91cGRhdGVUTm9iaih0KSx0Mzk2X2FydGJvYXJkX2J1aWxkKG8sdCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9faW5pdGlhbGl6ZUFydGJvYXJkT3ZlcmZsb3coYSxyKX0pKSx3aW5kb3cudGlsZGFNZW1iZXJzJiYiTXV0YXRpb25PYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBzPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJhdHRyaWJ1dGVzIj09PWUudHlwZSYmImNsYXNzIj09PWUuYXR0cmlidXRlTmFtZSYmZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bGstY291cnNlc19wYWdlIikmJih0Mzk2X2RvUmVzaXplKHQsITApLHMuZGlzY29ubmVjdCgpKX0pKX0pKTtzLm9ic2VydmUoZG9jdW1lbnQuYm9keSx7YXR0cmlidXRlczohMH0pfWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50ODMwIikmJnRfb25SZWFkeSgoZnVuY3Rpb24oKXt2YXIgZSxpO1sidDgzMF9fYWxscmVjb3Jkc19wYWRkIiwidDgzMF9fYWxscmVjb3Jkc19wYWRkLXNtYWxsIl0uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIGEuY2xhc3NMaXN0LmNvbnRhaW5zKHQpfSkpP3QzOTZfZG9SZXNpemUodCwhMCk6YS5hZGRFdmVudExpc3RlbmVyKCJhbGxSZWNQYWRkaW5nSW5pdCIsKGZ1bmN0aW9uKCl7dDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKX0pKSxlJiZpJiZyJiYieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWNvbm5lY3Qtd2l0aC10YWIiKSYmaS5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsKGZ1bmN0aW9uKCl7dDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyhyKSx0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyhyKSx0Mzk2X2RvUmVzaXplKHQsITApfSkpO3ZhciB1PSJodWciPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpLGM7aWYodSl7dmFyIGY9dF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHIpfSksMTAwKTtmKCksc2V0SW50ZXJ2YWwoZiwzZTMpLGRvY3VtZW50LmZvbnRzJiZkb2N1bWVudC5mb250cy5yZWFkeS50aGVuKGYpLHIucXVlcnlTZWxlY3RvckFsbCgiaW1nIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5vbmxvYWQ9Zn0pKSxuZXcgTXV0YXRpb25PYnNlcnZlcihmKS5vYnNlcnZlKHIse3N1YnRyZWU6ITAsY2hhcmFjdGVyRGF0YTohMCxjaGFyYWN0ZXJEYXRhT2xkVmFsdWU6ITB9KSxuZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24odCl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTsiY2hpbGRMaXN0Ij09PXQudHlwZSYmKEFycmF5LmZyb20odC5hZGRlZE5vZGVzKS5jb25jYXQoQXJyYXkuZnJvbSh0LnJlbW92ZWROb2RlcykpLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiAzIT09dC5ub2RlVHlwZSYmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIil8fHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cCIpKX0pKSYmZigpKX0pKX0pKS5vYnNlcnZlKHIse3N1YnRyZWU6ITAsY2hpbGRMaXN0OiEwfSl9KGEuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0MjM1X19iZWZvcmVyZWFkeSIpfHxlJiZlLmNsb3Nlc3QoIiNhbGxyZWNvcmRzdGFibGUiKXx8YS5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yZWNvcmQtdHlwZT0iMjYzIl0nKSkmJmkmJnImJmkuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKTt2YXIgZz0hIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50NjM1X190ZXh0aG9sZGVyIik7ZSYmZyYmaSYmciYmaS5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25Jbml0ZWQiLChmdW5jdGlvbigpe3QzOTZfYWxsZWxlbXNfX3JlbmRlclZpZXcociksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXcociksdDM5Nl9kb1Jlc2l6ZSh0LCEwKX0pKSxlJiZkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDQzMSIpJiZpJiZyJiZ0X29uUmVhZHkoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X2RvUmVzaXplKHQsITApfSkpfSkpLC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJmkmJmkuY2xhc3NMaXN0LmFkZCgidDM5Nl9zYWZhcmkiKSxkJiYhbCYmdF9vbkZ1bmNMb2FkKCJ0Mzk2X3NjYWxlQmxvY2siLChmdW5jdGlvbigpe3QzOTZfc2NhbGVCbG9jayh0KX0pKSxsfHwieSIhPT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHIsImZpeGVkLW5lZWQtanMiKXx8dF9vbkZ1bmNMb2FkKCJ0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fcHJvY2Vzc0ZpeGVkQXJ0Qm9hcmQocil9KSksdDM5Nl9fcHJvY2Vzc0Fic29sdXRlQXJ0Qm9hcmQociksdDM5Nl9fcHJvY2Vzc1RvcFNoaWZ0KHIsdCwhMSksd2luZG93LnQzOTZfX2lzTW9iaWxlfHx1fHx0Mzk2X19yZW1vdmVJbmxpbmVIZWlnaHQoW3Isci5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLHIucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpXSksbHx8dDM5Nl9faW50aWFsaXplVW5kZXJjdXQoZSl9fXdpbmRvdy50Mzk2X19pc01vYmlsZT0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiSW5zdGFncmFtIik+LTEsd2luZG93LnQzOTZfX2lzSVBhZD0ib250b3VjaGVuZCJpbiBkb2N1bWVudCYmLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkFwcGxlV2ViS2l0Iiksd2luZG93LnQzOTZfX2lzU2FmYXJpPS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksd2luZG93LnQzOTZfX2lzVG91Y2hEZXZpY2U9Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQsd2luZG93LnQzOTZfX2lzSW5BcHBCcm93c2VyPS9XZWJWaWV3fChpUGhvbmV8aVBvZHxpUGFkKSg/IS4qU2FmYXJpKS9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy50Mzk2X19pc0ZhY2Vib29rTWVzc2VuZ2VySW5BcHA9L0ZCQU58RkJBVi9naS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZ3aW5kb3cudDM5Nl9faXNJbkFwcEJyb3dzZXIsd2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHA9L1xiSW5zdGFncmFtL2dpLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJndpbmRvdy50Mzk2X19pc0luQXBwQnJvd3Nlcix0X29uUmVhZHkodDM5Nl9fZ2xvYmFsSW5pdCk7dmFyIHQzOTZfd2FpdEZvckZpbmFsRXZlbnQ9ZnVuY3Rpb24oKXt2YXIgdD17fTtyZXR1cm4gZnVuY3Rpb24oZSxpLHIpe3ZhciBvPXJ8fCJEb24ndCBjYWxsIHRoaXMgdHdpY2Ugd2l0aG91dCBhIHVuaXF1ZUlkIjt0W29dJiZjbGVhclRpbWVvdXQodFtvXSksdFtvXT1zZXRUaW1lb3V0KGUsaSl9fSgpO2Z1bmN0aW9uIHQzOTZfX2hhbmRsZVJlc2l6ZU9wZW5lZFBvcHVwKCl7dDM5Nl9fd2FpdEZvclBvcHVwKCkudGhlbigoZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTtlJiZ0Mzk2X2RvUmVzaXplKGUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpfX0pKX1mdW5jdGlvbiB0Mzk2X19pbml0UG9wdXBSZXNpemUoKXtkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvcHVwU2hvd2VkIix0Mzk2X19oYW5kbGVSZXNpemVPcGVuZWRQb3B1cCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJwb3B1cFNob3dlZCIsdDM5Nl9faGFuZGxlUmVzaXplT3BlbmVkUG9wdXApfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd0hlaWdodCh0KXtyZXR1cm4gdDM5Nl9fc2hvdWxkVXNlVmlzdWFsVmlld3BvcnRIZWlnaHQoKSYmdDM5Nl9faXNJblBvcHVwKHQpP3dpbmRvdy52aXN1YWxWaWV3cG9ydC5oZWlnaHQ6dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLmhlaWdodDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfYWJfX2dldFdpbmRvd1dpZHRoKHQpe3JldHVybiB0Mzk2X19pc0luUG9wdXAodCk/ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoOnQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aDt2YXIgZSxpfWZ1bmN0aW9uIHQzOTZfX2dldFROV2luZG93SGVpZ2h0KCl7cmV0dXJuIHdpbmRvdy50Mzk2X19pc01vYmlsZXx8d2luZG93LnQzOTZfX2lzSVBhZD9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodH1mdW5jdGlvbiB0Mzk2X19nZXRUTldpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpO2lmKHQpcmV0dXJuIHQ7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGk9dDM5Nl9fZ2V0QXhpc1hQYWRkaW5nKCk7cmV0dXJuIGkmJihlLT1pKSxlfWZ1bmN0aW9uIHQzOTZfX2dldENTU1dpbmRvd1dpZHRoKCl7dmFyIHQ9dDM5Nl9fZ2V0QmxvY2tFZGl0b3JXaWR0aCgpLGU7cmV0dXJuIHR8fCh3aW5kb3cudDM5Nl9faXNNb2JpbGV8fHdpbmRvdy50Mzk2X19pc0lQYWR8fHdpbmRvdy50Mzk2X19pc1NhZmFyaT9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVyV2lkdGgpfWZ1bmN0aW9uIHQzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnModCl7dmFyIGUsaT0odHx8e30pLmZvcmNlVXBkYXRlLHI9dm9pZCAwIT09aSYmaSxvPSF3aW5kb3cudG4ud2luZG93X3dpZHRofHwhd2luZG93LnRuLndpbmRvd19oZWlnaHR8fCF3aW5kb3cudG4ud2luZG93X3dpZHRoX2NzcyxuO3JldHVybihyfHxvKSYmdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLHt3aWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoLGhlaWdodDp3aW5kb3cudG4ud2luZG93X2hlaWdodCxjc3NXaWR0aDp3aW5kb3cudG4ud2luZG93X3dpZHRoX2Nzc319ZnVuY3Rpb24gdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpe3dpbmRvdy50bi53aW5kb3dfd2lkdGg9dDM5Nl9fZ2V0VE5XaW5kb3dXaWR0aCgpLHdpbmRvdy50bi53aW5kb3dfaGVpZ2h0PXQzOTZfX2dldFROV2luZG93SGVpZ2h0KCksd2luZG93LnRuLndpbmRvd193aWR0aF9jc3M9dDM5Nl9fZ2V0Q1NTV2luZG93V2lkdGgoKX1mdW5jdGlvbiB0Mzk2X19yZXZhbGlkYXRlRGltZW5zaW9ucygpe3ZhciB0LGU9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLndpZHRoLGkscjtyZXR1cm4gdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpLGUhPT10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGh9ZnVuY3Rpb24gdDM5Nl9fcmVtb3ZlSW5saW5lSGVpZ2h0KHQpeyIxLjAiIT09d2luZG93LlROX1NDQUxFX0lOSVRJQUxfVkVSJiZ0LmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0JiYodC5zdHlsZS5oZWlnaHQ9IiIpfSkpfWZ1bmN0aW9uIHQzOTZfX2NsZWFySW5pdGlhbFNjYWxlU3R5bGVzKCl7aWYoIjEuMCI9PT13aW5kb3cuVE5fU0NBTEVfSU5JVElBTF9WRVIpe3ZhciB0PWZ1bmN0aW9uIHQoZSl7dmFyIGk7ZSYmKCJ2YXIoLS1pbml0aWFsLXNjYWxlLWhlaWdodCkiPT09ZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCJoZWlnaHQiKSYmZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiaGVpZ2h0IikpfSxlO3QzOTZfX2dldFplcm9CbG9ja3MoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgaT1lLmFydGJvYXJkO2kmJihpLnN0eWxlLnJlbW92ZVByb3BlcnR5KCItLWluaXRpYWwtc2NhbGUtaGVpZ2h0IiksdChpKSx0KGkucXVlcnlTZWxlY3RvcigiLnQzOTZfX2NhcnJpZXIiKSksdChpLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKSkpfSkpfX1mdW5jdGlvbiB0Mzk2X19nbG9iYWxJbml0KCl7d2luZG93LnRufHx0Mzk2X2luaXRUTm9ial9fY3JlYXRlRGVmYXVsdCgpLHQzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKChmdW5jdGlvbigpe3QzOTZfX2FwcGx5Rml4ZXNGb3JBbGxFbGVtZW50cygpLHQzOTZfX2luaXRpYWxpemVBbmNob3JMaW5rT3ZlcmZsb3dGaXgoKSx0Mzk2X19pbml0UG9wdXBSZXNpemUoKSx0Mzk2X19jbGVhckluaXRpYWxTY2FsZVN0eWxlcygpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHQzOTZfX29uUmVzaXplKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLHQzOTZfX29uT3JpZW50YXRpb25DaGFuZ2UpfSkpfWZ1bmN0aW9uIHQzOTZfX29uUmVzaXplKCl7dDM5Nl93YWl0Rm9yRmluYWxFdmVudCgoZnVuY3Rpb24oKXt2YXIgdDt0Mzk2X19yZXZhbGlkYXRlRGltZW5zaW9ucygpJiYodDM5Nl9fZ2V0WmVyb0Jsb2NrcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVjb3JkO2lmKGUmJnQzOTZfaXNCbG9ja1Zpc2libGUoZSkpdHJ5e3QzOTZfZG9SZXNpemUoZS5pZC5yZXBsYWNlKCJyZWMiLCIiKSl9Y2F0Y2goaSl7Y29uc29sZS5lcnJvcigiRXJyb3IgdHJ5aW5nIHRvIHJlc2l6ZSAiK2UuaWQsaSl9fSkpLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJ6ZXJvOndpbmRvdy13aWR0aC1jaGFuZ2VkIikpKX0pLDUwMCwiZ2xvYmFsX3Jlc2l6ZV96ZXJvX3VuaXF1ZV9pZCIpfWZ1bmN0aW9uIHQzOTZfX29uT3JpZW50YXRpb25DaGFuZ2UoKXt0Mzk2X3dhaXRGb3JGaW5hbEV2ZW50KChmdW5jdGlvbigpe3QzOTZfX3VwZGF0ZVdpbmRvd0RpbWVuc2lvbnMoKSx0Mzk2X19nZXRaZXJvQmxvY2tzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5yZWNvcmQ7ZSYmdDM5Nl9pc0Jsb2NrVmlzaWJsZShlKSYmdDM5Nl9kb1Jlc2l6ZShlLmlkLnJlcGxhY2UoInJlYyIsIiIpKX0pKX0pLDYwMCwiZ2xvYmFsX29yaWVudGF0aW9uY2hhbmdlX3plcm9fdW5pcXVlX2lkIil9ZnVuY3Rpb24gdDM5Nl9pc09ubHlTY2FsYWJsZUJyb3dzZXIoKXtyZXR1cm4gd2luZG93LmlzT25seVNjYWxhYmxlfWZ1bmN0aW9uIHQzOTZfX2luaXRPbmx5U2NhbGFibGUoKXtpZih2b2lkIDA9PT13aW5kb3cuaXNPbmx5U2NhbGFibGUpe3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9GaXJlZm94XC8oWzAtOV0rKVwuLyksZT10P3BhcnNlSW50KHRbMV0sMTApOjEyNixpPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhbMC05XSspXC4vKSxyPWkmJnBhcnNlSW50KGlbMV0sMTApfHwwO3dpbmRvdy5pc09ubHlTY2FsYWJsZT1lPDEyNix3aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3I9IXdpbmRvdy5pc09ubHlTY2FsYWJsZSYmIXQmJnI8PTEyN319ZnVuY3Rpb24gdDM5Nl9fc2V0R2xvYmFsU2NhbGVWYXJpYWJsZXModCxlLGkpe3ZhciByPTEsbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxuPW8/by5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKTpudWxsO2lmKCFuKXJldHVybiAxO3ZhciBhPXQzOTZfYWJfX2dldFdpbmRvd1dpZHRoKG4pLGw9aT9wYXJzZUZsb2F0KChhL2UpLnRvRml4ZWQoMykpOjEsZD0iYWIiK3Q7d2luZG93LnRuW2RdLnNjYWxlRmFjdG9yPWwsd2luZG93LnRuX3NjYWxlX2ZhY3Rvcj1sO3ZhciBfPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpO3JldHVybiBfJiYhd2luZG93LnRuLmlzRWRpdE1vZGUmJl8uc3R5bGUuc2V0UHJvcGVydHkoIi0tem9vbSIsbC50b1N0cmluZygpKSxsfWZ1bmN0aW9uIHQzOTZfX3Byb2Nlc3NUb3BTaGlmdCh0LGUsaSl7ImZ1bmN0aW9uIiE9dHlwZW9mIHdpbmRvdy50Mzk2X191cGRhdGVUb3BTaGlmdHx8InkiIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJzaGlmdC1wcm9jZXNzZWQiKSYmInkiIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJmaXhlZC1zaGlmdCIpfHx3aW5kb3cudDM5Nl9fdXBkYXRlVG9wU2hpZnQoZSxpKX1mdW5jdGlvbiB0Mzk2X2RvUmVzaXplKHQsZSl7ZSYmdDM5Nl9fdXBkYXRlV2luZG93RGltZW5zaW9ucygpO3ZhciBpPXQzOTZfaXNPbmx5U2NhbGFibGVCcm93c2VyKCkscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVjIit0KSxvPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbj10Mzk2X2RldGVjdFJlc29sdXRpb24odCksYTtpZih0Mzk2X3JlbW92ZUVsZW1lbnRGcm9tRE9NKHI/ci5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fc2NhbGUtc3R5bGUiKTpudWxsKSxpKXt2YXIgbD1yP3IucXVlcnlTZWxlY3RvckFsbCgiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpOltdO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCl7aWYoIXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1hdG9tIil8fCF0LmNsb3Nlc3QoIi50bi1tb2xlY3VsZSIpKXt2YXIgZT10LmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIiksaT1lP2UucGFyZW50Tm9kZTpudWxsO2kmJmkucmVtb3ZlQ2hpbGQoZSksaSYmaS5hcHBlbmRDaGlsZCh0KX19KSl9ZWxzZXt2YXIgZD1yP3IucXVlcnlTZWxlY3RvckFsbCgiLnQzOTZfX2VsZW0sIC50Mzk2X19ncm91cCIpOltdO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCwoZnVuY3Rpb24odCl7dC5zdHlsZS56b29tPSIiO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtlJiYoZS5zdHlsZS50cmFuc2Zvcm1PcmlnaW49IiIsZS5zdHlsZS5mb250U2l6ZT0iIixlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSIiKX0pKX10Mzk2X3N3aXRjaFJlc29sdXRpb24odCxuKTt2YXIgXz1yP3IucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbCxzPSJ3aW5kb3ciPT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZShfLCJ1cHNjYWxlIiksdT10Mzk2X19zZXRHbG9iYWxTY2FsZVZhcmlhYmxlcyh0LG4scyk7dDM5Nl9fc2V0U2NhbGVGYWN0b3JGb3JFbGVtZW50cyh0LHUpLHQzOTZfdXBkYXRlVE5vYmoodCksdDM5Nl9hYl9fcmVuZGVyVmlldyhfKTt2YXIgYz1vP28uZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKToiIjtzJiYiZWRpdCIhPT1jJiZ0X29uRnVuY0xvYWQoInQzOTZfc2NhbGVCbG9jayIsKGZ1bmN0aW9uKCl7dDM5Nl9zY2FsZUJsb2NrKHQpfSkpLCJlZGl0IiE9PWMmJiJ5Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoXywiZml4ZWQtbmVlZC1qcyIpJiZ0X29uRnVuY0xvYWQoInQzOTZfX3Byb2Nlc3NGaXhlZEFydEJvYXJkIiwoZnVuY3Rpb24oKXt0Mzk2X19wcm9jZXNzRml4ZWRBcnRCb2FyZChfKX0pKSx0Mzk2X19wcm9jZXNzQWJzb2x1dGVBcnRCb2FyZChfKSx0Mzk2X19wcm9jZXNzVG9wU2hpZnQoXyx0LCEwKSx0Mzk2X2FsbGVsZW1zX19yZW5kZXJWaWV3KF8pLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3KF8pLHQzOTZfX2FwcGx5Rml4ZXNGb3JBbGxFbGVtZW50cygpLHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQoXyksXyYmXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYXJ0Qm9hcmRSZXNpemVkIikpO3ZhciBmPSJodWciPT09Xy5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpO18mJiFmJiYod2luZG93LnQzOTZfX2lzTW9iaWxlfHx0Mzk2X19yZW1vdmVJbmxpbmVIZWlnaHQoW18sXy5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLF8ucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpXSkpfWZ1bmN0aW9uIHQzOTZfX3VwZGF0ZUF1dG9IZWlnaHQodCl7dmFyIGUsaTtpZigiaHVnIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodG1vZGUiKSl7dmFyIHI9dDM5Nl9fZ2V0QXV0b0hlaWdodCh0KSxvPXQub2Zmc2V0SGVpZ2h0O2lmKCEoTWF0aC5hYnMoci1vKTw9LjcpKXt2YXIgbixhPSJhYiIrdC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxsPXdpbmRvdy50blthXS5jdXJSZXNvbHV0aW9uLGQ7bD09PXdpbmRvdy50blthXS5jdXJSZXNvbHV0aW9uX21heD90LnNldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1oZWlnaHQiLHIpOnQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodC1yZXMtIitsLHIpLHQzOTZfYWJfX3JlbmRlclZpZXcodCksbnVsbD09KGU9dC5jbG9zZXN0KCIudDM5NiIpKXx8ZS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiemVybzpoZWlnaHQtY2hhbmdlZCIpKX19fWZ1bmN0aW9uIHQzOTZfX2dldEF1dG9IZWlnaHQodCl7dmFyIGUsaT10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpLHI9QXJyYXkuZnJvbSh0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpzY29wZSA+IC50bi1ncm91cCwgOnNjb3BlID4gLnRuLWVsZW0iKSksbz10LnN0eWxlLmhlaWdodCxuO2lmKHQzOTZfX2F1dG9IZWlnaHRfX2NhbkF1dG9jYWxjdWxhdGVIZWlnaHQodCxyKSYmbyl7dmFyIGE9dC5zdHlsZS5oZWlnaHQ7dC5zdHlsZS5oZWlnaHQ9ImF1dG8iLGU9dC5vZmZzZXRIZWlnaHQsdC5zdHlsZS5oZWlnaHQ9YX1lbHNlIGU9ci5yZWR1Y2UoKGZ1bmN0aW9uKGUscil7dmFyIG89dDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHIsImF4aXN5Iiksbj10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUociwidG9wdW5pdHMiKSxhPXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZShyLCJoZWlnaHR1bml0cyIpO2lmKCIlIj09PW58fCIlIj09PWF8fCJib3R0b20iPT09b3x8ImNlbnRlciI9PT1vKXJldHVybiBlO3ZhciBsPTA7aWYoImdhbGxlcnkiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIikmJihsPXQzOTZfX2F1dG9IZWlnaHRfX2dldEFkZGl0aW9uYWxPZmZzZXRGb3JHYWxsZXJ5KHIpKSxpKXt2YXIgZD10Mzk2X19hYl9fZ2V0UGFkZGluZ1ZhbHVlKHQsInBhZGRpbmdib3R0b20iKTtsKz1wYXJzZUludChkLDEwKX12YXIgXz1yLm9mZnNldFRvcCtyLm9mZnNldEhlaWdodCtsLHMsdSxjOyJ3aW5kb3ciIT09dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJ1cHNjYWxlIil8fHdpbmRvdy50bi5pc0VkaXRNb2RlfHwoXyo9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIikpKTtyZXR1cm4gXz5lP186ZX0pLC0xLzApO3JldHVybiBlPT09LTEvMD8wOmV9ZnVuY3Rpb24gdDM5Nl9fYXV0b0hlaWdodF9fZ2V0QWRkaXRpb25hbE9mZnNldEZvckdhbGxlcnkodCl7dmFyIGU9MCxpPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fdGl0bGUiKSxyPSJub25lIiE9PXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZSh0LCJzbGRzX2RvdHNjb250cm9scyIpLG89InVuZGVyIj09PXQzOTZfY29yZV9fZ2V0RmllbGRWYWx1ZSh0LCJzbGRzX2Fycm93Y29udHJvbHMiKTtpZihpfHxyfHxvKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX3RpdGxlIiksYT1uP24ub2Zmc2V0SGVpZ2h0OjAsbD10LnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NhcHRpb24udC1zbGRzX19jYXB0aW9uLWFjdGl2ZSIpLGQ9Z2V0Q29tcHV0ZWRTdHlsZShsKSxfO2UrPXBhcnNlSW50KGQubWFyZ2luVG9wLDEwKSthfXJldHVybiBpfHwhciYmIW98fChlLT0yMCksZX1mdW5jdGlvbiB0Mzk2X19hdXRvSGVpZ2h0X19jYW5BdXRvY2FsY3VsYXRlSGVpZ2h0KHQsZSl7dmFyIGkscjtpZighdC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSlyZXR1cm4hMTtpZihlLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiJnYWxsZXJ5Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpfSkpKXt2YXIgbz10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImZsZXhkaXJlY3Rpb24iKSxuPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiZmxleGFsaWduaXRlbXMiKSxhPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiZmxleGp1c3RpZnljb250ZW50IiksbDtyZXR1cm4icm93Ij09PW8mJiJmbGV4LWVuZCI9PT1ufHwiY29sdW1uIj09PW8mJiJmbGV4LWVuZCI9PT1hfXJldHVybiEwfWZ1bmN0aW9uIHQzOTZfX2FiX19nZXRQYWRkaW5nVmFsdWUodCxlKXt2YXIgaT0odDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJwYWRkaW5nIil8fCIwcHggMHB4IDBweCAwcHgiKS5zcGxpdCgiICIpLHI9e3BhZGRpbmd0b3A6aVswXSxwYWRkaW5ncmlnaHQ6aVsxXSxwYWRkaW5nYm90dG9tOmlbMl0scGFkZGluZ2xlZnQ6aVszXX07cmV0dXJuIHBhcnNlSW50KHJbZV0sMTApfHwwfWZ1bmN0aW9uIHQzOTZfX3Byb2Nlc3NBYnNvbHV0ZUFydEJvYXJkKHQpe2lmKHQpe3ZhciBlPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwicG9zIik7aWYoImZpeGVkIiE9PWUpe3ZhciBpPSJ0Mzk2X19hcnRib2FyZC1maXhlZC1uby1iZyI7aWYoImFic29sdXRlIj09PWUpe3ZhciByPWdldENvbXB1dGVkU3R5bGUodCksbz10LnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19maWx0ZXIiKSxuPSFvfHwibm9uZSI9PT1nZXRDb21wdXRlZFN0eWxlKG8pLmJhY2tncm91bmRJbWFnZSxhLGw9InJnYmEoMCwgMCwgMCwgMCkiPT09ci5iYWNrZ3JvdW5kQ29sb3ImJiJub25lIj09PXIuYmFja2dyb3VuZEltYWdlJiZuPyJhZGQiOiJyZW1vdmUiO3QuY2xhc3NMaXN0W2xdKGkpfWVsc2UgdC5jbGFzc0xpc3QucmVtb3ZlKGkpfX19ZnVuY3Rpb24gdDM5Nl9kZXRlY3RSZXNvbHV0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO3ZhciBlLGk9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLmNzc1dpZHRoLHI9ImFiIit0LG87cmV0dXJuIHdpbmRvdy50bltyXS5zY3JlZW5zLmZvckVhY2goKGZ1bmN0aW9uKHQpe2k+PXQmJihvPXQpfSkpLHZvaWQgMD09PW8mJihvPXdpbmRvdy50bltyXS5zY3JlZW5zWzBdKSxvfWZ1bmN0aW9uIHQzOTZfaW5pdFROb2JqX19jcmVhdGVEZWZhdWx0KCl7d2luZG93LnRuPXt9LHdpbmRvdy50bi5hYl9maWVsZHM9WyJoZWlnaHQiLCJ3aWR0aCIsImJnY29sb3IiLCJiZ2ltZyIsImJnYXR0YWNobWVudCIsImJncG9zaXRpb24iLCJmaWx0ZXJvcGFjaXR5IiwiZmlsdGVyY29sb3IiLCJmaWx0ZXJvcGFjaXR5MiIsImZpbHRlcmNvbG9yMiIsImhlaWdodF92aCIsInZhbGlnbiJdfWZ1bmN0aW9uIHQzOTZfaW5pdFROb2JqKHQsZSl7ZSYmKHdpbmRvdy50bnx8dDM5Nl9pbml0VE5vYmpfX2NyZWF0ZURlZmF1bHQoKSx0Mzk2X3NldFNjcmVlbnNUTm9iaih0LGUpKX1mdW5jdGlvbiB0Mzk2X3NldFNjcmVlbnNUTm9iaih0LGUpe3ZhciBpPSJhYiIrdDt3aW5kb3cudG5baV09e30sd2luZG93LnRuW2ldLnNjcmVlbnM9W107dmFyIHI9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtc2NyZWVucyIpO3I/KHI9ci5zcGxpdCgiLCIpKS5mb3JFYWNoKChmdW5jdGlvbih0KXt3aW5kb3cudG5baV0uc2NyZWVucy5wdXNoKHBhcnNlSW50KHQsMTApKX0pKTp3aW5kb3cudG5baV0uc2NyZWVucz1bMzIwLDQ4MCw2NDAsOTYwLDEyMDBdfWZ1bmN0aW9uIHQzOTZfX2dldEF4aXNYUGFkZGluZygpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksZT1Cb29sZWFuKHdpbmRvdy50aWxkYU1lbWJlcnMpfHwiYWxscmVjb3JkcyI9PT13aW5kb3cuemVyb193aW5kb3dfd2lkdGhfaG9vayxpLHI7cmV0dXJuIHQmJmUmJltkb2N1bWVudC5ib2R5LHRdLnJlZHVjZSgoZnVuY3Rpb24odCxlKXt2YXIgaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS5wYWRkaW5nTGVmdCxyPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLnBhZGRpbmdSaWdodDtyZXR1cm4gdCtwYXJzZUludChpLDEwKStwYXJzZUludChyLDEwKX0pLDApfHwwfWZ1bmN0aW9uIHQzOTZfdXBkYXRlVE5vYmoodCl7Zm9yKHZhciBlLGk9dDM5Nl9fZ2V0V2luZG93RGltZW5zaW9ucygpLndpZHRoLHI9ImFiIit0LG89d2luZG93LnRuW3JdLnNjcmVlbnMuc2xpY2UoKS5yZXZlcnNlKCksbj0wO248by5sZW5ndGg7bisrKXdpbmRvdy50bltyXS5jdXJSZXNvbHV0aW9uPT09b1tuXSYmKHdpbmRvdy50bltyXS5jYW52YXNfbWluX3dpZHRoPW9bbl0sd2luZG93LnRuW3JdLmNhbnZhc19tYXhfd2lkdGg9MD09PW4/aTpvW24tMV0pO3ZhciBhPSJhbGxyZWNvcmRzIj09PXdpbmRvdy56ZXJvX3dpbmRvd193aWR0aF9ob29rO3dpbmRvdy50bltyXS5ncmlkX3dpZHRoPXdpbmRvdy50bltyXS5jYW52YXNfbWluX3dpZHRoO3ZhciBsPShpLXdpbmRvdy50bltyXS5ncmlkX3dpZHRoKS8yO3dpbmRvdy50bltyXS5ncmlkX29mZnNldF9sZWZ0PWw8MCYmYT8wOmx9ZnVuY3Rpb24gdDM5Nl9zd2l0Y2hSZXNvbHV0aW9uKHQsZSl7dmFyIGk9ImFiIit0LHI9d2luZG93LnRuW2ldLnNjcmVlbnNbd2luZG93LnRuW2ldLnNjcmVlbnMubGVuZ3RoLTFdO3dpbmRvdy50bltpXS5jdXJSZXNvbHV0aW9uPWUsd2luZG93LnRuW2ldLmN1clJlc29sdXRpb25fbWF4PXIsd2luZG93LnRuLmN1clJlc29sdXRpb249ZSx3aW5kb3cudG4uY3VyUmVzb2x1dGlvbl9tYXg9cn1mdW5jdGlvbiB0Mzk2X2FydGJvYXJkX2J1aWxkKHQsZSl7dmFyIGk9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrZSkscj1pP2kucXVlcnlTZWxlY3RvcigiLnQzOTZfX2FydGJvYXJkIik6bnVsbDtpZihyKXt0Mzk2X2FiX19yZW5kZXJWaWV3KHIpLHQzOTZfYWxsZ3JvdXBzX19yZW5kZXJWaWV3KHIpO3ZhciBvPXIucXVlcnlTZWxlY3RvckFsbCgiLnRuLWVsZW0iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKHQpe3ZhciBpO3N3aXRjaCh0LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSl7Y2FzZSJ0ZXh0Ijp0Mzk2X2FkZFRleHQocix0KTticmVhaztjYXNlImltYWdlIjp0Mzk2X2FkZEltYWdlKHIsdCk7YnJlYWs7Y2FzZSJzaGFwZSI6dDM5Nl9hZGRTaGFwZShyLHQpO2JyZWFrO2Nhc2UiYnV0dG9uIjp0Mzk2X2FkZEJ1dHRvbihyLHQpO2JyZWFrO2Nhc2UidmlkZW8iOnQzOTZfYWRkVmlkZW8ocix0KTticmVhaztjYXNlImh0bWwiOnQzOTZfYWRkSHRtbChyLHQpO2JyZWFrO2Nhc2UidG9vbHRpcCI6dDM5Nl9hZGRUb29sdGlwKHIsdCk7YnJlYWs7Y2FzZSJmb3JtIjp0Mzk2X2FkZEZvcm0ocix0LGUpO2JyZWFrO2Nhc2UiZ2FsbGVyeSI6dDM5Nl9hZGRHYWxsZXJ5KHIsdCxlKTticmVhaztjYXNlInZlY3RvciI6dDM5Nl9hZGRWZWN0b3Iocix0KX19KSksci5jbGFzc0xpc3QucmVtb3ZlKCJyZW5kZXJpbmciKSxyLmNsYXNzTGlzdC5hZGQoInJlbmRlcmVkIiksci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgiYXJ0Qm9hcmRSZW5kZXJlZCIse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pKTt2YXIgbj1yLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1vdnJmbHciKTtpZihbInZpc2libGUiLCJ2aXNpYmxlWCJdLmluY2x1ZGVzKG4pJiYodDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoInRTdG9yZUdhbGxlcnlJbml0aWFsaXplZCIsKGZ1bmN0aW9uKCl7dDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKX0pKSksImF1dG8iPT09bil7dmFyIGE9TWF0aC5hYnMoci5vZmZzZXRIZWlnaHQtci5jbGllbnRIZWlnaHQpOzAhPT1hJiYoci5zdHlsZS5wYWRkaW5nQm90dG9tPWErInB4Iil9aWYod2luZG93LnQzOTZfX2lzTW9iaWxlfHx3aW5kb3cudDM5Nl9faXNJUGFkKXt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2wudGV4dENvbnRlbnQ9IkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxMzY2cHgpIGFuZCAob3JpZW50YXRpb246bGFuZHNjYXBlKSBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzoyKSB7LnQzOTZfX2NhcnJpZXIge2JhY2tncm91bmQtYXR0YWNobWVudDpzY3JvbGwhaW1wb3J0YW50O319IixpLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIixsKX19fWZ1bmN0aW9uIHQzOTZfYWJfX3JlbmRlclZpZXcodCl7aWYodCl7Zm9yKHZhciBlPXdpbmRvdy50bi5hYl9maWVsZHMsaT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHIsbz0wO288ZS5sZW5ndGg7bysrKXQzOTZfYWJfX3JlbmRlclZpZXdPbmVGaWVsZCh0LGVbb10pO3ZhciBuPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0IiksYT10Mzk2X2FiX19nZXRIZWlnaHQodCksbCxkPXQzOTZfX2dldEN1cnJlbnRTY2FsZUZhY3Rvcih0LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpKSxfPSEhaSYmImVkaXQiPT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpLHM9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsInVwc2NhbGUiKSx1LGMsZjtpZihyPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0X3ZoIikscyYmIV8mJnImJih1PXBhcnNlSW50KG4sMTApKmQpLG49PT1hfHx1JiZ1Pj1hKWM9MDtlbHNlIHN3aXRjaCh0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsInZhbGlnbiIpKXtjYXNlInRvcCI6ZGVmYXVsdDpjPTA7YnJlYWs7Y2FzZSJjZW50ZXIiOmM9dT9wYXJzZUZsb2F0KCgoYS11KS8yKS50b0ZpeGVkKDEpKTpwYXJzZUZsb2F0KCgoYS1uKS8yKS50b0ZpeGVkKDEpKTticmVhaztjYXNlImJvdHRvbSI6Yz11P3BhcnNlRmxvYXQoKGEtdSkudG9GaXhlZCgxKSk6cGFyc2VGbG9hdCgoYS1uKS50b0ZpeGVkKDEpKTticmVhaztjYXNlInN0cmV0Y2giOmM9MCxuPWF9dC5zZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLW9mZnNldC10b3AiLGMpLHQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1pbi1oZWlnaHQiLG4pLHQuc2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXByb3h5LW1heC1oZWlnaHQiLGEpO3ZhciBnPXQucXVlcnlTZWxlY3RvcigiLnQzOTZfX2ZpbHRlciIpLHc9dC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fY2FycmllciIpLHA7aWYocj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsImhlaWdodF92aCIpLHI9cGFyc2VGbG9hdChyKSwod2luZG93LnQzOTZfX2lzTW9iaWxlfHx3aW5kb3cudDM5Nl9faXNJUGFkKSYmcil7dmFyIGg9dDM5Nl9hYl9fZ2V0V2luZG93SGVpZ2h0KHQpKnIvMTAwO3Quc3R5bGUuaGVpZ2h0PWgrInB4IixnJiYoZy5zdHlsZS5oZWlnaHQ9aCsicHgiKSx3JiYody5zdHlsZS5oZWlnaHQ9aCsicHgiKX0iaHVnIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLWhlaWdodG1vZGUiKSYmIXImJih0LnN0eWxlLmhlaWdodD1uKyJweCIsZyYmKGcuc3R5bGUuaGVpZ2h0PW4rInB4IiksdyYmKHcuc3R5bGUuaGVpZ2h0PW4rInB4IikpfX1mdW5jdGlvbiB0Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3IodCl7dmFyIGU9ImFiIit0LGk7cmV0dXJuIHdpbmRvdy50biYmd2luZG93LnRuW2VdJiZ3aW5kb3cudG5bZV0uc2NhbGVGYWN0b3J8fHdpbmRvdy50bl9zY2FsZV9mYWN0b3J9ZnVuY3Rpb24gdDM5Nl9fc2V0U2NhbGVGYWN0b3JGb3JFbGVtZW50cyh0LGUpe3ZhciBpPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK3QpLHI9aT9pLnF1ZXJ5U2VsZWN0b3IoIi50Mzk2X19hcnRib2FyZCIpOm51bGw7aWYocil7dmFyIG89ci5xdWVyeVNlbGVjdG9yQWxsKCIudDM5Nl9fZWxlbSwgLnRuLWdyb3VwIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LnNjYWxlRmFjdG9yPWV9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkVGV4dCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9InRvcCxsZWZ0LHdpZHRoLGhlaWdodCxjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiO2kuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpfX1mdW5jdGlvbiB0Mzk2X2FkZEltYWdlKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0iaW1nLHdpZHRoLGZpbGV3aWR0aCxmaWxlaGVpZ2h0LHRvcCxsZWZ0LGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyI7aS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSk7dmFyIG89aS5xdWVyeVNlbGVjdG9yKCJpbWciKTtvJiYoby5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXtkb2N1bWVudC5jb250YWlucyhvKSYmKHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpLG8uc3JjJiZzZXRUaW1lb3V0KChmdW5jdGlvbigpe2RvY3VtZW50LmNvbnRhaW5zKG8pJiYodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIiksdDM5Nl9fdXBkYXRlQXV0b0hlaWdodCh0KSl9KSwyZTMpKX0pKSxvLmNvbXBsZXRlJiYodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIiksby5zcmMmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuY29udGFpbnMobykmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKSx0Mzk2X191cGRhdGVBdXRvSGVpZ2h0KHQpKX0pLDJlMykpLG8uYWRkRXZlbnRMaXN0ZW5lcigidHV3aWRnZXRfZG9uZSIsKGZ1bmN0aW9uKCl7dDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwidG9wIil9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X2NoYW5nZUZpbHRlck9uU2FmYXJpKGkpfSkpKX19ZnVuY3Rpb24gdDM5Nl9hZGRTaGFwZSh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO3IrPSJjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxoZWlnaHR1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiLGkuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpfX1mdW5jdGlvbiB0Mzk2X2NoYW5nZUZpbHRlck9uU2FmYXJpKHQpe3ZhciBlO2lmKC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJih0Mzk2X19jaGVja0NvbnRhaW5CYWNrZHJvcEZpbHRlcih0KSYmIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdykpe3ZhciBpPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKSxyO25ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24oZSxpKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUuaXNJbnRlcnNlY3Rpbmcpe3ZhciByPWUudGFyZ2V0O2kudW5vYnNlcnZlKHIpLHQzOTZfX3Byb2Nlc3NCYWNrZHJvcEZpbHRlck9uSW1hZ2UodCl9fSkpfSkpLm9ic2VydmUoaSl9fWZ1bmN0aW9uIHQzOTZfX2NoZWNrQ29udGFpbkJhY2tkcm9wRmlsdGVyKHQpe2lmKCF0KXJldHVybiExO3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLndlYmtpdEJhY2tkcm9wRmlsdGVyO2lmKGUmJiJub25lIiE9PWUpcmV0dXJuITA7dmFyIGk9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciwgLnRuLWF0b21fX3ByeC13cmFwcGVyLCAudG4tYXRvbV9fc3RpY2t5LXdyYXBwZXIiKTtpZighaSlyZXR1cm4hMTt2YXIgcj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpKS53ZWJraXRCYWNrZHJvcEZpbHRlcjtyZXR1cm4gciYmIm5vbmUiIT09cn1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpe2lmKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLW9wdHMiKSxpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtcHJ4Iil8fHQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtZml4Iikscj1lfHxpLG89dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2VsZW0tLWJhY2tkcm9wLWZpbHRlci1pbWctd3JhcHBlcmVkIik7ciYmb3x8IXI/dDM5Nl9fdXBkYXRlQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpOnQuYWRkRXZlbnRMaXN0ZW5lcigiYmFja2Ryb3BGaWx0ZXJJbWdXcmFwcGVyZWQiLChmdW5jdGlvbigpe3QzOTZfX3VwZGF0ZUJhY2tkcm9wRmlsdGVyT25JbWFnZSh0KX0pKX19ZnVuY3Rpb24gdDM5Nl9fdXBkYXRlQmFja2Ryb3BGaWx0ZXJPbkltYWdlKHQpe2lmKHQpe3ZhciBlPXQsaT1lLnF1ZXJ5U2VsZWN0b3IoImltZyIpLHI9ZS5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciwgLnRuLWF0b21fX3ByeC13cmFwcGVyLCAudG4tYXRvbV9fc3RpY2t5LXdyYXBwZXIiKSxvPSIiO3ImJihlPXIsbz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKS53ZWJraXRCYWNrZHJvcEZpbHRlcnx8IiIpLGUuc3R5bGUud2Via2l0QmFja2Ryb3BGaWx0ZXI9Im5vbmUiLHQzOTZfd2FpdEZvclVwbG9hZEltZyhpLChmdW5jdGlvbigpe2Uuc3R5bGUud2Via2l0QmFja2Ryb3BGaWx0ZXI9b30pKX19ZnVuY3Rpb24gdDM5Nl93YWl0Rm9yVXBsb2FkSW1nKHQsZSl7aWYoInkiPT09d2luZG93LmxhenkpdmFyIGk9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmNsYXNzTGlzdC5jb250YWlucygibG9hZGVkIikmJnQuY2xpZW50V2lkdGgmJnQuc3JjPyhlKCksY2xlYXJUaW1lb3V0KGkpKTp0Mzk2X3dhaXRGb3JVcGxvYWRJbWcodCxlKX0pLDMwMCk7ZWxzZSBlKCl9ZnVuY3Rpb24gdDM5Nl9hZGRCdXR0b24odCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKCFpKXJldHVybiBudWxsO3ZhciByPSJ0b3AsbGVmdCx3aWR0aCxoZWlnaHQsY29udGFpbmVyLGF4aXN4LGF4aXN5LGNhcHRpb24sbGVmdHVuaXRzLHRvcHVuaXRzIjtyZXR1cm4gaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSksaX1mdW5jdGlvbiB0Mzk2X2FkZFZpZGVvKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsaGVpZ2h0LHRvcCxsZWZ0LCI7cis9ImNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsaS5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixyKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcoaSksdF9vbkZ1bmNMb2FkKCJ0Mzk2X2luaXRWaWRlbyIsKGZ1bmN0aW9uKCl7dDM5Nl9pbml0VmlkZW8oaSl9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkSHRtbCh0LGUpe3ZhciBpPXQzOTZfZ2V0RWwoZSk7aWYoaSl7dmFyIHI9IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO3IrPSJjb250YWluZXIsYXhpc3gsYXhpc3ksd2lkdGh1bml0cyxoZWlnaHR1bml0cyxsZWZ0dW5pdHMsdG9wdW5pdHMiLGkuc2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkcyIsciksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KGkpfX1mdW5jdGlvbiB0Mzk2X2FkZFRvb2x0aXAodCxlKXt2YXIgaT10Mzk2X2dldEVsKGUpO2lmKGkpe3ZhciByPSJ3aWR0aCxoZWlnaHQsdG9wLGxlZnQsIjtyKz0iY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsaGVpZ2h0dW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzLHRpcHBvc2l0aW9uIixpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKSx0X29uRnVuY0xvYWQoInQzOTZfaW5pdFRvb2x0aXAiLChmdW5jdGlvbigpe3QzOTZfaW5pdFRvb2x0aXAoaSl9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkRm9ybSh0LGUsaSl7dmFyIHI9dDM5Nl9nZXRFbChlKTtpZihyKXt2YXIgbz0id2lkdGgsdG9wLGxlZnQsIjtvKz0iaW5wdXRzLGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsci5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixvKTt2YXIgbj10Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZShyKSxhPXIuZ2V0QXR0cmlidXRlKCJkYXRhLWZlLWVsZW0taWQiKXx8ci5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpO3Rfb25GdW5jTG9hZCgidF96ZXJvRm9ybXNfX2luaXQiLChmdW5jdGlvbigpe3QzOTZfZWxlbV9fcmVuZGVyVmlldyhyKSx0X3plcm9Gb3Jtc19faW5pdChpLGEsbiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3KHIpfSkpfX1mdW5jdGlvbiB0Mzk2X2FkZEdhbGxlcnkodCxlLGkpe3ZhciByPXQzOTZfZ2V0RWwoZSk7aWYocil7dmFyIG89IndpZHRoLGhlaWdodCx0b3AsbGVmdCwiO28rPSJpbWdzLGNvbnRhaW5lcixheGlzeCxheGlzeSx3aWR0aHVuaXRzLGhlaWdodHVuaXRzLGxlZnR1bml0cyx0b3B1bml0cyIsci5zZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIixvKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXcocik7dmFyIG49ci5nZXRBdHRyaWJ1dGUoImRhdGEtZmUtZWxlbS1pZCIpfHxyLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIik7dF9vbkZ1bmNMb2FkKCJ0X3plcm9HYWxsZXJ5X19pbml0IiwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19pbml0KGksbil9KSl9fWZ1bmN0aW9uIHQzOTZfYWRkVmVjdG9yKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbChlKTtpZihpKXt2YXIgcj0id2lkdGgsZmlsZXdpZHRoLGZpbGVoZWlnaHQsdG9wLGxlZnQsY29udGFpbmVyLGF4aXN4LGF4aXN5LHdpZHRodW5pdHMsbGVmdHVuaXRzLHRvcHVuaXRzIjtpLnNldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiLHIpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhpKX19ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KTtpZighaSlyZXR1cm4gbnVsbDtpZihpLmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSlyZXR1cm4gdDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShpLGUpO3ZhciByPWkuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIiksbz1yLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG49ImFiIitvLGE7dm9pZCAwPT09d2luZG93LnRuW25dJiYodDM5Nl9pbml0VE5vYmoobyxyKSx0Mzk2X3N3aXRjaFJlc29sdXRpb24obyx0Mzk2X2RldGVjdFJlc29sdXRpb24obykpKTt2YXIgbD13aW5kb3cudG5bbl0uY3VyUmVzb2x1dGlvbixkPXdpbmRvdy50bltuXS5jdXJSZXNvbHV0aW9uX21heCxfPXdpbmRvdy50bltuXS5zY3JlZW5zLHM7aWYoIShzPWw9PT1kP2kuZ2V0QXR0cmlidXRlKCJkYXRhLWZpZWxkLSIrZSsiLXZhbHVlIik6aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtIitlKyItcmVzLSIrbCsiLXZhbHVlIikpJiYiIiE9PXMpZm9yKHZhciB1PTA7dTxfLmxlbmd0aDt1Kyspe3ZhciBjPV9bdV07aWYoIShjPD1sKSYmKHM9Yz09PWQ/aS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtIitlKyItdmFsdWUiKTppLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC0iK2UrIi1yZXMtIitjKyItdmFsdWUiKSkpYnJlYWt9dmFyIGY9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihzKTtyZXR1cm4gZiYmKHM9Zi5mYWxsYmFjayksc31mdW5jdGlvbiB0Mzk2X2VsZW1fX3JlbmRlclZpZXcodCl7dmFyIGU9dDM5Nl9nZXRFbCh0KSxpPWU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGRzIik6IiI7aSYmKGk9aS5zcGxpdCgiLCIpKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChlLHQpfSkpfWZ1bmN0aW9uIHQzOTZfZ3JvdXBfX3JlbmRlclZpZXcodCl7dmFyIGU9dD90LmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZHMiKToiIjtlJiYoZT1lLnNwbGl0KCIsIikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBpPXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCxlKTtzd2l0Y2goZSl7Y2FzZSJsZWZ0IjppPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZSh0LGUsaSksdC5zdHlsZS5sZWZ0PXBhcnNlRmxvYXQoaSkudG9GaXhlZCgxKSsicHgiO2JyZWFrO2Nhc2UidG9wIjppPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZSh0LGUsaSksdC5zdHlsZS50b3A9cGFyc2VGbG9hdChpKS50b0ZpeGVkKDEpKyJweCI7YnJlYWs7Y2FzZSJjb250YWluZXIiOnQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKHQsImxlZnQiKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZCh0LCJ0b3AiKX19KSl9ZnVuY3Rpb24gdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQodCxlKXt2YXIgaT10Mzk2X2dldEVsKHQpO2lmKGkpe3ZhciByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbz1yP3IuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKToiIixuLGE9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKGkuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIiksInVwc2NhbGUiKTtpZigieWVzIiE9PWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIpfHwhYXx8ImVkaXQiPT09byl7dmFyIGw9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksZSksZCxfPVsiZmlsbCIsImh1ZyJdLHM9dDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbShpKTtzd2l0Y2goZSl7Y2FzZSJsZWZ0IjpsPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShpLGUsbCksbD1zP3QzOTZfX3pvb21pZnlWYWx1ZShpLGwpOnBhcnNlRmxvYXQobCkudG9GaXhlZCgxKSsicHgiLGkuc3R5bGUubGVmdD1sO2JyZWFrO2Nhc2UidG9wIjpsPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShpLGUsbCksbD1zP3QzOTZfX3pvb21pZnlWYWx1ZShpLGwpOnBhcnNlRmxvYXQobCkudG9GaXhlZCgxKSsicHgiLGkuc3R5bGUudG9wPWw7YnJlYWs7Y2FzZSJ3aWR0aCI6ZD1pLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTt2YXIgdT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwid2lkdGhtb2RlIiksYztpZigoYz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwidGV4dGZpdCIpKXx8KCJidXR0b24iPT09ZD9jPSJmaXhlZHNpemUiOiJ0ZXh0Ij09PWQmJihjPSJhdXRvaGVpZ2h0IikpLCgidGV4dCI9PT1kfHwiYnV0dG9uIj09PWQpJiYiYXV0b3dpZHRoIj09PWMpcmV0dXJuIHZvaWQoaS5zdHlsZS53aWR0aD0iYXV0byIpO2lmKF8uaW5jbHVkZXModSkpcmV0dXJuIHZvaWQoaS5zdHlsZS53aWR0aD0iIik7c3dpdGNoKGw9dDM5Nl9lbGVtX19nZXRXaWR0aChpLGwpLGkuc3R5bGUud2lkdGg9cGFyc2VGbG9hdChsKS50b0ZpeGVkKDEpKyJweCIsZCl7Y2FzZSJ0b29sdGlwIjp2YXIgZj1pLnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1hdG9tX19waW4taWNvbiIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZiwoZnVuY3Rpb24odCl7dmFyIGU9cGFyc2VGbG9hdChsKS50b0ZpeGVkKDEpKyJweCI7dC5zdHlsZS53aWR0aD1lLHQuc3R5bGUuaGVpZ2h0PWV9KSksaS5zdHlsZS5oZWlnaHQ9cGFyc2VJbnQobCkudG9GaXhlZCgxKSsicHgiO2JyZWFrO2Nhc2UiZ2FsbGVyeSI6dDM5Nl9lbGVtX19zZXRHYWxsZXJ5U2l6ZShpLCJ3aWR0aCIsbCl9YnJlYWs7Y2FzZSJoZWlnaHQiOmQ9aS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7dmFyIGc9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImhlaWdodG1vZGUiKSxjO2lmKChjPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ0ZXh0Zml0IikpfHwoImJ1dHRvbiI9PT1kP2M9ImZpeGVkc2l6ZSI6InRleHQiPT09ZCYmKGM9ImF1dG9oZWlnaHQiKSksKCJ0ZXh0Ij09PWR8fCJidXR0b24iPT09ZCkmJlsiYXV0b3dpZHRoIiwiYXV0b2hlaWdodCIsInNpbmdsZWxpbmUiXS5pbmNsdWRlcyhjKSlyZXR1cm4gdm9pZChpLnN0eWxlLmhlaWdodD0iYXV0byIpO2lmKF8uaW5jbHVkZXMoZykmJiJ0b29sdGlwIiE9PWQpcmV0dXJuIHZvaWQoaS5zdHlsZS5oZWlnaHQ9IiIpO2lmKCJ0b29sdGlwIj09PWQpcmV0dXJuO2w9dDM5Nl9lbGVtX19nZXRIZWlnaHQoaSxsKSxpLnN0eWxlLmhlaWdodD1wYXJzZUZsb2F0KGwpLnRvRml4ZWQoMSkrInB4IiwiZ2FsbGVyeSI9PT1kJiZ0Mzk2X2VsZW1fX3NldEdhbGxlcnlTaXplKGksImhlaWdodCIsbCk7YnJlYWs7Y2FzZSJjb250YWluZXIiOnQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksImxlZnQiKSx0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChpLCJ0b3AiKTticmVhaztjYXNlImlucHV0cyI6dHJ5e2w9dDM5Nl9lbGVtX19nZXRGb3JtSW5wdXRzVmFsdWUoaSksd2luZG93LnRfemVyb0Zvcm1zX19yZW5kZXJGb3JtKGksbCl9Y2F0Y2godyl7fX0id2lkdGgiIT09ZSYmImhlaWdodCIhPT1lJiYiZm9udHNpemUiIT09ZSYmImZvbnRmYW1pbHkiIT09ZSYmImxldHRlcnNwYWNpbmciIT09ZSYmImZvbnR3ZWlnaHQiIT09ZSYmImltZyIhPT1lfHwodDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoaSwibGVmdCIpLHQzOTZfZWxlbV9fcmVuZGVyVmlld09uZUZpZWxkKGksInRvcCIpKX19fWZ1bmN0aW9uIHQzOTZfZWxlbV9fc2V0R2FsbGVyeVNpemUodCxlLGkpe3ZhciByPWksbz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodCwiYm9yZGVyd2lkdGgiKSxuPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LCJib3JkZXJzdHlsZSIpO24mJm8mJiJub25lIiE9PW58fChvPTApLHItPTIqbzt2YXIgYT1NYXRoLnJvdW5kKHBhcnNlRmxvYXQocikpKyJweCI7YT0id2lkdGgiPT09ZXx8ImhlaWdodCI9PT1lP3QzOTZfX3pvb21pZnlWYWx1ZSh0LGEse3JvdW5kOiEwfSk6dDM5Nl9fem9vbWlmeVZhbHVlKHQsYSk7dmFyIGw9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19tYWluIiksZD10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1hdG9tX19zbGRzLWltZyIpO3Quc3R5bGVbZV09YSxsJiYobC5zdHlsZVtlXT1hKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsKGZ1bmN0aW9uKHQpe3Quc3R5bGVbZV09YX0pKX1mdW5jdGlvbiB0Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUodCxlLGkpe3ZhciByPXQzOTZfZ2V0RWwodCk7aWYoIXIpcmV0dXJuIG51bGw7dmFyIG89ci5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxuPW8uZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksYT0iYWIiK24sbD10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sInZhbGlnbiIpLGQ9IndpbmRvdyI9PT10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sInVwc2NhbGUiKSxfPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikscyx1PSJlZGl0Ij09PShfP18uZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKToiIiksYz10Mzk2X2lzT25seVNjYWxhYmxlQnJvd3NlcigpLGY9IXUmJmQmJmMsZz0hdSYmZCYmIWMsdz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUociwiYXhpc3kiKSxwPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShyLCJheGlzeCIpLGg9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsImNvbnRhaW5lciIpLG09ci5jbGFzc0xpc3QuY29udGFpbnMoInRuLWdyb3VwIikmJiJwaHlzaWNhbCI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHIsInR5cGUiKSxiPXIucGFyZW50Tm9kZS5jbG9zZXN0KCIudG4tZ3JvdXAiKSx2PSJwaHlzaWNhbCI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsInR5cGUiKTttJiYoaD1ofHwiZ3JpZCIpO3ZhciB5PXBhcnNlSW50KGkpLEYsQSxTLHgsVixFLEksaz10Mzk2X19nZXRDdXJyZW50U2NhbGVGYWN0b3Iobik7c3dpdGNoKGUpe2Nhc2UibGVmdCI6dmFyIHosTD10Mzk2X19nZXRXaW5kb3dEaW1lbnNpb25zKCkud2lkdGgsQjtpZihGPSJncmlkIj09PWg/ImdyaWQiOiJ3aW5kb3ciLEE9ImdyaWQiPT09aD93aW5kb3cudG5bYV0uZ3JpZF9vZmZzZXRfbGVmdDowLFY9ImdyaWQiPT09aD93aW5kb3cudG5bYV0uZ3JpZF93aWR0aDpMLCIlIj09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShyLCJsZWZ0dW5pdHMiKSYmKHk9dDM5Nl9yb3VuZEZsb2F0KFYqeS8xMDApKSx2KXt2YXIgTz1wYXJzZUludCh0Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsImxlZnQiKSwxMCkscTsiJSI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsImxlZnR1bml0cyIpJiYoTz10Mzk2X3JvdW5kRmxvYXQoVipPLzEwMCkpLHktPU87YnJlYWt9IXUmJmQ/ImdyaWQiPT09aCYmYyYmKHkqPWspOnk9QSt5LCJjZW50ZXIiPT09cCYmKHg9dDM5Nl9lbGVtX19nZXRXaWR0aChyKSxmJiYid2luZG93IiE9PUYmJihWKj1rLHgqPWspLHk9Vi8yLXgvMit5KSwicmlnaHQiPT09cCYmKHg9dDM5Nl9lbGVtX19nZXRXaWR0aChyKSxmJiYid2luZG93IiE9PUYmJihWKj1rLHgqPWspLHk9Vi14K3kpLGYmJiJ3aW5kb3ciIT09RiYmKHkrPSgoeD10Mzk2X2VsZW1fX2dldFdpZHRoKHIpKSprLXgpLzIpO2JyZWFrO2Nhc2UidG9wIjp2YXIgUj1yLmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLFQ9Uj9SLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1wcm94eS1taW4tb2Zmc2V0LXRvcCIpOiIwIixXPVI/Ui5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLWhlaWdodCIpOiIwIixIPVI/Ui5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWF4LWhlaWdodCIpOiIwIixDPWZ1bmN0aW9uIHQoZSl7dmFyIGk9dDM5Nl9lbGVtX19nZXRIZWlnaHQoZSk7aWYoZSYmImltYWdlIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpKXt2YXIgcj10Mzk2X2VsZW1fX2dldFdpZHRoKGUpLG89dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImZpbGV3aWR0aCIpLG49dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUsImZpbGVoZWlnaHQiKSxhO2lmKG8mJm4paT1yLyhwYXJzZUludChvKS9wYXJzZUludChuKSl9cmV0dXJuIGl9LFA7aWYoRj0iZ3JpZCI9PT1oPyJncmlkIjoid2luZG93IixTPSJncmlkIj09PWg/cGFyc2VGbG9hdChUKTowLEk9ImdyaWQiPT09aD9wYXJzZUZsb2F0KFcpOnBhcnNlRmxvYXQoSCksIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHIsInRvcHVuaXRzIikmJih5PUkqKHkvMTAwKSksdil7dmFyIE09cGFyc2VJbnQodDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZShiLCJ0b3AiKSwxMCksTjsiJSI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKGIsInRvcHVuaXRzIikmJihNPXQzOTZfcm91bmRGbG9hdChJKk0vMTAwKSkseS09TTticmVha31mJiYid2luZG93IiE9PUYmJih5Kj1rKSxnJiYid2luZG93IiE9PUYmJihTPSJzdHJldGNoIj09PWw/MDpTL2spLHk9Uyt5O3ZhciBEPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoUiwiaGVpZ2h0X3ZoIiksaj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKFIsImhlaWdodCIpLEc9dDM5Nl9hYl9fZ2V0SGVpZ2h0KFIpLFo7aWYoZCYmIXUmJkQmJihaPXBhcnNlSW50KGosMTApKmspLCJjZW50ZXIiPT09dyYmKEU9QyhyKSxmJiYid2luZG93IiE9PUYmJigic3RyZXRjaCIhPT1sP0kqPWs6ST1aP1o+Rz9aOkc6Ui5jbGllbnRIZWlnaHQsRSo9ayksdXx8IWR8fGN8fCJ3aW5kb3ciPT09Rnx8InN0cmV0Y2giIT09bHx8KEk9Wj9aPkc/WjpHOlIuY2xpZW50SGVpZ2h0LEkvPWspLHk9SS8yLUUvMit5KSwiYm90dG9tIj09PXcmJihFPUMociksZiYmIndpbmRvdyIhPT1GJiYoInN0cmV0Y2giIT09bD9JKj1rOkk9Wj9aPkc/WjpHOlIuY2xpZW50SGVpZ2h0LEUqPWspLHV8fCFkfHxjfHwid2luZG93Ij09PUZ8fCJzdHJldGNoIiE9PWx8fChJPVo/Wj5HP1o6RzpSLmNsaWVudEhlaWdodCxJLz1rKSx5PUktRSt5KSxmJiYid2luZG93IiE9PUYpe3ZhciBVPSgoRT1DKHIpKSprLUUpLzI7eSs9VT1NYXRoLnJvdW5kKFUpfX1yZXR1cm4geX1mdW5jdGlvbiB0Mzk2X2VsZW1fZmluZEZpcnN0TGV2ZWxQYXJlbnRHcm91cCh0KXtmb3IodmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fZ3JvdXAiKTtlOyl7dmFyIGk9ZS5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2lmKCFpKWJyZWFrO2U9aX1yZXR1cm4gZX1mdW5jdGlvbiB0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7dmFyIGkscj10LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG89ImFiIityLG47dm9pZCAwPT09d2luZG93LnRuW29dJiYodDM5Nl9pbml0VE5vYmoocix0KSx0Mzk2X3N3aXRjaFJlc29sdXRpb24ocix0Mzk2X2RldGVjdFJlc29sdXRpb24ocikpKTt2YXIgYT13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbixsPXdpbmRvdy50bltvXS5jdXJSZXNvbHV0aW9uX21heCxkPXdpbmRvdy50bltvXS5zY3JlZW5zO2lmKG51bGw9PT0oaT1hPT09bD90LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLSIrZSsiLXJlcy0iK2EpKSlmb3IodmFyIF89MDtfPGQubGVuZ3RoO18rKyl7dmFyIHM9ZFtfXTtpZighKHM8PWEpJiZudWxsIT09KGk9cz09PWw/dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtIitlKTp0LmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC0iK2UrIi1yZXMtIitzKSkpYnJlYWt9dmFyIHU9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihpKTtyZXR1cm4gdSYmKGk9dS5mYWxsYmFjayksaX1mdW5jdGlvbiB0Mzk2X2FiX19yZW5kZXJWaWV3T25lRmllbGQodCxlKXt0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKHQsZSl9ZnVuY3Rpb24gdDM5Nl9jb3JlX19nZXRGaWVsZFZhbHVlKHQsZSl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIik/dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsZSk6dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LGUpfWZ1bmN0aW9uIHQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCxlKXtpZighdClyZXR1cm4gbnVsbDt2YXIgaSxyLG89ImFiIit0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpLG49d2luZG93LnRuW29dLmN1clJlc29sdXRpb24sYT13aW5kb3cudG5bb10uY3VyUmVzb2x1dGlvbl9tYXgsbD13aW5kb3cudG5bb10uc2NyZWVucyxkPVsid2lkdGhtb2RlIiwiaGVpZ2h0bW9kZSIsImZsZXgiXS5pbmNsdWRlcyhlKT8iIjoiLXZhbHVlIjtpZihudWxsPT09KGk9bj09PWE/dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlK2QpOnQuZ2V0QXR0cmlidXRlKCJkYXRhLWdyb3VwLSIrZSsiLXJlcy0iK24rZCkpKWZvcih2YXIgXz0wO188bC5sZW5ndGg7XysrKXt2YXIgcz1sW19dO2lmKCEoczw9bikmJm51bGwhPT0oaT1zPT09YT90LmdldEF0dHJpYnV0ZSgiZGF0YS1ncm91cC0iK2UrZCk6dC5nZXRBdHRyaWJ1dGUoImRhdGEtZ3JvdXAtIitlKyItcmVzLSIrcytkKSkpYnJlYWt9dmFyIHU9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihpKTtyZXR1cm4gdSYmKGk9dS5mYWxsYmFjayksaX1mdW5jdGlvbiB0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlldyh0KXtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1ncm91cCIpLGk9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGUsKGZ1bmN0aW9uKHQpe3JldHVybiJwaHlzaWNhbCI9PT10Mzk2X2dyb3VwX19nZXRGaWVsZFZhbHVlKHQsInR5cGUiKX0pKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3QzOTZfZ3JvdXBfX3JlbmRlclZpZXcodCksdDM5Nl9hbGxncm91cHNfX3JlbmRlclZpZXdBdXRvbGF5b3V0KHQpfSkpfX1mdW5jdGlvbiB0Mzk2X2FsbGdyb3Vwc19fcmVuZGVyVmlld0F1dG9sYXlvdXQodCl7aWYodCYmdC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKSl7dmFyIGU9dDM5Nl9ncm91cF9fZ2V0RmllbGRWYWx1ZSh0LCJ3aWR0aG1vZGUiKSxpPXQzOTZfZ3JvdXBfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0bW9kZSIpOyJmaWxsIj09PWU/KHQuc3R5bGUud2lkdGg9IjEwMCUiLHQuc3R5bGUuZmxleFNocmluaz0iMSIpOih0LnN0eWxlLndpZHRoPSJodWciPT09ZT8ibWluLWNvbnRlbnQiOiIiLHQuc3R5bGUuaGVpZ2h0PSJodWciPT09aT8iaW5pdGlhbCI6IiIsdC5zdHlsZS5mbGV4U2hyaW5rPSIiKX19ZnVuY3Rpb24gdDM5Nl9hbGxlbGVtc19fcmVuZGVyVmlldyh0KXtpZih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1lbGVtIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLChmdW5jdGlvbih0KXt0Mzk2X2VsZW1fX3JlbmRlclZpZXcodCl9KSl9fWZ1bmN0aW9uIHQzOTZfYWJfX2dldEhlaWdodCh0LGUpe3ZhciBpPWU7aXx8KGk9dDM5Nl9hYl9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHQiKSksaT1wYXJzZUZsb2F0KGkpO3ZhciByPXQzOTZfYWJfX2dldEZpZWxkVmFsdWUodCwiaGVpZ2h0X3ZoIik7aWYociYmKHI9cGFyc2VGbG9hdChyKSwhaXNOYU4ocikpKXt2YXIgbz10Mzk2X2FiX19nZXRXaW5kb3dIZWlnaHQodCkqci8xMDA7aTxvJiYoaT1vKX1yZXR1cm4gaX1mdW5jdGlvbiB0Mzk2X2VsZW1fX2dldFdpZHRoKHQsZSl7dmFyIGk9dDM5Nl9nZXRFbCh0KSxyLG8sbj0iYWIiK2kuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksYT1lLGwsZCxfLHM7KGF8fChhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ3aWR0aCIpKSxhPXBhcnNlRmxvYXQoYSksIiUiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksIndpZHRodW5pdHMiKSkmJihhPSJ3aW5kb3ciPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGksImNvbnRhaW5lciIpP3QzOTZfX2dldFdpbmRvd0RpbWVuc2lvbnMoKS53aWR0aCphLzEwMDp3aW5kb3cudG5bbl0uZ3JpZF93aWR0aCphLzEwMCk7cmV0dXJuIGF9ZnVuY3Rpb24gdDM5Nl9lbGVtX19nZXRIZWlnaHQodCxlKXt2YXIgaT10Mzk2X2dldEVsKHQpLHI9ZTtyfHwocj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0IikpLHI9cGFyc2VGbG9hdChyKTt2YXIgbz1pLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxuPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJ0ZXh0Zml0IiksYTtpZihufHwoImJ1dHRvbiI9PT1vP249ImZpeGVkc2l6ZSI6InRleHQiPT09byYmKG49ImF1dG9oZWlnaHQiKSksInNoYXBlIj09PW98fCJ2aWRlbyI9PT1vfHwiaHRtbCI9PT1vfHwiZ2FsbGVyeSI9PT1vfHwoInRleHQiPT09b3x8ImJ1dHRvbiI9PT1vKSYmImZpeGVkc2l6ZSI9PT1uKXt2YXIgbDtpZigiJSI9PT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoaSwiaGVpZ2h0dW5pdHMiKSl7dmFyIGQ9aS5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKSxfPWQ/ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWluLWhlaWdodCIpOiIwIixzPWQ/ZC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcHJveHktbWF4LWhlaWdodCIpOiIwIix1PXBhcnNlRmxvYXQoXyksYz1wYXJzZUZsb2F0KHMpLGY7cj0id2luZG93Ij09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShpLCJjb250YWluZXIiKT9jKihyLzEwMCk6dSooci8xMDApfXJldHVybiByfWlmKCJ0ZXh0Ij09PW8pe3ZhciBnPWkucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtnJiYoZy5zdHlsZS5saW5lSGVpZ2h0PSIiKX1yZXR1cm4gaS5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gdDM5Nl9yb3VuZEZsb2F0KHQpe3JldHVybiBNYXRoLnJvdW5kKDEwMCp0KS8xMDB9ZnVuY3Rpb24gdDM5Nl9yZW1vdmVFbGVtZW50RnJvbURPTSh0KXt2YXIgZT10Mzk2X2dldEVsKHQpO2UmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIHQzOTZfZ2V0RWwodCl7cmV0dXJuIHdpbmRvdy5qUXVlcnkmJnQgaW5zdGFuY2VvZiBqUXVlcnk/dC5sZW5ndGg/dC5nZXQoMCk6bnVsbDp0fWZ1bmN0aW9uIHQzOTZfX2dldEJsb2NrRWRpdG9yV2lkdGgoKXtpZighd2luZG93LnRuLmlzRWRpdE1vZGUpcmV0dXJuIDA7dmFyIHQsZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCItLXBhZ2Utdmlldy13aWR0aCIpO3JldHVybiBlJiYiMTAwJSIhPT1lP3BhcnNlSW50KGUsMTApOjB9ZnVuY3Rpb24gdDM5Nl9faXNBbGxaZXJvQmxvY2tzUmVuZGVyZWQodCxlKXt2b2lkIDA9PT1lJiYoZT0wKTt2YXIgaT10Mzk2X19nZXRaZXJvQmxvY2tzKCkscj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLG89ciYmImVkaXQiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpLG49InJlYWR5Ij09PWRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCJkYXRhLXJlYWR5LXN0YXR1cyIpLGE9ITE7aWYoaS5sZW5ndGh8fCFvfHxuKXtpZighaS5sZW5ndGgmJm8mJm4pcmV0dXJuIGU+MzA/dm9pZCB0KCk6dm9pZCBzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfX2lzQWxsWmVyb0Jsb2Nrc1JlbmRlcmVkKHQsZSsxKX0pLDEwMCk7dmFyIGw9aS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmFydGJvYXJkfSkpLGQ7aWYobC5sZW5ndGg+MCYmbC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKXQoKTtlbHNle3ZhciBfPWwuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil9KSk7bC5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNsYXNzTGlzdC5jb250YWlucygicmVuZGVyZWQiKXx8ZS5hZGRFdmVudExpc3RlbmVyKCJhcnRCb2FyZFJlbmRlcmVkIiwoZnVuY3Rpb24oKXtfLnB1c2goZSksXy5sZW5ndGghPT1sLmxlbmd0aHx8YXx8dCgpfSkpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YT0hMCxfLmxlbmd0aCE9PWwubGVuZ3RoJiZ0KCl9KSwzZTMpfX1lbHNle3ZhciBzPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyJyZWFkeSI9PT1lLnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEtcmVhZHktc3RhdHVzIikmJihzLmRpc2Nvbm5lY3QoKSx0Mzk2X19pc0FsbFplcm9CbG9ja3NSZW5kZXJlZCh0KSl9KSl9KSk7cy5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsiZGF0YS1yZWFkeS1zdGF0dXMiXX0pfX1mdW5jdGlvbiB0Mzk2X19wcm9jZXNzRWxlbWVudHNUcmFuc2Zvcm0odCl7dmFyIGU9dDM5Nl9faW5pdEZhc3RET00oKSxpPVtdO2UucmVhZCgoZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO2lmKCJ0ZXh0Ij09PWV8fCJpbWFnZSI9PT1lfHwic2hhcGUiPT09ZXx8ImJ1dHRvbiI9PT1lfHwidmVjdG9yIj09PWUpe3ZhciByPWdldENvbXB1dGVkU3R5bGUodCksbz1yLmJhY2tkcm9wRmlsdGVyJiYibm9uZSIhPT1yLmJhY2tkcm9wRmlsdGVyfHxyLndlYmtpdEJhY2tkcm9wRmlsdGVyJiYibm9uZSIhPT1yLndlYmtpdEJhY2tkcm9wRmlsdGVyLG49dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zdHlsZSIpO2lmKG8mJiFuKXt2YXIgYT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIiksbD1hP3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnRyYW5zZm9ybToibm9uZSI7Im1hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKSI9PT1sJiYobD0ibm9uZSIpLCJub25lIiE9PWwmJmkucHVzaCh7ZWxlbWVudDp0LGF0b206YSxhdG9tVHJhbnNmb3JtOmx9KX19fSkpfSkpLGUud3JpdGUoKGZ1bmN0aW9uKCl7aS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmF0b20uc3R5bGUudHJhbnNmb3JtPSJub25lIix0LmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPXQuYXRvbVRyYW5zZm9ybX0pKX0pKX1mdW5jdGlvbiB0Mzk2X19maXhFbGVtZW50c0xpbmVIZWlnaHRzKHQpe3ZhciBlPXQzOTZfX2luaXRGYXN0RE9NKCksaT1bXTtlLnJlYWQoKGZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgZTtpZigidGV4dCI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSl7dmFyIHI9dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbSIpO2lmKHImJiF0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20odCkpe3ZhciBvPXQuc3R5bGUuem9vbSxuPXIuc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3QsYT1yLnN0eWxlLmZvbnRTaXplO2kucHVzaCh7ZWxlbWVudDp0LGF0b206cix6b29tOm8sdGV4dFNpemVBZGp1c3Q6bixmb250U2l6ZTphfSl9fX0pKX0pKSxlLndyaXRlKChmdW5jdGlvbigpe2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hdG9tLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJsaW5lLWhlaWdodCIpLHdpbmRvdy50Mzk2X19pc1NhZmFyaSYmdC56b29tJiYodC5hdG9tLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PSJub25lIix0LmF0b20uc3R5bGUuZm9udFNpemU9IiIsdC5lbGVtZW50LnN0eWxlLnpvb209IiIpfSkpfSkpLGUucmVhZCgoZnVuY3Rpb24oKXtpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY29tcHV0ZWRMaW5lSGVpZ2h0PXBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodC5hdG9tKS5saW5lSGVpZ2h0KX0pKX0pKSxlLndyaXRlKChmdW5jdGlvbigpe2kuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5jb21wdXRlZExpbmVIZWlnaHQ7d2luZG93LnQzOTZfX2lzU2FmYXJpJiZ0Lnpvb20mJih0LmF0b20uc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9dC50ZXh0U2l6ZUFkanVzdCx0LmF0b20uc3R5bGUuZm9udFNpemU9dC5mb250U2l6ZSx0Lnpvb20mJih0LmVsZW1lbnQuc3R5bGUuem9vbT10Lnpvb20pKSxlJiYhaXNOYU4oZSkmJih0LmF0b20uc3R5bGUubGluZUhlaWdodD1NYXRoLnJvdW5kKGUpKyJweCIpfSkpfSkpfWZ1bmN0aW9uIHQzOTZfX2ZpeEVsZW1lbnRzRm9udFNpemVzKHQpe3ZhciBlO2lmKCF3aW5kb3cudDM5Nl9faXNNb2JpbGUmJndpbmRvdy50Mzk2X19pc0lQYWR8fHdpbmRvdy50Mzk2X19pc0ZhY2Vib29rTWVzc2VuZ2VySW5BcHB8fHdpbmRvdy50Mzk2X19pc0luc3RhZ3JhbUluQXBwKXt2YXIgaT10Mzk2X19pbml0RmFzdERPTSgpLHI9W107aS5yZWFkKChmdW5jdGlvbigpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIik7aWYoInRleHQiPT09ZXx8ImJ1dHRvbiI9PT1lKXt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tIik7aWYoaSl7dmFyIG89dDM5Nl9lbGVtX2ZpbmRGaXJzdExldmVsUGFyZW50R3JvdXAodCksbj17ZWxlbWVudDp0LGF0b206aSx6b29tOjEsZWxlbWVudFR5cGU6ZX07aWYobyYmby5zdHlsZS56b29tJiYobi56b29tPXBhcnNlRmxvYXQoby5zdHlsZS56b29tKSksMSE9PW4uem9vbSl7dmFyIGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsImZvbnRzaXplIik7YSYmKG4uZmllbGRGb250U2l6ZT1wYXJzZUZsb2F0KGEpKSxyLnB1c2gobil9fX19KSl9KSksaS53cml0ZSgoZnVuY3Rpb24oKXtyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYXRvbS5zdHlsZS5mb250U2l6ZT0iIn0pKX0pKSxpLnJlYWQoKGZ1bmN0aW9uKCl7ci5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1wYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQuYXRvbSkuZm9udFNpemUpLGk9dC5maWVsZEZvbnRTaXplJiZNYXRoLmFicyh0LmZpZWxkRm9udFNpemUtZSk8PS4wMSxyPU51bWJlci5pc0ludGVnZXIoZSk7dC5jb3JyZWN0Rm9udFNpemU9aXx8cj8iY2FsYygiK2UrInB4ICogdmFyKC0tem9vbSwgMSkpIjoiY2FsYygiK2UrInB4ICogdmFyKC0tem9vbSwgMSkgKiB2YXIoLS16b29tLCAxKSkifSkpfSkpLGkud3JpdGUoKGZ1bmN0aW9uKCl7ci5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmF0b20uc3R5bGUuZm9udFNpemU9dC5jb3JyZWN0Rm9udFNpemV9KSl9KSl9fWZ1bmN0aW9uIHQzOTZfX2luaXRGYXN0RE9NKCl7cmV0dXJue3JlYWQ6ZnVuY3Rpb24gdChlKXtlKCl9LHdyaXRlOmZ1bmN0aW9uIHQoZSl7ZSgpfX19ZnVuY3Rpb24gdDM5Nl9fYXBwbHlGaXhlc0ZvckFsbEVsZW1lbnRzKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQzOTZfX2VsZW0iKSxlPXdpbmRvdy50Mzk2X19pc1NhZmFyaXx8d2luZG93LnQzOTZfX2lzRmFjZWJvb2tNZXNzZW5nZXJJbkFwcHx8d2luZG93LnQzOTZfX2lzSW5zdGFncmFtSW5BcHA7ZG9jdW1lbnQuZm9udHMmJmU/ZG9jdW1lbnQuZm9udHMucmVhZHkudGhlbigoZnVuY3Rpb24oKXt0Mzk2X19maXhFbGVtZW50c0ZvbnRTaXplcyh0KSx0Mzk2X19maXhFbGVtZW50c0xpbmVIZWlnaHRzKHQpfSkpOnQzOTZfX2ZpeEVsZW1lbnRzTGluZUhlaWdodHModCksdDM5Nl9fcHJvY2Vzc0VsZW1lbnRzVHJhbnNmb3JtKHQpfWZ1bmN0aW9uIHQzOTZfX3pvb21pZnlWYWx1ZSh0LGUsaSl7dm9pZCAwPT09aSYmKGk9e30pO3ZhciByLG89ZSsoU3RyaW5nKGUpLmVuZHNXaXRoKCJweCIpPyIiOiJweCIpLG47aWYodDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpKXJldHVybiBvO3ZhciBhPXdpbmRvdy5DU1MmJndpbmRvdy5DU1Muc3VwcG9ydHMmJkNTUy5zdXBwb3J0cygid2lkdGgiLCJyb3VuZCgxMHB4LCAxcHgpIik7cmV0dXJuIGkucm91bmQmJmE/InJvdW5kKCIrbysiICogdmFyKC0tem9vbSwgMSksIDFweCkiOiJjYWxjKCIrbysiICogdmFyKC0tem9vbSwgMSkpIn1mdW5jdGlvbiB0Mzk2X19pc0luUG9wdXAodCl7aWYoIXQpcmV0dXJuITE7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtcmVjaWQiKSxpLHI7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpLnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXBvcHVwX19jb250YWluZXIiKX1mdW5jdGlvbiB0Mzk2X193YWl0Rm9yUG9wdXAoKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQpe3ZhciBlPTAsaT01O2Z1bmN0aW9uIHIoKXt2YXIgaT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1wb3B1cF9zaG93Iik7aT90KGkpOmU+PTU/dChudWxsKTooZSsrLHNldFRpbWVvdXQociwxMDAqZSkpfXIoKX0pKX1mdW5jdGlvbiB0Mzk2X19zaG91bGRVc2VWaXN1YWxWaWV3cG9ydEhlaWdodCgpe3JldHVybiJ2aXN1YWxWaWV3cG9ydCJpbiB3aW5kb3cmJndpbmRvdy50Mzk2X19pc01vYmlsZSYmd2luZG93LnQzOTZfX2lzU2FmYXJpfWZ1bmN0aW9uIHQzOTZfX2dldFJvb3Rab25lKCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlO3JldHVybiB0JiZ0LmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1yb290LXpvbmUiKXx8ImNvbSJ9ZnVuY3Rpb24gdDM5Nl9faW50aWFsaXplVW5kZXJjdXQodCl7aWYodCYmdC5xdWVyeVNlbGVjdG9yKCIucWwtdW5kZXJjdXQiKSl7dmFyIGUsaT0iaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIit0Mzk2X19nZXRSb290Wm9uZSgpKyIvanMvdGlsZGEtdW5kZXJjdXQtMS4wLm1pbi5qcyI7dF9vbkZ1bmNMb2FkKCJ0X2xvYWRKc0ZpbGUiLChmdW5jdGlvbigpe3RfbG9hZEpzRmlsZShpLChmdW5jdGlvbigpe3Rfb25GdW5jTG9hZCgidF9xdWlsbFVuZGVyY3V0X3BhcnNlTm9kZXMiLChmdW5jdGlvbigpe3RfcXVpbGxVbmRlcmN1dF9wYXJzZU5vZGVzKHQpfSkpfSkpfSkpfX1mdW5jdGlvbiB0Mzk2X19pbml0aWFsaXplQXJ0Ym9hcmRPdmVyZmxvdyh0LGUpe2lmKGUmJnQpe3ZhciBpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoIm92ZXJmbG93Iik7aWYoImF1dG8iPT09aSl7dmFyIHI9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpOyJ5IiE9PXdpbmRvdy5sYXp5JiYieWVzIiE9PXJ8fHRfb25GdW5jTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe2UuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0X3Rocm90dGxlKHdpbmRvdy50X2xhenlsb2FkX3VwZGF0ZSw1MDApKX0pKX0iIiE9PXdpbmRvdy5sb2NhdGlvbi5oYXNoJiYidmlzaWJsZSI9PT1pJiYoZS5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Uuc3R5bGUub3ZlcmZsb3c9InZpc2libGUifSksMSkpfX1mdW5jdGlvbiB0Mzk2X19pbml0aWFsaXplQW5jaG9yTGlua092ZXJmbG93Rml4KCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYXJ0Ym9hcmQtb3ZyZmx3PSJ2aXNpYmxlIl0nKTt0Lmxlbmd0aCYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbihlKXt2YXIgaTtlLnRhcmdldC5jbG9zZXN0KCdhW2hyZWZePSIjIl0nKSYmKHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIn0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5zdHlsZS5vdmVyZmxvdz0idmlzaWJsZSJ9KSl9KSkpfSkpfQoKZnVuY3Rpb24gdF9zbGRzSW5pdCh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciByPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGk7aWYocilpZighci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWluaXRpYWxpemVkIikpe3ZhciBhPXIuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1mZWVkLWNvbnRhaW5lciIpLGw9cy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpO2lmKGwpe2UmJmUucmFuZG9tU29ydCYmKGw9dF9zbGRzX3JhbmRvbVNvcnRFbGVtZW50cyhsKSk7dmFyIGQ9bC5sZW5ndGgsbz1sWzBdLG49bFtsLmxlbmd0aC0xXSxjPXdpbmRvdy5pbm5lcldpZHRoLF89cGFyc2VJbnQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MCx1PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikscD1wYXJzZUZsb2F0KHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIikpLGY7aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsLChmdW5jdGlvbih0LGUpe3Quc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IixlKzEpfSkpLCJ0cnVlIiE9PXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpe3B8fDA9PT1wfHwocD0zMDApLGlzTmFOKHApJiZyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIsIjMwMCIpLHIuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNsZHNfYW5pbWF0ZWQtZmFzdCIpfHxyLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLXNsb3ciKXx8ci5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1ub25lIil8fHIuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLWZhc3QiKTt2YXIgbT1fO3Rfc2xkc19zZXRJdGVtc0luUm93KHQpLHRfc2xkc19jaGFuZ2VJbWFnZVVybCh0KTt2YXIgeT04PT09ZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PT09ZG9jdW1lbnQuZG9jdW1lbnRNb2RlO3kmJihyLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1mYXN0Iiksci5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtc2xvdyIpLHIuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSxyLmNsYXNzTGlzdC5hZGQoInQtc2xkc19pZSIpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodCIsInRydWUiKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiwxKSksci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWluaXRpYWxpemVkIiwidHJ1ZSIpLHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpfHxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiLGQpO3ZhciB2PTEsZz1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIik7Zz92PXBhcnNlSW50KGcsMTApOnIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLDEpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsIiIpLHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hbmltYXRlZCIsIiIpLGF8fHRfc2xkc19fY3JlYXRlRHVtbWllcyhvLG4sciksXz1wYXJzZUludChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiksMTApfHwwO3ZhciBoPXMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIpO2gubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGgsKGZ1bmN0aW9uKHQpe3Quc3R5bGUuZGlzcGxheT0iZmFsc2UiPT09dSYmZC1fPD0wPyJub25lIjoiIn0pKSxhfHx0X3NsZHNfU2xpZGVyV2lkdGgodCksInRydWUiPT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiKSYmdF9zbGRzX1NsaWRlckhlaWdodCh0KSx0X3NsZHNfU2xpZGVyQXJyb3dzSGVpZ2h0KHQpLHRfc2xkc19BY3RpdmVTbGlkZSh0LHYsZCksdF9zbGRzX0FjdGl2ZUNhcHRpb24odCx2LGQpLGE/Yz45NjAmJigidHJ1ZSI9PT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1mZWVkcy1wb3N0cy1sb2FkZWQiKT8odF9zbGRzX19pbml0RmVlZHNTbGlkZXIodCxzLGUpLHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxlKSk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZmVlZHNMb2FkUG9zdHMiLChmdW5jdGlvbigpe3Rfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQscyxlKSx0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQsZSl9KSkpOih5fHx0X3NsZHNfb25IYW1tZXJMb2FkKCJIYW1tZXIiLChmdW5jdGlvbigpe3Rfc2xkc19pbml0U2xpZGVyU3dpcGUodCxkLGMpfSkpLHRfc2xkc19pbml0U2xpZGVyQ29udHJvbHModCxlKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpKSxyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIpPjA/dF9zbGRzX2luaXRBdXRvUGxheSh0LHYsZCxlKTpyLmFkZEV2ZW50TGlzdGVuZXIoInNsaWRlQXV0b3BsYXlUaW1lclJlYWR5IiwoZnVuY3Rpb24oKXtyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIpPjAmJnRfc2xkc19pbml0QXV0b1BsYXkodCx2LGQsZSl9KSkscy5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtLWxvYWRlZCIpLmxlbmd0aDxkKzImJnRfc2xkc19VcGRhdGVJbWFnZXModCx2KSwieWVzIj09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWFycm93cy1uZWFycGljIikmJnRfc2xkc19wb3NpdGlvbkFycm93cyh0KTt2YXIgYj1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHMiKTtiLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChiLChmdW5jdGlvbih0KXt0LnN0eWxlLnZpc2liaWxpdHk9IiJ9KSksdF9zbGRzX19zZXRUYWJpbmRleEZvckZvY3VzYWJsZUVsZW1lbnRzKHQpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLHRfc2xkc191cGRhdGVPbkRpc3BsYXlDaGFuZ2UpLHMuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLHRfc2xkc191cGRhdGVPbkRpc3BsYXlDaGFuZ2UodCxtKSksYSYmKHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcGxheUNoYW5nZWQiLHRfc2xkc191cGRhdGVGZWVkc1NsaWRlck9uUmVzaXplKSxzLmFkZEV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIiwoZnVuY3Rpb24oKXt0X3NsZHNfdXBkYXRlRmVlZHNTbGlkZXJPblJlc2l6ZSh0LHMsZSl9KSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0X3NsZHNfc2V0SXRlbXNJblJvdyh0LG0pLHRfc2xkc191cGRhdGVTbGlkZXIodCksdF9zbGRzX3Bvc2l0aW9uQXJyb3dzKHQpLGEmJnRfc2xkc191cGRhdGVGZWVkc1NsaWRlck9uUmVzaXplKHQscyxlKX0pLDEwMCl9KSkpLHdpbmRvdy50X3NsZHNfX2lzaU9TJiYoImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/dF9zbGRzX19oaWRlTW9iaWxlU2xpZGVzKHMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3Rfc2xkc19faGlkZU1vYmlsZVNsaWRlcyhzLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIikpfSkpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7InRydWUiPT1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQiKSYmdF9zbGRzX1VwZGF0ZVNsaWRlckhlaWdodCh0KSx0X3NsZHNfVXBkYXRlU2xpZGVyQXJyb3dzSGVpZ2h0KHQpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zbGRzX1VwZGF0ZVNsaWRlckFycm93c0hlaWdodCh0KX0pLDUwMCk7dmFyIEE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FsbHJlY29yZHMiKTtBJiZBLmFkZEV2ZW50TGlzdGVuZXIoImFsbFJlY1BhZGRpbmdJbml0IiwoZnVuY3Rpb24oKXt0X3NsZHNfdXBkYXRlU2xpZGVyKHQpfSkpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3NsZHNfX3JlbW92ZUF1dG9wbGF5QnlWaWRlbyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfc2xkc19fcmVtb3ZlQXV0b3BsYXlCeVZpZGVvKX19fX19ZnVuY3Rpb24gdF9zbGRzX19yZW1vdmVBdXRvcGxheUJ5VmlkZW8odCl7dmFyIGU9dC50YXJnZXQuY2xvc2VzdCgiLnQtc2xkc19faXRlbSIpLHM9bnVsbD09ZT92b2lkIDA6ZS5xdWVyeVNlbGVjdG9yKCJbZGF0YS1zbGlkZXItdmlkZW8tdHlwZV0sIFtkYXRhLXZpZGVvbGF6eS10eXBlXSwgaWZyYW1lIik7aWYocyl7dmFyIHI9cy5jbG9zZXN0KCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksaTtpZihyKXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pbnRlcnZhbC1pZCIpJiYoci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKSxyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIsInkiKSl9fWZ1bmN0aW9uIHRfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQsZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYocyl7dmFyIHI9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpLGk9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIiksMTApfHwwLGE9clswXSxsPXJbci5sZW5ndGgtMV0sZD1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpO3Rfc2xkc19fY3JlYXRlRHVtbWllcyhhLGwscyksdF9zbGRzX3VwZGF0ZVNsaWRlcih0KTt2YXIgbz1wYXJzZUludChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiksMTApfHwwLG49ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd193cmFwcGVyLXJpZ2h0Iik7bi5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobiwoZnVuY3Rpb24odCl7dC5zdHlsZS5kaXNwbGF5PSJmYWxzZSI9PT1kJiZpLW88PTA/Im5vbmUiOiIifSkpLCJ0cnVlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IikmJnRfc2xkc19TbGlkZXJIZWlnaHQodCl9fWZ1bmN0aW9uIHRfc2xkc19fY3JlYXRlRHVtbWllcyh0LGUscyl7dmFyIHIsaT1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIikubGVuZ3RoLGE9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpLDEwKXx8MCxsPXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIiksZD1zLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSxvPSExLG49ITEsYyxfO2lmKHQmJihjPXQucXVlcnlTZWxlY3RvcignW2RhdGEtem9vbWFibGU9InllcyJdJykpJiYobz0hMCxjLmNsYXNzTGlzdC5jb250YWlucygidC16b29tYWJsZSIpJiZjLmNsYXNzTGlzdC5yZW1vdmUoInQtem9vbWFibGUiKSxjLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS16b29tYWJsZSIpKSxlJiYoXz1lLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXpvb21hYmxlPSJ5ZXMiXScpKSYmKG49ITAsXy5jbGFzc0xpc3QuY29udGFpbnMoInQtem9vbWFibGUiKSYmXy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXpvb21hYmxlIiksXy5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiKSksZSYmMD09cy5xdWVyeVNlbGVjdG9yQWxsKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IjAiXScpLmxlbmd0aCl7dmFyIHU9ZS5jbG9uZU5vZGUoITApO3Uuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IiwiMCIpLHUuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKTt2YXIgcD10LnBhcmVudE5vZGU7cC5pbnNlcnRCZWZvcmUodSx0KTt2YXIgZj1wLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNsaWRlLWluZGV4PSIwIl0gW2ZpZWxkXScpO2YubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGYsKGZ1bmN0aW9uKHQpe3QucmVtb3ZlQXR0cmlidXRlKCJmaWVsZCIpfSkpfWlmKCFkJiZ0JiYhcy5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IicrKGkrMSkrJyJdJykpe3ZhciBtPXQuY2xvbmVOb2RlKCEwKTtpZihtLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIsaSsxKSxtLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19faXRlbV9hY3RpdmUiKSxtLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIiksZS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIixtKSxlLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbS1sb2FkZWQiKSxhPjAmJiJ0cnVlIj09PWwpZm9yKHZhciB5PXQsdj1lLGc9MDtnPGEtMTtnKyspe3ZhciBoPXkubmV4dEVsZW1lbnRTaWJsaW5nLmNsb25lTm9kZSghMCk7aC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiLGkrZysxKSx2Lm5leHRFbGVtZW50U2libGluZy5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyZW5kIixoKSx2PXYubmV4dEVsZW1lbnRTaWJsaW5nLHk9eS5uZXh0RWxlbWVudFNpYmxpbmd9fW8mJmMmJihjLmNsYXNzTGlzdC5hZGQoInQtem9vbWFibGUiKSxjLnNldEF0dHJpYnV0ZSgiZGF0YS16b29tYWJsZSIsInllcyIpKSxuJiZfJiYoXy5jbGFzc0xpc3QuYWRkKCJ0LXpvb21hYmxlIiksXy5zZXRBdHRyaWJ1dGUoImRhdGEtem9vbWFibGUiLCJ5ZXMiKSl9ZnVuY3Rpb24gdF9zbGRzX19oaWRlTW9iaWxlU2xpZGVzKHQpe2lmKHQpe3ZhciBlPXQuY2xvc2VzdCgiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLHM9ZSYmZ2V0Q29tcHV0ZWRTdHlsZShlKTtpZighc3x8InNjcm9sbCIhPT1zLm92ZXJmbG93WHx8ImZsZXgiIT09cy5kaXNwbGF5KXt2YXIgcj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW06bm90KC50LXNsZHNfX2l0ZW1fZHVtbXkpIikpLGk9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoPjk2MD81OjM7aWYoIShyLmxlbmd0aDw9MippKSl7Zm9yKHZhciBhPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IiksbD1bYT1wYXJzZUludChhLDEwKV0sZD0xO2Q8aTtkKyspYStkPD1yLmxlbmd0aD9sLnB1c2goYStkKTpsLnB1c2goZCksYS1kPjA/bC5wdXNoKGEtZCk6bC5wdXNoKHIubGVuZ3RoKzEtZCk7dmFyIG89InQtc2xkc19faXRlbS1pbm5hY3RpdmUiO3IuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7bC5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiKSwxMCk9PT1lfSkpP3QuY2xhc3NMaXN0LnJlbW92ZShvKTp0LmNsYXNzTGlzdC5hZGQobyl9KSl9fX19ZnVuY3Rpb24gdF9zbGRzX3VwZGF0ZU9uRGlzcGxheUNoYW5nZSh0LGUpe3RfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dF9zbGRzX3NldEl0ZW1zSW5Sb3codCxlKSx0X3NsZHNfdXBkYXRlU2xpZGVyKHQpLHRfc2xkc19wb3NpdGlvbkFycm93cyh0KX0pKX1mdW5jdGlvbiB0X3NsZHNfdXBkYXRlRmVlZHNTbGlkZXJPblJlc2l6ZSh0LGUscyl7dmFyIHI9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksaTtyJiYoci5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIikmJih3aW5kb3cuaW5uZXJXaWR0aD45NjA/InRydWUiPT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtZmVlZHMtcG9zdHMtbG9hZGVkIik/KHRfc2xkc19faW5pdEZlZWRzU2xpZGVyKHQsZSxzKSx0X3NsZHNfaW5pdFNsaWRlckNvbnRyb2xzKHQscykpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZlZWRzTG9hZFBvc3RzIiwoZnVuY3Rpb24oKXt0X3NsZHNfX2luaXRGZWVkc1NsaWRlcih0LGUscyksdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LHMpfSkpOnIuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVYKDApIikpfWZ1bmN0aW9uIHRfc2xkc19zZXRJdGVtc0luUm93KHQsZSl7dmFyIHM9dF9zbGRzX19nZXRSZWModCk7aWYocyl7dmFyIHI9cy5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksaSxhO2lmKHIpKHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCkmJih3aW5kb3cuaW5uZXJXaWR0aDw9OTYwJiYoYT0yKSx3aW5kb3cuaW5uZXJXaWR0aDw9NjQwJiYoYT0xKSx3aW5kb3cuaW5uZXJXaWR0aD45NjAmJihhPWUpKSxhJiZyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IixhKX19ZnVuY3Rpb24gdF9zbGRzX2luaXRTbGlkZXJDb250cm9scyh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciByPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKHIpe3ZhciBpPXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCxhPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKSxsPXMucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIiksZD1pPjAmJmEmJmw/YS5vZmZzZXRXaWR0aDpsLm9mZnNldFdpZHRoLG87aWYoInRydWUiIT09ci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSl7ci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoLSIrZCsicHgpIjt2YXIgbj1zLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X3dyYXBwZXIiKTtuLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbihpKXtpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoZnVuY3Rpb24oKXt2YXIgaT10X3NsZHNfZ2V0Q3VycmVudFRyYW5zbGF0ZShzKSxhPXIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hbmltYXRlZCIpLGw9cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIikpLGQ9cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSksbz1yLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpLG49IiIsYzsiIj09YSYmKHIuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1hbmltYXRlZCIsInllcyIpLCJsZWZ0Ij09PXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWRpcmVjdGlvbiIpPyJmYWxzZSI9PW8mJjE9PWw/bD0xOmwtLToiZmFsc2UiPT1vJiZsPT1kP2w9ZDpsKyssci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsbCksbCE9ZCsxJiYwIT1sfHwobj0ieWVzIiksci5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIixuKSx0X3NsaWRlTW92ZVdpdGhvdXRBbmltYXRpb24odCwhMSxlLGkpKTt0X3NsZHNfdXBkYXRlU2xpZGVyKHQpfSkpfSkpO3ZhciBjPXMucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYnVsbGV0Iik7Yy5sZW5ndGgmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYywoZnVuY3Rpb24oaSl7aS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKGZ1bmN0aW9uKCl7dmFyIGE9cGFyc2VJbnQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtYnVsbGV0LWZvciIpLDEwKSxsO2lmKHBhcnNlSW50KHIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKSwxMCkhPT1hKXt2YXIgZD10X3NsZHNfZ2V0Q3VycmVudFRyYW5zbGF0ZShzKTtyLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixhKSx0X3NsaWRlTW92ZVdpdGhvdXRBbmltYXRpb24odCwhMSxlLGQpLHRfc2xkc191cGRhdGVTbGlkZXIodCl9fSkpfSkpfX19fWZ1bmN0aW9uIHRfc2xkc19hbmltYXRlKHQsZSxzKXt2YXIgcj1wZXJmb3JtYW5jZS5ub3coKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uIGkoYSl7dmFyIGw9KGEtcikvcztsPjEmJihsPTEpO3ZhciBkPXQobCk7ZShkKSxsPDE/cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGkpOiJ5IiE9PXdpbmRvdy5sYXp5JiYieWVzIiE9PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhbGxyZWNvcmRzIikuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWxhenkiKXx8dF9zbGRzX29uSGFtbWVyTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KSl9KSl9ZnVuY3Rpb24gdF9zbGlkZV9Nb3ZlQW5pbWF0aW9uKHQsZSxzLHIpe2lmKHQpe3Quc3R5bGUudHJhbnNpdGlvbj0iaGVpZ2h0IGVhc2UtaW4tb3V0IC41cywgdHJhbnNmb3JtIGVhc2UtaW4tb3V0IDBzIjt2YXIgaT0tTWF0aC5hYnMoZSpzKSxhPS1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHQpLnRyYW5zZm9ybS5tYXRjaCgvXGQrLylbMF0pLGw9YS1pOzAhPT1sJiZ0X3NsZHNfYW5pbWF0ZSgoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSwoZnVuY3Rpb24oZSl7dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoIisoYS1sKmUpKyJweCkifSkscil9fWZ1bmN0aW9uIHRfc2xpZGVNb3ZlV2l0aG91dEFuaW1hdGlvbih0LGUscyl7dmFyIHI9dF9zbGRzX19nZXRSZWModCk7aWYocil7dmFyIGk9ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIik7aWYoaSl7dmFyIGE9cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIikpLGwsZD0oaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpfHwwKT4wP3IucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKS5vZmZzZXRXaWR0aDpyLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLm9mZnNldFdpZHRoLG89cGFyc2VGbG9hdChpLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSksbj1pLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLW5vbmUiKTthPm8rMSYmKGE9MSk7dmFyIGM9ci5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2VsZW0iKSxfPXRfc2xkc19nZXRFdmVudHNGb3JaZXJvQmxvY2soKSx1PV8ubW92ZVNsaWRlU3RhcnRFdmVudCxwPV8ubW92ZVNsaWRlRW5kRXZlbnQ7aWYoYyYmci5kaXNwYXRjaEV2ZW50KHUpLG4pe3ZhciBmPXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKSxtPXIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbSIpO2lmKGYmJjA9PT1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW1fZHVtbXkiKS5sZW5ndGgpe3ZhciB5PWYuY2xvbmVOb2RlKCEwKSx2O3kuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtX2R1bW15IikseS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHkuc3R5bGUubGVmdD1kKmErInB4IixpLmFwcGVuZENoaWxkKHkpLCh2PXIuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1wcm9kdWN0Iik/cjpyLnF1ZXJ5U2VsZWN0b3IoIi50LWNhdGFsb2csIC50LXN0b3JlIil8fHIucXVlcnlTZWxlY3RvcigiLmpzLXByb2R1Y3QiKSk/KHRfc2xkc19mYWRlT3V0KHksMTUwLChmdW5jdGlvbigpe251bGwhPT15LnBhcmVudE5vZGUmJnkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh5KX0pKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG0sKGZ1bmN0aW9uKHQpe3Rfc2xkc19mYWRlSW4odCwxNTApfSkpKTooQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtLChmdW5jdGlvbih0KXt0LnN0eWxlLm9wYWNpdHk9MH0pKSx0X3NsZHNfZmFkZU91dCh5LDQwMCwoZnVuY3Rpb24oKXtudWxsIT09eS5wYXJlbnROb2RlJiZ5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeSl9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG0sKGZ1bmN0aW9uKHQpe3Rfc2xkc19mYWRlSW4odCl9KSksYyYmci5kaXNwYXRjaEV2ZW50KHApfSksNTApKX1pLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1jYW5jZWwiKX10X3NsaWRlTW92ZSh0LGUscyksbiYmaS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtY2FuY2VsIiksYyYmci5kaXNwYXRjaEV2ZW50KHApfX19ZnVuY3Rpb24gdF9zbGlkZU1vdmVJbnN0YW50bHkodCxlLHMpe3ZhciByPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHIpe3ZhciBpPXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKGkpe3ZhciBhPXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIpKSxsLGQ9KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1pdGVtcy1pbi1yb3ciKXx8MCk+MD9yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciAudC1zbGRzX19pdGVtIikub2Zmc2V0V2lkdGg6ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKS5vZmZzZXRXaWR0aCxvPXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIikpLG49aS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1ub25lIik7aWYoYT5vKzEmJihhPTEpLG4pe3ZhciBjPXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKTtpZihjJiYwPT09ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtX2R1bW15IikubGVuZ3RoKXt2YXIgXz1jLmNsb25lTm9kZSghMCk7Xy5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW1fZHVtbXkiKSxfLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsXy5zdHlsZS5sZWZ0PWQqYSsicHgiLGkuYXBwZW5kQ2hpbGQoXyksdF9zbGRzX2ZhZGVPdXQoXyw0MDAsKGZ1bmN0aW9uKCl7bnVsbCE9PV8ucGFyZW50Tm9kZSYmXy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKF8pfSkpfWkuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkIiksaS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtY2FuY2VsIil9ZWxzZSBpLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZCIpLGkuY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLWNhbmNlbCIpO3Rfc2xpZGVNb3ZlKHQsZSxzKSxpLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZCIpLGkuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLWNhbmNlbCIpfX19ZnVuY3Rpb24gdF9zbGlkZU1vdmUodCxlLHMpe3ZhciByPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHIpe3ZhciBpPXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKGkpe3ZhciBhPXIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKSxsPWkuY2xhc3NMaXN0LmNvbnRhaW5zKCJqcy1mZWVkLWNvbnRhaW5lciIpLGQ9cGFyc2VJbnQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWl0ZW1zLWluLXJvdyIpfHwwKSxvPXBhcnNlSW50KGkuZ2V0QXR0cmlidXRlKCJkYXRhLWZlZWQtc2hvdy1jb3VudCIpfHwwKSxuPWQ+MD9yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciAudC1zbGRzX19pdGVtIikub2Zmc2V0V2lkdGg6ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKS5vZmZzZXRXaWR0aCxjPXBhcnNlRmxvYXQoaS5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRyYW5zaXRpb24iKSksXz1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiKSksdT1wYXJzZUZsb2F0KGkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10b3RhbHNsaWRlcyIpKSxwPWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIpLGY9aS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19hbmltYXRlZC1ub25lIiksbT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdGltZW91dCIpPjAseT1yLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93X3dyYXBwZXItcmlnaHQiKSx2PXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3dfd3JhcHBlci1sZWZ0IiksZzsib2ZmIj09PWkuZ2V0QXR0cmlidXRlKCJhcmlhLWxpdmUiKSYmaS5zZXRBdHRyaWJ1dGUoImFyaWEtbGl2ZSIsInBvbGl0ZSIpO3ZhciBoPTA7aWYoL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSl7dmFyIGI9bmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL1ZlcnNpb25cLyhcZCspXC4oXGQrKVwuPyhcZCspPyBTYWZhcmkvKTtudWxsIT09YiYmKGg9cGFyc2VJbnQoYlsxXSwxMCkpfXZhciBBPSEhbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiQ3JpT1MiKSxTO2lmKGN8fDA9PT1jfHwoYz0zMDApLF8+dSsxJiYoXz0xLGkuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLDEpKSwidHJ1ZSIhPT1pLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcCIpKXtpZih5KWlmKGwpe3ZhciB3PWFbYS5sZW5ndGgtMV0sRT1wYXJzZUludCh3LmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZS1pbmRleCIpLDEwKTtpZihkPHUmJnRfc2xkc19mYWRlSW4oeSwzMDApLEU8dSYmZD4wJiYoXz09RS1vKzF8fEU9PT1vKSl7dmFyIHE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7cS5pbml0RXZlbnQoImZlZWRzTGFzdFNsaWRlIiwhMCwhMCksaS5kaXNwYXRjaEV2ZW50KHEpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZlZWRzTG9hZFNsaWRlIiwoZnVuY3Rpb24oKXt0X3NsZHNfdXBkYXRlU2xpZGVyKHQpLCJmdW5jdGlvbiI9PXR5cGVvZiB0X2FuaW1hdGVfX3N0YXJ0QW5pbWF0aW9uJiZ0X2FuaW1hdGVfX3N0YXJ0QW5pbWF0aW9uKCl9KSksdF9zbGRzX2ZhZGVJbih5LDMwMCl9ZWxzZSBFPT09dSYmXz09PXUtZCsxJiZ0X3NsZHNfZmFkZU91dCh5LDMwMCl9ZWxzZSJmYWxzZSI9PWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJihfPT11fHxkPjEmJl89PXUtZCsxKT90X3NsZHNfZmFkZU91dCh5LDMwMCk6dF9zbGRzX2ZhZGVJbih5LDMwMCk7diYmKCJmYWxzZSI9PWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJjE9PV8/dF9zbGRzX2ZhZGVPdXQodiwzMDApOnRfc2xkc19mYWRlSW4odiwzMDApKSxpLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZCIpLGg+PTEzJiZBJiYhZj90X3NsaWRlX01vdmVBbmltYXRpb24oaSxfLG4sYyk6aS5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoLSIrbipfKyJweCkiLHRfdHJpZ2dlckV2ZW50KGksInNsaWRlQ2hhbmdlU3RhcnQiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2kuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkIiksaS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWFuaW1hdGVkIiwiIiksInllcyI9PShwPWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIpKSYmKF89PXUrMSYmKF89MSksMD09XyYmKF89dSksaD49MTMmJkEmJiFmP3Rfc2xpZGVfTW92ZUFuaW1hdGlvbihpLF8sbiwwKTppLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgtIituKl8rInB4KSIsITAhPT1mJiZ0X3NsZHNfQWN0aXZlU2xpZGUodCxfLHUscyksaS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsXykpLCgieSI9PT13aW5kb3cubGF6eXx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2FsbHJlY29yZHMiKSYmInllcyI9PT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYWxscmVjb3JkcyIpLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5IikpJiZ0X3NsZHNfb25IYW1tZXJMb2FkKCJ0X2xhenlsb2FkX3VwZGF0ZSIsKGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pKSwhZSYmbSYmdF9zbGRzX2luaXRBdXRvUGxheSh0LF8sdSxzKX0pLGMpLHRfc2xkc19BY3RpdmVCdWxsZXQodCxfLHUscyksdF9zbGRzX0FjdGl2ZVNsaWRlKHQsXyx1KSwidHJ1ZSI9PWkuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodCIpJiZ0X3NsZHNfU2xpZGVySGVpZ2h0KHQpLHRfc2xkc19TbGlkZXJBcnJvd3NIZWlnaHQodCksdF9zbGRzX0FjdGl2ZUNhcHRpb24odCxfLHUpLHIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbS1sb2FkZWQiKS5sZW5ndGg8dSsyJiZ0X3NsZHNfVXBkYXRlSW1hZ2VzKHQsXyksdF90cmlnZ2VyRXZlbnQoaSwic2xpZGVDaGFuZ2VFbmQiKX19fX1mdW5jdGlvbiB0X3NsZHNfdXBkYXRlU2xpZGVyKHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3Rfc2xkc19TbGlkZXJXaWR0aCh0KTt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihzKXt2YXIgcj1wYXJzZUludChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93IiksMTApfHwxLGk9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIgLnQtc2xkc19faXRlbSIpLGE9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKSxsPXI+MCYmYSYmaT9pLm9mZnNldFdpZHRoOmEub2Zmc2V0V2lkdGgsZD1wYXJzZUludChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIiksMTApLG89cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdGFsc2xpZGVzIiksMTApLG49cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSxjPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3dfd3JhcHBlci1yaWdodCIpO2lmKGQ+bysxJiYoZD0xLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLDEpKSxjJiYiZmFsc2UiPT09bil7dmFyIF8sdT1vLXI8PTB8fGQrci0xPT09bztjLnN0eWxlLmRpc3BsYXk9dT8ibm9uZSI6IiJ9cy5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVgoLSIrbCpkKyJweCkiLCJ0cnVlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0IikmJnRfc2xkc19VcGRhdGVTbGlkZXJIZWlnaHQodCksdF9zbGRzX1VwZGF0ZVNsaWRlckFycm93c0hlaWdodCh0KSwieSI9PT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIpJiZzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIsIiIpfX19ZnVuY3Rpb24gdF9zbGRzX1VwZGF0ZUltYWdlcyh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciByPXMucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSInK2UrJyJdJyk7ciYmKHIuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtLWxvYWRlZCIpLHIubmV4dEVsZW1lbnRTaWJsaW5nJiZyLm5leHRFbGVtZW50U2libGluZy5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW0tbG9hZGVkIiksci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nJiZyLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuY2xhc3NMaXN0LmFkZCgidC1zbGRzX19pdGVtLWxvYWRlZCIpKX19ZnVuY3Rpb24gdF9zbGRzX0FjdGl2ZUNhcHRpb24odCxlLHMpe3ZhciByPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHIpe3ZhciBpPXIucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fY2FwdGlvbiIpLGE9ci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19jYXB0aW9uW2RhdGEtc2xpZGUtY2FwdGlvbj0iJytlKyciXScpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX2NhcHRpb24tYWN0aXZlIil9KSksMD09ZT9hPXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19fY2FwdGlvbltkYXRhLXNsaWRlLWNhcHRpb249IicrcysnIl0nKTplPT1zKzEmJihhPXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19fY2FwdGlvbltkYXRhLXNsaWRlLWNhcHRpb249IjEiXScpKSxhJiZhLmNsYXNzTGlzdC5hZGQoInQtc2xkc19fY2FwdGlvbi1hY3RpdmUiKX19ZnVuY3Rpb24gdF9zbGRzX3Njcm9sbEltYWdlcyh0LGUpe3ZhciBzPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHMpe3ZhciByPShlPDA/IiI6Ii0iKStNYXRoLmFicyhlKS50b1N0cmluZygpO3MucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlWCgiK3IrInB4KSJ9fWZ1bmN0aW9uIHRfc2xkc19BY3RpdmVCdWxsZXQodCxlLHMscil7dmFyIGk7aWYociYmci50aHVtYnNidWxsZXRHYWxsZXJ5KXt2YXIgYT1wYXJzZUludChyLnN0b3JlT3B0aW9ucy5wb3B1cF9vcHRzLmNvbHVtbnMpLGw9K3Iuc3RvcmVPcHRpb25zLnNsaWRlcl9zbGlkZXNPcHRzLnJhdGlvOyJ0X3N0b3JlX3Byb2RQb3B1cF9nYWxsZXJ5X2NhbGNNYXhUaHVtYnNDb3VudCJpbiB3aW5kb3c/aT10X3N0b3JlX3Byb2RQb3B1cF9nYWxsZXJ5X2NhbGNNYXhUaHVtYnNDb3VudChhLGwsNjAsMTApOiJ0X2NhdGFsb2dfcHJvZFBvcHVwX2dhbGxlcnlfY2FsY01heFRodW1ic0NvdW50ImluIHdpbmRvdyYmKGk9dF9jYXRhbG9nX3Byb2RQb3B1cF9nYWxsZXJ5X2NhbGNNYXhUaHVtYnNDb3VudChhLGwsNjAsMTApKX12YXIgZD10X3NsZHNfX2dldFJlYyh0KTtpZihkKXt2YXIgbz1kLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2J1bGxldCIpLG49ZC5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19idWxsZXRbZGF0YS1zbGlkZS1idWxsZXQtZm9yPSInK2UrJyJdJyk7aWYoQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLChmdW5jdGlvbih0KXt0LmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19fYnVsbGV0X2FjdGl2ZSIpO3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYnVsbGV0X2JvZHkiKTtlJiZlLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1jdXJyZW50Iil9KSksciYmci50aHVtYnNidWxsZXRHYWxsZXJ5JiZlPj1pJiZlIT1zKzF8fHM+PWkmJjA9PWU/bj1kLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2J1bGxldFtkYXRhLXNsaWRlLWJ1bGxldC1mb3I9IicraSsnIl0nKTowPT1lP249ZC5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19idWxsZXRbZGF0YS1zbGlkZS1idWxsZXQtZm9yPSInK3MrJyJdJyk6ZT09cysxJiYobj1kLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2J1bGxldFtkYXRhLXNsaWRlLWJ1bGxldC1mb3I9IjEiXScpKSxuKXtuLmNsYXNzTGlzdC5hZGQoInQtc2xkc19fYnVsbGV0X2FjdGl2ZSIpO3ZhciBjPW4ucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYnVsbGV0X2JvZHkiKTtjJiZjLnNldEF0dHJpYnV0ZSgiYXJpYS1jdXJyZW50IiwhMCl9fX1mdW5jdGlvbiB0X3NsZHNfQWN0aXZlU2xpZGUodCxlLHMpe3ZhciByPXRfc2xkc19fZ2V0UmVjKHQpO2lmKHIpe3ZhciBpPXIucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLGE9ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pdGVtIiksbD1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iJytlKyciXScpLGQ9ISFpJiZpLmNsYXNzTGlzdC5jb250YWlucygidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSxvPXIucXVlcnlTZWxlY3RvckFsbCgiLnQtdmlkZW8tbGF6eWxvYWQiKTtpZihvLmxlbmd0aCl0X29uRnVuY0xvYWQoInRfdmlkZW9fX2dldFBsYXllciIsKGZ1bmN0aW9uKCl7by5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZTtpZigiZmFsc2UiIT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtdmlkZW9sYXp5LWxvYWQiKSl7dmFyIHM9dC5jbG9zZXN0KCIudC1zbGRzX19pdGVtOm5vdCgudC1zbGRzX19pdGVtX2R1bW15KSIpO2lmKHMpe3ZhciByPXRfdmlkZW9fX2dldFBsYXllcihzKTtyP3IucGF1c2UoKTp0X3NsZHNfX3Byb2NjZXNzVmlkZW8ocykudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQucGF1c2UoKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSl9fX0pKX0pKTtlbHNle3ZhciBuPXIucXVlcnlTZWxlY3RvckFsbCgiaWZyYW1lIiksYz1yLnF1ZXJ5U2VsZWN0b3JBbGwoInZpZGVvIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnNyYyYmKC0xIT09dC5zcmMuaW5kZXhPZigiJmVuYWJsZWpzYXBpPTEiKSYmdC5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7ImV2ZW50IjoiY29tbWFuZCIsImZ1bmMiOiJwYXVzZVZpZGVvIiwiYXJncyI6IiJ9JywiKiIpLC0xPT09dC5zcmMuaW5kZXhPZigidmltZW8iKXx8LTE9PT10LnNyYy5pbmRleE9mKCImYW1wO2FwaT0xIikmJi0xPT09dC5zcmMuaW5kZXhPZigiJmFwaT0xIil8fHQuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgneyJtZXRob2QiOiJwYXVzZSIsInZhbHVlIjoidHJ1ZSJ9JywiKiIpKX0pKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsKGZ1bmN0aW9uKHQpe3QucGF1c2UoKX0pKX1pZihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX19pdGVtX2FjdGl2ZSIpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKX0pKSwwPT1lJiYhMT09PWQpci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IicrcysnIl0nKS5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2l0ZW1fYWN0aXZlIiksci5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwiZmFsc2UiKTtlbHNlIGlmKDA9PWUmJiEwPT09ZClsPXIucXVlcnlTZWxlY3RvcignLnQtc2xkc19faXRlbVtkYXRhLXNsaWRlLWluZGV4PSInK3MrJyJdJyk7ZWxzZSBpZihlPT1zKzEmJiExPT09ZCl7dmFyIF89ci5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtW2RhdGEtc2xpZGUtaW5kZXg9IjEiXScpO18mJihfLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbV9hY3RpdmUiKSxfLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJmYWxzZSIpKX1lbHNlIGU9PXMrMSYmITA9PT1kJiYobD1yLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1bZGF0YS1zbGlkZS1pbmRleD0iMSJdJykpO2wmJihsLmNsYXNzTGlzdC5hZGQoInQtc2xkc19faXRlbV9hY3RpdmUiKSxsLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJmYWxzZSIpKSx3aW5kb3cudF9zbGRzX19pc2lPUyYmdF9zbGRzX19oaWRlTW9iaWxlU2xpZGVzKGwpLHRfc2xkc19fc2V0VGFiaW5kZXhGb3JGb2N1c2FibGVFbGVtZW50cyh0KX19ZnVuY3Rpb24gdF9zbGRzX19zZXRUYWJpbmRleEZvckZvY3VzYWJsZUVsZW1lbnRzKHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpLHI9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtX2FjdGl2ZSIpO2lmKHIpe3ZhciBpPSdhLCBidXR0b24sIGlucHV0Om5vdChbdHlwZT0iaGlkZGVuIl0pLCBzZWxlY3QsIHRleHRhcmVhLCB2aWRlbywgaWZyYW1lJyxhPXMucXVlcnlTZWxlY3RvckFsbChpKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIil9KSk7dmFyIGw9ci5xdWVyeVNlbGVjdG9yQWxsKGkpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobCwoZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiMCIpfSkpfX19ZnVuY3Rpb24gdF9zbGRzX1NsaWRlcldpZHRoKHQpe3ZhciBlPXRfc2xkc19fZ2V0UmVjKHQpO2lmKGUpe3ZhciBzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIik7aWYocyl7dmFyIHI9Z2V0Q29tcHV0ZWRTdHlsZShzKSxpPXBhcnNlSW50KHIucGFkZGluZ0xlZnQpfHwwLGE9cGFyc2VJbnQoci5wYWRkaW5nUmlnaHQpfHwwLGw9cy5jbGllbnRXaWR0aC0oaSthKSxkPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKS5sZW5ndGgsbz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxuO2lmKCJ0cnVlIiE9by5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3AiKSl7dmFyIGM9MDtvJiYoYz1vLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iiksby5zdHlsZS53aWR0aD1sKmQrInB4Iiksd2luZG93LmlubmVyV2lkdGg8PTY0MD9jPTE6d2luZG93LmlubmVyV2lkdGg8PTk2MCYmYz4xJiYoYz0yKTt2YXIgXz1jPjE/bC9jOmw7aWYoXz4wKXt2YXIgdT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0iKTtvJiYodT1vLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0iKSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh1LChmdW5jdGlvbih0KXt0LnN0eWxlLndpZHRoPV8rInB4In0pKX19fX19ZnVuY3Rpb24gdF9zbGRzX1NsaWRlckhlaWdodCh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoJy50LXNsZHNfX2l0ZW1zLXdyYXBwZXI6bm90KFtkYXRhLXNsaWRlci1jb3JyZWN0LWhlaWdodD0iZmFsc2UiXSknKTtpZihzKXt2YXIgcj1zLmNsYXNzTGlzdC5jb250YWlucygianMtZmVlZC1jb250YWluZXIiKSxpPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbV9hY3RpdmUiKSxhO2lmKGkpe3ZhciBsPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoaSkucGFkZGluZ1RvcCl8fDAsZD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGkpLnBhZGRpbmdCb3R0b20pfHwwO2E9aS5jbGllbnRIZWlnaHQtKGwrZCl9YSYmcyYmKHMuc3R5bGUuaGVpZ2h0PXI/IiI6YSsicHgiKX19fWZ1bmN0aW9uIHRfc2xkc19VcGRhdGVTbGlkZXJIZWlnaHQodCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCcudC1zbGRzX19pdGVtcy13cmFwcGVyOm5vdChbZGF0YS1zbGlkZXItY29ycmVjdC1oZWlnaHQ9ImZhbHNlIl0pJyk7aWYocyl7dmFyIHI9cy5jbGFzc0xpc3QuY29udGFpbnMoImpzLWZlZWQtY29udGFpbmVyIiksaT1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIiksYTtpZihpKXt2YXIgbD1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGkpLnBhZGRpbmdUb3ApfHwwLGQ9cGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShpKS5wYWRkaW5nQm90dG9tKXx8MDthPWkuY2xpZW50SGVpZ2h0LShsK2QpfTAhPT1hJiZzJiYocy5zdHlsZS5oZWlnaHQ9cj8iIjphKyJweCIpfX19ZnVuY3Rpb24gdF9zbGRzX1NsaWRlckFycm93c0hlaWdodCh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIikscj0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksaSxhPTA7aWYocyl7dmFyIGw7cy5xdWVyeVNlbGVjdG9yKCJbZGF0YS1zbGlkZXItdmlkZW8tdHlwZV0iKSYmciYmKGE9NDApO3ZhciBkPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUocykucGFkZGluZ1RvcCl8fDAsbz1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHMpLnBhZGRpbmdCb3R0b20pfHwwO2k9cy5jbGllbnRIZWlnaHQtKGQrbyktYX12YXIgbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X3dyYXBwZXIiKTtpJiZuLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnN0eWxlLmhlaWdodD1pKyJweCI7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdyIpO2UmJihlLnN0eWxlLm1hcmdpblRvcD1hLzIrInB4Iil9KSksdF9zbGRzX2ZpeEFycm93c0luQ2F0YWxvZyhlLHMsbixyKX19ZnVuY3Rpb24gdF9zbGRzX1VwZGF0ZVNsaWRlckFycm93c0hlaWdodCh0KXt2YXIgZT10X3NsZHNfX2dldFJlYyh0KTtpZihlKXt2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1fYWN0aXZlIikscj0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksaSxhPTA7aWYocyl7dmFyIGw7cy5xdWVyeVNlbGVjdG9yKCJbZGF0YS1zbGlkZXItdmlkZW8tdHlwZV0iKSYmciYmKGE9NDApO3ZhciBkPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUocykucGFkZGluZ1RvcCl8fDAsbz1wYXJzZUludChnZXRDb21wdXRlZFN0eWxlKHMpLnBhZGRpbmdCb3R0b20pfHwwO2k9cy5jbGllbnRIZWlnaHQtKGQrbyktYX12YXIgbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2Fycm93X3dyYXBwZXIiKTtpJiZuLmxlbmd0aCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChuLChmdW5jdGlvbih0KXt0LnN0eWxlLmhlaWdodD1pKyJweCI7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdyIpO2UmJihlLnN0eWxlLm1hcmdpblRvcD1hLzIrInB4Iil9KSksdF9zbGRzX2ZpeEFycm93c0luQ2F0YWxvZyhlLHMsbixyKX19ZnVuY3Rpb24gdF9zbGRzX2ZpeEFycm93c0luQ2F0YWxvZyh0LGUscyxyKXtpZihlJiZyJiYodC5jbGFzc0xpc3QuY29udGFpbnMoInQtY2F0YWxvZ19fcmVsZXZhbnRzLWdyaWQtY29udCIpfHx0LmNsYXNzTGlzdC5jb250YWlucygidC1zdG9yZV9fcmVsZXZhbnRzLWdyaWQtY29udCIpKSl7dmFyIGk9ZS5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdC1pbWciKTtpZihpKXt2YXIgYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpKSxsPShwYXJzZUZsb2F0KGEubWFyZ2luVG9wKXx8MCkrKHBhcnNlRmxvYXQoYS5tYXJnaW5Cb3R0b20pfHwwKSxkPU1hdGguY2VpbChpLm9mZnNldEhlaWdodCtsKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHMsKGZ1bmN0aW9uKHQpe3ZhciBlPXQub2Zmc2V0SGVpZ2h0LHM9KGQtZSkvMjt0LnN0eWxlLnRvcD1zKyJweCIsdC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVkoMCkifSkpfX19ZnVuY3Rpb24gdF9zbGRzX2luaXRBdXRvUGxheSh0LGUscyxyKXt2YXIgaT0ib2JqZWN0Ij09dHlwZW9mIHQsYT1pP3RbMF06ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3JlYyIrdCk7aWYoYSl7dmFyIGw9YS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzIiksZD1hLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihkKXt2YXIgbz1wYXJzZUZsb2F0KGQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10aW1lb3V0IikpLG49IiIsYz1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaW50ZXJ2YWwtaWQiKSxfPWUsdTtpZihjJiZjbGVhckludGVydmFsKGMpLCJ0cnVlIiE9PWQuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpe3ZhciBwOyEvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJmwmJihsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsKGZ1bmN0aW9uKCl7ZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXN0b3BwZWQiLCJ5ZXMiKX0pKSxsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwoZnVuY3Rpb24oKXsieSIhPT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIpJiZkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIsIiIpfSkpKTt2YXIgZj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQsbT1mK2Eub2Zmc2V0SGVpZ2h0LHksdjt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKChmdW5jdGlvbigpe2Y9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LG09ZithLm9mZnNldEhlaWdodH0pKSksdm9pZCAwIT09ZG9jdW1lbnQuaGlkZGVuPyh5PSJoaWRkZW4iLHY9InZpc2liaWxpdHljaGFuZ2UiKTp2b2lkIDAhPT1kb2N1bWVudC5tc0hpZGRlbj8oeT0ibXNIaWRkZW4iLHY9Im1zdmlzaWJpbGl0eWNoYW5nZSIpOnZvaWQgMCE9PWRvY3VtZW50LndlYmtpdEhpZGRlbiYmKHk9IndlYmtpdEhpZGRlbiIsdj0id2Via2l0dmlzaWJpbGl0eWNoYW5nZSIpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIodiwoZnVuY3Rpb24oKXtpZihkb2N1bWVudFt5XSlkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIsInllcyIpO2Vsc2V7dmFyIHQ9Z2V0Q29tcHV0ZWRTdHlsZShhKS5kaXNwbGF5LGU9d2luZG93LnBhZ2VZT2Zmc2V0LHM9ZSt3aW5kb3cuaW5uZXJIZWlnaHQ7Zj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQsKG09ZithLm9mZnNldEhlaWdodCk+ZSYmZjxzJiYibm9uZSIhPT10JiYieSIhPT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIpJiZkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIsIiIpfX0pLCExKSwxPT09YS5sZW5ndGgmJndpbmRvdy5iaW5kKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dmFyIHQ9Z2V0Q29tcHV0ZWRTdHlsZShhKS5kaXNwbGF5LGU9d2luZG93LnBhZ2VZT2Zmc2V0LHM9ZSt3aW5kb3cuaW5uZXJIZWlnaHQ7Im5vbmUiIT09dD8oZj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCt3aW5kb3cucGFnZVlPZmZzZXQsKG09ZithLm9mZnNldEhlaWdodCk+ZSYmZjxzJiYieSIhPT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZC1ieS12aWRlbyIpP2Quc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkIiwiIik6IiI9PT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIpJiZkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIsInllcyIpKTppfHxkLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIsInllcyIpfSkpKTt2YXIgZz1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXt2YXIgZT1kLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItc3RvcHBlZCIpLGk9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWF1dG9wbGF5LWlnbm9yZS1ob3ZlciIpLGw9ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdWNoIiksbz10X3NsZHNfZ2V0Q3VycmVudFRyYW5zbGF0ZShhKTsieWVzIiE9ZSYmInllcyIhPWkmJiJ5ZXMiIT1sJiYoImZhbHNlIj09ZC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmXz09cz9fPXM6XysrLGQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLF8pLF8hPXMrMSYmMCE9X3x8KG49InllcyIpLHRfc2xpZGVNb3ZlV2l0aG91dEFuaW1hdGlvbih0LCEwLHIsbyksdF9zbGRzX3VwZGF0ZVNsaWRlcih0KSwieWVzIj09biYmKF89PXMrMSYmKF89MSksMD09XyYmKF89cyksZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsXykpLGQuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsbikpfSksbyk7ZC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWludGVydmFsLWlkIixnKX19fX1mdW5jdGlvbiB0X3NsZHNfcG9zaXRpb25BcnJvd3ModCl7dmFyIGU9dF9zbGRzX19nZXRSZWModCk7aWYoZSl7dmFyIHM9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvd19jb250YWluZXItb3V0c2lkZSIpLHI9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtIik7aWYocil7dmFyIGk9ci5vZmZzZXRXaWR0aCxhPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctbGVmdCIpP2UucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctbGVmdCIpLm9mZnNldFdpZHRoOjAsbD1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2Fycm93LXJpZ2h0Iik/ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1yaWdodCIpLm9mZnNldFdpZHRoOjA7cyYmKHMuc3R5bGUubWF4V2lkdGg9YStsK2krMTIwKyJweCIpfX19ZnVuY3Rpb24gdF9zbGRzX2luaXRTbGlkZXJTd2lwZSh0LGUscyxyKXt2YXIgaT10X3NsZHNfX2dldFJlYyh0KTtpZihpKXt2YXIgYT1pLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX21haW4iKTtpZihhKXt2YXIgbD1pLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKTtpZihsKXt2YXIgZCxvPSExLG49ITEsYyxfO2lmKCJ0cnVlIiE9PWwuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpaWYoInRydWUiIT09bC5nZXRBdHRyaWJ1dGUoImRhdGEtc3dpcGVyLWluaXRpYWxpemVkIikpe2RlbGV0ZSBIYW1tZXIuZGVmYXVsdHMuY3NzUHJvcHMudXNlclNlbGVjdCx3aW5kb3cuaGFtbWVyPW5ldyBIYW1tZXIoYSx7ZG9tRXZlbnRzOiEwLGlucHV0Q2xhc3M6SGFtbWVyLlRvdWNoSW5wdXQscmVjb2duaXplcnM6W1tIYW1tZXIuUGFuLHtkaXJlY3Rpb246SGFtbWVyLkRJUkVDVElPTl9IT1JJWk9OVEFMfV1dfSksbC5zZXRBdHRyaWJ1dGUoImRhdGEtc3dpcGVyLWluaXRpYWxpemVkIiwidHJ1ZSIpO3ZhciB1PWZ1bmN0aW9uIHQoZSl7d2luZG93LnBhZ2VZT2Zmc2V0PmkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tK3dpbmRvdy5wYWdlWU9mZnNldHx8d2luZG93LnBhZ2VZT2Zmc2V0K2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ8aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0P2wuc2V0QXR0cmlidXRlKGUsInllcyIpOiJ5IiE9PWwuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wcGVkLWJ5LXZpZGVvIikmJmwuc2V0QXR0cmlidXRlKGUsIiIpfSxwPSJvbnRvdWNoZW5kImluIGRvY3VtZW50PyJkYXRhLXNsaWRlci10b3VjaCI6ImRhdGEtc2xpZGVyLXN0b3BwZWQiLGY7aWYoIkludGVyc2VjdGlvbk9ic2VydmVyImluIHdpbmRvdyluZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKHQpe3ZhciBlPXRbMF07bC5zZXRBdHRyaWJ1dGUocCxlLmlzSW50ZXJzZWN0aW5nPyIiOiJ5ZXMiKX0pKS5vYnNlcnZlKGkpO2Vsc2UgdShwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwoZnVuY3Rpb24oKXtvPSEwLGNsZWFyVGltZW91dChkKSxkPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dShwKSxvPSExfSksMjUwKX0pKTtpZigxIT1lKXt2YXIgbT1mdW5jdGlvbiB0KGUpe3JldHVybiFufHwoZS5wcmV2ZW50RGVmYXVsdCgpLCExKX0seT1pLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fZWxlbSIpLHY9dF9zbGRzX2dldEV2ZW50c0Zvclplcm9CbG9jaygpLGc9di5tb3ZlU2xpZGVTdGFydEV2ZW50LGg9di5tb3ZlU2xpZGVFbmRFdmVudDt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixtLHtwYXNzaXZlOiExfSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsbSx7cGFzc2l2ZTohMX0pLHdpbmRvdy5oYW1tZXIub24oInBhbiIsKGZ1bmN0aW9uKGUpe2lmKG8pcmV0dXJuITE7bj0hMCx5JiZpLmRpc3BhdGNoRXZlbnQoZyk7dmFyIHM9aS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksYT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItaXRlbXMtaW4tcm93Iil8fDAsbD1hPjEsZD1sP2kucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fY29udGFpbmVyIC50LXNsZHNfX2l0ZW0iKS5vZmZzZXRXaWR0aDppLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2NvbnRhaW5lciIpLm9mZnNldFdpZHRoLGM9cGFyc2VGbG9hdChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIikpLF89cGFyc2VGbG9hdChzLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG90YWxzbGlkZXMiKSksdT0iIixwPWUuZGVsdGFYLGY9MTAwL18qZS5kZWx0YVgvd2luZG93LmlubmVyV2lkdGgsbT0zMCx2O2lmKCJ0cnVlIj09PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1zdG9wIikpcmV0dXJuITE7aWYocy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRvdWNoIiwieWVzIiksdF9zbGRzX3Njcm9sbEltYWdlcyh0LGQqYy1wKSxlLmlzRmluYWwpe2lmKGUudmVsb2NpdHlYPi40KSJmYWxzZSI9PXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIikmJjE9PWM/Yz0xOmMtLSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixjKSwwPT1jJiYodT0ieWVzIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLWN5Y2xlIix1KSx0X3NsaWRlTW92ZSh0LCExLHIpO2Vsc2UgaWYoZS52ZWxvY2l0eVg8LS40KXtpZigiZmFsc2UiPT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYoYz09X3x8bCYmYz09Xy1hKzEpKWM9bD9fLWE6XztlbHNle3ZhciBoPWkucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19faXRlbTpub3QoLnQtc2xkc19faXRlbV9kdW1teSkiKSxiPWhbaC5sZW5ndGgtMV0sQT1wYXJzZUZsb2F0KGIuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLWluZGV4IiksMTApO2lmKEE8XyYmYz09QSl7dmFyIFM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7Uy5pbml0RXZlbnQoImZlZWRzTGFzdFNsaWRlIiwhMCwhMCkscy5kaXNwYXRjaEV2ZW50KFMpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZlZWRzTG9hZFNsaWRlIiwoZnVuY3Rpb24oKXt0X3NsZHNfdXBkYXRlU2xpZGVyKHQpfSkpfWMrK31zLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItcG9zIixjKSxjPT1fKzEmJih1PSJ5ZXMiKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItY3ljbGUiLHUpLHRfc2xpZGVNb3ZlKHQsITEscil9ZWxzZSBmPD0tMzAvXz8oImZhbHNlIj09cy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiKSYmKGM9PV98fGwmJmM9PV8tYSsxKT9jPWw/Xy1hOl86YysrLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1wb3MiLGMpLGM9PV8rMSYmKHU9InllcyIpLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsdSksdF9zbGlkZU1vdmUodCwhMSxyKSk6Zj49bS9fPygiZmFsc2UiPT1zLmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItd2l0aC1jeWNsZSIpJiYxPT1jP2M9MTpjLS0scy5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXBvcyIsYyksMD09YyYmKHU9InllcyIpLHMuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci1jeWNsZSIsdSksdF9zbGlkZU1vdmUodCwhMSxyKSk6dF9zbGlkZU1vdmUodCwhMSxyKTtzLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdG91Y2giLCIiKSxuPSExfXJldHVybiEwfSkpLHdpbmRvdy5oYW1tZXIub24oInBhbmVuZCIsKGZ1bmN0aW9uKCl7eSYmaS5kaXNwYXRjaEV2ZW50KGgpLHRfc2xpZGVNb3ZlKHQsITEsciksbj0hMX0pKX19fX19fWZ1bmN0aW9uIHRfc2xkc19nZXRDdXJyZW50VHJhbnNsYXRlKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnQtc2xkc19faXRlbXMtd3JhcHBlciIpO2lmKGUpe3ZhciBzPWdldENvbXB1dGVkU3R5bGUoZSkudHJhbnNmb3JtO2lmKHZvaWQgMCE9PXMmJiIiIT09cyl7dmFyIHI9cy5tYXRjaCgvXGQrL2cpO2lmKG51bGwhPT1yKXJldHVybiBwYXJzZUludChyWzBdLDEwKX19fWZ1bmN0aW9uIHRfc2xkc19jaGFuZ2VJbWFnZVVybCh0KXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHM9ZSYmInllcyI9PT1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iikscj10X3NsZHNfX2dldFJlYyh0KSxpO3ImJihpPXM/ci5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19pbWc6bm90KFtkYXRhLW9yaWdpbmFsXSkiKTpyLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2ltZyIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtc3JjIik7ZSYmKHQuc2V0QXR0cmlidXRlKCJzcmMiLGUpLHQucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXNyYyIpKX0pKSl9ZnVuY3Rpb24gdF9zbGRzX29uSGFtbWVyTG9hZCh0LGUscyl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvd1t0XSllKCk7ZWxzZSB2YXIgcj1EYXRlLm5vdygpLGk9c2V0VGltZW91dCgoZnVuY3Rpb24gYSgpe3ZhciBsPURhdGUubm93KCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHdpbmRvd1t0XSl7aWYobC1yPjdlMyl0aHJvdyBuZXcgRXJyb3IodCsiIGlzIHVuZGVmaW5lZCIpO2k9c2V0VGltZW91dChhLHN8fDEwMCl9ZWxzZSBlKCl9KSl9ZnVuY3Rpb24gdF9zbGRzX2ZhZGVPdXQodCxlLHMpe2lmKCJub25lIiE9PXQuc3R5bGUuZGlzcGxheSYmIXQuZ2V0QXR0cmlidXRlKCJkYXRhLWZhZGVvdXQtdGltZW91dCIpKXt2YXIgcj0xLGk9cGFyc2VJbnQoZSksYSxsPXNldEludGVydmFsKChmdW5jdGlvbigpe3Quc3R5bGUub3BhY2l0eT1yLChyLT0uMSk8PS4xJiYoY2xlYXJJbnRlcnZhbChsKSx0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1mYWRlb3V0LXRpbWVvdXQiKSx0LnN0eWxlLmRpc3BsYXk9Im5vbmUiLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiZzKCkpfSksaT4wP2kvMTA6NDApO3Quc2V0QXR0cmlidXRlKCJkYXRhLWZhZGVvdXQtdGltZW91dCIsbCl9fWZ1bmN0aW9uIHRfc2xkc19mYWRlSW4odCxlLHMpe2lmKCgiMSIhPT1nZXRDb21wdXRlZFN0eWxlKHQpLm9wYWNpdHkmJiIiIT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5vcGFjaXR5fHwibm9uZSI9PT1nZXRDb21wdXRlZFN0eWxlKHQpLmRpc3BsYXkpJiYhdC5nZXRBdHRyaWJ1dGUoImRhdGEtZmFkZWluLXRpbWVvdXQiKSl7dmFyIHI9MCxpPXBhcnNlSW50KGUpLGE9aT4wP2kvMTA6NDA7dC5zdHlsZS5vcGFjaXR5PXIsdC5zdHlsZS5kaXNwbGF5PSJibG9jayI7dmFyIGw9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7dC5zdHlsZS5vcGFjaXR5PXIsKHIrPS4xKT49MSYmKGNsZWFySW50ZXJ2YWwobCksdC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtZmFkZWluLXRpbWVvdXQiKSwiZnVuY3Rpb24iPT10eXBlb2YgcyYmcygpKX0pLGEpO3Quc2V0QXR0cmlidXRlKCJkYXRhLWZhZGVpbi10aW1lb3V0IixsKX19ZnVuY3Rpb24gdF9zbGRzX3JhbmRvbVNvcnRFbGVtZW50cyh0KXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KTtpZighZS5sZW5ndGgpcmV0dXJuW107ZS5zb3J0KChmdW5jdGlvbigpe3JldHVybi41LU1hdGgucmFuZG9tKCl9KSk7dmFyIHM9dFswXS5wYXJlbnROb2RlO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3MuYXBwZW5kQ2hpbGQodCl9KSksZX1mdW5jdGlvbiB0X3NsZHNfX3Byb2NjZXNzVmlkZW8odCl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHMpe3Rfb25GdW5jTG9hZCgidF92aWRlb19fY3JlYXRlUGxheWVyIiwoZnVuY3Rpb24oKXt0X3ZpZGVvX19jcmVhdGVQbGF5ZXIodCkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIGUodCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3JldHVybiBzKHQpfSkpfSkpfSkpfWZ1bmN0aW9uIHRfc2xkc19nZXRFdmVudHNGb3JaZXJvQmxvY2soKXt2YXIgdCxlO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/KHQ9bmV3IEN1c3RvbUV2ZW50KCJ0aWxkYVNsZHNNb3ZlU2xpZGVTdGFydCIpLGU9bmV3IEN1c3RvbUV2ZW50KCJ0aWxkYVNsZHNNb3ZlU2xpZGVFbmQiKSk6KCh0PWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpKS5pbml0Q3VzdG9tRXZlbnQoInRpbGRhU2xkc01vdmVTbGlkZVN0YXJ0IiwhMCwhMCksKGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IikpLmluaXRDdXN0b21FdmVudCgidGlsZGFTbGRzTW92ZVNsaWRlRW5kIiwhMCwhMCkpLHttb3ZlU2xpZGVTdGFydEV2ZW50OnQsbW92ZVNsaWRlRW5kRXZlbnQ6ZX19ZnVuY3Rpb24gdF9zbGRzX19nZXRSZWModCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyZWMiK3QpOnQgaW5zdGFuY2VvZiBFbGVtZW50P3Q6dFswXX1mdW5jdGlvbiB0X3RyaWdnZXJFdmVudCh0LGUpe3ZhciBzO2RvY3VtZW50LmNyZWF0ZUV2ZW50PyhzPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIikpLmluaXRFdmVudChlLCEwLCExKTpkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCYmKChzPWRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCkpLmV2ZW50VHlwZT1lKSxzLmV2ZW50TmFtZT1lLHQuZGlzcGF0Y2hFdmVudD90LmRpc3BhdGNoRXZlbnQocyk6dC5maXJlRXZlbnQ/dC5maXJlRXZlbnQoIm9uIitzLmV2ZW50VHlwZSxzKTp0W2VdP3RbZV0oKTp0WyJvbiIrZV0mJnRbIm9uIitlXSgpfXdpbmRvdy50X3NsZHNfX2lzaU9TPS9pUGhvbmV8aVBhZHxpUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNYWNpbnRvc2giKSYmIm9udG91Y2hlbmQiaW4gZG9jdW1lbnQ7dmFyIERFQlVHPSExO2Z1bmN0aW9uIHNldEltcG9ydGFudFN0eWxlKHQsZSxzKXt0LnN0eWxlLnNldFByb3BlcnR5KGUscywiaW1wb3J0YW50Iil9ZnVuY3Rpb24gZ2V0R2FsbGVyeUNvbnRhaW5lcigpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi50LXBvcHVwIik7aWYodCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCIudC1jYXRhbG9nX19yZWxldmFudHNfX2NvbnRhaW5lciwgLnQtc3RvcmVfX3JlbGV2YW50c19fY29udGFpbmVyIik7aWYoZSlyZXR1cm4gZX1yZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtY2F0YWxvZ19fcmVsZXZhbnRzX19jb250YWluZXIsIC50LXN0b3JlX19yZWxldmFudHNfX2NvbnRhaW5lciIpfWZ1bmN0aW9uIGFwcGx5QmFzZVN0eWxlcyh0KXtmb3IodmFyIGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdCIpLHM9MDtzPGUubGVuZ3RoO3MrKylmb3IodmFyIHIsaT1lW3NdLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LWNhdGFsb2dfX2NhcmRfX3RleHR3cmFwcGVyLCAudC1zdG9yZV9fY2FyZF9fdGV4dHdyYXBwZXIiKSxhPTA7YTxpLmxlbmd0aDthKyspe3ZhciBsPWlbYV07c2V0SW1wb3J0YW50U3R5bGUobCwibWFyZ2luLWJvdHRvbSIsIjBweCIpLHNldEltcG9ydGFudFN0eWxlKGwsIm1hcmdpbi10b3AiLCJhdXRvIiksc2V0SW1wb3J0YW50U3R5bGUobCwianVzdGlmeS1jb250ZW50IiwiZmxleC1zdGFydCIpO3ZhciBkPWwucXVlcnlTZWxlY3RvcigiLmpzLWNhdGFsb2ctcHJvZC1uYW1lLCAuanMtc3RvcmUtcHJvZC1uYW1lIik7ZCYmKHNldEltcG9ydGFudFN0eWxlKGQsImRpc3BsYXkiLCItd2Via2l0LWJveCIpLHNldEltcG9ydGFudFN0eWxlKGQsIi13ZWJraXQtYm94LW9yaWVudCIsInZlcnRpY2FsIiksc2V0SW1wb3J0YW50U3R5bGUoZCwiLXdlYmtpdC1saW5lLWNsYW1wIiwiMiIpLHNldEltcG9ydGFudFN0eWxlKGQsIm92ZXJmbG93IiwiaGlkZGVuIiksc2V0SW1wb3J0YW50U3R5bGUoZCwidGV4dC1vdmVyZmxvdyIsImVsbGlwc2lzIiksc2V0SW1wb3J0YW50U3R5bGUoZCwibGluZS1oZWlnaHQiLCIxLjUiKSxzZXRJbXBvcnRhbnRTdHlsZShkLCJtYXgtaGVpZ2h0IiwiY2FsYygxLjVlbSAqIDIpIiksc2V0SW1wb3J0YW50U3R5bGUoZCwicGFkZGluZy1ib3R0b20iLCJ1bnNldCIpKTt2YXIgbz1sLnF1ZXJ5U2VsZWN0b3IoIi5qcy1jYXRhbG9nLXByb2QtZGVzY3IsIC5qcy1zdG9yZS1wcm9kLWRlc2NyIik7byYmKHNldEltcG9ydGFudFN0eWxlKG8sImRpc3BsYXkiLCItd2Via2l0LWJveCIpLHNldEltcG9ydGFudFN0eWxlKG8sIi13ZWJraXQtYm94LW9yaWVudCIsInZlcnRpY2FsIiksc2V0SW1wb3J0YW50U3R5bGUobywiLXdlYmtpdC1saW5lLWNsYW1wIiwiMSIpLHNldEltcG9ydGFudFN0eWxlKG8sIm92ZXJmbG93IiwiaGlkZGVuIiksc2V0SW1wb3J0YW50U3R5bGUobywidGV4dC1vdmVyZmxvdyIsImVsbGlwc2lzIiksc2V0SW1wb3J0YW50U3R5bGUobywicGFkZGluZy1ib3R0b20iLCJ1bnNldCIpKX1ERUJVRyYmY29uc29sZS5pbmZvKCLQkdCw0LfQvtCy0YvQtSDRgdGC0LjQu9C4INC/0YDQuNC80LXQvdC10L3Riy4iKX1mdW5jdGlvbiBnZXRSZWZlcmVuY2VIZWlnaHQoKXt2YXIgdD1nZXRHYWxsZXJ5Q29udGFpbmVyKCk7aWYoIXQpcmV0dXJuIDA7dC5vZmZzZXRIZWlnaHQ7Zm9yKHZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKSxzPTA7czxlLmxlbmd0aDtzKyspe3ZhciByPWVbc107aWYoIm5vbmUiIT09d2luZG93LmdldENvbXB1dGVkU3R5bGUocikuZGlzcGxheSYmMCE9PXIub2Zmc2V0SGVpZ2h0JiZyLnF1ZXJ5U2VsZWN0b3IoIi5qcy1wcm9kdWN0LWltZyIpKXt2YXIgaT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtyZXR1cm4gREVCVUcmJmNvbnNvbGUuaW5mbygi0J7Qv9C+0YDQvdCw0Y8g0LrQsNGA0YLQvtGH0LrQsCDQvdCw0LnQtNC10L3QsC4g0JLRi9GB0L7RgtCwOiIsaSksaX19cmV0dXJuIERFQlVHJiZjb25zb2xlLmluZm8oItCd0LUg0L3QsNC50LTQtdC90LAg0LLQuNC00LjQvNCw0Y8g0LrQsNGA0YLQvtGH0LrQsCDRgSDQuNC30L7QsdGA0LDQttC10L3QuNC10LwuIiksMH1mdW5jdGlvbiB1cGRhdGVOb0ltYWdlQ2FyZEhlaWdodHMoKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dmFyIHQ9Z2V0UmVmZXJlbmNlSGVpZ2h0KCk7aWYoISh0PD0wKSl7dmFyIGU9Z2V0R2FsbGVyeUNvbnRhaW5lcigpO2lmKGUpZm9yKHZhciBzPWUucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QiKSxyPTA7cjxzLmxlbmd0aDtyKyspe3ZhciBpPXNbcl07aS5xdWVyeVNlbGVjdG9yKCIuanMtcHJvZHVjdC1pbWciKT9pLnN0eWxlLmhlaWdodD0iIjooaS5zdHlsZS5jc3NUZXh0Kz0iOyBoZWlnaHQ6ICIrdCsicHggIWltcG9ydGFudDsiLERFQlVHJiZjb25zb2xlLmluZm8oItCj0YHRgtCw0L3QvtCy0LvQtdC90LAg0LLRi9GB0L7RgtCwINC00LvRjyDQutCw0YDRgtC+0YfQutC4INCx0LXQtyDQuNC30L7QsdGA0LDQttC10L3QuNGPOiIsdCkpfX19KSl9ZnVuY3Rpb24gYXR0YWNoSW1hZ2VMb2FkTGlzdGVuZXJzKCl7dmFyIHQ9Z2V0R2FsbGVyeUNvbnRhaW5lcigpO2lmKHQpZm9yKHZhciBlPXQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXByb2R1Y3QtaW1nIikscz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgcj1lW3NdO3IuY29tcGxldGV8fHIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7REVCVUcmJmNvbnNvbGUuaW5mbygi0JjQt9C+0LHRgNCw0LbQtdC90LjQtSDQt9Cw0LPRgNGD0LfQuNC70L7RgdGMLCDQvtCx0L3QvtCy0LvRj9C10Lwg0LLRi9GB0L7RgtGDIiksdXBkYXRlTm9JbWFnZUNhcmRIZWlnaHRzKCl9KSl9fWZ1bmN0aW9uIGFkZEVtcHR5RGVzY3JQbGFjZWhvbGRlcih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi5qcy1jYXRhbG9nLXByb2QtZGVzY3IudC1jYXRhbG9nX19jYXJkX19kZXNjciwgLmpzLXN0b3JlLXByb2QtZGVzY3IudC1zdG9yZV9fY2FyZF9fZGVzY3IiKTtpZihlKXt2YXIgcz1nZXRDb21wdXRlZFN0eWxlKGUpLHI9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQsaT1zLnBhZGRpbmdUb3A7dC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtcHJvZHVjdCIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCF0LnF1ZXJ5U2VsZWN0b3IoIi5qcy1jYXRhbG9nLXByb2QtZGVzY3IudC1jYXRhbG9nX19jYXJkX19kZXNjciwgLmpzLXN0b3JlLXByb2QtZGVzY3IudC1zdG9yZV9fY2FyZF9fZGVzY3IiKSl7dmFyIHM9dC5xdWVyeVNlbGVjdG9yKCIudC1jYXRhbG9nX19jYXJkX190ZXh0d3JhcHBlciwgLnQtc3RvcmVfX2NhcmRfX3RleHR3cmFwcGVyIiksYT1zJiZzLnF1ZXJ5U2VsZWN0b3IoIi5qcy1jYXRhbG9nLXByaWNlLXdyYXBwZXIsIC5qcy1zdG9yZS1wcmljZS13cmFwcGVyIik7aWYocyYmYSl7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc05hbWU9ZS5jbGFzc05hbWUsbC5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IixyKyJweCIsImltcG9ydGFudCIpLGwuc3R5bGUuc2V0UHJvcGVydHkoInBhZGRpbmctdG9wIixpLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCJtYXJnaW4tYm90dG9tIiwiMHB4IiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgiZGlzcGxheSIsIi13ZWJraXQtYm94IiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgiLXdlYmtpdC1ib3gtb3JpZW50IiwidmVydGljYWwiLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCItd2Via2l0LWxpbmUtY2xhbXAiLCIxIiwiaW1wb3J0YW50IiksbC5zdHlsZS5zZXRQcm9wZXJ0eSgib3ZlcmZsb3ciLCJoaWRkZW4iLCJpbXBvcnRhbnQiKSxsLnN0eWxlLnNldFByb3BlcnR5KCJ0ZXh0LW92ZXJmbG93IiwiZWxsaXBzaXMiLCJpbXBvcnRhbnQiKSxzLmluc2VydEJlZm9yZShsLGEpfX19KSl9fWZ1bmN0aW9uIGluaXRHYWxsZXJ5KCl7dmFyIHQ9Z2V0R2FsbGVyeUNvbnRhaW5lcigpO2lmKHQpe3QucmVtb3ZlQXR0cmlidXRlKCJkYXRhLXN0eWxlcy1hcHBsaWVkIiksYXBwbHlCYXNlU3R5bGVzKHQpLHQuZGF0YXNldC5zdHlsZXNBcHBsaWVkPSJ0cnVlIixhZGRFbXB0eURlc2NyUGxhY2Vob2xkZXIodCksREVCVUcmJmNvbnNvbGUuaW5mbygi0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LPQsNC70LXRgNC10Lgg0LfQsNCy0LXRgNGI0LXQvdCwLiIpO2Zvcih2YXIgZT1bNTAwLDFlMywxNTAwXSxzPTA7czxlLmxlbmd0aDtzKyspe3ZhciByO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7YXR0YWNoSW1hZ2VMb2FkTGlzdGVuZXJzKCksdXBkYXRlTm9JbWFnZUNhcmRIZWlnaHRzKCl9KSxlW3NdKX19ZWxzZSBERUJVRyYmY29uc29sZS5pbmZvKCLQmtC+0L3RgtC10LnQvdC10YAg0LPQsNC70LXRgNC10Lgg0L3QtSDQvdCw0LnQtNC10L0uIil9ZnVuY3Rpb24gb2JzZXJ2ZVBvcHVwKCl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQtcG9wdXAiKSxlO3QmJigiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiaW4gd2luZG93P25ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24odCxlKXtmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI7aWYodFtzXS5pc0ludGVyc2VjdGluZyl7REVCVUcmJmNvbnNvbGUuaW5mbygi0J/QvtC/0LDQvyDQstC40LTQuNC8LiDQmNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQs9Cw0LvQtdGA0LXQuCDRh9C10YDQtdC3IDE1MDAg0LzRgSIpLGUuZGlzY29ubmVjdCgpLHNldFRpbWVvdXQoaW5pdEdhbGxlcnksMTUwMCk7YnJlYWt9fX0pKS5vYnNlcnZlKHQpOnNldFRpbWVvdXQoaW5pdEdhbGxlcnksMTUwMCkpfWZ1bmN0aW9uIG9uUmVzaXplKCl7REVCVUcmJmNvbnNvbGUuaW5mbygiUmVzaXplIOKAkyDQvtCx0L3QvtCy0LvQtdC90LjQtSDQstGL0YHQvtGC0Ysg0LrQsNGA0YLQvtGH0LXQuiIpLHVwZGF0ZU5vSW1hZ2VDYXJkSGVpZ2h0cygpfWZ1bmN0aW9uIG9uUG9wc3RhdGUoKXtERUJVRyYmY29uc29sZS5pbmZvKCJQb3BzdGF0ZSDigJMg0LjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LPQsNC70LXRgNC10LgiKSxzZXRUaW1lb3V0KGluaXRHYWxsZXJ5LDUwMCl9ZnVuY3Rpb24gb25QYWdlc2hvdyh0KXt0LnBlcnNpc3RlZCYmKERFQlVHJiZjb25zb2xlLmluZm8oIlBhZ2VzaG93ICjQuNC3INC60Y3RiNCwKSDigJMg0LjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8g0LPQsNC70LXRgNC10LgiKSxpbml0R2FsbGVyeSgpKX1mdW5jdGlvbiBvbldpbmRvd0xvYWQoKXtpbml0R2FsbGVyeSgpLG9ic2VydmVQb3B1cCgpfWlmKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLG9uUmVzaXplKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLG9uUG9wc3RhdGUpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwYWdlc2hvdyIsb25QYWdlc2hvdyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLG9uV2luZG93TG9hZCksZG9jdW1lbnQuYm9keSYmIk11dGF0aW9uT2JzZXJ2ZXIiaW4gd2luZG93KXt2YXIgZG9tT2JzZXJ2ZXI9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKCl7aW5pdEdhbGxlcnkoKX0pKTtkb21PYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9dmFyIHBvbGxDb3VudD0wLHBvbGxJbnRlcnZhbD1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtpbml0R2FsbGVyeSgpLCsrcG9sbENvdW50Pj0yMCYmY2xlYXJJbnRlcnZhbChwb2xsSW50ZXJ2YWwpfSksNTAwKTsKCmZ1bmN0aW9uIHQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIoZSl7dHJ5e3ZhciB0LHI9L3ZhclwoKC0tdWMtKFteLV0rKS0oW14tXSspLShbXixdKykpLFxzPyguKilcKS8uZXhlYyhlKTtpZighcilyZXR1cm47dmFyIGw9clswXSxhPXJbMV0sbz1yWzJdLHM9clszXSxfPXJbNF0sbj1yWzVdLGksZDtpZighKGwmJm8mJnMmJl8mJm4pKXJldHVybjtyZXR1cm57cGFyZW50OntpZDpfLHR5cGU6b30sZmFsbGJhY2s6d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZShhKXx8bixmaWVsZDpzfX1jYXRjaChjKXtjb25zb2xlLmVycm9yKCJFcnJvciB0cnlpbmcgdG8gcGFyc2UgQ1NTIFZhcmlhYmxlIil9fWZ1bmN0aW9uIHQzOTZfX2hleDJyZ2JhKGUsdCl7aWYoIWUpcmV0dXJuITE7dmFyIHI9dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1ZhcihlKTtyJiYoZT1yLmZhbGxiYWNrKTt2YXIgbD1lLnJlcGxhY2UoLyMvLCIiKTtpZigzPT09bC5sZW5ndGgpe3ZhciBhPWxbMF0sbz1sWzFdLHM9bFsyXTtlPSIjIithK2ErbytvK3Mrc312YXIgXz1wYXJzZUludChlLnN1YnN0cmluZygxKSwxNiksbixpLGQ7cmV0dXJuWygxNjcxMTY4MCZfKT4+MTYsKDY1MjgwJl8pPj44LDI1NSZfLHBhcnNlRmxvYXQodCldfWZ1bmN0aW9uIHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20oZSl7dmFyIHQ9WyJnYWxsZXJ5Il0scj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtyZXR1cm4gdC5pbmNsdWRlcyhyKX1mdW5jdGlvbiB0Mzk2X19pc0ZsZXgoZSl7dmFyIHQ9ZS5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxyPWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cC1mbGV4Iik7cmV0dXJuIHR8fHJ9ZnVuY3Rpb24gdDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKGUpe3ZhciB0PVsiLnQ5NTFfX3NpZGViYXJfc3RpY2t5IiwiLnQxMjA2X19jb250ZW50X3N0aWNreSIsIi50NzU0X19jb2xfZml4ZWQiLCIudDc3Nl9fY29sX2ZpeGVkIiwiLnQ3ODZfX2NvbF9maXhlZCIsIi50LXN0b3JlX19wcm9kLXBvcHVwX19jb2xfZml4ZWQiXTt0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKTt2YXIgcj1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodC5qb2luKCIsICIpKSk7ZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiLCJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpLGUuY2xhc3NMaXN0LmFkZChyPyJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiOiJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpfX1mdW5jdGlvbiB0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQzOTZfX292ZXJmbG93LXN0eWxlcyIpKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2UuaWQ9InQzOTZfX292ZXJmbG93LXN0eWxlcyIsZS5pbm5lckhUTUw9Ii50LXJlY29yZHNfX292ZXJmbG93LWNsaXAgeyBvdmVyZmxvdzogY2xpcDsgfVxuXHRcdFx0XHRcdFx0LnQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKX19ZnVuY3Rpb24gdDM5Nl9fZ2V0QXJ0Ym9hcmRzKGUpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIikscixsPXQmJiJlZGl0Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKT8nLnJlY29yZFtkYXRhLXJlY29yZC10eXBlPSInK2UrJyJdIC5yOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yZWNvcmRbZGF0YS1wYXJlbnR0cGxpZD0iJytlKyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJzonLnJbZGF0YS1yZWNvcmQtdHlwZT0iJytlKyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucltkYXRhLXBhcmVudHRwbGlkPSInK2UrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnO3JldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwobCkpfWZ1bmN0aW9uIHQzOTZfX2dldFplcm9CbG9ja3MoKXt2YXIgZT1bXS5jb25jYXQodDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIzOTYiKSx0Mzk2X19nZXRBcnRib2FyZHMoIjEyMSIpKSx0O3JldHVybiBlLmxlbmd0aD9lLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJue3JlY29yZDplLmNsb3Nlc3QoIi5yOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIiksYXJ0Ym9hcmQ6ZX19KSkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWNvcmR9KSk6W119ZnVuY3Rpb24gdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKGUpe2Zvcih2YXIgdD1lLmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO3Q7KXt2YXIgcjtpZih0LnN0eWxlLnpvb20pcmV0dXJuITA7dD1udWxsPT0ocj10LnBhcmVudEVsZW1lbnQpP3ZvaWQgMDpyLmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpfXJldHVybiExfXZhciB0Mzk2X191bmlxdWVJZF9fZ2VuZXJhdG9yPWZ1bmN0aW9uIGUoKXt2YXIgdD0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBlPVN0cmluZyh0Kz0xKS5wYWRTdGFydCg2LCIwIik7cmV0dXJuIiIrRGF0ZS5ub3coKStlfX0sdDM5Nl9fZ2V0VW5pcXVlSWQ9dDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcigpO2Z1bmN0aW9uIHQzOTZfaXNCbG9ja1Zpc2libGUoZSl7dmFyIHQ9d2luZG93LmlubmVyV2lkdGgscj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIiksbD1lLmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4Iik7cmV0dXJuIShyJiZ0PHBhcnNlSW50KHIsMTApKSYmIShsJiZ0PnBhcnNlSW50KGwsMTApKX12YXIgdDM5Nl9fb25SZWFkeT1mdW5jdGlvbiBlKHQpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHQpfTtmdW5jdGlvbiB0Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZShlKXt2YXIgdD1lLnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtZGF0YSIpO2lmKHQpe3ZhciByPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXZhbHVlIik7aWYocil0cnl7cmV0dXJuIEpTT04ucGFyc2Uocil9Y2F0Y2gobyl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgZGF0YToiLG8sciksW119fXZhciBsPWUucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX2lucHV0cy10ZXh0YXJlYSIpO2lmKGwpe3ZhciBhPWwudmFsdWU7aWYoYSl0cnl7cmV0dXJuIEpTT04ucGFyc2UoYSl9Y2F0Y2gobyl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgdGV4dGFyZWEgdmFsdWU6IixvLGEpLFtdfX1yZXR1cm5bXX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19pbml0KGUsdCl7dmFyIHI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlYyIrZSksbD0nLnRuLWVsZW1bZGF0YS1mZS1lbGVtLWlkPSInK3QrJyJdLCAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrdCsnIl0nLGE9cj9yLnF1ZXJ5U2VsZWN0b3IobCk6bnVsbDtpZighYSlyZXR1cm4hMTt2YXIgbz0iZnVuY3Rpb24iPT10eXBlb2YgalF1ZXJ5O3Rfb25GdW5jTG9hZCgidF9zbGRzSW5pdCIsKGZ1bmN0aW9uKCl7dF9vbkZ1bmNMb2FkKCJ0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUiLChmdW5jdGlvbigpe3RfemVyb0dhbGxlcnlfX3Byb2Nlc3NHYWxsZXJ5V2l0aEdlb0xhbmRpbmcociwoZnVuY3Rpb24oKXt0X3plcm9HYWxsZXJ5X19yZW5kZXIoYT1yLnF1ZXJ5U2VsZWN0b3IobCkpLHQzOTZfZWxlbV9fcmVuZGVyVmlldyhvPyQoYSk6YSksdF9zbGRzSW5pdChvPyQoYSk6W2FdKSx0X29uRnVuY0xvYWQoInRfc2xkc191cGRhdGVTbGlkZXIiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9zbGRzX3VwZGF0ZVNsaWRlcihvPyQoYSk6W2FdKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJfbmV4dChhLGUpfSkpfSkpfSkpfSkpLFsiZWRpdCIsInplcm8iXS5pbmNsdWRlcyh3aW5kb3cudGlsZGFtb2RlKXx8InkiIT09YS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtem9vbWFibGUtdmFsdWUiKXx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQtem9vbWVyX193cmFwcGVyIikubGVuZ3RofHx0X29uRnVuY0xvYWQoInRfaW5pdFpvb20iLChmdW5jdGlvbigpe3RfaW5pdFpvb20oKX0pKSx0X3plcm9HYWxsZXJ5X19oYW5kbGVNb3ZlU2xpZGVyKGEpO3ZhciB0PXIucXVlcnlTZWxlY3RvcigiLnQzOTYiKTt0JiYoInVuZGVmaW5lZCIhPXR5cGVvZiBqUXVlcnk/KCQodCkudW5iaW5kKCJkaXNwbGF5Q2hhbmdlZCIsdF96ZXJvR2FsbGVyeV9fdXBkYXRlU2xpZGVySGFuZGxlciksJCh0KS5iaW5kKCJkaXNwbGF5Q2hhbmdlZCIsdF96ZXJvR2FsbGVyeV9fdXBkYXRlU2xpZGVySGFuZGxlcikpOih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIix0X3plcm9HYWxsZXJ5X191cGRhdGVTbGlkZXJIYW5kbGVyKSx0LmFkZEV2ZW50TGlzdGVuZXIoImRpc3BsYXlDaGFuZ2VkIix0X3plcm9HYWxsZXJ5X191cGRhdGVTbGlkZXJIYW5kbGVyKSkpO3ZhciBzPWEucXVlcnlTZWxlY3RvcigiLnQtc2xkcyIpO3MmJihzLnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiKX0pKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nbG9iYWxJbml0KCl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiemVybzp3aW5kb3ctd2lkdGgtY2hhbmdlZCIsKGZ1bmN0aW9uKCl7dmFyIGU7dF96ZXJvR2FsbGVyeV9fb25SZXNpemUodDM5Nl9fZ2V0WmVyb0Jsb2NrcygpKX0pKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19vblJlc2l6ZShlKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVjb3JkLHI7dCYmKHQzOTZfaXNCbG9ja1Zpc2libGUodCkmJnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZWxlbS10eXBlPSJnYWxsZXJ5Il0nKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0X3NsZHNfdXBkYXRlU2xpZGVyKGUpLHRfemVyb0dhbGxlcnlfX3JlbmRlcl9uZXh0KGUsdC5pZC5yZXBsYWNlKCJyZWMiLCIiKSl9KSkpfSkpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2hhbmRsZU1vdmVTbGlkZXIoZSl7dmFyIHQ7aWYoISgvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fCJvbnRvdWNoZW5kImluIGRvY3VtZW50KSl7dmFyIHI9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19pdGVtcy13cmFwcGVyIiksbD1yLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2l0ZW0iKSxhPXBhcnNlRmxvYXQoci5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRyYW5zaXRpb24iKSk7YXx8MD09PWF8fChhPTMwMCk7dmFyIG89MTQwO3RfemVyb0dhbGxlcnlfX3NldFNsaWRlc09wYWNpdHkobCwiMCIpLGUuYWRkRXZlbnRMaXN0ZW5lcigidGlsZGFTbGRzTW92ZVNsaWRlU3RhcnQiLChmdW5jdGlvbigpe3RfemVyb0dhbGxlcnlfX3NldFNsaWRlc09wYWNpdHkobCwiMSIpfSkpLGUuYWRkRXZlbnRMaXN0ZW5lcigidGlsZGFTbGRzTW92ZVNsaWRlRW5kIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RfemVyb0dhbGxlcnlfX3NldFNsaWRlc09wYWNpdHkobCwiMCIpfSksYStvKX0pKX19ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fc2V0U2xpZGVzT3BhY2l0eShlLHQpe0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSwoZnVuY3Rpb24oZSl7ZS5jbGFzc0xpc3QuY29udGFpbnMoInQtc2xkc19faXRlbV9hY3RpdmUiKXx8KGUuc3R5bGUub3BhY2l0eT10KX0pKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19wcm9jZXNzR2FsbGVyeVdpdGhHZW9MYW5kaW5nKGUsdCl7dmFyIHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnQ4MDQiKSxsPSEhZS50ZXh0Q29udGVudCYmLTEhPT1lLnRleHRDb250ZW50LmluZGV4T2YoIiUlIiksYT1lLnF1ZXJ5U2VsZWN0b3IoIltkYXRhLXJlcGxhY2Uta2V5XSIpLG89InB1Ymxpc2hlZCIhPT10X3plcm9HYWxsZXJ5X19nZXRUaWxkYU1vZGUoKTshcnx8IWx8fGF8fG8/dCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlcGxhY2luZ0NvbXBsZXRlZCIsdCl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fdXBkYXRlU2xpZGVySGFuZGxlcihlKXt0X3NsZHNfdXBkYXRlU2xpZGVyKGUudGFyZ2V0KX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZXRUaWxkYU1vZGUoKXtpZih2b2lkIDAhPT13aW5kb3cudGlsZGFtb2RlKXJldHVybiB3aW5kb3cudGlsZGFtb2RlO3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksdDtzd2l0Y2goZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1tb2RlIik6IiIpe2Nhc2UiZWRpdCI6d2luZG93LnRpbGRhbW9kZT0iZWRpdCI7YnJlYWs7Y2FzZSJwcmV2aWV3Ijp3aW5kb3cudGlsZGFtb2RlPSJwcmV2aWV3IjticmVhaztkZWZhdWx0OndpbmRvdy50aWxkYW1vZGU9InB1Ymxpc2hlZCJ9cmV0dXJuIHdpbmRvdy50aWxkYW1vZGV9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fcmVuZGVyKGUpe3dpbmRvdy5qUXVlcnkmJmUgaW5zdGFuY2VvZiBqUXVlcnkmJihlPWUubGVuZ3RoP2UuZ2V0KDApOm51bGwpO3ZhciB0PWU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtaW1ncy12YWx1ZSIpOiIiO2lmKCF0KXt2YXIgcj1lP2UucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3NsZHMtaW1ncy10ZXh0YXJlYSIpOm51bGw7dD1yP3IudmFsdWU6IiJ9dmFyIGw9ImZ1bmN0aW9uIj09dHlwZW9mIGpRdWVyeSxhPXQ/SlNPTi5wYXJzZSh0KTpbXTthPWEuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hdF96ZXJvR2FsbGVyeV9faXNFbXB0eU9iaihlKX0pKTt2YXIgbz1lP2UucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTpudWxsO28mJihvLmlubmVySFRNTD0nPGRpdiBjbGFzcz0idC1zbGRzIiBzdHlsZT0idmlzaWJpbGl0eTogaGlkZGVuOyI+PGRpdiBjbGFzcz0idC1zbGRzX19tYWluIj48ZGl2IGNsYXNzPSJ0LXNsZHNfX2NvbnRhaW5lciI+PGRpdiBjbGFzcz0idC1zbGRzX19pdGVtcy13cmFwcGVyIiBkYXRhLXNsaWRlci10cmFuc2l0aW9uPSIiIGRhdGEtc2xpZGVyLXdpdGgtY3ljbGU9InRydWUiIGRhdGEtc2xpZGVyLWNvcnJlY3QtaGVpZ2h0PSJ0cnVlIiBkYXRhLWF1dG8tY29ycmVjdC1tb2JpbGUtd2lkdGg9ImZhbHNlIiAgZGF0YS1zbGlkZXItaXMtcHJldmlldz0idHJ1ZSI+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0idC1zbGRzX19idWxsZXRfd3JhcHBlciI+PC9kaXY+PGRpdiBjbGFzcz0idC1zbGRzX19jYXB0aW9uX19jb250YWluZXIiPjwvZGl2PjxkaXYgY2xhc3M9InQtc2xkc19fYXJyb3dfY29udGFpbmVyIj48ZGl2IGNsYXNzPSJ0LXNsZHNfX2Fycm93X3dyYXBwZXIgdC1zbGRzX19hcnJvd193cmFwcGVyLWxlZnQiIGRhdGEtc2xpZGUtZGlyZWN0aW9uPSJsZWZ0IiBzdHlsZT0iaGVpZ2h0OiA0ODhweDsiPjxkaXYgY2xhc3M9InQtc2xkc19fYXJyb3cgdC1zbGRzX19hcnJvdy1sZWZ0Ij48ZGl2IGNsYXNzPSJ0LXNsZHNfX2Fycm93X2JvZHkgdC1zbGRzX19hcnJvd19ib2R5LWxlZnQiPjxzdmcgY2xhc3M9InQtbnVsbF9fc2xkcy1hcnJvdyB0LW51bGxfX3NsZHMtYXJyb3dfMSIgd2lkdGg9Ijk0IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgOTQgOTQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTM5IDY4TDYwIDQ3TDM5IDI2IiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48L3N2Zz48c3ZnIGNsYXNzPSJ0LW51bGxfX3NsZHMtYXJyb3cgdC1udWxsX19zbGRzLWFycm93XzIiICB3aWR0aD0iOTQiIGhlaWdodD0iOTQiIHZpZXdCb3g9IjAgMCA5NCA5NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNjMgNDcuOTE3SDMwIiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48cGF0aCBkPSJNNDYuOTE3IDY0TDYzIDQ3LjkxN0w0Ni45MTcgMzEuODM0IiBzdHJva2U9ImJsYWNrIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz48L3N2Zz48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJ0LXNsZHNfX2Fycm93X3dyYXBwZXIgdC1zbGRzX19hcnJvd193cmFwcGVyLXJpZ2h0IiBkYXRhLXNsaWRlLWRpcmVjdGlvbj0icmlnaHQiIHN0eWxlPSJoZWlnaHQ6IDQ4OHB4OyI+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvdyB0LXNsZHNfX2Fycm93LXJpZ2h0ICI+PGRpdiBjbGFzcz0idC1zbGRzX19hcnJvd19ib2R5IHQtc2xkc19fYXJyb3dfYm9keS1yaWdodCI+PHN2ZyBjbGFzcz0idC1udWxsX19zbGRzLWFycm93IHQtbnVsbF9fc2xkcy1hcnJvd18xIiB3aWR0aD0iOTQiIGhlaWdodD0iOTQiIHZpZXdCb3g9IjAgMCA5NCA5NCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMzkgNjhMNjAgNDdMMzkgMjYiIHN0cm9rZT0iYmxhY2siIHZlY3Rvci1lZmZlY3Q9Im5vbi1zY2FsaW5nLXN0cm9rZSIvPjwvc3ZnPjxzdmcgY2xhc3M9InQtbnVsbF9fc2xkcy1hcnJvdyB0LW51bGxfX3NsZHMtYXJyb3dfMiIgIHdpZHRoPSI5NCIgaGVpZ2h0PSI5NCIgdmlld0JveD0iMCAwIDk0IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik02MyA0Ny45MTdIMzAiIHN0cm9rZT0iYmxhY2siIHZlY3Rvci1lZmZlY3Q9Im5vbi1zY2FsaW5nLXN0cm9rZSIvPjxwYXRoIGQ9Ik00Ni45MTcgNjRMNjMgNDcuOTE3TDQ2LjkxNyAzMS44MzQiIHN0cm9rZT0iYmxhY2siIHZlY3Rvci1lZmZlY3Q9Im5vbi1zY2FsaW5nLXN0cm9rZSIvPjwvc3ZnPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PicpO2Zvcih2YXIgcz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxfPSJwdWJsaXNoZWQiPT09dF96ZXJvR2FsbGVyeV9fZ2V0VGlsZGFNb2RlKCkmJiJ5Ij09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwiem9vbWFibGUiKSxuPSExLGk9dF96ZXJvR2FsbGVyeV9faXNMYXp5TG9hZGluZ09uRWxlbShlLGwpLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGM9YVtkXSx1PXRfemVyb0dhbGxlcnlfX2dldFZpZGVvS2V5cygpLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBjW2VdfSkpOyh1fHxjLmxpX2ltZ3VybCkmJihuPSEwKSxfPV8mJiFjLmxpX2ltZ3VybCYmIXUsYy56b29tYWJsZT1fLGMud2l0aExhenk9aTt2YXIgeT10X3plcm9HYWxsZXJ5X19nZW5lcmF0ZVNsaWRlKGMsZCk7eSYmKG51bGw9PXN8fHMuYXBwZW5kQ2hpbGQoeSkpO3ZhciBtPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYnVsbGV0X3dyYXBwZXIiKTtpZihtKXt2YXIgcD0nPGRpdiBjbGFzcz0idC1zbGRzX19idWxsZXQnKygwPT09ZD8iIHQtc2xkc19fYnVsbGV0X2FjdGl2ZSI6IiIpKyciIGRhdGEtc2xpZGUtYnVsbGV0LWZvcj0iJysoZCsxKSsnIj48ZGl2IGNsYXNzPSJ0LXNsZHNfX2J1bGxldF9ib2R5IiBzdHlsZT0id2lkdGg6IDEwcHg7IGhlaWdodDogMTBweDtiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsiPjwvZGl2PjwvZGl2Pic7bS5pbnNlcnRBZGphY2VudEhUTUwoImJlZm9yZWVuZCIscCl9dF96ZXJvR2FsbGVyeV9fYXBwZW5kQ2FwdGlvbihlLGMsZCl9aWYoIV8mJiFuKXt2YXIgZz1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LXNsZHNfX2NvbnRhaW5lciIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZywoZnVuY3Rpb24oZSl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF96ZXJvR2FsbGVyeV9fc2V0U2lkZUhhbmRsZXJzKSxlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3plcm9HYWxsZXJ5X19zZXRTaWRlSGFuZGxlcnMpfSkpfWkmJnRfb25GdW5jTG9hZCgidF9sYXp5bG9hZF91cGRhdGUiLChmdW5jdGlvbigpe3RfbGF6eWxvYWRfdXBkYXRlKCl9KSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fYXBwZW5kQ2FwdGlvbihlLHQscil7dmFyIGw9ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jYXB0aW9uX19jb250YWluZXIiKTtudWxsPT1sfHxsLmFwcGVuZENoaWxkKHRfemVyb0dhbGxlcnlfX2NyZWF0ZUNhcHRpb24odCxyKSl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fY3JlYXRlQ2FwdGlvbihlLHQpe3ZhciByPWUubGlfaW1ndGl0bGV8fCIiLGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2NhcHRpb24iKSwwPT09dCYmbC5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfX2NhcHRpb24tYWN0aXZlIiksbC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtY2FwdGlvbiIsdCsxKTt2YXIgYSxvPXIuc3RhcnRzV2l0aCgiPHNwYW4gZGF0YS1yZXBsYWNlLWtleSIpJiZyLmVuZHNXaXRoKCI8L3NwYW4+Iik/cjp0X3plcm9HYWxsZXJ5X19lc2NhcGVIdG1sKHIpO3JldHVybiBsLmlubmVySFRNTD1vPyc8ZGl2IGNsYXNzPSJ0LXNsZHNfX2NhcHRpb25fd3JhcHBlciI+PGRpdiBjbGFzcz0idC1zbGRzX190aXRsZSI+JytvKyI8L2Rpdj48L2Rpdj4iOiIiLGx9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fZ2VuZXJhdGVTbGlkZShlLHQpe3ZhciByLGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYT1bInQtc2xkc19faXRlbSJdOzA9PT10JiZhLnB1c2goInQtc2xkc19faXRlbV9hY3RpdmUiKSwocj1sLmNsYXNzTGlzdCkuYWRkLmFwcGx5KHIsYSksbC5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtaW5kZXgiLHQrMSk7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIG8uY2xhc3NMaXN0LmFkZCgidC13aWR0aCIsInQtbnVsbF9fc2xkcy13cmFwcGVyIiwidC1zbGRzX193cmFwcGVyIiwidC1zbGRzX193cmFwcGVyXzEwMCIsInQtYWxpZ25fY2VudGVyIiksbC5hcHBlbmRDaGlsZChvKSxlLmxpX2ltZ2FsdCYmKG8uaW5uZXJIVE1MPSc8bWV0YSBpdGVtcHJvcD0iaW1hZ2UiIGNvbnRlbnQ9IicrdF96ZXJvR2FsbGVyeV9fZXNjYXBlSHRtbChlLmxpX2ltZykrJyI+XG5cdFx0XHQ8bWV0YSBpdGVtcHJvcD0iY2FwdGlvbiIgY29udGVudD0iJyt0X3plcm9HYWxsZXJ5X19lc2NhcGVIdG1sKGUubGlfaW1nYWx0KSsnIj5cblx0XHRcdCcpLG8uYXBwZW5kQ2hpbGQodF96ZXJvR2FsbGVyeV9fZ2VuZXJhdGVTbGlkZUNvbnRlbnQoZSx0KSksbH1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZW5lcmF0ZVNsaWRlQ29udGVudChlLHQpe3ZhciByPXRfemVyb0dhbGxlcnlfX2dldFZpZGVvS2V5cygpLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSkpLGw9ZS5saV9pbWd1cmwmJiFyLGE9ZS5saV9pbWd0YXJnZXQmJiFyLG89ZS5saV9pbWdub2ZvbGxvdyYmIXIscz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGw/ImEiOiJkaXYiKTtpZihzLnNldEF0dHJpYnV0ZSgiZGF0YS1pbWctbGlkIixlLmxpZCksbCYmcy5zZXRBdHRyaWJ1dGUoImhyZWYiLGUubGlfaW1ndXJsKSxhJiZzLnNldEF0dHJpYnV0ZSgidGFyZ2V0IiwiX2JsYW5rIiksbyYmcy5zZXRBdHRyaWJ1dGUoInJlbCIsIm5vZm9sbG93IiksZS56b29tYWJsZSYmKHMuc2V0QXR0cmlidXRlKCJkYXRhLXpvb20tdGFyZ2V0Iix0KzEpLHMuc2V0QXR0cmlidXRlKCJkYXRhLXpvb21hYmxlIiwieWVzIikscy5zZXRBdHRyaWJ1dGUoImRhdGEtaW1nLXpvb20tdXJsIixlLmxpX2ltZykscy5jbGFzc0xpc3QuYWRkKCJ0LXpvb21hYmxlIikpLGUud2l0aExhenkmJihzLmNsYXNzTGlzdC5hZGQoInQtYmdpbWciKSxzLnNldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbCIsZS5saV9pbWcpKSxzLmNsYXNzTGlzdC5hZGQoInRuLWF0b21fX3NsZHMtaW1nIikscy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9dF96ZXJvR2FsbGVyeV9fcGFyc2VJbWFnZVVybChlLmxpX2ltZyxlLndpdGhMYXp5KSxyKXt2YXIgXz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtfLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX3ZpZGVvLXdyYXBwZXIiKSxfLmFwcGVuZENoaWxkKHMpO3ZhciBuPXRfemVyb0dhbGxlcnlfX2NyZWF0ZVBsYXlCdXR0b25Gb3JWaWRlbyhlKTtyZXR1cm4gbiYmXy5hcHBlbmRDaGlsZChuKSxffXJldHVybiBzfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3BhcnNlSW1hZ2VVcmwoZSx0KXtpZighZSlyZXR1cm4iIjtpZighdHx8ZS5pbmNsdWRlcygiLnN2ZyIpfHwhZS5pbmNsdWRlcygiaHR0cHM6Ly9zdGF0aWMudGlsZGFjZG4uIikpcmV0dXJuInVybCgiK2UrIikiO3ZhciByPWUuc3BsaXQoIi8iKTtyZXR1cm4gci5zcGxpY2UoLTEsMCwiLS9yZXNpemUvMjB4LyIpLCJ1cmwoIityLmpvaW4oIi8iKSsiKSJ9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fY3JlYXRlUGxheUJ1dHRvbkZvclZpZGVvKGUpe3ZhciB0PXRfemVyb0dhbGxlcnlfX2dldFZpZGVvS2V5cygpLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSkpLHI9KG51bGw9PXQ/dm9pZCAwOnQucmVwbGFjZSgibGlfIiwiIikpfHwiIixsPWVbdF18fCIiO2lmKCFyfHwhbClyZXR1cm4gbnVsbDt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gYS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19wbGF5IiksYS5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXZpZGVvLXR5cGUiLHIpLGEuc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci12aWRlby11cmwiLGwpLGEuaW5uZXJIVE1MPSc8c3ZnIHZpZXdCb3g9IjAgMCA2MCA2MCI+XG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZyBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0iIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZyBjbGFzcz0idG4tZWxlbV9fZ2FsbGVyeV9fcGxheV9pY29uX19jb2xvci1ob2xkZXIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC02OTEuMDAwMDAwLCAtMzUxNC4wMDAwMDApIiBmaWxsPSIjRkZGRkZGIj5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8cGF0aCBkPSJNNzIxLDM1NzQgQzczNy41Njg1NDIsMzU3NCA3NTEsMzU2MC41Njg1NCA3NTEsMzU0NCBDNzUxLDM1MjcuNDMxNDYgNzM3LjU2ODU0MiwzNTE0IDcyMSwzNTE0IEM3MDQuNDMxNDU4LDM1MTQgNjkxLDM1MjcuNDMxNDYgNjkxLDM1NDQgQzY5MSwzNTYwLjU2ODU0IDcwNC40MzE0NTgsMzU3NCA3MjEsMzU3NCBaIE03MTUsMzUzNCBMNzMyLDM1NDQuNSBMNzE1LDM1NTUgTDcxNSwzNTM0IFoiPjwvcGF0aD5cblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9nPlxuXHRcdFx0XHRcdFx0XHRcdFx0PC9nPlxuXHRcdFx0XHRcdFx0XHRcdDwvc3ZnPicsYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdF96ZXJvR2FsbGVyeV9fcGxheVZpZGVvKSxhfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3NldFNpZGVIYW5kbGVycyhlKXt2YXIgdD1lLnRhcmdldCxyPXQuY2xvc2VzdCgiLnQtc2xkcyIpLGw9ZS5vZmZzZXRYLGE9dC5vZmZzZXRXaWR0aCxvPXI/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1sZWZ0Iik6bnVsbCxzPXI/ci5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19hcnJvdy1yaWdodCIpOm51bGw7bDw9NjAmJm8mJm8uY2xpY2soKSxhLWw8PTYwJiZzLmNsaWNrKCl9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9faXNFbXB0eU9iaihlKXtpZighZSlyZXR1cm4hMDt2YXIgdD1bXTtmb3IodmFyIHIgaW4gZSllW3JdfHx0LnB1c2goInkiKTtyZXR1cm4gdC5sZW5ndGg9PT1PYmplY3Qua2V5cyhlKS5sZW5ndGh9ZnVuY3Rpb24gdF96ZXJvR2FsbGVyeV9fcmVuZGVyX25leHQoZSx0KXt2YXIgcjtbInNsZHNfYXJyb3dzaXplIiwic2xkc19hcnJvd2xpbmVzaXplIiwic2xkc19hcnJvd2NvbG9yIiwic2xkc19hcnJvd2NvbG9yaG92ZXIiLCJzbGRzX2Fycm93Ymdjb2xvciIsInNsZHNfYXJyb3diZ2NvbG9yaG92ZXIiLCJzbGRzX2Fycm93YmdvcGFjaXR5Iiwic2xkc19hcnJvd2Jnb3BhY2l0eWhvdmVyIiwic2xkc19kb3Rzc2l6ZSIsInNsZHNfZG90c2JnY29sb3IiLCJzbGRzX2RvdHNiZ2NvbG9yYWN0aXZlIiwic2xkc19sb29wIiwic2xkc19zcGVlZCIsInNsZHNfYXV0b3BsYXkiLCJzbGRzX2Fycm93Y29udHJvbHMiLCJzbGRzX2RvdHNjb250cm9scyIsInNsZHNfc3RyZXRjaCIsInNsZHNfcGxheWljb25zaXplIiwic2xkc19wbGF5aWNvbmNvbG9yIiwic2xkc19jYXB0aW9udG9wbWFyZ2luIiwic2xkc19kb3Rzdm1hcmdpbiIsInNsZHNfY2FwdGlvbndpZHRoIiwic2xkc19hcnJvd2htYXJnaW4iLCJzbGRzX2Fycm93dm1hcmdpbiIsInNsZHNfZG90c2htYXJnaW4iLCJzbGRzX2Fycm93YWxpZ24iLCJzbGRzX2Fycm93YmV0d2Vlbm1hcmdpbiIsInNsZHNfYXJyb3d0eXBlIiwic2xkc19jdXJzb3Jjb250cm9sIiwic2xkc19pbWdwb3NpdGlvbiIsInNsZHNfYXJyb3dib3JkZXIiXS5mb3JFYWNoKChmdW5jdGlvbihyKXt0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LHIpfSkpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dldEFycm93U2l6ZShlKXt2YXIgdDtyZXR1cm57czozMCxtOjQwLGw6NDUseGw6NTB9W2VdfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQscil7dmFyIGw9ImZ1bmN0aW9uIj09dHlwZW9mIGpRdWVyeTtpZihkb2N1bWVudC5jb250YWlucyhlKSl7dmFyIGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLHIpLG89ZS5xdWVyeVNlbGVjdG9yKCIudC1zbGRzX19jb250YWluZXIiKSxzPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3dfY29udGFpbmVyIiksXz1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF93cmFwcGVyIiksbj1lLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2l0ZW1zLXdyYXBwZXIiKSxpPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3ciKSxkPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctcmlnaHQiKSxjPWUucXVlcnlTZWxlY3RvcigiLnQtc2xkc19fYXJyb3ctbGVmdCIpLHU9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19idWxsZXRfYm9keSIpLHksbSxwLGcsdixmLHc7c3dpdGNoKHZvaWQgMD09PWEmJihhPSIiKSxyKXtjYXNlInNsZHNfaW1ncG9zaXRpb24iOnZhciBiO2F8fChhPSJjZW50ZXIgY2VudGVyIiksdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X19wb3NpdGlvbi1zdHlsZXMiKSksbyYmKCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX3Bvc2l0aW9uLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudG4tYXRvbV9fc2xkcy1pbWd7YmFja2dyb3VuZC1wb3NpdGlvbjogJythKyI7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdykpO2JyZWFrO2Nhc2Uic2xkc19zdHJldGNoIjp2YXIgaDthfHwoYT0iY292ZXIiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX3N0cmV0Y2gtc3R5bGVzIikpLG8mJigodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19zdHJldGNoLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudG4tYXRvbV9fc2xkcy1pbWcge2JhY2tncm91bmQtc2l6ZTogJythKyI7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdykpO2JyZWFrO2Nhc2Uic2xkc19jdXJzb3Jjb250cm9sIjphfHwoYT0ibm9uZSIpLGUuY2xhc3NMaXN0LnJlbW92ZSgidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtY3Vyc29yIiksIm9uIj09PWEmJmUuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtY3Vyc29yIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93Y29udHJvbHMiOmlmKGF8fChhPSJuZWFyIiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy1pbiIsInRuLWVsZW1fX2dhbGxlcnlfYXJyb3dzLW5lYXIiLCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy1ub25lIiwidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtYWJvdmUiLCJ0bi1lbGVtX19nYWxsZXJ5X2Fycm93cy11bmRlciIpLGUuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9hcnJvd3MtIithKSwiYWJvdmUiPT09YXx8InVuZGVyIj09PWEpe3k9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93c2l6ZSIpO3ZhciB6PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2JldHdlZW5tYXJnaW4iKTtpZih6fHwoej0iMTAiKSx5fHwoeT0icyIpLHk9dF96ZXJvR2FsbGVyeV9fZ2V0QXJyb3dTaXplKHkpLHMpe3ZhciBHPTIqeStwYXJzZUludCh6LDEwKTtzLnN0eWxlLndpZHRoPXQzOTZfX3pvb21pZnlWYWx1ZShlLEcpfX1lbHNlIHMmJihzLnN0eWxlLndpZHRoPSIxMDAlIiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQobD8kKGUpOmUsImJvcmRlcndpZHRoIik7ImluIj09PWEmJmUucXVlcnlTZWxlY3RvcigiW2RhdGEtc2xpZGVyLXZpZGVvLXR5cGVdIikmJmUuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fd2l0aC12aWRlbyIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3dobWFyZ2luIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd3ZtYXJnaW4iKSwidW5kZXIiPT09YSYmdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19jYXB0aW9udG9wbWFyZ2luIik7YnJlYWs7Y2FzZSJzbGRzX2RvdHNobWFyZ2luIjp2YXIgUzthfHwoYT0iMjAiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX2J1bGxldC1obWFyZ2luLXN0eWxlcyIpKSxvJiYoKHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fYnVsbGV0LWhtYXJnaW4tc3R5bGVzIiksdy50ZXh0Q29udGVudD0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdIC50LXNsZHNfX2J1bGxldCB7cGFkZGluZzogMTBweCAnK2EvMisicHg7bWFyZ2luOiAwcHg7fSIsby5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsdykpO2JyZWFrO2Nhc2Uic2xkc19kb3RzY29udHJvbHMiOmF8fChhPSJub25lIiksXyYmKF8uc3R5bGUuZGlzcGxheT0iYmxvY2siKSx2PXBhcnNlSW50KHQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3Rzc2l6ZSIpLDEwKSwibmVhciI9PT1hJiZfJiYoXy5zdHlsZS5ib3R0b209LTIwLXYrInB4IiksImluIj09PWEmJl8mJihfLnN0eWxlLmJvdHRvbT0iMCIpLCJub25lIj09PWEmJl8mJihfLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2RvdHN2bWFyZ2luIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd3ZtYXJnaW4iKTticmVhaztjYXNlInNsZHNfcGxheWljb25zaXplIjp2YXIgQTthfHwoYT0iNzAiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX2ljb24tc2l6ZS1zdHlsZXMiKSksbyYmKCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2ljb24tc2l6ZS1zdHlsZXMiKSx3LnRleHRDb250ZW50PSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnRuLWVsZW1fX2dhbGxlcnlfX3BsYXkge3dpZHRoOiAnK3BhcnNlSW50KGEsMTApKyJweDtoZWlnaHQ6ICIrcGFyc2VJbnQoYSwxMCkrInB4O2xlZnQ6IGNhbGMoNTAlIC0gIitwYXJzZUludChhLDEwKS8yKyJweCk7dG9wOiBjYWxjKDUwJSAtICIrcGFyc2VJbnQoYSwxMCkvMisicHgpO30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKTticmVhaztjYXNlInNsZHNfcGxheWljb25jb2xvciI6dmFyIEU7YXx8KGE9IiNmZmYiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX2ljb24tY29sb3Itc3R5bGVzIikpLG8mJigodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19pY29uLWNvbG9yLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudG4tZWxlbV9fZ2FsbGVyeV9fcGxheV9pY29uX19jb2xvci1ob2xkZXIge2ZpbGw6ICcrYSsiO30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKTticmVhaztjYXNlInNsZHNfYXJyb3d0eXBlIjphfHwoYT0iMSIpO3ZhciBMPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtbnVsbF9fc2xkcy1hcnJvdyIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoTCwoZnVuY3Rpb24oZSl7ZS5zdHlsZS5kaXNwbGF5PSJub25lIn0pKTt2YXIgaz1lLnF1ZXJ5U2VsZWN0b3JBbGwoIi50LW51bGxfX3NsZHMtYXJyb3dfIithKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGssKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuZGlzcGxheT0iYmxvY2sifSkpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3dzaXplIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93Ym9yZGVyIjp2YXIgVjtpZihhfHwoYT0ibm9uZSIpLHRfemVyb0dhbGxlcnlfX3JlbW92ZUVsZW1lbnQoZS5xdWVyeVNlbGVjdG9yKCIudG4tZWxlbV9fZ2FsbGVyeV9fYXJyb3ctYm9yZGVyLXN0eWxlcyIpKSwibm9uZSIhPT1hKXt2YXIgRj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3dsaW5lc2l6ZSIpfHwiMSIseD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb2xvciIpfHwiIzIyMiIscT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb2xvcmhvdmVyIil8fHg7byYmKCh3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIikpLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2Fycm93LWJvcmRlci1zdHlsZXMiKSx3LnRleHRDb250ZW50PScudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudC1zbGRzX19hcnJvd19ib2R5OmJlZm9yZSB7Ym9yZGVyOiAnK0YrInB4IHNvbGlkICIreCsnO30udG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudC1zbGRzX19hcnJvd19ib2R5OmhvdmVyOmJlZm9yZSB7Ym9yZGVyOiAnK0YrInB4IHNvbGlkICIrcSsiO30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKX1icmVhaztjYXNlInNsZHNfYXJyb3dzaXplIjphfHwoYT0icyIpLGE9dF96ZXJvR2FsbGVyeV9fZ2V0QXJyb3dTaXplKGEpO3ZhciBDPWUucXVlcnlTZWxlY3RvckFsbCgiLnQtc2xkc19fYXJyb3dfYm9keSIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoQywoZnVuY3Rpb24odCl7dC5zdHlsZS5zZXRQcm9wZXJ0eSgid2lkdGgiLHQzOTZfX3pvb21pZnlWYWx1ZShlLHBhcnNlSW50KGEsMTApKSwiaW1wb3J0YW50Iil9KSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd2JnY29sb3IiKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93YmV0d2Vlbm1hcmdpbiIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3d2bWFyZ2luIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93bGluZXNpemUiOmF8fChhPSIxIik7dmFyIE89ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd19ib2R5IHBvbHlsaW5lLCAudC1zbGRzX19hcnJvd19ib2R5IHBhdGgiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKE8sKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuc3Ryb2tlV2lkdGg9cGFyc2VJbnQoYSwxMCkrInB4In0pKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Ym9yZGVyIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93Y29sb3IiOmF8fChhPSIjMjIyIik7dmFyIEk9ZS5xdWVyeVNlbGVjdG9yQWxsKCIudC1zbGRzX19hcnJvd19jb250YWluZXIgcG9seWxpbmUsIC50LXNsZHNfX2Fycm93X2NvbnRhaW5lciBwYXRoIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChJLChmdW5jdGlvbihlKXtlLnN0eWxlLnN0cm9rZT1hfSkpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3dib3JkZXIiKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Y29sb3Job3ZlciIpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3diZ2NvbG9yIik7YnJlYWs7Y2FzZSJzbGRzX2RvdHNiZ2NvbG9yIjphfHwoYT0iI2ZmZiIpLGY9LTEhPT1hLmluZGV4T2YoIi1ncmFkaWVudCgiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHUsKGZ1bmN0aW9uKGUpe2Y/ZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9YTplLnN0eWxlLmJhY2tncm91bmRDb2xvcj1hfSkpO2JyZWFrO2Nhc2Uic2xkc19kb3RzYmdjb2xvcmFjdGl2ZSI6dmFyIEI7aWYoYXx8KGE9IiMyMjIiKSxmPS0xIT09YS5pbmRleE9mKCItZ3JhZGllbnQoIiksdF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX2J1bGxldF93cmFwcGVyIHN0eWxlIikpLF8pe3c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt2YXIgTT0iI3JlYyIrdCsnIC50bi1lbGVtW2RhdGEtZWxlbS1pZD0iJytlLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLWlkIikrJyJdJyxqPShNKz0iIC50LXNsZHNfX2J1bGxldF9hY3RpdmUgLnQtc2xkc19fYnVsbGV0X2JvZHkiKSsieyI7ais9Zj8iYmFja2dyb3VuZC1pbWFnZTogIithKyIgIWltcG9ydGFudDsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsiOiJiYWNrZ3JvdW5kLWNvbG9yOiAiK2ErIiAhaW1wb3J0YW50OyBiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7IixqKz0ifSIsdy50ZXh0Q29udGVudD1qLF8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpfWJyZWFrO2Nhc2Uic2xkc19hdXRvcGxheSI6aWYoYXx8KGE9IjAiKSxuJiYobi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRpbWVvdXQiLCgxZTMqcGFyc2VGbG9hdChhKSkudG9TdHJpbmcoKSksdF9vbkZ1bmNMb2FkKCJ0X3NsaWRlTW92ZSIsKGZ1bmN0aW9uKCl7dF9zbGlkZU1vdmUobD8kKGUpOmUpfSkpLDFlMypwYXJzZUZsb2F0KGEpKSl7dmFyIEg9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7SC5pbml0RXZlbnQoInNsaWRlQXV0b3BsYXlUaW1lclJlYWR5IiwhMCwhMCksbi5kaXNwYXRjaEV2ZW50KEgpfWJyZWFrO2Nhc2Uic2xkc19hcnJvd2JnY29sb3IiOnZhciBUPXRfemVyb0dhbGxlcnlfX2dldEFycm93U2l6ZSh5PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd3NpemUiKSksUj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3diZ29wYWNpdHkiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe2E/KHQuc3R5bGUud2lkdGg9dDM5Nl9fem9vbWlmeVZhbHVlKGUsVCksdC5zdHlsZS5oZWlnaHQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsVCksdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9Uj8icmdiYSgiK3QzOTZfX2hleDJyZ2JhKGEsUikrIikiOmEpOih0LnN0eWxlLndpZHRoPXQzOTZfX3pvb21pZnlWYWx1ZShlLFQpLHQuc3R5bGUuaGVpZ2h0PXQzOTZfX3pvb21pZnlWYWx1ZShlLFQpLHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJ0cmFuc3BhcmVudCIpfSkpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3diZ2NvbG9yaG92ZXIiKTticmVhaztjYXNlInNsZHNfYXJyb3diZ29wYWNpdHkiOnRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3diZ2NvbG9yIik7YnJlYWs7Y2FzZSJzbGRzX2Fycm93YWxpZ24iOmF8fChhPSJjZW50ZXIiKSxzJiYocy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX2Fycm93X2NvbnRhaW5lci1sZWZ0IiwidC1zbGRzX19hcnJvd19jb250YWluZXItY2VudGVyIiwidC1zbGRzX19hcnJvd19jb250YWluZXItcmlnaHQiKSxzLmNsYXNzTGlzdC5hZGQoInQtc2xkc19fYXJyb3dfY29udGFpbmVyLSIrYSkpO2JyZWFrO2Nhc2Uic2xkc19kb3Rzc2l6ZSI6YXx8KGE9IjEwIiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh1LChmdW5jdGlvbih0KXt0LnN0eWxlLndpZHRoPXQzOTZfX3pvb21pZnlWYWx1ZShlLGEpLHQuc3R5bGUuaGVpZ2h0PXQzOTZfX3pvb21pZnlWYWx1ZShlLGEpfSkpLHRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfZG90c2NvbnRyb2xzIik7YnJlYWs7Y2FzZSJzbGRzX2xvb3AiOmF8fChhPSJsb29wIiksIm5vbmUiPT09YSYmKG4mJm4uc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci13aXRoLWN5Y2xlIiwiZmFsc2UiKSxzJiZzLmNsYXNzTGlzdC5hZGQoInQtc2xkc19fbm9jeWNsZSIpKSwibG9vcCI9PT1hJiYobiYmbi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXdpdGgtY3ljbGUiLCJ0cnVlIikscyYmcy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfX25vY3ljbGUiKSk7YnJlYWs7Y2FzZSJzbGRzX3NwZWVkIjphfHwoYT0ibm9uZSIpLCJub25lIj09PWEmJm4mJihuLnNldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdHJhbnNpdGlvbiIsIiIpLG4uY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLXNsb3ciKSxuLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1mYXN0Iiksbi5jbGFzc0xpc3QuYWRkKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpKSwic2xvdyI9PT1hJiZuJiYobi5zZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXRyYW5zaXRpb24iLCI1MDAiKSxuLmNsYXNzTGlzdC5yZW1vdmUoInQtc2xkc19hbmltYXRlZC1mYXN0Iiksbi5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtbm9uZSIpLG4uY2xhc3NMaXN0LmFkZCgidC1zbGRzX2FuaW1hdGVkLXNsb3ciKSksImZhc3QiPT09YSYmbiYmKG4uc2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlci10cmFuc2l0aW9uIiwiMzAwIiksbi5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNsZHNfYW5pbWF0ZWQtc2xvdyIpLG4uY2xhc3NMaXN0LnJlbW92ZSgidC1zbGRzX2FuaW1hdGVkLW5vbmUiKSxuLmNsYXNzTGlzdC5hZGQoInQtc2xkc19hbmltYXRlZC1mYXN0IikpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2NvbG9yaG92ZXIiOnRfemVyb0dhbGxlcnlfX3JlbmRlclZpZXdPbmVGaWVsZChlLHQsInNsZHNfYXJyb3dib3JkZXIiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKHQpe3ZhciByPXQucXVlcnlTZWxlY3RvckFsbCgicG9seWxpbmUsIHBhdGgiKTt0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLChmdW5jdGlvbigpe2F8fChhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbG9yaG92ZXIiKSksYXx8KGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93Y29sb3IiKSksYXx8KGE9IiMyMjIiKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKGUpe2Uuc3R5bGUuc3Ryb2tlPWF9KSl9KSksdC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIiwoZnVuY3Rpb24oKXt2YXIgdD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb2xvciIpO3R8fCh0PSIjMjIyIiksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChyLChmdW5jdGlvbihlKXtlLnN0eWxlLnN0cm9rZT10fSkpfSkpfSkpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd2JnY29sb3Job3ZlciI6QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLChmdW5jdGlvbigpe3ZhciByPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2Jnb3BhY2l0eWhvdmVyIik7cnx8KHI9IjEuMCIpLGF8fChhPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2JnY29sb3IiKSksYXx8KGE9InRyYW5zcGFyZW50Iik7dmFyIG89YTsidHJhbnNwYXJlbnQiIT09YSYmKG89InJnYmEoIit0Mzk2X19oZXgycmdiYShhLHIpKyIpIiksdC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9b30pKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLChmdW5jdGlvbigpe3ZhciByPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2JnY29sb3IiKTtpZihyfHwocj0idHJhbnNwYXJlbnQiKSwidHJhbnNwYXJlbnQiIT09cil7dmFyIGE9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2Fycm93YmdvcGFjaXR5Iik7YXx8KGE9IjEuMCIpLHI9InJnYmEoIit0Mzk2X19oZXgycmdiYShyLGEpKyIpIn10LnN0eWxlLmJhY2tncm91bmRDb2xvcj1yfSkpfSkpO2JyZWFrO2Nhc2Uic2xkc19kb3Rzdm1hcmdpbiI6YXx8KGE9IjE2IikscD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c2NvbnRyb2xzIiksXyYmKCJuZWFyIj09PXA/KF8uc3R5bGUubWFyZ2luQm90dG9tPS1hKyJweCIsXy5zdHlsZS5wYWRkaW5nQm90dG9tPSIwIik6KF8uc3R5bGUubWFyZ2luQm90dG9tPSIwIixfLnN0eWxlLnBhZGRpbmdCb3R0b209YSsicHgiKSksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19jYXB0aW9udG9wbWFyZ2luIiksdF96ZXJvR2FsbGVyeV9fcmVuZGVyVmlld09uZUZpZWxkKGUsdCwic2xkc19hcnJvd3ZtYXJnaW4iKTticmVhaztjYXNlInNsZHNfY2FwdGlvbnRvcG1hcmdpbiI6dmFyIFc9dDM5Nl9nZXRFbChsPyQoZSk6ZSksWj1udWxsPT1XP3ZvaWQgMDpXLnF1ZXJ5U2VsZWN0b3IoIi50LXNsZHNfX3RpdGxlIik7YSYmWnx8KGE9IjIwIikscD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c2NvbnRyb2xzIiksbT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb250cm9scyIpO3ZhciBQPTAsUTtpZigibmVhciI9PT1wJiYoKGc9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHN2bWFyZ2luIikpfHwoZz0iMTYiKSwodj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfZG90c3NpemUiKSl8fCh2PSIxMCIpLFA9MjArcGFyc2VJbnQodiwxMCkrcGFyc2VJbnQoZywxMCkpLCJ1bmRlciI9PT1tKXt2YXIgVT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3dzaXplIiksTj10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3d2bWFyZ2luIik7Tnx8KE49IjEwIiksVXx8KFU9InMiKSxVPXRfemVyb0dhbGxlcnlfX2dldEFycm93U2l6ZShVKSxQPVArcGFyc2VJbnQoVSwxMCkrcGFyc2VJbnQoTiwxMCl9dF96ZXJvR2FsbGVyeV9fcmVtb3ZlRWxlbWVudChlLnF1ZXJ5U2VsZWN0b3IoIi50bi1lbGVtX19nYWxsZXJ5X19jYXB0aW9uLXBvc2l0aW9uLXN0eWxlcyIpKSxvJiYoKHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgidG4tZWxlbV9fZ2FsbGVyeV9fY2FwdGlvbi1wb3NpdGlvbi1zdHlsZXMiKSx3LnRleHRDb250ZW50PSIjcmVjIit0KycgLnRuLWVsZW1bZGF0YS1lbGVtLWlkPSInK2UuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0taWQiKSsnIl0gLnQtc2xkc19fY2FwdGlvbiB7bWFyZ2luLXRvcDogJysoUCtwYXJzZUludChhLDEwKSkrInB4O30iLG8uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLHcpKTticmVhaztjYXNlInNsZHNfY2FwdGlvbndpZHRoIjp2YXIgSzthfHwoYT0iODAiKSx0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fX2dhbGxlcnlfX2NhcHRpb24td2lkdGgtc3R5bGVzIikpLG8mJigodz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpKS5jbGFzc0xpc3QuYWRkKCJ0bi1lbGVtX19nYWxsZXJ5X19jYXB0aW9uLXdpZHRoLXN0eWxlcyIpLHcudGV4dENvbnRlbnQ9IiNyZWMiK3QrJyAudG4tZWxlbVtkYXRhLWVsZW0taWQ9IicrZS5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS1pZCIpKyciXSAudC1zbGRzX19jYXB0aW9uIHt3aWR0aDogJytwYXJzZUludChhLDEwKSsiJTt9IixvLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIix3KSk7YnJlYWs7Y2FzZSJzbGRzX2Fycm93aG1hcmdpbiI6YXx8KGE9IjMwIiksbT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb250cm9scyIpLGQmJmMmJigibmVhciI9PT1tPyhkLnN0eWxlLmxlZnQ9dDM5Nl9fem9vbWlmeVZhbHVlKGUsYSksZC5zdHlsZS5yaWdodD0iYXV0byIsYy5zdHlsZS5sZWZ0PSJhdXRvIixjLnN0eWxlLnJpZ2h0PXQzOTZfX3pvb21pZnlWYWx1ZShlLGEpKTooZC5zdHlsZS5sZWZ0PSJhdXRvIixkLnN0eWxlLnJpZ2h0PXQzOTZfX3pvb21pZnlWYWx1ZShlLGEpLGMuc3R5bGUubGVmdD10Mzk2X196b29taWZ5VmFsdWUoZSxhKSxjLnN0eWxlLnJpZ2h0PSJhdXRvIikpO2JyZWFrO2Nhc2Uic2xkc19hcnJvd3ZtYXJnaW4iOmF8fChhPSIxMCIpO3ZhciBKPXt9O2lmKCJhYm92ZSI9PT0obT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUobD8kKGUpOmUsInNsZHNfYXJyb3djb250cm9scyIpKSlKLnRvcD0tYSsicHgiLEouYm90dG9tPSJhdXRvIixBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGksKGZ1bmN0aW9uKGUpe2Uuc3R5bGUubWFyZ2luVG9wPSIwIn0pKTtlbHNlIGlmKCJ1bmRlciI9PT1tKXt2YXIgRD0wOyJuZWFyIj09PShwPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3RzY29udHJvbHMiKSkmJihnPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19kb3Rzdm1hcmdpbiIpLHY9dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGw/JChlKTplLCJzbGRzX2RvdHNzaXplIiksRD0yMCtwYXJzZUludCh2LDEwKStwYXJzZUludChnLDEwKSksYT1wYXJzZUludChhLDEwKStELEouYm90dG9tPS1hKyJweCIsSi50b3A9ImF1dG8iLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoaSwoZnVuY3Rpb24oZSl7ZS5zdHlsZS5tYXJnaW5Ub3A9IjAifSkpfWVsc2UgSi50b3A9IiIsSi5ib3R0b209IiI7cyYmKHMuc3R5bGUudG9wPUoudG9wLHMuc3R5bGUuYm90dG9tPUouYm90dG9tKSx0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2NhcHRpb250b3BtYXJnaW4iKTticmVhaztjYXNlInNsZHNfYXJyb3diZXR3ZWVubWFyZ2luIjphfHwoYT0iMTAiKSwoImFib3ZlIj09PShtPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShsPyQoZSk6ZSwic2xkc19hcnJvd2NvbnRyb2xzIikpfHwidW5kZXIiPT09bSkmJmQmJmMmJihkLnN0eWxlLm1hcmdpbkxlZnQ9YS8yKyJweCIsYy5zdHlsZS5tYXJnaW5SaWdodD1hLzIrInB4Iix0X3plcm9HYWxsZXJ5X19yZW5kZXJWaWV3T25lRmllbGQoZSx0LCJzbGRzX2Fycm93Y29udHJvbHMiKSl9fX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19yZW1vdmVFbGVtZW50KGUpe2UmJmUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX3BsYXlWaWRlbyhlKXt2YXIgdD1lLmN1cnJlbnRUYXJnZXQ7aWYodCl7dmFyIHIsbCxhPXRfemVyb0dhbGxlcnlfX2dlbmVyYXRlVmlkZW8odC5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGVyLXZpZGVvLXR5cGUiKSx0LmdldEF0dHJpYnV0ZSgiZGF0YS1zbGlkZXItdmlkZW8tdXJsIikpO2EmJnQucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChhKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X3plcm9HYWxsZXJ5X19wbGF5VmlkZW8pfX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZW5lcmF0ZVZpZGVvKGUsdCl7aWYoIWV8fCF0KXJldHVybiBudWxsO3ZhciByPVsieW91dHViZSIsInZpbWVvIl0uaW5jbHVkZXMoZSksbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoInRuLWVsZW1fX2dhbGxlcnlfX2ZyYW1lIik7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyPyJpZnJhbWUiOiJ2aWRlbyIpO3JldHVybiBhLmNsYXNzTGlzdC5hZGQocj8idG4tZWxlbV9fZ2FsbGVyeV9faWZyYW1lIjoidG4tZWxlbV9fZ2FsbGVyeV9fdmlkZW8iKSxhLnNyYz10X3plcm9HYWxsZXJ5X19nZXRVUkxCeVZpZGVvVHlwZSh0LGUpLHI/KGEuYWxsb3c9ImF1dG9wbGF5IixhLnNldEF0dHJpYnV0ZSgiYWxsb3dmdWxsc2NyZWVuIiwiIikpOihhLnNldEF0dHJpYnV0ZSgiY29udHJvbHMiLCJjb250cm9scyIpLGEuc2V0QXR0cmlidXRlKCJhdXRvcGxheSIsImF1dG9wbGF5IiksYS5zZXRBdHRyaWJ1dGUoInBsYXlzaW5saW5lIiwicGxheXNpbmxpbmUiKSksbC5hcHBlbmRDaGlsZChhKSxsfWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2dldFVSTEJ5VmlkZW9UeXBlKGUsdCl7cmV0dXJuInZpbWVvIj09PXQ/Imh0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8iK2UrIj9oPSZhcGk9MSZhdXRvcGxheT0xIjoieW91dHViZSI9PT10PyJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC8iK2UrIj9hdXRvcGxheT0xJmVuYWJsZWpzYXBpPTEiOmV8fCIifWZ1bmN0aW9uIHRfemVyb0dhbGxlcnlfX2lzTGF6eUxvYWRpbmdPbkVsZW0oZSx0KXt2YXIgcj0ieSI9PT13aW5kb3cubGF6eTtpZighcil7dmFyIGw9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKTtyPSEhbCYmInllcyI9PT1sLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iil9cmV0dXJuISFyJiYieSIhPT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUodD8kKGUpOmUsImxhenlvZmYiKX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19nZXRWaWRlb0tleXMoKXtyZXR1cm5bImxpX3ZpbWVvIiwibGlfeW91dHViZSIsImxpX21wNCIsImxpX3dlYm0iXX1mdW5jdGlvbiB0X3plcm9HYWxsZXJ5X19lc2NhcGVIdG1sKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpLnJlcGxhY2UoLycvZywiJiMwMzk7Iil9dDM5Nl9fb25SZWFkeSh0X3plcm9HYWxsZXJ5X19nbG9iYWxJbml0KSx3aW5kb3cudGlsZGFfemVyb19nYWxsZXJ5X2pzX3Zlcj0xOwoKLyohIEhhbW1lci5KUyAtIHYyLjAuOCAtIDIwMTYtMDQtMjMKICogaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby8KICoKICogQ29weXJpZ2h0IChjKSAyMDE2IEpvcmlrIFRhbmdlbGRlcjsKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlICovCiFmdW5jdGlvbihhLGIsYyxkKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShhLGIsYyl7cmV0dXJuIHNldFRpbWVvdXQoaihhLGMpLGIpfWZ1bmN0aW9uIGYoYSxiLGMpe3JldHVybiBBcnJheS5pc0FycmF5KGEpPyhnKGEsY1tiXSxjKSwhMCk6ITF9ZnVuY3Rpb24gZyhhLGIsYyl7dmFyIGU7aWYoYSlpZihhLmZvckVhY2gpYS5mb3JFYWNoKGIsYyk7ZWxzZSBpZihhLmxlbmd0aCE9PWQpZm9yKGU9MDtlPGEubGVuZ3RoOyliLmNhbGwoYyxhW2VdLGUsYSksZSsrO2Vsc2UgZm9yKGUgaW4gYSlhLmhhc093blByb3BlcnR5KGUpJiZiLmNhbGwoYyxhW2VdLGUsYSl9ZnVuY3Rpb24gaChiLGMsZCl7dmFyIGU9IkRFUFJFQ0FURUQgTUVUSE9EOiAiK2MrIlxuIitkKyIgQVQgXG4iO3JldHVybiBmdW5jdGlvbigpe3ZhciBjPW5ldyBFcnJvcigiZ2V0LXN0YWNrLXRyYWNlIiksZD1jJiZjLnN0YWNrP2Muc3RhY2sucmVwbGFjZSgvXlteXChdKz9bXG4kXS9nbSwiIikucmVwbGFjZSgvXlxzK2F0XHMrL2dtLCIiKS5yZXBsYWNlKC9eT2JqZWN0Ljxhbm9ueW1vdXM+XHMqXCgvZ20sInthbm9ueW1vdXN9KClAIik6IlVua25vd24gU3RhY2sgVHJhY2UiLGY9YS5jb25zb2xlJiYoYS5jb25zb2xlLndhcm58fGEuY29uc29sZS5sb2cpO3JldHVybiBmJiZmLmNhbGwoYS5jb25zb2xlLGUsZCksYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIGkoYSxiLGMpe3ZhciBkLGU9Yi5wcm90b3R5cGU7ZD1hLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUpLGQuY29uc3RydWN0b3I9YSxkLl9zdXBlcj1lLGMmJmxhKGQsYyl9ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGIsYXJndW1lbnRzKX19ZnVuY3Rpb24gayhhLGIpe3JldHVybiB0eXBlb2YgYT09b2E/YS5hcHBseShiP2JbMF18fGQ6ZCxiKTphfWZ1bmN0aW9uIGwoYSxiKXtyZXR1cm4gYT09PWQ/YjphfWZ1bmN0aW9uIG0oYSxiLGMpe2cocShiKSxmdW5jdGlvbihiKXthLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX0pfWZ1bmN0aW9uIG4oYSxiLGMpe2cocShiKSxmdW5jdGlvbihiKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX0pfWZ1bmN0aW9uIG8oYSxiKXtmb3IoO2E7KXtpZihhPT1iKXJldHVybiEwO2E9YS5wYXJlbnROb2RlfXJldHVybiExfWZ1bmN0aW9uIHAoYSxiKXtyZXR1cm4gYS5pbmRleE9mKGIpPi0xfWZ1bmN0aW9uIHEoYSl7cmV0dXJuIGEudHJpbSgpLnNwbGl0KC9ccysvZyl9ZnVuY3Rpb24gcihhLGIsYyl7aWYoYS5pbmRleE9mJiYhYylyZXR1cm4gYS5pbmRleE9mKGIpO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7KXtpZihjJiZhW2RdW2NdPT1ifHwhYyYmYVtkXT09PWIpcmV0dXJuIGQ7ZCsrfXJldHVybi0xfWZ1bmN0aW9uIHMoYSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCl9ZnVuY3Rpb24gdChhLGIsYyl7Zm9yKHZhciBkPVtdLGU9W10sZj0wO2Y8YS5sZW5ndGg7KXt2YXIgZz1iP2FbZl1bYl06YVtmXTtyKGUsZyk8MCYmZC5wdXNoKGFbZl0pLGVbZl09ZyxmKyt9cmV0dXJuIGMmJihkPWI/ZC5zb3J0KGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFbYl0+Y1tiXX0pOmQuc29ydCgpKSxkfWZ1bmN0aW9uIHUoYSxiKXtmb3IodmFyIGMsZSxmPWJbMF0udG9VcHBlckNhc2UoKStiLnNsaWNlKDEpLGc9MDtnPG1hLmxlbmd0aDspe2lmKGM9bWFbZ10sZT1jP2MrZjpiLGUgaW4gYSlyZXR1cm4gZTtnKyt9cmV0dXJuIGR9ZnVuY3Rpb24gdigpe3JldHVybiB1YSsrfWZ1bmN0aW9uIHcoYil7dmFyIGM9Yi5vd25lckRvY3VtZW50fHxiO3JldHVybiBjLmRlZmF1bHRWaWV3fHxjLnBhcmVudFdpbmRvd3x8YX1mdW5jdGlvbiB4KGEsYil7dmFyIGM9dGhpczt0aGlzLm1hbmFnZXI9YSx0aGlzLmNhbGxiYWNrPWIsdGhpcy5lbGVtZW50PWEuZWxlbWVudCx0aGlzLnRhcmdldD1hLm9wdGlvbnMuaW5wdXRUYXJnZXQsdGhpcy5kb21IYW5kbGVyPWZ1bmN0aW9uKGIpe2soYS5vcHRpb25zLmVuYWJsZSxbYV0pJiZjLmhhbmRsZXIoYil9LHRoaXMuaW5pdCgpfWZ1bmN0aW9uIHkoYSl7dmFyIGIsYz1hLm9wdGlvbnMuaW5wdXRDbGFzcztyZXR1cm4gbmV3KGI9Yz9jOnhhP006eWE/UDp3YT9SOkwpKGEseil9ZnVuY3Rpb24geihhLGIsYyl7dmFyIGQ9Yy5wb2ludGVycy5sZW5ndGgsZT1jLmNoYW5nZWRQb2ludGVycy5sZW5ndGgsZj1iJkVhJiZkLWU9PT0wLGc9YiYoR2F8SGEpJiZkLWU9PT0wO2MuaXNGaXJzdD0hIWYsYy5pc0ZpbmFsPSEhZyxmJiYoYS5zZXNzaW9uPXt9KSxjLmV2ZW50VHlwZT1iLEEoYSxjKSxhLmVtaXQoImhhbW1lci5pbnB1dCIsYyksYS5yZWNvZ25pemUoYyksYS5zZXNzaW9uLnByZXZJbnB1dD1jfWZ1bmN0aW9uIEEoYSxiKXt2YXIgYz1hLnNlc3Npb24sZD1iLnBvaW50ZXJzLGU9ZC5sZW5ndGg7Yy5maXJzdElucHV0fHwoYy5maXJzdElucHV0PUQoYikpLGU+MSYmIWMuZmlyc3RNdWx0aXBsZT9jLmZpcnN0TXVsdGlwbGU9RChiKToxPT09ZSYmKGMuZmlyc3RNdWx0aXBsZT0hMSk7dmFyIGY9Yy5maXJzdElucHV0LGc9Yy5maXJzdE11bHRpcGxlLGg9Zz9nLmNlbnRlcjpmLmNlbnRlcixpPWIuY2VudGVyPUUoZCk7Yi50aW1lU3RhbXA9cmEoKSxiLmRlbHRhVGltZT1iLnRpbWVTdGFtcC1mLnRpbWVTdGFtcCxiLmFuZ2xlPUkoaCxpKSxiLmRpc3RhbmNlPUgoaCxpKSxCKGMsYiksYi5vZmZzZXREaXJlY3Rpb249RyhiLmRlbHRhWCxiLmRlbHRhWSk7dmFyIGo9RihiLmRlbHRhVGltZSxiLmRlbHRhWCxiLmRlbHRhWSk7Yi5vdmVyYWxsVmVsb2NpdHlYPWoueCxiLm92ZXJhbGxWZWxvY2l0eVk9ai55LGIub3ZlcmFsbFZlbG9jaXR5PXFhKGoueCk+cWEoai55KT9qLng6ai55LGIuc2NhbGU9Zz9LKGcucG9pbnRlcnMsZCk6MSxiLnJvdGF0aW9uPWc/SihnLnBvaW50ZXJzLGQpOjAsYi5tYXhQb2ludGVycz1jLnByZXZJbnB1dD9iLnBvaW50ZXJzLmxlbmd0aD5jLnByZXZJbnB1dC5tYXhQb2ludGVycz9iLnBvaW50ZXJzLmxlbmd0aDpjLnByZXZJbnB1dC5tYXhQb2ludGVyczpiLnBvaW50ZXJzLmxlbmd0aCxDKGMsYik7dmFyIGs9YS5lbGVtZW50O28oYi5zcmNFdmVudC50YXJnZXQsaykmJihrPWIuc3JjRXZlbnQudGFyZ2V0KSxiLnRhcmdldD1rfWZ1bmN0aW9uIEIoYSxiKXt2YXIgYz1iLmNlbnRlcixkPWEub2Zmc2V0RGVsdGF8fHt9LGU9YS5wcmV2RGVsdGF8fHt9LGY9YS5wcmV2SW5wdXR8fHt9O2IuZXZlbnRUeXBlIT09RWEmJmYuZXZlbnRUeXBlIT09R2F8fChlPWEucHJldkRlbHRhPXt4OmYuZGVsdGFYfHwwLHk6Zi5kZWx0YVl8fDB9LGQ9YS5vZmZzZXREZWx0YT17eDpjLngseTpjLnl9KSxiLmRlbHRhWD1lLngrKGMueC1kLngpLGIuZGVsdGFZPWUueSsoYy55LWQueSl9ZnVuY3Rpb24gQyhhLGIpe3ZhciBjLGUsZixnLGg9YS5sYXN0SW50ZXJ2YWx8fGIsaT1iLnRpbWVTdGFtcC1oLnRpbWVTdGFtcDtpZihiLmV2ZW50VHlwZSE9SGEmJihpPkRhfHxoLnZlbG9jaXR5PT09ZCkpe3ZhciBqPWIuZGVsdGFYLWguZGVsdGFYLGs9Yi5kZWx0YVktaC5kZWx0YVksbD1GKGksaixrKTtlPWwueCxmPWwueSxjPXFhKGwueCk+cWEobC55KT9sLng6bC55LGc9RyhqLGspLGEubGFzdEludGVydmFsPWJ9ZWxzZSBjPWgudmVsb2NpdHksZT1oLnZlbG9jaXR5WCxmPWgudmVsb2NpdHlZLGc9aC5kaXJlY3Rpb247Yi52ZWxvY2l0eT1jLGIudmVsb2NpdHlYPWUsYi52ZWxvY2l0eVk9ZixiLmRpcmVjdGlvbj1nfWZ1bmN0aW9uIEQoYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEucG9pbnRlcnMubGVuZ3RoOyliW2NdPXtjbGllbnRYOnBhKGEucG9pbnRlcnNbY10uY2xpZW50WCksY2xpZW50WTpwYShhLnBvaW50ZXJzW2NdLmNsaWVudFkpfSxjKys7cmV0dXJue3RpbWVTdGFtcDpyYSgpLHBvaW50ZXJzOmIsY2VudGVyOkUoYiksZGVsdGFYOmEuZGVsdGFYLGRlbHRhWTphLmRlbHRhWX19ZnVuY3Rpb24gRShhKXt2YXIgYj1hLmxlbmd0aDtpZigxPT09YilyZXR1cm57eDpwYShhWzBdLmNsaWVudFgpLHk6cGEoYVswXS5jbGllbnRZKX07Zm9yKHZhciBjPTAsZD0wLGU9MDtiPmU7KWMrPWFbZV0uY2xpZW50WCxkKz1hW2VdLmNsaWVudFksZSsrO3JldHVybnt4OnBhKGMvYikseTpwYShkL2IpfX1mdW5jdGlvbiBGKGEsYixjKXtyZXR1cm57eDpiL2F8fDAseTpjL2F8fDB9fWZ1bmN0aW9uIEcoYSxiKXtyZXR1cm4gYT09PWI/SWE6cWEoYSk+PXFhKGIpPzA+YT9KYTpLYTowPmI/TGE6TWF9ZnVuY3Rpb24gSChhLGIsYyl7Y3x8KGM9UWEpO3ZhciBkPWJbY1swXV0tYVtjWzBdXSxlPWJbY1sxXV0tYVtjWzFdXTtyZXR1cm4gTWF0aC5zcXJ0KGQqZCtlKmUpfWZ1bmN0aW9uIEkoYSxiLGMpe2N8fChjPVFhKTt2YXIgZD1iW2NbMF1dLWFbY1swXV0sZT1iW2NbMV1dLWFbY1sxXV07cmV0dXJuIDE4MCpNYXRoLmF0YW4yKGUsZCkvTWF0aC5QSX1mdW5jdGlvbiBKKGEsYil7cmV0dXJuIEkoYlsxXSxiWzBdLFJhKStJKGFbMV0sYVswXSxSYSl9ZnVuY3Rpb24gSyhhLGIpe3JldHVybiBIKGJbMF0sYlsxXSxSYSkvSChhWzBdLGFbMV0sUmEpfWZ1bmN0aW9uIEwoKXt0aGlzLmV2RWw9VGEsdGhpcy5ldldpbj1VYSx0aGlzLnByZXNzZWQ9ITEseC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gTSgpe3RoaXMuZXZFbD1YYSx0aGlzLmV2V2luPVlhLHguYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuc3RvcmU9dGhpcy5tYW5hZ2VyLnNlc3Npb24ucG9pbnRlckV2ZW50cz1bXX1mdW5jdGlvbiBOKCl7dGhpcy5ldlRhcmdldD0kYSx0aGlzLmV2V2luPV9hLHRoaXMuc3RhcnRlZD0hMSx4LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBPKGEsYil7dmFyIGM9cyhhLnRvdWNoZXMpLGQ9cyhhLmNoYW5nZWRUb3VjaGVzKTtyZXR1cm4gYiYoR2F8SGEpJiYoYz10KGMuY29uY2F0KGQpLCJpZGVudGlmaWVyIiwhMCkpLFtjLGRdfWZ1bmN0aW9uIFAoKXt0aGlzLmV2VGFyZ2V0PWJiLHRoaXMudGFyZ2V0SWRzPXt9LHguYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIFEoYSxiKXt2YXIgYz1zKGEudG91Y2hlcyksZD10aGlzLnRhcmdldElkcztpZihiJihFYXxGYSkmJjE9PT1jLmxlbmd0aClyZXR1cm4gZFtjWzBdLmlkZW50aWZpZXJdPSEwLFtjLGNdO3ZhciBlLGYsZz1zKGEuY2hhbmdlZFRvdWNoZXMpLGg9W10saT10aGlzLnRhcmdldDtpZihmPWMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBvKGEudGFyZ2V0LGkpfSksYj09PUVhKWZvcihlPTA7ZTxmLmxlbmd0aDspZFtmW2VdLmlkZW50aWZpZXJdPSEwLGUrKztmb3IoZT0wO2U8Zy5sZW5ndGg7KWRbZ1tlXS5pZGVudGlmaWVyXSYmaC5wdXNoKGdbZV0pLGImKEdhfEhhKSYmZGVsZXRlIGRbZ1tlXS5pZGVudGlmaWVyXSxlKys7cmV0dXJuIGgubGVuZ3RoP1t0KGYuY29uY2F0KGgpLCJpZGVudGlmaWVyIiwhMCksaF06dm9pZCAwfWZ1bmN0aW9uIFIoKXt4LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgYT1qKHRoaXMuaGFuZGxlcix0aGlzKTt0aGlzLnRvdWNoPW5ldyBQKHRoaXMubWFuYWdlcixhKSx0aGlzLm1vdXNlPW5ldyBMKHRoaXMubWFuYWdlcixhKSx0aGlzLnByaW1hcnlUb3VjaD1udWxsLHRoaXMubGFzdFRvdWNoZXM9W119ZnVuY3Rpb24gUyhhLGIpe2EmRWE/KHRoaXMucHJpbWFyeVRvdWNoPWIuY2hhbmdlZFBvaW50ZXJzWzBdLmlkZW50aWZpZXIsVC5jYWxsKHRoaXMsYikpOmEmKEdhfEhhKSYmVC5jYWxsKHRoaXMsYil9ZnVuY3Rpb24gVChhKXt2YXIgYj1hLmNoYW5nZWRQb2ludGVyc1swXTtpZihiLmlkZW50aWZpZXI9PT10aGlzLnByaW1hcnlUb3VjaCl7dmFyIGM9e3g6Yi5jbGllbnRYLHk6Yi5jbGllbnRZfTt0aGlzLmxhc3RUb3VjaGVzLnB1c2goYyk7dmFyIGQ9dGhpcy5sYXN0VG91Y2hlcyxlPWZ1bmN0aW9uKCl7dmFyIGE9ZC5pbmRleE9mKGMpO2E+LTEmJmQuc3BsaWNlKGEsMSl9O3NldFRpbWVvdXQoZSxjYil9fWZ1bmN0aW9uIFUoYSl7Zm9yKHZhciBiPWEuc3JjRXZlbnQuY2xpZW50WCxjPWEuc3JjRXZlbnQuY2xpZW50WSxkPTA7ZDx0aGlzLmxhc3RUb3VjaGVzLmxlbmd0aDtkKyspe3ZhciBlPXRoaXMubGFzdFRvdWNoZXNbZF0sZj1NYXRoLmFicyhiLWUueCksZz1NYXRoLmFicyhjLWUueSk7aWYoZGI+PWYmJmRiPj1nKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFYoYSxiKXt0aGlzLm1hbmFnZXI9YSx0aGlzLnNldChiKX1mdW5jdGlvbiBXKGEpe2lmKHAoYSxqYikpcmV0dXJuIGpiO3ZhciBiPXAoYSxrYiksYz1wKGEsbGIpO3JldHVybiBiJiZjP2piOmJ8fGM/Yj9rYjpsYjpwKGEsaWIpP2liOmhifWZ1bmN0aW9uIFgoKXtpZighZmIpcmV0dXJuITE7dmFyIGI9e30sYz1hLkNTUyYmYS5DU1Muc3VwcG9ydHM7cmV0dXJuWyJhdXRvIiwibWFuaXB1bGF0aW9uIiwicGFuLXkiLCJwYW4teCIsInBhbi14IHBhbi15Iiwibm9uZSJdLmZvckVhY2goZnVuY3Rpb24oZCl7YltkXT1jP2EuQ1NTLnN1cHBvcnRzKCJ0b3VjaC1hY3Rpb24iLGQpOiEwfSksYn1mdW5jdGlvbiBZKGEpe3RoaXMub3B0aW9ucz1sYSh7fSx0aGlzLmRlZmF1bHRzLGF8fHt9KSx0aGlzLmlkPXYoKSx0aGlzLm1hbmFnZXI9bnVsbCx0aGlzLm9wdGlvbnMuZW5hYmxlPWwodGhpcy5vcHRpb25zLmVuYWJsZSwhMCksdGhpcy5zdGF0ZT1uYix0aGlzLnNpbXVsdGFuZW91cz17fSx0aGlzLnJlcXVpcmVGYWlsPVtdfWZ1bmN0aW9uIFooYSl7cmV0dXJuIGEmc2I/ImNhbmNlbCI6YSZxYj8iZW5kIjphJnBiPyJtb3ZlIjphJm9iPyJzdGFydCI6IiJ9ZnVuY3Rpb24gJChhKXtyZXR1cm4gYT09TWE/ImRvd24iOmE9PUxhPyJ1cCI6YT09SmE/ImxlZnQiOmE9PUthPyJyaWdodCI6IiJ9ZnVuY3Rpb24gXyhhLGIpe3ZhciBjPWIubWFuYWdlcjtyZXR1cm4gYz9jLmdldChhKTphfWZ1bmN0aW9uIGFhKCl7WS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gYmEoKXthYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5wWD1udWxsLHRoaXMucFk9bnVsbH1mdW5jdGlvbiBjYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBkYSgpe1kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3RpbWVyPW51bGwsdGhpcy5faW5wdXQ9bnVsbH1mdW5jdGlvbiBlYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBmYSgpe2FhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBnYSgpe1kuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucFRpbWU9ITEsdGhpcy5wQ2VudGVyPSExLHRoaXMuX3RpbWVyPW51bGwsdGhpcy5faW5wdXQ9bnVsbCx0aGlzLmNvdW50PTB9ZnVuY3Rpb24gaGEoYSxiKXtyZXR1cm4gYj1ifHx7fSxiLnJlY29nbml6ZXJzPWwoYi5yZWNvZ25pemVycyxoYS5kZWZhdWx0cy5wcmVzZXQpLG5ldyBpYShhLGIpfWZ1bmN0aW9uIGlhKGEsYil7dGhpcy5vcHRpb25zPWxhKHt9LGhhLmRlZmF1bHRzLGJ8fHt9KSx0aGlzLm9wdGlvbnMuaW5wdXRUYXJnZXQ9dGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0fHxhLHRoaXMuaGFuZGxlcnM9e30sdGhpcy5zZXNzaW9uPXt9LHRoaXMucmVjb2duaXplcnM9W10sdGhpcy5vbGRDc3NQcm9wcz17fSx0aGlzLmVsZW1lbnQ9YSx0aGlzLmlucHV0PXkodGhpcyksdGhpcy50b3VjaEFjdGlvbj1uZXcgVih0aGlzLHRoaXMub3B0aW9ucy50b3VjaEFjdGlvbiksamEodGhpcywhMCksZyh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hZGQobmV3IGFbMF0oYVsxXSkpO2FbMl0mJmIucmVjb2duaXplV2l0aChhWzJdKSxhWzNdJiZiLnJlcXVpcmVGYWlsdXJlKGFbM10pfSx0aGlzKX1mdW5jdGlvbiBqYShhLGIpe3ZhciBjPWEuZWxlbWVudDtpZihjLnN0eWxlKXt2YXIgZDtnKGEub3B0aW9ucy5jc3NQcm9wcyxmdW5jdGlvbihlLGYpe2Q9dShjLnN0eWxlLGYpLGI/KGEub2xkQ3NzUHJvcHNbZF09Yy5zdHlsZVtkXSxjLnN0eWxlW2RdPWUpOmMuc3R5bGVbZF09YS5vbGRDc3NQcm9wc1tkXXx8IiJ9KSxifHwoYS5vbGRDc3NQcm9wcz17fSl9fWZ1bmN0aW9uIGthKGEsYyl7dmFyIGQ9Yi5jcmVhdGVFdmVudCgiRXZlbnQiKTtkLmluaXRFdmVudChhLCEwLCEwKSxkLmdlc3R1cmU9YyxjLnRhcmdldC5kaXNwYXRjaEV2ZW50KGQpfXZhciBsYSxtYT1bIiIsIndlYmtpdCIsIk1veiIsIk1TIiwibXMiLCJvIl0sbmE9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxvYT0iZnVuY3Rpb24iLHBhPU1hdGgucm91bmQscWE9TWF0aC5hYnMscmE9RGF0ZS5ub3c7bGE9ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5hc3NpZ24/ZnVuY3Rpb24oYSl7aWYoYT09PWR8fG51bGw9PT1hKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpO2Zvcih2YXIgYj1PYmplY3QoYSksYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspe3ZhciBlPWFyZ3VtZW50c1tjXTtpZihlIT09ZCYmbnVsbCE9PWUpZm9yKHZhciBmIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShmKSYmKGJbZl09ZVtmXSl9cmV0dXJuIGJ9Ok9iamVjdC5hc3NpZ247dmFyIHNhPWgoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZT1PYmplY3Qua2V5cyhiKSxmPTA7ZjxlLmxlbmd0aDspKCFjfHxjJiZhW2VbZl1dPT09ZCkmJihhW2VbZl1dPWJbZVtmXV0pLGYrKztyZXR1cm4gYX0sImV4dGVuZCIsIlVzZSBgYXNzaWduYC4iKSx0YT1oKGZ1bmN0aW9uKGEsYil7cmV0dXJuIHNhKGEsYiwhMCl9LCJtZXJnZSIsIlVzZSBgYXNzaWduYC4iKSx1YT0xLHZhPS9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaSx3YT0ib250b3VjaHN0YXJ0ImluIGEseGE9dShhLCJQb2ludGVyRXZlbnQiKSE9PWQseWE9d2EmJnZhLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksemE9InRvdWNoIixBYT0icGVuIixCYT0ibW91c2UiLENhPSJraW5lY3QiLERhPTI1LEVhPTEsRmE9MixHYT00LEhhPTgsSWE9MSxKYT0yLEthPTQsTGE9OCxNYT0xNixOYT1KYXxLYSxPYT1MYXxNYSxQYT1OYXxPYSxRYT1bIngiLCJ5Il0sUmE9WyJjbGllbnRYIiwiY2xpZW50WSJdO3gucHJvdG90eXBlPXtoYW5kbGVyOmZ1bmN0aW9uKCl7fSxpbml0OmZ1bmN0aW9uKCl7dGhpcy5ldkVsJiZtKHRoaXMuZWxlbWVudCx0aGlzLmV2RWwsdGhpcy5kb21IYW5kbGVyKSx0aGlzLmV2VGFyZ2V0JiZtKHRoaXMudGFyZ2V0LHRoaXMuZXZUYXJnZXQsdGhpcy5kb21IYW5kbGVyKSx0aGlzLmV2V2luJiZtKHcodGhpcy5lbGVtZW50KSx0aGlzLmV2V2luLHRoaXMuZG9tSGFuZGxlcil9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJm4odGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJm4odGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJm4odyh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX19O3ZhciBTYT17bW91c2Vkb3duOkVhLG1vdXNlbW92ZTpGYSxtb3VzZXVwOkdhfSxUYT0ibW91c2Vkb3duIixVYT0ibW91c2Vtb3ZlIG1vdXNldXAiO2koTCx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPVNhW2EudHlwZV07YiZFYSYmMD09PWEuYnV0dG9uJiYodGhpcy5wcmVzc2VkPSEwKSxiJkZhJiYxIT09YS53aGljaCYmKGI9R2EpLHRoaXMucHJlc3NlZCYmKGImR2EmJih0aGlzLnByZXNzZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOlthXSxjaGFuZ2VkUG9pbnRlcnM6W2FdLHBvaW50ZXJUeXBlOkJhLHNyY0V2ZW50OmF9KSl9fSk7dmFyIFZhPXtwb2ludGVyZG93bjpFYSxwb2ludGVybW92ZTpGYSxwb2ludGVydXA6R2EscG9pbnRlcmNhbmNlbDpIYSxwb2ludGVyb3V0OkhhfSxXYT17Mjp6YSwzOkFhLDQ6QmEsNTpDYX0sWGE9InBvaW50ZXJkb3duIixZYT0icG9pbnRlcm1vdmUgcG9pbnRlcnVwIHBvaW50ZXJjYW5jZWwiO2EuTVNQb2ludGVyRXZlbnQmJiFhLlBvaW50ZXJFdmVudCYmKFhhPSJNU1BvaW50ZXJEb3duIixZYT0iTVNQb2ludGVyTW92ZSBNU1BvaW50ZXJVcCBNU1BvaW50ZXJDYW5jZWwiKSxpKE0seCx7aGFuZGxlcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnN0b3JlLGM9ITEsZD1hLnR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCJtcyIsIiIpLGU9VmFbZF0sZj1XYVthLnBvaW50ZXJUeXBlXXx8YS5wb2ludGVyVHlwZSxnPWY9PXphLGg9cihiLGEucG9pbnRlcklkLCJwb2ludGVySWQiKTtlJkVhJiYoMD09PWEuYnV0dG9ufHxnKT8wPmgmJihiLnB1c2goYSksaD1iLmxlbmd0aC0xKTplJihHYXxIYSkmJihjPSEwKSwwPmh8fChiW2hdPWEsdGhpcy5jYWxsYmFjayh0aGlzLm1hbmFnZXIsZSx7cG9pbnRlcnM6YixjaGFuZ2VkUG9pbnRlcnM6W2FdLHBvaW50ZXJUeXBlOmYsc3JjRXZlbnQ6YX0pLGMmJmIuc3BsaWNlKGgsMSkpfX0pO3ZhciBaYT17dG91Y2hzdGFydDpFYSx0b3VjaG1vdmU6RmEsdG91Y2hlbmQ6R2EsdG91Y2hjYW5jZWw6SGF9LCRhPSJ0b3VjaHN0YXJ0IixfYT0idG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwiO2koTix4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPVphW2EudHlwZV07aWYoYj09PUVhJiYodGhpcy5zdGFydGVkPSEwKSx0aGlzLnN0YXJ0ZWQpe3ZhciBjPU8uY2FsbCh0aGlzLGEsYik7YiYoR2F8SGEpJiZjWzBdLmxlbmd0aC1jWzFdLmxlbmd0aD09PTAmJih0aGlzLnN0YXJ0ZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOmNbMF0sY2hhbmdlZFBvaW50ZXJzOmNbMV0scG9pbnRlclR5cGU6emEsc3JjRXZlbnQ6YX0pfX19KTt2YXIgYWI9e3RvdWNoc3RhcnQ6RWEsdG91Y2htb3ZlOkZhLHRvdWNoZW5kOkdhLHRvdWNoY2FuY2VsOkhhfSxiYj0idG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwiO2koUCx4LHtoYW5kbGVyOmZ1bmN0aW9uKGEpe3ZhciBiPWFiW2EudHlwZV0sYz1RLmNhbGwodGhpcyxhLGIpO2MmJnRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGIse3BvaW50ZXJzOmNbMF0sY2hhbmdlZFBvaW50ZXJzOmNbMV0scG9pbnRlclR5cGU6emEsc3JjRXZlbnQ6YX0pfX0pO3ZhciBjYj0yNTAwLGRiPTI1O2koUix4LHtoYW5kbGVyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1jLnBvaW50ZXJUeXBlPT16YSxlPWMucG9pbnRlclR5cGU9PUJhO2lmKCEoZSYmYy5zb3VyY2VDYXBhYmlsaXRpZXMmJmMuc291cmNlQ2FwYWJpbGl0aWVzLmZpcmVzVG91Y2hFdmVudHMpKXtpZihkKVMuY2FsbCh0aGlzLGIsYyk7ZWxzZSBpZihlJiZVLmNhbGwodGhpcyxjKSlyZXR1cm47dGhpcy5jYWxsYmFjayhhLGIsYyl9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy50b3VjaC5kZXN0cm95KCksdGhpcy5tb3VzZS5kZXN0cm95KCl9fSk7dmFyIGViPXUobmEuc3R5bGUsInRvdWNoQWN0aW9uIiksZmI9ZWIhPT1kLGdiPSJjb21wdXRlIixoYj0iYXV0byIsaWI9Im1hbmlwdWxhdGlvbiIsamI9Im5vbmUiLGtiPSJwYW4teCIsbGI9InBhbi15IixtYj1YKCk7Vi5wcm90b3R5cGU9e3NldDpmdW5jdGlvbihhKXthPT1nYiYmKGE9dGhpcy5jb21wdXRlKCkpLGZiJiZ0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZSYmbWJbYV0mJih0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZVtlYl09YSksdGhpcy5hY3Rpb25zPWEudG9Mb3dlckNhc2UoKS50cmltKCl9LHVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuc2V0KHRoaXMubWFuYWdlci5vcHRpb25zLnRvdWNoQWN0aW9uKX0sY29tcHV0ZTpmdW5jdGlvbigpe3ZhciBhPVtdO3JldHVybiBnKHRoaXMubWFuYWdlci5yZWNvZ25pemVycyxmdW5jdGlvbihiKXtrKGIub3B0aW9ucy5lbmFibGUsW2JdKSYmKGE9YS5jb25jYXQoYi5nZXRUb3VjaEFjdGlvbigpKSl9KSxXKGEuam9pbigiICIpKX0scHJldmVudERlZmF1bHRzOmZ1bmN0aW9uKGEpe3ZhciBiPWEuc3JjRXZlbnQsYz1hLm9mZnNldERpcmVjdGlvbjtpZih0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQpcmV0dXJuIHZvaWQgYi5wcmV2ZW50RGVmYXVsdCgpO3ZhciBkPXRoaXMuYWN0aW9ucyxlPXAoZCxqYikmJiFtYltqYl0sZj1wKGQsbGIpJiYhbWJbbGJdLGc9cChkLGtiKSYmIW1iW2tiXTtpZihlKXt2YXIgaD0xPT09YS5wb2ludGVycy5sZW5ndGgsaT1hLmRpc3RhbmNlPDIsaj1hLmRlbHRhVGltZTwyNTA7aWYoaCYmaSYmailyZXR1cm59cmV0dXJuIGcmJmY/dm9pZCAwOmV8fGYmJmMmTmF8fGcmJmMmT2E/dGhpcy5wcmV2ZW50U3JjKGIpOnZvaWQgMH0scHJldmVudFNyYzpmdW5jdGlvbihhKXt0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQ9ITAsYS5wcmV2ZW50RGVmYXVsdCgpfX07dmFyIG5iPTEsb2I9MixwYj00LHFiPTgscmI9cWIsc2I9MTYsdGI9MzI7WS5wcm90b3R5cGU9e2RlZmF1bHRzOnt9LHNldDpmdW5jdGlvbihhKXtyZXR1cm4gbGEodGhpcy5vcHRpb25zLGEpLHRoaXMubWFuYWdlciYmdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpLHRoaXN9LHJlY29nbml6ZVdpdGg6ZnVuY3Rpb24oYSl7aWYoZihhLCJyZWNvZ25pemVXaXRoIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgYj10aGlzLnNpbXVsdGFuZW91cztyZXR1cm4gYT1fKGEsdGhpcyksYlthLmlkXXx8KGJbYS5pZF09YSxhLnJlY29nbml6ZVdpdGgodGhpcykpLHRoaXN9LGRyb3BSZWNvZ25pemVXaXRoOmZ1bmN0aW9uKGEpe3JldHVybiBmKGEsImRyb3BSZWNvZ25pemVXaXRoIix0aGlzKT90aGlzOihhPV8oYSx0aGlzKSxkZWxldGUgdGhpcy5zaW11bHRhbmVvdXNbYS5pZF0sdGhpcyl9LHJlcXVpcmVGYWlsdXJlOmZ1bmN0aW9uKGEpe2lmKGYoYSwicmVxdWlyZUZhaWx1cmUiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBiPXRoaXMucmVxdWlyZUZhaWw7cmV0dXJuIGE9XyhhLHRoaXMpLC0xPT09cihiLGEpJiYoYi5wdXNoKGEpLGEucmVxdWlyZUZhaWx1cmUodGhpcykpLHRoaXN9LGRyb3BSZXF1aXJlRmFpbHVyZTpmdW5jdGlvbihhKXtpZihmKGEsImRyb3BSZXF1aXJlRmFpbHVyZSIsdGhpcykpcmV0dXJuIHRoaXM7YT1fKGEsdGhpcyk7dmFyIGI9cih0aGlzLnJlcXVpcmVGYWlsLGEpO3JldHVybiBiPi0xJiZ0aGlzLnJlcXVpcmVGYWlsLnNwbGljZShiLDEpLHRoaXN9LGhhc1JlcXVpcmVGYWlsdXJlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcXVpcmVGYWlsLmxlbmd0aD4wfSxjYW5SZWNvZ25pemVXaXRoOmZ1bmN0aW9uKGEpe3JldHVybiEhdGhpcy5zaW11bHRhbmVvdXNbYS5pZF19LGVtaXQ6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtjLm1hbmFnZXIuZW1pdChiLGEpfXZhciBjPXRoaXMsZD10aGlzLnN0YXRlO3FiPmQmJmIoYy5vcHRpb25zLmV2ZW50K1ooZCkpLGIoYy5vcHRpb25zLmV2ZW50KSxhLmFkZGl0aW9uYWxFdmVudCYmYihhLmFkZGl0aW9uYWxFdmVudCksZD49cWImJmIoYy5vcHRpb25zLmV2ZW50K1ooZCkpfSx0cnlFbWl0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNhbkVtaXQoKT90aGlzLmVtaXQoYSk6dm9pZCh0aGlzLnN0YXRlPXRiKX0sY2FuRW1pdDpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg7KXtpZighKHRoaXMucmVxdWlyZUZhaWxbYV0uc3RhdGUmKHRifG5iKSkpcmV0dXJuITE7YSsrfXJldHVybiEwfSxyZWNvZ25pemU6ZnVuY3Rpb24oYSl7dmFyIGI9bGEoe30sYSk7cmV0dXJuIGsodGhpcy5vcHRpb25zLmVuYWJsZSxbdGhpcyxiXSk/KHRoaXMuc3RhdGUmKHJifHNifHRiKSYmKHRoaXMuc3RhdGU9bmIpLHRoaXMuc3RhdGU9dGhpcy5wcm9jZXNzKGIpLHZvaWQodGhpcy5zdGF0ZSYob2J8cGJ8cWJ8c2IpJiZ0aGlzLnRyeUVtaXQoYikpKToodGhpcy5yZXNldCgpLHZvaWQodGhpcy5zdGF0ZT10YikpfSxwcm9jZXNzOmZ1bmN0aW9uKGEpe30sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt9LHJlc2V0OmZ1bmN0aW9uKCl7fX0saShhYSxZLHtkZWZhdWx0czp7cG9pbnRlcnM6MX0sYXR0clRlc3Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLnBvaW50ZXJzO3JldHVybiAwPT09Ynx8YS5wb2ludGVycy5sZW5ndGg9PT1ifSxwcm9jZXNzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuc3RhdGUsYz1hLmV2ZW50VHlwZSxkPWImKG9ifHBiKSxlPXRoaXMuYXR0clRlc3QoYSk7cmV0dXJuIGQmJihjJkhhfHwhZSk/YnxzYjpkfHxlP2MmR2E/YnxxYjpiJm9iP2J8cGI6b2I6dGJ9fSksaShiYSxhYSx7ZGVmYXVsdHM6e2V2ZW50OiJwYW4iLHRocmVzaG9sZDoxMCxwb2ludGVyczoxLGRpcmVjdGlvbjpQYX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uLGI9W107cmV0dXJuIGEmTmEmJmIucHVzaChsYiksYSZPYSYmYi5wdXNoKGtiKSxifSxkaXJlY3Rpb25UZXN0OmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucyxjPSEwLGQ9YS5kaXN0YW5jZSxlPWEuZGlyZWN0aW9uLGY9YS5kZWx0YVgsZz1hLmRlbHRhWTtyZXR1cm4gZSZiLmRpcmVjdGlvbnx8KGIuZGlyZWN0aW9uJk5hPyhlPTA9PT1mP0lhOjA+Zj9KYTpLYSxjPWYhPXRoaXMucFgsZD1NYXRoLmFicyhhLmRlbHRhWCkpOihlPTA9PT1nP0lhOjA+Zz9MYTpNYSxjPWchPXRoaXMucFksZD1NYXRoLmFicyhhLmRlbHRhWSkpKSxhLmRpcmVjdGlvbj1lLGMmJmQ+Yi50aHJlc2hvbGQmJmUmYi5kaXJlY3Rpb259LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3JldHVybiBhYS5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLGEpJiYodGhpcy5zdGF0ZSZvYnx8ISh0aGlzLnN0YXRlJm9iKSYmdGhpcy5kaXJlY3Rpb25UZXN0KGEpKX0sZW1pdDpmdW5jdGlvbihhKXt0aGlzLnBYPWEuZGVsdGFYLHRoaXMucFk9YS5kZWx0YVk7dmFyIGI9JChhLmRpcmVjdGlvbik7YiYmKGEuYWRkaXRpb25hbEV2ZW50PXRoaXMub3B0aW9ucy5ldmVudCtiKSx0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcyxhKX19KSxpKGNhLGFhLHtkZWZhdWx0czp7ZXZlbnQ6InBpbmNoIix0aHJlc2hvbGQ6MCxwb2ludGVyczoyfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltqYl19LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJihNYXRoLmFicyhhLnNjYWxlLTEpPnRoaXMub3B0aW9ucy50aHJlc2hvbGR8fHRoaXMuc3RhdGUmb2IpfSxlbWl0OmZ1bmN0aW9uKGEpe2lmKDEhPT1hLnNjYWxlKXt2YXIgYj1hLnNjYWxlPDE/ImluIjoib3V0IjthLmFkZGl0aW9uYWxFdmVudD10aGlzLm9wdGlvbnMuZXZlbnQrYn10aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcyxhKX19KSxpKGRhLFkse2RlZmF1bHRzOntldmVudDoicHJlc3MiLHBvaW50ZXJzOjEsdGltZToyNTEsdGhyZXNob2xkOjl9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2hiXX0scHJvY2VzczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMsYz1hLnBvaW50ZXJzLmxlbmd0aD09PWIucG9pbnRlcnMsZD1hLmRpc3RhbmNlPGIudGhyZXNob2xkLGY9YS5kZWx0YVRpbWU+Yi50aW1lO2lmKHRoaXMuX2lucHV0PWEsIWR8fCFjfHxhLmV2ZW50VHlwZSYoR2F8SGEpJiYhZil0aGlzLnJlc2V0KCk7ZWxzZSBpZihhLmV2ZW50VHlwZSZFYSl0aGlzLnJlc2V0KCksdGhpcy5fdGltZXI9ZShmdW5jdGlvbigpe3RoaXMuc3RhdGU9cmIsdGhpcy50cnlFbWl0KCl9LGIudGltZSx0aGlzKTtlbHNlIGlmKGEuZXZlbnRUeXBlJkdhKXJldHVybiByYjtyZXR1cm4gdGJ9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbihhKXt0aGlzLnN0YXRlPT09cmImJihhJiZhLmV2ZW50VHlwZSZHYT90aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQrInVwIixhKToodGhpcy5faW5wdXQudGltZVN0YW1wPXJhKCksdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHRoaXMuX2lucHV0KSkpfX0pLGkoZWEsYWEse2RlZmF1bHRzOntldmVudDoicm90YXRlIix0aHJlc2hvbGQ6MCxwb2ludGVyczoyfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltqYl19LGF0dHJUZXN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJihNYXRoLmFicyhhLnJvdGF0aW9uKT50aGlzLm9wdGlvbnMudGhyZXNob2xkfHx0aGlzLnN0YXRlJm9iKX19KSxpKGZhLGFhLHtkZWZhdWx0czp7ZXZlbnQ6InN3aXBlIix0aHJlc2hvbGQ6MTAsdmVsb2NpdHk6LjMsZGlyZWN0aW9uOk5hfE9hLHBvaW50ZXJzOjF9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGJhLnByb3RvdHlwZS5nZXRUb3VjaEFjdGlvbi5jYWxsKHRoaXMpfSxhdHRyVGVzdDpmdW5jdGlvbihhKXt2YXIgYixjPXRoaXMub3B0aW9ucy5kaXJlY3Rpb247cmV0dXJuIGMmKE5hfE9hKT9iPWEub3ZlcmFsbFZlbG9jaXR5OmMmTmE/Yj1hLm92ZXJhbGxWZWxvY2l0eVg6YyZPYSYmKGI9YS5vdmVyYWxsVmVsb2NpdHlZKSx0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsYSkmJmMmYS5vZmZzZXREaXJlY3Rpb24mJmEuZGlzdGFuY2U+dGhpcy5vcHRpb25zLnRocmVzaG9sZCYmYS5tYXhQb2ludGVycz09dGhpcy5vcHRpb25zLnBvaW50ZXJzJiZxYShiKT50aGlzLm9wdGlvbnMudmVsb2NpdHkmJmEuZXZlbnRUeXBlJkdhfSxlbWl0OmZ1bmN0aW9uKGEpe3ZhciBiPSQoYS5vZmZzZXREaXJlY3Rpb24pO2ImJnRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCtiLGEpLHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCxhKX19KSxpKGdhLFkse2RlZmF1bHRzOntldmVudDoidGFwIixwb2ludGVyczoxLHRhcHM6MSxpbnRlcnZhbDozMDAsdGltZToyNTAsdGhyZXNob2xkOjkscG9zVGhyZXNob2xkOjEwfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVybltpYl19LHByb2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLGM9YS5wb2ludGVycy5sZW5ndGg9PT1iLnBvaW50ZXJzLGQ9YS5kaXN0YW5jZTxiLnRocmVzaG9sZCxmPWEuZGVsdGFUaW1lPGIudGltZTtpZih0aGlzLnJlc2V0KCksYS5ldmVudFR5cGUmRWEmJjA9PT10aGlzLmNvdW50KXJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7aWYoZCYmZiYmYyl7aWYoYS5ldmVudFR5cGUhPUdhKXJldHVybiB0aGlzLmZhaWxUaW1lb3V0KCk7dmFyIGc9dGhpcy5wVGltZT9hLnRpbWVTdGFtcC10aGlzLnBUaW1lPGIuaW50ZXJ2YWw6ITAsaD0hdGhpcy5wQ2VudGVyfHxIKHRoaXMucENlbnRlcixhLmNlbnRlcik8Yi5wb3NUaHJlc2hvbGQ7dGhpcy5wVGltZT1hLnRpbWVTdGFtcCx0aGlzLnBDZW50ZXI9YS5jZW50ZXIsaCYmZz90aGlzLmNvdW50Kz0xOnRoaXMuY291bnQ9MSx0aGlzLl9pbnB1dD1hO3ZhciBpPXRoaXMuY291bnQlYi50YXBzO2lmKDA9PT1pKXJldHVybiB0aGlzLmhhc1JlcXVpcmVGYWlsdXJlcygpPyh0aGlzLl90aW1lcj1lKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1yYix0aGlzLnRyeUVtaXQoKX0sYi5pbnRlcnZhbCx0aGlzKSxvYik6cmJ9cmV0dXJuIHRifSxmYWlsVGltZW91dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90aW1lcj1lKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT10Yn0sdGhpcy5vcHRpb25zLmludGVydmFsLHRoaXMpLHRifSxyZXNldDpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLl90aW1lcil9LGVtaXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXRlPT1yYiYmKHRoaXMuX2lucHV0LnRhcENvdW50PXRoaXMuY291bnQsdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHRoaXMuX2lucHV0KSl9fSksaGEuVkVSU0lPTj0iMi4wLjgiLGhhLmRlZmF1bHRzPXtkb21FdmVudHM6ITEsdG91Y2hBY3Rpb246Z2IsZW5hYmxlOiEwLGlucHV0VGFyZ2V0Om51bGwsaW5wdXRDbGFzczpudWxsLHByZXNldDpbW2VhLHtlbmFibGU6ITF9XSxbY2Ese2VuYWJsZTohMX0sWyJyb3RhdGUiXV0sW2ZhLHtkaXJlY3Rpb246TmF9XSxbYmEse2RpcmVjdGlvbjpOYX0sWyJzd2lwZSJdXSxbZ2FdLFtnYSx7ZXZlbnQ6ImRvdWJsZXRhcCIsdGFwczoyfSxbInRhcCJdXSxbZGFdXSxjc3NQcm9wczp7dXNlclNlbGVjdDoibm9uZSIsdG91Y2hTZWxlY3Q6Im5vbmUiLHRvdWNoQ2FsbG91dDoibm9uZSIsY29udGVudFpvb21pbmc6Im5vbmUiLHVzZXJEcmFnOiJub25lIix0YXBIaWdobGlnaHRDb2xvcjoicmdiYSgwLDAsMCwwKSJ9fTt2YXIgdWI9MSx2Yj0yO2lhLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKGEpe3JldHVybiBsYSh0aGlzLm9wdGlvbnMsYSksYS50b3VjaEFjdGlvbiYmdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSxhLmlucHV0VGFyZ2V0JiYodGhpcy5pbnB1dC5kZXN0cm95KCksdGhpcy5pbnB1dC50YXJnZXQ9YS5pbnB1dFRhcmdldCx0aGlzLmlucHV0LmluaXQoKSksdGhpc30sc3RvcDpmdW5jdGlvbihhKXt0aGlzLnNlc3Npb24uc3RvcHBlZD1hP3ZiOnVifSxyZWNvZ25pemU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5zZXNzaW9uO2lmKCFiLnN0b3BwZWQpe3RoaXMudG91Y2hBY3Rpb24ucHJldmVudERlZmF1bHRzKGEpO3ZhciBjLGQ9dGhpcy5yZWNvZ25pemVycyxlPWIuY3VyUmVjb2duaXplcjsoIWV8fGUmJmUuc3RhdGUmcmIpJiYoZT1iLmN1clJlY29nbml6ZXI9bnVsbCk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDspYz1kW2ZdLGIuc3RvcHBlZD09PXZifHxlJiZjIT1lJiYhYy5jYW5SZWNvZ25pemVXaXRoKGUpP2MucmVzZXQoKTpjLnJlY29nbml6ZShhKSwhZSYmYy5zdGF0ZSYob2J8cGJ8cWIpJiYoZT1iLmN1clJlY29nbml6ZXI9YyksZisrfX0sZ2V0OmZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBZKXJldHVybiBhO2Zvcih2YXIgYj10aGlzLnJlY29nbml6ZXJzLGM9MDtjPGIubGVuZ3RoO2MrKylpZihiW2NdLm9wdGlvbnMuZXZlbnQ9PWEpcmV0dXJuIGJbY107cmV0dXJuIG51bGx9LGFkZDpmdW5jdGlvbihhKXtpZihmKGEsImFkZCIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5nZXQoYS5vcHRpb25zLmV2ZW50KTtyZXR1cm4gYiYmdGhpcy5yZW1vdmUoYiksdGhpcy5yZWNvZ25pemVycy5wdXNoKGEpLGEubWFuYWdlcj10aGlzLHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksYX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2lmKGYoYSwicmVtb3ZlIix0aGlzKSlyZXR1cm4gdGhpcztpZihhPXRoaXMuZ2V0KGEpKXt2YXIgYj10aGlzLnJlY29nbml6ZXJzLGM9cihiLGEpOy0xIT09YyYmKGIuc3BsaWNlKGMsMSksdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSl9cmV0dXJuIHRoaXN9LG9uOmZ1bmN0aW9uKGEsYil7aWYoYSE9PWQmJmIhPT1kKXt2YXIgYz10aGlzLmhhbmRsZXJzO3JldHVybiBnKHEoYSksZnVuY3Rpb24oYSl7Y1thXT1jW2FdfHxbXSxjW2FdLnB1c2goYil9KSx0aGlzfX0sb2ZmOmZ1bmN0aW9uKGEsYil7aWYoYSE9PWQpe3ZhciBjPXRoaXMuaGFuZGxlcnM7cmV0dXJuIGcocShhKSxmdW5jdGlvbihhKXtiP2NbYV0mJmNbYV0uc3BsaWNlKHIoY1thXSxiKSwxKTpkZWxldGUgY1thXX0pLHRoaXN9fSxlbWl0OmZ1bmN0aW9uKGEsYil7dGhpcy5vcHRpb25zLmRvbUV2ZW50cyYma2EoYSxiKTt2YXIgYz10aGlzLmhhbmRsZXJzW2FdJiZ0aGlzLmhhbmRsZXJzW2FdLnNsaWNlKCk7aWYoYyYmYy5sZW5ndGgpe2IudHlwZT1hLGIucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXtiLnNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCl9O2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7KWNbZF0oYiksZCsrfX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudCYmamEodGhpcywhMSksdGhpcy5oYW5kbGVycz17fSx0aGlzLnNlc3Npb249e30sdGhpcy5pbnB1dC5kZXN0cm95KCksdGhpcy5lbGVtZW50PW51bGx9fSxsYShoYSx7SU5QVVRfU1RBUlQ6RWEsSU5QVVRfTU9WRTpGYSxJTlBVVF9FTkQ6R2EsSU5QVVRfQ0FOQ0VMOkhhLFNUQVRFX1BPU1NJQkxFOm5iLFNUQVRFX0JFR0FOOm9iLFNUQVRFX0NIQU5HRUQ6cGIsU1RBVEVfRU5ERUQ6cWIsU1RBVEVfUkVDT0dOSVpFRDpyYixTVEFURV9DQU5DRUxMRUQ6c2IsU1RBVEVfRkFJTEVEOnRiLERJUkVDVElPTl9OT05FOklhLERJUkVDVElPTl9MRUZUOkphLERJUkVDVElPTl9SSUdIVDpLYSxESVJFQ1RJT05fVVA6TGEsRElSRUNUSU9OX0RPV046TWEsRElSRUNUSU9OX0hPUklaT05UQUw6TmEsRElSRUNUSU9OX1ZFUlRJQ0FMOk9hLERJUkVDVElPTl9BTEw6UGEsTWFuYWdlcjppYSxJbnB1dDp4LFRvdWNoQWN0aW9uOlYsVG91Y2hJbnB1dDpQLE1vdXNlSW5wdXQ6TCxQb2ludGVyRXZlbnRJbnB1dDpNLFRvdWNoTW91c2VJbnB1dDpSLFNpbmdsZVRvdWNoSW5wdXQ6TixSZWNvZ25pemVyOlksQXR0clJlY29nbml6ZXI6YWEsVGFwOmdhLFBhbjpiYSxTd2lwZTpmYSxQaW5jaDpjYSxSb3RhdGU6ZWEsUHJlc3M6ZGEsb246bSxvZmY6bixlYWNoOmcsbWVyZ2U6dGEsZXh0ZW5kOnNhLGFzc2lnbjpsYSxpbmhlcml0OmksYmluZEZuOmoscHJlZml4ZWQ6dX0pO3ZhciB3Yj0idW5kZWZpbmVkIiE9dHlwZW9mIGE/YToidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTt3Yi5IYW1tZXI9aGEsImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gaGF9KToidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9aGE6YVtjXT1oYX0od2luZG93LGRvY3VtZW50LCJIYW1tZXIiKTsKZnVuY3Rpb24gdDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1Zhcih0KXt0cnl7dmFyIGUsYT0vdmFyXCgoLS11Yy0oW14tXSspLShbXi1dKyktKFteLF0rKSksXHM/KC4qKVwpLy5leGVjKHQpO2lmKCFhKXJldHVybjt2YXIgbj1hWzBdLGk9YVsxXSxyPWFbMl0sbz1hWzNdLGw9YVs0XSxzPWFbNV0sXyxjO2lmKCEobiYmciYmbyYmbCYmcykpcmV0dXJuO3JldHVybntwYXJlbnQ6e2lkOmwsdHlwZTpyfSxmYWxsYmFjazp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKGkpfHxzLGZpZWxkOm99fWNhdGNoKGQpe2NvbnNvbGUuZXJyb3IoIkVycm9yIHRyeWluZyB0byBwYXJzZSBDU1MgVmFyaWFibGUiKX19ZnVuY3Rpb24gdDM5Nl9faGV4MnJnYmEodCxlKXtpZighdClyZXR1cm4hMTt2YXIgYT10Mzk2X19wYXJzZUdsb2JhbFN0eWxlQ1NTVmFyKHQpO2EmJih0PWEuZmFsbGJhY2spO3ZhciBuPXQucmVwbGFjZSgvIy8sIiIpO2lmKDM9PT1uLmxlbmd0aCl7dmFyIGk9blswXSxyPW5bMV0sbz1uWzJdO3Q9IiMiK2kraStyK3IrbytvfXZhciBsPXBhcnNlSW50KHQuc3Vic3RyaW5nKDEpLDE2KSxzLF8sYztyZXR1cm5bKDE2NzExNjgwJmwpPj4xNiwoNjUyODAmbCk+PjgsMjU1JmwscGFyc2VGbG9hdChlKV19ZnVuY3Rpb24gdDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KXt2YXIgZT1bImdhbGxlcnkiXSxhPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3JldHVybiBlLmluY2x1ZGVzKGEpfWZ1bmN0aW9uIHQzOTZfX2lzRmxleCh0KXt2YXIgZT10LmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmQtZmxleCIpLGE9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2dyb3VwLWZsZXgiKTtyZXR1cm4gZXx8YX1mdW5jdGlvbiB0Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3Jkcygpe3ZhciB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7aWYodCl7dmFyIGU9WyIudDk1MV9fc2lkZWJhcl9zdGlja3kiLCIudDEyMDZfX2NvbnRlbnRfc3RpY2t5IiwiLnQ3NTRfX2NvbF9maXhlZCIsIi50Nzc2X19jb2xfZml4ZWQiLCIudDc4Nl9fY29sX2ZpeGVkIiwiLnQtc3RvcmVfX3Byb2QtcG9wdXBfX2NvbF9maXhlZCJdO3QzOTZfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZSgpO3ZhciBhPUJvb2xlYW4oZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLmpvaW4oIiwgIikpKTt0LmNsYXNzTGlzdC5yZW1vdmUoInQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCIsInQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIiksdC5jbGFzc0xpc3QuYWRkKGE/InQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCI6InQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIil9fWZ1bmN0aW9uIHQzOTZfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZSgpe2lmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidDM5Nl9fb3ZlcmZsb3ctc3R5bGVzIikpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC5pZD0idDM5Nl9fb3ZlcmZsb3ctc3R5bGVzIix0LmlubmVySFRNTD0iLnQtcmVjb3Jkc19fb3ZlcmZsb3ctY2xpcCB7IG92ZXJmbG93OiBjbGlwOyB9XG5cdFx0XHRcdFx0XHQudC1yZWNvcmRzX19vdmVyZmxvdy1oaWRkZW4geyBvdmVyZmxvdzogaGlkZGVuOyB9Iixkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHQpfX1mdW5jdGlvbiB0Mzk2X19nZXRBcnRib2FyZHModCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxhLG49ZSYmImVkaXQiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpPycucmVjb3JkW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl0gLnI6bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJlY29yZFtkYXRhLXBhcmVudHRwbGlkPSInK3QrJyJdIC5yOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnOicucltkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yW2RhdGEtcGFyZW50dHBsaWQ9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCc7cmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChuKSl9ZnVuY3Rpb24gdDM5Nl9fZ2V0WmVyb0Jsb2Nrcygpe3ZhciB0PVtdLmNvbmNhdCh0Mzk2X19nZXRBcnRib2FyZHMoIjM5NiIpLHQzOTZfX2dldEFydGJvYXJkcygiMTIxIikpLGU7cmV0dXJuIHQubGVuZ3RoP3QubWFwKChmdW5jdGlvbih0KXtyZXR1cm57cmVjb3JkOnQuY2xvc2VzdCgiLnI6bm90KC50Mzk3X19vZmYpOm5vdCgudDM5NV9fb2ZmKTpub3QoLnQ0MDBfX29mZikiKSxhcnRib2FyZDp0fX0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlY29yZH0pKTpbXX1mdW5jdGlvbiB0Mzk2X19pc0luc2lkZUdyb3VwV2l0aFpvb20odCl7Zm9yKHZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIik7ZTspe3ZhciBhO2lmKGUuc3R5bGUuem9vbSlyZXR1cm4hMDtlPW51bGw9PShhPWUucGFyZW50RWxlbWVudCk/dm9pZCAwOmEuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIil9cmV0dXJuITF9dmFyIHQzOTZfX3VuaXF1ZUlkX19nZW5lcmF0b3I9ZnVuY3Rpb24gdCgpe3ZhciBlPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9U3RyaW5nKGUrPTEpLnBhZFN0YXJ0KDYsIjAiKTtyZXR1cm4iIitEYXRlLm5vdygpK3R9fSx0Mzk2X19nZXRVbmlxdWVJZD10Mzk2X191bmlxdWVJZF9fZ2VuZXJhdG9yKCk7ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2luaXQoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudC1yZWNvcmRzIiksZT0hIXQmJiJlZGl0Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKTsvQm90L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8dF9hbmltYXRlUGFyYWxsYXhfX2NoZWNrT2xkSUUoKXx8ZXx8dF9hbmltYXRpb25FeHRfX2lzWmVyb0Jsb2Nrc1JlbmRlcigoZnVuY3Rpb24oKXt0X2FuaW1hdGlvbkV4dF9fc2V0QXV0b1NjYWxlSW5mbygpLHRfYW5pbWF0aW9uRXh0X193cmFwRml4RWxzKCksdF9hbmltYXRpb25FeHRfX3dyYXBQYXJhbGxheEVscygpLHRfYW5pbWF0ZVBhcmFsbGF4X19pbml0U2Nyb2xsKCksdF9hbmltYXRlUGFyYWxsYXhfX2luaXRNb3VzZSgpO3ZhciB0PXRfYW5pbWF0aW9uRXh0X19nZXRBbmltYXRlZEVsZW1lbnRzKCJmaXgiLFtdKSxlO3RfYW5pbWF0aW9uRXh0X19jcmVhdGVSZXNpemVPYnNlcnZlcih0LHRfYW5pbWF0aW9uRXh0X19nZXRBbmltYXRlZEVsZW1lbnRzKCJwcngiLFsibW91c2UiXSkpLHRfYW5pbWF0ZUZpeF9faW5pdCh0KX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvbkV4dF9fc2V0QXV0b1NjYWxlSW5mbygpe2lmKHZvaWQgMD09PXdpbmRvdy5zaG91bGRVc2VTY2FsZUZhY3Rvcil7dmFyIHQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0ZpcmVmb3hcLyhbMC05XSspXC4vKSxlPXQ/cGFyc2VJbnQodFsxXSwxMCk6MTI2LGE9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVwvKFswLTldKylcLi8pLG49YSYmcGFyc2VJbnQoYVsxXSwxMCl8fDA7d2luZG93LmlzT25seVNjYWxhYmxlPWU8MTI2LHdpbmRvdy5zaG91bGRVc2VTY2FsZUZhY3Rvcj0hd2luZG93LmlzT25seVNjYWxhYmxlJiYhdCYmbjw9MTI3fX1mdW5jdGlvbiB0X2FuaW1hdGlvbkV4dF9faXNaZXJvQmxvY2tzUmVuZGVyKHQpe3ZhciBlPXRfYW5pbWF0aW9uRXh0X19nZXRBcnRib2FyZHMoIjM5NiIsITApO2lmKGUubGVuZ3RofHwoZT10X2FuaW1hdGlvbkV4dF9fZ2V0QXJ0Ym9hcmRzKCIxMjEiLCEwKSksZS5sZW5ndGgpaWYoZS5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKXQoKTtlbHNlIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMqPSJ0aWxkYS1ibG9ja3MtMi43Il0nKSl7dmFyIGE9RGF0ZS5ub3coKTt0X2FuaW1hdGlvbkV4dF9fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdChlLGEsdCl9ZWxzZXt2YXIgbj1lLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpO2UuZm9yRWFjaCgoZnVuY3Rpb24oYSl7YS5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil8fGEuYWRkRXZlbnRMaXN0ZW5lcigiYXJ0Qm9hcmRSZW5kZXJlZCIsKGZ1bmN0aW9uKCl7bi5wdXNoKGEpLG4ubGVuZ3RoPT09ZS5sZW5ndGgmJnQoKX0pKX0pKX19ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2dldEFydGJvYXJkcyh0LGUpe3ZhciBhPWU/Ijpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikiOiIiLG49Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl0nK2ErJyAudDM5Nl9fYXJ0Ym9hcmQsIC5yW2RhdGEtcGFyZW50dHBsaWQ9IicrdCsnIl0nK2ErIiAudDM5Nl9fYXJ0Ym9hcmQiO3JldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwobikpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uRXh0X19iYWNrd2FyZENvbXBhdGliaWxpdHlXYWl0KHQsZSxhKXtpZih0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil9KSkpYSgpO2Vsc2V7aWYoRGF0ZS5ub3coKS1lPjFlNClyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oImFsbCB6ZXJvLWJsb2NrcyBjYW4ndCBiZSByZW5kZXJlZCIpO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25FeHRfX2JhY2t3YXJkQ29tcGF0aWJpbGl0eVdhaXQodCxlLGEpfSksNTAwKX19ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2NyZWF0ZVJlc2l6ZU9ic2VydmVyKHQsZSl7aWYoZS5sZW5ndGh8fHQubGVuZ3RoKXt2YXIgYT1kb2N1bWVudC5ib2R5LmdldENsaWVudFJlY3RzKCk7aWYoYS5sZW5ndGgmJiJSZXNpemVPYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBuPWFbMF0uaGVpZ2h0LGk7bmV3IFJlc2l6ZU9ic2VydmVyKChmdW5jdGlvbihpKXtpLmZvckVhY2goKGZ1bmN0aW9uKGkpe3ZhciByPWkudGFyZ2V0O3IuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWJvZHlfcG9wdXBzaG93ZWQiKXx8ci5jbGFzc0xpc3QuY29udGFpbnMoInQtYm9keV9zY3JvbGwtbG9ja2VkIil8fGkuY29udGVudFJlY3QuaGVpZ2h0PT09bnx8KG49YVswXS5oZWlnaHQsZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0X2FuaW1hdGVQYXJhbGxheF9fY2FjaGVPZmZzZXRzKHQpfSkpLHRfYW5pbWF0ZUZpeF9fY2FjaGVFbHNJbmZvKHQpKX0pKX0pKS5vYnNlcnZlKGRvY3VtZW50LmJvZHkpfX19ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX3dyYXBGaXhFbHMoKXt2YXIgdD10X2FuaW1hdGlvbkV4dF9fZ2V0QW5pbWF0ZWRFbGVtZW50cygiZml4IixbXSksZT10X2FuaW1hdGlvbkV4dF9fZ2V0QXJ0Qm9hcmRzU2NyZWVucygpO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGE7dF9hbmltYXRpb25FeHRfX2dldEF0dHJCeVJlcyh0LCJwcngiLCJkYXRhLWFuaW1hdGUtIiwwKSYmZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgYTtpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hcnRib2FyZC1yZWNpZD0iJytlLnJlY2lkKyciXScpKXt2YXIgbj1lLnNjcmVlbnMsaT1lLnNjcmVlbk1heDtuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBhPWU9PT1pPyJkYXRhLWFuaW1hdGUtcHJ4IjoiZGF0YS1hbmltYXRlLXByeC1yZXMtIitlO3QucmVtb3ZlQXR0cmlidXRlKGEpfSkpfX0pKTt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKSxpPXRfYW5pbWF0aW9uRXh0X19nZXRTY2FsZVdyYXBwZXIobikscj10X2FuaW1hdGlvbkV4dF9fZ2VuZXJhdGVXcmFwcGVyQ2xhc3NMaXN0KG4sInN0aWNreSIpLG89dF9hbmltYXRpb25FeHRfX2dlbmVyYXRlV3JhcHBlclNlbGVjdG9yKG4sInN0aWNreSIpLGw7dF9hbmltYXRpb25FeHRfX3dyYXBFbChuLHIsbyxpKSx0X2FuaW1hdGlvbkV4dF9fdXBkYXRlQmFzaWNBbmltYXRpb25UcmlnZ2VyT25GaXhlZChuLmNsb3Nlc3QobyksdCxlKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvbkV4dF9fZ2V0U2NhbGVXcmFwcGVyKHQpe2lmKCF0KXJldHVybiBudWxsO3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIiksYT10LmNsYXNzTGlzdC5jb250YWlucygidG4tYXRvbSIpO3JldHVybiBlJiZhP251bGw6dC5jbG9zZXN0KCIudG4tYXRvbV9fc2NhbGUtd3JhcHBlciIpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uRXh0X191cGRhdGVCYXNpY0FuaW1hdGlvblRyaWdnZXJPbkZpeGVkKHQsZSxhKXt2YXIgbj0idC1hbmltYXRlIjtpZihlLmNsYXNzTGlzdC5jb250YWlucyhuKSYmdCl7ZS5jbGFzc0xpc3QucmVtb3ZlKG4pLHQuY2xhc3NMaXN0LmFkZChuKSxlLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0ZS1mb3Itd3JhcHBlciIpO3ZhciBpPVsic3R5bGUiLCJkaXN0YW5jZSIsImR1cmF0aW9uIiwic2NhbGUiLCJkZWxheSJdO2EuZm9yRWFjaCgoZnVuY3Rpb24oYSl7dmFyIG47aWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtYXJ0Ym9hcmQtcmVjaWQ9IicrYS5yZWNpZCsnIl0nKSl7dmFyIHI9YS5zY3JlZW5zLG89YS5zY3JlZW5NYXg7ci5mb3JFYWNoKChmdW5jdGlvbihhKXtpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPXRfYW5pbWF0aW9uRXh0X19nZXRBdHRyQnlSZXMoZSxuLCJkYXRhLWFuaW1hdGUtIixhKTtpJiYoYT09PW8/KHQuc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIituLGkpLGUucmVtb3ZlQXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIituKSk6KHQuc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtIituKyItcmVzLSIrYSxpKSxlLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrbisiLXJlcy0iK2EpKSl9KSl9KSl9fSkpfX1mdW5jdGlvbiB0X2FuaW1hdGlvbkV4dF9fd3JhcFBhcmFsbGF4RWxzKCl7dmFyIHQ7dF9hbmltYXRpb25FeHRfX2dldEFuaW1hdGVkRWxlbWVudHMoInByeCIsWyJzY3JvbGwiLCJtb3VzZSJdKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKSxhPWUuY2xvc2VzdCgiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIsIC50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksbixpO3RfYW5pbWF0aW9uRXh0X193cmFwRWwoZSx0X2FuaW1hdGlvbkV4dF9fZ2VuZXJhdGVXcmFwcGVyQ2xhc3NMaXN0KGUsInByeCIpLHRfYW5pbWF0aW9uRXh0X19nZW5lcmF0ZVdyYXBwZXJTZWxlY3RvcihlLCJwcngiKSxhKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVGaXhfX2luaXQodCl7aWYodC5sZW5ndGgpe3RfYW5pbWF0ZUZpeF9fY2FjaGVFbHNJbmZvKHQpLHRfYW5pbWF0ZUZpeF9fdXBkYXRlUG9zaXRpb25zKHQsITEpO3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksYT0hIWUmJiJ5ZXMiPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbGF6eSIpOygieSI9PT13aW5kb3cubGF6eXx8YSkmJih3aW5kb3cudF9hbmltYXRpb25FeHRfX2lzTGF6eT0hMCx0X29uRnVuY0xvYWQoInRfbGF6eWxvYWRfdXBkYXRlIiwoZnVuY3Rpb24oKXt0X2xhenlsb2FkX3VwZGF0ZSgpfSkpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3RfYW5pbWF0ZUZpeF9fY2FjaGVFbHNJbmZvKHQpLHRfYW5pbWF0ZUZpeF9fdXBkYXRlUG9zaXRpb25zKHQsITApfSksMTAwKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0X2FuaW1hdGVGaXhfX3VwZGF0ZVBvc2l0aW9ucyh0LCExKX0pLDMwKSk7dmFyIG49QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudDM5NiIpKSxpPVsiZGlzcGxheUNoYW5nZWQiLCJ6ZXJvOmhlaWdodC1jaGFuZ2VkIl0scj10X3Rocm90dGxlKChmdW5jdGlvbigpe3RfYW5pbWF0ZUZpeF9fY2FjaGVFbHNJbmZvKHQpLHRfYW5pbWF0ZUZpeF9fdXBkYXRlUG9zaXRpb25zKHQsITApfSksMzApO24uZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmFkZEV2ZW50TGlzdGVuZXIoZSxyKX0pKX0pKX19ZnVuY3Rpb24gdF9hbmltYXRlRml4X191cGRhdGVQb3NpdGlvbnModCxlKXt2YXIgYT13aW5kb3cucGFnZVlPZmZzZXQ7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmZpeGVkV3JhcHBlckVsKXt2YXIgbj10X2FuaW1hdGVfX2dldFNjYWxlZE9uZVBpeFNoYXBlKHQpO2lmKDAhPT10LmRpc3RhbmNlKXt2YXIgaT10X2FuaW1hdGlvbkV4dF9fZ2V0Wm9vbSh0KSxyPWErdC50cmlnZ2VyT2Zmc2V0Kmksbz10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIik7aWYod2luZG93LmlzT25seVNjYWxhYmxlJiZvJiZ0LmZpeGVkV3JhcHBlckVsJiYiZml4ZWQiIT09dC5maXhlZFdyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbil7dmFyIGwscyxfPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLW8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO3Quc2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlZC1kaWZmIixfLnRvU3RyaW5nKCkpfXZhciBjPTA7d2luZG93LmlzT25seVNjYWxhYmxlJiZvJiYoYz10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZWQtZGlmZiIpfHwiMCIsYz1wYXJzZUludChjLDEwKSxyPWErdC50cmlnZ2VyT2Zmc2V0K2MpO3ZhciBkPXI+PXQudG9wT2Zmc2V0LGY9cjx0LnRvcE9mZnNldCx1PXI8dC5lbmQsbT1yPj10LmVuZCxwPXQuZml4ZWRXcmFwcGVyRWwuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXN0aWNreV9nb2luZyIpLGc9dC5maXhlZFdyYXBwZXJFbC5jbGFzc0xpc3QuY29udGFpbnMoInQtc3RpY2t5X2VuZGVkIikseD10LmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSxFPXgmJiJodWciPT09dF9hbmltYXRpb25FeHRfX2dldEF0dHJCeVJlcyh0LCJoZWlnaHRtb2RlIiwiZGF0YS1ncm91cC0iKSx2LHk9eCYmImZpbGwiPT09dF9hbmltYXRpb25FeHRfX2dldEF0dHJCeVJlcyh0LCJ3aWR0aG1vZGUiLCJkYXRhLWdyb3VwLSIpJiZ0Lm9mZnNldFdpZHRoLHc9dDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KTtpZigoZCYmdSYmKCFwfHxlKXx8dSYmZykmJih0LnN0eWxlLnRyYW5zZm9ybT0iIix0LnN0eWxlLndpbGxDaGFuZ2U9InVuc2V0Iix0LmZpeGVkV3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsdC5maXhlZFdyYXBwZXJFbC5zdHlsZS50b3A9KG58fHc/dC50cmlnZ2VyT2Zmc2V0Kmk6dC50cmlnZ2VyT2Zmc2V0KStjKyJweCIsdC5maXhlZFdyYXBwZXJFbC5jbGFzc0xpc3QuYWRkKCJ0LXN0aWNreV9nb2luZyIpLHQuZml4ZWRXcmFwcGVyRWwuY2xhc3NMaXN0LnJlbW92ZSgidC1zdGlja3lfZW5kZWQiKSxFJiYodC5zdHlsZS5oZWlnaHQ9IiIpLHkmJih0LmZpeGVkV3JhcHBlckVsLnN0eWxlLndpZHRoPXkrInB4IikpLG0mJiFnKXt2YXIgaD13aW5kb3cuaXNPbmx5U2NhbGFibGV8fHc/dC5kaXN0YW5jZTp0LmRpc3RhbmNlL2k7dC5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZVkoIitoKyJweCkiLHQuc3R5bGUud2lsbENoYW5nZT0iIix0LmZpeGVkV3JhcHBlckVsLnN0eWxlLnRvcD0iIix0LmZpeGVkV3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uPSIiLHQuZml4ZWRXcmFwcGVyRWwuY2xhc3NMaXN0LnJlbW92ZSgidC1zdGlja3lfZ29pbmciKSx0LmZpeGVkV3JhcHBlckVsLmNsYXNzTGlzdC5hZGQoInQtc3RpY2t5X2VuZGVkIiksRSYmKHQuc3R5bGUuaGVpZ2h0PSJpbml0aWFsIikseSYmKHQuZml4ZWRXcmFwcGVyRWwuc3R5bGUud2lkdGg9ImluaGVyaXQiKX1mJiZ0LmZpeGVkV3JhcHBlckVsLmNsYXNzTGlzdC5jb250YWlucygidC1zdGlja3lfZ29pbmciKSYmKHQuc3R5bGUud2lsbENoYW5nZT0iIix0LmZpeGVkV3JhcHBlckVsLnN0eWxlLnRvcD0iIix0LmZpeGVkV3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uPSIiLHQuZml4ZWRXcmFwcGVyRWwuY2xhc3NMaXN0LnJlbW92ZSgidC1zdGlja3lfZ29pbmciKSxFJiYodC5zdHlsZS5oZWlnaHQ9ImluaXRpYWwiKSx5JiYodC5maXhlZFdyYXBwZXJFbC5zdHlsZS53aWR0aD0iaW5oZXJpdCIpKX1lbHNlIGUmJih0LmZpeGVkV3JhcHBlckVsLnN0eWxlLnBvc2l0aW9uPSIiLHQuZml4ZWRXcmFwcGVyRWwuc3R5bGUudG9wPSIiLHQuZml4ZWRXcmFwcGVyRWwuY2xhc3NMaXN0LnJlbW92ZSgidC1zdGlja3lfZ29pbmciKSx0LmZpeGVkV3JhcHBlckVsLmNsYXNzTGlzdC5yZW1vdmUoInQtc3RpY2t5X2VuZGVkIikpfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVGaXhfX2NhY2hlRWxzSW5mbyh0KXt2YXIgZT13aW5kb3cuaW5uZXJIZWlnaHQ7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgYT10X2FuaW1hdGlvbkV4dF9fZ2V0Wm9vbSh0KSxuPXBhcnNlSW50KHQuc3R5bGUudG9wLDEwKSxpO3QzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCkmJiF3aW5kb3cuaXNPbmx5U2NhbGFibGUmJihuPXQub2Zmc2V0VG9wL2EpLE51bWJlci5pc05hTihuKSYmKG49dC5vZmZzZXRUb3ApO3ZhciByPXRfYW5pbWF0ZV9fZ2V0U2NhbGVkT25lUGl4U2hhcGUodCk7d2luZG93LmlzT25seVNjYWxhYmxlfHxyfHwobio9YSk7dmFyIG89dF9hbmltYXRlRml4X19nZXRQYXJlbnRUb3BPZmZzZXQodCksbCxzPXRfYW5pbWF0aW9uRXh0X19nZW5lcmF0ZVdyYXBwZXJTZWxlY3Rvcih0LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKSwic3RpY2t5IiksXz10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpLGM9MDtfJiZfIT09dCYmKGM9cGFyc2VJbnQoXy5zdHlsZS50b3AsMTApfHwwLHdpbmRvdy5pc09ubHlTY2FsYWJsZXx8KGMqPWEpKSx0LnRvcE9mZnNldD1vK24rYyx0LnRyaWdnZXI9cGFyc2VGbG9hdCh0X2FuaW1hdGlvbkV4dF9fZ2V0QXR0ckJ5UmVzKHQsImZpeCIsImRhdGEtYW5pbWF0ZS0iLDApKXx8MCx0LmRpc3RhbmNlPXBhcnNlSW50KHRfYW5pbWF0aW9uRXh0X19nZXRBdHRyQnlSZXModCwiZml4LWRpc3QiLCJkYXRhLWFuaW1hdGUtIiwwKSwxMCl8fDAsdC5kaXN0YW5jZSo9YSx0LmVuZD10LnRvcE9mZnNldCt0LmRpc3RhbmNlLHQuZml4ZWRXcmFwcGVyRWw9dC5xdWVyeVNlbGVjdG9yKHMpLHQuc2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtZml4LXByb2Nlc3NlZCIsInRydWUiKTt2YXIgZD10LnF1ZXJ5U2VsZWN0b3IoIi50LWltZyIpO2Q/ZC5jb21wbGV0ZT90X2FuaW1hdGVGaXhfX2NyZWF0ZU9ubG9hZEltYWdlTGlzdGVuZXIodCxkLGUpOmQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7dF9hbmltYXRlRml4X19jcmVhdGVPbmxvYWRJbWFnZUxpc3RlbmVyKHQsZCxlKX0pKTp0X2FuaW1hdGVGaXhfX2dldEVsVHJpZ2dlcih0LGUpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZUZpeF9fY3JlYXRlT25sb2FkSW1hZ2VMaXN0ZW5lcih0LGUsYSl7dF9hbmltYXRlV2FpdEZvclVwbG9hZEltZyhlLChmdW5jdGlvbigpe3RfYW5pbWF0ZUZpeF9fZ2V0RWxUcmlnZ2VyKHQsYSksdF9hbmltYXRlRml4X191cGRhdGVQb3NpdGlvbnMoW3RdLCExKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVGaXhfX2dldFBhcmVudFRvcE9mZnNldCh0KXt2YXIgZT10LmNsb3Nlc3QoIi5yIiksYSxuO3JldHVybiBlP2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wK3dpbmRvdy5wYWdlWU9mZnNldCsocGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShlKS5wYWRkaW5nVG9wLDEwKXx8MCk6MH1mdW5jdGlvbiB0X2FuaW1hdGVfX2dldFNjYWxlZE9uZVBpeFNoYXBlKHQpe3ZhciBlLGE7aWYoISgic2hhcGUiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtZWxlbS10eXBlIikpKXJldHVybiExO2lmKCJ5ZXMiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtc2NhbGUtb2ZmIikpcmV0dXJuITA7dmFyIG49Z2V0Q29tcHV0ZWRTdHlsZSh0KTtyZXR1cm4ocGFyc2VJbnQobi5oZWlnaHQsMTApPD0yfHxwYXJzZUludChuLndpZHRoLDEwKTw9MikmJiIwcHgiPT09bi5ib3JkZXJXaWR0aCYmIm5vbmUiPT09bi5iYWNrZ3JvdW5kSW1hZ2V9ZnVuY3Rpb24gdF9hbmltYXRlV2FpdEZvclVwbG9hZEltZyh0LGUpe2lmKHdpbmRvdy50X2FuaW1hdGlvbkV4dF9faXNMYXp5KXZhciBhPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5jbGFzc0xpc3QuY29udGFpbnMoImxvYWRlZCIpJiZ0LmNsaWVudFdpZHRoJiZ0LnNyYz8oZSgpLGNsZWFyVGltZW91dChhKSk6dF9hbmltYXRlV2FpdEZvclVwbG9hZEltZyh0LGUpfSksMzAwKTtlbHNlIGUoKX1mdW5jdGlvbiB0X2FuaW1hdGVGaXhfX2dldEVsVHJpZ2dlcih0LGUpe3ZhciBhPXRfYW5pbWF0aW9uRXh0X19nZXRab29tKHQpO2lmKHQudHJpZ2dlck9mZnNldD1wYXJzZUludCh0X2FuaW1hdGlvbkV4dF9fZ2V0QXR0ckJ5UmVzKHQsImZpeC10cmdvZnN0IiwiZGF0YS1hbmltYXRlLSIsMCksMTApfHwwLHdpbmRvdy5pc09ubHlTY2FsYWJsZSYmKHQudHJpZ2dlck9mZnNldCo9YSksLjU9PT10LnRyaWdnZXJ8fDE9PT10LnRyaWdnZXIpe3ZhciBuPWUqdC50cmlnZ2VyLGk9dF9hbmltYXRlRml4X19nZXRQdXJlRWxIZWlnaHQodCkqdC50cmlnZ2VyO2kqPWEsdC50cmlnZ2VyT2Zmc2V0Kz1uLHQudHJpZ2dlck9mZnNldC09aSx0LnRyaWdnZXJPZmZzZXQ+dC50b3BPZmZzZXQmJnQudHJpZ2dlck9mZnNldDw9biYmKHQudHJpZ2dlck9mZnNldD10LnRvcE9mZnNldCksd2luZG93LmlzT25seVNjYWxhYmxlfHwodC50cmlnZ2VyT2Zmc2V0Lz1hKX19ZnVuY3Rpb24gdF9hbmltYXRlRml4X19nZXRQdXJlRWxIZWlnaHQodCl7dmFyIGU9dF9hbmltYXRpb25FeHRfX2dldFB1cmVIZWlnaHQodCksYTtyZXR1cm4gZXx8dF9hbmltYXRpb25FeHRfX2dldFB1cmVIZWlnaHQodC5xdWVyeVNlbGVjdG9yKCIudG4tbW9sZWN1bGUsIC50bi1hdG9tIikpfWZ1bmN0aW9uIHRfYW5pbWF0ZVBhcmFsbGF4X19pbml0TW91c2UoKXt2YXIgdD10X2FuaW1hdGlvbkV4dF9fZ2V0QW5pbWF0ZWRFbGVtZW50cygicHJ4IixbIm1vdXNlIl0pO2lmKHQubGVuZ3RoKXt0LmZvckVhY2goaSk7dmFyIGU9WyJkaXNwbGF5Q2hhbmdlZCIsInplcm86aGVpZ2h0LWNoYW5nZWQiXSxhPUFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQzOTYiKSksbj1mdW5jdGlvbiBlKCl7cmV0dXJuIHQuZm9yRWFjaCh0X2FuaW1hdGVQYXJhbGxheF9fY2FjaGVPZmZzZXRzKX07YS5mb3JFYWNoKChmdW5jdGlvbih0KXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuYWRkRXZlbnRMaXN0ZW5lcihlLG4pfSkpfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRfdGhyb3R0bGUobiw1MCkpfWZ1bmN0aW9uIGkodCl7dmFyIGU7dC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1wcngtcHJvY2Vzc2VkIiwidHJ1ZSIpLHQucGF0aFg9cGFyc2VJbnQodF9hbmltYXRpb25FeHRfX2dldEF0dHJCeVJlcyh0LCJwcngtZHgiLCJkYXRhLWFuaW1hdGUtIiwwKSwxMCl8fDAsdC5wYXRoWT1wYXJzZUludCh0X2FuaW1hdGlvbkV4dF9fZ2V0QXR0ckJ5UmVzKHQsInByeC1keSIsImRhdGEtYW5pbWF0ZS0iLDApLDEwKXx8MCx0LmFuaW1FbD10LnF1ZXJ5U2VsZWN0b3JBbGwoIi50bi1hdG9tX19wcngtd3JhcHBlciIpLHRfYW5pbWF0ZVBhcmFsbGF4X19jYWNoZU9mZnNldHModCksImltYWdlIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpJiZ0X2FuaW1hdGVQYXJhbGxheF9fY2FjaGVPZmZzZXRzX19PbkltZ0xvYWQodCksdF9hbmltYXRlUGFyYWxsYXhfX21vdmVFbCh0KX19ZnVuY3Rpb24gdF9hbmltYXRlUGFyYWxsYXhfX2NhY2hlT2Zmc2V0cyh0KXt2YXIgZT10X2FuaW1hdGlvbkV4dF9fZ2V0Wm9vbSh0KTt0LnRvcE9mZnNldD10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCx3aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3ImJih0LnRvcE9mZnNldCo9ZSksdC50b3BPZmZzZXQrPXdpbmRvdy5wYWdlWU9mZnNldDt2YXIgYT10X2FuaW1hdGlvbkV4dF9fZ2V0UHVyZUhlaWdodCh0KTt0LmJvdHRvbU9mZnNldD10LnRvcE9mZnNldCthO3ZhciBuPXQuY2xvc2VzdCgiLnIiKSxpPW4/bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0OjAscixvPWkrKG4/dF9hbmltYXRpb25FeHRfX2dldFB1cmVIZWlnaHQobik6MCk7aT50LnRvcE9mZnNldD90LnBhcmVudFRvcE9mZnNldD1pOmRlbGV0ZSB0LnBhcmVudFRvcE9mZnNldCxvPHQuYm90dG9tT2Zmc2V0P3QucGFyZW50Qm90dG9tT2Zmc2V0PW86ZGVsZXRlIHQucGFyZW50Qm90dG9tT2Zmc2V0fWZ1bmN0aW9uIHRfYW5pbWF0ZVBhcmFsbGF4X19jYWNoZU9mZnNldHNfX09uSW1nTG9hZCh0KXtpZih3aW5kb3cubGF6eSl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCJpbWciKTtlJiZlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3RfYW5pbWF0ZVBhcmFsbGF4X19jYWNoZU9mZnNldHModCl9KSl9fWZ1bmN0aW9uIHRfYW5pbWF0ZVBhcmFsbGF4X19tb3ZlRWwodCl7aWYoISgib250b3VjaGVuZCJpbiBkb2N1bWVudCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoPDEyMDApKXt2YXIgZT13aW5kb3cuaW5uZXJIZWlnaHQsYT13aW5kb3cuaW5uZXJXaWR0aCxuPXQucGF0aFgsaT10LnBhdGhZLHI9MCxvPTAsbD0wLHM9MCxfPSExLGM9dC5jbG9zZXN0KCdbZGF0YS1hcnRib2FyZC1maXhlZD0ieSJdJyksZD1Cb29sZWFuKGMpLGY9YyYmYy5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtZml4ZWQtdHJpZ2dlciIpO3RfYW5pbWF0ZVBhcmFsbGF4X19wcmV2ZW50QW5pbWF0ZWRQYXJlbnRUcmlnZ2VyKHQpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0X3Rocm90dGxlKChmdW5jdGlvbihsKXt2YXIgcz13aW5kb3cucGFnZVlPZmZzZXQsbSxwPXMrd2luZG93LmlubmVySGVpZ2h0PD10LnRvcE9mZnNldHx8dC5ib3R0b21PZmZzZXQ8PXM7aWYoYyYmZiYmKGQ9Yy5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZpeGVkLWFjdGl2ZSIpKSx2b2lkIDAhPT1sJiYoIXB8fGQpKXt2YXIgZz1sLnBhZ2VZLWwuY2xpZW50WS0xMDAseD1sLnBhZ2VZK2UrMTAwO2lmKGR8fCEod2luZG93LmlubmVyV2lkdGg8MTQwMCYmKHQuYm90dG9tT2Zmc2V0PGd8fHQudG9wT2Zmc2V0PngpfHx0LnBhcmVudFRvcE9mZnNldD5sLnBhZ2VZfHx0LnBhcmVudEJvdHRvbU9mZnNldDxsLnBhZ2VZKSl7aWYoIm51bWJlciI9PXR5cGVvZiBuKXt2YXIgRT1hLzIsdix5PShFLWwuY2xpZW50WCkvRTtyPU1hdGgucm91bmQobip5KX1pZigibnVtYmVyIj09dHlwZW9mIGkpe3ZhciB3PWUvMixoLGI9KHctbC5jbGllbnRZKS93O289TWF0aC5yb3VuZChpKmIpfV89ITEsdSgpfX19KSw1MCkpfWZ1bmN0aW9uIHUoKXtffHwocmVxdWVzdEFuaW1hdGlvbkZyYW1lKHUpLHImJihsKz0uMDIqKHItbCkpLG8mJihzKz0uMDIqKG8tcykpLE1hdGguYWJzKGwtcik8MSYmTWF0aC5hYnMocy1vKTwxP189ITA6dCYmdC5hbmltRWwubGVuZ3RoJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQuYW5pbUVsLChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlM2QoIitsKyJweCwgIitzKyJweCwgMHB4KSJ9KSkpfX1mdW5jdGlvbiB0X2FuaW1hdGVQYXJhbGxheF9fcHJldmVudEFuaW1hdGVkUGFyZW50VHJpZ2dlcih0KXtpZigibm9uZSIhPT1nZXRDb21wdXRlZFN0eWxlKHQpLnBvaW50ZXJFdmVudHMpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpO2UmJih0LnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiLGUuc3R5bGUucG9pbnRlckV2ZW50cz0iYXV0byIpfX1mdW5jdGlvbiB0X2FuaW1hdGVQYXJhbGxheF9faW5pdFNjcm9sbCgpe3ZhciB0PXRfYW5pbWF0aW9uRXh0X19nZXRBbmltYXRlZEVsZW1lbnRzKCJwcngiLFsic2Nyb2xsIl0pO2lmKHQubGVuZ3RoKXt2YXIgZT10LmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHRfYW5pbWF0aW9uRXh0X19pc0VsZW1lbnRIaWRkZW4odCl9KSk7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighdF9hbmltYXRpb25FeHRfX2lzRWxlbWVudEhpZGRlbih0KSl7dC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1wcngtcHJvY2Vzc2VkIiwidHJ1ZSIpO3ZhciBlPXRfYW5pbWF0aW9uRXh0X19nZXRBdHRyQnlSZXModCwicHJ4LXMiLCJkYXRhLWFuaW1hdGUtIiwwKSxhPU1hdGgucm91bmQoKHBhcnNlSW50KGUpLTEwMCkvMTApLG49dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fcHJ4LXdyYXBwZXIiKTtuJiZhJiZuLnNldEF0dHJpYnV0ZSgiZGF0YS1wYXJhbGxheC1zcGVlZCIsYS50b1N0cmluZygpKX19KSksdC5sZW5ndGgmJnRfYW5pbWF0aW9uRXh0X19jcmVhdGVTY3JvbGxQYXJhbGxheCgiW2RhdGEtcGFyYWxsYXgtc3BlZWRdIiksZS5sZW5ndGgmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5maWx0ZXIoKGZ1bmN0aW9uKHQsYSl7cmV0dXJuIXRfYW5pbWF0aW9uRXh0X19pc0VsZW1lbnRIaWRkZW4odCkmJihlLnNwbGljZShhLDEpLCEwKX0pKTtpZih0Lmxlbmd0aCl7dmFyIGEsbj10X2FuaW1hdGlvbkV4dF9fZ2V0QXR0ckJ5UmVzKHRbdC5sZW5ndGgtMV0sInByeC1zIiwiZGF0YS1hbmltYXRlLSIsMCksaT0icGFyYWxsYXgiK0RhdGUubm93KCk7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19wcngtd3JhcHBlciIpLGE9TWF0aC5yb3VuZCgocGFyc2VJbnQobiktMTAwKS8xMCk7ZSYmZS5zZXRBdHRyaWJ1dGUoImRhdGEtcGFyYWxsYXgtc3BlZWQiLGEudG9TdHJpbmcoKSksdC5jbGFzc0xpc3QuYWRkKGkpfSkpLHRfYW5pbWF0aW9uRXh0X19jcmVhdGVTY3JvbGxQYXJhbGxheCgiLiIraSl9fSksNTApKX19ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2NyZWF0ZVNjcm9sbFBhcmFsbGF4KHQpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCkpO2lmKCJJbnRlcnNlY3Rpb25PYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBhPXRfYW5pbWF0aW9uRXh0X19maW5kUGFyYWxsYXhQYXJlbnRzKGUpO3RfYW5pbWF0aW9uRXh0X191cGRhdGVQYXJhbGxheChhLGUsdCksd2luZG93LnRfYW5pbWF0aW9uRXh0X19pc01vYmlsZT93aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigib3JpZW50YXRpb25jaGFuZ2UiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25FeHRfX3VwZGF0ZVBhcmFsbGF4KGEsZSx0KX0pLDMwMCl9KSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt0X2FuaW1hdGlvbkV4dF9fdXBkYXRlUGFyYWxsYXgoYSxlLHQpfSksNTApKX1lbHNlIHRfYW5pbWF0aW9uRXh0X19jcmVhdGVQYXJhbGxheEJ5U2Nyb2xsKHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uRXh0X191cGRhdGVQYXJhbGxheCh0LGUsYSl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt0X2FuaW1hdGlvbkV4dF9fdXBkYXRlUGFyYWxsYXhPZmZzZXQodCxhKX0pKSxlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RfYW5pbWF0aW9uRXh0X191cGRhdGVQYXJhbGxheFBhcmFtcyh0LGUpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uRXh0X191cGRhdGVQYXJhbGxheE9mZnNldCh0LGUpe3ZhciBhO25ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZnVuY3Rpb24odCxhKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHQuaXNJbnRlcnNlY3Rpbmcpe3ZhciBuPXQudGFyZ2V0LGk7dF9hbmltYXRpb25FeHRfX3NldFBhcmFsbGF4T2Zmc2V0cyhBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChuLnF1ZXJ5U2VsZWN0b3JBbGwoZSkpKSxhLnVub2JzZXJ2ZShuKX19KSl9KSkub2JzZXJ2ZSh0KX1mdW5jdGlvbiB0X2FuaW1hdGlvbkV4dF9fdXBkYXRlUGFyYWxsYXhQYXJhbXModCxlKXt2YXIgYTtuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKHQsZSl7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmlzSW50ZXJzZWN0aW5nKXt2YXIgYT10LnRhcmdldDthLmlzUmVhZHk/dF9hbmltYXRpb25FeHRfX2FuaW1hdGVQYXJhbGxheE9uU2Nyb2xsKGEsInN0YXJ0Iik6YS5hZGRFdmVudExpc3RlbmVyKCJwYXJhbGxheFJlYWR5IiwoZnVuY3Rpb24oKXt0X2FuaW1hdGlvbkV4dF9fYW5pbWF0ZVBhcmFsbGF4T25TY3JvbGwoYSwic3RhcnQiKX0pLHtvbmNlOiEwfSksZS51bm9ic2VydmUoYSl9fSkpfSkpLm9ic2VydmUoZSl9ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX3NldFBhcmFsbGF4T2Zmc2V0cyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXBhcmFsbGF4LXNwZWVkIiksYT13aW5kb3cucGFnZVlPZmZzZXQsbj10X2FuaW1hdGlvbkV4dF9fY2FsY1NjYWxlZERpZmYodCksaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCthK24scj10LmNsaWVudEhlaWdodCxvPWE+aSxsPXRfYW5pbWF0aW9uRXh0X19nZXRab29tKHQpO3dpbmRvdy5zaG91bGRVc2VTY2FsZUZhY3RvciYmKGkqPWwpO3ZhciBzPTEwLF89ZT90X2FuaW1hdGlvbkV4dF9fZ2V0UGFyYWxsYXhTcGVlZChlLC0xMCxzKTowLGM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7Yy5pbml0RXZlbnQoInBhcmFsbGF4UmVhZHkiLCEwLCEwKSx0LmlzQWJvdmVQYXJhbGxheD1vLHQuc3BlZWQ9Xyx0LnRvcFBvcz1pLHQuYm90dG9tUG9zPWkrcix0LmlzU3RhcnRlZD0hMSx0LnN0eWxlLnRyYW5zZm9ybT0iIjt2YXIgZD10LnF1ZXJ5U2VsZWN0b3IoIi50LWltZyIpO2Q/ZC5jb21wbGV0ZSYmMCE9PWQuY2xpZW50SGVpZ2h0JiZkLnNyYyYmZC5jbGllbnRXaWR0aD90X2FuaW1hdGlvbkV4dF9fdHJpZ2dlclBhcmFsbGF4SW5pdCh0LGMpOmQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25FeHRfX3RyaWdnZXJQYXJhbGxheEluaXQodCxjKX0pKTp0X2FuaW1hdGlvbkV4dF9fdHJpZ2dlclBhcmFsbGF4SW5pdCh0LGMpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uRXh0X190cmlnZ2VyUGFyYWxsYXhJbml0KHQsZSl7dC5pc1JlYWR5PSEwLHQuZGlzcGF0Y2hFdmVudChlKX1mdW5jdGlvbiB0X2FuaW1hdGlvbkV4dF9fYW5pbWF0ZVBhcmFsbGF4T25TY3JvbGwodCxlKXtpZigiYW5pbWF0ZSIhPT1lfHx0LmlzU3RhcnRlZCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe3RfYW5pbWF0aW9uRXh0X19hbmltYXRlUGFyYWxsYXhPblNjcm9sbCh0LCJhbmltYXRlIil9KSk7dmFyIGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxuLGkscj0od2luZG93LnBhZ2VZT2Zmc2V0K2EtdC50b3BQb3MpLyh0LmNsaWVudEhlaWdodCthKSxvPXRfYW5pbWF0aW9uRXh0X19nZXRQYXJhbGxheFBvc2l0aW9uKHQuc3BlZWQscik7InN0YXJ0Ij09PWU/KHQucG9zWT1vLHQuaXNTdGFydGVkPSEwKTooby09dC5wb3NZLHQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVZKCIrbysicHgpIil9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uRXh0X19maW5kUGFyYWxsYXhQYXJlbnRzKHQpe3ZhciBlPVtdLGE9W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dC5jbG9zZXN0KCIuciIpLGk7biYmKC0xPT09ZS5pbmRleE9mKG4uaWQpJiYoZS5wdXNoKG4uaWQpLGEucHVzaChuKSkpfSkpLGF9ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2NyZWF0ZVBhcmFsbGF4QnlTY3JvbGwodCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KSksYT10X2FuaW1hdGlvbkV4dF9fZ2V0UGFyYWxsYXhPZmZlc3RzKGUpO3dpbmRvdy50X2FuaW1hdGlvbkV4dF9faXNNb2JpbGU/d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RfYW5pbWF0aW9uRXh0X19hbmltYXRlUGFyYWxsYXhCeVNjcm9sbChhPXRfYW5pbWF0aW9uRXh0X19nZXRQYXJhbGxheE9mZmVzdHMoZSkpfSksMzAwKX0pKTp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0X3Rocm90dGxlKChmdW5jdGlvbigpe3RfYW5pbWF0aW9uRXh0X19hbmltYXRlUGFyYWxsYXhCeVNjcm9sbChhPXRfYW5pbWF0aW9uRXh0X19nZXRQYXJhbGxheE9mZmVzdHMoZSkpfSksNTApKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIiwoZnVuY3Rpb24oKXt0X2FuaW1hdGlvbkV4dF9fYW5pbWF0ZVBhcmFsbGF4QnlTY3JvbGwoYSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2dldFBhcmFsbGF4T2ZmZXN0cyh0KXtyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXBhcmFsbGF4LXNwZWVkIiksYT13aW5kb3cucGFnZVlPZmZzZXQsbj10X2FuaW1hdGlvbkV4dF9fY2FsY1NjYWxlZERpZmYodCksaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCthK24scj10LmNsaWVudEhlaWdodCxvPWE+aSxsPXRfYW5pbWF0aW9uRXh0X19nZXRab29tKHQpO3dpbmRvdy5zaG91bGRVc2VTY2FsZUZhY3RvciYmKGkqPWwpO3ZhciBzPS41LF89MTAsYz1lP3RfYW5pbWF0aW9uRXh0X19nZXRQYXJhbGxheFNwZWVkKGUsLTEwLF8pOjAsZDtyZXR1cm57ZWw6dCxlbEhlaWdodDpyLGVsVG9wUG9zOmksZWxCb3R0b21Qb3M6citpLHBvc1k6dF9hbmltYXRpb25FeHRfX2dldFBhcmFsbGF4UG9zaXRpb24oYyxzKSxzcGVlZDpjLGlzQWJvdmVQYXJhbGxheDpvfX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvbkV4dF9fYW5pbWF0ZVBhcmFsbGF4QnlTY3JvbGwodCl7dmFyIGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxhPXdpbmRvdy5wYWdlWU9mZnNldCxuPWErZTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBpPXQuZWxUb3BQb3M8biYmdC5lbEJvdHRvbVBvcz5hJiZ0LmVsQm90dG9tUG9zPD1uJiZ0LmVsVG9wUG9zPj1hO2lmKHQuaXNBYm92ZVBhcmFsbGF4fHxpKXt2YXIgcj0obi10LmVsVG9wUG9zKS8odC5lbEhlaWdodCtlKSxvPXRfYW5pbWF0aW9uRXh0X19nZXRQYXJhbGxheFBvc2l0aW9uKHQuc3BlZWQscik7dC5pc0Fib3ZlUGFyYWxsYXh8fCh0LnBvc1k9byx0LmlzQWJvdmVQYXJhbGxheD0hMCksby09dC5wb3NZLHQuZWwuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVZKCIrbysicHgpIn19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2NhbGNTY2FsZWREaWZmKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKTtpZih3aW5kb3cuaXNPbmx5U2NhbGFibGUmJmUmJnQpe3ZhciBhLG4saT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcC1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDt0LnNldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZWQtZGlmZiIsaS50b1N0cmluZygpKX12YXIgcj10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZWQtZGlmZiIpfHwiMCI7cmV0dXJuIHBhcnNlSW50KHIsMTApfWZ1bmN0aW9uIHRfYW5pbWF0aW9uRXh0X19nZXRQYXJhbGxheFNwZWVkKHQsZSxhKXtyZXR1cm4gdDw9ZT9lOnQ+PWE/YTp0fWZ1bmN0aW9uIHRfYW5pbWF0aW9uRXh0X19nZXRQYXJhbGxheFBvc2l0aW9uKHQsZSl7cmV0dXJuIE1hdGgucm91bmQodCooMTAwKigxLWUpKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2dldFB1cmVIZWlnaHQodCl7cmV0dXJuIHQ/KHQuY2xpZW50SGVpZ2h0fHx0Lm9mZnNldEhlaWdodHx8cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuaGVpZ2h0LDEwKSktKCh0LnN0eWxlLnBhZGRpbmdUb3B8fDApKyh0LnN0eWxlLnBhZGRpbmdCb3R0b218fDApKTowO3ZhciBlLGEsbn1mdW5jdGlvbiB0X2FuaW1hdGlvbkV4dF9faXNFbGVtZW50SGlkZGVuKHQpe3JldHVybiF0Lm9mZnNldFdpZHRoJiYhdC5vZmZzZXRIZWlnaHQmJiF0LmdldENsaWVudFJlY3RzKCkubGVuZ3RofWZ1bmN0aW9uIHRfYW5pbWF0ZVBhcmFsbGF4X19jaGVja09sZElFKCl7dmFyIHQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpO2lmKC0xPT09dClyZXR1cm4hMTt2YXIgZT1wYXJzZUludCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5zdWJzdHJpbmcodCs1LHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIi4iLHQpKSwxMCk7cmV0dXJuIDg9PT1lfHw5PT09ZXx8MTA9PT1lfWZ1bmN0aW9uIHRfYW5pbWF0aW9uRXh0X19nZXRab29tKHQpe2lmKHZvaWQgMCE9PXQuc2NhbGVGYWN0b3IpcmV0dXJuIHQuc2NhbGVGYWN0b3I7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKTtpZighZSlyZXR1cm4gMTt2YXIgYT1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpO3JldHVybiBlLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmRfc2NhbGUiKXx8IndpbmRvdyI9PT10X2FuaW1hdGlvbkV4dF9fZ2V0QXR0ckJ5UmVzKGUsImRhdGEtYXJ0Ym9hcmQtdXBzY2FsZSIsIiIsMCk/YSYmd2luZG93LnRuWyJhYiIrYV0mJndpbmRvdy50blsiYWIiK2FdLnNjYWxlRmFjdG9yfHx3aW5kb3cudG5fc2NhbGVfZmFjdG9yOjF9ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2dldEF0dHJCeVJlcyh0LGUsYSxuKXtpZighdHx8IWRvY3VtZW50LmNvbnRhaW5zKHQpKXJldHVybiIiO3ZhciBpPSJ5Ij09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtbW9iaWxlIikscixvPVtdLGwscyxfLGM9ImFiIit0LmNsb3Nlc3QoIi50Mzk2X19hcnRib2FyZCIpLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpO2lmKHZvaWQgMCE9PXdpbmRvdy50bltjXT8obnx8KG49d2luZG93LnRuW2NdLmN1clJlc29sdXRpb24pLGw9d2luZG93LnRuW2NdLmN1clJlc29sdXRpb25fbWF4LG89d2luZG93LnRuW2NdLnNjcmVlbnMuc2xpY2UoMCx3aW5kb3cudG5bY10uc2NyZWVucy5sZW5ndGgtMSkpOihufHwobj13aW5kb3cudG4uY3VyUmVzb2x1dGlvbiksbD0xMjAwLG89WzMyMCw0ODAsNjQwLDk2MF0pLG49PT1sKXJldHVybiB0LmdldEF0dHJpYnV0ZShhK2UpO2lmKGEmJiFpJiZuPDEyMDApcmV0dXJuIHQuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsIiI7aWYoIShyPXQuZ2V0QXR0cmlidXRlKGErZSsiLXJlcy0iK24pKSlmb3IodmFyIGQ9MDtkPG8ubGVuZ3RoO2QrKyl7dmFyIGY9b1tkXTtpZighKGY8PW4pJiYocj1mPT09bD90LmdldEF0dHJpYnV0ZShhK2UpOnQuZ2V0QXR0cmlidXRlKGErZSsiLXJlcy0iK2YpKSlicmVha31yZXR1cm4gcnx8KHQuZ2V0QXR0cmlidXRlKGErZSl8fCIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvbkV4dF9fZ2V0QW5pbWF0ZWRFbGVtZW50cyh0LGUpe3ZvaWQgMD09PWUmJihlPVtdKTt2YXIgYT0nLnQzOTZfX2FydGJvYXJkOm5vdChbZGF0YS1hcnRib2FyZC1maXhlZD0ieSJdKSAudDM5Nl9fZWxlbSwgLnQzOTZfX2FydGJvYXJkOm5vdChbZGF0YS1hcnRib2FyZC1maXhlZD0ieSJdKSAudDM5Nl9fZ3JvdXAnLG47cmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChhKSkuZmlsdGVyKGkpLmZpbHRlcihyKTtmdW5jdGlvbiBpKGEpe3JldHVybiBBcnJheS5mcm9tKGEuYXR0cmlidXRlcykuc29tZSgoZnVuY3Rpb24oYSl7dmFyIG49YS5uYW1lLGk9YS52YWx1ZSxyPSJkYXRhLWFuaW1hdGUtIit0O3JldHVybiEhbi5zdGFydHNXaXRoKHIpJiYoIWUubGVuZ3RofHxlLmluY2x1ZGVzKGkpKX0pKX1mdW5jdGlvbiByKGUpe3JldHVybiFlLmhhc0F0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLSIrdCsiLXByb2Nlc3NlZCIpfX1mdW5jdGlvbiB0X2FuaW1hdGlvbkV4dF9fZ2V0QXJ0Qm9hcmRzU2NyZWVucyh0KXt2b2lkIDA9PT10JiYodD1bXSk7dmFyIGU9W10sYT1bXSxhO3QmJnQubGVuZ3RoP2E9dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1hcnRib2FyZC1yZWNpZD0iJyt0KyciXScpfSkpLmZpbHRlcihCb29sZWFuKTphPShhPXRfYW5pbWF0aW9uRXh0X19nZXRBcnRib2FyZHMoIjM5NiIsITEpKS5jb25jYXQodF9hbmltYXRpb25FeHRfX2dldEFydGJvYXJkcygiMTIxIiwhMSkpO3JldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsKGZ1bmN0aW9uKHQpe3ZhciBhPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksbj0iYWIiK2EsaT1bXSxyO3ZvaWQgMCE9PXdpbmRvdy50bltuXT8oaT13aW5kb3cudG5bbl0uc2NyZWVucy5zbGljZSgpLnJldmVyc2UoKSxyPXdpbmRvdy50bltuXS5jdXJSZXNvbHV0aW9uX21heCk6KGk9WzEyMDAsOTYwLDY0MCw0ODAsMzIwXSxyPTEyMDApLGUucHVzaCh7cmVjaWQ6YSxzY3JlZW5zOmksc2NyZWVuTWF4OnJ9KX0pKSxlfWZ1bmN0aW9uIHRfYW5pbWF0aW9uRXh0X193cmFwRWwodCxlLGEsbil7aWYoIXQuY2xvc2VzdChhKSl7dmFyIGk9dC5jbG9zZXN0KCIudG4tZWxlbSwgLnRuLWdyb3VwIikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3IuY2xhc3NMaXN0LmFkZCh0KX0pKTt2YXIgbz1bImJ1dHRvbiIsImltYWdlIl0uaW5jbHVkZXModC5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSk7ci5zdHlsZS5kaXNwbGF5PW8/ImluaGVyaXQiOiJ0YWJsZSIsci5zdHlsZS53aWR0aD0iaW5oZXJpdCIsci5zdHlsZS5oZWlnaHQ9ImluaGVyaXQiLHIuc3R5bGUuYm9yZGVyUmFkaXVzPSJpbmhlcml0IixuP3IuYXBwZW5kQ2hpbGQobik6ci5hcHBlbmRDaGlsZCh0KSxpLmFwcGVuZENoaWxkKHIpLHRfYW5pbWF0aW9uRXh0X191cGRhdGVTdHlsZXNBZnRlcldyYXBwaW5nKG58fHQscixpKX19ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2dlbmVyYXRlV3JhcHBlckNsYXNzTGlzdCh0LGUpe3ZhciBhLG49Il9fIitlKyItd3JhcHBlciI7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0bi1tb2xlY3VsZSIpP1sidG4tbW9sZWN1bGUiK24sInRuLWF0b20iK25dOlsidG4tYXRvbSIrbl19ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2dlbmVyYXRlV3JhcHBlclNlbGVjdG9yKHQsZSl7dmFyIGEsbj0iX18iK2UrIi13cmFwcGVyIjtyZXR1cm4gdC5jbGFzc0xpc3QuY29udGFpbnMoInRuLW1vbGVjdWxlIik/Ii50bi1tb2xlY3VsZSIrbjoiLnRuLWF0b20iK24rIjpub3QoLnRuLW1vbGVjdWxlIituKyIpIn1mdW5jdGlvbiB0X2FuaW1hdGlvbkV4dF9fdXBkYXRlU3R5bGVzQWZ0ZXJXcmFwcGluZyh0LGUsYSl7dmFyIG49YT9hLmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKToiIixpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLmdldFByb3BlcnR5VmFsdWUoImJvcmRlci1yYWRpdXMiKTsic2hhcGUiPT09biYmcGFyc2VJbnQoaSwxMCkmJihlLnN0eWxlLmJvcmRlclJhZGl1cz1pKTt2YXIgcj1bImZpbHRlciIsImJhY2tkcm9wLWZpbHRlciJdLG87aWYoKHI9KHI9ci5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSItd2Via2l0LSIrdCxuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLmdldFByb3BlcnR5VmFsdWUodCk7aWYoIm5vbmUiIT09biYmIiIhPT1ufHwobj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGUpKSwibm9uZSIhPT1uJiYiIiE9PW4pcmV0dXJue2ZpbHRlcjp0LHdlYmtpdEZpbHRlcjplLHZhbHVlOm59fSkpKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpKS5mb3JFYWNoKChmdW5jdGlvbihuKXstMSE9PW5hdmlnYXRvci51c2VyQWdlbnQuc2VhcmNoKCJGaXJlZm94IikmJihlLnN0eWxlLmJhY2tmYWNlVmlzaWJpbGl0eT0idmlzaWJsZSIpLGUuc3R5bGVbbi53ZWJraXRGaWx0ZXJdPW4udmFsdWUsZS5zdHlsZVtuLmZpbHRlcl09bi52YWx1ZSxhLnN0eWxlW24ud2Via2l0RmlsdGVyXT0ibm9uZSIsYS5zdHlsZVtuLmZpbHRlcl09Im5vbmUiLCJub25lIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLnRyYW5zZm9ybSYmKHQuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVaKDApIil9KSksL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmci5sZW5ndGgmJiJpbWFnZSI9PT1uKXt2YXIgbD1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtsLmluaXRFdmVudCgiYmFja2Ryb3BGaWx0ZXJJbWdXcmFwcGVyZWQiLCEwLCEwKSxhLmRpc3BhdGNoRXZlbnQobCksYS5jbGFzc0xpc3QuYWRkKCJ0Mzk2X19lbGVtLS1iYWNrZHJvcC1maWx0ZXItaW1nLXdyYXBwZXJlZCIpfXRfYW5pbWF0aW9uRXh0X19jaHJvbWVGaXhCYWNrZHJvcEZpbHRlcih0LGUscil9ZnVuY3Rpb24gdF9hbmltYXRpb25FeHRfX2Nocm9tZUZpeEJhY2tkcm9wRmlsdGVyKHQsZSxhKXt2YXIgbj1hLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiJiYWNrZHJvcC1maWx0ZXIiPT09dC5maWx0ZXJ9KSk7aWYoLTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpJiZuKXt2YXIgaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWNvbG9yIikscj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5nZXRQcm9wZXJ0eVZhbHVlKCJvcGFjaXR5Iik7aWYoInJnYmEoMCwgMCwgMCwgMCkiIT09aSYmIjEiIT09cil7dmFyIG89aS5zdWJzdHJpbmcoaS5pbmRleE9mKCIoIikrMSxpLmluZGV4T2YoIikiKSk7ZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYmEoIitvKyIsIityKyIpIix0LnN0eWxlLm9wYWNpdHk9IjEiLHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJ0cmFuc3BhcmVudCJ9fX13aW5kb3cudF9hbmltYXRpb25FeHRfX2lzTW9iaWxlPS9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQsdF9vblJlYWR5KHRfYW5pbWF0aW9uRXh0X19pbml0KTsKCmZ1bmN0aW9uIHQzOTZfX3BhcnNlR2xvYmFsU3R5bGVDU1NWYXIodCl7dHJ5e3ZhciBlLG49L3ZhclwoKC0tdWMtKFteLV0rKS0oW14tXSspLShbXixdKykpLFxzPyguKilcKS8uZXhlYyh0KTtpZighbilyZXR1cm47dmFyIGk9blswXSxhPW5bMV0scj1uWzJdLG89blszXSxzPW5bNF0sbD1uWzVdLF8sYztpZighKGkmJnImJm8mJnMmJmwpKXJldHVybjtyZXR1cm57cGFyZW50OntpZDpzLHR5cGU6cn0sZmFsbGJhY2s6d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZShhKXx8bCxmaWVsZDpvfX1jYXRjaChtKXtjb25zb2xlLmVycm9yKCJFcnJvciB0cnlpbmcgdG8gcGFyc2UgQ1NTIFZhcmlhYmxlIil9fWZ1bmN0aW9uIHQzOTZfX2hleDJyZ2JhKHQsZSl7aWYoIXQpcmV0dXJuITE7dmFyIG49dDM5Nl9fcGFyc2VHbG9iYWxTdHlsZUNTU1Zhcih0KTtuJiYodD1uLmZhbGxiYWNrKTt2YXIgaT10LnJlcGxhY2UoLyMvLCIiKTtpZigzPT09aS5sZW5ndGgpe3ZhciBhPWlbMF0scj1pWzFdLG89aVsyXTt0PSIjIithK2ErcityK28rb312YXIgcz1wYXJzZUludCh0LnN1YnN0cmluZygxKSwxNiksbCxfLGM7cmV0dXJuWygxNjcxMTY4MCZzKT4+MTYsKDY1MjgwJnMpPj44LDI1NSZzLHBhcnNlRmxvYXQoZSldfWZ1bmN0aW9uIHQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCl7dmFyIGU9WyJnYWxsZXJ5Il0sbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKTtyZXR1cm4gZS5pbmNsdWRlcyhuKX1mdW5jdGlvbiB0Mzk2X19pc0ZsZXgodCl7dmFyIGU9dC5jbGFzc0xpc3QuY29udGFpbnMoInQzOTZfX2FydGJvYXJkLWZsZXgiKSxuPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cC1mbGV4Iik7cmV0dXJuIGV8fG59ZnVuY3Rpb24gdDM5Nl9fc2V0T3ZlcmZsb3dUb0FsbFJlY29yZHMoKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpO2lmKHQpe3ZhciBlPVsiLnQ5NTFfX3NpZGViYXJfc3RpY2t5IiwiLnQxMjA2X19jb250ZW50X3N0aWNreSIsIi50NzU0X19jb2xfZml4ZWQiLCIudDc3Nl9fY29sX2ZpeGVkIiwiLnQ3ODZfX2NvbF9maXhlZCIsIi50LXN0b3JlX19wcm9kLXBvcHVwX19jb2xfZml4ZWQiXTt0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKTt2YXIgbj1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZS5qb2luKCIsICIpKSk7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiLCJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpLHQuY2xhc3NMaXN0LmFkZChuPyJ0LXJlY29yZHNfX292ZXJmbG93LWNsaXAiOiJ0LXJlY29yZHNfX292ZXJmbG93LWhpZGRlbiIpfX1mdW5jdGlvbiB0Mzk2X19nZW5lcmF0ZU92ZXJmbG93U3R5bGUoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInQzOTZfX292ZXJmbG93LXN0eWxlcyIpKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3QuaWQ9InQzOTZfX292ZXJmbG93LXN0eWxlcyIsdC5pbm5lckhUTUw9Ii50LXJlY29yZHNfX292ZXJmbG93LWNsaXAgeyBvdmVyZmxvdzogY2xpcDsgfVxuXHRcdFx0XHRcdFx0LnQtcmVjb3Jkc19fb3ZlcmZsb3ctaGlkZGVuIHsgb3ZlcmZsb3c6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdDM5Nl9fZ2V0QXJ0Ym9hcmRzKHQpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksbixpPWUmJiJlZGl0Ij09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLW1vZGUiKT8nLnJlY29yZFtkYXRhLXJlY29yZC10eXBlPSInK3QrJyJdIC5yOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQsIC5yZWNvcmRbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXSAucjpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJzonLnJbZGF0YS1yZWNvcmQtdHlwZT0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkLCAucltkYXRhLXBhcmVudHRwbGlkPSInK3QrJyJdOm5vdCgudDM5N19fb2ZmLCAudDM5NV9fb2ZmLCAudDQwMF9fb2ZmKSAudDM5Nl9fYXJ0Ym9hcmQnO3JldHVybiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoaSkpfWZ1bmN0aW9uIHQzOTZfX2dldFplcm9CbG9ja3MoKXt2YXIgdD1bXS5jb25jYXQodDM5Nl9fZ2V0QXJ0Ym9hcmRzKCIzOTYiKSx0Mzk2X19nZXRBcnRib2FyZHMoIjEyMSIpKSxlO3JldHVybiB0Lmxlbmd0aD90Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3JlY29yZDp0LmNsb3Nlc3QoIi5yOm5vdCgudDM5N19fb2ZmKTpub3QoLnQzOTVfX29mZik6bm90KC50NDAwX19vZmYpIiksYXJ0Ym9hcmQ6dH19KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZWNvcmR9KSk6W119ZnVuY3Rpb24gdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpe2Zvcih2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO2U7KXt2YXIgbjtpZihlLnN0eWxlLnpvb20pcmV0dXJuITA7ZT1udWxsPT0obj1lLnBhcmVudEVsZW1lbnQpP3ZvaWQgMDpuLmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpfXJldHVybiExfXZhciB0Mzk2X191bmlxdWVJZF9fZ2VuZXJhdG9yPWZ1bmN0aW9uIHQoKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PVN0cmluZyhlKz0xKS5wYWRTdGFydCg2LCIwIik7cmV0dXJuIiIrRGF0ZS5ub3coKSt0fX0sdDM5Nl9fZ2V0VW5pcXVlSWQ9dDM5Nl9fdW5pcXVlSWRfX2dlbmVyYXRvcigpO2Z1bmN0aW9uIHQzOTZfaXNCbG9ja1Zpc2libGUodCl7dmFyIGU9d2luZG93LmlubmVyV2lkdGgsbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWluIiksaT10LmdldEF0dHJpYnV0ZSgiZGF0YS1zY3JlZW4tbWF4Iik7cmV0dXJuIShuJiZlPHBhcnNlSW50KG4sMTApKSYmIShpJiZlPnBhcnNlSW50KGksMTApKX12YXIgdDM5Nl9fb25SZWFkeT1mdW5jdGlvbiB0KGUpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZSgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpfTtmdW5jdGlvbiB0Mzk2X2VsZW1fX2dldEZvcm1JbnB1dHNWYWx1ZSh0KXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19pbnB1dHMtZGF0YSIpO2lmKGUpe3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXZhbHVlIik7aWYobil0cnl7cmV0dXJuIEpTT04ucGFyc2Uobil9Y2F0Y2gocil7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgZGF0YToiLHIsbiksW119fXZhciBpPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX2lucHV0cy10ZXh0YXJlYSIpO2lmKGkpe3ZhciBhPWkudmFsdWU7aWYoYSl0cnl7cmV0dXJuIEpTT04ucGFyc2UoYSl9Y2F0Y2gocil7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgZm9ybSBpbnB1dHMgdGV4dGFyZWEgdmFsdWU6IixyLGEpLFtdfX1yZXR1cm5bXX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSgpeyJ2aXNpYmxlIj09PWRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmKHRfYW5pbWF0aW9uU0JTX19vblJlYWR5KHRfYW5pbWF0aW9uU0JTX19pbml0KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0X2FuaW1hdGlvblNCU19fY2hlY2tWaXNpYmlsaXR5UGFnZSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19vblJlYWR5KHQpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dCgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0KCl7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxlPXQ/ImVkaXQiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtbW9kZSIpOm51bGw7ZXx8KGU9Qm9vbGVhbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZm9yX3JlZGFjdG9yX3Rvb2xiYXIiKSkpLC9Cb3QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHxkb2N1bWVudC5kb2N1bWVudE1vZGU8MTF8fGV8fCh0X2FuaW1hdGlvblNCU19fcHJvY2Vzc0hvcml6b250YWxTY3JvbGwoKSx0X2FuaW1hdGlvblNCU19faXNaZXJvQmxvY2tzUmVuZGVyZWQoKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfaXNJbnN0YWdyYW1SZW5kZXJlZCgoZnVuY3Rpb24oKXt2YXIgdDt0X2FuaW1hdGlvblNCU19fc2V0QXV0b1NjYWxlSW5mbygpLHRfYW5pbWF0aW9uU0JTX193cmFwQW5kVXBkYXRlRWxzKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFuaW1hdGUtc2JzLWV2ZW50XSIpKSksdF9hbmltYXRpb25TQlNfX2luaXRBbGxSZXMoZSl9KSl9KSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzSG9yaXpvbnRhbFNjcm9sbCgpe3ZhciB0PSdbZGF0YS1hbmltYXRlLXNicy1ldmVudD0ic2Nyb2xsIl0nLGU9QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpKSxuLGk7ZS5sZW5ndGgmJihlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIil9KSkuc29tZSgoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtb3ZyZmx3Iik7cmV0dXJuWyJ2aXNpYmxlIiwidmlzaWJsZVgiXS5pbmNsdWRlcyhlKX0pKT90Mzk2X19zZXRPdmVyZmxvd1RvQWxsUmVjb3JkcygpOih0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVPdmVyZmxvd1N0eWxlcygpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU7dC5jbG9zZXN0KCIuciIpLmNsYXNzTGlzdC5hZGQoInQtYW5pbWF0aW9uLXNic19fb3ZlcmZsb3cteCIpfSkpKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlT3ZlcmZsb3dTdHlsZXMoKXtpZighZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNicy1hbmltYXRpb24tYmxvY2stb3ZlcmZsb3ciKSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0LmlkPSJzYnMtYW5pbWF0aW9uLWJsb2NrLW92ZXJmbG93Iix0LmlubmVySFRNTD0iLnQtYW5pbWF0aW9uLXNic19fb3ZlcmZsb3cteCB7IG92ZXJmbG93LXg6IGhpZGRlbjsgfSIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEF1dG9TY2FsZUluZm8oKXtpZih2b2lkIDA9PT13aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3Ipe3ZhciB0PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9GaXJlZm94XC8oWzAtOV0rKVwuLyksZT10P3BhcnNlSW50KHRbMV0sMTApOjEyNixuPXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9DaHJvbWVcLyhbMC05XSspXC4vKSxpPW4mJnBhcnNlSW50KG5bMV0sMTApfHwwO3dpbmRvdy5pc09ubHlTY2FsYWJsZT1lPDEyNix3aW5kb3cuc2hvdWxkVXNlU2NhbGVGYWN0b3I9IXdpbmRvdy5pc09ubHlTY2FsYWJsZSYmIXQmJmk8PTEyN319ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2lzWmVyb0Jsb2Nrc1JlbmRlcmVkKHQpe3ZhciBlPXRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHMoIjM5NiIpLG49dF9hbmltYXRpb25TQlNfX2dldEFydGJvYXJkcygiMTIxIiksaT1bXS5jb25jYXQoZSxuKTtpZihpLmxlbmd0aCl7dmFyIGE9ITE7aWYoaS5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKXQoKTtlbHNlIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdFtzcmMqPSJ0aWxkYS1ibG9ja3MtMiJdLCBzY3JpcHRbc3JjKj0idGlsZGEtYmxvY2tzLTEiXScpLmxlbmd0aCl0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdChpLERhdGUubm93KCksdCk7ZWxzZXt2YXIgcj1pLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpO2kuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5jbGFzc0xpc3QuY29udGFpbnMoInJlbmRlcmVkIil8fGUuYWRkRXZlbnRMaXN0ZW5lcigiYXJ0Qm9hcmRSZW5kZXJlZCIsKGZ1bmN0aW9uKCl7ci5wdXNoKGUpLHIubGVuZ3RoIT09aS5sZW5ndGh8fGF8fHQoKX0pKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2E9ITAsci5sZW5ndGghPT1pLmxlbmd0aCYmdCgpfSksM2UzKX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBcnRib2FyZHModCl7dmFyIGU9Jy5yW2RhdGEtcmVjb3JkLXR5cGU9IicrdCsnIl06bm90KC50Mzk3X19vZmYsIC50Mzk1X19vZmYsIC50NDAwX19vZmYpIC50Mzk2X19hcnRib2FyZCwgLnJbZGF0YS1wYXJlbnR0cGxpZD0iJyt0KyciXTpub3QoLnQzOTdfX29mZiwgLnQzOTVfX29mZiwgLnQ0MDBfX29mZikgLnQzOTZfX2FydGJvYXJkJztyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGUpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYmFja3dhcmRDb21wYXRpYmlsaXR5V2FpdCh0LGUsbil7aWYodC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJyZW5kZXJlZCIpfSkpKW4oKTtlbHNle2lmKERhdGUubm93KCktZT4xZTQpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJhbGwgemVyby1ibG9ja3MgY2FuJ3QgYmUgcmVuZGVyZWQiKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX19iYWNrd2FyZENvbXBhdGliaWxpdHlXYWl0KHQsZSxuKX0pLDUwMCl9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX2lzSW5zdGFncmFtUmVuZGVyZWQodCl7aWYod2luZG93LmFuaW1hdGlvblNCU19faXNJT1MmJi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJJbnN0YWdyYW0iKSl2YXIgZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy5pbm5lcldpZHRoIT09c2NyZWVuLndpZHRoJiZ3aW5kb3cuaW5uZXJIZWlnaHQ+d2luZG93LmlubmVyV2lkdGg/dF9hbmltYXRpb25TQlNfaXNJbnN0YWdyYW1SZW5kZXJlZCh0KTooY2xlYXJUaW1lb3V0KGUpLHQoKSl9KSwxMDApO2Vsc2UgdCgpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX193cmFwQW5kVXBkYXRlRWxzKHQpe3ZhciBlPS0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPXQucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpO2lmKG4pey0xPT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSYmKG4uc3R5bGUuV2Via2l0QmFja2ZhY2VWaXNpYmlsaXR5PSJoaWRkZW4iLG4uc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5PSJoaWRkZW4iKTt2YXIgaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnModCwicHVibGlzaGVkIixudWxsKTtpZighaSYmYSl7dmFyIHI9Z2V0Q29tcHV0ZWRTdHlsZShuKS5kaXNwbGF5LG87bi5jbGFzc0xpc3QuY29udGFpbnMoInRuLW1vbGVjdWxlIikmJiJmbGV4IiE9PXImJihuLnN0eWxlLmRpc3BsYXk9ImluaGVyaXQiKTt2YXIgcz10X2FuaW1hdGlvblNCU19fZ2V0U2NhbGVXcmFwcGVyKG4pLGw9dC5zdHlsZS50cmFuc2Zvcm0sXztsJiYtMSE9PWwuaW5kZXhPZigibWF0cml4KCIpJiYodF9hbmltYXRpb25TQlNfX3dyYXBFbChzfHxuLCJ0bi1hdG9tX19zYnMtdHJhbnNmb3JtLXdyYXBwZXIiKSwoXz10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtdHJhbnNmb3JtLXdyYXBwZXIiKSkuc3R5bGUudHJhbnNmb3JtPWwsdC5zdHlsZS50cmFuc2Zvcm09IiIpLHRfYW5pbWF0aW9uU0JTX193cmFwRWwoKF89dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLXRyYW5zZm9ybS13cmFwcGVyIikpfHxzfHxuLCJ0bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksaT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0eWxlc0FmdGVyV3JhcHBpbmcodCxffHxpLGUpfX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFNjYWxlV3JhcHBlcih0KXtpZighdClyZXR1cm4gbnVsbDt2YXIgZT10LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpLG49dC5jbGFzc0xpc3QuY29udGFpbnMoInRuLWF0b20iKTtyZXR1cm4gZSYmbj9udWxsOnQuY2xvc2VzdCgiLnRuLWF0b21fX3NjYWxlLXdyYXBwZXIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVsT25SZXNpemUodCl7aWYodC5sZW5ndGgpe3ZhciBlPXQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hdC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpfSkpO2UubGVuZ3RoJiZ0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVscyhlKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0eWxlc0FmdGVyV3JhcHBpbmcodCxlLG4pe3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpLGE9Z2V0Q29tcHV0ZWRTdHlsZSh0KSxyPWEuZ2V0UHJvcGVydHlWYWx1ZSgiYm9yZGVyLXJhZGl1cyIpOyJzaGFwZSIhPT1pJiYiYnV0dG9uIiE9PWkmJiJpbWFnZSIhPT1pfHwhcGFyc2VJbnQociwxMCl8fChlLnN0eWxlLmJvcmRlclJhZGl1cz1yKTt2YXIgbz1bImZpbHRlciIsImJhY2tkcm9wLWZpbHRlciJdO289KG89by5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSItd2Via2l0LSIrdCxuPWEuZ2V0UHJvcGVydHlWYWx1ZSh0KTtpZigibm9uZSIhPT1uJiYiIiE9PW58fChuPWEuZ2V0UHJvcGVydHlWYWx1ZShlKSksIm5vbmUiIT09biYmIiIhPT1uKXJldHVybntmaWx0ZXI6dCx3ZWJraXRGaWx0ZXI6ZSx2YWx1ZTpufX0pKSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKTt2YXIgcz10LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKSxsPWdldENvbXB1dGVkU3R5bGUocykudHJhbnNmb3JtLF89ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7Xy5pbml0RXZlbnQoImJhY2tkcm9wRmlsdGVySW1nV3JhcHBlcmVkIiwhMCwhMCksby5mb3JFYWNoKChmdW5jdGlvbihhKXt3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzRmlyZWZveCYmKGUuc3R5bGUuYmFja2ZhY2VWaXNpYmlsaXR5PSJ2aXNpYmxlIiksZS5zdHlsZVthLndlYmtpdEZpbHRlcl09YS52YWx1ZSxlLnN0eWxlW2EuZmlsdGVyXT1hLnZhbHVlLHQuc3R5bGVbYS53ZWJraXRGaWx0ZXJdPSJub25lIix0LnN0eWxlW2EuZmlsdGVyXT0ibm9uZSIsImltYWdlIj09PWkmJndpbmRvdy50X2FuaW1hdGlvblNCU19faXNTYWZhcmkmJih0LmRpc3BhdGNoRXZlbnQoXyksdC5jbGFzc0xpc3QuYWRkKCJ0Mzk2X19lbGVtLS1iYWNrZHJvcC1maWx0ZXItaW1nLXdyYXBwZXJlZCIpKSxuJiYiYmFja2Ryb3AtZmlsdGVyIj09PWEuZmlsdGVyJiYocy5zdHlsZVthLndlYmtpdEZpbHRlcl09ImluaGVyaXQiLHMuc3R5bGVbYS5maWx0ZXJdPSJpbmhlcml0IiksIm5vbmUiPT09bCYmKHMuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGVaKDApIil9KSk7dmFyIGM9by5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4iYmFja2Ryb3AtZmlsdGVyIj09PXQuZmlsdGVyfSkpO24mJmMmJnRfYW5pbWF0aW9uU0JTX19jaHJvbWVGaXhCYWNrZHJvcEZpbHRlcihzLGUpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jaHJvbWVGaXhCYWNrZHJvcEZpbHRlcih0LGUpe3ZhciBuPWdldENvbXB1dGVkU3R5bGUodCksaT1uLmdldFByb3BlcnR5VmFsdWUoImJhY2tncm91bmQtY29sb3IiKSxhPW4uZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpLHI9bi5nZXRQcm9wZXJ0eVZhbHVlKCJib3gtc2hhZG93Iik7aWYoInJnYmEoMCwgMCwgMCwgMCkiIT09aSYmIjEiIT09YSl7dmFyIG89aS5zdWJzdHJpbmcoaS5pbmRleE9mKCIoIikrMSxpLmluZGV4T2YoIikiKSkscz10X2FuaW1hdGlvblNCU19fcHJvY2Vzc0JveFNoYWRvd1JHQihyLGEpO3MmJihlLnN0eWxlLmJveFNoYWRvdz1zLHQuc3R5bGUuYm94U2hhZG93PSJub25lIiksZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYmEoIitvKyIsIithKyIpIix0LnN0eWxlLm9wYWNpdHk9IjEiLHQuc3R5bGUuYmFja2dyb3VuZENvbG9yPSJ0cmFuc3BhcmVudCIsdC5zdHlsZS5iYWNrZHJvcEZpbHRlcj0iaW5pdGlhbCIsdC5zdHlsZS5XZWJraXRCYWNrZHJvcEZpbHRlcj0iaW5pdGlhbCJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wcm9jZXNzQm94U2hhZG93UkdCKHQsZSl7aWYoIXQpcmV0dXJuITE7aWYoLTE9PT10LmluZGV4T2YoInJnYmEiKSYmLTE9PT10LmluZGV4T2YoInJnYiIpfHwiMSI9PT1lKXJldHVybiExO3ZhciBuPXQuc3Vic3RyaW5nKHQuaW5kZXhPZigiKCIpKzEsdC5pbmRleE9mKCIpIikpLGk9bi5zcGxpdCgiLCAiKTszPT09aS5sZW5ndGg/aS5wdXNoKGUpOmlbM10qPWU7dmFyIGE9dC5yZXBsYWNlKG4saS5qb2luKCIsICIpKTtyZXR1cm4tMSE9PWEuaW5kZXhPZigicmdiKCIpJiYoYT1hLnJlcGxhY2UoInJnYigiLCJyZ2JhKCIpKSxhfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0QWxsUmVzKHQpe3ZhciBlPXtlbGVtZW50czpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1hbmltYXRlLXNicy1ldmVudF0iKSksc2Nyb2xsVG9wOndpbmRvdy5wYWdlWU9mZnNldCxpc0VkaXRNb2RlOnQsY2xpY2tlZFRyaWdnZXJFbHM6W10saG92ZXJUcmlnZ2VyRWxzOltdfTtpZihlLmVsZW1lbnRzLmxlbmd0aCl7dF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YShlKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXMoZSk7dmFyIG49ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFsbHJlY29yZHMiKSxpPSEhbiYmInllcyI9PT1uLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1sYXp5Iik7KCJ5Ij09PXdpbmRvdy5sYXp5fHxpKSYmdF9vbkZ1bmNMb2FkKCJ0X2xhenlsb2FkX3VwZGF0ZSIsKGZ1bmN0aW9uKCl7dF9sYXp5bG9hZF91cGRhdGUoKX0pKTt2YXIgYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyhlLmVsZW1lbnRzKSxyLG89L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKCJSZXNpemVPYnNlcnZlciJpbiB3aW5kb3cpe3ZhciBzPXRfYW5pbWF0aW9uU0JTX19nZXRBbGxCcmVha3BvaW50cygpLGw7dF9hbmltYXRpb25TQlNfX2NyZWF0ZVJlc2l6ZU9ic2VydmVyKHticmVha3BvaW50czpzLGN1cnJlbnRSZXM6dF9hbmltYXRpb25TQlNfX2dldEN1cnJlbnRSZXMocyxvKSxpc01vYmlsZTpvfSxkKX1lbHNlIG8/d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIiwoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2QoKX0pLDMwMCl9KSk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZCk7dmFyIF89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnQzOTYiKSxjO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoXywoZnVuY3Rpb24odCl7dC5hZGRFdmVudExpc3RlbmVyKCJkaXNwbGF5Q2hhbmdlZCIsZCl9KSksd2luZG93LnRfYW5pbWF0aW9uU0JTX19pc1NhZmFyaSl7ZnVuY3Rpb24gbSgpezAhPT13aW5kb3cucGFnZVlPZmZzZXQmJmQoKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixtKX13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixtKX10X2FuaW1hdGlvblNCU19fdHJpZ2dlck5vU2Nyb2xsQW5pbWF0aW9uKGUsYSksZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnQ9InNjcm9sbCJdJykubGVuZ3RoJiYodF9hbmltYXRpb25TQlNfX3RyaWdnZXJTY3JvbGxBbmltKGUpLHRfYW5pbWF0aW9uU0JTX19jaGVja0ZyYW1lKGUpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfX2NoYW5nZUVsVmFsdWVzKGUpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ImNvbXBsZXRlIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJnRfYW5pbWF0aW9uU0JTX19jaGFuZ2VFbFZhbHVlcyhlKX0pLDNlMyl9ZnVuY3Rpb24gZCgpe2NsZWFyVGltZW91dChyKSxyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtYW5pbWF0ZS1zYnMtZXZlbnRdIikpO3RfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKGUsImVsZW1lbnRzIix0KSx0X2FuaW1hdGlvblNCU19fd3JhcEFuZFVwZGF0ZUVsT25SZXNpemUoZS5lbGVtZW50cyksdF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YShlKSx0X2FuaW1hdGlvblNCU19fdHJpZ2dlclNjcm9sbEFuaW0oZSksYT10X2FuaW1hdGlvblNCU19fZ2V0QW5pbUVsc09uVmlldyhlLmVsZW1lbnRzKSx0X2FuaW1hdGlvblNCU19fdHJpZ2dlck5vU2Nyb2xsQW5pbWF0aW9uKGUsYSksdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzKGUpfSksNTAwKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldEFuaW1FbHNPblZpZXcodCl7cmV0dXJuIHQuZmlsdGVyKChmdW5jdGlvbih0KXt2YXIgZT0iZGF0YS1hbmltYXRlLXNicy1ldmVudCI7cmV0dXJuImludG92aWV3Ij09PXQuZ2V0QXR0cmlidXRlKGUpfHwiYmxvY2tpbnRvdmlldyI9PT10LmdldEF0dHJpYnV0ZShlKX0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QWxsQnJlYWtwb2ludHMoKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuciAudDM5Nl9fYXJ0Ym9hcmQiKSksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10X2FuaW1hdGlvblNCU19fZ2V0UmVzT3B0cyh0KSxpPW4uYnJlYWtwb2ludHMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4tMT09PWUuaW5kZXhPZih0KX0pKTstMT09PShlPWUuY29uY2F0KGkpKS5pbmRleE9mKG4ucmVzTWF4KSYmZS5wdXNoKG4ucmVzTWF4KX0pKSxlLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0Q3VycmVudFJlcyh0LGUpe3ZhciBuLGk9ZXx8Im9udG91Y2hlbmQiaW4gZG9jdW1lbnQmJi0xIT09bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJBcHBsZVdlYktpdCIpP2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDp3aW5kb3cuaW5uZXJXaWR0aDtyZXR1cm4gdC5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gaT50fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsZSxuKXt0W2VdPW59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEtleUZvckFuaW1hdGVkT2JqZWN0KHQsZSxuKXt0W2VdfHx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LGUsbil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NyZWF0ZVJlc2l6ZU9ic2VydmVyKHQsZSl7dmFyIG49ZG9jdW1lbnQuYm9keS5nZXRDbGllbnRSZWN0cygpLGk9blswXS5oZWlnaHQsYTtuZXcgUmVzaXplT2JzZXJ2ZXIoKGZ1bmN0aW9uKGEpe2EuZm9yRWFjaCgoZnVuY3Rpb24oYSl7aWYoIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWJvZHlfc2Nyb2xsLWxvY2tlZCIpJiYhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoInQtYm9keV9wb3B1cHNob3dlZCIpKXt2YXIgcj10X2FuaW1hdGlvblNCU19fZ2V0Q3VycmVudFJlcyh0LmJyZWFrcG9pbnRzLHQuaXNNb2JpbGUpO2EuY29udGVudFJlY3QuaGVpZ2h0PT09aSYmdC5jdXJyZW50UmVzPT09cnx8KHQuY3VycmVudFJlcz1yLGk9blswXS5oZWlnaHQsZSgpKX19KSl9KSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fY2hhbmdlRWxWYWx1ZXModCl7dC5lbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbihlKXtkb2N1bWVudC5jb250YWlucyhlKSYmKHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKGUsdCksInNjcm9sbCI9PT1lLmFuaW1UeXBlJiZ0X2FuaW1hdGlvblNCU19fdXBkYXRlU3RlcHNWYWx1ZXMoZSkpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19jaGVja0ZyYW1lKHQpe3ZhciBlOyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lJiYodF9hbmltYXRpb25TQlNfX2NoZWNrUG9zQ2hhbmdlcyh0KSYmdF9hbmltYXRpb25TQlNfX3RyaWdnZXJTY3JvbGxBbmltKHQpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXt0X2FuaW1hdGlvblNCU19fY2hlY2tGcmFtZSh0KX0pKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NoZWNrUG9zQ2hhbmdlcyh0KXt2YXIgZT10LnNjcm9sbFRvcCxuPXdpbmRvdy5wYWdlWU9mZnNldDtyZXR1cm4gbjwwJiZ3aW5kb3cudF9hbmltYXRpb25TQlNfX2lzU2FmYXJpJiYobj0wKSx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LCJzY3JvbGxUb3AiLG4pLGUhPT1ufWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX190cmlnZ2VyU2Nyb2xsQW5pbSh0KXt0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCJzY3JvbGwiPT09ZS5hbmltVHlwZSl7dmFyIG49e29wYWNpdHk6MSxibHVyOjAsZml4OiExLGZpeGVkU2hpZnRZOjAsdHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxzY2FsZVg6MSxzY2FsZVk6MSxyb3RhdGU6MH07dF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNoZWNrU3RlcHModCxlLG4pLHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25VcGRhdGVUcmFuc2Zvcm0oZSxuKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNoZWNrU3RlcHModCxlLG4pe2Uuc3RlcHMuZm9yRWFjaCgoZnVuY3Rpb24oaSxhKXt2YXIgcj10LnNjcm9sbFRvcCtlLnRyaWdnZXJPZmZzZXQsbz10X2FuaW1hdGlvblNCU19fZ2V0Wm9vbShlKTtlLnNjYWxlZERpZmZlcmVuY2UmJihyKz1lLnNjYWxlZERpZmZlcmVuY2UpO3ZhciBzPXI+PWkuc3RhcnQsbD1yPGkuc3RhcnQsXz1pLmVuZDw9cixjPWkuZW5kPnI7aWYocyYmYyl7aS5zdGF0ZT0ic3RhcnRlZCIsZS53cmFwcGVyRWwmJihlLndyYXBwZXJFbC5zdHlsZS53aWxsQ2hhbmdlPSJ0cmFuc2Zvcm0iKTt2YXIgbT1yLWkuc3RhcnQsZD0wPT09aS5kaXN0PzE6bS9pLmRpc3Q7bi5wcmV2VW5maXhlZERpc3Q9aS5wcmV2VW5maXhlZERpc3QsdF9hbmltYXRpb25TQlNfX3Njcm9sbEFuaW1hdGlvbkNhbGNTdGVwU3R5bGVzKG4saSxkLGEsbyl9XyYmKGkuc3RhdGU9ImZpbmlzaGVkIixlLndyYXBwZXJFbCYmKGUud3JhcHBlckVsLnN0eWxlLndpbGxDaGFuZ2U9IiIpLHRfYW5pbWF0aW9uU0JTX19zY3JvbGxBbmltYXRpb25DYWxjU3RlcFN0eWxlcyhuLGksMSxhLG8pKSwhbHx8InN0YXJ0ZWQiIT09aS5zdGF0ZSYmImZpbmlzaGVkIiE9PWkuc3RhdGV8fChpLnN0YXRlPSJ1bmFjdGl2ZSIsZS53cmFwcGVyRWwmJihlLndyYXBwZXJFbC5zdHlsZS53aWxsQ2hhbmdlPSIiKSx0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2FsY1N0ZXBTdHlsZXMobixpLDAsYSxvKSl9KSksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpLGUuc3RlcHNbMV0mJjA9PT1lLnN0ZXBzWzFdLmRpc3QmJjA9PT1lLnN0ZXBzWzFdLnN0eWxlcy5vcGFjaXR5JiYidW5hY3RpdmUiPT09ZS5zdGVwc1sxXS5zdGF0ZSYmKG4ub3BhY2l0eT0wKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uQ2FsY1N0ZXBTdHlsZXModCxlLG4saSxhKXtpZighMD09PWUuc3R5bGVzLmZpeCYmInN0YXJ0ZWQiPT09ZS5zdGF0ZSYmKHQuZml4PSEwLHQuZml4ZWRTaGlmdFk9MCksITA9PT1lLnN0eWxlcy5maXgmJiJmaW5pc2hlZCI9PT1lLnN0YXRlJiYodC5maXg9ITEsdC5maXhlZFNoaWZ0WSs9ZS5kaXN0L2EpLCEwPT09ZS5zdHlsZXMuZml4JiYidW5hY3RpdmUiPT09ZS5zdGF0ZSl7aWYoaT4wJiYhMD09PXQuZml4KXJldHVybjt0LmZpeD0hMX10Lm9wYWNpdHkrPW4qKGUuc3R5bGVzLm9wYWNpdHktdC5vcGFjaXR5KSx0LmJsdXIrPW4qKGUuc3R5bGVzLmJsdXItdC5ibHVyKSx0LnRyYW5zbGF0ZVgrPW4qZS5zdHlsZXMubW92ZVgsdC50cmFuc2xhdGVZKz1uKmUuc3R5bGVzLm1vdmVZLHQuc2NhbGVYKz1uKihlLnN0eWxlcy5zY2FsZVgtdC5zY2FsZVgpLHQuc2NhbGVZKz1uKihlLnN0eWxlcy5zY2FsZVktdC5zY2FsZVkpLHQucm90YXRlKz1uKmUuc3R5bGVzLnJvdGF0ZX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2Nyb2xsQW5pbWF0aW9uVXBkYXRlVHJhbnNmb3JtKHQsZSl7aWYodC53cmFwcGVyRWwpe3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpLGk9Z2V0Q29tcHV0ZWRTdHlsZSh0KS53aWxsQ2hhbmdlLGE9d2luZG93LmlzT25seVNjYWxhYmxlfHx0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpO2lmKCEwPT09ZS5maXgmJiJmaXhlZCIhPT10LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbil7dmFyIHI9dC50cmlnZ2VyT2Zmc2V0LWUucHJldlVuZml4ZWREaXN0O2F8fChyLz1uKSx0LnNjYWxlZERpZmZlcmVuY2UmJihyKz10LnNjYWxlZERpZmZlcmVuY2UpLHQud3JhcHBlckVsLnN0eWxlLnRvcD1yKyJweCIsdC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb249ImZpeGVkIixpJiYiYXV0byIhPT1pJiYodC5zdHlsZS53aWxsQ2hhbmdlPSJ1bnNldCIpLHQuekluZGV4JiYodC53cmFwcGVyRWwuc3R5bGUuekluZGV4PXQuekluZGV4KX0hMT09PWUuZml4JiYiZml4ZWQiPT09dC53cmFwcGVyRWwuc3R5bGUucG9zaXRpb24mJih0LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbj0iIix0LndyYXBwZXJFbC5zdHlsZS50b3A9IiIsdC53cmFwcGVyRWwuc3R5bGUuekluZGV4PSIiLHQuekluZGV4JiYodC5zdHlsZS56SW5kZXg9dC56SW5kZXgpLHQuc3R5bGUud2lsbENoYW5nZT0iIiksdC53cmFwcGVyRWwuc3R5bGUub3BhY2l0eT1lLm9wYWNpdHkudG9TdHJpbmcoKTt2YXIgbz0iIjtpZihlLnRyYW5zbGF0ZVgpe3ZhciBzPWUudHJhbnNsYXRlWDthJiYocyo9biksbys9InRyYW5zbGF0ZVgoIitzLnRvRml4ZWQoMikrInB4KSJ9aWYoMCE9PWUudHJhbnNsYXRlWXx8MCE9PWUuZml4ZWRTaGlmdFkpe3ZhciBsPWUudHJhbnNsYXRlWStlLmZpeGVkU2hpZnRZO2EmJihsKj1uKSxvKz0idHJhbnNsYXRlWSgiK2wudG9GaXhlZCgyKSsicHgpIn0xPT09ZS5zY2FsZVgmJjE9PT1lLnNjYWxlWXx8KG8rPSJzY2FsZSgiK2Uuc2NhbGVYKyIsIitlLnNjYWxlWSsiKSIpLDAhPT1lLnJvdGF0ZSYmKG8rPSJyb3RhdGUoIitlLnJvdGF0ZSsiZGVnKSIpLHQud3JhcHBlckVsLnN0eWxlLnRyYW5zZm9ybT1vfHwic2NhbGUoMSkifX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXModCl7dmFyIGU9IiI7aWYodC5lbGVtZW50cy5mb3JFYWNoKChmdW5jdGlvbih0KXtpZigic2Nyb2xsIiE9PXQuYW5pbVR5cGUpe3ZhciBuPXt0aW1lRHVyYXRpb246MH0saT1bXSxhPXRfYW5pbWF0aW9uU0JTX19jcmVhdGVFbXB0eVN0eWxlT3B0aW9uc0ZvcktleWZyYW1lcyh0LnN0ZXBzKTt0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvbWJpbmVPYmplY3RzKHQuc3RlcHMsaSxuLGEpLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdEZyYW1lcyhpKSx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvdW50UGVyY2VudChpLG4pLHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdE9wYWNpdHlPbkZpcnN0U3RlcCh0LGkpO3ZhciByPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0VHh0U3R5bGVzKHQsaSksbztpZihuLnRpbWVEdXJhdGlvbi89MWUzLHIpaWYoZSs9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRGaW5hbENzcyh0LG4sciksImhvdmVyIj09PXQuYW5pbVR5cGV8fCJjbGljayI9PT10LmFuaW1UeXBlKSghdC5sb29wfHwibG9vcHdpdGhyZXZlcnNlIj09PXQubG9vcCkmJihlKz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldFJldmVyc2VBbmltKHQpKX19KSksZSl7aWYodC5pc0VkaXRNb2RlKXJldHVybiBlO3ZhciBuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5zYnMtYW5pbS1rZXlmcmFtZXMiKTtuP24udGV4dENvbnRlbnQhPT1lJiYobi50ZXh0Q29udGVudD1lKTooKG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkuY2xhc3NMaXN0LmFkZCgic2JzLWFuaW0ta2V5ZnJhbWVzIiksbi50ZXh0Q29udGVudD1lLGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLG4pKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NyZWF0ZUVtcHR5U3R5bGVPcHRpb25zRm9yS2V5ZnJhbWVzKHQpe3JldHVybnttb3ZlWDp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuc3R5bGVzLm1vdmVYfSkpLG1vdmVZOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dC5zdHlsZXMubW92ZVl9KSksc2NhbGVYOnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5zdHlsZXMuc2NhbGVYfSkpLHNjYWxlWTp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQuc3R5bGVzLnNjYWxlWX0pKSxyb3RhdGU6dC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10LnN0eWxlcy5yb3RhdGV9KSksYmx1cjp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuc3R5bGVzLmJsdXJ9KSksb3BhY2l0eTp0LmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQuc3R5bGVzLm9wYWNpdHl9KSksZml4OnQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiExPT09dC5zdHlsZXMuZml4fSkpfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvbWJpbmVPYmplY3RzKHQsZSxuLGkpe3QuZm9yRWFjaCgoZnVuY3Rpb24oYSxyKXt2YXIgbz17fTtmb3IodmFyIHMgaW4gby5zdHlsZXM9YS5zdHlsZXMsaSlpW3NdJiZkZWxldGUgby5zdHlsZXNbc107Int9IiE9PUpTT04uc3RyaW5naWZ5KG8uc3R5bGVzKSYmKG8udGltZT0xKmEudGltZXx8MCxyIT09dC5sZW5ndGgtMSYmKG8uZWFzZT10W3IrMV0uZWFzZSksZS5wdXNoKG8pLG4udGltZUR1cmF0aW9uKz1vLnRpbWUpfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdEZyYW1lcyh0KXt0LmZvckVhY2goKGZ1bmN0aW9uKGUsbil7dmFyIGk9bj09PXQubGVuZ3RoLTEsYT0wPT09bixyPWk/bnVsbDp0W24rMV0sbz1hP251bGw6dFtuLTFdO2Zvcih2YXIgcyBpbiBlLnN0eWxlcylhfHxzIGluIG8uc3R5bGVzfHx0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2FkZFN0eWxlVG9LZXlmcmFtZShlLG8scywwKSxpfHwocyBpbiByLnN0eWxlcz8ibW92ZVgiIT09cyYmIm1vdmVZIiE9PXMmJiJyb3RhdGUiIT09c3x8dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19yZWNhbGN1bGF0ZVZhbHVlKGUscixzKTp0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2FkZFN0eWxlVG9LZXlmcmFtZShlLHIscywxKSl9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19hZGRTdHlsZVRvS2V5ZnJhbWUodCxlLG4saSl7ImJsdXIiIT09biYmInJvdGF0ZSIhPT1uJiYibW92ZVgiIT09biYmIm1vdmVZIiE9PW58fChlLnN0eWxlc1tuXT0wPT09aT8wOnQuc3R5bGVzW25dKSwib3BhY2l0eSIhPT1uJiYic2NhbGVYIiE9PW4mJiJzY2FsZVkiIT09bnx8KGUuc3R5bGVzW25dPTA9PT1pPzE6dC5zdHlsZXNbbl0pfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fcmVjYWxjdWxhdGVWYWx1ZSh0LGUsbil7c3dpdGNoKG4pe2Nhc2Uicm90YXRlIjplLnN0eWxlcy5yb3RhdGUrPXQuc3R5bGVzLnJvdGF0ZTticmVhaztjYXNlIm1vdmVYIjplLnN0eWxlcy5tb3ZlWCs9dC5zdHlsZXMubW92ZVg7YnJlYWs7Y2FzZSJtb3ZlWSI6ZS5zdHlsZXMubW92ZVkrPXQuc3R5bGVzLm1vdmVZfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2NvdW50UGVyY2VudCh0LGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dLGE7aWYoMD09PW4pMD09PWUudGltZUR1cmF0aW9uP2kucGVyY2VudD0wOihhPSgxMDAqaS50aW1lL2UudGltZUR1cmF0aW9uKS50b0ZpeGVkKDIpLGkucGVyY2VudD1wYXJzZUZsb2F0KGEpKTtlbHNlIGlmKG49PT10Lmxlbmd0aC0xKWkucGVyY2VudD0xMDA7ZWxzZXt2YXIgcj10W24tMV0ucGVyY2VudDtpZigwPT09ZS50aW1lRHVyYXRpb24paS5wZXJjZW50PTA7ZWxzZXtpZihhPSgxMDAqaS50aW1lL2UudGltZUR1cmF0aW9uK3IpLnRvRml4ZWQoMiksMTAwPT09cGFyc2VJbnQoYSwxMCkmJm49PT10Lmxlbmd0aC0yJiYwIT09biljb250aW51ZTtpLnBlcmNlbnQ9cGFyc2VGbG9hdChhKX1pLnBlcmNlbnQ9PT1yJiYoaS5wZXJjZW50Kz0xKSxpLnBlcmNlbnQ+MTAwJiYoaS5wZXJjZW50PTk5KX19fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fY29ycmVjdE9wYWNpdHlPbkZpcnN0U3RlcCh0LGUpe3ZhciBuPWVbMV07dCYmdC5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpO3ZhciBpPXQ/dC5xdWVyeVNlbGVjdG9yKCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpOm51bGw7biYmMD09PW4udGltZSYmMD09PW4uc3R5bGVzLm9wYWNpdHk/KGkmJihpLnN0eWxlLm9wYWNpdHk9IjAiKSxlWzBdLnN0eWxlcy5vcGFjaXR5PTApOmkmJiIwIj09PWkuc3R5bGUub3BhY2l0eSYmaSYmKGkuc3R5bGUub3BhY2l0eT0iIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRUeHRTdHlsZXModCxlKXt2YXIgbj0iIjtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmNoYW5nZXN8fChlLmNoYW5nZXM9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRGcmFtZUNoYW5nZXModCxlKSksbis9Im51bWJlciI9PXR5cGVvZiBlLnBlcmNlbnQ/ZS5wZXJjZW50KyIlIHsiK2UuY2hhbmdlcysifVxuIjoiIn0pKSxufWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fc2hvdWxkVXNlWm9vbSh0LGUpe3ZhciBuLGk7aWYodDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KSlyZXR1cm4hdDM5Nl9faXNJbnNpZGVHcm91cFdpdGhab29tKHQpO3ZhciBhLHI9dF9hbmltYXRpb25TQlNfX2dldFNjYWxlV3JhcHBlcih0LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKSk7cmV0dXJuISgxIT09ZSYmIXIpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUtleWZyYW1lc19fZ2V0RnJhbWVDaGFuZ2VzKHQsZSl7dmFyIG49IiIsaT0iIixhPXt4OjEseToxLGNoYW5nZWQ6ITF9LHI9MSxvPXQzOTZfX2lzRWxlbWVudFVzaW5nQ2FsY1pvb20odCk7KHdpbmRvdy5pc09ubHlTY2FsYWJsZXx8bykmJihyPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpKTt2YXIgcz10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX3Nob3VsZFVzZVpvb20odCxyKTtmb3IodmFyIGwgaW4gc3x8KHI9MSksZS5zdHlsZXMpc3dpdGNoKGwpe2Nhc2Uib3BhY2l0eSI6bis9Im9wYWNpdHk6IitlLnN0eWxlcy5vcGFjaXR5KyI7IjticmVhaztjYXNlInNjYWxlWCI6YS54PWUuc3R5bGVzLnNjYWxlWCxhLmNoYW5nZWQ9ITA7YnJlYWs7Y2FzZSJzY2FsZVkiOmEueT1lLnN0eWxlcy5zY2FsZVksYS5jaGFuZ2VkPSEwO2JyZWFrO2Nhc2UibW92ZVgiOmkrPSJ0cmFuc2xhdGVYKCIrTWF0aC5yb3VuZChlLnN0eWxlcy5tb3ZlWCpyKSsicHgpIjticmVhaztjYXNlIm1vdmVZIjppKz0idHJhbnNsYXRlWSgiK01hdGgucm91bmQoZS5zdHlsZXMubW92ZVkqcikrInB4KSI7YnJlYWs7Y2FzZSJyb3RhdGUiOmkrPSJyb3RhdGUoIitlLnN0eWxlcy5yb3RhdGUrImRlZykifWlmKCEwPT09YS5jaGFuZ2VkJiYoaSs9InNjYWxlKCIrYS54KyIsIithLnkrIikiKSwiIiE9PWkmJihuKz0idHJhbnNmb3JtOiIraSsiOyIpLHZvaWQgMCE9PWUuZWFzZSlzd2l0Y2gobis9ImFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IixlLmVhc2Upe2Nhc2UiZWFzZUluIjpuKz0iZWFzZS1pbjsiO2JyZWFrO2Nhc2UiZWFzZU91dCI6bis9ImVhc2Utb3V0OyI7YnJlYWs7Y2FzZSJlYXNlSW5PdXQiOm4rPSJlYXNlLWluLW91dDsiO2JyZWFrO2Nhc2UiYm91bmNlRmluIjpuKz0iY3ViaWMtYmV6aWVyKDAuMzQsMS42MSwwLjcsMSk7IjticmVhaztkZWZhdWx0Om4rPSIiPT09ZS5lYXNlLnRyaW0oKT8ibGluZWFyOyI6ZS5lYXNlKyI7In1yZXR1cm4gbn1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVLZXlmcmFtZXNfX2dldEZpbmFsQ3NzKHQsZSxuKXt2YXIgaT0iIixhPXQudW5pcXVlSUQscj0iLnQtc2JzLWFuaW1fc3RhcnRlZCAjIit0LnVuaXF1ZUlELG87InB1Ymxpc2hlZCIhPT13aW5kb3cudGlsZGFtb2RlJiYodC50aW1lRHVyYXRpb249ZS50aW1lRHVyYXRpb24pLGkrPXIrIiB7XG5hbmltYXRpb246ICIrYSsiICIrKDA9PT1lLnRpbWVEdXJhdGlvbj8xZS01OmUudGltZUR1cmF0aW9uKSsicyI7dmFyIHM9dC5sb29wJiYtMSE9PXQubG9vcC5pbmRleE9mKCJsb29wIik7cmV0dXJuIHMmJihpKz0iIGluZmluaXRlIiksaSs9IiBsaW5lYXIiLHM/Imxvb3B3aXRocmV2ZXJzZSI9PT10Lmxvb3AmJihpKz0iIGFsdGVybmF0ZSIpOmkrPSIgZm9yd2FyZHMiLGkrPSI7XG5iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbkBrZXlmcmFtZXMgIithKyIge1xuIituKyJ9XG5cbiJ9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlS2V5ZnJhbWVzX19nZXRSZXZlcnNlQW5pbSh0KXt2YXIgZT10X2FuaW1hdGlvblNCU19fZ2V0QXR0cmlidXRlU2VsZWN0b3IodCksbixpLGE9IlsiK2UuYXR0cmlidXRlKyc9IicrZS5pZCsnIl0nLHI7cmV0dXJuIiMiKyh0LmNsb3Nlc3QoIi50LXJlYyIpP3QuY2xvc2VzdCgiLnQtcmVjIikuZ2V0QXR0cmlidXRlKCJpZCIpOiIiKSsiICIrYSsiLnQtc2JzLWFuaW1fc3RhcnRlZC50LXNicy1hbmltX3JldmVyc2VkIC50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIHstd2Via2l0LWFuaW1hdGlvbi1kaXJlY3Rpb246IHJldmVyc2U7YW5pbWF0aW9uLWRpcmVjdGlvbjogcmV2ZXJzZTt9In1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QXR0cmlidXRlU2VsZWN0b3IodCl7dmFyIGU9e2ZlZWQ6ImRhdGEtZmUtZWxlbS1pZCIsZ3JvdXA6ImRhdGEtZ3JvdXAtaWQiLGVsZW1lbnQ6ImRhdGEtZWxlbS1pZCJ9LG49T2JqZWN0LmtleXMoZSkuZmluZCgoZnVuY3Rpb24obil7cmV0dXJuIHQuaGFzQXR0cmlidXRlKGVbbl0pfSkpO3JldHVybiBuJiZlW25dP3thdHRyaWJ1dGU6ZVtuXSxpZDp0LmdldEF0dHJpYnV0ZShlW25dKXx8IiJ9OnthdHRyaWJ1dGU6IiIsaWQ6IiJ9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRBbmltT3B0aW9ucyh0LGUsbil7aWYoIXQpcmV0dXJuIiI7dmFyIGk9WyJzYnMiLCJvcHRzIl07bnx8KG49ImVkaXQiPT09ZT9pLmpvaW4oIiIpOmkuam9pbigiLSIpKTt2YXIgYT0iZWRpdCI9PT1lPyJmaWVsZCI6ImFuaW1hdGUiLHI9ImVkaXQiPT09ZT8iLXZhbHVlIjoiIixvPSJlZGl0Ij09PWU/ImRhdGEtZmllbGQtYW5pbW1vYmlsZS12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1tb2JpbGUiLHM9InkiPT09dC5nZXRBdHRyaWJ1dGUobyksbCxfPXRfYW5pbWF0aW9uU0JTX19nZXRSZXNPcHRzKHQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikpLGM9dF9hbmltYXRpb25TQlNfX2dlbmVyYXRlQXR0cihhLG4sciwhMSk7aWYoXy5yZXM9PT1fLnJlc01heClyZXR1cm4gdC5nZXRBdHRyaWJ1dGUoYyk7aWYoIXMmJiJlZGl0IiE9PWUmJl8ucmVzPDEyMDApcmV0dXJuIHQuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsdC5jbGFzc0xpc3QucmVtb3ZlKCJ0Mzk2X19lbGVtLS1hbmltLWhpZGRlbiIpLCIiO3ZhciBtPXRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZUF0dHIoYSxuLHIsXy5yZXMpLGQ9dC5nZXRBdHRyaWJ1dGUobSk7cmV0dXJuIGR8fChfLmJyZWFrcG9pbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCEoZTw9Xy5yZXN8fGQpKXt2YXIgaT10X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVBdHRyKGEsbixyLGUpO2Q9dC5nZXRBdHRyaWJ1dGUoaSl9fSkpLGR8fHQuZ2V0QXR0cmlidXRlKGMpfHwiIil9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dlbmVyYXRlQXR0cih0LGUsbixpKXt2YXIgYT0iZGF0YS0iK3QrIi0iK2U7cmV0dXJuIGkmJihhKz0iLXJlcy0iK2kpLGErPW59ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFJlc09wdHModCl7dmFyIGU9WzEyMDAsOTYwLDY0MCw0ODAsMzIwXTtpZighd2luZG93LnRuKXt2YXIgbixpPXdpbmRvdy5pbm5lcldpZHRoO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe258fGk+PXQmJihuPXQpfSkpLHtyZXM6bnx8MzIwLHJlc01heDoxMjAwLGJyZWFrcG9pbnRzOlszMjAsNDgwLDY0MCw5NjBdfX12YXIgYT10P3QuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIik6IiIsbjtyZXR1cm4gYSYmd2luZG93LnRuWyJhYiIrYV0/e3Jlczp3aW5kb3cudDM5Nl9kZXRlY3RSZXNvbHV0aW9uP3QzOTZfZGV0ZWN0UmVzb2x1dGlvbihhKTp3aW5kb3cudG5bImFiIithXS5jdXJSZXNvbHV0aW9uLHJlc01heDp3aW5kb3cudG5bImFiIithXS5jdXJSZXNvbHV0aW9uX21heCxicmVha3BvaW50czp3aW5kb3cudG5bImFiIithXS5zY3JlZW5zLnNsaWNlKDAsLTEpfTp3aW5kb3cudG4uc2NyZWVucz97cmVzOndpbmRvdy50bi5jdXJSZXNvbHV0aW9uLHJlc01heDp3aW5kb3cudG4udG9wUmVzb2x1dGlvbixicmVha3BvaW50czp3aW5kb3cudG4uc2NyZWVucy5zbGljZSgwLC0xKX06e3JlczpuPXRfYW5pbWF0aW9uU0JTX19nZXRDdXJyZW50UmVzKGUsd2luZG93LmlzTW9iaWxlKSxyZXNNYXg6MTIwMCxicmVha3BvaW50czpbMzIwLDQ4MCw2NDAsOTYwXX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NhY2hlQW5kU2V0RGF0YSh0KXt0LmVsZW1lbnRzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIik7aWYoInNjcm9sbCIhPT1lLmFuaW1UeXBlfHwhbnx8ImZpeGVkIiE9PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUobiwicG9zIikpe3ZhciBpPXQuaXNFZGl0TW9kZT8iZGF0YS1maWVsZC1zYnNldmVudC12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiO2UuYW5pbVR5cGU9ZS5nZXRBdHRyaWJ1dGUoaSk7dmFyIGE9dC5pc0VkaXRNb2RlPyJkYXRhLWZpZWxkLXNic3RyZy12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtdHJnIjtlLnRyaWdnZXI9cGFyc2VGbG9hdChlLmdldEF0dHJpYnV0ZShhKSksaXNOYU4oZS50cmlnZ2VyKSYmKGUudHJpZ2dlcj0xKSxlLnRyaWdnZXJFbGVtcz10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnMoZSwicHVibGlzaGVkIiwic2JzLXRyZ2VscyIpLGUud3JhcHBlckVsPWUucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKTt2YXIgcj10X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnMoZSx0LmlzRWRpdE1vZGU/ImVkaXQiOiJwdWJsaXNoZWQiLG51bGwpO2lmKGUuc3RhdHVzPXI/ImFjdGl2ZSI6ImlubmFjdGl2ZSIsImlubmFjdGl2ZSIhPT1lLnN0YXR1cyl7LTEhPT1yLmluZGV4T2YoImZpeGVkIikmJihlLnpJbmRleD1nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoInotaW5kZXgiKSkscj1yLnJlcGxhY2UoLycvZywnIicpLHRfYW5pbWF0aW9uU0JTX19hZGREZWxheVRvU3RlcHMocj1KU09OLnBhcnNlKHIpKTt2YXIgbz10LmlzRWRpdE1vZGU/ImRhdGEtZmllbGQtc2JzbG9vcC12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtbG9vcCI7ZS5sb29wPWUuZ2V0QXR0cmlidXRlKG8pfHwiIix0X2FuaW1hdGlvblNCU19fc2V0QW5kQ2FjaGVFbFRvcFBvcyhlLHQpO3ZhciBzPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKGUpO2Uuc3RlcHM9W107dmFyIGw9MDtyLmZvckVhY2goKGZ1bmN0aW9uKHQsbil7dmFyIGk9e3N0YXRlOiJ1bmFjdGl2ZSJ9O2kuc3R5bGVzPXRfYW5pbWF0aW9uU0JTX19jcmVhdGVTdGVwU3R5bGVzKHQpLCJzY3JvbGwiPT09ZS5hbmltVHlwZT8oaS5wcmV2VW5maXhlZERpc3Q9bCxpLmRpc3Q9dC5kaSpzLCExPT09aS5zdHlsZXMuZml4JiYobCs9aS5kaXN0KSxpLnN0YXJ0PTA9PT1uP2UudG9wT2Zmc2V0OmUuc3RlcHNbbi0xXS5lbmQsaS5lbmQ9aS5zdGFydCtpLmRpc3QpOihpLnRpbWU9dC50aSxpLmVhc2U9dC5lYSksZS5zdGVwcy5wdXNoKGkpfSkpLCFlLndyYXBwZXJFbHx8ZS53cmFwcGVyRWwuaWQmJmUudW5pcXVlSUR8fHRfYW5pbWF0aW9uU0JTX19nZW5lcmF0ZVVuaXF1ZUlERm9yRWwoZSksdF9hbmltYXRpb25TQlNfX3VwZGF0ZUluZm9PbkltZ0xvYWQoZSx0KSx0X2FuaW1hdGlvblNCU19fdXBkYXRlTW92ZUFuZFJvdGF0ZVN0ZXBzU3R5bGVzKGUuc3RlcHMpfX19KSk7dmFyIGU9dC5lbGVtZW50cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe2lmKCJpbm5hY3RpdmUiPT09dC5zdGF0dXMpe3ZhciBlPXRfYW5pbWF0aW9uU0JTX19nZXRTaXplQmFzZWRPbkRpbWVuc2lvbk1vZGUodCksbj1lLndpZHRoLGk9ZS5oZWlnaHQ7dC53cmFwcGVyRWwmJnQud3JhcHBlckVsLnJlbW92ZUF0dHJpYnV0ZSgic3R5bGUiKSx0LndyYXBwZXJFbCYmKHQud3JhcHBlckVsLnN0eWxlLmRpc3BsYXk9InRhYmxlIiksdC53cmFwcGVyRWwmJih0LndyYXBwZXJFbC5zdHlsZS53aWR0aD1uKSx0LndyYXBwZXJFbCYmKHQud3JhcHBlckVsLnN0eWxlLmhlaWdodD1pKX1yZXR1cm4iaW5uYWN0aXZlIiE9PXQuc3RhdHVzfSkpO3RfYW5pbWF0aW9uU0JTX191cGRhdGVBbmltYXRlZE9iamVjdFN0YXRlKHQsImVsZW1lbnRzIixlKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2VuZXJhdGVVbmlxdWVJREZvckVsKHQpe3ZhciBlPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkLCAudG4tYXJ0Ym9hcmQiKSxuPSIiO2UmJihuPWUuZ2V0QXR0cmlidXRlKCJkYXRhLXJlY29yZC1pZCIpfHxlLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpKTt2YXIgaSxhPXRfYW5pbWF0aW9uU0JTX19nZXRBdHRyaWJ1dGVTZWxlY3Rvcih0KS5pZDt0LnVuaXF1ZUlEPSJzYnMtIituKyItIithLHQud3JhcHBlckVsLmlkPXQudW5pcXVlSUR9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3VwZGF0ZUluZm9PbkltZ0xvYWQodCxlKXt2YXIgbj10LnF1ZXJ5U2VsZWN0b3IoImltZyIpO24mJihuLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3RfYW5pbWF0aW9uU0JTX191cGRhdGVWYWx1ZXNBdGVySU1HTG9hZGluZyh0LGUpfSkpLG4uY29tcGxldGUmJnRfYW5pbWF0aW9uU0JTX191cGRhdGVWYWx1ZXNBdGVySU1HTG9hZGluZyh0LGUpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fdXBkYXRlVmFsdWVzQXRlcklNR0xvYWRpbmcodCxlKXt0X2FuaW1hdGlvblNCU19fc2V0QW5kQ2FjaGVFbFRvcFBvcyh0LGUpLCJzY3JvbGwiPT09dC5hbmltVHlwZSYmdF9hbmltYXRpb25TQlNfX3VwZGF0ZVN0ZXBzVmFsdWVzKHQpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVTdGVwc1ZhbHVlcyh0KXt0LnN0ZXBzLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7ZS5zdGFydD0wPT09bj90LnRvcE9mZnNldDp0LnN0ZXBzW24tMV0uZW5kLGUuZW5kPWUuc3RhcnQrZS5kaXN0fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRBbmRDYWNoZUVsVG9wUG9zKHQsZSl7dmFyIG49dF9hbmltYXRpb25TQlNfX2dldFpvb20odCksaSxhPVsic2Nyb2xsIiwiaW50b3ZpZXciLCJibG9ja2ludG92aWV3Il0uZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFuaW1UeXBlIT09ZX0pKTtpZighZS5pc0VkaXRNb2RlJiYhYSl7dmFyIHI9dF9hbmltYXRpb25TQlNfX2dldFRvcE9mZnNldCh0KTtyKz10X2FuaW1hdGlvblNCU19fYWNjdW11bGF0ZVBhcmVudEdyb3VwT2Zmc2V0KHQpLCJzY3JvbGwiIT09dC5hbmltVHlwZSYmImludG92aWV3IiE9PXQuYW5pbVR5cGV8fHdpbmRvdy5pc09ubHlTY2FsYWJsZXx8dDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KXx8KHIqPW4pO3ZhciBvPXQuY2xvc2VzdCgiLnIiKSxzPW8/by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0OjAsbD1vJiZwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKG8pLnBhZGRpbmdUb3AsMTApfHwwO3QucGFyZW50UmVjVG9wUG9zPXMsdC50b3BPZmZzZXQ9cytyK2wsdF9hbmltYXRpb25TQlNfX3NldFNjYWxlZERpZmZlcmVuY2UodCxuKSx0X2FuaW1hdGlvblNCU19fc2V0VHJpZ2dlck9mZnNldCh0KX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2dldFRvcE9mZnNldCh0KXtpZighdClyZXR1cm4gMDtpZih0LmdldEF0dHJpYnV0ZSgiZGF0YS1mZS1lbGVtLWlkIikpcmV0dXJuIHQub2Zmc2V0VG9wO3ZhciBlPXBhcnNlSW50KHQuc3R5bGUudG9wLDEwKTtyZXR1cm4gaXNOYU4oZSk/dC5vZmZzZXRUb3B8fDA6ZX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fYWNjdW11bGF0ZVBhcmVudEdyb3VwT2Zmc2V0KHQpe2Zvcih2YXIgZT0wLG49dC5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoIi50Mzk2X19ncm91cCIpO247KWUrPXRfYW5pbWF0aW9uU0JTX19nZXRUb3BPZmZzZXQobiksbj1uLnBhcmVudEVsZW1lbnQuY2xvc2VzdCgiLnQzOTZfX2dyb3VwIik7cmV0dXJuIGV9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldFNjYWxlZERpZmZlcmVuY2UodCxlKXtpZighdC5zY2FsZWREaWZmZXJlbmNlJiZ3aW5kb3cuaXNPbmx5U2NhbGFibGUmJiJmaXhlZCIhPT10LndyYXBwZXJFbC5zdHlsZS5wb3NpdGlvbiYmdDM5Nl9faXNFbGVtZW50VXNpbmdDYWxjWm9vbSh0KSl7dmFyIG49dC53cmFwcGVyRWw/dC53cmFwcGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0OjAsaT1NYXRoLmFicygobiplLW4pLzIpO2k9TWF0aC5yb3VuZChpKSx0LnNjYWxlZERpZmZlcmVuY2U9aX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FkZERlbGF5VG9TdGVwcyh0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG49dFtlXTtpZigwIT09ZSYmKHBhcnNlSW50KG4uZGQsMTApfHxwYXJzZUludChuLmR0LDEwKSkpe3ZhciBpPU9iamVjdC5jcmVhdGUodFtlLTFdKTt2b2lkIDAhPT1uLmR0P2kudGk9bi5kdDppLmRpPW4uZGQsdC5zcGxpY2UoZSwwLGkpLGUrK319fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVNb3ZlQW5kUm90YXRlU3RlcHNTdHlsZXModCl7dmFyIGU9dFswXS5zdHlsZXMubW92ZVgsbj10WzBdLnN0eWxlcy5tb3ZlWSxpPXRbMF0uc3R5bGVzLnJvdGF0ZTt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBhPXQuc3R5bGVzO2EubW92ZVgtPWUsZSs9YS5tb3ZlWCxhLm1vdmVZLT1uLG4rPWEubW92ZVksYS5yb3RhdGUtPWksaSs9YS5yb3RhdGV9KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2NyZWF0ZVN0ZXBTdHlsZXModCl7cmV0dXJue21vdmVYOnBhcnNlSW50KHQubXgsMTApfHwwLG1vdmVZOnBhcnNlSW50KHQubXksMTApfHwwLHNjYWxlWDppc05hTihwYXJzZUZsb2F0KHQuc3gpKT8xOnBhcnNlRmxvYXQodC5zeCksc2NhbGVZOmlzTmFOKHBhcnNlRmxvYXQodC5zeSkpPzE6cGFyc2VGbG9hdCh0LnN5KSxvcGFjaXR5OmlzTmFOKHBhcnNlRmxvYXQodC5vcCkpPzE6cGFyc2VGbG9hdCh0Lm9wKSxyb3RhdGU6cGFyc2VJbnQodC5ybywxMCl8fDAsYmx1cjpwYXJzZUludCh0LmJsLDEwKXx8MCxmaXg6ImZpeGVkIj09PXQuZml9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRUcmlnZ2VyT2Zmc2V0KHQpe3ZhciBlPXdpbmRvdy5pbm5lckhlaWdodCxuPXRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpO3QudHJpZ2dlck9mZnNldD1wYXJzZUludCh0X2FuaW1hdGlvblNCU19fZ2V0QW5pbU9wdGlvbnModCwicHVibGlzaGVkIiwic2JzLXRyZ29mc3QiKSwxMCksKHdpbmRvdy5pc09ubHlTY2FsYWJsZXx8InNjcm9sbCI9PT10LmFuaW1UeXBlfHx0Mzk2X19pc0VsZW1lbnRVc2luZ0NhbGNab29tKHQpKSYmKHQudHJpZ2dlck9mZnNldCo9biksdC50cmlnZ2VyT2Zmc2V0fHwodC50cmlnZ2VyT2Zmc2V0PTApLC41IT09dC50cmlnZ2VyJiYxIT09dC50cmlnZ2VyfHwodC50cmlnZ2VyT2Zmc2V0Kz1lKnQudHJpZ2dlciwoImludG92aWV3Ij09PXQuYW5pbVR5cGV8fCJzY3JvbGwiPT09dC5hbmltVHlwZSkmJnQudHJpZ2dlck9mZnNldD50LnRvcE9mZnNldCYmdC50cmlnZ2VyT2Zmc2V0PD1lKnQudHJpZ2dlciYmKHQudHJpZ2dlck9mZnNldD10LnRvcE9mZnNldCx0LnNjYWxlZERpZmZlcmVuY2UmJih0LnRyaWdnZXJPZmZzZXQ8MHx8dC50cmlnZ2VyT2Zmc2V0PT09dC5zY2FsZWREaWZmZXJlbmNlKSYmKHQuc2NhbGVkRGlmZmVyZW5jZT0wKSksImJsb2NraW50b3ZpZXciPT09dC5hbmltVHlwZSYmdC50cmlnZ2VyT2Zmc2V0PnQucGFyZW50UmVjVG9wUG9zJiZ0LnRyaWdnZXJPZmZzZXQ8PWUqdC50cmlnZ2VyJiYodC50cmlnZ2VyT2Zmc2V0PXQucGFyZW50UmVjVG9wUG9zKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3RyaWdnZXJOb1Njcm9sbEFuaW1hdGlvbih0LGUpe3RfYW5pbWF0aW9uU0JTX19wcm9jZXNzRWxzSW50b1ZpZXcodCxlKSx0X2FuaW1hdGlvblNCU19fcmVtb3ZlSG92ZXJDbGlja1RyaWdnZXJzKHQpLHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tUcmlnZ2Vycyh0KSx0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlcnModCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Byb2Nlc3NFbHNJbnRvVmlldyh0LGUpe3RfYW5pbWF0aW9uU0JTX191cGRhdGVJbnRvVmlld0Vsc1N0YXRlKGUpO3ZhciBuPTA7dF9hbmltYXRpb25TQlNfX3NldEtleUZvckFuaW1hdGVkT2JqZWN0KHQsIm9uU2Nyb2xsVXBkYXRlRWxzSW50b1ZpZXciLChmdW5jdGlvbigpe258fChuPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIGU7dF9hbmltYXRpb25TQlNfX3VwZGF0ZUludG9WaWV3RWxzU3RhdGUodF9hbmltYXRpb25TQlNfX2dldEFuaW1FbHNPblZpZXcodC5lbGVtZW50cykpLG49MH0pLDIwMCkpfSkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHQub25TY3JvbGxVcGRhdGVFbHNJbnRvVmlldyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdC5vblNjcm9sbFVwZGF0ZUVsc0ludG9WaWV3KX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fcmVtb3ZlSG92ZXJDbGlja1RyaWdnZXJzKHQpe3ZhciBlPVsianMtc2JzLWFuaW0tdHJpZ2dlcl9jbGljayIsImpzLXNicy1hbmltLXRyaWdnZXJfaG92ZXIiXSxuPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi4iK2Uuam9pbigiLCAuIikpO24ubGVuZ3RoJiYoKG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobikpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5jbGFzc0xpc3QucmVtb3ZlKGUpfSkpfSkpLHQuY2xpY2tlZFRyaWdnZXJFbHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRDbGlja0NhbGxiYWNrKSx0X2FuaW1hdGlvblNCU19fcmVtb3ZlVHJpZ2dlckxpc3QodCwiY2xpY2siKX0pKSx0LmhvdmVyVHJpZ2dlckVscy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlciksdF9hbmltYXRpb25TQlNfX3JlbW92ZVRyaWdnZXJMaXN0KHQsImhvdmVyIil9KSksdF9hbmltYXRpb25TQlNfX3VwZGF0ZUFuaW1hdGVkT2JqZWN0U3RhdGUodCwiY2xpY2tlZFRyaWdnZXJFbHMiLFtdKSx0X2FuaW1hdGlvblNCU19fdXBkYXRlQW5pbWF0ZWRPYmplY3RTdGF0ZSh0LCJob3ZlclRyaWdnZXJFbHMiLFtdKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3JlbW92ZVRyaWdnZXJMaXN0KHQsZSl7dFsidHJpZ2dlckxpc3Qtb24tIitlXSYmKHRbInRyaWdnZXJMaXN0LW9uLSIrZV09W10pLHRbInRyaWdnZXJPbmNlTGlzdC1vbi0iK2VdJiYodFsidHJpZ2dlck9uY2VMaXN0LW9uLSIrZV09W10pfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19pbml0Q2xpY2tUcmlnZ2Vycyh0KXt2YXIgZT10LmVsZW1lbnRzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuImNsaWNrIj09PXQuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50Iil9KSk7aWYoZS5sZW5ndGgpe3RfYW5pbWF0aW9uU0JTX19jb25uZWN0VHJpZ2dlcnNXaXRoQW5pbUVscyhlKTt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuanMtc2JzLWFuaW0tdHJpZ2dlcl9jbGljayIpKTtpZihuLmxlbmd0aCl7aWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJqcy1zYnMtYW5pbS10cmlnZ2VyLXN0eWxlcyIpKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2kuaWQ9ImpzLXNicy1hbmltLXRyaWdnZXItc3R5bGVzIixpLnRleHRDb250ZW50PSIuanMtc2JzLWFuaW0tdHJpZ2dlcl9jbGljayB7IGN1cnNvcjogcG9pbnRlcjsgfSIsZG9jdW1lbnQuaGVhZC5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsaSl9dC5jbGlja2VkVHJpZ2dlckVscz1uLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7dF9hbmltYXRpb25TQlNfX3ByZXZlbnRBbmltYXRlZFBhcmVudFRyaWdnZXIodCksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRDbGlja0NhbGxiYWNrKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0X2FuaW1hdGlvblNCU19faW5pdENsaWNrQ2FsbGJhY2spfSkpfX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRDbGlja0NhbGxiYWNrKCl7dmFyIHQ9dGhpc1sidHJpZ2dlckxpc3Qtb24tY2xpY2siXXx8W10sZT10aGlzWyJ0cmlnZ2VyT25jZUxpc3Qtb24tY2xpY2siXXx8W107KHQubGVuZ3RofHxlLmxlbmd0aCkmJih0X2FuaW1hdGlvblNCU19fcGxheU9uY2VBbmltYXRpb24odGhpcyxlLCJjbGljayIpLHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fc3RhcnRlZCIpJiYhdC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fcmV2ZXJzZWQiKT90X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25FbmQodCk6dF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uU3RhcnQodCl9KSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wbGF5T25jZUFuaW1hdGlvbih0LGUsbil7aWYoZSYmZS5sZW5ndGgpe3RfYW5pbWF0aW9uU0JTX19hY3Rpb25PblN0YXJ0KGUpO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpO2kuaW5pdEV2ZW50KCJ1cGRhdGVBbmltT25jZSIsITAsITApLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5kaXNwYXRjaEV2ZW50KGkpfSkpLHRbInRyaWdnZXJPbmNlTGlzdC1vbi0iK25dPVtdfX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdEhvdmVyVHJpZ2dlcnModCl7dmFyIGU9dC5lbGVtZW50cy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiJob3ZlciI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1ldmVudCIpfSkpO2lmKGUubGVuZ3RoKXt0X2FuaW1hdGlvblNCU19fY29ubmVjdFRyaWdnZXJzV2l0aEFuaW1FbHMoZSk7dmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXNicy1hbmltLXRyaWdnZXJfaG92ZXIiKTtuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG4pLHQuaG92ZXJUcmlnZ2VyRWxzPW4sbi5mb3JFYWNoKChmdW5jdGlvbih0KXt0X2FuaW1hdGlvblNCU19fcHJldmVudEFuaW1hdGVkUGFyZW50VHJpZ2dlcih0KSx3aW5kb3cuYW5pbWF0aW9uU0JTX19pc0lPUz8odC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfYW5pbWF0aW9uU0JTX19pbml0SG92ZXJUcmlnZ2VyKSk6KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpLHQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIpKX0pKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3ByZXZlbnRBbmltYXRlZFBhcmVudFRyaWdnZXIodCl7aWYoIm5vbmUiIT09Z2V0Q29tcHV0ZWRTdHlsZSh0KS5wb2ludGVyRXZlbnRzKXt2YXIgZT10LnF1ZXJ5U2VsZWN0b3IoIi50bi1tb2xlY3VsZSwgLnRuLWF0b20iKTtlJiYodC5zdHlsZS5wb2ludGVyRXZlbnRzPSJub25lIixlLnN0eWxlLnBvaW50ZXJFdmVudHM9ImF1dG8iKX19ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2luaXRIb3ZlclRyaWdnZXIodCl7dmFyIGU9dC5jdXJyZW50VGFyZ2V0LG49dC5jdXJyZW50VGFyZ2V0WyJ0cmlnZ2VyTGlzdC1vbi1ob3ZlciJdLGk9dC5jdXJyZW50VGFyZ2V0WyJ0cmlnZ2VyT25jZUxpc3Qtb24taG92ZXIiXTtmdW5jdGlvbiBhKHQpe2UuY2xvc2VzdCgiLnQzOTZfX2VsZW0iKSE9PXQudGFyZ2V0LmNsb3Nlc3QoIi50Mzk2X19lbGVtIikmJih0X2FuaW1hdGlvblNCU19fYWN0aW9uT25FbmQobiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LWhvdmVyLW1vYi1hY3RpdmUiKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsYSkpfShuJiZuLmxlbmd0aHx8aSYmaS5sZW5ndGgpJiYodF9hbmltYXRpb25TQlNfX3BsYXlPbmNlQW5pbWF0aW9uKGUsaSwiaG92ZXIiKSxuJiZuLmxlbmd0aCYmKCJtb3VzZWVudGVyIj09PXQudHlwZSYmdF9hbmltYXRpb25TQlNfX2FjdGlvbk9uU3RhcnQobiksIm1vdXNlbGVhdmUiPT09dC50eXBlJiZ0X2FuaW1hdGlvblNCU19fYWN0aW9uT25FbmQobiksImNsaWNrIj09PXQudHlwZSYmKGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LWhvdmVyLW1vYi1hY3RpdmUiKXx8KHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dF9hbmltYXRpb25TQlNfX2FjdGlvbk9uU3RhcnQobiksZS5jbGFzc0xpc3QuYWRkKCJ0LWhvdmVyLW1vYi1hY3RpdmUiKX0pKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixhKX0pKSkpKSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2Nvbm5lY3RUcmlnZ2Vyc1dpdGhBbmltRWxzKHQpe3ZhciBlPXRbMF0uZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50Iik7dC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbj10LnRyaWdnZXJFbGVtcztpZihuKXt2YXIgaT1uP24uc3BsaXQoIiwiKTpbXSxhPXQuY2xvc2VzdCgiLnQzOTZfX2FydGJvYXJkIikscj1hP2EuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIik6IiI7aS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgaT1yK24sYTt0X2FuaW1hdGlvblNCU19fcHJvY2Vzc1RyaWdnZXJzRWxlbUxpc3QoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnRuLWVsZW1fXyIraSsiLCAudG4tZ3JvdXBfXyIraSksdCxlKX0pKX1lbHNle3ZhciBvO3RfYW5pbWF0aW9uU0JTX19wcm9jZXNzVHJpZ2dlcnNFbGVtTGlzdCh0LnF1ZXJ5U2VsZWN0b3IoIi50bi1hdG9tX19zYnMtYW5pbS13cmFwcGVyIiksdCxlKX19KSl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3Byb2Nlc3NUcmlnZ2Vyc0VsZW1MaXN0KHQsZSxuKXt2YXIgaTt0JiYoIm9uY2UiPT09ZS5sb29wP2UuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKXx8dF9hbmltYXRpb25TQlNfX2luaXRUcmlnZ2Vyc0xpc3QodCwidHJpZ2dlck9uY2VMaXN0IixuLGUpOnRfYW5pbWF0aW9uU0JTX19pbml0VHJpZ2dlcnNMaXN0KHQsInRyaWdnZXJMaXN0IixuLGUpKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19faW5pdFRyaWdnZXJzTGlzdCh0LGUsbixpKXt0W2UrIi1vbi0iK25dPy0xPT09dFtlKyItb24tIituXS5pbmRleE9mKGkpJiZ0W2UrIi1vbi0iK25dLnB1c2goaSk6dFtlKyItb24tIituXT1baV0sdFtlKyItb24tIituXS5sZW5ndGgmJiF0LmNsYXNzTGlzdC5jb250YWlucygianMtc2JzLWFuaW0tdHJpZ2dlcl8iK24pJiZ0LmNsYXNzTGlzdC5hZGQoImpzLXNicy1hbmltLXRyaWdnZXJfIituKSxpLmFkZEV2ZW50TGlzdGVuZXIoInVwZGF0ZUFuaW1PbmNlIiwoZnVuY3Rpb24oKXt0W2UrIi1vbi0iK25dPXRbZSsiLW9uLSIrbl0uZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWl9KSksdFsidHJpZ2dlckxpc3Qtb24tIituXSYmdFsidHJpZ2dlckxpc3Qtb24tIituXS5sZW5ndGh8fHQuY2xhc3NMaXN0LnJlbW92ZSgianMtc2JzLWFuaW0tdHJpZ2dlcl8iK24pfSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hY3Rpb25PblN0YXJ0KHQpe3QuZm9yRWFjaCh0X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25TdGFydCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uU3RhcnQodCl7dC5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fcGxheWluZyIpP3Quc2V0QXR0cmlidXRlKCJkYXRhLXBsYW5uZWQtZGlyIiwicGxheSIpOnRfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHQsITEpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hY3Rpb25PbkVuZCh0KXt0LmZvckVhY2godF9hbmltYXRpb25TQlNfX3NldEFjdGlvbk9uRW5kKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fc2V0QWN0aW9uT25FbmQodCl7dmFyIGU9dC5sb29wLG49Im5vcmV2ZXJzZSI9PT1lJiYiaG92ZXIiPT09dC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKTtlJiYtMSE9PWUuaW5kZXhPZigibG9vcCIpP3QuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uaXRlcmF0aW9uIix0X2FuaW1hdGlvblNCU19fc2V0SXRlcmF0aW9uQW5pbWF0aW9uKTp0LmNsYXNzTGlzdC5jb250YWlucygidC1zYnMtYW5pbV9wbGF5aW5nIikmJiFuP3Quc2V0QXR0cmlidXRlKCJkYXRhLXBsYW5uZWQtZGlyIiwicmV2ZXJzZSIpOm58fHRfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHQsITApfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19zZXRJdGVyYXRpb25BbmltYXRpb24odCl7dmFyIGU9dC50YXJnZXQuY2xvc2VzdCgiLnQzOTZfX2VsZW0iKTtpZihlKXtpZigibG9vcHdpdGhyZXZlcnNlIj09PWUubG9vcCl7dmFyIG49dF9hbmltYXRpb25TQlNfX2dldEFuaW1hdGlvbkZ1bGxUaW1lKGUsITApLGksYTtpZigxZTMqdC5lbGFwc2VkVGltZS9uJTIhPTApcmV0dXJufWUuY2xhc3NMaXN0LnJlbW92ZSgidC1zYnMtYW5pbV9zdGFydGVkIiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3JldmVyc2VkIiksZS5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3BsYXlpbmciKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbml0ZXJhdGlvbiIsdF9hbmltYXRpb25TQlNfX3NldEl0ZXJhdGlvbkFuaW1hdGlvbil9fWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19hbmltYXRpb25FbmQodCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHRfYW5pbWF0aW9uU0JTX19hbmltYXRpb25FbmRpbmdFdmVudCksdC5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHRfYW5pbWF0aW9uU0JTX19hbmltYXRpb25FbmRpbmdFdmVudCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2FuaW1hdGlvbkVuZGluZ0V2ZW50KCl7dGhpcy5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3BsYXlpbmciKTt2YXIgdD10aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1wbGFubmVkLWRpciIpOyJwbGF5Ij09PXQmJnRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3JldmVyc2VkIik/dF9hbmltYXRpb25TQlNfX3BsYXlBbmltYXRpb24odGhpcywhMSk6InJldmVyc2UiIT09dHx8dGhpcy5jbGFzc0xpc3QuY29udGFpbnMoInQtc2JzLWFuaW1fcmV2ZXJzZWQiKXx8dF9hbmltYXRpb25TQlNfX3BsYXlBbmltYXRpb24odGhpcywhMCksdGhpcy5zZXRBdHRyaWJ1dGUoImRhdGEtcGxhbm5lZC1kaXIiLCIiKX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0QW5pbWF0aW9uRnVsbFRpbWUodCxlKXt2YXIgbixpO3JldHVybiB0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1vcHRzIik/SlNPTi5wYXJzZSh0LmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy1vcHRzIikuc3BsaXQoIiciKS5qb2luKCciJykpLnJlZHVjZSgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSYmKHQrPXBhcnNlSW50KG4uZHQsMTApfHwwKSx0KyhwYXJzZUludChuLnRpLDEwKXx8MCl9KSwwKTowfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19wbGF5QW5pbWF0aW9uKHQsZSl7dC5jbGFzc0xpc3QucmVtb3ZlKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKSxlfHx0LmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fcmV2ZXJzZWQiKSx0X2FuaW1hdGlvblNCU19fZm9yY2VSZXBhaW50KHQpO3ZhciBuPXRfYW5pbWF0aW9uU0JTX19nZXRBbmltYXRpb25GdWxsVGltZSh0LCExKSxpPVsidC1zYnMtYW5pbV9zdGFydGVkIl07ZSYmaS5wdXNoKCJ0LXNicy1hbmltX3JldmVyc2VkIiksbj4wJiZpLnB1c2goInQtc2JzLWFuaW1fcGxheWluZyIpLGkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5jbGFzc0xpc3QuYWRkKGUpfSkpLHRfYW5pbWF0aW9uU0JTX19hbmltYXRpb25FbmQodCl9ZnVuY3Rpb24gdF9hbmltYXRpb25TQlNfX2ZvcmNlUmVwYWludCh0KXt0Lm9mZnNldFdpZHRofWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX191cGRhdGVJbnRvVmlld0Vsc1N0YXRlKHQpe3QmJnQubGVuZ3RoJiZ0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKGRvY3VtZW50LmNvbnRhaW5zKHQpKXt2YXIgZT13aW5kb3cucGFnZVlPZmZzZXQrdC50cmlnZ2VyT2Zmc2V0LG49ImJsb2NraW50b3ZpZXciPT09dC5hbmltVHlwZT9lPj10LnBhcmVudFJlY1RvcFBvczplPj10LnRvcE9mZnNldCxpPXQuY2xvc2VzdCgiLnQzOTYiKS5wYXJlbnRFbGVtZW50LGEscj1bInQzOTdfX29mZiIsInQzOTVfX29mZiIsInQ0MDBfX29mZiJdLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiBpLmNsYXNzTGlzdC5jb250YWlucyh0KX0pKTtuJiYhciYmKHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKXx8dC5jbGFzc0xpc3QuYWRkKCJ0LXNicy1hbmltX3N0YXJ0ZWQiKSl9fSkpfWZ1bmN0aW9uIHRfYW5pbWF0aW9uU0JTX19nZXRab29tKHQpe2lmKHZvaWQgMCE9PXQuc2NhbGVGYWN0b3IpcmV0dXJuIHQuc2NhbGVGYWN0b3I7dmFyIGU9dC5jbG9zZXN0KCIudDM5Nl9fYXJ0Ym9hcmQiKTtpZighZSlyZXR1cm4gMTt2YXIgbj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1hcnRib2FyZC1yZWNpZCIpO3JldHVybiBlLmNsYXNzTGlzdC5jb250YWlucygidDM5Nl9fYXJ0Ym9hcmRfc2NhbGUiKXx8IXdpbmRvdy5hbmltYXRpb25TQlNfX2lzT2xkUGFnZSYmInVuZGVmaW5lZCIhPXR5cGVvZiB0Mzk2X2FiX19nZXRGaWVsZFZhbHVlJiYid2luZG93Ij09PXQzOTZfYWJfX2dldEZpZWxkVmFsdWUoZSwidXBzY2FsZSIpP24mJndpbmRvdy50blsiYWIiK25dJiZ3aW5kb3cudG5bImFiIituXS5zY2FsZUZhY3Rvcnx8d2luZG93LnRuX3NjYWxlX2ZhY3RvcjoxfWZ1bmN0aW9uIHRfYW5pbWF0ZVNic19fd3JhcEF0b21FbHMoKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1hbmltYXRlLXNicy1ldmVudF0iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsKGZ1bmN0aW9uKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b20iKTtpZihlJiYhZS5jbG9zZXN0KCIudG4tYXRvbV9fc2JzLWFuaW0td3JhcHBlciIpKXt0X2FuaW1hdGlvblNCU19fd3JhcEVsKGUsInRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKTt2YXIgbj10LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmdldFByb3BlcnR5VmFsdWUoImJvcmRlci1yYWRpdXMiKTtpZigic2hhcGUiPT09biYmaSYmcGFyc2VJbnQoaSkpe3ZhciBhPXQucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKTthJiYoYS5zdHlsZS5ib3JkZXJSYWRpdXM9aSl9fX0pKX1mdW5jdGlvbiB0X2FuaW1hdGVTYnNfX2Nhc2hFbHNJbmZvKHQpe3ZhciBlPXQuZWxzO3QudHJpZ2dlckVsZW1zQXR0ck5hbWU9ImVkaXQiPT09dC5tb2RlPyJkYXRhLWZpZWxkLXNic3RyZ2Vscy12YWx1ZSI6ImRhdGEtYW5pbWF0ZS1zYnMtdHJnZWxzIixBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUsKGZ1bmN0aW9uKGUpe2Uuc3RhdGU9InVuYWN0aXZlIixlLmFuaW1UeXBlPSJlZGl0Ij09PXQubW9kZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC1zYnNldmVudC12YWx1ZSIpOmUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWV2ZW50IiksZS5jaGFuZ2VUeXBlPSJzY3JvbGwiPT09ZS5hbmltVHlwZT8ic2Nyb2xsIjoidGltZSIsZS50cmlnZ2VyPSJlZGl0Ij09PXQubW9kZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC1zYnN0cmctdmFsdWUiKTplLmdldEF0dHJpYnV0ZSgiZGF0YS1hbmltYXRlLXNicy10cmciKSxlLnRyaWdnZXI9ZS50cmlnZ2VyP2UudHJpZ2dlcjoxLGUudHJpZ2dlckVsZW1zPWUuZ2V0QXR0cmlidXRlKHQudHJpZ2dlckVsZW1zQXR0ck5hbWUpLGUud3JhcHBlckVsPWUucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKSxlLnN0ZXBzPVtdO3ZhciBuPSJlZGl0Ij09PXQubW9kZT9lLmdldEF0dHJpYnV0ZSgiZGF0YS1maWVsZC1zYnNvcHRzLXZhbHVlIik6ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtb3B0cyIpO2lmKG4pey0xIT09bi5pbmRleE9mKCJmaXhlZCIpJiYoZS56SW5kZXg9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgiei1pbmRleCIpKSxuPW4ucmVwbGFjZSgvJy9nLCciJyk7dmFyIGk9SlNPTi5wYXJzZShuKTt0X2FuaW1hdGlvblNCU19fYWRkRGVsYXlUb1N0ZXBzKGkpLGUubG9vcD0iZWRpdCI9PT10Lm1vZGU/ZS5nZXRBdHRyaWJ1dGUoImRhdGEtZmllbGQtc2JzbG9vcC12YWx1ZSIpOmUuZ2V0QXR0cmlidXRlKCJkYXRhLWFuaW1hdGUtc2JzLWxvb3AiKSx0X2FuaW1hdGlvblNCU19fc2V0QW5kQ2FjaGVFbFRvcFBvcyhlLHQpO2Zvcih2YXIgYT0wLHI9MDtyPGkubGVuZ3RoO3IrKyl7dmFyIG89e3N0YXRlOiJ1bmFjdGl2ZSJ9O28uc3R5bGVzPXRfYW5pbWF0aW9uU0JTX19jcmVhdGVTdGVwU3R5bGVzKGlbcl0pLCJzY3JvbGwiPT09ZS5jaGFuZ2VUeXBlPyhvLnByZXZVbmZpeGVkRGlzdD1hLG8uZGlzdD1pW3JdLmRpLCExPT09by5zdHlsZXMuZml4JiYoYSs9TnVtYmVyKG8uZGlzdCkpLG8uc3RhcnQ9MD09PXI/ZS50b3BPZmZzZXQ6ZS5zdGVwc1tyLTFdLmVuZCxvLmVuZD1vLnN0YXJ0KzEqby5kaXN0KTooby50aW1lPWlbcl0udGksby5lYXNlPWlbcl0uZWEpLGUuc3RlcHMucHVzaChvKX10X2FuaW1hdGlvblNCU19fdXBkYXRlSW5mb09uSW1nTG9hZChlLHQpLHRfYW5pbWF0aW9uU0JTX191cGRhdGVNb3ZlQW5kUm90YXRlU3RlcHNTdHlsZXMoZS5zdGVwcyl9fSkpfWZ1bmN0aW9uIHRfYW5pbWF0ZVNic19fcmVzZXQodCl7Zm9yKHZhciBlPXQuZWxzLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk9ZVtuXS5hbmltVHlwZTtpZigiaW50b3ZpZXciPT09aXx8ImJsb2NraW50b3ZpZXciPT09aXx8ImNsaWNrIj09PWl8fCJob3ZlciI9PT1pKXtlW25dLmNsYXNzTGlzdC5yZW1vdmUoInQtc2JzLWFuaW1fc3RhcnRlZCIpO3ZhciBhPWVbbl0ucXVlcnlTZWxlY3RvcigiLnRuLWF0b21fX3Nicy1hbmltLXdyYXBwZXIiKTthJiYoYS5zdHlsZS5vcGFjaXR5PSIiKX1lbHNle2Vbbl0uc3RhdGU9InJlc2V0ZWQiO3ZhciByPWVbbl0ud3JhcHBlckVsO3ImJihyLnN0eWxlLnRyYW5zZm9ybT0iIixyLnN0eWxlLnBvc2l0aW9uPSIiLHIuc3R5bGUudG9wPSIiLHIuc3R5bGUub3BhY2l0eT0iIil9fX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fZ2V0U2l6ZUJhc2VkT25EaW1lbnNpb25Nb2RlKHQpe2lmKCF0KXJldHVybnt3aWR0aDoiaW5oZXJpdCIsaGVpZ2h0OiJpbmhlcml0In07dmFyIGU9dC5wYXJlbnROb2RlLmNsb3Nlc3QoIi50bi1ncm91cCIpfHx0LnBhcmVudE5vZGUsbixpLGE7cmV0dXJuIGUmJnQzOTZfX2lzRmxleChlKT97d2lkdGg6ImZpbGwiPT09dDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKHQsIndpZHRobW9kZSIpPyIxMDAlIjoiaW5oZXJpdCIsaGVpZ2h0OiJmaWxsIj09PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZSh0LCJoZWlnaHRtb2RlIik/IjEwMCUiOiJpbmhlcml0In06e3dpZHRoOiJpbmhlcml0IixoZWlnaHQ6ImluaGVyaXQifX1mdW5jdGlvbiB0X2FuaW1hdGlvblNCU19fd3JhcEVsKHQsZSl7aWYoIXQpcmV0dXJuITE7dmFyIG49dC5wYXJlbnROb2RlLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYT0iaW1hZ2UiPT09dC5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1lbGVtLXR5cGUiKSxyPXQzOTZfX2lzRmxleCh0LnBhcmVudEVsZW1lbnQpLG89dF9hbmltYXRpb25TQlNfX2dldFNpemVCYXNlZE9uRGltZW5zaW9uTW9kZShuKSxzPW8ud2lkdGgsbD1vLmhlaWdodCxfPS9maXJlZm94fEZpcmVmb3gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7InN0cmluZyI9PXR5cGVvZiBlP2kuY2xhc3NMaXN0LmFkZChlKTplLmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuY2xhc3NMaXN0LmFkZCh0KX0pKSxpLnN0eWxlLmRpc3BsYXk9YXx8X3x8cj8iaW5oZXJpdCI6InRhYmxlIixpLnN0eWxlLndpZHRoPXMsaS5zdHlsZS5oZWlnaHQ9bCxpLmFwcGVuZENoaWxkKHQpLG4mJm4uYXBwZW5kQ2hpbGQoaSl9d2luZG93LnRfYW5pbWF0aW9uU0JTX19pc0ZpcmVmb3g9LTEhPT1uYXZpZ2F0b3IudXNlckFnZW50LnNlYXJjaCgiRmlyZWZveCIpLHdpbmRvdy50X2FuaW1hdGlvblNCU19faXNTYWZhcmk9L14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx3aW5kb3cuYW5pbWF0aW9uU0JTX19pc0lPUz0vaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl8fCJvbnRvdWNoZW5kImluIGRvY3VtZW50JiYvTWFjaW50b3NoLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHdpbmRvdy5hbmltYXRpb25TQlNfX2lzT2xkUGFnZT1Cb29sZWFuKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMqPSJ0aWxkYS1ibG9ja3MtMi43Il0nKSksInZpc2libGUiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlPyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/dF9hbmltYXRpb25TQlNfX2luaXQoKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix0X2FuaW1hdGlvblNCU19faW5pdCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdF9hbmltYXRpb25TQlNfX2NoZWNrVmlzaWJpbGl0eVBhZ2UpOwoKZnVuY3Rpb24gdDM5Nl9zY2FsZUJsb2NrKGUpe3ZhciB0PXQzOTZfZGV0ZWN0UmVzb2x1dGlvbihlKSxsPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWMiK2UpO2lmKGwpe3ZhciBhOyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yP2E9dDM5Nl9fZ2V0Q3VycmVudFNjYWxlRmFjdG9yKGUpOihhPXdpbmRvdy50biYmd2luZG93LnRuWyJhYiIrZV0mJndpbmRvdy50blsiYWIiK2VdLnNjYWxlRmFjdG9yKXx8KGE9d2luZG93LnRuX3NjYWxlX2ZhY3Rvcik7dmFyIG89bC5xdWVyeVNlbGVjdG9yKCIudDM5Nl9fYXJ0Ym9hcmQiKSxuPXQzOTZfc2NhbGVfX2NvbGxlY3RTY2FsZURhdGEobyxhKTtpZihvKXt2YXIgcj10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sImhlaWdodCIpLGk9TWF0aC5mbG9vcihyKmEpLGMsXztpZih0Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sImhlaWdodF92aCIpKXt2YXIgcz10Mzk2X2FiX19nZXRGaWVsZFZhbHVlKG8sImhlaWdodCIpLGQ9dDM5Nl9hYl9fZ2V0SGVpZ2h0KG8pLHU9cyphO2k9dT49ZD91OmR9aWYodDM5Nl9zY2FsZV9fdXBkYXRlQXJ0Ym9hcmRTdGF0ZShvLGkpLDAhPT1uLmxlbmd0aClpZih0Mzk2X2lzT25seVNjYWxhYmxlQnJvd3NlcigpKXQzOTZfc2NhbGVfX3NjYWxlSXNPbmx5U2NhbGFibGVCbG9jayhuKTtlbHNle3ZhciBtPW4uZmlsdGVyKChmdW5jdGlvbihlKXt2YXIgdD1lLmVsZW1UeXBlO3JldHVybiJ0ZXh0Ij09PXR8fCJidXR0b24iPT09dH0pKSxoPW4uZmlsdGVyKChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4ic2hhcGUiPT09ZS5lbGVtVHlwZX0pKSxwPS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksZjtwJiZ0Mzk2X3NjYWxlX19zY2hlZHVsZV9fc2NhbGVUZXh0RWxlbWVudHMobSksdDM5Nl9zY2FsZV9fc2NoZWR1bGVfX3NjYWxlU2hhcGVFbGVtZW50cyhoKSxuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBsPWUuZWxlbWVudCxvPWUuZWxlbWVudENvcmUsbj1lLmVsZW1UeXBlLHI9ImdhbGxlcnkiPT09bjsieWVzIj09PWwuZ2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIpfHxyfHwobC5zdHlsZS56b29tPWEpLHImJihsLnN0eWxlLnpvb209bnVsbCksInRleHQiPT09biYmdDwxMjAwJiZvJiYhcCYmKG8uc3R5bGUud2Via2l0VGV4dFNpemVBZGp1c3Q9ImF1dG8iKSxvJiYoby5zdHlsZS50cmFuc2Zvcm1PcmlnaW49ImNlbnRlciIpfSkpLEFycmF5LmZyb20oby5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUgPiAudDM5Nl9fZWxlbSwgOnNjb3BlID4gLnQzOTZfX2dyb3VwIikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0OygibGVmdCIhPT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUoZSwiYXhpc3giKXx8InRvcCIhPT10Mzk2X2NvcmVfX2dldEZpZWxkVmFsdWUoZSwiYXhpc3kiKSkmJih0Mzk2X2VsZW1fX3JlbmRlclZpZXdPbmVGaWVsZChlLCJsZWZ0IiksdDM5Nl9lbGVtX19yZW5kZXJWaWV3T25lRmllbGQoZSwidG9wIikpfSkpfX19fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVRleHRFbGVtZW50cyhlKXt3aW5kb3cudG58fCh3aW5kb3cudG49e30pLHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZXx8KHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZT1bXSksd2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlPXdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZS5jb25jYXQoZSksY2xlYXJUaW1lb3V0KHdpbmRvdy50bi50ZXh0RWxlbWVudHNTY2FsZVRpbWVyKSx3aW5kb3cudG4udGV4dEVsZW1lbnRzU2NhbGVUaW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QzOTZfc2NhbGVfX3NjYWxlVGV4dEVsZW1lbnRzKHdpbmRvdy50bi5zY2hlZHVsZWRUZXh0RWxlbWVudHNGb3JTY2FsZSksd2luZG93LnRuLnNjaGVkdWxlZFRleHRFbGVtZW50c0ZvclNjYWxlPVtdfSksMSl9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NhbGVUZXh0RWxlbWVudHMoZSl7dmFyIHQ9dDM5Nl9faW5pdEZhc3RET00oKTt0LndyaXRlKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5lbGVtZW50LnN0eWxlLnpvb209IiJ9KSl9KSksdC5yZWFkKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5jYWNoZWRGb250U2l6ZT1wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoZS5lbGVtZW50Q29yZSkuZm9udFNpemUpLGUuY2FjaGVkVGV4dFNpemVBZGp1c3Q9ZS5lbGVtZW50Q29yZS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdH0pKX0pKSx0LndyaXRlKChmdW5jdGlvbigpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5lbGVtZW50Q29yZS5zdHlsZS53ZWJraXRUZXh0U2l6ZUFkanVzdD0ibm9uZSIsZS5lbGVtZW50LnN0eWxlLnpvb209ZS5zY2FsZUZhY3Rvcn0pKX0pKSx0LnJlYWQoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmN1cnJlbnRGb250U2l6ZT1wYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUoZS5lbGVtZW50Q29yZSkuZm9udFNpemUpfSkpfSkpLHQud3JpdGUoKGZ1bmN0aW9uKCl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1NYXRoLmFicyhlLmNhY2hlZEZvbnRTaXplLWUuY3VycmVudEZvbnRTaXplKTtlLmVsZW1lbnRDb3JlLnN0eWxlLndlYmtpdFRleHRTaXplQWRqdXN0PXQ+PTE/Im5vbmUiOmUuY2FjaGVkVGV4dFNpemVBZGp1c3QsdD49MSYmKGUuZWxlbWVudENvcmUuc3R5bGUuZm9udFNpemU9TWF0aC5yb3VuZChlLmNhY2hlZEZvbnRTaXplKmUuc2NhbGVGYWN0b3IpKyJweCIpfSkpfSkpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjaGVkdWxlX19zY2FsZVNoYXBlRWxlbWVudHMoZSl7d2luZG93LnRufHwod2luZG93LnRuPXt9KSx3aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlfHwod2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZT1bXSksd2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZT13aW5kb3cudG4uc2NoZWR1bGVkU2hhcGVFbGVtZW50c0ZvclNjYWxlLmNvbmNhdChlKSxjbGVhclRpbWVvdXQod2luZG93LnRuLnNoYXBlRWxlbWVudHNTY2FsZVRpbWVyKSx3aW5kb3cudG4uc2hhcGVFbGVtZW50c1NjYWxlVGltZXI9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Mzk2X3NjYWxlX19zY2FsZVNoYXBlRWxlbWVudHMod2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZSksd2luZG93LnRuLnNjaGVkdWxlZFNoYXBlRWxlbWVudHNGb3JTY2FsZT1bXX0pLDEpfWZ1bmN0aW9uIHQzOTZfc2NhbGVfX3NjYWxlU2hhcGVFbGVtZW50cyhlKXt2YXIgdD10Mzk2X19pbml0RmFzdERPTSgpO3QucmVhZCgoZnVuY3Rpb24oKXtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLmVsZW1lbnQsImhlaWdodCIpO3Q9dDM5Nl9lbGVtX19nZXRIZWlnaHQoZS5lbGVtZW50LHQpLHQ9dDM5Nl9lbGVtX19jb252ZXJ0UG9zaXRpb25fX0xvY2FsX190b0Fic29sdXRlKGUuZWxlbWVudCwiaGVpZ2h0Iix0KTt2YXIgbD10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZS5lbGVtZW50LCJ3aWR0aCIpO2w9dDM5Nl9lbGVtX19nZXRXaWR0aChlLmVsZW1lbnQsbCksbD10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZS5lbGVtZW50LCJ3aWR0aCIsbCk7dmFyIGE9cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZS5lbGVtZW50LCJ0b3AiKSk7YT10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZS5lbGVtZW50LCJ0b3AiLGEpO3ZhciBvPXBhcnNlRmxvYXQodDM5Nl9lbGVtX19nZXRGaWVsZFZhbHVlKGUuZWxlbWVudCwibGVmdCIpKTtvPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLmVsZW1lbnQsImxlZnQiLG8pLGUuc2hhcGVTaXplPXt0b3A6YSxsZWZ0Om8sd2lkdGg6bCxoZWlnaHQ6dH19KSl9KSk7dmFyIGw9ZS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNoYXBlU2l6ZS53aWR0aDw9Mnx8ZS5zaGFwZVNpemUuaGVpZ2h0PD0yfSkpO3QucmVhZCgoZnVuY3Rpb24oKXtsLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUuZWxlbWVudENvcmUpO2UuYm9yZGVyV2lkdGg9dC5ib3JkZXJXaWR0aCxlLmlzSW1hZ2U9Im5vbmUiIT09dC5iYWNrZ3JvdW5kSW1hZ2UsZS5pc0FuaW1hdGVkPWUuZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0ZS1zYnMtZXZlbnQiKX0pKX0pKSx0LndyaXRlKChmdW5jdGlvbigpe2wuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoIjBweCI9PT1lLmJvcmRlcldpZHRoJiYhZS5pc0ltYWdlJiYhZS5pc0FuaW1hdGVkKXtlLmVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoInpvb20iKTt2YXIgdD1lLnNoYXBlU2l6ZS53aWR0aCplLnNjYWxlRmFjdG9yLGw9ZS5zaGFwZVNpemUuaGVpZ2h0KmUuc2NhbGVGYWN0b3IsYT1lLnNoYXBlU2l6ZS50b3AqZS5zY2FsZUZhY3RvcixvPWUuc2hhcGVTaXplLmxlZnQqZS5zY2FsZUZhY3RvcjtlLmVsZW1lbnQuc3R5bGUud2lkdGg9cGFyc2VGbG9hdCh0KSsicHgiLGUuZWxlbWVudC5zdHlsZS5oZWlnaHQ9cGFyc2VGbG9hdChsKSsicHgiLGUuZWxlbWVudC5zdHlsZS50b3A9TWF0aC5yb3VuZChhKSsicHgiLGUuZWxlbWVudC5zdHlsZS5sZWZ0PU1hdGgucm91bmQobykrInB4IixlLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLXNjYWxlLW9mZiIsInllcyIpfX0pKX0pKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19jb2xsZWN0U2NhbGVEYXRhKGUsdCl7dmFyIGw7cmV0dXJuIHQzOTZfc2NhbGVfX2dldEVsZW1lbnRzVG9TY2FsZShlKS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBsPWUucXVlcnlTZWxlY3RvcigiLnRuLW1vbGVjdWxlLCAudG4tYXRvbSIpLGE9dDM5Nl9zY2FsZV9fZ2V0RWxlbWVudFR5cGUoZSksbz10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwiY29udGFpbmVyIik7aWYob3x8Imdyb3VwIiE9PWF8fChvPSJncmlkIiksbCYmImdyaWQiPT09bylyZXR1cm57ZWxlbWVudDplLGVsZW1lbnRDb3JlOmwsZWxlbVR5cGU6YSxzY2FsZUZhY3Rvcjp0fX0pKS5maWx0ZXIoQm9vbGVhbil9ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fc2NhbGVJc09ubHlTY2FsYWJsZUJsb2NrKGUpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5lbGVtZW50LGw9ZS5lbGVtZW50Q29yZSxhPWUuZWxlbVR5cGUsbz1sLmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIik7b3x8KHQzOTZfc2NhbGVfX3dyYXBFbGVtZW50KGwsY3VycmVudFNjYWxlRmFjdG9yLCJ0bi1hdG9tX19zY2FsZS13cmFwcGVyIiksbz1sLmNsb3Nlc3QoIi50bi1hdG9tX19zY2FsZS13cmFwcGVyIikpLHQuc3R5bGUuem9vbT0iIix0Mzk2X3NjYWxlX19wcm9jZXNzQmFja2Ryb3BGaWx0ZXIodCxsLG8pLHQzOTZfc2NhbGVfX3Byb2Nlc3NCYWNrZ3JvdW5kRm9yU2hhcGUodCxsLGEsY3VycmVudFNjYWxlRmFjdG9yKX0pKX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19nZXRFbGVtZW50c1RvU2NhbGUoZSl7cmV0dXJuIGU/QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5jaGlsZHJlbikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19lbGVtIil8fGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0Mzk2X19ncm91cCIpKX0pKTpbXX1mdW5jdGlvbiB0Mzk2X3NjYWxlX191cGRhdGVBcnRib2FyZFN0YXRlKGUsdCl7ZS5jbGFzc0xpc3QuYWRkKCJ0Mzk2X19hcnRib2FyZF9zY2FsZSIpO3ZhciBsPWUuZ2V0QXR0cmlidXRlKCJkYXRhLWFydGJvYXJkLXJlY2lkIiksYTtpZighKCJodWciPT09ZS5nZXRBdHRyaWJ1dGUoImRhdGEtYXJ0Ym9hcmQtaGVpZ2h0bW9kZSIpKSl7dmFyIG89JzxzdHlsZSBjbGFzcz0idDM5Nl9fc2NhbGUtc3R5bGUiPi50LXJlYyNyZWMnK2wrIiB7IG92ZXJmbG93OiB2aXNpYmxlOyB9I3JlYyIrbCsiIC50Mzk2X19hcnRib2FyZDpub3QoLnQzOTZfX2FydGJvYXJkLWZsZXgpLCNyZWMiK2wrIiAudDM5Nl9fYXJ0Ym9hcmQ6bm90KC50Mzk2X19hcnRib2FyZC1mbGV4KSAudDM5Nl9fY2FycmllciwjcmVjIitsKyIgLnQzOTZfX2FydGJvYXJkOm5vdCgudDM5Nl9fYXJ0Ym9hcmQtZmxleCkgLnQzOTZfX2ZpbHRlciB7IHdpZHRoOiAxMDB2dyAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDEwMCU7fSNyZWMiK2wrIiAudDM5Nl9fY2FycmllciwjcmVjIitsKyIgLnQzOTZfX2ZpbHRlciwjcmVjIitsKyIgLnQzOTZfX2FydGJvYXJkIHtoZWlnaHQ6ICIrdCsicHggIWltcG9ydGFudDt9PC9zdHlsZT4iO2UuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLG8pfX1mdW5jdGlvbiB0Mzk2X3NjYWxlX193cmFwRWxlbWVudChlLHQsbCl7aWYoZSl7dmFyIGE9ZS5wYXJlbnROb2RlO2lmKGEpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uY2xhc3NMaXN0LmFkZChsKSxvLnN0eWxlLnRyYW5zZm9ybT0ic2NhbGUoIit0KyIpIixvLmFwcGVuZENoaWxkKGUpLGEuYXBwZW5kQ2hpbGQobyl9fX1mdW5jdGlvbiB0Mzk2X3NjYWxlX19wcm9jZXNzQmFja2Ryb3BGaWx0ZXIoZSx0LGwpeyJub25lIj09PWUuc3R5bGUuYmFja2Ryb3BGaWx0ZXImJihlLnN0eWxlLmJhY2tkcm9wRmlsdGVyPSIiKTt2YXIgYT1nZXRDb21wdXRlZFN0eWxlKGUpLmJhY2tkcm9wRmlsdGVyO2lmKGEpe2Uuc3R5bGUuYmFja2Ryb3BGaWx0ZXI9Im5vbmUiLGwuc3R5bGUuYmFja2Ryb3BGaWx0ZXI9YTt2YXIgbz1nZXRDb21wdXRlZFN0eWxlKHQpLmJvcmRlclJhZGl1czsiMHB4IiE9PW8mJihsLnN0eWxlLmJvcmRlclJhZGl1cz1vKX19ZnVuY3Rpb24gdDM5Nl9zY2FsZV9fcHJvY2Vzc0JhY2tncm91bmRGb3JTaGFwZShlLHQsbCxhKXtpZigic2hhcGUiPT09bCl7dmFyIG89dCYmZ2V0Q29tcHV0ZWRTdHlsZSh0KSxuO2lmKG8paWYoKG8mJm8uYmFja2dyb3VuZEltYWdlfHx0LmdldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbCIpKSYmImZpeGVkIj09PW8uYmFja2dyb3VuZEF0dGFjaG1lbnQpe2UucmVtb3ZlQ2hpbGQodC5wYXJlbnROb2RlKSxlLmFwcGVuZENoaWxkKHQpO3ZhciByPXQzOTZfZWxlbV9fZ2V0RmllbGRWYWx1ZShlLCJoZWlnaHQiKTtyPXQzOTZfZWxlbV9fZ2V0SGVpZ2h0KGUscikscj10Mzk2X2VsZW1fX2NvbnZlcnRQb3NpdGlvbl9fTG9jYWxfX3RvQWJzb2x1dGUoZSwiaGVpZ2h0IixyKTt2YXIgaT10Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwid2lkdGgiKTtpPXQzOTZfZWxlbV9fZ2V0V2lkdGgoZSxpKSxpPXQzOTZfZWxlbV9fY29udmVydFBvc2l0aW9uX19Mb2NhbF9fdG9BYnNvbHV0ZShlLCJ3aWR0aCIsaSk7dmFyIGM9cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwidG9wIikpLF89cGFyc2VGbG9hdCh0Mzk2X2VsZW1fX2dldEZpZWxkVmFsdWUoZSwibGVmdCIpKTtlLnN0eWxlLnRvcD1jKmErInB4IixlLnN0eWxlLmxlZnQ9XyphKyJweCIsZS5zdHlsZS5oZWlnaHQ9ciphKyJweCIsZS5zdHlsZS53aWR0aD1pKmErInB4IixlLnNldEF0dHJpYnV0ZSgiZGF0YS1zY2FsZS1vZmYiLCJ5ZXMiKX19fWZ1bmN0aW9uIHQzOTZfc2NhbGVfX2dldEVsZW1lbnRUeXBlKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJkYXRhLWVsZW0tdHlwZSIpO3JldHVybiF0JiZlLmNsYXNzTGlzdC5jb250YWlucygidG4tZ3JvdXAiKSYmKHQ9Imdyb3VwIiksdH13aW5kb3cudDM5Nl9pbml0aWFsU2NhbGV8fCh3aW5kb3cudDM5Nl9pbml0aWFsU2NhbGU9ZnVuY3Rpb24oKXt9KTsKCndpbmRvdy5UaWxkYT13aW5kb3cuVGlsZGF8fHt9LGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSx0PS0xIT09ZS5pbmRleE9mKCJtc2llIikmJnBhcnNlSW50KGUuc3BsaXQoIm1zaWUiKVsxXSk7aWYoOD09PXR8fDk9PT10KXt2YXIgcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudC1idG4iKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0QXR0cmlidXRlKCJocmVmIik7ZS5xdWVyeVNlbGVjdG9yKCJ0YWJsZSIpJiZ0JiYtMT09PXQuaW5kZXhPZigiI3BvcHVwOiIpJiYtMT09PXQuaW5kZXhPZigiI3ByaWNlOiIpJiZlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJocmVmIik7ZS5wcmV2ZW50RGVmYXVsdCgpLHdpbmRvdy5sb2NhdGlvbi5ocmVmPXR9KSl9KSl9dHJ5e3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIiksaT1hP2EuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWNvb2tpZSIpOm51bGw7YSYmIm5vIj09PWl8fFRpbGRhLnNhdmVVVE0oKX1jYXRjaChuKXt9dmFyIG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnIiKTtmdW5jdGlvbiBjKGUpe3ZhciB0PWUudGFyZ2V0LmNsb3Nlc3QoImEuanMtY2xpY2stc3RhdCIpfHxlLnRhcmdldC5jbG9zZXN0KCIuanMtY2xpY2stemVyby1zdGF0Iik7aWYoZS50YXJnZXQmJnQpe3ZhciByPWUuY3VycmVudFRhcmdldCxhO2lmKHQuY2xvc2VzdCgiLnIiKSE9PXIpcmV0dXJuO3ZhciBpPXQuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWV2ZW50LW5hbWUiKSxvPXQudGV4dENvbnRlbnQsYz10LmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIixkPXQuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSxuO2lmKCFpKWk9Ii90aWxkYS9jbGljay8iKyhyP3IuZ2V0QXR0cmlidXRlKCJpZCIpOiIiKSsiLz91cmw9IitjO2lmKFRpbGRhLnNlbmRFdmVudFRvU3RhdGlzdGljcyhpLG8pLCJodHRwIj09PWMuc3Vic3RyaW5nKDAsNCkmJi0xPT09Yy5pbmRleE9mKCIudHlwZWZvcm0uY29tLyIpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cub3BlbihjLCJfYmxhbmsiPT09ZD8iX2JsYW5rIjoiX3NlbGYiKX0pLCJfYmxhbmsiPT09ZD8wOjMwMCksZS5wcmV2ZW50RGVmYXVsdCgpLCExfX1BcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG8sKGZ1bmN0aW9uKGUpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGMpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGMpfSkpO3ZhciBkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0LmpzLWFtb3VudCIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS52YWx1ZTt0PXQucmVwbGFjZSgvLC9nLCIuIiksdD1wYXJzZUZsb2F0KHQucmVwbGFjZSgvW14wLTlcLl0vZywiIikpLGUudmFsdWU9dH0pKX1UaWxkYS5zZW5kRWNvbW1lcmNlRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10fHwwPT09dC5sZW5ndGgpcmV0dXJuITE7aWYodm9pZCAwPT09ZXx8ImFkZCIhPT1lJiYicmVtb3ZlIiE9PWUmJiJwdXJjaGFzZSIhPT1lJiYiZGV0YWlsIiE9PWUpcmV0dXJuITE7Zm9yKHZhciByLGE9IiIsaT0wLG89W10sYyxkLG49IiIsbT0iIixsPSIiLHU9MDt1PHQubGVuZ3RoO3UrKyl7YT4iIiYmKGErPSIsICIpLGErPShkPXRbdV0pLm5hbWUsaSs9ZC5wcmljZSxjPSIiLHZvaWQgMCE9PWQub3B0aW9ucyYmZC5vcHRpb25zLmxlbmd0aD4wJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQub3B0aW9ucywoZnVuY3Rpb24oZSl7Yys9ZS5vcHRpb24rIjogIitlLnZhcmlhbnQrIjsgIn0pKTt2YXIgcD17bmFtZTpkLm5hbWUscHJpY2U6ZC5wcmljZSx2YXJpYW50OmMscXVhbnRpdHk6MX07ZC5pZCYmZC5pZD4wJiYoaWQ9ZC5pZCxwLmlkPWQuaWQpLGQudWlkJiZkLnVpZD4wJiYobT1kLnVpZCxwLnVpZD1kLnVpZCksZC5yZWNpZCYmZC5yZWNpZD4wJiYobj1kLnJlY2lkLHAucmVjaWQ9ZC5yZWNpZCksZC5saWQmJmQubGlkPjAmJihsPWQubGlkLHAubGlkPWQubGlkKSxkLnNrdSYmZC5za3U+MCYmKHAuc2t1PWQuc2t1KSxvW28ubGVuZ3RoXT1wfXZhciBwOyJhZGQiIT09ZSYmInJlbW92ZSIhPT1lfHwocj0iL3RpbGRhL2NhcnQvIitlKyIvIixuPjAmJihyKz0iIituKSxtPjA/cis9Ii11IittOmw+MCYmKHIrPSItIitsKSksImRldGFpbCI9PT1lJiYocj0iL3RpbGRhL3Byb2R1Y3QvZGV0YWlsLyIsbT4wP3IrPW0rIi8iOihuPjAmJihyKz0iciIrbiksbD4wJiYocis9Ii1sIitsKSkpLCJwdXJjaGFzZSI9PT1lJiYocj0iL3RpbGRhL3JlYyIrbisiL3BheW1lbnQvIiksKHA9e2Vjb21tZXJjZTp7fX0pLmVjb21tZXJjZVtlXT17cHJvZHVjdHM6b30sVGlsZGEuc2VuZEV2ZW50VG9TdGF0aXN0aWNzKHIsYSxwLGkpfSxUaWxkYS5zZW5kRXZlbnRUb1N0YXRpc3RpY3M9ZnVuY3Rpb24oZSx0LHIsYSl7dmFyIGk9Ii8iPT09ZS5zdWJzdHJpbmcoMCwxKSxvPVtdLGMsZDsoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpKSYmKGQ9bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkYXRhLWZiLWV2ZW50Iik/Yy5nZXRBdHRyaWJ1dGUoImRhdGEtZmItZXZlbnQiKTp3aW5kb3cualF1ZXJ5JiZ2b2lkIDAhPT1qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgiZmItZXZlbnQiKT9qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgiZmItZXZlbnQiKTpudWxsKTt2YXIgbj0hKCFkfHwibm9zZW5kIiE9PWQpLG09Yz9jLmdldEF0dHJpYnV0ZSgiZGF0YS12ay1ldmVudCIpOm51bGw7YyYmKG09bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkYXRhLXZrLWV2ZW50Iik/Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdmstZXZlbnQiKTp3aW5kb3cualF1ZXJ5JiZ2b2lkIDAhPT1qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgidmstZXZlbnQiKT9qUXVlcnkoIiNhbGxyZWNvcmRzIikuZGF0YSgidmstZXZlbnQiKTpudWxsKTt2YXIgbD0hKCFtfHwibm9zZW5kIiE9PW0pLHU9IiIscD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudDcwNiIpO2lmKHU9Yy5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtY3VycmVuY3kiKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1jdXJyZW5jeSIpOnAmJnAuZ2V0QXR0cmlidXRlKCJkYXRhLXByb2plY3QtY3VycmVuY3ktY29kZSIpP3AuZ2V0QXR0cmlidXRlKCJkYXRhLXByb2plY3QtY3VycmVuY3ktY29kZSIpOiJSVUIiLHJ8fChyPXdpbmRvdy5sb2NhdGlvbi5ocmVmKSwoYT1hP3BhcnNlRmxvYXQoYSk6MCk+MClpZih3aW5kb3cuZGF0YUxheWVyfHwod2luZG93LmRhdGFMYXllcj1bXSksLTEhPT1lLmluZGV4T2YoIi90aWxkYS8iKSYmLTEhPT1lLmluZGV4T2YoIi9wYXltZW50LyIpJiZ3aW5kb3cudGlsZGFGb3JtJiZ3aW5kb3cudGlsZGFGb3JtLm9yZGVySWRGb3JTdGF0PiIiKXI9e2Vjb21tZXJjZTp7cHVyY2hhc2U6e2FjdGlvbkZpZWxkOntpZDp3aW5kb3cudGlsZGFGb3JtLm9yZGVySWRGb3JTdGF0LHJldmVudWU6d2luZG93LnRpbGRhRm9ybS5hbW91bnRGb3JTdGF0fSxwcm9kdWN0czp3aW5kb3cudGlsZGFGb3JtLmFyUHJvZHVjdHNGb3JTdGF0fX19LHdpbmRvdy50aWxkYUZvcm0udGlsZGFwYXltZW50JiZ3aW5kb3cudGlsZGFGb3JtLnRpbGRhcGF5bWVudC5wcm9tb2NvZGUmJihyLmVjb21tZXJjZS5wdXJjaGFzZS5hY3Rpb25GaWVsZC5jb3Vwb249d2luZG93LnRpbGRhRm9ybS50aWxkYXBheW1lbnQucHJvbW9jb2RlKSxyLmV2ZW50PSJwdXJjaGFzZSI7ZWxzZSBpZihyJiZyLmVjb21tZXJjZSYmKHIuZWNvbW1lcmNlLmFkZCYmci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzP289ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzOnIuZWNvbW1lcmNlLnJlbW92ZSYmci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzP289ci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzOnIuZWNvbW1lcmNlLmRldGFpbCYmci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzJiYobz1yLmVjb21tZXJjZS5kZXRhaWwucHJvZHVjdHMpLG8mJm8ubGVuZ3RoPjApKXtmb3IodmFyIHM9MDtzPG8ubGVuZ3RoO3MrKylvW3NdLmlkfHwob1tzXS51aWQ/b1tzXS5pZD1vW3NdLnVpZDpvW3NdLnNrdT9vW3NdLmlkPW9bc10uc2t1Om9bc10ucmVjaWQmJm9bc10ubGlkJiYob1tzXS5pZD1vW3NdLnJlY2lkKyJfIitvW3NdLmxpZCkpO3IuZWNvbW1lcmNlLmFkZCYmci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzPyhyLmVjb21tZXJjZS5hZGQucHJvZHVjdHM9byxyLmV2ZW50PSJhZGRUb0NhcnQiKTpyLmVjb21tZXJjZS5yZW1vdmUmJnIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0cz8oci5lY29tbWVyY2UucmVtb3ZlLnByb2R1Y3RzPW8sci5ldmVudD0icmVtb3ZlRnJvbUNhcnQiKTpyLmVjb21tZXJjZS5kZXRhaWwmJnIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cz8oci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzPW8sci5ldmVudD0idmlld1Byb2R1Y3QiKTooaT8oci5ldmVudD0icGFnZVZpZXciLHIuZXZlbnRBY3Rpb249ZSk6ci5ldmVudD1lLHIudGl0bGU9dCxyLnZhbHVlPWEpfXZvaWQgMCE9PXdpbmRvdy5kYXRhTGF5ZXImJihpP2E+MD9yJiZyLmVjb21tZXJjZT93aW5kb3cuZGF0YUxheWVyLnB1c2gocik6d2luZG93LmRhdGFMYXllci5wdXNoKHtldmVudDoicGFnZVZpZXciLGV2ZW50QWN0aW9uOmUsdGl0bGU6dCx2YWx1ZTphLHByb2R1Y3Q6cn0pOndpbmRvdy5kYXRhTGF5ZXIucHVzaCh7ZXZlbnQ6InBhZ2VWaWV3IixldmVudEFjdGlvbjplLHRpdGxlOnQscmVmZXJlcjpyfSk6ciYmci5lY29tbWVyY2U/d2luZG93LmRhdGFMYXllci5wdXNoKHIpOndpbmRvdy5kYXRhTGF5ZXIucHVzaCh7ZXZlbnQ6ZSxldmVudEFjdGlvbjp0LHZhbHVlOmEscmVmZXJlcjpyfSkpO3RyeXt2YXIgdjtpZih3aW5kb3cuZ3RhZ1RyYWNrZXJJRCYmImd0YWciPT09d2luZG93Lm1haW5UcmFja2VyKWlmKGkpaWYociYmci5ldmVudClpZigicHVyY2hhc2UiPT09ci5ldmVudCl7Zm9yKHZhciBvPXIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzLHc9MCxnPTA7ZzxvLmxlbmd0aDtnKyspaWYoImRlbGl2ZXJ5Ij09PW9bZ10uaWQpe3c9b1tnXTticmVha31ndGFnKCJldmVudCIsInB1cmNoYXNlIix7dHJhbnNhY3Rpb25faWQ6ci5lY29tbWVyY2UucHVyY2hhc2UuYWN0aW9uRmllbGQuaWQsdmFsdWU6cGFyc2VGbG9hdChhKS50b0ZpeGVkKDIpLGN1cnJlbmN5OnUsc2hpcHBpbmc6dyxpdGVtczpyLmVjb21tZXJjZS5wdXJjaGFzZS5wcm9kdWN0c30pfWVsc2UiYWRkVG9DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmFkZD9ndGFnKCJldmVudCIsImFkZF90b19jYXJ0Iix7aXRlbXM6ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzfSk6InJlbW92ZUZyb21DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLnJlbW92ZT9ndGFnKCJldmVudCIsInJlbW92ZV9mcm9tX2NhcnQiLHtpdGVtczpyLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHN9KToidmlld1Byb2R1Y3QiPT09ci5ldmVudCYmci5lY29tbWVyY2UuZGV0YWlsJiZndGFnKCJldmVudCIsInZpZXdfaXRlbSIse2l0ZW1zOnIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0c30pO2Vsc2UhIXdpbmRvdy5ndGFnVHJhY2tlcklEJiYtMSE9PXdpbmRvdy5ndGFnVHJhY2tlcklELmluZGV4T2YoIlVBLSIpP2d0YWcoImNvbmZpZyIsd2luZG93Lmd0YWdUcmFja2VySUQse3BhZ2VfdGl0bGU6dCxwYWdlX3BhdGg6ZX0pOmd0YWcoImV2ZW50Iix3aW5kb3cuZ3RhZ1RyYWNrZXJJRCx7cGFnZV90aXRsZTp0LHBhZ2VfcGF0aDplLHNlbmRfdG86d2luZG93Lmd0YWdUcmFja2VySUR9KTtlbHNlIGd0YWcoImV2ZW50IixlLHtldmVudF9jYXRlZ29yeToidGlsZGEiLGV2ZW50X2xhYmVsOnQsdmFsdWU6YX0pfWNhdGNoKHgpe31pZih3aW5kb3cuZ2EmJiJ0aWxkYSIhPT13aW5kb3cubWFpblRyYWNrZXImJiJndGFnIiE9PXdpbmRvdy5tYWluVHJhY2tlcilpZihpKWlmKHImJnIuZXZlbnQpe3RyeXtpZih3aW5kb3cuVGlsZGEuaXNMb2FkR0FFY29tbWVyY2V8fCh3aW5kb3cuVGlsZGEuaXNMb2FkR0FFY29tbWVyY2U9ITAsZ2EoInJlcXVpcmUiLCJlYyIpKSxnYSgic2V0IiwiY3VycmVuY3lDb2RlIix1KSwicHVyY2hhc2UiPT09ci5ldmVudCl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHMubGVuZ3RoLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHNbZ10sZ2EoImVjOmFkZFByb2R1Y3QiLHtpZDpmLmlkfHxnLG5hbWU6Zi5uYW1lLHByaWNlOnBhcnNlRmxvYXQoZi5wcmljZSkudG9GaXhlZCgyKSxxdWFudGl0eTpmLnF1YW50aXR5fSk7Z2EoImVjOnNldEFjdGlvbiIsInB1cmNoYXNlIix7aWQ6ci5lY29tbWVyY2UucHVyY2hhc2UuYWN0aW9uRmllbGQuaWQscmV2ZW51ZTpwYXJzZUZsb2F0KGEpLnRvRml4ZWQoMil9KX1lbHNlIGlmKCJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHMubGVuZ3RoLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuYWRkLnByb2R1Y3RzW2ddLGdhKCJlYzphZGRQcm9kdWN0Iix7aWQ6Zi5pZHx8ZyxuYW1lOmYubmFtZSxwcmljZTpwYXJzZUZsb2F0KGYucHJpY2UpLnRvRml4ZWQoMikscXVhbnRpdHk6Zi5xdWFudGl0eX0pO2dhKCJlYzpzZXRBY3Rpb24iLCJhZGQiKX1lbHNlIGlmKCJyZW1vdmVGcm9tQ2FydCI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5yZW1vdmUpe2Zvcih2YXIgZix5PXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0cy5sZW5ndGgsZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5yZW1vdmUucHJvZHVjdHNbZ10sZ2EoImVjOmFkZFByb2R1Y3QiLHtpZDpmLmlkfHxnLG5hbWU6Zi5uYW1lLHByaWNlOnBhcnNlRmxvYXQoZi5wcmljZSkudG9GaXhlZCgyKSxxdWFudGl0eTpmLnF1YW50aXR5fSk7Z2EoImVjOnNldEFjdGlvbiIsInJlbW92ZSIpfWVsc2UgaWYoInZpZXdQcm9kdWN0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmRldGFpbCl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzLmxlbmd0aCxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0c1tnXSxnYSgiZWM6YWRkUHJvZHVjdCIse2lkOmYuaWR8fGcsbmFtZTpmLm5hbWUscHJpY2U6cGFyc2VGbG9hdChmLnByaWNlKS50b0ZpeGVkKDIpLHF1YW50aXR5OmYucXVhbnRpdHl9KTtnYSgiZWM6c2V0QWN0aW9uIiwiZGV0YWlsIil9fWNhdGNoKHgpe31nYSgic2VuZCIse2hpdFR5cGU6InBhZ2V2aWV3IixwYWdlOmUsdGl0bGU6dCxwYXJhbXM6cn0pfWVsc2UgZ2EoInNlbmQiLHtoaXRUeXBlOiJwYWdldmlldyIscGFnZTplLHRpdGxlOnR9KTtlbHNlIGdhKCJzZW5kIix7aGl0VHlwZToiZXZlbnQiLGV2ZW50Q2F0ZWdvcnk6InRpbGRhIixldmVudEFjdGlvbjplLGV2ZW50TGFiZWw6dCxldmVudFZhbHVlOmF9KTtpZih3aW5kb3cubWFpbk1ldHJpa2FJZCYmd2luZG93Lm1haW5NZXRyaWthSWQ+MCYmImZ1bmN0aW9uIj09dHlwZW9mIHltKWlmKGkpe3ZhciBoPXt0aXRsZTp0fTthPjA/KGgucGFyYW1zPXtvcmRlcl9wcmljZTphfSx1JiYoaC5wYXJhbXMuY3VycmVuY3k9dSkseW0od2luZG93Lm1haW5NZXRyaWthSWQsImhpdCIsZSxoKSk6eW0od2luZG93Lm1haW5NZXRyaWthSWQsImhpdCIsZSxoKX1lbHNlIGE+MD8oaD17b3JkZXJfcHJpY2U6YX0sdSYmKGguY3VycmVuY3k9dSkseW0od2luZG93Lm1haW5NZXRyaWthSWQsInJlYWNoR29hbCIsZSxoKSk6eW0od2luZG93Lm1haW5NZXRyaWthSWQsInJlYWNoR29hbCIsZSk7aWYod2luZG93Lm1haW5NZXRyaWthPiIiJiZ3aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXSYmKGk/YT4wP3dpbmRvd1t3aW5kb3cubWFpbk1ldHJpa2FdLmhpdChlLHt0aXRsZTp0LG9yZGVyX3ByaWNlOmEscGFyYW1zOnJ9KTp3aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXS5oaXQoZSx7dGl0bGU6dH0pOmE+MD93aW5kb3dbd2luZG93Lm1haW5NZXRyaWthXS5yZWFjaEdvYWwoZSx7dGl0bGU6dCxwYXJhbXM6cixvcmRlcl9wcmljZTphfSk6d2luZG93W3dpbmRvdy5tYWluTWV0cmlrYV0ucmVhY2hHb2FsKGUse3RpdGxlOnQscmVmZXJlcjpyfSkpLHZvaWQgMCE9PXdpbmRvdy5mYnEmJiExPT09bil0cnl7aWYoaSlpZigtMT09PWUuaW5kZXhPZigidGlsZGEvIil8fC0xPT09ZS5pbmRleE9mKCIvcGF5bWVudC8iKSYmLTE9PT1lLmluZGV4T2YoIi9zdWJtaXR0ZWQvIikpaWYociYmci5ldmVudCYmYT4wKWlmKCJhZGRUb0NhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UuYWRkKXtmb3IodmFyIGYseT1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHMubGVuZ3RoLGs9W10sZz0wO2c8eTtnKyspZj1yLmVjb21tZXJjZS5hZGQucHJvZHVjdHNbZ10say5wdXNoKGYuaWR8fGYudWlkfHxmLm5hbWUpO3dpbmRvdy5mYnEoInRyYWNrIiwiQWRkVG9DYXJ0Iix7Y29udGVudF9pZHM6ayxjb250ZW50X3R5cGU6InByb2R1Y3QiLHZhbHVlOmEsY3VycmVuY3k6dX0pfWVsc2UgaWYoInZpZXdQcm9kdWN0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmRldGFpbCl7Zm9yKHZhciBmLHk9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UuZGV0YWlsLnByb2R1Y3RzW2ddLGsucHVzaChmLmlkfHxmLnVpZHx8Zi5uYW1lKTt3aW5kb3cuZmJxKCJ0cmFjayIsIlZpZXdDb250ZW50Iix7Y29udGVudF9pZHM6ayxjb250ZW50X3R5cGU6InByb2R1Y3QiLHZhbHVlOmEsY3VycmVuY3k6dX0pfWVsc2UgZS5pbmRleE9mKCJ0aWxkYS9wb3B1cCIpLHdpbmRvdy5mYnEoInRyYWNrIiwiVmlld0NvbnRlbnQiLHtjb250ZW50X25hbWU6dCxjb250ZW50X2NhdGVnb3J5OmV9KTtlbHNlIGUuaW5kZXhPZigidGlsZGEvcG9wdXAiKSx3aW5kb3cuZmJxKCJ0cmFjayIsIlZpZXdDb250ZW50Iix7Y29udGVudF9uYW1lOnQsY29udGVudF9jYXRlZ29yeTplfSk7ZWxzZSBhPjAmJnU/d2luZG93LmZicSgidHJhY2siLCJJbml0aWF0ZUNoZWNrb3V0Iix7Y29udGVudF9uYW1lOnQsY29udGVudF9jYXRlZ29yeTplLHZhbHVlOmEsY3VycmVuY3k6dX0pOndpbmRvdy5mYnEoInRyYWNrIiwiTGVhZCIse2NvbnRlbnRfbmFtZTp0LGNvbnRlbnRfY2F0ZWdvcnk6ZX0pO2Vsc2Ugd2luZG93LmZicSgidHJhY2siLGUse2NvbnRlbnRfbmFtZTp0LHZhbHVlOmF9KX1jYXRjaCh4KXt9aWYodm9pZCAwIT09d2luZG93LlZLJiZ2b2lkIDAhPT13aW5kb3cuVksuUmV0YXJnZXRpbmcmJiExPT09bCl0cnl7aWYoaSl7dmFyIGMsXz0oYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpKT9jLmdldEF0dHJpYnV0ZSgiZGF0YS12ay1wcmljZS1saXN0LWlkIik6bnVsbCxiPV8mJnBhcnNlSW50KF8pfHwwLFQ9IiIsQT0hMSxGLEYsRixGLEY7aWYociYmci5ldmVudClpZihBPXtwcm9kdWN0czpbXSxjdXJyZW5jeV9jb2RlOiIiLHRvdGFsX3ByaWNlOjB9LCJwdXJjaGFzZSI9PT1yLmV2ZW50JiZyLmVjb21tZXJjZS5wdXJjaGFzZSlpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLnB1cmNoYXNlLnByb2R1Y3RzLmxlbmd0aCxrPVtdLGc9MDtnPHk7ZysrKWY9ci5lY29tbWVyY2UucHVyY2hhc2UucHJvZHVjdHNbZ10sQS5wcm9kdWN0cy5wdXNoKHtpZDpmLmlkfHxmLnVpZHx8Zi5uYW1lLHByaWNlOmYucHJpY2U/Zi5wcmljZTowfSksQS50b3RhbF9wcmljZT1hO1Q9ImluaXRfY2hlY2tvdXQifWVsc2UgVD0idC1wdXJjaGFzZSI7ZWxzZSBpZigiYWRkVG9DYXJ0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmFkZClpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmFkZC5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0iYWRkX3RvX2NhcnQifWVsc2UgVD0idC1hZGQtdG8tY2FydCIsci5lY29tbWVyY2UuYWRkWzBdJiZyLmVjb21tZXJjZS5hZGRbMF0udWlkJiYoVCs9Ii0iK3IuZWNvbW1lcmNlLmFkZFswXS51aWQpO2Vsc2UgaWYoInZpZXdQcm9kdWN0Ij09PXIuZXZlbnQmJnIuZWNvbW1lcmNlLmRldGFpbClpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLmRldGFpbC5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0idmlld19wcm9kdWN0In1lbHNlIFQ9InQtdmlldy1wcm9kdWN0IixyLmVjb21tZXJjZS5kZXRhaWxbMF0mJnIuZWNvbW1lcmNlLmRldGFpbFswXS51aWQmJihUKz0iLSIrci5lY29tbWVyY2UuZGV0YWlsWzBdLnVpZCk7ZWxzZSBpZigicmVtb3ZlRnJvbUNhcnQiPT09ci5ldmVudCYmci5lY29tbWVyY2UucmVtbW92ZSlpZihhPjAmJmI+MCl7dmFyIGY7QS5jdXJyZW5jeV9jb2RlPXU7Zm9yKHZhciB5PXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0cy5sZW5ndGgsaz1bXSxnPTA7Zzx5O2crKylmPXIuZWNvbW1lcmNlLnJlbW92ZS5wcm9kdWN0c1tnXSxBLnByb2R1Y3RzLnB1c2goe2lkOmYuaWR8fGYudWlkfHxmLm5hbWUscHJpY2U6Zi5wcmljZT9mLnByaWNlOjB9KSxBLnRvdGFsX3ByaWNlPWE7VD0icmVtb3ZlX2Zyb21fY2FydCJ9ZWxzZSBUPSJ0LXJlbW92ZS1wcm9kdWN0IixyLmVjb21tZXJjZS5yZW1vdmVbMF0mJnIuZWNvbW1lcmNlLnJlbW92ZVswXS51aWQmJihUKz0iLSIrci5lY29tbWVyY2UucmVtb3ZlWzBdLnVpZCk7ZWxzZSBUPXIuZXZlbnQ7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvIikmJi0xIT09ZS5pbmRleE9mKCIvcGF5bWVudC8iKSlUPSJ0LXB1cmNoYXNlLSIrKEY9KEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoInRpbGRhLyIsIiIpKS5yZXBsYWNlKCIvcGF5bWVudC8iLCIiKSk7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvIikmJi0xIT09ZS5pbmRleE9mKCIvc3VibWl0dGVkLyIpKVQ9InQtbGVhZC0iKyhGPShGPShGPWUucmVwbGFjZSgiL3RpbGRhLyIsIiIpKS5yZXBsYWNlKCJ0aWxkYS8iLCIiKSkucmVwbGFjZSgiL3N1Ym1pdHRlZC8iLCIiKSk7ZWxzZSBpZigtMSE9PWUuaW5kZXhPZigidGlsZGEvcG9wdXAiKSlUPSJ0LSIrKEY9KEY9ZS5yZXBsYWNlKCIvdGlsZGEvIiwiIikpLnJlcGxhY2UoIi8iLCItIikpO2Vsc2UgaWYoLTEhPT1lLmluZGV4T2YoInRpbGRhL2NsaWNrIikpVD0idC0iKyhGPShGPWUucmVwbGFjZSgiL3RpbGRhLyIsIiIpKS5yZXBsYWNlKCIvIiwiLSIpKTtlbHNlIFQ9InQtIisoRj1lLnJlcGxhY2UoIi8iLCItIikpO2I+MCYmQSYmQS5jdXJyZW5jeV9jb2RlPyhWSy5SZXRhcmdldGluZy5FdmVudCgicHVyY2hhc2UiKSxWSy5SZXRhcmdldGluZy5Qcm9kdWN0RXZlbnQoYixULEEpKTooVksuUmV0YXJnZXRpbmcuRXZlbnQoVCksInQtcHVyY2hhc2UiPT09VC5zdWJzdHJpbmcoMCwxMCk/VksuR29hbCgicHVyY2hhc2UiKToidC1sZWFkIj09PVQuc3Vic3RyaW5nKDAsNikmJlZLLkdvYWwoImxlYWQiKSl9ZWxzZSBWSy5SZXRhcmdldGluZy5FdmVudChlKX1jYXRjaCh4KXt9aWYod2luZG93Lm1haW5NYWlscnVJZD4iMCIpe3ZhciBFPXdpbmRvdy5fdG1yfHwod2luZG93Ll90bXI9W10pO2k/YT4wP0UucHVzaCh7aWQ6IiIrd2luZG93Lm1haW5NYWlscnVJZCx0eXBlOiJwYWdlVmlldyIsdXJsOmUsdmFsdWU6YSxzdGFydDoobmV3IERhdGUpLmdldFRpbWUoKX0pOkUucHVzaCh7aWQ6IiIrd2luZG93Lm1haW5NYWlscnVJZCx0eXBlOiJwYWdlVmlldyIsdXJsOmUsc3RhcnQ6KG5ldyBEYXRlKS5nZXRUaW1lKCl9KTphPjA/RS5wdXNoKHtpZDoiIit3aW5kb3cubWFpbk1haWxydUlkLHR5cGU6InJlYWNoR29hbCIsZ29hbDplLHZhbHVlOmF9KTpFLnB1c2goe2lkOiIiK3dpbmRvdy5tYWluTWFpbHJ1SWQsdHlwZToicmVhY2hHb2FsIixnb2FsOmV9KX0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnRpbGRhc3RhdCYmKGk/KGUuaW5kZXhPZigicGF5bWVudCIpPjAmJmUuaW5kZXhPZigidGlsZGEvZm9ybSIpPi0xJiYoZT1lLnJlcGxhY2UoInRpbGRhL2Zvcm0iLCJ0aWxkYS9yZWMiKSksd2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciLHtwYWdlOmV9KSk6d2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciLHtwYWdlOiIvdGlsZGEvZXZlbnQvIitlfSkpfSxUaWxkYS5zYXZlVVRNPWZ1bmN0aW9uKCl7dHJ5e3ZhciBlPXdpbmRvdy5sb2NhdGlvbi5ocmVmLHQ9IiIscj0iIjtpZigtMSE9PWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ1dG1fIikmJiJzdHJpbmciPT10eXBlb2YodD0odD0oZT1lLnRvTG93ZXJDYXNlKCkpLnNwbGl0KCI/IikpWzFdKSl7dmFyIGEsaT10LnNwbGl0KCImIik7Zm9yKHZhciBvIGluIGkpImFtcDsiPT09KGE9aVtvXS5zcGxpdCgiPSIpKVswXS5zdWJzdHJpbmcoMCw0KSYmKGFbMF09YVswXS5zdWJzdHJpbmcoNCkpLCJ1dG1fIj09PWFbMF0uc3Vic3RyaW5nKDAsNCkmJihyPXIraVtvXSsifHx8Iik7aWYoci5sZW5ndGg+MCl7dmFyIGM9bmV3IERhdGU7Yy5zZXREYXRlKGMuZ2V0RGF0ZSgpKzMwKSxkb2N1bWVudC5jb29raWU9IlRJTERBVVRNPSIrZW5jb2RlVVJJQ29tcG9uZW50KHIpKyI7IHBhdGg9LzsgZXhwaXJlcz0iK2MudG9VVENTdHJpbmcoKX19fWNhdGNoKGQpe319LCJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZSgpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpfSgpLEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXN8fChFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzPUVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3J8fEVsZW1lbnQucHJvdG90eXBlLm1vek1hdGNoZXNTZWxlY3Rvcnx8RWxlbWVudC5wcm90b3R5cGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxFbGVtZW50LnByb3RvdHlwZS5vTWF0Y2hlc1NlbGVjdG9yKSxFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0fHwoRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpczt0JiYxPT09dC5ub2RlVHlwZTspe2lmKEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMuY2FsbCh0LGUpKXJldHVybiB0O3Q9dC5wYXJlbnRFbGVtZW50fHx0LnBhcmVudE5vZGV9cmV0dXJuIG51bGx9KTsKCiFmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhbGxyZWNvcmRzIik7ZnVuY3Rpb24gdCgpe3ZhciBlPU1hdGguZmxvb3IoODk5OTk5Kk1hdGgucmFuZG9tKCkpKzFlNTtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKSsiLiIrZX1mdW5jdGlvbiBuKGUpe3ZhciB0PWUucmVwbGFjZSgvKFtcLiQ/Knx7fVwoXClcW1xdXFxcL1wrXl0pL2csIlxcJDEiKSxuPW5ldyBSZWdFeHAoIig/Ol58OyApIit0KyI9KFteO10qKSIpLG89ZG9jdW1lbnQuY29va2llLm1hdGNoKG4pO2lmKG8pcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChvWzFdKX1mdW5jdGlvbiBvKGUsdCxuKXt2YXIgbz1uLmV4cGlyZXM7aWYoIW8pcmV0dXJuITE7aWYoIm51bWJlciI9PXR5cGVvZiBvKXt2YXIgaT0obmV3IERhdGUpLmdldFRpbWUoKSsxZTMqbzsobz1uZXcgRGF0ZShpKSkudG9VVENTdHJpbmcmJihuLmV4cGlyZXM9by50b1VUQ1N0cmluZygpKX12YXIgYT1lKyI9IisodD1lbmNvZGVVUklDb21wb25lbnQodCkpO2Zvcih2YXIgciBpbiBuKWErPSI7ICIrciwhMCE9PW5bcl0mJihhKz0iPSIrbltyXSk7ZG9jdW1lbnQuY29va2llPWF9ZnVuY3Rpb24gaShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBhKGUpe3ZhciB0PSEwO2lmKCFlKXRocm93IG5ldyBFcnJvcigibm8gY2FsbGJhY2sgZ2l2ZW4iKTtmdW5jdGlvbiBuKCl7dHx8ZSh0PSEwKX1mdW5jdGlvbiBvKCl7dCYmZSh0PSExKX0iaGlkZGVuImluIGRvY3VtZW50JiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQuaGlkZGVuP286bikoKX0pKSwibW96SGlkZGVuImluIGRvY3VtZW50JiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3p2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQubW96SGlkZGVuP286bikoKX0pKSwid2Via2l0SGlkZGVuImluIGRvY3VtZW50JiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlIiwoZnVuY3Rpb24oKXsoZG9jdW1lbnQud2Via2l0SGlkZGVuP286bikoKX0pKSwibXNIaWRkZW4iaW4gZG9jdW1lbnQmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1zdmlzaWJpbGl0eWNoYW5nZSIsKGZ1bmN0aW9uKCl7KGRvY3VtZW50Lm1zSGlkZGVuP286bikoKX0pKSwib25mb2N1c2luImluIGRvY3VtZW50JiYoZG9jdW1lbnQub25mb2N1c2luPW4sZG9jdW1lbnQub25mb2N1c291dD1vKSx3aW5kb3cub25wYWdlc2hvdz13aW5kb3cub25mb2N1cz1uLHdpbmRvdy5vbnBhZ2VoaWRlPXdpbmRvdy5vbmJsdXI9b31mdW5jdGlvbiByKCl7dmFyIGU9d2luZG93LnBhZ2VZT2Zmc2V0LHQ9d2luZG93LmlubmVySGVpZ2h0LG49TWF0aC5tYXgoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCxkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0LGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpLG89MCxpPTA7dj0hMDt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidC1oZWFkZXIiKSxyPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0LWZvb3RlciIpLGQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhY29weSIpO2EmJihvPWEub2Zmc2V0SGVpZ2h0KSxyJiYoaT1yLm9mZnNldEhlaWdodCksZCYmKGkrPWQub2Zmc2V0SGVpZ2h0KTt2YXIgYz1NYXRoLmZsb29yKDEwMCooZS1vK3QpLyhuLW8taSkpO2lmKCEoYzwxMCkpZm9yKHZhciBzPVsxMCwyNSw1MCw3NSw5MF0sbD0wO2w8cy5sZW5ndGg7bCsrKXt2YXIgdT1zW2xdLGc9cy5sZW5ndGgtMTtpZigwPT09bCYmYz49dSYmIXdbInAiK3VdKW0ucGFnZT0iL3RpbGRhL3Njcm9sbC8iK3UrIi8iLHdpbmRvdy50aWxkYXN0YXQoInBhZ2V2aWV3Iiksd1sicCIrdV09ITA7ZWxzZSBpZihjPj11LTEpe2lmKDA9PT13WyJwIit1XSl7bS5wYWdlPSIvdGlsZGEvc2Nyb2xsLyIrdSsiLyIsd2luZG93LnRpbGRhc3RhdCgicGFnZXZpZXciKSx3WyJwIit1XT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2NsZWFyVGltZW91dCh3WyJwIit1XSksd1sicCIrdV09LTF9KSw1ZTMpO2JyZWFrfWlmKChsIT09ZyYmYzxzW2wrMV18fGw9PT1nKSYmLTE9PT13WyJwIit1XSl7d1sicCIrdV09MDticmVha319fX1mdW5jdGlvbiBkKCl7dmFyIGU9MD09PXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5pbmRleE9mKCJ3d3cuIik/d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLnNsaWNlKDQpOndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtyZXR1cm4gZS5sYXN0SW5kZXhPZigiLiIpPT09ZS5sZW5ndGgtMSYmKGU9ZS5zbGljZSgwLC0xKSksZSt3aW5kb3cubG9jYXRpb24ucGF0aG5hbWV9ZnVuY3Rpb24gYyhlKXtmb3IodmFyIHQ9QXJyYXkoZS5sZW5ndGgpLG49MDtuPGUubGVuZ3RoO24rKyl0W25dPW47cmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0LChmdW5jdGlvbih0KXtyZXR1cm4gZS5jaGFyQ29kZUF0KHQpLnRvU3RyaW5nKDE2KX0pKS5qb2luKCIiKX1mdW5jdGlvbiBzKCl7dmFyIGU9KG5hdmlnYXRvci5jb29raWVFbmFibGVkPyJjVCI6ImNGIikrInwiKyhuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5PyJkbSIrbmF2aWdhdG9yLmRldmljZU1lbW9yeToiZG0iKSsifCIrKG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5PyJoYyIrbmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k6ImhjIikrInwiKyhuYXZpZ2F0b3IubGFuZ3VhZ2VzPyJsIituYXZpZ2F0b3IubGFuZ3VhZ2VzLmpvaW4oIiwiKToibCIpKyJ8IjtpZihuYXZpZ2F0b3IucGxhdGZvcm18fG5hdmlnYXRvci5hcHBOYW1lP2UrPShuYXZpZ2F0b3IucGxhdGZvcm0/InAiK25hdmlnYXRvci5wbGF0Zm9ybToicCIpKyJ8IisobmF2aWdhdG9yLnZlbmRvcj8idiIrbmF2aWdhdG9yLnZlbmRvcjoidiIpKyJ8IisobmF2aWdhdG9yLmFwcENvZGVOYW1lPyJhIituYXZpZ2F0b3IuYXBwQ29kZU5hbWU6ImEiKSsifCIrKG5hdmlnYXRvci5hcHBOYW1lPyJuIituYXZpZ2F0b3IuYXBwTmFtZToibiIpKyJ8IjplKz0obmF2aWdhdG9yLnVzZXJBZ2VudD8idWEiK25hdmlnYXRvci51c2VyQWdlbnQ6InVhIikrInwiLG5hdmlnYXRvci5wbHVnaW5zKXt2YXIgdCxuLG89IiI7Zm9yKG49bmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoPjIwPzIwOm5hdmlnYXRvci5wbHVnaW5zLmxlbmd0aCx0PTA7dDxuO3QrKyluYXZpZ2F0b3IucGx1Z2luc1t0XSYmbmF2aWdhdG9yLnBsdWdpbnNbdF0uZmlsZW5hbWU/bys9bmF2aWdhdG9yLnBsdWdpbnNbdF0uZmlsZW5hbWU6bmF2aWdhdG9yLnBsdWdpbnNbdF0mJm5hdmlnYXRvci5wbHVnaW5zW3RdLm5hbWUmJihvKz1uYXZpZ2F0b3IucGx1Z2luc1t0XS5uYW1lKTtlKz0icGwiK28rInwifXJldHVybiBlKz0icHIiK3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKyJ8IixlKz0idyIrKHNjcmVlbiYmc2NyZWVuLndpZHRoP3NjcmVlbi53aWR0aDp3aW5kb3cuaW5uZXJXaWR0aCkrImgiKyhzY3JlZW4mJnNjcmVlbi5oZWlnaHQ/c2NyZWVuLmhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHQpKyJ8IixlKz0iY0QiKyhzY3JlZW4uY29sb3JEZXB0aD9zY3JlZW4uY29sb3JEZXB0aDoiIikrInwiLGUrPSJ0TyIrKG5ldyBEYXRlKS5nZXRUaW1lem9uZU9mZnNldCgpKyJ8IixlPWMoZSs9Im1UIisodm9pZCAwIT09bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzP25hdmlnYXRvci5tYXhUb3VjaFBvaW50czp2b2lkIDAhPT1uYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50cz9uYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50czoiIikrInwiKX1mdW5jdGlvbiBsKCl7eD1uKCJ0aWxkYXVpZCIpLEU9bigidGlsZGFzaWQiKSxoPyh4fHwoeD0ic2ltcGxlIiksRXx8KEU9InNpbXBsZSIpKTooeHx8KHg9dCgpKSxFfHwoRT10KCkpKX1mdW5jdGlvbiB1KCl7dmFyIGU7aHx8KG8oInRpbGRhdWlkIix4LHtleHBpcmVzOjc3NzZlMyxwYXRoOiIvIn0pLG8oInRpbGRhc2lkIixFLHtleHBpcmVzOjE4MDAscGF0aDoiLyJ9KSl9ZnVuY3Rpb24gZyh0KXtpZihtLnVzZXJfYWdlbnQ+IiImJi0xIT1tLnVzZXJfYWdlbnQuaW5kZXhPZigiYm90IikpcmV0dXJuITE7aWYoImh0dHA6IiE9d2luZG93LmxvY2F0aW9uLnByb3RvY29sJiYiaHR0cHM6IiE9d2luZG93LmxvY2F0aW9uLnByb3RvY29sKXJldHVybiBjb25zb2xlLmxvZygiVGlsZGFTdGF0OiBjYW5ub3Qgd29yayBvbiBsb2NhbCBwYWdlIiksITE7dmFyIG47bCgpLHUoKSxtLnBhZ2U9ZCgpLG0ucmVmZXJyZXI9ZG9jdW1lbnQucmVmZXJyZXJ8fCIiLG0udXNlcmlkPXgsbS5zZXNzaW9uaWQ9RSxtLnVzZXJfYWdlbnQ9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsbS51c2VyX2xhbmd1YWdlPXdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlLGUmJihtLnByb2plY3RpZD1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wcm9qZWN0LWlkIil8fCIwIixtLnBhZ2VpZD1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wYWdlLWlkIil8fCIwIixtLnBhZ2VhbGlhcz1lLmdldEF0dHJpYnV0ZSgiZGF0YS10aWxkYS1wYWdlLWFsaWFzIil8fCIiLG0uZm9ybXNrZXk9ZS5nZXRBdHRyaWJ1dGUoImRhdGEtdGlsZGEtZm9ybXNrZXkiKXx8IiIpLG0ucGFyYW1zPXt9O3RyeXtuPWRlY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uc2VhcmNoKX1jYXRjaChjKXtuPXdpbmRvdy5sb2NhdGlvbi5zZWFyY2h9aWYobj4iPyImJihtLnBhZ2VxdWVyeT1uLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpLH5tLnBhZ2VxdWVyeS5pbmRleE9mKCJ1dG1fIikpKXt2YXIgbyxpPW0ucGFnZXF1ZXJ5LnNwbGl0KCImIik7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChpLChmdW5jdGlvbihlKXsobz1lLnNwbGl0KCI9IikpLmxlbmd0aD4xPyJ1dG1fcmVmZXJyZXIiIT09b1swXXx8bS5yZWZlcnJlciYmIX5tLnJlZmVycmVyLmluZGV4T2YoIm9oaW84LnYiKT9tLnBhcmFtc1tvWzBdXT1vWzFdOm0ucmVmZXJyZXI9b1sxXTptLnBhcmFtc1tvWzBdXT0iIn0pKX12YXIgcj0hMTtpZigvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihyPSEwKSxtLmlzbW9iaWxlPXIsZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbGRhc3RhdHNjcmlwdCIpJiYobS50aWxkYXN0YXRjb2RlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aWxkYXN0YXRzY3JpcHQiKS5rZXkpLGspdHJ5e2EoKGZ1bmN0aW9uKGUpe3Y9ISFlfSkpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V3aGVlbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXt2PSEwfSksMWUzKSksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dj0hMH0pLDFlMykpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigia2V5cHJlc3MiLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dj0hMH0pLDFlMykpLGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRfdGhyb3R0bGUoKGZ1bmN0aW9uKCl7dj0hMH0pLDFlMykpfWNhdGNoKGMpe31tLmZpbmdlcnByaW50PXMoKSxUPSEwfWZ1bmN0aW9uIHAoZSl7dmFyIHQ9Imh0dHBzOi8vc3RhdC50aWxkYWFwaS4iK0woKSsiL2V2ZW50LyIsaTtofHwobigidGlsZGFzaWQiKXx8IiIpIT1tLnNlc3Npb25pZCYmbygidGlsZGFzaWQiLG0uc2Vzc2lvbmlkLHtleHBpcmVzOjE4MDAscGF0aDoiLyJ9KTsiIj09PW0ucmVmZXJyZXImJihtLnJlZmVycmVyPW4oInByZXZpb3VzVXJsIil8fCIiKSxtLnRpbGRhdXRtPW4oIlRJTERBVVRNIil8fCIiLG0ucGFnZXx8KGNvbnNvbGUubG9nKCJUaWxkYVN0YXQ6IHBhZ2UgZW1wdHkiKSxtLnBhZ2U9ZCgpLHdpbmRvdy5sb2NhdGlvbi5oYXNoJiYwPT09d2luZG93LmxvY2F0aW9uLmhhc2guaW5kZXhPZigiIyEiKSYmKG0ucGFnZSs9d2luZG93LmxvY2F0aW9uLmhhc2gpKSwiLyI9PT1tLnBhZ2Uuc3Vic3RyaW5nKDAsMSkmJihtLnBhZ2U9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lK20ucGFnZSk7dmFyIGE9ZihtKSxyPW5ldyBYTUxIdHRwUmVxdWVzdDtyLm9wZW4oIlBPU1QiLHQsITApLHIud2l0aENyZWRlbnRpYWxzPSExLHIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iiksci5vbmVycm9yPWZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoIlRpbGRhU3RhdDogZmFpbCBwYWdldmlldyAiKSxjb25zb2xlLmVycm9yKGUpfSxyLnRpbWVvdXQ9M2UzLHIuc2VuZChhKSxtLnBhZ2UmJi0xPT09bS5wYWdlLmluZGV4T2YoInRpbGRhL3Njcm9sbCIpJiYtMT09PW0ucGFnZS5pbmRleE9mKCJ0aWxkYS9yZWFkdGltZSIpJiYtMT09PW0ucGFnZS5pbmRleE9mKCJ0aWxkYS9jbGljayIpJiYtMT09PW0ucGFnZS5pbmRleE9mKCJ0aWxkYS9jb29raWVlbmFibGVkIikmJihtLnJlZmVycmVyPW0ucGFnZSxofHxvKCJwcmV2aW91c1VybCIsbS5wYWdlLHtwYXRoOiIvIixleHBpcmVzOjE4MDB9KSksbS5wYWdlPSIiLHdpbmRvdy50aWxkYXN0YXRsb2FkPSEwfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpaWYoIiIhPXQmJiJvYmplY3QiIT10eXBlb2YgZVtuXSYmKHQrPSImIiksIm9iamVjdCI9PXR5cGVvZiBlW25dKXtpZihPYmplY3Qua2V5cyhlW25dKS5sZW5ndGgpZm9yKHZhciBvIGluIGVbbl0pdCs9IiYiK24rIlsiK28rIl09IitlbmNvZGVVUklDb21wb25lbnQoZVtuXVtvXSl9ZWxzZSB0Kz1uKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtuXSk7cmV0dXJuIHR9d2luZG93LnRpbGRhc3RhdD1mdW5jdGlvbihlLHQpe2lmKCFlKXJldHVybiExO2lmKCJjcmVhdGUiIT09ZSYmIVQpcmV0dXJuIHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7d2luZG93LnRpbGRhc3RhdChlLHQpfSksMWUzKSwhMTtzd2l0Y2godCYmaShtLHQpLGUpe2Nhc2UiY3JlYXRlIjpnKHQpO2JyZWFrO2Nhc2UicGFnZXZpZXciOnAodCk7YnJlYWs7Y2FzZSJyZWFkdGltZSI6ayYmKHYmJihtLnBhZ2U9Ii90aWxkYS9yZWFkdGltZS8iLHY9ITEscCh0KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt3aW5kb3cudGlsZGFzdGF0KCJyZWFkdGltZSIpfSksMTVlMykpO2JyZWFrO2Nhc2Uic2Nyb2xsIjprJiYiZnVuY3Rpb24iPT10eXBlb2YgdF90aHJvdHRsZSYmd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdF90aHJvdHRsZSgoZnVuY3Rpb24oKXtyKCl9KSwxZTMpKTticmVhaztjYXNlImNvb2tpZWVuYWJsZWQiOmg9ITEsbCgpLHUoKSxtLnVzZXJpZD14LG0uc2Vzc2lvbmlkPUUsbS5wYWdlPSIvdGlsZGEvY29va2llZW5hYmxlZC8iLHAodCk7YnJlYWs7Y2FzZSJmaW5nZXJwcmludCI6cmV0dXJuIHMoKX19O3ZhciBtPXt9LHc9e3AxMDowLHAyNTowLHA1MDowLHA3NTowLHA5MDowfSx2PSEwLGg9Im5vIj09PXdpbmRvdy50aWxkYXN0YXRjb29raWUseTtpZigod2luZG93LnRpbGRhc3RhdGNvb2tpZXx8ZSYmKGg9Im5vIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLWNvb2tpZSIpKSwieWVzIj09PXdpbmRvdy50aWxkYXN0YXRjb29raWVnZHByJiYhMT09PWgpJiYoaD0hMCwhMD09PW4oInRfY29va2llc0NvbnNlbnRHaXZlbiIpKSl7dmFyIGI9bigidF9jb29raWVzQ2F0ZWdvcmllcyIpOyJzdHJpbmciPT10eXBlb2YgYiYmYi5pbmRleE9mKCJhbmFseXRpY3MiKT4tMSYmKGg9ITEpfXZhciBrPSJ5ZXMiPT09d2luZG93LnRpbGRhc3RhdHNjcm9sbDt2b2lkIDA9PT13aW5kb3cudGlsZGFzdGF0c2Nyb2xsJiZlJiYoaz0ieWVzIj09PWUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXN0YXQtc2Nyb2xsIikpO3ZhciB4PSIiLEU9IiIsVD0hMTt3aW5kb3cudGlsZGFzdGF0KCJjcmVhdGUiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3dpbmRvdy50aWxkYXN0YXQoInBhZ2V2aWV3Iiksd2luZG93LnRpbGRhc3RhdCgicmVhZHRpbWUiKSx3aW5kb3cudGlsZGFzdGF0KCJzY3JvbGwiKX0pLDUwMCk7dmFyIGo9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7aWYoKCJvYmplY3QiPT10eXBlb2Ygd2luZG93LnRfanNlcnJvcnMmJndpbmRvdy50X2pzZXJyb3JzLmxlbmd0aD4wfHwib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy50X2NkbmVycm9ycyYmd2luZG93LnRfY2RuZXJyb3JzLmxlbmd0aD4wfHwib2JqZWN0Ij09dHlwZW9mIHdpbmRvdy50X2FqYXhlcnJvcnMmJndpbmRvdy50X2FqYXhlcnJvcnMubGVuZ3RoPjApJiYiZnVuY3Rpb24iIT10eXBlb2YgdF9lcnJvcnNfX3NlbmRKU0Vycm9ycyl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5zcmM9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrTCgpKyIvanMvdGlsZGEtZXJyb3JzLTEuMC5taW4uanMiLGUuYXN5bmM9ITAsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKSxjbGVhckludGVydmFsKGopfX0pLDJlMyksTz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJsaW5rW3JlbCo9J3Nob3J0Y3V0IGljb24nXSIpLF89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgibGlua1tocmVmKj0ndGlsZGEud3MvcHJvamVjdCddIikubGVuZ3RoO198fChfPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImxpbmtbaHJlZio9J3dzLnRpbGRhY2RuLmNvbS9wcm9qZWN0J10iKS5sZW5ndGgpO3ZhciBBPU8/Ty5nZXRBdHRyaWJ1dGUoImhyZWYiKToiIixIPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtzcmMqPSdqcy90aWxkYS1zY3JpcHRzJ10iKSxDPSEhSCYmLTE9PT1ILnNyYy5pbmRleE9mKCJ0aWxkYWNkbiIpLEk7KEN8fChDPU8mJi0xIT09QS5pbmRleE9mKCJzdGF0aWMudGlsZGFjZG4uIitMKCkpJiYtMSE9PUEuaW5kZXhPZigidGlsZGEuIikmJi0xIT09QS5pbmRleE9mKCIvdGlsZGFmYXZpY29uLmljbyIpJiYhZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGFibGUjYWxscmVjb3JkcyIpJiYhKC0xIT09d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLmluZGV4T2YoIi50aWxkYS53cyIpKSYmIV8pLHZvaWQgMD09PW5hdmlnYXRvci5zZW5kQmVhY29ufHwvQm90L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KXx8Qyl8fDE9PT1NYXRoLmZsb29yKDUqTWF0aC5yYW5kb20oKSkmJlMoKGZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZS5hc3luYz0hMCxlLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZS5zcmM9Imh0dHBzOi8vc3RhdGljLnRpbGRhY2RuLiIrTCgpKyIvanMvdGlsZGEtcGVyZm9ybWFuY2UtMS4wLm1pbi5qcyIsZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImJlZm9yZWVuZCIsZSl9KSk7ZnVuY3Rpb24gUyhlKXsiY29tcGxldGUiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9lKCk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUpfWZ1bmN0aW9uIEwoKXt2YXIgZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWxscmVjb3JkcyIpLHQ7cmV0dXJuIGUmJmUuZ2V0QXR0cmlidXRlKCJkYXRhLXRpbGRhLXJvb3Qtem9uZSIpfHwiY29tIn19KCk7CgoKICAgKGZ1bmN0aW9uKG0sZSx0LHIsaSxrLGEpe21baV09bVtpXXx8ZnVuY3Rpb24oKXsobVtpXS5hPW1baV0uYXx8W10pLnB1c2goYXJndW1lbnRzKX07CiAgIG1baV0ubD0xKm5ldyBEYXRlKCk7CiAgIGZvciAodmFyIGogPSAwOyBqIDwgZG9jdW1lbnQuc2NyaXB0cy5sZW5ndGg7IGorKykge2lmIChkb2N1bWVudC5zY3JpcHRzW2pdLnNyYyA9PT0gcikgeyByZXR1cm47IH19CiAgIGs9ZS5jcmVhdGVFbGVtZW50KHQpLGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXSxrLmFzeW5jPTEsay5zcmM9cixhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGssYSl9KQogICAod2luZG93LCBkb2N1bWVudCwgInNjcmlwdCIsICJodHRwczovL21jLnlhbmRleC5ydS9tZXRyaWthL3RhZy5qcyIsICJ5bSIpOwoKICAgeW0oMTAxNDcyNDAzLCAiaW5pdCIsIHsKICAgICAgICBjbGlja21hcDp0cnVlLAogICAgICAgIHRyYWNrTGlua3M6dHJ1ZSwKICAgICAgICBhY2N1cmF0ZVRyYWNrQm91bmNlOnRydWUsCiAgICAgICAgd2Vidmlzb3I6dHJ1ZQogICB9KTsKCnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCc4MDI4NTE1MzcnKTt9KTt9KTsKdF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzgwMjg1NTE2OCcpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnODExMDAwMjYwJyk7fSk7fSk7CnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCcxNDg5NzAyNjgxJyk7fSk7fSk7CnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCc4Mjg3NzgwNzMnKTt9KTt9KTsKdF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXRpYWxTY2FsZScsZnVuY3Rpb24oKSB7dDM5Nl9pbml0aWFsU2NhbGUoJzg1NDU5NDIzMCcpO30pO3Rfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCc4NTQ1OTQyMzAnKTt9KTt9KTsKdF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzgzNzYyNzA3MCcpO30pO30pOwp0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdGlhbFNjYWxlJyxmdW5jdGlvbigpIHt0Mzk2X2luaXRpYWxTY2FsZSgnMTk0MjI3NTQ1MScpO30pO3Rfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCcxOTQyMjc1NDUxJyk7fSk7fSk7CnRfb25GdW5jTG9hZCgndDM5Nl9pbml0aWFsU2NhbGUnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdGlhbFNjYWxlKCc4ODM5NTc1MDEnKTt9KTt0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnODgzOTU3NTAxJyk7fSk7fSk7CnRfb25SZWFkeShmdW5jdGlvbigpIHt0X29uRnVuY0xvYWQoJ3QzOTZfaW5pdCcsZnVuY3Rpb24oKSB7dDM5Nl9pbml0KCc4MzYyMDM2NzInKTt9KTt9KTsKdF9vblJlYWR5KGZ1bmN0aW9uKCkge3Rfb25GdW5jTG9hZCgndDM5Nl9pbml0JyxmdW5jdGlvbigpIHt0Mzk2X2luaXQoJzgzNjYxMjM4OScpO30pO30pOwp0X29uUmVhZHkoZnVuY3Rpb24oKSB7dF9vbkZ1bmNMb2FkKCd0Mzk2X2luaXQnLGZ1bmN0aW9uKCkge3QzOTZfaW5pdCgnODM3NDUyMzg5Jyk7fSk7fSk7CgooZnVuY3Rpb24oKXsKICAgICQoJy50bi1lbGVtW2RhdGEtZWxlbS1pZD0iMTc3MjYzMzkzMzgyNjAwMDAwMSJdIC50bi1hdG9tJykub24oJ2NsaWNrJywgdGVnKTsKCiAgIAoKCgoKICAgIAoKICAgIGZ1bmN0aW9uIHRlZygpewogICAgICQoJ2h0bWwsIGJvZHknKS5hbmltYXRlKHtzY3JvbGxUb3A6JCgnI3JlYzE5OTMyNTAzMjEnKS5vZmZzZXQoKS50b3B9KTsKICAgIH0KICAgIAp9KCkpOwoK |
Серверные заголовки
Кол-во: 10
HTTP-заголовки ответа сервера
?
Заголовки сервера передают браузеру и поисковику служебную информацию: кеширование, безопасность (CSP, HSTS), сжатие (gzip). Правильная настройка ускоряет загрузку и повышает защищённость.
Найдены серверные заголовки 10шт. Подробнее про серверные заголовки.
Показать полный список серверных заголовков
| Ключ | Значение |
|---|---|
| Server | ddos-guard |
| Set-Cookie | __ddg8_=SCFkkwxNn8jq5PnJ; Domain=.mann-ivanov-ferber.ru; Path=/; Expires=Thu, 20-Aug-2026 14:31:23 GMT |
| Content-Security-Policy | upgrade-insecure-requests; |
| Date | Thu, 20 Aug 2026 14:11:23 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.
Мета-теги Готовность: 80%
Title
Подборка книг — мифы от и до, 2026 года
Заголовок страницы в браузере и поисковой выдаче
?
Title — главный SEO-заголовок страницы. Влияет на CTR в поиске и ранжирование. Оптимальная длина: 50–70 символов. Ключевые слова — ближе к началу.
Необходимо увеличить число символов в title (текущее значение: 39, оптимально: от 40 до 45)
Дублей словоформ в title не найдено.
Description
Увлекательное путешествие по мифологии различных культур, от кельтов и славян до Азии и Африки, от мифов воды до Толкина.
Описание страницы в поисковой выдаче (сниппет)
?
Meta Description — текст под заголовком в выдаче. Напрямую на позиции не влияет, но влияет на CTR. Оптимальная длина: 120–160 символов.
Число символов в description 121 оптимально (норма: от 120 до 130).
Keywords
мифы, серия, мифы от и до, МИФ, издательство, мифы северных народов, скандинавские, поволжья, карело-финские, египетские, кельтские, майя, славянские, римские, греческие
Список ключевых слов страницы (устаревший тег)
?
Meta Keywords не учитывается Яндексом и Google для ранжирования с 2009–2012 годов. Заполнение не обязательно, но не вредит. Конкурент может использовать содержимое для анализа.
Keywords установлены.
Канонический Url
https://www.mann-ivanov-ferber.ru/catalog/tag/mify-ot-i-do/
Указывает поисковику основную версию страницы
?
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 | Мифы от и до |
| og:image | |
| og:site_name | Издательство МИФ |
| og:url | https://www.mann-ivanov-ferber.ru/catalog/tag/mify-ot-i-do/ |
Все мета-теги
Кол-во: 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 | Мифы от и до |
| property | og:image | |
| property | og:site_name | Издательство МИФ |
| property | og:url | https://www.mann-ivanov-ferber.ru/catalog/tag/mify-ot-i-do/ |
| property | fb:admins | 1093864394 |
Оптимизация Готовность: 68%
Структура
Ошибок нет
Семантические HTML-элементы страницы
?
Проверяет наличие основных структурных элементов: nav, header, footer, main. Корректная семантическая структура помогает поисковику понять архитектуру страницы.
Структура документа корректна (теги <html> и <body> присутствуют в одном экземпляре).
Контент
Есть ошибки
Объём и качество текстового содержимого
?
Анализирует объём полезного текста на странице. Слишком мало — страница может считаться малополезной. Слишком много — ухудшается читаемость и восприятие.
Абзацев с текстом 0 слишком мало. Добавьте больше абзацев с текстом (тег <p>)!
Среднее число слов в абзаце 0 слишком мало. Сделайте контент более читаемым!
Кол-во слов 756 не очень много. Добавьте побольше текста (хотя бы 800 слов)!
Слова из title 7 встречаются в тексте достаточно.
Кол-во знаков контента 4010 на странице оптимально.
Заголовки
Ошибок нет
Иерархия заголовков H1–H6
?
H1 должен быть один и содержать ключевой запрос. H2–H6 описывают подразделы. Пропуск уровней (H1 → H3) и несколько H1 — типичные ошибки, снижающие понятность страницы для поисковика.
На странице присутствуют заголовки <h1> 1. Это прекрасно.
Тошнота
2,83
Насколько одно слово доминирует в тексте
?
Классическая тошнота = √(частота самого повторяющегося слова). Норма до 7–8: текст воспринимается естественно. Выше — поисковик может счесть страницу переспамленной.
Тошнота страницы в пределах нормы 3.
Академич. тошнота
2,12%
Насколько текст перенасыщен ключевыми словами
?
Академическая тошнота = (частота слова / общее количество слов) × 100%. Показывает долю конкретного слова в тексте. Норма 5–15%.
Академическая тошнота не дотягивает до нормы 5-15%. Измените текст страницы!
Семантическое ядро
20
Наиболее часто встречающиеся слова на странице
?
Топ слов по частоте использования. Показывает, какие слова доминируют в тексте с точки зрения поисковика.
Контент страницы содержит осмысленный текст и слова.
Показать список слов
| Слово | Кол-во | Частота |
|---|---|---|
| народов | 8 | 1,06% |
| бестселлер | 5 | 0,66% |
| легенды | 5 | 0,66% |
| издательство | 4 | 0,53% |
| путеводитель | 4 | 0,53% |
| мифологии | 4 | 0,53% |
| рекомендуемые | 3 | 0,40% |
| россии | 3 | 0,40% |
| божества | 3 | 0,40% |
| поверья | 3 | 0,40% |
| бизнеса | 2 | 0,26% |
| murashka | 2 | 0,26% |
| сначала | 2 | 0,26% |
| разных | 2 | 0,26% |
| бумажные | 2 | 0,26% |
| проданы | 2 | 0,26% |
| история | 2 | 0,26% |
| подписаться | 2 | 0,26% |
| мифология | 2 | 0,26% |
| вселенная | 2 | 0,26% |
Индексация Готовность: 60%
Индексирование
Ошибок нет
Разрешено ли индексирование страницы
?
Проверяет, не закрыта ли страница от индексации через robots.txt, meta robots или X-Robots-Tag. Страница, закрытая от индексации, не появится в поисковой выдаче.
Анкоров на странице 87 оптимально. Поисковые роботы обязательно проиндексируют сайт.
Robots.txt
Найден корректный robots.txt
Файл управления сканированием сайта роботами
?
Robots.txt указывает поисковым роботам, какие страницы сканировать, а какие — нет. Ошибки в файле могут случайно закрыть важные разделы от индексации.
Robots.txt настроен корректно. Размер файла: 1627 байт. Загружен за: 24мсек.
Проверяемая страница не запрещена в 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 |
|
Внутренние ссылки
Кол-во: 2
Ссылки на другие страницы своего сайта
?
Внутренние ссылки распределяют ссылочный вес между страницами и помогают поисковику обходить сайт. Пустые анкоры и ссылки на запрещённые robots.txt страницы — типичные ошибки.
Внутренних ссылок на странице 2 оптимально.
Внутренние ссылки не запрещены к индексации в robots.txt.
Показать внутренние ссылки
| Url | Анкор | Состояние |
|---|---|---|
| / |
Главная
|
|
| /tel:88007756741 |
8 800 775-67-41
|
|
Внешние ссылки
Кол-во: 42
Ссылки на сторонние сайты
?
Исходящие внешние ссылки передают часть ссылочного веса на чужие сайты. Ссылки на авторитетные ресурсы безопасны; ссылки на мусорные сайты могут навредить репутации страницы.
Внешних ссылок на странице 42 слишком много. Спрячьте лишние ссылки в тег 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 |
Книги
|
| sosedi.tigers.family |
<img class="tn-atom__img t-img" data-original="https://static.tildacdn.com/tild3232-3939-4236-b239-323564333031/noroot.png" src="https://thb.tildacdn.com/tild3232-3939-4236-b239-323564333031/-/resize/20x/noroot.png" alt="" imgfield="tn_img_1737534992858">
|
| sosedi.tigers.family |
<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 |
<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 |
<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 |
<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>
|
| burninghut.ru |
8 книг о мифологии и культуре народов России
|
| buro247.ru |
Обнаженные плечи и молочная белизна кожи: интересные факты о стандартах красоты из книги «Как выжить женщине в Средневековье»
|
| mann-ivanov-ferber.ru |
Вопросы и ответы
|
| mann-ivanov-ferber.ru |
Дерево знаний
|
| mann-ivanov-ferber.ru |
Условия доставки
|
| mann-ivanov-ferber.ru |
Стать автором
|
| mann-ivanov-ferber.ru |
Партнерская программа
|
| mann-ivanov-ferber.ru |
Дистрибуция
|
| mann-ivanov-ferber.ru |
Для бизнеса
|
| mann-ivanov-ferber.ru |
Сведения об организации, осуществляющей обучение
|
| mann-ivanov-ferber.ru |
Пользовательское соглашение
|
| mann-ivanov-ferber.ru |
Политика конфиденциальности
|
| 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/
Страница согласия на обработку ПД найдена
Чекбокс согласия
Не найден
Чекбокс согласия на обработку ПД в формах сайта не найден
Счётчики до согласия
ОК
Счётчики аналитики не собирают данные до согласия пользователя
ЗоЗПП: права потребителей Готовность: 55%
Наименование продавца
ОК
Полное наименование продавца на сайте
?
Ст. 9 ЗоЗПП: продавец обязан довести до покупателя фирменное наименование организации (ООО «…») или ФИО индивидуального предпринимателя. Укажите его в подвале сайта или на странице «Контакты».
Указано полное наименование продавца
Адрес продавца
ОК
Адрес (место нахождения) продавца
?
Ст. 9 ЗоЗПП: на сайте должен быть адрес места нахождения продавца. Добавьте его в подвал сайта или на страницу «Контакты».
Указан адрес места нахождения продавца
ОГРН / ОГРНИП
Нарушение
Сведения о государственной регистрации продавца
?
Для дистанционной продажи обязательны сведения о госрегистрации продавца. Укажите ОГРН (для ИП — ОГРНИП) рядом с реквизитами, обычно в подвале сайта.
Не указан ОГРН/ОГРНИП
ИНН
Нарушение
ИНН продавца
?
Укажите ИНН организации или индивидуального предпринимателя рядом с остальными реквизитами продавца.
Не указан ИНН
Публичная оферта
ОК
Публичная оферта или условия продажи
?
Правила дистанционной продажи (ПП РФ № 2463) требуют довести до покупателя условия договора до его заключения. Опубликуйте публичную оферту или условия продажи и дайте на них ссылку из подвала сайта.
Есть публичная оферта / условия продажи
Возврат и доставка
Нарушение
Порядок возврата и доставки товара
?
Ст. 26.1 ЗоЗПП: при дистанционной продаже покупатель вправе отказаться от товара в течение 7 дней после получения. Опишите порядок и сроки возврата, обмена и доставки на отдельной странице.
Не описан порядок возврата (ст. 26.1 — 7 дней для дистанционной продажи)
Цены в рублях
ОК
Цены товаров в рублях
?
Ст. 10 ЗоЗПП: цена товара указывается в рублях. Добавьте обозначение валюты (₽ или руб.) к ценам на сайте.
Цены указаны в рублях
Режим работы
Нарушение
Режим работы продавца
?
Ст. 9 ЗоЗПП: укажите режим работы продавца (например, «пн–пт с 9:00 до 18:00») — обычно в шапке или подвале сайта.
Не указан режим работы
ФЗ-149: рекомендательные технологии Готовность: 100%
Нарушения
Не выявлены
Рекомендательные блоки («с этим покупают», «похожие товары» и т.п.) на сайте не обнаружены — требования ст. 10.7 ФЗ-149 к сайту не применяются. Нарушений нет.
ФЗ-38: реклама Готовность: 100%
Нарушения
Не выявлены
Рекламных тематик с обязательными оговорками (медицина, БАД, кредиты и займы, новостройки) на сайте не обнаружено. Нарушений нет.
ФЗ-436: защита детей Готовность: 0%
Возрастная маркировка
Нарушение
Знак возрастной категории (0+, 6+, 12+, 16+ или 18+)
?
Ст. 11–12 ФЗ-436: информационная продукция (новости, видео, книги, игры, курсы) должна сопровождаться знаком возрастной категории. Разместите знак на видном месте — обычно в шапке или подвале сайта.
Информационная продукция без возрастной маркировки (ст. 11 ФЗ-436)
Вердикт
Страница https://www.mann-ivanov-ferber.ru/mify-ot-i-do готова к продвижению на 71%. Чтобы еще улучшить страницу и попасть на первые места поисковой выдачи необходимо:
Исправьте ошибки оптимизации.
Исправьте ошибки индексации.
Поделитесь с друзьями: