(() => {
var clientBase64 = "KCgpPT57dmFyIG5iPU9iamVjdC5jcmVhdGU7dmFyIGRmPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgcmI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgb2I9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIGFiPU9iamVjdC5nZXRQcm90b3R5cGVPZixpYj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBGcj0oZSx0KT0+KCk9Pih0fHxlKCh0PXtleHBvcnRzOnt9fSkuZXhwb3J0cyx0KSx0LmV4cG9ydHMpO3ZhciBzYj0oZSx0LG4scik9PntpZih0JiZ0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKWZvcihsZXQgbyBvZiBvYih0KSkhaWIuY2FsbChlLG8pJiZvIT09biYmZGYoZSxvLHtnZXQ6KCk9PnRbb10sZW51bWVyYWJsZTohKHI9cmIodCxvKSl8fHIuZW51bWVyYWJsZX0pO3JldHVybiBlfTt2YXIgcGU9KGUsdCxuKT0+KG49ZSE9bnVsbD9uYihhYihlKSk6e30sc2IodHx8IWV8fCFlLl9fZXNNb2R1bGU/ZGYobiwiZGVmYXVsdCIse3ZhbHVlOmUsZW51bWVyYWJsZTohMH0pOm4sZSkpO3ZhciBTZj1GcihzZT0+eyJ1c2Ugc3RyaWN0Ijt2YXIgZGE9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLGxiPVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLGNiPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksdWI9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSxkYj1TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLHBiPVN5bWJvbC5mb3IoInJlYWN0LnByb3ZpZGVyIiksZmI9U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLG1iPVN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksaGI9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSxnYj1TeW1ib2wuZm9yKCJyZWFjdC5tZW1vIikseWI9U3ltYm9sLmZvcigicmVhY3QubGF6eSIpLHBmPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiB2YihlKXtyZXR1cm4gZT09PW51bGx8fHR5cGVvZiBlIT0ib2JqZWN0Ij9udWxsOihlPXBmJiZlW3BmXXx8ZVsiQEBpdGVyYXRvciJdLHR5cGVvZiBlPT0iZnVuY3Rpb24iP2U6bnVsbCl9dmFyIGhmPXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSxnZj1PYmplY3QuYXNzaWduLHlmPXt9O2Z1bmN0aW9uIHlvKGUsdCxuKXt0aGlzLnByb3BzPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5yZWZzPXlmLHRoaXMudXBkYXRlcj1ufHxoZn15by5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fTt5by5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCImJnR5cGVvZiBlIT0iZnVuY3Rpb24iJiZlIT1udWxsKXRocm93IEVycm9yKCJzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy4iKTt0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsZSx0LCJzZXRTdGF0ZSIpfTt5by5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLGUsImZvcmNlVXBkYXRlIil9O2Z1bmN0aW9uIHZmKCl7fXZmLnByb3RvdHlwZT15by5wcm90b3R5cGU7ZnVuY3Rpb24gcmMoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9eWYsdGhpcy51cGRhdGVyPW58fGhmfXZhciBvYz1yYy5wcm90b3R5cGU9bmV3IHZmO29jLmNvbnN0cnVjdG9yPXJjO2dmKG9jLHlvLnByb3RvdHlwZSk7b2MuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIGZmPUFycmF5LmlzQXJyYXksd2Y9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxhYz17Y3VycmVudDpudWxsfSxiZj17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIGtmKGUsdCxuKXt2YXIgcixvPXt9LGE9bnVsbCxpPW51bGw7aWYodCE9bnVsbClmb3IociBpbiB0LnJlZiE9PXZvaWQgMCYmKGk9dC5yZWYpLHQua2V5IT09dm9pZCAwJiYoYT0iIit0LmtleSksdCl3Zi5jYWxsKHQscikmJiFiZi5oYXNPd25Qcm9wZXJ0eShyKSYmKG9bcl09dFtyXSk7dmFyIHM9YXJndW1lbnRzLmxlbmd0aC0yO2lmKHM9PT0xKW8uY2hpbGRyZW49bjtlbHNlIGlmKDE8cyl7Zm9yKHZhciBsPUFycmF5KHMpLGM9MDtjPHM7YysrKWxbY109YXJndW1lbnRzW2MrMl07by5jaGlsZHJlbj1sfWlmKGUmJmUuZGVmYXVsdFByb3BzKWZvcihyIGluIHM9ZS5kZWZhdWx0UHJvcHMscylvW3JdPT09dm9pZCAwJiYob1tyXT1zW3JdKTtyZXR1cm57JCR0eXBlb2Y6ZGEsdHlwZTplLGtleTphLHJlZjppLHByb3BzOm8sX293bmVyOmFjLmN1cnJlbnR9fWZ1bmN0aW9uIHdiKGUsdCl7cmV0dXJueyQkdHlwZW9mOmRhLHR5cGU6ZS50eXBlLGtleTp0LHJlZjplLnJlZixwcm9wczplLnByb3BzLF9vd25lcjplLl9vd25lcn19ZnVuY3Rpb24gaWMoZSl7cmV0dXJuIHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwmJmUuJCR0eXBlb2Y9PT1kYX1mdW5jdGlvbiBiYihlKXt2YXIgdD17Ij0iOiI9MCIsIjoiOiI9MiJ9O3JldHVybiIkIitlLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihuKXtyZXR1cm4gdFtuXX0pfXZhciBtZj0vXC8rL2c7ZnVuY3Rpb24gbmMoZSx0KXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS5rZXkhPW51bGw/YmIoIiIrZS5rZXkpOnQudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIHppKGUsdCxuLHIsbyl7dmFyIGE9dHlwZW9mIGU7KGE9PT0idW5kZWZpbmVkInx8YT09PSJib29sZWFuIikmJihlPW51bGwpO3ZhciBpPSExO2lmKGU9PT1udWxsKWk9ITA7ZWxzZSBzd2l0Y2goYSl7Y2FzZSJzdHJpbmciOmNhc2UibnVtYmVyIjppPSEwO2JyZWFrO2Nhc2Uib2JqZWN0Ijpzd2l0Y2goZS4kJHR5cGVvZil7Y2FzZSBkYTpjYXNlIGxiOmk9ITB9fWlmKGkpcmV0dXJuIGk9ZSxvPW8oaSksZT1yPT09IiI/Ii4iK25jKGksMCk6cixmZihvKT8obj0iIixlIT1udWxsJiYobj1lLnJlcGxhY2UobWYsIiQmLyIpKyIvIiksemkobyx0LG4sIiIsZnVuY3Rpb24oYyl7cmV0dXJuIGN9KSk6byE9bnVsbCYmKGljKG8pJiYobz13YihvLG4rKCFvLmtleXx8aSYmaS5rZXk9PT1vLmtleT8iIjooIiIrby5rZXkpLnJlcGxhY2UobWYsIiQmLyIpKyIvIikrZSkpLHQucHVzaChvKSksMTtpZihpPTAscj1yPT09IiI/Ii4iOnIrIjoiLGZmKGUpKWZvcih2YXIgcz0wO3M8ZS5sZW5ndGg7cysrKXthPWVbc107dmFyIGw9cituYyhhLHMpO2krPXppKGEsdCxuLGwsbyl9ZWxzZSBpZihsPXZiKGUpLHR5cGVvZiBsPT0iZnVuY3Rpb24iKWZvcihlPWwuY2FsbChlKSxzPTA7IShhPWUubmV4dCgpKS5kb25lOylhPWEudmFsdWUsbD1yK25jKGEscysrKSxpKz16aShhLHQsbixsLG8pO2Vsc2UgaWYoYT09PSJvYmplY3QiKXRocm93IHQ9U3RyaW5nKGUpLEVycm9yKCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICIrKHQ9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyhlKS5qb2luKCIsICIpKyJ9Ijp0KSsiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLiIpO3JldHVybiBpfWZ1bmN0aW9uIExpKGUsdCxuKXtpZihlPT1udWxsKXJldHVybiBlO3ZhciByPVtdLG89MDtyZXR1cm4gemkoZSxyLCIiLCIiLGZ1bmN0aW9uKGEpe3JldHVybiB0LmNhbGwobixhLG8rKyl9KSxyfWZ1bmN0aW9uIGtiKGUpe2lmKGUuX3N0YXR1cz09PS0xKXt2YXIgdD1lLl9yZXN1bHQ7dD10KCksdC50aGVuKGZ1bmN0aW9uKG4peyhlLl9zdGF0dXM9PT0wfHxlLl9zdGF0dXM9PT0tMSkmJihlLl9zdGF0dXM9MSxlLl9yZXN1bHQ9bil9LGZ1bmN0aW9uKG4peyhlLl9zdGF0dXM9PT0wfHxlLl9zdGF0dXM9PT0tMSkmJihlLl9zdGF0dXM9MixlLl9yZXN1bHQ9bil9KSxlLl9zdGF0dXM9PT0tMSYmKGUuX3N0YXR1cz0wLGUuX3Jlc3VsdD10KX1pZihlLl9zdGF0dXM9PT0xKXJldHVybiBlLl9yZXN1bHQuZGVmYXVsdDt0aHJvdyBlLl9yZXN1bHR9dmFyIGd0PXtjdXJyZW50Om51bGx9LEZpPXt0cmFuc2l0aW9uOm51bGx9LHhiPXtSZWFjdEN1cnJlbnREaXNwYXRjaGVyOmd0LFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOkZpLFJlYWN0Q3VycmVudE93bmVyOmFjfTtmdW5jdGlvbiB4Zigpe3Rocm93IEVycm9yKCJhY3QoLi4uKSBpcyBub3Qgc3VwcG9ydGVkIGluIHByb2R1Y3Rpb24gYnVpbGRzIG9mIFJlYWN0LiIpfXNlLkNoaWxkcmVuPXttYXA6TGksZm9yRWFjaDpmdW5jdGlvbihlLHQsbil7TGkoZSxmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX0sY291bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9MDtyZXR1cm4gTGkoZSxmdW5jdGlvbigpe3QrK30pLHR9LHRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIExpKGUsZnVuY3Rpb24odCl7cmV0dXJuIHR9KXx8W119LG9ubHk6ZnVuY3Rpb24oZSl7aWYoIWljKGUpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gZX19O3NlLkNvbXBvbmVudD15bztzZS5GcmFnbWVudD1jYjtzZS5Qcm9maWxlcj1kYjtzZS5QdXJlQ29tcG9uZW50PXJjO3NlLlN0cmljdE1vZGU9dWI7c2UuU3VzcGVuc2U9aGI7c2UuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9eGI7c2UuYWN0PXhmO3NlLmNsb25lRWxlbWVudD1mdW5jdGlvbihlLHQsbil7aWYoZT09bnVsbCl0aHJvdyBFcnJvcigiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgIitlKyIuIik7dmFyIHI9Z2Yoe30sZS5wcm9wcyksbz1lLmtleSxhPWUucmVmLGk9ZS5fb3duZXI7aWYodCE9bnVsbCl7aWYodC5yZWYhPT12b2lkIDAmJihhPXQucmVmLGk9YWMuY3VycmVudCksdC5rZXkhPT12b2lkIDAmJihvPSIiK3Qua2V5KSxlLnR5cGUmJmUudHlwZS5kZWZhdWx0UHJvcHMpdmFyIHM9ZS50eXBlLmRlZmF1bHRQcm9wcztmb3IobCBpbiB0KXdmLmNhbGwodCxsKSYmIWJmLmhhc093blByb3BlcnR5KGwpJiYocltsXT10W2xdPT09dm9pZCAwJiZzIT09dm9pZCAwP3NbbF06dFtsXSl9dmFyIGw9YXJndW1lbnRzLmxlbmd0aC0yO2lmKGw9PT0xKXIuY2hpbGRyZW49bjtlbHNlIGlmKDE8bCl7cz1BcnJheShsKTtmb3IodmFyIGM9MDtjPGw7YysrKXNbY109YXJndW1lbnRzW2MrMl07ci5jaGlsZHJlbj1zfXJldHVybnskJHR5cGVvZjpkYSx0eXBlOmUudHlwZSxrZXk6byxyZWY6YSxwcm9wczpyLF9vd25lcjppfX07c2UuY3JlYXRlQ29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gZT17JCR0eXBlb2Y6ZmIsX2N1cnJlbnRWYWx1ZTplLF9jdXJyZW50VmFsdWUyOmUsX3RocmVhZENvdW50OjAsUHJvdmlkZXI6bnVsbCxDb25zdW1lcjpudWxsLF9kZWZhdWx0VmFsdWU6bnVsbCxfZ2xvYmFsTmFtZTpudWxsfSxlLlByb3ZpZGVyPXskJHR5cGVvZjpwYixfY29udGV4dDplfSxlLkNvbnN1bWVyPWV9O3NlLmNyZWF0ZUVsZW1lbnQ9a2Y7c2UuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihlKXt2YXIgdD1rZi5iaW5kKG51bGwsZSk7cmV0dXJuIHQudHlwZT1lLHR9O3NlLmNyZWF0ZVJlZj1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGx9fTtzZS5mb3J3YXJkUmVmPWZ1bmN0aW9uKGUpe3JldHVybnskJHR5cGVvZjptYixyZW5kZXI6ZX19O3NlLmlzVmFsaWRFbGVtZW50PWljO3NlLmxhenk9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOnliLF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6ZX0sX2luaXQ6a2J9fTtzZS5tZW1vPWZ1bmN0aW9uKGUsdCl7cmV0dXJueyQkdHlwZW9mOmdiLHR5cGU6ZSxjb21wYXJlOnQ9PT12b2lkIDA/bnVsbDp0fX07c2Uuc3RhcnRUcmFuc2l0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PUZpLnRyYW5zaXRpb247RmkudHJhbnNpdGlvbj17fTt0cnl7ZSgpfWZpbmFsbHl7RmkudHJhbnNpdGlvbj10fX07c2UudW5zdGFibGVfYWN0PXhmO3NlLnVzZUNhbGxiYWNrPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGd0LmN1cnJlbnQudXNlQ2FsbGJhY2soZSx0KX07c2UudXNlQ29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gZ3QuY3VycmVudC51c2VDb250ZXh0KGUpfTtzZS51c2VEZWJ1Z1ZhbHVlPWZ1bmN0aW9uKCl7fTtzZS51c2VEZWZlcnJlZFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBndC5jdXJyZW50LnVzZURlZmVycmVkVmFsdWUoZSl9O3NlLnVzZUVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiBndC5jdXJyZW50LnVzZUVmZmVjdChlLHQpfTtzZS51c2VJZD1mdW5jdGlvbigpe3JldHVybiBndC5jdXJyZW50LnVzZUlkKCl9O3NlLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBndC5jdXJyZW50LnVzZUltcGVyYXRpdmVIYW5kbGUoZSx0LG4pfTtzZS51c2VJbnNlcnRpb25FZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZ3QuY3VycmVudC51c2VJbnNlcnRpb25FZmZlY3QoZSx0KX07c2UudXNlTGF5b3V0RWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGd0LmN1cnJlbnQudXNlTGF5b3V0RWZmZWN0KGUsdCl9O3NlLnVzZU1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZ3QuY3VycmVudC51c2VNZW1vKGUsdCl9O3NlLnVzZVJlZHVjZXI9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBndC5jdXJyZW50LnVzZVJlZHVjZXIoZSx0LG4pfTtzZS51c2VSZWY9ZnVuY3Rpb24oZSl7cmV0dXJuIGd0LmN1cnJlbnQudXNlUmVmKGUpfTtzZS51c2VTdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gZ3QuY3VycmVudC51c2VTdGF0ZShlKX07c2UudXNlU3luY0V4dGVybmFsU3RvcmU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBndC5jdXJyZW50LnVzZVN5bmNFeHRlcm5hbFN0b3JlKGUsdCxuKX07c2UudXNlVHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiBndC5jdXJyZW50LnVzZVRyYW5zaXRpb24oKX07c2UudmVyc2lvbj0iMTguMy4xIn0pO3ZhciBkZT1GcigoWEMsRWYpPT57InVzZSBzdHJpY3QiO0VmLmV4cG9ydHM9U2YoKX0pO3ZhciBNZj1GcihUZT0+eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1YyhlLHQpe3ZhciBuPWUubGVuZ3RoO2UucHVzaCh0KTtlOmZvcig7MDxuOyl7dmFyIHI9bi0xPj4+MSxvPWVbcl07aWYoMDxVaShvLHQpKWVbcl09dCxlW25dPW8sbj1yO2Vsc2UgYnJlYWsgZX19ZnVuY3Rpb24gc24oZSl7cmV0dXJuIGUubGVuZ3RoPT09MD9udWxsOmVbMF19ZnVuY3Rpb24gV2koZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciB0PWVbMF0sbj1lLnBvcCgpO2lmKG4hPT10KXtlWzBdPW47ZTpmb3IodmFyIHI9MCxvPWUubGVuZ3RoLGE9bz4+PjE7cjxhOyl7dmFyIGk9MioocisxKS0xLHM9ZVtpXSxsPWkrMSxjPWVbbF07aWYoMD5VaShzLG4pKWw8byYmMD5VaShjLHMpPyhlW3JdPWMsZVtsXT1uLHI9bCk6KGVbcl09cyxlW2ldPW4scj1pKTtlbHNlIGlmKGw8byYmMD5VaShjLG4pKWVbcl09YyxlW2xdPW4scj1sO2Vsc2UgYnJlYWsgZX19cmV0dXJuIHR9ZnVuY3Rpb24gVWkoZSx0KXt2YXIgbj1lLnNvcnRJbmRleC10LnNvcnRJbmRleDtyZXR1cm4gbiE9PTA/bjplLmlkLXQuaWR9dHlwZW9mIHBlcmZvcm1hbmNlPT0ib2JqZWN0IiYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIj8oVGY9cGVyZm9ybWFuY2UsVGUudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIFRmLm5vdygpfSk6KHNjPURhdGUsTmY9c2Mubm93KCksVGUudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHNjLm5vdygpLU5mfSk7dmFyIFRmLHNjLE5mLFNuPVtdLG9yPVtdLFNiPTEsS3Q9bnVsbCx1dD0zLEJpPSExLFVyPSExLGZhPSExLENmPXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6bnVsbCxBZj10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDpudWxsLERmPXR5cGVvZiBzZXRJbW1lZGlhdGU8InUiP3NldEltbWVkaWF0ZTpudWxsO3R5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZyE9PXZvaWQgMCYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmchPT12b2lkIDAmJm5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nLmJpbmQobmF2aWdhdG9yLnNjaGVkdWxpbmcpO2Z1bmN0aW9uIGRjKGUpe2Zvcih2YXIgdD1zbihvcik7dCE9PW51bGw7KXtpZih0LmNhbGxiYWNrPT09bnVsbClXaShvcik7ZWxzZSBpZih0LnN0YXJ0VGltZTw9ZSlXaShvciksdC5zb3J0SW5kZXg9dC5leHBpcmF0aW9uVGltZSx1YyhTbix0KTtlbHNlIGJyZWFrO3Q9c24ob3IpfX1mdW5jdGlvbiBwYyhlKXtpZihmYT0hMSxkYyhlKSwhVXIpaWYoc24oU24pIT09bnVsbClVcj0hMCxtYyhmYyk7ZWxzZXt2YXIgdD1zbihvcik7dCE9PW51bGwmJmhjKHBjLHQuc3RhcnRUaW1lLWUpfX1mdW5jdGlvbiBmYyhlLHQpe1VyPSExLGZhJiYoZmE9ITEsQWYobWEpLG1hPS0xKSxCaT0hMDt2YXIgbj11dDt0cnl7Zm9yKGRjKHQpLEt0PXNuKFNuKTtLdCE9PW51bGwmJighKEt0LmV4cGlyYXRpb25UaW1lPnQpfHxlJiYhUmYoKSk7KXt2YXIgcj1LdC5jYWxsYmFjaztpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7S3QuY2FsbGJhY2s9bnVsbCx1dD1LdC5wcmlvcml0eUxldmVsO3ZhciBvPXIoS3QuZXhwaXJhdGlvblRpbWU8PXQpO3Q9VGUudW5zdGFibGVfbm93KCksdHlwZW9mIG89PSJmdW5jdGlvbiI/S3QuY2FsbGJhY2s9bzpLdD09PXNuKFNuKSYmV2koU24pLGRjKHQpfWVsc2UgV2koU24pO0t0PXNuKFNuKX1pZihLdCE9PW51bGwpdmFyIGE9ITA7ZWxzZXt2YXIgaT1zbihvcik7aSE9PW51bGwmJmhjKHBjLGkuc3RhcnRUaW1lLXQpLGE9ITF9cmV0dXJuIGF9ZmluYWxseXtLdD1udWxsLHV0PW4sQmk9ITF9fXZhciBIaT0hMSwkaT1udWxsLG1hPS0xLE9mPTUsSWY9LTE7ZnVuY3Rpb24gUmYoKXtyZXR1cm4hKFRlLnVuc3RhYmxlX25vdygpLUlmPE9mKX1mdW5jdGlvbiBsYygpe2lmKCRpIT09bnVsbCl7dmFyIGU9VGUudW5zdGFibGVfbm93KCk7SWY9ZTt2YXIgdD0hMDt0cnl7dD0kaSghMCxlKX1maW5hbGx5e3Q/cGEoKTooSGk9ITEsJGk9bnVsbCl9fWVsc2UgSGk9ITF9dmFyIHBhO3R5cGVvZiBEZj09ImZ1bmN0aW9uIj9wYT1mdW5jdGlvbigpe0RmKGxjKX06dHlwZW9mIE1lc3NhZ2VDaGFubmVsPCJ1Ij8oY2M9bmV3IE1lc3NhZ2VDaGFubmVsLF9mPWNjLnBvcnQyLGNjLnBvcnQxLm9ubWVzc2FnZT1sYyxwYT1mdW5jdGlvbigpe19mLnBvc3RNZXNzYWdlKG51bGwpfSk6cGE9ZnVuY3Rpb24oKXtDZihsYywwKX07dmFyIGNjLF9mO2Z1bmN0aW9uIG1jKGUpeyRpPWUsSGl8fChIaT0hMCxwYSgpKX1mdW5jdGlvbiBoYyhlLHQpe21hPUNmKGZ1bmN0aW9uKCl7ZShUZS51bnN0YWJsZV9ub3coKSl9LHQpfVRlLnVuc3RhYmxlX0lkbGVQcmlvcml0eT01O1RlLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTE7VGUudW5zdGFibGVfTG93UHJpb3JpdHk9NDtUZS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eT0zO1RlLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsO1RlLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5PTI7VGUudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7ZS5jYWxsYmFjaz1udWxsfTtUZS51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe1VyfHxCaXx8KFVyPSEwLG1jKGZjKSl9O1RlLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKGUpezA+ZXx8MTI1PGU/Y29uc29sZS5lcnJvcigiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkIik6T2Y9MDxlP01hdGguZmxvb3IoMWUzL2UpOjV9O1RlLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHV0fTtUZS51bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZT1mdW5jdGlvbigpe3JldHVybiBzbihTbil9O1RlLnVuc3RhYmxlX25leHQ9ZnVuY3Rpb24oZSl7c3dpdGNoKHV0KXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgdD0zO2JyZWFrO2RlZmF1bHQ6dD11dH12YXIgbj11dDt1dD10O3RyeXtyZXR1cm4gZSgpfWZpbmFsbHl7dXQ9bn19O1RlLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7fTtUZS51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9ZnVuY3Rpb24oKXt9O1RlLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihlLHQpe3N3aXRjaChlKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6ZT0zfXZhciBuPXV0O3V0PWU7dHJ5e3JldHVybiB0KCl9ZmluYWxseXt1dD1ufX07VGUudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9VGUudW5zdGFibGVfbm93KCk7c3dpdGNoKHR5cGVvZiBuPT0ib2JqZWN0IiYmbiE9PW51bGw/KG49bi5kZWxheSxuPXR5cGVvZiBuPT0ibnVtYmVyIiYmMDxuP3IrbjpyKTpuPXIsZSl7Y2FzZSAxOnZhciBvPS0xO2JyZWFrO2Nhc2UgMjpvPTI1MDticmVhaztjYXNlIDU6bz0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDpvPTFlNDticmVhaztkZWZhdWx0Om89NWUzfXJldHVybiBvPW4rbyxlPXtpZDpTYisrLGNhbGxiYWNrOnQscHJpb3JpdHlMZXZlbDplLHN0YXJ0VGltZTpuLGV4cGlyYXRpb25UaW1lOm8sc29ydEluZGV4Oi0xfSxuPnI/KGUuc29ydEluZGV4PW4sdWMob3IsZSksc24oU24pPT09bnVsbCYmZT09PXNuKG9yKSYmKGZhPyhBZihtYSksbWE9LTEpOmZhPSEwLGhjKHBjLG4tcikpKTooZS5zb3J0SW5kZXg9byx1YyhTbixlKSxVcnx8Qml8fChVcj0hMCxtYyhmYykpKSxlfTtUZS51bnN0YWJsZV9zaG91bGRZaWVsZD1SZjtUZS51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9dXQ7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dXQ7dXQ9dDt0cnl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dXQ9bn19fX0pO3ZhciBMZj1GcigoZUEsUGYpPT57InVzZSBzdHJpY3QiO1BmLmV4cG9ydHM9TWYoKX0pO3ZhciAkZz1GcihXdD0+eyJ1c2Ugc3RyaWN0Ijt2YXIgRWI9ZGUoKSxVdD1MZigpO2Z1bmN0aW9uIFAoZSl7Zm9yKHZhciB0PSJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK2Usbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdCs9IiZhcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW25dKTtyZXR1cm4iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrZSsiOyB2aXNpdCAiK3QrIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIn12YXIgSG09bmV3IFNldCxMYT17fTtmdW5jdGlvbiBYcihlLHQpe0ZvKGUsdCksRm8oZSsiQ2FwdHVyZSIsdCl9ZnVuY3Rpb24gRm8oZSx0KXtmb3IoTGFbZV09dCxlPTA7ZTx0Lmxlbmd0aDtlKyspSG0uYWRkKHRbZV0pfXZhciBXbj0hKHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PiJ1IiksRmM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxUYj0vXls6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXVs6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXC0uMC05XHUwMEI3XHUwMzAwLVx1MDM2Rlx1MjAzRi1cdTIwNDBdKiQvLHpmPXt9LEZmPXt9O2Z1bmN0aW9uIE5iKGUpe3JldHVybiBGYy5jYWxsKEZmLGUpPyEwOkZjLmNhbGwoemYsZSk/ITE6VGIudGVzdChlKT9GZltlXT0hMDooemZbZV09ITAsITEpfWZ1bmN0aW9uIERiKGUsdCxuLHIpe2lmKG4hPT1udWxsJiZuLnR5cGU9PT0wKXJldHVybiExO3N3aXRjaCh0eXBlb2YgdCl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnJldHVybiEwO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHI/ITE6biE9PW51bGw/IW4uYWNjZXB0c0Jvb2xlYW5zOihlPWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLDUpLGUhPT0iZGF0YS0iJiZlIT09ImFyaWEtIik7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gX2IoZSx0LG4scil7aWYodD09PW51bGx8fHR5cGVvZiB0PiJ1Inx8RGIoZSx0LG4scikpcmV0dXJuITA7aWYocilyZXR1cm4hMTtpZihuIT09bnVsbClzd2l0Y2gobi50eXBlKXtjYXNlIDM6cmV0dXJuIXQ7Y2FzZSA0OnJldHVybiB0PT09ITE7Y2FzZSA1OnJldHVybiBpc05hTih0KTtjYXNlIDY6cmV0dXJuIGlzTmFOKHQpfHwxPnR9cmV0dXJuITF9ZnVuY3Rpb24gd3QoZSx0LG4scixvLGEsaSl7dGhpcy5hY2NlcHRzQm9vbGVhbnM9dD09PTJ8fHQ9PT0zfHx0PT09NCx0aGlzLmF0dHJpYnV0ZU5hbWU9cix0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1vLHRoaXMubXVzdFVzZVByb3BlcnR5PW4sdGhpcy5wcm9wZXJ0eU5hbWU9ZSx0aGlzLnR5cGU9dCx0aGlzLnNhbml0aXplVVJMPWEsdGhpcy5yZW1vdmVFbXB0eVN0cmluZz1pfXZhciBhdD17fTsiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7YXRbZV09bmV3IHd0KGUsMCwhMSxlLG51bGwsITEsITEpfSk7W1siYWNjZXB0Q2hhcnNldCIsImFjY2VwdC1jaGFyc2V0Il0sWyJjbGFzc05hbWUiLCJjbGFzcyJdLFsiaHRtbEZvciIsImZvciJdLFsiaHR0cEVxdWl2IiwiaHR0cC1lcXVpdiJdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF07YXRbdF09bmV3IHd0KHQsMSwhMSxlWzFdLG51bGwsITEsITEpfSk7WyJjb250ZW50RWRpdGFibGUiLCJkcmFnZ2FibGUiLCJzcGVsbENoZWNrIiwidmFsdWUiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2F0W2VdPW5ldyB3dChlLDIsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJhdXRvUmV2ZXJzZSIsImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLCJmb2N1c2FibGUiLCJwcmVzZXJ2ZUFscGhhIl0uZm9yRWFjaChmdW5jdGlvbihlKXthdFtlXT1uZXcgd3QoZSwyLCExLGUsbnVsbCwhMSwhMSl9KTsiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2F0W2VdPW5ldyB3dChlLDMsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJjaGVja2VkIiwibXVsdGlwbGUiLCJtdXRlZCIsInNlbGVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbihlKXthdFtlXT1uZXcgd3QoZSwzLCEwLGUsbnVsbCwhMSwhMSl9KTtbImNhcHR1cmUiLCJkb3dubG9hZCJdLmZvckVhY2goZnVuY3Rpb24oZSl7YXRbZV09bmV3IHd0KGUsNCwhMSxlLG51bGwsITEsITEpfSk7WyJjb2xzIiwicm93cyIsInNpemUiLCJzcGFuIl0uZm9yRWFjaChmdW5jdGlvbihlKXthdFtlXT1uZXcgd3QoZSw2LCExLGUsbnVsbCwhMSwhMSl9KTtbInJvd1NwYW4iLCJzdGFydCJdLmZvckVhY2goZnVuY3Rpb24oZSl7YXRbZV09bmV3IHd0KGUsNSwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTt2YXIgQXU9L1tcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIE91KGUpe3JldHVybiBlWzFdLnRvVXBwZXJDYXNlKCl9ImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKEF1LE91KTthdFt0XT1uZXcgd3QodCwxLCExLGUsbnVsbCwhMSwhMSl9KTsieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKEF1LE91KTthdFt0XT1uZXcgd3QodCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCExLCExKX0pO1sieG1sOmJhc2UiLCJ4bWw6bGFuZyIsInhtbDpzcGFjZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKEF1LE91KTthdFt0XT1uZXcgd3QodCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsITEsITEpfSk7WyJ0YWJJbmRleCIsImNyb3NzT3JpZ2luIl0uZm9yRWFjaChmdW5jdGlvbihlKXthdFtlXT1uZXcgd3QoZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO2F0LnhsaW5rSHJlZj1uZXcgd3QoInhsaW5rSHJlZiIsMSwhMSwieGxpbms6aHJlZiIsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCEwLCExKTtbInNyYyIsImhyZWYiLCJhY3Rpb24iLCJmb3JtQWN0aW9uIl0uZm9yRWFjaChmdW5jdGlvbihlKXthdFtlXT1uZXcgd3QoZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO2Z1bmN0aW9uIEl1KGUsdCxuLHIpe3ZhciBvPWF0Lmhhc093blByb3BlcnR5KHQpP2F0W3RdOm51bGw7KG8hPT1udWxsP28udHlwZSE9PTA6cnx8ISgyPHQubGVuZ3RoKXx8dFswXSE9PSJvIiYmdFswXSE9PSJPInx8dFsxXSE9PSJuIiYmdFsxXSE9PSJOIikmJihfYih0LG4sbyxyKSYmKG49bnVsbCkscnx8bz09PW51bGw/TmIodCkmJihuPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LCIiK24pKTpvLm11c3RVc2VQcm9wZXJ0eT9lW28ucHJvcGVydHlOYW1lXT1uPT09bnVsbD9vLnR5cGU9PT0zPyExOiIiOm46KHQ9by5hdHRyaWJ1dGVOYW1lLHI9by5hdHRyaWJ1dGVOYW1lc3BhY2Usbj09PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KG89by50eXBlLG49bz09PTN8fG89PT00JiZuPT09ITA/IiI6IiIrbixyP2Uuc2V0QXR0cmlidXRlTlMocix0LG4pOmUuc2V0QXR0cmlidXRlKHQsbikpKSl9dmFyIFZuPUViLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELGppPVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxibz1TeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKSxrbz1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLFJ1PVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIiksVWM9U3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSxqbT1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLFZtPVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxNdT1TeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLCRjPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksV2M9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLFB1PVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxpcj1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5Iik7U3ltYm9sLmZvcigicmVhY3Quc2NvcGUiKTtTeW1ib2wuZm9yKCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlIik7dmFyIEdtPVN5bWJvbC5mb3IoInJlYWN0Lm9mZnNjcmVlbiIpO1N5bWJvbC5mb3IoInJlYWN0LmxlZ2FjeV9oaWRkZW4iKTtTeW1ib2wuZm9yKCJyZWFjdC5jYWNoZSIpO1N5bWJvbC5mb3IoInJlYWN0LnRyYWNpbmdfbWFya2VyIik7dmFyIFVmPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBoYShlKXtyZXR1cm4gZT09PW51bGx8fHR5cGVvZiBlIT0ib2JqZWN0Ij9udWxsOihlPVVmJiZlW1VmXXx8ZVsiQEBpdGVyYXRvciJdLHR5cGVvZiBlPT0iZnVuY3Rpb24iP2U6bnVsbCl9dmFyIEZlPU9iamVjdC5hc3NpZ24sZ2M7ZnVuY3Rpb24gU2EoZSl7aWYoZ2M9PT12b2lkIDApdHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2gobil7dmFyIHQ9bi5zdGFjay50cmltKCkubWF0Y2goL1xuKCAqKGF0ICk/KS8pO2djPXQmJnRbMV18fCIifXJldHVybmAKYCtnYytlfXZhciB5Yz0hMTtmdW5jdGlvbiB2YyhlLHQpe2lmKCFlfHx5YylyZXR1cm4iIjt5Yz0hMDt2YXIgbj1FcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT12b2lkIDA7dHJ5e2lmKHQpaWYodD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwicHJvcHMiLHtzZXQ6ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpfX0pLHR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0IiYmUmVmbGVjdC5jb25zdHJ1Y3Qpe3RyeXtSZWZsZWN0LmNvbnN0cnVjdCh0LFtdKX1jYXRjaChjKXt2YXIgcj1jfVJlZmxlY3QuY29uc3RydWN0KGUsW10sdCl9ZWxzZXt0cnl7dC5jYWxsKCl9Y2F0Y2goYyl7cj1jfWUuY2FsbCh0LnByb3RvdHlwZSl9ZWxzZXt0cnl7dGhyb3cgRXJyb3IoKX1jYXRjaChjKXtyPWN9ZSgpfX1jYXRjaChjKXtpZihjJiZyJiZ0eXBlb2YgYy5zdGFjaz09InN0cmluZyIpe2Zvcih2YXIgbz1jLnN0YWNrLnNwbGl0KGAKYCksYT1yLnN0YWNrLnNwbGl0KGAKYCksaT1vLmxlbmd0aC0xLHM9YS5sZW5ndGgtMTsxPD1pJiYwPD1zJiZvW2ldIT09YVtzXTspcy0tO2Zvcig7MTw9aSYmMDw9cztpLS0scy0tKWlmKG9baV0hPT1hW3NdKXtpZihpIT09MXx8cyE9PTEpZG8gaWYoaS0tLHMtLSwwPnN8fG9baV0hPT1hW3NdKXt2YXIgbD1gCmArb1tpXS5yZXBsYWNlKCIgYXQgbmV3ICIsIiBhdCAiKTtyZXR1cm4gZS5kaXNwbGF5TmFtZSYmbC5pbmNsdWRlcygiPGFub255bW91cz4iKSYmKGw9bC5yZXBsYWNlKCI8YW5vbnltb3VzPiIsZS5kaXNwbGF5TmFtZSkpLGx9d2hpbGUoMTw9aSYmMDw9cyk7YnJlYWt9fX1maW5hbGx5e3ljPSExLEVycm9yLnByZXBhcmVTdGFja1RyYWNlPW59cmV0dXJuKGU9ZT9lLmRpc3BsYXlOYW1lfHxlLm5hbWU6IiIpP1NhKGUpOiIifWZ1bmN0aW9uIENiKGUpe3N3aXRjaChlLnRhZyl7Y2FzZSA1OnJldHVybiBTYShlLnR5cGUpO2Nhc2UgMTY6cmV0dXJuIFNhKCJMYXp5Iik7Y2FzZSAxMzpyZXR1cm4gU2EoIlN1c3BlbnNlIik7Y2FzZSAxOTpyZXR1cm4gU2EoIlN1c3BlbnNlTGlzdCIpO2Nhc2UgMDpjYXNlIDI6Y2FzZSAxNTpyZXR1cm4gZT12YyhlLnR5cGUsITEpLGU7Y2FzZSAxMTpyZXR1cm4gZT12YyhlLnR5cGUucmVuZGVyLCExKSxlO2Nhc2UgMTpyZXR1cm4gZT12YyhlLnR5cGUsITApLGU7ZGVmYXVsdDpyZXR1cm4iIn19ZnVuY3Rpb24gQmMoZSl7aWYoZT09bnVsbClyZXR1cm4gbnVsbDtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIilyZXR1cm4gZS5kaXNwbGF5TmFtZXx8ZS5uYW1lfHxudWxsO2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gZTtzd2l0Y2goZSl7Y2FzZSBrbzpyZXR1cm4iRnJhZ21lbnQiO2Nhc2UgYm86cmV0dXJuIlBvcnRhbCI7Y2FzZSBVYzpyZXR1cm4iUHJvZmlsZXIiO2Nhc2UgUnU6cmV0dXJuIlN0cmljdE1vZGUiO2Nhc2UgJGM6cmV0dXJuIlN1c3BlbnNlIjtjYXNlIFdjOnJldHVybiJTdXNwZW5zZUxpc3QifWlmKHR5cGVvZiBlPT0ib2JqZWN0Iilzd2l0Y2goZS4kJHR5cGVvZil7Y2FzZSBWbTpyZXR1cm4oZS5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIGptOnJldHVybihlLl9jb250ZXh0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuUHJvdmlkZXIiO2Nhc2UgTXU6dmFyIHQ9ZS5yZW5kZXI7cmV0dXJuIGU9ZS5kaXNwbGF5TmFtZSxlfHwoZT10LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fCIiLGU9ZSE9PSIiPyJGb3J3YXJkUmVmKCIrZSsiKSI6IkZvcndhcmRSZWYiKSxlO2Nhc2UgUHU6cmV0dXJuIHQ9ZS5kaXNwbGF5TmFtZXx8bnVsbCx0IT09bnVsbD90OkJjKGUudHlwZSl8fCJNZW1vIjtjYXNlIGlyOnQ9ZS5fcGF5bG9hZCxlPWUuX2luaXQ7dHJ5e3JldHVybiBCYyhlKHQpKX1jYXRjaHt9fXJldHVybiBudWxsfWZ1bmN0aW9uIEFiKGUpe3ZhciB0PWUudHlwZTtzd2l0Y2goZS50YWcpe2Nhc2UgMjQ6cmV0dXJuIkNhY2hlIjtjYXNlIDk6cmV0dXJuKHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Db25zdW1lciI7Y2FzZSAxMDpyZXR1cm4odC5fY29udGV4dC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLlByb3ZpZGVyIjtjYXNlIDE4OnJldHVybiJEZWh5ZHJhdGVkRnJhZ21lbnQiO2Nhc2UgMTE6cmV0dXJuIGU9dC5yZW5kZXIsZT1lLmRpc3BsYXlOYW1lfHxlLm5hbWV8fCIiLHQuZGlzcGxheU5hbWV8fChlIT09IiI/IkZvcndhcmRSZWYoIitlKyIpIjoiRm9yd2FyZFJlZiIpO2Nhc2UgNzpyZXR1cm4iRnJhZ21lbnQiO2Nhc2UgNTpyZXR1cm4gdDtjYXNlIDQ6cmV0dXJuIlBvcnRhbCI7Y2FzZSAzOnJldHVybiJSb290IjtjYXNlIDY6cmV0dXJuIlRleHQiO2Nhc2UgMTY6cmV0dXJuIEJjKHQpO2Nhc2UgODpyZXR1cm4gdD09PVJ1PyJTdHJpY3RNb2RlIjoiTW9kZSI7Y2FzZSAyMjpyZXR1cm4iT2Zmc2NyZWVuIjtjYXNlIDEyOnJldHVybiJQcm9maWxlciI7Y2FzZSAyMTpyZXR1cm4iU2NvcGUiO2Nhc2UgMTM6cmV0dXJuIlN1c3BlbnNlIjtjYXNlIDE5OnJldHVybiJTdXNwZW5zZUxpc3QiO2Nhc2UgMjU6cmV0dXJuIlRyYWNpbmdNYXJrZXIiO2Nhc2UgMTpjYXNlIDA6Y2FzZSAxNzpjYXNlIDI6Y2FzZSAxNDpjYXNlIDE1OmlmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiB0LmRpc3BsYXlOYW1lfHx0Lm5hbWV8fG51bGw7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0fXJldHVybiBudWxsfWZ1bmN0aW9uIGJyKGUpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJib29sZWFuIjpjYXNlIm51bWJlciI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpyZXR1cm4gZTtjYXNlIm9iamVjdCI6cmV0dXJuIGU7ZGVmYXVsdDpyZXR1cm4iIn19ZnVuY3Rpb24gS20oZSl7dmFyIHQ9ZS50eXBlO3JldHVybihlPWUubm9kZU5hbWUpJiZlLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYodD09PSJjaGVja2JveCJ8fHQ9PT0icmFkaW8iKX1mdW5jdGlvbiBPYihlKXt2YXIgdD1LbShlKT8iY2hlY2tlZCI6InZhbHVlIixuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsdCkscj0iIitlW3RdO2lmKCFlLmhhc093blByb3BlcnR5KHQpJiZ0eXBlb2YgbjwidSImJnR5cGVvZiBuLmdldD09ImZ1bmN0aW9uIiYmdHlwZW9mIG4uc2V0PT0iZnVuY3Rpb24iKXt2YXIgbz1uLmdldCxhPW4uc2V0O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGkpe3I9IiIraSxhLmNhbGwodGhpcyxpKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOm4uZW51bWVyYWJsZX0pLHtnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiByfSxzZXRWYWx1ZTpmdW5jdGlvbihpKXtyPSIiK2l9LHN0b3BUcmFja2luZzpmdW5jdGlvbigpe2UuX3ZhbHVlVHJhY2tlcj1udWxsLGRlbGV0ZSBlW3RdfX19fWZ1bmN0aW9uIFZpKGUpe2UuX3ZhbHVlVHJhY2tlcnx8KGUuX3ZhbHVlVHJhY2tlcj1PYihlKSl9ZnVuY3Rpb24gWW0oZSl7aWYoIWUpcmV0dXJuITE7dmFyIHQ9ZS5fdmFsdWVUcmFja2VyO2lmKCF0KXJldHVybiEwO3ZhciBuPXQuZ2V0VmFsdWUoKSxyPSIiO3JldHVybiBlJiYocj1LbShlKT9lLmNoZWNrZWQ/InRydWUiOiJmYWxzZSI6ZS52YWx1ZSksZT1yLGUhPT1uPyh0LnNldFZhbHVlKGUpLCEwKTohMX1mdW5jdGlvbiB3cyhlKXtpZihlPWV8fCh0eXBlb2YgZG9jdW1lbnQ8InUiP2RvY3VtZW50OnZvaWQgMCksdHlwZW9mIGU+InUiKXJldHVybiBudWxsO3RyeXtyZXR1cm4gZS5hY3RpdmVFbGVtZW50fHxlLmJvZHl9Y2F0Y2h7cmV0dXJuIGUuYm9keX19ZnVuY3Rpb24gSGMoZSx0KXt2YXIgbj10LmNoZWNrZWQ7cmV0dXJuIEZlKHt9LHQse2RlZmF1bHRDaGVja2VkOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLHZhbHVlOnZvaWQgMCxjaGVja2VkOm4/P2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZH0pfWZ1bmN0aW9uICRmKGUsdCl7dmFyIG49dC5kZWZhdWx0VmFsdWU9PW51bGw/IiI6dC5kZWZhdWx0VmFsdWUscj10LmNoZWNrZWQhPW51bGw/dC5jaGVja2VkOnQuZGVmYXVsdENoZWNrZWQ7bj1icih0LnZhbHVlIT1udWxsP3QudmFsdWU6biksZS5fd3JhcHBlclN0YXRlPXtpbml0aWFsQ2hlY2tlZDpyLGluaXRpYWxWYWx1ZTpuLGNvbnRyb2xsZWQ6dC50eXBlPT09ImNoZWNrYm94Inx8dC50eXBlPT09InJhZGlvIj90LmNoZWNrZWQhPW51bGw6dC52YWx1ZSE9bnVsbH19ZnVuY3Rpb24gcW0oZSx0KXt0PXQuY2hlY2tlZCx0IT1udWxsJiZJdShlLCJjaGVja2VkIix0LCExKX1mdW5jdGlvbiBqYyhlLHQpe3FtKGUsdCk7dmFyIG49YnIodC52YWx1ZSkscj10LnR5cGU7aWYobiE9bnVsbClyPT09Im51bWJlciI/KG49PT0wJiZlLnZhbHVlPT09IiJ8fGUudmFsdWUhPW4pJiYoZS52YWx1ZT0iIituKTplLnZhbHVlIT09IiIrbiYmKGUudmFsdWU9IiIrbik7ZWxzZSBpZihyPT09InN1Ym1pdCJ8fHI9PT0icmVzZXQiKXtlLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKTtyZXR1cm59dC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKT9WYyhlLHQudHlwZSxuKTp0Lmhhc093blByb3BlcnR5KCJkZWZhdWx0VmFsdWUiKSYmVmMoZSx0LnR5cGUsYnIodC5kZWZhdWx0VmFsdWUpKSx0LmNoZWNrZWQ9PW51bGwmJnQuZGVmYXVsdENoZWNrZWQhPW51bGwmJihlLmRlZmF1bHRDaGVja2VkPSEhdC5kZWZhdWx0Q2hlY2tlZCl9ZnVuY3Rpb24gV2YoZSx0LG4pe2lmKHQuaGFzT3duUHJvcGVydHkoInZhbHVlIil8fHQuaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpKXt2YXIgcj10LnR5cGU7aWYoIShyIT09InN1Ym1pdCImJnIhPT0icmVzZXQifHx0LnZhbHVlIT09dm9pZCAwJiZ0LnZhbHVlIT09bnVsbCkpcmV0dXJuO3Q9IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSxufHx0PT09ZS52YWx1ZXx8KGUudmFsdWU9dCksZS5kZWZhdWx0VmFsdWU9dH1uPWUubmFtZSxuIT09IiImJihlLm5hbWU9IiIpLGUuZGVmYXVsdENoZWNrZWQ9ISFlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQsbiE9PSIiJiYoZS5uYW1lPW4pfWZ1bmN0aW9uIFZjKGUsdCxuKXsodCE9PSJudW1iZXIifHx3cyhlLm93bmVyRG9jdW1lbnQpIT09ZSkmJihuPT1udWxsP2UuZGVmYXVsdFZhbHVlPSIiK2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU6ZS5kZWZhdWx0VmFsdWUhPT0iIituJiYoZS5kZWZhdWx0VmFsdWU9IiIrbikpfXZhciBFYT1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIElvKGUsdCxuLHIpe2lmKGU9ZS5vcHRpb25zLHQpe3Q9e307Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspdFsiJCIrbltvXV09ITA7Zm9yKG49MDtuPGUubGVuZ3RoO24rKylvPXQuaGFzT3duUHJvcGVydHkoIiQiK2Vbbl0udmFsdWUpLGVbbl0uc2VsZWN0ZWQhPT1vJiYoZVtuXS5zZWxlY3RlZD1vKSxvJiZyJiYoZVtuXS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Zm9yKG49IiIrYnIobiksdD1udWxsLG89MDtvPGUubGVuZ3RoO28rKyl7aWYoZVtvXS52YWx1ZT09PW4pe2Vbb10uc2VsZWN0ZWQ9ITAsciYmKGVbb10uZGVmYXVsdFNlbGVjdGVkPSEwKTtyZXR1cm59dCE9PW51bGx8fGVbb10uZGlzYWJsZWR8fCh0PWVbb10pfXQhPT1udWxsJiYodC5zZWxlY3RlZD0hMCl9fWZ1bmN0aW9uIEdjKGUsdCl7aWYodC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCl0aHJvdyBFcnJvcihQKDkxKSk7cmV0dXJuIEZlKHt9LHQse3ZhbHVlOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOiIiK2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWV9KX1mdW5jdGlvbiBCZihlLHQpe3ZhciBuPXQudmFsdWU7aWYobj09bnVsbCl7aWYobj10LmNoaWxkcmVuLHQ9dC5kZWZhdWx0VmFsdWUsbiE9bnVsbCl7aWYodCE9bnVsbCl0aHJvdyBFcnJvcihQKDkyKSk7aWYoRWEobikpe2lmKDE8bi5sZW5ndGgpdGhyb3cgRXJyb3IoUCg5MykpO249blswXX10PW59dD09bnVsbCYmKHQ9IiIpLG49dH1lLl93cmFwcGVyU3RhdGU9e2luaXRpYWxWYWx1ZTpicihuKX19ZnVuY3Rpb24gUW0oZSx0KXt2YXIgbj1icih0LnZhbHVlKSxyPWJyKHQuZGVmYXVsdFZhbHVlKTtuIT1udWxsJiYobj0iIituLG4hPT1lLnZhbHVlJiYoZS52YWx1ZT1uKSx0LmRlZmF1bHRWYWx1ZT09bnVsbCYmZS5kZWZhdWx0VmFsdWUhPT1uJiYoZS5kZWZhdWx0VmFsdWU9bikpLHIhPW51bGwmJihlLmRlZmF1bHRWYWx1ZT0iIityKX1mdW5jdGlvbiBIZihlKXt2YXIgdD1lLnRleHRDb250ZW50O3Q9PT1lLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlJiZ0IT09IiImJnQhPT1udWxsJiYoZS52YWx1ZT10KX1mdW5jdGlvbiBKbShlKXtzd2l0Y2goZSl7Y2FzZSJzdmciOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7Y2FzZSJtYXRoIjpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI7ZGVmYXVsdDpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCJ9fWZ1bmN0aW9uIEtjKGUsdCl7cmV0dXJuIGU9PW51bGx8fGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI/Sm0odCk6ZT09PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyImJnQ9PT0iZm9yZWlnbk9iamVjdCI/Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOmV9dmFyIEdpLFhtPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgTVNBcHA8InUiJiZNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbj9mdW5jdGlvbih0LG4scixvKXtNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbigpe3JldHVybiBlKHQsbixyLG8pfSl9OmV9KGZ1bmN0aW9uKGUsdCl7aWYoZS5uYW1lc3BhY2VVUkkhPT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifHwiaW5uZXJIVE1MImluIGUpZS5pbm5lckhUTUw9dDtlbHNle2ZvcihHaT1HaXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksR2kuaW5uZXJIVE1MPSI8c3ZnPiIrdC52YWx1ZU9mKCkudG9TdHJpbmcoKSsiPC9zdmc+Iix0PUdpLmZpcnN0Q2hpbGQ7ZS5maXJzdENoaWxkOyllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7Zm9yKDt0LmZpcnN0Q2hpbGQ7KWUuYXBwZW5kQ2hpbGQodC5maXJzdENoaWxkKX19KTtmdW5jdGlvbiB6YShlLHQpe2lmKHQpe3ZhciBuPWUuZmlyc3RDaGlsZDtpZihuJiZuPT09ZS5sYXN0Q2hpbGQmJm4ubm9kZVR5cGU9PT0zKXtuLm5vZGVWYWx1ZT10O3JldHVybn19ZS50ZXh0Q29udGVudD10fXZhciBEYT17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYXNwZWN0UmF0aW86ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxjb2x1bW5zOiEwLGZsZXg6ITAsZmxleEdyb3c6ITAsZmxleFBvc2l0aXZlOiEwLGZsZXhTaHJpbms6ITAsZmxleE5lZ2F0aXZlOiEwLGZsZXhPcmRlcjohMCxncmlkQXJlYTohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1NwYW46ITAsZ3JpZFJvd1N0YXJ0OiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3BhbjohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZm9udFdlaWdodDohMCxsaW5lQ2xhbXA6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsdGFiU2l6ZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITAsZmlsbE9wYWNpdHk6ITAsZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZURhc2hhcnJheTohMCxzdHJva2VEYXNob2Zmc2V0OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMCxzdHJva2VXaWR0aDohMH0sSWI9WyJXZWJraXQiLCJtcyIsIk1veiIsIk8iXTtPYmplY3Qua2V5cyhEYSkuZm9yRWFjaChmdW5jdGlvbihlKXtJYi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9dCtlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc3Vic3RyaW5nKDEpLERhW3RdPURhW2VdfSl9KTtmdW5jdGlvbiBabShlLHQsbil7cmV0dXJuIHQ9PW51bGx8fHR5cGVvZiB0PT0iYm9vbGVhbiJ8fHQ9PT0iIj8iIjpufHx0eXBlb2YgdCE9Im51bWJlciJ8fHQ9PT0wfHxEYS5oYXNPd25Qcm9wZXJ0eShlKSYmRGFbZV0/KCIiK3QpLnRyaW0oKTp0KyJweCJ9ZnVuY3Rpb24gZWgoZSx0KXtlPWUuc3R5bGU7Zm9yKHZhciBuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIHI9bi5pbmRleE9mKCItLSIpPT09MCxvPVptKG4sdFtuXSxyKTtuPT09ImZsb2F0IiYmKG49ImNzc0Zsb2F0Iikscj9lLnNldFByb3BlcnR5KG4sbyk6ZVtuXT1vfX12YXIgUmI9RmUoe21lbnVpdGVtOiEwfSx7YXJlYTohMCxiYXNlOiEwLGJyOiEwLGNvbDohMCxlbWJlZDohMCxocjohMCxpbWc6ITAsaW5wdXQ6ITAsa2V5Z2VuOiEwLGxpbms6ITAsbWV0YTohMCxwYXJhbTohMCxzb3VyY2U6ITAsdHJhY2s6ITAsd2JyOiEwfSk7ZnVuY3Rpb24gWWMoZSx0KXtpZih0KXtpZihSYltlXSYmKHQuY2hpbGRyZW4hPW51bGx8fHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpKXRocm93IEVycm9yKFAoMTM3LGUpKTtpZih0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKXtpZih0LmNoaWxkcmVuIT1udWxsKXRocm93IEVycm9yKFAoNjApKTtpZih0eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9Im9iamVjdCJ8fCEoIl9faHRtbCJpbiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSl0aHJvdyBFcnJvcihQKDYxKSl9aWYodC5zdHlsZSE9bnVsbCYmdHlwZW9mIHQuc3R5bGUhPSJvYmplY3QiKXRocm93IEVycm9yKFAoNjIpKX19ZnVuY3Rpb24gcWMoZSx0KXtpZihlLmluZGV4T2YoIi0iKT09PS0xKXJldHVybiB0eXBlb2YgdC5pcz09InN0cmluZyI7c3dpdGNoKGUpe2Nhc2UiYW5ub3RhdGlvbi14bWwiOmNhc2UiY29sb3ItcHJvZmlsZSI6Y2FzZSJmb250LWZhY2UiOmNhc2UiZm9udC1mYWNlLXNyYyI6Y2FzZSJmb250LWZhY2UtdXJpIjpjYXNlImZvbnQtZmFjZS1mb3JtYXQiOmNhc2UiZm9udC1mYWNlLW5hbWUiOmNhc2UibWlzc2luZy1nbHlwaCI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hMH19dmFyIFFjPW51bGw7ZnVuY3Rpb24gTHUoZSl7cmV0dXJuIGU9ZS50YXJnZXR8fGUuc3JjRWxlbWVudHx8d2luZG93LGUuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJihlPWUuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpLGUubm9kZVR5cGU9PT0zP2UucGFyZW50Tm9kZTplfXZhciBKYz1udWxsLFJvPW51bGwsTW89bnVsbDtmdW5jdGlvbiBqZihlKXtpZihlPXRpKGUpKXtpZih0eXBlb2YgSmMhPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoUCgyODApKTt2YXIgdD1lLnN0YXRlTm9kZTt0JiYodD1Lcyh0KSxKYyhlLnN0YXRlTm9kZSxlLnR5cGUsdCkpfX1mdW5jdGlvbiB0aChlKXtSbz9Nbz9Nby5wdXNoKGUpOk1vPVtlXTpSbz1lfWZ1bmN0aW9uIG5oKCl7aWYoUm8pe3ZhciBlPVJvLHQ9TW87aWYoTW89Um89bnVsbCxqZihlKSx0KWZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspamYodFtlXSl9fWZ1bmN0aW9uIHJoKGUsdCl7cmV0dXJuIGUodCl9ZnVuY3Rpb24gb2goKXt9dmFyIHdjPSExO2Z1bmN0aW9uIGFoKGUsdCxuKXtpZih3YylyZXR1cm4gZSh0LG4pO3djPSEwO3RyeXtyZXR1cm4gcmgoZSx0LG4pfWZpbmFsbHl7d2M9ITEsKFJvIT09bnVsbHx8TW8hPT1udWxsKSYmKG9oKCksbmgoKSl9fWZ1bmN0aW9uIEZhKGUsdCl7dmFyIG49ZS5zdGF0ZU5vZGU7aWYobj09PW51bGwpcmV0dXJuIG51bGw7dmFyIHI9S3Mobik7aWYocj09PW51bGwpcmV0dXJuIG51bGw7bj1yW3RdO2U6c3dpdGNoKHQpe2Nhc2Uib25DbGljayI6Y2FzZSJvbkNsaWNrQ2FwdHVyZSI6Y2FzZSJvbkRvdWJsZUNsaWNrIjpjYXNlIm9uRG91YmxlQ2xpY2tDYXB0dXJlIjpjYXNlIm9uTW91c2VEb3duIjpjYXNlIm9uTW91c2VEb3duQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlTW92ZSI6Y2FzZSJvbk1vdXNlTW92ZUNhcHR1cmUiOmNhc2Uib25Nb3VzZVVwIjpjYXNlIm9uTW91c2VVcENhcHR1cmUiOmNhc2Uib25Nb3VzZUVudGVyIjoocj0hci5kaXNhYmxlZCl8fChlPWUudHlwZSxyPSEoZT09PSJidXR0b24ifHxlPT09ImlucHV0Inx8ZT09PSJzZWxlY3QifHxlPT09InRleHRhcmVhIikpLGU9IXI7YnJlYWsgZTtkZWZhdWx0OmU9ITF9aWYoZSlyZXR1cm4gbnVsbDtpZihuJiZ0eXBlb2YgbiE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihQKDIzMSx0LHR5cGVvZiBuKSk7cmV0dXJuIG59dmFyIFhjPSExO2lmKFduKXRyeXt2bz17fSxPYmplY3QuZGVmaW5lUHJvcGVydHkodm8sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtYYz0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsdm8sdm8pLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0Iix2byx2byl9Y2F0Y2h7WGM9ITF9dmFyIHZvO2Z1bmN0aW9uIE1iKGUsdCxuLHIsbyxhLGkscyxsKXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMyk7dHJ5e3QuYXBwbHkobixjKX1jYXRjaChkKXt0aGlzLm9uRXJyb3IoZCl9fXZhciBfYT0hMSxicz1udWxsLGtzPSExLFpjPW51bGwsUGI9e29uRXJyb3I6ZnVuY3Rpb24oZSl7X2E9ITAsYnM9ZX19O2Z1bmN0aW9uIExiKGUsdCxuLHIsbyxhLGkscyxsKXtfYT0hMSxicz1udWxsLE1iLmFwcGx5KFBiLGFyZ3VtZW50cyl9ZnVuY3Rpb24gemIoZSx0LG4scixvLGEsaSxzLGwpe2lmKExiLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxfYSl7aWYoX2Epe3ZhciBjPWJzO19hPSExLGJzPW51bGx9ZWxzZSB0aHJvdyBFcnJvcihQKDE5OCkpO2tzfHwoa3M9ITAsWmM9Yyl9fWZ1bmN0aW9uIFpyKGUpe3ZhciB0PWUsbj1lO2lmKGUuYWx0ZXJuYXRlKWZvcig7dC5yZXR1cm47KXQ9dC5yZXR1cm47ZWxzZXtlPXQ7ZG8gdD1lLHQuZmxhZ3MmNDA5OCYmKG49dC5yZXR1cm4pLGU9dC5yZXR1cm47d2hpbGUoZSl9cmV0dXJuIHQudGFnPT09Mz9uOm51bGx9ZnVuY3Rpb24gaWgoZSl7aWYoZS50YWc9PT0xMyl7dmFyIHQ9ZS5tZW1vaXplZFN0YXRlO2lmKHQ9PT1udWxsJiYoZT1lLmFsdGVybmF0ZSxlIT09bnVsbCYmKHQ9ZS5tZW1vaXplZFN0YXRlKSksdCE9PW51bGwpcmV0dXJuIHQuZGVoeWRyYXRlZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBWZihlKXtpZihacihlKSE9PWUpdGhyb3cgRXJyb3IoUCgxODgpKX1mdW5jdGlvbiBGYihlKXt2YXIgdD1lLmFsdGVybmF0ZTtpZighdCl7aWYodD1acihlKSx0PT09bnVsbCl0aHJvdyBFcnJvcihQKDE4OCkpO3JldHVybiB0IT09ZT9udWxsOmV9Zm9yKHZhciBuPWUscj10Ozspe3ZhciBvPW4ucmV0dXJuO2lmKG89PT1udWxsKWJyZWFrO3ZhciBhPW8uYWx0ZXJuYXRlO2lmKGE9PT1udWxsKXtpZihyPW8ucmV0dXJuLHIhPT1udWxsKXtuPXI7Y29udGludWV9YnJlYWt9aWYoby5jaGlsZD09PWEuY2hpbGQpe2ZvcihhPW8uY2hpbGQ7YTspe2lmKGE9PT1uKXJldHVybiBWZihvKSxlO2lmKGE9PT1yKXJldHVybiBWZihvKSx0O2E9YS5zaWJsaW5nfXRocm93IEVycm9yKFAoMTg4KSl9aWYobi5yZXR1cm4hPT1yLnJldHVybiluPW8scj1hO2Vsc2V7Zm9yKHZhciBpPSExLHM9by5jaGlsZDtzOyl7aWYocz09PW4pe2k9ITAsbj1vLHI9YTticmVha31pZihzPT09cil7aT0hMCxyPW8sbj1hO2JyZWFrfXM9cy5zaWJsaW5nfWlmKCFpKXtmb3Iocz1hLmNoaWxkO3M7KXtpZihzPT09bil7aT0hMCxuPWEscj1vO2JyZWFrfWlmKHM9PT1yKXtpPSEwLHI9YSxuPW87YnJlYWt9cz1zLnNpYmxpbmd9aWYoIWkpdGhyb3cgRXJyb3IoUCgxODkpKX19aWYobi5hbHRlcm5hdGUhPT1yKXRocm93IEVycm9yKFAoMTkwKSl9aWYobi50YWchPT0zKXRocm93IEVycm9yKFAoMTg4KSk7cmV0dXJuIG4uc3RhdGVOb2RlLmN1cnJlbnQ9PT1uP2U6dH1mdW5jdGlvbiBzaChlKXtyZXR1cm4gZT1GYihlKSxlIT09bnVsbD9saChlKTpudWxsfWZ1bmN0aW9uIGxoKGUpe2lmKGUudGFnPT09NXx8ZS50YWc9PT02KXJldHVybiBlO2ZvcihlPWUuY2hpbGQ7ZSE9PW51bGw7KXt2YXIgdD1saChlKTtpZih0IT09bnVsbClyZXR1cm4gdDtlPWUuc2libGluZ31yZXR1cm4gbnVsbH12YXIgY2g9VXQudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayxHZj1VdC51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxVYj1VdC51bnN0YWJsZV9zaG91bGRZaWVsZCwkYj1VdC51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsSGU9VXQudW5zdGFibGVfbm93LFdiPVV0LnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsLHp1PVV0LnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LHVoPVV0LnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LHhzPVV0LnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LEJiPVV0LnVuc3RhYmxlX0xvd1ByaW9yaXR5LGRoPVV0LnVuc3RhYmxlX0lkbGVQcmlvcml0eSxIcz1udWxsLERuPW51bGw7ZnVuY3Rpb24gSGIoZSl7aWYoRG4mJnR5cGVvZiBEbi5vbkNvbW1pdEZpYmVyUm9vdD09ImZ1bmN0aW9uIil0cnl7RG4ub25Db21taXRGaWJlclJvb3QoSHMsZSx2b2lkIDAsKGUuY3VycmVudC5mbGFncyYxMjgpPT09MTI4KX1jYXRjaHt9fXZhciBwbj1NYXRoLmNsejMyP01hdGguY2x6MzI6R2IsamI9TWF0aC5sb2csVmI9TWF0aC5MTjI7ZnVuY3Rpb24gR2IoZSl7cmV0dXJuIGU+Pj49MCxlPT09MD8zMjozMS0oamIoZSkvVmJ8MCl8MH12YXIgS2k9NjQsWWk9NDE5NDMwNDtmdW5jdGlvbiBUYShlKXtzd2l0Y2goZSYtZSl7Y2FzZSAxOnJldHVybiAxO2Nhc2UgMjpyZXR1cm4gMjtjYXNlIDQ6cmV0dXJuIDQ7Y2FzZSA4OnJldHVybiA4O2Nhc2UgMTY6cmV0dXJuIDE2O2Nhc2UgMzI6cmV0dXJuIDMyO2Nhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6cmV0dXJuIGUmNDE5NDI0MDtjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybiBlJjEzMDAyMzQyNDtjYXNlIDEzNDIxNzcyODpyZXR1cm4gMTM0MjE3NzI4O2Nhc2UgMjY4NDM1NDU2OnJldHVybiAyNjg0MzU0NTY7Y2FzZSA1MzY4NzA5MTI6cmV0dXJuIDUzNjg3MDkxMjtjYXNlIDEwNzM3NDE4MjQ6cmV0dXJuIDEwNzM3NDE4MjQ7ZGVmYXVsdDpyZXR1cm4gZX19ZnVuY3Rpb24gU3MoZSx0KXt2YXIgbj1lLnBlbmRpbmdMYW5lcztpZihuPT09MClyZXR1cm4gMDt2YXIgcj0wLG89ZS5zdXNwZW5kZWRMYW5lcyxhPWUucGluZ2VkTGFuZXMsaT1uJjI2ODQzNTQ1NTtpZihpIT09MCl7dmFyIHM9aSZ+bztzIT09MD9yPVRhKHMpOihhJj1pLGEhPT0wJiYocj1UYShhKSkpfWVsc2UgaT1uJn5vLGkhPT0wP3I9VGEoaSk6YSE9PTAmJihyPVRhKGEpKTtpZihyPT09MClyZXR1cm4gMDtpZih0IT09MCYmdCE9PXImJiEodCZvKSYmKG89ciYtcixhPXQmLXQsbz49YXx8bz09PTE2JiYoYSY0MTk0MjQwKSE9PTApKXJldHVybiB0O2lmKHImNCYmKHJ8PW4mMTYpLHQ9ZS5lbnRhbmdsZWRMYW5lcyx0IT09MClmb3IoZT1lLmVudGFuZ2xlbWVudHMsdCY9cjswPHQ7KW49MzEtcG4odCksbz0xPDxuLHJ8PWVbbl0sdCY9fm87cmV0dXJuIHJ9ZnVuY3Rpb24gS2IoZSx0KXtzd2l0Y2goZSl7Y2FzZSAxOmNhc2UgMjpjYXNlIDQ6cmV0dXJuIHQrMjUwO2Nhc2UgODpjYXNlIDE2OmNhc2UgMzI6Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gdCs1ZTM7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4tMTtjYXNlIDEzNDIxNzcyODpjYXNlIDI2ODQzNTQ1NjpjYXNlIDUzNjg3MDkxMjpjYXNlIDEwNzM3NDE4MjQ6cmV0dXJuLTE7ZGVmYXVsdDpyZXR1cm4tMX19ZnVuY3Rpb24gWWIoZSx0KXtmb3IodmFyIG49ZS5zdXNwZW5kZWRMYW5lcyxyPWUucGluZ2VkTGFuZXMsbz1lLmV4cGlyYXRpb25UaW1lcyxhPWUucGVuZGluZ0xhbmVzOzA8YTspe3ZhciBpPTMxLXBuKGEpLHM9MTw8aSxsPW9baV07bD09PS0xPyghKHMmbil8fHMmcikmJihvW2ldPUtiKHMsdCkpOmw8PXQmJihlLmV4cGlyZWRMYW5lc3w9cyksYSY9fnN9fWZ1bmN0aW9uIGV1KGUpe3JldHVybiBlPWUucGVuZGluZ0xhbmVzJi0xMDczNzQxODI1LGUhPT0wP2U6ZSYxMDczNzQxODI0PzEwNzM3NDE4MjQ6MH1mdW5jdGlvbiBwaCgpe3ZhciBlPUtpO3JldHVybiBLaTw8PTEsIShLaSY0MTk0MjQwKSYmKEtpPTY0KSxlfWZ1bmN0aW9uIGJjKGUpe2Zvcih2YXIgdD1bXSxuPTA7MzE+bjtuKyspdC5wdXNoKGUpO3JldHVybiB0fWZ1bmN0aW9uIFphKGUsdCxuKXtlLnBlbmRpbmdMYW5lc3w9dCx0IT09NTM2ODcwOTEyJiYoZS5zdXNwZW5kZWRMYW5lcz0wLGUucGluZ2VkTGFuZXM9MCksZT1lLmV2ZW50VGltZXMsdD0zMS1wbih0KSxlW3RdPW59ZnVuY3Rpb24gcWIoZSx0KXt2YXIgbj1lLnBlbmRpbmdMYW5lcyZ+dDtlLnBlbmRpbmdMYW5lcz10LGUuc3VzcGVuZGVkTGFuZXM9MCxlLnBpbmdlZExhbmVzPTAsZS5leHBpcmVkTGFuZXMmPXQsZS5tdXRhYmxlUmVhZExhbmVzJj10LGUuZW50YW5nbGVkTGFuZXMmPXQsdD1lLmVudGFuZ2xlbWVudHM7dmFyIHI9ZS5ldmVudFRpbWVzO2ZvcihlPWUuZXhwaXJhdGlvblRpbWVzOzA8bjspe3ZhciBvPTMxLXBuKG4pLGE9MTw8bzt0W29dPTAscltvXT0tMSxlW29dPS0xLG4mPX5hfX1mdW5jdGlvbiBGdShlLHQpe3ZhciBuPWUuZW50YW5nbGVkTGFuZXN8PXQ7Zm9yKGU9ZS5lbnRhbmdsZW1lbnRzO247KXt2YXIgcj0zMS1wbihuKSxvPTE8PHI7byZ0fGVbcl0mdCYmKGVbcl18PXQpLG4mPX5vfX12YXIgeGU9MDtmdW5jdGlvbiBmaChlKXtyZXR1cm4gZSY9LWUsMTxlPzQ8ZT9lJjI2ODQzNTQ1NT8xNjo1MzY4NzA5MTI6NDoxfXZhciBtaCxVdSxoaCxnaCx5aCx0dT0hMSxxaT1bXSxwcj1udWxsLGZyPW51bGwsbXI9bnVsbCxVYT1uZXcgTWFwLCRhPW5ldyBNYXAsbHI9W10sUWI9Im1vdXNlZG93biBtb3VzZXVwIHRvdWNoY2FuY2VsIHRvdWNoZW5kIHRvdWNoc3RhcnQgYXV4Y2xpY2sgZGJsY2xpY2sgcG9pbnRlcmNhbmNlbCBwb2ludGVyZG93biBwb2ludGVydXAgZHJhZ2VuZCBkcmFnc3RhcnQgZHJvcCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgaW5wdXQgdGV4dElucHV0IGNvcHkgY3V0IHBhc3RlIGNsaWNrIGNoYW5nZSBjb250ZXh0bWVudSByZXNldCBzdWJtaXQiLnNwbGl0KCIgIik7ZnVuY3Rpb24gS2YoZSx0KXtzd2l0Y2goZSl7Y2FzZSJmb2N1c2luIjpjYXNlImZvY3Vzb3V0Ijpwcj1udWxsO2JyZWFrO2Nhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdsZWF2ZSI6ZnI9bnVsbDticmVhaztjYXNlIm1vdXNlb3ZlciI6Y2FzZSJtb3VzZW91dCI6bXI9bnVsbDticmVhaztjYXNlInBvaW50ZXJvdmVyIjpjYXNlInBvaW50ZXJvdXQiOlVhLmRlbGV0ZSh0LnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJsb3N0cG9pbnRlcmNhcHR1cmUiOiRhLmRlbGV0ZSh0LnBvaW50ZXJJZCl9fWZ1bmN0aW9uIGdhKGUsdCxuLHIsbyxhKXtyZXR1cm4gZT09PW51bGx8fGUubmF0aXZlRXZlbnQhPT1hPyhlPXtibG9ja2VkT246dCxkb21FdmVudE5hbWU6bixldmVudFN5c3RlbUZsYWdzOnIsbmF0aXZlRXZlbnQ6YSx0YXJnZXRDb250YWluZXJzOltvXX0sdCE9PW51bGwmJih0PXRpKHQpLHQhPT1udWxsJiZVdSh0KSksZSk6KGUuZXZlbnRTeXN0ZW1GbGFnc3w9cix0PWUudGFyZ2V0Q29udGFpbmVycyxvIT09bnVsbCYmdC5pbmRleE9mKG8pPT09LTEmJnQucHVzaChvKSxlKX1mdW5jdGlvbiBKYihlLHQsbixyLG8pe3N3aXRjaCh0KXtjYXNlImZvY3VzaW4iOnJldHVybiBwcj1nYShwcixlLHQsbixyLG8pLCEwO2Nhc2UiZHJhZ2VudGVyIjpyZXR1cm4gZnI9Z2EoZnIsZSx0LG4scixvKSwhMDtjYXNlIm1vdXNlb3ZlciI6cmV0dXJuIG1yPWdhKG1yLGUsdCxuLHIsbyksITA7Y2FzZSJwb2ludGVyb3ZlciI6dmFyIGE9by5wb2ludGVySWQ7cmV0dXJuIFVhLnNldChhLGdhKFVhLmdldChhKXx8bnVsbCxlLHQsbixyLG8pKSwhMDtjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpyZXR1cm4gYT1vLnBvaW50ZXJJZCwkYS5zZXQoYSxnYSgkYS5nZXQoYSl8fG51bGwsZSx0LG4scixvKSksITB9cmV0dXJuITF9ZnVuY3Rpb24gdmgoZSl7dmFyIHQ9QnIoZS50YXJnZXQpO2lmKHQhPT1udWxsKXt2YXIgbj1acih0KTtpZihuIT09bnVsbCl7aWYodD1uLnRhZyx0PT09MTMpe2lmKHQ9aWgobiksdCE9PW51bGwpe2UuYmxvY2tlZE9uPXQseWgoZS5wcmlvcml0eSxmdW5jdGlvbigpe2hoKG4pfSk7cmV0dXJufX1lbHNlIGlmKHQ9PT0zJiZuLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXtlLmJsb2NrZWRPbj1uLnRhZz09PTM/bi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO3JldHVybn19fWUuYmxvY2tlZE9uPW51bGx9ZnVuY3Rpb24gY3MoZSl7aWYoZS5ibG9ja2VkT24hPT1udWxsKXJldHVybiExO2Zvcih2YXIgdD1lLnRhcmdldENvbnRhaW5lcnM7MDx0Lmxlbmd0aDspe3ZhciBuPW51KGUuZG9tRXZlbnROYW1lLGUuZXZlbnRTeXN0ZW1GbGFncyx0WzBdLGUubmF0aXZlRXZlbnQpO2lmKG49PT1udWxsKXtuPWUubmF0aXZlRXZlbnQ7dmFyIHI9bmV3IG4uY29uc3RydWN0b3Iobi50eXBlLG4pO1FjPXIsbi50YXJnZXQuZGlzcGF0Y2hFdmVudChyKSxRYz1udWxsfWVsc2UgcmV0dXJuIHQ9dGkobiksdCE9PW51bGwmJlV1KHQpLGUuYmxvY2tlZE9uPW4sITE7dC5zaGlmdCgpfXJldHVybiEwfWZ1bmN0aW9uIFlmKGUsdCxuKXtjcyhlKSYmbi5kZWxldGUodCl9ZnVuY3Rpb24gWGIoKXt0dT0hMSxwciE9PW51bGwmJmNzKHByKSYmKHByPW51bGwpLGZyIT09bnVsbCYmY3MoZnIpJiYoZnI9bnVsbCksbXIhPT1udWxsJiZjcyhtcikmJihtcj1udWxsKSxVYS5mb3JFYWNoKFlmKSwkYS5mb3JFYWNoKFlmKX1mdW5jdGlvbiB5YShlLHQpe2UuYmxvY2tlZE9uPT09dCYmKGUuYmxvY2tlZE9uPW51bGwsdHV8fCh0dT0hMCxVdC51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKFV0LnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LFhiKSkpfWZ1bmN0aW9uIFdhKGUpe2Z1bmN0aW9uIHQobyl7cmV0dXJuIHlhKG8sZSl9aWYoMDxxaS5sZW5ndGgpe3lhKHFpWzBdLGUpO2Zvcih2YXIgbj0xO248cWkubGVuZ3RoO24rKyl7dmFyIHI9cWlbbl07ci5ibG9ja2VkT249PT1lJiYoci5ibG9ja2VkT249bnVsbCl9fWZvcihwciE9PW51bGwmJnlhKHByLGUpLGZyIT09bnVsbCYmeWEoZnIsZSksbXIhPT1udWxsJiZ5YShtcixlKSxVYS5mb3JFYWNoKHQpLCRhLmZvckVhY2godCksbj0wO248bHIubGVuZ3RoO24rKylyPWxyW25dLHIuYmxvY2tlZE9uPT09ZSYmKHIuYmxvY2tlZE9uPW51bGwpO2Zvcig7MDxsci5sZW5ndGgmJihuPWxyWzBdLG4uYmxvY2tlZE9uPT09bnVsbCk7KXZoKG4pLG4uYmxvY2tlZE9uPT09bnVsbCYmbHIuc2hpZnQoKX12YXIgUG89Vm4uUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsRXM9ITA7ZnVuY3Rpb24gWmIoZSx0LG4scil7dmFyIG89eGUsYT1Qby50cmFuc2l0aW9uO1BvLnRyYW5zaXRpb249bnVsbDt0cnl7eGU9MSwkdShlLHQsbixyKX1maW5hbGx5e3hlPW8sUG8udHJhbnNpdGlvbj1hfX1mdW5jdGlvbiBlayhlLHQsbixyKXt2YXIgbz14ZSxhPVBvLnRyYW5zaXRpb247UG8udHJhbnNpdGlvbj1udWxsO3RyeXt4ZT00LCR1KGUsdCxuLHIpfWZpbmFsbHl7eGU9byxQby50cmFuc2l0aW9uPWF9fWZ1bmN0aW9uICR1KGUsdCxuLHIpe2lmKEVzKXt2YXIgbz1udShlLHQsbixyKTtpZihvPT09bnVsbClEYyhlLHQscixUcyxuKSxLZihlLHIpO2Vsc2UgaWYoSmIobyxlLHQsbixyKSlyLnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYoS2YoZSxyKSx0JjQmJi0xPFFiLmluZGV4T2YoZSkpe2Zvcig7byE9PW51bGw7KXt2YXIgYT10aShvKTtpZihhIT09bnVsbCYmbWgoYSksYT1udShlLHQsbixyKSxhPT09bnVsbCYmRGMoZSx0LHIsVHMsbiksYT09PW8pYnJlYWs7bz1hfW8hPT1udWxsJiZyLnN0b3BQcm9wYWdhdGlvbigpfWVsc2UgRGMoZSx0LHIsbnVsbCxuKX19dmFyIFRzPW51bGw7ZnVuY3Rpb24gbnUoZSx0LG4scil7aWYoVHM9bnVsbCxlPUx1KHIpLGU9QnIoZSksZSE9PW51bGwpaWYodD1acihlKSx0PT09bnVsbCllPW51bGw7ZWxzZSBpZihuPXQudGFnLG49PT0xMyl7aWYoZT1paCh0KSxlIT09bnVsbClyZXR1cm4gZTtlPW51bGx9ZWxzZSBpZihuPT09Myl7aWYodC5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZClyZXR1cm4gdC50YWc9PT0zP3Quc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtlPW51bGx9ZWxzZSB0IT09ZSYmKGU9bnVsbCk7cmV0dXJuIFRzPWUsbnVsbH1mdW5jdGlvbiB3aChlKXtzd2l0Y2goZSl7Y2FzZSJjYW5jZWwiOmNhc2UiY2xpY2siOmNhc2UiY2xvc2UiOmNhc2UiY29udGV4dG1lbnUiOmNhc2UiY29weSI6Y2FzZSJjdXQiOmNhc2UiYXV4Y2xpY2siOmNhc2UiZGJsY2xpY2siOmNhc2UiZHJhZ2VuZCI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6Y2FzZSJmb2N1c2luIjpjYXNlImZvY3Vzb3V0IjpjYXNlImlucHV0IjpjYXNlImludmFsaWQiOmNhc2Uia2V5ZG93biI6Y2FzZSJrZXlwcmVzcyI6Y2FzZSJrZXl1cCI6Y2FzZSJtb3VzZWRvd24iOmNhc2UibW91c2V1cCI6Y2FzZSJwYXN0ZSI6Y2FzZSJwYXVzZSI6Y2FzZSJwbGF5IjpjYXNlInBvaW50ZXJjYW5jZWwiOmNhc2UicG9pbnRlcmRvd24iOmNhc2UicG9pbnRlcnVwIjpjYXNlInJhdGVjaGFuZ2UiOmNhc2UicmVzZXQiOmNhc2UicmVzaXplIjpjYXNlInNlZWtlZCI6Y2FzZSJzdWJtaXQiOmNhc2UidG91Y2hjYW5jZWwiOmNhc2UidG91Y2hlbmQiOmNhc2UidG91Y2hzdGFydCI6Y2FzZSJ2b2x1bWVjaGFuZ2UiOmNhc2UiY2hhbmdlIjpjYXNlInNlbGVjdGlvbmNoYW5nZSI6Y2FzZSJ0ZXh0SW5wdXQiOmNhc2UiY29tcG9zaXRpb25zdGFydCI6Y2FzZSJjb21wb3NpdGlvbmVuZCI6Y2FzZSJjb21wb3NpdGlvbnVwZGF0ZSI6Y2FzZSJiZWZvcmVibHVyIjpjYXNlImFmdGVyYmx1ciI6Y2FzZSJiZWZvcmVpbnB1dCI6Y2FzZSJibHVyIjpjYXNlImZ1bGxzY3JlZW5jaGFuZ2UiOmNhc2UiZm9jdXMiOmNhc2UiaGFzaGNoYW5nZSI6Y2FzZSJwb3BzdGF0ZSI6Y2FzZSJzZWxlY3QiOmNhc2Uic2VsZWN0c3RhcnQiOnJldHVybiAxO2Nhc2UiZHJhZyI6Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2V4aXQiOmNhc2UiZHJhZ2xlYXZlIjpjYXNlImRyYWdvdmVyIjpjYXNlIm1vdXNlbW92ZSI6Y2FzZSJtb3VzZW91dCI6Y2FzZSJtb3VzZW92ZXIiOmNhc2UicG9pbnRlcm1vdmUiOmNhc2UicG9pbnRlcm91dCI6Y2FzZSJwb2ludGVyb3ZlciI6Y2FzZSJzY3JvbGwiOmNhc2UidG9nZ2xlIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ3aGVlbCI6Y2FzZSJtb3VzZWVudGVyIjpjYXNlIm1vdXNlbGVhdmUiOmNhc2UicG9pbnRlcmVudGVyIjpjYXNlInBvaW50ZXJsZWF2ZSI6cmV0dXJuIDQ7Y2FzZSJtZXNzYWdlIjpzd2l0Y2goV2IoKSl7Y2FzZSB6dTpyZXR1cm4gMTtjYXNlIHVoOnJldHVybiA0O2Nhc2UgeHM6Y2FzZSBCYjpyZXR1cm4gMTY7Y2FzZSBkaDpyZXR1cm4gNTM2ODcwOTEyO2RlZmF1bHQ6cmV0dXJuIDE2fWRlZmF1bHQ6cmV0dXJuIDE2fX12YXIgdXI9bnVsbCxXdT1udWxsLHVzPW51bGw7ZnVuY3Rpb24gYmgoKXtpZih1cylyZXR1cm4gdXM7dmFyIGUsdD1XdSxuPXQubGVuZ3RoLHIsbz0idmFsdWUiaW4gdXI/dXIudmFsdWU6dXIudGV4dENvbnRlbnQsYT1vLmxlbmd0aDtmb3IoZT0wO2U8biYmdFtlXT09PW9bZV07ZSsrKTt2YXIgaT1uLWU7Zm9yKHI9MTtyPD1pJiZ0W24tcl09PT1vW2Etcl07cisrKTtyZXR1cm4gdXM9by5zbGljZShlLDE8cj8xLXI6dm9pZCAwKX1mdW5jdGlvbiBkcyhlKXt2YXIgdD1lLmtleUNvZGU7cmV0dXJuImNoYXJDb2RlImluIGU/KGU9ZS5jaGFyQ29kZSxlPT09MCYmdD09PTEzJiYoZT0xMykpOmU9dCxlPT09MTAmJihlPTEzKSwzMjw9ZXx8ZT09PTEzP2U6MH1mdW5jdGlvbiBRaSgpe3JldHVybiEwfWZ1bmN0aW9uIHFmKCl7cmV0dXJuITF9ZnVuY3Rpb24gJHQoZSl7ZnVuY3Rpb24gdChuLHIsbyxhLGkpe3RoaXMuX3JlYWN0TmFtZT1uLHRoaXMuX3RhcmdldEluc3Q9byx0aGlzLnR5cGU9cix0aGlzLm5hdGl2ZUV2ZW50PWEsdGhpcy50YXJnZXQ9aSx0aGlzLmN1cnJlbnRUYXJnZXQ9bnVsbDtmb3IodmFyIHMgaW4gZSllLmhhc093blByb3BlcnR5KHMpJiYobj1lW3NdLHRoaXNbc109bj9uKGEpOmFbc10pO3JldHVybiB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD0oYS5kZWZhdWx0UHJldmVudGVkIT1udWxsP2EuZGVmYXVsdFByZXZlbnRlZDphLnJldHVyblZhbHVlPT09ITEpP1FpOnFmLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cWYsdGhpc31yZXR1cm4gRmUodC5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBuPXRoaXMubmF0aXZlRXZlbnQ7biYmKG4ucHJldmVudERlZmF1bHQ/bi5wcmV2ZW50RGVmYXVsdCgpOnR5cGVvZiBuLnJldHVyblZhbHVlIT0idW5rbm93biImJihuLnJldHVyblZhbHVlPSExKSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1RaSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBuPXRoaXMubmF0aXZlRXZlbnQ7biYmKG4uc3RvcFByb3BhZ2F0aW9uP24uc3RvcFByb3BhZ2F0aW9uKCk6dHlwZW9mIG4uY2FuY2VsQnViYmxlIT0idW5rbm93biImJihuLmNhbmNlbEJ1YmJsZT0hMCksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1RaSl9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt9LGlzUGVyc2lzdGVudDpRaX0pLHR9dmFyIFZvPXtldmVudFBoYXNlOjAsYnViYmxlczowLGNhbmNlbGFibGU6MCx0aW1lU3RhbXA6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGltZVN0YW1wfHxEYXRlLm5vdygpfSxkZWZhdWx0UHJldmVudGVkOjAsaXNUcnVzdGVkOjB9LEJ1PSR0KFZvKSxlaT1GZSh7fSxWbyx7dmlldzowLGRldGFpbDowfSksdGs9JHQoZWkpLGtjLHhjLHZhLGpzPUZlKHt9LGVpLHtzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAscGFnZVg6MCxwYWdlWTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxnZXRNb2RpZmllclN0YXRlOkh1LGJ1dHRvbjowLGJ1dHRvbnM6MCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlbGF0ZWRUYXJnZXQ9PT12b2lkIDA/ZS5mcm9tRWxlbWVudD09PWUuc3JjRWxlbWVudD9lLnRvRWxlbWVudDplLmZyb21FbGVtZW50OmUucmVsYXRlZFRhcmdldH0sbW92ZW1lbnRYOmZ1bmN0aW9uKGUpe3JldHVybiJtb3ZlbWVudFgiaW4gZT9lLm1vdmVtZW50WDooZSE9PXZhJiYodmEmJmUudHlwZT09PSJtb3VzZW1vdmUiPyhrYz1lLnNjcmVlblgtdmEuc2NyZWVuWCx4Yz1lLnNjcmVlblktdmEuc2NyZWVuWSk6eGM9a2M9MCx2YT1lKSxrYyl9LG1vdmVtZW50WTpmdW5jdGlvbihlKXtyZXR1cm4ibW92ZW1lbnRZImluIGU/ZS5tb3ZlbWVudFk6eGN9fSksUWY9JHQoanMpLG5rPUZlKHt9LGpzLHtkYXRhVHJhbnNmZXI6MH0pLHJrPSR0KG5rKSxvaz1GZSh7fSxlaSx7cmVsYXRlZFRhcmdldDowfSksU2M9JHQob2spLGFrPUZlKHt9LFZvLHthbmltYXRpb25OYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSxpaz0kdChhayksc2s9RmUoe30sVm8se2NsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuImNsaXBib2FyZERhdGEiaW4gZT9lLmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fSksbGs9JHQoc2spLGNrPUZlKHt9LFZvLHtkYXRhOjB9KSxKZj0kdChjayksdWs9e0VzYzoiRXNjYXBlIixTcGFjZWJhcjoiICIsTGVmdDoiQXJyb3dMZWZ0IixVcDoiQXJyb3dVcCIsUmlnaHQ6IkFycm93UmlnaHQiLERvd246IkFycm93RG93biIsRGVsOiJEZWxldGUiLFdpbjoiT1MiLE1lbnU6IkNvbnRleHRNZW51IixBcHBzOiJDb250ZXh0TWVudSIsU2Nyb2xsOiJTY3JvbGxMb2NrIixNb3pQcmludGFibGVLZXk6IlVuaWRlbnRpZmllZCJ9LGRrPXs4OiJCYWNrc3BhY2UiLDk6IlRhYiIsMTI6IkNsZWFyIiwxMzoiRW50ZXIiLDE2OiJTaGlmdCIsMTc6IkNvbnRyb2wiLDE4OiJBbHQiLDE5OiJQYXVzZSIsMjA6IkNhcHNMb2NrIiwyNzoiRXNjYXBlIiwzMjoiICIsMzM6IlBhZ2VVcCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5kIiwzNjoiSG9tZSIsMzc6IkFycm93TGVmdCIsMzg6IkFycm93VXAiLDM5OiJBcnJvd1JpZ2h0Iiw0MDoiQXJyb3dEb3duIiw0NToiSW5zZXJ0Iiw0NjoiRGVsZXRlIiwxMTI6IkYxIiwxMTM6IkYyIiwxMTQ6IkYzIiwxMTU6IkY0IiwxMTY6IkY1IiwxMTc6IkY2IiwxMTg6IkY3IiwxMTk6IkY4IiwxMjA6IkY5IiwxMjE6IkYxMCIsMTIyOiJGMTEiLDEyMzoiRjEyIiwxNDQ6Ik51bUxvY2siLDE0NToiU2Nyb2xsTG9jayIsMjI0OiJNZXRhIn0scGs9e0FsdDoiYWx0S2V5IixDb250cm9sOiJjdHJsS2V5IixNZXRhOiJtZXRhS2V5IixTaGlmdDoic2hpZnRLZXkifTtmdW5jdGlvbiBmayhlKXt2YXIgdD10aGlzLm5hdGl2ZUV2ZW50O3JldHVybiB0LmdldE1vZGlmaWVyU3RhdGU/dC5nZXRNb2RpZmllclN0YXRlKGUpOihlPXBrW2VdKT8hIXRbZV06ITF9ZnVuY3Rpb24gSHUoKXtyZXR1cm4gZmt9dmFyIG1rPUZlKHt9LGVpLHtrZXk6ZnVuY3Rpb24oZSl7aWYoZS5rZXkpe3ZhciB0PXVrW2Uua2V5XXx8ZS5rZXk7aWYodCE9PSJVbmlkZW50aWZpZWQiKXJldHVybiB0fXJldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiPyhlPWRzKGUpLGU9PT0xMz8iRW50ZXIiOlN0cmluZy5mcm9tQ2hhckNvZGUoZSkpOmUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9ka1tlLmtleUNvZGVdfHwiVW5pZGVudGlmaWVkIjoiIn0sY29kZTowLGxvY2F0aW9uOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLHJlcGVhdDowLGxvY2FsZTowLGdldE1vZGlmaWVyU3RhdGU6SHUsY2hhckNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/ZHMoZSk6MH0sa2V5Q29kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP2Uua2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj9kcyhlKTplLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/ZS5rZXlDb2RlOjB9fSksaGs9JHQobWspLGdrPUZlKHt9LGpzLHtwb2ludGVySWQ6MCx3aWR0aDowLGhlaWdodDowLHByZXNzdXJlOjAsdGFuZ2VudGlhbFByZXNzdXJlOjAsdGlsdFg6MCx0aWx0WTowLHR3aXN0OjAscG9pbnRlclR5cGU6MCxpc1ByaW1hcnk6MH0pLFhmPSR0KGdrKSx5az1GZSh7fSxlaSx7dG91Y2hlczowLHRhcmdldFRvdWNoZXM6MCxjaGFuZ2VkVG91Y2hlczowLGFsdEtleTowLG1ldGFLZXk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxnZXRNb2RpZmllclN0YXRlOkh1fSksdms9JHQoeWspLHdrPUZlKHt9LFZvLHtwcm9wZXJ0eU5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLGJrPSR0KHdrKSxraz1GZSh7fSxqcyx7ZGVsdGFYOmZ1bmN0aW9uKGUpe3JldHVybiJkZWx0YVgiaW4gZT9lLmRlbHRhWDoid2hlZWxEZWx0YVgiaW4gZT8tZS53aGVlbERlbHRhWDowfSxkZWx0YVk6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWSJpbiBlP2UuZGVsdGFZOiJ3aGVlbERlbHRhWSJpbiBlPy1lLndoZWVsRGVsdGFZOiJ3aGVlbERlbHRhImluIGU/LWUud2hlZWxEZWx0YTowfSxkZWx0YVo6MCxkZWx0YU1vZGU6MH0pLHhrPSR0KGtrKSxTaz1bOSwxMywyNywzMl0sanU9V24mJiJDb21wb3NpdGlvbkV2ZW50ImluIHdpbmRvdyxDYT1udWxsO1duJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiYoQ2E9ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTt2YXIgRWs9V24mJiJUZXh0RXZlbnQiaW4gd2luZG93JiYhQ2Esa2g9V24mJighanV8fENhJiY4PENhJiYxMT49Q2EpLFpmPSIgIixlbT0hMTtmdW5jdGlvbiB4aChlLHQpe3N3aXRjaChlKXtjYXNlImtleXVwIjpyZXR1cm4gU2suaW5kZXhPZih0LmtleUNvZGUpIT09LTE7Y2FzZSJrZXlkb3duIjpyZXR1cm4gdC5rZXlDb2RlIT09MjI5O2Nhc2Uia2V5cHJlc3MiOmNhc2UibW91c2Vkb3duIjpjYXNlImZvY3Vzb3V0IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBTaChlKXtyZXR1cm4gZT1lLmRldGFpbCx0eXBlb2YgZT09Im9iamVjdCImJiJkYXRhImluIGU/ZS5kYXRhOm51bGx9dmFyIHhvPSExO2Z1bmN0aW9uIFRrKGUsdCl7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBTaCh0KTtjYXNlImtleXByZXNzIjpyZXR1cm4gdC53aGljaCE9PTMyP251bGw6KGVtPSEwLFpmKTtjYXNlInRleHRJbnB1dCI6cmV0dXJuIGU9dC5kYXRhLGU9PT1aZiYmZW0/bnVsbDplO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIE5rKGUsdCl7aWYoeG8pcmV0dXJuIGU9PT0iY29tcG9zaXRpb25lbmQifHwhanUmJnhoKGUsdCk/KGU9YmgoKSx1cz1XdT11cj1udWxsLHhvPSExLGUpOm51bGw7c3dpdGNoKGUpe2Nhc2UicGFzdGUiOnJldHVybiBudWxsO2Nhc2Uia2V5cHJlc3MiOmlmKCEodC5jdHJsS2V5fHx0LmFsdEtleXx8dC5tZXRhS2V5KXx8dC5jdHJsS2V5JiZ0LmFsdEtleSl7aWYodC5jaGFyJiYxPHQuY2hhci5sZW5ndGgpcmV0dXJuIHQuY2hhcjtpZih0LndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQud2hpY2gpfXJldHVybiBudWxsO2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBraCYmdC5sb2NhbGUhPT0ia28iP251bGw6dC5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciBEaz17Y29sb3I6ITAsZGF0ZTohMCxkYXRldGltZTohMCwiZGF0ZXRpbWUtbG9jYWwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24gdG0oZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0PT09ImlucHV0Ij8hIURrW2UudHlwZV06dD09PSJ0ZXh0YXJlYSJ9ZnVuY3Rpb24gRWgoZSx0LG4scil7dGgociksdD1Ocyh0LCJvbkNoYW5nZSIpLDA8dC5sZW5ndGgmJihuPW5ldyBCdSgib25DaGFuZ2UiLCJjaGFuZ2UiLG51bGwsbixyKSxlLnB1c2goe2V2ZW50Om4sbGlzdGVuZXJzOnR9KSl9dmFyIEFhPW51bGwsQmE9bnVsbDtmdW5jdGlvbiBfayhlKXtQaChlLDApfWZ1bmN0aW9uIFZzKGUpe3ZhciB0PVRvKGUpO2lmKFltKHQpKXJldHVybiBlfWZ1bmN0aW9uIENrKGUsdCl7aWYoZT09PSJjaGFuZ2UiKXJldHVybiB0fXZhciBUaD0hMTtXbiYmKFduPyhYaT0ib25pbnB1dCJpbiBkb2N1bWVudCxYaXx8KEVjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEVjLnNldEF0dHJpYnV0ZSgib25pbnB1dCIsInJldHVybjsiKSxYaT10eXBlb2YgRWMub25pbnB1dD09ImZ1bmN0aW9uIiksSmk9WGkpOkppPSExLFRoPUppJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OTxkb2N1bWVudC5kb2N1bWVudE1vZGUpKTt2YXIgSmksWGksRWM7ZnVuY3Rpb24gbm0oKXtBYSYmKEFhLmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixOaCksQmE9QWE9bnVsbCl9ZnVuY3Rpb24gTmgoZSl7aWYoZS5wcm9wZXJ0eU5hbWU9PT0idmFsdWUiJiZWcyhCYSkpe3ZhciB0PVtdO0VoKHQsQmEsZSxMdShlKSksYWgoX2ssdCl9fWZ1bmN0aW9uIEFrKGUsdCxuKXtlPT09ImZvY3VzaW4iPyhubSgpLEFhPXQsQmE9bixBYS5hdHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsTmgpKTplPT09ImZvY3Vzb3V0IiYmbm0oKX1mdW5jdGlvbiBPayhlKXtpZihlPT09InNlbGVjdGlvbmNoYW5nZSJ8fGU9PT0ia2V5dXAifHxlPT09ImtleWRvd24iKXJldHVybiBWcyhCYSl9ZnVuY3Rpb24gSWsoZSx0KXtpZihlPT09ImNsaWNrIilyZXR1cm4gVnModCl9ZnVuY3Rpb24gUmsoZSx0KXtpZihlPT09ImlucHV0Inx8ZT09PSJjaGFuZ2UiKXJldHVybiBWcyh0KX1mdW5jdGlvbiBNayhlLHQpe3JldHVybiBlPT09dCYmKGUhPT0wfHwxL2U9PT0xL3QpfHxlIT09ZSYmdCE9PXR9dmFyIG1uPXR5cGVvZiBPYmplY3QuaXM9PSJmdW5jdGlvbiI/T2JqZWN0LmlzOk1rO2Z1bmN0aW9uIEhhKGUsdCl7aWYobW4oZSx0KSlyZXR1cm4hMDtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsKXJldHVybiExO3ZhciBuPU9iamVjdC5rZXlzKGUpLHI9T2JqZWN0LmtleXModCk7aWYobi5sZW5ndGghPT1yLmxlbmd0aClyZXR1cm4hMTtmb3Iocj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdO2lmKCFGYy5jYWxsKHQsbyl8fCFtbihlW29dLHRbb10pKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIHJtKGUpe2Zvcig7ZSYmZS5maXJzdENoaWxkOyllPWUuZmlyc3RDaGlsZDtyZXR1cm4gZX1mdW5jdGlvbiBvbShlLHQpe3ZhciBuPXJtKGUpO2U9MDtmb3IodmFyIHI7bjspe2lmKG4ubm9kZVR5cGU9PT0zKXtpZihyPWUrbi50ZXh0Q29udGVudC5sZW5ndGgsZTw9dCYmcj49dClyZXR1cm57bm9kZTpuLG9mZnNldDp0LWV9O2U9cn1lOntmb3IoO247KXtpZihuLm5leHRTaWJsaW5nKXtuPW4ubmV4dFNpYmxpbmc7YnJlYWsgZX1uPW4ucGFyZW50Tm9kZX1uPXZvaWQgMH1uPXJtKG4pfX1mdW5jdGlvbiBEaChlLHQpe3JldHVybiBlJiZ0P2U9PT10PyEwOmUmJmUubm9kZVR5cGU9PT0zPyExOnQmJnQubm9kZVR5cGU9PT0zP0RoKGUsdC5wYXJlbnROb2RlKToiY29udGFpbnMiaW4gZT9lLmNvbnRhaW5zKHQpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSYxNik6ITE6ITF9ZnVuY3Rpb24gX2goKXtmb3IodmFyIGU9d2luZG93LHQ9d3MoKTt0IGluc3RhbmNlb2YgZS5IVE1MSUZyYW1lRWxlbWVudDspe3RyeXt2YXIgbj10eXBlb2YgdC5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWY9PSJzdHJpbmcifWNhdGNoe249ITF9aWYobillPXQuY29udGVudFdpbmRvdztlbHNlIGJyZWFrO3Q9d3MoZS5kb2N1bWVudCl9cmV0dXJuIHR9ZnVuY3Rpb24gVnUoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYodD09PSJpbnB1dCImJihlLnR5cGU9PT0idGV4dCJ8fGUudHlwZT09PSJzZWFyY2gifHxlLnR5cGU9PT0idGVsInx8ZS50eXBlPT09InVybCJ8fGUudHlwZT09PSJwYXNzd29yZCIpfHx0PT09InRleHRhcmVhInx8ZS5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSIpfWZ1bmN0aW9uIFBrKGUpe3ZhciB0PV9oKCksbj1lLmZvY3VzZWRFbGVtLHI9ZS5zZWxlY3Rpb25SYW5nZTtpZih0IT09biYmbiYmbi5vd25lckRvY3VtZW50JiZEaChuLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG4pKXtpZihyIT09bnVsbCYmVnUobikpe2lmKHQ9ci5zdGFydCxlPXIuZW5kLGU9PT12b2lkIDAmJihlPXQpLCJzZWxlY3Rpb25TdGFydCJpbiBuKW4uc2VsZWN0aW9uU3RhcnQ9dCxuLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihlLG4udmFsdWUubGVuZ3RoKTtlbHNlIGlmKGU9KHQ9bi5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJnQuZGVmYXVsdFZpZXd8fHdpbmRvdyxlLmdldFNlbGVjdGlvbil7ZT1lLmdldFNlbGVjdGlvbigpO3ZhciBvPW4udGV4dENvbnRlbnQubGVuZ3RoLGE9TWF0aC5taW4oci5zdGFydCxvKTtyPXIuZW5kPT09dm9pZCAwP2E6TWF0aC5taW4oci5lbmQsbyksIWUuZXh0ZW5kJiZhPnImJihvPXIscj1hLGE9byksbz1vbShuLGEpO3ZhciBpPW9tKG4scik7byYmaSYmKGUucmFuZ2VDb3VudCE9PTF8fGUuYW5jaG9yTm9kZSE9PW8ubm9kZXx8ZS5hbmNob3JPZmZzZXQhPT1vLm9mZnNldHx8ZS5mb2N1c05vZGUhPT1pLm5vZGV8fGUuZm9jdXNPZmZzZXQhPT1pLm9mZnNldCkmJih0PXQuY3JlYXRlUmFuZ2UoKSx0LnNldFN0YXJ0KG8ubm9kZSxvLm9mZnNldCksZS5yZW1vdmVBbGxSYW5nZXMoKSxhPnI/KGUuYWRkUmFuZ2UodCksZS5leHRlbmQoaS5ub2RlLGkub2Zmc2V0KSk6KHQuc2V0RW5kKGkubm9kZSxpLm9mZnNldCksZS5hZGRSYW5nZSh0KSkpfX1mb3IodD1bXSxlPW47ZT1lLnBhcmVudE5vZGU7KWUubm9kZVR5cGU9PT0xJiZ0LnB1c2goe2VsZW1lbnQ6ZSxsZWZ0OmUuc2Nyb2xsTGVmdCx0b3A6ZS5zY3JvbGxUb3B9KTtmb3IodHlwZW9mIG4uZm9jdXM9PSJmdW5jdGlvbiImJm4uZm9jdXMoKSxuPTA7bjx0Lmxlbmd0aDtuKyspZT10W25dLGUuZWxlbWVudC5zY3JvbGxMZWZ0PWUubGVmdCxlLmVsZW1lbnQuc2Nyb2xsVG9wPWUudG9wfX12YXIgTGs9V24mJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJjExPj1kb2N1bWVudC5kb2N1bWVudE1vZGUsU289bnVsbCxydT1udWxsLE9hPW51bGwsb3U9ITE7ZnVuY3Rpb24gYW0oZSx0LG4pe3ZhciByPW4ud2luZG93PT09bj9uLmRvY3VtZW50Om4ubm9kZVR5cGU9PT05P246bi5vd25lckRvY3VtZW50O291fHxTbz09bnVsbHx8U28hPT13cyhyKXx8KHI9U28sInNlbGVjdGlvblN0YXJ0ImluIHImJlZ1KHIpP3I9e3N0YXJ0OnIuc2VsZWN0aW9uU3RhcnQsZW5kOnIuc2VsZWN0aW9uRW5kfToocj0oci5vd25lckRvY3VtZW50JiZyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCkscj17YW5jaG9yTm9kZTpyLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OnIuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpyLmZvY3VzTm9kZSxmb2N1c09mZnNldDpyLmZvY3VzT2Zmc2V0fSksT2EmJkhhKE9hLHIpfHwoT2E9cixyPU5zKHJ1LCJvblNlbGVjdCIpLDA8ci5sZW5ndGgmJih0PW5ldyBCdSgib25TZWxlY3QiLCJzZWxlY3QiLG51bGwsdCxuKSxlLnB1c2goe2V2ZW50OnQsbGlzdGVuZXJzOnJ9KSx0LnRhcmdldD1TbykpKX1mdW5jdGlvbiBaaShlLHQpe3ZhciBuPXt9O3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV09dC50b0xvd2VyQ2FzZSgpLG5bIldlYmtpdCIrZV09IndlYmtpdCIrdCxuWyJNb3oiK2VdPSJtb3oiK3Qsbn12YXIgRW89e2FuaW1hdGlvbmVuZDpaaSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uRW5kIiksYW5pbWF0aW9uaXRlcmF0aW9uOlppKCJBbmltYXRpb24iLCJBbmltYXRpb25JdGVyYXRpb24iKSxhbmltYXRpb25zdGFydDpaaSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uU3RhcnQiKSx0cmFuc2l0aW9uZW5kOlppKCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVuZCIpfSxUYz17fSxDaD17fTtXbiYmKENoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgRW8uYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgRW8uYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgRW8uYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8ZGVsZXRlIEVvLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gR3MoZSl7aWYoVGNbZV0pcmV0dXJuIFRjW2VdO2lmKCFFb1tlXSlyZXR1cm4gZTt2YXIgdD1Fb1tlXSxuO2ZvcihuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSYmbiBpbiBDaClyZXR1cm4gVGNbZV09dFtuXTtyZXR1cm4gZX12YXIgQWg9R3MoImFuaW1hdGlvbmVuZCIpLE9oPUdzKCJhbmltYXRpb25pdGVyYXRpb24iKSxJaD1HcygiYW5pbWF0aW9uc3RhcnQiKSxSaD1HcygidHJhbnNpdGlvbmVuZCIpLE1oPW5ldyBNYXAsaW09ImFib3J0IGF1eENsaWNrIGNhbmNlbCBjYW5QbGF5IGNhblBsYXlUaHJvdWdoIGNsaWNrIGNsb3NlIGNvbnRleHRNZW51IGNvcHkgY3V0IGRyYWcgZHJhZ0VuZCBkcmFnRW50ZXIgZHJhZ0V4aXQgZHJhZ0xlYXZlIGRyYWdPdmVyIGRyYWdTdGFydCBkcm9wIGR1cmF0aW9uQ2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGdvdFBvaW50ZXJDYXB0dXJlIGlucHV0IGludmFsaWQga2V5RG93biBrZXlQcmVzcyBrZXlVcCBsb2FkIGxvYWRlZERhdGEgbG9hZGVkTWV0YWRhdGEgbG9hZFN0YXJ0IGxvc3RQb2ludGVyQ2FwdHVyZSBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlIHBhdXNlIHBsYXkgcGxheWluZyBwb2ludGVyQ2FuY2VsIHBvaW50ZXJEb3duIHBvaW50ZXJNb3ZlIHBvaW50ZXJPdXQgcG9pbnRlck92ZXIgcG9pbnRlclVwIHByb2dyZXNzIHJhdGVDaGFuZ2UgcmVzZXQgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VibWl0IHN1c3BlbmQgdGltZVVwZGF0ZSB0b3VjaENhbmNlbCB0b3VjaEVuZCB0b3VjaFN0YXJ0IHZvbHVtZUNoYW5nZSBzY3JvbGwgdG9nZ2xlIHRvdWNoTW92ZSB3YWl0aW5nIHdoZWVsIi5zcGxpdCgiICIpO2Z1bmN0aW9uIHhyKGUsdCl7TWguc2V0KGUsdCksWHIodCxbZV0pfWZvcihlcz0wO2VzPGltLmxlbmd0aDtlcysrKXRzPWltW2VzXSxzbT10cy50b0xvd2VyQ2FzZSgpLGxtPXRzWzBdLnRvVXBwZXJDYXNlKCkrdHMuc2xpY2UoMSkseHIoc20sIm9uIitsbSk7dmFyIHRzLHNtLGxtLGVzO3hyKEFoLCJvbkFuaW1hdGlvbkVuZCIpO3hyKE9oLCJvbkFuaW1hdGlvbkl0ZXJhdGlvbiIpO3hyKEloLCJvbkFuaW1hdGlvblN0YXJ0Iik7eHIoImRibGNsaWNrIiwib25Eb3VibGVDbGljayIpO3hyKCJmb2N1c2luIiwib25Gb2N1cyIpO3hyKCJmb2N1c291dCIsIm9uQmx1ciIpO3hyKFJoLCJvblRyYW5zaXRpb25FbmQiKTtGbygib25Nb3VzZUVudGVyIixbIm1vdXNlb3V0IiwibW91c2VvdmVyIl0pO0ZvKCJvbk1vdXNlTGVhdmUiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSk7Rm8oIm9uUG9pbnRlckVudGVyIixbInBvaW50ZXJvdXQiLCJwb2ludGVyb3ZlciJdKTtGbygib25Qb2ludGVyTGVhdmUiLFsicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIl0pO1hyKCJvbkNoYW5nZSIsImNoYW5nZSBjbGljayBmb2N1c2luIGZvY3Vzb3V0IGlucHV0IGtleWRvd24ga2V5dXAgc2VsZWN0aW9uY2hhbmdlIi5zcGxpdCgiICIpKTtYcigib25TZWxlY3QiLCJmb2N1c291dCBjb250ZXh0bWVudSBkcmFnZW5kIGZvY3VzaW4ga2V5ZG93biBrZXl1cCBtb3VzZWRvd24gbW91c2V1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpO1hyKCJvbkJlZm9yZUlucHV0IixbImNvbXBvc2l0aW9uZW5kIiwia2V5cHJlc3MiLCJ0ZXh0SW5wdXQiLCJwYXN0ZSJdKTtYcigib25Db21wb3NpdGlvbkVuZCIsImNvbXBvc2l0aW9uZW5kIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTtYcigib25Db21wb3NpdGlvblN0YXJ0IiwiY29tcG9zaXRpb25zdGFydCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7WHIoIm9uQ29tcG9zaXRpb25VcGRhdGUiLCJjb21wb3NpdGlvbnVwZGF0ZSBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7dmFyIE5hPSJhYm9ydCBjYW5wbGF5IGNhbnBsYXl0aHJvdWdoIGR1cmF0aW9uY2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGxvYWRlZGRhdGEgbG9hZGVkbWV0YWRhdGEgbG9hZHN0YXJ0IHBhdXNlIHBsYXkgcGxheWluZyBwcm9ncmVzcyByYXRlY2hhbmdlIHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1c3BlbmQgdGltZXVwZGF0ZSB2b2x1bWVjaGFuZ2Ugd2FpdGluZyIuc3BsaXQoIiAiKSx6az1uZXcgU2V0KCJjYW5jZWwgY2xvc2UgaW52YWxpZCBsb2FkIHNjcm9sbCB0b2dnbGUiLnNwbGl0KCIgIikuY29uY2F0KE5hKSk7ZnVuY3Rpb24gY20oZSx0LG4pe3ZhciByPWUudHlwZXx8InVua25vd24tZXZlbnQiO2UuY3VycmVudFRhcmdldD1uLHpiKHIsdCx2b2lkIDAsZSksZS5jdXJyZW50VGFyZ2V0PW51bGx9ZnVuY3Rpb24gUGgoZSx0KXt0PSh0JjQpIT09MDtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXSxvPXIuZXZlbnQ7cj1yLmxpc3RlbmVycztlOnt2YXIgYT12b2lkIDA7aWYodClmb3IodmFyIGk9ci5sZW5ndGgtMTswPD1pO2ktLSl7dmFyIHM9cltpXSxsPXMuaW5zdGFuY2UsYz1zLmN1cnJlbnRUYXJnZXQ7aWYocz1zLmxpc3RlbmVyLGwhPT1hJiZvLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgZTtjbShvLHMsYyksYT1sfWVsc2UgZm9yKGk9MDtpPHIubGVuZ3RoO2krKyl7aWYocz1yW2ldLGw9cy5pbnN0YW5jZSxjPXMuY3VycmVudFRhcmdldCxzPXMubGlzdGVuZXIsbCE9PWEmJm8uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBlO2NtKG8scyxjKSxhPWx9fX1pZihrcyl0aHJvdyBlPVpjLGtzPSExLFpjPW51bGwsZX1mdW5jdGlvbiBDZShlLHQpe3ZhciBuPXRbY3VdO249PT12b2lkIDAmJihuPXRbY3VdPW5ldyBTZXQpO3ZhciByPWUrIl9fYnViYmxlIjtuLmhhcyhyKXx8KExoKHQsZSwyLCExKSxuLmFkZChyKSl9ZnVuY3Rpb24gTmMoZSx0LG4pe3ZhciByPTA7dCYmKHJ8PTQpLExoKG4sZSxyLHQpfXZhciBucz0iX3JlYWN0TGlzdGVuaW5nIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiBqYShlKXtpZighZVtuc10pe2VbbnNdPSEwLEhtLmZvckVhY2goZnVuY3Rpb24obil7biE9PSJzZWxlY3Rpb25jaGFuZ2UiJiYoemsuaGFzKG4pfHxOYyhuLCExLGUpLE5jKG4sITAsZSkpfSk7dmFyIHQ9ZS5ub2RlVHlwZT09PTk/ZTplLm93bmVyRG9jdW1lbnQ7dD09PW51bGx8fHRbbnNdfHwodFtuc109ITAsTmMoInNlbGVjdGlvbmNoYW5nZSIsITEsdCkpfX1mdW5jdGlvbiBMaChlLHQsbixyKXtzd2l0Y2god2godCkpe2Nhc2UgMTp2YXIgbz1aYjticmVhaztjYXNlIDQ6bz1lazticmVhaztkZWZhdWx0Om89JHV9bj1vLmJpbmQobnVsbCx0LG4sZSksbz12b2lkIDAsIVhjfHx0IT09InRvdWNoc3RhcnQiJiZ0IT09InRvdWNobW92ZSImJnQhPT0id2hlZWwifHwobz0hMCkscj9vIT09dm9pZCAwP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4se2NhcHR1cmU6ITAscGFzc2l2ZTpvfSk6ZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCk6byE9PXZvaWQgMD9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLHtwYXNzaXZlOm99KTplLmFkZEV2ZW50TGlzdGVuZXIodCxuLCExKX1mdW5jdGlvbiBEYyhlLHQsbixyLG8pe3ZhciBhPXI7aWYoISh0JjEpJiYhKHQmMikmJnIhPT1udWxsKWU6Zm9yKDs7KXtpZihyPT09bnVsbClyZXR1cm47dmFyIGk9ci50YWc7aWYoaT09PTN8fGk9PT00KXt2YXIgcz1yLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2lmKHM9PT1vfHxzLm5vZGVUeXBlPT09OCYmcy5wYXJlbnROb2RlPT09bylicmVhaztpZihpPT09NClmb3IoaT1yLnJldHVybjtpIT09bnVsbDspe3ZhciBsPWkudGFnO2lmKChsPT09M3x8bD09PTQpJiYobD1pLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGw9PT1vfHxsLm5vZGVUeXBlPT09OCYmbC5wYXJlbnROb2RlPT09bykpcmV0dXJuO2k9aS5yZXR1cm59Zm9yKDtzIT09bnVsbDspe2lmKGk9QnIocyksaT09PW51bGwpcmV0dXJuO2lmKGw9aS50YWcsbD09PTV8fGw9PT02KXtyPWE9aTtjb250aW51ZSBlfXM9cy5wYXJlbnROb2RlfX1yPXIucmV0dXJufWFoKGZ1bmN0aW9uKCl7dmFyIGM9YSxkPUx1KG4pLHU9W107ZTp7dmFyIHA9TWguZ2V0KGUpO2lmKHAhPT12b2lkIDApe3ZhciBmPUJ1LHk9ZTtzd2l0Y2goZSl7Y2FzZSJrZXlwcmVzcyI6aWYoZHMobik9PT0wKWJyZWFrIGU7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpmPWhrO2JyZWFrO2Nhc2UiZm9jdXNpbiI6eT0iZm9jdXMiLGY9U2M7YnJlYWs7Y2FzZSJmb2N1c291dCI6eT0iYmx1ciIsZj1TYzticmVhaztjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpmPVNjO2JyZWFrO2Nhc2UiY2xpY2siOmlmKG4uYnV0dG9uPT09MilicmVhayBlO2Nhc2UiYXV4Y2xpY2siOmNhc2UiZGJsY2xpY2siOmNhc2UibW91c2Vkb3duIjpjYXNlIm1vdXNlbW92ZSI6Y2FzZSJtb3VzZXVwIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJjb250ZXh0bWVudSI6Zj1RZjticmVhaztjYXNlImRyYWciOmNhc2UiZHJhZ2VuZCI6Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2V4aXQiOmNhc2UiZHJhZ2xlYXZlIjpjYXNlImRyYWdvdmVyIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpmPXJrO2JyZWFrO2Nhc2UidG91Y2hjYW5jZWwiOmNhc2UidG91Y2hlbmQiOmNhc2UidG91Y2htb3ZlIjpjYXNlInRvdWNoc3RhcnQiOmY9dms7YnJlYWs7Y2FzZSBBaDpjYXNlIE9oOmNhc2UgSWg6Zj1pazticmVhaztjYXNlIFJoOmY9Yms7YnJlYWs7Y2FzZSJzY3JvbGwiOmY9dGs7YnJlYWs7Y2FzZSJ3aGVlbCI6Zj14azticmVhaztjYXNlImNvcHkiOmNhc2UiY3V0IjpjYXNlInBhc3RlIjpmPWxrO2JyZWFrO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOmNhc2UibG9zdHBvaW50ZXJjYXB0dXJlIjpjYXNlInBvaW50ZXJjYW5jZWwiOmNhc2UicG9pbnRlcmRvd24iOmNhc2UicG9pbnRlcm1vdmUiOmNhc2UicG9pbnRlcm91dCI6Y2FzZSJwb2ludGVyb3ZlciI6Y2FzZSJwb2ludGVydXAiOmY9WGZ9dmFyIHc9KHQmNCkhPT0wLGI9IXcmJmU9PT0ic2Nyb2xsIix2PXc/cCE9PW51bGw/cCsiQ2FwdHVyZSI6bnVsbDpwO3c9W107Zm9yKHZhciBoPWMsZztoIT09bnVsbDspe2c9aDt2YXIgbT1nLnN0YXRlTm9kZTtpZihnLnRhZz09PTUmJm0hPT1udWxsJiYoZz1tLHYhPT1udWxsJiYobT1GYShoLHYpLG0hPW51bGwmJncucHVzaChWYShoLG0sZykpKSksYilicmVhaztoPWgucmV0dXJufTA8dy5sZW5ndGgmJihwPW5ldyBmKHAseSxudWxsLG4sZCksdS5wdXNoKHtldmVudDpwLGxpc3RlbmVyczp3fSkpfX1pZighKHQmNykpe2U6e2lmKHA9ZT09PSJtb3VzZW92ZXIifHxlPT09InBvaW50ZXJvdmVyIixmPWU9PT0ibW91c2VvdXQifHxlPT09InBvaW50ZXJvdXQiLHAmJm4hPT1RYyYmKHk9bi5yZWxhdGVkVGFyZ2V0fHxuLmZyb21FbGVtZW50KSYmKEJyKHkpfHx5W0JuXSkpYnJlYWsgZTtpZigoZnx8cCkmJihwPWQud2luZG93PT09ZD9kOihwPWQub3duZXJEb2N1bWVudCk/cC5kZWZhdWx0Vmlld3x8cC5wYXJlbnRXaW5kb3c6d2luZG93LGY/KHk9bi5yZWxhdGVkVGFyZ2V0fHxuLnRvRWxlbWVudCxmPWMseT15P0JyKHkpOm51bGwseSE9PW51bGwmJihiPVpyKHkpLHkhPT1ifHx5LnRhZyE9PTUmJnkudGFnIT09NikmJih5PW51bGwpKTooZj1udWxsLHk9YyksZiE9PXkpKXtpZih3PVFmLG09Im9uTW91c2VMZWF2ZSIsdj0ib25Nb3VzZUVudGVyIixoPSJtb3VzZSIsKGU9PT0icG9pbnRlcm91dCJ8fGU9PT0icG9pbnRlcm92ZXIiKSYmKHc9WGYsbT0ib25Qb2ludGVyTGVhdmUiLHY9Im9uUG9pbnRlckVudGVyIixoPSJwb2ludGVyIiksYj1mPT1udWxsP3A6VG8oZiksZz15PT1udWxsP3A6VG8oeSkscD1uZXcgdyhtLGgrImxlYXZlIixmLG4sZCkscC50YXJnZXQ9YixwLnJlbGF0ZWRUYXJnZXQ9ZyxtPW51bGwsQnIoZCk9PT1jJiYodz1uZXcgdyh2LGgrImVudGVyIix5LG4sZCksdy50YXJnZXQ9Zyx3LnJlbGF0ZWRUYXJnZXQ9YixtPXcpLGI9bSxmJiZ5KXQ6e2Zvcih3PWYsdj15LGg9MCxnPXc7ZztnPXdvKGcpKWgrKztmb3IoZz0wLG09djttO209d28obSkpZysrO2Zvcig7MDxoLWc7KXc9d28odyksaC0tO2Zvcig7MDxnLWg7KXY9d28odiksZy0tO2Zvcig7aC0tOyl7aWYodz09PXZ8fHYhPT1udWxsJiZ3PT09di5hbHRlcm5hdGUpYnJlYWsgdDt3PXdvKHcpLHY9d28odil9dz1udWxsfWVsc2Ugdz1udWxsO2YhPT1udWxsJiZ1bSh1LHAsZix3LCExKSx5IT09bnVsbCYmYiE9PW51bGwmJnVtKHUsYix5LHcsITApfX1lOntpZihwPWM/VG8oYyk6d2luZG93LGY9cC5ub2RlTmFtZSYmcC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGY9PT0ic2VsZWN0Inx8Zj09PSJpbnB1dCImJnAudHlwZT09PSJmaWxlIil2YXIgeD1DaztlbHNlIGlmKHRtKHApKWlmKFRoKXg9Ums7ZWxzZXt4PU9rO3ZhciBTPUFrfWVsc2UoZj1wLm5vZGVOYW1lKSYmZi50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmKHAudHlwZT09PSJjaGVja2JveCJ8fHAudHlwZT09PSJyYWRpbyIpJiYoeD1Jayk7aWYoeCYmKHg9eChlLGMpKSl7RWgodSx4LG4sZCk7YnJlYWsgZX1TJiZTKGUscCxjKSxlPT09ImZvY3Vzb3V0IiYmKFM9cC5fd3JhcHBlclN0YXRlKSYmUy5jb250cm9sbGVkJiZwLnR5cGU9PT0ibnVtYmVyIiYmVmMocCwibnVtYmVyIixwLnZhbHVlKX1zd2l0Y2goUz1jP1RvKGMpOndpbmRvdyxlKXtjYXNlImZvY3VzaW4iOih0bShTKXx8Uy5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSIpJiYoU289UyxydT1jLE9hPW51bGwpO2JyZWFrO2Nhc2UiZm9jdXNvdXQiOk9hPXJ1PVNvPW51bGw7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOm91PSEwO2JyZWFrO2Nhc2UiY29udGV4dG1lbnUiOmNhc2UibW91c2V1cCI6Y2FzZSJkcmFnZW5kIjpvdT0hMSxhbSh1LG4sZCk7YnJlYWs7Y2FzZSJzZWxlY3Rpb25jaGFuZ2UiOmlmKExrKWJyZWFrO2Nhc2Uia2V5ZG93biI6Y2FzZSJrZXl1cCI6YW0odSxuLGQpfXZhciBfO2lmKGp1KWU6e3N3aXRjaChlKXtjYXNlImNvbXBvc2l0aW9uc3RhcnQiOnZhciBEPSJvbkNvbXBvc2l0aW9uU3RhcnQiO2JyZWFrIGU7Y2FzZSJjb21wb3NpdGlvbmVuZCI6RD0ib25Db21wb3NpdGlvbkVuZCI7YnJlYWsgZTtjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpEPSJvbkNvbXBvc2l0aW9uVXBkYXRlIjticmVhayBlfUQ9dm9pZCAwfWVsc2UgeG8/eGgoZSxuKSYmKEQ9Im9uQ29tcG9zaXRpb25FbmQiKTplPT09ImtleWRvd24iJiZuLmtleUNvZGU9PT0yMjkmJihEPSJvbkNvbXBvc2l0aW9uU3RhcnQiKTtEJiYoa2gmJm4ubG9jYWxlIT09ImtvIiYmKHhvfHxEIT09Im9uQ29tcG9zaXRpb25TdGFydCI/RD09PSJvbkNvbXBvc2l0aW9uRW5kIiYmeG8mJihfPWJoKCkpOih1cj1kLFd1PSJ2YWx1ZSJpbiB1cj91ci52YWx1ZTp1ci50ZXh0Q29udGVudCx4bz0hMCkpLFM9TnMoYyxEKSwwPFMubGVuZ3RoJiYoRD1uZXcgSmYoRCxlLG51bGwsbixkKSx1LnB1c2goe2V2ZW50OkQsbGlzdGVuZXJzOlN9KSxfP0QuZGF0YT1fOihfPVNoKG4pLF8hPT1udWxsJiYoRC5kYXRhPV8pKSkpLChfPUVrP1RrKGUsbik6TmsoZSxuKSkmJihjPU5zKGMsIm9uQmVmb3JlSW5wdXQiKSwwPGMubGVuZ3RoJiYoZD1uZXcgSmYoIm9uQmVmb3JlSW5wdXQiLCJiZWZvcmVpbnB1dCIsbnVsbCxuLGQpLHUucHVzaCh7ZXZlbnQ6ZCxsaXN0ZW5lcnM6Y30pLGQuZGF0YT1fKSl9UGgodSx0KX0pfWZ1bmN0aW9uIFZhKGUsdCxuKXtyZXR1cm57aW5zdGFuY2U6ZSxsaXN0ZW5lcjp0LGN1cnJlbnRUYXJnZXQ6bn19ZnVuY3Rpb24gTnMoZSx0KXtmb3IodmFyIG49dCsiQ2FwdHVyZSIscj1bXTtlIT09bnVsbDspe3ZhciBvPWUsYT1vLnN0YXRlTm9kZTtvLnRhZz09PTUmJmEhPT1udWxsJiYobz1hLGE9RmEoZSxuKSxhIT1udWxsJiZyLnVuc2hpZnQoVmEoZSxhLG8pKSxhPUZhKGUsdCksYSE9bnVsbCYmci5wdXNoKFZhKGUsYSxvKSkpLGU9ZS5yZXR1cm59cmV0dXJuIHJ9ZnVuY3Rpb24gd28oZSl7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7ZG8gZT1lLnJldHVybjt3aGlsZShlJiZlLnRhZyE9PTUpO3JldHVybiBlfHxudWxsfWZ1bmN0aW9uIHVtKGUsdCxuLHIsbyl7Zm9yKHZhciBhPXQuX3JlYWN0TmFtZSxpPVtdO24hPT1udWxsJiZuIT09cjspe3ZhciBzPW4sbD1zLmFsdGVybmF0ZSxjPXMuc3RhdGVOb2RlO2lmKGwhPT1udWxsJiZsPT09cilicmVhaztzLnRhZz09PTUmJmMhPT1udWxsJiYocz1jLG8/KGw9RmEobixhKSxsIT1udWxsJiZpLnVuc2hpZnQoVmEobixsLHMpKSk6b3x8KGw9RmEobixhKSxsIT1udWxsJiZpLnB1c2goVmEobixsLHMpKSkpLG49bi5yZXR1cm59aS5sZW5ndGghPT0wJiZlLnB1c2goe2V2ZW50OnQsbGlzdGVuZXJzOml9KX12YXIgRms9L1xyXG4/L2csVWs9L1x1MDAwMHxcdUZGRkQvZztmdW5jdGlvbiBkbShlKXtyZXR1cm4odHlwZW9mIGU9PSJzdHJpbmciP2U6IiIrZSkucmVwbGFjZShGayxgCmApLnJlcGxhY2UoVWssIiIpfWZ1bmN0aW9uIHJzKGUsdCxuKXtpZih0PWRtKHQpLGRtKGUpIT09dCYmbil0aHJvdyBFcnJvcihQKDQyNSkpfWZ1bmN0aW9uIERzKCl7fXZhciBhdT1udWxsLGl1PW51bGw7ZnVuY3Rpb24gc3UoZSx0KXtyZXR1cm4gZT09PSJ0ZXh0YXJlYSJ8fGU9PT0ibm9zY3JpcHQifHx0eXBlb2YgdC5jaGlsZHJlbj09InN0cmluZyJ8fHR5cGVvZiB0LmNoaWxkcmVuPT0ibnVtYmVyInx8dHlwZW9mIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9PSJvYmplY3QiJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT09bnVsbCYmdC5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwhPW51bGx9dmFyIGx1PXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6dm9pZCAwLCRrPXR5cGVvZiBjbGVhclRpbWVvdXQ9PSJmdW5jdGlvbiI/Y2xlYXJUaW1lb3V0OnZvaWQgMCxwbT10eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIj9Qcm9taXNlOnZvaWQgMCxXaz10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6dHlwZW9mIHBtPCJ1Ij9mdW5jdGlvbihlKXtyZXR1cm4gcG0ucmVzb2x2ZShudWxsKS50aGVuKGUpLmNhdGNoKEJrKX06bHU7ZnVuY3Rpb24gQmsoZSl7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGV9KX1mdW5jdGlvbiBfYyhlLHQpe3ZhciBuPXQscj0wO2Rve3ZhciBvPW4ubmV4dFNpYmxpbmc7aWYoZS5yZW1vdmVDaGlsZChuKSxvJiZvLm5vZGVUeXBlPT09OClpZihuPW8uZGF0YSxuPT09Ii8kIil7aWYocj09PTApe2UucmVtb3ZlQ2hpbGQobyksV2EodCk7cmV0dXJufXItLX1lbHNlIG4hPT0iJCImJm4hPT0iJD8iJiZuIT09IiQhInx8cisrO249b313aGlsZShuKTtXYSh0KX1mdW5jdGlvbiBocihlKXtmb3IoO2UhPW51bGw7ZT1lLm5leHRTaWJsaW5nKXt2YXIgdD1lLm5vZGVUeXBlO2lmKHQ9PT0xfHx0PT09MylicmVhaztpZih0PT09OCl7aWYodD1lLmRhdGEsdD09PSIkInx8dD09PSIkISJ8fHQ9PT0iJD8iKWJyZWFrO2lmKHQ9PT0iLyQiKXJldHVybiBudWxsfX1yZXR1cm4gZX1mdW5jdGlvbiBmbShlKXtlPWUucHJldmlvdXNTaWJsaW5nO2Zvcih2YXIgdD0wO2U7KXtpZihlLm5vZGVUeXBlPT09OCl7dmFyIG49ZS5kYXRhO2lmKG49PT0iJCJ8fG49PT0iJCEifHxuPT09IiQ/Iil7aWYodD09PTApcmV0dXJuIGU7dC0tfWVsc2Ugbj09PSIvJCImJnQrK31lPWUucHJldmlvdXNTaWJsaW5nfXJldHVybiBudWxsfXZhciBHbz1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxObj0iX19yZWFjdEZpYmVyJCIrR28sR2E9Il9fcmVhY3RQcm9wcyQiK0dvLEJuPSJfX3JlYWN0Q29udGFpbmVyJCIrR28sY3U9Il9fcmVhY3RFdmVudHMkIitHbyxIaz0iX19yZWFjdExpc3RlbmVycyQiK0dvLGprPSJfX3JlYWN0SGFuZGxlcyQiK0dvO2Z1bmN0aW9uIEJyKGUpe3ZhciB0PWVbTm5dO2lmKHQpcmV0dXJuIHQ7Zm9yKHZhciBuPWUucGFyZW50Tm9kZTtuOyl7aWYodD1uW0JuXXx8bltObl0pe2lmKG49dC5hbHRlcm5hdGUsdC5jaGlsZCE9PW51bGx8fG4hPT1udWxsJiZuLmNoaWxkIT09bnVsbClmb3IoZT1mbShlKTtlIT09bnVsbDspe2lmKG49ZVtObl0pcmV0dXJuIG47ZT1mbShlKX1yZXR1cm4gdH1lPW4sbj1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdGkoZSl7cmV0dXJuIGU9ZVtObl18fGVbQm5dLCFlfHxlLnRhZyE9PTUmJmUudGFnIT09NiYmZS50YWchPT0xMyYmZS50YWchPT0zP251bGw6ZX1mdW5jdGlvbiBUbyhlKXtpZihlLnRhZz09PTV8fGUudGFnPT09NilyZXR1cm4gZS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IoUCgzMykpfWZ1bmN0aW9uIEtzKGUpe3JldHVybiBlW0dhXXx8bnVsbH12YXIgdXU9W10sTm89LTE7ZnVuY3Rpb24gU3IoZSl7cmV0dXJue2N1cnJlbnQ6ZX19ZnVuY3Rpb24gQWUoZSl7MD5Ob3x8KGUuY3VycmVudD11dVtOb10sdXVbTm9dPW51bGwsTm8tLSl9ZnVuY3Rpb24gTmUoZSx0KXtObysrLHV1W05vXT1lLmN1cnJlbnQsZS5jdXJyZW50PXR9dmFyIGtyPXt9LG10PVNyKGtyKSxEdD1TcighMSksS3I9a3I7ZnVuY3Rpb24gVW8oZSx0KXt2YXIgbj1lLnR5cGUuY29udGV4dFR5cGVzO2lmKCFuKXJldHVybiBrcjt2YXIgcj1lLnN0YXRlTm9kZTtpZihyJiZyLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT10KXJldHVybiByLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBvPXt9LGE7Zm9yKGEgaW4gbilvW2FdPXRbYV07cmV0dXJuIHImJihlPWUuc3RhdGVOb2RlLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD10LGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9byksb31mdW5jdGlvbiBfdChlKXtyZXR1cm4gZT1lLmNoaWxkQ29udGV4dFR5cGVzLGUhPW51bGx9ZnVuY3Rpb24gX3MoKXtBZShEdCksQWUobXQpfWZ1bmN0aW9uIG1tKGUsdCxuKXtpZihtdC5jdXJyZW50IT09a3IpdGhyb3cgRXJyb3IoUCgxNjgpKTtOZShtdCx0KSxOZShEdCxuKX1mdW5jdGlvbiB6aChlLHQsbil7dmFyIHI9ZS5zdGF0ZU5vZGU7aWYodD10LmNoaWxkQ29udGV4dFR5cGVzLHR5cGVvZiByLmdldENoaWxkQ29udGV4dCE9ImZ1bmN0aW9uIilyZXR1cm4gbjtyPXIuZ2V0Q2hpbGRDb250ZXh0KCk7Zm9yKHZhciBvIGluIHIpaWYoIShvIGluIHQpKXRocm93IEVycm9yKFAoMTA4LEFiKGUpfHwiVW5rbm93biIsbykpO3JldHVybiBGZSh7fSxuLHIpfWZ1bmN0aW9uIENzKGUpe3JldHVybiBlPShlPWUuc3RhdGVOb2RlKSYmZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dHx8a3IsS3I9bXQuY3VycmVudCxOZShtdCxlKSxOZShEdCxEdC5jdXJyZW50KSwhMH1mdW5jdGlvbiBobShlLHQsbil7dmFyIHI9ZS5zdGF0ZU5vZGU7aWYoIXIpdGhyb3cgRXJyb3IoUCgxNjkpKTtuPyhlPXpoKGUsdCxLciksci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1lLEFlKER0KSxBZShtdCksTmUobXQsZSkpOkFlKER0KSxOZShEdCxuKX12YXIgem49bnVsbCxZcz0hMSxDYz0hMTtmdW5jdGlvbiBGaChlKXt6bj09PW51bGw/em49W2VdOnpuLnB1c2goZSl9ZnVuY3Rpb24gVmsoZSl7WXM9ITAsRmgoZSl9ZnVuY3Rpb24gRXIoKXtpZighQ2MmJnpuIT09bnVsbCl7Q2M9ITA7dmFyIGU9MCx0PXhlO3RyeXt2YXIgbj16bjtmb3IoeGU9MTtlPG4ubGVuZ3RoO2UrKyl7dmFyIHI9bltlXTtkbyByPXIoITApO3doaWxlKHIhPT1udWxsKX16bj1udWxsLFlzPSExfWNhdGNoKG8pe3Rocm93IHpuIT09bnVsbCYmKHpuPXpuLnNsaWNlKGUrMSkpLGNoKHp1LEVyKSxvfWZpbmFsbHl7eGU9dCxDYz0hMX19cmV0dXJuIG51bGx9dmFyIERvPVtdLF9vPTAsQXM9bnVsbCxPcz0wLFl0PVtdLHF0PTAsWXI9bnVsbCxGbj0xLFVuPSIiO2Z1bmN0aW9uICRyKGUsdCl7RG9bX28rK109T3MsRG9bX28rK109QXMsQXM9ZSxPcz10fWZ1bmN0aW9uIFVoKGUsdCxuKXtZdFtxdCsrXT1GbixZdFtxdCsrXT1VbixZdFtxdCsrXT1ZcixZcj1lO3ZhciByPUZuO2U9VW47dmFyIG89MzItcG4ociktMTtyJj1+KDE8PG8pLG4rPTE7dmFyIGE9MzItcG4odCkrbztpZigzMDxhKXt2YXIgaT1vLW8lNTthPShyJigxPDxpKS0xKS50b1N0cmluZygzMikscj4+PWksby09aSxGbj0xPDwzMi1wbih0KStvfG48PG98cixVbj1hK2V9ZWxzZSBGbj0xPDxhfG48PG98cixVbj1lfWZ1bmN0aW9uIEd1KGUpe2UucmV0dXJuIT09bnVsbCYmKCRyKGUsMSksVWgoZSwxLDApKX1mdW5jdGlvbiBLdShlKXtmb3IoO2U9PT1BczspQXM9RG9bLS1fb10sRG9bX29dPW51bGwsT3M9RG9bLS1fb10sRG9bX29dPW51bGw7Zm9yKDtlPT09WXI7KVlyPVl0Wy0tcXRdLFl0W3F0XT1udWxsLFVuPVl0Wy0tcXRdLFl0W3F0XT1udWxsLEZuPVl0Wy0tcXRdLFl0W3F0XT1udWxsfXZhciBGdD1udWxsLHp0PW51bGwsSWU9ITEsZG49bnVsbDtmdW5jdGlvbiAkaChlLHQpe3ZhciBuPVF0KDUsbnVsbCxudWxsLDApO24uZWxlbWVudFR5cGU9IkRFTEVURUQiLG4uc3RhdGVOb2RlPXQsbi5yZXR1cm49ZSx0PWUuZGVsZXRpb25zLHQ9PT1udWxsPyhlLmRlbGV0aW9ucz1bbl0sZS5mbGFnc3w9MTYpOnQucHVzaChuKX1mdW5jdGlvbiBnbShlLHQpe3N3aXRjaChlLnRhZyl7Y2FzZSA1OnZhciBuPWUudHlwZTtyZXR1cm4gdD10Lm5vZGVUeXBlIT09MXx8bi50b0xvd2VyQ2FzZSgpIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6dCx0IT09bnVsbD8oZS5zdGF0ZU5vZGU9dCxGdD1lLHp0PWhyKHQuZmlyc3RDaGlsZCksITApOiExO2Nhc2UgNjpyZXR1cm4gdD1lLnBlbmRpbmdQcm9wcz09PSIifHx0Lm5vZGVUeXBlIT09Mz9udWxsOnQsdCE9PW51bGw/KGUuc3RhdGVOb2RlPXQsRnQ9ZSx6dD1udWxsLCEwKTohMTtjYXNlIDEzOnJldHVybiB0PXQubm9kZVR5cGUhPT04P251bGw6dCx0IT09bnVsbD8obj1ZciE9PW51bGw/e2lkOkZuLG92ZXJmbG93OlVufTpudWxsLGUubWVtb2l6ZWRTdGF0ZT17ZGVoeWRyYXRlZDp0LHRyZWVDb250ZXh0Om4scmV0cnlMYW5lOjEwNzM3NDE4MjR9LG49UXQoMTgsbnVsbCxudWxsLDApLG4uc3RhdGVOb2RlPXQsbi5yZXR1cm49ZSxlLmNoaWxkPW4sRnQ9ZSx6dD1udWxsLCEwKTohMTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBkdShlKXtyZXR1cm4oZS5tb2RlJjEpIT09MCYmKGUuZmxhZ3MmMTI4KT09PTB9ZnVuY3Rpb24gcHUoZSl7aWYoSWUpe3ZhciB0PXp0O2lmKHQpe3ZhciBuPXQ7aWYoIWdtKGUsdCkpe2lmKGR1KGUpKXRocm93IEVycm9yKFAoNDE4KSk7dD1ocihuLm5leHRTaWJsaW5nKTt2YXIgcj1GdDt0JiZnbShlLHQpPyRoKHIsbik6KGUuZmxhZ3M9ZS5mbGFncyYtNDA5N3wyLEllPSExLEZ0PWUpfX1lbHNle2lmKGR1KGUpKXRocm93IEVycm9yKFAoNDE4KSk7ZS5mbGFncz1lLmZsYWdzJi00MDk3fDIsSWU9ITEsRnQ9ZX19fWZ1bmN0aW9uIHltKGUpe2ZvcihlPWUucmV0dXJuO2UhPT1udWxsJiZlLnRhZyE9PTUmJmUudGFnIT09MyYmZS50YWchPT0xMzspZT1lLnJldHVybjtGdD1lfWZ1bmN0aW9uIG9zKGUpe2lmKGUhPT1GdClyZXR1cm4hMTtpZighSWUpcmV0dXJuIHltKGUpLEllPSEwLCExO3ZhciB0O2lmKCh0PWUudGFnIT09MykmJiEodD1lLnRhZyE9PTUpJiYodD1lLnR5cGUsdD10IT09ImhlYWQiJiZ0IT09ImJvZHkiJiYhc3UoZS50eXBlLGUubWVtb2l6ZWRQcm9wcykpLHQmJih0PXp0KSl7aWYoZHUoZSkpdGhyb3cgV2goKSxFcnJvcihQKDQxOCkpO2Zvcig7dDspJGgoZSx0KSx0PWhyKHQubmV4dFNpYmxpbmcpfWlmKHltKGUpLGUudGFnPT09MTMpe2lmKGU9ZS5tZW1vaXplZFN0YXRlLGU9ZSE9PW51bGw/ZS5kZWh5ZHJhdGVkOm51bGwsIWUpdGhyb3cgRXJyb3IoUCgzMTcpKTtlOntmb3IoZT1lLm5leHRTaWJsaW5nLHQ9MDtlOyl7aWYoZS5ub2RlVHlwZT09PTgpe3ZhciBuPWUuZGF0YTtpZihuPT09Ii8kIil7aWYodD09PTApe3p0PWhyKGUubmV4dFNpYmxpbmcpO2JyZWFrIGV9dC0tfWVsc2UgbiE9PSIkIiYmbiE9PSIkISImJm4hPT0iJD8ifHx0Kyt9ZT1lLm5leHRTaWJsaW5nfXp0PW51bGx9fWVsc2UgenQ9RnQ/aHIoZS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9ZnVuY3Rpb24gV2goKXtmb3IodmFyIGU9enQ7ZTspZT1ocihlLm5leHRTaWJsaW5nKX1mdW5jdGlvbiAkbygpe3p0PUZ0PW51bGwsSWU9ITF9ZnVuY3Rpb24gWXUoZSl7ZG49PT1udWxsP2RuPVtlXTpkbi5wdXNoKGUpfXZhciBHaz1Wbi5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztmdW5jdGlvbiB3YShlLHQsbil7aWYoZT1uLnJlZixlIT09bnVsbCYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJnR5cGVvZiBlIT0ib2JqZWN0Iil7aWYobi5fb3duZXIpe2lmKG49bi5fb3duZXIsbil7aWYobi50YWchPT0xKXRocm93IEVycm9yKFAoMzA5KSk7dmFyIHI9bi5zdGF0ZU5vZGV9aWYoIXIpdGhyb3cgRXJyb3IoUCgxNDcsZSkpO3ZhciBvPXIsYT0iIitlO3JldHVybiB0IT09bnVsbCYmdC5yZWYhPT1udWxsJiZ0eXBlb2YgdC5yZWY9PSJmdW5jdGlvbiImJnQucmVmLl9zdHJpbmdSZWY9PT1hP3QucmVmOih0PWZ1bmN0aW9uKGkpe3ZhciBzPW8ucmVmcztpPT09bnVsbD9kZWxldGUgc1thXTpzW2FdPWl9LHQuX3N0cmluZ1JlZj1hLHQpfWlmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBFcnJvcihQKDI4NCkpO2lmKCFuLl9vd25lcil0aHJvdyBFcnJvcihQKDI5MCxlKSl9cmV0dXJuIGV9ZnVuY3Rpb24gYXMoZSx0KXt0aHJvdyBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSxFcnJvcihQKDMxLGU9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyh0KS5qb2luKCIsICIpKyJ9IjplKSl9ZnVuY3Rpb24gdm0oZSl7dmFyIHQ9ZS5faW5pdDtyZXR1cm4gdChlLl9wYXlsb2FkKX1mdW5jdGlvbiBCaChlKXtmdW5jdGlvbiB0KHYsaCl7aWYoZSl7dmFyIGc9di5kZWxldGlvbnM7Zz09PW51bGw/KHYuZGVsZXRpb25zPVtoXSx2LmZsYWdzfD0xNik6Zy5wdXNoKGgpfX1mdW5jdGlvbiBuKHYsaCl7aWYoIWUpcmV0dXJuIG51bGw7Zm9yKDtoIT09bnVsbDspdCh2LGgpLGg9aC5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIodixoKXtmb3Iodj1uZXcgTWFwO2ghPT1udWxsOyloLmtleSE9PW51bGw/di5zZXQoaC5rZXksaCk6di5zZXQoaC5pbmRleCxoKSxoPWguc2libGluZztyZXR1cm4gdn1mdW5jdGlvbiBvKHYsaCl7cmV0dXJuIHY9d3IodixoKSx2LmluZGV4PTAsdi5zaWJsaW5nPW51bGwsdn1mdW5jdGlvbiBhKHYsaCxnKXtyZXR1cm4gdi5pbmRleD1nLGU/KGc9di5hbHRlcm5hdGUsZyE9PW51bGw/KGc9Zy5pbmRleCxnPGg/KHYuZmxhZ3N8PTIsaCk6Zyk6KHYuZmxhZ3N8PTIsaCkpOih2LmZsYWdzfD0xMDQ4NTc2LGgpfWZ1bmN0aW9uIGkodil7cmV0dXJuIGUmJnYuYWx0ZXJuYXRlPT09bnVsbCYmKHYuZmxhZ3N8PTIpLHZ9ZnVuY3Rpb24gcyh2LGgsZyxtKXtyZXR1cm4gaD09PW51bGx8fGgudGFnIT09Nj8oaD1MYyhnLHYubW9kZSxtKSxoLnJldHVybj12LGgpOihoPW8oaCxnKSxoLnJldHVybj12LGgpfWZ1bmN0aW9uIGwodixoLGcsbSl7dmFyIHg9Zy50eXBlO3JldHVybiB4PT09a28/ZCh2LGgsZy5wcm9wcy5jaGlsZHJlbixtLGcua2V5KTpoIT09bnVsbCYmKGguZWxlbWVudFR5cGU9PT14fHx0eXBlb2YgeD09Im9iamVjdCImJnghPT1udWxsJiZ4LiQkdHlwZW9mPT09aXImJnZtKHgpPT09aC50eXBlKT8obT1vKGgsZy5wcm9wcyksbS5yZWY9d2EodixoLGcpLG0ucmV0dXJuPXYsbSk6KG09dnMoZy50eXBlLGcua2V5LGcucHJvcHMsbnVsbCx2Lm1vZGUsbSksbS5yZWY9d2EodixoLGcpLG0ucmV0dXJuPXYsbSl9ZnVuY3Rpb24gYyh2LGgsZyxtKXtyZXR1cm4gaD09PW51bGx8fGgudGFnIT09NHx8aC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PWcuY29udGFpbmVySW5mb3x8aC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT1nLmltcGxlbWVudGF0aW9uPyhoPXpjKGcsdi5tb2RlLG0pLGgucmV0dXJuPXYsaCk6KGg9byhoLGcuY2hpbGRyZW58fFtdKSxoLnJldHVybj12LGgpfWZ1bmN0aW9uIGQodixoLGcsbSx4KXtyZXR1cm4gaD09PW51bGx8fGgudGFnIT09Nz8oaD1HcihnLHYubW9kZSxtLHgpLGgucmV0dXJuPXYsaCk6KGg9byhoLGcpLGgucmV0dXJuPXYsaCl9ZnVuY3Rpb24gdSh2LGgsZyl7aWYodHlwZW9mIGg9PSJzdHJpbmciJiZoIT09IiJ8fHR5cGVvZiBoPT0ibnVtYmVyIilyZXR1cm4gaD1MYygiIitoLHYubW9kZSxnKSxoLnJldHVybj12LGg7aWYodHlwZW9mIGg9PSJvYmplY3QiJiZoIT09bnVsbCl7c3dpdGNoKGguJCR0eXBlb2Ype2Nhc2Ugamk6cmV0dXJuIGc9dnMoaC50eXBlLGgua2V5LGgucHJvcHMsbnVsbCx2Lm1vZGUsZyksZy5yZWY9d2EodixudWxsLGgpLGcucmV0dXJuPXYsZztjYXNlIGJvOnJldHVybiBoPXpjKGgsdi5tb2RlLGcpLGgucmV0dXJuPXYsaDtjYXNlIGlyOnZhciBtPWguX2luaXQ7cmV0dXJuIHUodixtKGguX3BheWxvYWQpLGcpfWlmKEVhKGgpfHxoYShoKSlyZXR1cm4gaD1HcihoLHYubW9kZSxnLG51bGwpLGgucmV0dXJuPXYsaDthcyh2LGgpfXJldHVybiBudWxsfWZ1bmN0aW9uIHAodixoLGcsbSl7dmFyIHg9aCE9PW51bGw/aC5rZXk6bnVsbDtpZih0eXBlb2YgZz09InN0cmluZyImJmchPT0iInx8dHlwZW9mIGc9PSJudW1iZXIiKXJldHVybiB4IT09bnVsbD9udWxsOnModixoLCIiK2csbSk7aWYodHlwZW9mIGc9PSJvYmplY3QiJiZnIT09bnVsbCl7c3dpdGNoKGcuJCR0eXBlb2Ype2Nhc2Ugamk6cmV0dXJuIGcua2V5PT09eD9sKHYsaCxnLG0pOm51bGw7Y2FzZSBibzpyZXR1cm4gZy5rZXk9PT14P2ModixoLGcsbSk6bnVsbDtjYXNlIGlyOnJldHVybiB4PWcuX2luaXQscCh2LGgseChnLl9wYXlsb2FkKSxtKX1pZihFYShnKXx8aGEoZykpcmV0dXJuIHghPT1udWxsP251bGw6ZCh2LGgsZyxtLG51bGwpO2FzKHYsZyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZih2LGgsZyxtLHgpe2lmKHR5cGVvZiBtPT0ic3RyaW5nIiYmbSE9PSIifHx0eXBlb2YgbT09Im51bWJlciIpcmV0dXJuIHY9di5nZXQoZyl8fG51bGwscyhoLHYsIiIrbSx4KTtpZih0eXBlb2YgbT09Im9iamVjdCImJm0hPT1udWxsKXtzd2l0Y2gobS4kJHR5cGVvZil7Y2FzZSBqaTpyZXR1cm4gdj12LmdldChtLmtleT09PW51bGw/ZzptLmtleSl8fG51bGwsbChoLHYsbSx4KTtjYXNlIGJvOnJldHVybiB2PXYuZ2V0KG0ua2V5PT09bnVsbD9nOm0ua2V5KXx8bnVsbCxjKGgsdixtLHgpO2Nhc2UgaXI6dmFyIFM9bS5faW5pdDtyZXR1cm4gZih2LGgsZyxTKG0uX3BheWxvYWQpLHgpfWlmKEVhKG0pfHxoYShtKSlyZXR1cm4gdj12LmdldChnKXx8bnVsbCxkKGgsdixtLHgsbnVsbCk7YXMoaCxtKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB5KHYsaCxnLG0pe2Zvcih2YXIgeD1udWxsLFM9bnVsbCxfPWgsRD1oPTAsQT1udWxsO18hPT1udWxsJiZEPGcubGVuZ3RoO0QrKyl7Xy5pbmRleD5EPyhBPV8sXz1udWxsKTpBPV8uc2libGluZzt2YXIgVD1wKHYsXyxnW0RdLG0pO2lmKFQ9PT1udWxsKXtfPT09bnVsbCYmKF89QSk7YnJlYWt9ZSYmXyYmVC5hbHRlcm5hdGU9PT1udWxsJiZ0KHYsXyksaD1hKFQsaCxEKSxTPT09bnVsbD94PVQ6Uy5zaWJsaW5nPVQsUz1ULF89QX1pZihEPT09Zy5sZW5ndGgpcmV0dXJuIG4odixfKSxJZSYmJHIodixEKSx4O2lmKF89PT1udWxsKXtmb3IoO0Q8Zy5sZW5ndGg7RCsrKV89dSh2LGdbRF0sbSksXyE9PW51bGwmJihoPWEoXyxoLEQpLFM9PT1udWxsP3g9XzpTLnNpYmxpbmc9XyxTPV8pO3JldHVybiBJZSYmJHIodixEKSx4fWZvcihfPXIodixfKTtEPGcubGVuZ3RoO0QrKylBPWYoXyx2LEQsZ1tEXSxtKSxBIT09bnVsbCYmKGUmJkEuYWx0ZXJuYXRlIT09bnVsbCYmXy5kZWxldGUoQS5rZXk9PT1udWxsP0Q6QS5rZXkpLGg9YShBLGgsRCksUz09PW51bGw/eD1BOlMuc2libGluZz1BLFM9QSk7cmV0dXJuIGUmJl8uZm9yRWFjaChmdW5jdGlvbihMKXtyZXR1cm4gdCh2LEwpfSksSWUmJiRyKHYsRCkseH1mdW5jdGlvbiB3KHYsaCxnLG0pe3ZhciB4PWhhKGcpO2lmKHR5cGVvZiB4IT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFAoMTUwKSk7aWYoZz14LmNhbGwoZyksZz09bnVsbCl0aHJvdyBFcnJvcihQKDE1MSkpO2Zvcih2YXIgUz14PW51bGwsXz1oLEQ9aD0wLEE9bnVsbCxUPWcubmV4dCgpO18hPT1udWxsJiYhVC5kb25lO0QrKyxUPWcubmV4dCgpKXtfLmluZGV4PkQ/KEE9XyxfPW51bGwpOkE9Xy5zaWJsaW5nO3ZhciBMPXAodixfLFQudmFsdWUsbSk7aWYoTD09PW51bGwpe189PT1udWxsJiYoXz1BKTticmVha31lJiZfJiZMLmFsdGVybmF0ZT09PW51bGwmJnQodixfKSxoPWEoTCxoLEQpLFM9PT1udWxsP3g9TDpTLnNpYmxpbmc9TCxTPUwsXz1BfWlmKFQuZG9uZSlyZXR1cm4gbih2LF8pLEllJiYkcih2LEQpLHg7aWYoXz09PW51bGwpe2Zvcig7IVQuZG9uZTtEKyssVD1nLm5leHQoKSlUPXUodixULnZhbHVlLG0pLFQhPT1udWxsJiYoaD1hKFQsaCxEKSxTPT09bnVsbD94PVQ6Uy5zaWJsaW5nPVQsUz1UKTtyZXR1cm4gSWUmJiRyKHYsRCkseH1mb3IoXz1yKHYsXyk7IVQuZG9uZTtEKyssVD1nLm5leHQoKSlUPWYoXyx2LEQsVC52YWx1ZSxtKSxUIT09bnVsbCYmKGUmJlQuYWx0ZXJuYXRlIT09bnVsbCYmXy5kZWxldGUoVC5rZXk9PT1udWxsP0Q6VC5rZXkpLGg9YShULGgsRCksUz09PW51bGw/eD1UOlMuc2libGluZz1ULFM9VCk7cmV0dXJuIGUmJl8uZm9yRWFjaChmdW5jdGlvbih6KXtyZXR1cm4gdCh2LHopfSksSWUmJiRyKHYsRCkseH1mdW5jdGlvbiBiKHYsaCxnLG0pe2lmKHR5cGVvZiBnPT0ib2JqZWN0IiYmZyE9PW51bGwmJmcudHlwZT09PWtvJiZnLmtleT09PW51bGwmJihnPWcucHJvcHMuY2hpbGRyZW4pLHR5cGVvZiBnPT0ib2JqZWN0IiYmZyE9PW51bGwpe3N3aXRjaChnLiQkdHlwZW9mKXtjYXNlIGppOmU6e2Zvcih2YXIgeD1nLmtleSxTPWg7UyE9PW51bGw7KXtpZihTLmtleT09PXgpe2lmKHg9Zy50eXBlLHg9PT1rbyl7aWYoUy50YWc9PT03KXtuKHYsUy5zaWJsaW5nKSxoPW8oUyxnLnByb3BzLmNoaWxkcmVuKSxoLnJldHVybj12LHY9aDticmVhayBlfX1lbHNlIGlmKFMuZWxlbWVudFR5cGU9PT14fHx0eXBlb2YgeD09Im9iamVjdCImJnghPT1udWxsJiZ4LiQkdHlwZW9mPT09aXImJnZtKHgpPT09Uy50eXBlKXtuKHYsUy5zaWJsaW5nKSxoPW8oUyxnLnByb3BzKSxoLnJlZj13YSh2LFMsZyksaC5yZXR1cm49dix2PWg7YnJlYWsgZX1uKHYsUyk7YnJlYWt9ZWxzZSB0KHYsUyk7Uz1TLnNpYmxpbmd9Zy50eXBlPT09a28/KGg9R3IoZy5wcm9wcy5jaGlsZHJlbix2Lm1vZGUsbSxnLmtleSksaC5yZXR1cm49dix2PWgpOihtPXZzKGcudHlwZSxnLmtleSxnLnByb3BzLG51bGwsdi5tb2RlLG0pLG0ucmVmPXdhKHYsaCxnKSxtLnJldHVybj12LHY9bSl9cmV0dXJuIGkodik7Y2FzZSBibzplOntmb3IoUz1nLmtleTtoIT09bnVsbDspe2lmKGgua2V5PT09UylpZihoLnRhZz09PTQmJmguc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT1nLmNvbnRhaW5lckluZm8mJmguc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09Zy5pbXBsZW1lbnRhdGlvbil7bih2LGguc2libGluZyksaD1vKGgsZy5jaGlsZHJlbnx8W10pLGgucmV0dXJuPXYsdj1oO2JyZWFrIGV9ZWxzZXtuKHYsaCk7YnJlYWt9ZWxzZSB0KHYsaCk7aD1oLnNpYmxpbmd9aD16YyhnLHYubW9kZSxtKSxoLnJldHVybj12LHY9aH1yZXR1cm4gaSh2KTtjYXNlIGlyOnJldHVybiBTPWcuX2luaXQsYih2LGgsUyhnLl9wYXlsb2FkKSxtKX1pZihFYShnKSlyZXR1cm4geSh2LGgsZyxtKTtpZihoYShnKSlyZXR1cm4gdyh2LGgsZyxtKTthcyh2LGcpfXJldHVybiB0eXBlb2YgZz09InN0cmluZyImJmchPT0iInx8dHlwZW9mIGc9PSJudW1iZXIiPyhnPSIiK2csaCE9PW51bGwmJmgudGFnPT09Nj8obih2LGguc2libGluZyksaD1vKGgsZyksaC5yZXR1cm49dix2PWgpOihuKHYsaCksaD1MYyhnLHYubW9kZSxtKSxoLnJldHVybj12LHY9aCksaSh2KSk6bih2LGgpfXJldHVybiBifXZhciBXbz1CaCghMCksSGg9QmgoITEpLElzPVNyKG51bGwpLFJzPW51bGwsQ289bnVsbCxxdT1udWxsO2Z1bmN0aW9uIFF1KCl7cXU9Q289UnM9bnVsbH1mdW5jdGlvbiBKdShlKXt2YXIgdD1Jcy5jdXJyZW50O0FlKElzKSxlLl9jdXJyZW50VmFsdWU9dH1mdW5jdGlvbiBmdShlLHQsbil7Zm9yKDtlIT09bnVsbDspe3ZhciByPWUuYWx0ZXJuYXRlO2lmKChlLmNoaWxkTGFuZXMmdCkhPT10PyhlLmNoaWxkTGFuZXN8PXQsciE9PW51bGwmJihyLmNoaWxkTGFuZXN8PXQpKTpyIT09bnVsbCYmKHIuY2hpbGRMYW5lcyZ0KSE9PXQmJihyLmNoaWxkTGFuZXN8PXQpLGU9PT1uKWJyZWFrO2U9ZS5yZXR1cm59fWZ1bmN0aW9uIExvKGUsdCl7UnM9ZSxxdT1Dbz1udWxsLGU9ZS5kZXBlbmRlbmNpZXMsZSE9PW51bGwmJmUuZmlyc3RDb250ZXh0IT09bnVsbCYmKGUubGFuZXMmdCYmKE50PSEwKSxlLmZpcnN0Q29udGV4dD1udWxsKX1mdW5jdGlvbiBYdChlKXt2YXIgdD1lLl9jdXJyZW50VmFsdWU7aWYocXUhPT1lKWlmKGU9e2NvbnRleHQ6ZSxtZW1vaXplZFZhbHVlOnQsbmV4dDpudWxsfSxDbz09PW51bGwpe2lmKFJzPT09bnVsbCl0aHJvdyBFcnJvcihQKDMwOCkpO0NvPWUsUnMuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDplfX1lbHNlIENvPUNvLm5leHQ9ZTtyZXR1cm4gdH12YXIgSHI9bnVsbDtmdW5jdGlvbiBYdShlKXtIcj09PW51bGw/SHI9W2VdOkhyLnB1c2goZSl9ZnVuY3Rpb24gamgoZSx0LG4scil7dmFyIG89dC5pbnRlcmxlYXZlZDtyZXR1cm4gbz09PW51bGw/KG4ubmV4dD1uLFh1KHQpKToobi5uZXh0PW8ubmV4dCxvLm5leHQ9biksdC5pbnRlcmxlYXZlZD1uLEhuKGUscil9ZnVuY3Rpb24gSG4oZSx0KXtlLmxhbmVzfD10O3ZhciBuPWUuYWx0ZXJuYXRlO2ZvcihuIT09bnVsbCYmKG4ubGFuZXN8PXQpLG49ZSxlPWUucmV0dXJuO2UhPT1udWxsOyllLmNoaWxkTGFuZXN8PXQsbj1lLmFsdGVybmF0ZSxuIT09bnVsbCYmKG4uY2hpbGRMYW5lc3w9dCksbj1lLGU9ZS5yZXR1cm47cmV0dXJuIG4udGFnPT09Mz9uLnN0YXRlTm9kZTpudWxsfXZhciBzcj0hMTtmdW5jdGlvbiBadShlKXtlLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6ZS5tZW1vaXplZFN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpudWxsLGxhc3RCYXNlVXBkYXRlOm51bGwsc2hhcmVkOntwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowfSxlZmZlY3RzOm51bGx9fWZ1bmN0aW9uIFZoKGUsdCl7ZT1lLnVwZGF0ZVF1ZXVlLHQudXBkYXRlUXVldWU9PT1lJiYodC51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmUuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTplLmZpcnN0QmFzZVVwZGF0ZSxsYXN0QmFzZVVwZGF0ZTplLmxhc3RCYXNlVXBkYXRlLHNoYXJlZDplLnNoYXJlZCxlZmZlY3RzOmUuZWZmZWN0c30pfWZ1bmN0aW9uICRuKGUsdCl7cmV0dXJue2V2ZW50VGltZTplLGxhbmU6dCx0YWc6MCxwYXlsb2FkOm51bGwsY2FsbGJhY2s6bnVsbCxuZXh0Om51bGx9fWZ1bmN0aW9uIGdyKGUsdCxuKXt2YXIgcj1lLnVwZGF0ZVF1ZXVlO2lmKHI9PT1udWxsKXJldHVybiBudWxsO2lmKHI9ci5zaGFyZWQsaGUmMil7dmFyIG89ci5wZW5kaW5nO3JldHVybiBvPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW8ubmV4dCxvLm5leHQ9dCksci5wZW5kaW5nPXQsSG4oZSxuKX1yZXR1cm4gbz1yLmludGVybGVhdmVkLG89PT1udWxsPyh0Lm5leHQ9dCxYdShyKSk6KHQubmV4dD1vLm5leHQsby5uZXh0PXQpLHIuaW50ZXJsZWF2ZWQ9dCxIbihlLG4pfWZ1bmN0aW9uIHBzKGUsdCxuKXtpZih0PXQudXBkYXRlUXVldWUsdCE9PW51bGwmJih0PXQuc2hhcmVkLChuJjQxOTQyNDApIT09MCkpe3ZhciByPXQubGFuZXM7ciY9ZS5wZW5kaW5nTGFuZXMsbnw9cix0LmxhbmVzPW4sRnUoZSxuKX19ZnVuY3Rpb24gd20oZSx0KXt2YXIgbj1lLnVwZGF0ZVF1ZXVlLHI9ZS5hbHRlcm5hdGU7aWYociE9PW51bGwmJihyPXIudXBkYXRlUXVldWUsbj09PXIpKXt2YXIgbz1udWxsLGE9bnVsbDtpZihuPW4uZmlyc3RCYXNlVXBkYXRlLG4hPT1udWxsKXtkb3t2YXIgaT17ZXZlbnRUaW1lOm4uZXZlbnRUaW1lLGxhbmU6bi5sYW5lLHRhZzpuLnRhZyxwYXlsb2FkOm4ucGF5bG9hZCxjYWxsYmFjazpuLmNhbGxiYWNrLG5leHQ6bnVsbH07YT09PW51bGw/bz1hPWk6YT1hLm5leHQ9aSxuPW4ubmV4dH13aGlsZShuIT09bnVsbCk7YT09PW51bGw/bz1hPXQ6YT1hLm5leHQ9dH1lbHNlIG89YT10O249e2Jhc2VTdGF0ZTpyLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6byxsYXN0QmFzZVVwZGF0ZTphLHNoYXJlZDpyLnNoYXJlZCxlZmZlY3RzOnIuZWZmZWN0c30sZS51cGRhdGVRdWV1ZT1uO3JldHVybn1lPW4ubGFzdEJhc2VVcGRhdGUsZT09PW51bGw/bi5maXJzdEJhc2VVcGRhdGU9dDplLm5leHQ9dCxuLmxhc3RCYXNlVXBkYXRlPXR9ZnVuY3Rpb24gTXMoZSx0LG4scil7dmFyIG89ZS51cGRhdGVRdWV1ZTtzcj0hMTt2YXIgYT1vLmZpcnN0QmFzZVVwZGF0ZSxpPW8ubGFzdEJhc2VVcGRhdGUscz1vLnNoYXJlZC5wZW5kaW5nO2lmKHMhPT1udWxsKXtvLnNoYXJlZC5wZW5kaW5nPW51bGw7dmFyIGw9cyxjPWwubmV4dDtsLm5leHQ9bnVsbCxpPT09bnVsbD9hPWM6aS5uZXh0PWMsaT1sO3ZhciBkPWUuYWx0ZXJuYXRlO2QhPT1udWxsJiYoZD1kLnVwZGF0ZVF1ZXVlLHM9ZC5sYXN0QmFzZVVwZGF0ZSxzIT09aSYmKHM9PT1udWxsP2QuZmlyc3RCYXNlVXBkYXRlPWM6cy5uZXh0PWMsZC5sYXN0QmFzZVVwZGF0ZT1sKSl9aWYoYSE9PW51bGwpe3ZhciB1PW8uYmFzZVN0YXRlO2k9MCxkPWM9bD1udWxsLHM9YTtkb3t2YXIgcD1zLmxhbmUsZj1zLmV2ZW50VGltZTtpZigociZwKT09PXApe2QhPT1udWxsJiYoZD1kLm5leHQ9e2V2ZW50VGltZTpmLGxhbmU6MCx0YWc6cy50YWcscGF5bG9hZDpzLnBheWxvYWQsY2FsbGJhY2s6cy5jYWxsYmFjayxuZXh0Om51bGx9KTtlOnt2YXIgeT1lLHc9cztzd2l0Y2gocD10LGY9bix3LnRhZyl7Y2FzZSAxOmlmKHk9dy5wYXlsb2FkLHR5cGVvZiB5PT0iZnVuY3Rpb24iKXt1PXkuY2FsbChmLHUscCk7YnJlYWsgZX11PXk7YnJlYWsgZTtjYXNlIDM6eS5mbGFncz15LmZsYWdzJi02NTUzN3wxMjg7Y2FzZSAwOmlmKHk9dy5wYXlsb2FkLHA9dHlwZW9mIHk9PSJmdW5jdGlvbiI/eS5jYWxsKGYsdSxwKTp5LHA9PW51bGwpYnJlYWsgZTt1PUZlKHt9LHUscCk7YnJlYWsgZTtjYXNlIDI6c3I9ITB9fXMuY2FsbGJhY2shPT1udWxsJiZzLmxhbmUhPT0wJiYoZS5mbGFnc3w9NjQscD1vLmVmZmVjdHMscD09PW51bGw/by5lZmZlY3RzPVtzXTpwLnB1c2gocykpfWVsc2UgZj17ZXZlbnRUaW1lOmYsbGFuZTpwLHRhZzpzLnRhZyxwYXlsb2FkOnMucGF5bG9hZCxjYWxsYmFjazpzLmNhbGxiYWNrLG5leHQ6bnVsbH0sZD09PW51bGw/KGM9ZD1mLGw9dSk6ZD1kLm5leHQ9ZixpfD1wO2lmKHM9cy5uZXh0LHM9PT1udWxsKXtpZihzPW8uc2hhcmVkLnBlbmRpbmcscz09PW51bGwpYnJlYWs7cD1zLHM9cC5uZXh0LHAubmV4dD1udWxsLG8ubGFzdEJhc2VVcGRhdGU9cCxvLnNoYXJlZC5wZW5kaW5nPW51bGx9fXdoaWxlKCEwKTtpZihkPT09bnVsbCYmKGw9dSksby5iYXNlU3RhdGU9bCxvLmZpcnN0QmFzZVVwZGF0ZT1jLG8ubGFzdEJhc2VVcGRhdGU9ZCx0PW8uc2hhcmVkLmludGVybGVhdmVkLHQhPT1udWxsKXtvPXQ7ZG8gaXw9by5sYW5lLG89by5uZXh0O3doaWxlKG8hPT10KX1lbHNlIGE9PT1udWxsJiYoby5zaGFyZWQubGFuZXM9MCk7UXJ8PWksZS5sYW5lcz1pLGUubWVtb2l6ZWRTdGF0ZT11fX1mdW5jdGlvbiBibShlLHQsbil7aWYoZT10LmVmZmVjdHMsdC5lZmZlY3RzPW51bGwsZSE9PW51bGwpZm9yKHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIHI9ZVt0XSxvPXIuY2FsbGJhY2s7aWYobyE9PW51bGwpe2lmKHIuY2FsbGJhY2s9bnVsbCxyPW4sdHlwZW9mIG8hPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoUCgxOTEsbykpO28uY2FsbChyKX19fXZhciBuaT17fSxfbj1TcihuaSksS2E9U3IobmkpLFlhPVNyKG5pKTtmdW5jdGlvbiBqcihlKXtpZihlPT09bmkpdGhyb3cgRXJyb3IoUCgxNzQpKTtyZXR1cm4gZX1mdW5jdGlvbiBlZChlLHQpe3N3aXRjaChOZShZYSx0KSxOZShLYSxlKSxOZShfbixuaSksZT10Lm5vZGVUeXBlLGUpe2Nhc2UgOTpjYXNlIDExOnQ9KHQ9dC5kb2N1bWVudEVsZW1lbnQpP3QubmFtZXNwYWNlVVJJOktjKG51bGwsIiIpO2JyZWFrO2RlZmF1bHQ6ZT1lPT09OD90LnBhcmVudE5vZGU6dCx0PWUubmFtZXNwYWNlVVJJfHxudWxsLGU9ZS50YWdOYW1lLHQ9S2ModCxlKX1BZShfbiksTmUoX24sdCl9ZnVuY3Rpb24gQm8oKXtBZShfbiksQWUoS2EpLEFlKFlhKX1mdW5jdGlvbiBHaChlKXtqcihZYS5jdXJyZW50KTt2YXIgdD1qcihfbi5jdXJyZW50KSxuPUtjKHQsZS50eXBlKTt0IT09biYmKE5lKEthLGUpLE5lKF9uLG4pKX1mdW5jdGlvbiB0ZChlKXtLYS5jdXJyZW50PT09ZSYmKEFlKF9uKSxBZShLYSkpfXZhciBMZT1TcigwKTtmdW5jdGlvbiBQcyhlKXtmb3IodmFyIHQ9ZTt0IT09bnVsbDspe2lmKHQudGFnPT09MTMpe3ZhciBuPXQubWVtb2l6ZWRTdGF0ZTtpZihuIT09bnVsbCYmKG49bi5kZWh5ZHJhdGVkLG49PT1udWxsfHxuLmRhdGE9PT0iJD8ifHxuLmRhdGE9PT0iJCEiKSlyZXR1cm4gdH1lbHNlIGlmKHQudGFnPT09MTkmJnQubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlciE9PXZvaWQgMCl7aWYodC5mbGFncyYxMjgpcmV0dXJuIHR9ZWxzZSBpZih0LmNoaWxkIT09bnVsbCl7dC5jaGlsZC5yZXR1cm49dCx0PXQuY2hpbGQ7Y29udGludWV9aWYodD09PWUpYnJlYWs7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHx0LnJldHVybj09PWUpcmV0dXJuIG51bGw7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfXJldHVybiBudWxsfXZhciBBYz1bXTtmdW5jdGlvbiBuZCgpe2Zvcih2YXIgZT0wO2U8QWMubGVuZ3RoO2UrKylBY1tlXS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeT1udWxsO0FjLmxlbmd0aD0wfXZhciBmcz1Wbi5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLE9jPVZuLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLHFyPTAsemU9bnVsbCxZZT1udWxsLFplPW51bGwsTHM9ITEsSWE9ITEscWE9MCxLaz0wO2Z1bmN0aW9uIGR0KCl7dGhyb3cgRXJyb3IoUCgzMjEpKX1mdW5jdGlvbiByZChlLHQpe2lmKHQ9PT1udWxsKXJldHVybiExO2Zvcih2YXIgbj0wO248dC5sZW5ndGgmJm48ZS5sZW5ndGg7bisrKWlmKCFtbihlW25dLHRbbl0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIG9kKGUsdCxuLHIsbyxhKXtpZihxcj1hLHplPXQsdC5tZW1vaXplZFN0YXRlPW51bGwsdC51cGRhdGVRdWV1ZT1udWxsLHQubGFuZXM9MCxmcy5jdXJyZW50PWU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGU9PT1udWxsP0prOlhrLGU9bihyLG8pLElhKXthPTA7ZG97aWYoSWE9ITEscWE9MCwyNTw9YSl0aHJvdyBFcnJvcihQKDMwMSkpO2ErPTEsWmU9WWU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsZnMuY3VycmVudD1aayxlPW4ocixvKX13aGlsZShJYSl9aWYoZnMuY3VycmVudD16cyx0PVllIT09bnVsbCYmWWUubmV4dCE9PW51bGwscXI9MCxaZT1ZZT16ZT1udWxsLExzPSExLHQpdGhyb3cgRXJyb3IoUCgzMDApKTtyZXR1cm4gZX1mdW5jdGlvbiBhZCgpe3ZhciBlPXFhIT09MDtyZXR1cm4gcWE9MCxlfWZ1bmN0aW9uIFRuKCl7dmFyIGU9e21lbW9pemVkU3RhdGU6bnVsbCxiYXNlU3RhdGU6bnVsbCxiYXNlUXVldWU6bnVsbCxxdWV1ZTpudWxsLG5leHQ6bnVsbH07cmV0dXJuIFplPT09bnVsbD96ZS5tZW1vaXplZFN0YXRlPVplPWU6WmU9WmUubmV4dD1lLFplfWZ1bmN0aW9uIFp0KCl7aWYoWWU9PT1udWxsKXt2YXIgZT16ZS5hbHRlcm5hdGU7ZT1lIT09bnVsbD9lLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIGU9WWUubmV4dDt2YXIgdD1aZT09PW51bGw/emUubWVtb2l6ZWRTdGF0ZTpaZS5uZXh0O2lmKHQhPT1udWxsKVplPXQsWWU9ZTtlbHNle2lmKGU9PT1udWxsKXRocm93IEVycm9yKFAoMzEwKSk7WWU9ZSxlPXttZW1vaXplZFN0YXRlOlllLm1lbW9pemVkU3RhdGUsYmFzZVN0YXRlOlllLmJhc2VTdGF0ZSxiYXNlUXVldWU6WWUuYmFzZVF1ZXVlLHF1ZXVlOlllLnF1ZXVlLG5leHQ6bnVsbH0sWmU9PT1udWxsP3plLm1lbW9pemVkU3RhdGU9WmU9ZTpaZT1aZS5uZXh0PWV9cmV0dXJuIFplfWZ1bmN0aW9uIFFhKGUsdCl7cmV0dXJuIHR5cGVvZiB0PT0iZnVuY3Rpb24iP3QoZSk6dH1mdW5jdGlvbiBJYyhlKXt2YXIgdD1adCgpLG49dC5xdWV1ZTtpZihuPT09bnVsbCl0aHJvdyBFcnJvcihQKDMxMSkpO24ubGFzdFJlbmRlcmVkUmVkdWNlcj1lO3ZhciByPVllLG89ci5iYXNlUXVldWUsYT1uLnBlbmRpbmc7aWYoYSE9PW51bGwpe2lmKG8hPT1udWxsKXt2YXIgaT1vLm5leHQ7by5uZXh0PWEubmV4dCxhLm5leHQ9aX1yLmJhc2VRdWV1ZT1vPWEsbi5wZW5kaW5nPW51bGx9aWYobyE9PW51bGwpe2E9by5uZXh0LHI9ci5iYXNlU3RhdGU7dmFyIHM9aT1udWxsLGw9bnVsbCxjPWE7ZG97dmFyIGQ9Yy5sYW5lO2lmKChxciZkKT09PWQpbCE9PW51bGwmJihsPWwubmV4dD17bGFuZTowLGFjdGlvbjpjLmFjdGlvbixoYXNFYWdlclN0YXRlOmMuaGFzRWFnZXJTdGF0ZSxlYWdlclN0YXRlOmMuZWFnZXJTdGF0ZSxuZXh0Om51bGx9KSxyPWMuaGFzRWFnZXJTdGF0ZT9jLmVhZ2VyU3RhdGU6ZShyLGMuYWN0aW9uKTtlbHNle3ZhciB1PXtsYW5lOmQsYWN0aW9uOmMuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6Yy5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6Yy5lYWdlclN0YXRlLG5leHQ6bnVsbH07bD09PW51bGw/KHM9bD11LGk9cik6bD1sLm5leHQ9dSx6ZS5sYW5lc3w9ZCxRcnw9ZH1jPWMubmV4dH13aGlsZShjIT09bnVsbCYmYyE9PWEpO2w9PT1udWxsP2k9cjpsLm5leHQ9cyxtbihyLHQubWVtb2l6ZWRTdGF0ZSl8fChOdD0hMCksdC5tZW1vaXplZFN0YXRlPXIsdC5iYXNlU3RhdGU9aSx0LmJhc2VRdWV1ZT1sLG4ubGFzdFJlbmRlcmVkU3RhdGU9cn1pZihlPW4uaW50ZXJsZWF2ZWQsZSE9PW51bGwpe289ZTtkbyBhPW8ubGFuZSx6ZS5sYW5lc3w9YSxRcnw9YSxvPW8ubmV4dDt3aGlsZShvIT09ZSl9ZWxzZSBvPT09bnVsbCYmKG4ubGFuZXM9MCk7cmV0dXJuW3QubWVtb2l6ZWRTdGF0ZSxuLmRpc3BhdGNoXX1mdW5jdGlvbiBSYyhlKXt2YXIgdD1adCgpLG49dC5xdWV1ZTtpZihuPT09bnVsbCl0aHJvdyBFcnJvcihQKDMxMSkpO24ubGFzdFJlbmRlcmVkUmVkdWNlcj1lO3ZhciByPW4uZGlzcGF0Y2gsbz1uLnBlbmRpbmcsYT10Lm1lbW9pemVkU3RhdGU7aWYobyE9PW51bGwpe24ucGVuZGluZz1udWxsO3ZhciBpPW89by5uZXh0O2RvIGE9ZShhLGkuYWN0aW9uKSxpPWkubmV4dDt3aGlsZShpIT09byk7bW4oYSx0Lm1lbW9pemVkU3RhdGUpfHwoTnQ9ITApLHQubWVtb2l6ZWRTdGF0ZT1hLHQuYmFzZVF1ZXVlPT09bnVsbCYmKHQuYmFzZVN0YXRlPWEpLG4ubGFzdFJlbmRlcmVkU3RhdGU9YX1yZXR1cm5bYSxyXX1mdW5jdGlvbiBLaCgpe31mdW5jdGlvbiBZaChlLHQpe3ZhciBuPXplLHI9WnQoKSxvPXQoKSxhPSFtbihyLm1lbW9pemVkU3RhdGUsbyk7aWYoYSYmKHIubWVtb2l6ZWRTdGF0ZT1vLE50PSEwKSxyPXIucXVldWUsaWQoSmguYmluZChudWxsLG4scixlKSxbZV0pLHIuZ2V0U25hcHNob3QhPT10fHxhfHxaZSE9PW51bGwmJlplLm1lbW9pemVkU3RhdGUudGFnJjEpe2lmKG4uZmxhZ3N8PTIwNDgsSmEoOSxRaC5iaW5kKG51bGwsbixyLG8sdCksdm9pZCAwLG51bGwpLGV0PT09bnVsbCl0aHJvdyBFcnJvcihQKDM0OSkpO3FyJjMwfHxxaChuLHQsbyl9cmV0dXJuIG99ZnVuY3Rpb24gcWgoZSx0LG4pe2UuZmxhZ3N8PTE2Mzg0LGU9e2dldFNuYXBzaG90OnQsdmFsdWU6bn0sdD16ZS51cGRhdGVRdWV1ZSx0PT09bnVsbD8odD17bGFzdEVmZmVjdDpudWxsLHN0b3JlczpudWxsfSx6ZS51cGRhdGVRdWV1ZT10LHQuc3RvcmVzPVtlXSk6KG49dC5zdG9yZXMsbj09PW51bGw/dC5zdG9yZXM9W2VdOm4ucHVzaChlKSl9ZnVuY3Rpb24gUWgoZSx0LG4scil7dC52YWx1ZT1uLHQuZ2V0U25hcHNob3Q9cixYaCh0KSYmWmgoZSl9ZnVuY3Rpb24gSmgoZSx0LG4pe3JldHVybiBuKGZ1bmN0aW9uKCl7WGgodCkmJlpoKGUpfSl9ZnVuY3Rpb24gWGgoZSl7dmFyIHQ9ZS5nZXRTbmFwc2hvdDtlPWUudmFsdWU7dHJ5e3ZhciBuPXQoKTtyZXR1cm4hbW4oZSxuKX1jYXRjaHtyZXR1cm4hMH19ZnVuY3Rpb24gWmgoZSl7dmFyIHQ9SG4oZSwxKTt0IT09bnVsbCYmZm4odCxlLDEsLTEpfWZ1bmN0aW9uIGttKGUpe3ZhciB0PVRuKCk7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iJiYoZT1lKCkpLHQubWVtb2l6ZWRTdGF0ZT10LmJhc2VTdGF0ZT1lLGU9e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjAsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOlFhLGxhc3RSZW5kZXJlZFN0YXRlOmV9LHQucXVldWU9ZSxlPWUuZGlzcGF0Y2g9UWsuYmluZChudWxsLHplLGUpLFt0Lm1lbW9pemVkU3RhdGUsZV19ZnVuY3Rpb24gSmEoZSx0LG4scil7cmV0dXJuIGU9e3RhZzplLGNyZWF0ZTp0LGRlc3Ryb3k6bixkZXBzOnIsbmV4dDpudWxsfSx0PXplLnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LHplLnVwZGF0ZVF1ZXVlPXQsdC5sYXN0RWZmZWN0PWUubmV4dD1lKToobj10Lmxhc3RFZmZlY3Qsbj09PW51bGw/dC5sYXN0RWZmZWN0PWUubmV4dD1lOihyPW4ubmV4dCxuLm5leHQ9ZSxlLm5leHQ9cix0Lmxhc3RFZmZlY3Q9ZSkpLGV9ZnVuY3Rpb24gZWcoKXtyZXR1cm4gWnQoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIG1zKGUsdCxuLHIpe3ZhciBvPVRuKCk7emUuZmxhZ3N8PWUsby5tZW1vaXplZFN0YXRlPUphKDF8dCxuLHZvaWQgMCxyPT09dm9pZCAwP251bGw6cil9ZnVuY3Rpb24gcXMoZSx0LG4scil7dmFyIG89WnQoKTtyPXI9PT12b2lkIDA/bnVsbDpyO3ZhciBhPXZvaWQgMDtpZihZZSE9PW51bGwpe3ZhciBpPVllLm1lbW9pemVkU3RhdGU7aWYoYT1pLmRlc3Ryb3ksciE9PW51bGwmJnJkKHIsaS5kZXBzKSl7by5tZW1vaXplZFN0YXRlPUphKHQsbixhLHIpO3JldHVybn19emUuZmxhZ3N8PWUsby5tZW1vaXplZFN0YXRlPUphKDF8dCxuLGEscil9ZnVuY3Rpb24geG0oZSx0KXtyZXR1cm4gbXMoODM5MDY1Niw4LGUsdCl9ZnVuY3Rpb24gaWQoZSx0KXtyZXR1cm4gcXMoMjA0OCw4LGUsdCl9ZnVuY3Rpb24gdGcoZSx0KXtyZXR1cm4gcXMoNCwyLGUsdCl9ZnVuY3Rpb24gbmcoZSx0KXtyZXR1cm4gcXMoNCw0LGUsdCl9ZnVuY3Rpb24gcmcoZSx0KXtpZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gZT1lKCksdChlKSxmdW5jdGlvbigpe3QobnVsbCl9O2lmKHQhPW51bGwpcmV0dXJuIGU9ZSgpLHQuY3VycmVudD1lLGZ1bmN0aW9uKCl7dC5jdXJyZW50PW51bGx9fWZ1bmN0aW9uIG9nKGUsdCxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFtlXSk6bnVsbCxxcyg0LDQscmcuYmluZChudWxsLHQsZSksbil9ZnVuY3Rpb24gc2QoKXt9ZnVuY3Rpb24gYWcoZSx0KXt2YXIgbj1adCgpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmdCE9PW51bGwmJnJkKHQsclsxXSk/clswXToobi5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIGlnKGUsdCl7dmFyIG49WnQoKTt0PXQ9PT12b2lkIDA/bnVsbDp0O3ZhciByPW4ubWVtb2l6ZWRTdGF0ZTtyZXR1cm4gciE9PW51bGwmJnQhPT1udWxsJiZyZCh0LHJbMV0pP3JbMF06KGU9ZSgpLG4ubWVtb2l6ZWRTdGF0ZT1bZSx0XSxlKX1mdW5jdGlvbiBzZyhlLHQsbil7cmV0dXJuIHFyJjIxPyhtbihuLHQpfHwobj1waCgpLHplLmxhbmVzfD1uLFFyfD1uLGUuYmFzZVN0YXRlPSEwKSx0KTooZS5iYXNlU3RhdGUmJihlLmJhc2VTdGF0ZT0hMSxOdD0hMCksZS5tZW1vaXplZFN0YXRlPW4pfWZ1bmN0aW9uIFlrKGUsdCl7dmFyIG49eGU7eGU9biE9PTAmJjQ+bj9uOjQsZSghMCk7dmFyIHI9T2MudHJhbnNpdGlvbjtPYy50cmFuc2l0aW9uPXt9O3RyeXtlKCExKSx0KCl9ZmluYWxseXt4ZT1uLE9jLnRyYW5zaXRpb249cn19ZnVuY3Rpb24gbGcoKXtyZXR1cm4gWnQoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIHFrKGUsdCxuKXt2YXIgcj12cihlKTtpZihuPXtsYW5lOnIsYWN0aW9uOm4saGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfSxjZyhlKSl1Zyh0LG4pO2Vsc2UgaWYobj1qaChlLHQsbixyKSxuIT09bnVsbCl7dmFyIG89dnQoKTtmbihuLGUscixvKSxkZyhuLHQscil9fWZ1bmN0aW9uIFFrKGUsdCxuKXt2YXIgcj12cihlKSxvPXtsYW5lOnIsYWN0aW9uOm4saGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfTtpZihjZyhlKSl1Zyh0LG8pO2Vsc2V7dmFyIGE9ZS5hbHRlcm5hdGU7aWYoZS5sYW5lcz09PTAmJihhPT09bnVsbHx8YS5sYW5lcz09PTApJiYoYT10Lmxhc3RSZW5kZXJlZFJlZHVjZXIsYSE9PW51bGwpKXRyeXt2YXIgaT10Lmxhc3RSZW5kZXJlZFN0YXRlLHM9YShpLG4pO2lmKG8uaGFzRWFnZXJTdGF0ZT0hMCxvLmVhZ2VyU3RhdGU9cyxtbihzLGkpKXt2YXIgbD10LmludGVybGVhdmVkO2w9PT1udWxsPyhvLm5leHQ9byxYdSh0KSk6KG8ubmV4dD1sLm5leHQsbC5uZXh0PW8pLHQuaW50ZXJsZWF2ZWQ9bztyZXR1cm59fWNhdGNoe31maW5hbGx5e31uPWpoKGUsdCxvLHIpLG4hPT1udWxsJiYobz12dCgpLGZuKG4sZSxyLG8pLGRnKG4sdCxyKSl9fWZ1bmN0aW9uIGNnKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO3JldHVybiBlPT09emV8fHQhPT1udWxsJiZ0PT09emV9ZnVuY3Rpb24gdWcoZSx0KXtJYT1Mcz0hMDt2YXIgbj1lLnBlbmRpbmc7bj09PW51bGw/dC5uZXh0PXQ6KHQubmV4dD1uLm5leHQsbi5uZXh0PXQpLGUucGVuZGluZz10fWZ1bmN0aW9uIGRnKGUsdCxuKXtpZihuJjQxOTQyNDApe3ZhciByPXQubGFuZXM7ciY9ZS5wZW5kaW5nTGFuZXMsbnw9cix0LmxhbmVzPW4sRnUoZSxuKX19dmFyIHpzPXtyZWFkQ29udGV4dDpYdCx1c2VDYWxsYmFjazpkdCx1c2VDb250ZXh0OmR0LHVzZUVmZmVjdDpkdCx1c2VJbXBlcmF0aXZlSGFuZGxlOmR0LHVzZUluc2VydGlvbkVmZmVjdDpkdCx1c2VMYXlvdXRFZmZlY3Q6ZHQsdXNlTWVtbzpkdCx1c2VSZWR1Y2VyOmR0LHVzZVJlZjpkdCx1c2VTdGF0ZTpkdCx1c2VEZWJ1Z1ZhbHVlOmR0LHVzZURlZmVycmVkVmFsdWU6ZHQsdXNlVHJhbnNpdGlvbjpkdCx1c2VNdXRhYmxlU291cmNlOmR0LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmR0LHVzZUlkOmR0LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sSms9e3JlYWRDb250ZXh0Olh0LHVzZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFRuKCkubWVtb2l6ZWRTdGF0ZT1bZSx0PT09dm9pZCAwP251bGw6dF0sZX0sdXNlQ29udGV4dDpYdCx1c2VFZmZlY3Q6eG0sdXNlSW1wZXJhdGl2ZUhhbmRsZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG49biE9bnVsbD9uLmNvbmNhdChbZV0pOm51bGwsbXMoNDE5NDMwOCw0LHJnLmJpbmQobnVsbCx0LGUpLG4pfSx1c2VMYXlvdXRFZmZlY3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbXMoNDE5NDMwOCw0LGUsdCl9LHVzZUluc2VydGlvbkVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBtcyg0LDIsZSx0KX0sdXNlTWVtbzpmdW5jdGlvbihlLHQpe3ZhciBuPVRuKCk7cmV0dXJuIHQ9dD09PXZvaWQgMD9udWxsOnQsZT1lKCksbi5tZW1vaXplZFN0YXRlPVtlLHRdLGV9LHVzZVJlZHVjZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVRuKCk7cmV0dXJuIHQ9biE9PXZvaWQgMD9uKHQpOnQsci5tZW1vaXplZFN0YXRlPXIuYmFzZVN0YXRlPXQsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6ZSxsYXN0UmVuZGVyZWRTdGF0ZTp0fSxyLnF1ZXVlPWUsZT1lLmRpc3BhdGNoPXFrLmJpbmQobnVsbCx6ZSxlKSxbci5tZW1vaXplZFN0YXRlLGVdfSx1c2VSZWY6ZnVuY3Rpb24oZSl7dmFyIHQ9VG4oKTtyZXR1cm4gZT17Y3VycmVudDplfSx0Lm1lbW9pemVkU3RhdGU9ZX0sdXNlU3RhdGU6a20sdXNlRGVidWdWYWx1ZTpzZCx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBUbigpLm1lbW9pemVkU3RhdGU9ZX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPWttKCExKSx0PWVbMF07cmV0dXJuIGU9WWsuYmluZChudWxsLGVbMV0pLFRuKCkubWVtb2l6ZWRTdGF0ZT1lLFt0LGVdfSx1c2VNdXRhYmxlU291cmNlOmZ1bmN0aW9uKCl7fSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9emUsbz1UbigpO2lmKEllKXtpZihuPT09dm9pZCAwKXRocm93IEVycm9yKFAoNDA3KSk7bj1uKCl9ZWxzZXtpZihuPXQoKSxldD09PW51bGwpdGhyb3cgRXJyb3IoUCgzNDkpKTtxciYzMHx8cWgocix0LG4pfW8ubWVtb2l6ZWRTdGF0ZT1uO3ZhciBhPXt2YWx1ZTpuLGdldFNuYXBzaG90OnR9O3JldHVybiBvLnF1ZXVlPWEseG0oSmguYmluZChudWxsLHIsYSxlKSxbZV0pLHIuZmxhZ3N8PTIwNDgsSmEoOSxRaC5iaW5kKG51bGwscixhLG4sdCksdm9pZCAwLG51bGwpLG59LHVzZUlkOmZ1bmN0aW9uKCl7dmFyIGU9VG4oKSx0PWV0LmlkZW50aWZpZXJQcmVmaXg7aWYoSWUpe3ZhciBuPVVuLHI9Rm47bj0ociZ+KDE8PDMyLXBuKHIpLTEpKS50b1N0cmluZygzMikrbix0PSI6Iit0KyJSIituLG49cWErKywwPG4mJih0Kz0iSCIrbi50b1N0cmluZygzMikpLHQrPSI6In1lbHNlIG49S2srKyx0PSI6Iit0KyJyIituLnRvU3RyaW5nKDMyKSsiOiI7cmV0dXJuIGUubWVtb2l6ZWRTdGF0ZT10fSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LFhrPXtyZWFkQ29udGV4dDpYdCx1c2VDYWxsYmFjazphZyx1c2VDb250ZXh0Olh0LHVzZUVmZmVjdDppZCx1c2VJbXBlcmF0aXZlSGFuZGxlOm9nLHVzZUluc2VydGlvbkVmZmVjdDp0Zyx1c2VMYXlvdXRFZmZlY3Q6bmcsdXNlTWVtbzppZyx1c2VSZWR1Y2VyOkljLHVzZVJlZjplZyx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBJYyhRYSl9LHVzZURlYnVnVmFsdWU6c2QsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1adCgpO3JldHVybiBzZyh0LFllLm1lbW9pemVkU3RhdGUsZSl9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgZT1JYyhRYSlbMF0sdD1adCgpLm1lbW9pemVkU3RhdGU7cmV0dXJuW2UsdF19LHVzZU11dGFibGVTb3VyY2U6S2gsdXNlU3luY0V4dGVybmFsU3RvcmU6WWgsdXNlSWQ6bGcsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxaaz17cmVhZENvbnRleHQ6WHQsdXNlQ2FsbGJhY2s6YWcsdXNlQ29udGV4dDpYdCx1c2VFZmZlY3Q6aWQsdXNlSW1wZXJhdGl2ZUhhbmRsZTpvZyx1c2VJbnNlcnRpb25FZmZlY3Q6dGcsdXNlTGF5b3V0RWZmZWN0Om5nLHVzZU1lbW86aWcsdXNlUmVkdWNlcjpSYyx1c2VSZWY6ZWcsdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gUmMoUWEpfSx1c2VEZWJ1Z1ZhbHVlOnNkLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9WnQoKTtyZXR1cm4gWWU9PT1udWxsP3QubWVtb2l6ZWRTdGF0ZT1lOnNnKHQsWWUubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPVJjKFFhKVswXSx0PVp0KCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpLaCx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpZaCx1c2VJZDpsZyx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9O2Z1bmN0aW9uIGNuKGUsdCl7aWYoZSYmZS5kZWZhdWx0UHJvcHMpe3Q9RmUoe30sdCksZT1lLmRlZmF1bHRQcm9wcztmb3IodmFyIG4gaW4gZSl0W25dPT09dm9pZCAwJiYodFtuXT1lW25dKTtyZXR1cm4gdH1yZXR1cm4gdH1mdW5jdGlvbiBtdShlLHQsbixyKXt0PWUubWVtb2l6ZWRTdGF0ZSxuPW4ocix0KSxuPW49PW51bGw/dDpGZSh7fSx0LG4pLGUubWVtb2l6ZWRTdGF0ZT1uLGUubGFuZXM9PT0wJiYoZS51cGRhdGVRdWV1ZS5iYXNlU3RhdGU9bil9dmFyIFFzPXtpc01vdW50ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuKGU9ZS5fcmVhY3RJbnRlcm5hbHMpP1pyKGUpPT09ZTohMX0sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGUsdCxuKXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciByPXZ0KCksbz12cihlKSxhPSRuKHIsbyk7YS5wYXlsb2FkPXQsbiE9bnVsbCYmKGEuY2FsbGJhY2s9biksdD1ncihlLGEsbyksdCE9PW51bGwmJihmbih0LGUsbyxyKSxwcyh0LGUsbykpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGUsdCxuKXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciByPXZ0KCksbz12cihlKSxhPSRuKHIsbyk7YS50YWc9MSxhLnBheWxvYWQ9dCxuIT1udWxsJiYoYS5jYWxsYmFjaz1uKSx0PWdyKGUsYSxvKSx0IT09bnVsbCYmKGZuKHQsZSxvLHIpLHBzKHQsZSxvKSl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihlLHQpe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIG49dnQoKSxyPXZyKGUpLG89JG4obixyKTtvLnRhZz0yLHQhPW51bGwmJihvLmNhbGxiYWNrPXQpLHQ9Z3IoZSxvLHIpLHQhPT1udWxsJiYoZm4odCxlLHIsbikscHModCxlLHIpKX19O2Z1bmN0aW9uIFNtKGUsdCxuLHIsbyxhLGkpe3JldHVybiBlPWUuc3RhdGVOb2RlLHR5cGVvZiBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT09ImZ1bmN0aW9uIj9lLnNob3VsZENvbXBvbmVudFVwZGF0ZShyLGEsaSk6dC5wcm90b3R5cGUmJnQucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50PyFIYShuLHIpfHwhSGEobyxhKTohMH1mdW5jdGlvbiBwZyhlLHQsbil7dmFyIHI9ITEsbz1rcixhPXQuY29udGV4dFR5cGU7cmV0dXJuIHR5cGVvZiBhPT0ib2JqZWN0IiYmYSE9PW51bGw/YT1YdChhKToobz1fdCh0KT9LcjptdC5jdXJyZW50LHI9dC5jb250ZXh0VHlwZXMsYT0ocj1yIT1udWxsKT9VbyhlLG8pOmtyKSx0PW5ldyB0KG4sYSksZS5tZW1vaXplZFN0YXRlPXQuc3RhdGUhPT1udWxsJiZ0LnN0YXRlIT09dm9pZCAwP3Quc3RhdGU6bnVsbCx0LnVwZGF0ZXI9UXMsZS5zdGF0ZU5vZGU9dCx0Ll9yZWFjdEludGVybmFscz1lLHImJihlPWUuc3RhdGVOb2RlLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD1vLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9YSksdH1mdW5jdGlvbiBFbShlLHQsbixyKXtlPXQuc3RhdGUsdHlwZW9mIHQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcz09ImZ1bmN0aW9uIiYmdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG4sciksdHlwZW9mIHQuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM9PSJmdW5jdGlvbiImJnQuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobixyKSx0LnN0YXRlIT09ZSYmUXMuZW5xdWV1ZVJlcGxhY2VTdGF0ZSh0LHQuc3RhdGUsbnVsbCl9ZnVuY3Rpb24gaHUoZSx0LG4scil7dmFyIG89ZS5zdGF0ZU5vZGU7by5wcm9wcz1uLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlLG8ucmVmcz17fSxadShlKTt2YXIgYT10LmNvbnRleHRUeXBlO3R5cGVvZiBhPT0ib2JqZWN0IiYmYSE9PW51bGw/by5jb250ZXh0PVh0KGEpOihhPV90KHQpP0tyOm10LmN1cnJlbnQsby5jb250ZXh0PVVvKGUsYSkpLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlLGE9dC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsdHlwZW9mIGE9PSJmdW5jdGlvbiImJihtdShlLHQsYSxuKSxvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSksdHlwZW9mIHQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzPT0iZnVuY3Rpb24ifHx0eXBlb2Ygby5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uInx8dHlwZW9mIG8uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uIiYmdHlwZW9mIG8uY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24ifHwodD1vLnN0YXRlLHR5cGVvZiBvLmNvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmby5jb21wb25lbnRXaWxsTW91bnQoKSx0eXBlb2Ygby5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSx0IT09by5zdGF0ZSYmUXMuZW5xdWV1ZVJlcGxhY2VTdGF0ZShvLG8uc3RhdGUsbnVsbCksTXMoZSxuLG8sciksby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUpLHR5cGVvZiBvLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYoZS5mbGFnc3w9NDE5NDMwOCl9ZnVuY3Rpb24gSG8oZSx0KXt0cnl7dmFyIG49IiIscj10O2RvIG4rPUNiKHIpLHI9ci5yZXR1cm47d2hpbGUocik7dmFyIG89bn1jYXRjaChhKXtvPWAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCthLm1lc3NhZ2UrYApgK2Euc3RhY2t9cmV0dXJue3ZhbHVlOmUsc291cmNlOnQsc3RhY2s6byxkaWdlc3Q6bnVsbH19ZnVuY3Rpb24gTWMoZSx0LG4pe3JldHVybnt2YWx1ZTplLHNvdXJjZTpudWxsLHN0YWNrOm4/P251bGwsZGlnZXN0OnQ/P251bGx9fWZ1bmN0aW9uIGd1KGUsdCl7dHJ5e2NvbnNvbGUuZXJyb3IodC52YWx1ZSl9Y2F0Y2gobil7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX19dmFyIGV4PXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIGZnKGUsdCxuKXtuPSRuKC0xLG4pLG4udGFnPTMsbi5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciByPXQudmFsdWU7cmV0dXJuIG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtVc3x8KFVzPSEwLE51PXIpLGd1KGUsdCl9LG59ZnVuY3Rpb24gbWcoZSx0LG4pe249JG4oLTEsbiksbi50YWc9Mzt2YXIgcj1lLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgbz10LnZhbHVlO24ucGF5bG9hZD1mdW5jdGlvbigpe3JldHVybiByKG8pfSxuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7Z3UoZSx0KX19dmFyIGE9ZS5zdGF0ZU5vZGU7cmV0dXJuIGEhPT1udWxsJiZ0eXBlb2YgYS5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtndShlLHQpLHR5cGVvZiByIT0iZnVuY3Rpb24iJiYoeXI9PT1udWxsP3lyPW5ldyBTZXQoW3RoaXNdKTp5ci5hZGQodGhpcykpO3ZhciBpPXQuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaCh0LnZhbHVlLHtjb21wb25lbnRTdGFjazppIT09bnVsbD9pOiIifSl9KSxufWZ1bmN0aW9uIFRtKGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtpZihyPT09bnVsbCl7cj1lLnBpbmdDYWNoZT1uZXcgZXg7dmFyIG89bmV3IFNldDtyLnNldCh0LG8pfWVsc2Ugbz1yLmdldCh0KSxvPT09dm9pZCAwJiYobz1uZXcgU2V0LHIuc2V0KHQsbykpO28uaGFzKG4pfHwoby5hZGQobiksZT1teC5iaW5kKG51bGwsZSx0LG4pLHQudGhlbihlLGUpKX1mdW5jdGlvbiBObShlKXtkb3t2YXIgdDtpZigodD1lLnRhZz09PTEzKSYmKHQ9ZS5tZW1vaXplZFN0YXRlLHQ9dCE9PW51bGw/dC5kZWh5ZHJhdGVkIT09bnVsbDohMCksdClyZXR1cm4gZTtlPWUucmV0dXJufXdoaWxlKGUhPT1udWxsKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBEbShlLHQsbixyLG8pe3JldHVybiBlLm1vZGUmMT8oZS5mbGFnc3w9NjU1MzYsZS5sYW5lcz1vLGUpOihlPT09dD9lLmZsYWdzfD02NTUzNjooZS5mbGFnc3w9MTI4LG4uZmxhZ3N8PTEzMTA3MixuLmZsYWdzJj0tNTI4MDUsbi50YWc9PT0xJiYobi5hbHRlcm5hdGU9PT1udWxsP24udGFnPTE3Oih0PSRuKC0xLDEpLHQudGFnPTIsZ3Iobix0LDEpKSksbi5sYW5lc3w9MSksZSl9dmFyIHR4PVZuLlJlYWN0Q3VycmVudE93bmVyLE50PSExO2Z1bmN0aW9uIHl0KGUsdCxuLHIpe3QuY2hpbGQ9ZT09PW51bGw/SGgodCxudWxsLG4scik6V28odCxlLmNoaWxkLG4scil9ZnVuY3Rpb24gX20oZSx0LG4scixvKXtuPW4ucmVuZGVyO3ZhciBhPXQucmVmO3JldHVybiBMbyh0LG8pLHI9b2QoZSx0LG4scixhLG8pLG49YWQoKSxlIT09bnVsbCYmIU50Pyh0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fm8sam4oZSx0LG8pKTooSWUmJm4mJkd1KHQpLHQuZmxhZ3N8PTEseXQoZSx0LHIsbyksdC5jaGlsZCl9ZnVuY3Rpb24gQ20oZSx0LG4scixvKXtpZihlPT09bnVsbCl7dmFyIGE9bi50eXBlO3JldHVybiB0eXBlb2YgYT09ImZ1bmN0aW9uIiYmIWhkKGEpJiZhLmRlZmF1bHRQcm9wcz09PXZvaWQgMCYmbi5jb21wYXJlPT09bnVsbCYmbi5kZWZhdWx0UHJvcHM9PT12b2lkIDA/KHQudGFnPTE1LHQudHlwZT1hLGhnKGUsdCxhLHIsbykpOihlPXZzKG4udHlwZSxudWxsLHIsdCx0Lm1vZGUsbyksZS5yZWY9dC5yZWYsZS5yZXR1cm49dCx0LmNoaWxkPWUpfWlmKGE9ZS5jaGlsZCwhKGUubGFuZXMmbykpe3ZhciBpPWEubWVtb2l6ZWRQcm9wcztpZihuPW4uY29tcGFyZSxuPW4hPT1udWxsP246SGEsbihpLHIpJiZlLnJlZj09PXQucmVmKXJldHVybiBqbihlLHQsbyl9cmV0dXJuIHQuZmxhZ3N8PTEsZT13cihhLHIpLGUucmVmPXQucmVmLGUucmV0dXJuPXQsdC5jaGlsZD1lfWZ1bmN0aW9uIGhnKGUsdCxuLHIsbyl7aWYoZSE9PW51bGwpe3ZhciBhPWUubWVtb2l6ZWRQcm9wcztpZihIYShhLHIpJiZlLnJlZj09PXQucmVmKWlmKE50PSExLHQucGVuZGluZ1Byb3BzPXI9YSwoZS5sYW5lcyZvKSE9PTApZS5mbGFncyYxMzEwNzImJihOdD0hMCk7ZWxzZSByZXR1cm4gdC5sYW5lcz1lLmxhbmVzLGpuKGUsdCxvKX1yZXR1cm4geXUoZSx0LG4scixvKX1mdW5jdGlvbiBnZyhlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHMsbz1yLmNoaWxkcmVuLGE9ZSE9PW51bGw/ZS5tZW1vaXplZFN0YXRlOm51bGw7aWYoci5tb2RlPT09ImhpZGRlbiIpaWYoISh0Lm1vZGUmMSkpdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxOZShPbyxMdCksTHR8PW47ZWxzZXtpZighKG4mMTA3Mzc0MTgyNCkpcmV0dXJuIGU9YSE9PW51bGw/YS5iYXNlTGFuZXN8bjpuLHQubGFuZXM9dC5jaGlsZExhbmVzPTEwNzM3NDE4MjQsdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6ZSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSx0LnVwZGF0ZVF1ZXVlPW51bGwsTmUoT28sTHQpLEx0fD1lLG51bGw7dC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxyPWEhPT1udWxsP2EuYmFzZUxhbmVzOm4sTmUoT28sTHQpLEx0fD1yfWVsc2UgYSE9PW51bGw/KHI9YS5iYXNlTGFuZXN8bix0Lm1lbW9pemVkU3RhdGU9bnVsbCk6cj1uLE5lKE9vLEx0KSxMdHw9cjtyZXR1cm4geXQoZSx0LG8sbiksdC5jaGlsZH1mdW5jdGlvbiB5ZyhlLHQpe3ZhciBuPXQucmVmOyhlPT09bnVsbCYmbiE9PW51bGx8fGUhPT1udWxsJiZlLnJlZiE9PW4pJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfWZ1bmN0aW9uIHl1KGUsdCxuLHIsbyl7dmFyIGE9X3Qobik/S3I6bXQuY3VycmVudDtyZXR1cm4gYT1Vbyh0LGEpLExvKHQsbyksbj1vZChlLHQsbixyLGEsbykscj1hZCgpLGUhPT1udWxsJiYhTnQ/KHQudXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0LmZsYWdzJj0tMjA1MyxlLmxhbmVzJj1+byxqbihlLHQsbykpOihJZSYmciYmR3UodCksdC5mbGFnc3w9MSx5dChlLHQsbixvKSx0LmNoaWxkKX1mdW5jdGlvbiBBbShlLHQsbixyLG8pe2lmKF90KG4pKXt2YXIgYT0hMDtDcyh0KX1lbHNlIGE9ITE7aWYoTG8odCxvKSx0LnN0YXRlTm9kZT09PW51bGwpaHMoZSx0KSxwZyh0LG4sciksaHUodCxuLHIsbykscj0hMDtlbHNlIGlmKGU9PT1udWxsKXt2YXIgaT10LnN0YXRlTm9kZSxzPXQubWVtb2l6ZWRQcm9wcztpLnByb3BzPXM7dmFyIGw9aS5jb250ZXh0LGM9bi5jb250ZXh0VHlwZTt0eXBlb2YgYz09Im9iamVjdCImJmMhPT1udWxsP2M9WHQoYyk6KGM9X3Qobik/S3I6bXQuY3VycmVudCxjPVVvKHQsYykpO3ZhciBkPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHU9dHlwZW9mIGQ9PSJmdW5jdGlvbiJ8fHR5cGVvZiBpLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iO3V8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgaS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PXJ8fGwhPT1jKSYmRW0odCxpLHIsYyksc3I9ITE7dmFyIHA9dC5tZW1vaXplZFN0YXRlO2kuc3RhdGU9cCxNcyh0LHIsaSxvKSxsPXQubWVtb2l6ZWRTdGF0ZSxzIT09cnx8cCE9PWx8fER0LmN1cnJlbnR8fHNyPyh0eXBlb2YgZD09ImZ1bmN0aW9uIiYmKG11KHQsbixkLHIpLGw9dC5tZW1vaXplZFN0YXRlKSwocz1zcnx8U20odCxuLHMscixwLGwsYykpPyh1fHx0eXBlb2YgaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmkuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLHR5cGVvZiBpLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkpOih0eXBlb2YgaS5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpLHQubWVtb2l6ZWRQcm9wcz1yLHQubWVtb2l6ZWRTdGF0ZT1sKSxpLnByb3BzPXIsaS5zdGF0ZT1sLGkuY29udGV4dD1jLHI9cyk6KHR5cGVvZiBpLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkscj0hMSl9ZWxzZXtpPXQuc3RhdGVOb2RlLFZoKGUsdCkscz10Lm1lbW9pemVkUHJvcHMsYz10LnR5cGU9PT10LmVsZW1lbnRUeXBlP3M6Y24odC50eXBlLHMpLGkucHJvcHM9Yyx1PXQucGVuZGluZ1Byb3BzLHA9aS5jb250ZXh0LGw9bi5jb250ZXh0VHlwZSx0eXBlb2YgbD09Im9iamVjdCImJmwhPT1udWxsP2w9WHQobCk6KGw9X3Qobik/S3I6bXQuY3VycmVudCxsPVVvKHQsbCkpO3ZhciBmPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhkPXR5cGVvZiBmPT0iZnVuY3Rpb24ifHx0eXBlb2YgaS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIil8fHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgaS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PXV8fHAhPT1sKSYmRW0odCxpLHIsbCksc3I9ITEscD10Lm1lbW9pemVkU3RhdGUsaS5zdGF0ZT1wLE1zKHQscixpLG8pO3ZhciB5PXQubWVtb2l6ZWRTdGF0ZTtzIT09dXx8cCE9PXl8fER0LmN1cnJlbnR8fHNyPyh0eXBlb2YgZj09ImZ1bmN0aW9uIiYmKG11KHQsbixmLHIpLHk9dC5tZW1vaXplZFN0YXRlKSwoYz1zcnx8U20odCxuLGMscixwLHksbCl8fCExKT8oZHx8dHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiImJnR5cGVvZiBpLmNvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgaS5jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZpLmNvbXBvbmVudFdpbGxVcGRhdGUocix5LGwpLHR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZpLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKHIseSxsKSksdHlwZW9mIGkuY29tcG9uZW50RGlkVXBkYXRlPT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NCksdHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiImJih0LmZsYWdzfD0xMDI0KSk6KHR5cGVvZiBpLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmcD09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTQpLHR5cGVvZiBpLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZwPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9MTAyNCksdC5tZW1vaXplZFByb3BzPXIsdC5tZW1vaXplZFN0YXRlPXkpLGkucHJvcHM9cixpLnN0YXRlPXksaS5jb250ZXh0PWwscj1jKToodHlwZW9mIGkuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZwPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9NCksdHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJnA9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD0xMDI0KSxyPSExKX1yZXR1cm4gdnUoZSx0LG4scixhLG8pfWZ1bmN0aW9uIHZ1KGUsdCxuLHIsbyxhKXt5ZyhlLHQpO3ZhciBpPSh0LmZsYWdzJjEyOCkhPT0wO2lmKCFyJiYhaSlyZXR1cm4gbyYmaG0odCxuLCExKSxqbihlLHQsYSk7cj10LnN0YXRlTm9kZSx0eC5jdXJyZW50PXQ7dmFyIHM9aSYmdHlwZW9mIG4uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT0iZnVuY3Rpb24iP251bGw6ci5yZW5kZXIoKTtyZXR1cm4gdC5mbGFnc3w9MSxlIT09bnVsbCYmaT8odC5jaGlsZD1Xbyh0LGUuY2hpbGQsbnVsbCxhKSx0LmNoaWxkPVdvKHQsbnVsbCxzLGEpKTp5dChlLHQscyxhKSx0Lm1lbW9pemVkU3RhdGU9ci5zdGF0ZSxvJiZobSh0LG4sITApLHQuY2hpbGR9ZnVuY3Rpb24gdmcoZSl7dmFyIHQ9ZS5zdGF0ZU5vZGU7dC5wZW5kaW5nQ29udGV4dD9tbShlLHQucGVuZGluZ0NvbnRleHQsdC5wZW5kaW5nQ29udGV4dCE9PXQuY29udGV4dCk6dC5jb250ZXh0JiZtbShlLHQuY29udGV4dCwhMSksZWQoZSx0LmNvbnRhaW5lckluZm8pfWZ1bmN0aW9uIE9tKGUsdCxuLHIsbyl7cmV0dXJuICRvKCksWXUobyksdC5mbGFnc3w9MjU2LHl0KGUsdCxuLHIpLHQuY2hpbGR9dmFyIHd1PXtkZWh5ZHJhdGVkOm51bGwsdHJlZUNvbnRleHQ6bnVsbCxyZXRyeUxhbmU6MH07ZnVuY3Rpb24gYnUoZSl7cmV0dXJue2Jhc2VMYW5lczplLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9fWZ1bmN0aW9uIHdnKGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcyxvPUxlLmN1cnJlbnQsYT0hMSxpPSh0LmZsYWdzJjEyOCkhPT0wLHM7aWYoKHM9aSl8fChzPWUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGU9PT1udWxsPyExOihvJjIpIT09MCkscz8oYT0hMCx0LmZsYWdzJj0tMTI5KTooZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiYob3w9MSksTmUoTGUsbyYxKSxlPT09bnVsbClyZXR1cm4gcHUodCksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJihlPWUuZGVoeWRyYXRlZCxlIT09bnVsbCk/KHQubW9kZSYxP2UuZGF0YT09PSIkISI/dC5sYW5lcz04OnQubGFuZXM9MTA3Mzc0MTgyNDp0LmxhbmVzPTEsbnVsbCk6KGk9ci5jaGlsZHJlbixlPXIuZmFsbGJhY2ssYT8ocj10Lm1vZGUsYT10LmNoaWxkLGk9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46aX0sIShyJjEpJiZhIT09bnVsbD8oYS5jaGlsZExhbmVzPTAsYS5wZW5kaW5nUHJvcHM9aSk6YT1acyhpLHIsMCxudWxsKSxlPUdyKGUscixuLG51bGwpLGEucmV0dXJuPXQsZS5yZXR1cm49dCxhLnNpYmxpbmc9ZSx0LmNoaWxkPWEsdC5jaGlsZC5tZW1vaXplZFN0YXRlPWJ1KG4pLHQubWVtb2l6ZWRTdGF0ZT13dSxlKTpsZCh0LGkpKTtpZihvPWUubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKHM9by5kZWh5ZHJhdGVkLHMhPT1udWxsKSlyZXR1cm4gbngoZSx0LGkscixzLG8sbik7aWYoYSl7YT1yLmZhbGxiYWNrLGk9dC5tb2RlLG89ZS5jaGlsZCxzPW8uc2libGluZzt2YXIgbD17bW9kZToiaGlkZGVuIixjaGlsZHJlbjpyLmNoaWxkcmVufTtyZXR1cm4hKGkmMSkmJnQuY2hpbGQhPT1vPyhyPXQuY2hpbGQsci5jaGlsZExhbmVzPTAsci5wZW5kaW5nUHJvcHM9bCx0LmRlbGV0aW9ucz1udWxsKToocj13cihvLGwpLHIuc3VidHJlZUZsYWdzPW8uc3VidHJlZUZsYWdzJjE0NjgwMDY0KSxzIT09bnVsbD9hPXdyKHMsYSk6KGE9R3IoYSxpLG4sbnVsbCksYS5mbGFnc3w9MiksYS5yZXR1cm49dCxyLnJldHVybj10LHIuc2libGluZz1hLHQuY2hpbGQ9cixyPWEsYT10LmNoaWxkLGk9ZS5jaGlsZC5tZW1vaXplZFN0YXRlLGk9aT09PW51bGw/YnUobik6e2Jhc2VMYW5lczppLmJhc2VMYW5lc3xuLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmkudHJhbnNpdGlvbnN9LGEubWVtb2l6ZWRTdGF0ZT1pLGEuY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMmfm4sdC5tZW1vaXplZFN0YXRlPXd1LHJ9cmV0dXJuIGE9ZS5jaGlsZCxlPWEuc2libGluZyxyPXdyKGEse21vZGU6InZpc2libGUiLGNoaWxkcmVuOnIuY2hpbGRyZW59KSwhKHQubW9kZSYxKSYmKHIubGFuZXM9biksci5yZXR1cm49dCxyLnNpYmxpbmc9bnVsbCxlIT09bnVsbCYmKG49dC5kZWxldGlvbnMsbj09PW51bGw/KHQuZGVsZXRpb25zPVtlXSx0LmZsYWdzfD0xNik6bi5wdXNoKGUpKSx0LmNoaWxkPXIsdC5tZW1vaXplZFN0YXRlPW51bGwscn1mdW5jdGlvbiBsZChlLHQpe3JldHVybiB0PVpzKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjp0fSxlLm1vZGUsMCxudWxsKSx0LnJldHVybj1lLGUuY2hpbGQ9dH1mdW5jdGlvbiBpcyhlLHQsbixyKXtyZXR1cm4gciE9PW51bGwmJll1KHIpLFdvKHQsZS5jaGlsZCxudWxsLG4pLGU9bGQodCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbiksZS5mbGFnc3w9Mix0Lm1lbW9pemVkU3RhdGU9bnVsbCxlfWZ1bmN0aW9uIG54KGUsdCxuLHIsbyxhLGkpe2lmKG4pcmV0dXJuIHQuZmxhZ3MmMjU2Pyh0LmZsYWdzJj0tMjU3LHI9TWMoRXJyb3IoUCg0MjIpKSksaXMoZSx0LGkscikpOnQubWVtb2l6ZWRTdGF0ZSE9PW51bGw/KHQuY2hpbGQ9ZS5jaGlsZCx0LmZsYWdzfD0xMjgsbnVsbCk6KGE9ci5mYWxsYmFjayxvPXQubW9kZSxyPVpzKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSxvLDAsbnVsbCksYT1HcihhLG8saSxudWxsKSxhLmZsYWdzfD0yLHIucmV0dXJuPXQsYS5yZXR1cm49dCxyLnNpYmxpbmc9YSx0LmNoaWxkPXIsdC5tb2RlJjEmJldvKHQsZS5jaGlsZCxudWxsLGkpLHQuY2hpbGQubWVtb2l6ZWRTdGF0ZT1idShpKSx0Lm1lbW9pemVkU3RhdGU9d3UsYSk7aWYoISh0Lm1vZGUmMSkpcmV0dXJuIGlzKGUsdCxpLG51bGwpO2lmKG8uZGF0YT09PSIkISIpe2lmKHI9by5uZXh0U2libGluZyYmby5uZXh0U2libGluZy5kYXRhc2V0LHIpdmFyIHM9ci5kZ3N0O3JldHVybiByPXMsYT1FcnJvcihQKDQxOSkpLHI9TWMoYSxyLHZvaWQgMCksaXMoZSx0LGkscil9aWYocz0oaSZlLmNoaWxkTGFuZXMpIT09MCxOdHx8cyl7aWYocj1ldCxyIT09bnVsbCl7c3dpdGNoKGkmLWkpe2Nhc2UgNDpvPTI7YnJlYWs7Y2FzZSAxNjpvPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0Om89MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bz0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDpvPTB9bz1vJihyLnN1c3BlbmRlZExhbmVzfGkpPzA6byxvIT09MCYmbyE9PWEucmV0cnlMYW5lJiYoYS5yZXRyeUxhbmU9byxIbihlLG8pLGZuKHIsZSxvLC0xKSl9cmV0dXJuIG1kKCkscj1NYyhFcnJvcihQKDQyMSkpKSxpcyhlLHQsaSxyKX1yZXR1cm4gby5kYXRhPT09IiQ/Ij8odC5mbGFnc3w9MTI4LHQuY2hpbGQ9ZS5jaGlsZCx0PWh4LmJpbmQobnVsbCxlKSxvLl9yZWFjdFJldHJ5PXQsbnVsbCk6KGU9YS50cmVlQ29udGV4dCx6dD1ocihvLm5leHRTaWJsaW5nKSxGdD10LEllPSEwLGRuPW51bGwsZSE9PW51bGwmJihZdFtxdCsrXT1GbixZdFtxdCsrXT1VbixZdFtxdCsrXT1ZcixGbj1lLmlkLFVuPWUub3ZlcmZsb3csWXI9dCksdD1sZCh0LHIuY2hpbGRyZW4pLHQuZmxhZ3N8PTQwOTYsdCl9ZnVuY3Rpb24gSW0oZSx0LG4pe2UubGFuZXN8PXQ7dmFyIHI9ZS5hbHRlcm5hdGU7ciE9PW51bGwmJihyLmxhbmVzfD10KSxmdShlLnJldHVybix0LG4pfWZ1bmN0aW9uIFBjKGUsdCxuLHIsbyl7dmFyIGE9ZS5tZW1vaXplZFN0YXRlO2E9PT1udWxsP2UubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6dCxyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OnIsdGFpbDpuLHRhaWxNb2RlOm99OihhLmlzQmFja3dhcmRzPXQsYS5yZW5kZXJpbmc9bnVsbCxhLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGEubGFzdD1yLGEudGFpbD1uLGEudGFpbE1vZGU9byl9ZnVuY3Rpb24gYmcoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzLG89ci5yZXZlYWxPcmRlcixhPXIudGFpbDtpZih5dChlLHQsci5jaGlsZHJlbixuKSxyPUxlLmN1cnJlbnQsciYyKXI9ciYxfDIsdC5mbGFnc3w9MTI4O2Vsc2V7aWYoZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWU6Zm9yKGU9dC5jaGlsZDtlIT09bnVsbDspe2lmKGUudGFnPT09MTMpZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmSW0oZSxuLHQpO2Vsc2UgaWYoZS50YWc9PT0xOSlJbShlLG4sdCk7ZWxzZSBpZihlLmNoaWxkIT09bnVsbCl7ZS5jaGlsZC5yZXR1cm49ZSxlPWUuY2hpbGQ7Y29udGludWV9aWYoZT09PXQpYnJlYWsgZTtmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fGUucmV0dXJuPT09dClicmVhayBlO2U9ZS5yZXR1cm59ZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZ31yJj0xfWlmKE5lKExlLHIpLCEodC5tb2RlJjEpKXQubWVtb2l6ZWRTdGF0ZT1udWxsO2Vsc2Ugc3dpdGNoKG8pe2Nhc2UiZm9yd2FyZHMiOmZvcihuPXQuY2hpbGQsbz1udWxsO24hPT1udWxsOyllPW4uYWx0ZXJuYXRlLGUhPT1udWxsJiZQcyhlKT09PW51bGwmJihvPW4pLG49bi5zaWJsaW5nO249byxuPT09bnVsbD8obz10LmNoaWxkLHQuY2hpbGQ9bnVsbCk6KG89bi5zaWJsaW5nLG4uc2libGluZz1udWxsKSxQYyh0LCExLG8sbixhKTticmVhaztjYXNlImJhY2t3YXJkcyI6Zm9yKG49bnVsbCxvPXQuY2hpbGQsdC5jaGlsZD1udWxsO28hPT1udWxsOyl7aWYoZT1vLmFsdGVybmF0ZSxlIT09bnVsbCYmUHMoZSk9PT1udWxsKXt0LmNoaWxkPW87YnJlYWt9ZT1vLnNpYmxpbmcsby5zaWJsaW5nPW4sbj1vLG89ZX1QYyh0LCEwLG4sbnVsbCxhKTticmVhaztjYXNlInRvZ2V0aGVyIjpQYyh0LCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6dC5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gaHMoZSx0KXshKHQubW9kZSYxKSYmZSE9PW51bGwmJihlLmFsdGVybmF0ZT1udWxsLHQuYWx0ZXJuYXRlPW51bGwsdC5mbGFnc3w9Mil9ZnVuY3Rpb24gam4oZSx0LG4pe2lmKGUhPT1udWxsJiYodC5kZXBlbmRlbmNpZXM9ZS5kZXBlbmRlbmNpZXMpLFFyfD10LmxhbmVzLCEobiZ0LmNoaWxkTGFuZXMpKXJldHVybiBudWxsO2lmKGUhPT1udWxsJiZ0LmNoaWxkIT09ZS5jaGlsZCl0aHJvdyBFcnJvcihQKDE1MykpO2lmKHQuY2hpbGQhPT1udWxsKXtmb3IoZT10LmNoaWxkLG49d3IoZSxlLnBlbmRpbmdQcm9wcyksdC5jaGlsZD1uLG4ucmV0dXJuPXQ7ZS5zaWJsaW5nIT09bnVsbDspZT1lLnNpYmxpbmcsbj1uLnNpYmxpbmc9d3IoZSxlLnBlbmRpbmdQcm9wcyksbi5yZXR1cm49dDtuLnNpYmxpbmc9bnVsbH1yZXR1cm4gdC5jaGlsZH1mdW5jdGlvbiByeChlLHQsbil7c3dpdGNoKHQudGFnKXtjYXNlIDM6dmcodCksJG8oKTticmVhaztjYXNlIDU6R2godCk7YnJlYWs7Y2FzZSAxOl90KHQudHlwZSkmJkNzKHQpO2JyZWFrO2Nhc2UgNDplZCh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIHI9dC50eXBlLl9jb250ZXh0LG89dC5tZW1vaXplZFByb3BzLnZhbHVlO05lKElzLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPW87YnJlYWs7Y2FzZSAxMzppZihyPXQubWVtb2l6ZWRTdGF0ZSxyIT09bnVsbClyZXR1cm4gci5kZWh5ZHJhdGVkIT09bnVsbD8oTmUoTGUsTGUuY3VycmVudCYxKSx0LmZsYWdzfD0xMjgsbnVsbCk6biZ0LmNoaWxkLmNoaWxkTGFuZXM/d2coZSx0LG4pOihOZShMZSxMZS5jdXJyZW50JjEpLGU9am4oZSx0LG4pLGUhPT1udWxsP2Uuc2libGluZzpudWxsKTtOZShMZSxMZS5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6aWYocj0obiZ0LmNoaWxkTGFuZXMpIT09MCxlLmZsYWdzJjEyOCl7aWYocilyZXR1cm4gYmcoZSx0LG4pO3QuZmxhZ3N8PTEyOH1pZihvPXQubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKG8ucmVuZGVyaW5nPW51bGwsby50YWlsPW51bGwsby5sYXN0RWZmZWN0PW51bGwpLE5lKExlLExlLmN1cnJlbnQpLHIpYnJlYWs7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiB0LmxhbmVzPTAsZ2coZSx0LG4pfXJldHVybiBqbihlLHQsbil9dmFyIGtnLGt1LHhnLFNnO2tnPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQuY2hpbGQ7biE9PW51bGw7KXtpZihuLnRhZz09PTV8fG4udGFnPT09NillLmFwcGVuZENoaWxkKG4uc3RhdGVOb2RlKTtlbHNlIGlmKG4udGFnIT09NCYmbi5jaGlsZCE9PW51bGwpe24uY2hpbGQucmV0dXJuPW4sbj1uLmNoaWxkO2NvbnRpbnVlfWlmKG49PT10KWJyZWFrO2Zvcig7bi5zaWJsaW5nPT09bnVsbDspe2lmKG4ucmV0dXJuPT09bnVsbHx8bi5yZXR1cm49PT10KXJldHVybjtuPW4ucmV0dXJufW4uc2libGluZy5yZXR1cm49bi5yZXR1cm4sbj1uLnNpYmxpbmd9fTtrdT1mdW5jdGlvbigpe307eGc9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZS5tZW1vaXplZFByb3BzO2lmKG8hPT1yKXtlPXQuc3RhdGVOb2RlLGpyKF9uLmN1cnJlbnQpO3ZhciBhPW51bGw7c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOm89SGMoZSxvKSxyPUhjKGUsciksYT1bXTticmVhaztjYXNlInNlbGVjdCI6bz1GZSh7fSxvLHt2YWx1ZTp2b2lkIDB9KSxyPUZlKHt9LHIse3ZhbHVlOnZvaWQgMH0pLGE9W107YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6bz1HYyhlLG8pLHI9R2MoZSxyKSxhPVtdO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIG8ub25DbGljayE9ImZ1bmN0aW9uIiYmdHlwZW9mIHIub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1Ecyl9WWMobixyKTt2YXIgaTtuPW51bGw7Zm9yKGMgaW4gbylpZighci5oYXNPd25Qcm9wZXJ0eShjKSYmby5oYXNPd25Qcm9wZXJ0eShjKSYmb1tjXSE9bnVsbClpZihjPT09InN0eWxlIil7dmFyIHM9b1tjXTtmb3IoaSBpbiBzKXMuaGFzT3duUHJvcGVydHkoaSkmJihufHwobj17fSksbltpXT0iIil9ZWxzZSBjIT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiYmYyE9PSJjaGlsZHJlbiImJmMhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmYyE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZjIT09ImF1dG9Gb2N1cyImJihMYS5oYXNPd25Qcm9wZXJ0eShjKT9hfHwoYT1bXSk6KGE9YXx8W10pLnB1c2goYyxudWxsKSk7Zm9yKGMgaW4gcil7dmFyIGw9cltjXTtpZihzPW8/LltjXSxyLmhhc093blByb3BlcnR5KGMpJiZsIT09cyYmKGwhPW51bGx8fHMhPW51bGwpKWlmKGM9PT0ic3R5bGUiKWlmKHMpe2ZvcihpIGluIHMpIXMuaGFzT3duUHJvcGVydHkoaSl8fGwmJmwuaGFzT3duUHJvcGVydHkoaSl8fChufHwobj17fSksbltpXT0iIik7Zm9yKGkgaW4gbClsLmhhc093blByb3BlcnR5KGkpJiZzW2ldIT09bFtpXSYmKG58fChuPXt9KSxuW2ldPWxbaV0pfWVsc2Ugbnx8KGF8fChhPVtdKSxhLnB1c2goYyxuKSksbj1sO2Vsc2UgYz09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/KGw9bD9sLl9faHRtbDp2b2lkIDAscz1zP3MuX19odG1sOnZvaWQgMCxsIT1udWxsJiZzIT09bCYmKGE9YXx8W10pLnB1c2goYyxsKSk6Yz09PSJjaGlsZHJlbiI/dHlwZW9mIGwhPSJzdHJpbmciJiZ0eXBlb2YgbCE9Im51bWJlciJ8fChhPWF8fFtdKS5wdXNoKGMsIiIrbCk6YyE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZjIT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJihMYS5oYXNPd25Qcm9wZXJ0eShjKT8obCE9bnVsbCYmYz09PSJvblNjcm9sbCImJkNlKCJzY3JvbGwiLGUpLGF8fHM9PT1sfHwoYT1bXSkpOihhPWF8fFtdKS5wdXNoKGMsbCkpfW4mJihhPWF8fFtdKS5wdXNoKCJzdHlsZSIsbik7dmFyIGM9YTsodC51cGRhdGVRdWV1ZT1jKSYmKHQuZmxhZ3N8PTQpfX07U2c9ZnVuY3Rpb24oZSx0LG4scil7biE9PXImJih0LmZsYWdzfD00KX07ZnVuY3Rpb24gYmEoZSx0KXtpZighSWUpc3dpdGNoKGUudGFpbE1vZGUpe2Nhc2UiaGlkZGVuIjp0PWUudGFpbDtmb3IodmFyIG49bnVsbDt0IT09bnVsbDspdC5hbHRlcm5hdGUhPT1udWxsJiYobj10KSx0PXQuc2libGluZztuPT09bnVsbD9lLnRhaWw9bnVsbDpuLnNpYmxpbmc9bnVsbDticmVhaztjYXNlImNvbGxhcHNlZCI6bj1lLnRhaWw7Zm9yKHZhciByPW51bGw7biE9PW51bGw7KW4uYWx0ZXJuYXRlIT09bnVsbCYmKHI9biksbj1uLnNpYmxpbmc7cj09PW51bGw/dHx8ZS50YWlsPT09bnVsbD9lLnRhaWw9bnVsbDplLnRhaWwuc2libGluZz1udWxsOnIuc2libGluZz1udWxsfX1mdW5jdGlvbiBwdChlKXt2YXIgdD1lLmFsdGVybmF0ZSE9PW51bGwmJmUuYWx0ZXJuYXRlLmNoaWxkPT09ZS5jaGlsZCxuPTAscj0wO2lmKHQpZm9yKHZhciBvPWUuY2hpbGQ7byE9PW51bGw7KW58PW8ubGFuZXN8by5jaGlsZExhbmVzLHJ8PW8uc3VidHJlZUZsYWdzJjE0NjgwMDY0LHJ8PW8uZmxhZ3MmMTQ2ODAwNjQsby5yZXR1cm49ZSxvPW8uc2libGluZztlbHNlIGZvcihvPWUuY2hpbGQ7byE9PW51bGw7KW58PW8ubGFuZXN8by5jaGlsZExhbmVzLHJ8PW8uc3VidHJlZUZsYWdzLHJ8PW8uZmxhZ3Msby5yZXR1cm49ZSxvPW8uc2libGluZztyZXR1cm4gZS5zdWJ0cmVlRmxhZ3N8PXIsZS5jaGlsZExhbmVzPW4sdH1mdW5jdGlvbiBveChlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHM7c3dpdGNoKEt1KHQpLHQudGFnKXtjYXNlIDI6Y2FzZSAxNjpjYXNlIDE1OmNhc2UgMDpjYXNlIDExOmNhc2UgNzpjYXNlIDg6Y2FzZSAxMjpjYXNlIDk6Y2FzZSAxNDpyZXR1cm4gcHQodCksbnVsbDtjYXNlIDE6cmV0dXJuIF90KHQudHlwZSkmJl9zKCkscHQodCksbnVsbDtjYXNlIDM6cmV0dXJuIHI9dC5zdGF0ZU5vZGUsQm8oKSxBZShEdCksQWUobXQpLG5kKCksci5wZW5kaW5nQ29udGV4dCYmKHIuY29udGV4dD1yLnBlbmRpbmdDb250ZXh0LHIucGVuZGluZ0NvbnRleHQ9bnVsbCksKGU9PT1udWxsfHxlLmNoaWxkPT09bnVsbCkmJihvcyh0KT90LmZsYWdzfD00OmU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYhKHQuZmxhZ3MmMjU2KXx8KHQuZmxhZ3N8PTEwMjQsZG4hPT1udWxsJiYoQ3UoZG4pLGRuPW51bGwpKSksa3UoZSx0KSxwdCh0KSxudWxsO2Nhc2UgNTp0ZCh0KTt2YXIgbz1qcihZYS5jdXJyZW50KTtpZihuPXQudHlwZSxlIT09bnVsbCYmdC5zdGF0ZU5vZGUhPW51bGwpeGcoZSx0LG4scixvKSxlLnJlZiE9PXQucmVmJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpO2Vsc2V7aWYoIXIpe2lmKHQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihQKDE2NikpO3JldHVybiBwdCh0KSxudWxsfWlmKGU9anIoX24uY3VycmVudCksb3ModCkpe3I9dC5zdGF0ZU5vZGUsbj10LnR5cGU7dmFyIGE9dC5tZW1vaXplZFByb3BzO3N3aXRjaChyW05uXT10LHJbR2FdPWEsZT0odC5tb2RlJjEpIT09MCxuKXtjYXNlImRpYWxvZyI6Q2UoImNhbmNlbCIsciksQ2UoImNsb3NlIixyKTticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOkNlKCJsb2FkIixyKTticmVhaztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjpmb3Iobz0wO288TmEubGVuZ3RoO28rKylDZShOYVtvXSxyKTticmVhaztjYXNlInNvdXJjZSI6Q2UoImVycm9yIixyKTticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpDZSgiZXJyb3IiLHIpLENlKCJsb2FkIixyKTticmVhaztjYXNlImRldGFpbHMiOkNlKCJ0b2dnbGUiLHIpO2JyZWFrO2Nhc2UiaW5wdXQiOiRmKHIsYSksQ2UoImludmFsaWQiLHIpO2JyZWFrO2Nhc2Uic2VsZWN0IjpyLl93cmFwcGVyU3RhdGU9e3dhc011bHRpcGxlOiEhYS5tdWx0aXBsZX0sQ2UoImludmFsaWQiLHIpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOkJmKHIsYSksQ2UoImludmFsaWQiLHIpfVljKG4sYSksbz1udWxsO2Zvcih2YXIgaSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBzPWFbaV07aT09PSJjaGlsZHJlbiI/dHlwZW9mIHM9PSJzdHJpbmciP3IudGV4dENvbnRlbnQhPT1zJiYoYS5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmcnMoci50ZXh0Q29udGVudCxzLGUpLG89WyJjaGlsZHJlbiIsc10pOnR5cGVvZiBzPT0ibnVtYmVyIiYmci50ZXh0Q29udGVudCE9PSIiK3MmJihhLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyE9PSEwJiZycyhyLnRleHRDb250ZW50LHMsZSksbz1bImNoaWxkcmVuIiwiIitzXSk6TGEuaGFzT3duUHJvcGVydHkoaSkmJnMhPW51bGwmJmk9PT0ib25TY3JvbGwiJiZDZSgic2Nyb2xsIixyKX1zd2l0Y2gobil7Y2FzZSJpbnB1dCI6VmkociksV2YocixhLCEwKTticmVhaztjYXNlInRleHRhcmVhIjpWaShyKSxIZihyKTticmVhaztjYXNlInNlbGVjdCI6Y2FzZSJvcHRpb24iOmJyZWFrO2RlZmF1bHQ6dHlwZW9mIGEub25DbGljaz09ImZ1bmN0aW9uIiYmKHIub25jbGljaz1Ecyl9cj1vLHQudXBkYXRlUXVldWU9cixyIT09bnVsbCYmKHQuZmxhZ3N8PTQpfWVsc2V7aT1vLm5vZGVUeXBlPT09OT9vOm8ub3duZXJEb2N1bWVudCxlPT09Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiJiYoZT1KbShuKSksZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj9uPT09InNjcmlwdCI/KGU9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxlLmlubmVySFRNTD0iPHNjcmlwdD48XC9zY3JpcHQ+IixlPWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKSk6dHlwZW9mIHIuaXM9PSJzdHJpbmciP2U9aS5jcmVhdGVFbGVtZW50KG4se2lzOnIuaXN9KTooZT1pLmNyZWF0ZUVsZW1lbnQobiksbj09PSJzZWxlY3QiJiYoaT1lLHIubXVsdGlwbGU/aS5tdWx0aXBsZT0hMDpyLnNpemUmJihpLnNpemU9ci5zaXplKSkpOmU9aS5jcmVhdGVFbGVtZW50TlMoZSxuKSxlW05uXT10LGVbR2FdPXIsa2coZSx0LCExLCExKSx0LnN0YXRlTm9kZT1lO2U6e3N3aXRjaChpPXFjKG4sciksbil7Y2FzZSJkaWFsb2ciOkNlKCJjYW5jZWwiLGUpLENlKCJjbG9zZSIsZSksbz1yO2JyZWFrO2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6Y2FzZSJlbWJlZCI6Q2UoImxvYWQiLGUpLG89cjticmVhaztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjpmb3Iobz0wO288TmEubGVuZ3RoO28rKylDZShOYVtvXSxlKTtvPXI7YnJlYWs7Y2FzZSJzb3VyY2UiOkNlKCJlcnJvciIsZSksbz1yO2JyZWFrO2Nhc2UiaW1nIjpjYXNlImltYWdlIjpjYXNlImxpbmsiOkNlKCJlcnJvciIsZSksQ2UoImxvYWQiLGUpLG89cjticmVhaztjYXNlImRldGFpbHMiOkNlKCJ0b2dnbGUiLGUpLG89cjticmVhaztjYXNlImlucHV0IjokZihlLHIpLG89SGMoZSxyKSxDZSgiaW52YWxpZCIsZSk7YnJlYWs7Y2FzZSJvcHRpb24iOm89cjticmVhaztjYXNlInNlbGVjdCI6ZS5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIXIubXVsdGlwbGV9LG89RmUoe30scix7dmFsdWU6dm9pZCAwfSksQ2UoImludmFsaWQiLGUpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOkJmKGUsciksbz1HYyhlLHIpLENlKCJpbnZhbGlkIixlKTticmVhaztkZWZhdWx0Om89cn1ZYyhuLG8pLHM9bztmb3IoYSBpbiBzKWlmKHMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBsPXNbYV07YT09PSJzdHlsZSI/ZWgoZSxsKTphPT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj8obD1sP2wuX19odG1sOnZvaWQgMCxsIT1udWxsJiZYbShlLGwpKTphPT09ImNoaWxkcmVuIj90eXBlb2YgbD09InN0cmluZyI/KG4hPT0idGV4dGFyZWEifHxsIT09IiIpJiZ6YShlLGwpOnR5cGVvZiBsPT0ibnVtYmVyIiYmemEoZSwiIitsKTphIT09InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyImJmEhPT0ic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiYmYSE9PSJhdXRvRm9jdXMiJiYoTGEuaGFzT3duUHJvcGVydHkoYSk/bCE9bnVsbCYmYT09PSJvblNjcm9sbCImJkNlKCJzY3JvbGwiLGUpOmwhPW51bGwmJkl1KGUsYSxsLGkpKX1zd2l0Y2gobil7Y2FzZSJpbnB1dCI6VmkoZSksV2YoZSxyLCExKTticmVhaztjYXNlInRleHRhcmVhIjpWaShlKSxIZihlKTticmVhaztjYXNlIm9wdGlvbiI6ci52YWx1ZSE9bnVsbCYmZS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiticihyLnZhbHVlKSk7YnJlYWs7Y2FzZSJzZWxlY3QiOmUubXVsdGlwbGU9ISFyLm11bHRpcGxlLGE9ci52YWx1ZSxhIT1udWxsP0lvKGUsISFyLm11bHRpcGxlLGEsITEpOnIuZGVmYXVsdFZhbHVlIT1udWxsJiZJbyhlLCEhci5tdWx0aXBsZSxyLmRlZmF1bHRWYWx1ZSwhMCk7YnJlYWs7ZGVmYXVsdDp0eXBlb2Ygby5vbkNsaWNrPT0iZnVuY3Rpb24iJiYoZS5vbmNsaWNrPURzKX1zd2l0Y2gobil7Y2FzZSJidXR0b24iOmNhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjpyPSEhci5hdXRvRm9jdXM7YnJlYWsgZTtjYXNlImltZyI6cj0hMDticmVhayBlO2RlZmF1bHQ6cj0hMX19ciYmKHQuZmxhZ3N8PTQpfXQucmVmIT09bnVsbCYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKX1yZXR1cm4gcHQodCksbnVsbDtjYXNlIDY6aWYoZSYmdC5zdGF0ZU5vZGUhPW51bGwpU2coZSx0LGUubWVtb2l6ZWRQcm9wcyxyKTtlbHNle2lmKHR5cGVvZiByIT0ic3RyaW5nIiYmdC5zdGF0ZU5vZGU9PT1udWxsKXRocm93IEVycm9yKFAoMTY2KSk7aWYobj1qcihZYS5jdXJyZW50KSxqcihfbi5jdXJyZW50KSxvcyh0KSl7aWYocj10LnN0YXRlTm9kZSxuPXQubWVtb2l6ZWRQcm9wcyxyW05uXT10LChhPXIubm9kZVZhbHVlIT09bikmJihlPUZ0LGUhPT1udWxsKSlzd2l0Y2goZS50YWcpe2Nhc2UgMzpycyhyLm5vZGVWYWx1ZSxuLChlLm1vZGUmMSkhPT0wKTticmVhaztjYXNlIDU6ZS5tZW1vaXplZFByb3BzLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyE9PSEwJiZycyhyLm5vZGVWYWx1ZSxuLChlLm1vZGUmMSkhPT0wKX1hJiYodC5mbGFnc3w9NCl9ZWxzZSByPShuLm5vZGVUeXBlPT09OT9uOm4ub3duZXJEb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUocikscltObl09dCx0LnN0YXRlTm9kZT1yfXJldHVybiBwdCh0KSxudWxsO2Nhc2UgMTM6aWYoQWUoTGUpLHI9dC5tZW1vaXplZFN0YXRlLGU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZCE9PW51bGwpe2lmKEllJiZ6dCE9PW51bGwmJnQubW9kZSYxJiYhKHQuZmxhZ3MmMTI4KSlXaCgpLCRvKCksdC5mbGFnc3w9OTg1NjAsYT0hMTtlbHNlIGlmKGE9b3ModCksciE9PW51bGwmJnIuZGVoeWRyYXRlZCE9PW51bGwpe2lmKGU9PT1udWxsKXtpZighYSl0aHJvdyBFcnJvcihQKDMxOCkpO2lmKGE9dC5tZW1vaXplZFN0YXRlLGE9YSE9PW51bGw/YS5kZWh5ZHJhdGVkOm51bGwsIWEpdGhyb3cgRXJyb3IoUCgzMTcpKTthW05uXT10fWVsc2UgJG8oKSwhKHQuZmxhZ3MmMTI4KSYmKHQubWVtb2l6ZWRTdGF0ZT1udWxsKSx0LmZsYWdzfD00O3B0KHQpLGE9ITF9ZWxzZSBkbiE9PW51bGwmJihDdShkbiksZG49bnVsbCksYT0hMDtpZighYSlyZXR1cm4gdC5mbGFncyY2NTUzNj90Om51bGx9cmV0dXJuIHQuZmxhZ3MmMTI4Pyh0LmxhbmVzPW4sdCk6KHI9ciE9PW51bGwsciE9PShlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlIT09bnVsbCkmJnImJih0LmNoaWxkLmZsYWdzfD04MTkyLHQubW9kZSYxJiYoZT09PW51bGx8fExlLmN1cnJlbnQmMT9xZT09PTAmJihxZT0zKTptZCgpKSksdC51cGRhdGVRdWV1ZSE9PW51bGwmJih0LmZsYWdzfD00KSxwdCh0KSxudWxsKTtjYXNlIDQ6cmV0dXJuIEJvKCksa3UoZSx0KSxlPT09bnVsbCYmamEodC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbykscHQodCksbnVsbDtjYXNlIDEwOnJldHVybiBKdSh0LnR5cGUuX2NvbnRleHQpLHB0KHQpLG51bGw7Y2FzZSAxNzpyZXR1cm4gX3QodC50eXBlKSYmX3MoKSxwdCh0KSxudWxsO2Nhc2UgMTk6aWYoQWUoTGUpLGE9dC5tZW1vaXplZFN0YXRlLGE9PT1udWxsKXJldHVybiBwdCh0KSxudWxsO2lmKHI9KHQuZmxhZ3MmMTI4KSE9PTAsaT1hLnJlbmRlcmluZyxpPT09bnVsbClpZihyKWJhKGEsITEpO2Vsc2V7aWYocWUhPT0wfHxlIT09bnVsbCYmZS5mbGFncyYxMjgpZm9yKGU9dC5jaGlsZDtlIT09bnVsbDspe2lmKGk9UHMoZSksaSE9PW51bGwpe2Zvcih0LmZsYWdzfD0xMjgsYmEoYSwhMSkscj1pLnVwZGF0ZVF1ZXVlLHIhPT1udWxsJiYodC51cGRhdGVRdWV1ZT1yLHQuZmxhZ3N8PTQpLHQuc3VidHJlZUZsYWdzPTAscj1uLG49dC5jaGlsZDtuIT09bnVsbDspYT1uLGU9cixhLmZsYWdzJj0xNDY4MDA2NixpPWEuYWx0ZXJuYXRlLGk9PT1udWxsPyhhLmNoaWxkTGFuZXM9MCxhLmxhbmVzPWUsYS5jaGlsZD1udWxsLGEuc3VidHJlZUZsYWdzPTAsYS5tZW1vaXplZFByb3BzPW51bGwsYS5tZW1vaXplZFN0YXRlPW51bGwsYS51cGRhdGVRdWV1ZT1udWxsLGEuZGVwZW5kZW5jaWVzPW51bGwsYS5zdGF0ZU5vZGU9bnVsbCk6KGEuY2hpbGRMYW5lcz1pLmNoaWxkTGFuZXMsYS5sYW5lcz1pLmxhbmVzLGEuY2hpbGQ9aS5jaGlsZCxhLnN1YnRyZWVGbGFncz0wLGEuZGVsZXRpb25zPW51bGwsYS5tZW1vaXplZFByb3BzPWkubWVtb2l6ZWRQcm9wcyxhLm1lbW9pemVkU3RhdGU9aS5tZW1vaXplZFN0YXRlLGEudXBkYXRlUXVldWU9aS51cGRhdGVRdWV1ZSxhLnR5cGU9aS50eXBlLGU9aS5kZXBlbmRlbmNpZXMsYS5kZXBlbmRlbmNpZXM9ZT09PW51bGw/bnVsbDp7bGFuZXM6ZS5sYW5lcyxmaXJzdENvbnRleHQ6ZS5maXJzdENvbnRleHR9KSxuPW4uc2libGluZztyZXR1cm4gTmUoTGUsTGUuY3VycmVudCYxfDIpLHQuY2hpbGR9ZT1lLnNpYmxpbmd9YS50YWlsIT09bnVsbCYmSGUoKT5qbyYmKHQuZmxhZ3N8PTEyOCxyPSEwLGJhKGEsITEpLHQubGFuZXM9NDE5NDMwNCl9ZWxzZXtpZighcilpZihlPVBzKGkpLGUhPT1udWxsKXtpZih0LmZsYWdzfD0xMjgscj0hMCxuPWUudXBkYXRlUXVldWUsbiE9PW51bGwmJih0LnVwZGF0ZVF1ZXVlPW4sdC5mbGFnc3w9NCksYmEoYSwhMCksYS50YWlsPT09bnVsbCYmYS50YWlsTW9kZT09PSJoaWRkZW4iJiYhaS5hbHRlcm5hdGUmJiFJZSlyZXR1cm4gcHQodCksbnVsbH1lbHNlIDIqSGUoKS1hLnJlbmRlcmluZ1N0YXJ0VGltZT5qbyYmbiE9PTEwNzM3NDE4MjQmJih0LmZsYWdzfD0xMjgscj0hMCxiYShhLCExKSx0LmxhbmVzPTQxOTQzMDQpO2EuaXNCYWNrd2FyZHM/KGkuc2libGluZz10LmNoaWxkLHQuY2hpbGQ9aSk6KG49YS5sYXN0LG4hPT1udWxsP24uc2libGluZz1pOnQuY2hpbGQ9aSxhLmxhc3Q9aSl9cmV0dXJuIGEudGFpbCE9PW51bGw/KHQ9YS50YWlsLGEucmVuZGVyaW5nPXQsYS50YWlsPXQuc2libGluZyxhLnJlbmRlcmluZ1N0YXJ0VGltZT1IZSgpLHQuc2libGluZz1udWxsLG49TGUuY3VycmVudCxOZShMZSxyP24mMXwyOm4mMSksdCk6KHB0KHQpLG51bGwpO2Nhc2UgMjI6Y2FzZSAyMzpyZXR1cm4gZmQoKSxyPXQubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZSE9PW51bGwhPT1yJiYodC5mbGFnc3w9ODE5MiksciYmdC5tb2RlJjE/THQmMTA3Mzc0MTgyNCYmKHB0KHQpLHQuc3VidHJlZUZsYWdzJjYmJih0LmZsYWdzfD04MTkyKSk6cHQodCksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2Nhc2UgMjU6cmV0dXJuIG51bGx9dGhyb3cgRXJyb3IoUCgxNTYsdC50YWcpKX1mdW5jdGlvbiBheChlLHQpe3N3aXRjaChLdSh0KSx0LnRhZyl7Y2FzZSAxOnJldHVybiBfdCh0LnR5cGUpJiZfcygpLGU9dC5mbGFncyxlJjY1NTM2Pyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMzpyZXR1cm4gQm8oKSxBZShEdCksQWUobXQpLG5kKCksZT10LmZsYWdzLGUmNjU1MzYmJiEoZSYxMjgpPyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgNTpyZXR1cm4gdGQodCksbnVsbDtjYXNlIDEzOmlmKEFlKExlKSxlPXQubWVtb2l6ZWRTdGF0ZSxlIT09bnVsbCYmZS5kZWh5ZHJhdGVkIT09bnVsbCl7aWYodC5hbHRlcm5hdGU9PT1udWxsKXRocm93IEVycm9yKFAoMzQwKSk7JG8oKX1yZXR1cm4gZT10LmZsYWdzLGUmNjU1MzY/KHQuZmxhZ3M9ZSYtNjU1Mzd8MTI4LHQpOm51bGw7Y2FzZSAxOTpyZXR1cm4gQWUoTGUpLG51bGw7Y2FzZSA0OnJldHVybiBCbygpLG51bGw7Y2FzZSAxMDpyZXR1cm4gSnUodC50eXBlLl9jb250ZXh0KSxudWxsO2Nhc2UgMjI6Y2FzZSAyMzpyZXR1cm4gZmQoKSxudWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH19dmFyIHNzPSExLGZ0PSExLGl4PXR5cGVvZiBXZWFrU2V0PT0iZnVuY3Rpb24iP1dlYWtTZXQ6U2V0LFY9bnVsbDtmdW5jdGlvbiBBbyhlLHQpe3ZhciBuPWUucmVmO2lmKG4hPT1udWxsKWlmKHR5cGVvZiBuPT0iZnVuY3Rpb24iKXRyeXtuKG51bGwpfWNhdGNoKHIpeyRlKGUsdCxyKX1lbHNlIG4uY3VycmVudD1udWxsfWZ1bmN0aW9uIHh1KGUsdCxuKXt0cnl7bigpfWNhdGNoKHIpeyRlKGUsdCxyKX19dmFyIFJtPSExO2Z1bmN0aW9uIHN4KGUsdCl7aWYoYXU9RXMsZT1faCgpLFZ1KGUpKXtpZigic2VsZWN0aW9uU3RhcnQiaW4gZSl2YXIgbj17c3RhcnQ6ZS5zZWxlY3Rpb25TdGFydCxlbmQ6ZS5zZWxlY3Rpb25FbmR9O2Vsc2UgZTp7bj0obj1lLm93bmVyRG9jdW1lbnQpJiZuLmRlZmF1bHRWaWV3fHx3aW5kb3c7dmFyIHI9bi5nZXRTZWxlY3Rpb24mJm4uZ2V0U2VsZWN0aW9uKCk7aWYociYmci5yYW5nZUNvdW50IT09MCl7bj1yLmFuY2hvck5vZGU7dmFyIG89ci5hbmNob3JPZmZzZXQsYT1yLmZvY3VzTm9kZTtyPXIuZm9jdXNPZmZzZXQ7dHJ5e24ubm9kZVR5cGUsYS5ub2RlVHlwZX1jYXRjaHtuPW51bGw7YnJlYWsgZX12YXIgaT0wLHM9LTEsbD0tMSxjPTAsZD0wLHU9ZSxwPW51bGw7dDpmb3IoOzspe2Zvcih2YXIgZjt1IT09bnx8byE9PTAmJnUubm9kZVR5cGUhPT0zfHwocz1pK28pLHUhPT1hfHxyIT09MCYmdS5ub2RlVHlwZSE9PTN8fChsPWkrciksdS5ub2RlVHlwZT09PTMmJihpKz11Lm5vZGVWYWx1ZS5sZW5ndGgpLChmPXUuZmlyc3RDaGlsZCkhPT1udWxsOylwPXUsdT1mO2Zvcig7Oyl7aWYodT09PWUpYnJlYWsgdDtpZihwPT09biYmKytjPT09byYmKHM9aSkscD09PWEmJisrZD09PXImJihsPWkpLChmPXUubmV4dFNpYmxpbmcpIT09bnVsbClicmVhazt1PXAscD11LnBhcmVudE5vZGV9dT1mfW49cz09PS0xfHxsPT09LTE/bnVsbDp7c3RhcnQ6cyxlbmQ6bH19ZWxzZSBuPW51bGx9bj1ufHx7c3RhcnQ6MCxlbmQ6MH19ZWxzZSBuPW51bGw7Zm9yKGl1PXtmb2N1c2VkRWxlbTplLHNlbGVjdGlvblJhbmdlOm59LEVzPSExLFY9dDtWIT09bnVsbDspaWYodD1WLGU9dC5jaGlsZCwodC5zdWJ0cmVlRmxhZ3MmMTAyOCkhPT0wJiZlIT09bnVsbCllLnJldHVybj10LFY9ZTtlbHNlIGZvcig7ViE9PW51bGw7KXt0PVY7dHJ5e3ZhciB5PXQuYWx0ZXJuYXRlO2lmKHQuZmxhZ3MmMTAyNClzd2l0Y2godC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6YnJlYWs7Y2FzZSAxOmlmKHkhPT1udWxsKXt2YXIgdz15Lm1lbW9pemVkUHJvcHMsYj15Lm1lbW9pemVkU3RhdGUsdj10LnN0YXRlTm9kZSxoPXYuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUodC5lbGVtZW50VHlwZT09PXQudHlwZT93OmNuKHQudHlwZSx3KSxiKTt2Ll9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlPWh9YnJlYWs7Y2FzZSAzOnZhciBnPXQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87Zy5ub2RlVHlwZT09PTE/Zy50ZXh0Q29udGVudD0iIjpnLm5vZGVUeXBlPT09OSYmZy5kb2N1bWVudEVsZW1lbnQmJmcucmVtb3ZlQ2hpbGQoZy5kb2N1bWVudEVsZW1lbnQpO2JyZWFrO2Nhc2UgNTpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihQKDE2MykpfX1jYXRjaChtKXskZSh0LHQucmV0dXJuLG0pfWlmKGU9dC5zaWJsaW5nLGUhPT1udWxsKXtlLnJldHVybj10LnJldHVybixWPWU7YnJlYWt9Vj10LnJldHVybn1yZXR1cm4geT1SbSxSbT0hMSx5fWZ1bmN0aW9uIFJhKGUsdCxuKXt2YXIgcj10LnVwZGF0ZVF1ZXVlO2lmKHI9ciE9PW51bGw/ci5sYXN0RWZmZWN0Om51bGwsciE9PW51bGwpe3ZhciBvPXI9ci5uZXh0O2Rve2lmKChvLnRhZyZlKT09PWUpe3ZhciBhPW8uZGVzdHJveTtvLmRlc3Ryb3k9dm9pZCAwLGEhPT12b2lkIDAmJnh1KHQsbixhKX1vPW8ubmV4dH13aGlsZShvIT09cil9fWZ1bmN0aW9uIEpzKGUsdCl7aWYodD10LnVwZGF0ZVF1ZXVlLHQ9dCE9PW51bGw/dC5sYXN0RWZmZWN0Om51bGwsdCE9PW51bGwpe3ZhciBuPXQ9dC5uZXh0O2Rve2lmKChuLnRhZyZlKT09PWUpe3ZhciByPW4uY3JlYXRlO24uZGVzdHJveT1yKCl9bj1uLm5leHR9d2hpbGUobiE9PXQpfX1mdW5jdGlvbiBTdShlKXt2YXIgdD1lLnJlZjtpZih0IT09bnVsbCl7dmFyIG49ZS5zdGF0ZU5vZGU7c3dpdGNoKGUudGFnKXtjYXNlIDU6ZT1uO2JyZWFrO2RlZmF1bHQ6ZT1ufXR5cGVvZiB0PT0iZnVuY3Rpb24iP3QoZSk6dC5jdXJyZW50PWV9fWZ1bmN0aW9uIEVnKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO3QhPT1udWxsJiYoZS5hbHRlcm5hdGU9bnVsbCxFZyh0KSksZS5jaGlsZD1udWxsLGUuZGVsZXRpb25zPW51bGwsZS5zaWJsaW5nPW51bGwsZS50YWc9PT01JiYodD1lLnN0YXRlTm9kZSx0IT09bnVsbCYmKGRlbGV0ZSB0W05uXSxkZWxldGUgdFtHYV0sZGVsZXRlIHRbY3VdLGRlbGV0ZSB0W0hrXSxkZWxldGUgdFtqa10pKSxlLnN0YXRlTm9kZT1udWxsLGUucmV0dXJuPW51bGwsZS5kZXBlbmRlbmNpZXM9bnVsbCxlLm1lbW9pemVkUHJvcHM9bnVsbCxlLm1lbW9pemVkU3RhdGU9bnVsbCxlLnBlbmRpbmdQcm9wcz1udWxsLGUuc3RhdGVOb2RlPW51bGwsZS51cGRhdGVRdWV1ZT1udWxsfWZ1bmN0aW9uIFRnKGUpe3JldHVybiBlLnRhZz09PTV8fGUudGFnPT09M3x8ZS50YWc9PT00fWZ1bmN0aW9uIE1tKGUpe2U6Zm9yKDs7KXtmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fFRnKGUucmV0dXJuKSlyZXR1cm4gbnVsbDtlPWUucmV0dXJufWZvcihlLnNpYmxpbmcucmV0dXJuPWUucmV0dXJuLGU9ZS5zaWJsaW5nO2UudGFnIT09NSYmZS50YWchPT02JiZlLnRhZyE9PTE4Oyl7aWYoZS5mbGFncyYyfHxlLmNoaWxkPT09bnVsbHx8ZS50YWc9PT00KWNvbnRpbnVlIGU7ZS5jaGlsZC5yZXR1cm49ZSxlPWUuY2hpbGR9aWYoIShlLmZsYWdzJjIpKXJldHVybiBlLnN0YXRlTm9kZX19ZnVuY3Rpb24gRXUoZSx0LG4pe3ZhciByPWUudGFnO2lmKHI9PT01fHxyPT09NillPWUuc3RhdGVOb2RlLHQ/bi5ub2RlVHlwZT09PTg/bi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHQpOm4uaW5zZXJ0QmVmb3JlKGUsdCk6KG4ubm9kZVR5cGU9PT04Pyh0PW4ucGFyZW50Tm9kZSx0Lmluc2VydEJlZm9yZShlLG4pKToodD1uLHQuYXBwZW5kQ2hpbGQoZSkpLG49bi5fcmVhY3RSb290Q29udGFpbmVyLG4hPW51bGx8fHQub25jbGljayE9PW51bGx8fCh0Lm9uY2xpY2s9RHMpKTtlbHNlIGlmKHIhPT00JiYoZT1lLmNoaWxkLGUhPT1udWxsKSlmb3IoRXUoZSx0LG4pLGU9ZS5zaWJsaW5nO2UhPT1udWxsOylFdShlLHQsbiksZT1lLnNpYmxpbmd9ZnVuY3Rpb24gVHUoZSx0LG4pe3ZhciByPWUudGFnO2lmKHI9PT01fHxyPT09NillPWUuc3RhdGVOb2RlLHQ/bi5pbnNlcnRCZWZvcmUoZSx0KTpuLmFwcGVuZENoaWxkKGUpO2Vsc2UgaWYociE9PTQmJihlPWUuY2hpbGQsZSE9PW51bGwpKWZvcihUdShlLHQsbiksZT1lLnNpYmxpbmc7ZSE9PW51bGw7KVR1KGUsdCxuKSxlPWUuc2libGluZ312YXIgcnQ9bnVsbCx1bj0hMTtmdW5jdGlvbiBhcihlLHQsbil7Zm9yKG49bi5jaGlsZDtuIT09bnVsbDspTmcoZSx0LG4pLG49bi5zaWJsaW5nfWZ1bmN0aW9uIE5nKGUsdCxuKXtpZihEbiYmdHlwZW9mIERuLm9uQ29tbWl0RmliZXJVbm1vdW50PT0iZnVuY3Rpb24iKXRyeXtEbi5vbkNvbW1pdEZpYmVyVW5tb3VudChIcyxuKX1jYXRjaHt9c3dpdGNoKG4udGFnKXtjYXNlIDU6ZnR8fEFvKG4sdCk7Y2FzZSA2OnZhciByPXJ0LG89dW47cnQ9bnVsbCxhcihlLHQsbikscnQ9cix1bj1vLHJ0IT09bnVsbCYmKHVuPyhlPXJ0LG49bi5zdGF0ZU5vZGUsZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pOmUucmVtb3ZlQ2hpbGQobikpOnJ0LnJlbW92ZUNoaWxkKG4uc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSAxODpydCE9PW51bGwmJih1bj8oZT1ydCxuPW4uc3RhdGVOb2RlLGUubm9kZVR5cGU9PT04P19jKGUucGFyZW50Tm9kZSxuKTplLm5vZGVUeXBlPT09MSYmX2MoZSxuKSxXYShlKSk6X2MocnQsbi5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDQ6cj1ydCxvPXVuLHJ0PW4uc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sdW49ITAsYXIoZSx0LG4pLHJ0PXIsdW49bzticmVhaztjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6aWYoIWZ0JiYocj1uLnVwZGF0ZVF1ZXVlLHIhPT1udWxsJiYocj1yLmxhc3RFZmZlY3QsciE9PW51bGwpKSl7bz1yPXIubmV4dDtkb3t2YXIgYT1vLGk9YS5kZXN0cm95O2E9YS50YWcsaSE9PXZvaWQgMCYmKGEmMnx8YSY0KSYmeHUobix0LGkpLG89by5uZXh0fXdoaWxlKG8hPT1yKX1hcihlLHQsbik7YnJlYWs7Y2FzZSAxOmlmKCFmdCYmKEFvKG4sdCkscj1uLnN0YXRlTm9kZSx0eXBlb2Ygci5jb21wb25lbnRXaWxsVW5tb3VudD09ImZ1bmN0aW9uIikpdHJ5e3IucHJvcHM9bi5tZW1vaXplZFByb3BzLHIuc3RhdGU9bi5tZW1vaXplZFN0YXRlLHIuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChzKXskZShuLHQscyl9YXIoZSx0LG4pO2JyZWFrO2Nhc2UgMjE6YXIoZSx0LG4pO2JyZWFrO2Nhc2UgMjI6bi5tb2RlJjE/KGZ0PShyPWZ0KXx8bi5tZW1vaXplZFN0YXRlIT09bnVsbCxhcihlLHQsbiksZnQ9cik6YXIoZSx0LG4pO2JyZWFrO2RlZmF1bHQ6YXIoZSx0LG4pfX1mdW5jdGlvbiBQbShlKXt2YXIgdD1lLnVwZGF0ZVF1ZXVlO2lmKHQhPT1udWxsKXtlLnVwZGF0ZVF1ZXVlPW51bGw7dmFyIG49ZS5zdGF0ZU5vZGU7bj09PW51bGwmJihuPWUuc3RhdGVOb2RlPW5ldyBpeCksdC5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBvPWd4LmJpbmQobnVsbCxlLHIpO24uaGFzKHIpfHwobi5hZGQociksci50aGVuKG8sbykpfSl9fWZ1bmN0aW9uIGxuKGUsdCl7dmFyIG49dC5kZWxldGlvbnM7aWYobiE9PW51bGwpZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07dHJ5e3ZhciBhPWUsaT10LHM9aTtlOmZvcig7cyE9PW51bGw7KXtzd2l0Y2gocy50YWcpe2Nhc2UgNTpydD1zLnN0YXRlTm9kZSx1bj0hMTticmVhayBlO2Nhc2UgMzpydD1zLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLHVuPSEwO2JyZWFrIGU7Y2FzZSA0OnJ0PXMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sdW49ITA7YnJlYWsgZX1zPXMucmV0dXJufWlmKHJ0PT09bnVsbCl0aHJvdyBFcnJvcihQKDE2MCkpO05nKGEsaSxvKSxydD1udWxsLHVuPSExO3ZhciBsPW8uYWx0ZXJuYXRlO2whPT1udWxsJiYobC5yZXR1cm49bnVsbCksby5yZXR1cm49bnVsbH1jYXRjaChjKXskZShvLHQsYyl9fWlmKHQuc3VidHJlZUZsYWdzJjEyODU0KWZvcih0PXQuY2hpbGQ7dCE9PW51bGw7KURnKHQsZSksdD10LnNpYmxpbmd9ZnVuY3Rpb24gRGcoZSx0KXt2YXIgbj1lLmFsdGVybmF0ZSxyPWUuZmxhZ3M7c3dpdGNoKGUudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6aWYobG4odCxlKSxFbihlKSxyJjQpe3RyeXtSYSgzLGUsZS5yZXR1cm4pLEpzKDMsZSl9Y2F0Y2godyl7JGUoZSxlLnJldHVybix3KX10cnl7UmEoNSxlLGUucmV0dXJuKX1jYXRjaCh3KXskZShlLGUucmV0dXJuLHcpfX1icmVhaztjYXNlIDE6bG4odCxlKSxFbihlKSxyJjUxMiYmbiE9PW51bGwmJkFvKG4sbi5yZXR1cm4pO2JyZWFrO2Nhc2UgNTppZihsbih0LGUpLEVuKGUpLHImNTEyJiZuIT09bnVsbCYmQW8obixuLnJldHVybiksZS5mbGFncyYzMil7dmFyIG89ZS5zdGF0ZU5vZGU7dHJ5e3phKG8sIiIpfWNhdGNoKHcpeyRlKGUsZS5yZXR1cm4sdyl9fWlmKHImNCYmKG89ZS5zdGF0ZU5vZGUsbyE9bnVsbCkpe3ZhciBhPWUubWVtb2l6ZWRQcm9wcyxpPW4hPT1udWxsP24ubWVtb2l6ZWRQcm9wczphLHM9ZS50eXBlLGw9ZS51cGRhdGVRdWV1ZTtpZihlLnVwZGF0ZVF1ZXVlPW51bGwsbCE9PW51bGwpdHJ5e3M9PT0iaW5wdXQiJiZhLnR5cGU9PT0icmFkaW8iJiZhLm5hbWUhPW51bGwmJnFtKG8sYSkscWMocyxpKTt2YXIgYz1xYyhzLGEpO2ZvcihpPTA7aTxsLmxlbmd0aDtpKz0yKXt2YXIgZD1sW2ldLHU9bFtpKzFdO2Q9PT0ic3R5bGUiP2VoKG8sdSk6ZD09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/WG0obyx1KTpkPT09ImNoaWxkcmVuIj96YShvLHUpOkl1KG8sZCx1LGMpfXN3aXRjaChzKXtjYXNlImlucHV0IjpqYyhvLGEpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOlFtKG8sYSk7YnJlYWs7Y2FzZSJzZWxlY3QiOnZhciBwPW8uX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtvLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9ISFhLm11bHRpcGxlO3ZhciBmPWEudmFsdWU7ZiE9bnVsbD9JbyhvLCEhYS5tdWx0aXBsZSxmLCExKTpwIT09ISFhLm11bHRpcGxlJiYoYS5kZWZhdWx0VmFsdWUhPW51bGw/SW8obywhIWEubXVsdGlwbGUsYS5kZWZhdWx0VmFsdWUsITApOklvKG8sISFhLm11bHRpcGxlLGEubXVsdGlwbGU/W106IiIsITEpKX1vW0dhXT1hfWNhdGNoKHcpeyRlKGUsZS5yZXR1cm4sdyl9fWJyZWFrO2Nhc2UgNjppZihsbih0LGUpLEVuKGUpLHImNCl7aWYoZS5zdGF0ZU5vZGU9PT1udWxsKXRocm93IEVycm9yKFAoMTYyKSk7bz1lLnN0YXRlTm9kZSxhPWUubWVtb2l6ZWRQcm9wczt0cnl7by5ub2RlVmFsdWU9YX1jYXRjaCh3KXskZShlLGUucmV0dXJuLHcpfX1icmVhaztjYXNlIDM6aWYobG4odCxlKSxFbihlKSxyJjQmJm4hPT1udWxsJiZuLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXRyeXtXYSh0LmNvbnRhaW5lckluZm8pfWNhdGNoKHcpeyRlKGUsZS5yZXR1cm4sdyl9YnJlYWs7Y2FzZSA0OmxuKHQsZSksRW4oZSk7YnJlYWs7Y2FzZSAxMzpsbih0LGUpLEVuKGUpLG89ZS5jaGlsZCxvLmZsYWdzJjgxOTImJihhPW8ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsby5zdGF0ZU5vZGUuaXNIaWRkZW49YSwhYXx8by5hbHRlcm5hdGUhPT1udWxsJiZvLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlIT09bnVsbHx8KGRkPUhlKCkpKSxyJjQmJlBtKGUpO2JyZWFrO2Nhc2UgMjI6aWYoZD1uIT09bnVsbCYmbi5tZW1vaXplZFN0YXRlIT09bnVsbCxlLm1vZGUmMT8oZnQ9KGM9ZnQpfHxkLGxuKHQsZSksZnQ9Yyk6bG4odCxlKSxFbihlKSxyJjgxOTIpe2lmKGM9ZS5tZW1vaXplZFN0YXRlIT09bnVsbCwoZS5zdGF0ZU5vZGUuaXNIaWRkZW49YykmJiFkJiZlLm1vZGUmMSlmb3IoVj1lLGQ9ZS5jaGlsZDtkIT09bnVsbDspe2Zvcih1PVY9ZDtWIT09bnVsbDspe3N3aXRjaChwPVYsZj1wLmNoaWxkLHAudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6UmEoNCxwLHAucmV0dXJuKTticmVhaztjYXNlIDE6QW8ocCxwLnJldHVybik7dmFyIHk9cC5zdGF0ZU5vZGU7aWYodHlwZW9mIHkuY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiIpe3I9cCxuPXAucmV0dXJuO3RyeXt0PXIseS5wcm9wcz10Lm1lbW9pemVkUHJvcHMseS5zdGF0ZT10Lm1lbW9pemVkU3RhdGUseS5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKHcpeyRlKHIsbix3KX19YnJlYWs7Y2FzZSA1OkFvKHAscC5yZXR1cm4pO2JyZWFrO2Nhc2UgMjI6aWYocC5tZW1vaXplZFN0YXRlIT09bnVsbCl7em0odSk7Y29udGludWV9fWYhPT1udWxsPyhmLnJldHVybj1wLFY9Zik6em0odSl9ZD1kLnNpYmxpbmd9ZTpmb3IoZD1udWxsLHU9ZTs7KXtpZih1LnRhZz09PTUpe2lmKGQ9PT1udWxsKXtkPXU7dHJ5e289dS5zdGF0ZU5vZGUsYz8oYT1vLnN0eWxlLHR5cGVvZiBhLnNldFByb3BlcnR5PT0iZnVuY3Rpb24iP2Euc2V0UHJvcGVydHkoImRpc3BsYXkiLCJub25lIiwiaW1wb3J0YW50Iik6YS5kaXNwbGF5PSJub25lIik6KHM9dS5zdGF0ZU5vZGUsbD11Lm1lbW9pemVkUHJvcHMuc3R5bGUsaT1sIT1udWxsJiZsLmhhc093blByb3BlcnR5KCJkaXNwbGF5Iik/bC5kaXNwbGF5Om51bGwscy5zdHlsZS5kaXNwbGF5PVptKCJkaXNwbGF5IixpKSl9Y2F0Y2godyl7JGUoZSxlLnJldHVybix3KX19fWVsc2UgaWYodS50YWc9PT02KXtpZihkPT09bnVsbCl0cnl7dS5zdGF0ZU5vZGUubm9kZVZhbHVlPWM/IiI6dS5tZW1vaXplZFByb3BzfWNhdGNoKHcpeyRlKGUsZS5yZXR1cm4sdyl9fWVsc2UgaWYoKHUudGFnIT09MjImJnUudGFnIT09MjN8fHUubWVtb2l6ZWRTdGF0ZT09PW51bGx8fHU9PT1lKSYmdS5jaGlsZCE9PW51bGwpe3UuY2hpbGQucmV0dXJuPXUsdT11LmNoaWxkO2NvbnRpbnVlfWlmKHU9PT1lKWJyZWFrIGU7Zm9yKDt1LnNpYmxpbmc9PT1udWxsOyl7aWYodS5yZXR1cm49PT1udWxsfHx1LnJldHVybj09PWUpYnJlYWsgZTtkPT09dSYmKGQ9bnVsbCksdT11LnJldHVybn1kPT09dSYmKGQ9bnVsbCksdS5zaWJsaW5nLnJldHVybj11LnJldHVybix1PXUuc2libGluZ319YnJlYWs7Y2FzZSAxOTpsbih0LGUpLEVuKGUpLHImNCYmUG0oZSk7YnJlYWs7Y2FzZSAyMTpicmVhaztkZWZhdWx0OmxuKHQsZSksRW4oZSl9fWZ1bmN0aW9uIEVuKGUpe3ZhciB0PWUuZmxhZ3M7aWYodCYyKXt0cnl7ZTp7Zm9yKHZhciBuPWUucmV0dXJuO24hPT1udWxsOyl7aWYoVGcobikpe3ZhciByPW47YnJlYWsgZX1uPW4ucmV0dXJufXRocm93IEVycm9yKFAoMTYwKSl9c3dpdGNoKHIudGFnKXtjYXNlIDU6dmFyIG89ci5zdGF0ZU5vZGU7ci5mbGFncyYzMiYmKHphKG8sIiIpLHIuZmxhZ3MmPS0zMyk7dmFyIGE9TW0oZSk7VHUoZSxhLG8pO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6dmFyIGk9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxzPU1tKGUpO0V1KGUscyxpKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKFAoMTYxKSl9fWNhdGNoKGwpeyRlKGUsZS5yZXR1cm4sbCl9ZS5mbGFncyY9LTN9dCY0MDk2JiYoZS5mbGFncyY9LTQwOTcpfWZ1bmN0aW9uIGx4KGUsdCxuKXtWPWUsX2coZSx0LG4pfWZ1bmN0aW9uIF9nKGUsdCxuKXtmb3IodmFyIHI9KGUubW9kZSYxKSE9PTA7ViE9PW51bGw7KXt2YXIgbz1WLGE9by5jaGlsZDtpZihvLnRhZz09PTIyJiZyKXt2YXIgaT1vLm1lbW9pemVkU3RhdGUhPT1udWxsfHxzcztpZighaSl7dmFyIHM9by5hbHRlcm5hdGUsbD1zIT09bnVsbCYmcy5tZW1vaXplZFN0YXRlIT09bnVsbHx8ZnQ7cz1zczt2YXIgYz1mdDtpZihzcz1pLChmdD1sKSYmIWMpZm9yKFY9bztWIT09bnVsbDspaT1WLGw9aS5jaGlsZCxpLnRhZz09PTIyJiZpLm1lbW9pemVkU3RhdGUhPT1udWxsP0ZtKG8pOmwhPT1udWxsPyhsLnJldHVybj1pLFY9bCk6Rm0obyk7Zm9yKDthIT09bnVsbDspVj1hLF9nKGEsdCxuKSxhPWEuc2libGluZztWPW8sc3M9cyxmdD1jfUxtKGUsdCxuKX1lbHNlIG8uc3VidHJlZUZsYWdzJjg3NzImJmEhPT1udWxsPyhhLnJldHVybj1vLFY9YSk6TG0oZSx0LG4pfX1mdW5jdGlvbiBMbShlKXtmb3IoO1YhPT1udWxsOyl7dmFyIHQ9VjtpZih0LmZsYWdzJjg3NzIpe3ZhciBuPXQuYWx0ZXJuYXRlO3RyeXtpZih0LmZsYWdzJjg3NzIpc3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmZ0fHxKcyg1LHQpO2JyZWFrO2Nhc2UgMTp2YXIgcj10LnN0YXRlTm9kZTtpZih0LmZsYWdzJjQmJiFmdClpZihuPT09bnVsbClyLmNvbXBvbmVudERpZE1vdW50KCk7ZWxzZXt2YXIgbz10LmVsZW1lbnRUeXBlPT09dC50eXBlP24ubWVtb2l6ZWRQcm9wczpjbih0LnR5cGUsbi5tZW1vaXplZFByb3BzKTtyLmNvbXBvbmVudERpZFVwZGF0ZShvLG4ubWVtb2l6ZWRTdGF0ZSxyLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKX12YXIgYT10LnVwZGF0ZVF1ZXVlO2EhPT1udWxsJiZibSh0LGEscik7YnJlYWs7Y2FzZSAzOnZhciBpPXQudXBkYXRlUXVldWU7aWYoaSE9PW51bGwpe2lmKG49bnVsbCx0LmNoaWxkIT09bnVsbClzd2l0Y2godC5jaGlsZC50YWcpe2Nhc2UgNTpuPXQuY2hpbGQuc3RhdGVOb2RlO2JyZWFrO2Nhc2UgMTpuPXQuY2hpbGQuc3RhdGVOb2RlfWJtKHQsaSxuKX1icmVhaztjYXNlIDU6dmFyIHM9dC5zdGF0ZU5vZGU7aWYobj09PW51bGwmJnQuZmxhZ3MmNCl7bj1zO3ZhciBsPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2godC50eXBlKXtjYXNlImJ1dHRvbiI6Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmwuYXV0b0ZvY3VzJiZuLmZvY3VzKCk7YnJlYWs7Y2FzZSJpbWciOmwuc3JjJiYobi5zcmM9bC5zcmMpfX1icmVhaztjYXNlIDY6YnJlYWs7Y2FzZSA0OmJyZWFrO2Nhc2UgMTI6YnJlYWs7Y2FzZSAxMzppZih0Lm1lbW9pemVkU3RhdGU9PT1udWxsKXt2YXIgYz10LmFsdGVybmF0ZTtpZihjIT09bnVsbCl7dmFyIGQ9Yy5tZW1vaXplZFN0YXRlO2lmKGQhPT1udWxsKXt2YXIgdT1kLmRlaHlkcmF0ZWQ7dSE9PW51bGwmJldhKHUpfX19YnJlYWs7Y2FzZSAxOTpjYXNlIDE3OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDIzOmNhc2UgMjU6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihQKDE2MykpfWZ0fHx0LmZsYWdzJjUxMiYmU3UodCl9Y2F0Y2gocCl7JGUodCx0LnJldHVybixwKX19aWYodD09PWUpe1Y9bnVsbDticmVha31pZihuPXQuc2libGluZyxuIT09bnVsbCl7bi5yZXR1cm49dC5yZXR1cm4sVj1uO2JyZWFrfVY9dC5yZXR1cm59fWZ1bmN0aW9uIHptKGUpe2Zvcig7ViE9PW51bGw7KXt2YXIgdD1WO2lmKHQ9PT1lKXtWPW51bGw7YnJlYWt9dmFyIG49dC5zaWJsaW5nO2lmKG4hPT1udWxsKXtuLnJldHVybj10LnJldHVybixWPW47YnJlYWt9Vj10LnJldHVybn19ZnVuY3Rpb24gRm0oZSl7Zm9yKDtWIT09bnVsbDspe3ZhciB0PVY7dHJ5e3N3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YXIgbj10LnJldHVybjt0cnl7SnMoNCx0KX1jYXRjaChsKXskZSh0LG4sbCl9YnJlYWs7Y2FzZSAxOnZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiByLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iKXt2YXIgbz10LnJldHVybjt0cnl7ci5jb21wb25lbnREaWRNb3VudCgpfWNhdGNoKGwpeyRlKHQsbyxsKX19dmFyIGE9dC5yZXR1cm47dHJ5e1N1KHQpfWNhdGNoKGwpeyRlKHQsYSxsKX1icmVhaztjYXNlIDU6dmFyIGk9dC5yZXR1cm47dHJ5e1N1KHQpfWNhdGNoKGwpeyRlKHQsaSxsKX19fWNhdGNoKGwpeyRlKHQsdC5yZXR1cm4sbCl9aWYodD09PWUpe1Y9bnVsbDticmVha312YXIgcz10LnNpYmxpbmc7aWYocyE9PW51bGwpe3MucmV0dXJuPXQucmV0dXJuLFY9czticmVha31WPXQucmV0dXJufX12YXIgY3g9TWF0aC5jZWlsLEZzPVZuLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsY2Q9Vm4uUmVhY3RDdXJyZW50T3duZXIsSnQ9Vm4uUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsaGU9MCxldD1udWxsLEdlPW51bGwsb3Q9MCxMdD0wLE9vPVNyKDApLHFlPTAsWGE9bnVsbCxRcj0wLFhzPTAsdWQ9MCxNYT1udWxsLFR0PW51bGwsZGQ9MCxqbz0xLzAsTG49bnVsbCxVcz0hMSxOdT1udWxsLHlyPW51bGwsbHM9ITEsZHI9bnVsbCwkcz0wLFBhPTAsRHU9bnVsbCxncz0tMSx5cz0wO2Z1bmN0aW9uIHZ0KCl7cmV0dXJuIGhlJjY/SGUoKTpncyE9PS0xP2dzOmdzPUhlKCl9ZnVuY3Rpb24gdnIoZSl7cmV0dXJuIGUubW9kZSYxP2hlJjImJm90IT09MD9vdCYtb3Q6R2sudHJhbnNpdGlvbiE9PW51bGw/KHlzPT09MCYmKHlzPXBoKCkpLHlzKTooZT14ZSxlIT09MHx8KGU9d2luZG93LmV2ZW50LGU9ZT09PXZvaWQgMD8xNjp3aChlLnR5cGUpKSxlKToxfWZ1bmN0aW9uIGZuKGUsdCxuLHIpe2lmKDUwPFBhKXRocm93IFBhPTAsRHU9bnVsbCxFcnJvcihQKDE4NSkpO1phKGUsbixyKSwoIShoZSYyKXx8ZSE9PWV0KSYmKGU9PT1ldCYmKCEoaGUmMikmJihYc3w9bikscWU9PT00JiZjcihlLG90KSksQ3QoZSxyKSxuPT09MSYmaGU9PT0wJiYhKHQubW9kZSYxKSYmKGpvPUhlKCkrNTAwLFlzJiZFcigpKSl9ZnVuY3Rpb24gQ3QoZSx0KXt2YXIgbj1lLmNhbGxiYWNrTm9kZTtZYihlLHQpO3ZhciByPVNzKGUsZT09PWV0P290OjApO2lmKHI9PT0wKW4hPT1udWxsJiZHZihuKSxlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO2Vsc2UgaWYodD1yJi1yLGUuY2FsbGJhY2tQcmlvcml0eSE9PXQpe2lmKG4hPW51bGwmJkdmKG4pLHQ9PT0xKWUudGFnPT09MD9WayhVbS5iaW5kKG51bGwsZSkpOkZoKFVtLmJpbmQobnVsbCxlKSksV2soZnVuY3Rpb24oKXshKGhlJjYpJiZFcigpfSksbj1udWxsO2Vsc2V7c3dpdGNoKGZoKHIpKXtjYXNlIDE6bj16dTticmVhaztjYXNlIDQ6bj11aDticmVhaztjYXNlIDE2Om49eHM7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bj1kaDticmVhaztkZWZhdWx0Om49eHN9bj1MZyhuLENnLmJpbmQobnVsbCxlKSl9ZS5jYWxsYmFja1ByaW9yaXR5PXQsZS5jYWxsYmFja05vZGU9bn19ZnVuY3Rpb24gQ2coZSx0KXtpZihncz0tMSx5cz0wLGhlJjYpdGhyb3cgRXJyb3IoUCgzMjcpKTt2YXIgbj1lLmNhbGxiYWNrTm9kZTtpZih6bygpJiZlLmNhbGxiYWNrTm9kZSE9PW4pcmV0dXJuIG51bGw7dmFyIHI9U3MoZSxlPT09ZXQ/b3Q6MCk7aWYocj09PTApcmV0dXJuIG51bGw7aWYociYzMHx8ciZlLmV4cGlyZWRMYW5lc3x8dCl0PVdzKGUscik7ZWxzZXt0PXI7dmFyIG89aGU7aGV8PTI7dmFyIGE9T2coKTsoZXQhPT1lfHxvdCE9PXQpJiYoTG49bnVsbCxqbz1IZSgpKzUwMCxWcihlLHQpKTtkbyB0cnl7cHgoKTticmVha31jYXRjaChzKXtBZyhlLHMpfXdoaWxlKCEwKTtRdSgpLEZzLmN1cnJlbnQ9YSxoZT1vLEdlIT09bnVsbD90PTA6KGV0PW51bGwsb3Q9MCx0PXFlKX1pZih0IT09MCl7aWYodD09PTImJihvPWV1KGUpLG8hPT0wJiYocj1vLHQ9X3UoZSxvKSkpLHQ9PT0xKXRocm93IG49WGEsVnIoZSwwKSxjcihlLHIpLEN0KGUsSGUoKSksbjtpZih0PT09NiljcihlLHIpO2Vsc2V7aWYobz1lLmN1cnJlbnQuYWx0ZXJuYXRlLCEociYzMCkmJiF1eChvKSYmKHQ9V3MoZSxyKSx0PT09MiYmKGE9ZXUoZSksYSE9PTAmJihyPWEsdD1fdShlLGEpKSksdD09PTEpKXRocm93IG49WGEsVnIoZSwwKSxjcihlLHIpLEN0KGUsSGUoKSksbjtzd2l0Y2goZS5maW5pc2hlZFdvcms9byxlLmZpbmlzaGVkTGFuZXM9cix0KXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKFAoMzQ1KSk7Y2FzZSAyOldyKGUsVHQsTG4pO2JyZWFrO2Nhc2UgMzppZihjcihlLHIpLChyJjEzMDAyMzQyNCk9PT1yJiYodD1kZCs1MDAtSGUoKSwxMDx0KSl7aWYoU3MoZSwwKSE9PTApYnJlYWs7aWYobz1lLnN1c3BlbmRlZExhbmVzLChvJnIpIT09cil7dnQoKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJm87YnJlYWt9ZS50aW1lb3V0SGFuZGxlPWx1KFdyLmJpbmQobnVsbCxlLFR0LExuKSx0KTticmVha31XcihlLFR0LExuKTticmVhaztjYXNlIDQ6aWYoY3IoZSxyKSwociY0MTk0MjQwKT09PXIpYnJlYWs7Zm9yKHQ9ZS5ldmVudFRpbWVzLG89LTE7MDxyOyl7dmFyIGk9MzEtcG4ocik7YT0xPDxpLGk9dFtpXSxpPm8mJihvPWkpLHImPX5hfWlmKHI9byxyPUhlKCktcixyPSgxMjA+cj8xMjA6NDgwPnI/NDgwOjEwODA+cj8xMDgwOjE5MjA+cj8xOTIwOjNlMz5yPzNlMzo0MzIwPnI/NDMyMDoxOTYwKmN4KHIvMTk2MCkpLXIsMTA8cil7ZS50aW1lb3V0SGFuZGxlPWx1KFdyLmJpbmQobnVsbCxlLFR0LExuKSxyKTticmVha31XcihlLFR0LExuKTticmVhaztjYXNlIDU6V3IoZSxUdCxMbik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihQKDMyOSkpfX19cmV0dXJuIEN0KGUsSGUoKSksZS5jYWxsYmFja05vZGU9PT1uP0NnLmJpbmQobnVsbCxlKTpudWxsfWZ1bmN0aW9uIF91KGUsdCl7dmFyIG49TWE7cmV0dXJuIGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKFZyKGUsdCkuZmxhZ3N8PTI1NiksZT1XcyhlLHQpLGUhPT0yJiYodD1UdCxUdD1uLHQhPT1udWxsJiZDdSh0KSksZX1mdW5jdGlvbiBDdShlKXtUdD09PW51bGw/VHQ9ZTpUdC5wdXNoLmFwcGx5KFR0LGUpfWZ1bmN0aW9uIHV4KGUpe2Zvcih2YXIgdD1lOzspe2lmKHQuZmxhZ3MmMTYzODQpe3ZhciBuPXQudXBkYXRlUXVldWU7aWYobiE9PW51bGwmJihuPW4uc3RvcmVzLG4hPT1udWxsKSlmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXSxhPW8uZ2V0U25hcHNob3Q7bz1vLnZhbHVlO3RyeXtpZighbW4oYSgpLG8pKXJldHVybiExfWNhdGNoe3JldHVybiExfX19aWYobj10LmNoaWxkLHQuc3VidHJlZUZsYWdzJjE2Mzg0JiZuIT09bnVsbCluLnJldHVybj10LHQ9bjtlbHNle2lmKHQ9PT1lKWJyZWFrO2Zvcig7dC5zaWJsaW5nPT09bnVsbDspe2lmKHQucmV0dXJuPT09bnVsbHx8dC5yZXR1cm49PT1lKXJldHVybiEwO3Q9dC5yZXR1cm59dC5zaWJsaW5nLnJldHVybj10LnJldHVybix0PXQuc2libGluZ319cmV0dXJuITB9ZnVuY3Rpb24gY3IoZSx0KXtmb3IodCY9fnVkLHQmPX5YcyxlLnN1c3BlbmRlZExhbmVzfD10LGUucGluZ2VkTGFuZXMmPX50LGU9ZS5leHBpcmF0aW9uVGltZXM7MDx0Oyl7dmFyIG49MzEtcG4odCkscj0xPDxuO2Vbbl09LTEsdCY9fnJ9fWZ1bmN0aW9uIFVtKGUpe2lmKGhlJjYpdGhyb3cgRXJyb3IoUCgzMjcpKTt6bygpO3ZhciB0PVNzKGUsMCk7aWYoISh0JjEpKXJldHVybiBDdChlLEhlKCkpLG51bGw7dmFyIG49V3MoZSx0KTtpZihlLnRhZyE9PTAmJm49PT0yKXt2YXIgcj1ldShlKTtyIT09MCYmKHQ9cixuPV91KGUscikpfWlmKG49PT0xKXRocm93IG49WGEsVnIoZSwwKSxjcihlLHQpLEN0KGUsSGUoKSksbjtpZihuPT09Nil0aHJvdyBFcnJvcihQKDM0NSkpO3JldHVybiBlLmZpbmlzaGVkV29yaz1lLmN1cnJlbnQuYWx0ZXJuYXRlLGUuZmluaXNoZWRMYW5lcz10LFdyKGUsVHQsTG4pLEN0KGUsSGUoKSksbnVsbH1mdW5jdGlvbiBwZChlLHQpe3ZhciBuPWhlO2hlfD0xO3RyeXtyZXR1cm4gZSh0KX1maW5hbGx5e2hlPW4saGU9PT0wJiYoam89SGUoKSs1MDAsWXMmJkVyKCkpfX1mdW5jdGlvbiBKcihlKXtkciE9PW51bGwmJmRyLnRhZz09PTAmJiEoaGUmNikmJnpvKCk7dmFyIHQ9aGU7aGV8PTE7dmFyIG49SnQudHJhbnNpdGlvbixyPXhlO3RyeXtpZihKdC50cmFuc2l0aW9uPW51bGwseGU9MSxlKXJldHVybiBlKCl9ZmluYWxseXt4ZT1yLEp0LnRyYW5zaXRpb249bixoZT10LCEoaGUmNikmJkVyKCl9fWZ1bmN0aW9uIGZkKCl7THQ9T28uY3VycmVudCxBZShPbyl9ZnVuY3Rpb24gVnIoZSx0KXtlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wO3ZhciBuPWUudGltZW91dEhhbmRsZTtpZihuIT09LTEmJihlLnRpbWVvdXRIYW5kbGU9LTEsJGsobikpLEdlIT09bnVsbClmb3Iobj1HZS5yZXR1cm47biE9PW51bGw7KXt2YXIgcj1uO3N3aXRjaChLdShyKSxyLnRhZyl7Y2FzZSAxOnI9ci50eXBlLmNoaWxkQ29udGV4dFR5cGVzLHIhPW51bGwmJl9zKCk7YnJlYWs7Y2FzZSAzOkJvKCksQWUoRHQpLEFlKG10KSxuZCgpO2JyZWFrO2Nhc2UgNTp0ZChyKTticmVhaztjYXNlIDQ6Qm8oKTticmVhaztjYXNlIDEzOkFlKExlKTticmVhaztjYXNlIDE5OkFlKExlKTticmVhaztjYXNlIDEwOkp1KHIudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOmZkKCl9bj1uLnJldHVybn1pZihldD1lLEdlPWU9d3IoZS5jdXJyZW50LG51bGwpLG90PUx0PXQscWU9MCxYYT1udWxsLHVkPVhzPVFyPTAsVHQ9TWE9bnVsbCxIciE9PW51bGwpe2Zvcih0PTA7dDxIci5sZW5ndGg7dCsrKWlmKG49SHJbdF0scj1uLmludGVybGVhdmVkLHIhPT1udWxsKXtuLmludGVybGVhdmVkPW51bGw7dmFyIG89ci5uZXh0LGE9bi5wZW5kaW5nO2lmKGEhPT1udWxsKXt2YXIgaT1hLm5leHQ7YS5uZXh0PW8sci5uZXh0PWl9bi5wZW5kaW5nPXJ9SHI9bnVsbH1yZXR1cm4gZX1mdW5jdGlvbiBBZyhlLHQpe2Rve3ZhciBuPUdlO3RyeXtpZihRdSgpLGZzLmN1cnJlbnQ9enMsTHMpe2Zvcih2YXIgcj16ZS5tZW1vaXplZFN0YXRlO3IhPT1udWxsOyl7dmFyIG89ci5xdWV1ZTtvIT09bnVsbCYmKG8ucGVuZGluZz1udWxsKSxyPXIubmV4dH1Mcz0hMX1pZihxcj0wLFplPVllPXplPW51bGwsSWE9ITEscWE9MCxjZC5jdXJyZW50PW51bGwsbj09PW51bGx8fG4ucmV0dXJuPT09bnVsbCl7cWU9MSxYYT10LEdlPW51bGw7YnJlYWt9ZTp7dmFyIGE9ZSxpPW4ucmV0dXJuLHM9bixsPXQ7aWYodD1vdCxzLmZsYWdzfD0zMjc2OCxsIT09bnVsbCYmdHlwZW9mIGw9PSJvYmplY3QiJiZ0eXBlb2YgbC50aGVuPT0iZnVuY3Rpb24iKXt2YXIgYz1sLGQ9cyx1PWQudGFnO2lmKCEoZC5tb2RlJjEpJiYodT09PTB8fHU9PT0xMXx8dT09PTE1KSl7dmFyIHA9ZC5hbHRlcm5hdGU7cD8oZC51cGRhdGVRdWV1ZT1wLnVwZGF0ZVF1ZXVlLGQubWVtb2l6ZWRTdGF0ZT1wLm1lbW9pemVkU3RhdGUsZC5sYW5lcz1wLmxhbmVzKTooZC51cGRhdGVRdWV1ZT1udWxsLGQubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgZj1ObShpKTtpZihmIT09bnVsbCl7Zi5mbGFncyY9LTI1NyxEbShmLGkscyxhLHQpLGYubW9kZSYxJiZUbShhLGMsdCksdD1mLGw9Yzt2YXIgeT10LnVwZGF0ZVF1ZXVlO2lmKHk9PT1udWxsKXt2YXIgdz1uZXcgU2V0O3cuYWRkKGwpLHQudXBkYXRlUXVldWU9d31lbHNlIHkuYWRkKGwpO2JyZWFrIGV9ZWxzZXtpZighKHQmMSkpe1RtKGEsYyx0KSxtZCgpO2JyZWFrIGV9bD1FcnJvcihQKDQyNikpfX1lbHNlIGlmKEllJiZzLm1vZGUmMSl7dmFyIGI9Tm0oaSk7aWYoYiE9PW51bGwpeyEoYi5mbGFncyY2NTUzNikmJihiLmZsYWdzfD0yNTYpLERtKGIsaSxzLGEsdCksWXUoSG8obCxzKSk7YnJlYWsgZX19YT1sPUhvKGwscykscWUhPT00JiYocWU9MiksTWE9PT1udWxsP01hPVthXTpNYS5wdXNoKGEpLGE9aTtkb3tzd2l0Y2goYS50YWcpe2Nhc2UgMzphLmZsYWdzfD02NTUzNix0Jj0tdCxhLmxhbmVzfD10O3ZhciB2PWZnKGEsbCx0KTt3bShhLHYpO2JyZWFrIGU7Y2FzZSAxOnM9bDt2YXIgaD1hLnR5cGUsZz1hLnN0YXRlTm9kZTtpZighKGEuZmxhZ3MmMTI4KSYmKHR5cGVvZiBoLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8ZyE9PW51bGwmJnR5cGVvZiBnLmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYoeXI9PT1udWxsfHwheXIuaGFzKGcpKSkpe2EuZmxhZ3N8PTY1NTM2LHQmPS10LGEubGFuZXN8PXQ7dmFyIG09bWcoYSxzLHQpO3dtKGEsbSk7YnJlYWsgZX19YT1hLnJldHVybn13aGlsZShhIT09bnVsbCl9Umcobil9Y2F0Y2goeCl7dD14LEdlPT09biYmbiE9PW51bGwmJihHZT1uPW4ucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSghMCl9ZnVuY3Rpb24gT2coKXt2YXIgZT1Gcy5jdXJyZW50O3JldHVybiBGcy5jdXJyZW50PXpzLGU9PT1udWxsP3pzOmV9ZnVuY3Rpb24gbWQoKXsocWU9PT0wfHxxZT09PTN8fHFlPT09MikmJihxZT00KSxldD09PW51bGx8fCEoUXImMjY4NDM1NDU1KSYmIShYcyYyNjg0MzU0NTUpfHxjcihldCxvdCl9ZnVuY3Rpb24gV3MoZSx0KXt2YXIgbj1oZTtoZXw9Mjt2YXIgcj1PZygpOyhldCE9PWV8fG90IT09dCkmJihMbj1udWxsLFZyKGUsdCkpO2RvIHRyeXtkeCgpO2JyZWFrfWNhdGNoKG8pe0FnKGUsbyl9d2hpbGUoITApO2lmKFF1KCksaGU9bixGcy5jdXJyZW50PXIsR2UhPT1udWxsKXRocm93IEVycm9yKFAoMjYxKSk7cmV0dXJuIGV0PW51bGwsb3Q9MCxxZX1mdW5jdGlvbiBkeCgpe2Zvcig7R2UhPT1udWxsOylJZyhHZSl9ZnVuY3Rpb24gcHgoKXtmb3IoO0dlIT09bnVsbCYmIVViKCk7KUlnKEdlKX1mdW5jdGlvbiBJZyhlKXt2YXIgdD1QZyhlLmFsdGVybmF0ZSxlLEx0KTtlLm1lbW9pemVkUHJvcHM9ZS5wZW5kaW5nUHJvcHMsdD09PW51bGw/UmcoZSk6R2U9dCxjZC5jdXJyZW50PW51bGx9ZnVuY3Rpb24gUmcoZSl7dmFyIHQ9ZTtkb3t2YXIgbj10LmFsdGVybmF0ZTtpZihlPXQucmV0dXJuLHQuZmxhZ3MmMzI3Njgpe2lmKG49YXgobix0KSxuIT09bnVsbCl7bi5mbGFncyY9MzI3NjcsR2U9bjtyZXR1cm59aWYoZSE9PW51bGwpZS5mbGFnc3w9MzI3NjgsZS5zdWJ0cmVlRmxhZ3M9MCxlLmRlbGV0aW9ucz1udWxsO2Vsc2V7cWU9NixHZT1udWxsO3JldHVybn19ZWxzZSBpZihuPW94KG4sdCxMdCksbiE9PW51bGwpe0dlPW47cmV0dXJufWlmKHQ9dC5zaWJsaW5nLHQhPT1udWxsKXtHZT10O3JldHVybn1HZT10PWV9d2hpbGUodCE9PW51bGwpO3FlPT09MCYmKHFlPTUpfWZ1bmN0aW9uIFdyKGUsdCxuKXt2YXIgcj14ZSxvPUp0LnRyYW5zaXRpb247dHJ5e0p0LnRyYW5zaXRpb249bnVsbCx4ZT0xLGZ4KGUsdCxuLHIpfWZpbmFsbHl7SnQudHJhbnNpdGlvbj1vLHhlPXJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZngoZSx0LG4scil7ZG8gem8oKTt3aGlsZShkciE9PW51bGwpO2lmKGhlJjYpdGhyb3cgRXJyb3IoUCgzMjcpKTtuPWUuZmluaXNoZWRXb3JrO3ZhciBvPWUuZmluaXNoZWRMYW5lcztpZihuPT09bnVsbClyZXR1cm4gbnVsbDtpZihlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wLG49PT1lLmN1cnJlbnQpdGhyb3cgRXJyb3IoUCgxNzcpKTtlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBhPW4ubGFuZXN8bi5jaGlsZExhbmVzO2lmKHFiKGUsYSksZT09PWV0JiYoR2U9ZXQ9bnVsbCxvdD0wKSwhKG4uc3VidHJlZUZsYWdzJjIwNjQpJiYhKG4uZmxhZ3MmMjA2NCl8fGxzfHwobHM9ITAsTGcoeHMsZnVuY3Rpb24oKXtyZXR1cm4gem8oKSxudWxsfSkpLGE9KG4uZmxhZ3MmMTU5OTApIT09MCxuLnN1YnRyZWVGbGFncyYxNTk5MHx8YSl7YT1KdC50cmFuc2l0aW9uLEp0LnRyYW5zaXRpb249bnVsbDt2YXIgaT14ZTt4ZT0xO3ZhciBzPWhlO2hlfD00LGNkLmN1cnJlbnQ9bnVsbCxzeChlLG4pLERnKG4sZSksUGsoaXUpLEVzPSEhYXUsaXU9YXU9bnVsbCxlLmN1cnJlbnQ9bixseChuLGUsbyksJGIoKSxoZT1zLHhlPWksSnQudHJhbnNpdGlvbj1hfWVsc2UgZS5jdXJyZW50PW47aWYobHMmJihscz0hMSxkcj1lLCRzPW8pLGE9ZS5wZW5kaW5nTGFuZXMsYT09PTAmJih5cj1udWxsKSxIYihuLnN0YXRlTm9kZSxyKSxDdChlLEhlKCkpLHQhPT1udWxsKWZvcihyPWUub25SZWNvdmVyYWJsZUVycm9yLG49MDtuPHQubGVuZ3RoO24rKylvPXRbbl0scihvLnZhbHVlLHtjb21wb25lbnRTdGFjazpvLnN0YWNrLGRpZ2VzdDpvLmRpZ2VzdH0pO2lmKFVzKXRocm93IFVzPSExLGU9TnUsTnU9bnVsbCxlO3JldHVybiAkcyYxJiZlLnRhZyE9PTAmJnpvKCksYT1lLnBlbmRpbmdMYW5lcyxhJjE/ZT09PUR1P1BhKys6KFBhPTAsRHU9ZSk6UGE9MCxFcigpLG51bGx9ZnVuY3Rpb24gem8oKXtpZihkciE9PW51bGwpe3ZhciBlPWZoKCRzKSx0PUp0LnRyYW5zaXRpb24sbj14ZTt0cnl7aWYoSnQudHJhbnNpdGlvbj1udWxsLHhlPTE2PmU/MTY6ZSxkcj09PW51bGwpdmFyIHI9ITE7ZWxzZXtpZihlPWRyLGRyPW51bGwsJHM9MCxoZSY2KXRocm93IEVycm9yKFAoMzMxKSk7dmFyIG89aGU7Zm9yKGhlfD00LFY9ZS5jdXJyZW50O1YhPT1udWxsOyl7dmFyIGE9VixpPWEuY2hpbGQ7aWYoVi5mbGFncyYxNil7dmFyIHM9YS5kZWxldGlvbnM7aWYocyE9PW51bGwpe2Zvcih2YXIgbD0wO2w8cy5sZW5ndGg7bCsrKXt2YXIgYz1zW2xdO2ZvcihWPWM7ViE9PW51bGw7KXt2YXIgZD1WO3N3aXRjaChkLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpSYSg4LGQsYSl9dmFyIHU9ZC5jaGlsZDtpZih1IT09bnVsbCl1LnJldHVybj1kLFY9dTtlbHNlIGZvcig7ViE9PW51bGw7KXtkPVY7dmFyIHA9ZC5zaWJsaW5nLGY9ZC5yZXR1cm47aWYoRWcoZCksZD09PWMpe1Y9bnVsbDticmVha31pZihwIT09bnVsbCl7cC5yZXR1cm49ZixWPXA7YnJlYWt9Vj1mfX19dmFyIHk9YS5hbHRlcm5hdGU7aWYoeSE9PW51bGwpe3ZhciB3PXkuY2hpbGQ7aWYodyE9PW51bGwpe3kuY2hpbGQ9bnVsbDtkb3t2YXIgYj13LnNpYmxpbmc7dy5zaWJsaW5nPW51bGwsdz1ifXdoaWxlKHchPT1udWxsKX19Vj1hfX1pZihhLnN1YnRyZWVGbGFncyYyMDY0JiZpIT09bnVsbClpLnJldHVybj1hLFY9aTtlbHNlIGU6Zm9yKDtWIT09bnVsbDspe2lmKGE9VixhLmZsYWdzJjIwNDgpc3dpdGNoKGEudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OlJhKDksYSxhLnJldHVybil9dmFyIHY9YS5zaWJsaW5nO2lmKHYhPT1udWxsKXt2LnJldHVybj1hLnJldHVybixWPXY7YnJlYWsgZX1WPWEucmV0dXJufX12YXIgaD1lLmN1cnJlbnQ7Zm9yKFY9aDtWIT09bnVsbDspe2k9Vjt2YXIgZz1pLmNoaWxkO2lmKGkuc3VidHJlZUZsYWdzJjIwNjQmJmchPT1udWxsKWcucmV0dXJuPWksVj1nO2Vsc2UgZTpmb3IoaT1oO1YhPT1udWxsOyl7aWYocz1WLHMuZmxhZ3MmMjA0OCl0cnl7c3dpdGNoKHMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OkpzKDkscyl9fWNhdGNoKHgpeyRlKHMscy5yZXR1cm4seCl9aWYocz09PWkpe1Y9bnVsbDticmVhayBlfXZhciBtPXMuc2libGluZztpZihtIT09bnVsbCl7bS5yZXR1cm49cy5yZXR1cm4sVj1tO2JyZWFrIGV9Vj1zLnJldHVybn19aWYoaGU9byxFcigpLERuJiZ0eXBlb2YgRG4ub25Qb3N0Q29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXtEbi5vblBvc3RDb21taXRGaWJlclJvb3QoSHMsZSl9Y2F0Y2h7fXI9ITB9cmV0dXJuIHJ9ZmluYWxseXt4ZT1uLEp0LnRyYW5zaXRpb249dH19cmV0dXJuITF9ZnVuY3Rpb24gJG0oZSx0LG4pe3Q9SG8obix0KSx0PWZnKGUsdCwxKSxlPWdyKGUsdCwxKSx0PXZ0KCksZSE9PW51bGwmJihaYShlLDEsdCksQ3QoZSx0KSl9ZnVuY3Rpb24gJGUoZSx0LG4pe2lmKGUudGFnPT09MykkbShlLGUsbik7ZWxzZSBmb3IoO3QhPT1udWxsOyl7aWYodC50YWc9PT0zKXskbSh0LGUsbik7YnJlYWt9ZWxzZSBpZih0LnRhZz09PTEpe3ZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiB0LnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHx0eXBlb2Ygci5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKHlyPT09bnVsbHx8IXlyLmhhcyhyKSkpe2U9SG8obixlKSxlPW1nKHQsZSwxKSx0PWdyKHQsZSwxKSxlPXZ0KCksdCE9PW51bGwmJihaYSh0LDEsZSksQ3QodCxlKSk7YnJlYWt9fXQ9dC5yZXR1cm59fWZ1bmN0aW9uIG14KGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtyIT09bnVsbCYmci5kZWxldGUodCksdD12dCgpLGUucGluZ2VkTGFuZXN8PWUuc3VzcGVuZGVkTGFuZXMmbixldD09PWUmJihvdCZuKT09PW4mJihxZT09PTR8fHFlPT09MyYmKG90JjEzMDAyMzQyNCk9PT1vdCYmNTAwPkhlKCktZGQ/VnIoZSwwKTp1ZHw9biksQ3QoZSx0KX1mdW5jdGlvbiBNZyhlLHQpe3Q9PT0wJiYoZS5tb2RlJjE/KHQ9WWksWWk8PD0xLCEoWWkmMTMwMDIzNDI0KSYmKFlpPTQxOTQzMDQpKTp0PTEpO3ZhciBuPXZ0KCk7ZT1IbihlLHQpLGUhPT1udWxsJiYoWmEoZSx0LG4pLEN0KGUsbikpfWZ1bmN0aW9uIGh4KGUpe3ZhciB0PWUubWVtb2l6ZWRTdGF0ZSxuPTA7dCE9PW51bGwmJihuPXQucmV0cnlMYW5lKSxNZyhlLG4pfWZ1bmN0aW9uIGd4KGUsdCl7dmFyIG49MDtzd2l0Y2goZS50YWcpe2Nhc2UgMTM6dmFyIHI9ZS5zdGF0ZU5vZGUsbz1lLm1lbW9pemVkU3RhdGU7byE9PW51bGwmJihuPW8ucmV0cnlMYW5lKTticmVhaztjYXNlIDE5OnI9ZS5zdGF0ZU5vZGU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihQKDMxNCkpfXIhPT1udWxsJiZyLmRlbGV0ZSh0KSxNZyhlLG4pfXZhciBQZztQZz1mdW5jdGlvbihlLHQsbil7aWYoZSE9PW51bGwpaWYoZS5tZW1vaXplZFByb3BzIT09dC5wZW5kaW5nUHJvcHN8fER0LmN1cnJlbnQpTnQ9ITA7ZWxzZXtpZighKGUubGFuZXMmbikmJiEodC5mbGFncyYxMjgpKXJldHVybiBOdD0hMSxyeChlLHQsbik7TnQ9ISEoZS5mbGFncyYxMzEwNzIpfWVsc2UgTnQ9ITEsSWUmJnQuZmxhZ3MmMTA0ODU3NiYmVWgodCxPcyx0LmluZGV4KTtzd2l0Y2godC5sYW5lcz0wLHQudGFnKXtjYXNlIDI6dmFyIHI9dC50eXBlO2hzKGUsdCksZT10LnBlbmRpbmdQcm9wczt2YXIgbz1Vbyh0LG10LmN1cnJlbnQpO0xvKHQsbiksbz1vZChudWxsLHQscixlLG8sbik7dmFyIGE9YWQoKTtyZXR1cm4gdC5mbGFnc3w9MSx0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsJiZ0eXBlb2Ygby5yZW5kZXI9PSJmdW5jdGlvbiImJm8uJCR0eXBlb2Y9PT12b2lkIDA/KHQudGFnPTEsdC5tZW1vaXplZFN0YXRlPW51bGwsdC51cGRhdGVRdWV1ZT1udWxsLF90KHIpPyhhPSEwLENzKHQpKTphPSExLHQubWVtb2l6ZWRTdGF0ZT1vLnN0YXRlIT09bnVsbCYmby5zdGF0ZSE9PXZvaWQgMD9vLnN0YXRlOm51bGwsWnUodCksby51cGRhdGVyPVFzLHQuc3RhdGVOb2RlPW8sby5fcmVhY3RJbnRlcm5hbHM9dCxodSh0LHIsZSxuKSx0PXZ1KG51bGwsdCxyLCEwLGEsbikpOih0LnRhZz0wLEllJiZhJiZHdSh0KSx5dChudWxsLHQsbyxuKSx0PXQuY2hpbGQpLHQ7Y2FzZSAxNjpyPXQuZWxlbWVudFR5cGU7ZTp7c3dpdGNoKGhzKGUsdCksZT10LnBlbmRpbmdQcm9wcyxvPXIuX2luaXQscj1vKHIuX3BheWxvYWQpLHQudHlwZT1yLG89dC50YWc9dngociksZT1jbihyLGUpLG8pe2Nhc2UgMDp0PXl1KG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE6dD1BbShudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxMTp0PV9tKG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE0OnQ9Q20obnVsbCx0LHIsY24oci50eXBlLGUpLG4pO2JyZWFrIGV9dGhyb3cgRXJyb3IoUCgzMDYsciwiIikpfXJldHVybiB0O2Nhc2UgMDpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286Y24ocixvKSx5dShlLHQscixvLG4pO2Nhc2UgMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286Y24ocixvKSxBbShlLHQscixvLG4pO2Nhc2UgMzplOntpZih2Zyh0KSxlPT09bnVsbCl0aHJvdyBFcnJvcihQKDM4NykpO3I9dC5wZW5kaW5nUHJvcHMsYT10Lm1lbW9pemVkU3RhdGUsbz1hLmVsZW1lbnQsVmgoZSx0KSxNcyh0LHIsbnVsbCxuKTt2YXIgaT10Lm1lbW9pemVkU3RhdGU7aWYocj1pLmVsZW1lbnQsYS5pc0RlaHlkcmF0ZWQpaWYoYT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDohMSxjYWNoZTppLmNhY2hlLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6aS5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLHRyYW5zaXRpb25zOmkudHJhbnNpdGlvbnN9LHQudXBkYXRlUXVldWUuYmFzZVN0YXRlPWEsdC5tZW1vaXplZFN0YXRlPWEsdC5mbGFncyYyNTYpe289SG8oRXJyb3IoUCg0MjMpKSx0KSx0PU9tKGUsdCxyLG4sbyk7YnJlYWsgZX1lbHNlIGlmKHIhPT1vKXtvPUhvKEVycm9yKFAoNDI0KSksdCksdD1PbShlLHQscixuLG8pO2JyZWFrIGV9ZWxzZSBmb3IoenQ9aHIodC5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSxGdD10LEllPSEwLGRuPW51bGwsbj1IaCh0LG51bGwscixuKSx0LmNoaWxkPW47bjspbi5mbGFncz1uLmZsYWdzJi0zfDQwOTYsbj1uLnNpYmxpbmc7ZWxzZXtpZigkbygpLHI9PT1vKXt0PWpuKGUsdCxuKTticmVhayBlfXl0KGUsdCxyLG4pfXQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDU6cmV0dXJuIEdoKHQpLGU9PT1udWxsJiZwdSh0KSxyPXQudHlwZSxvPXQucGVuZGluZ1Byb3BzLGE9ZSE9PW51bGw/ZS5tZW1vaXplZFByb3BzOm51bGwsaT1vLmNoaWxkcmVuLHN1KHIsbyk/aT1udWxsOmEhPT1udWxsJiZzdShyLGEpJiYodC5mbGFnc3w9MzIpLHlnKGUsdCkseXQoZSx0LGksbiksdC5jaGlsZDtjYXNlIDY6cmV0dXJuIGU9PT1udWxsJiZwdSh0KSxudWxsO2Nhc2UgMTM6cmV0dXJuIHdnKGUsdCxuKTtjYXNlIDQ6cmV0dXJuIGVkKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbykscj10LnBlbmRpbmdQcm9wcyxlPT09bnVsbD90LmNoaWxkPVdvKHQsbnVsbCxyLG4pOnl0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286Y24ocixvKSxfbShlLHQscixvLG4pO2Nhc2UgNzpyZXR1cm4geXQoZSx0LHQucGVuZGluZ1Byb3BzLG4pLHQuY2hpbGQ7Y2FzZSA4OnJldHVybiB5dChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEyOnJldHVybiB5dChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEwOmU6e2lmKHI9dC50eXBlLl9jb250ZXh0LG89dC5wZW5kaW5nUHJvcHMsYT10Lm1lbW9pemVkUHJvcHMsaT1vLnZhbHVlLE5lKElzLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPWksYSE9PW51bGwpaWYobW4oYS52YWx1ZSxpKSl7aWYoYS5jaGlsZHJlbj09PW8uY2hpbGRyZW4mJiFEdC5jdXJyZW50KXt0PWpuKGUsdCxuKTticmVhayBlfX1lbHNlIGZvcihhPXQuY2hpbGQsYSE9PW51bGwmJihhLnJldHVybj10KTthIT09bnVsbDspe3ZhciBzPWEuZGVwZW5kZW5jaWVzO2lmKHMhPT1udWxsKXtpPWEuY2hpbGQ7Zm9yKHZhciBsPXMuZmlyc3RDb250ZXh0O2whPT1udWxsOyl7aWYobC5jb250ZXh0PT09cil7aWYoYS50YWc9PT0xKXtsPSRuKC0xLG4mLW4pLGwudGFnPTI7dmFyIGM9YS51cGRhdGVRdWV1ZTtpZihjIT09bnVsbCl7Yz1jLnNoYXJlZDt2YXIgZD1jLnBlbmRpbmc7ZD09PW51bGw/bC5uZXh0PWw6KGwubmV4dD1kLm5leHQsZC5uZXh0PWwpLGMucGVuZGluZz1sfX1hLmxhbmVzfD1uLGw9YS5hbHRlcm5hdGUsbCE9PW51bGwmJihsLmxhbmVzfD1uKSxmdShhLnJldHVybixuLHQpLHMubGFuZXN8PW47YnJlYWt9bD1sLm5leHR9fWVsc2UgaWYoYS50YWc9PT0xMClpPWEudHlwZT09PXQudHlwZT9udWxsOmEuY2hpbGQ7ZWxzZSBpZihhLnRhZz09PTE4KXtpZihpPWEucmV0dXJuLGk9PT1udWxsKXRocm93IEVycm9yKFAoMzQxKSk7aS5sYW5lc3w9bixzPWkuYWx0ZXJuYXRlLHMhPT1udWxsJiYocy5sYW5lc3w9biksZnUoaSxuLHQpLGk9YS5zaWJsaW5nfWVsc2UgaT1hLmNoaWxkO2lmKGkhPT1udWxsKWkucmV0dXJuPWE7ZWxzZSBmb3IoaT1hO2khPT1udWxsOyl7aWYoaT09PXQpe2k9bnVsbDticmVha31pZihhPWkuc2libGluZyxhIT09bnVsbCl7YS5yZXR1cm49aS5yZXR1cm4saT1hO2JyZWFrfWk9aS5yZXR1cm59YT1pfXl0KGUsdCxvLmNoaWxkcmVuLG4pLHQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDk6cmV0dXJuIG89dC50eXBlLHI9dC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sTG8odCxuKSxvPVh0KG8pLHI9cihvKSx0LmZsYWdzfD0xLHl0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxNDpyZXR1cm4gcj10LnR5cGUsbz1jbihyLHQucGVuZGluZ1Byb3BzKSxvPWNuKHIudHlwZSxvKSxDbShlLHQscixvLG4pO2Nhc2UgMTU6cmV0dXJuIGhnKGUsdCx0LnR5cGUsdC5wZW5kaW5nUHJvcHMsbik7Y2FzZSAxNzpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286Y24ocixvKSxocyhlLHQpLHQudGFnPTEsX3Qocik/KGU9ITAsQ3ModCkpOmU9ITEsTG8odCxuKSxwZyh0LHIsbyksaHUodCxyLG8sbiksdnUobnVsbCx0LHIsITAsZSxuKTtjYXNlIDE5OnJldHVybiBiZyhlLHQsbik7Y2FzZSAyMjpyZXR1cm4gZ2coZSx0LG4pfXRocm93IEVycm9yKFAoMTU2LHQudGFnKSl9O2Z1bmN0aW9uIExnKGUsdCl7cmV0dXJuIGNoKGUsdCl9ZnVuY3Rpb24geXgoZSx0LG4scil7dGhpcy50YWc9ZSx0aGlzLmtleT1uLHRoaXMuc2libGluZz10aGlzLmNoaWxkPXRoaXMucmV0dXJuPXRoaXMuc3RhdGVOb2RlPXRoaXMudHlwZT10aGlzLmVsZW1lbnRUeXBlPW51bGwsdGhpcy5pbmRleD0wLHRoaXMucmVmPW51bGwsdGhpcy5wZW5kaW5nUHJvcHM9dCx0aGlzLmRlcGVuZGVuY2llcz10aGlzLm1lbW9pemVkU3RhdGU9dGhpcy51cGRhdGVRdWV1ZT10aGlzLm1lbW9pemVkUHJvcHM9bnVsbCx0aGlzLm1vZGU9cix0aGlzLnN1YnRyZWVGbGFncz10aGlzLmZsYWdzPTAsdGhpcy5kZWxldGlvbnM9bnVsbCx0aGlzLmNoaWxkTGFuZXM9dGhpcy5sYW5lcz0wLHRoaXMuYWx0ZXJuYXRlPW51bGx9ZnVuY3Rpb24gUXQoZSx0LG4scil7cmV0dXJuIG5ldyB5eChlLHQsbixyKX1mdW5jdGlvbiBoZChlKXtyZXR1cm4gZT1lLnByb3RvdHlwZSwhKCFlfHwhZS5pc1JlYWN0Q29tcG9uZW50KX1mdW5jdGlvbiB2eChlKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIilyZXR1cm4gaGQoZSk/MTowO2lmKGUhPW51bGwpe2lmKGU9ZS4kJHR5cGVvZixlPT09TXUpcmV0dXJuIDExO2lmKGU9PT1QdSlyZXR1cm4gMTR9cmV0dXJuIDJ9ZnVuY3Rpb24gd3IoZSx0KXt2YXIgbj1lLmFsdGVybmF0ZTtyZXR1cm4gbj09PW51bGw/KG49UXQoZS50YWcsdCxlLmtleSxlLm1vZGUpLG4uZWxlbWVudFR5cGU9ZS5lbGVtZW50VHlwZSxuLnR5cGU9ZS50eXBlLG4uc3RhdGVOb2RlPWUuc3RhdGVOb2RlLG4uYWx0ZXJuYXRlPWUsZS5hbHRlcm5hdGU9bik6KG4ucGVuZGluZ1Byb3BzPXQsbi50eXBlPWUudHlwZSxuLmZsYWdzPTAsbi5zdWJ0cmVlRmxhZ3M9MCxuLmRlbGV0aW9ucz1udWxsKSxuLmZsYWdzPWUuZmxhZ3MmMTQ2ODAwNjQsbi5jaGlsZExhbmVzPWUuY2hpbGRMYW5lcyxuLmxhbmVzPWUubGFuZXMsbi5jaGlsZD1lLmNoaWxkLG4ubWVtb2l6ZWRQcm9wcz1lLm1lbW9pemVkUHJvcHMsbi5tZW1vaXplZFN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxuLnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdD1lLmRlcGVuZGVuY2llcyxuLmRlcGVuZGVuY2llcz10PT09bnVsbD9udWxsOntsYW5lczp0LmxhbmVzLGZpcnN0Q29udGV4dDp0LmZpcnN0Q29udGV4dH0sbi5zaWJsaW5nPWUuc2libGluZyxuLmluZGV4PWUuaW5kZXgsbi5yZWY9ZS5yZWYsbn1mdW5jdGlvbiB2cyhlLHQsbixyLG8sYSl7dmFyIGk9MjtpZihyPWUsdHlwZW9mIGU9PSJmdW5jdGlvbiIpaGQoZSkmJihpPTEpO2Vsc2UgaWYodHlwZW9mIGU9PSJzdHJpbmciKWk9NTtlbHNlIGU6c3dpdGNoKGUpe2Nhc2Uga286cmV0dXJuIEdyKG4uY2hpbGRyZW4sbyxhLHQpO2Nhc2UgUnU6aT04LG98PTg7YnJlYWs7Y2FzZSBVYzpyZXR1cm4gZT1RdCgxMixuLHQsb3wyKSxlLmVsZW1lbnRUeXBlPVVjLGUubGFuZXM9YSxlO2Nhc2UgJGM6cmV0dXJuIGU9UXQoMTMsbix0LG8pLGUuZWxlbWVudFR5cGU9JGMsZS5sYW5lcz1hLGU7Y2FzZSBXYzpyZXR1cm4gZT1RdCgxOSxuLHQsbyksZS5lbGVtZW50VHlwZT1XYyxlLmxhbmVzPWEsZTtjYXNlIEdtOnJldHVybiBacyhuLG8sYSx0KTtkZWZhdWx0OmlmKHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwpc3dpdGNoKGUuJCR0eXBlb2Ype2Nhc2Ugam06aT0xMDticmVhayBlO2Nhc2UgVm06aT05O2JyZWFrIGU7Y2FzZSBNdTppPTExO2JyZWFrIGU7Y2FzZSBQdTppPTE0O2JyZWFrIGU7Y2FzZSBpcjppPTE2LHI9bnVsbDticmVhayBlfXRocm93IEVycm9yKFAoMTMwLGU9PW51bGw/ZTp0eXBlb2YgZSwiIikpfXJldHVybiB0PVF0KGksbix0LG8pLHQuZWxlbWVudFR5cGU9ZSx0LnR5cGU9cix0LmxhbmVzPWEsdH1mdW5jdGlvbiBHcihlLHQsbixyKXtyZXR1cm4gZT1RdCg3LGUscix0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiBacyhlLHQsbixyKXtyZXR1cm4gZT1RdCgyMixlLHIsdCksZS5lbGVtZW50VHlwZT1HbSxlLmxhbmVzPW4sZS5zdGF0ZU5vZGU9e2lzSGlkZGVuOiExfSxlfWZ1bmN0aW9uIExjKGUsdCxuKXtyZXR1cm4gZT1RdCg2LGUsbnVsbCx0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiB6YyhlLHQsbil7cmV0dXJuIHQ9UXQoNCxlLmNoaWxkcmVuIT09bnVsbD9lLmNoaWxkcmVuOltdLGUua2V5LHQpLHQubGFuZXM9bix0LnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzplLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246ZS5pbXBsZW1lbnRhdGlvbn0sdH1mdW5jdGlvbiB3eChlLHQsbixyLG8pe3RoaXMudGFnPXQsdGhpcy5jb250YWluZXJJbmZvPWUsdGhpcy5maW5pc2hlZFdvcms9dGhpcy5waW5nQ2FjaGU9dGhpcy5jdXJyZW50PXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGwsdGhpcy50aW1lb3V0SGFuZGxlPS0xLHRoaXMuY2FsbGJhY2tOb2RlPXRoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGwsdGhpcy5jYWxsYmFja1ByaW9yaXR5PTAsdGhpcy5ldmVudFRpbWVzPWJjKDApLHRoaXMuZXhwaXJhdGlvblRpbWVzPWJjKC0xKSx0aGlzLmVudGFuZ2xlZExhbmVzPXRoaXMuZmluaXNoZWRMYW5lcz10aGlzLm11dGFibGVSZWFkTGFuZXM9dGhpcy5leHBpcmVkTGFuZXM9dGhpcy5waW5nZWRMYW5lcz10aGlzLnN1c3BlbmRlZExhbmVzPXRoaXMucGVuZGluZ0xhbmVzPTAsdGhpcy5lbnRhbmdsZW1lbnRzPWJjKDApLHRoaXMuaWRlbnRpZmllclByZWZpeD1yLHRoaXMub25SZWNvdmVyYWJsZUVycm9yPW8sdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPW51bGx9ZnVuY3Rpb24gZ2QoZSx0LG4scixvLGEsaSxzLGwpe3JldHVybiBlPW5ldyB3eChlLHQsbixzLGwpLHQ9PT0xPyh0PTEsYT09PSEwJiYodHw9OCkpOnQ9MCxhPVF0KDMsbnVsbCxudWxsLHQpLGUuY3VycmVudD1hLGEuc3RhdGVOb2RlPWUsYS5tZW1vaXplZFN0YXRlPXtlbGVtZW50OnIsaXNEZWh5ZHJhdGVkOm4sY2FjaGU6bnVsbCx0cmFuc2l0aW9uczpudWxsLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6bnVsbH0sWnUoYSksZX1mdW5jdGlvbiBieChlLHQsbil7dmFyIHI9Mzxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOmJvLGtleTpyPT1udWxsP251bGw6IiIrcixjaGlsZHJlbjplLGNvbnRhaW5lckluZm86dCxpbXBsZW1lbnRhdGlvbjpufX1mdW5jdGlvbiB6ZyhlKXtpZighZSlyZXR1cm4ga3I7ZT1lLl9yZWFjdEludGVybmFscztlOntpZihacihlKSE9PWV8fGUudGFnIT09MSl0aHJvdyBFcnJvcihQKDE3MCkpO3ZhciB0PWU7ZG97c3dpdGNoKHQudGFnKXtjYXNlIDM6dD10LnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGU7Y2FzZSAxOmlmKF90KHQudHlwZSkpe3Q9dC5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgZX19dD10LnJldHVybn13aGlsZSh0IT09bnVsbCk7dGhyb3cgRXJyb3IoUCgxNzEpKX1pZihlLnRhZz09PTEpe3ZhciBuPWUudHlwZTtpZihfdChuKSlyZXR1cm4gemgoZSxuLHQpfXJldHVybiB0fWZ1bmN0aW9uIEZnKGUsdCxuLHIsbyxhLGkscyxsKXtyZXR1cm4gZT1nZChuLHIsITAsZSxvLGEsaSxzLGwpLGUuY29udGV4dD16ZyhudWxsKSxuPWUuY3VycmVudCxyPXZ0KCksbz12cihuKSxhPSRuKHIsbyksYS5jYWxsYmFjaz10Pz9udWxsLGdyKG4sYSxvKSxlLmN1cnJlbnQubGFuZXM9byxaYShlLG8sciksQ3QoZSxyKSxlfWZ1bmN0aW9uIGVsKGUsdCxuLHIpe3ZhciBvPXQuY3VycmVudCxhPXZ0KCksaT12cihvKTtyZXR1cm4gbj16ZyhuKSx0LmNvbnRleHQ9PT1udWxsP3QuY29udGV4dD1uOnQucGVuZGluZ0NvbnRleHQ9bix0PSRuKGEsaSksdC5wYXlsb2FkPXtlbGVtZW50OmV9LHI9cj09PXZvaWQgMD9udWxsOnIsciE9PW51bGwmJih0LmNhbGxiYWNrPXIpLGU9Z3Iobyx0LGkpLGUhPT1udWxsJiYoZm4oZSxvLGksYSkscHMoZSxvLGkpKSxpfWZ1bmN0aW9uIEJzKGUpe2lmKGU9ZS5jdXJyZW50LCFlLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChlLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gV20oZSx0KXtpZihlPWUubWVtb2l6ZWRTdGF0ZSxlIT09bnVsbCYmZS5kZWh5ZHJhdGVkIT09bnVsbCl7dmFyIG49ZS5yZXRyeUxhbmU7ZS5yZXRyeUxhbmU9biE9PTAmJm48dD9uOnR9fWZ1bmN0aW9uIHlkKGUsdCl7V20oZSx0KSwoZT1lLmFsdGVybmF0ZSkmJldtKGUsdCl9ZnVuY3Rpb24ga3goKXtyZXR1cm4gbnVsbH12YXIgVWc9dHlwZW9mIHJlcG9ydEVycm9yPT0iZnVuY3Rpb24iP3JlcG9ydEVycm9yOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9O2Z1bmN0aW9uIHZkKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfXRsLnByb3RvdHlwZS5yZW5kZXI9dmQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnRlcm5hbFJvb3Q7aWYodD09PW51bGwpdGhyb3cgRXJyb3IoUCg0MDkpKTtlbChlLHQsbnVsbCxudWxsKX07dGwucHJvdG90eXBlLnVubW91bnQ9dmQucHJvdG90eXBlLnVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9pbnRlcm5hbFJvb3Q7aWYoZSE9PW51bGwpe3RoaXMuX2ludGVybmFsUm9vdD1udWxsO3ZhciB0PWUuY29udGFpbmVySW5mbztKcihmdW5jdGlvbigpe2VsKG51bGwsZSxudWxsLG51bGwpfSksdFtCbl09bnVsbH19O2Z1bmN0aW9uIHRsKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfXRsLnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbj1mdW5jdGlvbihlKXtpZihlKXt2YXIgdD1naCgpO2U9e2Jsb2NrZWRPbjpudWxsLHRhcmdldDplLHByaW9yaXR5OnR9O2Zvcih2YXIgbj0wO248bHIubGVuZ3RoJiZ0IT09MCYmdDxscltuXS5wcmlvcml0eTtuKyspO2xyLnNwbGljZShuLDAsZSksbj09PTAmJnZoKGUpfX07ZnVuY3Rpb24gd2QoZSl7cmV0dXJuISghZXx8ZS5ub2RlVHlwZSE9PTEmJmUubm9kZVR5cGUhPT05JiZlLm5vZGVUeXBlIT09MTEpfWZ1bmN0aW9uIG5sKGUpe3JldHVybiEoIWV8fGUubm9kZVR5cGUhPT0xJiZlLm5vZGVUeXBlIT09OSYmZS5ub2RlVHlwZSE9PTExJiYoZS5ub2RlVHlwZSE9PTh8fGUubm9kZVZhbHVlIT09IiByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAiKSl9ZnVuY3Rpb24gQm0oKXt9ZnVuY3Rpb24geHgoZSx0LG4scixvKXtpZihvKXtpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7dmFyIGE9cjtyPWZ1bmN0aW9uKCl7dmFyIGM9QnMoaSk7YS5jYWxsKGMpfX12YXIgaT1GZyh0LHIsZSwwLG51bGwsITEsITEsIiIsQm0pO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI9aSxlW0JuXT1pLmN1cnJlbnQsamEoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLEpyKCksaX1mb3IoO289ZS5sYXN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQobyk7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBzPXI7cj1mdW5jdGlvbigpe3ZhciBjPUJzKGwpO3MuY2FsbChjKX19dmFyIGw9Z2QoZSwwLCExLG51bGwsbnVsbCwhMSwhMSwiIixCbSk7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj1sLGVbQm5dPWwuY3VycmVudCxqYShlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGU6ZSksSnIoZnVuY3Rpb24oKXtlbCh0LGwsbixyKX0pLGx9ZnVuY3Rpb24gcmwoZSx0LG4scixvKXt2YXIgYT1uLl9yZWFjdFJvb3RDb250YWluZXI7aWYoYSl7dmFyIGk9YTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil7dmFyIHM9bztvPWZ1bmN0aW9uKCl7dmFyIGw9QnMoaSk7cy5jYWxsKGwpfX1lbCh0LGksZSxvKX1lbHNlIGk9eHgobix0LGUsbyxyKTtyZXR1cm4gQnMoaSl9bWg9ZnVuY3Rpb24oZSl7c3dpdGNoKGUudGFnKXtjYXNlIDM6dmFyIHQ9ZS5zdGF0ZU5vZGU7aWYodC5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXt2YXIgbj1UYSh0LnBlbmRpbmdMYW5lcyk7biE9PTAmJihGdSh0LG58MSksQ3QodCxIZSgpKSwhKGhlJjYpJiYoam89SGUoKSs1MDAsRXIoKSkpfWJyZWFrO2Nhc2UgMTM6SnIoZnVuY3Rpb24oKXt2YXIgcj1IbihlLDEpO2lmKHIhPT1udWxsKXt2YXIgbz12dCgpO2ZuKHIsZSwxLG8pfX0pLHlkKGUsMSl9fTtVdT1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1IbihlLDEzNDIxNzcyOCk7aWYodCE9PW51bGwpe3ZhciBuPXZ0KCk7Zm4odCxlLDEzNDIxNzcyOCxuKX15ZChlLDEzNDIxNzcyOCl9fTtoaD1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD12cihlKSxuPUhuKGUsdCk7aWYobiE9PW51bGwpe3ZhciByPXZ0KCk7Zm4obixlLHQscil9eWQoZSx0KX19O2doPWZ1bmN0aW9uKCl7cmV0dXJuIHhlfTt5aD1mdW5jdGlvbihlLHQpe3ZhciBuPXhlO3RyeXtyZXR1cm4geGU9ZSx0KCl9ZmluYWxseXt4ZT1ufX07SmM9ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaCh0KXtjYXNlImlucHV0IjppZihqYyhlLG4pLHQ9bi5uYW1lLG4udHlwZT09PSJyYWRpbyImJnQhPW51bGwpe2ZvcihuPWU7bi5wYXJlbnROb2RlOyluPW4ucGFyZW50Tm9kZTtmb3Iobj1uLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9IitKU09OLnN0cmluZ2lmeSgiIit0KSsnXVt0eXBlPSJyYWRpbyJdJyksdD0wO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdO2lmKHIhPT1lJiZyLmZvcm09PT1lLmZvcm0pe3ZhciBvPUtzKHIpO2lmKCFvKXRocm93IEVycm9yKFAoOTApKTtZbShyKSxqYyhyLG8pfX19YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6UW0oZSxuKTticmVhaztjYXNlInNlbGVjdCI6dD1uLnZhbHVlLHQhPW51bGwmJklvKGUsISFuLm11bHRpcGxlLHQsITEpfX07cmg9cGQ7b2g9SnI7dmFyIFN4PXt1c2luZ0NsaWVudEVudHJ5UG9pbnQ6ITEsRXZlbnRzOlt0aSxUbyxLcyx0aCxuaCxwZF19LGthPXtmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpCcixidW5kbGVUeXBlOjAsdmVyc2lvbjoiMTguMy4xIixyZW5kZXJlclBhY2thZ2VOYW1lOiJyZWFjdC1kb20ifSxFeD17YnVuZGxlVHlwZTprYS5idW5kbGVUeXBlLHZlcnNpb246a2EudmVyc2lvbixyZW5kZXJlclBhY2thZ2VOYW1lOmthLnJlbmRlcmVyUGFja2FnZU5hbWUscmVuZGVyZXJDb25maWc6a2EucmVuZGVyZXJDb25maWcsb3ZlcnJpZGVIb29rU3RhdGU6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzOm51bGwsb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzUmVuYW1lUGF0aDpudWxsLHNldEVycm9ySGFuZGxlcjpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6Vm4uUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1zaChlKSxlPT09bnVsbD9udWxsOmUuc3RhdGVOb2RlfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTprYS5maW5kRmliZXJCeUhvc3RJbnN0YW5jZXx8a3gsZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOm51bGwsc2NoZWR1bGVSZWZyZXNoOm51bGwsc2NoZWR1bGVSb290Om51bGwsc2V0UmVmcmVzaEhhbmRsZXI6bnVsbCxnZXRDdXJyZW50RmliZXI6bnVsbCxyZWNvbmNpbGVyVmVyc2lvbjoiMTguMy4xLW5leHQtZjEzMzhmODA4MC0yMDI0MDQyNiJ9O2lmKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX188InUiJiYoeGE9X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLCF4YS5pc0Rpc2FibGVkJiZ4YS5zdXBwb3J0c0ZpYmVyKSl0cnl7SHM9eGEuaW5qZWN0KEV4KSxEbj14YX1jYXRjaHt9dmFyIHhhO1d0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPVN4O1d0LmNyZWF0ZVBvcnRhbD1mdW5jdGlvbihlLHQpe3ZhciBuPTI8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzJdIT09dm9pZCAwP2FyZ3VtZW50c1syXTpudWxsO2lmKCF3ZCh0KSl0aHJvdyBFcnJvcihQKDIwMCkpO3JldHVybiBieChlLHQsbnVsbCxuKX07V3QuY3JlYXRlUm9vdD1mdW5jdGlvbihlLHQpe2lmKCF3ZChlKSl0aHJvdyBFcnJvcihQKDI5OSkpO3ZhciBuPSExLHI9IiIsbz1VZztyZXR1cm4gdCE9bnVsbCYmKHQudW5zdGFibGVfc3RyaWN0TW9kZT09PSEwJiYobj0hMCksdC5pZGVudGlmaWVyUHJlZml4IT09dm9pZCAwJiYocj10LmlkZW50aWZpZXJQcmVmaXgpLHQub25SZWNvdmVyYWJsZUVycm9yIT09dm9pZCAwJiYobz10Lm9uUmVjb3ZlcmFibGVFcnJvcikpLHQ9Z2QoZSwxLCExLG51bGwsbnVsbCxuLCExLHIsbyksZVtCbl09dC5jdXJyZW50LGphKGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZTplKSxuZXcgdmQodCl9O1d0LmZpbmRET01Ob2RlPWZ1bmN0aW9uKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYoZS5ub2RlVHlwZT09PTEpcmV0dXJuIGU7dmFyIHQ9ZS5fcmVhY3RJbnRlcm5hbHM7aWYodD09PXZvaWQgMCl0aHJvdyB0eXBlb2YgZS5yZW5kZXI9PSJmdW5jdGlvbiI/RXJyb3IoUCgxODgpKTooZT1PYmplY3Qua2V5cyhlKS5qb2luKCIsIiksRXJyb3IoUCgyNjgsZSkpKTtyZXR1cm4gZT1zaCh0KSxlPWU9PT1udWxsP251bGw6ZS5zdGF0ZU5vZGUsZX07V3QuZmx1c2hTeW5jPWZ1bmN0aW9uKGUpe3JldHVybiBKcihlKX07V3QuaHlkcmF0ZT1mdW5jdGlvbihlLHQsbil7aWYoIW5sKHQpKXRocm93IEVycm9yKFAoMjAwKSk7cmV0dXJuIHJsKG51bGwsZSx0LCEwLG4pfTtXdC5oeWRyYXRlUm9vdD1mdW5jdGlvbihlLHQsbil7aWYoIXdkKGUpKXRocm93IEVycm9yKFAoNDA1KSk7dmFyIHI9biE9bnVsbCYmbi5oeWRyYXRlZFNvdXJjZXN8fG51bGwsbz0hMSxhPSIiLGk9VWc7aWYobiE9bnVsbCYmKG4udW5zdGFibGVfc3RyaWN0TW9kZT09PSEwJiYobz0hMCksbi5pZGVudGlmaWVyUHJlZml4IT09dm9pZCAwJiYoYT1uLmlkZW50aWZpZXJQcmVmaXgpLG4ub25SZWNvdmVyYWJsZUVycm9yIT09dm9pZCAwJiYoaT1uLm9uUmVjb3ZlcmFibGVFcnJvcikpLHQ9RmcodCxudWxsLGUsMSxuPz9udWxsLG8sITEsYSxpKSxlW0JuXT10LmN1cnJlbnQsamEoZSkscilmb3IoZT0wO2U8ci5sZW5ndGg7ZSsrKW49cltlXSxvPW4uX2dldFZlcnNpb24sbz1vKG4uX3NvdXJjZSksdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPT1udWxsP3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1bbixvXTp0Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChuLG8pO3JldHVybiBuZXcgdGwodCl9O1d0LnJlbmRlcj1mdW5jdGlvbihlLHQsbil7aWYoIW5sKHQpKXRocm93IEVycm9yKFAoMjAwKSk7cmV0dXJuIHJsKG51bGwsZSx0LCExLG4pfTtXdC51bm1vdW50Q29tcG9uZW50QXROb2RlPWZ1bmN0aW9uKGUpe2lmKCFubChlKSl0aHJvdyBFcnJvcihQKDQwKSk7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj8oSnIoZnVuY3Rpb24oKXtybChudWxsLG51bGwsZSwhMSxmdW5jdGlvbigpe2UuX3JlYWN0Um9vdENvbnRhaW5lcj1udWxsLGVbQm5dPW51bGx9KX0pLCEwKTohMX07V3QudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM9cGQ7V3QudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI9ZnVuY3Rpb24oZSx0LG4scil7aWYoIW5sKG4pKXRocm93IEVycm9yKFAoMjAwKSk7aWYoZT09bnVsbHx8ZS5fcmVhY3RJbnRlcm5hbHM9PT12b2lkIDApdGhyb3cgRXJyb3IoUCgzOCkpO3JldHVybiBybChlLHQsbiwhMSxyKX07V3QudmVyc2lvbj0iMTguMy4xLW5leHQtZjEzMzhmODA4MC0yMDI0MDQyNiJ9KTt2YXIgSGc9RnIoKG5BLEJnKT0+eyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBXZygpe2lmKCEodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXz4idSJ8fHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UhPSJmdW5jdGlvbiIpKXRyeXtfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoV2cpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9fVdnKCksQmcuZXhwb3J0cz0kZygpfSk7dmFyIFZnPUZyKGJkPT57InVzZSBzdHJpY3QiO3ZhciBqZz1IZygpO2JkLmNyZWF0ZVJvb3Q9amcuY3JlYXRlUm9vdCxiZC5oeWRyYXRlUm9vdD1qZy5oeWRyYXRlUm9vdDt2YXIgckF9KTt2YXIgWjA9cGUoZGUoKSwxKSxlYj1wZShWZygpLDEpO3ZhciBidD17REVGQVVMVDoiZGVmYXVsdCIsTEFZT1VUX0NPTkZJRzoibGF5b3V0Q29uZmlnIixTRVRUSU5HU19DT05GSUc6InNldHRpbmdzQ29uZmlnIn07dmFyIEtnPXR5cGVvZiBwcm9jZXNzPCJ1IiYmITEsaG49ITEsa2Q9MzAsUmU9InBsdWdpbnMvZGFzaGJvYXJkIixvbD0icGxhbm5pbmcvcXVhcnRlcmx5IixZZz17YW50aHJvcGljOiJBbnRocm9waWMgQVBJIEtleSIsZGVlcHNlZWs6IkRlZXBTZWVrIEFQSSBLZXkiLGdlbWluaToiR2VtaW5pIEFQSSBLZXkiLGdyb2s6Ikdyb2sgQVBJIEtleSIsb3BlbmFpOiJPcGVuQUkgQVBJIEtleSJ9O3ZhciBHPXtCQUNLR1JPVU5EX0lNQUdFX1VSTDoiQmFja2dyb3VuZCBJbWFnZSBVUkwiLEJBQ0tHUk9VTkRfSU1BR0VfTU9ERToiQmFja2dyb3VuZCBJbWFnZSBNb2RlIixDT05TT0xFX0xPR0dJTkc6IkNvbnNvbGUgbG9nZ2luZyIsREFTSEJPQVJEX0NPTVBPTkVOVFM6ImRhc2hib2FyZF9lbGVtZW50cyIsREVCVUdfQ09OU09MRToiZGVidWdfY29uc29sZSIsTExNX0FQSV9LRVlfQU5USFJPUElDOiJBbnRocm9waWMgQVBJIEtleSIsTExNX0FQSV9LRVlfR0VNSU5JOiJHZW1pbmkgQVBJIEtleSIsTExNX0FQSV9LRVlfR1JPSzoiR3JvayBBUEkgS2V5IixMTE1fQVBJX0tFWV9PUEVOQUk6Ik9wZW5BSSBBUEkgS2V5IixMTE1fUFJPVklERVJfTU9ERUw6IkxMTSBQcm92aWRlciIsRklSU1RfSU5TVEFMTEVEX0FUOiJkYXNoYm9hcmRfZmlyc3RfaW5zdGFsbGVkX2F0IixTRUxFQ1RFRF9MQVlPVVRfUFJPRklMRToiZGFzaGJvYXJkX3NlbGVjdGVkX2xheW91dF9wcm9maWxlIixUQVNLX0RPTUFJTlM6ImRhc2hib2FyZF90YXNrX2RvbWFpbnMiLFBMQU5OSU5HX05PVEVfVEFHOiJUYWcgdG8gYXBwbHkgdG8gcGxhbm5pbmcgbm90ZXMifSxxZz17YW50aHJvcGljOkcuTExNX0FQSV9LRVlfQU5USFJPUElDLGdlbWluaTpHLkxMTV9BUElfS0VZX0dFTUlOSSxncm9rOkcuTExNX0FQSV9LRVlfR1JPSyxvcGVuYWk6Ry5MTE1fQVBJX0tFWV9PUEVOQUl9LEdnPXtub25lOm51bGwsb3BlbmFpOiJvcGVuYWkiLGFudGhyb3BpYzoiYW50aHJvcGljIiwiYW50aHJvcGljLXNvbm5ldCI6ImFudGhyb3BpYyIsZ2VtaW5pOiJnZW1pbmkiLGdyb2s6Imdyb2sifTtmdW5jdGlvbiBUcihlKXtyZXR1cm4hZXx8ZT09PSJub25lIj9udWxsOk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChHZyxlKT9HZ1tlXTpxZ1tlXT9lOm51bGx9ZnVuY3Rpb24gQXQoZSl7cmV0dXJuIHFnW2VdfHxudWxsfWZ1bmN0aW9uIEtvKGUpe3JldHVybmBkYXNoYm9hcmRfJHtlfV9jb25maWdgfWZ1bmN0aW9uIGFsKGUsdCl7bGV0IG49ZT8uW0tvKHQpXTtpZighbilyZXR1cm5bXTtpZihBcnJheS5pc0FycmF5KG4pKXJldHVybiBuO3RyeXtyZXR1cm4gSlNPTi5wYXJzZShuKX1jYXRjaHtyZXR1cm5bXX19dmFyIFFnPVt7dmFsdWU6ImNvdmVyIixsYWJlbDoiQ292ZXIgKGZpbGwgZW50aXJlIGJhY2tncm91bmQpIn0se3ZhbHVlOiJjb250YWluIixsYWJlbDoiQ29udGFpbiAoZml0IHdpdGhvdXQgY3JvcHBpbmcpIn0se3ZhbHVlOiJyZXBlYXQiLGxhYmVsOiJSZXBlYXQgKHRpbGUgdGhlIGltYWdlKSJ9LHt2YWx1ZToicmVwZWF0LXgiLGxhYmVsOiJSZXBlYXQgaG9yaXpvbnRhbGx5In0se3ZhbHVlOiJyZXBlYXQteSIsbGFiZWw6IlJlcGVhdCB2ZXJ0aWNhbGx5In0se3ZhbHVlOiJuby1yZXBlYXQiLGxhYmVsOiJObyByZXBlYXQgKHNpbmdsZSBjZW50ZXJlZCBpbWFnZSkifV0sYUE9Ry5EQVNIQk9BUkRfQ09NUE9ORU5UUyxUeD0yNCo2MCo2MCoxZTMsT3Q9W3t3aWRnZXRJZDoibGF5b3V0LXBpY2tlciIsbmFtZToiTGF5b3V0IFBpY2tlciIsZGVzY3JpcHRpb246Ik9uZS1jbGljayBwcmVzZXRzIHRoYXQgcmVhcnJhbmdlIHlvdXIgZW50aXJlIGRhc2hib2FyZCBpbnRvIGEgY3VyYXRlZCBwcm9maWxlIixpY29uOiJcdXsxRjVDMn1cdUZFMEYiLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjIsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InBsYW5uaW5nIixuYW1lOiJRdWFydGVybHkgUGxhbm5pbmciLGRlc2NyaXB0aW9uOiJQbGFuIGFuZCB0cmFjayB5b3VyIHF1YXJ0ZXJseSBnb2FscyBhbmQgcHJpb3JpdGllcyIsaWNvbjoiXHV7MUY0Q0J9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJ2aWN0b3J5LXZhbHVlIixuYW1lOiJWaWN0b3J5IFZhbHVlIixkZXNjcmlwdGlvbjoiQ2VsZWJyYXRlIHdpbnMgYW5kIHRyYWNrIGhpZ2gtdmFsdWUgdGFzayBjb21wbGV0aW9ucyIsaWNvbjoiXHV7MUYzQzZ9IixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJkcmVhbS10YXNrIixuYW1lOiJHb2FsIENvYWNoIixkZXNjcmlwdGlvbjoiR2V0IHRhc2sgc3VnZ2VzdGlvbnMgdGhhdCBibGVuZCBxdWFydGVybHkvbW9udGhseSBnb2FscyB3aXRoIGRheS1vZi13ZWVrIHByZWZlcmVuY2VzIixpY29uOiJcdXsxRjUyRX0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6ImRheS1za2V0Y2giLG5hbWU6IkRheSBTa2V0Y2hlciIsZGVzY3JpcHRpb246Ik5vdGVib29rLXBhcGVyIGRheSBwbGFubmVyIHdpdGggaG91ci1ieS1ob3VyIGVudHJpZXMgc2F2ZWQgdG8gYSBub3RlIixpY29uOiJcdXsxRjVEMn1cdUZFMEYiLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6ImFnZW5kYSIsbmFtZToiVGFzayBBZ2VuZGEiLGRlc2NyaXB0aW9uOiJWaWV3IGFuZCBtYW5hZ2UgeW91ciBwcmlvcml0aXplZCB0YXNrIGxpc3QiLGljb246Ilx1ezFGNENDfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoicXVvdGVzIixuYW1lOiJJbnNwaXJhdGlvbiBRdW90ZXMiLGRlc2NyaXB0aW9uOiJSb3RhdGluZyBpbnNwaXJhdGlvbmFsIHF1b3RlcyB0byBrZWVwIHlvdSBtb3RpdmF0ZWQiLGljb246Ilx1ezFGNEExfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoiZ3JhdmV5YXJkIixuYW1lOiJUYXNrIFJldGlyZW1lbnQgQ2VudGVyIixkZXNjcmlwdGlvbjoiU3VyZmFjZSBuZWdsZWN0ZWQgdGFza3MgYW5kIHJldGlyZSB0aGVtIHRvIGFuIGFyY2hpdmVkIG5vdGUiLGljb246Ilx1ezFGNDc1fVx1RkUwRiIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MixpbnRyb2R1Y2VkQXQ6IjIwMjYtMDUtMDkiLG1heEhvcml6b250YWxUaWxlczoyLG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJyZWNlbnQtbm90ZXMiLG5hbWU6IlJldmlzaXQgQ2FuZGlkYXRlIixkZXNjcmlwdGlvbjoiTm90ZXMgd2l0aCBvcGVuIHRhc2tzIHRoYXQgaGF2ZSBub3QgaGFkIGEgbmV3IHRhc2sgaW4gb3ZlciBhIHdlZWsiLGljb246Ilx1ezFGNENDfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MSxtYXhIb3Jpem9udGFsVGlsZXM6NCxtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoibW9vZCIsbmFtZToiTW9vZCBUcmFja2VyIix2aXNpYmxlVGl0bGU6IkhvdyBhcmUgeW91IGZlZWxpbmc/IixkZXNjcmlwdGlvbjoiTG9nIHlvdXIgZGFpbHkgbW9vZCBhbmQgdmlzdWFsaXplIHRyZW5kcyBvdmVyIHRpbWUiLGljb246Ilx1ezFGM0FEfSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MSxtYXhIb3Jpem9udGFsVGlsZXM6MixtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoiY2FsZW5kYXIiLG5hbWU6IkNhbGVuZGFyIixkZXNjcmlwdGlvbjoiU2VlIHVwY29taW5nIGV2ZW50cyBhbmQgYXBwb2ludG1lbnRzIGF0IGEgZ2xhbmNlIixpY29uOiJcdXsxRjRDNX0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjEsbWF4SG9yaXpvbnRhbFRpbGVzOjIsbWF4VmVydGljYWxUaWxlczoyfSx7d2lkZ2V0SWQ6InF1aWNrLWFjdGlvbnMiLG5hbWU6IlF1aWNrIEFjdGlvbnMiLGRlc2NyaXB0aW9uOiJTaG9ydGN1dHMgZm9yIHlvdXIgbW9zdCBmcmVxdWVudGx5IHVzZWQgZGFzaGJvYXJkIGFjdGlvbnMiLGljb246Ilx1MjZBMSIsZGVmYXVsdEdyaWRXaWR0aFNpemU6MSxtYXhIb3Jpem9udGFsVGlsZXM6MixtYXhWZXJ0aWNhbFRpbGVzOjJ9LHt3aWRnZXRJZDoicGVhay1ob3VycyIsbmFtZToiUGVhayBIb3VycyIsZGVzY3JpcHRpb246IkhvdXJseSBkaXN0cmlidXRpb24gb2YgdGFzayBjcmVhdGlvbiBhbmQgY29tcGxldGlvbiBhY3Rpdml0eSIsaWNvbjoiXHUyM0YwIixkZWZhdWx0R3JpZFdpZHRoU2l6ZToyLG1heEhvcml6b250YWxUaWxlczo0LG1heFZlcnRpY2FsVGlsZXM6Mn0se3dpZGdldElkOiJkZWJ1Zy1jb25zb2xlIixuYW1lOiJEZWJ1ZyBDb25zb2xlIixkZXNjcmlwdGlvbjoiU2Nyb2xsYWJsZSBsb2cgdmlld2VyIHNob3dpbmcgYWxsIGxvZ0lmRW5hYmxlZCBtZXNzYWdlcyAoZGV2ZWxvcGVyIHRvb2wpIixpY29uOiJcdXsxRjQxQn0iLGRlZmF1bHRHcmlkV2lkdGhTaXplOjIsbWF4SG9yaXpvbnRhbFRpbGVzOjQsbWF4VmVydGljYWxUaWxlczoyLGRlYnVnT25seTohMH1dO2Z1bmN0aW9uIHJlKGUpe2xldCB0PU90LmZpbmQobj0+bi53aWRnZXRJZD09PWUpO3JldHVybiB0Py52aXNpYmxlVGl0bGV8fHQ/Lm5hbWV8fGV9ZnVuY3Rpb24gSmcoZSl7cmV0dXJuIE90LmZpbmQodD0+dC53aWRnZXRJZD09PWUpfHxudWxsfXZhciBOcj1PdC5maWx0ZXIoZT0+IWUuZGVidWdPbmx5KS5tYXAoZT0+KHt3aWRnZXRJZDplLndpZGdldElkLGdyaWRXaWR0aFNpemU6ZS5kZWZhdWx0R3JpZFdpZHRoU2l6ZSxncmlkSGVpZ2h0U2l6ZToxLHNldHRpbmdzOnt9fSkpO3ZhciB4ZD0hMSxOeD0wLER4PTIwMCxpbD1bXSxTZD1uZXcgU2V0O2Z1bmN0aW9uIEVkKGUpe2lmKHR5cGVvZiBlPT0iYm9vbGVhbiIpe3hkPWU7cmV0dXJufWxldCB0PVN0cmluZyhlfHwiIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7eGQ9WyJ0cnVlIiwieWVzIiwiMSIsIm9uIiwiZW5hYmxlZCJdLmluY2x1ZGVzKHQpfWZ1bmN0aW9uIEUoLi4uZSl7aWYoeGQpe2NvbnNvbGUubG9nKC4uLmUpO2xldCB0PXtpZDorK054LHRzOkRhdGUubm93KCksYXJnczplfTtpbC5wdXNoKHQpLGlsLmxlbmd0aD5EeCYmaWwuc2hpZnQoKSxzZXRUaW1lb3V0KCgpPT5TZC5mb3JFYWNoKG49Pm4odCkpLDApfX1mdW5jdGlvbiBYZygpe3JldHVyblsuLi5pbF19ZnVuY3Rpb24gWmcoZSl7U2QuYWRkKGUpfWZ1bmN0aW9uIGV5KGUpe1NkLmRlbGV0ZShlKX12YXIgWW89eyJkb21haW4td29yay11dWlkIjpbe3V1aWQ6Im5vdGUtd29yay0xIixuYW1lOiJRMSBHb2FsIFJldmlldyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay0yIixuYW1lOiJTdGFuZC11cCBOb3RlcyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay0zIixuYW1lOiJGZWF0dXJlIEltcGxlbWVudGF0aW9uIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTQiLG5hbWU6IkRlc2lnbiBGZWVkYmFjayIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay01IixuYW1lOiJCdWRnZXQgVHJhY2tlciIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay02IixuYW1lOiJPZmZsaW5lIFRlc3RpbmciLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLXdvcmstNyIsbmFtZToiU3ByaW50IFJldHJvIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTgiLG5hbWU6IkFQSSBMYXllciBSZXNlYXJjaCIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay05IixuYW1lOiJJbnRlZ3JhdGlvbiBUZXN0cyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay0xMCIsbmFtZToiUHVsbCBSZXF1ZXN0IFF1ZXVlIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTExIixuYW1lOiJTZXR0aW5ncyBNb2R1bGUgVGVzdHMiLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLXdvcmstMTIiLG5hbWU6IkNTUyBDbGVhbnVwIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTEzIixuYW1lOiJEYXNoYm9hcmQgTWVtb3J5IExlYWsiLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLXdvcmstMTQiLG5hbWU6IkNsaWVudCBGZWVkYmFjayIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtd29yay0xNSIsbmFtZToiQVBJIEVycm9yIEhhbmRsaW5nIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS13b3JrLTE2IixuYW1lOiJBdXRoIFRva2VuIFJlZnJlc2giLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLXdvcmstMTciLG5hbWU6IkRCIFF1ZXJ5IFBlcmZvcm1hbmNlIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS1vbGQtM21vIixuYW1lOiJTZWN1cml0eSBCYWNrbG9nIChRNCkiLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLW9sZC00bW8iLG5hbWU6IlBsYXRmb3JtIE1pZ3JhdGlvbiBOb3RlcyIsdGFnczpbIndvcmsiXX0se3V1aWQ6Im5vdGUtb2xkLTVtbyIsbmFtZToiVGVjaCBEZWJ0IFRyYWNrZXIiLHRhZ3M6WyJ3b3JrIl19LHt1dWlkOiJub3RlLW9sZC02bW8iLG5hbWU6IkFiYW5kb25lZCBGZWF0dXJlIENvbmNlcHRzIix0YWdzOlsid29yayJdfSx7dXVpZDoibm90ZS1vbGQtN21vIixuYW1lOiJMZWdhY3kgU3lzdGVtIERvY3MiLHRhZ3M6WyJ3b3JrIl19XSwiZG9tYWluLXBlcnNvbmFsLXV1aWQiOlt7dXVpZDoibm90ZS1wZXJzb25hbC0xIixuYW1lOiJOZXR3b3JraW5nIE91dHJlYWNoIix0YWdzOlsicGVyc29uYWwiXX0se3V1aWQ6Im5vdGUtcGVyc29uYWwtMiIsbmFtZToiRml0bmVzcyBMb2ciLHRhZ3M6WyJwZXJzb25hbCJdfSx7dXVpZDoibm90ZS1wZXJzb25hbC0zIixuYW1lOiJTb2NpYWwgUmVtaW5kZXJzIix0YWdzOlsicGVyc29uYWwiXX0se3V1aWQ6Im5vdGUtcGVyc29uYWwtNCIsbmFtZToiRW50ZXJ0YWlubWVudCIsdGFnczpbInBlcnNvbmFsIl19LHt1dWlkOiJub3RlLXBlcnNvbmFsLTUiLG5hbWU6IlNob3BwaW5nIExpc3QiLHRhZ3M6WyJwZXJzb25hbCJdfSx7dXVpZDoibm90ZS1wZXJzb25hbC02IixuYW1lOiJIZWFsdGggQXBwb2ludG1lbnRzIix0YWdzOlsicGVyc29uYWwiXX0se3V1aWQ6Im5vdGUtcGVyc29uYWwtNyIsbmFtZToiUmVhZGluZyBMaXN0Iix0YWdzOlsicGVyc29uYWwiXX0se3V1aWQ6Im5vdGUtcGVyc29uYWwtOCIsbmFtZToiSG9iYmllcyIsdGFnczpbInBlcnNvbmFsIl19LHt1dWlkOiJub3RlLXBlcnNvbmFsLTkiLG5hbWU6IlRyaXAgUGxhbm5pbmciLHRhZ3M6WyJwZXJzb25hbCJdfSx7dXVpZDoibm90ZS1wZXJzb25hbC0xMCIsbmFtZToiSG9tZSBPZmZpY2UiLHRhZ3M6WyJwZXJzb25hbCJdfV0sImRvbWFpbi1zaWRlLXV1aWQiOlt7dXVpZDoibm90ZS1zaWRlLTEiLG5hbWU6IkJsb2cgUG9zdCBJZGVhcyIsdGFnczpbInNpZGUtcHJvamVjdHMiXX0se3V1aWQ6Im5vdGUtc2lkZS0yIixuYW1lOiJTaWRlIFByb2plY3QgUkVBRE1FIix0YWdzOlsic2lkZS1wcm9qZWN0cyJdfSx7dXVpZDoibm90ZS1zaWRlLTMiLG5hbWU6IkNJIFBpcGVsaW5lIFNldHVwIix0YWdzOlsic2lkZS1wcm9qZWN0cyJdfV19O2Z1bmN0aW9uIHR5KGUpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxTeW1ib2wuYXN5bmNJdGVyYXRvcix7dmFsdWU6ZnVuY3Rpb24oKXtsZXQgdD0wO3JldHVybntuZXh0OigpPT50PGUubGVuZ3RoP1Byb21pc2UucmVzb2x2ZSh7dmFsdWU6ZVt0KytdLGRvbmU6ITF9KTpQcm9taXNlLnJlc29sdmUoe2RvbmU6ITB9KX19fSksZX12YXIgbnk9IkNvbnNvbGUgbG9nZ2luZyIsX3g9bmV3IFNldChbImNoYW5nZWQiLCJjcmVhdGVkIiwib3BlbmVkIiwicmVsZXZhbmNlIiwidGl0bGUiLCJ1cGRhdGVkIl0pO2Z1bmN0aW9uIHNsKGUpe3JldHVybmBkYXNoYm9hcmRfJHtlfV9jb25maWdgfWZ1bmN0aW9uIFRkKGUpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/ZTplPy51dWlkfWZ1bmN0aW9uIGx5KGUpe3JldHVybihlLm1hdGNoKC9eKCN7MSw2fSlccysoLispJC9nbSl8fFtdKS5tYXAoKG4scik9Pih7aGVhZGluZzp7dGV4dDpuLnJlcGxhY2UoL14jezEsNn1ccysvLCIiKS50cmltKCksbGV2ZWw6KG4ubWF0Y2goL14jKy8pfHxbIiJdKVswXS5sZW5ndGh9LGluZGV4OnJ9KSl9ZnVuY3Rpb24gbGwoZSl7cmV0dXJuIGU9PW51bGw/bnVsbDplPDFlMTA/ZSoxZTM6ZX1mdW5jdGlvbiBDeChlKXtsZXQgdD1uZXcgRGF0ZShlKSxuPXQuZ2V0RGF5KCk7cmV0dXJuIHQuc2V0RGF0ZSh0LmdldERhdGUoKS1uKyhuPT09MD8tNjoxKSksdC5zZXRIb3VycygwLDAsMCwwKSx0fWZ1bmN0aW9uIERkKGUpe3JldHVybihlfHxbXSkubWFwKHQ9Pih7Li4udCxzY29yZTp0Py5zY29yZT8/dD8udmljdG9yeVZhbHVlPz8wfSkpfWZ1bmN0aW9uIEF4KGUsdCl7bGV0IG49bmV3IERhdGUodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSkuZ2V0VGltZSgpLHI9bis4NjRlNTtyZXR1cm4gZS5maWx0ZXIobz0+e2xldCBhPWxsKG8uc3RhcnRBdCk7cmV0dXJuIW8uY29tcGxldGVkQXQmJiFvLmRpc21pc3NlZEF0JiZhIT1udWxsJiZhPj1uJiZhPHJ9KX1mdW5jdGlvbiBjeShlLHQpe2xldCBuPXQuZ2V0VGltZSgpLHI9bis3Kjg2NGU1O3JldHVybiBlLmZpbHRlcihvPT57bGV0IGE9bGwoby5jb21wbGV0ZWRBdCk7cmV0dXJuIGEhPW51bGwmJmE+PW4mJmE8cn0pfWZ1bmN0aW9uIE94KGUsdCl7cmV0dXJuIGN5KGUsdCkucmVkdWNlKChuLHIpPT5uKyhyLnZpY3RvcnlWYWx1ZXx8MCksMCl9ZnVuY3Rpb24gSXgoZSx0KXtyZXR1cm5bIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCIsIlN1biJdLm1hcCgocixvKT0+e2xldCBhPW5ldyBEYXRlKHQpO2Euc2V0RGF0ZShhLmdldERhdGUoKStvKTtsZXQgaT1uZXcgRGF0ZShhKTtpLnNldERhdGUoaS5nZXREYXRlKCkrMSk7bGV0IHM9ZS5maWx0ZXIobD0+e2xldCBjPWxsKGwuY29tcGxldGVkQXQpO3JldHVybiBjIT1udWxsJiZjPj1hLmdldFRpbWUoKSYmYzxpLmdldFRpbWUoKX0pO3JldHVybntkYXk6cixkYXRlOmEudG9JU09TdHJpbmcoKSx2YWx1ZTpzLnJlZHVjZSgobCxjKT0+bCsoYy52aWN0b3J5VmFsdWV8fDApLDApLHRhc2tDb3VudDpzLmxlbmd0aH19KX1mdW5jdGlvbiByeShlKXtsZXQgdD1bIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sbj0oZS0xKSozO3JldHVyblt0W25dLHRbbisxXSx0W24rMl1dfWZ1bmN0aW9uIFJ4KGUsdCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGFiZWwiKTtuLnN0eWxlLmRpc3BsYXk9ImZsZXgiLG4uc3R5bGUuYWxpZ25JdGVtcz0iY2VudGVyIixuLnN0eWxlLmdhcD0iMTBweCI7bGV0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3IudGV4dENvbnRlbnQ9ZT8ubGFiZWx8fGBJbnB1dCAke3QrMX1gLHIuc3R5bGUubWluV2lkdGg9IjE0MHB4IixuLmFwcGVuZENoaWxkKHIpO2xldCBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uc3R5bGUuZmxleD0iMSIsbi5hcHBlbmRDaGlsZChvKTtsZXQgYT1lPy50eXBlfHwidGV4dCIsaT1BcnJheS5pc0FycmF5KGU/Lm9wdGlvbnMpP2Uub3B0aW9uczpbXTtpZihhPT09ImNoZWNrYm94Iil7bGV0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtyZXR1cm4gbC50eXBlPSJjaGVja2JveCIsbC5jaGVja2VkPSEhZT8udmFsdWUsby5hcHBlbmRDaGlsZChsKSx7bGluZTpuLGZvY3VzVGFyZ2V0OmwsZ2V0VmFsdWU6KCk9PmwuY2hlY2tlZH19aWYoYT09PSJyYWRpbyIpe2xldCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuc3R5bGUuZGlzcGxheT0iZmxleCIsbC5zdHlsZS5mbGV4V3JhcD0id3JhcCIsbC5zdHlsZS5nYXA9IjEwcHgiO2xldCBjPWBkZXYtcHJvbXB0LXJhZGlvLSR7RGF0ZS5ub3coKX0tJHt0fWAsZD1udWxsO2ZvcihsZXRbdSxwXW9mIGkuZW50cmllcygpKXtsZXQgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpO2Yuc3R5bGUuZGlzcGxheT0iaW5saW5lLWZsZXgiLGYuc3R5bGUuYWxpZ25JdGVtcz0iY2VudGVyIixmLnN0eWxlLmdhcD0iNHB4IjtsZXQgeT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3kudHlwZT0icmFkaW8iLHkubmFtZT1jLHkudmFsdWU9U3RyaW5nKHA/LnZhbHVlPz9wPy5sYWJlbD8/IiIpLGU/LnZhbHVlIT1udWxsJiZTdHJpbmcoZS52YWx1ZSk9PT15LnZhbHVlJiYoeS5jaGVja2VkPSEwKSxkfHwoZD15KTtsZXQgdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7dy50ZXh0Q29udGVudD1wPy5sYWJlbD8/eS52YWx1ZSxmLmFwcGVuZCh5LHcpLGwuYXBwZW5kQ2hpbGQoZiksdT09PWkubGVuZ3RoLTEmJiFsLnF1ZXJ5U2VsZWN0b3IoImlucHV0OmNoZWNrZWQiKSYmZCYmKGQuY2hlY2tlZD0hMCl9cmV0dXJuIG8uYXBwZW5kQ2hpbGQobCkse2xpbmU6bixmb2N1c1RhcmdldDpkLGdldFZhbHVlOigpPT57bGV0IHU9bC5xdWVyeVNlbGVjdG9yKCJpbnB1dDpjaGVja2VkIik7cmV0dXJuIHU/dS52YWx1ZTpudWxsfX19aWYoYT09PSJzZWxlY3QiKXtsZXQgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTtsLnN0eWxlLndpZHRoPSIxMDAlIjtmb3IobGV0IGMgb2YgaSl7bGV0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7ZC52YWx1ZT1TdHJpbmcoYz8udmFsdWU/P2M/LmxhYmVsPz8iIiksZC50ZXh0Q29udGVudD1jPy5sYWJlbD8/ZC52YWx1ZSxsLmFwcGVuZENoaWxkKGQpfXJldHVybiBlPy52YWx1ZSE9bnVsbCYmKGwudmFsdWU9U3RyaW5nKGUudmFsdWUpKSxvLmFwcGVuZENoaWxkKGwpLHtsaW5lOm4sZm9jdXNUYXJnZXQ6bCxnZXRWYWx1ZTooKT0+bC52YWx1ZX19aWYoYT09PSJkYXRlIil7bGV0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtpZihsLnR5cGU9ImRhdGUiLGU/LnZhbHVlIT1udWxsKXtsZXQgYz1uZXcgRGF0ZShsbChOdW1iZXIoZS52YWx1ZSkpKTtOdW1iZXIuaXNOYU4oYy5nZXRUaW1lKCkpfHwobC52YWx1ZT1jLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwxMCkpfXJldHVybiBsLnN0eWxlLndpZHRoPSIxMDAlIixvLmFwcGVuZENoaWxkKGwpLHtsaW5lOm4sZm9jdXNUYXJnZXQ6bCxnZXRWYWx1ZTooKT0+e2lmKCFsLnZhbHVlKXJldHVybiBudWxsO2xldCBjPURhdGUucGFyc2UoYCR7bC52YWx1ZX1UMDA6MDA6MDBaYCk7cmV0dXJuIE51bWJlci5pc05hTihjKT9udWxsOk1hdGguZmxvb3IoYy8xZTMpfX19aWYoYT09PSJ0ZXh0Iil7bGV0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTtyZXR1cm4gbC5yb3dzPTIsbC5zdHlsZS53aWR0aD0iMTAwJSIsbC52YWx1ZT1TdHJpbmcoZT8udmFsdWU/PyIiKSxlPy5wbGFjZWhvbGRlciYmKGwucGxhY2Vob2xkZXI9ZS5wbGFjZWhvbGRlciksby5hcHBlbmRDaGlsZChsKSx7bGluZTpuLGZvY3VzVGFyZ2V0OmwsZ2V0VmFsdWU6KCk9PmwudmFsdWV9fWxldCBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7cmV0dXJuIHMudHlwZT1hPT09InNlY3VyZVRleHQiPyJwYXNzd29yZCI6InRleHQiLHMuc3R5bGUud2lkdGg9IjEwMCUiLHMudmFsdWU9U3RyaW5nKGU/LnZhbHVlPz8iIiksZT8ucGxhY2Vob2xkZXImJihzLnBsYWNlaG9sZGVyPWUucGxhY2Vob2xkZXIpLG8uYXBwZW5kQ2hpbGQocykse2xpbmU6bixmb2N1c1RhcmdldDpzLGdldFZhbHVlOigpPT5zLnZhbHVlfX1mdW5jdGlvbiBNeChlLHQ9e30pe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtsZXQgbj1BcnJheS5pc0FycmF5KHQ/LmlucHV0cykmJnQuaW5wdXRzLmxlbmd0aD4wP3QuaW5wdXRzOlt7dHlwZToidGV4dCJ9XSxyPUFycmF5LmlzQXJyYXkodD8uYWN0aW9ucyk/dC5hY3Rpb25zOltdO3JldHVybiBuZXcgUHJvbWlzZShvPT57bGV0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5kYXRhc2V0LmRldlByb21wdD0ib3ZlcmxheSIsYS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGEuc3R5bGUuaW5zZXQ9IjAiLGEuc3R5bGUuYmFja2dyb3VuZD0icmdiYSgwLDAsMCwwLjM1KSIsYS5zdHlsZS56SW5kZXg9Ijk5OTk5IixhLnN0eWxlLmRpc3BsYXk9ImdyaWQiLGEuc3R5bGUucGxhY2VJdGVtcz0iY2VudGVyIjtsZXQgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpLnN0eWxlLndpZHRoPSJtaW4oNjgwcHgsIDkydncpIixpLnN0eWxlLmJhY2tncm91bmQ9IiNmZmYiLGkuc3R5bGUuY29sb3I9IiMxMTEiLGkuc3R5bGUuYm9yZGVyUmFkaXVzPSIxMHB4IixpLnN0eWxlLnBhZGRpbmc9IjE2cHgiLGkuc3R5bGUuYm94U2hhZG93PSIwIDE2cHggNDhweCByZ2JhKDAsMCwwLDAuMjUpIixhLmFwcGVuZENoaWxkKGkpO2xldCBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3MudGV4dENvbnRlbnQ9U3RyaW5nKGU/PyJQcm9tcHQiKSxzLnN0eWxlLmZvbnRXZWlnaHQ9IjYwMCIscy5zdHlsZS5tYXJnaW5Cb3R0b209IjEycHgiLGkuYXBwZW5kQ2hpbGQocyk7bGV0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZm9ybSIpO2wuc3R5bGUuZGlzcGxheT0iZmxleCIsbC5zdHlsZS5mbGV4RGlyZWN0aW9uPSJjb2x1bW4iLGwuc3R5bGUuZ2FwPSIxMHB4IixpLmFwcGVuZENoaWxkKGwpO2xldCBjPW4ubWFwKCh3LGIpPT5SeCh3LGIpKTtmb3IobGV0IHcgb2YgYylsLmFwcGVuZENoaWxkKHcubGluZSk7bGV0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5zdHlsZS5kaXNwbGF5PSJmbGV4IixkLnN0eWxlLmp1c3RpZnlDb250ZW50PSJmbGV4LWVuZCIsZC5zdHlsZS5nYXA9IjhweCIsZC5zdHlsZS5tYXJnaW5Ub3A9IjhweCIsbC5hcHBlbmRDaGlsZChkKTtsZXQgdT0tMTtmb3IobGV0W3csYl1vZiByLmVudHJpZXMoKSl7bGV0IHY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7di50eXBlPSJidXR0b24iLHYudGV4dENvbnRlbnQ9Yj8ubGFiZWx8fGBBY3Rpb24gJHt3KzF9YCx2LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3U9Yj8udmFsdWU/P3csbC5yZXF1ZXN0U3VibWl0KCl9KSxkLmFwcGVuZENoaWxkKHYpfWxldCBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpO3AudHlwZT0iYnV0dG9uIixwLmRhdGFzZXQuZGV2UHJvbXB0Q2FuY2VsPSJ0cnVlIixwLnRleHRDb250ZW50PSJDYW5jZWwiLHAuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57YS5yZW1vdmUoKSxvKG51bGwpfSksZC5hcHBlbmRDaGlsZChwKTtsZXQgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTtmLnR5cGU9InN1Ym1pdCIsZi50ZXh0Q29udGVudD0iU3VibWl0IixkLmFwcGVuZENoaWxkKGYpLGwuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0Iix3PT57dy5wcmV2ZW50RGVmYXVsdCgpO2xldCBiPWMubWFwKHY9PnYuZ2V0VmFsdWUoKSk7YS5yZW1vdmUoKSxiLmxlbmd0aD09PTEmJnIubGVuZ3RoPT09MD9vKGJbMF0pOnIubGVuZ3RoPT09MD9vKGIpOm8oWy4uLmIsdV0pfSksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtsZXQgeT1jLmZpbmQodz0+dy5mb2N1c1RhcmdldCk/LmZvY3VzVGFyZ2V0O3kmJnkuZm9jdXMoKX0pfXZhciByaT1udWxsO2FzeW5jIGZ1bmN0aW9uIHV5KCl7aWYocmkhPT1udWxsKXJldHVybiByaTt0cnl7cmk9YXdhaXQoYXdhaXQgZmV0Y2goIi9hcGkvc2V0dGluZ3MiKSkuanNvbigpfWNhdGNoe3JpPXt9fXJldHVybiByaX1hc3luYyBmdW5jdGlvbiBQeChlLHQpe2xldCBuPWF3YWl0IHV5KCk7bltlXT10O3RyeXthd2FpdCBmZXRjaCgiL2FwaS9zZXR0aW5ncyIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHtrZXk6ZSx2YWx1ZTp0fSl9KX1jYXRjaChyKXtjb25zb2xlLndhcm4oIltkZXYtYXBwXSBmYWlsZWQgdG8gcGVyc2lzdCBzZXR0aW5nIixlLHIpfX1hc3luYyBmdW5jdGlvbiBOZCgpe3RyeXtsZXQgZT1hd2FpdCBmZXRjaCgiL2FwaS90YXNrcyIpO3JldHVybiBEZChhd2FpdCBlLmpzb24oKSl9Y2F0Y2h7cmV0dXJuW119fWFzeW5jIGZ1bmN0aW9uIEx4KGUsdCl7dHJ5e2xldCBuPWF3YWl0IGZldGNoKGAvYXBpL3Rhc2tzP2Zyb209JHtlfSZ0bz0ke3R9YCk7cmV0dXJuIERkKGF3YWl0IG4uanNvbigpKX1jYXRjaHtyZXR1cm5bXX19YXN5bmMgZnVuY3Rpb24gb3koZSl7dHJ5e2xldCB0PWU/YC9hcGkvbW9vZHM/ZnJvbT0ke2V9YDoiL2FwaS9tb29kcyI7cmV0dXJuIGF3YWl0KGF3YWl0IGZldGNoKHQpKS5qc29uKCl9Y2F0Y2h7cmV0dXJuW119fXZhciB6eD1be2lkOiJkb21haW4td29yay11dWlkIixuYW1lOiJXb3JrIix1dWlkOiJkb21haW4td29yay11dWlkIixub3RlczpZb1siZG9tYWluLXdvcmstdXVpZCJdfSx7aWQ6ImRvbWFpbi1wZXJzb25hbC11dWlkIixuYW1lOiJQZXJzb25hbCIsdXVpZDoiZG9tYWluLXBlcnNvbmFsLXV1aWQiLG5vdGVzOllvWyJkb21haW4tcGVyc29uYWwtdXVpZCJdfSx7aWQ6ImRvbWFpbi1zaWRlLXV1aWQiLG5hbWU6IlNpZGUgUHJvamVjdHMiLHV1aWQ6ImRvbWFpbi1zaWRlLXV1aWQiLG5vdGVzOllvWyJkb21haW4tc2lkZS11dWlkIl19XTtmdW5jdGlvbiBheShlLHQ9IiIsbj0iIil7bGV0IHI9dHlwZW9mIG49PSJzdHJpbmciP24udHJpbSgpLnRvTG93ZXJDYXNlKCk6IiI7aWYoIV94LmhhcyhyKXx8cj09PSJyZWxldmFuY2UiJiYhdClyZXR1cm4gZTtpZighWyJyZWxldmFuY2UiLCJ0aXRsZSJdLmluY2x1ZGVzKHIpKXJldHVyblsuLi5lXTtsZXQgbz10LnRyaW0oKS50b0xvd2VyQ2FzZSgpO3JldHVyblsuLi5lXS5zb3J0KChhLGkpPT57bGV0IHM9YT8ubmFtZXx8IiIsbD1pPy5uYW1lfHwiIjtpZihyPT09InRpdGxlIilyZXR1cm4gcy5sb2NhbGVDb21wYXJlKGwpO2xldCBjPXU9PntsZXQgcD11LnRvTG93ZXJDYXNlKCk7cmV0dXJuIHA9PT1vPzM6cC5zdGFydHNXaXRoKG8pPzI6cC5pbmNsdWRlcyhvKT8xOjB9LGQ9YyhsKS1jKHMpO3JldHVybiBkIT09MD9kOnMubG9jYWxlQ29tcGFyZShsKX0pfWFzeW5jIGZ1bmN0aW9uIGl5KGUpe3RyeXtyZXR1cm4gYXdhaXQoYXdhaXQgZmV0Y2goYC9hcGkvbm90ZS1maW5kP25hbWU9JHtlbmNvZGVVUklDb21wb25lbnQoZSl9YCkpLmpzb24oKX1jYXRjaHtyZXR1cm4gbnVsbH19YXN5bmMgZnVuY3Rpb24gc3koZSl7dHJ5e2xldCBuPWF3YWl0IF9kKCkuZ2V0Tm90ZUNvbnRlbnQoZSk7cmV0dXJuIGx5KG58fCIiKX1jYXRjaHtyZXR1cm5bXX19dmFyIHFvPW51bGw7ZnVuY3Rpb24gX2QoKXtpZihxbylyZXR1cm4gcW87bGV0IGU9dD0+e2xldCBuPS9eaHR0cHM6XC9cL3d3d1wuYW1wbGVub3RlXC5jb21cL25vdGVzKD86JHxbLz9dLiopLy50ZXN0KHQpO3JldHVybiBuP2NvbnNvbGUubG9nKCJbZGV2LWFwcF0gbmF2aWdhdGUiLHQpOmNvbnNvbGUud2FybigiW2Rldi1hcHBdIG5hdmlnYXRlIHJlamVjdGVkIGludmFsaWQgVVJMIix0KSxufTtyZXR1cm4gcW89e3NldHRpbmdzOnt9LGFzeW5jIGluaXQoKXtsZXQgdD1hd2FpdCB1eSgpO2lmKHRbbnldfHwodFtueV09InRydWUiKSx0eXBlb2YgdC5kYXNoYm9hcmRfZWxlbWVudHM9PSJzdHJpbmciKXRyeXt0LmRhc2hib2FyZF9lbGVtZW50cz1KU09OLnBhcnNlKHQuZGFzaGJvYXJkX2VsZW1lbnRzKX1jYXRjaHt0LmRhc2hib2FyZF9lbGVtZW50cz1udWxsfWZvcihsZXQgZyBvZltzbCgidmljdG9yeS12YWx1ZSIpLHNsKCJjYWxlbmRhciIpLHNsKCJtb29kIiksc2woInF1b3RlcyIpXSlpZih0eXBlb2YgdFtnXT09InN0cmluZyIpdHJ5e3RbZ109SlNPTi5wYXJzZSh0W2ddKX1jYXRjaHt0W2ddPW51bGx9bGV0IG49bmV3IERhdGUscj1DeChuKSxvPWF3YWl0IE5kKCksYT1hd2FpdCBveSgpLGk9TWF0aC5jZWlsKChuLmdldE1vbnRoKCkrMSkvMykscz1gUSR7aX0gJHtuLmdldEZ1bGxZZWFyKCl9YCxsPWk9PT00PzE6aSsxLGM9aT09PTQ/bi5nZXRGdWxsWWVhcigpKzE6bi5nZXRGdWxsWWVhcigpLGQ9YFEke2x9ICR7Y31gLFt1LHBdPWF3YWl0IFByb21pc2UuYWxsKFtpeShgJHtzfSBQbGFuYCksaXkoYCR7ZH0gUGxhbmApXSksW2YseV09YXdhaXQgUHJvbWlzZS5hbGwoW3U/LnV1aWQ/c3kodS51dWlkKTpQcm9taXNlLnJlc29sdmUoW10pLHA/LnV1aWQ/c3kocC51dWlkKTpQcm9taXNlLnJlc29sdmUoW10pXSksdz1yeShpKSxiPXJ5KGwpLHY9dy5ldmVyeShnPT5mLnNvbWUobT0+bS5oZWFkaW5nPy50ZXh0Py50cmltKCkudG9Mb3dlckNhc2UoKT09PWcudG9Mb3dlckNhc2UoKSkpLGg9Yi5ldmVyeShnPT55LnNvbWUobT0+bS5oZWFkaW5nPy50ZXh0Py50cmltKCkudG9Mb3dlckNhc2UoKT09PWcudG9Mb3dlckNhc2UoKSkpO3JldHVybiBxby5zZXR0aW5ncz10LHt0YXNrczpvLHRvZGF5VGFza3M6QXgobyxuKSxjb21wbGV0ZWRUaGlzV2VlazpjeShvLHIpLHdlZWtseVZpY3RvcnlWYWx1ZTpPeChvLHIpLGRhaWx5VmljdG9yeVZhbHVlczpJeChvLHIpLG1vb2RSYXRpbmdzOmEscXVhcnRlcmx5UGxhbnM6e2N1cnJlbnQ6e3llYXI6bi5nZXRGdWxsWWVhcigpLHF1YXJ0ZXI6aSxsYWJlbDpzLG5vdGVVVUlEOnU/LnV1aWQ/P251bGwsaGFzQWxsTW9udGhseURldGFpbHM6dn0sbmV4dDp7eWVhcjpjLHF1YXJ0ZXI6bCxsYWJlbDpkLG5vdGVVVUlEOnA/LnV1aWQ/P251bGwsaGFzQWxsTW9udGhseURldGFpbHM6aH19LGN1cnJlbnREYXRlOm4udG9JU09TdHJpbmcoKSxzZXR0aW5nczp0LHRhc2tEb21haW5zOlt7bmFtZToiV29yayIsdXVpZDoiZG9tYWluLXdvcmstdXVpZCJ9LHtuYW1lOiJQZXJzb25hbCIsdXVpZDoiZG9tYWluLXBlcnNvbmFsLXV1aWQifSx7bmFtZToiU2lkZSBQcm9qZWN0cyIsdXVpZDoiZG9tYWluLXNpZGUtdXVpZCJ9XSxhY3RpdmVUYXNrRG9tYWluOiJkb21haW4td29yay11dWlkIn19LGFzeW5jIGNvbmZpZ3VyZSgpe3JldHVybiBudWxsfSxhc3luYyBnZXRNb29kUmF0aW5ncyh0KXtyZXR1cm4gb3kodCl9LGFzeW5jIGdldENvbXBsZXRlZFRhc2tzKHQsbil7cmV0dXJuIEx4KHQsbil9LGFzeW5jIGdldEV4dGVybmFsQ2FsZW5kYXJFdmVudHMoKXtsZXQgdD1uZXcgRGF0ZSxuPXQuZ2V0RnVsbFllYXIoKSxyPXQuZ2V0TW9udGgoKSxvPXQuZ2V0RGF0ZSgpO3JldHVyblt7YWxsRGF5OiExLGNhbGVuZGFyOnt1dWlkOiJjYWwtcGVyc29uYWwtdXVpZCIsbmFtZToiUGVyc29uYWwifSxjb2xvcjoiIzQyODVmNCIsZW5kOm5ldyBEYXRlKG4scixvLDE3LDAsMCksc3RhcnQ6bmV3IERhdGUobixyLG8sMTYsMCwwKSx0aXRsZToiQmlydGhkYXkgcGFydHkifSx7YWxsRGF5OiExLGNhbGVuZGFyOnt1dWlkOiJjYWwtd29yay11dWlkIixuYW1lOiJXb3JrIn0sY29sb3I6IiMwYjgwNDMiLGVuZDpuZXcgRGF0ZShuLHIsbysyLDEyLDI1LDApLHN0YXJ0Om5ldyBEYXRlKG4scixvKzIsMTEsMjUsMCksdGl0bGU6IlF1YXJ0ZXJseSBSZXZpZXcgU3luYyJ9XX0sYXN5bmMgZ2V0VGFza0RvbWFpbnMoKXtyZXR1cm4genh9LGFzeW5jIGdldFRhc2tEb21haW5UYXNrcyh0KXtsZXQgbj10P2AvYXBpL3Rhc2tzP2RvbWFpbj0ke2VuY29kZVVSSUNvbXBvbmVudCh0KX1gOiIvYXBpL3Rhc2tzIixyPWF3YWl0IGZldGNoKG4pO3JldHVybiBEZChhd2FpdCByLmpzb24oKSl9LGFzeW5jIGdldE5vdGVUYXNrcyh0LG4pe2xldCByPXR5cGVvZiB0PT0ic3RyaW5nIj90OnQ/LnV1aWQ7cmV0dXJuKGF3YWl0IE5kKCkpLmZpbHRlcihhPT5hLm5vdGVVVUlEPT09ciYmYS5jb21wbGV0ZWRBdD09bnVsbCYmYS5kaXNtaXNzZWRBdD09bnVsbCl9LGFzeW5jIGdldFRhc2sodCl7cmV0dXJuKGF3YWl0IE5kKCkpLmZpbmQocj0+ci51dWlkPT09dCl8fG51bGx9LG5hdmlnYXRlKHQpe3JldHVybiBlKHQpfSxhc3luYyBzZXRTZXR0aW5nKHQsbil7bGV0IHI9bj09bnVsbD8iIjpTdHJpbmcobik7cW8uc2V0dGluZ3NbdF09cixhd2FpdCBQeCh0LHIpfSxhc3luYyByZWNvcmRNb29kUmF0aW5nKHQpe3RyeXtyZXR1cm4oYXdhaXQoYXdhaXQgZmV0Y2goIi9hcGkvbW9vZHMiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7dmFsdWU6dH0pfSkpLmpzb24oKSkudXVpZH1jYXRjaChuKXtyZXR1cm4gRSgiW2Rldi1hcHBdIHJlY29yZE1vb2RSYXRpbmcgZmFpbGVkOiIsbiksbnVsbH19LGFzeW5jIHVwZGF0ZU1vb2RSYXRpbmcodCxuKXt0cnl7YXdhaXQgZmV0Y2goIi9hcGkvbW9vZHMiLHttZXRob2Q6IlBBVENIIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LGJvZHk6SlNPTi5zdHJpbmdpZnkoe3V1aWQ6dCx1cGRhdGVzOm59KX0pfWNhdGNoKHIpe0UoIltkZXYtYXBwXSB1cGRhdGVNb29kUmF0aW5nIGZhaWxlZDoiLHIpfX0sYXN5bmMgZ2V0Tm90ZUNvbnRlbnQodCl7bGV0IG49VGQodCk7dHJ5e3JldHVybihhd2FpdChhd2FpdCBmZXRjaChgL2FwaS9ub3RlLWNvbnRlbnQ/dXVpZD0ke2VuY29kZVVSSUNvbXBvbmVudChuKX1gKSkuanNvbigpKS5jb250ZW50Pz8iIn1jYXRjaHtyZXR1cm4iIn19LGFzeW5jIGdldE5vdGVTZWN0aW9ucyh0KXtsZXQgbj1hd2FpdCB0aGlzLmdldE5vdGVDb250ZW50KHQpO3JldHVybiBseShuKX0sYXN5bmMgZmluZE5vdGUodD17fSl7dHJ5e2xldCBuPXQudXVpZD9gdXVpZD0ke2VuY29kZVVSSUNvbXBvbmVudCh0LnV1aWQpfWA6YG5hbWU9JHtlbmNvZGVVUklDb21wb25lbnQodC5uYW1lKX1gLG89YXdhaXQoYXdhaXQgZmV0Y2goYC9hcGkvbm90ZS1maW5kPyR7bn1gKSkuanNvbigpO3JldHVybiBvPy51dWlkP286bnVsbH1jYXRjaHtyZXR1cm4gbnVsbH19LGZpbHRlck5vdGVzKHQ9e30sbj0iIil7bGV0IHI7aWYodC50YXNrRG9tYWluVVVJRClyPWF5KFlvW3QudGFza0RvbWFpblVVSURdfHxbXSx0LnF1ZXJ5LG4pO2Vsc2V7bGV0IG89T2JqZWN0LnZhbHVlcyhZbykuZmxhdCgpLGE9dC5xdWVyeT9vLmZpbHRlcihpPT4oaS5uYW1lfHwiIikudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0LnF1ZXJ5LnRvTG93ZXJDYXNlKCkpKTpvO3I9YXkoYSx0LnF1ZXJ5fHxudWxsLG4pfXJldHVybiB0eShyKX0sYXN5bmMgdXBkYXRlVGFzayh0LG4pe3JldHVybiBFKCJbZGV2LWFwcF0gdXBkYXRlVGFzayIsdCxuKSwhMH0sYXN5bmMgY3JlYXRlTm90ZSh0LG49W10pe3RyeXtyZXR1cm4oYXdhaXQoYXdhaXQgZmV0Y2goIi9hcGkvbm90ZS1jcmVhdGUiLHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn0sYm9keTpKU09OLnN0cmluZ2lmeSh7bmFtZTp0LHRhZ3M6bn0pfSkpLmpzb24oKSkudXVpZH1jYXRjaHtyZXR1cm4gbnVsbH19LGFzeW5jIHJlcGxhY2VOb3RlQ29udGVudCh0LG4scj17fSl7bGV0IG89VGQodCk7dHJ5e2xldCBhPXt1dWlkOm8sY29udGVudDpufTtyZXR1cm4gci5zZWN0aW9uJiYoYS5zZWN0aW9uPXIuc2VjdGlvbiksKGF3YWl0KGF3YWl0IGZldGNoKCIvYXBpL25vdGUtY29udGVudCIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KGEpfSkpLmpzb24oKSkub2t8fCExfWNhdGNoe3JldHVybiExfX0sYXN5bmMgaW5zZXJ0Tm90ZUNvbnRlbnQodCxuLHI9e30pe2xldCBvPVRkKHQpO3RyeXthd2FpdCBmZXRjaCgiL2FwaS9ub3RlLWFwcGVuZCIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHt1dWlkOm8sY29udGVudDpuLGF0RW5kOiEhci5hdEVuZH0pfSl9Y2F0Y2h7fX0sYXN5bmMgYXR0YWNoTm90ZU1lZGlhKHQsbil7RSgiW2Rldi1hcHBdIGF0dGFjaE5vdGVNZWRpYSBjYWxsZWQsIGRhdGFVUkwgbGVuZ3RoOiIsbj8ubGVuZ3RofHwwKTt0cnl7bGV0IGE9KGF3YWl0KGF3YWl0IGZldGNoKCIvYXBpL2F0dGFjaC1tZWRpYSIse21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxib2R5OkpTT04uc3RyaW5naWZ5KHtkYXRhVVJMOm59KX0pKS5qc29uKCkpLnVybHx8bnVsbDtyZXR1cm4gRSgiW2Rldi1hcHBdIGF0dGFjaE5vdGVNZWRpYSByZXNwb25zZToiLGE/YFVSTCByZWNlaXZlZDogJHthfWA6Im5vIFVSTCBpbiByZXNwb25zZSIpLGF9Y2F0Y2gocil7cmV0dXJuIEUoIltkZXYtYXBwXSBhdHRhY2hOb3RlTWVkaWEgRkFJTEVEOiIsciksbnVsbH19LGFzeW5jIHByb21wdCh0LG49e30pe3JldHVybiBNeCh0LG4pfX0scW99dmFyIG5lPXBlKGRlKCksMSk7dmFyIG9pPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxGeD1bIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLENkPWNsYXNze2NvbnN0cnVjdG9yKHtpbmRleDp0LHNob3J0Om4sZnVsbDpyLHBsYW46byxjdXJyZW50OmF9KXt0aGlzLmluZGV4PXQsdGhpcy5zaG9ydD1uLHRoaXMuZnVsbD1yLHRoaXMucGxhbj1vLHRoaXMuY3VycmVudD1hfX07ZnVuY3Rpb24gQWQoKXtsZXQgZT1uZXcgRGF0ZSx0PWUuZ2V0RnVsbFllYXIoKSxuPWUuZ2V0TW9udGgoKSxyPU1hdGguZmxvb3Iobi8zKSsxO3JldHVybnt5ZWFyOnQscXVhcnRlcjpyLGxhYmVsOmBRJHtyfSAke3R9YH19ZnVuY3Rpb24gZHkoZSx0KXtsZXQgbj0oZS5xdWFydGVyLTEpKjMscj1uZXcgRGF0ZSgpLmdldE1vbnRoKCksbz1bXTtmb3IobGV0IGE9MDthPDY7YSsrKXtsZXQgaT0obithKSUxMjtvLnB1c2gobmV3IENkKHtpbmRleDppLHNob3J0OkZ4W2ldLGZ1bGw6b2lbaV0scGxhbjphPDM/ZTp0LGN1cnJlbnQ6aT09PXJ9KSl9cmV0dXJuIG99ZnVuY3Rpb24gY2woKXtsZXQgZT1uZXcgRGF0ZSx0PWUuZ2V0RGF5KCksbjtyZXR1cm4gdD09PTY/bj0yOnQ9PT0wP249MTpuPTEtdCxuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLGUuZ2V0RGF0ZSgpK24pfWZ1bmN0aW9uIHVsKGUpe3JldHVybmBXZWVrIG9mICR7b2lbZS5nZXRNb250aCgpXX0gJHtlLmdldERhdGUoKX1gfWZ1bmN0aW9uIFFvKGUsdCl7bGV0IG49dC5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywiXFwkJiIpLHI9bmV3IFJlZ0V4cChgKF58XFxuKSgjezEsNn0pXFxzKyR7bn1cXHMqXFxuYCwiaSIpLG89ZS5tYXRjaChyKTtpZighbylyZXR1cm4gbnVsbDtsZXQgYT1vLmluZGV4K29bMF0ubGVuZ3RoLGk9ZS5zdWJzdHJpbmcoYSkscz1pLm1hdGNoKC9cbiN7MSw2fVxzLyk7cmV0dXJuKHM/aS5zdWJzdHJpbmcoMCxzLmluZGV4KTppKS50cmltKCl9ZnVuY3Rpb24gT2QoZSl7cmV0dXJuYAojIyMgJHtlfQotIEZvY3VzOgotIEtleSBtb3ZlOgpgfWZ1bmN0aW9uIElkKGUpe3JldHVybmAKIyMjICR7ZX0KLSBQcmltYXJ5IGZvY3VzOgotIEtleSB0YXNrczoKLSBDb21taXRtZW50czoKYH12YXIgV2U9InRvcCIsUWU9ImJvdHRvbSIsS2U9InJpZ2h0IixqZT0ibGVmdCIsZGw9ImF1dG8iLERyPVtXZSxRZSxLZSxqZV0sR249InN0YXJ0Iixlbz0iZW5kIixweT0iY2xpcHBpbmdQYXJlbnRzIixwbD0idmlld3BvcnQiLEpvPSJwb3BwZXIiLGZ5PSJyZWZlcmVuY2UiLFJkPURyLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbmNhdChbdCsiLSIrR24sdCsiLSIrZW9dKX0sW10pLGZsPVtdLmNvbmNhdChEcixbZGxdKS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb25jYXQoW3QsdCsiLSIrR24sdCsiLSIrZW9dKX0sW10pLFV4PSJiZWZvcmVSZWFkIiwkeD0icmVhZCIsV3g9ImFmdGVyUmVhZCIsQng9ImJlZm9yZU1haW4iLEh4PSJtYWluIixqeD0iYWZ0ZXJNYWluIixWeD0iYmVmb3JlV3JpdGUiLEd4PSJ3cml0ZSIsS3g9ImFmdGVyV3JpdGUiLG15PVtVeCwkeCxXeCxCeCxIeCxqeCxWeCxHeCxLeF07ZnVuY3Rpb24gdHQoZSl7cmV0dXJuIGU/KGUubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpOm51bGx9ZnVuY3Rpb24gTWUoZSl7aWYoZT09bnVsbClyZXR1cm4gd2luZG93O2lmKGUudG9TdHJpbmcoKSE9PSJbb2JqZWN0IFdpbmRvd10iKXt2YXIgdD1lLm93bmVyRG9jdW1lbnQ7cmV0dXJuIHQmJnQuZGVmYXVsdFZpZXd8fHdpbmRvd31yZXR1cm4gZX1mdW5jdGlvbiBlbihlKXt2YXIgdD1NZShlKS5FbGVtZW50O3JldHVybiBlIGluc3RhbmNlb2YgdHx8ZSBpbnN0YW5jZW9mIEVsZW1lbnR9ZnVuY3Rpb24gSmUoZSl7dmFyIHQ9TWUoZSkuSFRNTEVsZW1lbnQ7cmV0dXJuIGUgaW5zdGFuY2VvZiB0fHxlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnR9ZnVuY3Rpb24gWG8oZSl7aWYodHlwZW9mIFNoYWRvd1Jvb3Q+InUiKXJldHVybiExO3ZhciB0PU1lKGUpLlNoYWRvd1Jvb3Q7cmV0dXJuIGUgaW5zdGFuY2VvZiB0fHxlIGluc3RhbmNlb2YgU2hhZG93Um9vdH1mdW5jdGlvbiBZeChlKXt2YXIgdD1lLnN0YXRlO09iamVjdC5rZXlzKHQuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24obil7dmFyIHI9dC5zdHlsZXNbbl18fHt9LG89dC5hdHRyaWJ1dGVzW25dfHx7fSxhPXQuZWxlbWVudHNbbl07IUplKGEpfHwhdHQoYSl8fChPYmplY3QuYXNzaWduKGEuc3R5bGUsciksT2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgcz1vW2ldO3M9PT0hMT9hLnJlbW92ZUF0dHJpYnV0ZShpKTphLnNldEF0dHJpYnV0ZShpLHM9PT0hMD8iIjpzKX0pKX0pfWZ1bmN0aW9uIHF4KGUpe3ZhciB0PWUuc3RhdGUsbj17cG9wcGVyOntwb3NpdGlvbjp0Lm9wdGlvbnMuc3RyYXRlZ3ksbGVmdDoiMCIsdG9wOiIwIixtYXJnaW46IjAifSxhcnJvdzp7cG9zaXRpb246ImFic29sdXRlIn0scmVmZXJlbmNlOnt9fTtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LmVsZW1lbnRzLnBvcHBlci5zdHlsZSxuLnBvcHBlciksdC5zdHlsZXM9bix0LmVsZW1lbnRzLmFycm93JiZPYmplY3QuYXNzaWduKHQuZWxlbWVudHMuYXJyb3cuc3R5bGUsbi5hcnJvdyksZnVuY3Rpb24oKXtPYmplY3Qua2V5cyh0LmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3ZhciBvPXQuZWxlbWVudHNbcl0sYT10LmF0dHJpYnV0ZXNbcl18fHt9LGk9T2JqZWN0LmtleXModC5zdHlsZXMuaGFzT3duUHJvcGVydHkocik/dC5zdHlsZXNbcl06bltyXSkscz1pLnJlZHVjZShmdW5jdGlvbihsLGMpe3JldHVybiBsW2NdPSIiLGx9LHt9KTshSmUobyl8fCF0dChvKXx8KE9iamVjdC5hc3NpZ24oby5zdHlsZSxzKSxPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGwpe28ucmVtb3ZlQXR0cmlidXRlKGwpfSkpfSl9fXZhciBhaT17bmFtZToiYXBwbHlTdHlsZXMiLGVuYWJsZWQ6ITAscGhhc2U6IndyaXRlIixmbjpZeCxlZmZlY3Q6cXgscmVxdWlyZXM6WyJjb21wdXRlU3R5bGVzIl19O2Z1bmN0aW9uIG50KGUpe3JldHVybiBlLnNwbGl0KCItIilbMF19dmFyIGduPU1hdGgubWF4LHRvPU1hdGgubWluLEtuPU1hdGgucm91bmQ7ZnVuY3Rpb24gWm8oKXt2YXIgZT1uYXZpZ2F0b3IudXNlckFnZW50RGF0YTtyZXR1cm4gZSE9bnVsbCYmZS5icmFuZHMmJkFycmF5LmlzQXJyYXkoZS5icmFuZHMpP2UuYnJhbmRzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5icmFuZCsiLyIrdC52ZXJzaW9ufSkuam9pbigiICIpOm5hdmlnYXRvci51c2VyQWdlbnR9ZnVuY3Rpb24gaWkoKXtyZXR1cm4hL14oKD8hY2hyb21lfGFuZHJvaWQpLikqc2FmYXJpL2kudGVzdChabygpKX1mdW5jdGlvbiB0bihlLHQsbil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSExKTt2YXIgcj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89MSxhPTE7dCYmSmUoZSkmJihvPWUub2Zmc2V0V2lkdGg+MCYmS24oci53aWR0aCkvZS5vZmZzZXRXaWR0aHx8MSxhPWUub2Zmc2V0SGVpZ2h0PjAmJktuKHIuaGVpZ2h0KS9lLm9mZnNldEhlaWdodHx8MSk7dmFyIGk9ZW4oZSk/TWUoZSk6d2luZG93LHM9aS52aXN1YWxWaWV3cG9ydCxsPSFpaSgpJiZuLGM9KHIubGVmdCsobCYmcz9zLm9mZnNldExlZnQ6MCkpL28sZD0oci50b3ArKGwmJnM/cy5vZmZzZXRUb3A6MCkpL2EsdT1yLndpZHRoL28scD1yLmhlaWdodC9hO3JldHVybnt3aWR0aDp1LGhlaWdodDpwLHRvcDpkLHJpZ2h0OmMrdSxib3R0b206ZCtwLGxlZnQ6Yyx4OmMseTpkfX1mdW5jdGlvbiBubyhlKXt2YXIgdD10bihlKSxuPWUub2Zmc2V0V2lkdGgscj1lLm9mZnNldEhlaWdodDtyZXR1cm4gTWF0aC5hYnModC53aWR0aC1uKTw9MSYmKG49dC53aWR0aCksTWF0aC5hYnModC5oZWlnaHQtcik8PTEmJihyPXQuaGVpZ2h0KSx7eDplLm9mZnNldExlZnQseTplLm9mZnNldFRvcCx3aWR0aDpuLGhlaWdodDpyfX1mdW5jdGlvbiBzaShlLHQpe3ZhciBuPXQuZ2V0Um9vdE5vZGUmJnQuZ2V0Um9vdE5vZGUoKTtpZihlLmNvbnRhaW5zKHQpKXJldHVybiEwO2lmKG4mJlhvKG4pKXt2YXIgcj10O2Rve2lmKHImJmUuaXNTYW1lTm9kZShyKSlyZXR1cm4hMDtyPXIucGFyZW50Tm9kZXx8ci5ob3N0fXdoaWxlKHIpfXJldHVybiExfWZ1bmN0aW9uIGt0KGUpe3JldHVybiBNZShlKS5nZXRDb21wdXRlZFN0eWxlKGUpfWZ1bmN0aW9uIE1kKGUpe3JldHVyblsidGFibGUiLCJ0ZCIsInRoIl0uaW5kZXhPZih0dChlKSk+PTB9ZnVuY3Rpb24gaXQoZSl7cmV0dXJuKChlbihlKT9lLm93bmVyRG9jdW1lbnQ6ZS5kb2N1bWVudCl8fHdpbmRvdy5kb2N1bWVudCkuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIFluKGUpe3JldHVybiB0dChlKT09PSJodG1sIj9lOmUuYXNzaWduZWRTbG90fHxlLnBhcmVudE5vZGV8fChYbyhlKT9lLmhvc3Q6bnVsbCl8fGl0KGUpfWZ1bmN0aW9uIGh5KGUpe3JldHVybiFKZShlKXx8a3QoZSkucG9zaXRpb249PT0iZml4ZWQiP251bGw6ZS5vZmZzZXRQYXJlbnR9ZnVuY3Rpb24gUXgoZSl7dmFyIHQ9L2ZpcmVmb3gvaS50ZXN0KFpvKCkpLG49L1RyaWRlbnQvaS50ZXN0KFpvKCkpO2lmKG4mJkplKGUpKXt2YXIgcj1rdChlKTtpZihyLnBvc2l0aW9uPT09ImZpeGVkIilyZXR1cm4gbnVsbH12YXIgbz1ZbihlKTtmb3IoWG8obykmJihvPW8uaG9zdCk7SmUobykmJlsiaHRtbCIsImJvZHkiXS5pbmRleE9mKHR0KG8pKTwwOyl7dmFyIGE9a3Qobyk7aWYoYS50cmFuc2Zvcm0hPT0ibm9uZSJ8fGEucGVyc3BlY3RpdmUhPT0ibm9uZSJ8fGEuY29udGFpbj09PSJwYWludCJ8fFsidHJhbnNmb3JtIiwicGVyc3BlY3RpdmUiXS5pbmRleE9mKGEud2lsbENoYW5nZSkhPT0tMXx8dCYmYS53aWxsQ2hhbmdlPT09ImZpbHRlciJ8fHQmJmEuZmlsdGVyJiZhLmZpbHRlciE9PSJub25lIilyZXR1cm4gbztvPW8ucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB5bihlKXtmb3IodmFyIHQ9TWUoZSksbj1oeShlKTtuJiZNZChuKSYma3QobikucG9zaXRpb249PT0ic3RhdGljIjspbj1oeShuKTtyZXR1cm4gbiYmKHR0KG4pPT09Imh0bWwifHx0dChuKT09PSJib2R5IiYma3QobikucG9zaXRpb249PT0ic3RhdGljIik/dDpufHxReChlKXx8dH1mdW5jdGlvbiBybyhlKXtyZXR1cm5bInRvcCIsImJvdHRvbSJdLmluZGV4T2YoZSk+PTA/IngiOiJ5In1mdW5jdGlvbiBvbyhlLHQsbil7cmV0dXJuIGduKGUsdG8odCxuKSl9ZnVuY3Rpb24gZ3koZSx0LG4pe3ZhciByPW9vKGUsdCxuKTtyZXR1cm4gcj5uP246cn1mdW5jdGlvbiBsaSgpe3JldHVybnt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH19ZnVuY3Rpb24gY2koZSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sbGkoKSxlKX1mdW5jdGlvbiB1aShlLHQpe3JldHVybiB0LnJlZHVjZShmdW5jdGlvbihuLHIpe3JldHVybiBuW3JdPWUsbn0se30pfXZhciBKeD1mdW5jdGlvbih0LG4pe3JldHVybiB0PXR5cGVvZiB0PT0iZnVuY3Rpb24iP3QoT2JqZWN0LmFzc2lnbih7fSxuLnJlY3RzLHtwbGFjZW1lbnQ6bi5wbGFjZW1lbnR9KSk6dCxjaSh0eXBlb2YgdCE9Im51bWJlciI/dDp1aSh0LERyKSl9O2Z1bmN0aW9uIFh4KGUpe3ZhciB0LG49ZS5zdGF0ZSxyPWUubmFtZSxvPWUub3B0aW9ucyxhPW4uZWxlbWVudHMuYXJyb3csaT1uLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxzPW50KG4ucGxhY2VtZW50KSxsPXJvKHMpLGM9W2plLEtlXS5pbmRleE9mKHMpPj0wLGQ9Yz8iaGVpZ2h0Ijoid2lkdGgiO2lmKCEoIWF8fCFpKSl7dmFyIHU9Sngoby5wYWRkaW5nLG4pLHA9bm8oYSksZj1sPT09InkiP1dlOmplLHk9bD09PSJ5Ij9RZTpLZSx3PW4ucmVjdHMucmVmZXJlbmNlW2RdK24ucmVjdHMucmVmZXJlbmNlW2xdLWlbbF0tbi5yZWN0cy5wb3BwZXJbZF0sYj1pW2xdLW4ucmVjdHMucmVmZXJlbmNlW2xdLHY9eW4oYSksaD12P2w9PT0ieSI/di5jbGllbnRIZWlnaHR8fDA6di5jbGllbnRXaWR0aHx8MDowLGc9dy8yLWIvMixtPXVbZl0seD1oLXBbZF0tdVt5XSxTPWgvMi1wW2RdLzIrZyxfPW9vKG0sUyx4KSxEPWw7bi5tb2RpZmllcnNEYXRhW3JdPSh0PXt9LHRbRF09Xyx0LmNlbnRlck9mZnNldD1fLVMsdCl9fWZ1bmN0aW9uIFp4KGUpe3ZhciB0PWUuc3RhdGUsbj1lLm9wdGlvbnMscj1uLmVsZW1lbnQsbz1yPT09dm9pZCAwPyJbZGF0YS1wb3BwZXItYXJyb3ddIjpyO28hPW51bGwmJih0eXBlb2Ygbz09InN0cmluZyImJihvPXQuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IobyksIW8pfHxzaSh0LmVsZW1lbnRzLnBvcHBlcixvKSYmKHQuZWxlbWVudHMuYXJyb3c9bykpfXZhciB5eT17bmFtZToiYXJyb3ciLGVuYWJsZWQ6ITAscGhhc2U6Im1haW4iLGZuOlh4LGVmZmVjdDpaeCxyZXF1aXJlczpbInBvcHBlck9mZnNldHMiXSxyZXF1aXJlc0lmRXhpc3RzOlsicHJldmVudE92ZXJmbG93Il19O2Z1bmN0aW9uIG5uKGUpe3JldHVybiBlLnNwbGl0KCItIilbMV19dmFyIGUxPXt0b3A6ImF1dG8iLHJpZ2h0OiJhdXRvIixib3R0b206ImF1dG8iLGxlZnQ6ImF1dG8ifTtmdW5jdGlvbiB0MShlLHQpe3ZhciBuPWUueCxyPWUueSxvPXQuZGV2aWNlUGl4ZWxSYXRpb3x8MTtyZXR1cm57eDpLbihuKm8pL298fDAseTpLbihyKm8pL298fDB9fWZ1bmN0aW9uIHZ5KGUpe3ZhciB0LG49ZS5wb3BwZXIscj1lLnBvcHBlclJlY3Qsbz1lLnBsYWNlbWVudCxhPWUudmFyaWF0aW9uLGk9ZS5vZmZzZXRzLHM9ZS5wb3NpdGlvbixsPWUuZ3B1QWNjZWxlcmF0aW9uLGM9ZS5hZGFwdGl2ZSxkPWUucm91bmRPZmZzZXRzLHU9ZS5pc0ZpeGVkLHA9aS54LGY9cD09PXZvaWQgMD8wOnAseT1pLnksdz15PT09dm9pZCAwPzA6eSxiPXR5cGVvZiBkPT0iZnVuY3Rpb24iP2Qoe3g6Zix5Ond9KTp7eDpmLHk6d307Zj1iLngsdz1iLnk7dmFyIHY9aS5oYXNPd25Qcm9wZXJ0eSgieCIpLGg9aS5oYXNPd25Qcm9wZXJ0eSgieSIpLGc9amUsbT1XZSx4PXdpbmRvdztpZihjKXt2YXIgUz15bihuKSxfPSJjbGllbnRIZWlnaHQiLEQ9ImNsaWVudFdpZHRoIjtpZihTPT09TWUobikmJihTPWl0KG4pLGt0KFMpLnBvc2l0aW9uIT09InN0YXRpYyImJnM9PT0iYWJzb2x1dGUiJiYoXz0ic2Nyb2xsSGVpZ2h0IixEPSJzY3JvbGxXaWR0aCIpKSxTPVMsbz09PVdlfHwobz09PWplfHxvPT09S2UpJiZhPT09ZW8pe209UWU7dmFyIEE9dSYmUz09PXgmJngudmlzdWFsVmlld3BvcnQ/eC52aXN1YWxWaWV3cG9ydC5oZWlnaHQ6U1tfXTt3LT1BLXIuaGVpZ2h0LHcqPWw/MTotMX1pZihvPT09amV8fChvPT09V2V8fG89PT1RZSkmJmE9PT1lbyl7Zz1LZTt2YXIgVD11JiZTPT09eCYmeC52aXN1YWxWaWV3cG9ydD94LnZpc3VhbFZpZXdwb3J0LndpZHRoOlNbRF07Zi09VC1yLndpZHRoLGYqPWw/MTotMX19dmFyIEw9T2JqZWN0LmFzc2lnbih7cG9zaXRpb246c30sYyYmZTEpLHo9ZD09PSEwP3QxKHt4OmYseTp3fSxNZShuKSk6e3g6Zix5Ond9O2lmKGY9ei54LHc9ei55LGwpe3ZhciBJO3JldHVybiBPYmplY3QuYXNzaWduKHt9LEwsKEk9e30sSVttXT1oPyIwIjoiIixJW2ddPXY/IjAiOiIiLEkudHJhbnNmb3JtPSh4LmRldmljZVBpeGVsUmF0aW98fDEpPD0xPyJ0cmFuc2xhdGUoIitmKyJweCwgIit3KyJweCkiOiJ0cmFuc2xhdGUzZCgiK2YrInB4LCAiK3crInB4LCAwKSIsSSkpfXJldHVybiBPYmplY3QuYXNzaWduKHt9LEwsKHQ9e30sdFttXT1oP3crInB4IjoiIix0W2ddPXY/ZisicHgiOiIiLHQudHJhbnNmb3JtPSIiLHQpKX1mdW5jdGlvbiBuMShlKXt2YXIgdD1lLnN0YXRlLG49ZS5vcHRpb25zLHI9bi5ncHVBY2NlbGVyYXRpb24sbz1yPT09dm9pZCAwPyEwOnIsYT1uLmFkYXB0aXZlLGk9YT09PXZvaWQgMD8hMDphLHM9bi5yb3VuZE9mZnNldHMsbD1zPT09dm9pZCAwPyEwOnMsYz17cGxhY2VtZW50Om50KHQucGxhY2VtZW50KSx2YXJpYXRpb246bm4odC5wbGFjZW1lbnQpLHBvcHBlcjp0LmVsZW1lbnRzLnBvcHBlcixwb3BwZXJSZWN0OnQucmVjdHMucG9wcGVyLGdwdUFjY2VsZXJhdGlvbjpvLGlzRml4ZWQ6dC5vcHRpb25zLnN0cmF0ZWd5PT09ImZpeGVkIn07dC5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMhPW51bGwmJih0LnN0eWxlcy5wb3BwZXI9T2JqZWN0LmFzc2lnbih7fSx0LnN0eWxlcy5wb3BwZXIsdnkoT2JqZWN0LmFzc2lnbih7fSxjLHtvZmZzZXRzOnQubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLHBvc2l0aW9uOnQub3B0aW9ucy5zdHJhdGVneSxhZGFwdGl2ZTppLHJvdW5kT2Zmc2V0czpsfSkpKSksdC5tb2RpZmllcnNEYXRhLmFycm93IT1udWxsJiYodC5zdHlsZXMuYXJyb3c9T2JqZWN0LmFzc2lnbih7fSx0LnN0eWxlcy5hcnJvdyx2eShPYmplY3QuYXNzaWduKHt9LGMse29mZnNldHM6dC5tb2RpZmllcnNEYXRhLmFycm93LHBvc2l0aW9uOiJhYnNvbHV0ZSIsYWRhcHRpdmU6ITEscm91bmRPZmZzZXRzOmx9KSkpKSx0LmF0dHJpYnV0ZXMucG9wcGVyPU9iamVjdC5hc3NpZ24oe30sdC5hdHRyaWJ1dGVzLnBvcHBlcix7ImRhdGEtcG9wcGVyLXBsYWNlbWVudCI6dC5wbGFjZW1lbnR9KX12YXIgd3k9e25hbWU6ImNvbXB1dGVTdHlsZXMiLGVuYWJsZWQ6ITAscGhhc2U6ImJlZm9yZVdyaXRlIixmbjpuMSxkYXRhOnt9fTt2YXIgbWw9e3Bhc3NpdmU6ITB9O2Z1bmN0aW9uIHIxKGUpe3ZhciB0PWUuc3RhdGUsbj1lLmluc3RhbmNlLHI9ZS5vcHRpb25zLG89ci5zY3JvbGwsYT1vPT09dm9pZCAwPyEwOm8saT1yLnJlc2l6ZSxzPWk9PT12b2lkIDA/ITA6aSxsPU1lKHQuZWxlbWVudHMucG9wcGVyKSxjPVtdLmNvbmNhdCh0LnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLHQuc2Nyb2xsUGFyZW50cy5wb3BwZXIpO3JldHVybiBhJiZjLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4udXBkYXRlLG1sKX0pLHMmJmwuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixuLnVwZGF0ZSxtbCksZnVuY3Rpb24oKXthJiZjLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4udXBkYXRlLG1sKX0pLHMmJmwucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixuLnVwZGF0ZSxtbCl9fXZhciBieT17bmFtZToiZXZlbnRMaXN0ZW5lcnMiLGVuYWJsZWQ6ITAscGhhc2U6IndyaXRlIixmbjpmdW5jdGlvbigpe30sZWZmZWN0OnIxLGRhdGE6e319O3ZhciBvMT17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iixib3R0b206InRvcCIsdG9wOiJib3R0b20ifTtmdW5jdGlvbiBlYShlKXtyZXR1cm4gZS5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZyxmdW5jdGlvbih0KXtyZXR1cm4gbzFbdF19KX12YXIgYTE9e3N0YXJ0OiJlbmQiLGVuZDoic3RhcnQifTtmdW5jdGlvbiBobChlKXtyZXR1cm4gZS5yZXBsYWNlKC9zdGFydHxlbmQvZyxmdW5jdGlvbih0KXtyZXR1cm4gYTFbdF19KX1mdW5jdGlvbiBhbyhlKXt2YXIgdD1NZShlKSxuPXQucGFnZVhPZmZzZXQscj10LnBhZ2VZT2Zmc2V0O3JldHVybntzY3JvbGxMZWZ0Om4sc2Nyb2xsVG9wOnJ9fWZ1bmN0aW9uIGlvKGUpe3JldHVybiB0bihpdChlKSkubGVmdCthbyhlKS5zY3JvbGxMZWZ0fWZ1bmN0aW9uIFBkKGUsdCl7dmFyIG49TWUoZSkscj1pdChlKSxvPW4udmlzdWFsVmlld3BvcnQsYT1yLmNsaWVudFdpZHRoLGk9ci5jbGllbnRIZWlnaHQscz0wLGw9MDtpZihvKXthPW8ud2lkdGgsaT1vLmhlaWdodDt2YXIgYz1paSgpOyhjfHwhYyYmdD09PSJmaXhlZCIpJiYocz1vLm9mZnNldExlZnQsbD1vLm9mZnNldFRvcCl9cmV0dXJue3dpZHRoOmEsaGVpZ2h0OmkseDpzK2lvKGUpLHk6bH19ZnVuY3Rpb24gTGQoZSl7dmFyIHQsbj1pdChlKSxyPWFvKGUpLG89KHQ9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6dC5ib2R5LGE9Z24obi5zY3JvbGxXaWR0aCxuLmNsaWVudFdpZHRoLG8/by5zY3JvbGxXaWR0aDowLG8/by5jbGllbnRXaWR0aDowKSxpPWduKG4uc2Nyb2xsSGVpZ2h0LG4uY2xpZW50SGVpZ2h0LG8/by5zY3JvbGxIZWlnaHQ6MCxvP28uY2xpZW50SGVpZ2h0OjApLHM9LXIuc2Nyb2xsTGVmdCtpbyhlKSxsPS1yLnNjcm9sbFRvcDtyZXR1cm4ga3Qob3x8bikuZGlyZWN0aW9uPT09InJ0bCImJihzKz1nbihuLmNsaWVudFdpZHRoLG8/by5jbGllbnRXaWR0aDowKS1hKSx7d2lkdGg6YSxoZWlnaHQ6aSx4OnMseTpsfX1mdW5jdGlvbiBzbyhlKXt2YXIgdD1rdChlKSxuPXQub3ZlcmZsb3cscj10Lm92ZXJmbG93WCxvPXQub3ZlcmZsb3dZO3JldHVybi9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChuK28rcil9ZnVuY3Rpb24gZ2woZSl7cmV0dXJuWyJodG1sIiwiYm9keSIsIiNkb2N1bWVudCJdLmluZGV4T2YodHQoZSkpPj0wP2Uub3duZXJEb2N1bWVudC5ib2R5OkplKGUpJiZzbyhlKT9lOmdsKFluKGUpKX1mdW5jdGlvbiBfcihlLHQpe3ZhciBuO3Q9PT12b2lkIDAmJih0PVtdKTt2YXIgcj1nbChlKSxvPXI9PT0oKG49ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6bi5ib2R5KSxhPU1lKHIpLGk9bz9bYV0uY29uY2F0KGEudmlzdWFsVmlld3BvcnR8fFtdLHNvKHIpP3I6W10pOnIscz10LmNvbmNhdChpKTtyZXR1cm4gbz9zOnMuY29uY2F0KF9yKFluKGkpKSl9ZnVuY3Rpb24gdGEoZSl7cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sZSx7bGVmdDplLngsdG9wOmUueSxyaWdodDplLngrZS53aWR0aCxib3R0b206ZS55K2UuaGVpZ2h0fSl9ZnVuY3Rpb24gaTEoZSx0KXt2YXIgbj10bihlLCExLHQ9PT0iZml4ZWQiKTtyZXR1cm4gbi50b3A9bi50b3ArZS5jbGllbnRUb3Asbi5sZWZ0PW4ubGVmdCtlLmNsaWVudExlZnQsbi5ib3R0b209bi50b3ArZS5jbGllbnRIZWlnaHQsbi5yaWdodD1uLmxlZnQrZS5jbGllbnRXaWR0aCxuLndpZHRoPWUuY2xpZW50V2lkdGgsbi5oZWlnaHQ9ZS5jbGllbnRIZWlnaHQsbi54PW4ubGVmdCxuLnk9bi50b3Asbn1mdW5jdGlvbiBreShlLHQsbil7cmV0dXJuIHQ9PT1wbD90YShQZChlLG4pKTplbih0KT9pMSh0LG4pOnRhKExkKGl0KGUpKSl9ZnVuY3Rpb24gczEoZSl7dmFyIHQ9X3IoWW4oZSkpLG49WyJhYnNvbHV0ZSIsImZpeGVkIl0uaW5kZXhPZihrdChlKS5wb3NpdGlvbik+PTAscj1uJiZKZShlKT95bihlKTplO3JldHVybiBlbihyKT90LmZpbHRlcihmdW5jdGlvbihvKXtyZXR1cm4gZW4obykmJnNpKG8scikmJnR0KG8pIT09ImJvZHkifSk6W119ZnVuY3Rpb24gemQoZSx0LG4scil7dmFyIG89dD09PSJjbGlwcGluZ1BhcmVudHMiP3MxKGUpOltdLmNvbmNhdCh0KSxhPVtdLmNvbmNhdChvLFtuXSksaT1hWzBdLHM9YS5yZWR1Y2UoZnVuY3Rpb24obCxjKXt2YXIgZD1reShlLGMscik7cmV0dXJuIGwudG9wPWduKGQudG9wLGwudG9wKSxsLnJpZ2h0PXRvKGQucmlnaHQsbC5yaWdodCksbC5ib3R0b209dG8oZC5ib3R0b20sbC5ib3R0b20pLGwubGVmdD1nbihkLmxlZnQsbC5sZWZ0KSxsfSxreShlLGkscikpO3JldHVybiBzLndpZHRoPXMucmlnaHQtcy5sZWZ0LHMuaGVpZ2h0PXMuYm90dG9tLXMudG9wLHMueD1zLmxlZnQscy55PXMudG9wLHN9ZnVuY3Rpb24gZGkoZSl7dmFyIHQ9ZS5yZWZlcmVuY2Usbj1lLmVsZW1lbnQscj1lLnBsYWNlbWVudCxvPXI/bnQocik6bnVsbCxhPXI/bm4ocik6bnVsbCxpPXQueCt0LndpZHRoLzItbi53aWR0aC8yLHM9dC55K3QuaGVpZ2h0LzItbi5oZWlnaHQvMixsO3N3aXRjaChvKXtjYXNlIFdlOmw9e3g6aSx5OnQueS1uLmhlaWdodH07YnJlYWs7Y2FzZSBRZTpsPXt4OmkseTp0LnkrdC5oZWlnaHR9O2JyZWFrO2Nhc2UgS2U6bD17eDp0LngrdC53aWR0aCx5OnN9O2JyZWFrO2Nhc2UgamU6bD17eDp0Lngtbi53aWR0aCx5OnN9O2JyZWFrO2RlZmF1bHQ6bD17eDp0LngseTp0Lnl9fXZhciBjPW8/cm8obyk6bnVsbDtpZihjIT1udWxsKXt2YXIgZD1jPT09InkiPyJoZWlnaHQiOiJ3aWR0aCI7c3dpdGNoKGEpe2Nhc2UgR246bFtjXT1sW2NdLSh0W2RdLzItbltkXS8yKTticmVhaztjYXNlIGVvOmxbY109bFtjXSsodFtkXS8yLW5bZF0vMik7YnJlYWs7ZGVmYXVsdDp9fXJldHVybiBsfWZ1bmN0aW9uIHZuKGUsdCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciBuPXQscj1uLnBsYWNlbWVudCxvPXI9PT12b2lkIDA/ZS5wbGFjZW1lbnQ6cixhPW4uc3RyYXRlZ3ksaT1hPT09dm9pZCAwP2Uuc3RyYXRlZ3k6YSxzPW4uYm91bmRhcnksbD1zPT09dm9pZCAwP3B5OnMsYz1uLnJvb3RCb3VuZGFyeSxkPWM9PT12b2lkIDA/cGw6Yyx1PW4uZWxlbWVudENvbnRleHQscD11PT09dm9pZCAwP0pvOnUsZj1uLmFsdEJvdW5kYXJ5LHk9Zj09PXZvaWQgMD8hMTpmLHc9bi5wYWRkaW5nLGI9dz09PXZvaWQgMD8wOncsdj1jaSh0eXBlb2YgYiE9Im51bWJlciI/Yjp1aShiLERyKSksaD1wPT09Sm8/Znk6Sm8sZz1lLnJlY3RzLnBvcHBlcixtPWUuZWxlbWVudHNbeT9oOnBdLHg9emQoZW4obSk/bTptLmNvbnRleHRFbGVtZW50fHxpdChlLmVsZW1lbnRzLnBvcHBlciksbCxkLGkpLFM9dG4oZS5lbGVtZW50cy5yZWZlcmVuY2UpLF89ZGkoe3JlZmVyZW5jZTpTLGVsZW1lbnQ6ZyxzdHJhdGVneToiYWJzb2x1dGUiLHBsYWNlbWVudDpvfSksRD10YShPYmplY3QuYXNzaWduKHt9LGcsXykpLEE9cD09PUpvP0Q6UyxUPXt0b3A6eC50b3AtQS50b3Ardi50b3AsYm90dG9tOkEuYm90dG9tLXguYm90dG9tK3YuYm90dG9tLGxlZnQ6eC5sZWZ0LUEubGVmdCt2LmxlZnQscmlnaHQ6QS5yaWdodC14LnJpZ2h0K3YucmlnaHR9LEw9ZS5tb2RpZmllcnNEYXRhLm9mZnNldDtpZihwPT09Sm8mJkwpe3ZhciB6PUxbb107T2JqZWN0LmtleXMoVCkuZm9yRWFjaChmdW5jdGlvbihJKXt2YXIgTT1bS2UsUWVdLmluZGV4T2YoSSk+PTA/MTotMSxGPVtXZSxRZV0uaW5kZXhPZihJKT49MD8ieSI6IngiO1RbSV0rPXpbRl0qTX0pfXJldHVybiBUfWZ1bmN0aW9uIEZkKGUsdCl7dD09PXZvaWQgMCYmKHQ9e30pO3ZhciBuPXQscj1uLnBsYWNlbWVudCxvPW4uYm91bmRhcnksYT1uLnJvb3RCb3VuZGFyeSxpPW4ucGFkZGluZyxzPW4uZmxpcFZhcmlhdGlvbnMsbD1uLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxjPWw9PT12b2lkIDA/Zmw6bCxkPW5uKHIpLHU9ZD9zP1JkOlJkLmZpbHRlcihmdW5jdGlvbih5KXtyZXR1cm4gbm4oeSk9PT1kfSk6RHIscD11LmZpbHRlcihmdW5jdGlvbih5KXtyZXR1cm4gYy5pbmRleE9mKHkpPj0wfSk7cC5sZW5ndGg9PT0wJiYocD11KTt2YXIgZj1wLnJlZHVjZShmdW5jdGlvbih5LHcpe3JldHVybiB5W3ddPXZuKGUse3BsYWNlbWVudDp3LGJvdW5kYXJ5Om8scm9vdEJvdW5kYXJ5OmEscGFkZGluZzppfSlbbnQodyldLHl9LHt9KTtyZXR1cm4gT2JqZWN0LmtleXMoZikuc29ydChmdW5jdGlvbih5LHcpe3JldHVybiBmW3ldLWZbd119KX1mdW5jdGlvbiBsMShlKXtpZihudChlKT09PWRsKXJldHVybltdO3ZhciB0PWVhKGUpO3JldHVybltobChlKSx0LGhsKHQpXX1mdW5jdGlvbiBjMShlKXt2YXIgdD1lLnN0YXRlLG49ZS5vcHRpb25zLHI9ZS5uYW1lO2lmKCF0Lm1vZGlmaWVyc0RhdGFbcl0uX3NraXApe2Zvcih2YXIgbz1uLm1haW5BeGlzLGE9bz09PXZvaWQgMD8hMDpvLGk9bi5hbHRBeGlzLHM9aT09PXZvaWQgMD8hMDppLGw9bi5mYWxsYmFja1BsYWNlbWVudHMsYz1uLnBhZGRpbmcsZD1uLmJvdW5kYXJ5LHU9bi5yb290Qm91bmRhcnkscD1uLmFsdEJvdW5kYXJ5LGY9bi5mbGlwVmFyaWF0aW9ucyx5PWY9PT12b2lkIDA/ITA6Zix3PW4uYWxsb3dlZEF1dG9QbGFjZW1lbnRzLGI9dC5vcHRpb25zLnBsYWNlbWVudCx2PW50KGIpLGg9dj09PWIsZz1sfHwoaHx8IXk/W2VhKGIpXTpsMShiKSksbT1bYl0uY29uY2F0KGcpLnJlZHVjZShmdW5jdGlvbihILHEpe3JldHVybiBILmNvbmNhdChudChxKT09PWRsP0ZkKHQse3BsYWNlbWVudDpxLGJvdW5kYXJ5OmQscm9vdEJvdW5kYXJ5OnUscGFkZGluZzpjLGZsaXBWYXJpYXRpb25zOnksYWxsb3dlZEF1dG9QbGFjZW1lbnRzOnd9KTpxKX0sW10pLHg9dC5yZWN0cy5yZWZlcmVuY2UsUz10LnJlY3RzLnBvcHBlcixfPW5ldyBNYXAsRD0hMCxBPW1bMF0sVD0wO1Q8bS5sZW5ndGg7VCsrKXt2YXIgTD1tW1RdLHo9bnQoTCksST1ubihMKT09PUduLE09W1dlLFFlXS5pbmRleE9mKHopPj0wLEY9TT8id2lkdGgiOiJoZWlnaHQiLFU9dm4odCx7cGxhY2VtZW50OkwsYm91bmRhcnk6ZCxyb290Qm91bmRhcnk6dSxhbHRCb3VuZGFyeTpwLHBhZGRpbmc6Y30pLE89TT9JP0tlOmplOkk/UWU6V2U7eFtGXT5TW0ZdJiYoTz1lYShPKSk7dmFyIGo9ZWEoTyksWD1bXTtpZihhJiZYLnB1c2goVVt6XTw9MCkscyYmWC5wdXNoKFVbT108PTAsVVtqXTw9MCksWC5ldmVyeShmdW5jdGlvbihIKXtyZXR1cm4gSH0pKXtBPUwsRD0hMTticmVha31fLnNldChMLFgpfWlmKEQpZm9yKHZhciBOPXk/MzoxLGs9ZnVuY3Rpb24ocSl7dmFyIEo9bS5maW5kKGZ1bmN0aW9uKEspe3ZhciBaPV8uZ2V0KEspO2lmKFopcmV0dXJuIFouc2xpY2UoMCxxKS5ldmVyeShmdW5jdGlvbihhZSl7cmV0dXJuIGFlfSl9KTtpZihKKXJldHVybiBBPUosImJyZWFrIn0sUj1OO1I+MDtSLS0pe3ZhciBCPWsoUik7aWYoQj09PSJicmVhayIpYnJlYWt9dC5wbGFjZW1lbnQhPT1BJiYodC5tb2RpZmllcnNEYXRhW3JdLl9za2lwPSEwLHQucGxhY2VtZW50PUEsdC5yZXNldD0hMCl9fXZhciB4eT17bmFtZToiZmxpcCIsZW5hYmxlZDohMCxwaGFzZToibWFpbiIsZm46YzEscmVxdWlyZXNJZkV4aXN0czpbIm9mZnNldCJdLGRhdGE6e19za2lwOiExfX07ZnVuY3Rpb24gU3koZSx0LG4pe3JldHVybiBuPT09dm9pZCAwJiYobj17eDowLHk6MH0pLHt0b3A6ZS50b3AtdC5oZWlnaHQtbi55LHJpZ2h0OmUucmlnaHQtdC53aWR0aCtuLngsYm90dG9tOmUuYm90dG9tLXQuaGVpZ2h0K24ueSxsZWZ0OmUubGVmdC10LndpZHRoLW4ueH19ZnVuY3Rpb24gRXkoZSl7cmV0dXJuW1dlLEtlLFFlLGplXS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdPj0wfSl9ZnVuY3Rpb24gdTEoZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUubmFtZSxyPXQucmVjdHMucmVmZXJlbmNlLG89dC5yZWN0cy5wb3BwZXIsYT10Lm1vZGlmaWVyc0RhdGEucHJldmVudE92ZXJmbG93LGk9dm4odCx7ZWxlbWVudENvbnRleHQ6InJlZmVyZW5jZSJ9KSxzPXZuKHQse2FsdEJvdW5kYXJ5OiEwfSksbD1TeShpLHIpLGM9U3kocyxvLGEpLGQ9RXkobCksdT1FeShjKTt0Lm1vZGlmaWVyc0RhdGFbbl09e3JlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0czpsLHBvcHBlckVzY2FwZU9mZnNldHM6Yyxpc1JlZmVyZW5jZUhpZGRlbjpkLGhhc1BvcHBlckVzY2FwZWQ6dX0sdC5hdHRyaWJ1dGVzLnBvcHBlcj1PYmplY3QuYXNzaWduKHt9LHQuYXR0cmlidXRlcy5wb3BwZXIseyJkYXRhLXBvcHBlci1yZWZlcmVuY2UtaGlkZGVuIjpkLCJkYXRhLXBvcHBlci1lc2NhcGVkIjp1fSl9dmFyIFR5PXtuYW1lOiJoaWRlIixlbmFibGVkOiEwLHBoYXNlOiJtYWluIixyZXF1aXJlc0lmRXhpc3RzOlsicHJldmVudE92ZXJmbG93Il0sZm46dTF9O2Z1bmN0aW9uIGQxKGUsdCxuKXt2YXIgcj1udChlKSxvPVtqZSxXZV0uaW5kZXhPZihyKT49MD8tMToxLGE9dHlwZW9mIG49PSJmdW5jdGlvbiI/bihPYmplY3QuYXNzaWduKHt9LHQse3BsYWNlbWVudDplfSkpOm4saT1hWzBdLHM9YVsxXTtyZXR1cm4gaT1pfHwwLHM9KHN8fDApKm8sW2plLEtlXS5pbmRleE9mKHIpPj0wP3t4OnMseTppfTp7eDppLHk6c319ZnVuY3Rpb24gcDEoZSl7dmFyIHQ9ZS5zdGF0ZSxuPWUub3B0aW9ucyxyPWUubmFtZSxvPW4ub2Zmc2V0LGE9bz09PXZvaWQgMD9bMCwwXTpvLGk9ZmwucmVkdWNlKGZ1bmN0aW9uKGQsdSl7cmV0dXJuIGRbdV09ZDEodSx0LnJlY3RzLGEpLGR9LHt9KSxzPWlbdC5wbGFjZW1lbnRdLGw9cy54LGM9cy55O3QubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzIT1udWxsJiYodC5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueCs9bCx0Lm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy55Kz1jKSx0Lm1vZGlmaWVyc0RhdGFbcl09aX12YXIgTnk9e25hbWU6Im9mZnNldCIsZW5hYmxlZDohMCxwaGFzZToibWFpbiIscmVxdWlyZXM6WyJwb3BwZXJPZmZzZXRzIl0sZm46cDF9O2Z1bmN0aW9uIGYxKGUpe3ZhciB0PWUuc3RhdGUsbj1lLm5hbWU7dC5tb2RpZmllcnNEYXRhW25dPWRpKHtyZWZlcmVuY2U6dC5yZWN0cy5yZWZlcmVuY2UsZWxlbWVudDp0LnJlY3RzLnBvcHBlcixzdHJhdGVneToiYWJzb2x1dGUiLHBsYWNlbWVudDp0LnBsYWNlbWVudH0pfXZhciBEeT17bmFtZToicG9wcGVyT2Zmc2V0cyIsZW5hYmxlZDohMCxwaGFzZToicmVhZCIsZm46ZjEsZGF0YTp7fX07ZnVuY3Rpb24gVWQoZSl7cmV0dXJuIGU9PT0ieCI/InkiOiJ4In1mdW5jdGlvbiBtMShlKXt2YXIgdD1lLnN0YXRlLG49ZS5vcHRpb25zLHI9ZS5uYW1lLG89bi5tYWluQXhpcyxhPW89PT12b2lkIDA/ITA6byxpPW4uYWx0QXhpcyxzPWk9PT12b2lkIDA/ITE6aSxsPW4uYm91bmRhcnksYz1uLnJvb3RCb3VuZGFyeSxkPW4uYWx0Qm91bmRhcnksdT1uLnBhZGRpbmcscD1uLnRldGhlcixmPXA9PT12b2lkIDA/ITA6cCx5PW4udGV0aGVyT2Zmc2V0LHc9eT09PXZvaWQgMD8wOnksYj12bih0LHtib3VuZGFyeTpsLHJvb3RCb3VuZGFyeTpjLHBhZGRpbmc6dSxhbHRCb3VuZGFyeTpkfSksdj1udCh0LnBsYWNlbWVudCksaD1ubih0LnBsYWNlbWVudCksZz0haCxtPXJvKHYpLHg9VWQobSksUz10Lm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxfPXQucmVjdHMucmVmZXJlbmNlLEQ9dC5yZWN0cy5wb3BwZXIsQT10eXBlb2Ygdz09ImZ1bmN0aW9uIj93KE9iamVjdC5hc3NpZ24oe30sdC5yZWN0cyx7cGxhY2VtZW50OnQucGxhY2VtZW50fSkpOncsVD10eXBlb2YgQT09Im51bWJlciI/e21haW5BeGlzOkEsYWx0QXhpczpBfTpPYmplY3QuYXNzaWduKHttYWluQXhpczowLGFsdEF4aXM6MH0sQSksTD10Lm1vZGlmaWVyc0RhdGEub2Zmc2V0P3QubW9kaWZpZXJzRGF0YS5vZmZzZXRbdC5wbGFjZW1lbnRdOm51bGwsej17eDowLHk6MH07aWYoUyl7aWYoYSl7dmFyIEksTT1tPT09InkiP1dlOmplLEY9bT09PSJ5Ij9RZTpLZSxVPW09PT0ieSI/ImhlaWdodCI6IndpZHRoIixPPVNbbV0saj1PK2JbTV0sWD1PLWJbRl0sTj1mPy1EW1VdLzI6MCxrPWg9PT1Hbj9fW1VdOkRbVV0sUj1oPT09R24/LURbVV06LV9bVV0sQj10LmVsZW1lbnRzLmFycm93LEg9ZiYmQj9ubyhCKTp7d2lkdGg6MCxoZWlnaHQ6MH0scT10Lm1vZGlmaWVyc0RhdGFbImFycm93I3BlcnNpc3RlbnQiXT90Lm1vZGlmaWVyc0RhdGFbImFycm93I3BlcnNpc3RlbnQiXS5wYWRkaW5nOmxpKCksSj1xW01dLEs9cVtGXSxaPW9vKDAsX1tVXSxIW1VdKSxhZT1nP19bVV0vMi1OLVotSi1ULm1haW5BeGlzOmstWi1KLVQubWFpbkF4aXMsbGU9Zz8tX1tVXS8yK04rWitLK1QubWFpbkF4aXM6UitaK0srVC5tYWluQXhpcyxjZT10LmVsZW1lbnRzLmFycm93JiZ5bih0LmVsZW1lbnRzLmFycm93KSxlZT1jZT9tPT09InkiP2NlLmNsaWVudFRvcHx8MDpjZS5jbGllbnRMZWZ0fHwwOjAsaWU9KEk9TD8uW21dKSE9bnVsbD9JOjAsUT1PK2FlLWllLWVlLGdlPU8rbGUtaWUsX2U9b28oZj90byhqLFEpOmosTyxmP2duKFgsZ2UpOlgpO1NbbV09X2UselttXT1fZS1PfWlmKHMpe3ZhciBCZSxYZT1tPT09IngiP1dlOmplLFN0PW09PT0ieCI/UWU6S2UsVWU9U1t4XSxFdD14PT09InkiPyJoZWlnaHQiOiJ3aWR0aCIsSHQ9VWUrYltYZV0sanQ9VWUtYltTdF0seG49W1dlLGplXS5pbmRleE9mKHYpIT09LTEsTW49KEJlPUw/Llt4XSkhPW51bGw/QmU6MCxQbj14bj9IdDpVZS1fW0V0XS1EW0V0XS1NbitULmFsdEF4aXMsdWU9eG4/VWUrX1tFdF0rRFtFdF0tTW4tVC5hbHRBeGlzOmp0LEVlPWYmJnhuP2d5KFBuLFVlLHVlKTpvbyhmP1BuOkh0LFVlLGY/dWU6anQpO1NbeF09RWUselt4XT1FZS1VZX10Lm1vZGlmaWVyc0RhdGFbcl09en19dmFyIF95PXtuYW1lOiJwcmV2ZW50T3ZlcmZsb3ciLGVuYWJsZWQ6ITAscGhhc2U6Im1haW4iLGZuOm0xLHJlcXVpcmVzSWZFeGlzdHM6WyJvZmZzZXQiXX07ZnVuY3Rpb24gJGQoZSl7cmV0dXJue3Njcm9sbExlZnQ6ZS5zY3JvbGxMZWZ0LHNjcm9sbFRvcDplLnNjcm9sbFRvcH19ZnVuY3Rpb24gV2QoZSl7cmV0dXJuIGU9PT1NZShlKXx8IUplKGUpP2FvKGUpOiRkKGUpfWZ1bmN0aW9uIGgxKGUpe3ZhciB0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1Lbih0LndpZHRoKS9lLm9mZnNldFdpZHRofHwxLHI9S24odC5oZWlnaHQpL2Uub2Zmc2V0SGVpZ2h0fHwxO3JldHVybiBuIT09MXx8ciE9PTF9ZnVuY3Rpb24gQmQoZSx0LG4pe249PT12b2lkIDAmJihuPSExKTt2YXIgcj1KZSh0KSxvPUplKHQpJiZoMSh0KSxhPWl0KHQpLGk9dG4oZSxvLG4pLHM9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0sbD17eDowLHk6MH07cmV0dXJuKHJ8fCFyJiYhbikmJigodHQodCkhPT0iYm9keSJ8fHNvKGEpKSYmKHM9V2QodCkpLEplKHQpPyhsPXRuKHQsITApLGwueCs9dC5jbGllbnRMZWZ0LGwueSs9dC5jbGllbnRUb3ApOmEmJihsLng9aW8oYSkpKSx7eDppLmxlZnQrcy5zY3JvbGxMZWZ0LWwueCx5OmkudG9wK3Muc2Nyb2xsVG9wLWwueSx3aWR0aDppLndpZHRoLGhlaWdodDppLmhlaWdodH19ZnVuY3Rpb24gZzEoZSl7dmFyIHQ9bmV3IE1hcCxuPW5ldyBTZXQscj1bXTtlLmZvckVhY2goZnVuY3Rpb24oYSl7dC5zZXQoYS5uYW1lLGEpfSk7ZnVuY3Rpb24gbyhhKXtuLmFkZChhLm5hbWUpO3ZhciBpPVtdLmNvbmNhdChhLnJlcXVpcmVzfHxbXSxhLnJlcXVpcmVzSWZFeGlzdHN8fFtdKTtpLmZvckVhY2goZnVuY3Rpb24ocyl7aWYoIW4uaGFzKHMpKXt2YXIgbD10LmdldChzKTtsJiZvKGwpfX0pLHIucHVzaChhKX1yZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGEpe24uaGFzKGEubmFtZSl8fG8oYSl9KSxyfWZ1bmN0aW9uIEhkKGUpe3ZhciB0PWcxKGUpO3JldHVybiBteS5yZWR1Y2UoZnVuY3Rpb24obixyKXtyZXR1cm4gbi5jb25jYXQodC5maWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIG8ucGhhc2U9PT1yfSkpfSxbXSl9ZnVuY3Rpb24gamQoZSl7dmFyIHQ7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR8fCh0PW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24oKXt0PXZvaWQgMCxuKGUoKSl9KX0pKSx0fX1mdW5jdGlvbiBWZChlKXt2YXIgdD1lLnJlZHVjZShmdW5jdGlvbihuLHIpe3ZhciBvPW5bci5uYW1lXTtyZXR1cm4gbltyLm5hbWVdPW8/T2JqZWN0LmFzc2lnbih7fSxvLHIse29wdGlvbnM6T2JqZWN0LmFzc2lnbih7fSxvLm9wdGlvbnMsci5vcHRpb25zKSxkYXRhOk9iamVjdC5hc3NpZ24oe30sby5kYXRhLHIuZGF0YSl9KTpyLG59LHt9KTtyZXR1cm4gT2JqZWN0LmtleXModCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0W25dfSl9dmFyIEN5PXtwbGFjZW1lbnQ6ImJvdHRvbSIsbW9kaWZpZXJzOltdLHN0cmF0ZWd5OiJhYnNvbHV0ZSJ9O2Z1bmN0aW9uIEF5KCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIXQuc29tZShmdW5jdGlvbihyKXtyZXR1cm4hKHImJnR5cGVvZiByLmdldEJvdW5kaW5nQ2xpZW50UmVjdD09ImZ1bmN0aW9uIil9KX1mdW5jdGlvbiBPeShlKXtlPT09dm9pZCAwJiYoZT17fSk7dmFyIHQ9ZSxuPXQuZGVmYXVsdE1vZGlmaWVycyxyPW49PT12b2lkIDA/W106bixvPXQuZGVmYXVsdE9wdGlvbnMsYT1vPT09dm9pZCAwP0N5Om87cmV0dXJuIGZ1bmN0aW9uKHMsbCxjKXtjPT09dm9pZCAwJiYoYz1hKTt2YXIgZD17cGxhY2VtZW50OiJib3R0b20iLG9yZGVyZWRNb2RpZmllcnM6W10sb3B0aW9uczpPYmplY3QuYXNzaWduKHt9LEN5LGEpLG1vZGlmaWVyc0RhdGE6e30sZWxlbWVudHM6e3JlZmVyZW5jZTpzLHBvcHBlcjpsfSxhdHRyaWJ1dGVzOnt9LHN0eWxlczp7fX0sdT1bXSxwPSExLGY9e3N0YXRlOmQsc2V0T3B0aW9uczpmdW5jdGlvbih2KXt2YXIgaD10eXBlb2Ygdj09ImZ1bmN0aW9uIj92KGQub3B0aW9ucyk6djt3KCksZC5vcHRpb25zPU9iamVjdC5hc3NpZ24oe30sYSxkLm9wdGlvbnMsaCksZC5zY3JvbGxQYXJlbnRzPXtyZWZlcmVuY2U6ZW4ocyk/X3Iocyk6cy5jb250ZXh0RWxlbWVudD9fcihzLmNvbnRleHRFbGVtZW50KTpbXSxwb3BwZXI6X3IobCl9O3ZhciBnPUhkKFZkKFtdLmNvbmNhdChyLGQub3B0aW9ucy5tb2RpZmllcnMpKSk7cmV0dXJuIGQub3JkZXJlZE1vZGlmaWVycz1nLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4gbS5lbmFibGVkfSkseSgpLGYudXBkYXRlKCl9LGZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7aWYoIXApe3ZhciB2PWQuZWxlbWVudHMsaD12LnJlZmVyZW5jZSxnPXYucG9wcGVyO2lmKEF5KGgsZykpe2QucmVjdHM9e3JlZmVyZW5jZTpCZChoLHluKGcpLGQub3B0aW9ucy5zdHJhdGVneT09PSJmaXhlZCIpLHBvcHBlcjpubyhnKX0sZC5yZXNldD0hMSxkLnBsYWNlbWVudD1kLm9wdGlvbnMucGxhY2VtZW50LGQub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uKFQpe3JldHVybiBkLm1vZGlmaWVyc0RhdGFbVC5uYW1lXT1PYmplY3QuYXNzaWduKHt9LFQuZGF0YSl9KTtmb3IodmFyIG09MDttPGQub3JkZXJlZE1vZGlmaWVycy5sZW5ndGg7bSsrKXtpZihkLnJlc2V0PT09ITApe2QucmVzZXQ9ITEsbT0tMTtjb250aW51ZX12YXIgeD1kLm9yZGVyZWRNb2RpZmllcnNbbV0sUz14LmZuLF89eC5vcHRpb25zLEQ9Xz09PXZvaWQgMD97fTpfLEE9eC5uYW1lO3R5cGVvZiBTPT0iZnVuY3Rpb24iJiYoZD1TKHtzdGF0ZTpkLG9wdGlvbnM6RCxuYW1lOkEsaW5zdGFuY2U6Zn0pfHxkKX19fX0sdXBkYXRlOmpkKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGIpe2YuZm9yY2VVcGRhdGUoKSxiKGQpfSl9KSxkZXN0cm95OmZ1bmN0aW9uKCl7dygpLHA9ITB9fTtpZighQXkocyxsKSlyZXR1cm4gZjtmLnNldE9wdGlvbnMoYykudGhlbihmdW5jdGlvbihiKXshcCYmYy5vbkZpcnN0VXBkYXRlJiZjLm9uRmlyc3RVcGRhdGUoYil9KTtmdW5jdGlvbiB5KCl7ZC5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIHY9Yi5uYW1lLGg9Yi5vcHRpb25zLGc9aD09PXZvaWQgMD97fTpoLG09Yi5lZmZlY3Q7aWYodHlwZW9mIG09PSJmdW5jdGlvbiIpe3ZhciB4PW0oe3N0YXRlOmQsbmFtZTp2LGluc3RhbmNlOmYsb3B0aW9uczpnfSksUz1mdW5jdGlvbigpe307dS5wdXNoKHh8fFMpfX0pfWZ1bmN0aW9uIHcoKXt1LmZvckVhY2goZnVuY3Rpb24oYil7cmV0dXJuIGIoKX0pLHU9W119cmV0dXJuIGZ9fXZhciB5MT1bYnksRHksd3ksYWksTnkseHksX3kseXksVHldLEdkPU95KHtkZWZhdWx0TW9kaWZpZXJzOnkxfSk7dmFyIHYxPSJ0aXBweS1ib3giLFd5PSJ0aXBweS1jb250ZW50Iix3MT0idGlwcHktYmFja2Ryb3AiLEJ5PSJ0aXBweS1hcnJvdyIsSHk9InRpcHB5LXN2Zy1hcnJvdyIsbG89e3Bhc3NpdmU6ITAsY2FwdHVyZTohMH0sank9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuYm9keX07ZnVuY3Rpb24gS2QoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciByPWVbdF07cmV0dXJuIHI/PyhBcnJheS5pc0FycmF5KG4pP25bdF06bil9cmV0dXJuIGV9ZnVuY3Rpb24gWmQoZSx0KXt2YXIgbj17fS50b1N0cmluZy5jYWxsKGUpO3JldHVybiBuLmluZGV4T2YoIltvYmplY3QiKT09PTAmJm4uaW5kZXhPZih0KyJdIik+LTF9ZnVuY3Rpb24gVnkoZSx0KXtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZS5hcHBseSh2b2lkIDAsdCk6ZX1mdW5jdGlvbiBJeShlLHQpe2lmKHQ9PT0wKXJldHVybiBlO3ZhciBuO3JldHVybiBmdW5jdGlvbihyKXtjbGVhclRpbWVvdXQobiksbj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZShyKX0sdCl9fWZ1bmN0aW9uIGIxKGUpe3JldHVybiBlLnNwbGl0KC9ccysvKS5maWx0ZXIoQm9vbGVhbil9ZnVuY3Rpb24gbmEoZSl7cmV0dXJuW10uY29uY2F0KGUpfWZ1bmN0aW9uIFJ5KGUsdCl7ZS5pbmRleE9mKHQpPT09LTEmJmUucHVzaCh0KX1mdW5jdGlvbiBrMShlKXtyZXR1cm4gZS5maWx0ZXIoZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5pbmRleE9mKHQpPT09bn0pfWZ1bmN0aW9uIHgxKGUpe3JldHVybiBlLnNwbGl0KCItIilbMF19ZnVuY3Rpb24gdmwoZSl7cmV0dXJuW10uc2xpY2UuY2FsbChlKX1mdW5jdGlvbiBNeShlKXtyZXR1cm4gT2JqZWN0LmtleXMoZSkucmVkdWNlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGVbbl0hPT12b2lkIDAmJih0W25dPWVbbl0pLHR9LHt9KX1mdW5jdGlvbiBwaSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX1mdW5jdGlvbiB3bChlKXtyZXR1cm5bIkVsZW1lbnQiLCJGcmFnbWVudCJdLnNvbWUoZnVuY3Rpb24odCl7cmV0dXJuIFpkKGUsdCl9KX1mdW5jdGlvbiBTMShlKXtyZXR1cm4gWmQoZSwiTm9kZUxpc3QiKX1mdW5jdGlvbiBFMShlKXtyZXR1cm4gWmQoZSwiTW91c2VFdmVudCIpfWZ1bmN0aW9uIFQxKGUpe3JldHVybiEhKGUmJmUuX3RpcHB5JiZlLl90aXBweS5yZWZlcmVuY2U9PT1lKX1mdW5jdGlvbiBOMShlKXtyZXR1cm4gd2woZSk/W2VdOlMxKGUpP3ZsKGUpOkFycmF5LmlzQXJyYXkoZSk/ZTp2bChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGUpKX1mdW5jdGlvbiBZZChlLHQpe2UuZm9yRWFjaChmdW5jdGlvbihuKXtuJiYobi5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249dCsibXMiKX0pfWZ1bmN0aW9uIFB5KGUsdCl7ZS5mb3JFYWNoKGZ1bmN0aW9uKG4pe24mJm4uc2V0QXR0cmlidXRlKCJkYXRhLXN0YXRlIix0KX0pfWZ1bmN0aW9uIEQxKGUpe3ZhciB0LG49bmEoZSkscj1uWzBdO3JldHVybiByIT1udWxsJiYodD1yLm93bmVyRG9jdW1lbnQpIT1udWxsJiZ0LmJvZHk/ci5vd25lckRvY3VtZW50OmRvY3VtZW50fWZ1bmN0aW9uIF8xKGUsdCl7dmFyIG49dC5jbGllbnRYLHI9dC5jbGllbnRZO3JldHVybiBlLmV2ZXJ5KGZ1bmN0aW9uKG8pe3ZhciBhPW8ucG9wcGVyUmVjdCxpPW8ucG9wcGVyU3RhdGUscz1vLnByb3BzLGw9cy5pbnRlcmFjdGl2ZUJvcmRlcixjPXgxKGkucGxhY2VtZW50KSxkPWkubW9kaWZpZXJzRGF0YS5vZmZzZXQ7aWYoIWQpcmV0dXJuITA7dmFyIHU9Yz09PSJib3R0b20iP2QudG9wLnk6MCxwPWM9PT0idG9wIj9kLmJvdHRvbS55OjAsZj1jPT09InJpZ2h0Ij9kLmxlZnQueDowLHk9Yz09PSJsZWZ0Ij9kLnJpZ2h0Lng6MCx3PWEudG9wLXIrdT5sLGI9ci1hLmJvdHRvbS1wPmwsdj1hLmxlZnQtbitmPmwsaD1uLWEucmlnaHQteT5sO3JldHVybiB3fHxifHx2fHxofSl9ZnVuY3Rpb24gcWQoZSx0LG4pe3ZhciByPXQrIkV2ZW50TGlzdGVuZXIiO1sidHJhbnNpdGlvbmVuZCIsIndlYmtpdFRyYW5zaXRpb25FbmQiXS5mb3JFYWNoKGZ1bmN0aW9uKG8pe2Vbcl0obyxuKX0pfWZ1bmN0aW9uIEx5KGUsdCl7Zm9yKHZhciBuPXQ7bjspe3ZhciByO2lmKGUuY29udGFpbnMobikpcmV0dXJuITA7bj1uLmdldFJvb3ROb2RlPT1udWxsfHwocj1uLmdldFJvb3ROb2RlKCkpPT1udWxsP3ZvaWQgMDpyLmhvc3R9cmV0dXJuITF9dmFyIENuPXtpc1RvdWNoOiExfSx6eT0wO2Z1bmN0aW9uIEMxKCl7Q24uaXNUb3VjaHx8KENuLmlzVG91Y2g9ITAsd2luZG93LnBlcmZvcm1hbmNlJiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEd5KSl9ZnVuY3Rpb24gR3koKXt2YXIgZT1wZXJmb3JtYW5jZS5ub3coKTtlLXp5PDIwJiYoQ24uaXNUb3VjaD0hMSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEd5KSksenk9ZX1mdW5jdGlvbiBBMSgpe3ZhciBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoVDEoZSkpe3ZhciB0PWUuX3RpcHB5O2UuYmx1ciYmIXQuc3RhdGUuaXNWaXNpYmxlJiZlLmJsdXIoKX19ZnVuY3Rpb24gTzEoKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixDMSxsbyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLEExKX12YXIgSTE9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiBkb2N1bWVudDwidSIsUjE9STE/ISF3aW5kb3cubXNDcnlwdG86ITE7dmFyIE0xPXthbmltYXRlRmlsbDohMSxmb2xsb3dDdXJzb3I6ITEsaW5saW5lUG9zaXRpb25pbmc6ITEsc3RpY2t5OiExfSxQMT17YWxsb3dIVE1MOiExLGFuaW1hdGlvbjoiZmFkZSIsYXJyb3c6ITAsY29udGVudDoiIixpbmVydGlhOiExLG1heFdpZHRoOjM1MCxyb2xlOiJ0b29sdGlwIix0aGVtZToiIix6SW5kZXg6OTk5OX0sd249T2JqZWN0LmFzc2lnbih7YXBwZW5kVG86anksYXJpYTp7Y29udGVudDoiYXV0byIsZXhwYW5kZWQ6ImF1dG8ifSxkZWxheTowLGR1cmF0aW9uOlszMDAsMjUwXSxnZXRSZWZlcmVuY2VDbGllbnRSZWN0Om51bGwsaGlkZU9uQ2xpY2s6ITAsaWdub3JlQXR0cmlidXRlczohMSxpbnRlcmFjdGl2ZTohMSxpbnRlcmFjdGl2ZUJvcmRlcjoyLGludGVyYWN0aXZlRGVib3VuY2U6MCxtb3ZlVHJhbnNpdGlvbjoiIixvZmZzZXQ6WzAsMTBdLG9uQWZ0ZXJVcGRhdGU6ZnVuY3Rpb24oKXt9LG9uQmVmb3JlVXBkYXRlOmZ1bmN0aW9uKCl7fSxvbkNyZWF0ZTpmdW5jdGlvbigpe30sb25EZXN0cm95OmZ1bmN0aW9uKCl7fSxvbkhpZGRlbjpmdW5jdGlvbigpe30sb25IaWRlOmZ1bmN0aW9uKCl7fSxvbk1vdW50OmZ1bmN0aW9uKCl7fSxvblNob3c6ZnVuY3Rpb24oKXt9LG9uU2hvd246ZnVuY3Rpb24oKXt9LG9uVHJpZ2dlcjpmdW5jdGlvbigpe30sb25VbnRyaWdnZXI6ZnVuY3Rpb24oKXt9LG9uQ2xpY2tPdXRzaWRlOmZ1bmN0aW9uKCl7fSxwbGFjZW1lbnQ6InRvcCIscGx1Z2luczpbXSxwb3BwZXJPcHRpb25zOnt9LHJlbmRlcjpudWxsLHNob3dPbkNyZWF0ZTohMSx0b3VjaDohMCx0cmlnZ2VyOiJtb3VzZWVudGVyIGZvY3VzIix0cmlnZ2VyVGFyZ2V0Om51bGx9LE0xLFAxKSxMMT1PYmplY3Qua2V5cyh3biksejE9ZnVuY3Rpb24odCl7dmFyIG49T2JqZWN0LmtleXModCk7bi5mb3JFYWNoKGZ1bmN0aW9uKHIpe3duW3JdPXRbcl19KX07ZnVuY3Rpb24gS3koZSl7dmFyIHQ9ZS5wbHVnaW5zfHxbXSxuPXQucmVkdWNlKGZ1bmN0aW9uKHIsbyl7dmFyIGE9by5uYW1lLGk9by5kZWZhdWx0VmFsdWU7aWYoYSl7dmFyIHM7clthXT1lW2FdIT09dm9pZCAwP2VbYV06KHM9d25bYV0pIT1udWxsP3M6aX1yZXR1cm4gcn0se30pO3JldHVybiBPYmplY3QuYXNzaWduKHt9LGUsbil9ZnVuY3Rpb24gRjEoZSx0KXt2YXIgbj10P09iamVjdC5rZXlzKEt5KE9iamVjdC5hc3NpZ24oe30sd24se3BsdWdpbnM6dH0pKSk6TDEscj1uLnJlZHVjZShmdW5jdGlvbihvLGEpe3ZhciBpPShlLmdldEF0dHJpYnV0ZSgiZGF0YS10aXBweS0iK2EpfHwiIikudHJpbSgpO2lmKCFpKXJldHVybiBvO2lmKGE9PT0iY29udGVudCIpb1thXT1pO2Vsc2UgdHJ5e29bYV09SlNPTi5wYXJzZShpKX1jYXRjaHtvW2FdPWl9cmV0dXJuIG99LHt9KTtyZXR1cm4gcn1mdW5jdGlvbiBGeShlLHQpe3ZhciBuPU9iamVjdC5hc3NpZ24oe30sdCx7Y29udGVudDpWeSh0LmNvbnRlbnQsW2VdKX0sdC5pZ25vcmVBdHRyaWJ1dGVzP3t9OkYxKGUsdC5wbHVnaW5zKSk7cmV0dXJuIG4uYXJpYT1PYmplY3QuYXNzaWduKHt9LHduLmFyaWEsbi5hcmlhKSxuLmFyaWE9e2V4cGFuZGVkOm4uYXJpYS5leHBhbmRlZD09PSJhdXRvIj90LmludGVyYWN0aXZlOm4uYXJpYS5leHBhbmRlZCxjb250ZW50Om4uYXJpYS5jb250ZW50PT09ImF1dG8iP3QuaW50ZXJhY3RpdmU/bnVsbDoiZGVzY3JpYmVkYnkiOm4uYXJpYS5jb250ZW50fSxufXZhciBVMT1mdW5jdGlvbigpe3JldHVybiJpbm5lckhUTUwifTtmdW5jdGlvbiBKZChlLHQpe2VbVTEoKV09dH1mdW5jdGlvbiBVeShlKXt2YXIgdD1waSgpO3JldHVybiBlPT09ITA/dC5jbGFzc05hbWU9Qnk6KHQuY2xhc3NOYW1lPUh5LHdsKGUpP3QuYXBwZW5kQ2hpbGQoZSk6SmQodCxlKSksdH1mdW5jdGlvbiAkeShlLHQpe3dsKHQuY29udGVudCk/KEpkKGUsIiIpLGUuYXBwZW5kQ2hpbGQodC5jb250ZW50KSk6dHlwZW9mIHQuY29udGVudCE9ImZ1bmN0aW9uIiYmKHQuYWxsb3dIVE1MP0pkKGUsdC5jb250ZW50KTplLnRleHRDb250ZW50PXQuY29udGVudCl9ZnVuY3Rpb24gWGQoZSl7dmFyIHQ9ZS5maXJzdEVsZW1lbnRDaGlsZCxuPXZsKHQuY2hpbGRyZW4pO3JldHVybntib3g6dCxjb250ZW50Om4uZmluZChmdW5jdGlvbihyKXtyZXR1cm4gci5jbGFzc0xpc3QuY29udGFpbnMoV3kpfSksYXJyb3c6bi5maW5kKGZ1bmN0aW9uKHIpe3JldHVybiByLmNsYXNzTGlzdC5jb250YWlucyhCeSl8fHIuY2xhc3NMaXN0LmNvbnRhaW5zKEh5KX0pLGJhY2tkcm9wOm4uZmluZChmdW5jdGlvbihyKXtyZXR1cm4gci5jbGFzc0xpc3QuY29udGFpbnModzEpfSl9fWZ1bmN0aW9uIFl5KGUpe3ZhciB0PXBpKCksbj1waSgpO24uY2xhc3NOYW1lPXYxLG4uc2V0QXR0cmlidXRlKCJkYXRhLXN0YXRlIiwiaGlkZGVuIiksbi5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTt2YXIgcj1waSgpO3IuY2xhc3NOYW1lPVd5LHIuc2V0QXR0cmlidXRlKCJkYXRhLXN0YXRlIiwiaGlkZGVuIiksJHkocixlLnByb3BzKSx0LmFwcGVuZENoaWxkKG4pLG4uYXBwZW5kQ2hpbGQociksbyhlLnByb3BzLGUucHJvcHMpO2Z1bmN0aW9uIG8oYSxpKXt2YXIgcz1YZCh0KSxsPXMuYm94LGM9cy5jb250ZW50LGQ9cy5hcnJvdztpLnRoZW1lP2wuc2V0QXR0cmlidXRlKCJkYXRhLXRoZW1lIixpLnRoZW1lKTpsLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS10aGVtZSIpLHR5cGVvZiBpLmFuaW1hdGlvbj09InN0cmluZyI/bC5zZXRBdHRyaWJ1dGUoImRhdGEtYW5pbWF0aW9uIixpLmFuaW1hdGlvbik6bC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtYW5pbWF0aW9uIiksaS5pbmVydGlhP2wuc2V0QXR0cmlidXRlKCJkYXRhLWluZXJ0aWEiLCIiKTpsLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1pbmVydGlhIiksbC5zdHlsZS5tYXhXaWR0aD10eXBlb2YgaS5tYXhXaWR0aD09Im51bWJlciI/aS5tYXhXaWR0aCsicHgiOmkubWF4V2lkdGgsaS5yb2xlP2wuc2V0QXR0cmlidXRlKCJyb2xlIixpLnJvbGUpOmwucmVtb3ZlQXR0cmlidXRlKCJyb2xlIiksKGEuY29udGVudCE9PWkuY29udGVudHx8YS5hbGxvd0hUTUwhPT1pLmFsbG93SFRNTCkmJiR5KGMsZS5wcm9wcyksaS5hcnJvdz9kP2EuYXJyb3chPT1pLmFycm93JiYobC5yZW1vdmVDaGlsZChkKSxsLmFwcGVuZENoaWxkKFV5KGkuYXJyb3cpKSk6bC5hcHBlbmRDaGlsZChVeShpLmFycm93KSk6ZCYmbC5yZW1vdmVDaGlsZChkKX1yZXR1cm57cG9wcGVyOnQsb25VcGRhdGU6b319WXkuJCR0aXBweT0hMDt2YXIgJDE9MSx5bD1bXSxRZD1bXTtmdW5jdGlvbiBXMShlLHQpe3ZhciBuPUZ5KGUsT2JqZWN0LmFzc2lnbih7fSx3bixLeShNeSh0KSkpKSxyLG8sYSxpPSExLHM9ITEsbD0hMSxjPSExLGQsdSxwLGY9W10seT1JeShRLG4uaW50ZXJhY3RpdmVEZWJvdW5jZSksdyxiPSQxKyssdj1udWxsLGg9azEobi5wbHVnaW5zKSxnPXtpc0VuYWJsZWQ6ITAsaXNWaXNpYmxlOiExLGlzRGVzdHJveWVkOiExLGlzTW91bnRlZDohMSxpc1Nob3duOiExfSxtPXtpZDpiLHJlZmVyZW5jZTplLHBvcHBlcjpwaSgpLHBvcHBlckluc3RhbmNlOnYscHJvcHM6bixzdGF0ZTpnLHBsdWdpbnM6aCxjbGVhckRlbGF5VGltZW91dHM6UG4sc2V0UHJvcHM6dWUsc2V0Q29udGVudDpFZSxzaG93OmN0LGhpZGU6VnQsaGlkZVdpdGhJbnRlcmFjdGl2aXR5OmFuLGVuYWJsZTp4bixkaXNhYmxlOk1uLHVubW91bnQ6THIsZGVzdHJveTptb307aWYoIW4ucmVuZGVyKXJldHVybiBtO3ZhciB4PW4ucmVuZGVyKG0pLFM9eC5wb3BwZXIsXz14Lm9uVXBkYXRlO1Muc2V0QXR0cmlidXRlKCJkYXRhLXRpcHB5LXJvb3QiLCIiKSxTLmlkPSJ0aXBweS0iK20uaWQsbS5wb3BwZXI9UyxlLl90aXBweT1tLFMuX3RpcHB5PW07dmFyIEQ9aC5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIEMuZm4obSl9KSxBPWUuaGFzQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIik7cmV0dXJuIGNlKCksTigpLE8oKSxqKCJvbkNyZWF0ZSIsW21dKSxuLnNob3dPbkNyZWF0ZSYmSHQoKSxTLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLGZ1bmN0aW9uKCl7bS5wcm9wcy5pbnRlcmFjdGl2ZSYmbS5zdGF0ZS5pc1Zpc2libGUmJm0uY2xlYXJEZWxheVRpbWVvdXRzKCl9KSxTLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7bS5wcm9wcy5pbnRlcmFjdGl2ZSYmbS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoIm1vdXNlZW50ZXIiKT49MCYmTSgpLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIseSl9KSxtO2Z1bmN0aW9uIFQoKXt2YXIgQz1tLnByb3BzLnRvdWNoO3JldHVybiBBcnJheS5pc0FycmF5KEMpP0M6W0MsMF19ZnVuY3Rpb24gTCgpe3JldHVybiBUKClbMF09PT0iaG9sZCJ9ZnVuY3Rpb24geigpe3ZhciBDO3JldHVybiEhKChDPW0ucHJvcHMucmVuZGVyKSE9bnVsbCYmQy4kJHRpcHB5KX1mdW5jdGlvbiBJKCl7cmV0dXJuIHd8fGV9ZnVuY3Rpb24gTSgpe3ZhciBDPUkoKS5wYXJlbnROb2RlO3JldHVybiBDP0QxKEMpOmRvY3VtZW50fWZ1bmN0aW9uIEYoKXtyZXR1cm4gWGQoUyl9ZnVuY3Rpb24gVShDKXtyZXR1cm4gbS5zdGF0ZS5pc01vdW50ZWQmJiFtLnN0YXRlLmlzVmlzaWJsZXx8Q24uaXNUb3VjaHx8ZCYmZC50eXBlPT09ImZvY3VzIj8wOktkKG0ucHJvcHMuZGVsYXksQz8wOjEsd24uZGVsYXkpfWZ1bmN0aW9uIE8oQyl7Qz09PXZvaWQgMCYmKEM9ITEpLFMuc3R5bGUucG9pbnRlckV2ZW50cz1tLnByb3BzLmludGVyYWN0aXZlJiYhQz8iIjoibm9uZSIsUy5zdHlsZS56SW5kZXg9IiIrbS5wcm9wcy56SW5kZXh9ZnVuY3Rpb24gaihDLFksdGUpe2lmKHRlPT09dm9pZCAwJiYodGU9ITApLEQuZm9yRWFjaChmdW5jdGlvbihtZSl7bWVbQ10mJm1lW0NdLmFwcGx5KG1lLFkpfSksdGUpe3ZhciBrZTsoa2U9bS5wcm9wcylbQ10uYXBwbHkoa2UsWSl9fWZ1bmN0aW9uIFgoKXt2YXIgQz1tLnByb3BzLmFyaWE7aWYoQy5jb250ZW50KXt2YXIgWT0iYXJpYS0iK0MuY29udGVudCx0ZT1TLmlkLGtlPW5hKG0ucHJvcHMudHJpZ2dlclRhcmdldHx8ZSk7a2UuZm9yRWFjaChmdW5jdGlvbihtZSl7dmFyIGh0PW1lLmdldEF0dHJpYnV0ZShZKTtpZihtLnN0YXRlLmlzVmlzaWJsZSltZS5zZXRBdHRyaWJ1dGUoWSxodD9odCsiICIrdGU6dGUpO2Vsc2V7dmFyIEd0PWh0JiZodC5yZXBsYWNlKHRlLCIiKS50cmltKCk7R3Q/bWUuc2V0QXR0cmlidXRlKFksR3QpOm1lLnJlbW92ZUF0dHJpYnV0ZShZKX19KX19ZnVuY3Rpb24gTigpe2lmKCEoQXx8IW0ucHJvcHMuYXJpYS5leHBhbmRlZCkpe3ZhciBDPW5hKG0ucHJvcHMudHJpZ2dlclRhcmdldHx8ZSk7Qy5mb3JFYWNoKGZ1bmN0aW9uKFkpe20ucHJvcHMuaW50ZXJhY3RpdmU/WS5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLG0uc3RhdGUuaXNWaXNpYmxlJiZZPT09SSgpPyJ0cnVlIjoiZmFsc2UiKTpZLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpfSl9fWZ1bmN0aW9uIGsoKXtNKCkucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix5KSx5bD15bC5maWx0ZXIoZnVuY3Rpb24oQyl7cmV0dXJuIEMhPT15fSl9ZnVuY3Rpb24gUihDKXtpZighKENuLmlzVG91Y2gmJihsfHxDLnR5cGU9PT0ibW91c2Vkb3duIikpKXt2YXIgWT1DLmNvbXBvc2VkUGF0aCYmQy5jb21wb3NlZFBhdGgoKVswXXx8Qy50YXJnZXQ7aWYoIShtLnByb3BzLmludGVyYWN0aXZlJiZMeShTLFkpKSl7aWYobmEobS5wcm9wcy50cmlnZ2VyVGFyZ2V0fHxlKS5zb21lKGZ1bmN0aW9uKHRlKXtyZXR1cm4gTHkodGUsWSl9KSl7aWYoQ24uaXNUb3VjaHx8bS5zdGF0ZS5pc1Zpc2libGUmJm0ucHJvcHMudHJpZ2dlci5pbmRleE9mKCJjbGljayIpPj0wKXJldHVybn1lbHNlIGooIm9uQ2xpY2tPdXRzaWRlIixbbSxDXSk7bS5wcm9wcy5oaWRlT25DbGljaz09PSEwJiYobS5jbGVhckRlbGF5VGltZW91dHMoKSxtLmhpZGUoKSxzPSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzPSExfSksbS5zdGF0ZS5pc01vdW50ZWR8fEooKSl9fX1mdW5jdGlvbiBCKCl7bD0hMH1mdW5jdGlvbiBIKCl7bD0hMX1mdW5jdGlvbiBxKCl7dmFyIEM9TSgpO0MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixSLCEwKSxDLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixSLGxvKSxDLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEgsbG8pLEMuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixCLGxvKX1mdW5jdGlvbiBKKCl7dmFyIEM9TSgpO0MucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixSLCEwKSxDLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixSLGxvKSxDLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEgsbG8pLEMucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixCLGxvKX1mdW5jdGlvbiBLKEMsWSl7YWUoQyxmdW5jdGlvbigpeyFtLnN0YXRlLmlzVmlzaWJsZSYmUy5wYXJlbnROb2RlJiZTLnBhcmVudE5vZGUuY29udGFpbnMoUykmJlkoKX0pfWZ1bmN0aW9uIFooQyxZKXthZShDLFkpfWZ1bmN0aW9uIGFlKEMsWSl7dmFyIHRlPUYoKS5ib3g7ZnVuY3Rpb24ga2UobWUpe21lLnRhcmdldD09PXRlJiYocWQodGUsInJlbW92ZSIsa2UpLFkoKSl9aWYoQz09PTApcmV0dXJuIFkoKTtxZCh0ZSwicmVtb3ZlIix1KSxxZCh0ZSwiYWRkIixrZSksdT1rZX1mdW5jdGlvbiBsZShDLFksdGUpe3RlPT09dm9pZCAwJiYodGU9ITEpO3ZhciBrZT1uYShtLnByb3BzLnRyaWdnZXJUYXJnZXR8fGUpO2tlLmZvckVhY2goZnVuY3Rpb24obWUpe21lLmFkZEV2ZW50TGlzdGVuZXIoQyxZLHRlKSxmLnB1c2goe25vZGU6bWUsZXZlbnRUeXBlOkMsaGFuZGxlcjpZLG9wdGlvbnM6dGV9KX0pfWZ1bmN0aW9uIGNlKCl7TCgpJiYobGUoInRvdWNoc3RhcnQiLGllLHtwYXNzaXZlOiEwfSksbGUoInRvdWNoZW5kIixnZSx7cGFzc2l2ZTohMH0pKSxiMShtLnByb3BzLnRyaWdnZXIpLmZvckVhY2goZnVuY3Rpb24oQyl7aWYoQyE9PSJtYW51YWwiKXN3aXRjaChsZShDLGllKSxDKXtjYXNlIm1vdXNlZW50ZXIiOmxlKCJtb3VzZWxlYXZlIixnZSk7YnJlYWs7Y2FzZSJmb2N1cyI6bGUoUjE/ImZvY3Vzb3V0IjoiYmx1ciIsX2UpO2JyZWFrO2Nhc2UiZm9jdXNpbiI6bGUoImZvY3Vzb3V0IixfZSk7YnJlYWt9fSl9ZnVuY3Rpb24gZWUoKXtmLmZvckVhY2goZnVuY3Rpb24oQyl7dmFyIFk9Qy5ub2RlLHRlPUMuZXZlbnRUeXBlLGtlPUMuaGFuZGxlcixtZT1DLm9wdGlvbnM7WS5yZW1vdmVFdmVudExpc3RlbmVyKHRlLGtlLG1lKX0pLGY9W119ZnVuY3Rpb24gaWUoQyl7dmFyIFksdGU9ITE7aWYoISghbS5zdGF0ZS5pc0VuYWJsZWR8fEJlKEMpfHxzKSl7dmFyIGtlPSgoWT1kKT09bnVsbD92b2lkIDA6WS50eXBlKT09PSJmb2N1cyI7ZD1DLHc9Qy5jdXJyZW50VGFyZ2V0LE4oKSwhbS5zdGF0ZS5pc1Zpc2libGUmJkUxKEMpJiZ5bC5mb3JFYWNoKGZ1bmN0aW9uKG1lKXtyZXR1cm4gbWUoQyl9KSxDLnR5cGU9PT0iY2xpY2siJiYobS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoIm1vdXNlZW50ZXIiKTwwfHxpKSYmbS5wcm9wcy5oaWRlT25DbGljayE9PSExJiZtLnN0YXRlLmlzVmlzaWJsZT90ZT0hMDpIdChDKSxDLnR5cGU9PT0iY2xpY2siJiYoaT0hdGUpLHRlJiYha2UmJmp0KEMpfX1mdW5jdGlvbiBRKEMpe3ZhciBZPUMudGFyZ2V0LHRlPUkoKS5jb250YWlucyhZKXx8Uy5jb250YWlucyhZKTtpZighKEMudHlwZT09PSJtb3VzZW1vdmUiJiZ0ZSkpe3ZhciBrZT1FdCgpLmNvbmNhdChTKS5tYXAoZnVuY3Rpb24obWUpe3ZhciBodCxHdD1tZS5fdGlwcHksaG89KGh0PUd0LnBvcHBlckluc3RhbmNlKT09bnVsbD92b2lkIDA6aHQuc3RhdGU7cmV0dXJuIGhvP3twb3BwZXJSZWN0Om1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHBvcHBlclN0YXRlOmhvLHByb3BzOm59Om51bGx9KS5maWx0ZXIoQm9vbGVhbik7XzEoa2UsQykmJihrKCksanQoQykpfX1mdW5jdGlvbiBnZShDKXt2YXIgWT1CZShDKXx8bS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoImNsaWNrIik+PTAmJmk7aWYoIVkpe2lmKG0ucHJvcHMuaW50ZXJhY3RpdmUpe20uaGlkZVdpdGhJbnRlcmFjdGl2aXR5KEMpO3JldHVybn1qdChDKX19ZnVuY3Rpb24gX2UoQyl7bS5wcm9wcy50cmlnZ2VyLmluZGV4T2YoImZvY3VzaW4iKTwwJiZDLnRhcmdldCE9PUkoKXx8bS5wcm9wcy5pbnRlcmFjdGl2ZSYmQy5yZWxhdGVkVGFyZ2V0JiZTLmNvbnRhaW5zKEMucmVsYXRlZFRhcmdldCl8fGp0KEMpfWZ1bmN0aW9uIEJlKEMpe3JldHVybiBDbi5pc1RvdWNoP0woKSE9PUMudHlwZS5pbmRleE9mKCJ0b3VjaCIpPj0wOiExfWZ1bmN0aW9uIFhlKCl7U3QoKTt2YXIgQz1tLnByb3BzLFk9Qy5wb3BwZXJPcHRpb25zLHRlPUMucGxhY2VtZW50LGtlPUMub2Zmc2V0LG1lPUMuZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdCxodD1DLm1vdmVUcmFuc2l0aW9uLEd0PXooKT9YZChTKS5hcnJvdzpudWxsLGhvPW1lP3tnZXRCb3VuZGluZ0NsaWVudFJlY3Q6bWUsY29udGV4dEVsZW1lbnQ6bWUuY29udGV4dEVsZW1lbnR8fEkoKX06ZSx1Zj17bmFtZToiJCR0aXBweSIsZW5hYmxlZDohMCxwaGFzZToiYmVmb3JlV3JpdGUiLHJlcXVpcmVzOlsiY29tcHV0ZVN0eWxlcyJdLGZuOmZ1bmN0aW9uKE1pKXt2YXIgZ289TWkuc3RhdGU7aWYoeigpKXt2YXIgdGI9RigpLHRjPXRiLmJveDtbInBsYWNlbWVudCIsInJlZmVyZW5jZS1oaWRkZW4iLCJlc2NhcGVkIl0uZm9yRWFjaChmdW5jdGlvbihQaSl7UGk9PT0icGxhY2VtZW50Ij90Yy5zZXRBdHRyaWJ1dGUoImRhdGEtcGxhY2VtZW50Iixnby5wbGFjZW1lbnQpOmdvLmF0dHJpYnV0ZXMucG9wcGVyWyJkYXRhLXBvcHBlci0iK1BpXT90Yy5zZXRBdHRyaWJ1dGUoImRhdGEtIitQaSwiIik6dGMucmVtb3ZlQXR0cmlidXRlKCJkYXRhLSIrUGkpfSksZ28uYXR0cmlidXRlcy5wb3BwZXI9e319fX0senI9W3tuYW1lOiJvZmZzZXQiLG9wdGlvbnM6e29mZnNldDprZX19LHtuYW1lOiJwcmV2ZW50T3ZlcmZsb3ciLG9wdGlvbnM6e3BhZGRpbmc6e3RvcDoyLGJvdHRvbToyLGxlZnQ6NSxyaWdodDo1fX19LHtuYW1lOiJmbGlwIixvcHRpb25zOntwYWRkaW5nOjV9fSx7bmFtZToiY29tcHV0ZVN0eWxlcyIsb3B0aW9uczp7YWRhcHRpdmU6IWh0fX0sdWZdO3ooKSYmR3QmJnpyLnB1c2goe25hbWU6ImFycm93IixvcHRpb25zOntlbGVtZW50Okd0LHBhZGRpbmc6M319KSx6ci5wdXNoLmFwcGx5KHpyLFk/Lm1vZGlmaWVyc3x8W10pLG0ucG9wcGVySW5zdGFuY2U9R2QoaG8sUyxPYmplY3QuYXNzaWduKHt9LFkse3BsYWNlbWVudDp0ZSxvbkZpcnN0VXBkYXRlOnAsbW9kaWZpZXJzOnpyfSkpfWZ1bmN0aW9uIFN0KCl7bS5wb3BwZXJJbnN0YW5jZSYmKG0ucG9wcGVySW5zdGFuY2UuZGVzdHJveSgpLG0ucG9wcGVySW5zdGFuY2U9bnVsbCl9ZnVuY3Rpb24gVWUoKXt2YXIgQz1tLnByb3BzLmFwcGVuZFRvLFksdGU9SSgpO20ucHJvcHMuaW50ZXJhY3RpdmUmJkM9PT1qeXx8Qz09PSJwYXJlbnQiP1k9dGUucGFyZW50Tm9kZTpZPVZ5KEMsW3RlXSksWS5jb250YWlucyhTKXx8WS5hcHBlbmRDaGlsZChTKSxtLnN0YXRlLmlzTW91bnRlZD0hMCxYZSgpfWZ1bmN0aW9uIEV0KCl7cmV0dXJuIHZsKFMucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdGlwcHktcm9vdF0iKSl9ZnVuY3Rpb24gSHQoQyl7bS5jbGVhckRlbGF5VGltZW91dHMoKSxDJiZqKCJvblRyaWdnZXIiLFttLENdKSxxKCk7dmFyIFk9VSghMCksdGU9VCgpLGtlPXRlWzBdLG1lPXRlWzFdO0NuLmlzVG91Y2gmJmtlPT09ImhvbGQiJiZtZSYmKFk9bWUpLFk/cj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bS5zaG93KCl9LFkpOm0uc2hvdygpfWZ1bmN0aW9uIGp0KEMpe2lmKG0uY2xlYXJEZWxheVRpbWVvdXRzKCksaigib25VbnRyaWdnZXIiLFttLENdKSwhbS5zdGF0ZS5pc1Zpc2libGUpe0ooKTtyZXR1cm59aWYoIShtLnByb3BzLnRyaWdnZXIuaW5kZXhPZigibW91c2VlbnRlciIpPj0wJiZtLnByb3BzLnRyaWdnZXIuaW5kZXhPZigiY2xpY2siKT49MCYmWyJtb3VzZWxlYXZlIiwibW91c2Vtb3ZlIl0uaW5kZXhPZihDLnR5cGUpPj0wJiZpKSl7dmFyIFk9VSghMSk7WT9vPXNldFRpbWVvdXQoZnVuY3Rpb24oKXttLnN0YXRlLmlzVmlzaWJsZSYmbS5oaWRlKCl9LFkpOmE9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7bS5oaWRlKCl9KX19ZnVuY3Rpb24geG4oKXttLnN0YXRlLmlzRW5hYmxlZD0hMH1mdW5jdGlvbiBNbigpe20uaGlkZSgpLG0uc3RhdGUuaXNFbmFibGVkPSExfWZ1bmN0aW9uIFBuKCl7Y2xlYXJUaW1lb3V0KHIpLGNsZWFyVGltZW91dChvKSxjYW5jZWxBbmltYXRpb25GcmFtZShhKX1mdW5jdGlvbiB1ZShDKXtpZighbS5zdGF0ZS5pc0Rlc3Ryb3llZCl7aigib25CZWZvcmVVcGRhdGUiLFttLENdKSxlZSgpO3ZhciBZPW0ucHJvcHMsdGU9RnkoZSxPYmplY3QuYXNzaWduKHt9LFksTXkoQykse2lnbm9yZUF0dHJpYnV0ZXM6ITB9KSk7bS5wcm9wcz10ZSxjZSgpLFkuaW50ZXJhY3RpdmVEZWJvdW5jZSE9PXRlLmludGVyYWN0aXZlRGVib3VuY2UmJihrKCkseT1JeShRLHRlLmludGVyYWN0aXZlRGVib3VuY2UpKSxZLnRyaWdnZXJUYXJnZXQmJiF0ZS50cmlnZ2VyVGFyZ2V0P25hKFkudHJpZ2dlclRhcmdldCkuZm9yRWFjaChmdW5jdGlvbihrZSl7a2UucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIil9KTp0ZS50cmlnZ2VyVGFyZ2V0JiZlLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpLE4oKSxPKCksXyYmXyhZLHRlKSxtLnBvcHBlckluc3RhbmNlJiYoWGUoKSxFdCgpLmZvckVhY2goZnVuY3Rpb24oa2Upe3JlcXVlc3RBbmltYXRpb25GcmFtZShrZS5fdGlwcHkucG9wcGVySW5zdGFuY2UuZm9yY2VVcGRhdGUpfSkpLGooIm9uQWZ0ZXJVcGRhdGUiLFttLENdKX19ZnVuY3Rpb24gRWUoQyl7bS5zZXRQcm9wcyh7Y29udGVudDpDfSl9ZnVuY3Rpb24gY3QoKXt2YXIgQz1tLnN0YXRlLmlzVmlzaWJsZSxZPW0uc3RhdGUuaXNEZXN0cm95ZWQsdGU9IW0uc3RhdGUuaXNFbmFibGVkLGtlPUNuLmlzVG91Y2gmJiFtLnByb3BzLnRvdWNoLG1lPUtkKG0ucHJvcHMuZHVyYXRpb24sMCx3bi5kdXJhdGlvbik7aWYoIShDfHxZfHx0ZXx8a2UpJiYhSSgpLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSYmKGooIm9uU2hvdyIsW21dLCExKSxtLnByb3BzLm9uU2hvdyhtKSE9PSExKSl7aWYobS5zdGF0ZS5pc1Zpc2libGU9ITAseigpJiYoUy5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIiksTygpLHEoKSxtLnN0YXRlLmlzTW91bnRlZHx8KFMuc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIpLHooKSl7dmFyIGh0PUYoKSxHdD1odC5ib3gsaG89aHQuY29udGVudDtZZChbR3QsaG9dLDApfXA9ZnVuY3Rpb24oKXt2YXIgenI7aWYoISghbS5zdGF0ZS5pc1Zpc2libGV8fGMpKXtpZihjPSEwLFMub2Zmc2V0SGVpZ2h0LFMuc3R5bGUudHJhbnNpdGlvbj1tLnByb3BzLm1vdmVUcmFuc2l0aW9uLHooKSYmbS5wcm9wcy5hbmltYXRpb24pe3ZhciBlYz1GKCksTWk9ZWMuYm94LGdvPWVjLmNvbnRlbnQ7WWQoW01pLGdvXSxtZSksUHkoW01pLGdvXSwidmlzaWJsZSIpfVgoKSxOKCksUnkoUWQsbSksKHpyPW0ucG9wcGVySW5zdGFuY2UpPT1udWxsfHx6ci5mb3JjZVVwZGF0ZSgpLGooIm9uTW91bnQiLFttXSksbS5wcm9wcy5hbmltYXRpb24mJnooKSYmWihtZSxmdW5jdGlvbigpe20uc3RhdGUuaXNTaG93bj0hMCxqKCJvblNob3duIixbbV0pfSl9fSxVZSgpfX1mdW5jdGlvbiBWdCgpe3ZhciBDPSFtLnN0YXRlLmlzVmlzaWJsZSxZPW0uc3RhdGUuaXNEZXN0cm95ZWQsdGU9IW0uc3RhdGUuaXNFbmFibGVkLGtlPUtkKG0ucHJvcHMuZHVyYXRpb24sMSx3bi5kdXJhdGlvbik7aWYoIShDfHxZfHx0ZSkmJihqKCJvbkhpZGUiLFttXSwhMSksbS5wcm9wcy5vbkhpZGUobSkhPT0hMSkpe2lmKG0uc3RhdGUuaXNWaXNpYmxlPSExLG0uc3RhdGUuaXNTaG93bj0hMSxjPSExLGk9ITEseigpJiYoUy5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iKSxrKCksSigpLE8oITApLHooKSl7dmFyIG1lPUYoKSxodD1tZS5ib3gsR3Q9bWUuY29udGVudDttLnByb3BzLmFuaW1hdGlvbiYmKFlkKFtodCxHdF0sa2UpLFB5KFtodCxHdF0sImhpZGRlbiIpKX1YKCksTigpLG0ucHJvcHMuYW5pbWF0aW9uP3ooKSYmSyhrZSxtLnVubW91bnQpOm0udW5tb3VudCgpfX1mdW5jdGlvbiBhbihDKXtNKCkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix5KSxSeSh5bCx5KSx5KEMpfWZ1bmN0aW9uIExyKCl7bS5zdGF0ZS5pc1Zpc2libGUmJm0uaGlkZSgpLG0uc3RhdGUuaXNNb3VudGVkJiYoU3QoKSxFdCgpLmZvckVhY2goZnVuY3Rpb24oQyl7Qy5fdGlwcHkudW5tb3VudCgpfSksUy5wYXJlbnROb2RlJiZTLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoUyksUWQ9UWQuZmlsdGVyKGZ1bmN0aW9uKEMpe3JldHVybiBDIT09bX0pLG0uc3RhdGUuaXNNb3VudGVkPSExLGooIm9uSGlkZGVuIixbbV0pKX1mdW5jdGlvbiBtbygpe20uc3RhdGUuaXNEZXN0cm95ZWR8fChtLmNsZWFyRGVsYXlUaW1lb3V0cygpLG0udW5tb3VudCgpLGVlKCksZGVsZXRlIGUuX3RpcHB5LG0uc3RhdGUuaXNEZXN0cm95ZWQ9ITAsaigib25EZXN0cm95IixbbV0pKX19ZnVuY3Rpb24gZmkoZSx0KXt0PT09dm9pZCAwJiYodD17fSk7dmFyIG49d24ucGx1Z2lucy5jb25jYXQodC5wbHVnaW5zfHxbXSk7TzEoKTt2YXIgcj1PYmplY3QuYXNzaWduKHt9LHQse3BsdWdpbnM6bn0pLG89TjEoZSk7aWYoMCl2YXIgYSxpO3ZhciBzPW8ucmVkdWNlKGZ1bmN0aW9uKGwsYyl7dmFyIGQ9YyYmVzEoYyxyKTtyZXR1cm4gZCYmbC5wdXNoKGQpLGx9LFtdKTtyZXR1cm4gd2woZSk/c1swXTpzfWZpLmRlZmF1bHRQcm9wcz13bjtmaS5zZXREZWZhdWx0UHJvcHM9ejE7ZmkuY3VycmVudElucHV0PUNuO3ZhciBjUj1PYmplY3QuYXNzaWduKHt9LGFpLHtlZmZlY3Q6ZnVuY3Rpb24odCl7dmFyIG49dC5zdGF0ZSxyPXtwb3BwZXI6e3Bvc2l0aW9uOm4ub3B0aW9ucy5zdHJhdGVneSxsZWZ0OiIwIix0b3A6IjAiLG1hcmdpbjoiMCJ9LGFycm93Ontwb3NpdGlvbjoiYWJzb2x1dGUifSxyZWZlcmVuY2U6e319O09iamVjdC5hc3NpZ24obi5lbGVtZW50cy5wb3BwZXIuc3R5bGUsci5wb3BwZXIpLG4uc3R5bGVzPXIsbi5lbGVtZW50cy5hcnJvdyYmT2JqZWN0LmFzc2lnbihuLmVsZW1lbnRzLmFycm93LnN0eWxlLHIuYXJyb3cpfX0pO2ZpLnNldERlZmF1bHRQcm9wcyh7cmVuZGVyOll5fSk7dmFyIG1pPWZpO3ZhciBJdD1wZShkZSgpLDEpO3ZhciBxeT17dGhlbWU6ImRhc2hib2FyZCIsZHVyYXRpb246WzEyMCw4MF0sYXJyb3c6ITAsb2Zmc2V0OlswLDhdfTtmdW5jdGlvbiBoaSh7Y29udGVudDplLHBsYWNlbWVudDp0LGludGVyYWN0aXZlOm4sY2hpbGRyZW46ciwuLi5vfSl7bGV0IGE9KDAsSXQudXNlUmVmKShudWxsKSxpPSgwLEl0LnVzZVJlZikobnVsbCk7cmV0dXJuKDAsSXQudXNlRWZmZWN0KSgoKT0+e2lmKGEuY3VycmVudClyZXR1cm4gaS5jdXJyZW50PW1pKGEuY3VycmVudCx7Li4ucXksY29udGVudDplfHwiIixwbGFjZW1lbnQ6dHx8InRvcCIsaW50ZXJhY3RpdmU6bnx8ITEsYWxsb3dIVE1MOiEwLC4uLm99KSwoKT0+e2kuY3VycmVudD8uZGVzdHJveSgpLGkuY3VycmVudD1udWxsfX0sW10pLCgwLEl0LnVzZUVmZmVjdCkoKCk9PntpLmN1cnJlbnQmJmUhPW51bGwmJmkuY3VycmVudC5zZXRDb250ZW50KGUpfSxbZV0pLCgwLEl0LmNyZWF0ZUVsZW1lbnQpKCJzcGFuIix7cmVmOmEsc3R5bGU6e2Rpc3BsYXk6ImlubGluZSJ9fSxyKX1mdW5jdGlvbiBnaShlPXt9KXtsZXQgdD0oMCxJdC51c2VSZWYpKG51bGwpLG49KDAsSXQudXNlUmVmKSh7d2lkdGg6MCxoZWlnaHQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH0pLHI9KDAsSXQudXNlUmVmKShudWxsKSxvPSgwLEl0LnVzZVJlZikoZS5oaWRlRGVsYXl8fDMwMCksYT0oMCxJdC51c2VSZWYpKG51bGwpO2Z1bmN0aW9uIGkoKXtyLmN1cnJlbnQmJihjbGVhclRpbWVvdXQoci5jdXJyZW50KSxyLmN1cnJlbnQ9bnVsbCl9ZnVuY3Rpb24gcyhkLHUpe2koKSx1IT09dm9pZCAwJiYoYS5jdXJyZW50PXUpLHIuY3VycmVudD1zZXRUaW1lb3V0KCgpPT57ci5jdXJyZW50PW51bGwsdC5jdXJyZW50Py5oaWRlKCksYS5jdXJyZW50JiZhLmN1cnJlbnQoKX0sZD8/by5jdXJyZW50KX0oMCxJdC51c2VFZmZlY3QpKCgpPT57dC5jdXJyZW50PW1pKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHsuLi5xeSxnZXRSZWZlcmVuY2VDbGllbnRSZWN0OigpPT5uLmN1cnJlbnQsdHJpZ2dlcjoibWFudWFsIixoaWRlT25DbGljazohMSxhbGxvd0hUTUw6ITAsaW50ZXJhY3RpdmU6ISFlLmludGVyYWN0aXZlLHBsYWNlbWVudDplLnBsYWNlbWVudHx8InRvcCIsYXBwZW5kVG86KCk9PmRvY3VtZW50LmJvZHksLi4uZX0pO2xldCBkLHU7aWYoZS5pbnRlcmFjdGl2ZSl7bGV0IHA9dC5jdXJyZW50LnBvcHBlcjtkPSgpPT5pKCksdT0oKT0+cygpLHAuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsZCkscC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix1KX1yZXR1cm4oKT0+e2lmKGUuaW50ZXJhY3RpdmUmJnQuY3VycmVudCl7bGV0IHA9dC5jdXJyZW50LnBvcHBlcjtkJiZwLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLGQpLHUmJnAucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdSl9aSgpLHQuY3VycmVudD8uZGVzdHJveSgpLHQuY3VycmVudD1udWxsfX0sW10pO2Z1bmN0aW9uIGwoZCx1LHAsZil7aSgpO2xldCB5PXQuY3VycmVudDtpZigheSlyZXR1cm47bi5jdXJyZW50PXt3aWR0aDowLGhlaWdodDowLHRvcDpwLHJpZ2h0OnUsYm90dG9tOnAsbGVmdDp1fSx5LnNldENvbnRlbnQoZCk7bGV0IHc9Znx8e30sYj13LnBsYWNlbWVudHx8eS5wcm9wcy5wbGFjZW1lbnQ7YiE9PXkucHJvcHMucGxhY2VtZW50JiZ5LnNldFByb3BzKHtwbGFjZW1lbnQ6Yn0pO2xldCB2PXkucG9wcGVyLmZpcnN0RWxlbWVudENoaWxkO3YmJnYuY2xhc3NMaXN0LnRvZ2dsZSgiYmVsb3ctY2hhcnQiLCEhdy5iZWxvd0NoYXJ0KSx5LnN0YXRlLmlzVmlzaWJsZT95LnBvcHBlckluc3RhbmNlPy51cGRhdGUoKTp5LnNob3coKX1mdW5jdGlvbiBjKCl7aSgpLHQuY3VycmVudD8uaGlkZSgpfXJldHVybntzaG93OmwsaGlkZTpjLHNjaGVkdWxlSGlkZTpzLGNhbmNlbFNjaGVkdWxlZEhpZGU6aX19dmFyIENyPXBlKGRlKCkpO3ZhciB5aT17c2V0dGluZ3M6e30sY29udGV4dDp7fX07ZnVuY3Rpb24gUXkoZSl7ZS5zZXR0aW5ncyYmKHlpLnNldHRpbmdzPWUuc2V0dGluZ3MpLGUuY29udGV4dCYmKHlpLmNvbnRleHQ9ZS5jb250ZXh0KX1mdW5jdGlvbiBQZSgpe3JldHVybiB5aS5zZXR0aW5nc31mdW5jdGlvbiB2aSgpe3JldHVybiB5aS5jb250ZXh0fWZ1bmN0aW9uIGJsKGUsdCl7eWkuc2V0dGluZ3NbZV09dH1mdW5jdGlvbiBWZShlLHt0aHJvd09uSW52YWxpZDp0PSEwfT17fSl7bGV0IG49KCk9PntpZighdClyZXR1cm4gbnVsbDt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGRhdGUgaW5wdXQ6ICR7U3RyaW5nKGUpfWApfTtpZihlPT1udWxsfHxlPT09IiIpcmV0dXJuIG4oKTtpZihlIGluc3RhbmNlb2YgRGF0ZSl7bGV0IG89bmV3IERhdGUoZSk7cmV0dXJuIE51bWJlci5pc05hTihvLmdldFRpbWUoKSk/bigpOm99aWYodHlwZW9mIGU9PSJudW1iZXIiKXtpZighTnVtYmVyLmlzRmluaXRlKGUpKXJldHVybiBuKCk7bGV0IG89TWF0aC5hYnMoZSk8MWUxMD9lKjFlMzplLGE9bmV3IERhdGUobyk7cmV0dXJuIE51bWJlci5pc05hTihhLmdldFRpbWUoKSk/bigpOmF9aWYodHlwZW9mIGU9PSJzdHJpbmciKXtsZXQgbz1lLnRyaW0oKTtpZighbylyZXR1cm4gbigpO2lmKC9eXGR7NH0tXGR7Mn0tXGR7Mn0kLy50ZXN0KGUpKXtsZXRbcyxsLGNdPWUuc3BsaXQoIi0iKS5tYXAoTnVtYmVyKTtyZXR1cm4gbmV3IERhdGUocyxsLTEsYyl9bGV0IGE9TnVtYmVyKG8pO2lmKCFOdW1iZXIuaXNOYU4oYSkpcmV0dXJuIFZlKGEse3Rocm93T25JbnZhbGlkOnR9KTtsZXQgaT1uZXcgRGF0ZShvKTtyZXR1cm4gTnVtYmVyLmlzTmFOKGkuZ2V0VGltZSgpKT9uKCk6aX1sZXQgcj1uZXcgRGF0ZShlKTtyZXR1cm4gTnVtYmVyLmlzTmFOKHIuZ2V0VGltZSgpKT9uKCk6cn1mdW5jdGlvbiBxbihlKXtsZXQgdD1WZShlKSxuPXQuZ2V0RnVsbFllYXIoKSxyPVN0cmluZyh0LmdldE1vbnRoKCkrMSkucGFkU3RhcnQoMiwiMCIpLG89U3RyaW5nKHQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCIwIik7cmV0dXJuYCR7bn0tJHtyfS0ke299YH1mdW5jdGlvbiBPZShlKXtyZXR1cm4gcW4oZSl9ZnVuY3Rpb24gcm4oZSx0PTEpe2xldCBuPVZlKGUpLG89KG4uZ2V0RGF5KCktdCs3KSU3LGE9bmV3IERhdGUobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKS1vKTtyZXR1cm4gYS5zZXRIb3VycygwLDAsMCwwKSxhfWZ1bmN0aW9uIEp5KGUsdD0xKXtsZXQgbj1ybihlLHQpLHI9bmV3IERhdGUobik7cmV0dXJuIHIuc2V0RGF0ZShyLmdldERhdGUoKSs2KSxyLnNldEhvdXJzKDIzLDU5LDU5LDk5OSkscn1mdW5jdGlvbiBYeShlLHQ9MSl7bGV0IG49cm4oZSx0KSxyPVtdO2ZvcihsZXQgbz0wO288NztvKyspe2xldCBhPW5ldyBEYXRlKG4uZ2V0RnVsbFllYXIoKSxuLmdldE1vbnRoKCksbi5nZXREYXRlKCkrbyksaT1uZXcgRGF0ZShuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpK28rMSk7ci5wdXNoKHtmcm9tOk1hdGguZmxvb3IoYS5nZXRUaW1lKCkvMWUzKSx0bzpNYXRoLmZsb29yKGkuZ2V0VGltZSgpLzFlMyksZGF0ZUtleTpPZShhKX0pfXJldHVybntib3VuZGFyaWVzOnIsd2Vla1N0YXJ0S2V5Ok9lKG4pfX1mdW5jdGlvbiBaeShlLHQ9MSl7bGV0IG49cm4oZSx0KTtyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOjd9LChyLG8pPT57bGV0IGE9bmV3IERhdGUobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKStvKTtyZXR1cm57ZGF5OmEudG9Mb2NhbGVEYXRlU3RyaW5nKHZvaWQgMCx7d2Vla2RheToic2hvcnQifSksZGF0ZTphLnRvSVNPU3RyaW5nKCksZGF0ZUtleTpPZShhKX19KX1mdW5jdGlvbiBrbChlKXtyZXR1cm4gZT09PSJzdW5kYXkiPzA6MX1mdW5jdGlvbiByYShlLHQpe3JldHVybiB0PT09IjI0aCI/YCR7U3RyaW5nKGUpLnBhZFN0YXJ0KDIsIjAiKX06MDBgOmU9PT0wPyIxMmFtIjplPDEyP2Ake2V9YW1gOmU9PT0xMj8iMTJwbSI6YCR7ZS0xMn1wbWB9ZnVuY3Rpb24gZXYoZSl7cmV0dXJuIFZlKGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse3dlZWtkYXk6InNob3J0Iixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyJ9KX1hc3luYyBmdW5jdGlvbiB0dihlLHQpe2xldCBuPW5ldyBEYXRlLHI9cm4obiksbz1KeShuKSxhPVBlKClbRy5UQVNLX0RPTUFJTlNdLGk9e307dHJ5e2k9YT9KU09OLnBhcnNlKGEpOnt9fWNhdGNoe2k9e319aS5zZWxlY3RlZERvbWFpblV1aWQ9dCxhd2FpdCBlLnNldFNldHRpbmcoRy5UQVNLX0RPTUFJTlMsSlNPTi5zdHJpbmdpZnkoaSkpO2xldCBzPWF3YWl0IEgxKGUsdCk7cmV0dXJue3Rhc2tzOnMsdG9kYXlUYXNrczpqMShzLG4pLGNvbXBsZXRlZFRoaXNXZWVrOmx2KHMscixvKSx3ZWVrbHlWaWN0b3J5VmFsdWU6VjEocyxyLG8pLGRhaWx5VmljdG9yeVZhbHVlczpHMShzLHIpLGFjdGl2ZVRhc2tEb21haW46dH19YXN5bmMgZnVuY3Rpb24gbnYoZSl7RSgiW3JlZnJlc2hUYXNrRG9tYWluc10gU3RhcnRpbmcgZG9tYWluIHJlZnJlc2giKTtsZXQgdD1hd2FpdCBlLmdldFRhc2tEb21haW5zKCk7RShgW3JlZnJlc2hUYXNrRG9tYWluc10gRmV0Y2hlZCAke3Q/Lmxlbmd0aD8/MH0gZG9tYWlucyBmcm9tIEFQSWAsdCk7bGV0IG49UGUoKVtHLlRBU0tfRE9NQUlOU10scj17fTt0cnl7cj1uP0pTT04ucGFyc2Uobik6e319Y2F0Y2h7cj17fX1yZXR1cm4gci5kb21haW5zPXQubWFwKGE9Pih7bmFtZTphLm5hbWUsdXVpZDphLnV1aWR9KSksci5sYXN0UmV0cmlldmVkPURhdGUubm93KCksci5zZWxlY3RlZERvbWFpblV1aWQmJnIuZG9tYWlucy5zb21lKGE9PmEudXVpZD09PXIuc2VsZWN0ZWREb21haW5VdWlkKXx8KEUoYFtyZWZyZXNoVGFza0RvbWFpbnNdIFByZXZpb3VzIHNlbGVjdGlvbiAke3Iuc2VsZWN0ZWREb21haW5VdWlkfSBubyBsb25nZXIgZXhpc3RzLCBwaWNraW5nIGRlZmF1bHRgKSxyLnNlbGVjdGVkRG9tYWluVXVpZD1CMShyLmRvbWFpbnMpKSxhd2FpdCBlLnNldFNldHRpbmcoRy5UQVNLX0RPTUFJTlMsSlNPTi5zdHJpbmdpZnkocikpLEUoYFtyZWZyZXNoVGFza0RvbWFpbnNdIFJlZnJlc2ggY29tcGxldGUgXHUyMDE0ICR7ci5kb21haW5zLmxlbmd0aH0gZG9tYWlucywgYWN0aXZlOiAke3Iuc2VsZWN0ZWREb21haW5VdWlkfWApLHtkb21haW5zOnIuZG9tYWlucyxhY3RpdmVUYXNrRG9tYWluOnIuc2VsZWN0ZWREb21haW5VdWlkfX1hc3luYyBmdW5jdGlvbiBydihlLHQpe2xldHtsYWJlbDpuLHllYXI6cixxdWFydGVyOm99PXQsYT1gJHtufSBQbGFuYCxpPVBlKClbRy5QTEFOTklOR19OT1RFX1RBR118fG9sLHM9W1JlLGldLGM9KGF3YWl0IGUuZmlsdGVyTm90ZXMoe3F1ZXJ5OmF9KSkuZmluZChwPT5wLm5hbWU9PT1hKTtpZihjKXJldHVybiBhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7Yy51dWlkfWApLHt1dWlkOmMudXVpZCxleGlzdGVkOiEwfTtsZXQgZD10cChuLG8pLHU9YXdhaXQgZS5jcmVhdGVOb3RlKGEscyk7cmV0dXJuIGF3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQoe3V1aWQ6dX0sZCksYXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3V9YCkse3V1aWQ6dSxleGlzdGVkOiExfX1hc3luYyBmdW5jdGlvbiBvdihlLHQse2FwaUtleTpuLHByb3ZpZGVyOnJ9PXt9KXtsZXQgbz1QZSgpO2lmKG58fChuPW9bIkxMTSBBUEkgS2V5Il0pLHJ8fChyPW9bRy5MTE1fUFJPVklERVJfTU9ERUxdfHwib3BlbmFpIiksIW4pcmV0dXJuW107bGV0IGE9dD9gQmFzZWQgb24gdGhlc2UgcXVhcnRlcmx5IGdvYWxzLCBnZW5lcmF0ZSAyIHNob3J0IGluc3BpcmF0aW9uYWwgcXVvdGVzICgxLTIgc2VudGVuY2VzIGVhY2gpIHRoYXQgbW90aXZhdGUgcHJvZ3Jlc3MgdG93YXJkIHRoZXNlIGdvYWxzLiBSZXR1cm4gYXMgSlNPTiBhcnJheSBbe3RleHQsIGF1dGhvcn1dLiBHb2FsczogJHt0LnN1YnN0cmluZygwLDUwMCl9YDoiR2VuZXJhdGUgMiBzaG9ydCBpbnNwaXJhdGlvbmFsIHF1b3RlcyBhYm91dCBwcm9kdWN0aXZpdHkgYW5kIHBlcnNvbmFsIGdyb3d0aC4gUmV0dXJuIGFzIEpTT04gYXJyYXkgW3t0ZXh0LCBhdXRob3J9XS4iLGk9cj09PSJhbnRocm9waWMiPyJodHRwczovL2FwaS5hbnRocm9waWMuY29tL3YxL21lc3NhZ2VzIjoiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MS9jaGF0L2NvbXBsZXRpb25zIixzPXI9PT0iYW50aHJvcGljIj97IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJ4LWFwaS1rZXkiOm4sImFudGhyb3BpYy12ZXJzaW9uIjoiMjAyMy0wNi0wMSJ9OnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsQXV0aG9yaXphdGlvbjpgQmVhcmVyICR7bn1gfSxsPXI9PT0iYW50aHJvcGljIj97bW9kZWw6ImNsYXVkZS1zb25uZXQtNC0yMDI1MDUxNCIsbWF4X3Rva2VuczozMDAsbWVzc2FnZXM6W3tyb2xlOiJ1c2VyIixjb250ZW50OmF9XX06e21vZGVsOiJncHQtNG8tbWluaSIsbWVzc2FnZXM6W3tyb2xlOiJ1c2VyIixjb250ZW50OmF9XSxtYXhfdG9rZW5zOjMwMH07dHJ5e2xldCBkPWF3YWl0KGF3YWl0IGZldGNoKGkse21ldGhvZDoiUE9TVCIsaGVhZGVyczpzLGJvZHk6SlNPTi5zdHJpbmdpZnkobCl9KSkuanNvbigpLHU9cj09PSJhbnRocm9waWMiP2Q/LmNvbnRlbnQ/LlswXT8udGV4dDpkPy5jaG9pY2VzPy5bMF0/Lm1lc3NhZ2U/LmNvbnRlbnQ7cmV0dXJuIEpTT04ucGFyc2UodSl9Y2F0Y2goYyl7cmV0dXJuIEUoIlF1b3RlIGZldGNoIGVycm9yOiIsYyksW3t0ZXh0OiJXaGF0IGdldHMgbWVhc3VyZWQgZ2V0cyBtYW5hZ2VkLiIsYXV0aG9yOiJQZXRlciBEcnVja2VyIn0se3RleHQ6IlNtYWxsIGRhaWx5IGltcHJvdmVtZW50cyBsZWFkIHRvIHN0dW5uaW5nIHJlc3VsdHMuIixhdXRob3I6IlJvYmluIFNoYXJtYSJ9XX19YXN5bmMgZnVuY3Rpb24gZXAoZSx0LG4pe2lmKCF0KXJldHVybntmb3VuZDohMSxjb250ZW50Om51bGx9O2xldCByPWF3YWl0IGUuZ2V0Tm90ZVNlY3Rpb25zKHt1dWlkOnR9KTtFKGBbZ2V0TW9udGhseVBsYW5Db250ZW50XSBub3RlVVVJRD0ke3R9IG1vbnRoTmFtZT0iJHtufSIgc2VjdGlvbnM6YCxyPy5tYXAocz0+cy5oZWFkaW5nPy50ZXh0KSk7bGV0IG89ci5maW5kKHM9PnMuaGVhZGluZyYmcy5oZWFkaW5nLnRleHQmJnMuaGVhZGluZy50ZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpPT09bi50b0xvd2VyQ2FzZSgpKTtpZihFKCJbZ2V0TW9udGhseVBsYW5Db250ZW50XSBtb250aFNlY3Rpb24gZm91bmQ6IiwhIW8pLCFvKXJldHVybntmb3VuZDohMSxjb250ZW50Om51bGx9O2xldCBhPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6dH0pLGk9UW8oYSxuKTtyZXR1cm4gRShgW2dldE1vbnRobHlQbGFuQ29udGVudF0gZXh0cmFjdGVkIGNvbnRlbnQgbGVuZ3RoOiAke2k/Lmxlbmd0aD8/MH1gKSx7Zm91bmQ6ITAsY29udGVudDppfHwiIn19YXN5bmMgZnVuY3Rpb24gYXYoZSx0LG4pe2xldHtsYWJlbDpyLHllYXI6byxxdWFydGVyOmF9PXQsaT1gJHtyfSBQbGFuYCxzPVBlKClbRy5QTEFOTklOR19OT1RFX1RBR118fG9sLGw9W1JlLHNdLGQ9KGF3YWl0IGUuZmlsdGVyTm90ZXMoe3F1ZXJ5Oml9KSkuZmluZChmPT5mLm5hbWU9PT1pKSx1O2lmKGQpdT1kLnV1aWQsYXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDp1fSxPZChuKSx7YXRFbmQ6ITB9KTtlbHNle2xldCBmPXRwKHIsYSk7dT1hd2FpdCBlLmNyZWF0ZU5vdGUoaSxsKSxhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOnV9LGYpfWxldCBwPWF3YWl0IHN2KGUsdSxuKTtyZXR1cm57bm90ZVVVSUQ6dSxjb250ZW50OnAsY3JlYXRlZDohZH19YXN5bmMgZnVuY3Rpb24gaXYoZSx0LG4pe2xldHtsYWJlbDpyLHllYXI6byxxdWFydGVyOmF9PXQsaT1gJHtyfSBQbGFuYCxzPVBlKClbRy5QTEFOTklOR19OT1RFX1RBR118fG9sLGw9W1JlLHNdLGQ9KGF3YWl0IGUuZmlsdGVyTm90ZXMoe3F1ZXJ5Oml9KSkuZmluZChmPT5mLm5hbWU9PT1pKSx1O2lmKGQpdT1kLnV1aWQsKGF3YWl0IGVwKGUsdSxuKSkuZm91bmR8fGF3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQoe3V1aWQ6dX0sSWQobikse2F0RW5kOiEwfSk7ZWxzZXtsZXQgZj10cChyLGEpO3U9YXdhaXQgZS5jcmVhdGVOb3RlKGksbCksYXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDp1fSxmKSxhd2FpdCBlLmluc2VydE5vdGVDb250ZW50KHt1dWlkOnV9LElkKG4pLHthdEVuZDohMH0pfWxldCBwPWF3YWl0IHN2KGUsdSxuKTtyZXR1cm57bm90ZVVVSUQ6dSxjb250ZW50OnB9fWFzeW5jIGZ1bmN0aW9uIHN2KGUsdCxuLHthdHRlbXB0czpyPTMsZGVsYXlNczpvPTUwMH09e30pe2ZvcihsZXQgYT0wO2E8cjthKyspe2E+MCYmYXdhaXQgbmV3IFByb21pc2UobD0+c2V0VGltZW91dChsLG8pKTtsZXQgaT1hd2FpdCBlLmdldE5vdGVDb250ZW50KHt1dWlkOnR9KSxzPVFvKGksbik7aWYocylyZXR1cm4gc31yZXR1cm4gT2Qobikuc3BsaXQoYApgKS5maWx0ZXIoYT0+YSYmIWEuc3RhcnRzV2l0aCgiIyIpKS5qb2luKGAKYCl9ZnVuY3Rpb24gQjEoZSl7aWYoIWV8fGUubGVuZ3RoPT09MClyZXR1cm4gbnVsbDtsZXQgdD1lLmZpbmQobj0+bi5uYW1lPT09IldvcmsiKTtyZXR1cm4gdD90LnV1aWQ6ZVswXS51dWlkfWFzeW5jIGZ1bmN0aW9uIEgxKGUsdCl7aWYoIXQpcmV0dXJuW107bGV0IG49RGF0ZS5ub3coKSxyPWF3YWl0IGUuZ2V0VGFza0RvbWFpblRhc2tzKHQpLG89QXJyYXkuaXNBcnJheShyKT9yOltdO3JldHVybiBFKGBbX2ZldGNoVGFza3NGb3JEb21haW5dIGdldFRhc2tEb21haW5UYXNrcyByZXR1cm5lZCAke28ubGVuZ3RofSB0YXNrcyBpbiAke0RhdGUubm93KCktbn1tc2ApLG99ZnVuY3Rpb24gajEoZSx0KXtsZXQgbj1uZXcgRGF0ZSh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKS5nZXRUaW1lKCkscj1uKzg2NGU1O3JldHVybiBlLmZpbHRlcihvPT4hby5jb21wbGV0ZWRBdCYmIW8uZGlzbWlzc2VkQXQmJmJuKG8uc3RhcnRBdCkmJmJuKG8uc3RhcnRBdCk+PW4mJmJuKG8uc3RhcnRBdCk8cikuc29ydCgobyxhKT0+KGJuKG8uc3RhcnRBdCl8fDApLShibihhLnN0YXJ0QXQpfHwwKSl9ZnVuY3Rpb24gbHYoZSx0LG4pe2xldCByPXQuZ2V0VGltZSgpLG89bi5nZXRUaW1lKCk7cmV0dXJuIGUuZmlsdGVyKGE9PmJuKGEuY29tcGxldGVkQXQpJiZibihhLmNvbXBsZXRlZEF0KT49ciYmYm4oYS5jb21wbGV0ZWRBdCk8PW8pfWZ1bmN0aW9uIFYxKGUsdCxuKXtyZXR1cm4gbHYoZSx0LG4pLnJlZHVjZSgocixvKT0+cisoby52aWN0b3J5VmFsdWV8fDApLDApfWZ1bmN0aW9uIEcxKGUsdCl7cmV0dXJuIEFycmF5LmZyb20oe2xlbmd0aDo3fSwocixvKT0+e2xldCBhPW5ldyBEYXRlKHQpO2Euc2V0RGF0ZShhLmdldERhdGUoKStvKTtsZXQgaT1uZXcgRGF0ZShhKTtpLnNldERhdGUoaS5nZXREYXRlKCkrMSk7bGV0IHM9ZS5maWx0ZXIobD0+Ym4obC5jb21wbGV0ZWRBdCkmJmJuKGwuY29tcGxldGVkQXQpPj1hLmdldFRpbWUoKSYmYm4obC5jb21wbGV0ZWRBdCk8aS5nZXRUaW1lKCkpO3JldHVybntkYXk6WyJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiLCJTdW4iXVtvXSxkYXRlOmEudG9JU09TdHJpbmcoKSx2YWx1ZTpzLnJlZHVjZSgobCxjKT0+bCsoYy52aWN0b3J5VmFsdWV8fDApLDApLHRhc2tDb3VudDpzLmxlbmd0aH19KX1mdW5jdGlvbiBibihlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiBlIT0ibnVtYmVyIil7bGV0IHQ9TnVtYmVyKGUpO3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCk/dDwxZTEwP3QqMWUzOnQ6bnVsbH1yZXR1cm4gZTwxZTEwP2UqMWUzOmV9ZnVuY3Rpb24gdHAoZSx0KXtsZXQgcj17MTpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIl0sMjpbIkFwcmlsIiwiTWF5IiwiSnVuZSJdLDM6WyJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIl0sNDpbIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl19W3RdfHxbIk1vbnRoIDEiLCJNb250aCAyIiwiTW9udGggMyJdO3JldHVybmBRdWFydGVybHkgUGxhbiBcdTIwMTQgJHtlfQoKIyBRdWFydGVyIFRoZW1lCltPbmUgc2VudGVuY2UgZGVzY3JpYmluZyB0aGUgbWFpbiBmb2N1cyBvZiB0aGlzIHF1YXJ0ZXIuXQoKIyMgU3VjY2VzcyBMb29rcyBMaWtlCjEuIFsgXSBbVG9wIG91dGNvbWVdCjIuIFsgXSBbVG9wIG91dGNvbWVdCjMuIFsgXSBbVG9wIG91dGNvbWVdCgojIFByb2plY3RzCgojIyBbUHJvamVjdCAxXQotIE91dGNvbWU6Ci0gV2h5IG5vdzoKLSBXZWVrbHkgcmh5dGhtOgotIERlYWRsaW5lOgotIENvbnN0cmFpbnRzOgotIERvbmUgZW5vdWdoIHdoZW46CgojIyBbUHJvamVjdCAyXQotIE91dGNvbWU6Ci0gV2h5IG5vdzoKLSBXZWVrbHkgcmh5dGhtOgotIERlYWRsaW5lOgotIENvbnN0cmFpbnRzOgotIERvbmUgZW5vdWdoIHdoZW46CgojIyBbUHJvamVjdCAzXQotIE91dGNvbWU6Ci0gV2h5IG5vdzoKLSBXZWVrbHkgcmh5dGhtOgotIERlYWRsaW5lOgotIENvbnN0cmFpbnRzOgotIERvbmUgZW5vdWdoIHdoZW46CgojIE5vdCBUaGlzIFF1YXJ0ZXIKLSBbIF0gW0xvd2VyLXByaW9yaXR5IHByb2plY3RdCi0gWyBdIFtDb21taXRtZW50IHRvIGRlY2xpbmVdCi0gWyBdIFtBcmVhIHRvIGludGVudGlvbmFsbHkgaWdub3JlXQoKIyBEYXktb2YtV2VlayBCcmVha2Rvd24KQW55IGNhdGVnb3J5IG9mIHRhc2sgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSBiZSB0aGUgZm9jdXMgZm9yIGRpZmZlcmVudCBkYXlzLW9mLXdlZWsgKHNvbWV0aW1lcyBjYWxsZWQgImRheSBzdHJpcGluZyIpPwpTZXBhcmF0ZSB5b3VyIHRhc2sgY2F0ZWdvcmllcyB3aXRoIGEgc2VtaWNvbG9uIChpLmUuLCAiOyIpLiBXZSB3aWxsIGNvbnNpZGVyIHRoZW0gd2hlbiBwcm9wb3NpbmcgcG9zc2libGUgCmRhaWx5IGFnZW5kYXMgZnJvbSB5b3VyIGV4aXN0aW5nIHRhc2tzLiAgCgotIE1vbmRheXM6IAotIFR1ZXNkYXlzOiAKLSBXZWRuZXNkYXlzOiAKLSBUaHVyc2RheXM6IAotIEZyaWRheXM6IAoKW0FtcGxlbm90ZSBtZXNzYWdlXQpZb3UgY2FuIGFsc28gYWRkIFNhdHVyZGF5IGFuZCBTdW5kYXkgaWYgeW91IGxpa2U7IHRoZXkncmUgbm90IGluIHRoZSBsaXN0IHNpbmNlIGJ5IGRlZmF1bHQgYmVjYXVzZSB3ZSBzdXNwZWN0IAp5b3UncmUgYmVzdCBvZmYgcHJlc2VydmluZyB5b3VyIHdlZWtlbmQgZm9yIHVucGxhbm5lZCBmYW1pbHkgJiByZXN0b3JhdGlvbiBhY3Rpdml0aWVzLiAgIAoKIyBNb250aC1ieS1Nb250aCBCcmVha2Rvd24KCiMjICR7clswXX0KLSBGb2N1czoKLSBLZXkgbW92ZToKCiMjICR7clsxXX0KLSBGb2N1czoKLSBLZXkgbW92ZToKCiMjICR7clsyXX0KLSBGb2N1czoKLSBLZXkgbW92ZToKCiMgV2Vla2x5IFBsYW5uaW5nIFByb21wdApXaGljaCBwcm9qZWN0cyBuZWVkIHRpbWUgb24gbXkgY2FsZW5kYXIgdGhpcyB3ZWVrPwoKIyBRdWFydGVybHkgUmV2aWV3Ci0gRmluaXNoZWQ6Ci0gUHJvZ3Jlc3MgbWFkZToKLSBMZXNzb25zIGxlYXJuZWQ6Ci0gQ2FycnkgZm9yd2FyZDpgfWFzeW5jIGZ1bmN0aW9uIG5wKGUsdCxuKXtyZXR1cm4gYXdhaXQgZXAoZSx0LG4pfWFzeW5jIGZ1bmN0aW9uIGN2KGUsdCxuKXtyZXR1cm4gYXdhaXQgYXYoZSx0LG4pfWFzeW5jIGZ1bmN0aW9uIHV2KGUsdCxuKXtyZXR1cm4gYXdhaXQgaXYoZSx0LG4pfWFzeW5jIGZ1bmN0aW9uIGR2KGUsdCl7bGV0IG49YXdhaXQgcnYoZSx0KTtyZXR1cm4gaG4mJm4/LnV1aWQ/ey4uLm4sZGV2RWRpdDohMCxub3RlVVVJRDpuLnV1aWR9Om59YXN5bmMgZnVuY3Rpb24geGwoZSx0KXtyZXR1cm4gaG4/e2RldkVkaXQ6ITAsbm90ZVVVSUQ6dH06YXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3R9YCl9YXN5bmMgZnVuY3Rpb24gcHYoZSx0KXtyZXR1cm4gYXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDp0fSl9YXN5bmMgZnVuY3Rpb24gZnYoZSx0LG4scil7cmV0dXJuIGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHt1dWlkOnR9LG4scil9ZnVuY3Rpb24gcnAoe2FwcDplLG5vdGVVVUlEOnQsb25CYWNrOm59KXtsZXQgcj1Dci5jcmVhdGVFbGVtZW50LFtvLGFdPSgwLENyLnVzZVN0YXRlKSgiIiksW2ksc109KDAsQ3IudXNlU3RhdGUpKCEwKSxbbCxjXT0oMCxDci51c2VTdGF0ZSkoITEpOygwLENyLnVzZUVmZmVjdCkoKCk9PntsZXQgdT0hMTtyZXR1cm4gcHYoZSx0KS50aGVuKHA9Pnt1fHwoYShwfHwiIikscyghMSkpfSksKCk9Pnt1PSEwfX0sW3QsZV0pO2xldCBkPWFzeW5jKCk9PntjKCEwKSxhd2FpdCBmdihlLHQsbyksYyghMSl9O3JldHVybiBpP3IoImRpdiIse2NsYXNzTmFtZToibm90ZS1lZGl0b3ItbG9hZGluZyJ9LCJMb2FkaW5nIG5vdGVcdTIwMjYiKTpyKCJkaXYiLHtjbGFzc05hbWU6Im5vdGUtZWRpdG9yIn0scigiZGl2Iix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvci10b29sYmFyIn0scigiYnV0dG9uIix7Y2xhc3NOYW1lOiJub3RlLWVkaXRvci1idG4gbm90ZS1lZGl0b3ItYnRuLS1iYWNrIixvbkNsaWNrOm59LCJcdTIxOTAgQmFjayIpLHIoImJ1dHRvbiIse2NsYXNzTmFtZToibm90ZS1lZGl0b3ItYnRuIG5vdGUtZWRpdG9yLWJ0bi0tc2F2ZSIsb25DbGljazpkLGRpc2FibGVkOmx9LGw/IlNhdmluZ1x1MjAyNiI6IlNhdmUiKSkscigidGV4dGFyZWEiLHtjbGFzc05hbWU6Im5vdGUtZWRpdG9yLXRleHRhcmVhIix2YWx1ZTpvLG9uQ2hhbmdlOnU9PmEodS50YXJnZXQudmFsdWUpfSkpfXZhciBCdD1wZShkZSgpKTtmdW5jdGlvbiBzcCgpe3JldHVybnthc3luYzohMSxicmVha3M6ITEsZXh0ZW5zaW9uczpudWxsLGdmbTohMCxob29rczpudWxsLHBlZGFudGljOiExLHJlbmRlcmVyOm51bGwsc2lsZW50OiExLHRva2VuaXplcjpudWxsLHdhbGtUb2tlbnM6bnVsbH19dmFyIHVvPXNwKCk7ZnVuY3Rpb24gd3YoZSl7dW89ZX12YXIga2k9e2V4ZWM6KCk9Pm51bGx9O2Z1bmN0aW9uIHdlKGUsdD0iIil7bGV0IG49dHlwZW9mIGU9PSJzdHJpbmciP2U6ZS5zb3VyY2Uscj17cmVwbGFjZToobyxhKT0+e2xldCBpPXR5cGVvZiBhPT0ic3RyaW5nIj9hOmEuc291cmNlO3JldHVybiBpPWkucmVwbGFjZSh4dC5jYXJldCwiJDEiKSxuPW4ucmVwbGFjZShvLGkpLHJ9LGdldFJlZ2V4OigpPT5uZXcgUmVnRXhwKG4sdCl9O3JldHVybiByfXZhciB4dD17Y29kZVJlbW92ZUluZGVudDovXig/OiB7MSw0fXwgezAsM31cdCkvZ20sb3V0cHV0TGlua1JlcGxhY2U6L1xcKFtcW1xdXSkvZyxpbmRlbnRDb2RlQ29tcGVuc2F0aW9uOi9eKFxzKykoPzpgYGApLyxiZWdpbm5pbmdTcGFjZTovXlxzKy8sZW5kaW5nSGFzaDovIyQvLHN0YXJ0aW5nU3BhY2VDaGFyOi9eIC8sZW5kaW5nU3BhY2VDaGFyOi8gJC8sbm9uU3BhY2VDaGFyOi9bXiBdLyxuZXdMaW5lQ2hhckdsb2JhbDovXG4vZyx0YWJDaGFyR2xvYmFsOi9cdC9nLG11bHRpcGxlU3BhY2VHbG9iYWw6L1xzKy9nLGJsYW5rTGluZTovXlsgXHRdKiQvLGRvdWJsZUJsYW5rTGluZTovXG5bIFx0XSpcblsgXHRdKiQvLGJsb2NrcXVvdGVTdGFydDovXiB7MCwzfT4vLGJsb2NrcXVvdGVTZXRleHRSZXBsYWNlOi9cbiB7MCwzfSgoPzo9K3wtKykgKikoPz1cbnwkKS9nLGJsb2NrcXVvdGVTZXRleHRSZXBsYWNlMjovXiB7MCwzfT5bIFx0XT8vZ20sbGlzdFJlcGxhY2VUYWJzOi9eXHQrLyxsaXN0UmVwbGFjZU5lc3Rpbmc6L14gezEsNH0oPz0oIHs0fSkqW14gXSkvZyxsaXN0SXNUYXNrOi9eXFtbIHhYXVxdIC8sbGlzdFJlcGxhY2VUYXNrOi9eXFtbIHhYXVxdICsvLGFueUxpbmU6L1xuLipcbi8saHJlZkJyYWNrZXRzOi9ePCguKik+JC8sdGFibGVEZWxpbWl0ZXI6L1s6fF0vLHRhYmxlQWxpZ25DaGFyczovXlx8fFx8ICokL2csdGFibGVSb3dCbGFua0xpbmU6L1xuWyBcdF0qJC8sdGFibGVBbGlnblJpZ2h0Oi9eICotKzogKiQvLHRhYmxlQWxpZ25DZW50ZXI6L14gKjotKzogKiQvLHRhYmxlQWxpZ25MZWZ0Oi9eICo6LSsgKiQvLHN0YXJ0QVRhZzovXjxhIC9pLGVuZEFUYWc6L148XC9hPi9pLHN0YXJ0UHJlU2NyaXB0VGFnOi9ePChwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLGVuZFByZVNjcmlwdFRhZzovXjxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLHN0YXJ0QW5nbGVCcmFja2V0Oi9ePC8sZW5kQW5nbGVCcmFja2V0Oi8+JC8scGVkYW50aWNIcmVmVGl0bGU6L14oW14nIl0qW15cc10pXHMrKFsnIl0pKC4qKVwyLyx1bmljb2RlQWxwaGFOdW1lcmljOi9bXHB7TH1ccHtOfV0vdSxlc2NhcGVUZXN0Oi9bJjw+IiddLyxlc2NhcGVSZXBsYWNlOi9bJjw+IiddL2csZXNjYXBlVGVzdE5vRW5jb2RlOi9bPD4iJ118Jig/ISgjXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XHcrKTspLyxlc2NhcGVSZXBsYWNlTm9FbmNvZGU6L1s8PiInXXwmKD8hKCNcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcdyspOykvZyx1bmVzY2FwZVRlc3Q6LyYoIyg/OlxkKyl8KD86I3hbMC05QS1GYS1mXSspfCg/Olx3KykpOz8vaWcsY2FyZXQ6LyhefFteXFtdKVxeL2cscGVyY2VudERlY29kZTovJTI1L2csZmluZFBpcGU6L1x8L2csc3BsaXRQaXBlOi8gXHwvLHNsYXNoUGlwZTovXFxcfC9nLGNhcnJpYWdlUmV0dXJuOi9cclxufFxyL2csc3BhY2VMaW5lOi9eICskL2dtLG5vdFNwYWNlU3RhcnQ6L15cUyovLGVuZGluZ05ld2xpbmU6L1xuJC8sbGlzdEl0ZW1SZWdleDplPT5uZXcgUmVnRXhwKGBeKCB7MCwzfSR7ZX0pKCg/OlsJIF1bXlxcbl0qKT8oPzpcXG58JCkpYCksbmV4dEJ1bGxldFJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fSg/OlsqKy1dfFxcZHsxLDl9Wy4pXSkoKD86WyAJXVteXFxuXSopPyg/OlxcbnwkKSlgKSxoclJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fSgoPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXCogKil7Myx9KSg/Olxcbit8JClgKSxmZW5jZXNCZWdpblJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fSg/OlxgXGBcYHx+fn4pYCksaGVhZGluZ0JlZ2luUmVnZXg6ZT0+bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsZS0xKX19I2ApLGh0bWxCZWdpblJlZ2V4OmU9Pm5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGUtMSl9fTwoPzpbYS16XS4qPnwhLS0pYCwiaSIpfSxLMT0vXig/OlsgXHRdKig/OlxufCQpKSsvLFkxPS9eKCg/OiB7NH18IHswLDN9XHQpW15cbl0rKD86XG4oPzpbIFx0XSooPzpcbnwkKSkqKT8pKy8scTE9L14gezAsM30oYHszLH0oPz1bXmBcbl0qKD86XG58JCkpfH57Myx9KShbXlxuXSopKD86XG58JCkoPzp8KFtcc1xTXSo/KSg/OlxufCQpKSg/OiB7MCwzfVwxW35gXSogKig/PVxufCQpfCQpLyx4aT0vXiB7MCwzfSgoPzotW1x0IF0qKXszLH18KD86X1sgXHRdKil7Myx9fCg/OlwqWyBcdF0qKXszLH0pKD86XG4rfCQpLyxRMT0vXiB7MCwzfSgjezEsNn0pKD89XHN8JCkoLiopKD86XG4rfCQpLyxscD0vKD86WyorLV18XGR7MSw5fVsuKV0pLyxidj0vXig/IWJ1bGwgfGJsb2NrQ29kZXxmZW5jZXN8YmxvY2txdW90ZXxoZWFkaW5nfGh0bWx8dGFibGUpKCg/Oi58XG4oPyFccyo/XG58YnVsbCB8YmxvY2tDb2RlfGZlbmNlc3xibG9ja3F1b3RlfGhlYWRpbmd8aHRtbHx0YWJsZSkpKz8pXG4gezAsM30oPSt8LSspICooPzpcbit8JCkvLGt2PXdlKGJ2KS5yZXBsYWNlKC9idWxsL2csbHApLnJlcGxhY2UoL2Jsb2NrQ29kZS9nLC8oPzogezR9fCB7MCwzfVx0KS8pLnJlcGxhY2UoL2ZlbmNlcy9nLC8gezAsM30oPzpgezMsfXx+ezMsfSkvKS5yZXBsYWNlKC9ibG9ja3F1b3RlL2csLyB7MCwzfT4vKS5yZXBsYWNlKC9oZWFkaW5nL2csLyB7MCwzfSN7MSw2fS8pLnJlcGxhY2UoL2h0bWwvZywvIHswLDN9PFteXG4+XSs+XG4vKS5yZXBsYWNlKC9cfHRhYmxlL2csIiIpLmdldFJlZ2V4KCksSjE9d2UoYnYpLnJlcGxhY2UoL2J1bGwvZyxscCkucmVwbGFjZSgvYmxvY2tDb2RlL2csLyg/OiB7NH18IHswLDN9XHQpLykucmVwbGFjZSgvZmVuY2VzL2csLyB7MCwzfSg/OmB7Myx9fH57Myx9KS8pLnJlcGxhY2UoL2Jsb2NrcXVvdGUvZywvIHswLDN9Pi8pLnJlcGxhY2UoL2hlYWRpbmcvZywvIHswLDN9I3sxLDZ9LykucmVwbGFjZSgvaHRtbC9nLC8gezAsM308W15cbj5dKz5cbi8pLnJlcGxhY2UoL3RhYmxlL2csLyB7MCwzfVx8Pyg/Ols6XC0gXSpcfCkrW1w6XC0gXSpcbi8pLmdldFJlZ2V4KCksY3A9L14oW15cbl0rKD86XG4oPyFocnxoZWFkaW5nfGxoZWFkaW5nfGJsb2NrcXVvdGV8ZmVuY2VzfGxpc3R8aHRtbHx0YWJsZXwgK1xuKVteXG5dKykqKS8sWDE9L15bXlxuXSsvLHVwPS8oPyFccypcXSkoPzpcXC58W15cW1xdXFxdKSsvLFoxPXdlKC9eIHswLDN9XFsobGFiZWwpXF06ICooPzpcblsgXHRdKik/KFtePFxzXVteXHNdKnw8Lio/PikoPzooPzogKyg/OlxuWyBcdF0qKT98ICpcblsgXHRdKikodGl0bGUpKT8gKig/OlxuK3wkKS8pLnJlcGxhY2UoImxhYmVsIix1cCkucmVwbGFjZSgidGl0bGUiLC8oPzoiKD86XFwiP3xbXiJcXF0pKiJ8J1teJ1xuXSooPzpcblteJ1xuXSspKlxuPyd8XChbXigpXSpcKSkvKS5nZXRSZWdleCgpLGVTPXdlKC9eKCB7MCwzfWJ1bGwpKFsgXHRdW15cbl0rPyk/KD86XG58JCkvKS5yZXBsYWNlKC9idWxsL2csbHApLmdldFJlZ2V4KCksX2w9ImFkZHJlc3N8YXJ0aWNsZXxhc2lkZXxiYXNlfGJhc2Vmb250fGJsb2NrcXVvdGV8Ym9keXxjYXB0aW9ufGNlbnRlcnxjb2x8Y29sZ3JvdXB8ZGR8ZGV0YWlsc3xkaWFsb2d8ZGlyfGRpdnxkbHxkdHxmaWVsZHNldHxmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8Zm9ybXxmcmFtZXxmcmFtZXNldHxoWzEtNl18aGVhZHxoZWFkZXJ8aHJ8aHRtbHxpZnJhbWV8bGVnZW5kfGxpfGxpbmt8bWFpbnxtZW51fG1lbnVpdGVtfG1ldGF8bmF2fG5vZnJhbWVzfG9sfG9wdGdyb3VwfG9wdGlvbnxwfHBhcmFtfHNlYXJjaHxzZWN0aW9ufHN1bW1hcnl8dGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dGhlYWR8dGl0bGV8dHJ8dHJhY2t8dWwiLGRwPS88IS0tKD86LT8+fFtcc1xTXSo/KD86LS0+fCQpKS8sdFM9d2UoIl4gezAsM30oPzo8KHNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW1xccz5dW1xcc1xcU10qPyg/OjwvXFwxPlteXFxuXSpcXG4rfCQpfGNvbW1lbnRbXlxcbl0qKFxcbit8JCl8PFxcP1tcXHNcXFNdKj8oPzpcXD8+XFxuKnwkKXw8IVtBLVpdW1xcc1xcU10qPyg/Oj5cXG4qfCQpfDwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/KD86XFxdXFxdPlxcbip8JCl8PC8/KHRhZykoPzogK3xcXG58Lz8+KVtcXHNcXFNdKj8oPzooPzpcXG5bIAldKikrXFxufCQpfDwoPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKShbYS16XVtcXHctXSopKD86YXR0cmlidXRlKSo/ICovPz4oPz1bIFxcdF0qKD86XFxufCQpKVtcXHNcXFNdKj8oPzooPzpcXG5bIAldKikrXFxufCQpfDwvKD8hc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbYS16XVtcXHctXSpcXHMqPig/PVsgXFx0XSooPzpcXG58JCkpW1xcc1xcU10qPyg/Oig/OlxcblsgCV0qKStcXG58JCkpIiwiaSIpLnJlcGxhY2UoImNvbW1lbnQiLGRwKS5yZXBsYWNlKCJ0YWciLF9sKS5yZXBsYWNlKCJhdHRyaWJ1dGUiLC8gK1thLXpBLVo6X11bXHcuOi1dKig/OiAqPSAqIlteIlxuXSoifCAqPSAqJ1teJ1xuXSonfCAqPSAqW15ccyInPTw+YF0rKT8vKS5nZXRSZWdleCgpLHh2PXdlKGNwKS5yZXBsYWNlKCJociIseGkpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0oPzpcXHN8JCkiKS5yZXBsYWNlKCJ8bGhlYWRpbmciLCIiKS5yZXBsYWNlKCJ8dGFibGUiLCIiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsX2wpLmdldFJlZ2V4KCksblM9d2UoL14oIHswLDN9PiA/KHBhcmFncmFwaHxbXlxuXSopKD86XG58JCkpKy8pLnJlcGxhY2UoInBhcmFncmFwaCIseHYpLmdldFJlZ2V4KCkscHA9e2Jsb2NrcXVvdGU6blMsY29kZTpZMSxkZWY6WjEsZmVuY2VzOnExLGhlYWRpbmc6UTEsaHI6eGksaHRtbDp0UyxsaGVhZGluZzprdixsaXN0OmVTLG5ld2xpbmU6SzEscGFyYWdyYXBoOnh2LHRhYmxlOmtpLHRleHQ6WDF9LG12PXdlKCJeICooW15cXG4gXS4qKVxcbiB7MCwzfSgoPzpcXHwgKik/Oj8tKzo/ICooPzpcXHwgKjo/LSs6PyAqKSooPzpcXHwgKik/KSg/OlxcbigoPzooPyEgKlxcbnxocnxoZWFkaW5nfGJsb2NrcXVvdGV8Y29kZXxmZW5jZXN8bGlzdHxodG1sKS4qKD86XFxufCQpKSopXFxuKnwkKSIpLnJlcGxhY2UoImhyIix4aSkucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSg/Olxcc3wkKSIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgiY29kZSIsIig/OiB7NH18IHswLDN9CSlbXlxcbl0iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLF9sKS5nZXRSZWdleCgpLHJTPXsuLi5wcCxsaGVhZGluZzpKMSx0YWJsZTptdixwYXJhZ3JhcGg6d2UoY3ApLnJlcGxhY2UoImhyIix4aSkucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSg/Olxcc3wkKSIpLnJlcGxhY2UoInxsaGVhZGluZyIsIiIpLnJlcGxhY2UoInRhYmxlIixtdikucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLF9sKS5nZXRSZWdleCgpfSxvUz17Li4ucHAsaHRtbDp3ZShgXiAqKD86Y29tbWVudCAqKD86XFxufFxccyokKXw8KHRhZylbXFxzXFxTXSs/PC9cXDE+ICooPzpcXG57Mix9fFxccyokKXw8dGFnKD86IlteIl0qInwnW14nXSonfFxcc1teJyIvPlxcc10qKSo/Lz8+ICooPzpcXG57Mix9fFxccyokKSlgKS5yZXBsYWNlKCJjb21tZW50IixkcCkucmVwbGFjZSgvdGFnL2csIig/ISg/OmF8ZW18c3Ryb25nfHNtYWxsfHN8Y2l0ZXxxfGRmbnxhYmJyfGRhdGF8dGltZXxjb2RlfHZhcnxzYW1wfGtiZHxzdWJ8c3VwfGl8Ynx1fG1hcmt8cnVieXxydHxycHxiZGl8YmRvfHNwYW58YnJ8d2JyfGluc3xkZWx8aW1nKVxcYilcXHcrKD8hOnxbXlxcd1xcc0BdKkApXFxiIikuZ2V0UmVnZXgoKSxkZWY6L14gKlxbKFteXF1dKylcXTogKjw/KFteXHM+XSspPj8oPzogKyhbIihdW15cbl0rWyIpXSkpPyAqKD86XG4rfCQpLyxoZWFkaW5nOi9eKCN7MSw2fSkoLiopKD86XG4rfCQpLyxmZW5jZXM6a2ksbGhlYWRpbmc6L14oLis/KVxuIHswLDN9KD0rfC0rKSAqKD86XG4rfCQpLyxwYXJhZ3JhcGg6d2UoY3ApLnJlcGxhY2UoImhyIix4aSkucmVwbGFjZSgiaGVhZGluZyIsYCAqI3sxLDZ9ICpbXgpdYCkucmVwbGFjZSgibGhlYWRpbmciLGt2KS5yZXBsYWNlKCJ8dGFibGUiLCIiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoInxmZW5jZXMiLCIiKS5yZXBsYWNlKCJ8bGlzdCIsIiIpLnJlcGxhY2UoInxodG1sIiwiIikucmVwbGFjZSgifHRhZyIsIiIpLmdldFJlZ2V4KCl9LGFTPS9eXFwoWyEiIyQlJicoKSorLFwtLi86Ozw9Pj9AXFtcXVxcXl9ge3x9fl0pLyxpUz0vXihgKykoW15gXXxbXmBdW1xzXFNdKj9bXmBdKVwxKD8hYCkvLFN2PS9eKCB7Mix9fFxcKVxuKD8hXHMqJCkvLHNTPS9eKGArfFteYF0pKD86KD89IHsyLH1cbil8W1xzXFNdKj8oPzooPz1bXFw8IVxbYCpfXXxcYl98JCl8W14gXSg/PSB7Mix9XG4pKSkvLENsPS9bXHB7UH1ccHtTfV0vdSxmcD0vW1xzXHB7UH1ccHtTfV0vdSxFdj0vW15cc1xwe1B9XHB7U31dL3UsbFM9d2UoL14oKD8hWypfXSlwdW5jdFNwYWNlKS8sInUiKS5yZXBsYWNlKC9wdW5jdFNwYWNlL2csZnApLmdldFJlZ2V4KCksVHY9Lyg/IX4pW1xwe1B9XHB7U31dL3UsY1M9Lyg/IX4pW1xzXHB7UH1ccHtTfV0vdSx1Uz0vKD86W15cc1xwe1B9XHB7U31dfH4pL3UsZFM9L1xbW15bXF1dKj9cXVwoKD86XFwufFteXFxcKFwpXXxcKCg/OlxcLnxbXlxcXChcKV0pKlwpKSpcKXxgW15gXSo/YHw8W148Pl0qPz4vZyxOdj0vXig/OlwqKyg/OigoPyFcKilwdW5jdCl8W15ccypdKSl8Xl8rKD86KCg/IV8pcHVuY3QpfChbXlxzX10pKS8scFM9d2UoTnYsInUiKS5yZXBsYWNlKC9wdW5jdC9nLENsKS5nZXRSZWdleCgpLGZTPXdlKE52LCJ1IikucmVwbGFjZSgvcHVuY3QvZyxUdikuZ2V0UmVnZXgoKSxEdj0iXlteXypdKj9fX1teXypdKj9cXCpbXl8qXSo/KD89X18pfFteKl0rKD89W14qXSl8KD8hXFwqKXB1bmN0KFxcKispKD89W1xcc118JCl8bm90UHVuY3RTcGFjZShcXCorKSg/IVxcKikoPz1wdW5jdFNwYWNlfCQpfCg/IVxcKilwdW5jdFNwYWNlKFxcKispKD89bm90UHVuY3RTcGFjZSl8W1xcc10oXFwqKykoPyFcXCopKD89cHVuY3QpfCg/IVxcKilwdW5jdChcXCorKSg/IVxcKikoPz1wdW5jdCl8bm90UHVuY3RTcGFjZShcXCorKSg/PW5vdFB1bmN0U3BhY2UpIixtUz13ZShEdiwiZ3UiKS5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csRXYpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyxmcCkucmVwbGFjZSgvcHVuY3QvZyxDbCkuZ2V0UmVnZXgoKSxoUz13ZShEdiwiZ3UiKS5yZXBsYWNlKC9ub3RQdW5jdFNwYWNlL2csdVMpLnJlcGxhY2UoL3B1bmN0U3BhY2UvZyxjUykucmVwbGFjZSgvcHVuY3QvZyxUdikuZ2V0UmVnZXgoKSxnUz13ZSgiXlteXypdKj9cXCpcXCpbXl8qXSo/X1teXypdKj8oPz1cXCpcXCopfFteX10rKD89W15fXSl8KD8hXylwdW5jdChfKykoPz1bXFxzXXwkKXxub3RQdW5jdFNwYWNlKF8rKSg/IV8pKD89cHVuY3RTcGFjZXwkKXwoPyFfKXB1bmN0U3BhY2UoXyspKD89bm90UHVuY3RTcGFjZSl8W1xcc10oXyspKD8hXykoPz1wdW5jdCl8KD8hXylwdW5jdChfKykoPyFfKSg/PXB1bmN0KSIsImd1IikucmVwbGFjZSgvbm90UHVuY3RTcGFjZS9nLEV2KS5yZXBsYWNlKC9wdW5jdFNwYWNlL2csZnApLnJlcGxhY2UoL3B1bmN0L2csQ2wpLmdldFJlZ2V4KCkseVM9d2UoL1xcKHB1bmN0KS8sImd1IikucmVwbGFjZSgvcHVuY3QvZyxDbCkuZ2V0UmVnZXgoKSx2Uz13ZSgvXjwoc2NoZW1lOlteXHNceDAwLVx4MWY8Pl0qfGVtYWlsKT4vKS5yZXBsYWNlKCJzY2hlbWUiLC9bYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9LykucmVwbGFjZSgiZW1haWwiLC9bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dKyhAKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSsoPyFbLV9dKS8pLmdldFJlZ2V4KCksd1M9d2UoZHApLnJlcGxhY2UoIig/Oi0tPnwkKSIsIi0tPiIpLmdldFJlZ2V4KCksYlM9d2UoIl5jb21tZW50fF48L1thLXpBLVpdW1xcdzotXSpcXHMqPnxePFthLXpBLVpdW1xcdy1dKig/OmF0dHJpYnV0ZSkqP1xccyovPz58XjxcXD9bXFxzXFxTXSo/XFw/PnxePCFbYS16QS1aXStcXHNbXFxzXFxTXSo/PnxePCFcXFtDREFUQVxcW1tcXHNcXFNdKj9cXF1cXF0+IikucmVwbGFjZSgiY29tbWVudCIsd1MpLnJlcGxhY2UoImF0dHJpYnV0ZSIsL1xzK1thLXpBLVo6X11bXHcuOi1dKig/OlxzKj1ccyoiW14iXSoifFxzKj1ccyonW14nXSonfFxzKj1ccypbXlxzIic9PD5gXSspPy8pLmdldFJlZ2V4KCksVGw9Lyg/OlxbKD86XFwufFteXFtcXVxcXSkqXF18XFwufGBbXmBdKmB8W15cW1xdXFxgXSkqPy8sa1M9d2UoL14hP1xbKGxhYmVsKVxdXChccyooaHJlZikoPzooPzpbIFx0XSooPzpcblsgXHRdKik/KSh0aXRsZSkpP1xzKlwpLykucmVwbGFjZSgibGFiZWwiLFRsKS5yZXBsYWNlKCJocmVmIiwvPCg/OlxcLnxbXlxuPD5cXF0pKz58W14gXHRcblx4MDAtXHgxZl0qLykucmVwbGFjZSgidGl0bGUiLC8iKD86XFwiP3xbXiJcXF0pKiJ8Jyg/OlxcJz98W14nXFxdKSonfFwoKD86XFxcKT98W14pXFxdKSpcKS8pLmdldFJlZ2V4KCksX3Y9d2UoL14hP1xbKGxhYmVsKVxdXFsocmVmKVxdLykucmVwbGFjZSgibGFiZWwiLFRsKS5yZXBsYWNlKCJyZWYiLHVwKS5nZXRSZWdleCgpLEN2PXdlKC9eIT9cWyhyZWYpXF0oPzpcW1xdKT8vKS5yZXBsYWNlKCJyZWYiLHVwKS5nZXRSZWdleCgpLHhTPXdlKCJyZWZsaW5rfG5vbGluayg/IVxcKCkiLCJnIikucmVwbGFjZSgicmVmbGluayIsX3YpLnJlcGxhY2UoIm5vbGluayIsQ3YpLmdldFJlZ2V4KCksbXA9e19iYWNrcGVkYWw6a2ksYW55UHVuY3R1YXRpb246eVMsYXV0b2xpbms6dlMsYmxvY2tTa2lwOmRTLGJyOlN2LGNvZGU6aVMsZGVsOmtpLGVtU3Ryb25nTERlbGltOnBTLGVtU3Ryb25nUkRlbGltQXN0Om1TLGVtU3Ryb25nUkRlbGltVW5kOmdTLGVzY2FwZTphUyxsaW5rOmtTLG5vbGluazpDdixwdW5jdHVhdGlvbjpsUyxyZWZsaW5rOl92LHJlZmxpbmtTZWFyY2g6eFMsdGFnOmJTLHRleHQ6c1MsdXJsOmtpfSxTUz17Li4ubXAsbGluazp3ZSgvXiE/XFsobGFiZWwpXF1cKCguKj8pXCkvKS5yZXBsYWNlKCJsYWJlbCIsVGwpLmdldFJlZ2V4KCkscmVmbGluazp3ZSgvXiE/XFsobGFiZWwpXF1ccypcWyhbXlxdXSopXF0vKS5yZXBsYWNlKCJsYWJlbCIsVGwpLmdldFJlZ2V4KCl9LG9wPXsuLi5tcCxlbVN0cm9uZ1JEZWxpbUFzdDpoUyxlbVN0cm9uZ0xEZWxpbTpmUyx1cmw6d2UoL14oKD86ZnRwfGh0dHBzPyk6XC9cL3x3d3dcLikoPzpbYS16QS1aMC05XC1dK1wuPykrW15cczxdKnxeZW1haWwvLCJpIikucmVwbGFjZSgiZW1haWwiLC9bQS1aYS16MC05Ll8rLV0rKEApW2EtekEtWjAtOS1fXSsoPzpcLlthLXpBLVowLTktX10qW2EtekEtWjAtOV0pKyg/IVstX10pLykuZ2V0UmVnZXgoKSxfYmFja3BlZGFsOi8oPzpbXj8hLiw6OypfJyJ+KCkmXSt8XChbXildKlwpfCYoPyFbYS16QS1aMC05XSs7JCl8Wz8hLiw6OypfJyJ+KV0rKD8hJCkpKy8sZGVsOi9eKH5+PykoPz1bXlxzfl0pKCg/OlxcLnxbXlxcXSkqPyg/OlxcLnxbXlxzflxcXSkpXDEoPz1bXn5dfCQpLyx0ZXh0Oi9eKFtgfl0rfFteYH5dKSg/Oig/PSB7Mix9XG4pfCg/PVthLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dK0ApfFtcc1xTXSo/KD86KD89W1xcPCFcW2Aqfl9dfFxiX3xodHRwcz86XC9cL3xmdHA6XC9cL3x3d3dcLnwkKXxbXiBdKD89IHsyLH1cbil8W15hLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dKD89W2EtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0rQCkpKS99LEVTPXsuLi5vcCxicjp3ZShTdikucmVwbGFjZSgiezIsfSIsIioiKS5nZXRSZWdleCgpLHRleHQ6d2Uob3AudGV4dCkucmVwbGFjZSgiXFxiXyIsIlxcYl98IHsyLH1cXG4iKS5yZXBsYWNlKC9cezIsXH0vZywiKiIpLmdldFJlZ2V4KCl9LFNsPXtub3JtYWw6cHAsZ2ZtOnJTLHBlZGFudGljOm9TfSx3aT17bm9ybWFsOm1wLGdmbTpvcCxicmVha3M6RVMscGVkYW50aWM6U1N9LFRTPXsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiMzOTsifSxodj1lPT5UU1tlXTtmdW5jdGlvbiBBbihlLHQpe2lmKHQpe2lmKHh0LmVzY2FwZVRlc3QudGVzdChlKSlyZXR1cm4gZS5yZXBsYWNlKHh0LmVzY2FwZVJlcGxhY2UsaHYpfWVsc2UgaWYoeHQuZXNjYXBlVGVzdE5vRW5jb2RlLnRlc3QoZSkpcmV0dXJuIGUucmVwbGFjZSh4dC5lc2NhcGVSZXBsYWNlTm9FbmNvZGUsaHYpO3JldHVybiBlfWZ1bmN0aW9uIGd2KGUpe3RyeXtlPWVuY29kZVVSSShlKS5yZXBsYWNlKHh0LnBlcmNlbnREZWNvZGUsIiUiKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4gZX1mdW5jdGlvbiB5dihlLHQpe2xldCBuPWUucmVwbGFjZSh4dC5maW5kUGlwZSwoYSxpLHMpPT57bGV0IGw9ITEsYz1pO2Zvcig7LS1jPj0wJiZzW2NdPT09IlxcIjspbD0hbDtyZXR1cm4gbD8ifCI6IiB8In0pLHI9bi5zcGxpdCh4dC5zcGxpdFBpcGUpLG89MDtpZihyWzBdLnRyaW0oKXx8ci5zaGlmdCgpLHIubGVuZ3RoPjAmJiFyLmF0KC0xKT8udHJpbSgpJiZyLnBvcCgpLHQpaWYoci5sZW5ndGg+dClyLnNwbGljZSh0KTtlbHNlIGZvcig7ci5sZW5ndGg8dDspci5wdXNoKCIiKTtmb3IoO288ci5sZW5ndGg7bysrKXJbb109cltvXS50cmltKCkucmVwbGFjZSh4dC5zbGFzaFBpcGUsInwiKTtyZXR1cm4gcn1mdW5jdGlvbiBiaShlLHQsbil7bGV0IHI9ZS5sZW5ndGg7aWYocj09PTApcmV0dXJuIiI7bGV0IG89MDtmb3IoO288cjspe2xldCBhPWUuY2hhckF0KHItby0xKTtpZihhPT09dCYmIW4pbysrO2Vsc2UgaWYoYSE9PXQmJm4pbysrO2Vsc2UgYnJlYWt9cmV0dXJuIGUuc2xpY2UoMCxyLW8pfWZ1bmN0aW9uIE5TKGUsdCl7aWYoZS5pbmRleE9mKHRbMV0pPT09LTEpcmV0dXJuLTE7bGV0IG49MDtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPT09IlxcIilyKys7ZWxzZSBpZihlW3JdPT09dFswXSluKys7ZWxzZSBpZihlW3JdPT09dFsxXSYmKG4tLSxuPDApKXJldHVybiByO3JldHVybiBuPjA/LTI6LTF9ZnVuY3Rpb24gdnYoZSx0LG4scixvKXtsZXQgYT10LmhyZWYsaT10LnRpdGxlfHxudWxsLHM9ZVsxXS5yZXBsYWNlKG8ub3RoZXIub3V0cHV0TGlua1JlcGxhY2UsIiQxIik7ci5zdGF0ZS5pbkxpbms9ITA7bGV0IGw9e3R5cGU6ZVswXS5jaGFyQXQoMCk9PT0iISI/ImltYWdlIjoibGluayIscmF3Om4saHJlZjphLHRpdGxlOmksdGV4dDpzLHRva2VuczpyLmlubGluZVRva2VucyhzKX07cmV0dXJuIHIuc3RhdGUuaW5MaW5rPSExLGx9ZnVuY3Rpb24gRFMoZSx0LG4pe2xldCByPWUubWF0Y2gobi5vdGhlci5pbmRlbnRDb2RlQ29tcGVuc2F0aW9uKTtpZihyPT09bnVsbClyZXR1cm4gdDtsZXQgbz1yWzFdO3JldHVybiB0LnNwbGl0KGAKYCkubWFwKGE9PntsZXQgaT1hLm1hdGNoKG4ub3RoZXIuYmVnaW5uaW5nU3BhY2UpO2lmKGk9PT1udWxsKXJldHVybiBhO2xldFtzXT1pO3JldHVybiBzLmxlbmd0aD49by5sZW5ndGg/YS5zbGljZShvLmxlbmd0aCk6YX0pLmpvaW4oYApgKX12YXIgTmw9Y2xhc3N7b3B0aW9ucztydWxlcztsZXhlcjtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wdGlvbnM9ZXx8dW99c3BhY2UoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5uZXdsaW5lLmV4ZWMoZSk7aWYodCYmdFswXS5sZW5ndGg+MClyZXR1cm57dHlwZToic3BhY2UiLHJhdzp0WzBdfX1jb2RlKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suY29kZS5leGVjKGUpO2lmKHQpe2xldCBuPXRbMF0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmNvZGVSZW1vdmVJbmRlbnQsIiIpO3JldHVybnt0eXBlOiJjb2RlIixyYXc6dFswXSxjb2RlQmxvY2tTdHlsZToiaW5kZW50ZWQiLHRleHQ6dGhpcy5vcHRpb25zLnBlZGFudGljP246YmkobixgCmApfX19ZmVuY2VzKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suZmVuY2VzLmV4ZWMoZSk7aWYodCl7bGV0IG49dFswXSxyPURTKG4sdFszXXx8IiIsdGhpcy5ydWxlcyk7cmV0dXJue3R5cGU6ImNvZGUiLHJhdzpuLGxhbmc6dFsyXT90WzJdLnRyaW0oKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLCIkMSIpOnRbMl0sdGV4dDpyfX19aGVhZGluZyhlKXtsZXQgdD10aGlzLnJ1bGVzLmJsb2NrLmhlYWRpbmcuZXhlYyhlKTtpZih0KXtsZXQgbj10WzJdLnRyaW0oKTtpZih0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ0hhc2gudGVzdChuKSl7bGV0IHI9YmkobiwiIyIpOyh0aGlzLm9wdGlvbnMucGVkYW50aWN8fCFyfHx0aGlzLnJ1bGVzLm90aGVyLmVuZGluZ1NwYWNlQ2hhci50ZXN0KHIpKSYmKG49ci50cmltKCkpfXJldHVybnt0eXBlOiJoZWFkaW5nIixyYXc6dFswXSxkZXB0aDp0WzFdLmxlbmd0aCx0ZXh0Om4sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG4pfX19aHIoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5oci5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImhyIixyYXc6YmkodFswXSxgCmApfX1ibG9ja3F1b3RlKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suYmxvY2txdW90ZS5leGVjKGUpO2lmKHQpe2xldCBuPWJpKHRbMF0sYApgKS5zcGxpdChgCmApLHI9IiIsbz0iIixhPVtdO2Zvcig7bi5sZW5ndGg+MDspe2xldCBpPSExLHM9W10sbDtmb3IobD0wO2w8bi5sZW5ndGg7bCsrKWlmKHRoaXMucnVsZXMub3RoZXIuYmxvY2txdW90ZVN0YXJ0LnRlc3QobltsXSkpcy5wdXNoKG5bbF0pLGk9ITA7ZWxzZSBpZighaSlzLnB1c2gobltsXSk7ZWxzZSBicmVhaztuPW4uc2xpY2UobCk7bGV0IGM9cy5qb2luKGAKYCksZD1jLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZSxgCiAgICAkMWApLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5ibG9ja3F1b3RlU2V0ZXh0UmVwbGFjZTIsIiIpO3I9cj9gJHtyfQoke2N9YDpjLG89bz9gJHtvfQoke2R9YDpkO2xldCB1PXRoaXMubGV4ZXIuc3RhdGUudG9wO2lmKHRoaXMubGV4ZXIuc3RhdGUudG9wPSEwLHRoaXMubGV4ZXIuYmxvY2tUb2tlbnMoZCxhLCEwKSx0aGlzLmxleGVyLnN0YXRlLnRvcD11LG4ubGVuZ3RoPT09MClicmVhaztsZXQgcD1hLmF0KC0xKTtpZihwPy50eXBlPT09ImNvZGUiKWJyZWFrO2lmKHA/LnR5cGU9PT0iYmxvY2txdW90ZSIpe2xldCBmPXAseT1mLnJhdytgCmArbi5qb2luKGAKYCksdz10aGlzLmJsb2NrcXVvdGUoeSk7YVthLmxlbmd0aC0xXT13LHI9ci5zdWJzdHJpbmcoMCxyLmxlbmd0aC1mLnJhdy5sZW5ndGgpK3cucmF3LG89by5zdWJzdHJpbmcoMCxvLmxlbmd0aC1mLnRleHQubGVuZ3RoKSt3LnRleHQ7YnJlYWt9ZWxzZSBpZihwPy50eXBlPT09Imxpc3QiKXtsZXQgZj1wLHk9Zi5yYXcrYApgK24uam9pbihgCmApLHc9dGhpcy5saXN0KHkpO2FbYS5sZW5ndGgtMV09dyxyPXIuc3Vic3RyaW5nKDAsci5sZW5ndGgtcC5yYXcubGVuZ3RoKSt3LnJhdyxvPW8uc3Vic3RyaW5nKDAsby5sZW5ndGgtZi5yYXcubGVuZ3RoKSt3LnJhdyxuPXkuc3Vic3RyaW5nKGEuYXQoLTEpLnJhdy5sZW5ndGgpLnNwbGl0KGAKYCk7Y29udGludWV9fXJldHVybnt0eXBlOiJibG9ja3F1b3RlIixyYXc6cix0b2tlbnM6YSx0ZXh0Om99fX1saXN0KGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2subGlzdC5leGVjKGUpO2lmKHQpe2xldCBuPXRbMV0udHJpbSgpLHI9bi5sZW5ndGg+MSxvPXt0eXBlOiJsaXN0IixyYXc6IiIsb3JkZXJlZDpyLHN0YXJ0OnI/K24uc2xpY2UoMCwtMSk6IiIsbG9vc2U6ITEsaXRlbXM6W119O249cj9gXFxkezEsOX1cXCR7bi5zbGljZSgtMSl9YDpgXFwke259YCx0aGlzLm9wdGlvbnMucGVkYW50aWMmJihuPXI/bjoiWyorLV0iKTtsZXQgYT10aGlzLnJ1bGVzLm90aGVyLmxpc3RJdGVtUmVnZXgobiksaT0hMTtmb3IoO2U7KXtsZXQgbD0hMSxjPSIiLGQ9IiI7aWYoISh0PWEuZXhlYyhlKSl8fHRoaXMucnVsZXMuYmxvY2suaHIudGVzdChlKSlicmVhaztjPXRbMF0sZT1lLnN1YnN0cmluZyhjLmxlbmd0aCk7bGV0IHU9dFsyXS5zcGxpdChgCmAsMSlbMF0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFicyx2PT4iICIucmVwZWF0KDMqdi5sZW5ndGgpKSxwPWUuc3BsaXQoYApgLDEpWzBdLGY9IXUudHJpbSgpLHk9MDtpZih0aGlzLm9wdGlvbnMucGVkYW50aWM/KHk9MixkPXUudHJpbVN0YXJ0KCkpOmY/eT10WzFdLmxlbmd0aCsxOih5PXRbMl0uc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKSx5PXk+ND8xOnksZD11LnNsaWNlKHkpLHkrPXRbMV0ubGVuZ3RoKSxmJiZ0aGlzLnJ1bGVzLm90aGVyLmJsYW5rTGluZS50ZXN0KHApJiYoYys9cCtgCmAsZT1lLnN1YnN0cmluZyhwLmxlbmd0aCsxKSxsPSEwKSwhbCl7bGV0IHY9dGhpcy5ydWxlcy5vdGhlci5uZXh0QnVsbGV0UmVnZXgoeSksaD10aGlzLnJ1bGVzLm90aGVyLmhyUmVnZXgoeSksZz10aGlzLnJ1bGVzLm90aGVyLmZlbmNlc0JlZ2luUmVnZXgoeSksbT10aGlzLnJ1bGVzLm90aGVyLmhlYWRpbmdCZWdpblJlZ2V4KHkpLHg9dGhpcy5ydWxlcy5vdGhlci5odG1sQmVnaW5SZWdleCh5KTtmb3IoO2U7KXtsZXQgUz1lLnNwbGl0KGAKYCwxKVswXSxfO2lmKHA9Uyx0aGlzLm9wdGlvbnMucGVkYW50aWM/KHA9cC5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIubGlzdFJlcGxhY2VOZXN0aW5nLCIgICIpLF89cCk6Xz1wLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCIgICAgIiksZy50ZXN0KHApfHxtLnRlc3QocCl8fHgudGVzdChwKXx8di50ZXN0KHApfHxoLnRlc3QocCkpYnJlYWs7aWYoXy5zZWFyY2godGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIpPj15fHwhcC50cmltKCkpZCs9YApgK18uc2xpY2UoeSk7ZWxzZXtpZihmfHx1LnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJDaGFyR2xvYmFsLCIgICAgIikuc2VhcmNoKHRoaXMucnVsZXMub3RoZXIubm9uU3BhY2VDaGFyKT49NHx8Zy50ZXN0KHUpfHxtLnRlc3QodSl8fGgudGVzdCh1KSlicmVhaztkKz1gCmArcH0hZiYmIXAudHJpbSgpJiYoZj0hMCksYys9UytgCmAsZT1lLnN1YnN0cmluZyhTLmxlbmd0aCsxKSx1PV8uc2xpY2UoeSl9fW8ubG9vc2V8fChpP28ubG9vc2U9ITA6dGhpcy5ydWxlcy5vdGhlci5kb3VibGVCbGFua0xpbmUudGVzdChjKSYmKGk9ITApKTtsZXQgdz1udWxsLGI7dGhpcy5vcHRpb25zLmdmbSYmKHc9dGhpcy5ydWxlcy5vdGhlci5saXN0SXNUYXNrLmV4ZWMoZCksdyYmKGI9d1swXSE9PSJbIF0gIixkPWQucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLmxpc3RSZXBsYWNlVGFzaywiIikpKSxvLml0ZW1zLnB1c2goe3R5cGU6Imxpc3RfaXRlbSIscmF3OmMsdGFzazohIXcsY2hlY2tlZDpiLGxvb3NlOiExLHRleHQ6ZCx0b2tlbnM6W119KSxvLnJhdys9Y31sZXQgcz1vLml0ZW1zLmF0KC0xKTtpZihzKXMucmF3PXMucmF3LnRyaW1FbmQoKSxzLnRleHQ9cy50ZXh0LnRyaW1FbmQoKTtlbHNlIHJldHVybjtvLnJhdz1vLnJhdy50cmltRW5kKCk7Zm9yKGxldCBsPTA7bDxvLml0ZW1zLmxlbmd0aDtsKyspaWYodGhpcy5sZXhlci5zdGF0ZS50b3A9ITEsby5pdGVtc1tsXS50b2tlbnM9dGhpcy5sZXhlci5ibG9ja1Rva2VucyhvLml0ZW1zW2xdLnRleHQsW10pLCFvLmxvb3NlKXtsZXQgYz1vLml0ZW1zW2xdLnRva2Vucy5maWx0ZXIodT0+dS50eXBlPT09InNwYWNlIiksZD1jLmxlbmd0aD4wJiZjLnNvbWUodT0+dGhpcy5ydWxlcy5vdGhlci5hbnlMaW5lLnRlc3QodS5yYXcpKTtvLmxvb3NlPWR9aWYoby5sb29zZSlmb3IobGV0IGw9MDtsPG8uaXRlbXMubGVuZ3RoO2wrKylvLml0ZW1zW2xdLmxvb3NlPSEwO3JldHVybiBvfX1odG1sKGUpe2xldCB0PXRoaXMucnVsZXMuYmxvY2suaHRtbC5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6Imh0bWwiLGJsb2NrOiEwLHJhdzp0WzBdLHByZTp0WzFdPT09InByZSJ8fHRbMV09PT0ic2NyaXB0Inx8dFsxXT09PSJzdHlsZSIsdGV4dDp0WzBdfX1kZWYoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5kZWYuZXhlYyhlKTtpZih0KXtsZXQgbj10WzFdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLm11bHRpcGxlU3BhY2VHbG9iYWwsIiAiKSxyPXRbMl0/dFsyXS5yZXBsYWNlKHRoaXMucnVsZXMub3RoZXIuaHJlZkJyYWNrZXRzLCIkMSIpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sIiQxIik6IiIsbz10WzNdP3RbM10uc3Vic3RyaW5nKDEsdFszXS5sZW5ndGgtMSkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwiJDEiKTp0WzNdO3JldHVybnt0eXBlOiJkZWYiLHRhZzpuLHJhdzp0WzBdLGhyZWY6cix0aXRsZTpvfX19dGFibGUoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay50YWJsZS5leGVjKGUpO2lmKCF0fHwhdGhpcy5ydWxlcy5vdGhlci50YWJsZURlbGltaXRlci50ZXN0KHRbMl0pKXJldHVybjtsZXQgbj15dih0WzFdKSxyPXRbMl0ucmVwbGFjZSh0aGlzLnJ1bGVzLm90aGVyLnRhYmxlQWxpZ25DaGFycywiIikuc3BsaXQoInwiKSxvPXRbM10/LnRyaW0oKT90WzNdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci50YWJsZVJvd0JsYW5rTGluZSwiIikuc3BsaXQoYApgKTpbXSxhPXt0eXBlOiJ0YWJsZSIscmF3OnRbMF0saGVhZGVyOltdLGFsaWduOltdLHJvd3M6W119O2lmKG4ubGVuZ3RoPT09ci5sZW5ndGgpe2ZvcihsZXQgaSBvZiByKXRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnblJpZ2h0LnRlc3QoaSk/YS5hbGlnbi5wdXNoKCJyaWdodCIpOnRoaXMucnVsZXMub3RoZXIudGFibGVBbGlnbkNlbnRlci50ZXN0KGkpP2EuYWxpZ24ucHVzaCgiY2VudGVyIik6dGhpcy5ydWxlcy5vdGhlci50YWJsZUFsaWduTGVmdC50ZXN0KGkpP2EuYWxpZ24ucHVzaCgibGVmdCIpOmEuYWxpZ24ucHVzaChudWxsKTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKylhLmhlYWRlci5wdXNoKHt0ZXh0Om5baV0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG5baV0pLGhlYWRlcjohMCxhbGlnbjphLmFsaWduW2ldfSk7Zm9yKGxldCBpIG9mIG8pYS5yb3dzLnB1c2goeXYoaSxhLmhlYWRlci5sZW5ndGgpLm1hcCgocyxsKT0+KHt0ZXh0OnMsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHMpLGhlYWRlcjohMSxhbGlnbjphLmFsaWduW2xdfSkpKTtyZXR1cm4gYX19bGhlYWRpbmcoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5saGVhZGluZy5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzp0WzBdLGRlcHRoOnRbMl0uY2hhckF0KDApPT09Ij0iPzE6Mix0ZXh0OnRbMV0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHRbMV0pfX1wYXJhZ3JhcGgoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay5wYXJhZ3JhcGguZXhlYyhlKTtpZih0KXtsZXQgbj10WzFdLmNoYXJBdCh0WzFdLmxlbmd0aC0xKT09PWAKYD90WzFdLnNsaWNlKDAsLTEpOnRbMV07cmV0dXJue3R5cGU6InBhcmFncmFwaCIscmF3OnRbMF0sdGV4dDpuLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShuKX19fXRleHQoZSl7bGV0IHQ9dGhpcy5ydWxlcy5ibG9jay50ZXh0LmV4ZWMoZSk7aWYodClyZXR1cm57dHlwZToidGV4dCIscmF3OnRbMF0sdGV4dDp0WzBdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZSh0WzBdKX19ZXNjYXBlKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmVzY2FwZS5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImVzY2FwZSIscmF3OnRbMF0sdGV4dDp0WzFdfX10YWcoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWMoZSk7aWYodClyZXR1cm4hdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJnRoaXMucnVsZXMub3RoZXIuc3RhcnRBVGFnLnRlc3QodFswXSk/dGhpcy5sZXhlci5zdGF0ZS5pbkxpbms9ITA6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJnRoaXMucnVsZXMub3RoZXIuZW5kQVRhZy50ZXN0KHRbMF0pJiYodGhpcy5sZXhlci5zdGF0ZS5pbkxpbms9ITEpLCF0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2smJnRoaXMucnVsZXMub3RoZXIuc3RhcnRQcmVTY3JpcHRUYWcudGVzdCh0WzBdKT90aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITA6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrJiZ0aGlzLnJ1bGVzLm90aGVyLmVuZFByZVNjcmlwdFRhZy50ZXN0KHRbMF0pJiYodGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrPSExKSx7dHlwZToiaHRtbCIscmF3OnRbMF0saW5MaW5rOnRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rLGluUmF3QmxvY2s6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrLGJsb2NrOiExLHRleHQ6dFswXX19bGluayhlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS5saW5rLmV4ZWMoZSk7aWYodCl7bGV0IG49dFsyXS50cmltKCk7aWYoIXRoaXMub3B0aW9ucy5wZWRhbnRpYyYmdGhpcy5ydWxlcy5vdGhlci5zdGFydEFuZ2xlQnJhY2tldC50ZXN0KG4pKXtpZighdGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdChuKSlyZXR1cm47bGV0IGE9Ymkobi5zbGljZSgwLC0xKSwiXFwiKTtpZigobi5sZW5ndGgtYS5sZW5ndGgpJTI9PT0wKXJldHVybn1lbHNle2xldCBhPU5TKHRbMl0sIigpIik7aWYoYT09PS0yKXJldHVybjtpZihhPi0xKXtsZXQgcz0odFswXS5pbmRleE9mKCIhIik9PT0wPzU6NCkrdFsxXS5sZW5ndGgrYTt0WzJdPXRbMl0uc3Vic3RyaW5nKDAsYSksdFswXT10WzBdLnN1YnN0cmluZygwLHMpLnRyaW0oKSx0WzNdPSIifX1sZXQgcj10WzJdLG89IiI7aWYodGhpcy5vcHRpb25zLnBlZGFudGljKXtsZXQgYT10aGlzLnJ1bGVzLm90aGVyLnBlZGFudGljSHJlZlRpdGxlLmV4ZWMocik7YSYmKHI9YVsxXSxvPWFbM10pfWVsc2Ugbz10WzNdP3RbM10uc2xpY2UoMSwtMSk6IiI7cmV0dXJuIHI9ci50cmltKCksdGhpcy5ydWxlcy5vdGhlci5zdGFydEFuZ2xlQnJhY2tldC50ZXN0KHIpJiYodGhpcy5vcHRpb25zLnBlZGFudGljJiYhdGhpcy5ydWxlcy5vdGhlci5lbmRBbmdsZUJyYWNrZXQudGVzdChuKT9yPXIuc2xpY2UoMSk6cj1yLnNsaWNlKDEsLTEpKSx2dih0LHtocmVmOnImJnIucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbiwiJDEiKSx0aXRsZTpvJiZvLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24sIiQxIil9LHRbMF0sdGhpcy5sZXhlcix0aGlzLnJ1bGVzKX19cmVmbGluayhlLHQpe2xldCBuO2lmKChuPXRoaXMucnVsZXMuaW5saW5lLnJlZmxpbmsuZXhlYyhlKSl8fChuPXRoaXMucnVsZXMuaW5saW5lLm5vbGluay5leGVjKGUpKSl7bGV0IHI9KG5bMl18fG5bMV0pLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5tdWx0aXBsZVNwYWNlR2xvYmFsLCIgIiksbz10W3IudG9Mb3dlckNhc2UoKV07aWYoIW8pe2xldCBhPW5bMF0uY2hhckF0KDApO3JldHVybnt0eXBlOiJ0ZXh0IixyYXc6YSx0ZXh0OmF9fXJldHVybiB2dihuLG8sblswXSx0aGlzLmxleGVyLHRoaXMucnVsZXMpfX1lbVN0cm9uZyhlLHQsbj0iIil7bGV0IHI9dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdMRGVsaW0uZXhlYyhlKTtpZighcnx8clszXSYmbi5tYXRjaCh0aGlzLnJ1bGVzLm90aGVyLnVuaWNvZGVBbHBoYU51bWVyaWMpKXJldHVybjtpZighKHJbMV18fHJbMl18fCIiKXx8IW58fHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMobikpe2xldCBhPVsuLi5yWzBdXS5sZW5ndGgtMSxpLHMsbD1hLGM9MCxkPXJbMF1bMF09PT0iKiI/dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1Bc3Q6dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmdSRGVsaW1VbmQ7Zm9yKGQubGFzdEluZGV4PTAsdD10LnNsaWNlKC0xKmUubGVuZ3RoK2EpOyhyPWQuZXhlYyh0KSkhPW51bGw7KXtpZihpPXJbMV18fHJbMl18fHJbM118fHJbNF18fHJbNV18fHJbNl0sIWkpY29udGludWU7aWYocz1bLi4uaV0ubGVuZ3RoLHJbM118fHJbNF0pe2wrPXM7Y29udGludWV9ZWxzZSBpZigocls1XXx8cls2XSkmJmElMyYmISgoYStzKSUzKSl7Yys9cztjb250aW51ZX1pZihsLT1zLGw+MCljb250aW51ZTtzPU1hdGgubWluKHMscytsK2MpO2xldCB1PVsuLi5yWzBdXVswXS5sZW5ndGgscD1lLnNsaWNlKDAsYStyLmluZGV4K3Urcyk7aWYoTWF0aC5taW4oYSxzKSUyKXtsZXQgeT1wLnNsaWNlKDEsLTEpO3JldHVybnt0eXBlOiJlbSIscmF3OnAsdGV4dDp5LHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2Vucyh5KX19bGV0IGY9cC5zbGljZSgyLC0yKTtyZXR1cm57dHlwZToic3Ryb25nIixyYXc6cCx0ZXh0OmYsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKGYpfX19fWNvZGVzcGFuKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmNvZGUuZXhlYyhlKTtpZih0KXtsZXQgbj10WzJdLnJlcGxhY2UodGhpcy5ydWxlcy5vdGhlci5uZXdMaW5lQ2hhckdsb2JhbCwiICIpLHI9dGhpcy5ydWxlcy5vdGhlci5ub25TcGFjZUNoYXIudGVzdChuKSxvPXRoaXMucnVsZXMub3RoZXIuc3RhcnRpbmdTcGFjZUNoYXIudGVzdChuKSYmdGhpcy5ydWxlcy5vdGhlci5lbmRpbmdTcGFjZUNoYXIudGVzdChuKTtyZXR1cm4gciYmbyYmKG49bi5zdWJzdHJpbmcoMSxuLmxlbmd0aC0xKSkse3R5cGU6ImNvZGVzcGFuIixyYXc6dFswXSx0ZXh0Om59fX1icihlKXtsZXQgdD10aGlzLnJ1bGVzLmlubGluZS5ici5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImJyIixyYXc6dFswXX19ZGVsKGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLmRlbC5leGVjKGUpO2lmKHQpcmV0dXJue3R5cGU6ImRlbCIscmF3OnRbMF0sdGV4dDp0WzJdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2Vucyh0WzJdKX19YXV0b2xpbmsoZSl7bGV0IHQ9dGhpcy5ydWxlcy5pbmxpbmUuYXV0b2xpbmsuZXhlYyhlKTtpZih0KXtsZXQgbixyO3JldHVybiB0WzJdPT09IkAiPyhuPXRbMV0scj0ibWFpbHRvOiIrbik6KG49dFsxXSxyPW4pLHt0eXBlOiJsaW5rIixyYXc6dFswXSx0ZXh0Om4saHJlZjpyLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpuLHRleHQ6bn1dfX19dXJsKGUpe2xldCB0O2lmKHQ9dGhpcy5ydWxlcy5pbmxpbmUudXJsLmV4ZWMoZSkpe2xldCBuLHI7aWYodFsyXT09PSJAIiluPXRbMF0scj0ibWFpbHRvOiIrbjtlbHNle2xldCBvO2RvIG89dFswXSx0WzBdPXRoaXMucnVsZXMuaW5saW5lLl9iYWNrcGVkYWwuZXhlYyh0WzBdKT8uWzBdPz8iIjt3aGlsZShvIT09dFswXSk7bj10WzBdLHRbMV09PT0id3d3LiI/cj0iaHR0cDovLyIrdFswXTpyPXRbMF19cmV0dXJue3R5cGU6ImxpbmsiLHJhdzp0WzBdLHRleHQ6bixocmVmOnIsdG9rZW5zOlt7dHlwZToidGV4dCIscmF3Om4sdGV4dDpufV19fX1pbmxpbmVUZXh0KGUpe2xldCB0PXRoaXMucnVsZXMuaW5saW5lLnRleHQuZXhlYyhlKTtpZih0KXtsZXQgbj10aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s7cmV0dXJue3R5cGU6InRleHQiLHJhdzp0WzBdLHRleHQ6dFswXSxlc2NhcGVkOm59fX19LFFuPWNsYXNzIGFwe3Rva2VucztvcHRpb25zO3N0YXRlO3Rva2VuaXplcjtpbmxpbmVRdWV1ZTtjb25zdHJ1Y3Rvcih0KXt0aGlzLnRva2Vucz1bXSx0aGlzLnRva2Vucy5saW5rcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMub3B0aW9ucz10fHx1byx0aGlzLm9wdGlvbnMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXJ8fG5ldyBObCx0aGlzLnRva2VuaXplcj10aGlzLm9wdGlvbnMudG9rZW5pemVyLHRoaXMudG9rZW5pemVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMudG9rZW5pemVyLmxleGVyPXRoaXMsdGhpcy5pbmxpbmVRdWV1ZT1bXSx0aGlzLnN0YXRlPXtpbkxpbms6ITEsaW5SYXdCbG9jazohMSx0b3A6ITB9O2xldCBuPXtvdGhlcjp4dCxibG9jazpTbC5ub3JtYWwsaW5saW5lOndpLm5vcm1hbH07dGhpcy5vcHRpb25zLnBlZGFudGljPyhuLmJsb2NrPVNsLnBlZGFudGljLG4uaW5saW5lPXdpLnBlZGFudGljKTp0aGlzLm9wdGlvbnMuZ2ZtJiYobi5ibG9jaz1TbC5nZm0sdGhpcy5vcHRpb25zLmJyZWFrcz9uLmlubGluZT13aS5icmVha3M6bi5pbmxpbmU9d2kuZ2ZtKSx0aGlzLnRva2VuaXplci5ydWxlcz1ufXN0YXRpYyBnZXQgcnVsZXMoKXtyZXR1cm57YmxvY2s6U2wsaW5saW5lOndpfX1zdGF0aWMgbGV4KHQsbil7cmV0dXJuIG5ldyBhcChuKS5sZXgodCl9c3RhdGljIGxleElubGluZSh0LG4pe3JldHVybiBuZXcgYXAobikuaW5saW5lVG9rZW5zKHQpfWxleCh0KXt0PXQucmVwbGFjZSh4dC5jYXJyaWFnZVJldHVybixgCmApLHRoaXMuYmxvY2tUb2tlbnModCx0aGlzLnRva2Vucyk7Zm9yKGxldCBuPTA7bjx0aGlzLmlubGluZVF1ZXVlLmxlbmd0aDtuKyspe2xldCByPXRoaXMuaW5saW5lUXVldWVbbl07dGhpcy5pbmxpbmVUb2tlbnMoci5zcmMsci50b2tlbnMpfXJldHVybiB0aGlzLmlubGluZVF1ZXVlPVtdLHRoaXMudG9rZW5zfWJsb2NrVG9rZW5zKHQsbj1bXSxyPSExKXtmb3IodGhpcy5vcHRpb25zLnBlZGFudGljJiYodD10LnJlcGxhY2UoeHQudGFiQ2hhckdsb2JhbCwiICAgICIpLnJlcGxhY2UoeHQuc3BhY2VMaW5lLCIiKSk7dDspe2xldCBvO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5ibG9jaz8uc29tZShpPT4obz1pLmNhbGwoe2xleGVyOnRoaXN9LHQsbikpPyh0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pLCEwKTohMSkpY29udGludWU7aWYobz10aGlzLnRva2VuaXplci5zcGFjZSh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpO2xldCBpPW4uYXQoLTEpO28ucmF3Lmxlbmd0aD09PTEmJmkhPT12b2lkIDA/aS5yYXcrPWAKYDpuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5jb2RlKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCk7bGV0IGk9bi5hdCgtMSk7aT8udHlwZT09PSJwYXJhZ3JhcGgifHxpPy50eXBlPT09InRleHQiPyhpLnJhdys9YApgK28ucmF3LGkudGV4dCs9YApgK28udGV4dCx0aGlzLmlubGluZVF1ZXVlLmF0KC0xKS5zcmM9aS50ZXh0KTpuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5mZW5jZXModCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5oZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIuaHIodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5ibG9ja3F1b3RlKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pO2NvbnRpbnVlfWlmKG89dGhpcy50b2tlbml6ZXIubGlzdCh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLG4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmh0bWwodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKSxuLnB1c2gobyk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci5kZWYodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKTtsZXQgaT1uLmF0KC0xKTtpPy50eXBlPT09InBhcmFncmFwaCJ8fGk/LnR5cGU9PT0idGV4dCI/KGkucmF3Kz1gCmArby5yYXcsaS50ZXh0Kz1gCmArby5yYXcsdGhpcy5pbmxpbmVRdWV1ZS5hdCgtMSkuc3JjPWkudGV4dCk6dGhpcy50b2tlbnMubGlua3Nbby50YWddfHwodGhpcy50b2tlbnMubGlua3Nbby50YWddPXtocmVmOm8uaHJlZix0aXRsZTpvLnRpdGxlfSk7Y29udGludWV9aWYobz10aGlzLnRva2VuaXplci50YWJsZSh0KSl7dD10LnN1YnN0cmluZyhvLnJhdy5sZW5ndGgpLG4ucHVzaChvKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLmxoZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKG8ucmF3Lmxlbmd0aCksbi5wdXNoKG8pO2NvbnRpbnVlfWxldCBhPXQ7aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnM/LnN0YXJ0QmxvY2spe2xldCBpPTEvMCxzPXQuc2xpY2UoMSksbDt0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrLmZvckVhY2goYz0+e2w9Yy5jYWxsKHtsZXhlcjp0aGlzfSxzKSx0eXBlb2YgbD09Im51bWJlciImJmw+PTAmJihpPU1hdGgubWluKGksbCkpfSksaTwxLzAmJmk+PTAmJihhPXQuc3Vic3RyaW5nKDAsaSsxKSl9aWYodGhpcy5zdGF0ZS50b3AmJihvPXRoaXMudG9rZW5pemVyLnBhcmFncmFwaChhKSkpe2xldCBpPW4uYXQoLTEpO3ImJmk/LnR5cGU9PT0icGFyYWdyYXBoIj8oaS5yYXcrPWAKYCtvLnJhdyxpLnRleHQrPWAKYCtvLnRleHQsdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKSx0aGlzLmlubGluZVF1ZXVlLmF0KC0xKS5zcmM9aS50ZXh0KTpuLnB1c2gobykscj1hLmxlbmd0aCE9PXQubGVuZ3RoLHQ9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKTtjb250aW51ZX1pZihvPXRoaXMudG9rZW5pemVyLnRleHQodCkpe3Q9dC5zdWJzdHJpbmcoby5yYXcubGVuZ3RoKTtsZXQgaT1uLmF0KC0xKTtpPy50eXBlPT09InRleHQiPyhpLnJhdys9YApgK28ucmF3LGkudGV4dCs9YApgK28udGV4dCx0aGlzLmlubGluZVF1ZXVlLnBvcCgpLHRoaXMuaW5saW5lUXVldWUuYXQoLTEpLnNyYz1pLnRleHQpOm4ucHVzaChvKTtjb250aW51ZX1pZih0KXtsZXQgaT0iSW5maW5pdGUgbG9vcCBvbiBieXRlOiAiK3QuY2hhckNvZGVBdCgwKTtpZih0aGlzLm9wdGlvbnMuc2lsZW50KXtjb25zb2xlLmVycm9yKGkpO2JyZWFrfWVsc2UgdGhyb3cgbmV3IEVycm9yKGkpfX1yZXR1cm4gdGhpcy5zdGF0ZS50b3A9ITAsbn1pbmxpbmUodCxuPVtdKXtyZXR1cm4gdGhpcy5pbmxpbmVRdWV1ZS5wdXNoKHtzcmM6dCx0b2tlbnM6bn0pLG59aW5saW5lVG9rZW5zKHQsbj1bXSl7bGV0IHI9dCxvPW51bGw7aWYodGhpcy50b2tlbnMubGlua3Mpe2xldCBzPU9iamVjdC5rZXlzKHRoaXMudG9rZW5zLmxpbmtzKTtpZihzLmxlbmd0aD4wKWZvcig7KG89dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2guZXhlYyhyKSkhPW51bGw7KXMuaW5jbHVkZXMob1swXS5zbGljZShvWzBdLmxhc3RJbmRleE9mKCJbIikrMSwtMSkpJiYocj1yLnNsaWNlKDAsby5pbmRleCkrIlsiKyJhIi5yZXBlYXQob1swXS5sZW5ndGgtMikrIl0iK3Iuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KSl9Zm9yKDsobz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24uZXhlYyhyKSkhPW51bGw7KXI9ci5zbGljZSgwLG8uaW5kZXgpKyIrKyIrci5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24ubGFzdEluZGV4KTtmb3IoOyhvPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAuZXhlYyhyKSkhPW51bGw7KXI9ci5zbGljZSgwLG8uaW5kZXgpKyJbIisiYSIucmVwZWF0KG9bMF0ubGVuZ3RoLTIpKyJdIityLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAubGFzdEluZGV4KTtsZXQgYT0hMSxpPSIiO2Zvcig7dDspe2F8fChpPSIiKSxhPSExO2xldCBzO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5pbmxpbmU/LnNvbWUoYz0+KHM9Yy5jYWxsKHtsZXhlcjp0aGlzfSx0LG4pKT8odD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKSwhMCk6ITEpKWNvbnRpbnVlO2lmKHM9dGhpcy50b2tlbml6ZXIuZXNjYXBlKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIudGFnKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIubGluayh0KSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1pZihzPXRoaXMudG9rZW5pemVyLnJlZmxpbmsodCx0aGlzLnRva2Vucy5saW5rcykpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKTtsZXQgYz1uLmF0KC0xKTtzLnR5cGU9PT0idGV4dCImJmM/LnR5cGU9PT0idGV4dCI/KGMucmF3Kz1zLnJhdyxjLnRleHQrPXMudGV4dCk6bi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIuZW1TdHJvbmcodCxyLGkpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKHM9dGhpcy50b2tlbml6ZXIuY29kZXNwYW4odCkpe3Q9dC5zdWJzdHJpbmcocy5yYXcubGVuZ3RoKSxuLnB1c2gocyk7Y29udGludWV9aWYocz10aGlzLnRva2VuaXplci5icih0KSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1pZihzPXRoaXMudG9rZW5pemVyLmRlbCh0KSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1pZihzPXRoaXMudG9rZW5pemVyLmF1dG9saW5rKHQpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCksbi5wdXNoKHMpO2NvbnRpbnVlfWlmKCF0aGlzLnN0YXRlLmluTGluayYmKHM9dGhpcy50b2tlbml6ZXIudXJsKHQpKSl7dD10LnN1YnN0cmluZyhzLnJhdy5sZW5ndGgpLG4ucHVzaChzKTtjb250aW51ZX1sZXQgbD10O2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5zdGFydElubGluZSl7bGV0IGM9MS8wLGQ9dC5zbGljZSgxKSx1O3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0SW5saW5lLmZvckVhY2gocD0+e3U9cC5jYWxsKHtsZXhlcjp0aGlzfSxkKSx0eXBlb2YgdT09Im51bWJlciImJnU+PTAmJihjPU1hdGgubWluKGMsdSkpfSksYzwxLzAmJmM+PTAmJihsPXQuc3Vic3RyaW5nKDAsYysxKSl9aWYocz10aGlzLnRva2VuaXplci5pbmxpbmVUZXh0KGwpKXt0PXQuc3Vic3RyaW5nKHMucmF3Lmxlbmd0aCkscy5yYXcuc2xpY2UoLTEpIT09Il8iJiYoaT1zLnJhdy5zbGljZSgtMSkpLGE9ITA7bGV0IGM9bi5hdCgtMSk7Yz8udHlwZT09PSJ0ZXh0Ij8oYy5yYXcrPXMucmF3LGMudGV4dCs9cy50ZXh0KTpuLnB1c2gocyk7Y29udGludWV9aWYodCl7bGV0IGM9IkluZmluaXRlIGxvb3Agb24gYnl0ZTogIit0LmNoYXJDb2RlQXQoMCk7aWYodGhpcy5vcHRpb25zLnNpbGVudCl7Y29uc29sZS5lcnJvcihjKTticmVha31lbHNlIHRocm93IG5ldyBFcnJvcihjKX19cmV0dXJuIG59fSxEbD1jbGFzc3tvcHRpb25zO3BhcnNlcjtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wdGlvbnM9ZXx8dW99c3BhY2UoZSl7cmV0dXJuIiJ9Y29kZSh7dGV4dDplLGxhbmc6dCxlc2NhcGVkOm59KXtsZXQgcj0odHx8IiIpLm1hdGNoKHh0Lm5vdFNwYWNlU3RhcnQpPy5bMF0sbz1lLnJlcGxhY2UoeHQuZW5kaW5nTmV3bGluZSwiIikrYApgO3JldHVybiByPyc8cHJlPjxjb2RlIGNsYXNzPSJsYW5ndWFnZS0nK0FuKHIpKyciPicrKG4/bzpBbihvLCEwKSkrYDwvY29kZT48L3ByZT4KYDoiPHByZT48Y29kZT4iKyhuP286QW4obywhMCkpK2A8L2NvZGU+PC9wcmU+CmB9YmxvY2txdW90ZSh7dG9rZW5zOmV9KXtyZXR1cm5gPGJsb2NrcXVvdGU+CiR7dGhpcy5wYXJzZXIucGFyc2UoZSl9PC9ibG9ja3F1b3RlPgpgfWh0bWwoe3RleHQ6ZX0pe3JldHVybiBlfWhlYWRpbmcoe3Rva2VuczplLGRlcHRoOnR9KXtyZXR1cm5gPGgke3R9PiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9oJHt0fT4KYH1ocihlKXtyZXR1cm5gPGhyPgpgfWxpc3QoZSl7bGV0IHQ9ZS5vcmRlcmVkLG49ZS5zdGFydCxyPSIiO2ZvcihsZXQgaT0wO2k8ZS5pdGVtcy5sZW5ndGg7aSsrKXtsZXQgcz1lLml0ZW1zW2ldO3IrPXRoaXMubGlzdGl0ZW0ocyl9bGV0IG89dD8ib2wiOiJ1bCIsYT10JiZuIT09MT8nIHN0YXJ0PSInK24rJyInOiIiO3JldHVybiI8IitvK2ErYD4KYCtyKyI8LyIrbytgPgpgfWxpc3RpdGVtKGUpe2xldCB0PSIiO2lmKGUudGFzayl7bGV0IG49dGhpcy5jaGVja2JveCh7Y2hlY2tlZDohIWUuY2hlY2tlZH0pO2UubG9vc2U/ZS50b2tlbnNbMF0/LnR5cGU9PT0icGFyYWdyYXBoIj8oZS50b2tlbnNbMF0udGV4dD1uKyIgIitlLnRva2Vuc1swXS50ZXh0LGUudG9rZW5zWzBdLnRva2VucyYmZS50b2tlbnNbMF0udG9rZW5zLmxlbmd0aD4wJiZlLnRva2Vuc1swXS50b2tlbnNbMF0udHlwZT09PSJ0ZXh0IiYmKGUudG9rZW5zWzBdLnRva2Vuc1swXS50ZXh0PW4rIiAiK0FuKGUudG9rZW5zWzBdLnRva2Vuc1swXS50ZXh0KSxlLnRva2Vuc1swXS50b2tlbnNbMF0uZXNjYXBlZD0hMCkpOmUudG9rZW5zLnVuc2hpZnQoe3R5cGU6InRleHQiLHJhdzpuKyIgIix0ZXh0Om4rIiAiLGVzY2FwZWQ6ITB9KTp0Kz1uKyIgIn1yZXR1cm4gdCs9dGhpcy5wYXJzZXIucGFyc2UoZS50b2tlbnMsISFlLmxvb3NlKSxgPGxpPiR7dH08L2xpPgpgfWNoZWNrYm94KHtjaGVja2VkOmV9KXtyZXR1cm4iPGlucHV0ICIrKGU/J2NoZWNrZWQ9IiIgJzoiIikrJ2Rpc2FibGVkPSIiIHR5cGU9ImNoZWNrYm94Ij4nfXBhcmFncmFwaCh7dG9rZW5zOmV9KXtyZXR1cm5gPHA+JHt0aGlzLnBhcnNlci5wYXJzZUlubGluZShlKX08L3A+CmB9dGFibGUoZSl7bGV0IHQ9IiIsbj0iIjtmb3IobGV0IG89MDtvPGUuaGVhZGVyLmxlbmd0aDtvKyspbis9dGhpcy50YWJsZWNlbGwoZS5oZWFkZXJbb10pO3QrPXRoaXMudGFibGVyb3coe3RleHQ6bn0pO2xldCByPSIiO2ZvcihsZXQgbz0wO288ZS5yb3dzLmxlbmd0aDtvKyspe2xldCBhPWUucm93c1tvXTtuPSIiO2ZvcihsZXQgaT0wO2k8YS5sZW5ndGg7aSsrKW4rPXRoaXMudGFibGVjZWxsKGFbaV0pO3IrPXRoaXMudGFibGVyb3coe3RleHQ6bn0pfXJldHVybiByJiYocj1gPHRib2R5PiR7cn08L3Rib2R5PmApLGA8dGFibGU+Cjx0aGVhZD4KYCt0K2A8L3RoZWFkPgpgK3IrYDwvdGFibGU+CmB9dGFibGVyb3coe3RleHQ6ZX0pe3JldHVybmA8dHI+CiR7ZX08L3RyPgpgfXRhYmxlY2VsbChlKXtsZXQgdD10aGlzLnBhcnNlci5wYXJzZUlubGluZShlLnRva2Vucyksbj1lLmhlYWRlcj8idGgiOiJ0ZCI7cmV0dXJuKGUuYWxpZ24/YDwke259IGFsaWduPSIke2UuYWxpZ259Ij5gOmA8JHtufT5gKSt0K2A8LyR7bn0+CmB9c3Ryb25nKHt0b2tlbnM6ZX0pe3JldHVybmA8c3Ryb25nPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9zdHJvbmc+YH1lbSh7dG9rZW5zOmV9KXtyZXR1cm5gPGVtPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9lbT5gfWNvZGVzcGFuKHt0ZXh0OmV9KXtyZXR1cm5gPGNvZGU+JHtBbihlLCEwKX08L2NvZGU+YH1icihlKXtyZXR1cm4iPGJyPiJ9ZGVsKHt0b2tlbnM6ZX0pe3JldHVybmA8ZGVsPiR7dGhpcy5wYXJzZXIucGFyc2VJbmxpbmUoZSl9PC9kZWw+YH1saW5rKHtocmVmOmUsdGl0bGU6dCx0b2tlbnM6bn0pe2xldCByPXRoaXMucGFyc2VyLnBhcnNlSW5saW5lKG4pLG89Z3YoZSk7aWYobz09PW51bGwpcmV0dXJuIHI7ZT1vO2xldCBhPSc8YSBocmVmPSInK2UrJyInO3JldHVybiB0JiYoYSs9JyB0aXRsZT0iJytBbih0KSsnIicpLGErPSI+IityKyI8L2E+IixhfWltYWdlKHtocmVmOmUsdGl0bGU6dCx0ZXh0Om4sdG9rZW5zOnJ9KXtyJiYobj10aGlzLnBhcnNlci5wYXJzZUlubGluZShyLHRoaXMucGFyc2VyLnRleHRSZW5kZXJlcikpO2xldCBvPWd2KGUpO2lmKG89PT1udWxsKXJldHVybiBBbihuKTtlPW87bGV0IGE9YDxpbWcgc3JjPSIke2V9IiBhbHQ9IiR7bn0iYDtyZXR1cm4gdCYmKGErPWAgdGl0bGU9IiR7QW4odCl9ImApLGErPSI+IixhfXRleHQoZSl7cmV0dXJuInRva2VucyJpbiBlJiZlLnRva2Vucz90aGlzLnBhcnNlci5wYXJzZUlubGluZShlLnRva2Vucyk6ImVzY2FwZWQiaW4gZSYmZS5lc2NhcGVkP2UudGV4dDpBbihlLnRleHQpfX0sU2k9Y2xhc3N7c3Ryb25nKHt0ZXh0OmV9KXtyZXR1cm4gZX1lbSh7dGV4dDplfSl7cmV0dXJuIGV9Y29kZXNwYW4oe3RleHQ6ZX0pe3JldHVybiBlfWRlbCh7dGV4dDplfSl7cmV0dXJuIGV9aHRtbCh7dGV4dDplfSl7cmV0dXJuIGV9dGV4dCh7dGV4dDplfSl7cmV0dXJuIGV9bGluayh7dGV4dDplfSl7cmV0dXJuIiIrZX1pbWFnZSh7dGV4dDplfSl7cmV0dXJuIiIrZX1icigpe3JldHVybiIifX0sSm49Y2xhc3MgaXB7b3B0aW9ucztyZW5kZXJlcjt0ZXh0UmVuZGVyZXI7Y29uc3RydWN0b3IodCl7dGhpcy5vcHRpb25zPXR8fHVvLHRoaXMub3B0aW9ucy5yZW5kZXJlcj10aGlzLm9wdGlvbnMucmVuZGVyZXJ8fG5ldyBEbCx0aGlzLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcix0aGlzLnJlbmRlcmVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMucmVuZGVyZXIucGFyc2VyPXRoaXMsdGhpcy50ZXh0UmVuZGVyZXI9bmV3IFNpfXN0YXRpYyBwYXJzZSh0LG4pe3JldHVybiBuZXcgaXAobikucGFyc2UodCl9c3RhdGljIHBhcnNlSW5saW5lKHQsbil7cmV0dXJuIG5ldyBpcChuKS5wYXJzZUlubGluZSh0KX1wYXJzZSh0LG49ITApe2xldCByPSIiO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtsZXQgYT10W29dO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zPy5yZW5kZXJlcnM/LlthLnR5cGVdKXtsZXQgcz1hLGw9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW3MudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LHMpO2lmKGwhPT0hMXx8IVsic3BhY2UiLCJociIsImhlYWRpbmciLCJjb2RlIiwidGFibGUiLCJibG9ja3F1b3RlIiwibGlzdCIsImh0bWwiLCJwYXJhZ3JhcGgiLCJ0ZXh0Il0uaW5jbHVkZXMocy50eXBlKSl7cis9bHx8IiI7Y29udGludWV9fWxldCBpPWE7c3dpdGNoKGkudHlwZSl7Y2FzZSJzcGFjZSI6e3IrPXRoaXMucmVuZGVyZXIuc3BhY2UoaSk7Y29udGludWV9Y2FzZSJociI6e3IrPXRoaXMucmVuZGVyZXIuaHIoaSk7Y29udGludWV9Y2FzZSJoZWFkaW5nIjp7cis9dGhpcy5yZW5kZXJlci5oZWFkaW5nKGkpO2NvbnRpbnVlfWNhc2UiY29kZSI6e3IrPXRoaXMucmVuZGVyZXIuY29kZShpKTtjb250aW51ZX1jYXNlInRhYmxlIjp7cis9dGhpcy5yZW5kZXJlci50YWJsZShpKTtjb250aW51ZX1jYXNlImJsb2NrcXVvdGUiOntyKz10aGlzLnJlbmRlcmVyLmJsb2NrcXVvdGUoaSk7Y29udGludWV9Y2FzZSJsaXN0Ijp7cis9dGhpcy5yZW5kZXJlci5saXN0KGkpO2NvbnRpbnVlfWNhc2UiaHRtbCI6e3IrPXRoaXMucmVuZGVyZXIuaHRtbChpKTtjb250aW51ZX1jYXNlInBhcmFncmFwaCI6e3IrPXRoaXMucmVuZGVyZXIucGFyYWdyYXBoKGkpO2NvbnRpbnVlfWNhc2UidGV4dCI6e2xldCBzPWksbD10aGlzLnJlbmRlcmVyLnRleHQocyk7Zm9yKDtvKzE8dC5sZW5ndGgmJnRbbysxXS50eXBlPT09InRleHQiOylzPXRbKytvXSxsKz1gCmArdGhpcy5yZW5kZXJlci50ZXh0KHMpO24/cis9dGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgoe3R5cGU6InBhcmFncmFwaCIscmF3OmwsdGV4dDpsLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpsLHRleHQ6bCxlc2NhcGVkOiEwfV19KTpyKz1sO2NvbnRpbnVlfWRlZmF1bHQ6e2xldCBzPSdUb2tlbiB3aXRoICInK2kudHlwZSsnIiB0eXBlIHdhcyBub3QgZm91bmQuJztpZih0aGlzLm9wdGlvbnMuc2lsZW50KXJldHVybiBjb25zb2xlLmVycm9yKHMpLCIiO3Rocm93IG5ldyBFcnJvcihzKX19fXJldHVybiByfXBhcnNlSW5saW5lKHQsbj10aGlzLnJlbmRlcmVyKXtsZXQgcj0iIjtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7bGV0IGE9dFtvXTtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucz8ucmVuZGVyZXJzPy5bYS50eXBlXSl7bGV0IHM9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2EudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LGEpO2lmKHMhPT0hMXx8IVsiZXNjYXBlIiwiaHRtbCIsImxpbmsiLCJpbWFnZSIsInN0cm9uZyIsImVtIiwiY29kZXNwYW4iLCJiciIsImRlbCIsInRleHQiXS5pbmNsdWRlcyhhLnR5cGUpKXtyKz1zfHwiIjtjb250aW51ZX19bGV0IGk9YTtzd2l0Y2goaS50eXBlKXtjYXNlImVzY2FwZSI6e3IrPW4udGV4dChpKTticmVha31jYXNlImh0bWwiOntyKz1uLmh0bWwoaSk7YnJlYWt9Y2FzZSJsaW5rIjp7cis9bi5saW5rKGkpO2JyZWFrfWNhc2UiaW1hZ2UiOntyKz1uLmltYWdlKGkpO2JyZWFrfWNhc2Uic3Ryb25nIjp7cis9bi5zdHJvbmcoaSk7YnJlYWt9Y2FzZSJlbSI6e3IrPW4uZW0oaSk7YnJlYWt9Y2FzZSJjb2Rlc3BhbiI6e3IrPW4uY29kZXNwYW4oaSk7YnJlYWt9Y2FzZSJiciI6e3IrPW4uYnIoaSk7YnJlYWt9Y2FzZSJkZWwiOntyKz1uLmRlbChpKTticmVha31jYXNlInRleHQiOntyKz1uLnRleHQoaSk7YnJlYWt9ZGVmYXVsdDp7bGV0IHM9J1Rva2VuIHdpdGggIicraS50eXBlKyciIHR5cGUgd2FzIG5vdCBmb3VuZC4nO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIGNvbnNvbGUuZXJyb3IocyksIiI7dGhyb3cgbmV3IEVycm9yKHMpfX19cmV0dXJuIHJ9fSxFbD1jbGFzc3tvcHRpb25zO2Jsb2NrO2NvbnN0cnVjdG9yKGUpe3RoaXMub3B0aW9ucz1lfHx1b31zdGF0aWMgcGFzc1Rocm91Z2hIb29rcz1uZXcgU2V0KFsicHJlcHJvY2VzcyIsInBvc3Rwcm9jZXNzIiwicHJvY2Vzc0FsbFRva2VucyJdKTtwcmVwcm9jZXNzKGUpe3JldHVybiBlfXBvc3Rwcm9jZXNzKGUpe3JldHVybiBlfXByb2Nlc3NBbGxUb2tlbnMoZSl7cmV0dXJuIGV9cHJvdmlkZUxleGVyKCl7cmV0dXJuIHRoaXMuYmxvY2s/UW4ubGV4OlFuLmxleElubGluZX1wcm92aWRlUGFyc2VyKCl7cmV0dXJuIHRoaXMuYmxvY2s/Sm4ucGFyc2U6Sm4ucGFyc2VJbmxpbmV9fSxfUz1jbGFzc3tkZWZhdWx0cz1zcCgpO29wdGlvbnM9dGhpcy5zZXRPcHRpb25zO3BhcnNlPXRoaXMucGFyc2VNYXJrZG93bighMCk7cGFyc2VJbmxpbmU9dGhpcy5wYXJzZU1hcmtkb3duKCExKTtQYXJzZXI9Sm47UmVuZGVyZXI9RGw7VGV4dFJlbmRlcmVyPVNpO0xleGVyPVFuO1Rva2VuaXplcj1ObDtIb29rcz1FbDtjb25zdHJ1Y3RvciguLi5lKXt0aGlzLnVzZSguLi5lKX13YWxrVG9rZW5zKGUsdCl7bGV0IG49W107Zm9yKGxldCByIG9mIGUpc3dpdGNoKG49bi5jb25jYXQodC5jYWxsKHRoaXMscikpLHIudHlwZSl7Y2FzZSJ0YWJsZSI6e2xldCBvPXI7Zm9yKGxldCBhIG9mIG8uaGVhZGVyKW49bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKGEudG9rZW5zLHQpKTtmb3IobGV0IGEgb2Ygby5yb3dzKWZvcihsZXQgaSBvZiBhKW49bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKGkudG9rZW5zLHQpKTticmVha31jYXNlImxpc3QiOntsZXQgbz1yO249bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKG8uaXRlbXMsdCkpO2JyZWFrfWRlZmF1bHQ6e2xldCBvPXI7dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zPy5jaGlsZFRva2Vucz8uW28udHlwZV0/dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zLmNoaWxkVG9rZW5zW28udHlwZV0uZm9yRWFjaChhPT57bGV0IGk9b1thXS5mbGF0KDEvMCk7bj1uLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoaSx0KSl9KTpvLnRva2VucyYmKG49bi5jb25jYXQodGhpcy53YWxrVG9rZW5zKG8udG9rZW5zLHQpKSl9fXJldHVybiBufXVzZSguLi5lKXtsZXQgdD10aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnN8fHtyZW5kZXJlcnM6e30sY2hpbGRUb2tlbnM6e319O3JldHVybiBlLmZvckVhY2gobj0+e2xldCByPXsuLi5ufTtpZihyLmFzeW5jPXRoaXMuZGVmYXVsdHMuYXN5bmN8fHIuYXN5bmN8fCExLG4uZXh0ZW5zaW9ucyYmKG4uZXh0ZW5zaW9ucy5mb3JFYWNoKG89PntpZighby5uYW1lKXRocm93IG5ldyBFcnJvcigiZXh0ZW5zaW9uIG5hbWUgcmVxdWlyZWQiKTtpZigicmVuZGVyZXIiaW4gbyl7bGV0IGE9dC5yZW5kZXJlcnNbby5uYW1lXTthP3QucmVuZGVyZXJzW28ubmFtZV09ZnVuY3Rpb24oLi4uaSl7bGV0IHM9by5yZW5kZXJlci5hcHBseSh0aGlzLGkpO3JldHVybiBzPT09ITEmJihzPWEuYXBwbHkodGhpcyxpKSksc306dC5yZW5kZXJlcnNbby5uYW1lXT1vLnJlbmRlcmVyfWlmKCJ0b2tlbml6ZXIiaW4gbyl7aWYoIW8ubGV2ZWx8fG8ubGV2ZWwhPT0iYmxvY2siJiZvLmxldmVsIT09ImlubGluZSIpdGhyb3cgbmV3IEVycm9yKCJleHRlbnNpb24gbGV2ZWwgbXVzdCBiZSAnYmxvY2snIG9yICdpbmxpbmUnIik7bGV0IGE9dFtvLmxldmVsXTthP2EudW5zaGlmdChvLnRva2VuaXplcik6dFtvLmxldmVsXT1bby50b2tlbml6ZXJdLG8uc3RhcnQmJihvLmxldmVsPT09ImJsb2NrIj90LnN0YXJ0QmxvY2s/dC5zdGFydEJsb2NrLnB1c2goby5zdGFydCk6dC5zdGFydEJsb2NrPVtvLnN0YXJ0XTpvLmxldmVsPT09ImlubGluZSImJih0LnN0YXJ0SW5saW5lP3Quc3RhcnRJbmxpbmUucHVzaChvLnN0YXJ0KTp0LnN0YXJ0SW5saW5lPVtvLnN0YXJ0XSkpfSJjaGlsZFRva2VucyJpbiBvJiZvLmNoaWxkVG9rZW5zJiYodC5jaGlsZFRva2Vuc1tvLm5hbWVdPW8uY2hpbGRUb2tlbnMpfSksci5leHRlbnNpb25zPXQpLG4ucmVuZGVyZXIpe2xldCBvPXRoaXMuZGVmYXVsdHMucmVuZGVyZXJ8fG5ldyBEbCh0aGlzLmRlZmF1bHRzKTtmb3IobGV0IGEgaW4gbi5yZW5kZXJlcil7aWYoIShhIGluIG8pKXRocm93IG5ldyBFcnJvcihgcmVuZGVyZXIgJyR7YX0nIGRvZXMgbm90IGV4aXN0YCk7aWYoWyJvcHRpb25zIiwicGFyc2VyIl0uaW5jbHVkZXMoYSkpY29udGludWU7bGV0IGk9YSxzPW4ucmVuZGVyZXJbaV0sbD1vW2ldO29baV09KC4uLmMpPT57bGV0IGQ9cy5hcHBseShvLGMpO3JldHVybiBkPT09ITEmJihkPWwuYXBwbHkobyxjKSksZHx8IiJ9fXIucmVuZGVyZXI9b31pZihuLnRva2VuaXplcil7bGV0IG89dGhpcy5kZWZhdWx0cy50b2tlbml6ZXJ8fG5ldyBObCh0aGlzLmRlZmF1bHRzKTtmb3IobGV0IGEgaW4gbi50b2tlbml6ZXIpe2lmKCEoYSBpbiBvKSl0aHJvdyBuZXcgRXJyb3IoYHRva2VuaXplciAnJHthfScgZG9lcyBub3QgZXhpc3RgKTtpZihbIm9wdGlvbnMiLCJydWxlcyIsImxleGVyIl0uaW5jbHVkZXMoYSkpY29udGludWU7bGV0IGk9YSxzPW4udG9rZW5pemVyW2ldLGw9b1tpXTtvW2ldPSguLi5jKT0+e2xldCBkPXMuYXBwbHkobyxjKTtyZXR1cm4gZD09PSExJiYoZD1sLmFwcGx5KG8sYykpLGR9fXIudG9rZW5pemVyPW99aWYobi5ob29rcyl7bGV0IG89dGhpcy5kZWZhdWx0cy5ob29rc3x8bmV3IEVsO2ZvcihsZXQgYSBpbiBuLmhvb2tzKXtpZighKGEgaW4gbykpdGhyb3cgbmV3IEVycm9yKGBob29rICcke2F9JyBkb2VzIG5vdCBleGlzdGApO2lmKFsib3B0aW9ucyIsImJsb2NrIl0uaW5jbHVkZXMoYSkpY29udGludWU7bGV0IGk9YSxzPW4uaG9va3NbaV0sbD1vW2ldO0VsLnBhc3NUaHJvdWdoSG9va3MuaGFzKGEpP29baV09Yz0+e2lmKHRoaXMuZGVmYXVsdHMuYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShzLmNhbGwobyxjKSkudGhlbih1PT5sLmNhbGwobyx1KSk7bGV0IGQ9cy5jYWxsKG8sYyk7cmV0dXJuIGwuY2FsbChvLGQpfTpvW2ldPSguLi5jKT0+e2xldCBkPXMuYXBwbHkobyxjKTtyZXR1cm4gZD09PSExJiYoZD1sLmFwcGx5KG8sYykpLGR9fXIuaG9va3M9b31pZihuLndhbGtUb2tlbnMpe2xldCBvPXRoaXMuZGVmYXVsdHMud2Fsa1Rva2VucyxhPW4ud2Fsa1Rva2VucztyLndhbGtUb2tlbnM9ZnVuY3Rpb24oaSl7bGV0IHM9W107cmV0dXJuIHMucHVzaChhLmNhbGwodGhpcyxpKSksbyYmKHM9cy5jb25jYXQoby5jYWxsKHRoaXMsaSkpKSxzfX10aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLnJ9fSksdGhpc31zZXRPcHRpb25zKGUpe3JldHVybiB0aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLmV9LHRoaXN9bGV4ZXIoZSx0KXtyZXR1cm4gUW4ubGV4KGUsdD8/dGhpcy5kZWZhdWx0cyl9cGFyc2VyKGUsdCl7cmV0dXJuIEpuLnBhcnNlKGUsdD8/dGhpcy5kZWZhdWx0cyl9cGFyc2VNYXJrZG93bihlKXtyZXR1cm4obixyKT0+e2xldCBvPXsuLi5yfSxhPXsuLi50aGlzLmRlZmF1bHRzLC4uLm99LGk9dGhpcy5vbkVycm9yKCEhYS5zaWxlbnQsISFhLmFzeW5jKTtpZih0aGlzLmRlZmF1bHRzLmFzeW5jPT09ITAmJm8uYXN5bmM9PT0hMSlyZXR1cm4gaShuZXcgRXJyb3IoIm1hcmtlZCgpOiBUaGUgYXN5bmMgb3B0aW9uIHdhcyBzZXQgdG8gdHJ1ZSBieSBhbiBleHRlbnNpb24uIFJlbW92ZSBhc3luYzogZmFsc2UgZnJvbSB0aGUgcGFyc2Ugb3B0aW9ucyBvYmplY3QgdG8gcmV0dXJuIGEgUHJvbWlzZS4iKSk7aWYodHlwZW9mIG4+InUifHxuPT09bnVsbClyZXR1cm4gaShuZXcgRXJyb3IoIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwiKSk7aWYodHlwZW9mIG4hPSJzdHJpbmciKXJldHVybiBpKG5ldyBFcnJvcigibWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyBvZiB0eXBlICIrT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4pKyIsIHN0cmluZyBleHBlY3RlZCIpKTthLmhvb2tzJiYoYS5ob29rcy5vcHRpb25zPWEsYS5ob29rcy5ibG9jaz1lKTtsZXQgcz1hLmhvb2tzP2EuaG9va3MucHJvdmlkZUxleGVyKCk6ZT9Rbi5sZXg6UW4ubGV4SW5saW5lLGw9YS5ob29rcz9hLmhvb2tzLnByb3ZpZGVQYXJzZXIoKTplP0puLnBhcnNlOkpuLnBhcnNlSW5saW5lO2lmKGEuYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShhLmhvb2tzP2EuaG9va3MucHJlcHJvY2VzcyhuKTpuKS50aGVuKGM9PnMoYyxhKSkudGhlbihjPT5hLmhvb2tzP2EuaG9va3MucHJvY2Vzc0FsbFRva2VucyhjKTpjKS50aGVuKGM9PmEud2Fsa1Rva2Vucz9Qcm9taXNlLmFsbCh0aGlzLndhbGtUb2tlbnMoYyxhLndhbGtUb2tlbnMpKS50aGVuKCgpPT5jKTpjKS50aGVuKGM9PmwoYyxhKSkudGhlbihjPT5hLmhvb2tzP2EuaG9va3MucG9zdHByb2Nlc3MoYyk6YykuY2F0Y2goaSk7dHJ5e2EuaG9va3MmJihuPWEuaG9va3MucHJlcHJvY2VzcyhuKSk7bGV0IGM9cyhuLGEpO2EuaG9va3MmJihjPWEuaG9va3MucHJvY2Vzc0FsbFRva2VucyhjKSksYS53YWxrVG9rZW5zJiZ0aGlzLndhbGtUb2tlbnMoYyxhLndhbGtUb2tlbnMpO2xldCBkPWwoYyxhKTtyZXR1cm4gYS5ob29rcyYmKGQ9YS5ob29rcy5wb3N0cHJvY2VzcyhkKSksZH1jYXRjaChjKXtyZXR1cm4gaShjKX19fW9uRXJyb3IoZSx0KXtyZXR1cm4gbj0+e2lmKG4ubWVzc2FnZSs9YApQbGVhc2UgcmVwb3J0IHRoaXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL21hcmtlZGpzL21hcmtlZC5gLGUpe2xldCByPSI8cD5BbiBlcnJvciBvY2N1cnJlZDo8L3A+PHByZT4iK0FuKG4ubWVzc2FnZSsiIiwhMCkrIjwvcHJlPiI7cmV0dXJuIHQ/UHJvbWlzZS5yZXNvbHZlKHIpOnJ9aWYodClyZXR1cm4gUHJvbWlzZS5yZWplY3Qobik7dGhyb3cgbn19fSxjbz1uZXcgX1M7ZnVuY3Rpb24geWUoZSx0KXtyZXR1cm4gY28ucGFyc2UoZSx0KX15ZS5vcHRpb25zPXllLnNldE9wdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIGNvLnNldE9wdGlvbnMoZSkseWUuZGVmYXVsdHM9Y28uZGVmYXVsdHMsd3YoeWUuZGVmYXVsdHMpLHllfTt5ZS5nZXREZWZhdWx0cz1zcDt5ZS5kZWZhdWx0cz11bzt5ZS51c2U9ZnVuY3Rpb24oLi4uZSl7cmV0dXJuIGNvLnVzZSguLi5lKSx5ZS5kZWZhdWx0cz1jby5kZWZhdWx0cyx3dih5ZS5kZWZhdWx0cykseWV9O3llLndhbGtUb2tlbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gY28ud2Fsa1Rva2VucyhlLHQpfTt5ZS5wYXJzZUlubGluZT1jby5wYXJzZUlubGluZTt5ZS5QYXJzZXI9Sm47eWUucGFyc2VyPUpuLnBhcnNlO3llLlJlbmRlcmVyPURsO3llLlRleHRSZW5kZXJlcj1TaTt5ZS5MZXhlcj1Rbjt5ZS5sZXhlcj1Rbi5sZXg7eWUuVG9rZW5pemVyPU5sO3llLkhvb2tzPUVsO3llLnBhcnNlPXllO3ZhciBPUj15ZS5vcHRpb25zLElSPXllLnNldE9wdGlvbnMsUlI9eWUudXNlLE1SPXllLndhbGtUb2tlbnMsQXY9eWUucGFyc2VJbmxpbmU7dmFyIFBSPUpuLnBhcnNlLExSPVFuLmxleDt5ZS51c2Uoe2JyZWFrczohMCxnZm06ITAscmVuZGVyZXI6e2xpbmsoe2hyZWY6ZSx0aXRsZTp0LHRleHQ6bn0pe2xldCByPXQ/YCB0aXRsZT0iJHt0fSJgOiIiO3JldHVybmA8YSBocmVmPSIke2V9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiR7cn0+JHtufTwvYT5gfX19KTtmdW5jdGlvbiBvYShlKXtyZXR1cm4gZT95ZS5wYXJzZUlubGluZShlKToiIn1mdW5jdGlvbiBocChlKXtyZXR1cm4gZT95ZS5wYXJzZShlKToiIn1mdW5jdGlvbiBPdihlKXtpZighZSlyZXR1cm4iIjtsZXQgdD1lLnJlcGxhY2UoL1xbKFteXF1dKylcXVxbXF4/XGQrXF0vZywiJDEiKS5yZXBsYWNlKC9cW1xeW15cXV0qXF0vZywiIikucmVwbGFjZSgvPT0oW149XSspPT0vZywiJDEiKTtyZXR1cm4gQXYodCx7cmVuZGVyZXI6bmV3IFNpfSkudHJpbSgpfXZhciBhYT1wZShkZSgpKTt2YXIgdmU9cGUoZGUoKSksQWw9ImRhc2hib2FyZDp3aWRnZXQtZm9jdXMtcmVxdWVzdCIsQ1M9MmUzLGdwPSJkYXNoYm9hcmQ6d2lkZ2V0LWRyYWctcmVhZHkiLEl2PTIyMDtmdW5jdGlvbiBBUyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEVsZW1lbnQ/ISFlLmNsb3Nlc3QoImJ1dHRvbiwgYSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIFtyb2xlPSdidXR0b24nXSIpOiExfWZ1bmN0aW9uIEVpKCl7aWYodHlwZW9mIG5hdmlnYXRvcj4idSJ8fHR5cGVvZiB3aW5kb3c+InUiKXJldHVybiExO2xldCBlPW5hdmlnYXRvci51c2VyQWdlbnR8fCIiLHQ9L0FuZHJvaWR8d2ViT1N8aVBob25lfGlQYWR8aVBvZHxCbGFja0JlcnJ5fElFTW9iaWxlfE9wZXJhIE1pbmkvaS50ZXN0KGUpLG49bmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzPjEmJi9NYWNpbnRvc2gvLnRlc3QoZSk7cmV0dXJuIXQmJiFuJiZ3aW5kb3cuaW5uZXJXaWR0aD44MDB9ZnVuY3Rpb24gT1MoZSx0LG4pe2lmKCFBcnJheS5pc0FycmF5KGUpfHwhdHx8IW58fHQ9PT1uKXJldHVybiBlO2xldCByPWUuZmluZEluZGV4KGw9Pmw/LndpZGdldElkPT09dCksbz1lLmZpbmRJbmRleChsPT5sPy53aWRnZXRJZD09PW4pO2lmKHI8MHx8bzwwfHxyPT09bylyZXR1cm4gZTtsZXQgYT1bLi4uZV0sW2ldPWEuc3BsaWNlKHIsMSkscz1yPG8/by0xOm87cmV0dXJuIGEuc3BsaWNlKHMsMCxpKSxhfWZ1bmN0aW9uIElTKCl7aWYodHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm4gbmV3IE1hcDtsZXQgZT1uZXcgTWFwO3JldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuZGFzaGJvYXJkLWdyaWQgLmdyaWQtY2VsbFtkYXRhLXdpZGdldC1pZF0iKS5mb3JFYWNoKG49PntsZXQgcj1uLmdldEF0dHJpYnV0ZSgiZGF0YS13aWRnZXQtaWQiKTtyJiZlLnNldChyLG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpfSksZX1mdW5jdGlvbiBSUyhlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIE1hcCl8fGUuc2l6ZT09PTB8fHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuO2xldCBuPVtdO2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kYXNoYm9hcmQtZ3JpZCAuZ3JpZC1jZWxsW2RhdGEtd2lkZ2V0LWlkXSIpLmZvckVhY2gobz0+e2xldCBhPW8uZ2V0QXR0cmlidXRlKCJkYXRhLXdpZGdldC1pZCIpO2lmKCFhfHxhPT09dClyZXR1cm47bGV0IGk9ZS5nZXQoYSk7aWYoIWkpcmV0dXJuO2xldCBzPW8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbD1pLmxlZnQtcy5sZWZ0LGM9aS50b3Atcy50b3A7TWF0aC5hYnMobCk8MSYmTWF0aC5hYnMoYyk8MXx8KG8uc3R5bGUudHJhbnNpdGlvbj0ibm9uZSIsby5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1mbGlwLXgiLGAke2x9cHhgKSxvLnN0eWxlLnNldFByb3BlcnR5KCItLWZsaXAteSIsYCR7Y31weGApLG4ucHVzaChvKSl9KSxuLmxlbmd0aCE9PTAmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntuLmZvckVhY2gobz0+e28uc3R5bGUudHJhbnNpdGlvbj1gdHJhbnNmb3JtICR7SXZ9bXMgZWFzZWAsby5zdHlsZS5zZXRQcm9wZXJ0eSgiLS1mbGlwLXgiLCIwcHgiKSxvLnN0eWxlLnNldFByb3BlcnR5KCItLWZsaXAteSIsIjBweCIpfSksd2luZG93LnNldFRpbWVvdXQoKCk9PntuLmZvckVhY2gobz0+by5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgidHJhbnNpdGlvbiIpKX0sSXYrNDApfSl9ZnVuY3Rpb24gUnYoZSl7cmV0dXJuKGV8fFtdKS5tYXAodD0+dD8ud2lkZ2V0SWQpLmZpbHRlcihCb29sZWFuKS5qb2luKCJ8Iil9ZnVuY3Rpb24gTXYoZSx0KXtsZXRbbixyXT0oMCx2ZS51c2VTdGF0ZSkobnVsbCksW28sYV09KDAsdmUudXNlU3RhdGUpKGUpLGk9KDAsdmUudXNlUmVmKShlKSxzPSgwLHZlLnVzZVJlZikobnVsbCk7KDAsdmUudXNlRWZmZWN0KSgoKT0+e258fGEoZSl9LFtlLG5dKSwoMCx2ZS51c2VFZmZlY3QpKCgpPT57aS5jdXJyZW50PW99LFtvXSksKDAsdmUudXNlTGF5b3V0RWZmZWN0KSgoKT0+e2xldCBjPXMuY3VycmVudDshbnx8IWN8fChzLmN1cnJlbnQ9bnVsbCxSUyhjLG4pKX0sW28sbl0pLCgwLHZlLnVzZUVmZmVjdCkoKCk9PntsZXQgYz1kPT57bGV0IHU9ZD8uZGV0YWlsPy53aWRnZXRJZDt1JiYocih1KSxhKHA9PkFycmF5LmlzQXJyYXkocCkmJnAubGVuZ3RoP3A6ZSkpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZ3AsYyksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGdwLGMpfSxbZV0pO2xldCBsPSgwLHZlLnVzZUNhbGxiYWNrKSgoKT0+e2lmKCFuKXJldHVybjtsZXQgYz1SdihlKSxkPVJ2KGkuY3VycmVudCk7cihudWxsKSxkJiZjIT09ZCYmdChpLmN1cnJlbnQubWFwKHU9PnUud2lkZ2V0SWQpKX0sW2Usbix0XSk7cmV0dXJuKDAsdmUudXNlRWZmZWN0KSgoKT0+e2lmKCFuKXJldHVybjtsZXQgYz1wPT57aWYoKHAuYnV0dG9ucyYxKSE9PTEpe2woKTtyZXR1cm59bGV0IHc9ZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChwLmNsaWVudFgscC5jbGllbnRZKT8uY2xvc2VzdD8uKCIuZGFzaGJvYXJkLWdyaWQgLmdyaWQtY2VsbFtkYXRhLXdpZGdldC1pZF0iKT8uZ2V0QXR0cmlidXRlPy4oImRhdGEtd2lkZ2V0LWlkIik7aWYoIXd8fHc9PT1uKXJldHVybjtsZXQgYj1JUygpO2Eodj0+e2xldCBoPU9TKHYsbix3KTtyZXR1cm4gaCE9PXYmJihzLmN1cnJlbnQ9YiksaH0pfSxkPSgpPT5sKCksdT0oKT0+bCgpO3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixjKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsZCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHUpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGQpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIix1KX19LFtuLGxdKSx7ZHJhZ2dpbmdXaWRnZXRJZDpuLGRpc3BsYXllZENvbXBvbmVudHM6b319ZnVuY3Rpb24geXAoe2NvbmZpZ3VyYWJsZTplLGhlYWRlckFjdGlvbnM6dCxpY29uOm4sb25Db25maWd1cmU6cixzdWJ0aXRsZTpvLHRpdGxlOmEsd2lkZ2V0SWQ6aX0pe2xldFtzLGxdPSgwLHZlLnVzZVN0YXRlKSgoKT0+RWkoKSksYz0oMCx2ZS51c2VSZWYpKG51bGwpLGQ9KDAsdmUudXNlUmVmKShudWxsKSx1PSgwLHZlLnVzZVJlZikoITEpLHA9KDAsdmUudXNlTWVtbykoKCk9Pih7d2lkZ2V0SWQ6aX0pLFtpXSk7cmV0dXJuKDAsdmUudXNlRWZmZWN0KSgoKT0+e2xldCBmPSgpPT5sKEVpKCkpO3JldHVybiBmKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZiksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLGYpfSxbXSksKDAsdmUudXNlRWZmZWN0KSgoKT0+e2xldCBmPWMuY3VycmVudDtpZighZilyZXR1cm47bGV0IHk9KCk9PntkLmN1cnJlbnQhPW51bGwmJih3aW5kb3cuY2xlYXJUaW1lb3V0KGQuY3VycmVudCksZC5jdXJyZW50PW51bGwpfSx3PWg9PntmLmNsYXNzTGlzdC50b2dnbGUoIndpZGdldC1oZWFkaW5nLWJhci0tZHJhZy1yZWFkeSIsISFoKX0sYj1oPT57aC5idXR0b249PT0wJiYoQVMoaC50YXJnZXQpfHwodS5jdXJyZW50PSExLHcoITEpLHkoKSxkLmN1cnJlbnQ9d2luZG93LnNldFRpbWVvdXQoKCk9Pnt1LmN1cnJlbnQ9ITAsdyghMCksd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGdwLHtkZXRhaWw6cH0pKX0sQ1MpKSl9LHY9KCk9Pnt5KCksdS5jdXJyZW50PSExLHcoITEpfTtyZXR1cm4gZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix2KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdiksKCk9Pnt5KCksdyghMSksZi5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGIpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix2KSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsdil9fSxbcF0pLCgwLHZlLmNyZWF0ZUVsZW1lbnQpKCJkaXYiLHtyZWY6YyxjbGFzc05hbWU6YHdpZGdldC1oZWFkZXIgd2lkZ2V0LWhlYWRpbmctYmFyJHtzPyIgd2lkZ2V0LWhlYWRpbmctYmFyLS1mb2N1c2FibGUiOiIifWB9LHM/KDAsdmUuY3JlYXRlRWxlbWVudCkoImJ1dHRvbiIse2NsYXNzTmFtZToid2lkZ2V0LWljb24gd2lkZ2V0LWljb24tYnV0dG9uIix0eXBlOiJidXR0b24iLHRpdGxlOmBGb2N1cyAke2F9YCwiYXJpYS1sYWJlbCI6YEZvY3VzICR7YX1gLG9uQ2xpY2s6KCk9PndpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChBbCx7ZGV0YWlsOnB9KSl9LG4pOigwLHZlLmNyZWF0ZUVsZW1lbnQpKCJzcGFuIix7Y2xhc3NOYW1lOiJ3aWRnZXQtaWNvbiJ9LG4pLCgwLHZlLmNyZWF0ZUVsZW1lbnQpKCJoMyIse2NsYXNzTmFtZToid2lkZ2V0LXRpdGxlIn0sKDAsdmUuY3JlYXRlRWxlbWVudCkoInNwYW4iLHtjbGFzc05hbWU6IndpZGdldC10aXRsZV9fbGFiZWwifSxhKSxvPygwLHZlLmNyZWF0ZUVsZW1lbnQpKCJzcGFuIix7Y2xhc3NOYW1lOiJ3aWRnZXQtdGl0bGVfX3N1YnRpdGxlIn0sbyk6bnVsbCksdHx8bnVsbCxlPygwLHZlLmNyZWF0ZUVsZW1lbnQpKCJidXR0b24iLHtjbGFzc05hbWU6IndpZGdldC1jb25maWd1cmUiLG9uQ2xpY2s6cn0sIlx1MjY5OSBDb25maWd1cmUiKTpudWxsKX12YXIgdnA9KDAsYWEuY3JlYXRlQ29udGV4dCkobnVsbCk7ZnVuY3Rpb24gb2Uoe2FwcDplLGNoaWxkcmVuOnQsY29uZmlndXJhYmxlOm4sZ3JpZEhlaWdodFNpemU6cixncmlkV2lkdGhTaXplOm8saGVhZGVyQWN0aW9uczphLGljb246aSxvbkNvbmZpZ3VyZTpzLHN1YnRpdGxlOmwsdGl0bGU6Yyx3aWRnZXRJZDpkfSl7bGV0IHU9YWEuY3JlYXRlRWxlbWVudCxwPSgwLGFhLnVzZUNvbnRleHQpKHZwKSxmPWFzeW5jKCk9PntzP3MoKTplJiZhd2FpdCBlLmNvbmZpZ3VyZShkKSYmd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpfSx5PW8/P3A/LmdyaWRXaWR0aFNpemUsdz1yPz9wPy5ncmlkSGVpZ2h0U2l6ZSxiPU51bWJlcih5KT4wP051bWJlcih5KToxLHY9TnVtYmVyKHcpPjA/TnVtYmVyKHcpOjEsaD1gaG9yaXpvbnRhbC0ke2J9LWNlbGwgdmVydGljYWwtJHt2fS1jZWxsYDtyZXR1cm4gdSgiZGl2Iix7Y2xhc3NOYW1lOmB3aWRnZXQgd2lkZ2V0LSR7ZH0gJHtofWB9LHUoeXAse2NvbmZpZ3VyYWJsZTpuLGhlYWRlckFjdGlvbnM6YSxpY29uOmksc3VidGl0bGU6bCx0aXRsZTpjLHdpZGdldElkOmQsb25Db25maWd1cmU6Zn0pLHUoImRpdiIse2NsYXNzTmFtZToid2lkZ2V0LWJvZHkifSx0KSl9YXN5bmMgZnVuY3Rpb24gTVMoZSx0KXtyZXR1cm4gdC5ub3RlVVVJRD9hd2FpdCB4bChlLHQubm90ZVVVSUQpOmF3YWl0IGR2KGUsdCl9YXN5bmMgZnVuY3Rpb24gUHYoZSx0LHthY3RpdmVUYWI6bixzZXRBY3RpdmVUYWI6cixzZXRNb250aExvYWRpbmc6byxzZXRNb250aENvbnRlbnQ6YX0pe2lmKG49PT10LmluZGV4KXtyKG51bGwpLGEobnVsbCk7cmV0dXJufXIodC5pbmRleCksbyghMCksYShudWxsKTtsZXQgaT10LnBsYW4ubm90ZVVVSUQ7dHJ5e2lmKCFpKWEoe2ZvdW5kOiExLHBsYW46dC5wbGFuLG1vbnRoTmFtZTp0LmZ1bGwseWVhcjp0LnBsYW4ueWVhcn0pO2Vsc2V7bGV0IHM9YXdhaXQgbnAoZSxpLHQuZnVsbCk7RShgW1BsYW5uaW5nXSBSYXcgbWFya2Rvd24gZm9yICR7dC5mdWxsfTpgLHM/LmNvbnRlbnQpLGEoey4uLnMscGxhbjp0LnBsYW4sbW9udGhOYW1lOnQuZnVsbCx5ZWFyOnQucGxhbi55ZWFyfSl9fWNhdGNoe2Eoe2ZvdW5kOiExLHBsYW46dC5wbGFuLG1vbnRoTmFtZTp0LmZ1bGwseWVhcjp0LnBsYW4ueWVhcn0pfWZpbmFsbHl7byghMSl9fWFzeW5jIGZ1bmN0aW9uIFBTKGUsdCx7c2V0TW9udGhMb2FkaW5nOm4sc2V0TW9udGhDb250ZW50OnJ9KXtpZih0KXtuKCEwKTt0cnl7bGV0IG89YXdhaXQgY3YoZSx0LnBsYW4sdC5tb250aE5hbWUpO2lmKG8mJm8ubm90ZVVVSUQpcmV0dXJuIHIoYT0+KHsuLi5hLGZvdW5kOiEwLGNvbnRlbnQ6by5jb250ZW50fHwiIn0pKSxhd2FpdCB4bChlLG8ubm90ZVVVSUQpfWNhdGNoe31maW5hbGx5e24oITEpfX19YXN5bmMgZnVuY3Rpb24gTFMoZSx0LG4scixvKXtyKCEwKTt0cnl7bGV0IGE9YXdhaXQgdXYoZSx0LG4pO2lmKGE/Lm5vdGVVVUlEKXJldHVybiBvKHtmb3VuZDohMCxjb250ZW50OmEuY29udGVudHx8IiJ9KSxhd2FpdCB4bChlLGEubm90ZVVVSUQpfWNhdGNoe31maW5hbGx5e3IoITEpfX1mdW5jdGlvbiB6UyhlLHQsbil7bGV0IHI9ISF0Lm5vdGVVVUlELG89ISF0Lmhhc0FsbE1vbnRobHlEZXRhaWxzLGE9InF1YXJ0ZXItY2FyZCIrKHI/IiBxdWFydGVyLWNhcmQtLWhhcy1wbGFuIjoiIiksaT1vPyJcdTI3MDUiOiJcdXsxRjZBN30iLHM9bz8iQWxsIDMgbW9udGhzIGluIHRoaXMgcXVhcnRlciBoYXZlIGJlZW4gcGxhbm5lZC4iOiJNb250aGx5IGRldGFpbHMgYXJlIG1pc3NpbmcgZm9yIG9uZSBvciBtb3JlIG1vbnRocyBcdTIwMTQgdGhpcyBwbGFuIGlzIGEgd29yayBpbiBwcm9ncmVzcy4iO3JldHVybiBlKCJkaXYiLHtrZXk6dC5sYWJlbCxjbGFzc05hbWU6YSxvbkNsaWNrOm59LGUoInNwYW4iLHtjbGFzc05hbWU6InF1YXJ0ZXItbGFiZWwifSx0LmxhYmVsKSxlKCJkaXYiLHtjbGFzc05hbWU6InF1YXJ0ZXItc3RhdHVzLXJvdyJ9LGUoInNwYW4iLHtjbGFzc05hbWU6InF1YXJ0ZXItc3RhdHVzIn0scj8iXHV7MUY0RER9IE9wZW4gUGxhbiI6IisgQ3JlYXRlIFBsYW4iKSxyP2UoaGkse2NvbnRlbnQ6cyxwbGFjZW1lbnQ6ImJvdHRvbSJ9LGUoInNwYW4iLHtjbGFzc05hbWU6InF1YXJ0ZXItcGxhbi1pbmRpY2F0b3IiLG9uQ2xpY2s6bD0+bC5zdG9wUHJvcGFnYXRpb24oKX0saSkpOm51bGwpKX1mdW5jdGlvbiBGUyhlLHQsbixyKXtyZXR1cm4gdD9lKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtbG9hZGluZyJ9LCJMb2FkaW5nXHUyMDI2Iik6bj9uLmZvdW5kP2UoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudCJ9LGUoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1oZWFkZXIifSxuLm1vbnRoTmFtZSksZSgiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC1jb250ZW50LXRleHQiLGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6aHAobi5jb250ZW50KXx8IjxwPihFbXB0eSBzZWN0aW9uKTwvcD4ifX0pKTplKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtZW1wdHkifSxlKCJidXR0b24iLHtjbGFzc05hbWU6ImNyZWF0ZS1tb250aC1wbGFuLWxpbmsiLG9uQ2xpY2s6cn0sYENyZWF0ZSBhIHBsYW4gZm9yICR7bi5tb250aE5hbWV9ICR7bi55ZWFyfWApKTpudWxsfWZ1bmN0aW9uIFVTKGUsdCxuLHIsbyxhKXtyZXR1cm4gcj9lKCJkaXYiLHtjbGFzc05hbWU6IndlZWtseS1wbGFuLXNlY3Rpb24ifSxlKCJkaXYiLHtjbGFzc05hbWU6IndlZWtseS1wbGFuLWxvYWRpbmcifSwiTG9hZGluZ1x1MjAyNiIpKTpvPy5mb3VuZD9lKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtYXJlYSJ9LGUoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudCJ9LGUoImRpdiIse2NsYXNzTmFtZToibW9udGgtY29udGVudC1oZWFkZXIifSx0KSxlKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtdGV4dCIsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpocChvLmNvbnRlbnQpfHwiPHA+KEVtcHR5IHNlY3Rpb24pPC9wPiJ9fSkpKTplKCJkaXYiLHtjbGFzc05hbWU6IndlZWtseS1wbGFuLXNlY3Rpb24ifSxlKCJkaXYiLHtjbGFzc05hbWU6IndlZWtseS1wbGFuLWhlYWRlciJ9LCJXZWVrbHkgUGxhbiIpLGUoImJ1dHRvbiIse2NsYXNzTmFtZToiY3JlYXRlLXdlZWstcGxhbi1saW5rIixvbkNsaWNrOmF9LGBDcmVhdGUgYSB3ZWVrbHkgcGxhbiBmb3IgJHt0fSwgJHtufWApKX1mdW5jdGlvbiB3cCh7YXBwOmUsZ3JpZEhlaWdodFNpemU6dD0xLHF1YXJ0ZXJseVBsYW5zOm59KXtsZXQgcj1CdC5jcmVhdGVFbGVtZW50LFtvLGFdPSgwLEJ0LnVzZVN0YXRlKShudWxsKSxbaSxzXT0oMCxCdC51c2VTdGF0ZSkobnVsbCksW2wsY109KDAsQnQudXNlU3RhdGUpKCExKSxbZCx1XT0oMCxCdC51c2VTdGF0ZSkobnVsbCksW3AsZl09KDAsQnQudXNlU3RhdGUpKCExKSxbeSx3XT0oMCxCdC51c2VTdGF0ZSkoITEpLFtiLHZdPSgwLEJ0LnVzZVN0YXRlKShudWxsKSxoPXQ+PTI7aWYoYiYmaG4pcmV0dXJuIHIob2Use3RpdGxlOnJlKCJwbGFubmluZyIpLGljb246Ilx1ezFGNENCfSIsd2lkZ2V0SWQ6InBsYW5uaW5nIn0scihycCx7YXBwOmUsbm90ZVVVSUQ6YixvbkJhY2s6KCk9PnYobnVsbCl9KSk7aWYoIW4/LmN1cnJlbnR8fCFuPy5uZXh0KXJldHVybiByKG9lLHt0aXRsZTpyZSgicGxhbm5pbmciKSxpY29uOiJcdXsxRjRDQn0iLHdpZGdldElkOiJwbGFubmluZyJ9LHIoInAiLHtjbGFzc05hbWU6InBsYW5uaW5nLWVtcHR5In0sIkxvYWRpbmcgcXVhcnRlcmx5IHBsYW5zXHUyMDI2IikpO2xldCBnPWR5KG4uY3VycmVudCxuLm5leHQpLG09e2FjdGl2ZVRhYjpvLHNldEFjdGl2ZVRhYjphLHNldE1vbnRoTG9hZGluZzpjLHNldE1vbnRoQ29udGVudDpzfSx4PXtzZXRNb250aExvYWRpbmc6YyxzZXRNb250aENvbnRlbnQ6c30sUz1BPT57QT8uZGV2RWRpdCYmQS5ub3RlVVVJRCYmdihBLm5vdGVVVUlEKX0sXz1jbCgpLEQ9dWwoXyk7cmV0dXJuKDAsQnQudXNlRWZmZWN0KSgoKT0+e2lmKHkpcmV0dXJuO2xldCBBPWcuZmluZChUPT5ULmN1cnJlbnQpO0EmJih3KCEwKSxQdihlLEEsbSkpfSxbeV0pLCgwLEJ0LnVzZUVmZmVjdCkoKCk9PntpZighaClyZXR1cm47bGV0IEE9bi5jdXJyZW50Py5ub3RlVVVJRDtBJiYoZighMCksbnAoZSxBLEQpLnRoZW4oVD0+e0UoYFtQbGFubmluZ10gV2Vla2x5IHNlY3Rpb24gIiR7RH0iOmAsVCksdShUKX0pLmNhdGNoKCgpPT51KHtmb3VuZDohMSxjb250ZW50Om51bGx9KSkuZmluYWxseSgoKT0+ZighMSkpKX0sW2gsbi5jdXJyZW50Py5ub3RlVVVJRCxEXSkscihvZSx7dGl0bGU6cmUoInBsYW5uaW5nIiksaWNvbjoiXHV7MUY0Q0J9Iix3aWRnZXRJZDoicGxhbm5pbmcifSxyKCJkaXYiLHtjbGFzc05hbWU6InBsYW5uaW5nLXF1YXJ0ZXJzIn0sW24uY3VycmVudCxuLm5leHRdLm1hcChBPT56UyhyLEEsYXN5bmMoKT0+e2xldCBUPWF3YWl0IE1TKGUsQSk7UyhUKX0pKSkscigiZGl2Iix7Y2xhc3NOYW1lOiJtb250aC10YWJzIn0sZy5tYXAoQT0+cigiYnV0dG9uIix7a2V5OkEuaW5kZXgsY2xhc3NOYW1lOiJtb250aC10YWIiKyhBLmluZGV4PT09bz8iIGFjdGl2ZSI6IiIpLG9uQ2xpY2s6KCk9PlB2KGUsQSxtKX0sQS5zaG9ydCkpKSxvIT09bnVsbD9yKCJkaXYiLHtjbGFzc05hbWU6Im1vbnRoLWNvbnRlbnQtYXJlYSJ9LEZTKHIsbCxpLGFzeW5jKCk9PntsZXQgQT1hd2FpdCBQUyhlLGkseCk7UyhBKX0pKTpudWxsLGg/VVMocixELG4uY3VycmVudC55ZWFyLHAsZCxhc3luYygpPT57bGV0IEE9YXdhaXQgTFMoZSxuLmN1cnJlbnQsRCxmLHUpO1MoQSl9KTpudWxsKX12YXIgWG49cGUoZGUoKSk7dmFyICRTPS9cWyhbXlxdXSspXF1cW1xePyhcZCspXF0vZyxMdj0vXHMqXFtcXj8oXGQrKVxdWy46XVxzKi8sV1M9L14hXFsoW15cXV0qKVxdXCgoW14pXSspXCkvLEJTPS9eXFsoW15cXV0qKVxdXCgoW14pXSopXCkvLEhTPS9cLihtcDR8d2VibXxvZ2cpKFw/fCQpL2ksRnY9Lyg/OnlvdXR1YmVcLmNvbVwvd2F0Y2hcP3Y9fHlvdXR1XC5iZVwvKShbYS16QS1aMC05Xy1dKykvLFV2PS92aW1lb1wuY29tXC8oXGQrKS87ZnVuY3Rpb24galMoZSl7cmV0dXJuIEhTLnRlc3QoZSl8fEZ2LnRlc3QoZSl8fFV2LnRlc3QoZSl9ZnVuY3Rpb24gVGkoZSl7cmV0dXJuIGUucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7IikucmVwbGFjZSgvJy9nLCImIzM5OyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpfWZ1bmN0aW9uIGJwKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpfWZ1bmN0aW9uIFZTKGUsdCl7bGV0IG49ZS5tYXRjaChXUyk7aWYobil7bGV0IG89blsyXTtqUyhvKT90LnZpZGVvcy5wdXNoKHthbHQ6blsxXSx1cmw6b30pOnQuaW1hZ2VzLnB1c2goe2FsdDpuWzFdLHVybDpvfSk7cmV0dXJufWxldCByPWUubWF0Y2goQlMpO2lmKHIpeyF0LmRlc2NyaXB0aW9uJiYhdC51cmw/KHQuZGVzY3JpcHRpb249clsxXXx8IiIsdC51cmw9clsyXXx8IiIpOnQudGV4dC5wdXNoKGUpO3JldHVybn1lJiZ0LnRleHQucHVzaChlKX1mdW5jdGlvbiBHUyhlKXtsZXQgdD1lLm1hdGNoKEx2KTtpZighdClyZXR1cm57Zm9vdG5vdGVzOnt9LGNsZWFuZWRNYXJrZG93bjplfTtsZXQgbj1lLnN1YnN0cmluZygwLHQuaW5kZXgpLnRyaW1FbmQoKSxyPWUuc3Vic3RyaW5nKHQuaW5kZXgpLG89e30sYT1uZXcgUmVnRXhwKEx2LnNvdXJjZSwiZyIpLGk9bnVsbCxzPTAsbDtmb3IoOyhsPWEuZXhlYyhyKSkhPT1udWxsOylpIT09bnVsbCYmKG9baV09enYoci5zdWJzdHJpbmcocyxsLmluZGV4KSkpLGk9bFsxXSxzPWwuaW5kZXgrbFswXS5sZW5ndGg7cmV0dXJuIGkhPT1udWxsJiYob1tpXT16dihyLnN1YnN0cmluZyhzKSkpLHtmb290bm90ZXM6byxjbGVhbmVkTWFya2Rvd246bn19ZnVuY3Rpb24genYoZSl7bGV0IHQ9e2Rlc2NyaXB0aW9uOiIiLHVybDoiIixpbWFnZXM6W10sdmlkZW9zOltdLHRleHQ6W119O2ZvcihsZXQgbiBvZiBlLnNwbGl0KGAKYCkpe2xldCByPW4udHJpbSgpO3ImJlZTKHIsdCl9cmV0dXJuIHR9ZnVuY3Rpb24gS1MoZSl7bGV0IHQ9W107cmV0dXJuIGUuaW1hZ2VzLmxlbmd0aCYmdC5wdXNoKHtjbHM6ImltYWdlIix0aXRsZToiQ29udGFpbnMgaW1hZ2UiLHN5bWJvbDoiXHV7MUY1QkN9In0pLGUudmlkZW9zLmxlbmd0aCYmdC5wdXNoKHtjbHM6InZpZGVvIix0aXRsZToiQ29udGFpbnMgdmlkZW8iLHN5bWJvbDoiXHV7MUYzQUN9In0pLCFlLmltYWdlcy5sZW5ndGgmJiFlLnZpZGVvcy5sZW5ndGgmJihlLnVybD90LnB1c2goe2NsczoidXJsIix0aXRsZToiQ29udGFpbnMgbGluayIsc3ltYm9sOiJcdXsxRjUxN30ifSk6KGUuZGVzY3JpcHRpb258fGUudGV4dC5sZW5ndGgpJiZ0LnB1c2goe2NsczoidGV4dCIsdGl0bGU6IkNvbnRhaW5zIGRldGFpbHMiLHN5bWJvbDoiXHV7MUY0RER9In0pKSx0fWZ1bmN0aW9uIFlTKGUpe2xldCB0PVsnPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cCI+J107ZS51cmwmJnQucHVzaChgPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC11cmwiPjxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTE4IDEzdjZhMiAyIDAgMCAxLTIgMkg1YTIgMiAwIDAgMS0yLTJWOGEyIDIgMCAwIDEgMi0yaDYiLz48cG9seWxpbmUgcG9pbnRzPSIxNSAzIDIxIDMgMjEgOSIvPjxsaW5lIHgxPSIxMCIgeTE9IjE0IiB4Mj0iMjEiIHkyPSIzIi8+PC9zdmc+PGEgaHJlZj0iJHtUaShlLnVybCl9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj4ke2JwKGUudXJsKX08L2E+PC9kaXY+YCksZS5kZXNjcmlwdGlvbiYmdC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLXRleHQiPiR7YnAoZS5kZXNjcmlwdGlvbil9PC9kaXY+YCk7Zm9yKGxldCBuIG9mIGUudGV4dCl0LnB1c2goYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtdGV4dCI+JHticChuKX08L2Rpdj5gKTtmb3IobGV0IG4gb2YgZS5pbWFnZXMpdC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLW1lZGlhIj48aW1nIHNyYz0iJHtUaShuLnVybCl9IiBhbHQ9IiR7VGkobi5hbHQpfSIgbG9hZGluZz0ibGF6eSIvPjwvZGl2PmApO2ZvcihsZXQgbiBvZiBlLnZpZGVvcyl7bGV0IHI9bi51cmwubWF0Y2goRnYpLG89bi51cmwubWF0Y2goVXYpO3I/dC5wdXNoKGA8ZGl2IGNsYXNzPSJyaWNoLWZvb3Rub3RlLXBvcHVwLW1lZGlhIj48aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHtyWzFdfSIgZnJhbWVib3JkZXI9IjAiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT48L2Rpdj5gKTpvP3QucHVzaChgPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC1tZWRpYSI+PGlmcmFtZSBzcmM9Imh0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8ke29bMV19IiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPjwvZGl2PmApOnQucHVzaChgPGRpdiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC1tZWRpYSI+PHZpZGVvIHNyYz0iJHtUaShuLnVybCl9IiBjb250cm9scz48L3ZpZGVvPjwvZGl2PmApfXJldHVybiB0LnB1c2goJzxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtcG9wdXAtYWN0aW9ucyI+PGJ1dHRvbiBjbGFzcz0icmljaC1mb290bm90ZS1wb3B1cC1jbG9zZSIgdHlwZT0iYnV0dG9uIj5DTE9TRTwvYnV0dG9uPjwvZGl2PicpLHQucHVzaCgiPC9kaXY+IiksdC5qb2luKCIiKX1mdW5jdGlvbiBxUyhlLHQpe2xldCBuPUtTKHQpLHI9ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHt1cmw6dC51cmwsZGVzY3JpcHRpb246dC5kZXNjcmlwdGlvbix0ZXh0OnQudGV4dCxpbWFnZXM6dC5pbWFnZXMsdmlkZW9zOnQudmlkZW9zfSkpLG89dC51cmx8fCIjIixhPW4ubWFwKGk9PmA8c3BhbiBjbGFzcz0icmljaC1mb290bm90ZS1pbmRpY2F0b3IgcmljaC1mb290bm90ZS1pbmRpY2F0b3ItLSR7aS5jbHN9IiB0aXRsZT0iJHtpLnRpdGxlfSI+JHtpLnN5bWJvbH08L3NwYW4+YCkuam9pbigiIik7cmV0dXJuYDxkaXYgY2xhc3M9InJpY2gtZm9vdG5vdGUtd3JhcCI+PGEgY2xhc3M9InJpY2gtZm9vdG5vdGUtbGluayIgaHJlZj0iJHtUaShvKX0iIGRhdGEtcmljaC1mb290bm90ZT0iJHtyfSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+JHtlfTwvYT5gK2ErIjwvZGl2PiJ9ZnVuY3Rpb24gcG8oZSl7aWYoIWUpcmV0dXJuIiI7bGV0e2Zvb3Rub3Rlczp0LGNsZWFuZWRNYXJrZG93bjpufT1HUyhlKTtpZihPYmplY3Qua2V5cyh0KS5sZW5ndGg9PT0wKXJldHVybiBvYShlKTtsZXQgcj1bXSxvPW4ucmVwbGFjZSgkUywoaSxzLGwpPT57aWYoIXRbbF0pcmV0dXJuIGk7bGV0IGM9ci5sZW5ndGg7cmV0dXJuIHIucHVzaCh7dGV4dDpzLGZuSWQ6bH0pLGA8IS0tRk5SRUY6JHtjfS0tPmB9KSxhPW9hKG8pO3JldHVybiBhPWEucmVwbGFjZSgvPCEtLUZOUkVGOihcZCspLS0+L2csKGkscyk9PntsZXR7dGV4dDpsLGZuSWQ6Y309cltwYXJzZUludChzKV0sZD10W2NdO2lmKCFkKXJldHVybiBsO2xldCB1PW9hKGwpO3JldHVybiBxUyh1LGQpfSksYX1mdW5jdGlvbiBpYShlKXtpZighZSlyZXR1cm47bGV0IHQ9ZS5xdWVyeVNlbGVjdG9yQWxsKCIucmljaC1mb290bm90ZS1saW5rW2RhdGEtcmljaC1mb290bm90ZV0iKTtmb3IobGV0IG4gb2YgdCl7aWYobi5fdGlwcHlSaWNoRm9vdG5vdGUpY29udGludWU7bGV0IHI7dHJ5e3I9SlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQobi5kYXRhc2V0LnJpY2hGb290bm90ZSkpfWNhdGNoe2NvbnRpbnVlfWlmKCEhIShyLmRlc2NyaXB0aW9ufHxyLnRleHQ/Lmxlbmd0aHx8ci5pbWFnZXM/Lmxlbmd0aHx8ci52aWRlb3M/Lmxlbmd0aCkpY29udGludWU7bGV0IGE9WVMociksaT1taShuLHtjb250ZW50OmEsYWxsb3dIVE1MOiEwLGludGVyYWN0aXZlOiEwLHRyaWdnZXI6Im1hbnVhbCIscGxhY2VtZW50OiJib3R0b20tc3RhcnQiLHRoZW1lOiJyaWNoLWZvb3Rub3RlIixtYXhXaWR0aDo0MjAsYXJyb3c6ITAsZHVyYXRpb246WzE1MCwxMDBdLGFwcGVuZFRvOigpPT5kb2N1bWVudC5ib2R5LG9uU2hvd24oKXtsZXQgcz1pLnBvcHBlci5xdWVyeVNlbGVjdG9yKCIucmljaC1mb290bm90ZS1wb3B1cC1jbG9zZSIpO3MmJnMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT5pLmhpZGUoKSx7b25jZTohMH0pfX0pO24uX3RpcHB5UmljaEZvb3Rub3RlPWksbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIscz0+e2lmKGkuc3RhdGUuaXNWaXNpYmxlKXtpLmhpZGUoKTtyZXR1cm59cy5wcmV2ZW50RGVmYXVsdCgpLHMuc3RvcFByb3BhZ2F0aW9uKCksaS5zaG93KCl9KX19dmFyIE9sPTM7ZnVuY3Rpb24gJHYoZSx0KXtyZXR1cm4hQXJyYXkuaXNBcnJheShlKXx8IXQ/W106ZS5maWx0ZXIobj0+bj8uc3RhcnQmJnFuKG4uc3RhcnQpPT09dCl9ZnVuY3Rpb24ga3Aoe2FwcDplLGNhbGVuZGFyRXZlbnRzOnQsY3VycmVudERhdGU6bixzZWxlY3RlZERhdGU6cix0YXNrczpvLHRpbWVGb3JtYXQ6YX0pe2xldCBpPVhuLmNyZWF0ZUVsZW1lbnQsW3MsbF09KDAsWG4udXNlU3RhdGUpKDApLGM9KDAsWG4udXNlUmVmKShudWxsKSxkPXFuKG58fG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSksdT1PYmplY3Qua2V5cyhvfHx7fSkuc29ydCgpLGY9QXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGg+MD8kdih0LGQpOltdLHk9QXJyYXkuZnJvbShuZXcgU2V0KFsuLi51LC4uLmYubGVuZ3RoPjA/W2RdOltdXSkpLnNvcnQoKSx3PXImJiF5LmluY2x1ZGVzKHIpP1suLi55LHJdLnNvcnQoKTp5LGI9TWF0aC5tYXgoMSxNYXRoLmNlaWwody5sZW5ndGgvT2wpKTsoMCxYbi51c2VFZmZlY3QpKCgpPT57aWYoIXIpcmV0dXJuO2xldCBPPXcuaW5kZXhPZihyKTtPPj0wJiZsKE1hdGguZmxvb3IoTy9PbCkpfSxbcl0pLCgwLFhuLnVzZUVmZmVjdCkoKCk9PntpYShjLmN1cnJlbnQpfSk7bGV0IHY9TWF0aC5taW4ocyxiLTEpLGg9dy5zbGljZSh2Kk9sLCh2KzEpKk9sKSxnPU89Pk8uaW1wb3J0YW50JiZPLnVyZ2VudD8icHJpb3JpdHktY3JpdGljYWwiOk8uaW1wb3J0YW50PyJwcmlvcml0eS1pbXBvcnRhbnQiOk8udXJnZW50PyJwcmlvcml0eS11cmdlbnQiOiJwcmlvcml0eS1ub3JtYWwiLG09Tz0+e2lmKCFPKXJldHVybiBudWxsO2lmKE8gaW5zdGFuY2VvZiBEYXRlKXJldHVybiBPLmdldFRpbWUoKTtpZih0eXBlb2YgTz09Im51bWJlciIpcmV0dXJuIE88MWUxMD9PKjFlMzpPO2lmKHR5cGVvZiBPPT0ic3RyaW5nIil7bGV0IGo9bmV3IERhdGUoTykuZ2V0VGltZSgpO3JldHVybiBOdW1iZXIuaXNOYU4oaik/bnVsbDpqfXJldHVybiBudWxsfSx4PU89PntsZXQgaj1tKE8/LmVuZCksWD1tKE8/LnN0YXJ0KTtyZXR1cm4gaj09bnVsbHx8WD09bnVsbHx8ajw9WD9udWxsOk1hdGgucm91bmQoKGotWCkvNmU0KX0sUz1PPT57bGV0IGo9bShPKTtpZighailyZXR1cm4iIjtsZXQgWD1hPT09IjI0aCI/e2hvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsaG91cjEyOiExfTp7aG91cjoiMi1kaWdpdCIsbWludXRlOiIyLWRpZ2l0In07cmV0dXJuIG5ldyBEYXRlKGopLnRvTG9jYWxlVGltZVN0cmluZyhbXSxYKX0sXz1PPT5PLm5vdGVVVUlEfHxPLm5vdGVVdWlkfHxPLm5vdGU/LnV1aWR8fG51bGwsRD1PPT5PLm5vdGVOYW1lfHxPLm5vdGVUaXRsZXx8Ty5ub3RlPy5uYW1lfHwiT3BlbiBub3RlIixBPWFzeW5jIE89PntsZXQgaj1fKE8pOyFqfHwhTy51dWlkfHxhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7an0/aGlnaGxpZ2h0VGFza1VVSUQ9JHtPLnV1aWR9YCl9LFQ9YXN5bmMoTyxqKT0+e2ouc3RvcFByb3BhZ2F0aW9uKCk7bGV0IFg9XyhPKTtYJiZhd2FpdCBlLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7WH1gKX0sTD1PPT5uZXcgRGF0ZShgJHtPfVQwMDowMDowMGApLnRvTG9jYWxlRGF0ZVN0cmluZyhbXSx7d2Vla2RheToic2hvcnQiLG1vbnRoOiJzaG9ydCIsZGF5OiJudW1lcmljIn0pLHo9RGF0ZS5ub3coKSxJPU89Pk8uZmlsdGVyKGo9PntsZXQgWD1tKGouaGlkZVVudGlsKTtyZXR1cm4gWD09bnVsbD8hMDpYPD16fSksTT0oTyxqKT0+e2lmKGoudHlwZT09PSJldmVudCImJmouZXZlbnQuYWxsRGF5KXJldHVybiBuZXcgRGF0ZShgJHtPfVQwMDowMDowMGApLmdldFRpbWUoKTtsZXQgWD1qLnR5cGU9PT0iZXZlbnQiP2ouZXZlbnQuc3RhcnQ6ai50YXNrLnN0YXJ0QXR8fGoudGFzay5kZWFkbGluZSxOPW0oWCk7cmV0dXJuIE4/P051bWJlci5QT1NJVElWRV9JTkZJTklUWX0sRj0oTyxqLFgpPT5bLi4uWC5tYXAoKE4sayk9Pih7aW5kZXg6ayxzb3J0TXM6TShPLHt0YXNrOk4sdHlwZToidGFzayJ9KSx0YXNrOk4sdHlwZToidGFzayJ9KSksLi4uai5tYXAoKE4sayk9Pih7ZXZlbnQ6TixpbmRleDprLHNvcnRNczpNKE8se2V2ZW50Ok4sdHlwZToiZXZlbnQifSksc291cmNlT3JkZXI6WC5sZW5ndGgrayx0eXBlOiJldmVudCJ9KSldLm1hcCgoTixrKT0+KHsuLi5OLHNvdXJjZU9yZGVyOk4uc291cmNlT3JkZXI/P2t9KSkuc29ydCgoTixrKT0+Ti5zb3J0TXMtay5zb3J0TXN8fE4uc291cmNlT3JkZXItay5zb3VyY2VPcmRlciksVT1iPjE/aSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtcGFnaW5hdGlvbiJ9LGkoImJ1dHRvbiIse2NsYXNzTmFtZToiYWdlbmRhLXBhZ2UtYXJyb3ciLG9uQ2xpY2s6KCk9PmwoTz0+TWF0aC5tYXgoMCxPLTEpKSxkaXNhYmxlZDp2PT09MH0sIlx1MjVDMCIpLGkoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS1wYWdlLWluZGljYXRvciJ9LGAke3YrMX0gLyAke2J9YCksaSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJhZ2VuZGEtcGFnZS1hcnJvdyIsb25DbGljazooKT0+bChPPT5NYXRoLm1pbihiLTEsTysxKSksZGlzYWJsZWQ6dj49Yi0xfSwiXHUyNUI2IikpOm51bGw7cmV0dXJuIGkob2Use3RpdGxlOnJlKCJhZ2VuZGEiKSxpY29uOiJcdXsxRjRDQn0iLHdpZGdldElkOiJhZ2VuZGEiLGhlYWRlckFjdGlvbnM6VX0saSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtbGlzdCIscmVmOmN9LGgubWFwKE89PntsZXQgaj1vW09dfHxbXSxYPUkoaiksTj0kdih0LE8pLGs9RihPLE4sWCk7cmV0dXJuIGkoInNlY3Rpb24iLHtrZXk6TyxjbGFzc05hbWU6ImFnZW5kYS1kYXkifSxpKCJoNCIse2NsYXNzTmFtZToiYWdlbmRhLWRhdGUtbGFiZWwifSxMKE8pKSxYLmxlbmd0aD09PTAmJk4ubGVuZ3RoPT09MD9pKCJwIix7Y2xhc3NOYW1lOiJhZ2VuZGEtZW1wdHktZGF5In0sTz09PWQ/Ik5vIHRhc2tzIHNjaGVkdWxlZCBmb3IgdG9kYXkiOiJObyB0YXNrcyBzY2hlZHVsZWQiKTprLm1hcChSPT5SLnR5cGU9PT0idGFzayI/aSgiZGl2Iix7a2V5OlIudGFzay51dWlkLGNsYXNzTmFtZToiYWdlbmRhLWl0ZW0gYWdlbmRhLXRhc2stcm93IixvbkNsaWNrOkI9PntCLnRhcmdldC5jbG9zZXN0KCJhIil8fEEoUi50YXNrKX19LGkoImRpdiIse2NsYXNzTmFtZTpgYWdlbmRhLWluZGljYXRvciAke2coUi50YXNrKX1gfSksaSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtY29udGVudCJ9LGkoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS10aW1lIix0aXRsZTpgJHtSLnRhc2suc3RhcnRBdD8iU3RhcnQiOiJEZWFkbGluZSJ9IHRpbWUgZm9yIHRhc2tgfSxTKFIudGFzay5zdGFydEF0fHxSLnRhc2suZGVhZGxpbmUpKSxpKCJzcGFuIix7Y2xhc3NOYW1lOiJhZ2VuZGEtdGV4dCIsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpwbyhSLnRhc2suY29udGVudCl8fCJVbnRpdGxlZCB0YXNrIn19KSxfKFIudGFzayk/aSgiYnV0dG9uIix7dHlwZToiYnV0dG9uIixjbGFzc05hbWU6ImFnZW5kYS1ub3RlLWxpbmsiLG9uQ2xpY2s6Qj0+VChSLnRhc2ssQil9LEQoUi50YXNrKSk6bnVsbCksbShSLnRhc2suZW5kQXQpJiZtKFIudGFzay5zdGFydEF0KSYmbShSLnRhc2suZW5kQXQpPm0oUi50YXNrLnN0YXJ0QXQpP2koInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS1kdXJhdGlvbiJ9LE1hdGgucm91bmQoKG0oUi50YXNrLmVuZEF0KS1tKFIudGFzay5zdGFydEF0KSkvNmU0KSsibSIpOm51bGwpOmkoImRpdiIse2tleTpgY2FsLSR7Ui5pbmRleH1gLGNsYXNzTmFtZToiYWdlbmRhLWl0ZW0gYWdlbmRhLXRhc2stcm93In0saSgiZGl2Iix7Y2xhc3NOYW1lOiJhZ2VuZGEtaW5kaWNhdG9yIHByaW9yaXR5LW5vcm1hbCJ9KSxpKCJkaXYiLHtjbGFzc05hbWU6ImFnZW5kYS1jb250ZW50In0sUi5ldmVudC5hbGxEYXk/aSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLXRpbWUifSwiQWxsIGRheSIpOlIuZXZlbnQuc3RhcnQ/aSgic3BhbiIse2NsYXNzTmFtZToiYWdlbmRhLXRpbWUifSxTKFIuZXZlbnQuc3RhcnQpKTpudWxsLGkoInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS10ZXh0In0sUi5ldmVudC50aXRsZXx8IkNhbGVuZGFyIGV2ZW50IiksUi5ldmVudC5jYWxlbmRhcj8ubmFtZT9pKCJzcGFuIix7Y2xhc3NOYW1lOiJhZ2VuZGEtbm90ZS1saW5rIn0sUi5ldmVudC5jYWxlbmRhci5uYW1lKTpudWxsKSx4KFIuZXZlbnQpP2koInNwYW4iLHtjbGFzc05hbWU6ImFnZW5kYS1kdXJhdGlvbiJ9LHgoUi5ldmVudCkrIm0iKTpudWxsKSkpfSkpKX12YXIgSWw9cGUoZGUoKSk7ZnVuY3Rpb24geHAoe2FwcDplLGNvbXBsZXRlZFRhc2tzQnlEYXRlOnQsY3VycmVudERhdGU6bixncmlkSGVpZ2h0U2l6ZTpyLGdyaWRXaWR0aFNpemU6byxvbkRhdGVTZWxlY3Q6YSxvbk9wZW5TZXR0aW5nczppLG9wZW5UYXNrczpzLHNlbGVjdGVkRGF0ZTpsLHdlZWtGb3JtYXQ6Y30pe2xldCBkPUlsLmNyZWF0ZUVsZW1lbnQsdT1uZXcgRGF0ZShuKSxbcCxmXT0oMCxJbC51c2VTdGF0ZSkobmV3IERhdGUodS5nZXRGdWxsWWVhcigpLHUuZ2V0TW9udGgoKSwxKSkseT1jPT09Im1vbmRheSI/MTowLHc9bmV3IERhdGUocC5nZXRGdWxsWWVhcigpLHAuZ2V0TW9udGgoKSsxLDApLmdldERhdGUoKSxiPShuZXcgRGF0ZShwLmdldEZ1bGxZZWFyKCkscC5nZXRNb250aCgpLDEpLmdldERheSgpLXkrNyklNyx2PXk9PT0xP1siTW8iLCJUdSIsIldlIiwiVGgiLCJGciIsIlNhIiwiU3UiXTpbIlN1IiwiTW8iLCJUdSIsIldlIiwiVGgiLCJGciIsIlNhIl0saD17fSxnPXAuZ2V0RnVsbFllYXIoKSxtPXAuZ2V0TW9udGgoKSx4PWAke2d9LSR7U3RyaW5nKG0rMSkucGFkU3RhcnQoMiwiMCIpfS1gO1tzLHRdLmZvckVhY2goTT0+e09iamVjdC5rZXlzKE18fHt9KS5mb3JFYWNoKEY9PntpZihGLnN0YXJ0c1dpdGgoeCkpe2xldCBVPXBhcnNlSW50KEYuc3Vic3RyaW5nKDgpLDEwKTtoW1VdPShoW1VdfHwwKSsoTVtGXT8ubGVuZ3RofHwwKX19KX0pO2xldCBTPSgpPT5mKG5ldyBEYXRlKHAuZ2V0RnVsbFllYXIoKSxwLmdldE1vbnRoKCktMSwxKSksXz0oKT0+ZihuZXcgRGF0ZShwLmdldEZ1bGxZZWFyKCkscC5nZXRNb250aCgpKzEsMSkpLEQ9cC50b0xvY2FsZVN0cmluZygiZGVmYXVsdCIse21vbnRoOiJsb25nIix5ZWFyOiJudW1lcmljIn0pLEE9TT0+TT09PXUuZ2V0RGF0ZSgpJiZwLmdldE1vbnRoKCk9PT11LmdldE1vbnRoKCkmJnAuZ2V0RnVsbFllYXIoKT09PXUuZ2V0RnVsbFllYXIoKSxUPU09PntsZXQgRj1wLmdldEZ1bGxZZWFyKCksVT1TdHJpbmcocC5nZXRNb250aCgpKzEpLnBhZFN0YXJ0KDIsIjAiKSxPPVN0cmluZyhNKS5wYWRTdGFydCgyLCIwIik7cmV0dXJuYCR7Rn0tJHtVfS0ke099YH0sTD1NPT5sJiZUKE0pPT09bCx6PU09PntpZihhKXtsZXQgRj1UKE0pO2EoRj09PWw/bnVsbDpGKX19LEk9W107Zm9yKGxldCBNPTA7TTxiO00rKylJLnB1c2goZCgiZGl2Iix7a2V5OiJlbXB0eS0iK00sY2xhc3NOYW1lOiJjYWwtY2VsbCBlbXB0eSJ9KSk7Zm9yKGxldCBNPTE7TTw9dztNKyspe2xldCBGPWhbTV18fDAsVT1GPT09MD8ibm9uZSI6Rjw9Mj8iIzg2ZWZhYyI6Rjw9NT8iI2ZiYmYyNCI6IiNmODcxNzEiLE89ImNhbC1jZWxsIjtBKE0pJiYoTys9IiB0b2RheSIpLEwoTSkmJihPKz0iIHNlbGVjdGVkIiksSS5wdXNoKGQoImRpdiIse2tleTpNLGNsYXNzTmFtZTpPLG9uQ2xpY2s6KCk9PnooTSl9LGQoInNwYW4iLHtjbGFzc05hbWU6ImNhbC1kYXkifSxNKSxVIT09Im5vbmUiP2QoInNwYW4iLHtjbGFzc05hbWU6ImNhbC1kb3QiLHN0eWxlOntiYWNrZ3JvdW5kQ29sb3I6VX19KTpudWxsKSl9cmV0dXJuIGQob2Use2NvbmZpZ3VyYWJsZTohMCxncmlkSGVpZ2h0U2l6ZTpyLGdyaWRXaWR0aFNpemU6byxpY29uOiJcdXsxRjRDNX0iLG9uQ29uZmlndXJlOmksdGl0bGU6cmUoImNhbGVuZGFyIiksd2lkZ2V0SWQ6ImNhbGVuZGFyIn0sZCgiZGl2Iix7Y2xhc3NOYW1lOiJjYWwtbmF2In0sZCgiYnV0dG9uIix7b25DbGljazpTLGNsYXNzTmFtZToiY2FsLWFycm93In0sIlx1MjVDMCIpLGQoInNwYW4iLHtjbGFzc05hbWU6ImNhbC1tb250aCJ9LEQpLGQoImJ1dHRvbiIse29uQ2xpY2s6XyxjbGFzc05hbWU6ImNhbC1hcnJvdyJ9LCJcdTI1QjYiKSksZCgiZGl2Iix7Y2xhc3NOYW1lOiJjYWwtZ3JpZCJ9LHYubWFwKE09PmQoImRpdiIse2tleTpNLGNsYXNzTmFtZToiY2FsLWhlYWRlciJ9LE0pKSwuLi5JKSl9dmFyIFd2PSJsYXlvdXQtcGlja2VyIjtmdW5jdGlvbiBRUygpe3JldHVybiBPdC5maWx0ZXIoZT0+ZS53aWRnZXRJZCE9PVd2KS5tYXAoZT0+KHt3aWRnZXRJZDplLndpZGdldElkLGdyaWRXaWR0aFNpemU6ZS5kZWZhdWx0R3JpZFdpZHRoU2l6ZX0pKX12YXIgc2E9W3tpZDoiZ29hbC1vcmllbnRlZCIsbmFtZToiR29hbC1PcmllbnRlZCAoUmVjb21tZW5kZWQpIixpY29uOiJcdXsxRjNBRn0iLGRlc2NyaXB0aW9uOiJRdWFydGVybHkgcGxhbm5pbmcsIHZpY3RvcnkgdHJhY2tpbmcsIGFuZCBBSSBjb2FjaGluZyBhbG9uZ3NpZGUgeW91ciBkYWlseSB0YXNrIGxpc3QuIEJlc3QgZm9yIHVzZXJzIGFjdGl2ZWx5IHdvcmtpbmcgdG93YXJkIGxvbmctaG9yaXpvbiBnb2Fscy4iLHdpZGdldHM6UVMoKX0se2lkOiJkYXktdG8tZGF5IixuYW1lOiJEYXktdG8tRGF5IixpY29uOiJcdXsxRjRDNX0iLGRlc2NyaXB0aW9uOiJFeGVjdXRpbmcgdG9kYXkncyB3b3JrIFx1MjAxNCB0YXNrcywgc2NoZWR1bGUsIGFuZCBkYWlseSBwbGFubmluZyB3aXRob3V0IGxvbmdlci1ob3Jpem9uIG5vaXNlLiBObyBtb29kIHRyYWNraW5nIG9yIGdvYWwgd2lkZ2V0cy4iLHdpZGdldHM6W3t3aWRnZXRJZDoiYWdlbmRhIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoiZGF5LXNrZXRjaCIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6ImNhbGVuZGFyIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoiZHJlYW0tdGFzayIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6ImdyYXZleWFyZCIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InF1b3RlcyIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InJlY2VudC1ub3RlcyIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InBlYWstaG91cnMiLGdyaWRXaWR0aFNpemU6Mn1dfSx7aWQ6Im1pbmRmdWwtYWNoaWV2ZXIiLG5hbWU6Ik1pbmRmdWwgQWNoaWV2ZXIiLGljb246Ilx1ezFGMzMxfSIsZGVzY3JpcHRpb246IkZvciB0aG9zZSB3aG8gdHJhY2sgd2VsbGJlaW5nIGFsb25nc2lkZSB0YXNrcy4gQmFsYW5jZXMgbW9vZCwgaW5zcGlyYXRpb24sIGFuZCB0YXNrIGh5Z2llbmUgXHUyMDE0IHdpdGhvdXQgb3ZlcndoZWxtaW5nIHRoZSB2aWV3IHdpdGggcGxhbm5pbmcgd2lkZ2V0cy4iLHdpZGdldHM6W3t3aWRnZXRJZDoiYWdlbmRhIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoicXVvdGVzIixncmlkV2lkdGhTaXplOjJ9LHt3aWRnZXRJZDoibW9vZCIsZ3JpZFdpZHRoU2l6ZToxfSx7d2lkZ2V0SWQ6ImRheS1za2V0Y2giLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJncmF2ZXlhcmQiLGdyaWRXaWR0aFNpemU6MX0se3dpZGdldElkOiJwbGFubmluZyIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6ImRyZWFtLXRhc2siLGdyaWRXaWR0aFNpemU6Mn0se3dpZGdldElkOiJjYWxlbmRhciIsZ3JpZFdpZHRoU2l6ZToyfSx7d2lkZ2V0SWQ6InZpY3RvcnktdmFsdWUiLGdyaWRXaWR0aFNpemU6Mn1dfV07ZnVuY3Rpb24gTmkoZSl7bGV0IHQ9T2JqZWN0LmZyb21FbnRyaWVzKE90Lm1hcChuPT5bbi53aWRnZXRJZCx7Z3JpZEhlaWdodFNpemU6MSxncmlkV2lkdGhTaXplOm4uZGVmYXVsdEdyaWRXaWR0aFNpemV8fDF9XSkpO3JldHVybihlPy53aWRnZXRzfHxbXSkuZm9yRWFjaChuPT57dFtuLndpZGdldElkXSYmKHRbbi53aWRnZXRJZF09ey4uLnRbbi53aWRnZXRJZF0sZ3JpZFdpZHRoU2l6ZTpOdW1iZXIobi5ncmlkV2lkdGhTaXplKXx8dFtuLndpZGdldElkXS5ncmlkV2lkdGhTaXplfSl9KSx0fWZ1bmN0aW9uIEJ2KGUsdCl7bGV0IHI9KEFycmF5LmlzQXJyYXkoZSk/ZTpbXSkuZmlsdGVyKGk9Pmkud2lkZ2V0SWQhPT1Xdiksbz10LndpZGdldHMsYT1OaSh0KTtyZXR1cm4gci5sZW5ndGghPT1vLmxlbmd0aD8hMTpvLmV2ZXJ5KChpLHMpPT5yW3NdPy53aWRnZXRJZD09PWkud2lkZ2V0SWQmJk51bWJlcihyW3NdPy5ncmlkV2lkdGhTaXplKT09PWFbaS53aWRnZXRJZF0/LmdyaWRXaWR0aFNpemUpfWZ1bmN0aW9uIEh2KGUpe3JldHVybiBzYS5maW5kKHQ9PnQuaWQ9PT1lKXx8bnVsbH12YXIgUnQ9cGUoZGUoKSk7ZnVuY3Rpb24gR3YoZSl7cmV0dXJuIE90LmZpbmQodD0+dC53aWRnZXRJZD09PWUpfWZ1bmN0aW9uIEpTKGUsdCl7bGV0IG49bmV3IFNldCh0fHxbXSkscj1PdC5tYXAocz0+cy53aWRnZXRJZCkuZmlsdGVyKHM9PiFuLmhhcyhzKSksYT0oQXJyYXkuaXNBcnJheShlKT9lOltdKS5tYXAocz0+cy53aWRnZXRJZCkuZmlsdGVyKHM9PnIuaW5jbHVkZXMocykpLGk9ci5maWx0ZXIocz0+IWEuaW5jbHVkZXMocykpO3JldHVybntyZW5kZXJlZElkczphLGhpZGRlbklkczppfX1mdW5jdGlvbiBqdihlLHQpe2xldCBuPW5ldyBTZXQodHx8W10pLHI9e307cmV0dXJuIE90LmZpbHRlcihhPT4hbi5oYXMoYS53aWRnZXRJZCkpLmZvckVhY2goYT0+e3JbYS53aWRnZXRJZF09e2dyaWRXaWR0aFNpemU6YS5kZWZhdWx0R3JpZFdpZHRoU2l6ZXx8MSxncmlkSGVpZ2h0U2l6ZToxfX0pLChBcnJheS5pc0FycmF5KGUpP2U6W10pLmZvckVhY2goYT0+e3JbYS53aWRnZXRJZF0mJihyW2Eud2lkZ2V0SWRdPXtncmlkV2lkdGhTaXplOmEuZ3JpZFdpZHRoU2l6ZXx8clthLndpZGdldElkXS5ncmlkV2lkdGhTaXplLGdyaWRIZWlnaHRTaXplOmEuZ3JpZEhlaWdodFNpemV8fDF9KX0pLHJ9ZnVuY3Rpb24gWFMoZSx0LG4scil7bGV0IG89Wy4uLmUsLi4udF0sYT1vLmluZGV4T2Yobik7aWYocj09PSJ1cCImJmE9PT0wfHxyPT09ImRvd24iJiZhPT09by5sZW5ndGgtMSlyZXR1cm4gbnVsbDtsZXQgaT1bLi4ub10scz1yPT09InVwIj9hLTE6YSsxO3JldHVybltpW2FdLGlbc11dPVtpW3NdLGlbYV1dLHtyZW5kZXJlZElkczppLnNsaWNlKDAsZS5sZW5ndGgpLGhpZGRlbklkczppLnNsaWNlKGUubGVuZ3RoKX19ZnVuY3Rpb24gWlMoZSx0LG4scil7bGV0IG89ZS5maWx0ZXIoaT0+aSE9PW4pLGE9dC5maWx0ZXIoaT0+aSE9PW4pO3JldHVybiBlLmluY2x1ZGVzKHIpP28uc3BsaWNlKG8uaW5kZXhPZihyKSwwLG4pOmEuc3BsaWNlKGEuaW5kZXhPZihyKSwwLG4pLHtyZW5kZXJlZElkczpvLGhpZGRlbklkczphfX1mdW5jdGlvbiBlRShlLHQsbixyKXtsZXQgbz1lLmZpbHRlcihpPT5pIT09biksYT10LmZpbHRlcihpPT5pIT09bik7cmV0dXJuKHI9PT0icmVuZGVyZWQiP286YSkucHVzaChuKSx7cmVuZGVyZWRJZHM6byxoaWRkZW5JZHM6YX19ZnVuY3Rpb24gdEUoZSx0LG4pe2xldCByPUd2KHQpO2lmKCFyKXJldHVybiBudWxsO2xldCBvPVsuLi5uLnJlbmRlcmVkSWRzLC4uLm4uaGlkZGVuSWRzXSxhPW8uaW5kZXhPZih0KTtyZXR1cm4gZSgiZGl2Iix7a2V5OnQsY2xhc3NOYW1lOlsiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtIixuLmRyYWdnaW5nSWQ9PT10PyJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0tLWRyYWdnaW5nIjoiIixuLmRyYWdPdmVySWQ9PT10PyJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0tLWRyYWctb3ZlciI6IiJdLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIiksZHJhZ2dhYmxlOiEwLG9uRHJhZ1N0YXJ0Omk9Pm4ub25EcmFnU3RhcnQoaSx0KSxvbkRyYWdFbmQ6bi5vbkRyYWdFbmQsb25EcmFnT3ZlcjppPT5uLm9uRHJhZ092ZXJJdGVtKGksdCksb25Ecm9wOmk9Pm4ub25Ecm9wT25JdGVtKGksdCl9LGUoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1oYW5kbGUiLCJhcmlhLWhpZGRlbiI6InRydWUifSwiXHUyODNGIiksZSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWljb24iLCJhcmlhLWhpZGRlbiI6InRydWUifSxyLmljb24pLGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWluZm8ifSxlKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0tbmFtZSJ9LHIubmFtZSksci5kZXNjcmlwdGlvbiYmZSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWRlc2NyaXB0aW9uIn0sci5kZXNjcmlwdGlvbikpLGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1pdGVtLWFjdGlvbnMifSxlKCJidXR0b24iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtYXJyb3ctYnV0dG9uIix0eXBlOiJidXR0b24iLGRpc2FibGVkOmE9PT0wLHRpdGxlOiJNb3ZlIHVwIiwiYXJpYS1sYWJlbCI6YE1vdmUgJHtyLm5hbWV9IHVwYCxvbkNsaWNrOmk9PntpLnN0b3BQcm9wYWdhdGlvbigpLG4ub25Nb3ZlKHQsInVwIil9fSwiXHUyMTkxIiksZSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWFycm93LWJ1dHRvbiIsdHlwZToiYnV0dG9uIixkaXNhYmxlZDphPT09by5sZW5ndGgtMSx0aXRsZToiTW92ZSBkb3duIiwiYXJpYS1sYWJlbCI6YE1vdmUgJHtyLm5hbWV9IGRvd25gLG9uQ2xpY2s6aT0+e2kuc3RvcFByb3BhZ2F0aW9uKCksbi5vbk1vdmUodCwiZG93biIpfX0sIlx1MjE5MyIpKSl9ZnVuY3Rpb24gVnYoZSx0LG4scixvLGEpe3JldHVybiBlKCJkaXYiLHtjbGFzc05hbWU6WyJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNlY3Rpb24iLGEuZHJhZ092ZXJTZWN0aW9uPT09dD8iZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zZWN0aW9uLS1kcmFnLW92ZXIiOiIiXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpLG9uRHJhZ092ZXI6aT0+YS5vbkRyYWdPdmVyU2VjdGlvbihpLHQpLG9uRHJhZ0xlYXZlOmEub25EcmFnTGVhdmVTZWN0aW9uLG9uRHJvcDppPT5hLm9uRHJvcE9uU2VjdGlvbihpLHQpfSxlKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2VjdGlvbi1oZWFkZXIifSxlKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNlY3Rpb24taWNvbiIsImFyaWEtaGlkZGVuIjoidHJ1ZSJ9LHIpLGUoImg0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNlY3Rpb24tdGl0bGUifSxuKSksby5sZW5ndGg9PT0wP2UoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1lbXB0eSJ9LHQ9PT0icmVuZGVyZWQiPyJEcmFnIGNvbXBvbmVudHMgaGVyZSB0byBzaG93IHRoZW0gb24gdGhlIGRhc2hib2FyZCI6IkFsbCBjb21wb25lbnRzIGFyZSBjdXJyZW50bHkgc2hvd24iKTplKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtbGlzdCJ9LC4uLm8ubWFwKGk9PnRFKGUsaSxhKSkpKX1mdW5jdGlvbiBuRShlLHQsbixyKXtsZXQgbz1Hdih0KTtpZighbylyZXR1cm4gbnVsbDtsZXQgYT1uW3RdPy5ncmlkV2lkdGhTaXplPz9vLmRlZmF1bHRHcmlkV2lkdGhTaXplPz8xLGk9blt0XT8uZ3JpZEhlaWdodFNpemU/PzEscz1vLm1heEhvcml6b250YWxUaWxlc3x8NCxsPW8ubWF4VmVydGljYWxUaWxlc3x8MjtyZXR1cm4gZSgiZGl2Iix7a2V5OnQsY2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1pdGVtIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1pdGVtLWhlYWRlciJ9LGUoInNwYW4iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtaXRlbS1pY29uIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIn0sby5pY29uKSxlKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWl0ZW0tbmFtZSJ9LG8ubmFtZSkpLGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctaXRlbS1jb250cm9scyJ9LGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctZmllbGQifSxlKCJsYWJlbCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctbGFiZWwifSwiV2lkdGgiKSxlKCJzZWxlY3QiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nLXNlbGVjdCIsdmFsdWU6YSxvbkNoYW5nZTpjPT5yKHQsImdyaWRXaWR0aFNpemUiLE51bWJlcihjLnRhcmdldC52YWx1ZSkpfSwuLi5BcnJheS5mcm9tKHtsZW5ndGg6c30sKGMsZCk9PmUoIm9wdGlvbiIse2tleTpkKzEsdmFsdWU6ZCsxfSxgJHtkKzF9YCkpKSksZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1maWVsZCJ9LGUoImxhYmVsIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXNpemluZy1sYWJlbCJ9LCJWZXJ0aWNhbCB0aWxlcyIpLGUoInNlbGVjdCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1zaXppbmctc2VsZWN0Iix2YWx1ZTppLG9uQ2hhbmdlOmM9PnIodCwiZ3JpZEhlaWdodFNpemUiLE51bWJlcihjLnRhcmdldC52YWx1ZSkpfSwuLi5BcnJheS5mcm9tKHtsZW5ndGg6bH0sKGMsZCk9PmUoIm9wdGlvbiIse2tleTpkKzEsdmFsdWU6ZCsxfSxgJHtkKzF9YCkpKSkpKX1mdW5jdGlvbiByRShlLHQpe2xldHtyZW5kZXJlZElkczpuLGhpZGRlbklkczpyfT1KUyhlLHQpLFtvLGFdPSgwLFJ0LnVzZVN0YXRlKShuKSxbaSxzXT0oMCxSdC51c2VTdGF0ZSkociksW2wsY109KDAsUnQudXNlU3RhdGUpKCgpPT5qdihlLHQpKSxbZCx1XT0oMCxSdC51c2VTdGF0ZSkobnVsbCksW3AsZl09KDAsUnQudXNlU3RhdGUpKG51bGwpLFt5LHddPSgwLFJ0LnVzZVN0YXRlKShudWxsKSxiPSgwLFJ0LnVzZVJlZikobnVsbCksW3YsaF09KDAsUnQudXNlU3RhdGUpKCExKSxnPSgpPT57Yi5jdXJyZW50PW51bGwsdShudWxsKSxmKG51bGwpLHcobnVsbCl9O3JldHVybntyZW5kZXJlZElkczpvLGhpZGRlbklkczppLHNpemluZzpsLGRyYWdnaW5nSWQ6ZCxkcmFnT3ZlcklkOnAsZHJhZ092ZXJTZWN0aW9uOnksaGFzUmVzZXQ6dixvbk1vdmU6KE0sRik9PntsZXQgVT1YUyhvLGksTSxGKTtVJiYoYShVLnJlbmRlcmVkSWRzKSxzKFUuaGlkZGVuSWRzKSl9LG9uRHJhZ1N0YXJ0OihNLEYpPT57Yi5jdXJyZW50PUYsTS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZD0ibW92ZSIscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT51KEYpKX0sb25EcmFnRW5kOigpPT5nKCksb25EcmFnT3Zlckl0ZW06KE0sRik9PntNLnByZXZlbnREZWZhdWx0KCksTS5zdG9wUHJvcGFnYXRpb24oKSxNLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PSJtb3ZlIixmKEYpLHcobnVsbCl9LG9uRHJhZ092ZXJTZWN0aW9uOihNLEYpPT57TS5wcmV2ZW50RGVmYXVsdCgpLE0uZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9Im1vdmUiLHcoRiksZihudWxsKX0sb25EcmFnTGVhdmVTZWN0aW9uOk09PntNLmN1cnJlbnRUYXJnZXQuY29udGFpbnMoTS5yZWxhdGVkVGFyZ2V0KXx8dyhudWxsKX0sb25Ecm9wT25JdGVtOihNLEYpPT57TS5wcmV2ZW50RGVmYXVsdCgpLE0uc3RvcFByb3BhZ2F0aW9uKCk7bGV0IFU9Yi5jdXJyZW50O2lmKGcoKSwhVXx8VT09PUYpcmV0dXJuO2xldHtyZW5kZXJlZElkczpPLGhpZGRlbklkczpqfT1aUyhvLGksVSxGKTthKE8pLHMoail9LG9uRHJvcE9uU2VjdGlvbjooTSxGKT0+e00ucHJldmVudERlZmF1bHQoKTtsZXQgVT1iLmN1cnJlbnQ7aWYoZygpLCFVKXJldHVybjtsZXR7cmVuZGVyZWRJZHM6TyxoaWRkZW5JZHM6an09ZUUobyxpLFUsRik7YShPKSxzKGopfSxvblNpemluZ0NoYW5nZTooTSxGLFUpPT57YyhPPT4oey4uLk8sW01dOnsuLi5PW01dLFtGXTpVfX0pKX0sb25SZXNldDpNPT57bGV0IEY9bmV3IFNldCh0fHxbXSksVT1IdihNKTtpZihVKXtsZXQgTz1VLndpZGdldHMubWFwKFg9Plgud2lkZ2V0SWQpLmZpbHRlcihYPT4hRi5oYXMoWCkpLGo9T3QubWFwKFg9Plgud2lkZ2V0SWQpLmZpbHRlcihYPT4hRi5oYXMoWCkpO2EoTykscyhqLmZpbHRlcihYPT4hTy5pbmNsdWRlcyhYKSkpLGMoTmkoVSkpfWVsc2V7bGV0IE89T3QubWFwKGo9Pmoud2lkZ2V0SWQpLmZpbHRlcihqPT4hRi5oYXMoaikpO2EoTykscyhbXSksYyhqdihudWxsLHQpKX1oKCEwKX19fWZ1bmN0aW9uIFNwKHtjdXJyZW50TGF5b3V0OmUsZXhjbHVkZVdpZGdldElkczp0LG9uU2F2ZTpuLG9uQ2FuY2VsOnIsc2VsZWN0ZWRMYXlvdXRQcm9maWxlOm99KXtsZXQgYT1SdC5jcmVhdGVFbGVtZW50LFtpLHNdPSgwLFJ0LnVzZVN0YXRlKSgiY29tcG9uZW50cyIpLFtsLGNdPSgwLFJ0LnVzZVN0YXRlKShvfHxudWxsKSxkPXJFKGUsdCkse3JlbmRlcmVkSWRzOnUsaGlkZGVuSWRzOnAsc2l6aW5nOmYsaGFzUmVzZXQ6eSxvblJlc2V0Oncsb25TaXppbmdDaGFuZ2U6Yn09ZCx2PWk9PT0iY29tcG9uZW50cyI/W1Z2KGEsInJlbmRlcmVkIiwiUmVuZGVyZWQgRGFzaGJvYXJkIEVsZW1lbnRzIiwiXHV7MUY0NDF9Iix1LGQpLFZ2KGEsImhpZGRlbiIsIkhpZGRlbiBEYXNoYm9hcmQgRWxlbWVudHMiLCJcdXsxRjZBQn0iLHAsZCldOlt1Lmxlbmd0aD09PTA/YSgiZGl2Iix7a2V5OiJlbXB0eSIsY2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLWVtcHR5In0sIk5vIHJlbmRlcmVkIGNvbXBvbmVudHMuIEFkZCBjb21wb25lbnRzIGluIHRoZSBDb21wb25lbnRzIHRhYi4iKTphKCJkaXYiLHtrZXk6InNpemluZy1saXN0IixjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtc2l6aW5nIn0sLi4udS5tYXAoaD0+bkUoYSxoLGYsYikpKV07cmV0dXJuIGEoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLW92ZXJsYXkiLG9uQ2xpY2s6aD0+aC50YXJnZXQ9PT1oLmN1cnJlbnRUYXJnZXQmJnIoKX0sYSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtY29udGFpbmVyIGRhc2hib2FyZC1sYXlvdXQtcG9wdXAifSxhKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1oZWFkZXIifSxhKCJoMyIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLXRpdGxlIn0sIlx1MjY5OVx1RkUwRiBEYXNoYm9hcmQgTGF5b3V0IiksYSgiZGl2Iix7Y2xhc3NOYW1lOiJleHBsYW5hdGlvbi1wYXJhZ3JhcGgifSwiQ3VzdG9taXplIHRoZSBvcmRlciBvZiB5b3VyIHdpZGdldHMgYnkgZHJhZ2dpbmcgb3Igc2l6aW5nIHRoZW0gaW4gdGhpcyBtZW51LiBZb3UgY2FuIGFsc28gcmVvcmRlciB3aWRnZXRzIG91dHNpZGUgdGhpcyBtZW51IGJ5IGNsaWNraW5nIG9uIHRoZWlyIGhlYWRlciBmb3IgMiBzZWNvbmRzIHRvIGVuZ2FnZSBkcmFnIHJlb3JkZXJpbmcuIiksYSgiZGl2Iix7Y2xhc3NOYW1lOiJleHBsYW5hdGlvbi1wYXJhZ3JhcGgifSxhKCJsYWJlbCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC1wcm9maWxlLWxhYmVsIn0sIkRlZmF1bHQgbGF5b3V0IiksYSgic2VsZWN0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXByb2ZpbGUtc2VsZWN0Iix2YWx1ZTpsfHwiIixvbkNoYW5nZTpoPT5jKGgudGFyZ2V0LnZhbHVlfHxudWxsKX0sYSgib3B0aW9uIix7dmFsdWU6IiJ9LCJDdXN0b20gKG5vIHByZXNldCkiKSwuLi5zYS5tYXAoaD0+YSgib3B0aW9uIix7a2V5OmguaWQsdmFsdWU6aC5pZH0saC5uYW1lKSkpKSxhKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1sYXlvdXQtcG9wdXAtdGFicyJ9LGEoImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWxheW91dC1wb3B1cC10YWIiKyhpPT09ImNvbXBvbmVudHMiPyIgYWN0aXZlIjoiIiksdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT5zKCJjb21wb25lbnRzIil9LCJDb21wb25lbnRzIiksYSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbGF5b3V0LXBvcHVwLXRhYiIrKGk9PT0ic2l6aW5nIj8iIGFjdGl2ZSI6IiIpLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+cygic2l6aW5nIil9LCJTaXppbmciKSkpLGEoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWJvZHkgZGFzaGJvYXJkLWxheW91dC1wb3B1cC1ib2R5In0sLi4udiksYSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYWN0aW9ucyJ9LGEoImJ1dHRvbiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWxpbmsiLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+dyhsKX0sIlJlc2V0IHRvIGRlZmF1bHRzIiksYSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYnRuIGNvbmZpZy1wb3B1cC1idG4tLWNhbmNlbCIsdHlwZToiYnV0dG9uIixvbkNsaWNrOnJ9LCJDYW5jZWwiKSxhKCJidXR0b24iLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1idG4gY29uZmlnLXBvcHVwLWJ0bi0tc3VibWl0Iix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9Pm4odSx5LGYsbCl9LCJTYXZlIExheW91dCIpKSkpfXZhciBLdj0iTWlzc2lvbiBDb250cm9sIERhc2hib2FyZDogcGx1Z2luIHNldHRpbmdzIjtmdW5jdGlvbiBZdigpe3RyeXtsZXR7aG91ckN5Y2xlOmV9PW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHZvaWQgMCx7aG91cjoibnVtZXJpYyJ9KS5yZXNvbHZlZE9wdGlvbnMoKTtyZXR1cm4gZT09PSJoMjMifHxlPT09ImgyNCI/IjI0aCI6Im1lcmlkaWFuIn1jYXRjaHtyZXR1cm4ibWVyaWRpYW4ifX1mdW5jdGlvbiBxdigpe3RyeXtsZXQgZT1uZXcgSW50bC5Mb2NhbGUobmF2aWdhdG9yLmxhbmd1YWdlKSx0PWUud2Vla0luZm98fGUuZ2V0V2Vla0luZm8/LigpO3JldHVybiB0Py5maXJzdERheT09PTd8fHQ/LmZpcnN0RGF5PT09MD8ic3VuZGF5IjoibW9uZGF5In1jYXRjaHtyZXR1cm4ibW9uZGF5In19ZnVuY3Rpb24gb0UoZSl7bGV0IHQ9e307aWYoIWUpcmV0dXJuIHQ7Zm9yKGxldCBuIG9mIGUuc3BsaXQoYApgKSl7bGV0IHI9bi5tYXRjaCgvXihbXjpdKyk6XHMqKC4rKS8pO2lmKCFyKWNvbnRpbnVlO2xldCBvPXJbMV0udHJpbSgpLnRvTG93ZXJDYXNlKCksYT1yWzJdLnRyaW0oKS50b0xvd2VyQ2FzZSgpO289PT0idGltZSBmb3JtYXQiJiYodC50aW1lRm9ybWF0PWEpLG89PT0id2VlayBmb3JtYXQiJiYodC53ZWVrRm9ybWF0PWEpfXJldHVybiB0fWZ1bmN0aW9uIFF2KGUpe2xldCB0PVtdO3JldHVybiBlLnRpbWVGb3JtYXQmJnQucHVzaChgVGltZSBmb3JtYXQ6ICR7ZS50aW1lRm9ybWF0fWApLGUud2Vla0Zvcm1hdCYmdC5wdXNoKGBXZWVrIGZvcm1hdDogJHtlLndlZWtGb3JtYXR9YCksdC5qb2luKGAKYCl9dmFyIERpPWNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuX2FwcD10LHRoaXMuX25vdGVVVUlEPW51bGwsdGhpcy5fc2V0dGluZ3M9bnVsbH1hc3luYyBsb2FkKCl7bGV0IHQ9YXdhaXQgdGhpcy5fYXBwLmZpbmROb3RlKHtuYW1lOkt2LHRhZ3M6W1JlXX0pO2lmKHQ/LnV1aWQpe3RoaXMuX25vdGVVVUlEPXQudXVpZDtsZXQgcj1hd2FpdCB0aGlzLl9hcHAuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6dC51dWlkfSk7cmV0dXJuIHRoaXMuX3NldHRpbmdzPW9FKHIpLHRoaXMuX3NldHRpbmdzLnRpbWVGb3JtYXR8fCh0aGlzLl9zZXR0aW5ncy50aW1lRm9ybWF0PVl2KCkpLHRoaXMuX3NldHRpbmdzLndlZWtGb3JtYXR8fCh0aGlzLl9zZXR0aW5ncy53ZWVrRm9ybWF0PXF2KCkpLEUoIltEYXNoYm9hcmRTZXR0aW5nTm90ZV0gbG9hZGVkIHNldHRpbmdzOiIsdGhpcy5fc2V0dGluZ3MpLHsuLi50aGlzLl9zZXR0aW5nc319dGhpcy5fc2V0dGluZ3M9e3RpbWVGb3JtYXQ6WXYoKSx3ZWVrRm9ybWF0OnF2KCl9O2xldCBuPWF3YWl0IHRoaXMuX2FwcC5jcmVhdGVOb3RlKEt2LFtSZV0se2FyY2hpdmU6ITB9KTtyZXR1cm4gdGhpcy5fbm90ZVVVSUQ9dHlwZW9mIG49PSJvYmplY3QiP24udXVpZDpuLGF3YWl0IHRoaXMuX2FwcC5yZXBsYWNlTm90ZUNvbnRlbnQoe3V1aWQ6dGhpcy5fbm90ZVVVSUR9LFF2KHRoaXMuX3NldHRpbmdzKSksRSgiW0Rhc2hib2FyZFNldHRpbmdOb3RlXSBjcmVhdGVkIHNldHRpbmdzIG5vdGU6Iix0aGlzLl9ub3RlVVVJRCksey4uLnRoaXMuX3NldHRpbmdzfX1hc3luYyBzYXZlKHQpe2lmKHRoaXMuX3NldHRpbmdzPXsuLi50aGlzLl9zZXR0aW5ncywuLi50fSwhdGhpcy5fbm90ZVVVSUQpe0UoIltEYXNoYm9hcmRTZXR0aW5nTm90ZV0gbm8gbm90ZVVVSUQ7IGNhbm5vdCBzYXZlIik7cmV0dXJufWF3YWl0IHRoaXMuX2FwcC5yZXBsYWNlTm90ZUNvbnRlbnQoe3V1aWQ6dGhpcy5fbm90ZVVVSUR9LFF2KHRoaXMuX3NldHRpbmdzKSksRSgiW0Rhc2hib2FyZFNldHRpbmdOb3RlXSBzYXZlZCBzZXR0aW5nczoiLHRoaXMuX3NldHRpbmdzKX1nZXQgc2V0dGluZ3MoKXtyZXR1cm4gdGhpcy5fc2V0dGluZ3M/ey4uLnRoaXMuX3NldHRpbmdzfTpudWxsfX07dmFyIGxhPXBlKGRlKCksMSk7ZnVuY3Rpb24gZm8oe3RpdGxlOmUsb25TdWJtaXQ6dCxvbkNhbmNlbDpuLHN1Ym1pdExhYmVsOnI9IlN1Ym1pdCIsY2hpbGRyZW46byxzY3JvbGxUb3A6YX0pe2xldCBpPWxhLmNyZWF0ZUVsZW1lbnQscz0oMCxsYS51c2VSZWYpKG51bGwpO3JldHVybigwLGxhLnVzZUVmZmVjdCkoKCk9PntpZihhPT09dm9pZCAwKXJldHVybjtsZXQgYz1kPT57cy5jdXJyZW50JiYhcy5jdXJyZW50LmNvbnRhaW5zKGQudGFyZ2V0KSYmbigpfTtyZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixjKSwoKT0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixjKX0sW2Esbl0pLGkoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLW92ZXJsYXkiLHN0eWxlOmEhPT12b2lkIDA/e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOmEsbGVmdDowLHJpZ2h0OjAsbWluSGVpZ2h0OiIxMDB2aCIscG9pbnRlckV2ZW50czoibm9uZSIsYWxpZ25JdGVtczoiZmxleC1zdGFydCIscGFkZGluZzoiMTZweCJ9OnZvaWQgMCxvbkNsaWNrOmE9PT12b2lkIDA/Yz0+e2MudGFyZ2V0PT09Yy5jdXJyZW50VGFyZ2V0JiZuKCl9OnZvaWQgMH0saSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtY29udGFpbmVyIixyZWY6cyxzdHlsZTphIT09dm9pZCAwP3twb2ludGVyRXZlbnRzOiJhdXRvIn06dm9pZCAwfSxlP2koImRpdiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWhlYWRlciJ9LGkoImgzIix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtdGl0bGUifSxlKSk6bnVsbCxpKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1wb3B1cC1ib2R5In0sbyksaSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctcG9wdXAtYWN0aW9ucyJ9LGkoImJ1dHRvbiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWJ0biBjb25maWctcG9wdXAtYnRuLS1jYW5jZWwiLG9uQ2xpY2s6bn0sIkNhbmNlbCIpLGkoImJ1dHRvbiIse2NsYXNzTmFtZToiY29uZmlnLXBvcHVwLWJ0biBjb25maWctcG9wdXAtYnRuLS1zdWJtaXQiLG9uQ2xpY2s6dH0scikpKSl9dmFyIGFFPTUwKjEwMjQqNDt2YXIgSnY9e2FudGhyb3BpYzoiaHR0cHM6Ly9jb25zb2xlLmFudGhyb3BpYy5jb20vc2V0dGluZ3Mva2V5cyIsImFudGhyb3BpYy1zb25uZXQiOiJodHRwczovL2NvbnNvbGUuYW50aHJvcGljLmNvbS9zZXR0aW5ncy9rZXlzIixkZWVwc2VlazoiaHR0cHM6Ly9wbGF0Zm9ybS5kZWVwc2Vlay5jb20vYXBpX2tleXMiLGdlbWluaToiaHR0cHM6Ly9haXN0dWRpby5nb29nbGUuY29tL2FwcC9hcGkta2V5cyIsZ3JvazoiaHR0cHM6Ly9jb25zb2xlLnguYWkvdGVhbS9kZWZhdWx0L2FwaS1rZXlzIixvcGVuYWk6Imh0dHBzOi8vcGxhdGZvcm0ub3BlbmFpLmNvbS9hcGkta2V5cyIscGVycGxleGl0eToiaHR0cHM6Ly93d3cucGVycGxleGl0eS5haS9hY2NvdW50L2FwaS9rZXlzIn0sWm49e2FudGhyb3BpYzoiY2xhdWRlLW9wdXMtNC02IiwiYW50aHJvcGljLXNvbm5ldCI6ImNsYXVkZS1zb25uZXQtNC02IixkZWVwc2VlazoiZGVlcHNlZWstY2hhdCIsZ2VtaW5pOiJnZW1pbmktMy4xLXByby1wcmV2aWV3Iixncm9rOiJncm9rLTQuMjAiLG9wZW5haToiZ3B0LTUuNCIscGVycGxleGl0eToic29uYXItcHJvIn07dmFyIEVwPXthbnRocm9waWM6Imh0dHBzOi8vYXBpLmFudGhyb3BpYy5jb20vdjEvbWVzc2FnZXMiLCJhbnRocm9waWMtc29ubmV0IjoiaHR0cHM6Ly9hcGkuYW50aHJvcGljLmNvbS92MS9tZXNzYWdlcyIsZGVlcHNlZWs6Imh0dHBzOi8vYXBpLmRlZXBzZWVrLmNvbS92MS9jaGF0L2NvbXBsZXRpb25zIixnZW1pbmk6Imh0dHBzOi8vZ2VuZXJhdGl2ZWxhbmd1YWdlLmdvb2dsZWFwaXMuY29tL3YxYmV0YS9tb2RlbHMve21vZGVsLW5hbWV9OmdlbmVyYXRlQ29udGVudCIsZ3JvazoiaHR0cHM6Ly9hcGkueC5haS92MS9jaGF0L2NvbXBsZXRpb25zIixvcGVuYWk6Imh0dHBzOi8vYXBpLm9wZW5haS5jb20vdjEvY2hhdC9jb21wbGV0aW9ucyIscGVycGxleGl0eToiaHR0cHM6Ly9hcGkucGVycGxleGl0eS5haS9jaGF0L2NvbXBsZXRpb25zIn0sS009T2JqZWN0LmtleXMoRXApLFh2PXsiY2xhdWRlLW9wdXMtNC02IjoyMDAqMTAyNCo0LCJjbGF1ZGUtc29ubmV0LTQtNiI6MjAwKjEwMjQqNCwiY2xhdWRlLXNvbm5ldC00LTUiOjIwMCoxMDI0KjQsImNsYXVkZS1zb25uZXQtNC01LTIwMjUwOTI5IjoyMDAqMTAyNCo0LCJjbGF1ZGUtaGFpa3UtNC01IjoyMDAqMTAyNCo0LCJjbGF1ZGUtaGFpa3UtNC01LTIwMjUxMDAxIjoyMDAqMTAyNCo0LCJjbGF1ZGUtb3B1cy00LTUiOjIwMCoxMDI0KjQsImNsYXVkZS1vcHVzLTQtNS0yMDI1MTEwMSI6MjAwKjEwMjQqNCwiY2xhdWRlLW9wdXMtNC0xIjoyMDAqMTAyNCo0LCJjbGF1ZGUtb3B1cy00LTEtMjAyNTA4MDUiOjIwMCoxMDI0KjQsImNsYXVkZS1zb25uZXQtNC0wIjoyMDAqMTAyNCo0LCJjbGF1ZGUtc29ubmV0LTQtMjAyNTA1MTQiOjIwMCoxMDI0KjQsImNsYXVkZS0zLTctc29ubmV0LWxhdGVzdCI6MjAwKjEwMjQqNCwiY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTkiOjIwMCoxMDI0KjQsImNsYXVkZS1vcHVzLTQtMCI6MjAwKjEwMjQqNCwiY2xhdWRlLW9wdXMtNC0yMDI1MDUxNCI6MjAwKjEwMjQqNCwiY2xhdWRlLTMtNS1oYWlrdS1sYXRlc3QiOjIwMCoxMDI0KjQsImNsYXVkZS0zLTUtaGFpa3UtMjAyNDEwMjIiOjIwMCoxMDI0KjQsImNsYXVkZS0zLTUtc29ubmV0LWxhdGVzdCI6MjAwKjEwMjQqNCwiY2xhdWRlLTMtaGFpa3UtMjAyNDAzMDciOjIwMCoxMDI0KjR9LFp2PXsiZGVlcHNlZWstY2hhdCI6NjQqMTAyNCo0LCJkZWVwc2Vlay1yZWFzb25lciI6NjQqMTAyNCo0LCJkZWVwc2Vlay1yMSI6NjQqMTAyNCo0LCJkZWVwc2Vlay1yMS0wNTI4Ijo2NCoxMDI0KjR9LGV3PXsiZ2VtaW5pLTMtZmxhc2giOjY0KjEwMjQqNCwiZ2VtaW5pLTMtZmxhc2gtcHJldmlldyI6NjQqMTAyNCo0LCJnZW1pbmktMy1wcm8iOjEwMjQqMTAyNCo0LCJnZW1pbmktMy1wcm8tcHJldmlldyI6MTAyNCoxMDI0KjQsImdlbWluaS0zLjEtcHJvLXByZXZpZXciOjEwMjQqMTAyNCo0LCJnZW1pbmktMy1wcm8taW1hZ2UtcHJldmlldyI6NjQqMTAyNCo0LCJnZW1pbmktMi41LXBybyI6MTAyNCoxMDI0KjQsImdlbWluaS0yLjUtZmxhc2giOjEwMjQqMTAyNCo0LCJnZW1pbmktMi41LWZsYXNoLWxpdGUiOjEwMjQqMTAyNCo0LCJnZW1pbmktMi41LWZsYXNoLWxpdGUtcHJldmlldy0wNi0xNyI6MTAyNCoxMDI0KjQsImdlbWluaS0yLjAtZmxhc2giOjEwMjQqMTAyNCo0LCJnZW1pbmktMi4wLWZsYXNoLWxpdGUiOjEwMjQqMTAyNCo0fSx0dz17Imdyb2stNC0xLWZhc3QiOjIwNDgqMTAyNCo0LCJncm9rLTQtZmFzdCI6MjA0OCoxMDI0KjQsImdyb2stNCI6MjU2KjEwMjQqNCwiZ3Jvay00LjIwIjoyNTYqMTAyNCo0LCJncm9rLTQtMDcwOSI6MjU2KjEwMjQqNCwiZ3Jvay0zIjoxMjgqMTAyNCo0LCJncm9rLTMtYmV0YSI6MTI4KjEwMjQqNCwiZ3Jvay0zLW1pbmkiOjEyOCoxMDI0KjQsImdyb2stMy1taW5pLWJldGEiOjEyOCoxMDI0KjQsImdyb2stMi12aXNpb24tMTIxMiI6OCoxMDI0KjQsImdyb2stMi1pbWFnZS0xMjEyIjoxMjgqMTAyNCo0LCJncm9rLTItMTIxMiI6MTI4KjEwMjQqNH0sbnc9eyJncHQtNS40Ijo0MDAqMTAyNCo0LCJncHQtNS4yIjo0MDAqMTAyNCo0LCJncHQtNS4xIjo0MDAqMTAyNCo0LCJncHQtNS4xLWNvZGV4LW1heCI6NDAwKjEwMjQqNCwiZ3B0LTUiOjQwMCoxMDI0KjQsImdwdC01LWZhc3QiOjQwMCoxMDI0KjQsImdwdC01LXRoaW5raW5nIjo0MDAqMTAyNCo0LCJncHQtNC4xIjoxZTMqMTAyNCo0LCJncHQtNC4xLW1pbmkiOjEyOCoxMDI0KjQsImdwdC00byI6MTI4KjEwMjQqNCwiZ3B0LTRvLW1pbmkiOjEyOCoxMDI0KjQsbzM6MjAwKjEwMjQqNCwibzMtbWluaSI6MjAwKjEwMjQqNCwibzMtcHJvIjoyMDAqMTAyNCo0LCJvNC1taW5pIjoyMDAqMTAyNCo0LCJncHQtNCI6OCoxMDI0KjQsImdwdC00LTExMDYtcHJldmlldyI6MTI4KjEwMjQqNCwiZ3B0LTQtMzJrIjozMioxMDI0KjQsImdwdC00LTMyay0wNjEzIjozMioxMDI0KjQsImdwdC00LXZpc2lvbi1wcmV2aWV3IjoxMjgqMTAyNCo0fSxZTT17InNvbmFyLXBybyI6MjAwKjEwMjQqNCxzb25hcjoxMjgqMTAyNCo0LCJzb25hci1yZWFzb25pbmctcHJvIjoxMjgqMTAyNCo0LCJzb25hci1yZWFzb25pbmciOjEyOCoxMDI0KjQsInNvbmFyLWRlZXAtcmVzZWFyY2giOjEyOCoxMDI0KjR9LGlFPXsuLi5YdiwuLi5adiwuLi5ldywuLi50dywuLi5ud30sVHA9e2FudGhyb3BpYzpPYmplY3Qua2V5cyhYdiksZGVlcHNlZWs6T2JqZWN0LmtleXMoWnYpLGdlbWluaTpPYmplY3Qua2V5cyhldyksZ3JvazpPYmplY3Qua2V5cyh0dyksb3BlbmFpOk9iamVjdC5rZXlzKG53KX07dmFyIE10PXBlKGRlKCkpO2Z1bmN0aW9uIHNFKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e2xldCByPW5ldyBGaWxlUmVhZGVyO3Iub25sb2FkPW89PnQoby50YXJnZXQucmVzdWx0KSxyLm9uZXJyb3I9bz0+e3IuYWJvcnQoKSxuKG8udGFyZ2V0LmVycm9yKX0sci5yZWFkQXNEYXRhVVJMKGUpfSl9ZnVuY3Rpb24gTnAoe2FwcDplLHBsdWdpbk5vdGVVVUlEOnQsaW5pdGlhbEltYWdlVXJsOm49IiIsaW5pdGlhbE1vZGU6cj0iY292ZXIifT17fSl7bGV0W28sYV09KDAsTXQudXNlU3RhdGUpKG4pLFtpLHNdPSgwLE10LnVzZVN0YXRlKShyKSxbbCxjXT0oMCxNdC51c2VTdGF0ZSkoITEpLFtkLHVdPSgwLE10LnVzZVN0YXRlKSghMSkscD0oMCxNdC51c2VSZWYpKG51bGwpLGY9KDAsTXQudXNlQ2FsbGJhY2spKGFzeW5jIGc9PntpZighZ3x8IWcudHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSl7RSgiW2JnLXVwbG9hZF0gcmVqZWN0ZWQgZmlsZSAobm90IGFuIGltYWdlIG9yIG1pc3NpbmcpOiIsZz8udHlwZSk7cmV0dXJufUUoIltiZy11cGxvYWRdIHN0YXJ0aW5nIHVwbG9hZCBmb3I6IixnLm5hbWUsZy50eXBlLGcuc2l6ZSwiYnl0ZXMiKSxjKCEwKTt0cnl7bGV0IG09YXdhaXQgc0UoZyk7RSgiW2JnLXVwbG9hZF0gZmlsZSBjb252ZXJ0ZWQgdG8gZGF0YSBVUkwsIGxlbmd0aDoiLG0ubGVuZ3RoKTtsZXQgeD1hd2FpdCBlLmF0dGFjaE5vdGVNZWRpYSh7dXVpZDp0fSxtKTtFKCJbYmctdXBsb2FkXSBhdHRhY2hOb3RlTWVkaWEgcmV0dXJuZWQgVVJMOiIseCkseD9hKHgpOkUoIltiZy11cGxvYWRdIGF0dGFjaE5vdGVNZWRpYSByZXR1cm5lZCBmYWxzeSBVUkwgXHUyMDE0IHVwbG9hZCBtYXkgaGF2ZSBmYWlsZWQgc2lsZW50bHkiKX1jYXRjaChtKXtFKCJbYmctdXBsb2FkXSB1cGxvYWQgRkFJTEVEIHdpdGggZXhjZXB0aW9uOiIsbSl9ZmluYWxseXtjKCExKSxFKCJbYmctdXBsb2FkXSB1cGxvYWQgZmxvdyBjb21wbGV0ZSIpfX0sW10pLHk9KDAsTXQudXNlQ2FsbGJhY2spKGc9PntnLnByZXZlbnREZWZhdWx0KCksZy5zdG9wUHJvcGFnYXRpb24oKSx1KCExKTtsZXQgbT1nLmRhdGFUcmFuc2Zlcj8uZmlsZXM/LlswXTttJiZmKG0pfSxbZl0pLHc9KDAsTXQudXNlQ2FsbGJhY2spKGc9PntnLnByZXZlbnREZWZhdWx0KCksZy5zdG9wUHJvcGFnYXRpb24oKSx1KCEwKX0sW10pLGI9KDAsTXQudXNlQ2FsbGJhY2spKGc9PntnLnByZXZlbnREZWZhdWx0KCksZy5zdG9wUHJvcGFnYXRpb24oKSx1KCExKX0sW10pLHY9KDAsTXQudXNlQ2FsbGJhY2spKGc9PntsZXQgbT1nLnRhcmdldC5maWxlcz8uWzBdO20mJmYobSl9LFtmXSksaD0oMCxNdC51c2VDYWxsYmFjaykoKCk9PnthKCIiKX0sW10pO3JldHVybntiYWNrZ3JvdW5kSW1hZ2VVcmw6byxiYWNrZ3JvdW5kTW9kZTppLHNldEJhY2tncm91bmRNb2RlOnMsdXBsb2FkaW5nOmwsZHJhZ092ZXI6ZCxmaWxlSW5wdXRSZWY6cCxoYW5kbGVEcm9wOnksaGFuZGxlRHJhZ092ZXI6dyxoYW5kbGVEcmFnTGVhdmU6YixoYW5kbGVGaWxlSW5wdXRDaGFuZ2U6dixoYW5kbGVSZW1vdmVJbWFnZTpofX12YXIgZXI9cGUoZGUoKSk7dmFyIEFyPVt7dmFsdWU6Im5vbmUiLGxhYmVsOiJOb25lIChkaXNhYmxlIEFJIGZlYXR1cmVzKSIsYXBpS2V5UHJvdmlkZXI6bnVsbH0se3ZhbHVlOiJvcGVuYWkiLGxhYmVsOiJPcGVuQUkgQ2hhdEdQVCIsYXBpS2V5UHJvdmlkZXI6Im9wZW5haSJ9LHt2YWx1ZToiYW50aHJvcGljIixsYWJlbDoiQW50aHJvcGljIE9wdXMiLGFwaUtleVByb3ZpZGVyOiJhbnRocm9waWMifSx7dmFsdWU6ImFudGhyb3BpYy1zb25uZXQiLGxhYmVsOiJBbnRocm9waWMgU29ubmV0IixhcGlLZXlQcm92aWRlcjoiYW50aHJvcGljIn0se3ZhbHVlOiJnZW1pbmkiLGxhYmVsOiJHb29nbGUgR2VtaW5pIixhcGlLZXlQcm92aWRlcjoiZ2VtaW5pIn0se3ZhbHVlOiJncm9rIixsYWJlbDoiR3JvayIsYXBpS2V5UHJvdmlkZXI6Imdyb2sifV07ZnVuY3Rpb24gbEUoKXtsZXQgZT1uYXZpZ2F0b3IudXNlckFnZW50fHwiIix0PW5hdmlnYXRvci5wbGF0Zm9ybXx8IiIsbj0vQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3QoZSkscj1uYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM+MSYmL01hY2ludG9zaC8udGVzdChlKTtyZXR1cm4gbnx8cj97bGlua1BhcmVudGhldGljYWw6ImxvbmctcHJlc3MsIE9wZW4gaW4gTmV3IFRhYiIsbm90ZToiTG9uZy1wcmVzcyB0aGUgZm9sbG93aW5nIGxpbmssIHRoZW4gY2hvb3NlIE9wZW4gaW4gTmV3IFRhYiBvciBPcGVuIGluIEJyb3dzZXIuIEEgbm9ybWFsIGNsaWNrIG1heSBoYXZlIG5vIHZpc2libGUgZWZmZWN0LiJ9Oi9NYWN8aVBob25lfGlQb2R8aVBhZC8udGVzdCh0KXx8L01hYyBPUyBYLy50ZXN0KGUpP3tsaW5rUGFyZW50aGV0aWNhbDoiQ21kK2NsaWNrIixub3RlOiJDbWQtY2xpY2sgdGhlIGZvbGxvd2luZyBsaW5rIHRvIG9wZW4gaXQuIEEgbm9ybWFsIGNsaWNrIG1heSBoYXZlIG5vIHZpc2libGUgZWZmZWN0LiJ9Oi9XaW4vLnRlc3QodCk/e2xpbmtQYXJlbnRoZXRpY2FsOiJDdHJsK2NsaWNrIixub3RlOiJDdHJsLWNsaWNrIHRoZSBmb2xsb3dpbmcgbGluayB0byBvcGVuIGl0LiBBIG5vcm1hbCBjbGljayBtYXkgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdC4ifTp7bGlua1BhcmVudGhldGljYWw6IkN0cmwrY2xpY2siLG5vdGU6IkN0cmwtY2xpY2sgdGhlIGZvbGxvd2luZyBsaW5rIHRvIG9wZW4gaXQuIEEgbm9ybWFsIGNsaWNrIG1heSBoYXZlIG5vIHZpc2libGUgZWZmZWN0In19ZnVuY3Rpb24gY0UoZSx7YXBpS2V5OnQsYXBpS2V5VmlzaWJsZTpuLGxpbmtQYXJlbnRoZXRpY2FsOnIsbm90ZTpvLG9uQXBpS2V5Q2hhbmdlOmEsb25Qcm92aWRlckNoYW5nZTppLG9uVG9nZ2xlS2V5VmlzaWJpbGl0eTpzLHByb3ZpZGVyQXBpS2V5VXJsOmwscHJvdmlkZXJOYW1lOmMsc2VsZWN0ZWRQcm92aWRlcjpkfSl7cmV0dXJuIGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24gc2VjdGlvbiJ9LGUoImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24taGVhZGVyIn0sZSgiaDQiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLXRpdGxlIn0sIkFJIFByb3ZpZGVyIiksZSgicCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tZGVzYyJ9LCJFbmFibGUgYW5hbHlzaXMgb2YgcXVhcnRlcmx5IHBsYW4gJiBzdWdnZXN0ZWQgdGFza3MuIikpLGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctbGluZSJ9LGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIn0sIkxMTSBQcm92aWRlciIpLGUoInNlbGVjdCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlbGVjdCIsaWQ6ImxsbS1wcm92aWRlci1zZWxlY3QiLHZhbHVlOmQsb25DaGFuZ2U6dT0+aSh1LnRhcmdldC52YWx1ZSl9LC4uLkFyLm1hcCh1PT5lKCJvcHRpb24iLHtrZXk6dS52YWx1ZSx2YWx1ZTp1LnZhbHVlfSx1LmxhYmVsKSkpKSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1saW5lIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQtbGFiZWwifSwiQVBJIEtleSIpLGUoInAiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1hcGkta2V5LWhpbnQifSxvKSxlKCJhIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS1saW5rIixocmVmOmwsdGFyZ2V0OiJfYmxhbmsiLHJlbDoibm9vcGVuZXIgbm9yZWZlcnJlciJ9LGBSZXRyaWV2ZSB5b3VyICR7Y30gQVBJIGtleSAoJHtyfSkgXHUyMTkyYCksZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtYXBpLWtleS1pbnB1dC1yb3cifSxlKCJpbnB1dCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWFwaS1rZXktaW5wdXQiLHR5cGU6bj8idGV4dCI6InBhc3N3b3JkIix2YWx1ZTp0LG9uQ2hhbmdlOnU9PmEodS50YXJnZXQudmFsdWUpLHBsYWNlaG9sZGVyOiJQYXN0ZSB5b3VyIEFQSSBrZXkgaGVyZSIsYXV0b0NvbXBsZXRlOiJvZmYiLHNwZWxsQ2hlY2s6ITF9KSxlKCJidXR0b24iLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1hcGkta2V5LXRvZ2dsZSIsdHlwZToiYnV0dG9uIixvbkNsaWNrOnMsdGl0bGU6bj8iSGlkZSBBUEkga2V5IjoiU2hvdyBBUEkga2V5IiwiYXJpYS1sYWJlbCI6bj8iSGlkZSBBUEkga2V5IjoiU2hvdyBBUEkga2V5In0sbj8iXHV7MUY2NDh9IjoiXHV7MUY0NDF9XHVGRTBGIikpKSkpfWZ1bmN0aW9uIHVFKGUse2JhY2tncm91bmRJbWFnZVVybDp0LGJhY2tncm91bmRNb2RlOm4sZHJhZ092ZXI6cixmaWxlSW5wdXRSZWY6byxvbkJhY2tncm91bmRNb2RlQ2hhbmdlOmEsb25EcmFnTGVhdmU6aSxvbkRyYWdPdmVyOnMsb25Ecm9wOmwsb25GaWxlSW5wdXRDaGFuZ2U6YyxvblJlbW92ZUltYWdlOmQsdXBsb2FkaW5nOnV9KXtyZXR1cm4gZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbiBzZWN0aW9uIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1oZWFkZXIifSxlKCJoNCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tdGl0bGUifSwiQmFja2dyb3VuZCBJbWFnZSIpLGUoInAiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1zZWN0aW9uLWRlc2MifSwiVXBsb2FkIGFuIGltYWdlIHRvIHVzZSBhcyB5b3VyIGRhc2hib2FyZCBiYWNrZ3JvdW5kLiIpKSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZCJ9LGUoImRpdiIse2NsYXNzTmFtZTpgZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lJHtyPyIgZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLS1hY3RpdmUiOiIifSR7dT8iIGRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS0tdXBsb2FkaW5nIjoiIn1gLG9uRHJvcDpsLG9uRHJhZ092ZXI6cyxvbkRyYWdMZWF2ZTppLG9uQ2xpY2s6KCk9PiF1JiZvLmN1cnJlbnQ/LmNsaWNrKCl9LGUoImlucHV0Iix7cmVmOm8sdHlwZToiZmlsZSIsYWNjZXB0OiJpbWFnZS8qIixjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS1pbnB1dCIsb25DaGFuZ2U6Y30pLHU/ZSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXRleHQifSwiVXBsb2FkaW5nLi4uIik6dD9lKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1kcm9wem9uZS1wcmV2aWV3In0sZSgiaW1nIix7c3JjOnQsYWx0OiJCYWNrZ3JvdW5kIHByZXZpZXciLGNsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXByZXZpZXctaW1nIixvbkxvYWQ6KCk9PkUoIltzZXR0aW5ncy1wb3B1cF0gYmFja2dyb3VuZCBwcmV2aWV3IGltYWdlIGxvYWRlZCBPSzoiLHQpLG9uRXJyb3I6cD0+RSgiW3NldHRpbmdzLXBvcHVwXSBiYWNrZ3JvdW5kIHByZXZpZXcgaW1hZ2UgRkFJTEVEIHRvIGxvYWQ6Iix0LHAudHlwZSl9KSxlKCJzcGFuIix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3MtZHJvcHpvbmUtdGV4dCJ9LCJEcm9wIGEgbmV3IGltYWdlIG9yIGNsaWNrIHRvIHJlcGxhY2UiKSk6ZSgic3BhbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLWRyb3B6b25lLXRleHQifSwiRHJhZyAmIGRyb3AgYW4gaW1hZ2UgaGVyZSwgb3IgY2xpY2sgdG8gdXBsb2FkIikpLHQmJmUoImEiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1yZW1vdmUtaW1hZ2UiLGhyZWY6IiMiLG9uQ2xpY2s6cD0+e3AucHJldmVudERlZmF1bHQoKSxkKCl9fSwiUmVtb3ZlIGltYWdlIikpLHQmJmUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQtbGFiZWwifSwiRGlzcGxheSBNb2RlIiksZSgic2VsZWN0Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VsZWN0Iix2YWx1ZTpuLG9uQ2hhbmdlOnA9PmEocC50YXJnZXQudmFsdWUpfSwuLi5RZy5tYXAocD0+ZSgib3B0aW9uIix7a2V5OnAudmFsdWUsdmFsdWU6cC52YWx1ZX0scC5sYWJlbCkpKSkpfWZ1bmN0aW9uIGRFKGUse29uVGltZUZvcm1hdENoYW5nZTp0LG9uV2Vla0Zvcm1hdENoYW5nZTpuLHRpbWVGb3JtYXQ6cix3ZWVrRm9ybWF0Om99KXtyZXR1cm4gZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbiBzZWN0aW9uIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtc2V0dGluZ3Mtc2VjdGlvbi1oZWFkZXIifSxlKCJoNCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tdGl0bGUifSwiVGltZSAmIERhdGUgRm9ybWF0IiksZSgicCIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXNldHRpbmdzLXNlY3Rpb24tZGVzYyJ9LCJDaG9vc2UgaG93IHRpbWVzIGFuZCB3ZWVrcyBhcmUgZGlzcGxheWVkIGFjcm9zcyB0aGUgZGFzaGJvYXJkLiIpKSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZCJ9LGUoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWxpbmUifSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZC1sYWJlbCJ9LCJUaW1lIEZvcm1hdCIpLGUoImxhYmVsIixudWxsLGUoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6InRpbWUtZm9ybWF0Iix2YWx1ZToibWVyaWRpYW4iLGNoZWNrZWQ6cj09PSJtZXJpZGlhbiIsb25DaGFuZ2U6KCk9PnQoIm1lcmlkaWFuIil9KSwiVXNlIG1lcmlkaWFuIChhbS9wbSkgdGltZXMiKSxlKCJsYWJlbCIsbnVsbCxlKCJpbnB1dCIse3R5cGU6InJhZGlvIixuYW1lOiJ0aW1lLWZvcm1hdCIsdmFsdWU6IjI0aCIsY2hlY2tlZDpyPT09IjI0aCIsb25DaGFuZ2U6KCk9PnQoIjI0aCIpfSksIjI0IGhvdXIgdGltZSIpKSxlKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1saW5lIn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQtbGFiZWwifSwiV2VlayBGb3JtYXQiKSxlKCJsYWJlbCIsbnVsbCxlKCJpbnB1dCIse3R5cGU6InJhZGlvIixuYW1lOiJ3ZWVrLWZvcm1hdCIsdmFsdWU6InN1bmRheSIsY2hlY2tlZDpvPT09InN1bmRheSIsb25DaGFuZ2U6KCk9Pm4oInN1bmRheSIpfSksIldlZWsgYmVnaW5zIG9uIFN1bmRheSIpLGUoImxhYmVsIixudWxsLGUoImlucHV0Iix7dHlwZToicmFkaW8iLG5hbWU6IndlZWstZm9ybWF0Iix2YWx1ZToibW9uZGF5IixjaGVja2VkOm89PT0ibW9uZGF5IixvbkNoYW5nZTooKT0+bigibW9uZGF5Iil9KSwiV2VlayBiZWdpbnMgb24gTW9uZGF5IikpKSl9ZnVuY3Rpb24gcncoZSx0KXtpZighdClyZXR1cm4iIjtsZXQgbj1BdCh0KTtyZXR1cm4gbiYmZT8uW25dfHwiIn1mdW5jdGlvbiBEcCh7YXBwOmUsY29uZmlnUGFyYW1zOnQsb25DYW5jZWw6bixvblNhdmU6cixwbHVnaW5Ob3RlVVVJRDpvLHRpbWVGb3JtYXQ6YSx3ZWVrRm9ybWF0Oml9KXtsZXQgcz1lci5jcmVhdGVFbGVtZW50LFtsXT0oMCxlci51c2VTdGF0ZSkoKCk9PnR5cGVvZiB3aW5kb3c+InUiPzA6d2luZG93LnNjcm9sbFk/P2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A/PzApLGM9dD8uW0cuTExNX1BST1ZJREVSX01PREVMXSxkPXQ/LltHLkJBQ0tHUk9VTkRfSU1BR0VfVVJMXSx1PXQ/LltHLkJBQ0tHUk9VTkRfSU1BR0VfTU9ERV0scD1Bci5maW5kKEg9PkgudmFsdWU9PT1jKXx8QXJbMF0sW2YseV09KDAsZXIudXNlU3RhdGUpKHJ3KHQscC5hcGlLZXlQcm92aWRlcikpLFt3LGJdPSgwLGVyLnVzZVN0YXRlKSghMSksW3YsaF09KDAsZXIudXNlU3RhdGUpKGN8fCJvcGVuYWkiKSxbZyxtXT0oMCxlci51c2VTdGF0ZSkoYXx8Im1lcmlkaWFuIiksW3gsU109KDAsZXIudXNlU3RhdGUpKGl8fCJzdW5kYXkiKTtFKCJbc2V0dGluZ3MtcG9wdXBdIHJlbmRlcmluZyBEYXNoYm9hcmRTZXR0aW5nc1BvcHVwLCBjdXJyZW50QmFja2dyb3VuZEltYWdlVXJsOiIsZCk7bGV0e2JhY2tncm91bmRJbWFnZVVybDpfLGJhY2tncm91bmRNb2RlOkQsc2V0QmFja2dyb3VuZE1vZGU6QSx1cGxvYWRpbmc6VCxkcmFnT3ZlcjpMLGZpbGVJbnB1dFJlZjp6LGhhbmRsZURyb3A6SSxoYW5kbGVEcmFnT3ZlcjpNLGhhbmRsZURyYWdMZWF2ZTpGLGhhbmRsZUZpbGVJbnB1dENoYW5nZTpVLGhhbmRsZVJlbW92ZUltYWdlOk99PU5wKHthcHA6ZSxwbHVnaW5Ob3RlVVVJRDpvLGluaXRpYWxJbWFnZVVybDpkLGluaXRpYWxNb2RlOnV9KSxqPUFyLmZpbmQoSD0+SC52YWx1ZT09PXYpfHxBclswXSxYPUp2W2ouYXBpS2V5UHJvdmlkZXJdLE49QXIuZmluZChIPT5ILnZhbHVlPT09dik/LmxhYmVsLGs9SD0+e2goSCk7bGV0IHE9QXIuZmluZChLPT5LLnZhbHVlPT09SCl8fEFyWzBdLEo9cncodCxxLmFwaUtleVByb3ZpZGVyKTt5KEopfSx7bGlua1BhcmVudGhldGljYWw6Uixub3RlOkJ9PWxFKCk7cmV0dXJuIHMoZm8se3RpdGxlOiJcdTI2OTlcdUZFMEYgRGFzaGJvYXJkIFNldHRpbmdzIixzY3JvbGxUb3A6bCxvblN1Ym1pdDooKT0+cih7YXBpS2V5OmYsYXBpS2V5UHJvdmlkZXI6ai5hcGlLZXlQcm92aWRlcixiYWNrZ3JvdW5kSW1hZ2VVcmw6XyxiYWNrZ3JvdW5kTW9kZTpELGxsbVByb3ZpZGVyOnYsdGltZUZvcm1hdDpnLHdlZWtGb3JtYXQ6eH0pLG9uQ2FuY2VsOm4sc3VibWl0TGFiZWw6IlNhdmUgU2V0dGluZ3MifSxzKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1zZXR0aW5ncy1jb250YWluZXIifSx1RShzLHtiYWNrZ3JvdW5kSW1hZ2VVcmw6XyxiYWNrZ3JvdW5kTW9kZTpELGRyYWdPdmVyOkwsZmlsZUlucHV0UmVmOnosb25CYWNrZ3JvdW5kTW9kZUNoYW5nZTpBLG9uRHJhZ0xlYXZlOkYsb25EcmFnT3ZlcjpNLG9uRHJvcDpJLG9uRmlsZUlucHV0Q2hhbmdlOlUsb25SZW1vdmVJbWFnZTpPLHVwbG9hZGluZzpUfSksY0Uocyx7YXBpS2V5OmYsYXBpS2V5VmlzaWJsZTp3LGxpbmtQYXJlbnRoZXRpY2FsOlIsbm90ZTpCLG9uQXBpS2V5Q2hhbmdlOnksb25Qcm92aWRlckNoYW5nZTprLG9uVG9nZ2xlS2V5VmlzaWJpbGl0eTooKT0+YihIPT4hSCkscHJvdmlkZXJBcGlLZXlVcmw6WCxwcm92aWRlck5hbWU6TixzZWxlY3RlZFByb3ZpZGVyOnZ9KSxkRShzLHtvblRpbWVGb3JtYXRDaGFuZ2U6bSxvbldlZWtGb3JtYXRDaGFuZ2U6Uyx0aW1lRm9ybWF0Omcsd2Vla0Zvcm1hdDp4fSkpKX12YXIgX3A9e307KGZ1bmN0aW9uIGUodCxuLHIsbyl7dmFyIGE9ISEodC5Xb3JrZXImJnQuQmxvYiYmdC5Qcm9taXNlJiZ0Lk9mZnNjcmVlbkNhbnZhcyYmdC5PZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQmJnQuSFRNTENhbnZhc0VsZW1lbnQmJnQuSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLnRyYW5zZmVyQ29udHJvbFRvT2Zmc2NyZWVuJiZ0LlVSTCYmdC5VUkwuY3JlYXRlT2JqZWN0VVJMKSxpPXR5cGVvZiBQYXRoMkQ9PSJmdW5jdGlvbiImJnR5cGVvZiBET01NYXRyaXg9PSJmdW5jdGlvbiIscz1mdW5jdGlvbigpe2lmKCF0Lk9mZnNjcmVlbkNhbnZhcylyZXR1cm4hMTt0cnl7dmFyIE49bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLGs9Ti5nZXRDb250ZXh0KCIyZCIpO2suZmlsbFJlY3QoMCwwLDEsMSk7dmFyIFI9Ti50cmFuc2ZlclRvSW1hZ2VCaXRtYXAoKTtrLmNyZWF0ZVBhdHRlcm4oUiwibm8tcmVwZWF0Iil9Y2F0Y2h7cmV0dXJuITF9cmV0dXJuITB9KCk7ZnVuY3Rpb24gbCgpe31mdW5jdGlvbiBjKE4pe3ZhciBrPW4uZXhwb3J0cy5Qcm9taXNlLFI9ayE9PXZvaWQgMD9rOnQuUHJvbWlzZTtyZXR1cm4gdHlwZW9mIFI9PSJmdW5jdGlvbiI/bmV3IFIoTik6KE4obCxsKSxudWxsKX12YXIgZD1mdW5jdGlvbihOLGspe3JldHVybnt0cmFuc2Zvcm06ZnVuY3Rpb24oUil7aWYoTilyZXR1cm4gUjtpZihrLmhhcyhSKSlyZXR1cm4gay5nZXQoUik7dmFyIEI9bmV3IE9mZnNjcmVlbkNhbnZhcyhSLndpZHRoLFIuaGVpZ2h0KSxIPUIuZ2V0Q29udGV4dCgiMmQiKTtyZXR1cm4gSC5kcmF3SW1hZ2UoUiwwLDApLGsuc2V0KFIsQiksQn0sY2xlYXI6ZnVuY3Rpb24oKXtrLmNsZWFyKCl9fX0ocyxuZXcgTWFwKSx1PWZ1bmN0aW9uKCl7dmFyIE49TWF0aC5mbG9vcigxNi42NjY2NjY2NjY2NjY2NjgpLGssUixCPXt9LEg9MDtyZXR1cm4gdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT09ImZ1bmN0aW9uIiYmdHlwZW9mIGNhbmNlbEFuaW1hdGlvbkZyYW1lPT0iZnVuY3Rpb24iPyhrPWZ1bmN0aW9uKHEpe3ZhciBKPU1hdGgucmFuZG9tKCk7cmV0dXJuIEJbSl09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIEsoWil7SD09PVp8fEgrTi0xPFo/KEg9WixkZWxldGUgQltKXSxxKCkpOkJbSl09cmVxdWVzdEFuaW1hdGlvbkZyYW1lKEspfSksSn0sUj1mdW5jdGlvbihxKXtCW3FdJiZjYW5jZWxBbmltYXRpb25GcmFtZShCW3FdKX0pOihrPWZ1bmN0aW9uKHEpe3JldHVybiBzZXRUaW1lb3V0KHEsTil9LFI9ZnVuY3Rpb24ocSl7cmV0dXJuIGNsZWFyVGltZW91dChxKX0pLHtmcmFtZTprLGNhbmNlbDpSfX0oKSxwPWZ1bmN0aW9uKCl7dmFyIE4sayxSPXt9O2Z1bmN0aW9uIEIoSCl7ZnVuY3Rpb24gcShKLEspe0gucG9zdE1lc3NhZ2Uoe29wdGlvbnM6Snx8e30sY2FsbGJhY2s6S30pfUguaW5pdD1mdW5jdGlvbihLKXt2YXIgWj1LLnRyYW5zZmVyQ29udHJvbFRvT2Zmc2NyZWVuKCk7SC5wb3N0TWVzc2FnZSh7Y2FudmFzOlp9LFtaXSl9LEguZmlyZT1mdW5jdGlvbihLLFosYWUpe2lmKGspcmV0dXJuIHEoSyxudWxsKSxrO3ZhciBsZT1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtyZXR1cm4gaz1jKGZ1bmN0aW9uKGNlKXtmdW5jdGlvbiBlZShpZSl7aWUuZGF0YS5jYWxsYmFjaz09PWxlJiYoZGVsZXRlIFJbbGVdLEgucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZWUpLGs9bnVsbCxkLmNsZWFyKCksYWUoKSxjZSgpKX1ILmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGVlKSxxKEssbGUpLFJbbGVdPWVlLmJpbmQobnVsbCx7ZGF0YTp7Y2FsbGJhY2s6bGV9fSl9KSxrfSxILnJlc2V0PWZ1bmN0aW9uKCl7SC5wb3N0TWVzc2FnZSh7cmVzZXQ6ITB9KTtmb3IodmFyIEsgaW4gUilSW0tdKCksZGVsZXRlIFJbS119fXJldHVybiBmdW5jdGlvbigpe2lmKE4pcmV0dXJuIE47aWYoIXImJmEpe3ZhciBIPVsidmFyIENPTkZFVFRJLCBTSVpFID0ge30sIG1vZHVsZSA9IHt9OyIsIigiK2UudG9TdHJpbmcoKSsiKSh0aGlzLCBtb2R1bGUsIHRydWUsIFNJWkUpOyIsIm9ubWVzc2FnZSA9IGZ1bmN0aW9uKG1zZykgeyIsIiAgaWYgKG1zZy5kYXRhLm9wdGlvbnMpIHsiLCIgICAgQ09ORkVUVEkobXNnLmRhdGEub3B0aW9ucykudGhlbihmdW5jdGlvbiAoKSB7IiwiICAgICAgaWYgKG1zZy5kYXRhLmNhbGxiYWNrKSB7IiwiICAgICAgICBwb3N0TWVzc2FnZSh7IGNhbGxiYWNrOiBtc2cuZGF0YS5jYWxsYmFjayB9KTsiLCIgICAgICB9IiwiICAgIH0pOyIsIiAgfSBlbHNlIGlmIChtc2cuZGF0YS5yZXNldCkgeyIsIiAgICBDT05GRVRUSSAmJiBDT05GRVRUSS5yZXNldCgpOyIsIiAgfSBlbHNlIGlmIChtc2cuZGF0YS5yZXNpemUpIHsiLCIgICAgU0laRS53aWR0aCA9IG1zZy5kYXRhLnJlc2l6ZS53aWR0aDsiLCIgICAgU0laRS5oZWlnaHQgPSBtc2cuZGF0YS5yZXNpemUuaGVpZ2h0OyIsIiAgfSBlbHNlIGlmIChtc2cuZGF0YS5jYW52YXMpIHsiLCIgICAgU0laRS53aWR0aCA9IG1zZy5kYXRhLmNhbnZhcy53aWR0aDsiLCIgICAgU0laRS5oZWlnaHQgPSBtc2cuZGF0YS5jYW52YXMuaGVpZ2h0OyIsIiAgICBDT05GRVRUSSA9IG1vZHVsZS5leHBvcnRzLmNyZWF0ZShtc2cuZGF0YS5jYW52YXMpOyIsIiAgfSIsIn0iXS5qb2luKGAKYCk7dHJ5e049bmV3IFdvcmtlcihVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtIXSkpKX1jYXRjaChxKXtyZXR1cm4gdHlwZW9mIGNvbnNvbGU8InUiJiZ0eXBlb2YgY29uc29sZS53YXJuPT0iZnVuY3Rpb24iJiZjb25zb2xlLndhcm4oIlx1ezFGMzhBfSBDb3VsZCBub3QgbG9hZCB3b3JrZXIiLHEpLG51bGx9QihOKX1yZXR1cm4gTn19KCksZj17cGFydGljbGVDb3VudDo1MCxhbmdsZTo5MCxzcHJlYWQ6NDUsc3RhcnRWZWxvY2l0eTo0NSxkZWNheTouOSxncmF2aXR5OjEsZHJpZnQ6MCx0aWNrczoyMDAseDouNSx5Oi41LHNoYXBlczpbInNxdWFyZSIsImNpcmNsZSJdLHpJbmRleDoxMDAsY29sb3JzOlsiIzI2Y2NmZiIsIiNhMjVhZmQiLCIjZmY1ZTdlIiwiIzg4ZmY1YSIsIiNmY2ZmNDIiLCIjZmZhNjJkIiwiI2ZmMzZmZiJdLGRpc2FibGVGb3JSZWR1Y2VkTW90aW9uOiExLHNjYWxhcjoxfTtmdW5jdGlvbiB5KE4sayl7cmV0dXJuIGs/ayhOKTpOfWZ1bmN0aW9uIHcoTil7cmV0dXJuIE4hPW51bGx9ZnVuY3Rpb24gYihOLGssUil7cmV0dXJuIHkoTiYmdyhOW2tdKT9OW2tdOmZba10sUil9ZnVuY3Rpb24gdihOKXtyZXR1cm4gTjwwPzA6TWF0aC5mbG9vcihOKX1mdW5jdGlvbiBoKE4sayl7cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSooay1OKSkrTn1mdW5jdGlvbiBnKE4pe3JldHVybiBwYXJzZUludChOLDE2KX1mdW5jdGlvbiBtKE4pe3JldHVybiBOLm1hcCh4KX1mdW5jdGlvbiB4KE4pe3ZhciBrPVN0cmluZyhOKS5yZXBsYWNlKC9bXjAtOWEtZl0vZ2ksIiIpO3JldHVybiBrLmxlbmd0aDw2JiYoaz1rWzBdK2tbMF0ra1sxXStrWzFdK2tbMl0ra1syXSkse3I6ZyhrLnN1YnN0cmluZygwLDIpKSxnOmcoay5zdWJzdHJpbmcoMiw0KSksYjpnKGsuc3Vic3RyaW5nKDQsNikpfX1mdW5jdGlvbiBTKE4pe3ZhciBrPWIoTiwib3JpZ2luIixPYmplY3QpO3JldHVybiBrLng9YihrLCJ4IixOdW1iZXIpLGsueT1iKGssInkiLE51bWJlciksa31mdW5jdGlvbiBfKE4pe04ud2lkdGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLE4uaGVpZ2h0PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHR9ZnVuY3Rpb24gRChOKXt2YXIgaz1OLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO04ud2lkdGg9ay53aWR0aCxOLmhlaWdodD1rLmhlaWdodH1mdW5jdGlvbiBBKE4pe3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3JldHVybiBrLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsay5zdHlsZS50b3A9IjBweCIsay5zdHlsZS5sZWZ0PSIwcHgiLGsuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsay5zdHlsZS56SW5kZXg9TixrfWZ1bmN0aW9uIFQoTixrLFIsQixILHEsSixLLFope04uc2F2ZSgpLE4udHJhbnNsYXRlKGssUiksTi5yb3RhdGUocSksTi5zY2FsZShCLEgpLE4uYXJjKDAsMCwxLEosSyxaKSxOLnJlc3RvcmUoKX1mdW5jdGlvbiBMKE4pe3ZhciBrPU4uYW5nbGUqKE1hdGguUEkvMTgwKSxSPU4uc3ByZWFkKihNYXRoLlBJLzE4MCk7cmV0dXJue3g6Ti54LHk6Ti55LHdvYmJsZTpNYXRoLnJhbmRvbSgpKjEwLHdvYmJsZVNwZWVkOk1hdGgubWluKC4xMSxNYXRoLnJhbmRvbSgpKi4xKy4wNSksdmVsb2NpdHk6Ti5zdGFydFZlbG9jaXR5Ki41K01hdGgucmFuZG9tKCkqTi5zdGFydFZlbG9jaXR5LGFuZ2xlMkQ6LWsrKC41KlItTWF0aC5yYW5kb20oKSpSKSx0aWx0QW5nbGU6KE1hdGgucmFuZG9tKCkqKC43NS0uMjUpKy4yNSkqTWF0aC5QSSxjb2xvcjpOLmNvbG9yLHNoYXBlOk4uc2hhcGUsdGljazowLHRvdGFsVGlja3M6Ti50aWNrcyxkZWNheTpOLmRlY2F5LGRyaWZ0Ok4uZHJpZnQscmFuZG9tOk1hdGgucmFuZG9tKCkrMix0aWx0U2luOjAsdGlsdENvczowLHdvYmJsZVg6MCx3b2JibGVZOjAsZ3Jhdml0eTpOLmdyYXZpdHkqMyxvdmFsU2NhbGFyOi42LHNjYWxhcjpOLnNjYWxhcixmbGF0Ok4uZmxhdH19ZnVuY3Rpb24geihOLGspe2sueCs9TWF0aC5jb3Moay5hbmdsZTJEKSprLnZlbG9jaXR5K2suZHJpZnQsay55Kz1NYXRoLnNpbihrLmFuZ2xlMkQpKmsudmVsb2NpdHkray5ncmF2aXR5LGsudmVsb2NpdHkqPWsuZGVjYXksay5mbGF0PyhrLndvYmJsZT0wLGsud29iYmxlWD1rLngrMTAqay5zY2FsYXIsay53b2JibGVZPWsueSsxMCprLnNjYWxhcixrLnRpbHRTaW49MCxrLnRpbHRDb3M9MCxrLnJhbmRvbT0xKTooay53b2JibGUrPWsud29iYmxlU3BlZWQsay53b2JibGVYPWsueCsxMCprLnNjYWxhcipNYXRoLmNvcyhrLndvYmJsZSksay53b2JibGVZPWsueSsxMCprLnNjYWxhcipNYXRoLnNpbihrLndvYmJsZSksay50aWx0QW5nbGUrPS4xLGsudGlsdFNpbj1NYXRoLnNpbihrLnRpbHRBbmdsZSksay50aWx0Q29zPU1hdGguY29zKGsudGlsdEFuZ2xlKSxrLnJhbmRvbT1NYXRoLnJhbmRvbSgpKzIpO3ZhciBSPWsudGljaysrL2sudG90YWxUaWNrcyxCPWsueCtrLnJhbmRvbSprLnRpbHRDb3MsSD1rLnkray5yYW5kb20qay50aWx0U2luLHE9ay53b2JibGVYK2sucmFuZG9tKmsudGlsdENvcyxKPWsud29iYmxlWStrLnJhbmRvbSprLnRpbHRTaW47aWYoTi5maWxsU3R5bGU9InJnYmEoIitrLmNvbG9yLnIrIiwgIitrLmNvbG9yLmcrIiwgIitrLmNvbG9yLmIrIiwgIisoMS1SKSsiKSIsTi5iZWdpblBhdGgoKSxpJiZrLnNoYXBlLnR5cGU9PT0icGF0aCImJnR5cGVvZiBrLnNoYXBlLnBhdGg9PSJzdHJpbmciJiZBcnJheS5pc0FycmF5KGsuc2hhcGUubWF0cml4KSlOLmZpbGwoTyhrLnNoYXBlLnBhdGgsay5zaGFwZS5tYXRyaXgsay54LGsueSxNYXRoLmFicyhxLUIpKi4xLE1hdGguYWJzKEotSCkqLjEsTWF0aC5QSS8xMCprLndvYmJsZSkpO2Vsc2UgaWYoay5zaGFwZS50eXBlPT09ImJpdG1hcCIpe3ZhciBLPU1hdGguUEkvMTAqay53b2JibGUsWj1NYXRoLmFicyhxLUIpKi4xLGFlPU1hdGguYWJzKEotSCkqLjEsbGU9ay5zaGFwZS5iaXRtYXAud2lkdGgqay5zY2FsYXIsY2U9ay5zaGFwZS5iaXRtYXAuaGVpZ2h0Kmsuc2NhbGFyLGVlPW5ldyBET01NYXRyaXgoW01hdGguY29zKEspKlosTWF0aC5zaW4oSykqWiwtTWF0aC5zaW4oSykqYWUsTWF0aC5jb3MoSykqYWUsay54LGsueV0pO2VlLm11bHRpcGx5U2VsZihuZXcgRE9NTWF0cml4KGsuc2hhcGUubWF0cml4KSk7dmFyIGllPU4uY3JlYXRlUGF0dGVybihkLnRyYW5zZm9ybShrLnNoYXBlLmJpdG1hcCksIm5vLXJlcGVhdCIpO2llLnNldFRyYW5zZm9ybShlZSksTi5nbG9iYWxBbHBoYT0xLVIsTi5maWxsU3R5bGU9aWUsTi5maWxsUmVjdChrLngtbGUvMixrLnktY2UvMixsZSxjZSksTi5nbG9iYWxBbHBoYT0xfWVsc2UgaWYoay5zaGFwZT09PSJjaXJjbGUiKU4uZWxsaXBzZT9OLmVsbGlwc2Uoay54LGsueSxNYXRoLmFicyhxLUIpKmsub3ZhbFNjYWxhcixNYXRoLmFicyhKLUgpKmsub3ZhbFNjYWxhcixNYXRoLlBJLzEwKmsud29iYmxlLDAsMipNYXRoLlBJKTpUKE4say54LGsueSxNYXRoLmFicyhxLUIpKmsub3ZhbFNjYWxhcixNYXRoLmFicyhKLUgpKmsub3ZhbFNjYWxhcixNYXRoLlBJLzEwKmsud29iYmxlLDAsMipNYXRoLlBJKTtlbHNlIGlmKGsuc2hhcGU9PT0ic3RhciIpZm9yKHZhciBRPU1hdGguUEkvMiozLGdlPTQqay5zY2FsYXIsX2U9OCprLnNjYWxhcixCZT1rLngsWGU9ay55LFN0PTUsVWU9TWF0aC5QSS9TdDtTdC0tOylCZT1rLngrTWF0aC5jb3MoUSkqX2UsWGU9ay55K01hdGguc2luKFEpKl9lLE4ubGluZVRvKEJlLFhlKSxRKz1VZSxCZT1rLngrTWF0aC5jb3MoUSkqZ2UsWGU9ay55K01hdGguc2luKFEpKmdlLE4ubGluZVRvKEJlLFhlKSxRKz1VZTtlbHNlIE4ubW92ZVRvKE1hdGguZmxvb3Ioay54KSxNYXRoLmZsb29yKGsueSkpLE4ubGluZVRvKE1hdGguZmxvb3Ioay53b2JibGVYKSxNYXRoLmZsb29yKEgpKSxOLmxpbmVUbyhNYXRoLmZsb29yKHEpLE1hdGguZmxvb3IoSikpLE4ubGluZVRvKE1hdGguZmxvb3IoQiksTWF0aC5mbG9vcihrLndvYmJsZVkpKTtyZXR1cm4gTi5jbG9zZVBhdGgoKSxOLmZpbGwoKSxrLnRpY2s8ay50b3RhbFRpY2tzfWZ1bmN0aW9uIEkoTixrLFIsQixIKXt2YXIgcT1rLnNsaWNlKCksSj1OLmdldENvbnRleHQoIjJkIiksSyxaLGFlPWMoZnVuY3Rpb24obGUpe2Z1bmN0aW9uIGNlKCl7Sz1aPW51bGwsSi5jbGVhclJlY3QoMCwwLEIud2lkdGgsQi5oZWlnaHQpLGQuY2xlYXIoKSxIKCksbGUoKX1mdW5jdGlvbiBlZSgpe3ImJiEoQi53aWR0aD09PW8ud2lkdGgmJkIuaGVpZ2h0PT09by5oZWlnaHQpJiYoQi53aWR0aD1OLndpZHRoPW8ud2lkdGgsQi5oZWlnaHQ9Ti5oZWlnaHQ9by5oZWlnaHQpLCFCLndpZHRoJiYhQi5oZWlnaHQmJihSKE4pLEIud2lkdGg9Ti53aWR0aCxCLmhlaWdodD1OLmhlaWdodCksSi5jbGVhclJlY3QoMCwwLEIud2lkdGgsQi5oZWlnaHQpLHE9cS5maWx0ZXIoZnVuY3Rpb24oaWUpe3JldHVybiB6KEosaWUpfSkscS5sZW5ndGg/Sz11LmZyYW1lKGVlKTpjZSgpfUs9dS5mcmFtZShlZSksWj1jZX0pO3JldHVybnthZGRGZXR0aXM6ZnVuY3Rpb24obGUpe3JldHVybiBxPXEuY29uY2F0KGxlKSxhZX0sY2FudmFzOk4scHJvbWlzZTphZSxyZXNldDpmdW5jdGlvbigpe0smJnUuY2FuY2VsKEspLFomJlooKX19fWZ1bmN0aW9uIE0oTixrKXt2YXIgUj0hTixCPSEhYihrfHx7fSwicmVzaXplIiksSD0hMSxxPWIoaywiZGlzYWJsZUZvclJlZHVjZWRNb3Rpb24iLEJvb2xlYW4pLEo9YSYmISFiKGt8fHt9LCJ1c2VXb3JrZXIiKSxLPUo/cCgpOm51bGwsWj1SP186RCxhZT1OJiZLPyEhTi5fX2NvbmZldHRpX2luaXRpYWxpemVkOiExLGxlPXR5cGVvZiBtYXRjaE1lZGlhPT0iZnVuY3Rpb24iJiZtYXRjaE1lZGlhKCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbikiKS5tYXRjaGVzLGNlO2Z1bmN0aW9uIGVlKFEsZ2UsX2Upe2Zvcih2YXIgQmU9YihRLCJwYXJ0aWNsZUNvdW50Iix2KSxYZT1iKFEsImFuZ2xlIixOdW1iZXIpLFN0PWIoUSwic3ByZWFkIixOdW1iZXIpLFVlPWIoUSwic3RhcnRWZWxvY2l0eSIsTnVtYmVyKSxFdD1iKFEsImRlY2F5IixOdW1iZXIpLEh0PWIoUSwiZ3Jhdml0eSIsTnVtYmVyKSxqdD1iKFEsImRyaWZ0IixOdW1iZXIpLHhuPWIoUSwiY29sb3JzIixtKSxNbj1iKFEsInRpY2tzIixOdW1iZXIpLFBuPWIoUSwic2hhcGVzIiksdWU9YihRLCJzY2FsYXIiKSxFZT0hIWIoUSwiZmxhdCIpLGN0PVMoUSksVnQ9QmUsYW49W10sTHI9Ti53aWR0aCpjdC54LG1vPU4uaGVpZ2h0KmN0Lnk7VnQtLTspYW4ucHVzaChMKHt4OkxyLHk6bW8sYW5nbGU6WGUsc3ByZWFkOlN0LHN0YXJ0VmVsb2NpdHk6VWUsY29sb3I6eG5bVnQleG4ubGVuZ3RoXSxzaGFwZTpQbltoKDAsUG4ubGVuZ3RoKV0sdGlja3M6TW4sZGVjYXk6RXQsZ3Jhdml0eTpIdCxkcmlmdDpqdCxzY2FsYXI6dWUsZmxhdDpFZX0pKTtyZXR1cm4gY2U/Y2UuYWRkRmV0dGlzKGFuKTooY2U9SShOLGFuLFosZ2UsX2UpLGNlLnByb21pc2UpfWZ1bmN0aW9uIGllKFEpe3ZhciBnZT1xfHxiKFEsImRpc2FibGVGb3JSZWR1Y2VkTW90aW9uIixCb29sZWFuKSxfZT1iKFEsInpJbmRleCIsTnVtYmVyKTtpZihnZSYmbGUpcmV0dXJuIGMoZnVuY3Rpb24oVWUpe1VlKCl9KTtSJiZjZT9OPWNlLmNhbnZhczpSJiYhTiYmKE49QShfZSksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChOKSksQiYmIWFlJiZaKE4pO3ZhciBCZT17d2lkdGg6Ti53aWR0aCxoZWlnaHQ6Ti5oZWlnaHR9O0smJiFhZSYmSy5pbml0KE4pLGFlPSEwLEsmJihOLl9fY29uZmV0dGlfaW5pdGlhbGl6ZWQ9ITApO2Z1bmN0aW9uIFhlKCl7aWYoSyl7dmFyIFVlPXtnZXRCb3VuZGluZ0NsaWVudFJlY3Q6ZnVuY3Rpb24oKXtpZighUilyZXR1cm4gTi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX19O1ooVWUpLEsucG9zdE1lc3NhZ2Uoe3Jlc2l6ZTp7d2lkdGg6VWUud2lkdGgsaGVpZ2h0OlVlLmhlaWdodH19KTtyZXR1cm59QmUud2lkdGg9QmUuaGVpZ2h0PW51bGx9ZnVuY3Rpb24gU3QoKXtjZT1udWxsLEImJihIPSExLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixYZSkpLFImJk4mJihkb2N1bWVudC5ib2R5LmNvbnRhaW5zKE4pJiZkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKE4pLE49bnVsbCxhZT0hMSl9cmV0dXJuIEImJiFIJiYoSD0hMCx0LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsWGUsITEpKSxLP0suZmlyZShRLEJlLFN0KTplZShRLEJlLFN0KX1yZXR1cm4gaWUucmVzZXQ9ZnVuY3Rpb24oKXtLJiZLLnJlc2V0KCksY2UmJmNlLnJlc2V0KCl9LGllfXZhciBGO2Z1bmN0aW9uIFUoKXtyZXR1cm4gRnx8KEY9TShudWxsLHt1c2VXb3JrZXI6ITAscmVzaXplOiEwfSkpLEZ9ZnVuY3Rpb24gTyhOLGssUixCLEgscSxKKXt2YXIgSz1uZXcgUGF0aDJEKE4pLFo9bmV3IFBhdGgyRDtaLmFkZFBhdGgoSyxuZXcgRE9NTWF0cml4KGspKTt2YXIgYWU9bmV3IFBhdGgyRDtyZXR1cm4gYWUuYWRkUGF0aChaLG5ldyBET01NYXRyaXgoW01hdGguY29zKEopKkgsTWF0aC5zaW4oSikqSCwtTWF0aC5zaW4oSikqcSxNYXRoLmNvcyhKKSpxLFIsQl0pKSxhZX1mdW5jdGlvbiBqKE4pe2lmKCFpKXRocm93IG5ldyBFcnJvcigicGF0aCBjb25mZXR0aSBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIiKTt2YXIgayxSO3R5cGVvZiBOPT0ic3RyaW5nIj9rPU46KGs9Ti5wYXRoLFI9Ti5tYXRyaXgpO3ZhciBCPW5ldyBQYXRoMkQoayksSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSxxPUguZ2V0Q29udGV4dCgiMmQiKTtpZighUil7Zm9yKHZhciBKPTFlMyxLPUosWj1KLGFlPTAsbGU9MCxjZSxlZSxpZT0wO2llPEo7aWUrPTIpZm9yKHZhciBRPTA7UTxKO1ErPTIpcS5pc1BvaW50SW5QYXRoKEIsaWUsUSwibm9uemVybyIpJiYoSz1NYXRoLm1pbihLLGllKSxaPU1hdGgubWluKFosUSksYWU9TWF0aC5tYXgoYWUsaWUpLGxlPU1hdGgubWF4KGxlLFEpKTtjZT1hZS1LLGVlPWxlLVo7dmFyIGdlPTEwLF9lPU1hdGgubWluKGdlL2NlLGdlL2VlKTtSPVtfZSwwLDAsX2UsLU1hdGgucm91bmQoY2UvMitLKSpfZSwtTWF0aC5yb3VuZChlZS8yK1opKl9lXX1yZXR1cm57dHlwZToicGF0aCIscGF0aDprLG1hdHJpeDpSfX1mdW5jdGlvbiBYKE4pe3ZhciBrLFI9MSxCPSIjMDAwMDAwIixIPSciQXBwbGUgQ29sb3IgRW1vamkiLCAiU2Vnb2UgVUkgRW1vamkiLCAiU2Vnb2UgVUkgU3ltYm9sIiwgIk5vdG8gQ29sb3IgRW1vamkiLCAiRW1vamlPbmUgQ29sb3IiLCAiQW5kcm9pZCBFbW9qaSIsICJUd2Vtb2ppIE1vemlsbGEiLCAic3lzdGVtIGVtb2ppIiwgc2Fucy1zZXJpZic7dHlwZW9mIE49PSJzdHJpbmciP2s9Tjooaz1OLnRleHQsUj0ic2NhbGFyImluIE4/Ti5zY2FsYXI6UixIPSJmb250RmFtaWx5ImluIE4/Ti5mb250RmFtaWx5OkgsQj0iY29sb3IiaW4gTj9OLmNvbG9yOkIpO3ZhciBxPTEwKlIsSj0iIitxKyJweCAiK0gsSz1uZXcgT2Zmc2NyZWVuQ2FudmFzKHEscSksWj1LLmdldENvbnRleHQoIjJkIik7Wi5mb250PUo7dmFyIGFlPVoubWVhc3VyZVRleHQoayksbGU9TWF0aC5jZWlsKGFlLmFjdHVhbEJvdW5kaW5nQm94UmlnaHQrYWUuYWN0dWFsQm91bmRpbmdCb3hMZWZ0KSxjZT1NYXRoLmNlaWwoYWUuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQrYWUuYWN0dWFsQm91bmRpbmdCb3hEZXNjZW50KSxlZT0yLGllPWFlLmFjdHVhbEJvdW5kaW5nQm94TGVmdCtlZSxRPWFlLmFjdHVhbEJvdW5kaW5nQm94QXNjZW50K2VlO2xlKz1lZStlZSxjZSs9ZWUrZWUsSz1uZXcgT2Zmc2NyZWVuQ2FudmFzKGxlLGNlKSxaPUsuZ2V0Q29udGV4dCgiMmQiKSxaLmZvbnQ9SixaLmZpbGxTdHlsZT1CLFouZmlsbFRleHQoayxpZSxRKTt2YXIgZ2U9MS9SO3JldHVybnt0eXBlOiJiaXRtYXAiLGJpdG1hcDpLLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpLG1hdHJpeDpbZ2UsMCwwLGdlLC1sZSpnZS8yLC1jZSpnZS8yXX19bi5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJuIFUoKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG4uZXhwb3J0cy5yZXNldD1mdW5jdGlvbigpe1UoKS5yZXNldCgpfSxuLmV4cG9ydHMuY3JlYXRlPU0sbi5leHBvcnRzLnNoYXBlRnJvbVBhdGg9aixuLmV4cG9ydHMuc2hhcGVGcm9tVGV4dD1YfSkoZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnRoaXN8fHt9fSgpLF9wLCExKTt2YXIgUmw9X3AuZXhwb3J0cyxzUD1fcC5leHBvcnRzLmNyZWF0ZTt2YXIgTWw9IkFtcGxlIEFnZW50IFBybyIsQ3A9IlhyeGhHV1BiYm1nU0JKNmZTQ1ZuczU3ayI7ZnVuY3Rpb24gUGwoKXtsZXQgZT1QZSgpW0cuTExNX1BST1ZJREVSX01PREVMXTtpZighZXx8ZT09PSJub25lIilyZXR1cm5bXTtsZXQgdD1UcihlKXx8ZSxuPVRwW3RdO2lmKCFufHxuLmxlbmd0aD09PTApcmV0dXJuW107bGV0IHI9Wm5bdF07cmV0dXJuIHI/W3IsLi4ubi5maWx0ZXIobz0+byE9PXIpXTpbLi4ubl19ZnVuY3Rpb24gb3coZSx0KXtsZXQgbj1QZSgpLHI9QXQodCk7aWYociYmbltyXSlyZXR1cm4gbltyXS50cmltKCk7bGV0IG89blsiTExNIEFQSSBLZXkiXTtpZihvKXJldHVybiBvLnRyaW0oKTtpZihLZyl0aHJvdyBuZXcgRXJyb3IoYENvdWxkbnQgZmluZCBhICR7dH0ga2V5IGluICR7SlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMobikpfWApO3JldHVybiBlLmFsZXJ0KCJQbGVhc2UgY29uZmlndXJlIHlvdXIgQVBJIGtleSBpbiBwbHVnaW4gc2V0dGluZ3MuIiksbnVsbH1mdW5jdGlvbiBhdyhlLHQpe2xldCBuPU9yKGUpLHI9RXBbbl07cmV0dXJuIHI9ci5yZXBsYWNlKCJ7bW9kZWwtbmFtZX0iLGUpLG49PT0iZ2VtaW5pIiYmKHI9YCR7cn0/a2V5PSR7dH1gKSxyfWZ1bmN0aW9uIE9yKGUpe2ZvcihsZXRbdCxuXW9mIE9iamVjdC5lbnRyaWVzKFRwKSlpZihuLmluY2x1ZGVzKGUpKXJldHVybiB0O3Rocm93IG5ldyBFcnJvcihgTW9kZWwgJHtlfSBub3QgZm91bmQgaW4gYW55IHByb3ZpZGVyYCl9ZnVuY3Rpb24gSXIoZSl7cmV0dXJue2FudGhyb3BpYzoiQW50aHJvcGljIixkZWVwc2VlazoiRGVlcFNlZWsiLGdlbWluaToiR2VtaW5pIixncm9rOiJHcm9rIixvcGVuYWk6Ik9wZW5BSSIscGVycGxleGl0eToiUGVycGxleGl0eSJ9W2VdfHxlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9ZnVuY3Rpb24gaXcoZSl7bGV0IHQsbj1lLnRyaW0oKSxyPW4uaW5kZXhPZigiWyIpLG89bi5pbmRleE9mKCJ7IiksYT1uLmluY2x1ZGVzKCJ9IiksaT1uLmluY2x1ZGVzKCJdIikscz0hMSxsPS0xO2EmJm89PT0tMSYmKGU9YHske2V9YCxvPTApLGkmJnI9PT0tMSYmKGU9YFske2V9YCxyPTApLHI9ZS5pbmRleE9mKCJbIiksbz1lLmluZGV4T2YoInsiKSxyIT09LTEmJihvPT09LTF8fHI8byk/KHM9ITAsbD1yKTpvIT09LTE/KHM9ITEsbD1vKTooZT1geyR7ZX19YCxsPTAscz0hMSk7bGV0IGM9cz8iXSI6In0iLGQ9ZS5sYXN0SW5kZXhPZihjKTtpZihkPT09LTEpe2VbZS5sZW5ndGgtMV09PT0iLCImJihlPWUuc3Vic3RyaW5nKDAsZS5sZW5ndGgtMSkpO2xldCB1PWUuaW5jbHVkZXMoIlsiKSYmIWUuaW5jbHVkZXMoIl0iKSxwPWUuaW5jbHVkZXMoInsiKSYmIWUuaW5jbHVkZXMoIn0iKTt1JiZwP2UrPSJ9XSI6dT9lKz0iXSI6cD9lKz0ifSI6ZT1zP2Ake2V9XWA6YCR7ZX19YH1lbHNlIGU9ZS5zdWJzdHJpbmcobCxkKzEpO3RyeXtyZXR1cm4gdD1KU09OLnBhcnNlKGUpLHR9Y2F0Y2godSl7bGV0IHA9ZTtlPXBFKGUpLEUoYEZhaWxlZCB0byBwYXJzZSBqc29uVGV4dCBTVEFSVDoKJHtwfQpFTkQKIGR1ZSB0byAke3V9LiBBdHRlbXB0ZWQgcmViYWxhbmNlIHlpZWxkZWQ6ICR7ZX0gKG9yaWdpbmFsIHNpemUgJHtwLmxlbmd0aHx8IihudWxsKSJ9LCByZWJhbGFuY2Ugc2l6ZSAke2U/Lmxlbmd0aHx8IigwKSJ9KWApO3RyeXtyZXR1cm4gdD1KU09OLnBhcnNlKGUpLHR9Y2F0Y2goeSl7RSgiUmViYWxhbmNlZCBqc29uVGV4dCBzdGlsbCBmYWlscyIseSl9bGV0IGY9ZS5yZXBsYWNlKC8iIiIvZywnIlxcIiInKS5yZXBsYWNlKC8iXG4vZywnIlxcbicpO2lmKGY9Zi5yZXBsYWNlKC8oW3ssXVxzKikoW2EtekEtWl8kXVthLXpBLVowLTlfJF0qKSI6L2csJyQxIiQyIjonKSxmPWYucmVwbGFjZSgvXG5ccypbJ+KAnOKAnV0vZyxgCiJgKS5yZXBsYWNlKC9bJ+KAnOKAnV0sXHMqXG4vZyxgIiwKYCkucmVwbGFjZSgvWyfigJzigJ1dXHMqKFtcblxdXSkvLCciJDEnKSxmIT09ZSl0cnl7cmV0dXJuIHQ9SlNPTi5wYXJzZShmKSx0fWNhdGNoKHkpe0UoIlJlZm9ybWF0dGVkIHRleHQgc3RpbGwgZmFpbHMiLHkpfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBwRShlKXtsZXQgdD1lLmluZGV4T2YoInsiKTtpZih0PT09LTEpcmV0dXJuIG51bGw7bGV0IG49ZS5zdWJzdHJpbmcodCkudHJpbSgpLHI9W10sbz0iIjtmb3IobGV0IGEgb2YgbilpZihvKz1hLGE9PT0ieyI/ci5wdXNoKCJ9Iik6YT09PSJ9Ij9yW3IubGVuZ3RoLTFdPT09In0iJiZyLnBvcCgpOmE9PT0iWyI/ci5wdXNoKCJdIik6YT09PSJdIiYmcltyLmxlbmd0aC0xXT09PSJdIiYmci5wb3AoKSxyLmxlbmd0aD09PTApYnJlYWs7cmV0dXJuIHIubGVuZ3RoJiYoRSgiRm91bmQiLHIubGVuZ3RoLCJjaGFyYWN0ZXJzIHRvIGFwcGVuZCB0byBiYWxhbmNlIixvLCIuIEFkZGluZyAiLHIucmV2ZXJzZSgpLmpvaW4oIiIpKSxvKz1yLnJldmVyc2UoKS5qb2luKCIiKSksb312YXIgc3c9MjtmdW5jdGlvbiBMbChlKXtsZXQgdD1lLnRyaW0oKTt0LmluZGV4T2YoInsiKT09PS0xJiYodD0ieyIrdCk7bGV0IHI7dC5zcGxpdCgifXsiKS5sZW5ndGg+MT8ocj10LnNwbGl0KCJ9eyIpLm1hcChpPT5gJHtpWzBdPT09InsiPyIiOiJ7In0ke2l9JHtpW2kubGVuZ3RoLTFdPT09In0iPyIiOiJ9In1gKSxFKCJSZWNlaXZlZCBtdWx0aXBsZSByZXNwb25zZXMgZnJvbSBBSSwgZXZhbHVhdGluZyBlYWNoIG9mIixyKSk6cj1bdF07bGV0IGE9ci5tYXAoaT0+aXcoaSkpLmZpbHRlcihpPT5pKTtpZihhLmxlbmd0aClpZihhLmxlbmd0aD4xKXtsZXQgaT1hWzBdO3JldHVybiBPYmplY3QuZW50cmllcyhpKS5mb3JFYWNoKChbcyxsXSk9Pntmb3IobGV0IGMgb2YgYS5zbGljZSgxKSl7bGV0IGQ9Y1tzXTtkJiZBcnJheS5pc0FycmF5KGQpJiZBcnJheS5pc0FycmF5KGwpJiYoaVtzXT1bLi4ubmV3IFNldChbLi4ubCwuLi5kXSldLmZpbHRlcih1PT51KSl9fSksaX1lbHNlIHJldHVybiBhWzBdO3JldHVybiBudWxsfWZ1bmN0aW9uIGZFKGUsdCl7bGV0IG47c3dpdGNoKGUpe2Nhc2UiYW50aHJvcGljIjpuPXQ/LmNvbnRlbnQ/LmF0KDApPy50ZXh0O2JyZWFrO2Nhc2UiZ2VtaW5pIjpuPXQ/LmNhbmRpZGF0ZXM/LmF0KDApPy5jb250ZW50Py5wYXJ0cz8uYXQoMCk/LnRleHQ7YnJlYWs7Y2FzZSJvbGxhbWEiOm49dD8ubWVzc2FnZT8uY29udGVudHx8dD8ucmVzcG9uc2U7YnJlYWs7Y2FzZSJkZWVwc2VlayI6Y2FzZSJncm9rIjpjYXNlIm9wZW5haSI6Y2FzZSJwZXJwbGV4aXR5IjpkZWZhdWx0Om49dD8uY2hvaWNlcz8uYXQoMCk/Lm1lc3NhZ2U/LmNvbnRlbnR8fHQ/LmNob2ljZXM/LmF0KDApPy5tZXNzYWdlPy50b29sX2NhbGxzPy5hdCgwKT8uZnVuY3Rpb24/LmFyZ3VtZW50czticmVha31yZXR1cm4gbnx8RShgQ291bGQgbm90IGV4dHJhY3QgY29udGVudCBmcm9tICR7ZX0gcmVzcG9uc2U6YCxKU09OLnN0cmluZ2lmeSh0LG51bGwsMikpLG58fG51bGx9YXN5bmMgZnVuY3Rpb24gbHcoZSx0LG4scixvLGEse3RpbWVvdXRTZWNvbmRzOmk9MzB9PXt9KXtsZXQgcz1PcihuKSxsO2lmKG8pbD1hd2FpdCBtRShlLHQsbiwhMCxvKSxlLmFsZXJ0KGwse3Njcm9sbFRvRW5kOiEwfSk7ZWxzZSB0cnl7YXdhaXQgUHJvbWlzZS5yYWNlKFtuZXcgUHJvbWlzZShhc3luYyhkLHUpPT57bGV0IHA9YXdhaXQgdC5qc29uKCk7bD1mRShzLHApLGQobCl9KSxuZXcgUHJvbWlzZSgoZCx1KT0+c2V0VGltZW91dCgoKT0+dShuZXcgRXJyb3IoYCR7c30gVGltZW91dGApKSxpKjFlMykpXSl9Y2F0Y2goZCl7dGhyb3cgRSgiRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGZyb20iLG4sImVycm9yIixkKSxkfWxldCBjPWw7cmV0dXJuIGw9TGwobCksIWF8fGEobCk/bDooYyYmRSgiUmVjZWl2ZWQiLGMsImJ1dCBjb3VsZCBub3QgcGFyc2UgYXMgYSB2YWxpZCByZXN1bHQiKSxudWxsKX1hc3luYyBmdW5jdGlvbiBtRShlLHQsbixyLG8pe3JldHVybiB0eXBlb2YgZ2xvYmFsPCJ1IiYmdHlwZW9mIGdsb2JhbC5mZXRjaDwidSI/YXdhaXQgaEUoZSx0LG4scixvKTphd2FpdCBnRShlLHQsbixyLG8pfWFzeW5jIGZ1bmN0aW9uIGhFKGUsdCxuLHIsbyl7bGV0IGE9dC5ib2R5LGk9ITEscz0iIixsLGM7cmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChkLHUpPT57bGV0IHA9KCk9PntsZXQgZj0wLHk9KCk9PntsZXQgdz1hLnJlYWQoKTtpZih3KXtmPTA7bGV0IGI9dy50b1N0cmluZygpO2lmKHthYm9ydDppLGZhaWxlZFBhcnNlQ29udGVudDpsLGluY3JlbWVudGFsQ29udGVudHM6YyxyZWNlaXZlZENvbnRlbnQ6c309byhlLGIscyxuLHIsbCksaXx8IWN3KGMscykpe2QoKTtyZXR1cm59eSgpfWVsc2UgZis9MSxmPDM/c2V0VGltZW91dCh5LHN3KjFlMyk6ZCgpfTt5KCl9O2Eub24oInJlYWRhYmxlIixwKX0pLHN9YXN5bmMgZnVuY3Rpb24gZ0UoZSx0LG4scixvKXtsZXQgYT10LmJvZHkuZ2V0UmVhZGVyKCksaT1uZXcgVGV4dERlY29kZXIscyxsLGMsZCx1PTAscD0iIjtmb3IoOyFsOyl7bGV0IGY9bnVsbCx5PSExO3RyeXthd2FpdCBQcm9taXNlLnJhY2UoW3tkb25lOnksdmFsdWU6Zn09YXdhaXQgYS5yZWFkKCksbmV3IFByb21pc2UoKHcsYik9PnNldFRpbWVvdXQoKCk9PmIobmV3IEVycm9yKCJUaW1lb3V0IikpLHN3KjFlMykpXSl9Y2F0Y2godyl7bD13LEUoIkZhaWxlZCB0byByZWNlaXZlIGZ1cnRoZXIgc3RyZWFtIGRhdGEgaW4gdGltZSIsdyk7YnJlYWt9aWYoeXx8dT4zKXtFKCJDb21wbGV0ZWQgZ2VuZXJhdGluZyByZXNwb25zZSBsZW5ndGgiKTticmVha31lbHNlIGlmKGYpe2xldCB3PWkuZGVjb2RlKGYse3N0cmVhbTohMH0pO3RyeXtpZih0eXBlb2Ygdz09InN0cmluZyIpe3U9MDtsZXQgYj1vKGUsdyxwLG4scixjKTtpZihiKXtpZih7YWJvcnQ6cyxmYWlsZWRQYXJzZUNvbnRlbnQ6YyxpbmNyZW1lbnRhbENvbnRlbnRzOmQscmVjZWl2ZWRDb250ZW50OnB9PWIsc3x8IWN3KGQscCkpYnJlYWt9ZWxzZSBFKCJGYWlsZWQgdG8gcGFyc2Ugc3RyZWFtIGZyb20iLGYsImFzIEpTT04iKSx1Kz0xfWVsc2UgRSgiRmFpbGVkIHRvIHBhcnNlIHN0cmVhbSBmcm9tIixmLCJhcyBKU09OIiksdSs9MX1jYXRjaChiKXtFKCJUaGVyZSB3YXMgYW4gZXJyb3IgcGFyc2luZyB0aGUgcmVzcG9uc2UgZnJvbSBzdHJlYW06IixiKTticmVha319ZWxzZSB1Kz0xfXJldHVybiBwfWZ1bmN0aW9uIGN3KGUsdCl7bGV0IG47aWYoZT8ubGVuZ3RoJiYodD8ubGVuZ3RofHwwKT49a2Qpe2xldCByPXQucmVwbGFjZSgvXG4vZywiICIpO249ci5zdWJzdHJpbmcoci5sZW5ndGgta2QpLnRyaW0oKT09PSIiLG4mJkUoIlJlc3BvbnNlIGV4Y2VlZHMgZW1wdHkgc3BhY2UgdGhyZXNob2xkLiBBYm9ydGluZyIpfXJldHVybiFufXZhciB5RT0zMCx1dz01MDthc3luYyBmdW5jdGlvbiB2RShlLHQsbixyLG8sYSxpKXtsZXQgcz1QbCgpO3ImJihzPXMuZmlsdGVyKHk9PnkhPT1yKSxzLnVuc2hpZnQocikpO2xldCBsPXMuc2hpZnQoKTtFKCJbbGxtUHJvbXB0XSBtb2RlbCByZXNvbHV0aW9uIix7YWlNb2RlbE92ZXJyaWRlOnIsbW9kZWxUb1VzZTpsPz9udWxsLHJlbWFpbmluZ0NhbmRpZGF0ZUNvdW50OnMubGVuZ3RoLGFwaUtleU92ZXJyaWRlUHJlc2VudDohIW99KTtsZXQgYz1be3JvbGU6InVzZXIiLGNvbnRlbnQ6bn1dLGQ9aT97dGltZW91dFNlY29uZHM6aX06e307byYmKGQuYXBpS2V5PW8pO2xldCB1PWF3YWl0IGtFKGUsYyxsLGQpLGY9YXdhaXQgbHcoZSx1LGwsYT8ibGxtUHJvbXB0SnNvbiI6bnVsbCxudWxsLG51bGwpO3JldHVybiBmJiZhJiZ0eXBlb2YgZj09InN0cmluZyI/TGwoZik6Zn1hc3luYyBmdW5jdGlvbiBkdyhlLHQse2pzb25SZXNwb25zZTpuLGFpTW9kZWw6cixhcGlLZXk6byx0aW1lb3V0U2Vjb25kczphfT17fSl7bGV0IGk9cGVyZm9ybWFuY2Uubm93KCk7RSgiW2xsbVByb21wdF0gc3RhcnRpbmciLHtwcm9tcHRMZW5ndGg6dD8ubGVuZ3RoPz8wLGFtcGxlQWdlbnRQcm9VdWlkOkNwLGhhc0NhbGxQbHVnaW46dHlwZW9mIGU/LmNhbGxQbHVnaW49PSJmdW5jdGlvbiIsanNvblJlc3BvbnNlOiEhbixhaU1vZGVsT3ZlcnJpZGU6cj8/bnVsbCxhcGlLZXlPdmVycmlkZVByZXNlbnQ6ISFvfSk7dHJ5e2xldCBjPWF3YWl0IGUuY2FsbFBsdWdpbih7c291cmNlOkNwfSx0KTtpZih0eXBlb2YgYz4idSIpe2xldCB1PWF3YWl0IGUuZmluZE5vdGUoe25hbWU6TWx9KTtFKCJbbGxtUHJvbXB0V2l0aFBsdWdpbkZhbGxiYWNrXSBjYWxsUGx1Z2luIHJldHVybmVkIHVuZGVmaW5lZDsgY2hlY2tpbmcgZm9yIEFtcGxlIEFnZW50IFBybyBub3RlIGV4aXN0ZW5jZSwgZ290Iix1KSx1JiYoYz1hd2FpdCBlLmNhbGxQbHVnaW4oe3V1aWQ6dS51dWlkfSx0KSxFKGBbbGxtUHJvbXB0V2l0aFBsdWdpbkZhbGxiYWNrXSBBdHRlbXB0IHRvIGNhbGxQbHVnaW4gZm9yIG5vdGUgdXVpZCAke3UudXVpZH0geWllbGRlZGAsYykpfWxldCBkPU51bWJlcigocGVyZm9ybWFuY2Uubm93KCktaSkudG9GaXhlZCgxKSk7aWYoYyl7bGV0IHA9dHlwZW9mIGM9PSJzdHJpbmciP2Muc3Vic3RyaW5nKDAsMzAwKTpKU09OLnN0cmluZ2lmeShjKS5zdWJzdHJpbmcoMCwzMDApO0UoIltsbG1Qcm9tcHRXaXRoUGx1Z2luRmFsbGJhY2tdIGNhbGxQbHVnaW4gcmF3IHJlc3VsdCIse2R1cmF0aW9uTXM6ZCxyZXN1bHRUeXBlOnR5cGVvZiBjLHJlc3VsdExlbmd0aDp0eXBlb2YgYz09InN0cmluZyI/Yy5sZW5ndGg6bnVsbCxyZXN1bHRTbmlwcGV0OnB9KTtsZXQgZj1uJiZ0eXBlb2YgYz09InN0cmluZyI/TGwoYyk6YztyZXR1cm4gRSgiW2xsbVByb21wdFdpdGhQbHVnaW5GYWxsYmFja10gY2FsbFBsdWdpbiBwYXJzZWQgcmVzdWx0Iix7cGFyc2VkVHlwZTpmPT09bnVsbD8ibnVsbCI6dHlwZW9mIGYsaGFzVGFza3NGaWVsZDohIShmJiZ0eXBlb2YgZj09Im9iamVjdCImJiJ0YXNrcyJpbiBmKSx0YXNrc0xlbmd0aDpBcnJheS5pc0FycmF5KGY/LnRhc2tzKT9mLnRhc2tzLmxlbmd0aDpudWxsLGhhc0dvYWxzU3VtbWFyeTohIShmJiZ0eXBlb2YgZj09Im9iamVjdCImJmYuZ29hbHNTdW1tYXJ5KX0pLGZ9RShgW2xsbVByb21wdFdpdGhQbHVnaW5GYWxsYmFja10gY2FsbFBsdWdpbiByZXR1cm5lZCAnJHtjfScgKHR5cGVvZiAke3R5cGVvZiBjfSkgXHUyMDE0IGZhbGxpbmcgYmFjayB0byBkaXJlY3QgTExNYCx7ZHVyYXRpb25NczpkLHBsdWdpblJlc3VsdFZhbHVlOmMscGx1Z2luUmVzdWx0VHlwZTp0eXBlb2YgY30pfWNhdGNoKGMpe0UoIltsbG1Qcm9tcHRXaXRoUGx1Z2luRmFsbGJhY2tdIGNhbGxQbHVnaW4gdGhyZXcgXHUyMDE0IGZhbGxpbmcgYmFjayB0byBkaXJlY3QgTExNIix7ZHVyYXRpb25NczpOdW1iZXIoKHBlcmZvcm1hbmNlLm5vdygpLWkpLnRvRml4ZWQoMSkpLGVycm9yTWVzc2FnZTpjPy5tZXNzYWdlLGVycm9yTmFtZTpjPy5uYW1lfSl9bGV0IHM9cGVyZm9ybWFuY2Uubm93KCksbD1hd2FpdCB2RShlLG51bGwsdCxyLG8sbixhKTtyZXR1cm4gRSgiW2xsbVByb21wdFdpdGhQbHVnaW5GYWxsYmFja10gbGxtUHJvbXB0IGZhbGxiYWNrIGNvbXBsZXRlIix7ZHVyYXRpb25NczpOdW1iZXIoKHBlcmZvcm1hbmNlLm5vdygpLXMpLnRvRml4ZWQoMSkpLHJlc3VsdFR5cGU6bD09PW51bGw/Im51bGwiOnR5cGVvZiBsLGhhc1Rhc2tzRmllbGQ6ISEobCYmdHlwZW9mIGw9PSJvYmplY3QiJiYidGFza3MiaW4gbCl9KSxsfWZ1bmN0aW9uIEFwKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2UubWFwKHQ9PkFwKHQpKTohZXx8dHlwZW9mIGUhPSJvYmplY3QiP2U6T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGUpLm1hcCgoW3Qsbl0pPT50PT09ImNvbnRlbnQiJiZ0eXBlb2Ygbj09InN0cmluZyImJm4ubGVuZ3RoPnV3P1t0LGAke24uc2xpY2UoMCx1dy0zKX0uLi5gXTpbdCxBcChuKV0pKX1mdW5jdGlvbiB3RShlLHQpe2xldCBuPXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9O3N3aXRjaChlKXtjYXNlImFudGhyb3BpYyI6cmV0dXJuey4uLm4sIngtYXBpLWtleSI6dCwiYW50aHJvcGljLWRhbmdlcm91cy1kaXJlY3QtYnJvd3Nlci1hY2Nlc3MiOiJ0cnVlIiwiYW50aHJvcGljLXZlcnNpb24iOiIyMDIzLTA2LTAxIn07Y2FzZSJnZW1pbmkiOnJldHVybiBuO2RlZmF1bHQ6cmV0dXJuey4uLm4sQXV0aG9yaXphdGlvbjpgQmVhcmVyICR7dH1gfX19ZnVuY3Rpb24gYkUoZSx0LG4scix7cHJvbXB0S2V5Om89bnVsbH09e30pe2xldCBhO3N3aXRjaChPcih0KSl7Y2FzZSJhbnRocm9waWMiOntsZXQgcz1lLmZpbmQoYz0+Yy5yb2xlPT09InN5c3RlbSIpLGw9ZS5maWx0ZXIoYz0+Yy5yb2xlIT09InN5c3RlbSIpO2E9e21heF90b2tlbnM6NDA5Nixtb2RlbDp0LG1lc3NhZ2VzOmx9LG4mJihhLnN0cmVhbT1uKSxzJiYoYS5zeXN0ZW09cy5jb250ZW50KTticmVha31jYXNlImdlbWluaSI6e2xldCBzPWUuZmluZChjPT5jLnJvbGU9PT0ic3lzdGVtIik7YT17Y29udGVudHM6ZS5maWx0ZXIoYz0+Yy5yb2xlIT09InN5c3RlbSIpLm1hcChjPT4oe3JvbGU6Yy5yb2xlPT09ImFzc2lzdGFudCI/Im1vZGVsIjoidXNlciIscGFydHM6W3t0ZXh0OmMuY29udGVudH1dfSkpfSxzJiYoYS5zeXN0ZW1JbnN0cnVjdGlvbj17cGFydHM6W3t0ZXh0OnMuY29udGVudH1dfSksYS5nZW5lcmF0aW9uQ29uZmlnPXtyZXNwb25zZU1pbWVUeXBlOiJhcHBsaWNhdGlvbi9qc29uIn07YnJlYWt9Y2FzZSJncm9rIjpjYXNlInBlcnBsZXhpdHkiOmE9e21vZGVsOnQsbWVzc2FnZXM6ZX0sbiYmKGEuc3RyZWFtPW4pLHImJihhLnRvb2xzPXIpO2JyZWFrO2Nhc2UiZGVlcHNlZWsiOnthPXttb2RlbDp0LG1lc3NhZ2VzOmV9LG4mJihhLnN0cmVhbT1uKSxyJiYoYS50b29scz1yKSxhLnJlc3BvbnNlX2Zvcm1hdD17dHlwZToianNvbl9vYmplY3QifTticmVha31jYXNlIm9wZW5haSI6ZGVmYXVsdDp7YT17bW9kZWw6dCxtZXNzYWdlczplfSxuJiYoYS5zdHJlYW09biksciYmKGEudG9vbHM9ciksYS5yZXNwb25zZV9mb3JtYXQ9e3R5cGU6Impzb25fb2JqZWN0In07YnJlYWt9fXJldHVybiBhfWFzeW5jIGZ1bmN0aW9uIGtFKGUsdCxuLHthcGlLZXk6cj1udWxsLGF0dGVtcHROdW1iZXI6bz0xLHByb21wdEtleTphPW51bGwsc3RyZWFtOmk9bnVsbCx0aW1lb3V0U2Vjb25kczpzPXlFLHRvb2xzOmw9bnVsbH09e30pe2xldCBjPU9yKG4pO28+MCYmRShgQXR0ZW1wdCAjJHtvfTogVHJ5aW5nICR7bn0gd2l0aCAke2F8fCJubyBwcm9tcHRLZXkifWApLHJ8fChyPW93KGUsYykpO2xldCBkPWJFKHQsbixpLGwse3Byb21wdEtleTphfSksdT1hdyhuLHIpO0UoYENhbGxpbmcgJHtjfSBhdCAke3V9IHdpdGggYm9keSAke0pTT04uc3RyaW5naWZ5KEFwKGQpKX0gYXQgJHtuZXcgRGF0ZX1gKTtsZXQgcD13RShjLHIpLGY9YXdhaXQgUHJvbWlzZS5yYWNlKFtmZXRjaCh1LHttZXRob2Q6IlBPU1QiLGhlYWRlcnM6cCxib2R5OkpTT04uc3RyaW5naWZ5KGQpfSksbmV3IFByb21pc2UoKHksdyk9PnNldFRpbWVvdXQoKCk9PncobmV3IEVycm9yKCJUaW1lb3V0IikpLHMqMWUzKSldKTtpZighZi5vayl7bGV0IHk9bmV3IEVycm9yKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke2Yuc3RhdHVzfWApO3Rocm93IHkucmVzcG9uc2U9Zix5fXJldHVybiBmfXZhciB4RT1bIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sU0U9NTAsRUU9MmUzLFRFPTNlMyxORT0xZTMsREU9MWUzLG13PTUwMCxwdz04NjQwMCxfaT0xZTEwLF9FPTYwLENFPTMsQUU9MjAwLE9FPTQwMSxJRT00MDMsUkU9MSxNRT0xMCxQRT01LExFPTcsekU9NSxGRT0uNSxVRT0zLCRFPTIwLFdFPTE1LEJFPTE1LEhFPTgsakU9MjUsVkU9MjAsR0U9MTIsS0U9NSxZRT01LHFFPTMsUUU9MTUsSkU9MTAsWEU9NSxmdz0xLFpFPTMsZVQ9Nyx0VD0ic3VnIixuVD0xZTYsclQ9LjE7YXN5bmMgZnVuY3Rpb24gaHcoZSx7ZXhjbHVkZVV1aWRzOnQsZXhpc3RpbmdOb3RlSGFuZGxlOm4sbWluaW11bVRhc2tDb3VudDpyPTEsbm90ZU5hbWU6bz1gRGFzaGJvYXJkIHByb3Bvc2VkIHRhc2tzIGZvciAke25ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoW10se3llYXI6Im51bWVyaWMiLG1vbnRoOiJsb25nIixkYXk6Im51bWVyaWMifSl9YCxwcm92aWRlckVtT3ZlcnJpZGU6YX09e30pe2xldCBpPU1hdGgubWF4KDEscGFyc2VJbnQociwxMCl8fDEpLHM9dCBpbnN0YW5jZW9mIFNldD90Om51bGwsbD1uZXcgRGF0ZSxjPXhFW2wuZ2V0RGF5KCldLGQ9b2lbbC5nZXRNb250aCgpXSx1PWwuZ2V0RGF5KCk9PT0wfHxsLmdldERheSgpPT09NjtFKCJbZHJlYW0tdGFza10gYW5hbHl6ZURyZWFtVGFza3MgZW50cnkiLHtub3RlTmFtZTpvLG1pbmltdW1TdWdnZXN0aW9uQ291bnQ6aSxleGNsdWRlVXVpZHNTaXplOnM/LnNpemU/PzAscHJvdmlkZXJFbU92ZXJyaWRlOmE/P251bGwsZXhpc3RpbmdOb3RlSGFuZGxlVXVpZDpuPy51dWlkPz9udWxsfSk7bGV0IHA9YXdhaXQgYVQoZSxvLG4pLGY9cC5jYWNoZWQudGFza3MuZmlsdGVyKHg9PiF6bCh4KSkubGVuZ3RoO2lmKEUoIltkcmVhbS10YXNrXSBjYWNoZWQtbm90ZSBzdGF0ZSIse25vdGVVVUlEOnAubm90ZUhhbmRsZT8udXVpZD8/bnVsbCxleGlzdGluZ0NvbnRlbnRMZW5ndGg6cC5leGlzdGluZ0NvbnRlbnQ/Lmxlbmd0aD8/MCxjYWNoZWRUYXNrQ291bnQ6cC5jYWNoZWQudGFza3MubGVuZ3RoLHVuZGlzbWlzc2VkQ291bnQ6ZixtaW5pbXVtU3VnZ2VzdGlvbkNvdW50Omksd2lsbFVzZUNhY2hlOmY+PWl9KSxmPj1pKXtsZXQgeD1hd2FpdCBzVChlLHAuY2FjaGVkLnRhc2tzKTtyZXR1cm4gY1QocCx4KX1sZXQgeT1hd2FpdCBsVChlKSx3PU1hdGgubWF4KENFLGktcC5jYWNoZWQudGFza3MubGVuZ3RoKSxiPXVUKHkub3BlblRhc2tzLHMpLHY9YXdhaXQgZFQoZSxkLHAuZXhpc3RpbmdDb250ZW50KSxoPW9UKGwsYyxkKTtpZighISEodi5xdWFydGVybHlDb250ZW50fHx2Lm1vbnRobHlDb250ZW50fHx2LndlZWtseUNvbnRlbnQpJiZiLmxlbmd0aD09PTApcmV0dXJue3Rhc2tzOltdLGVycm9yOiJObyBwbGFubmluZyBkYXRhIG9yIHRhc2tzIGZvdW5kIHRvIGdlbmVyYXRlIHN1Z2dlc3Rpb25zIGZyb20uIFBvcHVsYXRlIHlvdXIgcXVhcnRlcmx5IGFuZC9vciBtb250aGx5IHBsYW4gdG8gcmVjZWl2ZSBBSS1zdWdnZXN0ZWQgdGFza3MuIixlcnJvckNvZGU6Im5vX3BsYW5uaW5nX2RhdGEiLG5vdGVVVUlEOnAubm90ZUhhbmRsZS51dWlkfTtsZXQgbT1hd2FpdCBwVCh7YXBwOmUsY2FuZGlkYXRlVGFza3M6YixkYXRlSGVhZGluZzpoLGRheU5hbWU6Yyxpc1dlZWtlbmQ6dSxub3RlVXVpZEZyb21UYXNrVXVpZDp5Lm5vdGVVdWlkRnJvbVRhc2tVdWlkLHByb3ZpZGVyRW1PdmVycmlkZTphLHBsYW5uaW5nQ29udGV4dDp2LHJlcXVlc3RlZFN1Z2dlc3Rpb25Db3VudDp3fSk7cmV0dXJuIG0uZXJyb3I/e3Rhc2tzOltdLGVycm9yOm0uZXJyb3IsZXJyb3JDb2RlOm0uZXJyb3JDb2RlLGVycm9yRGV0YWlsOm0uZXJyb3JEZXRhaWwsbm90ZVVVSUQ6cC5ub3RlSGFuZGxlLnV1aWR9Oihhd2FpdCBnVChlLHAuZXhpc3RpbmdDb250ZW50LG0uZ29hbHNTdW1tYXJ5LG0ubGxtQXR0cmlidXRpb25Gb290ZXIscC5ub3RlSGFuZGxlLG0uZW5mb3JjZWRUYXNrcykseVQocCx5LG0pKX1mdW5jdGlvbiBvVChlLHQsbil7cmV0dXJuYCR7dH0gJHtufSAke2UuZ2V0RGF0ZSgpfSwgJHtlLmdldEZ1bGxZZWFyKCl9YH1hc3luYyBmdW5jdGlvbiBhVChlLHQsbil7bGV0IHI9YXdhaXQgaVQoZSx0LG4pLG89YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDpyLnV1aWR9KSxhPXR5cGVvZiBvPT0ic3RyaW5nIj9vLnJlcGxhY2UoL1xyXG4vZyxgCmApOiIiO3JldHVybntub3RlSGFuZGxlOnIsZXhpc3RpbmdDb250ZW50OmEsY2FjaGVkOmtUKGEpfX1hc3luYyBmdW5jdGlvbiBpVChlLHQsbil7aWYobj8udXVpZClyZXR1cm4gRSgiW2RyZWFtLXRhc2tdIF9yZXNvbHZlRHJlYW1UYXNrTm90ZUhhbmRsZTogdXNpbmcgZXhpc3RpbmdOb3RlSGFuZGxlIixuLnV1aWQpLG47bGV0IHI9YXdhaXQgZS5maW5kTm90ZSh7bmFtZTp0LHRhZ3M6W1JlXX0pO2lmKHIpcmV0dXJuIEUoIltkcmVhbS10YXNrXSBfcmVzb2x2ZURyZWFtVGFza05vdGVIYW5kbGU6IGZpbmROb3RlIGxvY2F0ZWQiLHIudXVpZCwiZm9yIix0KSxyO2xldCBvPWF3YWl0IGUuY3JlYXRlTm90ZSh0LFtSZV0se2FyY2hpdmU6ITB9KTtyZXR1cm4gRShgW2RyZWFtLXRhc2tdIENyZWF0ZWQgZGFpbHkgbm90ZSAiJHt0fSIgd2l0aCB1dWlkICR7b31gKSx7dXVpZDpvfX1hc3luYyBmdW5jdGlvbiBzVChlLHQpe2xldCBuPXQuZmlsdGVyKHM9PnMudXVpZCYmIXpsKHMpKS5tYXAocz0+cy51dWlkKSxyPShhd2FpdCBQcm9taXNlLmFsbChuLm1hcChzPT5lLmdldFRhc2socykuY2F0Y2goKCk9Pm51bGwpKSkpLmZpbHRlcihCb29sZWFuKSxvPXZ3KHIpLGE9eXcociksaT1hd2FpdCBndyhlLHIpO3JldHVybntuYXRpdmVUYXNrRnJvbVRhc2tVdWlkOm8sbm90ZU5hbWVGcm9tTm90ZVV1aWQ6aSxub3RlVXVpZEZyb21UYXNrVXVpZDphLGRlZmF1bHROb3RlVVVJRDpudWxsfX1hc3luYyBmdW5jdGlvbiBsVChlKXtsZXQgdD1hd2FpdCB3VChlKSxuPXQ/YXdhaXQgZS5nZXRUYXNrRG9tYWluVGFza3ModCk6W10scj1uLmZpbHRlcihsPT4hbC5jb21wbGV0ZWRBdCYmIWwuZGlzbWlzc2VkQXQpO0UoYFtkcmVhbS10YXNrXSBGb3VuZCAke3IubGVuZ3RofSBvcGVuIHRhc2tzIGZyb20gZG9tYWluICR7dH1gKTtsZXQgbz1hd2FpdCBndyhlLHIpLGE9dncociksaT15dyhyKSxzPWJUKG4pO3JldHVybiBFKGBbZHJlYW0tdGFza10gRGVmYXVsdCBub3RlIGZvciBuZXcgdGFza3M6ICR7c31gKSx7YWxsVGFza3M6bixkZWZhdWx0Tm90ZVVVSUQ6cyxkb21haW5VdWlkOnQsbmF0aXZlVGFza0Zyb21UYXNrVXVpZDphLG5vdGVOYW1lRnJvbU5vdGVVdWlkOm8sbm90ZVV1aWRGcm9tVGFza1V1aWQ6aSxvcGVuVGFza3M6cn19YXN5bmMgZnVuY3Rpb24gZ3coZSx0KXtsZXQgbj1uZXcgU2V0O2ZvcihsZXQgbyBvZiB0KW8ubm90ZVVVSUQmJm4uYWRkKG8ubm90ZVVVSUQpO2xldCByPW5ldyBNYXA7Zm9yKGxldCBvIG9mIHQpe2lmKCFvLm5vdGVVVUlEKWNvbnRpbnVlO2xldCBhPShvLm5vdGVOYW1lfHxvLm5vdGVUaXRsZXx8IiIpLnRyaW0oKTthJiZyLnNldChvLm5vdGVVVUlELGEpfXJldHVybiBhd2FpdCBQcm9taXNlLmFsbChbLi4ubl0ubWFwKGFzeW5jIG89PntpZighci5oYXMobykpdHJ5e2xldCBhPWF3YWl0IGUuZmluZE5vdGUoe3V1aWQ6b30pO2E/Lm5hbWUmJnIuc2V0KG8sYS5uYW1lKX1jYXRjaChhKXtFKCJbZHJlYW0tdGFza10gZmluZE5vdGUoeyB1dWlkIH0pIGZhaWxlZDoiLG8sYSl9fSkpLHJ9ZnVuY3Rpb24geXcoZSl7bGV0IHQ9bmV3IE1hcDtmb3IobGV0IG4gb2YgZSluLnV1aWQmJm4ubm90ZVVVSUQmJnQuc2V0KG4udXVpZCxuLm5vdGVVVUlEKTtyZXR1cm4gdH1mdW5jdGlvbiB2dyhlKXtsZXQgdD1uZXcgTWFwO2ZvcihsZXQgbiBvZiBlKW4udXVpZCYmdC5zZXQobi51dWlkLG4pO3JldHVybiB0fWZ1bmN0aW9uIGNUKGUsdCl7RShgW2RyZWFtLXRhc2tdIFVzaW5nICR7ZS5jYWNoZWQudGFza3MubGVuZ3RofSBjYWNoZWQgZGFpbHkgc3VnZ2VzdGlvbnMgZnJvbSBub3RlYCk7bGV0e25hdGl2ZVRhc2tGcm9tVGFza1V1aWQ6bixub3RlTmFtZUZyb21Ob3RlVXVpZDpyLG5vdGVVdWlkRnJvbVRhc2tVdWlkOm99PXQ7cmV0dXJue3Rhc2tzOmUuY2FjaGVkLnRhc2tzLmZpbHRlcihpPT4hemwoaSkpLm1hcChpPT53dyhrdyhpKSx7bmF0aXZlVGFza0Zyb21UYXNrVXVpZDpuLG5vdGVOYW1lRnJvbU5vdGVVdWlkOnIsbm90ZVV1aWRGcm9tVGFza1V1aWQ6b30pKSxnb2Fsc1N1bW1hcnk6ZS5jYWNoZWQuZ29hbHNTdW1tYXJ5LGNhY2hlZDohMCxub3RlVVVJRDplLm5vdGVIYW5kbGUudXVpZCxkZWZhdWx0Tm90ZVVVSUQ6dC5kZWZhdWx0Tm90ZVVVSUQsc2hvd25VdWlkczpbXSxsbG1BdHRyaWJ1dGlvbkZvb3RlcjpoVChlLmV4aXN0aW5nQ29udGVudCl9fWZ1bmN0aW9uIHd3KGUse25hdGl2ZVRhc2tGcm9tVGFza1V1aWQ6dCxub3RlTmFtZUZyb21Ob3RlVXVpZDpuLG5vdGVVdWlkRnJvbVRhc2tVdWlkOnJ9KXtsZXQgbz1lLnV1aWQmJnQuZ2V0KGUudXVpZCl8fG51bGwsYT1lLnV1aWQmJnIuZ2V0KGUudXVpZCl8fG51bGwsaT1lLmlzRXhpc3RpbmchPT12b2lkIDA/ZS5pc0V4aXN0aW5nOiEhZS51dWlkLHM9YSYmbiYmbi5nZXQoYSl8fG51bGw7cmV0dXJuey4uLmUsbm90ZVVVSUQ6YSxpc0V4aXN0aW5nOmksbmF0aXZlVGFzazpvLHNvdXJjZU5vdGVOYW1lOnN9fWZ1bmN0aW9uIHVUKGUsdCl7bGV0IG49dCYmdC5zaXplPjA/ZS5maWx0ZXIocj0+IXQuaGFzKHIudXVpZCkpOmU7cmV0dXJuIEUoYFtkcmVhbS10YXNrXSBBZnRlciBleGNsdXNpb246ICR7bi5sZW5ndGh9IGNhbmRpZGF0ZSB0YXNrcyAoJHtlLmxlbmd0aC1uLmxlbmd0aH0gZXhjbHVkZWQpYCksbn1hc3luYyBmdW5jdGlvbiBkVChlLHQsbil7bGV0IG89YCR7QWQoKS5sYWJlbH0gUGxhbmAsaT0oYXdhaXQgZS5maWx0ZXJOb3Rlcyh7cXVlcnk6b30pKS5maW5kKHU9PnUubmFtZT09PW8pLHM9bnVsbCxsPW51bGwsYz1udWxsO2lmKGkpe2xldCB1PWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6aS51dWlkfSk7aWYodSl7cz11LGw9UW8odSx0KTtsZXQgcD11bChjbCgpKTtjPVFvKHUscCl9fWxldCBkPW4/bi5zdWJzdHJpbmcoMCxFRSk6bnVsbDtyZXR1cm57cXVhcnRlcmx5Q29udGVudDpzLG1vbnRobHlDb250ZW50Omwsd2Vla2x5Q29udGVudDpjLHByZXZpb3VzQW5hbHlzZXM6ZH19YXN5bmMgZnVuY3Rpb24gcFQoZSl7bGV0e2FwcDp0LGNhbmRpZGF0ZVRhc2tzOm4sZGF0ZUhlYWRpbmc6cixkYXlOYW1lOm8saXNXZWVrZW5kOmEsbm90ZVV1aWRGcm9tVGFza1V1aWQ6aSxwcm92aWRlckVtT3ZlcnJpZGU6cyxwbGFubmluZ0NvbnRleHQ6bCxyZXF1ZXN0ZWRTdWdnZXN0aW9uQ291bnQ6Y309ZSxkPXN8fFBlKClbRy5MTE1fUFJPVklERVJfTU9ERUxdO2lmKCEoISFkJiZkIT09Im5vbmUiKSl7bGV0IHg9YXdhaXQgdC5maW5kTm90ZSh7bmFtZTpNbH0pO2lmKEUoIltkcmVhbS10YXNrXSBubyBwcm92aWRlciBjb25maWd1cmVkIFx1MjAxNCBjaGVja2luZyBmb3IgQW1wbGUgQWdlbnQgUHJvIGZhbGxiYWNrIix7YW1wbGVBZ2VudE5vdGVGb3VuZDohIXgsYW1wbGVBZ2VudE5vdGVVdWlkOng/LnV1aWQ/P251bGx9KSwheClyZXR1cm57ZXJyb3I6Ik5vIEFJIHByb3ZpZGVyIGNvbmZpZ3VyZWQuIFBsZWFzZSBzZWxlY3QgYSBwcm92aWRlciBpbiB0aGUgcGx1Z2luIHNldHRpbmdzLiIsZXJyb3JDb2RlOiJub19wcm92aWRlcl9jb25maWd1cmVkIn19bGV0IHA9TlQobiksZj1wLm1hcCh4PT5EVCh4KSk7RShgW2RyZWFtLXRhc2tdIFNlbGVjdGVkICR7Zi5sZW5ndGh9IHRvcCB0YXNrcyBmcm9tICR7bi5sZW5ndGh9IGNhbmRpZGF0ZSB0YXNrcyBmb3IgTExNIGFuYWx5c2lzYCk7bGV0IHk9X1Qoe2RhdGVIZWFkaW5nOnIsZGF5TmFtZTpvLGlzV2Vla2VuZDphLHRhc2tKc29uT2JqZWN0czpmLHF1YXJ0ZXJseUNvbnRlbnQ6bC5xdWFydGVybHlDb250ZW50LG1vbnRobHlDb250ZW50OmwubW9udGhseUNvbnRlbnQsd2Vla2x5Q29udGVudDpsLndlZWtseUNvbnRlbnQscHJldmlvdXNBbmFseXNlczpsLnByZXZpb3VzQW5hbHlzZXMsb3BlblRhc2tDb3VudDpuLmxlbmd0aCxyZXF1ZXN0ZWRTdWdnZXN0aW9uQ291bnQ6Y30pLHcsYj1wZXJmb3JtYW5jZS5ub3coKTt0cnl7RSgiW2RyZWFtLXRhc2tdIFNlbmRpbmcgcHJvbXB0IHRvIExMTSwgbGVuZ3RoOiIseS5sZW5ndGgpO2xldHthaU1vZGVsOngsYXBpS2V5OlMsanNvblJlc3BvbnNlOl8sdGltZW91dFNlY29uZHM6RH09Yncocyk7dz1hd2FpdCBkdyh0LHkse2FpTW9kZWw6eCxhcGlLZXk6Uyxqc29uUmVzcG9uc2U6Xyx0aW1lb3V0U2Vjb25kczpEfSksRSgiW2RyZWFtLXRhc2tdIGxsbVByb21wdFdpdGhQbHVnaW5GYWxsYmFjayByZXR1cm5lZCIse2R1cmF0aW9uTXM6TnVtYmVyKChwZXJmb3JtYW5jZS5ub3coKS1iKS50b0ZpeGVkKDEpKSxyZXN1bHRUeXBlOnc9PT1udWxsPyJudWxsIjp0eXBlb2YgdyxyZXN1bHRJc0FycmF5OkFycmF5LmlzQXJyYXkodyksaGFzVGFza3NGaWVsZDohISh3JiZ0eXBlb2Ygdz09Im9iamVjdCImJiJ0YXNrcyJpbiB3KSx0YXNrc0xlbmd0aDpBcnJheS5pc0FycmF5KHc/LnRhc2tzKT93LnRhc2tzLmxlbmd0aDpudWxsLGdvYWxzU3VtbWFyeVByZXNlbnQ6ISEodyYmdHlwZW9mIHc9PSJvYmplY3QiJiZ3LmdvYWxzU3VtbWFyeSl9KX1jYXRjaCh4KXtjb25zb2xlLmVycm9yKCJbZHJlYW0tdGFza10gTExNIHByb21wdCIseSwiY2FsbCBmYWlsZWQiLHgpLEUoIltkcmVhbS10YXNrXSBsbG1Qcm9tcHRXaXRoUGx1Z2luRmFsbGJhY2sgdGhyZXciLHtkdXJhdGlvbk1zOk51bWJlcigocGVyZm9ybWFuY2Uubm93KCktYikudG9GaXhlZCgxKSksc3RhdHVzOng/LnJlc3BvbnNlPy5zdGF0dXMsbWVzc2FnZTp4Py5tZXNzYWdlfSk7bGV0IFM9eC5yZXNwb25zZT8uc3RhdHVzO3JldHVybiBTPT09T0V8fFM9PT1JRT97ZXJyb3I6IlRoZSBBUEkga2V5IGFwcGVhcnMgdG8gYmUgaW52YWxpZCBvciB1bmF1dGhvcml6ZWQuIixlcnJvckNvZGU6ImludmFsaWRfYXBpX2tleSJ9OntlcnJvcjpgTExNIHJlcXVlc3QgZmFpbGVkICgke3gubWVzc2FnZXx8InVua25vd24gZXJyb3IifSkuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuYCxlcnJvckNvZGU6ImxsbV9lcnJvciIsZXJyb3JEZXRhaWw6eC5tZXNzYWdlfHxudWxsfX1pZighd3x8IXcudGFza3MpcmV0dXJuIEUoIltkcmVhbS10YXNrXSBMTE0gcmV0dXJuZWQgaW52YWxpZCByZXNwb25zZToiLHcpLHtlcnJvcjoiVW5hYmxlIHRvIHByb2Nlc3MgdGhlIEFJIHByb3ZpZGVyJ3MgcmVzcG9uc2UgaW50byB0YXNrIHN1Z2dlc3Rpb25zLiIsZXJyb3JDb2RlOiJwYXJzZV9lcnJvciIsZXJyb3JEZXRhaWw6dz9KU09OLnN0cmluZ2lmeSh3KS5zdWJzdHJpbmcoMCxBRSk6ImVtcHR5IHJlc3BvbnNlIn07bGV0IHY9bmV3IFNldChuLm1hcCh4PT54LnV1aWQpLmZpbHRlcihCb29sZWFuKSksaD14VCh3LnRhc2tzLHYsYyksZz1TVChUVChpLGgscCkpLG09RVQody5nb2Fsc1N1bW1hcnkpO3JldHVybntlbmZvcmNlZFRhc2tzOmcsZ29hbHNTdW1tYXJ5Om0sbGxtQXR0cmlidXRpb25Gb290ZXI6bVQocyl9fWZ1bmN0aW9uIGJ3KGU9bnVsbCl7bGV0IHQ9UGUoKSxuPXtqc29uUmVzcG9uc2U6ITAsdGltZW91dFNlY29uZHM6X0V9LHI9ZTtpZihyKXtsZXQgcz1abltyXXx8bnVsbCxsPUF0KHIpLGM9bD8odD8uW2xdfHwiIikudHJpbSgpOiIiO2lmKHMmJmMpcmV0dXJuIG4uYWlNb2RlbD1zLG4uYXBpS2V5PWMsbn1sZXQgbz10W0cuTExNX1BST1ZJREVSX01PREVMXSxhPVRyKG8pO2lmKGhuJiZwcm9jZXNzLmVudi5PUEVOX0FJX0FDQ0VTU19UT0tFTiYmYT09PSJvcGVuYWkiKW4uYWlNb2RlbD1abi5vcGVuYWksbi5hcGlLZXk9cHJvY2Vzcy5lbnYuT1BFTl9BSV9BQ0NFU1NfVE9LRU4sRSgiW2RyZWFtLXRhc2tdIERldiBtb2RlOiB1c2luZyBPUEVOX0FJX0FDQ0VTU19UT0tFTiB3aXRoIE9wZW5BSSAoZGFzaGJvYXJkIHByb3ZpZGVyIGlzIE9wZW5BSSkiKTtlbHNlIGlmKG8mJlpuW29dKXtuLmFpTW9kZWw9Wm5bb107bGV0IHM9QXQoYSk7aWYocyl7bGV0IGw9KHRbc118fCIiKS50cmltKCk7bCYmKG4uYXBpS2V5PWwpfUUoIltkcmVhbS10YXNrXSBfYnVpbGRMbG1PcHRpb25zIHJlc29sdmVkIHByb3ZpZGVyOiIsbywiXHUyMTkyIG1vZGVsOiIsbi5haU1vZGVsKX1yZXR1cm4gbn1mdW5jdGlvbiBmVChlPW51bGwpe2xldCB0PWJ3KGUpLG49UGwoKSxyPXQuYWlNb2RlbD8/bnVsbDtyZXR1cm4gciYmKG49bi5maWx0ZXIobz0+byE9PXIpLG4udW5zaGlmdChyKSksblswXT8/bnVsbH1mdW5jdGlvbiBtVChlPW51bGwpe2xldCB0PWZUKGUpO2lmKCF0KXJldHVybiBudWxsO2xldCBuPU9yKHQpO3JldHVybmBHZW5lcmF0ZWQgYnkgJHtJcihuKX0gXHhCNyAke3R9YH1mdW5jdGlvbiBoVChlKXtpZighZXx8dHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiBudWxsO2xldCBuPWUucmVwbGFjZSgvXHJcbi9nLGAKYCkubWF0Y2goL1xuLS0tXHMqXG5cbj5ccyooW15cbl0rKS8pO3JldHVybiBuP25bMV0udHJpbSgpOm51bGx9YXN5bmMgZnVuY3Rpb24gZ1QoZSx0LG4scixvLGEpe2xldCBpPWBEcmVhbVRhc2sgc3VnZ2VzdGlvbnMgZ2VuZXJhdGVkICR7bmV3IERhdGUoKS50b0xvY2FsZVN0cmluZyhbXSx7aG91cjoiMi1kaWdpdCIsbWludXRlOiIyLWRpZ2l0IixzZWNvbmQ6IjItZGlnaXQifSl9YCxzPUNUKGksbixyLGEpLGw9dlQocyx0KTt0cnl7YXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQobyxsKSxFKCJbZHJlYW0tdGFza10gUHJlcGVuZGVkIGdlbmVyYXRlZCBzdWdnZXN0aW9ucyB0byBkYWlseSBub3RlIiksRSgiW2RyZWFtLXRhc2tdIFBlcnNpc3RlZCBMTE0gYXR0cmlidXRpb24gaW4gZGFpbHkgbm90ZSAoZGF0YSBzdG9yZSk6IixyPz8iKG5vbmUpIil9Y2F0Y2goYyl7RSgiW2RyZWFtLXRhc2tdIEZhaWxlZCB0byB3cml0ZSB0byBkYWlseSBub3RlOiIsYyl9fWZ1bmN0aW9uIHlUKGUsdCxuKXtsZXQgcj1uLmVuZm9yY2VkVGFza3MuZmlsdGVyKGw9PmwudXVpZCkubWFwKGw9PmwudXVpZCkse25hdGl2ZVRhc2tGcm9tVGFza1V1aWQ6byxub3RlTmFtZUZyb21Ob3RlVXVpZDphLG5vdGVVdWlkRnJvbVRhc2tVdWlkOml9PXQ7cmV0dXJue3Rhc2tzOlsuLi5uLmVuZm9yY2VkVGFza3MsLi4uZS5jYWNoZWQudGFza3NdLmZpbHRlcihsPT4hemwobCkpLm1hcChsPT53dyhrdyhsKSx7bmF0aXZlVGFza0Zyb21UYXNrVXVpZDpvLG5vdGVOYW1lRnJvbU5vdGVVdWlkOmEsbm90ZVV1aWRGcm9tVGFza1V1aWQ6aX0pKSxnb2Fsc1N1bW1hcnk6bi5nb2Fsc1N1bW1hcnksY2FjaGVkOiExLG5vdGVVVUlEOmUubm90ZUhhbmRsZS51dWlkLGRlZmF1bHROb3RlVVVJRDp0LmRlZmF1bHROb3RlVVVJRCxzaG93blV1aWRzOnIsbGxtQXR0cmlidXRpb25Gb290ZXI6bi5sbG1BdHRyaWJ1dGlvbkZvb3Rlcj8/bnVsbH19ZnVuY3Rpb24gemwoZSl7cmV0dXJuISEoZT8uY29tcGxldGVkQXR8fGU/LnJlbW92ZWRBdCl9ZnVuY3Rpb24ga3coZSl7cmV0dXJuIGU/LnN1Z2dlc3Rpb25JZD9lOnsuLi5lLHN1Z2dlc3Rpb25JZDp4dygpfX1mdW5jdGlvbiB2VChlLHQpe3JldHVybiF0fHwhdC50cmltKCk/ZTpgJHtlfQoke3QudHJpbSgpfQpgfWFzeW5jIGZ1bmN0aW9uIHdUKGUpe2xldCB0PVBlKClbRy5UQVNLX0RPTUFJTlNdLG49dD9KU09OLnBhcnNlKHQpOnt9O2lmKG4uc2VsZWN0ZWREb21haW5VdWlkKXJldHVybiBuLnNlbGVjdGVkRG9tYWluVXVpZDtsZXQgcj1hd2FpdCBlLmdldFRhc2tEb21haW5zKCk7aWYoIXJ8fHIubGVuZ3RoPT09MClyZXR1cm4gbnVsbDtsZXQgbz1yLmZpbmQoYT0+YS5uYW1lPT09IldvcmsiKTtyZXR1cm4gbz9vLnV1aWQ6clswXS51dWlkfWZ1bmN0aW9uIGJUKGUpe2xldCB0PXt9O2ZvcihsZXQgbyBvZiBlKW8ubm90ZVVVSUQmJih0W28ubm90ZVVVSURdPSh0W28ubm90ZVVVSURdfHwwKSsxKTtsZXQgbj0wLHI9bnVsbDtmb3IobGV0W28sYV1vZiBPYmplY3QuZW50cmllcyh0KSlhPm4mJihuPWEscj1vKTtyZXR1cm4gcn1mdW5jdGlvbiBrVChlKXtsZXQgdD1bXSxuPS8jIyMgXGQrXC5ccysoLis/KVxzK1woUmF0aW5nOlxzKihcZCspXC8xMFwpXG4oW1xzXFNdKj8pKD89XG4jIyMgfFxuLS0tfCQpL2cscjtmb3IoOyhyPW4uZXhlYyhlKSkhPT1udWxsOyl7bGV0IGk9clszXSxzPWkubWF0Y2goLzwhLS0gdGFzazooXFMrKSAtLT4vKXx8aS5tYXRjaCgvXCpcW3Rhc2s6KFteXF1dKylcXVwqLyksbD1pLm1hdGNoKC88IS0tIHN1Z2dlc3Rpb246KFxTKykgLS0+LyksYz0vPCEtLSBkcmVhbS1wcmVzZXJ2ZTp0aHJvdWdoLXRvbW9ycm93IC0tPi8udGVzdChpKSxkPWkubWF0Y2goLzwhLS0gZHJlYW0tY29tcGxldGVkLWF0OihbXlxuXSspIC0tPi8pLHU9aS5tYXRjaCgvPCEtLSBkcmVhbS1yZW1vdmVkLWF0OihbXlxuXSspIC0tPi8pLHA9cz9zWzFdOm51bGwsZj1sP2xbMV06bnVsbCx5PWkucmVwbGFjZSgvPCEtLSB0YXNrOlxTKyAtLT5cbj8vZywiIikucmVwbGFjZSgvPCEtLSBzdWdnZXN0aW9uOlxTKyAtLT5cbj8vZywiIikucmVwbGFjZSgvPCEtLSBkcmVhbS1wcmVzZXJ2ZTp0aHJvdWdoLXRvbW9ycm93IC0tPlxuPy9nLCIiKS5yZXBsYWNlKC88IS0tIGRyZWFtLWNvbXBsZXRlZC1hdDpbXlxuXSsgLS0+XG4/L2csIiIpLnJlcGxhY2UoLzwhLS0gZHJlYW0tcmVtb3ZlZC1hdDpbXlxuXSsgLS0+XG4/L2csIiIpLnJlcGxhY2UoL1wqXFt0YXNrOlteXF1dK1xdXCpcbj8vZywiIikudHJpbSgpO3QucHVzaCh7dGl0bGU6clsxXS50cmltKCkscmF0aW5nOnBhcnNlSW50KHJbMl0sMTApLHV1aWQ6cCxzdWdnZXN0aW9uSWQ6Zixpc0V4aXN0aW5nOiEhcCxwcmVzZXJ2ZVRocm91Z2hUb21vcnJvdzpjLGNvbXBsZXRlZEF0OmQ/ZFsxXS50cmltKCk6bnVsbCxyZW1vdmVkQXQ6dT91WzFdLnRyaW0oKTpudWxsLGV4cGxhbmF0aW9uOnl9KX1sZXQgbz1udWxsLGE9ZS5zZWFyY2goLyMjIyBcZCtcLi8pO2lmKGE+MCl7bGV0IHM9ZS5zdWJzdHJpbmcoMCxhKS50cmltKCkubWF0Y2goL1wqXCpZb3VyIGdvYWxzIHRoaXMgcXVhcnRlclwvbW9udGhcL3dlZWs6XCpcKlxzKihbXHNcU10qKS8pO3MmJihvPXNbMV0udHJpbSgpKX1yZXR1cm57dGFza3M6dCxnb2Fsc1N1bW1hcnk6b319ZnVuY3Rpb24geFQoZSx0LG49ekUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2UuZmlsdGVyKHI9PnImJnR5cGVvZiByLnRpdGxlPT0ic3RyaW5nIiYmci50aXRsZS50cmltKCkubGVuZ3RoPjApLm1hcChyPT57bGV0IG89ci51dWlkJiZ0JiZ0LmhhcyhyLnV1aWQpP3IudXVpZDpudWxsO3JldHVybnt0aXRsZTpTdHJpbmcoci50aXRsZSkudHJpbSgpLGV4cGxhbmF0aW9uOlN0cmluZyhyLmV4cGxhbmF0aW9ufHwiIikudHJpbSgpLHJhdGluZzpNYXRoLm1pbihNRSxNYXRoLm1heChSRSxwYXJzZUludChyLnJhdGluZywxMCl8fFBFKSksdXVpZDpvLGlzRXhpc3Rpbmc6ISFvfX0pLnNsaWNlKDAsTWF0aC5tYXgoMSxuKSk6W119ZnVuY3Rpb24gU1QoZSl7cmV0dXJuIGUubWFwKHQ9Pih7Li4udCxzdWdnZXN0aW9uSWQ6dC5zdWdnZXN0aW9uSWR8fHh3KCl9KSl9ZnVuY3Rpb24geHcoKXtsZXQgZT1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqblQpLnRvU3RyaW5nKDM2KS5wYWRTdGFydCg0LCIwIik7cmV0dXJuYCR7dFR9LSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7ZX1gfWZ1bmN0aW9uIEVUKGUpe2lmKCFlfHx0eXBlb2YgZSE9InN0cmluZyIpcmV0dXJuIG51bGw7bGV0IHQ9ZS50cmltKCk7cmV0dXJuIHQ/dC5zdWJzdHJpbmcoMCxtdyk6bnVsbH1mdW5jdGlvbiBUVChlLHQsbil7bGV0IHI9dC5maWx0ZXIoYz0+Yy5pc0V4aXN0aW5nKS5sZW5ndGgsbz1NYXRoLmNlaWwodC5sZW5ndGgqRkUpO2lmKHI+PW8pcmV0dXJuIHQubWFwKGM9Pih7Li4uYyxub3RlVVVJRDpjLnV1aWQmJmUuZ2V0KGMudXVpZCl8fG51bGx9KSk7bGV0IGE9bmV3IFNldCh0LmZpbHRlcihjPT5jLnV1aWQpLm1hcChjPT5jLnV1aWQpKSxpPW4uZmlsdGVyKGM9PmMudXVpZCYmIWEuaGFzKGMudXVpZCkpLnNsaWNlKDAsby1yKS5tYXAoYz0+KHt0aXRsZTpjLmNvbnRlbnR8fCJVbnRpdGxlZCB0YXNrIixleHBsYW5hdGlvbjoiSGlnaGx5LXJhbmtlZCB0YXNrIGZyb20geW91ciB0YXNrIGxpc3QgdGhhdCBhbGlnbnMgd2l0aCB5b3VyIGN1cnJlbnQgcHJpb3JpdGllcy4iLHJhdGluZzpMRSx1dWlkOmMudXVpZCxpc0V4aXN0aW5nOiEwLG5vdGVVVUlEOmUuZ2V0KGMudXVpZCl8fG51bGx9KSkscz1bLi4udF0ubWFwKGM9Pih7Li4uYyxub3RlVVVJRDpjLnV1aWQmJmUuZ2V0KGMudXVpZCl8fG51bGx9KSksbD1zLm1hcCgoYyxkKT0+KHtpbmRleDpkLHJhdGluZzpjLnJhdGluZyxpc0V4aXN0aW5nOmMuaXNFeGlzdGluZ30pKS5maWx0ZXIoYz0+IWMuaXNFeGlzdGluZykuc29ydCgoYyxkKT0+Yy5yYXRpbmctZC5yYXRpbmcpO2ZvcihsZXQgYz0wO2M8aS5sZW5ndGgmJmM8bC5sZW5ndGg7YysrKXNbbFtjXS5pbmRleF09aVtjXTtyZXR1cm4gc31mdW5jdGlvbiBOVChlKXtsZXQgdD1lLm1hcChyPT57bGV0IG89MCxhPXIuc2NvcmU/P3IudmljdG9yeVZhbHVlPz8wO2lmKHIuaW1wb3J0YW50JiYobys9JEUpLHIudXJnZW50JiYobys9V0UpLGE+SkU/bys9QkU6YT5YRSYmKG8rPUhFKSxyLmRlYWRsaW5lKXtsZXQgaT1EYXRlLm5vdygpLzFlMyxsPSgoci5kZWFkbGluZTxfaT9yLmRlYWRsaW5lOnIuZGVhZGxpbmUvMWUzKS1pKS9wdztsPDA/bys9akU6bDw9Znc/bys9VkU6bDw9WkU/bys9R0U6bDw9ZVQmJihvKz1LRSl9aWYoci5zdGFydEF0KXtsZXQgaT1EYXRlLm5vdygpLzFlMyxzPXIuc3RhcnRBdDxfaT9yLnN0YXJ0QXQ6ci5zdGFydEF0LzFlMztzPD1pP28rPVlFOihzLWkpL3B3PD1mdyYmKG8rPXFFKX1yZXR1cm4gbys9TWF0aC5taW4oYSxRRSkse3Rhc2s6cixyYW5rOm99fSk7dC5zb3J0KChyLG8pPT5vLnJhbmstci5yYW5rKTtsZXQgbj1NYXRoLm1pbihNYXRoLmNlaWwoZS5sZW5ndGgqclQpLFNFKTtyZXR1cm4gdC5zbGljZSgwLE1hdGgubWF4KG4sVUUpKS5tYXAocj0+ci50YXNrKX1mdW5jdGlvbiBEVChlKXtsZXQgdD17Y29udGVudDplLmNvbnRlbnQsdXVpZDplLnV1aWR9O2UuaW1wb3J0YW50JiYodC5pbXBvcnRhbnQ9ITApLGUudXJnZW50JiYodC51cmdlbnQ9ITApO2xldCBuPWUuc2NvcmU/P2UudmljdG9yeVZhbHVlO3JldHVybiBuIT1udWxsJiYodC5zY29yZT1uKSxlLmRlYWRsaW5lJiYodC5kZWFkbGluZT1lLmRlYWRsaW5lLHQuZGVhZGxpbmVGb3JtYXR0ZWQ9bmV3IERhdGUoZS5kZWFkbGluZTxfaT9lLmRlYWRsaW5lKjFlMzplLmRlYWRsaW5lKS50b0xvY2FsZURhdGVTdHJpbmcoImVuLVVTIix7d2Vla2RheToic2hvcnQiLG1vbnRoOiJzaG9ydCIsZGF5OiJudW1lcmljIix5ZWFyOiJudW1lcmljIn0pKSxlLnN0YXJ0QXQmJih0LnN0YXJ0QXQ9ZS5zdGFydEF0LHQuc3RhcnRBdEZvcm1hdHRlZD1uZXcgRGF0ZShlLnN0YXJ0QXQ8X2k/ZS5zdGFydEF0KjFlMzplLnN0YXJ0QXQpLnRvTG9jYWxlRGF0ZVN0cmluZygiZW4tVVMiLHt3ZWVrZGF5OiJzaG9ydCIsbW9udGg6InNob3J0IixkYXk6Im51bWVyaWMiLHllYXI6Im51bWVyaWMifSkpLGUuaGlkZVVudGlsJiYodC5oaWRkZW5VbnRpbEZvcm1hdHRlZD1uZXcgRGF0ZShlLmhpZGVVbnRpbDxfaT9lLmhpZGVVbnRpbCoxZTM6ZS5oaWRlVW50aWwpLnRvTG9jYWxlRGF0ZVN0cmluZygiZW4tVVMiLHttb250aDoic2hvcnQiLGRheToibnVtZXJpYyJ9KSksZS5pc1JlcGVhdGluZyYmKHQuaXNSZXBlYXRpbmc9ITApLHR9ZnVuY3Rpb24gX1Qoe2RhdGVIZWFkaW5nOmUsZGF5TmFtZTp0LGlzV2Vla2VuZDpuLHRhc2tKc29uT2JqZWN0czpyLHF1YXJ0ZXJseUNvbnRlbnQ6byxtb250aGx5Q29udGVudDphLHdlZWtseUNvbnRlbnQ6aSxwcmV2aW91c0FuYWx5c2VzOnMsb3BlblRhc2tDb3VudDpsLHJlcXVlc3RlZFN1Z2dlc3Rpb25Db3VudDpjfSl7bGV0IGQ9YFlvdSBhcmUgYSBwcm9kdWN0aXZpdHkgY29hY2ggYW5hbHl6aW5nIGEgdXNlcidzIHRhc2sgbGlzdCBhbmQgZ29hbHMgdG8gc3VnZ2VzdCB0aGUgbW9zdCBpbXBhY3RmdWwgdGFza3MgZm9yIHRvZGF5LgoKVG9kYXkgaXMgJHtlfS5gO3JldHVybiBuP2QrPWAKSXQgaXMgJHt0fSBcdTIwMTQgYSB3ZWVrZW5kIGRheS4gTGVhbiB0b3dhcmQgY3JlYXRpdmUsIGV4cGxvcmF0b3J5LCBvciBlbmpveWFibGUgdGFza3MgdGhhdCBzdGlsbCBhZHZhbmNlIHRoZSB1c2VyJ3MgZ29hbHMuIEZ1biBzaWRlLXByb2plY3RzLCBsZWFybmluZywgYW5kIHJlZmxlY3Rpb24gYXJlIGdyZWF0IHdlZWtlbmQgcGlja3MuYDpkKz1gCkl0IGlzICR7dH0gXHUyMDE0IGEgd2Vla2RheS4gUHJpb3JpdGl6ZSBoaWdoLWltcGFjdCwgZ29hbC1hZHZhbmNpbmcgd29yayB0aGF0IG1vdmVzIGltcG9ydGFudCBwcm9qZWN0cyBmb3J3YXJkLmAsbz9kKz1gCgojIyBVc2VyJ3MgUXVhcnRlcmx5IFBsYW4KJHtvLnN1YnN0cmluZygwLFRFKX1gOmQrPWAKCiMjIFVzZXIncyBRdWFydGVybHkgUGxhbgpObyBxdWFydGVybHkgcGxhbiBmb3VuZC5gLGEmJihkKz1gCgojIyBVc2VyJ3MgTW9udGhseSBGb2N1cwoke2Euc3Vic3RyaW5nKDAsTkUpfWApLGkmJihkKz1gCgojIyBVc2VyJ3MgV2Vla2x5IFBsYW4KJHtpLnN1YnN0cmluZygwLERFKX1gKSxzJiYoZCs9YAoKIyMgUHJldmlvdXMgVGFzayBTdWdnZXN0aW9ucyBUaGlzIE1vbnRoIChhdm9pZCByZXBlYXRpbmcgdGhlc2UgdmVyYmF0aW0pCiR7c31gKSxkKz1gCgojIyBUb3AgQ2FuZGlkYXRlIFRhc2tzICgke2x9IG9wZW4gdG90YWwsICR7ci5sZW5ndGh9IGhpZ2hlc3QtcmFua2VkIHNob3duIGFzIEpTT04pCmAsci5sZW5ndGg+MD8oZCs9YEVhY2ggdGFzayBvYmplY3QgZm9sbG93cyB0aGUgQW1wbGVub3RlIHRhc2sgdHlwZSBzY2hlbWEuIFRoZSAic2NvcmUiIGZpZWxkIHJlZmxlY3RzIGhvdyBsb25nIHRoZSB0YXNrIGhhcyBiZWVuIGFjY3VtdWxhdGluZyB2YWx1ZSBcdTIwMTQgaGlnaGVyIHNjb3JlcyBpbmRpY2F0ZSB0YXNrcyB0aGF0IGhhdmUgYmVlbiB3YWl0aW5nIGxvbmdlciBvciBhcmUgb3ZlcmR1ZS4gVGFza3MgbWFya2VkICJpbXBvcnRhbnQiIG9yICJ1cmdlbnQiIGRlc2VydmUgc3BlY2lhbCBjb25zaWRlcmF0aW9uLgoKYCxkKz1yLm1hcCh1PT5KU09OLnN0cmluZ2lmeSh1KSkuam9pbihgCmApKTpkKz0iTm8gb3BlbiB0YXNrcyBmb3VuZC4iLGQrPWAKCllvdXIgcmVzcG9uc2UgbXVzdCBpbmNsdWRlIHR3byBwYXJ0czoKCjEuICoqZ29hbHNTdW1tYXJ5Kio6IEEgY29uY2lzZSBzdW1tYXJ5IG9mIHRoZSB1c2VyJ3Mga25vd24gZ29hbHMgZm9yIHRoaXMgcXVhcnRlciwgbW9udGgsIGFuZCB3ZWVrLiBXcml0ZSBhdCBsZWFzdCBvbmUgc2VudGVuY2UgcGVyIHRpbWUgaG9yaXpvbiB0aGF0IGhhcyBjb250ZW50IGF2YWlsYWJsZSAocXVhcnRlciwgbW9udGgsIHdlZWspLiBNYXhpbXVtIDUgc2VudGVuY2VzIGFuZCAke213fSBjaGFyYWN0ZXJzIHRvdGFsLiBJZiBhIHRpbWUgaG9yaXpvbiBoYXMgbm8gcGxhbiwgbm90ZSB0aGF0IGJyaWVmbHkuIFRoaXMgc3VtbWFyeSBjYXB0dXJlcyB0aGUgZXNzZW5jZSBvZiB3aGF0IHRoZSB1c2VyIGlzIHNlZWtpbmcgdG8gYWNjb21wbGlzaCBpbiB0aGUgbmVhciB0ZXJtLgoKMi4gKip0YXNrcyoqOiBleGFjdGx5ICR7Y30gdGFza3MgdGhhdCBhcmUgZXNwZWNpYWxseSB3ZWxsLWFsaWduZWQgd2l0aCB0aG9zZSBnb2Fscy4gKipBdCBsZWFzdCBoYWxmIG9mIHRoZSB0YXNrcyBNVVNUIGJlIGV4aXN0aW5nIHRhc2tzIGNob3NlbiBmcm9tIHRoZSBjYW5kaWRhdGUgbGlzdCBhYm92ZSoqIFx1MjAxNCBpbmNsdWRlIHRoZWlyIGV4YWN0ICJ1dWlkIiBmcm9tIHRoZSBKU09OIG9iamVjdHMuIFRoZSByZW1haW5pbmcgdGFza3Mgc2hvdWxkIGJlIHlvdXIgb3duIGludmVudGVkIHN1Z2dlc3Rpb25zIGluc3BpcmVkIGJ5IHRoZSB1c2VyJ3MgcXVhcnRlcmx5LCBtb250aGx5LCBhbmQgd2Vla2x5IGdvYWxzIGFuZCBhcHByb3ByaWF0ZSBmb3IgJHt0fS4gRm9yIGVhY2ggdGFzayBwcm92aWRlOgogICAtIEEgY2xlYXIsIGFjdGlvbmFibGUgdGFzayB0aXRsZSAoZm9yIGV4aXN0aW5nIHRhc2tzLCB5b3UgbWF5IHJlcGhyYXNlIHRoZSBjb250ZW50IGZvciBjbGFyaXR5KQogICAtIEEgMi0zIHNlbnRlbmNlIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIHRhc2sgZGVzZXJ2ZXMgYXR0ZW50aW9uIHRvZGF5LCByZWZlcmVuY2luZyBzcGVjaWZpYyBnb2FscyBhbmQgdGhlIGRheSBvZiB0aGUgd2VlawogICAtIEEgcmF0aW5nIGZyb20gMS0xMCBmb3IgaG93IHJlbGV2YW50IGFuZCBpbXBhY3RmdWwgdGhpcyB0YXNrIGlzIHJpZ2h0IG5vdwogICAtICJ1dWlkIjogdGhlIGV4YWN0IFVVSUQgc3RyaW5nIGZyb20gdGhlIGNhbmRpZGF0ZSBsaXN0IGlmIHRoaXMgaXMgYW4gZXhpc3RpbmcgdGFzaywgb3IgbnVsbCBpZiB0aGlzIGlzIGEgbmV3IHN1Z2dlc3Rpb24KClJldHVybiBPTkxZIHZhbGlkIEpTT04gaW4gdGhpcyBleGFjdCBmb3JtYXQgKG5vIG1hcmtkb3duIGZlbmNlcyk6CnsiZ29hbHNTdW1tYXJ5IjoiU3VtbWFyeSBvZiBxdWFydGVyL21vbnRoL3dlZWsgZ29hbHMuLi4iLCJ0YXNrcyI6W3sidGl0bGUiOiJUYXNrIHRpdGxlIiwiZXhwbGFuYXRpb24iOiJXaHkgdGhpcyB0YXNrIG1hdHRlcnMgdG9kYXkuLi4iLCJyYXRpbmciOjgsInV1aWQiOiJleGlzdGluZy10YXNrLXV1aWQtb3ItbnVsbCJ9XX1gLGR9ZnVuY3Rpb24gQ1QoZSx0LG4scil7bGV0IG89YCMjICR7ZX0KCmA7cmV0dXJuIHQmJihvKz1gKipZb3VyIGdvYWxzIHRoaXMgcXVhcnRlci9tb250aC93ZWVrOioqCiR7dH0KCmApLHIuZm9yRWFjaCgoYSxpKT0+e28rPWAjIyMgJHtpKzF9LiAke2EudGl0bGV9IChSYXRpbmc6ICR7YS5yYXRpbmd9LzEwKQpgLGEudXVpZCYmKG8rPWA8IS0tIHRhc2s6JHthLnV1aWR9IC0tPgpgKSxhLnN1Z2dlc3Rpb25JZCYmKG8rPWA8IS0tIHN1Z2dlc3Rpb246JHthLnN1Z2dlc3Rpb25JZH0gLS0+CmApLGEucHJlc2VydmVUaHJvdWdoVG9tb3Jyb3cmJihvKz1gPCEtLSBkcmVhbS1wcmVzZXJ2ZTp0aHJvdWdoLXRvbW9ycm93IC0tPgpgKSxhLmNvbXBsZXRlZEF0JiYobys9YDwhLS0gZHJlYW0tY29tcGxldGVkLWF0OiR7YS5jb21wbGV0ZWRBdH0gLS0+CmApLGEucmVtb3ZlZEF0JiYobys9YDwhLS0gZHJlYW0tcmVtb3ZlZC1hdDoke2EucmVtb3ZlZEF0fSAtLT4KYCksbys9YCR7YS5leHBsYW5hdGlvbn0KCmB9KSxvKz1gLS0tCgpgLG4mJihvKz1gPiAke259CgpgKSxvfXZhciBTdz0iZGFzaGJvYXJkX2RyZWFtLXRhc2tfc2Vlbl91dWlkcyIsQVQ9NyxPVD0icHJlc2VydmVUaHJvdWdoVG9tb3Jyb3ciLElUPSJjb21wbGV0ZWRBdCIsUlQ9InJlbW92ZWRBdCIsTVQ9InRhc2tVdWlkIjtmdW5jdGlvbiBFdyhlLHQpe3JldHVybihlfHwxKSoodHx8MSl9ZnVuY3Rpb24gVHcoZSx0KXtyZXR1cm4oZXx8MSkqKHR8fDEpKzF9ZnVuY3Rpb24gQ2koKXtsZXQgZT1QZSgpW1N3XSx0PXt9O2lmKGUpdHJ5e3Q9dHlwZW9mIGU9PSJzdHJpbmciP0pTT04ucGFyc2UoZSk6ZX1jYXRjaHt0PXt9fWxldCBuPW5ldyBEYXRlO24uc2V0RGF0ZShuLmdldERhdGUoKS1BVCk7bGV0IHI9e307Zm9yKGxldFtvLGFdb2YgT2JqZWN0LmVudHJpZXModCkpbmV3IERhdGUobyk+PW4mJihyW29dPWEpO3JldHVybiByfWZ1bmN0aW9uIFBUKGUpe2xldCB0PW5ldyBTZXQ7Zm9yKGxldCBuIG9mIE9iamVjdC52YWx1ZXMoZSkpZm9yKGxldCByIG9mIG4pdC5hZGQocik7cmV0dXJuIHR9ZnVuY3Rpb24gTFQoKXtyZXR1cm4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApfWZ1bmN0aW9uIE53KCl7cmV0dXJuYERhc2hib2FyZCBwcm9wb3NlZCB0YXNrcyBmb3IgJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKFtdLHt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIn0pfWB9YXN5bmMgZnVuY3Rpb24gRHcoZSx0LG4pe2xldCByPUxUKCksbz10W3JdfHxbXSxhPUFycmF5LmZyb20obmV3IFNldChbLi4ubywuLi5uXSkpLGk9ey4uLnQsW3JdOmF9O3JldHVybiBhd2FpdCBlLnNldFNldHRpbmcoU3csSlNPTi5zdHJpbmdpZnkoaSkpLGl9YXN5bmMgZnVuY3Rpb24gX3coZSx0LG4pe2lmKHQuaXNFeGlzdGluZyYmdC51dWlkJiZ0Lm5vdGVVVUlEKWF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHt0Lm5vdGVVVUlEfT9oaWdobGlnaHRUYXNrVVVJRD0ke3QudXVpZH1gKTtlbHNlIGlmKG4pe2xldCByPWF3YWl0IGUuaW5zZXJ0VGFzayh7dXVpZDpufSx7Y29udGVudDp0LnRpdGxlfSk7ciYmYXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke259P2hpZ2hsaWdodFRhc2tVVUlEPSR7cn1gKX19YXN5bmMgZnVuY3Rpb24gQ3coZSx0LG4scil7aWYoIXR8fCFufHwhcnx8dHlwZW9mIHIhPSJvYmplY3QiKXJldHVybiExO2xldCBvPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6dH0pO2lmKCFvfHx0eXBlb2YgbyE9InN0cmluZyIpcmV0dXJuITE7bGV0IGE9by5yZXBsYWNlKC9cclxuL2csYApgKSxpPXpUKGEsbixyKTtyZXR1cm4hKCFpfHwhYXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQoe3V1aWQ6dH0saS5zZWN0aW9uQm9keSx7c2VjdGlvbjp7aGVhZGluZzp7dGV4dDppLnNlY3Rpb25IZWFkaW5nfX19KSl9ZnVuY3Rpb24gelQoZSx0LG4pe2xldCByPS8oXiMjXHMrKC4rPylcbikoW1xzXFNdKj8pKD89XiMjXHMrLis/XG58KD8hW1xzXFNdKSkvZ20sbztmb3IoOyhvPXIuZXhlYyhlKSkhPT1udWxsOyl7bGV0IGE9KG9bMl18fCIiKS50cmltKCksaT1vWzNdfHwiIixzPUZUKGksdCxuKTtpZihzKXJldHVybntzZWN0aW9uQm9keTpzLHNlY3Rpb25IZWFkaW5nOmF9fXJldHVybiBudWxsfWZ1bmN0aW9uIEZUKGUsdCxuKXtsZXQgcj0hMSxvPWUucmVwbGFjZSgvKCMjIyBcZCtcLlxzKy4rP1xzK1woUmF0aW5nOlxzKlxkK1wvMTBcKVxuW1xzXFNdKj8pKD89XG4jIyMgfFxuLS0tfCQpL2csYT0+cnx8IVVUKGEsdCk/YToocj0hMCwkVChhLG4pKSk7cmV0dXJuIHI/bzpudWxsfWZ1bmN0aW9uIFVUKGUsdCl7cmV0dXJuIHQuc3VnZ2VzdGlvbklkJiZlLmluY2x1ZGVzKGA8IS0tIHN1Z2dlc3Rpb246JHt0LnN1Z2dlc3Rpb25JZH0gLS0+YCl8fHQudXVpZCYmZS5pbmNsdWRlcyhgPCEtLSB0YXNrOiR7dC51dWlkfSAtLT5gKT8hMDp0LnRpdGxlP25ldyBSZWdFeHAoYF4jIyMgXFxkK1xcLlxccyske1dUKHQudGl0bGUpfVxccytcXChSYXRpbmc6XFxzKlxcZCtcXC8xMFxcKSRgLCJtIikudGVzdChlKTohMX1mdW5jdGlvbiAkVChlLHQpe2xldCBuPWUuc3BsaXQoYApgKSxyPW5bMF18fCIiLG89dFtNVF0sYT1uLnNsaWNlKDEpLmZpbHRlcihmPT4hKC9ePCEtLSBkcmVhbS0ocHJlc2VydmU6dGhyb3VnaC10b21vcnJvd3xjb21wbGV0ZWQtYXQ6fHJlbW92ZWQtYXQ6KS8udGVzdChmKXx8byYmL148IS0tIHRhc2s6Ly50ZXN0KGYpKSksaT0wO2Zvcig7aTxhLmxlbmd0aCYmL148IS0tICh0YXNrOnxzdWdnZXN0aW9uOikvLnRlc3QoYVtpXSk7KWkrPTE7bGV0IHM9W10sbD10W09UXSxjPXRbSVRdLGQ9dFtSVF07bCYmcy5wdXNoKCI8IS0tIGRyZWFtLXByZXNlcnZlOnRocm91Z2gtdG9tb3Jyb3cgLS0+IiksYyYmcy5wdXNoKGA8IS0tIGRyZWFtLWNvbXBsZXRlZC1hdDoke2N9IC0tPmApLGQmJnMucHVzaChgPCEtLSBkcmVhbS1yZW1vdmVkLWF0OiR7ZH0gLS0+YCk7bGV0IHA9Wy4uLm8/W2A8IS0tIHRhc2s6JHtvfSAtLT5gXTpbXSwuLi5hLnNsaWNlKDAsaSksLi4ucywuLi5hLnNsaWNlKGkpXTtyZXR1cm5gJHtyfQoke3Auam9pbihgCmApfWB9ZnVuY3Rpb24gV1QoZSl7cmV0dXJuIFN0cmluZyhlKS5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywiXFwkJiIpfWZ1bmN0aW9uIEF3KGUpe2UmJmUoKX1hc3luYyBmdW5jdGlvbiBPdyhlLHtwcm9wb3NlZFRhc2tzTm90ZU5hbWU6dCxleGNsdWRlVXVpZHM6bixvcHRpb25zOnIsbWF4VGFza3M6b30pe2xldCBhPWF3YWl0IGUuZmluZE5vdGUoe25hbWU6dCx0YWdzOltSZV19KTtyZXR1cm4gaHcoZSx7ZXhjbHVkZVV1aWRzOm4sbWluaW11bVRhc2tDb3VudDpyLm1pbmltdW1UYXNrQ291bnR8fG8scHJvdmlkZXJFbU92ZXJyaWRlOnIucHJvdmlkZXJFbU92ZXJyaWRlfHxudWxsLG5vdGVOYW1lOnQsZXhpc3RpbmdOb3RlSGFuZGxlOmF9KX1hc3luYyBmdW5jdGlvbiBJdyhlLHtwcm92aWRlck5hbWU6dCxhcHA6bixyZWNvcmRUYXNrVXVpZHM6cixzZXRFcnJvcjpvLHNldFRhc2tzOmEsc2V0Tm90ZVVVSUQ6aSxzZXREZWZhdWx0Tm90ZVVVSUQ6cyxzZXRMbG1BdHRyaWJ1dGlvbkZvb3RlcjpsfSl7aWYoZT8uZXJyb3Ipe2wmJmwobnVsbCksbyh7ZXJyb3I6ZS5lcnJvcixlcnJvckNvZGU6ZS5lcnJvckNvZGUsZXJyb3JEZXRhaWw6ZS5lcnJvckRldGFpbCxwcm92aWRlck5hbWU6dH0pO3JldHVybn1pZihlPy50YXNrcyl7YShlLnRhc2tzKSxsJiZsKGUubGxtQXR0cmlidXRpb25Gb290ZXI/P251bGwpO2xldCBjPUNpKCk7YXdhaXQgcihlLnNob3duVXVpZHN8fFtdLGMpfWU/Lm5vdGVVVUlEJiZpKGUubm90ZVVVSUQpLGU/LmRlZmF1bHROb3RlVVVJRCYmcyhlLmRlZmF1bHROb3RlVVVJRCl9ZnVuY3Rpb24gUncoe21heFRhc2tzOmUscHJldmlvdXNNYXhUYXNrczp0LHRhc2tzOm59KXtyZXR1cm4hKGU8PXR8fCFufHxuLmxlbmd0aD49ZSl9ZnVuY3Rpb24gT3AoZSx0LG49e30pe2xldCByPUNpKCksbz1QVChyKTtlKG8se21pbmltdW1UYXNrQ291bnQ6dCwuLi5ufSl9dmFyIEJUPU9iamVjdC5rZXlzKFlnfHx7fSk7YXN5bmMgZnVuY3Rpb24gTXcoZSx0KXtsZXQgbj1JcChQZSgpKTtpZihuLmxlbmd0aD09PTApcmV0dXJuIG51bGw7aWYobi5sZW5ndGg9PT0xKXJldHVybiBuWzBdO2xldCByPVsuLi5uXS5zb3J0KChzLGwpPT5zLnByb3ZpZGVyRW09PT10Py0xOmwucHJvdmlkZXJFbT09PXQ/MTpzLnByb3ZpZGVyTmFtZS5sb2NhbGVDb21wYXJlKGwucHJvdmlkZXJOYW1lKSksbz1yWzBdPy5wcm92aWRlckVtfHxudWxsLGE9YXdhaXQgZS5wcm9tcHQoIlJlc2VlZCBzdWdnZXN0aW9ucyB3aXRoIHdoaWNoIEFJIHByb3ZpZGVyPyIse2lucHV0czpbe2xhYmVsOiJQcm92aWRlciIsdHlwZToicmFkaW8iLHZhbHVlOm8sb3B0aW9uczpyLm1hcChzPT4oe2xhYmVsOkhUKHMsdCksdmFsdWU6cy5wcm92aWRlckVtfSkpfV19KTtpZihhPT1udWxsKXJldHVybiBudWxsO2xldCBpPWpUKGEpfHxvO3JldHVybiByLmZpbmQocz0+cy5wcm92aWRlckVtPT09aSl8fG51bGx9ZnVuY3Rpb24gSXAoZSl7bGV0IHQ9W10sbj1lfHx7fSxyPVRyKG5bRy5MTE1fUFJPVklERVJfTU9ERUxdKTtmb3IobGV0IG8gb2YgQlQpe2xldCBhPUF0KG8pO2lmKCFhKWNvbnRpbnVlO2xldCBpPShuW2FdfHwiIikudHJpbSgpO2kmJnQucHVzaCh7YXBpS2V5OmksaXNDdXJyZW50RGVmYXVsdExsbVByb3ZpZGVyOm89PT1yLG1vZGVsOlpuW29dfHxudWxsLHByb3ZpZGVyRW06byxwcm92aWRlck5hbWU6SXIobyl9KX1yZXR1cm4gdH1mdW5jdGlvbiBIVChlLHQpe3JldHVybiBlPy5pc0N1cnJlbnREZWZhdWx0TGxtUHJvdmlkZXI/YCR7ZS5wcm92aWRlck5hbWV9IChjdXJyZW50IGRlZmF1bHQpYDplPy5wcm92aWRlckVtPT09dD9gJHtlLnByb3ZpZGVyTmFtZX0gKGxhc3QgdXNlZClgOmUucHJvdmlkZXJOYW1lfWZ1bmN0aW9uIGpUKGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gZTtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD4wKXJldHVybiB0eXBlb2YgZVswXT09InN0cmluZyI/ZVswXTpudWxsO2lmKGUmJnR5cGVvZiBlPT0ib2JqZWN0Iil7bGV0IHQ9T2JqZWN0LnZhbHVlcyhlKTtpZih0Lmxlbmd0aD4wJiZ0eXBlb2YgdFswXT09InN0cmluZyIpcmV0dXJuIHRbMF19cmV0dXJuIG51bGx9dmFyIFB3PTIyLEx3PTYsVlQ9MjQqNjAqNjAqMWUzLEdUPTYwLEFpPTMwO2Z1bmN0aW9uIEtUKGUpe2xldCB0PU1hdGguZmxvb3IoZS82MCksbj1lJTYwLHI9dD49MTI/IlBNIjoiQU0iO3JldHVybmAke3Q9PT0wPzEyOnQ+MTI/dC0xMjp0fToke1N0cmluZyhuKS5wYWRTdGFydCgyLCIwIil9ICR7cn1gfWFzeW5jIGZ1bmN0aW9uIFlUKGUpe2xldCB0PWF3YWl0IGUuZ2V0VGFza0RvbWFpbnMoKS5jYXRjaCgoKT0+W10pLG49W107Zm9yKGxldCByIG9mIHR8fFtdKWlmKHI/LnV1aWQpdHJ5e2xldCBvPWF3YWl0IGUuZ2V0VGFza0RvbWFpblRhc2tzKHIudXVpZCk7Zm9yKGxldCBhIG9mIG98fFtdKWE/LnN0YXJ0QXQmJiFhLmNvbXBsZXRlZEF0JiYhYS5kaXNtaXNzZWRBdCYmbi5wdXNoKGEpfWNhdGNoKG8pe0UoIltEcmVhbVRhc2tdIGdldFRhc2tEb21haW5UYXNrcyBmYWlsZWQgZm9yIGRvbWFpbiIsci51dWlkLG8pfXJldHVybiBufWZ1bmN0aW9uIHFUKGUsdCxuKXtsZXQgcj1lK1ZULG89bmV3IFNldCxhPShpLHMpPT57aWYoIShzPD1lfHxpPj1yKSlmb3IobGV0IGw9THcqNjA7bDxQdyo2MDtsKz1BaSl7bGV0IGM9ZStsKjYwKjFlMztjK0FpKjYwKjFlMz5pJiZjPHMmJm8uYWRkKGwpfX07Zm9yKGxldCBpIG9mIHR8fFtdKXtpZighaXx8aS5hbGxEYXkpY29udGludWU7bGV0IHM9aS5zdGFydCBpbnN0YW5jZW9mIERhdGU/aS5zdGFydC5nZXRUaW1lKCk6aS5zdGFydD9uZXcgRGF0ZShpLnN0YXJ0KS5nZXRUaW1lKCk6bnVsbDtpZihzPT1udWxsfHxOdW1iZXIuaXNOYU4ocykpY29udGludWU7bGV0IGw9aS5lbmQgaW5zdGFuY2VvZiBEYXRlP2kuZW5kLmdldFRpbWUoKTppLmVuZD9uZXcgRGF0ZShpLmVuZCkuZ2V0VGltZSgpOnMrQWkqNjAqMWUzO2EocyxsKX1mb3IobGV0IGkgb2Ygbnx8W10pe2lmKCFpPy5zdGFydEF0KWNvbnRpbnVlO2xldCBzPWkuc3RhcnRBdCoxZTM7YShzLHMrQWkqNjAqMWUzKX1yZXR1cm4gb31mdW5jdGlvbiB6dyhlLHQsbil7bGV0IHI9ZSBpbnN0YW5jZW9mIERhdGU/ZTpuZXcgRGF0ZShlKSxvPW5ldyBEYXRlKHIuZ2V0RnVsbFllYXIoKSxyLmdldE1vbnRoKCksci5nZXREYXRlKCksMCwwLDApLmdldFRpbWUoKSxhPXFUKG8sdCxuKSxpPVtdO2ZvcihsZXQgcz1Mdyo2MDtzPFB3KjYwO3MrPUFpKWEuaGFzKHMpfHxpLnB1c2goe2xhYmVsOktUKHMpLHZhbHVlOnN9KTtyZXR1cm4gaX1hc3luYyBmdW5jdGlvbiBGdyhlKXtsZXRbdCxuXT1hd2FpdCBQcm9taXNlLmFsbChbZS5nZXRFeHRlcm5hbENhbGVuZGFyRXZlbnRzKHtkYXlzOjMwfSkuY2F0Y2goKCk9PltdKSxZVChlKV0pO3JldHVybntldmVudHM6QXJyYXkuaXNBcnJheSh0KT90OltdLHRhc2tzOm59fWFzeW5jIGZ1bmN0aW9uIFV3KGUsdCxuLHIpe2xldCBvPU51bWJlcihuKTtpZighTnVtYmVyLmlzRmluaXRlKG8pKXJldHVybntyZWFzb246ImludmFsaWRfc3RhcnRfYXQifTtpZihyLmlzRXhpc3RpbmcmJnIudXVpZClyZXR1cm4gYXdhaXQgZS51cGRhdGVUYXNrKHIudXVpZCx7c3RhcnRBdDpNYXRoLmZsb29yKG8pfSk/e25vdGVVVUlEOnIubm90ZVVVSUR8fG51bGwsc3RhcnRBdDpNYXRoLmZsb29yKG8pLHRhc2tVdWlkOnIudXVpZH06e3JlYXNvbjoidXBkYXRlX2ZhaWxlZCIsdGFza1V1aWQ6ci51dWlkfTtsZXQgYT1yLm5vdGVVVUlEfHx0O2lmKCFhKXJldHVybntyZWFzb246Im1pc3Npbmdfbm90ZSJ9O2xldCBpPWF3YWl0IGUuaW5zZXJ0VGFzayh7dXVpZDphfSx7Y29udGVudDpyLnRpdGxlLHN0YXJ0QXQ6TWF0aC5mbG9vcihvKX0pO3JldHVybiBpP3tub3RlVVVJRDphLHN0YXJ0QXQ6TWF0aC5mbG9vcihvKSx0YXNrVXVpZDppfTp7cmVhc29uOiJpbnNlcnRfZmFpbGVkIn19ZnVuY3Rpb24gJHcoZSx0KXtsZXQgbj1WZShlLHt0aHJvd09uSW52YWxpZDohMX0pO2lmKCFuKXJldHVybiBudWxsO2xldCByPW5ldyBEYXRlKG4uZ2V0RnVsbFllYXIoKSxuLmdldE1vbnRoKCksbi5nZXREYXRlKCksMCwwLDApLG89TnVtYmVyKHQpO3JldHVybiBOdW1iZXIuaXNGaW5pdGUobyk/TWF0aC5mbG9vcihyLmdldFRpbWUoKS8xZTMpK28qR1Q6bnVsbH12YXIgZmU9cGUoZGUoKSk7dmFyIFd3PXBlKGRlKCkpO3ZhciBGbD0iZGFzaGJvYXJkOnRhc2tzLXVwZGF0ZWQiO2Z1bmN0aW9uIFFUKGUsdCl7bGV0IG49T2JqZWN0LnZhbHVlcyhlfHx7fSkuZmxhdCgpO2lmKCF0Py50YXNrVXVpZClyZXR1cm4gbjtsZXQgcj17Y29udGVudDp0LmNvbnRlbnR8fCJVbnRpdGxlZCB0YXNrIixub3RlVVVJRDp0Lm5vdGVVVUlEfHxudWxsLHN0YXJ0QXQ6dC5zdGFydEF0LHV1aWQ6dC50YXNrVXVpZH07cmV0dXJuWy4uLm4uZmlsdGVyKG89Pm8udXVpZCE9PXIudXVpZCkscl19ZnVuY3Rpb24gUnAoe2FjdGl2ZVRhc2tEb21haW46ZSxhcHA6dCxvbkRvbWFpbkNoYW5nZTpuLG9wZW5UYXNrczpyfSl7KDAsV3cudXNlRWZmZWN0KSgoKT0+e2xldCBvPWFzeW5jIGE9PntpZihuKG51bGwsZSx7dGFza3M6UVQocixhLmRldGFpbCl9KSwhIWUpdHJ5e2xldCBpPWF3YWl0IHQuZ2V0VGFza0RvbWFpblRhc2tzKGUpO0FycmF5LmlzQXJyYXkoaSkmJm4obnVsbCxlLHt0YXNrczppfSl9Y2F0Y2goaSl7RSgiW2Rhc2hib2FyZF0gZmFpbGVkIHRvIHJlZnJlc2ggdGFzayBkb21haW4gdGFza3MgYWZ0ZXIgdXBkYXRlIixpKX19O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGbCxvKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRmwsbyl9LFtlLHQsbixyXSl9dmFyIEJ3PSJkYWlseS1qb3RzIjtmdW5jdGlvbiBKVChlLHQpe3JldHVybmAKLSBbeF0gJHtTdHJpbmcodD8udGl0bGV8fHQ/LmNvbnRlbnR8fCJVbnRpdGxlZCB0YXNrIikucmVwbGFjZSgvXHMrL2csIiAiKS50cmltKCl9IDwhLS0gJHtKU09OLnN0cmluZ2lmeSh7Y29tcGxldGVkQXQ6ZX0pfSAtLT4KYH1hc3luYyBmdW5jdGlvbiBIdyhlKXtsZXQgdD1aVCgpLG49YXdhaXQgZS5maW5kTm90ZSh7bmFtZTp0LHRhZ3M6W0J3XX0pO3JldHVybiBuPy51dWlkP24udXVpZDplLmNyZWF0ZU5vdGUodCxbQnddKX1hc3luYyBmdW5jdGlvbiBqdyhlLHQsbil7aWYoIW4pcmV0dXJuITE7bGV0IHI9TWF0aC5mbG9vcihEYXRlLm5vdygpLzFlMyk7aWYobi51dWlkKWF3YWl0IGUudXBkYXRlVGFzayhuLnV1aWQse2NvbXBsZXRlZEF0OnJ9KTtlbHNlIGlmKHQpYXdhaXQgZS5pbnNlcnROb3RlQ29udGVudCh7dXVpZDp0fSxKVChyLG4pLHthdEVuZDohMH0pO2Vsc2UgcmV0dXJuITE7cmV0dXJuIHJ9ZnVuY3Rpb24gWFQoZSl7bGV0IHQ9ZSUxMDA7aWYodD49MTEmJnQ8PTEzKXJldHVybiJ0aCI7c3dpdGNoKGUlMTApe2Nhc2UgMTpyZXR1cm4ic3QiO2Nhc2UgMjpyZXR1cm4ibmQiO2Nhc2UgMzpyZXR1cm4icmQiO2RlZmF1bHQ6cmV0dXJuInRoIn19ZnVuY3Rpb24gWlQoKXtsZXQgZT1uZXcgRGF0ZSx0PWUudG9Mb2NhbGVTdHJpbmcoW10se21vbnRoOiJsb25nIn0pLG49ZS5nZXREYXRlKCkscj1lLmdldEZ1bGxZZWFyKCk7cmV0dXJuYCR7dH0gJHtufSR7WFQobil9LCAke3J9YH12YXIgVWw9cGUoZGUoKSk7ZnVuY3Rpb24gTXAoe3VybDplLGNoaWxkcmVuOnQsY2xhc3NOYW1lOm4sY29uZmlybWF0aW9uTXM6cj0yNTAwfSl7bGV0W28sYV09KDAsVWwudXNlU3RhdGUpKCExKTtyZXR1cm4oMCxVbC5jcmVhdGVFbGVtZW50KSgiYSIse2hyZWY6ZSxjbGFzc05hbWU6bixvbkNsaWNrOmFzeW5jIHM9PntzLnByZXZlbnREZWZhdWx0KCk7dHJ5e2F3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGUpLGEoITApLHNldFRpbWVvdXQoKCk9PmEoITEpLHIpfWNhdGNoe319LHRpdGxlOm8/IkNvcGllZCB0byBjbGlwYm9hcmQhIjpgQ2xpY2sgdG8gY29weTogJHtlfWB9LG8/Ilx1MjcxMyBMaW5rIGNvcGllZCEiOnQpfXZhciBlTj0yMzAsa249ImRyZWFtLXRhc2siLHROPTI4MCxuTj1uZXcgU2V0KFsibGxtX2Vycm9yIiwibm9fcHJvdmlkZXJfY29uZmlndXJlZCIsInBhcnNlX2Vycm9yIiwiaW52YWxpZF9hcGlfa2V5Il0pO2Z1bmN0aW9uIHJOKGUsdCxuLHIpe2xldCBvPWU/LnNldHRpbmdzfHx7fSxhPW9bRy5MTE1fUFJPVklERVJfTU9ERUxdPz9udWxsLGk9dD9BdCh0KTpudWxsLHM9ZD0+e2xldCB1PWQ/b1tkXTpudWxsO3JldHVybiB0eXBlb2YgdT09InN0cmluZyI/dS50cmltKCkubGVuZ3RoOjB9LGw9e2FudGhyb3BpYzpzKEcuTExNX0FQSV9LRVlfQU5USFJPUElDKSxnZW1pbmk6cyhHLkxMTV9BUElfS0VZX0dFTUlOSSksZ3JvazpzKEcuTExNX0FQSV9LRVlfR1JPSyksb3BlbmFpOnMoRy5MTE1fQVBJX0tFWV9PUEVOQUkpfSxjPU9iamVjdC5lbnRyaWVzKGwpLmZpbHRlcigoWyxkXSk9PmQ+MCkubWFwKChbZF0pPT5kKTtyZXR1cm57cHJvcFByb3ZpZGVyRW06dD8/bnVsbCxwcm9wUHJvdmlkZXJBcGlLZXlMZW5ndGg6dHlwZW9mIG49PSJzdHJpbmciP24udHJpbSgpLmxlbmd0aDowLGVudkFwaUtleUxlbmd0aDp0eXBlb2Ygcj09InN0cmluZyI/ci5sZW5ndGg6MCxzZXR0aW5nc0xsbVByb3ZpZGVyOmEscHJvcFByb3ZpZGVyU2V0dGluZ0tleTppLHNldHRpbmdzS2V5TGVuZ3RoRm9yUHJvcDpzKGkpLGFwaUtleUxlbmd0aEJ5UHJvdmlkZXI6bCxjb25maWd1cmVkUHJvdmlkZXJCdWNrZXRzOmMsaGFzQ2FsbFBsdWdpbjp0eXBlb2YgZT8uY2FsbFBsdWdpbj09ImZ1bmN0aW9uIn19ZnVuY3Rpb24gb04oZSx0KXtyZXR1cm5bLi4uZV0uc29ydCgocixvKT0+by5yYXRpbmctci5yYXRpbmcpLnNsaWNlKDAsdCl9ZnVuY3Rpb24gYU4oZSl7cmV0dXJuIGU+PTg/ImhpZ2giOmU+PTU/Im1lZGl1bSI6ImxvdyJ9ZnVuY3Rpb24gUnIoZSl7cmV0dXJuIGU/LnN1Z2dlc3Rpb25JZHx8ZT8udXVpZHx8YCR7ZT8udGl0bGV8fCJ1bnRpdGxlZCJ9Ojoke2U/LnJhdGluZ3x8MH06OiR7ZT8uZXhwbGFuYXRpb258fCIifWB9ZnVuY3Rpb24gT2koKXtyZXR1cm4gSmcoa24pLmljb259ZnVuY3Rpb24gaU4oZSx0LG4pe3JldHVybiBuLmlzRXhpc3RpbmcmJm4uc291cmNlTm90ZU5hbWU/ZSgic3BhbiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1zb3VyY2Utbm90ZS1iYWRnZSIsdGl0bGU6bi5zb3VyY2VOb3RlTmFtZT9gVGFzayBpbiBub3RlOiAke24uc291cmNlTm90ZU5hbWV9YDoiT3BlbiB0aGlzIHRhc2sifSxuLnNvdXJjZU5vdGVOYW1lKTohbi5pc0V4aXN0aW5nJiZ0P2UoInNwYW4iLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbmV3LWJhZGdlIix0aXRsZToiTmV3IHRhc2sgXHUyMDE0IGNsaWNrIHRvIGNyZWF0ZSJ9LCIrbmV3Iik6bnVsbH1mdW5jdGlvbiBWdyhlLHQsbil7cmV0dXJuIHQ/ZSgiYSIse2hyZWY6IiMiLGNsYXNzTmFtZToid2lkZ2V0LWhlYWRlci1hY3Rpb24iLG9uQ2xpY2s6bix0aXRsZToiT3BlbiB0b2RheSdzIHByb3Bvc2VkIHRhc2tzIG5vdGUifSwiXHV7MUY1RDJ9XHVGRTBGIE5vdGUiKTpudWxsfWZ1bmN0aW9uIHNOKGUsdCl7cmV0dXJuIGUoImEiLHtocmVmOiIjIixjbGFzc05hbWU6IndpZGdldC1oZWFkZXItYWN0aW9uIixvbkNsaWNrOnQsdGl0bGU6IkdldCBuZXcgdGFzayBzdWdnZXN0aW9ucyAoZXhjbHVkZXMgdGFza3Mgc2hvd24gdG9kYXkpIn0sIlx1ezFGNTA0fSBSZXNlZWQiKX1mdW5jdGlvbiBsTihlKXtyZXR1cm4gZShvZSx7dGl0bGU6cmUoa24pLGljb246T2koKSx3aWRnZXRJZDprbn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWxvYWRpbmcifSxlKCJkaXYiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stc3Bpbm5lciJ9KSxlKCJwIixudWxsLCJBbmFseXppbmcgdGhlIGZpbmVzdCB0YXNrcyBcdTIwMjYiKSkpfWZ1bmN0aW9uIGNOKGUsdCxuKXtsZXQgcj1uP2BObyBBUEkga2V5IGlzIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBBSSBwcm92aWRlciwgJHtufS5gOmBEcmVhbVRhc2sgdXNlcyBBSSB0byBzdWdnZXN0IHRhc2tzIGFsaWduZWQgd2l0aCB5b3VyIGdvYWxzIChhcyBkZWZpbmVkIGluIHRoZSBkYXNoYm9hcmQncyAiJHtyZSgicGxhbm5pbmciKX0iIGNvbXBvbmVudCkuIEFuIExMTSBwcm92aWRlciBhbmQgQVBJIGtleSBhcmUgcmVxdWlyZWRgO3JldHVybiBlKG9lLHt0aXRsZTpyZShrbiksaWNvbjpPaSgpLHdpZGdldElkOmtufSxlKCJkaXYiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbm8tY29uZmlnIn0sZSgicCIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1uby1jb25maWctdGV4dCJ9LHIpLGUoInAiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbm8tY29uZmlnLXRleHQifSwiTm8gQVBJIGtleT8gSW5zdGFsbCAiLGUoTXAse3VybDoiaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9wbHVnaW5zL2FtcGxlX2FnZW50X3BybyIsY2xhc3NOYW1lOiJkcmVhbS10YXNrLXNldHRpbmdzLWxpbmsifSwiQW1wbGVub3RlXHUyMDE5cyBBSSBpbnRlZ3JhdGlvbiIpLCIgdG8gZW5hYmxlIHN1Z2dlc3RlZCB0YXNrcyBhbmQgMTArIG90aGVyIEFJIGZlYXR1cmVzIFx1MjAxNCBubyBBUEkga2V5IHJlcXVpcmVkLiIpLGUoInAiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbm8tY29uZmlnLXRleHQifSxlKCJhIix7aHJlZjoiIyIsY2xhc3NOYW1lOiJkcmVhbS10YXNrLXNldHRpbmdzLWxpbmsiLG9uQ2xpY2s6dH0sIkNvbmZpZ3VyZSBBSSBzZXR0aW5ncyBcdTIxOTIiKSxlKCJiciIpLGUoImEiLHtocmVmOiJodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL3N1YnNjcmlwdGlvbnMvbmV3IixjbGFzc05hbWU6ImRyZWFtLXRhc2stc2V0dGluZ3MtbGluayJ9LCJWaWV3IEZvdW5kZXIgU3Vic2NyaXB0aW9uIFx1MjE5MiIpLGUoImJyIiksZSgiYSIse2hyZWY6Imh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vcGx1Z2lucy9hbXBsZV9hZ2VudF9wcm8iLGNsYXNzTmFtZToiZHJlYW0tdGFzay1zZXR0aW5ncy1saW5rIn0sIlZpZXcgcGx1Z2luIFx1MjE5MiIpKSkpfWZ1bmN0aW9uIHVOKGUsdCxuLHIsbyl7bGV0e2Vycm9yOmEsZXJyb3JDb2RlOmksZXJyb3JEZXRhaWw6cyxwcm92aWRlck5hbWU6bH09dCxjO3N3aXRjaChpKXtjYXNlImludmFsaWRfYXBpX2tleSI6Yz1bZSgicCIsbnVsbCxgVGhlIEFQSSBrZXkgZm9yICR7bHx8InlvdXIgQUkgcHJvdmlkZXIifSBhcHBlYXJzIHRvIGJlIGludmFsaWQgb3IgdW5hdXRob3JpemVkLmApLGUoInAiLG51bGwsIlBsZWFzZSBjaGVjayB5b3VyIEFQSSBrZXkgaW4gIixlKCJhIix7aHJlZjoiIyIsY2xhc3NOYW1lOiJkcmVhbS10YXNrLXNldHRpbmdzLWxpbmsiLG9uQ2xpY2s6b30sIkFJIHNldHRpbmdzIiksIi4iKV07YnJlYWs7Y2FzZSJub19wbGFubmluZ19kYXRhIjpjPVtlKCJwIixudWxsLCJEcmVhbVRhc2sgbmVlZHMgcGxhbm5pbmcgY29udGV4dCB0byBnZW5lcmF0ZSBzdWdnZXN0aW9ucy4iKSxlKCJwIixudWxsLCJQb3B1bGF0ZSB5b3VyIHF1YXJ0ZXJseSBhbmQvb3IgbW9udGhseSBwbGFuIHRvIHJlY2VpdmUgQUktc3VnZ2VzdGVkIHRhc2tzLiIpXTticmVhaztjYXNlInBhcnNlX2Vycm9yIjpjPVtlKCJwIixudWxsLCJVbmFibGUgdG8gc3VjY2Vzc2Z1bGx5IHByb2Nlc3MgdGhlIEFJIHByb3ZpZGVyJ3MgcmVzcG9uc2UuIiksZSgicCIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1lcnJvci1kZXRhaWwifSwiSWYgdGhpcyBwZXJzaXN0cywgcGxlYXNlIGNvbnRhY3Qgc3VwcG9ydEBhbXBsZW5vdGUuY29tIixzP2Agd2l0aCB0aGlzIGRldGFpbDogJHtzfWA6IiIpXTticmVhaztkZWZhdWx0OmM9W2UoInAiLG51bGwsYXx8IkFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQuIildfXJldHVybiBlKG9lLHt0aXRsZTpyZShrbiksaWNvbjpPaSgpLHdpZGdldElkOmtuLGhlYWRlckFjdGlvbnM6bn0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWVycm9yIn0sLi4uYyxlKCJidXR0b24iLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stcmV0cnkiLG9uQ2xpY2s6cn0sIlJldHJ5IikpKX1mdW5jdGlvbiBkTihlLHQsbil7cmV0dXJuIGUob2Use3RpdGxlOnJlKGtuKSxpY29uOk9pKCksd2lkZ2V0SWQ6a24saGVhZGVyQWN0aW9uczp0fSxlKCJkaXYiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stZW1wdHkifSxlKCJwIixudWxsLCJObyB0YXNrIHN1Z2dlc3Rpb25zIGF2YWlsYWJsZS4iKSxlKCJidXR0b24iLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stcmV0cnkiLG9uQ2xpY2s6bn0sIlJlZnJlc2giKSkpfWZ1bmN0aW9uIHBOKGUsdCxuLHIsbyxhLGkscyl7bGV0IGw9cGVyZm9ybWFuY2Uubm93KCksYz1vTih0LG4pO0UoYFtEcmVhbVRhc2tdIF9zZWxlY3REaXNwbGF5VGFza3M6ICR7KHBlcmZvcm1hbmNlLm5vdygpLWwpLnRvRml4ZWQoMSl9bXMgKCR7dC5sZW5ndGh9IFx1MjE5MiAke2MubGVuZ3RofSB0YXNrcylgKTtsZXR7ZGlzbWlzc2luZ1Rhc2tLZXlzOmQsZXhwYW5kZWRFeHBsYW5hdGlvbktleXM6dSxvbkNvbXBsZXRlOnAsb25QcmVzZXJ2ZTpmLG9uUmVtb3ZlOnksb25TY2hlZHVsZTp3LG9uVG9nZ2xlRXhwbGFuYXRpb246Yn09cyx2PXBlcmZvcm1hbmNlLm5vdygpLGg9Yy5tYXAoKGcsbSk9PntsZXQgeD0hIW8sUz1nLm5hdGl2ZVRhc2t8fG51bGwsXz1TPy5zdGFydEF0IT1udWxsfHxnLnN0YXJ0QXQhPW51bGwsRD1ScihnKSxBPWQuaGFzKEQpO0UoIlJlbmRlcmluZyBkcmVhbVRhc2siLHt0aXRsZTpnLnRpdGxlLGlzQ2xpY2thYmxlOngsaXNEaXNtaXNzaW5nOkEsbmF0aXZlVGFzazohIVN9KTtsZXQgVD1wZXJmb3JtYW5jZS5ub3coKSxMPXBvKGcudGl0bGUpfHxnLnRpdGxlLHo9cG8oZy5leHBsYW5hdGlvbil8fCIiO3JldHVybiBFKGBbRHJlYW1UYXNrXSBjYXJkICR7bX0gbWFya2Rvd24gcmVuZGVyOiAkeyhwZXJmb3JtYW5jZS5ub3coKS1UKS50b0ZpeGVkKDEpfW1zYCksZSgiZGl2Iix7a2V5OkR8fG0sY2xhc3NOYW1lOmBkcmVhbS10YXNrLWNhcmQke2cuaXNFeGlzdGluZz8iIjoiIGRyZWFtLXRhc2stY2FyZC0taW52ZW50ZWQifSR7QT8iIGRyZWFtLXRhc2stY2FyZC0tZGlzbWlzc2luZyI6IiJ9YH0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWNhcmQtaGVhZGVyIn0sZSgic3BhbiIse2NsYXNzTmFtZTpgZHJlYW0tdGFzay1jYXJkLXRpdGxlJHt4PyIgZHJlYW0tdGFzay1jYXJkLXRpdGxlLS1jbGlja2FibGUiOiIifWAsb25DbGljazp4PygpPT5vKGcpOnZvaWQgMCxyb2xlOng/ImJ1dHRvbiI6dm9pZCAwLHRhYkluZGV4Ong/MDp2b2lkIDAsb25LZXlEb3duOng/ST0+eyhJLmtleT09PSJFbnRlciJ8fEkua2V5PT09IiAiKSYmKEkucHJldmVudERlZmF1bHQoKSxvKGcpKX06dm9pZCAwLHRpdGxlOmcuaXNFeGlzdGluZz8iT3BlbiB0aGlzIHRhc2siOiJDbGljayB0byBjcmVhdGUgdGhpcyB0YXNrIixkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOkx9fSksaU4oZSx4LGcpLGUoInNwYW4iLHtjbGFzc05hbWU6YGRyZWFtLXRhc2stcmF0aW5nIGRyZWFtLXRhc2stcmF0aW5nLS0ke2FOKGcucmF0aW5nKX1gLHRpdGxlOmBSZWxldmFuY2U6ICR7Zy5yYXRpbmd9LzEwYH0sYCR7Zy5yYXRpbmd9LzEwYCkpLGUoInAiLHtjbGFzc05hbWU6YGRyZWFtLXRhc2stY2FyZC1leHBsYW5hdGlvbiR7dS5oYXMoRCk/IiBkcmVhbS10YXNrLWNhcmQtZXhwbGFuYXRpb24tLWV4cGFuZGVkIjoiIn1gLHRpdGxlOmcuZXhwbGFuYXRpb24/Lmxlbmd0aD5lTj9nLmV4cGxhbmF0aW9uOm51bGwsb25DbGljazooKT0+YihnKSxkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOnp9fSksZSgiZGl2Iix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWNhcmQtYWN0aW9ucyJ9LGUoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stY2FyZC1hY3Rpb24iLG9uQ2xpY2s6ST0+ZihJLGcpLHRpdGxlOmcucHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c/IkNsaWNraW5nIHRoaXMgd2lsbCByZW1vdmUgcHJlc2VydmUgc3RhdHVzIHNvIHRoZSB0YXNrIGNhbiByZXNlZWQgbm9ybWFsbHkiOiJDbGlja2luZyB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHRhc2sgcmVtYWlucyBwcmVzZW50IGluIHlvdXIgRHJlYW0gVGFzayBsaXN0IHRocm91Z2ggdG9tb3Jyb3cgKG5vcm1hbGx5IHRhc2tzIHJlc2VlZCBkYWlseSkifSxnLnByZXNlcnZlVGhyb3VnaFRvbW9ycm93PyJcdXsxRjZBQn0gUmVtb3ZlIHByZXNlcnZlIHN0YXR1cyI6Ilx1ezFGNENFfSBQcmVzZXJ2ZSBhIGRheSIpLGUoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stY2FyZC1hY3Rpb24iLG9uQ2xpY2s6ST0+cChJLGcpLHRpdGxlOiJNYXJrIHRoaXMgdGFzayBjb21wbGV0ZSBhbmQgcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgc3VnZ2VzdGlvbiB3aGVuIGF2YWlsYWJsZSJ9LCJcdTI3MDUgQ29tcGxldGVkIiksXz9udWxsOmUoImEiLHtocmVmOiIjIixjbGFzc05hbWU6ImRyZWFtLXRhc2stY2FyZC1hY3Rpb24iLG9uQ2xpY2s6ST0+dyhJLGcpLHRpdGxlOiJTY2hlZHVsZSB0aGlzIHRhc2sgZm9yIGEgc3BlY2lmaWMgZGF0ZSBhbmQgdGltZSJ9LCJcdXsxRjRDNX0gU2NoZWR1bGUiKSxlKCJhIix7aHJlZjoiIyIsY2xhc3NOYW1lOiJkcmVhbS10YXNrLWNhcmQtYWN0aW9uIixvbkNsaWNrOkk9PnkoSSxnKSx0aXRsZToiUmVtb3ZlIHRoaXMgdGFzayBhbmQgcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgc3VnZ2VzdGlvbiB3aGVuIGF2YWlsYWJsZSJ9LCJcdTI3NEMgUmVtb3ZlIikpKX0pO3JldHVybiBFKGBbRHJlYW1UYXNrXSBjYXJkIG1hcCB0b3RhbCAoJHtjLmxlbmd0aH0gY2FyZHMpOiAkeyhwZXJmb3JtYW5jZS5ub3coKS12KS50b0ZpeGVkKDEpfW1zYCksZShvZSx7aGVhZGVyQWN0aW9uczpyLHN1YnRpdGxlOiJXaGF0IGlmIHlvdSBkaWQgaXQgdG9kYXk/Iix0aXRsZTpyZShrbiksaWNvbjpPaSgpLHdpZGdldElkOmtufSxlKCJkaXYiLHtjbGFzc05hbWU6ImRyZWFtLXRhc2stbGlzdCIscmVmOmF9LC4uLmgsaT9lKCJwIix7Y2xhc3NOYW1lOiJkcmVhbS10YXNrLWxsbS1hdHRyaWJ1dGlvbiJ9LGkpOm51bGwpKX1mdW5jdGlvbiBmTihlLHtsb2FkaW5nOnQsZXJyb3I6bix0YXNrczpyLG1heFRhc2tzOm8sbm90ZUxpbms6YSxoZWFkZXJBY3Rpb25zOmksb25TZXR0aW5nc0NsaWNrOnMscnVuQW5hbHlzaXM6bCxvblRhc2tDbGljazpjLGxpc3RSZWY6ZCxsbG1BdHRyaWJ1dGlvbkZvb3Rlcjp1LGFjdGlvbkhhbmRsZXJzOnB9KXtyZXR1cm4gdD9sTihlKTpuP3VOKGUsbixhLCgpPT5sKG51bGwpLHMpOiFyfHxyLmxlbmd0aD09PTA/ZE4oZSxhLCgpPT5sKG51bGwpKTpwTihlLHIsbyxpLGMsZCx1LHApfWZ1bmN0aW9uIG1OKGUse25vdGVVVUlEOnQsb25PcGVuTm90ZTpuLG9uUmVzZWVkOnJ9KXtyZXR1cm4gZSgic3BhbiIse2NsYXNzTmFtZToiZHJlYW0tdGFzay1oZWFkZXItYWN0aW9ucyJ9LHNOKGUsciksVncoZSx0LG4pKX1mdW5jdGlvbiBoTihlLHQsbixyKXtsZXRbbyxhXT0oMCxmZS51c2VTdGF0ZSkoKCk9Pm5ldyBTZXQpLFtpLHNdPSgwLGZlLnVzZVN0YXRlKSgoKT0+bmV3IFNldCksbD0oMCxmZS51c2VDYWxsYmFjaykoKCk9PnthKG5ldyBTZXQpLHMobmV3IFNldCl9LFtdKSxjPSgwLGZlLnVzZUNhbGxiYWNrKShhc3luYyh2LGgpPT57YXdhaXQgQ3coZSxuLHYsaCl9LFtlLG5dKSxkPSgwLGZlLnVzZUNhbGxiYWNrKSh2PT57bGV0IGg9UnIodik7YShnPT57bGV0IG09bmV3IFNldChnKTtyZXR1cm4gbS5hZGQoaCksbX0pLHNldFRpbWVvdXQoKCk9PntyKGc9PihnfHxbXSkuZmlsdGVyKG09PlJyKG0pIT09aCkpLGEoZz0+e2xldCBtPW5ldyBTZXQoZyk7cmV0dXJuIG0uZGVsZXRlKGgpLG19KSxzKGc9PntsZXQgbT1uZXcgU2V0KGcpO3JldHVybiBtLmRlbGV0ZShoKSxtfSl9LHROKX0sW3JdKSx1PSgwLGZlLnVzZUNhbGxiYWNrKSh2PT57bGV0IGg9di5jdXJyZW50VGFyZ2V0Py5jbG9zZXN0Py4oIi5kcmVhbS10YXNrLWNhcmQiKTtpZighaHx8dHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuO2xldCBnPWguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IWcud2lkdGh8fCFnLmhlaWdodHx8Umwoe29yaWdpbjp7eDooZy5sZWZ0K2cud2lkdGgvMikvd2luZG93LmlubmVyV2lkdGgseTooZy50b3ArZy5oZWlnaHQvMikvd2luZG93LmlubmVySGVpZ2h0fSxwYXJ0aWNsZUNvdW50OjkwLHNwcmVhZDo3NSxzdGFydFZlbG9jaXR5OjQyfSl9LFtdKSxwPSgwLGZlLnVzZUNhbGxiYWNrKShhc3luYyh2LGgpPT57di5wcmV2ZW50RGVmYXVsdCgpLHUodik7bGV0IGc9aC51dWlkP251bGw6YXdhaXQgSHcoZSksbT1hd2FpdCBqdyhlLGcsaCk7bSYmYXdhaXQgYyhoLHtjb21wbGV0ZWRBdDptLHJlbW92ZWRBdDpudWxsfSksZChoKX0sW2UsdSxjLGRdKSxmPSgwLGZlLnVzZUNhbGxiYWNrKShhc3luYyh2LGgpPT57di5wcmV2ZW50RGVmYXVsdCgpO2xldCBnPVJyKGgpLG09IWgucHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c7cih4PT4oeHx8W10pLm1hcChTPT5ScihTKT09PWc/ey4uLlMscHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c6bX06UykpLGF3YWl0IGMoaCx7cHJlc2VydmVUaHJvdWdoVG9tb3Jyb3c6bX0pfSxbYyxyXSkseT0oMCxmZS51c2VDYWxsYmFjaykoYXN5bmModixoKT0+e3YucHJldmVudERlZmF1bHQoKTtsZXQgZz1uZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7YXdhaXQgYyhoLHtjb21wbGV0ZWRBdDpudWxsLHJlbW92ZWRBdDpnfSksZChoKX0sW2MsZF0pLHc9KDAsZmUudXNlQ2FsbGJhY2spKGFzeW5jKHYsaCk9Pnt2LnByZXZlbnREZWZhdWx0KCk7bGV0e2V2ZW50czpnLHRhc2tzOm19PWF3YWl0IEZ3KGUpLHg9bmV3IERhdGUsUz1uZXcgRGF0ZSh4LmdldEZ1bGxZZWFyKCkseC5nZXRNb250aCgpLHguZ2V0RGF0ZSgpLDAsMCwwKSxfPU1hdGguZmxvb3IoUy5nZXRUaW1lKCkvMWUzKSxEPXp3KHgsZyxtKTtpZihELmxlbmd0aD09PTApe2F3YWl0IGUuYWxlcnQoIk5vIGF2YWlsYWJsZSAzMC1taW51dGUgc2xvdHMgdG9kYXkuIFBsZWFzZSBzY2hlZHVsZSBtYW51YWxseS4iKTtyZXR1cm59bGV0IEE9YXdhaXQgZS5wcm9tcHQoIlBpY2sgd2hlbiB0byBzY2hlZHVsZSB0aGlzIHRhc2suIFRpbWVzIGxpc3RlZCBhcmUgZnJlZSB0b2RheTsgY2hvb3NlIGEgZGlmZmVyZW50IGRhdGUgb25seSBpZiB0aG9zZSBjb25mbGljdHMgYXJlIGFjY2VwdGFibGUuIix7aW5wdXRzOlt7bGFiZWw6IkRhdGUiLHR5cGU6ImRhdGUiLHZhbHVlOl99LHtsYWJlbDoiVGltZSIsb3B0aW9uczpELHR5cGU6InNlbGVjdCIsdmFsdWU6RFswXS52YWx1ZX1dfSk7aWYoIUEpcmV0dXJuO2xldFtULExdPUE7aWYoVD09bnVsbHx8TD09bnVsbClyZXR1cm47bGV0IHo9JHcoVCxMKTtpZih6PT1udWxsKXtFKCJbRHJlYW1UYXNrXSBTY2hlZHVsZTogaW52YWxpZCBkYXRlL3RpbWUgcmV0dXJuZWQgYnkgcHJvbXB0Iix7ZGF0ZVNlYzpULHRpbWVNaW51dGVzOkx9KSxhd2FpdCBlLmFsZXJ0KCJDb3VsZCBub3Qgc2NoZWR1bGU6IHRoZSBzZWxlY3RlZCBkYXRlIG9yIHRpbWUgd2FzIGludmFsaWQuIik7cmV0dXJufWxldCBJPWF3YWl0IFV3KGUsdCx6LGgpO2lmKCFJLnRhc2tVdWlkKXtFKCJbRHJlYW1UYXNrXSBTY2hlZHVsZSBmYWlsZWQiLEkpO2xldCBGPUkucmVhc29uPT09Im1pc3Npbmdfbm90ZSI/IkNvdWxkIG5vdCBzY2hlZHVsZTogbm8gdGFyZ2V0IG5vdGUgaXMgYXZhaWxhYmxlIGZvciB0aGlzIHN1Z2dlc3Rpb24uIjoiQ291bGQgbm90IHNjaGVkdWxlIHRoaXMgdGFzay4gUGxlYXNlIHRyeSBhZ2FpbiBvciBzY2hlZHVsZSBpdCBtYW51YWxseS4iO2F3YWl0IGUuYWxlcnQoRik7cmV0dXJufWF3YWl0IGMoaCx7dGFza1V1aWQ6SS50YXNrVXVpZH0pO2xldCBNPVJyKGgpO2lmKHIoRj0+KEZ8fFtdKS5tYXAoVT0+UnIoVSk9PT1NP3suLi5VLGlzRXhpc3Rpbmc6ITAsbm90ZVVVSUQ6SS5ub3RlVVVJRHx8VS5ub3RlVVVJRHx8dCxzdGFydEF0Okkuc3RhcnRBdHx8eix1dWlkOkkudGFza1V1aWR9OlUpKSx0eXBlb2Ygd2luZG93PCJ1Iil7bGV0IEY9bmV3IEN1c3RvbUV2ZW50KEZsLHtjb250ZW50OmgudGl0bGUsbm90ZVVVSUQ6SS5ub3RlVVVJRHx8aC5ub3RlVVVJRHx8dCxzdGFydEF0OnosdGFza1V1aWQ6SS50YXNrVXVpZH0pO3dpbmRvdy5kaXNwYXRjaEV2ZW50KEYpfX0sW2UsdCxjLHJdKSxiPSgwLGZlLnVzZUNhbGxiYWNrKSh2PT57bGV0IGg9UnIodik7cyhnPT57bGV0IG09bmV3IFNldChnKTtyZXR1cm4gbS5oYXMoaCk/bS5kZWxldGUoaCk6bS5hZGQoaCksbX0pfSxbXSk7cmV0dXJue2Rpc21pc3NpbmdUYXNrS2V5czpvLGV4cGFuZGVkRXhwbGFuYXRpb25LZXlzOmksb25Db21wbGV0ZVRhc2s6cCxvblByZXNlcnZlVGFzazpmLG9uUmVtb3ZlVGFzazp5LG9uU2NoZWR1bGVUYXNrOncsb25Ub2dnbGVFeHBsYW5hdGlvbjpiLHJlc2V0QWN0aW9uU3RhdGU6bH19ZnVuY3Rpb24gUHAoe2FwcDplLGdyaWRIZWlnaHRTaXplOnQsZ3JpZFdpZHRoU2l6ZTpuLG9uT3BlblNldHRpbmdzOnIscHJvdmlkZXJBcGlLZXk6byxwcm92aWRlckVtOmF9KXtsZXQgaT1mZS5jcmVhdGVFbGVtZW50LFtzLGxdPSgwLGZlLnVzZVN0YXRlKSghMSksW2MsZF09KDAsZmUudXNlU3RhdGUpKG51bGwpLFt1LHBdPSgwLGZlLnVzZVN0YXRlKShudWxsKSxbZix5XT0oMCxmZS51c2VTdGF0ZSkobnVsbCksW3csYl09KDAsZmUudXNlU3RhdGUpKG51bGwpLFt2LGhdPSgwLGZlLnVzZVN0YXRlKShudWxsKSxbLGddPSgwLGZlLnVzZVN0YXRlKSgoKT0+Q2koKSksbT0oMCxmZS51c2VSZWYpKG51bGwpLHg9KDAsZmUudXNlUmVmKSgwKTt4LmN1cnJlbnQrPTE7bGV0IFM9dHlwZW9mIHByb2Nlc3M8InUiJiZwcm9jZXNzLmVudj8uT1BFTl9BSV9BQ0NFU1NfVE9LRU58fCIiLF89ISEoU3x8byksRD1hP0lyKGEpOm51bGwsQT1FdyhuLHQpLFQ9VHcobix0KSxMPU53KCksej0oMCxmZS51c2VSZWYpKFQpLHtkaXNtaXNzaW5nVGFza0tleXM6SSxleHBhbmRlZEV4cGxhbmF0aW9uS2V5czpNLG9uQ29tcGxldGVUYXNrOkYsb25QcmVzZXJ2ZVRhc2s6VSxvblJlbW92ZVRhc2s6TyxvblNjaGVkdWxlVGFzazpqLG9uVG9nZ2xlRXhwbGFuYXRpb246WCxyZXNldEFjdGlvblN0YXRlOk59PWhOKGUsdyxmLGQpLGs9KDAsZmUudXNlQ2FsbGJhY2spKGFzeW5jKGVlLGllKT0+e2xldCBRPShlZXx8W10pLmZpbHRlcihCb29sZWFuKTtpZihRLmxlbmd0aD09PTApcmV0dXJuIGllO2xldCBnZT1hd2FpdCBEdyhlLGllLFEpO3JldHVybiBnKGdlKSxnZX0sW2VdKSxSPSgwLGZlLnVzZUNhbGxiYWNrKShhc3luYyhlZSxpZT17fSk9PntsZXQgUT1pZS5wcm92aWRlckVtT3ZlcnJpZGU/SXIoaWUucHJvdmlkZXJFbU92ZXJyaWRlKTpEO0UoIltEcmVhbVRhc2tdIHJ1bkFuYWx5c2lzIGVudHJ5Iix7aGFzTGxtQ29uZmlnOl8scHJvdmlkZXJOYW1lOlEsZXhjbHVkZVV1aWRzU2l6ZTplZT8uc2l6ZT8/MCxvcHRpb25zOmllLHRhc2tHZW5lcmF0ZUNvdW50OlQscHJvcG9zZWRUYXNrc05vdGVOYW1lOkx9KSxsKCEwKSxwKG51bGwpLGgobnVsbCk7dHJ5e2xldCBnZT1wZXJmb3JtYW5jZS5ub3coKSxfZT1hd2FpdCBPdyhlLHtleGNsdWRlVXVpZHM6ZWUsb3B0aW9uczppZSxwcm9wb3NlZFRhc2tzTm90ZU5hbWU6TCxtYXhUYXNrczpUfSk7RShgW0RyZWFtVGFza10gZmV0Y2hEcmVhbVRhc2tTdWdnZXN0aW9ucyB0b29rICR7KHBlcmZvcm1hbmNlLm5vdygpLWdlKS50b0ZpeGVkKDEpfW1zYCx7Y2FjaGVkOl9lPy5jYWNoZWQsdGFza0NvdW50Ol9lPy50YXNrcz8ubGVuZ3RoPz8wLGVycm9yQ29kZTpfZT8uZXJyb3JDb2RlPz9udWxsLG5vdGVVVUlEOl9lPy5ub3RlVVVJRD8/bnVsbH0pO2xldCBCZT1wZXJmb3JtYW5jZS5ub3coKTthd2FpdCBJdyhfZSx7cHJvdmlkZXJOYW1lOlEsYXBwOmUscmVjb3JkVGFza1V1aWRzOmssc2V0RXJyb3I6cCxzZXRUYXNrczpkLHNldE5vdGVVVUlEOnksc2V0RGVmYXVsdE5vdGVVVUlEOmIsc2V0TGxtQXR0cmlidXRpb25Gb290ZXI6aH0pLEUoYFtEcmVhbVRhc2tdIGFwcGx5RHJlYW1UYXNrQW5hbHlzaXNSZXN1bHQgdG9vayAkeyhwZXJmb3JtYW5jZS5ub3coKS1CZSkudG9GaXhlZCgxKX1tc2ApfWNhdGNoKGdlKXtFKCJbRHJlYW1UYXNrXSBydW5BbmFseXNpcyBjYXVnaHQgdW5leHBlY3RlZCBlcnJvciIsZ2UpLHAoe2Vycm9yOmdlLm1lc3NhZ2V8fCJBbmFseXNpcyBmYWlsZWQiLGVycm9yQ29kZToibGxtX2Vycm9yIixwcm92aWRlck5hbWU6UX0pfWZpbmFsbHl7bCghMSl9fSxbayxULEwsRCxfXSk7KDAsZmUudXNlRWZmZWN0KSgoKT0+e2coQ2koKSl9LFtdKSwoMCxmZS51c2VFZmZlY3QpKCgpPT57c3x8Yz8ubGVuZ3RofHxSKG51bGwse21pbmltdW1UYXNrQ291bnQ6VH0pfSxbX10pLCgwLGZlLnVzZUVmZmVjdCkoKCk9PntsZXQgZWU9ck4oZSxhLG8sUyk7RSgiW0RyZWFtVGFza10gY29uZmlnIHNuYXBzaG90Iix7aGFzTGxtQ29uZmlnOl8scHJvdmlkZXJOYW1lOkQscmVuZGVyQ291bnQ6eC5jdXJyZW50LC4uLmVlfSl9LFtfLGEsbyxTLERdKSwoMCxmZS51c2VFZmZlY3QpKCgpPT57aWYoIV8pcmV0dXJuO2xldCBlZT16LmN1cnJlbnQ7ei5jdXJyZW50PVQsUncoe21heFRhc2tzOlQscHJldmlvdXNNYXhUYXNrczplZSx0YXNrczpjfSkmJk9wKFIsVCl9LFtfLFQsY10pLCgwLGZlLnVzZUVmZmVjdCkoKCk9PntsZXQgZWU9cGVyZm9ybWFuY2Uubm93KCk7aWEobS5jdXJyZW50KSxFKGBbRHJlYW1UYXNrXSBhdHRhY2hGb290bm90ZVBvcHVwczogJHsocGVyZm9ybWFuY2Uubm93KCktZWUpLnRvRml4ZWQoMSl9bXNgKX0sW2MsdSxzXSk7bGV0IEI9YXN5bmMgZWU9PntlZS5wcmV2ZW50RGVmYXVsdCgpLGYmJmF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtmfWApfSxIPWVlPT57ZWUucHJldmVudERlZmF1bHQoKSxBdyhyKX0scT1hc3luYyBlZT0+e2VlLnByZXZlbnREZWZhdWx0KCk7bGV0IGllPUlwKFBlKCkpLFE9e307aWYoaWUubGVuZ3RoPjEpe2xldCBnZT1hd2FpdCBNdyhlLGEpO2lmKCFnZSlyZXR1cm47UT17cHJvdmlkZXJFbU92ZXJyaWRlOmdlLnByb3ZpZGVyRW19fWVsc2UgaWUubGVuZ3RoPT09MSYmKFE9e3Byb3ZpZGVyRW1PdmVycmlkZTppZVswXS5wcm92aWRlckVtfSk7ZChudWxsKSxOKCksaChudWxsKSxPcChSLFQsUSl9LEo9IXMmJiFjJiYhdSxLPSEhdSYmbk4uaGFzKHUuZXJyb3JDb2RlKTtpZighXyYmIXMmJighY3x8Yy5sZW5ndGg9PT0wKSYmKEp8fEspKXJldHVybiBFKCJbRHJlYW1UYXNrXSByZW5kZXJpbmcgbm8tY29uZmlnIHN0YXRlIix7cHJvdmlkZXJOYW1lOkQsaGFzRXJyb3I6ISF1LGVycm9yQ29kZTp1Py5lcnJvckNvZGU/P251bGwsdGFza0NvdW50OmM/Lmxlbmd0aD8/MH0pLGNOKGksSCxEKTtsZXQgYWU9bU4oaSx7bm90ZVVVSUQ6Zixvbk9wZW5Ob3RlOkIsb25SZXNlZWQ6cX0pLGxlPVZ3KGksZixCKTtyZXR1cm4gZk4oaSx7ZXJyb3I6dSxoZWFkZXJBY3Rpb25zOmFlLGxpc3RSZWY6bSxsb2FkaW5nOnMsbGxtQXR0cmlidXRpb25Gb290ZXI6dixtYXhUYXNrczpBLG5vdGVMaW5rOmxlLG9uVGFza0NsaWNrOmVlPT5fdyhlLGVlLHcpLHRhc2tzOmMsb25TZXR0aW5nc0NsaWNrOkgscnVuQW5hbHlzaXM6UixhY3Rpb25IYW5kbGVyczp7ZGlzbWlzc2luZ1Rhc2tLZXlzOkksZXhwYW5kZWRFeHBsYW5hdGlvbktleXM6TSxvbkNvbXBsZXRlOkYsb25QcmVzZXJ2ZTpVLG9uUmVtb3ZlOk8sb25TY2hlZHVsZTpqLG9uVG9nZ2xlRXhwbGFuYXRpb246WH19KX12YXIgdHI9cGUoZGUoKSk7dmFyIGdOPTEuMDIseU49LjksR3c9OTY7ZnVuY3Rpb24gS3coZSx0KXtyZXR1cm4gTWF0aC5hYnMoZSk8MT8wOnQvTWF0aC5hYnMoZSl9ZnVuY3Rpb24gdk4oZSx0LG4pe3JldHVybiBuPyEhKGV8fHQhPT1idC5ERUZBVUxUfHwhRWkoKSk6ITF9ZnVuY3Rpb24gd04oZSl7aWYoZSlyZXR1cm57Ii0tZm9jdXMtYmx1ciI6ZS5ibHVyLCItLWZvY3VzLW9wYWNpdHkiOmAke2Uub3BhY2l0eX1gLCItLWZvY3VzLXNjYWxlIjpgJHtlLnNjYWxlfWAsIi0tZm9jdXMteCI6ZS54LCItLWZvY3VzLXkiOmUueX19ZnVuY3Rpb24gYk4oZSx0KXtsZXQgbj1lLmxlZnQrZS53aWR0aC8yLHI9ZS50b3ArZS5oZWlnaHQvMjtyZXR1cm57Ymx1cjoiMHB4IixvcGFjaXR5OjEsc2NhbGU6Z04seDpgJHt0Lngtbn1weGAseTpgJHt0Lnktcn1weGB9fWZ1bmN0aW9uIGtOKGUsdCl7bGV0IG49ZS5sZWZ0K2Uud2lkdGgvMixyPWUudG9wK2UuaGVpZ2h0LzIsbz1uLXQueCxhPXItdC55O01hdGguYWJzKG8pPDEmJk1hdGguYWJzKGEpPDEmJihhPS0xKTtsZXQgaT10LngrZS53aWR0aC8yK0d3LHM9dC55K2UuaGVpZ2h0LzIrR3csbD1NYXRoLm1heChLdyhvLGkpLEt3KGEscyksMS4zNSk7cmV0dXJue2JsdXI6IjJweCIsb3BhY2l0eTowLHNjYWxlOnlOLHg6YCR7byoobC0xKX1weGAseTpgJHthKihsLTEpfXB4YH19ZnVuY3Rpb24geE4oZSl7aWYodHlwZW9mIGRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuIG51bGw7bGV0IHQ9QXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuZGFzaGJvYXJkLWdyaWQgLmdyaWQtY2VsbFtkYXRhLXdpZGdldC1pZF0iKSk7aWYoIXQubGVuZ3RoKXJldHVybiBudWxsO2xldCBuPXt4OndpbmRvdy5pbm5lcldpZHRoLzIseTp3aW5kb3cuaW5uZXJIZWlnaHQvMn0scj17fTtyZXR1cm4gdC5mb3JFYWNoKG89PntsZXQgYT1vLmdldEF0dHJpYnV0ZSgiZGF0YS13aWRnZXQtaWQiKTtpZighYSlyZXR1cm47bGV0IGk9by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyW2FdPWE9PT1lP2JOKGksbik6a04oaSxuKX0pLHJ9ZnVuY3Rpb24gWXcoZSx0LG4pe3JldHVybntjbGFzc05hbWVzOltlPyJncmlkLWNlbGwtLWZvY3VzLW1vZGUiOiIiLGUmJmU9PT1uPyJncmlkLWNlbGwtLWZvY3VzZWQiOiIiLGUmJmUhPT1uPyJncmlkLWNlbGwtLWZvY3VzLWhpZGRlbiI6IiJdLmZpbHRlcihCb29sZWFuKSxzdHlsZTp3Tih0KX19ZnVuY3Rpb24gcXcoZSx0KXtsZXRbbixyXT0oMCx0ci51c2VTdGF0ZSkobnVsbCksW28sYV09KDAsdHIudXNlU3RhdGUpKHt9KSxpPSgwLHRyLnVzZUNhbGxiYWNrKSgoKT0+e3IobnVsbCksYSh7fSl9LFtdKTtyZXR1cm4oMCx0ci51c2VFZmZlY3QpKCgpPT57bGV0IHM9bD0+e2lmKHQhPT1idC5ERUZBVUxUfHxlfHwhRWkoKSlyZXR1cm47bGV0IGM9bD8uZGV0YWlsPy53aWRnZXRJZDtpZighYylyZXR1cm47aWYoYz09PW4pe2koKTtyZXR1cm59bGV0IGQ9eE4oYyk7ZCYmKGEoZCkscihjKSl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihBbCxzKSwoKT0+d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoQWwscyl9LFtpLGUsbix0XSksKDAsdHIudXNlRWZmZWN0KSgoKT0+e3ZOKGUsdCxuKSYmaSgpfSxbaSxlLG4sdF0pLCgwLHRyLnVzZUVmZmVjdCkoKCk9PntpZighbilyZXR1cm47bGV0IHM9Yz0+e2Mua2V5PT09IkVzY2FwZSImJmkoKX0sbD0oKT0+aSgpO3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIscyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIscyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbCl9fSxbaSxuXSkse2NsZWFyRm9jdXNlZFdpZGdldDppLGZvY3VzZWRXaWRnZXRJZDpuLGlzV2lkZ2V0Rm9jdXNNb2RlOiEhKG4mJnQ9PT1idC5ERUZBVUxUJiYhZSksd2lkZ2V0Rm9jdXNUcmFuc2Zvcm1zOm99fXZhciBTTj0wLEVOPTIsTHA9MixUTj0xLE5OPTcsRE49OSxfTj0yNCxDTj0xMDAsUXc9WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLEFOPTYwLEp3PTFlMyxPTj02MCxJTj1OTipfTipBTipPTipKdztmdW5jdGlvbiBSTihlKXtsZXQgdD1uZXcgU2V0O2ZvcihsZXQgbiBvZiBlKWZvcihsZXQgciBvZiBuLnV1aWRzKXQuYWRkKHIpO3JldHVybiB0fWFzeW5jIGZ1bmN0aW9uIE1OKGUpe2xldCB0PVBOKG5ldyBEYXRlKTtFKCJbR3JhdmV5YXJkXSBmaW5kT3JDcmVhdGVHcmF2ZXlhcmROb3RlOiBsb29raW5nIGZvciBub3RlIG5hbWVkIixKU09OLnN0cmluZ2lmeSh0KSwid2l0aCB0YWciLFJlKTtsZXQgbj1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOnQsdGFnczpbUmVdfSk7aWYoRSgiW0dyYXZleWFyZF0gZmluZE9yQ3JlYXRlR3JhdmV5YXJkTm90ZTogZmluZE5vdGUgcmVzdWx0OiIsbj9gdXVpZD0ke24udXVpZH1gOiJudWxsL3VuZGVmaW5lZCIpLG4/LnV1aWQpcmV0dXJuIG47RSgiW0dyYXZleWFyZF0gZmluZE9yQ3JlYXRlR3JhdmV5YXJkTm90ZTogbm90ZSBub3QgZm91bmQsIGNyZWF0aW5nIG5ldyBub3RlIik7bGV0IHI9YXdhaXQgZS5jcmVhdGVOb3RlKHQsW1JlXSx7YXJjaGl2ZTohMH0pO3JldHVybiBFKCJbR3JhdmV5YXJkXSBmaW5kT3JDcmVhdGVHcmF2ZXlhcmROb3RlOiBjcmVhdGVkIG5vdGUgd2l0aCB1dWlkOiIsciksYXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQoe3V1aWQ6cn0sWHcoW10pKSx7bmFtZTp0LHV1aWQ6cn19ZnVuY3Rpb24gWHcoZSl7bGV0IHQ9YCMgR3JhdmV5YXJkIHRhc2sgY2FuZGlkYXRlcwoKfCBEYXRlIHwgVGFzayBVVUlEcyB8IFRhc2sgbm90ZSBtZXRhZGF0YSB8CnwtLS0tLS18LS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfApgLG49ZS5tYXAocj0+e2xldCBvPUFycmF5LmlzQXJyYXkoci50YXNrRW50cmllcykmJnIudGFza0VudHJpZXMubGVuZ3RoPjA/ci50YXNrRW50cmllczpyLnV1aWRzLm1hcChpPT4oe25vdGVOYW1lOm51bGwsbm90ZVVVSUQ6bnVsbCx1dWlkOml9KSksYT1lbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoby5tYXAoaT0+KHtub3RlTmFtZTppLm5vdGVOYW1lfHxudWxsLG5vdGVVVUlEOmkubm90ZVVVSUR8fG51bGwsdXVpZDppLnV1aWR9KSkpKTtyZXR1cm5gfCAke3IuZGF0ZUtleX0gfCAke3IudXVpZHMuam9pbigiLCIpfSB8ICR7YX0gfGB9KS5qb2luKGAKYCk7cmV0dXJuIHQrbisobj9gCmA6IiIpfWZ1bmN0aW9uIFBOKGUpe2xldCB0PWUgaW5zdGFuY2VvZiBEYXRlP2U6bmV3IERhdGUoZSk7cmV0dXJuYFRhc2sgZ3JhdmV5YXJkIGRhdGE6ICR7UXdbdC5nZXRNb250aCgpXX0gJHt0LmdldEZ1bGxZZWFyKCl9YH1mdW5jdGlvbiBMTihlKXtsZXQgdD1lIGluc3RhbmNlb2YgRGF0ZT9lOm5ldyBEYXRlKGUpO3JldHVybmBTdWNjZXNzZnVsbHkgcmV0aXJlZCB0YXNrczogJHtRd1t0LmdldE1vbnRoKCldfSAke3QuZ2V0RnVsbFllYXIoKX1gfWZ1bmN0aW9uIHpOKGUpe2xldCB0PVtdLG49KGV8fCIiKS5zcGxpdChgCmApLHI9MCxvPTAsYT0wLGk9MDtmb3IobGV0IHMgb2Ygbil7bGV0IGw9cy50cmltKCk7aWYoIWwuc3RhcnRzV2l0aCgifCIpKXtyKys7Y29udGludWV9bGV0IGM9bC5zbGljZSgxLC0xKS5zcGxpdCgifCIpLm1hcChmPT5mLnRyaW0oKSk7aWYoYy5sZW5ndGg8RU4pe2ErKztjb250aW51ZX1sZXQgZD1jW1NOXTtpZihkPT09IkRhdGUifHwvXi0rJC8udGVzdChkKSl7bysrO2NvbnRpbnVlfWxldCB1PWNbVE5dLnNwbGl0KCIsIikubWFwKGY9PmYudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikscD11Lm1hcChmPT4oe25vdGVOYW1lOm51bGwsbm90ZVVVSUQ6bnVsbCx1dWlkOmZ9KSk7aWYoY1tMcF0pdHJ5e2xldCBmPUpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KGNbTHBdKSk7QXJyYXkuaXNBcnJheShmKT9wPWYuZmlsdGVyKHk9Pnk/LnV1aWQpLm1hcCh5PT4oe25vdGVOYW1lOnkubm90ZU5hbWV8fG51bGwsbm90ZVVVSUQ6eS5ub3RlVVVJRHx8bnVsbCx1dWlkOnkudXVpZH0pKTpFKCJbR3JhdmV5YXJkXSByb3dzRnJvbUdyYXZleWFyZENvbnRlbnQ6IHRhc2tFbnRyaWVzIGNvbHVtbiB3YXMgbm90IGFuIGFycmF5IGFmdGVyIHBhcnNlLCB2YWx1ZToiLGYpfWNhdGNoKGYpe0UoIltHcmF2ZXlhcmRdIGZhaWxlZCB0byBwYXJzZSBjYWNoZWQgdGFzayBub3RlIG1ldGFkYXRhOiIsZiwiXHUyMDE0IHJhdyBjZWxsIHZhbHVlOiIsY1tMcF0/LnNsaWNlKDAsMTIwKSl9ZWxzZSBFKGBbR3JhdmV5YXJkXSByb3dzRnJvbUdyYXZleWFyZENvbnRlbnQ6IG5vIHRhc2tFbnRyaWVzIGNvbHVtbiBmb3IgZGF0ZUtleT0ke0pTT04uc3RyaW5naWZ5KGQpfSwgZmFsbGluZyBiYWNrIHRvIHV1aWQtb25seSBlbnRyaWVzYCk7ZCYmdS5sZW5ndGg+MD90LnB1c2goe2RhdGVLZXk6ZCx0YXNrRW50cmllczpwLHV1aWRzOnV9KTppKyt9cmV0dXJuIHR9YXN5bmMgZnVuY3Rpb24gRk4oZSx0LG4pe2xldCByPWF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChuLm1hcChhPT5lLmdldE5vdGVUYXNrcyh7dXVpZDphLnV1aWR9LHtpbmNsdWRlRG9uZTohMX0pLnRoZW4oaT0+KHtub3RlSGFuZGxlOmEsdGFza3M6aXx8W119KSkpKSxvPVtdO2ZvcihsZXQgYSBvZiByKXtpZihhLnN0YXR1cz09PSJyZWplY3RlZCIpe0UoIltHcmF2ZXlhcmRdIGdldE5vdGVUYXNrcyBmYWlsZWQ6IixhLnJlYXNvbik7Y29udGludWV9bGV0e25vdGVIYW5kbGU6aSx0YXNrczpzfT1hLnZhbHVlLGw9MDtmb3IobGV0IGMgb2YgcykhYz8udXVpZHx8dC5oYXMoYy51dWlkKXx8Yy5jb21wbGV0ZWRBdHx8Yy5kaXNtaXNzZWRBdHx8KG8ucHVzaCh7Li4uYyxub3RlTmFtZTpjLm5vdGVOYW1lfHxjLm5vdGVUaXRsZXx8Yy5ub3RlPy5uYW1lfHxpLm5hbWV8fG51bGwsbm90ZVVVSUQ6Yy5ub3RlVVVJRHx8aS51dWlkfSksbCsrKX1yZXR1cm4gb31hc3luYyBmdW5jdGlvbiBVTihlLHQsbixyKXtsZXQgbz1yP3t0YXNrRG9tYWluVVVJRDpyfTp7fTtvPXsuLi5vLGdyb3VwOiJ0YXNrTGlzdHMifTtsZXQgYT1bXTtmb3IgYXdhaXQobGV0IGMgb2YgYXdhaXQgZS5maWx0ZXJOb3RlcyhvLCJvcGVuZWQiKSlhLnB1c2goYyk7bGV0IGk9Wy4uLmFdLnJldmVyc2UoKS5zbGljZSgwLENOKTtFKGBbR3JhdmV5YXJkXSBzY2FubmluZyAke2kubGVuZ3RofSBub3RlcyBmb3IgdGFza3NgKTtsZXQgcz1hd2FpdCBGTihlLG4saSksbD1adyh0LHMpO3JldHVybiBFKGBbR3JhdmV5YXJkXSB0YXNrIGNvdW50cyBcdTIwMTQgdG90YWwgc2NvcmVkOiAke3MubGVuZ3RofSwgc2VsZWN0ZWQ6ICR7bC5sZW5ndGh9IChuZWVkICR7dH0pYCksbH1mdW5jdGlvbiAkTihlKXtsZXQgdD1OdW1iZXIoZT8uc2NvcmU/P2U/LnZpY3RvcnlWYWx1ZT8/MCk7cmV0dXJuIE51bWJlci5pc0Zpbml0ZSh0KT90OjB9ZnVuY3Rpb24gV04oZSx0KXtsZXQgbj1ITih0KSxyPW49PT1udWxsP051bWJlci5QT1NJVElWRV9JTkZJTklUWTpNYXRoLmFicyhuLWUpL0lOO3JldHVybiAkTih0KS1NYXRoLmxvZygxK3IpfWFzeW5jIGZ1bmN0aW9uIEJOKGUsdCxuKXtpZihFKCJbR3JhdmV5YXJkXSBoeWRyYXRlZFRhc2tzRnJvbVV1aWRzOiBjYWxsZWQgd2l0aCB1dWlkQ291bnQ6IixuPy5sZW5ndGgsInRhc2tFbnRyeUNvdW50OiIsdD8ubGVuZ3RoKSwhbnx8bi5sZW5ndGg9PT0wKXJldHVybltdO2xldCByPW5ldyBNYXAoKHR8fFtdKS5maWx0ZXIoYz0+Yz8udXVpZCkubWFwKGM9PltjLnV1aWQsY10pKSxvPWF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChuLm1hcChjPT5lLmdldFRhc2soYykpKSxhPTAsaT0wLHM9MCxsPW8ubWFwKChjLGQpPT57bGV0IHU9bltkXTtpZihjLnN0YXR1cz09PSJyZWplY3RlZCJ8fCFjLnZhbHVlKXJldHVybiBhKyssRSgiW0dyYXZleWFyZF0gaHlkcmF0ZWRUYXNrc0Zyb21VdWlkczogdXVpZCBub3QgZm91bmQ6Iix1KSxudWxsO2xldCBwPWMudmFsdWU7aWYocC5jb21wbGV0ZWRBdHx8cC5kaXNtaXNzZWRBdClyZXR1cm4gaSsrLEUoIltHcmF2ZXlhcmRdIGh5ZHJhdGVkVGFza3NGcm9tVXVpZHM6IHV1aWQgZmlsdGVyZWQgXHUyMDE0IGNvbXBsZXRlZEF0OiIscC5jb21wbGV0ZWRBdCwiZGlzbWlzc2VkQXQ6IixwLmRpc21pc3NlZEF0LCJ1dWlkOiIsdSksbnVsbDtzKys7bGV0IGY9ci5nZXQodSk7cmV0dXJuey4uLnAsbm90ZU5hbWU6cC5ub3RlTmFtZXx8cC5ub3RlVGl0bGV8fHAubm90ZT8ubmFtZXx8Zj8ubm90ZU5hbWV8fG51bGwsbm90ZVVVSUQ6cC5ub3RlVVVJRHx8Zj8ubm90ZVVVSUR8fG51bGx9fSkuZmlsdGVyKEJvb2xlYW4pO3JldHVybiBFKGBbR3JhdmV5YXJkXSBoeWRyYXRlZFRhc2tzRnJvbVV1aWRzOiByZXN1bHRzIFx1MjAxNCBhY2NlcHRlZD0ke3N9IG1pc3Npbmc9JHthfSBjb21wbGV0ZWRPckRpc21pc3NlZD0ke2l9IHRvdGFsPSR7bC5sZW5ndGh9YCksbH1mdW5jdGlvbiBadyhlLHQpe2lmKHQubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgbj1qTihuZXcgRGF0ZSkscj10Lm1hcCgobyxhKT0+KHsuLi5vLGdyYXZleWFyZEhldXJpc3RpY1JhbmtJbmRleDphLGdyYXZleWFyZEhldXJpc3RpY1Njb3JlOldOKG4sbyl9KSk7cmV0dXJuIHIuc29ydCgobyxhKT0+by5ncmF2ZXlhcmRIZXVyaXN0aWNTY29yZSE9PWEuZ3JhdmV5YXJkSGV1cmlzdGljU2NvcmU/YS5ncmF2ZXlhcmRIZXVyaXN0aWNTY29yZT5vLmdyYXZleWFyZEhldXJpc3RpY1Njb3JlPzE6LTE6by5ncmF2ZXlhcmRIZXVyaXN0aWNSYW5rSW5kZXgtYS5ncmF2ZXlhcmRIZXVyaXN0aWNSYW5rSW5kZXgpLHIuc2xpY2UoMCxlKS5tYXAoKHtncmF2ZXlhcmRIZXVyaXN0aWNSYW5rSW5kZXg6bywuLi5hfSk9PmEpfWZ1bmN0aW9uIEhOKGUpe2xldCB0PU51bWJlcihlPy5jcmVhdGVkQXQ/P2U/LmNyZWF0ZWQpO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIG51bGw7bGV0IG49dDwxZTEwP3QqSnc6dCxyPW5ldyBEYXRlKG4pO3JldHVybiBOdW1iZXIuaXNOYU4oci5nZXRUaW1lKCkpP251bGw6bn1mdW5jdGlvbiBqTihlKXtsZXQgdD1uZXcgRGF0ZShlKTtyZXR1cm4gdC5zZXRNb250aCh0LmdldE1vbnRoKCktRE4pLHQuZ2V0VGltZSgpfWFzeW5jIGZ1bmN0aW9uIGUwKGUsdCl7bGV0IG49TE4obmV3IERhdGUpLHI9YXdhaXQgZS5maW5kTm90ZSh7bmFtZTpuLHRhZ3M6W1JlXX0pLmNhdGNoKCgpPT5udWxsKTtpZighcj8udXVpZCl7bGV0IHM9YXdhaXQgZS5jcmVhdGVOb3RlKG4sW1JlXSx7YXJjaGl2ZTohMH0pO3I9e25hbWU6bix1dWlkOnN9LGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHIsYCMgU3VjY2Vzc2Z1bGx5IHJldGlyZWQgdGFza3MKCmApLmNhdGNoKCgpPT57fSl9bGV0IG89dC50aXRsZXx8dC5jb250ZW50fHwiVW50aXRsZWQgdGFzayIsYT1PZShuZXcgRGF0ZSksaT1gLSBbeF0gJHtvfSA8IS0tIHsicmV0aXJlZEF0IjoiJHthfSJ9IC0tPgpgO2F3YWl0IGUuaW5zZXJ0Tm90ZUNvbnRlbnQocixpLHthdEVuZDohMH0pLmNhdGNoKHM9PkUoIltHcmF2ZXlhcmRdIGFwcGVuZFRhc2tUb1JldGlyZWROb3RlIGZhaWxlZDoiLHMpKX1hc3luYyBmdW5jdGlvbiB0MChlLHQsbixyPXt9KXtsZXQgbz0hIXI/LmZvcmNlUmVmcmVzaDtFKCJbR3JhdmV5YXJkXSBsb2FkR3JhdmV5YXJkQ2FuZGlkYXRlczogc3RhcnQgXHUyMDE0IGNvdW50OiIsdCwidGFza0RvbWFpblVVSUQ6IixuLCJmb3JjZVJlZnJlc2g6IixvKTtsZXQgYT1hd2FpdCBNTihlKTtFKCJbR3JhdmV5YXJkXSBsb2FkR3JhdmV5YXJkQ2FuZGlkYXRlczogdXNpbmcgZGF0YSBub3RlOiIsYT8udXVpZCxhPy5uYW1lKTtsZXQgaT0iIjt0cnl7aT1hd2FpdCBlLmdldE5vdGVDb250ZW50KGEpLEUoIltHcmF2ZXlhcmRdIGxvYWRHcmF2ZXlhcmRDYW5kaWRhdGVzOiBmZXRjaGVkIG5vdGUgY29udGVudCwgbGVuZ3RoOiIsaT8ubGVuZ3RoPz8ibnVsbC91bmRlZmluZWQiKSxpPWl8fCIifWNhdGNoKGYpe0UoIltHcmF2ZXlhcmRdIGxvYWRHcmF2ZXlhcmRDYW5kaWRhdGVzOiBnZXROb3RlQ29udGVudCB0aHJldzoiLGYsIlx1MjAxNCB0cmVhdGluZyBhcyBlbXB0eSIpLGk9IiJ9bGV0IHM9ek4oaSk7RSgiW0dyYXZleWFyZF0gbG9hZEdyYXZleWFyZENhbmRpZGF0ZXM6IHBhcnNlZCIscy5sZW5ndGgsInJvd3MgZnJvbSBub3RlOyBkYXRlS2V5czoiLHMubWFwKGY9PmYuZGF0ZUtleSkpO2xldCBsPU9lKG5ldyBEYXRlKTtFKCJbR3JhdmV5YXJkXSBsb2FkR3JhdmV5YXJkQ2FuZGlkYXRlczogdG9kYXlLZXkgPSIsbCk7bGV0IGM9cy5maW5kKGY9PmYuZGF0ZUtleT09PWwpO2lmKEUoIltHcmF2ZXlhcmRdIGxvYWRHcmF2ZXlhcmRDYW5kaWRhdGVzOiB0b2RheVJvdyBmb3VuZDoiLCEhYyxjP2B1dWlkcz0ke2MudXVpZHMubGVuZ3RofWA6IiIpLCFvJiZjPy51dWlkcy5sZW5ndGg+MCl7RSgiW0dyYXZleWFyZF0gbG9hZEdyYXZleWFyZENhbmRpZGF0ZXM6IGNhY2hlIGhpdCBcdTIwMTQgaHlkcmF0aW5nIixjLnV1aWRzLmxlbmd0aCwidXVpZHM6IixjLnV1aWRzKTtsZXQgZj1hd2FpdCBCTihlLGMudGFza0VudHJpZXMsYy51dWlkcykseT1adyh0LGYpO2lmKEUoIltHcmF2ZXlhcmRdIGxvYWRlZCBjYWNoZWQgY2FuZGlkYXRlczoiLHkubGVuZ3RoKSx5Lmxlbmd0aD4wKXJldHVybntjYW5kaWRhdGVzOnksbm90ZUhhbmRsZTphfTtFKCJbR3JhdmV5YXJkXSBsb2FkR3JhdmV5YXJkQ2FuZGlkYXRlczogY2FjaGVkIFVVSURzIGFsbCBtaXNzaW5nIGZyb20gZG9tYWluIFx1MjAxNCBkaXNjYXJkaW5nIHN0YWxlIHRvZGF5IHJvdyBhbmQgcmVkaXNjb3ZlcmluZyIpfWVsc2UgbyYmRSgiW0dyYXZleWFyZF0gbG9hZEdyYXZleWFyZENhbmRpZGF0ZXM6IGZvcmNlUmVmcmVzaCByZXF1ZXN0ZWQgXHUyMDE0IGJ5cGFzc2luZyB0b2RheSBjYWNoZSByb3ciKTtsZXQgZD1vP3M6cy5maWx0ZXIoZj0+Zi5kYXRlS2V5IT09bCksdT1STihkKSxwPWF3YWl0IFVOKGUsdCx1LG4pO2lmKHAubGVuZ3RoPjApe2xldCBmPXAubWFwKHc9Pih7bm90ZU5hbWU6dy5ub3RlTmFtZXx8dy5ub3RlVGl0bGV8fHcubm90ZT8ubmFtZSxub3RlVVVJRDp3Lm5vdGVVVUlELHV1aWQ6dy51dWlkfSkpLHk9W3tkYXRlS2V5OmwsdGFza0VudHJpZXM6Zix1dWlkczpwLm1hcCh3PT53LnV1aWQpfSwuLi5zLmZpbHRlcih3PT53LmRhdGVLZXkhPT1sKV07YXdhaXQgZS5yZXBsYWNlTm90ZUNvbnRlbnQoYSxYdyh5KSkuY2F0Y2godz0+RSgiW0dyYXZleWFyZF0gZmFpbGVkIHRvIHBlcnNpc3QgY2FuZGlkYXRlczoiLHcpKX1yZXR1cm4gRSgiW0dyYXZleWFyZF0gZGlzY292ZXJlZCBmcmVzaCBjYW5kaWRhdGVzOiIscC5sZW5ndGgpLHtjYW5kaWRhdGVzOnAsbm90ZUhhbmRsZTphfX12YXIgc3Q9cGUoZGUoKSk7dmFyIG4wPVsiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDY5MDU5MjUzNDYtMjFiZGE0ZDMyZGY0IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzAwNzE0NTk2MDQtM2I1ZWMzYTdmZTA1IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDE3ODU4ODgwNDEtYWYzZWYyODViNDcwIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjQ4MjI3NTkwMjMtZmVkNjIyZmYyYzNiIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MTk2ODEzOTM3ODQtZDEyMDI2NzkzM2JhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzU5MjQxNTY3MzQtNDk2ZjZjYWM2ZWMxIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0OTA3MzAxNDExMDMtNmNhYzI3YWFhYjk0IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MzMwODY5NjYzNTgtNTQ4NTlkMGVkNzE2IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzIyMTQxMDM0NTEtOTM3NGJkMWM3OThlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MTQ2MDkyNDUyMjQtYWZhMDJiZmIzZmRhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Njk0NzQ5NjgwMjgtNTY2MjNmMDJlNDJlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MjY2MDQ5NjY4NDgtZDdhZGFjNDAyYmZmIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjUxNDYzNDQ0MjUtZjAwZDVmNWM4ZjA3IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0OTE1NTM4OTU5MTEtMDA1NWVjYTY0MDJkIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzA3NzA4NDEwNzItZjk3OGNmNGQwMTllIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjQ4MjMwNjM1MzAtMDhmMTBlZDFhMmRkIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Mzk4NTM5NDkxMjctZmE2NDc4MjFlYmEwIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzIzOTY5NjE2OTMtMTQyZTZlMjY5MDI3IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MzE3OTQwNjIyMzItMmE5OWE1NDMxYzZjIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDY3NzY4MTE5NTMtYjIzZDU3YmQyMWFhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDY3NDQwMzgxMzYtNDYyNzM4MzRiM2ZiIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1NzIyOTMwNzEyNzctZWYxYjNlNzYxMDQ1IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MTgwNjU0NjA0ODctM2U0MWE2Yzg0ZGM1IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzAyNDY5NzM5MTgtMjlhOTMyMjFjNDU1IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzMxMTY3NjMyNDktMmZhYWVmODFjY2RhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Mzk3OTI2NzUxMDUtNzAxZTZhNGFiNmYwIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjMzMjA3MjYyODEtNjk2YTQ4NTkyOGM3IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0OTkwMDIyMzg0NDAtZDI2NGVkZDU5NmVjIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MTA3OTg4MzE5NzEtNjYxZWIwNGIzNzM5IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDc1MjU0MjgwMzQtYjcyM2NmOTYxZDNlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDE5NzQyMzE1MzEtYzYyMjdkYjc2YjZlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NTg2NjgzODM5NzAtOGRkZDM5MjdkZWVkIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzA3NzA5MDM2NzYtNjliOTgyMDFlYTFjIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjQwMzc4NjY1NTYtNjgxMmM5ZDFjNzJlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NTUyMTg4NzM1MDktODA5NzMwNWVlMzc4IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjU5MTkyOTIyNzUtYzYwYmE0OWRhNmFlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDgzNzUyNDA1ODYtODgyNzA3ZGI4ODhiIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NTExODc1ODA0NTktNDM0OTAyNzljMGZhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NjUxMDEwNDY1MzAtNzMzOThjN2YyOGNhIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0MjE3ODk2NjUyMDktYzliMmE0MzVlM2RjIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0Nzc0MTQzNDg0NjMtYzBlYjdmMTM1OWI2IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDA1MzA4NTU2OTctYjU4NmQ4OWJhM2VlIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NTUxNTYyMTgzODgtNWU2MWI1MjY4MThiIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDc3NTI4NzUyMTUtYjI3NjFhY2IzYzVkIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NDM4OTA5MjM0MjItNzgxOWVkNDEwMWMwIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0OTQ3ODMzNjcxOTMtMTQ5MDM0YzA1ZThmIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE2MDg5NTMwMjk2MDEtN2E2ZTVlN2ZkNTQ4IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MDIwODI1NTMwNDgtZjAwOWMzNzEyOWI5IiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE1MTk5MDQ5ODEwNjMtYjBjZjQ0OGQ0NzllIiwiaHR0cHM6Ly9pbWFnZXMudW5zcGxhc2guY29tL3Bob3RvLTE0NzYyMzE2ODI4MjgtMzdlNTcxYmMxNzJmIl0scjA9WyJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwMDUzNDMxNDIwOS1hMjVkZGIyYmQ0MjkiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUwMTg1NDE0MDgwMS01MGQwMTY5ODk1MGIiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTU1OTgyNzI2MC1kYzY2ZDUyYmVmMTkiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUzMDkwODI5NTQxOC1hMTJlMzI2OTY2YmEiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTU5MjI5MDQzNTMzOC02ODJjNDAwY2I2ZjgiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUyMDk2Mjg4MDI0Ny1jZmFmNTQxYzg3MjQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0NDIxMDk3MTA0OC02MTMwY2YwYzQ2Y2YiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTUyODM2MDk4MzI3Ny0xM2Q0MDFjZGMxODYiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTYwNzEzNjEwNDA4MC03OGJiZmUyZDEyMzQiLCJodHRwczovL2ltYWdlcy51bnNwbGFzaC5jb20vcGhvdG8tMTQ0MDM0MjM1OTc0My04NGZjYjhjMjFmMjEiXSwkbD17c21hbGw6e3dpZHRoOjYwMCxoZWlnaHQ6NjAwfSxsYXJnZTp7d2lkdGg6MTkyMCxoZWlnaHQ6MTA4MH19O2Z1bmN0aW9uIG8wKGUpe2xldCB0PVN0cmluZyhlPz8iZGVmYXVsdC1zZWVkIiksbj0wO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cis9MSluPShuPDw1KS1uK3QuY2hhckNvZGVBdChyKSxufD0wO3JldHVybiBNYXRoLmFicyhuKX1mdW5jdGlvbiBhMChlPSJzbWFsbCIsdD0iZ3JhdmV5YXJkIil7bGV0IG49JGxbZV18fCRsLnNtYWxsO3JldHVybmAke3IwW28wKHQpJXIwLmxlbmd0aF19P3c9JHtuLndpZHRofSZoPSR7bi5oZWlnaHR9JmZpdD1jcm9wJmF1dG89Zm9ybWF0YH1mdW5jdGlvbiBXbChlPSJzbWFsbCIsdD0iZGVmYXVsdCIsbj0wKXtsZXQgcj0kbFtlXXx8JGwuc21hbGwsbz1gJHt0fToke259YCxhPW8wKG8pJW4wLmxlbmd0aCxpPW4wW2FdLHM9YD93PSR7ci53aWR0aH0maD0ke3IuaGVpZ2h0fSZmaXQ9Y3JvcCZhdXRvPWZvcm1hdGA7cmV0dXJuYCR7aX0ke3N9YH12YXIgVk49NSxHTj01MDAsTXI9ImdyYXZleWFyZCI7ZnVuY3Rpb24gS04oZSx0KXtyZXR1cm4gZShvZSx7aGVhZGVyQWN0aW9uczp0LGljb246Ilx1ezFGNDc1fSIsdGl0bGU6cmUoTXIpLHdpZGdldElkOk1yfSxlKCJwIix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtZW1wdHkifSwiTm8gbmVnbGVjdGVkIHRhc2tzIGZvdW5kIFx1MjAxNCBldmVyeXRoaW5nIGxvb2tzIGN1cnJlbnQhIikpfWZ1bmN0aW9uIFlOKGUsdCxuLHIpe3JldHVybiBlKG9lLHtoZWFkZXJBY3Rpb25zOm4saWNvbjoiXHV7MUY0NzV9Iix0aXRsZTpyZShNciksd2lkZ2V0SWQ6TXJ9LGUoImRpdiIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLWVycm9yIn0sZSgicCIsbnVsbCx0fHwiRmFpbGVkIHRvIGxvYWQgdGFza3MuIiksZSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtcmV0cnkiLG9uQ2xpY2s6cix0eXBlOiJidXR0b24ifSwiUmV0cnkiKSkpfWZ1bmN0aW9uIHFOKGUsdCl7cmV0dXJuIGUob2Use2hlYWRlckFjdGlvbnM6dCxpY29uOiJcdXsxRjQ3NX0iLHRpdGxlOnJlKE1yKSx3aWRnZXRJZDpNcn0sZSgicCIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLWxvYWRpbmcifSwiU2VhcmNoaW5nIGZvciBmb3Jnb3R0ZW4gdGFza3NcdTIwMjYiKSl9ZnVuY3Rpb24gUU4oZSx0LG4pe3JldHVybiBlKCJhIix7ImFyaWEtZGlzYWJsZWQiOnQ/InRydWUiOiJmYWxzZSIsY2xhc3NOYW1lOiJ3aWRnZXQtaGVhZGVyLWFjdGlvbiIsaHJlZjoiIyIsb25DbGljazpuLHRhYkluZGV4OnQ/LTE6MCx0aXRsZTp0PyJSZWZyZXNoaW5nIGdyYXZleWFyZCBjYW5kaWRhdGVzIjoiRmluZCBhIG5ldyBzZXQgb2YgZ3JhdmV5YXJkIGNhbmRpZGF0ZXMifSx0PyJcdTIxQkIgUmVmcmVzaGluZ1x1MjAyNiI6Ilx1MjFCQiBSZWZyZXNoIil9ZnVuY3Rpb24gaTAoZSl7aWYoIWU/LmNyZWF0ZWRBdClyZXR1cm4gbnVsbDtsZXQgdD1OdW1iZXIoZS5jcmVhdGVkQXQpO2lmKCFOdW1iZXIuaXNGaW5pdGUodCkpcmV0dXJuIG51bGw7bGV0IG49dDwxZTEwP3QqMWUzOnQscj1uZXcgRGF0ZShuKTtyZXR1cm4gTnVtYmVyLmlzTmFOKHIuZ2V0VGltZSgpKT9udWxsOnJ9ZnVuY3Rpb24gSk4oZSx0KXtsZXQgbj1pMChlKTtpZighbilyZXR1cm4gbnVsbDtsZXQgcj1uLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAse21vbnRoOiJzaG9ydCIseWVhcjoibnVtZXJpYyJ9KTtyZXR1cm4gdD9yOmBDcmVhdGVkICR7cn1gfWZ1bmN0aW9uIHMwKGUpe2xldCB0PU51bWJlcihlPy5zY29yZT8/ZT8udmljdG9yeVZhbHVlPz8wKTtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpP3Q6MH1mdW5jdGlvbiBYTihlKXtsZXQgdD1zMChlKTtyZXR1cm4gdDw9Mz8ibXV0ZWQiOnQ8PTU/ImNvb2wiOnQ8MTA/Indhcm0iOiJob3QifWZ1bmN0aW9uIHpwKGUpe3JldHVybmAke2U/PyIifWAucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iil9ZnVuY3Rpb24gWk4oZSx0KXtpZighTnVtYmVyLmlzRmluaXRlKHQpfHx0PD0wKXJldHVybiAwO2xldCBuPW5ldyBEYXRlLG89YCR7YCR7bi5nZXRGdWxsWWVhcigpfToke24uZ2V0TW9udGgoKX06JHtuLmdldERhdGUoKX06JHtuLmdldEhvdXJzKCl9YH06JHtlPz8iIn1gLGE9MDtmb3IobGV0IGk9MDtpPG8ubGVuZ3RoO2krPTEpYT1hKjMxK28uY2hhckNvZGVBdChpKT4+PjA7cmV0dXJuIGEldH1mdW5jdGlvbiBlRChlKXtsZXQgdD1pMChlKSxuPXMwKGUpLHI9TnVtYmVyLmlzSW50ZWdlcihuKT9gJHtufWA6bi50b0ZpeGVkKDIpLnJlcGxhY2UoL1wuPzArJC8sIiIpLG89ZT8ubm90ZU5hbWV8fGU/Lm5vdGVUaXRsZXx8ZT8ubm90ZT8ubmFtZXx8IlVua25vd24gbm90ZSIsYT1YTihlKSxpPXQ/dC50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHtkYXRlU3R5bGU6Im1lZGl1bSJ9KToiVW5rbm93biI7cmV0dXJuYAogICAgPGRpdiBjbGFzcz0iZ3JhdmV5YXJkLXRhc2stdG9vbHRpcCIgcm9sZT0idG9vbHRpcCI+CiAgICAgIDxkaXYgY2xhc3M9ImdyYXZleWFyZC10YXNrLXRvb2x0aXAtbWV0YSI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImdyYXZleWFyZC10YXNrLXRvb2x0aXAtbm90ZSI+JHt6cChvKX08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImdyYXZleWFyZC10YXNrLXRvb2x0aXAtY3JlYXRlZCI+Q3JlYXRlZCAke3pwKGkpfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImdyYXZleWFyZC10YXNrLXRvb2x0aXAtY29udGVudCI+CiAgICAgICAgJHtwbyhlLmNvbnRlbnR8fGUudGl0bGV8fCJVbnRpdGxlZCB0YXNrIil9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJncmF2ZXlhcmQtdGFzay10b29sdGlwLWZvb3RlciI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImdyYXZleWFyZC10YXNrLXNjb3JlIGdyYXZleWFyZC10YXNrLXNjb3JlLS0ke2F9Ij4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJncmF2ZXlhcmQtdGFzay1zY29yZS1kb3QiIGFyaWEtaGlkZGVuPSJ0cnVlIj48L3NwYW4+CiAgICAgICAgICA8c3Bhbj5TY29yZSAke3pwKHIpfTwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgYH1mdW5jdGlvbiB0RChlKXtsZXQgdD1lLmN1cnJlbnRUYXJnZXQ/LmNsb3Nlc3Q/LigiLmdyYXZleWFyZC10YXNrLWl0ZW0iKTtpZighdHx8dHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuO2xldCBuPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IW4ud2lkdGh8fCFuLmhlaWdodHx8Umwoe29yaWdpbjp7eDoobi5sZWZ0K24ud2lkdGgvMikvd2luZG93LmlubmVyV2lkdGgseToobi50b3Arbi5oZWlnaHQvMikvd2luZG93LmlubmVySGVpZ2h0fSxwYXJ0aWNsZUNvdW50OjgwLHNwcmVhZDo3MCxzdGFydFZlbG9jaXR5OjM4fSl9ZnVuY3Rpb24gbkQoZSx0LG4scixvLGEsaSxzKXtsZXQgbD1zLnRpdGxlfHxzLmNvbnRlbnR8fCJVbnRpdGxlZCB0YXNrIixjPUpOKHMsbiksZD1gZ3JhdmV5YXJkLXRhc2staXRlbSR7dD8iIGdyYXZleWFyZC10YXNrLWl0ZW0tLWRpc21pc3NpbmciOiIifWAsdT1bIkRpc21pc3MiLCJTZW5kIHRvIGEgZmFybSB1cHN0YXRlIiwiUmV0aXJlIiwiTGV0IGdvIiwiRXhpbGUiLCJCdXJ5IiwiU2VuZCBvZmYiLCJSZWxlYXNlIGludG8gdGhlIHdpbGQiLCJQdXQgb3V0IHRvIHBhc3R1cmUiLCJMYXkgdG8gcmVzdCIsIkRlY29tbWlzc2lvbiIsIlJlbGVhc2UgdG8gdGhlIGdyZWF0IGJleW9uZCIsIlNlbmQgdG8gdGhlIGV0ZXJuYWwgcmVzdCIsIkEgc29sZW1uIGZhcmV3ZWxsIiwiUGF5IGEgZmluYWwgdHJpYnV0ZSIsIlNlbmQgdG8gdGhlIGhlcmVhZnRlciJdLHA9dVtaTihyLHUubGVuZ3RoKV07cmV0dXJuIGUoImxpIix7a2V5OnMudXVpZCxjbGFzc05hbWU6ZH0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtdGFzay1oZWFkZXIifSxlKCJkaXYiLHtjbGFzc05hbWU6ImdyYXZleWFyZC10YXNrLXRpdGxlLXdyYXAifSxlKGhpLHtjb250ZW50OmVEKHMpLGRlbGF5OltHTiwwXSxpbnRlcmFjdGl2ZTohMCxtYXhXaWR0aDpuPzI4MDozNDAsb25TaG93bjpmPT5pYShmPy5wb3BwZXIpLHBsYWNlbWVudDoiYm90dG9tLXN0YXJ0In0sZSgic3BhbiIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLXRhc2stdGl0bGUiLGlkOmBncmF2ZXlhcmQtdGl0bGUtJHtzLnV1aWR9YCx0YWJJbmRleDowfSxsKSkpLGM/ZSgic3BhbiIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLXRhc2stYWdlIn0sYyk6bnVsbCksZSgiZGl2Iix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtdGFzay1hY3Rpb25zIn0sZSgiYSIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLXRhc2stYWN0aW9uIGdyYXZleWFyZC10YXNrLWFjdGlvbi0tc2VuZCIsaHJlZjoiIyIsb25DbGljazpmPT57Zi5wcmV2ZW50RGVmYXVsdCgpLGEoZixzKX0sdGl0bGU6IkRpc21pc3MgdGhpcyB0YXNrIFx1MjAxNCByZW1vdmVzIGl0IGZyb20geW91ciB0YXNrIGRvbWFpbiBhbmQgcGxhY2VzIGl0IGluIGFuIGFyY2hpdmVkIG5vdGUgeW91IGNhbiByZXZpc2l0IGxhdGVyIGlmIGRlc2lyZWQifSxgXHV7MUY1RDF9XHVGRTBGICR7cH1gKSxlKCJhIix7Y2xhc3NOYW1lOiJncmF2ZXlhcmQtdGFzay1hY3Rpb24gZ3JhdmV5YXJkLXRhc2stYWN0aW9uLS1rZWVwIixocmVmOiIjIixvbkNsaWNrOmY9PntmLnByZXZlbnREZWZhdWx0KCksaShzKX0sdGl0bGU6IlByZXNlcnZlIHRoaXMgdGFzayBcdTIwMTQgcmVtb3ZlIGl0IGZyb20gdGhpcyBsaXN0IHdpdGhvdXQgZGlzbWlzc2luZyBpdCJ9LCJcdXsxRjlGMn0gS2VlcCIpLGUoImEiLHtjbGFzc05hbWU6ImdyYXZleWFyZC10YXNrLWFjdGlvbiBncmF2ZXlhcmQtdGFzay1hY3Rpb24tLW5vdGUiLGhyZWY6IiMiLG9uQ2xpY2s6Zj0+e2YucHJldmVudERlZmF1bHQoKSxvKHMpfSx0aXRsZToiT3BlbiB0aGUgbm90ZSB3aGVyZSB0aGlzIHRhc2sgbGl2ZXMifSwiXHV7MUY0RDN9IE5vdGUiKSkpfWZ1bmN0aW9uIHJEKGUsdCxuLHIsbyxhLGkscyxsLGMpe3JldHVybiB0KG9lLHtoZWFkZXJBY3Rpb25zOm4saWNvbjoiXHV7MUY0NzV9Iix0aXRsZTpyZShNciksd2lkZ2V0SWQ6TXJ9LHQoImRpdiIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLW1lYWRvdy13cmFwcGVyIn0sdCgiaW1nIix7YWx0OiIiLGNsYXNzTmFtZToiZ3JhdmV5YXJkLW1lYWRvdy1iZyIsc3JjOmEsc3R5bGU6e29wYWNpdHk6b319KSx0KCJ1bCIse2NsYXNzTmFtZToiZ3JhdmV5YXJkLXRhc2stbGlzdCJ9LC4uLmMubWFwKChkLHUpPT5uRCh0LGUuaGFzKGQudXVpZCkscix1LGkscyxsLGQpKSkpKX1mdW5jdGlvbiBGcCh7YXBwOmUsZ3JpZEhlaWdodFNpemU6dD0xLGdyaWRXaWR0aFNpemU6bj0yLHRhc2tEb21haW5VVUlEOnJ9KXtsZXQgbz1zdC5jcmVhdGVFbGVtZW50LGE9KHR8fDEpKlZOLGk9TnVtYmVyKG4pPT09MSxbcyxsXT0oMCxzdC51c2VTdGF0ZSkoKCk9Pm5ldyBTZXQpLFtjLGRdPSgwLHN0LnVzZVN0YXRlKShudWxsKSxbdSxwXT0oMCxzdC51c2VTdGF0ZSkoITApLFtmLHldPSgwLHN0LnVzZVN0YXRlKShudWxsKSx3PSgwLHN0LnVzZU1lbW8pKCgpPT5hMCgic21hbGwiLG5ldyBEYXRlKCkudG9EYXRlU3RyaW5nKCkpLFtdKSxiPXMuc2l6ZT4wPzE6MCx2PSgwLHN0LnVzZUNhbGxiYWNrKShhc3luYyhfPXt9KT0+e2xldCBEPSEhXz8uZm9yY2VSZWZyZXNoO0UoIltHcmF2ZXlhcmRdIGxvYWRDYW5kaWRhdGVzIGZpcmVkLCB0YXNrRG9tYWluVVVJRDoiLHIsImZvcmNlUmVmcmVzaDoiLEQpLGQobnVsbCksRCYmbChuZXcgU2V0KSxwKCEwKTt0cnl7bGV0e2NhbmRpZGF0ZXM6QX09YXdhaXQgdDAoZSxhLHIse2ZvcmNlUmVmcmVzaDpEfSksVD1BLnNsaWNlKDAsYSk7eShUKX1jYXRjaChBKXtFKCJbR3JhdmV5YXJkXSBsb2FkIGZhaWxlZDoiLEEpLGQoQS5tZXNzYWdlfHwiRmFpbGVkIHRvIGxvYWQgdGFza3MiKX1maW5hbGx5e3AoITEpfX0sW2UsYSxyXSk7KDAsc3QudXNlRWZmZWN0KSgoKT0+e3YoKX0sW3ZdKTtsZXQgaD0oMCxzdC51c2VDYWxsYmFjaykoXz0+e18ucHJldmVudERlZmF1bHQoKSwhdSYmdih7Zm9yY2VSZWZyZXNoOiEwfSl9LFt2LHVdKSxnPSgwLHN0LnVzZUNhbGxiYWNrKShhc3luYyhfLEQpPT57dEQoXyksbChBPT57bGV0IFQ9bmV3IFNldChBKTtyZXR1cm4gVC5hZGQoRC51dWlkKSxUfSksZS51cGRhdGVUYXNrKEQudXVpZCx7ZGlzbWlzc2VkQXQ6TWF0aC5mbG9vcihEYXRlLm5vdygpLzFlMyl9KS5jYXRjaChBPT5FKCJbR3JhdmV5YXJkXSB1cGRhdGVUYXNrIGZhaWxlZDoiLEEpKSxlMChlLEQpLmNhdGNoKEE9PkUoIltHcmF2ZXlhcmRdIGFwcGVuZFRhc2tUb1JldGlyZWROb3RlIGZhaWxlZDoiLEEpKX0sW2VdKSxtPSgwLHN0LnVzZUNhbGxiYWNrKShfPT57bChEPT57bGV0IEE9bmV3IFNldChEKTtyZXR1cm4gQS5hZGQoXy51dWlkKSxBfSl9LFtdKSx4PSgwLHN0LnVzZUNhbGxiYWNrKShhc3luYyBfPT57Xz8ubm90ZVVVSUQmJmF3YWl0IGUubmF2aWdhdGUoYGh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvJHtfLm5vdGVVVUlEfWApfSxbZV0pLFM9UU4obyx1LGgpO3JldHVybiB1P3FOKG8sUyk6Yz9ZTihvLGMsUyx2KTpmPT09bnVsbHx8Zi5sZW5ndGg9PT0wJiZzLnNpemU9PT0wP0tOKG8sUyk6ckQocyxvLFMsaSxiLHcseCxnLG0sZil9dmFyIEJsPXBlKGRlKCkpO3ZhciBVcD0ibGF5b3V0LXBpY2tlciI7YXN5bmMgZnVuY3Rpb24gJHAoe2FwcDplLGlzUmVzZXQ6dCxvbkxheW91dFBlcnNpc3Q6bixvblNlbGVjdGVkUHJvZmlsZUNoYW5nZTpyLHByb2ZpbGVJZDpvLHNpemluZzphLHdpZGdldElkczppfSl7YXdhaXQgbihpLHQsYSksbyE9bnVsbD8oZS5zZXRTZXR0aW5nKEcuU0VMRUNURURfTEFZT1VUX1BST0ZJTEUsbykscihvKSk6bz09PW51bGwmJihlLnNldFNldHRpbmcoRy5TRUxFQ1RFRF9MQVlPVVRfUFJPRklMRSwiIikscihudWxsKSl9ZnVuY3Rpb24gb0QoZSx0LG4scixvKXtsZXQgYT1yPT09dC5pZCxpPSEhcixzPWE/IkFwcGx5aW5nXHUyMDI2IjpvPyJBcHBseSI6IkFwcGx5IFx1MjAxNCByZXBsYWNlcyBhbGwgd2lkZ2V0cyBcdTIxOTIiO3JldHVybiBlKCJkaXYiLHtrZXk6dC5pZCxjbGFzc05hbWU6ImxheW91dC1waWNrZXItcHJvZmlsZSJ9LGUoImJ1dHRvbiIse2NsYXNzTmFtZTpgbGF5b3V0LXBpY2tlci1wcm9maWxlLWJ1dHRvbiR7YT8iIGxheW91dC1waWNrZXItcHJvZmlsZS1idXR0b24tLWFwcGx5aW5nIjoiIn0ke28/IiBsYXlvdXQtcGlja2VyLXByb2ZpbGUtYnV0dG9uLS1jdXJyZW50IjoiIn1gLGRpc2FibGVkOmksb25DbGljazooKT0+bih0KSx0eXBlOiJidXR0b24ifSxlKCJkaXYiLHtjbGFzc05hbWU6ImxheW91dC1waWNrZXItcHJvZmlsZS1oZWFkZXIifSxlKCJzcGFuIix7Y2xhc3NOYW1lOiJsYXlvdXQtcGlja2VyLXByb2ZpbGUtaWNvbiIsImFyaWEtaGlkZGVuIjoidHJ1ZSJ9LHQuaWNvbiksZSgic3BhbiIse2NsYXNzTmFtZToibGF5b3V0LXBpY2tlci1wcm9maWxlLW5hbWUifSx0Lm5hbWUpLGUoInNwYW4iLHtjbGFzc05hbWU6YGxheW91dC1waWNrZXItcHJvZmlsZS1hY3Rpb24ke28/IiBsYXlvdXQtcGlja2VyLXByb2ZpbGUtYWN0aW9uLS1jdXJyZW50IjoiIn1gfSxzKSksZSgicCIse2NsYXNzTmFtZToibGF5b3V0LXBpY2tlci1wcm9maWxlLWRlc2NyaXB0aW9uIn0sdC5kZXNjcmlwdGlvbikpKX1mdW5jdGlvbiBXcCh7YXBwOmUsY3VycmVudExheW91dDp0LG9uTGF5b3V0QXBwbHk6bixvblNlbGVjdGVkUHJvZmlsZUNoYW5nZTpyfSl7bGV0IG89QmwuY3JlYXRlRWxlbWVudCxbYSxpXT0oMCxCbC51c2VTdGF0ZSkobnVsbCkscz1zYS5tYXAocD0+QnYodCxwKSksbD1zLnNvbWUoQm9vbGVhbiksYz1hc3luYyBwPT57aWYoIWEpe2kocC5pZCk7dHJ5e2xldCBmPXAud2lkZ2V0cy5tYXAodz0+dy53aWRnZXRJZCkseT1OaShwKTthd2FpdCAkcCh7YXBwOmUsaXNSZXNldDohMCxvbkxheW91dFBlcnNpc3Q6bixvblNlbGVjdGVkUHJvZmlsZUNoYW5nZTpyLHByb2ZpbGVJZDpwLmlkLHNpemluZzp5LHdpZGdldElkczpmfSl9ZmluYWxseXtpKG51bGwpfX19LHU9bygic3BhbiIse2NsYXNzTmFtZToid2lkZ2V0LWhlYWRlci1hY3Rpb24iLG9uQ2xpY2s6KCk9PntsZXQgZj0oQXJyYXkuaXNBcnJheSh0KT90OltdKS5maWx0ZXIoeT0+eS53aWRnZXRJZCE9PVVwKS5tYXAoeT0+eS53aWRnZXRJZCk7bihmLCExLG51bGwpfX0sIlx1MjcxNSBEaXNtaXNzIik7cmV0dXJuIG8ob2Use2hlYWRlckFjdGlvbnM6dSxpY29uOiJcdXsxRjVDMn1cdUZFMEYiLHRpdGxlOnJlKFVwKSx3aWRnZXRJZDpVcH0sbD9udWxsOm8oInAiLHtjbGFzc05hbWU6ImxheW91dC1waWNrZXItd2FybmluZyJ9LCJcdTI2QTBcdUZFMEYgQ2xpY2tpbmcgYSBwcm9maWxlIHJlb3JkZXJzIGFsbCBkYXNoYm9hcmQgd2lkZ2V0cy4iKSxvKCJkaXYiLHtjbGFzc05hbWU6ImxheW91dC1waWNrZXItcHJvZmlsZXMifSwuLi5zYS5tYXAoKHAsZik9Pm9EKG8scCxjLGEsc1tmXSkpKSl9dmFyIGJlPXBlKGRlKCkpO3ZhciBsMD0iZGF5LXNrZXRjaCIsQnA9Nix1MD0yMSxhRD0xZTQsaUQ9MzAwLFByPUFycmF5LmZyb20oe2xlbmd0aDp1MC1CcCsxfSwoZSx0KT0+QnArdCk7ZnVuY3Rpb24gZDAoZSl7cmV0dXJuIGUudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIse3dlZWtkYXk6ImxvbmciLG1vbnRoOiJsb25nIixkYXk6Im51bWVyaWMiLHllYXI6Im51bWVyaWMifSl9ZnVuY3Rpb24gc0QoZSl7cmV0dXJuYERheSBTa2V0Y2ggJHtkMChlKX1gfWZ1bmN0aW9uIGxEKGUpe2xldCB0PXt9LG49bmV3IFNldDtpZighZSlyZXR1cm57ZW50cmllczp0LGh1bWFuRWRpdGVkSG91cnM6bn07Zm9yKGxldCByIG9mIGUuc3BsaXQoYApgKSl7bGV0IG89ci5tYXRjaCgvXmh1bWFuLWVkaXRlZDpccyooW1xkLFxzXSopL2kpO2lmKG8pe29bMV0uc3BsaXQoIiwiKS5mb3JFYWNoKGM9PntsZXQgZD1wYXJzZUludChjLnRyaW0oKSwxMCk7aXNOYU4oZCl8fG4uYWRkKGQpfSk7Y29udGludWV9bGV0IGE9ci5tYXRjaCgvXihcZHsxLDJ9KD86YW18cG0pKTpccyooLiopL2kpO2lmKCFhKWNvbnRpbnVlO2xldCBpPWFbMV0udG9Mb3dlckNhc2UoKSxzPWFbMl0ucmVwbGFjZSgvXFwrJC8sIiIpLnRyaW0oKSxsPWNEKGkpO2whPT1udWxsJiZQci5pbmNsdWRlcyhsKSYmKHRbbF09cyl9cmV0dXJue2VudHJpZXM6dCxodW1hbkVkaXRlZEhvdXJzOm59fWZ1bmN0aW9uIGNEKGUpe2xldCB0PWUubWF0Y2goL14oXGR7MSwyfSkoYW18cG0pJC9pKTtpZighdClyZXR1cm4gbnVsbDtsZXQgbj1wYXJzZUludCh0WzFdLDEwKSxyPXRbMl0udG9Mb3dlckNhc2UoKTtyZXR1cm4gcj09PSJhbSImJm49PT0xMj9uPTA6cj09PSJwbSImJm4hPT0xMiYmKG4rPTEyKSxufWZ1bmN0aW9uIHVEKGUsdCl7bGV0IG49UHIubWFwKHI9PntsZXQgbz1yYShyKSxhPWVbcl18fCIiO3JldHVybmAke299OiAke2F9YH0pO2lmKHQuc2l6ZT4wKXtsZXQgcj1bLi4udF0uc29ydCgobyxhKT0+by1hKTtuLnB1c2goYGh1bWFuLWVkaXRlZDogJHtyLmpvaW4oIiwiKX1gKX1yZXR1cm4gbi5qb2luKGAKYCl9ZnVuY3Rpb24gSGwoKXtsZXQgZT17fTtyZXR1cm4gUHIuZm9yRWFjaCh0PT57ZVt0XT0iIn0pLGV9ZnVuY3Rpb24gYzAoZSl7cmV0dXJuIGU/ZSBpbnN0YW5jZW9mIERhdGU/ZS5nZXRUaW1lKCk6dHlwZW9mIGU9PSJudW1iZXIiP2U8MWUxMD9lKjFlMzplOm51bGw6bnVsbH1mdW5jdGlvbiBkRChlKXtsZXQgdD1jMChlPy5zdGFydEF0KTtpZighdClyZXR1cm5bXTtsZXQgbj1uZXcgRGF0ZSh0KS5nZXRIb3VycygpLHI9W25dLG89YzAoZT8uZW5kQXQpO2lmKCFvfHxvPD10KXJldHVybiByO2xldCBhPU1hdGguZmxvb3IoKG8tdCkvKDYwKjYwKjFlMykpO2ZvcihsZXQgaT0xO2k8YTtpKz0xKXIucHVzaChuK2kpO3JldHVybiByfWZ1bmN0aW9uIHBEKGUpe2lmKCFlPy5zdGFydHx8IShlLnN0YXJ0IGluc3RhbmNlb2YgRGF0ZSl8fGUuYWxsRGF5KXJldHVybltdO2xldCB0PWUuc3RhcnQuZ2V0SG91cnMoKTtpZighZS5lbmR8fCEoZS5lbmQgaW5zdGFuY2VvZiBEYXRlKXx8ZS5lbmQ8PWUuc3RhcnQpcmV0dXJuW3RdO2xldCBuPWUuZW5kLmdldEhvdXJzKCkrKGUuZW5kLmdldE1pbnV0ZXMoKT4wPzE6MCkscj1bXTtmb3IobGV0IG89dDtvPG47bysrKXIucHVzaChvKTtyZXR1cm4gci5sZW5ndGg+MD9yOlt0XX1mdW5jdGlvbiBmRChlKXtsZXQgdD0oZT8uY29udGVudHx8IiIpLnNwbGl0KGAKYClbMF07cmV0dXJuIE92KHQpfWZ1bmN0aW9uIG1EKGUsdCl7cmV0dXJuIHQhPT1udWxsJiZKU09OLnN0cmluZ2lmeShlKSE9PUpTT04uc3RyaW5naWZ5KHQpfWZ1bmN0aW9uIGhEKGUsdCxuKXtsZXQgcj17Li4uZX07cmV0dXJuIHQuZm9yRWFjaChvPT57bGV0IGE9ZkQobyk7YSYmZEQobykuZm9yRWFjaChpPT57UHIuaW5jbHVkZXMoaSkmJiFyW2ldJiYhbi5oYXMoaSkmJihyW2ldPWEpfSl9KSxyfWZ1bmN0aW9uIGdEKGUsdCxuLHIpe2lmKCFBcnJheS5pc0FycmF5KHQpfHx0Lmxlbmd0aD09PTApcmV0dXJuIGU7bGV0IG89T2UobiksYT17Li4uZX07cmV0dXJuIHQuZm9yRWFjaChpPT57IWk/LnRpdGxlfHxpLmFsbERheXx8IShpLnN0YXJ0IGluc3RhbmNlb2YgRGF0ZSl8fE9lKGkuc3RhcnQpIT09b3x8cEQoaSkuZm9yRWFjaChzPT57UHIuaW5jbHVkZXMocykmJiFhW3NdJiYhci5oYXMocykmJihhW3NdPWkudGl0bGUpfSl9KSxhfWZ1bmN0aW9uIHlEKHthcHA6ZSxub3RlTmFtZTp0fSl7bGV0W24scl09KDAsYmUudXNlU3RhdGUpKEhsKSxbbyxhXT0oMCxiZS51c2VTdGF0ZSkoKCk9Pm5ldyBTZXQpLFtpLHNdPSgwLGJlLnVzZVN0YXRlKSghMCksW2wsY109KDAsYmUudXNlU3RhdGUpKG51bGwpLFtkLHVdPSgwLGJlLnVzZVN0YXRlKShudWxsKSxwPSgwLGJlLnVzZVJlZikobnVsbCksZj0oMCxiZS51c2VSZWYpKG4pLHk9KDAsYmUudXNlUmVmKShvKTtmLmN1cnJlbnQ9bix5LmN1cnJlbnQ9bztsZXQgdz0oMCxiZS51c2VDYWxsYmFjaykoYXN5bmMoaCxnKT0+e2lmKCFlKXJldHVybjtsZXQgbT11RChoLGcpO3RyeXtsZXQgeD1sO3h8fCh4PShhd2FpdCBlLmZpbmROb3RlKHtuYW1lOnR9KSk/LnV1aWR8fGF3YWl0IGUuY3JlYXRlTm90ZSh0LFtSZV0pLGMoeCkpLGF3YWl0IGUucmVwbGFjZU5vdGVDb250ZW50KHt1dWlkOnh9LG0pLHUoey4uLmh9KSxFKGBbRGF5U2tldGNoXSBwZXJzaXN0ZWQgJHt0fWApfWNhdGNoKHgpe0UoIltEYXlTa2V0Y2hdIHNhdmUgZmFpbGVkIix4KX19LFtlLHQsbF0pLGI9KDAsYmUudXNlQ2FsbGJhY2spKChoPWFEKT0+e3AuY3VycmVudCYmY2xlYXJUaW1lb3V0KHAuY3VycmVudCkscC5jdXJyZW50PXNldFRpbWVvdXQoKCk9Pnt3KGYuY3VycmVudCx5LmN1cnJlbnQpfSxoKX0sW3ddKSx2PSgwLGJlLnVzZUNhbGxiYWNrKSgoKT0+e3AuY3VycmVudCYmY2xlYXJUaW1lb3V0KHAuY3VycmVudCksdyhmLmN1cnJlbnQseS5jdXJyZW50KX0sW3ddKTtyZXR1cm4oMCxiZS51c2VFZmZlY3QpKCgpPT57bGV0IGg9ITE7cmV0dXJuKGFzeW5jKCk9PntzKCEwKTt0cnl7bGV0IGc9YXdhaXQgZS5maW5kTm90ZSh7bmFtZTp0fSk7aWYoaClyZXR1cm47aWYoZz8udXVpZCl7YyhnLnV1aWQpO2xldCBtPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6Zy51dWlkfSk7aWYoaClyZXR1cm47bGV0e2VudHJpZXM6eCxodW1hbkVkaXRlZEhvdXJzOlN9PWxEKG0pLF89SGwoKTtTLmZvckVhY2goRD0+e3hbRF0hPT12b2lkIDAmJihfW0RdPXhbRF0pfSkscihfKSxhKFMpLHUoey4uLl99KX1lbHNle2xldCBtPUhsKCk7cihtKSxhKG5ldyBTZXQpLHUobSl9fWNhdGNoKGcpe2lmKEUoIltEYXlTa2V0Y2hdIGxvYWQgZmFpbGVkIixnKSwhaCl7bGV0IG09SGwoKTtyKG0pLGEobmV3IFNldCksdShtKX19ZmluYWxseXtofHxzKCExKX19KSgpLCgpPT57aD0hMH19LFtlLHRdKSwoMCxiZS51c2VFZmZlY3QpKCgpPT4oKT0+e3AuY3VycmVudCYmY2xlYXJUaW1lb3V0KHAuY3VycmVudCl9LFtdKSx7ZW50cmllczpuLGh1bWFuRWRpdGVkSG91cnM6byxpc0RpcnR5Om1EKG4sZCksbG9hZGluZzppLHNhdmVOb3c6dixzY2hlZHVsZVNhdmU6YixzZXRFbnRyaWVzOnIsc2V0SHVtYW5FZGl0ZWRIb3VyczphfX1mdW5jdGlvbiB2RCh7YWdlbmRhVGFza3M6ZSxjdXJyZW50RGF0ZTp0LGh1bWFuRWRpdGVkSG91cnM6bixsb2FkaW5nOnIsc2V0RW50cmllczpvfSl7KDAsYmUudXNlRWZmZWN0KSgoKT0+e2lmKCFlfHwhdHx8cilyZXR1cm47bGV0IGE9T2UodCksaT1lW2FdfHxbXTtpLmxlbmd0aCE9PTAmJm8ocz0+e2xldCBsPWhEKHMsaSxuKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobCk9PT1KU09OLnN0cmluZ2lmeShzKT9zOmx9KX0sW2UsdCxuLHIsb10pfWZ1bmN0aW9uIHdEKHtjYWxlbmRhckV2ZW50czplLGN1cnJlbnREYXRlOnQsaHVtYW5FZGl0ZWRIb3VyczpuLGxvYWRpbmc6cixzZXRFbnRyaWVzOm99KXsoMCxiZS51c2VFZmZlY3QpKCgpPT57IWV8fCF0fHxyfHxvKGE9PntsZXQgaT1nRChhLGUsdCxuKTtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaSk9PT1KU09OLnN0cmluZ2lmeShhKT9hOml9KX0sW2UsdCxuLHIsb10pfWZ1bmN0aW9uIGJEKGUsdCl7aWYoIWUpcmV0dXJuIDA7bGV0IG49ZS5xdWVyeVNlbGVjdG9yKGBbZGF0YS1ob3VyPSIke3R9Il1gKTtyZXR1cm4gbj9NYXRoLm1heCgwLG4ub2Zmc2V0VG9wLShlLmNsaWVudEhlaWdodC1uLmNsaWVudEhlaWdodCkvMik6MH1mdW5jdGlvbiBrRCh7Y3VycmVudERhdGU6ZSxsb2FkaW5nOnQsbm90ZWJvb2tSZWY6bn0pe2xldCByPSgwLGJlLnVzZVJlZikobnVsbCksbz0oMCxiZS51c2VSZWYpKG51bGwpOygwLGJlLnVzZUVmZmVjdCkoKCk9PntsZXQgYT1PZShlKTtpZighYSlyZXR1cm47aWYodCl7ci5jdXJyZW50PWE7cmV0dXJufWlmKHIuY3VycmVudCE9PWF8fG8uY3VycmVudD09PWEpcmV0dXJuO2xldCBpPXNldFRpbWVvdXQoKCk9PntsZXQgcz1uLmN1cnJlbnQ7aWYoIXMpcmV0dXJuO2xldCBsPU1hdGgubWluKHUwLE1hdGgubWF4KEJwLG5ldyBEYXRlKCkuZ2V0SG91cnMoKSkpO3Muc2Nyb2xsVG9wPWJEKHMsbCksci5jdXJyZW50PW51bGwsby5jdXJyZW50PWF9LDApO3JldHVybigpPT5jbGVhclRpbWVvdXQoaSl9LFtlLHQsbl0pfWZ1bmN0aW9uIHhEKCl7bGV0IGU9KDAsYmUudXNlUmVmKSh7fSksdD0oMCxiZS51c2VDYWxsYmFjaykoKHIsbyk9PntvP2UuY3VycmVudFtyXT1vOmRlbGV0ZSBlLmN1cnJlbnRbcl19LFtdKTtyZXR1cm57aGFuZGxlSW5wdXRLZXlEb3duOigwLGJlLnVzZUNhbGxiYWNrKSgocixvKT0+e2lmKG8ua2V5IT09IkFycm93RG93biImJm8ua2V5IT09IkFycm93VXAiKXJldHVybjtpZihvLnByZXZlbnREZWZhdWx0KCksby5zaGlmdEtleSl7bGV0IHc9by5jdXJyZW50VGFyZ2V0LGI9dy52YWx1ZS5sZW5ndGg7by5rZXk9PT0iQXJyb3dVcCI/dy5zZXRTZWxlY3Rpb25SYW5nZSgwLGIsImJhY2t3YXJkIik6dy5zZXRTZWxlY3Rpb25SYW5nZSgwLGIsImZvcndhcmQiKTtyZXR1cm59bGV0IGE9UHIuaW5kZXhPZihyKTtpZihhPT09LTEpcmV0dXJuO2xldCBpPW8ua2V5PT09IkFycm93RG93biI/MTotMSxzPVByW2EraV07aWYoIXMpcmV0dXJuO2xldCBsPW8uY3VycmVudFRhcmdldCxjPWUuY3VycmVudFtzXTtpZighYylyZXR1cm47bGV0IGQ9bC5zZWxlY3Rpb25TdGFydCx1PWwuc2VsZWN0aW9uRW5kLHA9Yy52YWx1ZS5sZW5ndGgsZj1kPT09bnVsbD9wOk1hdGgubWluKGQscCkseT11PT09bnVsbD9mOk1hdGgubWluKHUscCk7Yy5mb2N1cygpLGMuc2V0U2VsZWN0aW9uUmFuZ2UoZix5KX0sW10pLHNldElucHV0UmVmOnR9fWZ1bmN0aW9uIFNEKHtlbnRyaWVzOmUsaDp0LGhhbmRsZUJsdXI6bixoYW5kbGVJbnB1dENoYW5nZTpyLGhhbmRsZUlucHV0S2V5RG93bjpvLGhvdXI6YSxzZXRJbnB1dFJlZjppLHRpbWVGb3JtYXQ6c30pe3JldHVybiB0KCJkaXYiLHtrZXk6YSxjbGFzc05hbWU6ImRheS1za2V0Y2gtbGluZSIsImRhdGEtaG91ciI6YX0sdCgic3BhbiIse2NsYXNzTmFtZToiZGF5LXNrZXRjaC1ob3VyLWxhYmVsIn0scmEoYSxzKSksdCgiaW5wdXQiLHt0eXBlOiJ0ZXh0IixjbGFzc05hbWU6ImRheS1za2V0Y2gtaW5wdXQiLHZhbHVlOmVbYV18fCIiLHJlZjpsPT5pKGEsbCksb25DaGFuZ2U6bD0+cihhLGwudGFyZ2V0LnZhbHVlKSxvbktleURvd246bD0+byhhLGwpLG9uQmx1cjpuLHBsYWNlaG9sZGVyOiIiLCJhcmlhLWxhYmVsIjpgJHtyYShhLHMpfSBlbnRyeWB9KSl9ZnVuY3Rpb24gRUQoZSx0LG4pe3JldHVybiBlKCJidXR0b24iLHtjbGFzc05hbWU6YGRheS1za2V0Y2gtc2F2ZS1idG4ke3Q/IiI6IiBkYXktc2tldGNoLXNhdmUtYnRuLS1kaXNhYmxlZCJ9YCxkaXNhYmxlZDohdCxvbkNsaWNrOm4sdGl0bGU6dD8iU2F2ZSBjaGFuZ2VzIjoiTm8gdW5zYXZlZCBjaGFuZ2VzIn0sdD8iU2F2ZSI6IlNhdmVkIil9ZnVuY3Rpb24gSHAoe2FnZW5kYVRhc2tzOmUsYXBwOnQsY2FsZW5kYXJFdmVudHM6bixjdXJyZW50RGF0ZTpyLHRpbWVGb3JtYXQ6b30pe2xldCBhPWJlLmNyZWF0ZUVsZW1lbnQsaT0oMCxiZS51c2VSZWYpKG51bGwpLHM9VmUociksbD1zRChzKSx7aGFuZGxlSW5wdXRLZXlEb3duOmMsc2V0SW5wdXRSZWY6ZH09eEQoKSx7ZW50cmllczp1LGh1bWFuRWRpdGVkSG91cnM6cCxpc0RpcnR5OmYsbG9hZGluZzp5LHNhdmVOb3c6dyxzY2hlZHVsZVNhdmU6YixzZXRFbnRyaWVzOnYsc2V0SHVtYW5FZGl0ZWRIb3VyczpofT15RCh7YXBwOnQsbm90ZU5hbWU6bH0pO3ZEKHthZ2VuZGFUYXNrczplLGN1cnJlbnREYXRlOnIsaHVtYW5FZGl0ZWRIb3VyczpwLGxvYWRpbmc6eSxzZXRFbnRyaWVzOnZ9KSx3RCh7Y2FsZW5kYXJFdmVudHM6bixjdXJyZW50RGF0ZTpyLGh1bWFuRWRpdGVkSG91cnM6cCxsb2FkaW5nOnksc2V0RW50cmllczp2fSksa0Qoe2N1cnJlbnREYXRlOnIsbG9hZGluZzp5LG5vdGVib29rUmVmOml9KTtsZXQgZz0oMCxiZS51c2VDYWxsYmFjaykoKCk9PntiKGlEKX0sW2JdKSxtPSgwLGJlLnVzZUNhbGxiYWNrKSgoeCxTKT0+e3YoXz0+KHsuLi5fLFt4XTpTfSkpLGgoXz0+bmV3IFNldChbLi4uXyx4XSkpLGIoKX0sW2IsdixoXSk7cmV0dXJuIGEob2Use3RpdGxlOnJlKGwwKSxzdWJ0aXRsZTpkMChzKSxpY29uOiJcdXsxRjVEMn1cdUZFMEYiLHdpZGdldElkOmwwLGhlYWRlckFjdGlvbnM6RUQoYSxmLHcpfSxhKCJkaXYiLHtjbGFzc05hbWU6ImRheS1za2V0Y2gtbm90ZWJvb2siLHJlZjppfSx5P2EoImRpdiIse2NsYXNzTmFtZToiZGF5LXNrZXRjaC1sb2FkaW5nIn0sIkxvYWRpbmdcdTIwMjYiKTpQci5tYXAoeD0+U0Qoe2VudHJpZXM6dSxoOmEsaGFuZGxlQmx1cjpnLGhhbmRsZUlucHV0Q2hhbmdlOm0saGFuZGxlSW5wdXRLZXlEb3duOmMsaG91cjp4LHNldElucHV0UmVmOmQsdGltZUZvcm1hdDpvfSkpKSl9dmFyIG5yPXBlKGRlKCkpO3ZhciBwMD0iZGVidWctY29uc29sZSI7ZnVuY3Rpb24gVEQoZSl7cmV0dXJuIGUubWFwKHQ9PntpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHQ7aWYodCBpbnN0YW5jZW9mIEVycm9yKXJldHVybmAke3QubmFtZX06ICR7dC5tZXNzYWdlfWA7dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeSh0KX1jYXRjaHtyZXR1cm4gU3RyaW5nKHQpfX0pLmpvaW4oIiAiKX1mdW5jdGlvbiBqcCgpe2xldCBlPW5yLmNyZWF0ZUVsZW1lbnQsW3Qsbl09KDAsbnIudXNlU3RhdGUpKCgpPT5YZygpKSxyPSgwLG5yLnVzZVJlZikobnVsbCk7KDAsbnIudXNlRWZmZWN0KSgoKT0+e2Z1bmN0aW9uIGEoaSl7bihzPT57bGV0IGw9Wy4uLnMsaV07cmV0dXJuIGwubGVuZ3RoPjIwMD9sLnNsaWNlKC0yMDApOmx9KX1yZXR1cm4gWmcoYSksKCk9PmV5KGEpfSxbXSksKDAsbnIudXNlRWZmZWN0KSgoKT0+e3IuY3VycmVudCYmKHIuY3VycmVudC5zY3JvbGxUb3A9ci5jdXJyZW50LnNjcm9sbEhlaWdodCl9LFt0XSk7bGV0IG89KCk9Pm4oW10pO3JldHVybiBlKG9lLHt0aXRsZTpyZShwMCksd2lkZ2V0SWQ6cDAsaGVhZGVyQWN0aW9uczplKCJidXR0b24iLHtjbGFzc05hbWU6ImRlYnVnLWNvbnNvbGVfX2NsZWFyLWJ1dHRvbiIsdHlwZToiYnV0dG9uIixvbkNsaWNrOm8sdGl0bGU6IkNsZWFyIGxvZyBlbnRyaWVzIn0sIkNsZWFyIil9LGUoImRpdiIse2NsYXNzTmFtZToiZGVidWctY29uc29sZSIscmVmOnJ9LHQubGVuZ3RoPT09MD9lKCJkaXYiLHtjbGFzc05hbWU6ImRlYnVnLWNvbnNvbGVfX2VtcHR5In0sIk5vIGxvZyBtZXNzYWdlcyB5ZXQuIEVuYWJsZSBDb25zb2xlIExvZ2dpbmcgaW4gU2V0dGluZ3MgdG8gc3RhcnQgY2FwdHVyaW5nIG1lc3NhZ2VzLiIpOnQubWFwKGE9PmUoImRpdiIse2tleTphLmlkLGNsYXNzTmFtZToiZGVidWctY29uc29sZV9fZW50cnkifSxlKCJzcGFuIix7Y2xhc3NOYW1lOiJkZWJ1Zy1jb25zb2xlX190aW1lc3RhbXAifSxuZXcgRGF0ZShhLnRzKS50b0lTT1N0cmluZygpLnNsaWNlKDExLDIzKSksZSgic3BhbiIse2NsYXNzTmFtZToiZGVidWctY29uc29sZV9fbWVzc2FnZSJ9LFREKGEuYXJncykpKSkpKX12YXIgT249cGUoZGUoKSk7ZnVuY3Rpb24gTkQoZSl7bGV0IHQ9e307Zm9yKGxldHtkYXRlS2V5Om4sdGFza3M6cn1vZiBlKXRbbl09cjtyZXR1cm4gdH1mdW5jdGlvbiBWcChlKXtsZXRbdCxuXT0oMCxPbi51c2VTdGF0ZSkoe30pLHI9KDAsT24udXNlUmVmKSghMSksbz0oMCxPbi51c2VSZWYpKG51bGwpLGE9KDAsT24udXNlUmVmKShuZXcgU2V0KSxpPSgwLE9uLnVzZVJlZikobnVsbCkscz0oMCxPbi51c2VSZWYpKHt9KSxsPSgwLE9uLnVzZUNhbGxiYWNrKShhc3luYyhjLGQpPT57aS5jdXJyZW50IT09ZCYmKGkuY3VycmVudD1kLGEuY3VycmVudD1uZXcgU2V0LHMuY3VycmVudD17fSk7bGV0e2JvdW5kYXJpZXM6dSx3ZWVrU3RhcnRLZXk6cH09WHkoYyksZj1gJHtwfTo6JHtkfHwiIn1gO2lmKGEuY3VycmVudC5oYXMoZikpcmV0dXJuIHMuY3VycmVudDtyLmN1cnJlbnQ9ITAsby5jdXJyZW50PW51bGw7dHJ5e2xldCB5PWF3YWl0IFByb21pc2UuYWxsKHUubWFwKGFzeW5jKHtmcm9tOnYsdG86aCxkYXRlS2V5Omd9KT0+e2xldCBtPWF3YWl0IGUuZ2V0Q29tcGxldGVkVGFza3ModixoKTtyZXR1cm57ZGF0ZUtleTpnLHRhc2tzOm18fFtdfX0pKSx3PU5EKHkpLGI9ey4uLnMuY3VycmVudCwuLi53fTtyZXR1cm4gbihiKSxzLmN1cnJlbnQ9YixhLmN1cnJlbnQuYWRkKGYpLGJ9Y2F0Y2goeSl7cmV0dXJuIEUoInVzZUNvbXBsZXRlZFRhc2tzOiBmYWlsZWQgdG8gZmV0Y2ggY29tcGxldGVkIHRhc2tzIix5KSxvLmN1cnJlbnQ9eSxzLmN1cnJlbnR9ZmluYWxseXtyLmN1cnJlbnQ9ITF9fSxbXSk7cmV0dXJue2NvbXBsZXRlZFRhc2tzQnlEYXRlOnQsZ2V0IGxvYWRpbmcoKXtyZXR1cm4gci5jdXJyZW50fSxnZXQgZXJyb3IoKXtyZXR1cm4gby5jdXJyZW50fSxmZXRjaENvbXBsZXRlZFRhc2tzOmx9fXZhciBmMD1wZShkZSgpKTtmdW5jdGlvbiBHcCh7Y29uZmlnUGFyYW1zOmV9KXtyZXR1cm57YWN0aXZlQ29tcG9uZW50czooMCxmMC51c2VNZW1vKSgoKT0+e2lmKCFlKXJldHVybltdO2xldCBuPWVbRy5EQVNIQk9BUkRfQ09NUE9ORU5UU107cmV0dXJuIEFycmF5LmlzQXJyYXkobikmJm4ubGVuZ3RoPjA/bjpOcn0sW2VdKX19dmFyIEluPXBlKGRlKCkpO2Z1bmN0aW9uIGpsKGUpe3JldHVybiBlLnN0YXJ0QXR8fGUuZGVhZGxpbmV9ZnVuY3Rpb24gS3AoZSx0LG49KCk9PiEwKXtsZXQgcj17fSxvPTAsYT1uZXcgRGF0ZTtyZXR1cm4gZS5mb3JFYWNoKGk9PntpZihvKz0xLCFuKGkpKXJldHVybjtsZXQgcz10KGkpO2lmKCFzKXJldHVybjtsZXQgbD1xbihzKTtyW2xdfHwocltsXT1bXSkscltsXS5wdXNoKGkpfSksRShgQW5hbHl6ZWQgJHtvfSB0YXNrcywgZ3JvdXBlZCBpbnRvICR7T2JqZWN0LmtleXMocikubGVuZ3RofSBkYXRlIGtleXMgaW4gJHtuZXcgRGF0ZS1hfW1zYCkscn1mdW5jdGlvbiBtMChlKXtyZXR1cm4gS3AoZSxqbCx0PT4hdC5jb21wbGV0ZWRBdCYmIXQuZGlzbWlzc2VkQXQpfWZ1bmN0aW9uIGgwKGUpe3JldHVybiBLcChlLHQ9PnQuY29tcGxldGVkQXQsdD0+ISF0LmNvbXBsZXRlZEF0KX1mdW5jdGlvbiBERChlLHQpe2xldCBuPWUuZmlsdGVyKG89Pm8+dCkscj1lLmZpbHRlcihvPT5vPHQpO3JldHVybnt1cGNvbWluZ0RhdGVLZXlzOm4sb2xkZXJEYXRlS2V5czpyfX1mdW5jdGlvbiBfRChlLHQpe2xldCBuPXt9O3JldHVybiB0LmZvckVhY2gocj0+e25bcl09ZVtyXXx8W119KSxufWZ1bmN0aW9uIFlwKCl7bGV0W2UsdF09KDAsSW4udXNlU3RhdGUpKFtdKSxbbixyXT0oMCxJbi51c2VTdGF0ZSkobnVsbCksW28sYV09KDAsSW4udXNlU3RhdGUpKG51bGwpLFtpLHNdPSgwLEluLnVzZVN0YXRlKSh7fSksW2wsY109KDAsSW4udXNlU3RhdGUpKHt9KSxkPW5ldyBEYXRlLHU9KDAsSW4udXNlQ2FsbGJhY2spKHk9PntpZigheSlyZXR1cm47dCh5LnRhc2tEb21haW5zfHxbXSkscih5LmFjdGl2ZVRhc2tEb21haW58fG51bGwpO2xldCB3PXkudGFza3N8fFtdO3MobTAodykpLGMoaDAodykpLGEoRGF0ZS5ub3coKSl9LFtdKSxwPSgwLEluLnVzZUNhbGxiYWNrKSgoeSx3LGIpPT57aWYoeSYmdCh5KSx3JiZyKHcpLGIpe2xldCB2PWIudGFza3N8fFtdO3MobTAodikpLGMoaDAodikpLGEoRGF0ZS5ub3coKSl9fSxbXSksZj0oMCxJbi51c2VDYWxsYmFjaykoeT0+e2xldCB3PXk/bmV3IERhdGUoeSk6bmV3IERhdGUsYj1xbih3KSx2PU9iamVjdC52YWx1ZXMoaSkuZmxhdCgpLGg9di5maWx0ZXIoXz0+ISEoXy5zdGFydEF0fHxfLmRlYWRsaW5lKSkuc29ydCgoXyxEKT0+amwoXyktamwoRCkpO0UoYEFnZW5kYSB3aWxsIHJldmlld2VkICR7di5sZW5ndGh9IG9wZW4gdGFza3NgLHYubWFwKF89Pih7ZGVhZGxpbmVUZXh0Ol8uZGVhZGxpbmU/cW4oXy5kZWFkbGluZSk6Ik4vQSIsc3RhcnRUZXh0Ol8uc3RhcnRBdD9xbihfLnN0YXJ0QXQpOiJOb25lIn0pKSksRShgJHtoLmxlbmd0aH0gcmVsZXZhbnQgcGVuZGluZyB0YXNrcyBmb3VuZCAod2l0aCBzdGFydEF0KWApO2xldCBnPUtwKGgsamwpLG09T2JqZWN0LmtleXMoZykuc29ydCgpLHt1cGNvbWluZ0RhdGVLZXlzOnh9PUREKG0sYiksUz1bYiwuLi54XTtyZXR1cm4gX0QoZyxTKX0sW2ldKTtyZXR1cm4gRShgdXNlRG9tYWluVGFza3MgaW5pdGlhbGl6ZWQgd2l0aCBhY3RpdmUgZG9tYWluICR7bn0gaW4gJHtuZXcgRGF0ZS1kfW1zYCkse3Rhc2tEb21haW5zOmUsYWN0aXZlVGFza0RvbWFpbjpuLHRhc2tzRmV0Y2hlZEF0Om8sb3BlblRhc2tzOmksY29tcGxldGVkVGFza3M6bCxpbml0aWFsaXplRG9tYWluVGFza3M6dSxvbkRvbWFpbkNoYW5nZTpwLGJ1aWxkQWdlbmRhVGFza3NCeURhdGU6Zn19dmFyIFZsPXBlKGRlKCkpO2Z1bmN0aW9uIGcwKGUpe2lmKCFlKXJldHVybiBudWxsO2lmKGUgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBOdW1iZXIuaXNOYU4oZS5nZXRUaW1lKCkpP251bGw6bmV3IERhdGUoZS5nZXRUaW1lKCkpO2lmKHR5cGVvZiBlIT0ibnVtYmVyIiYmdHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiBudWxsO2xldCB0PXR5cGVvZiBlPT0ibnVtYmVyIiYmZTwxZTEwP25ldyBEYXRlKGUqMWUzKTpuZXcgRGF0ZShlKTtyZXR1cm4gTnVtYmVyLmlzTmFOKHQuZ2V0VGltZSgpKT9udWxsOnR9ZnVuY3Rpb24gQ0QoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5maWx0ZXIodD0+dCYmdHlwZW9mIHQ9PSJvYmplY3QiKS5tYXAodD0+KHsuLi50LGVuZDpnMCh0LmVuZCksc3RhcnQ6ZzAodC5zdGFydCl9KSk6W119ZnVuY3Rpb24geTAoZSx0LG4pe2UuZ2V0RXh0ZXJuYWxDYWxlbmRhckV2ZW50cyh7ZGF5czozLHRhc2tEb21haW5VVUlEOnR9KS50aGVuKHI9PntFKCJbdXNlRXh0ZXJuYWxDYWxlbmRhckV2ZW50c10gUmVjZWl2ZWQgY2FsZW5kYXIgZXZlbnRzIixyKSxuKENEKHIpKX0pLmNhdGNoKCgpPT57bihbXSl9KX1mdW5jdGlvbiBxcChlLHQpe2xldFtuLHJdPSgwLFZsLnVzZVN0YXRlKShudWxsKTtyZXR1cm4oMCxWbC51c2VFZmZlY3QpKCgpPT57cihudWxsKSx5MChlLHQscik7ZnVuY3Rpb24gbygpe2RvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT09PSJ2aXNpYmxlIiYmeTAoZSx0LHIpfXJldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixvKSwoKT0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsbyl9LFtlLHRdKSx7Y2FsZW5kYXJFdmVudHM6bixjYWxlbmRhckV2ZW50c0xvYWRlZDpuIT09bnVsbH19dmFyIERlPXBlKGRlKCkpO3ZhciBBRD01ZTMsUzA9NyxPRD0zLFNlPTIyMCxFMD0xNCxUMD0yLElEPTQsUkQ9NzgsTUQ9NDAsdjA9NCxQRD00OCxMRD05NSx6RD0xNixGRD0uMDQsVUQ9MTIsJEQ9MTIsdzA9LjUsV0Q9MS44LEJEPS00LEhEPTUsYjA9LjcsakQ9My4zLFZEPTE4LEdEPTIyLEtEPS01LFlEPTExLHFEPTEzLFFEPTI2LEpEPTEwLFhEPTMwLFpEPTQ0LGVfPTUsR2w9MS8zLHRfPTEuMyxuXz1bWzAsIiMyN0FFNjA1MCJdLFsuNSwiI0YyQzk0QzIwIl0sWzEsIiNFODQ1M0MwOCJdXSxyXz0yLG9fPTMuNSxhXz0xLjIsaV89OCxrMD0uMyxzXz0yLGxfPTEsY189MTYsdV89MjgseDA9LjcsZF89MyxwXz0tMTEsZl89MTQsbV89NTYsaF89NDYsZ189MTYseV89OCx2Xz0zMyx3Xz0xMixiXz0uMjUsa189Ljc1LHhfPTI1LFNfPTEyMDAsRV89MWUzLE4wPTMsS2w9W3t2YWx1ZTotMixlbW9qaToiXHV7MUY2MzV9XHUyMDBEXHV7MUY0QUJ9IixsYWJlbDoiQXdmdWwifSx7dmFsdWU6LTEsZW1vamk6Ilx1ezFGQUU0fSIsbGFiZWw6IkJhZCJ9LHt2YWx1ZTowLGVtb2ppOiJcdXsxRjY0Mn0iLGxhYmVsOiJPa2F5In0se3ZhbHVlOjEsZW1vamk6Ilx1ezFGNjAwfSIsbGFiZWw6Ikdvb2QifSx7dmFsdWU6MixlbW9qaToiXHV7MUY5Mjl9IixsYWJlbDoiR3JlYXQifV0sVF89eyItMiI6IiNFODQ1M0MiLCItMSI6IiNGMjk5NEEiLDA6IiNGMkM5NEMiLDE6IiM2RkNGOTciLDI6IiMyN0FFNjAifSxOXz1PYmplY3QuZnJvbUVudHJpZXMoS2wubWFwKGU9PltlLnZhbHVlLGUuZW1vamldKSk7ZnVuY3Rpb24gY2EoZSl7cmV0dXJuIFRfW01hdGgucm91bmQoZSldfHwiI2NjYyJ9ZnVuY3Rpb24gRDAoZSl7cmV0dXJuIE5fW01hdGgucm91bmQoZSldfHwiXHUyNzUzIn1mdW5jdGlvbiBEXyhlKXtsZXQgdD1LbC5maW5kKG49Pm4udmFsdWU9PT1lKTtyZXR1cm4gdD90LmxhYmVsOiIifWZ1bmN0aW9uIF8wKGUpe2lmKCFlKXJldHVybiIiO2xldHtmdWxsRGF0ZTp0LGVudHJpZXM6bn09ZSxyPVtgPGRpdiBjbGFzcz0ibW9vZC12aXotdG9vbHRpcC1kYXRlIj4ke3R9PC9kaXY+YF07Zm9yKGxldCBvIG9mIG4pe2xldCBhPUtsLmZpbmQobD0+bC52YWx1ZT09PW8ucmF0aW5nKT8uZW1vaml8fCJcdTI3NTMiLGk9RF8oby5yYXRpbmcpLHM9YDxkaXYgY2xhc3M9Im1vb2Qtdml6LXRvb2x0aXAtZW50cnkiPjxzcGFuIGNsYXNzPSJtb29kLXZpei10b29sdGlwLXRpbWUiPiR7by50aW1lfTwvc3Bhbj48c3BhbiBjbGFzcz0ibW9vZC12aXotdG9vbHRpcC1tb29kIj4ke2F9IDxzcGFuIGNsYXNzPSJtb29kLXZpei1sYWJlbCI+JHtpfSAoJHtvLnJhdGluZz4wP2ArJHtvLnJhdGluZ31gOm8ucmF0aW5nfSk8L3NwYW4+PC9zcGFuPmA7by5ub3RlcyYmKHMrPWA8ZGl2IGNsYXNzPSJtb29kLXZpei10b29sdGlwLW5vdGUiPiR7by5ub3Rlc308L2Rpdj5gKSxzKz0iPC9kaXY+IixyLnB1c2gocyl9cmV0dXJuIHIuam9pbigiIil9ZnVuY3Rpb24gX18oZSx0LG4scil7dHx8bnx8cihlKX1mdW5jdGlvbiBDXyhlLHQsbixyLG8sYSxpKXt0LmtleT09PSJFbnRlciImJih0LmN0cmxLZXl8fHQubWV0YUtleSkmJih0LnByZXZlbnREZWZhdWx0KCksQzAoZSxuLHIsbyxhLGkpKX1hc3luYyBmdW5jdGlvbiBDMChlLHQsbixyLG8sYSl7cighMCksRSgiUmVjb3JkaW5nIG1vb2QgcmF0aW5nIHdpdGggdmFsdWU6Iix0LnZhbHVlKTtsZXQgaT1hd2FpdCBlLnJlY29yZE1vb2RSYXRpbmcodC52YWx1ZSkscz1uLnRyaW0oKTtFKGBNb29kIHJhdGluZyB1dWlkICR7aX0gcmVjZWl2ZWQsIHRyaW1tZWQgbm90ZXMgc2l6ZSAke3MubGVuZ3RofSBjaGFyYWN0ZXJzYCkscyYmKGF3YWl0IGUudXBkYXRlTW9vZFJhdGluZyhpLHtub3RlOnN9KSxFKGBNb29kIHJhdGluZyB1dWlkICR7aX0gdXBkYXRlZCB3aXRoIG5vdGVzYCkpLG8oITApLGE/KEUoIlJldHJpZXZlZCBtb29kIHJhdGluZyBVVUlEOiIsaSwiY2FsbGluZyBvbk1vb2RSZWNvcmRlZCIpLGEoe3JhdGluZzp0LnZhbHVlLHRpbWVzdGFtcDpNYXRoLmZsb29yKERhdGUubm93KCkvMWUzKSxub3RlOnN8fG51bGx9KSxFKCJvbk1vb2RSZWNvcmRlZCBjYWxsYmFjayBjb21wbGV0ZSIpKTpFKCJvbk1vb2RSZWNvcmRlZCBjYWxsYmFjayBub3QgcHJvdmlkZWQsIHNraXBwaW5nIikscighMSl9ZnVuY3Rpb24gQV8oZSl7bGV0IHQ9KGV8fFtdKS5zbGljZSgtUzApO2lmKCF0Lmxlbmd0aClyZXR1cm57cmVjZW50TW9vZHM6dCxhdmVyYWdlTW9vZDoiXHUyMDE0In07bGV0IG49KHQucmVkdWNlKChyLG8pPT5yK28ucmF0aW5nLDApL3QubGVuZ3RoKS50b0ZpeGVkKDEpO3JldHVybntyZWNlbnRNb29kczp0LGF2ZXJhZ2VNb29kOm59fWZ1bmN0aW9uIEEwKCl7bGV0IGU9Z2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLHQ9bj0+ZS5nZXRQcm9wZXJ0eVZhbHVlKG4pLnRyaW0oKTtyZXR1cm57YmdDYXJkOnQoIi0tZGFzaGJvYXJkLWNvbG9yLWJnLWNhcmQiKSxiZ1BhZ2U6dCgiLS1kYXNoYm9hcmQtY29sb3ItYmctcGFnZSIpLGJvcmRlcjp0KCItLWRhc2hib2FyZC1jb2xvci1ib3JkZXIiKSx0ZXh0U2Vjb25kYXJ5OnQoIi0tZGFzaGJvYXJkLWNvbG9yLXRleHQtc2Vjb25kYXJ5IiksdGV4dE11dGVkOnQoIi0tZGFzaGJvYXJkLWNvbG9yLXRleHQtbXV0ZWQiKX19ZnVuY3Rpb24gUXAoZSx0KXtyZXR1cm4gZS5zdGFydHNXaXRoKCIjIikmJmUubGVuZ3RoPT09Nz9lK3Q6ZX1mdW5jdGlvbiBPXyh7bW9vZERhdGE6ZX0pe2xldCB0PURlLmNyZWF0ZUVsZW1lbnQsbj0oMCxEZS51c2VSZWYpKG51bGwpLHI9KDAsRGUudXNlUmVmKShudWxsKSxbbyxhXT0oMCxEZS51c2VTdGF0ZSkoMCksaT1naSgpLHM9SlNPTi5zdHJpbmdpZnkoZSk7cmV0dXJuKDAsRGUudXNlRWZmZWN0KSgoKT0+e2EoMCk7bGV0IGQsdT1udWxsLHA9U18sZj15PT57dXx8KHU9eSk7bGV0IHc9TWF0aC5taW4oKHktdSkvcCwxKSxiPTEtTWF0aC5wb3coMS13LE4wKTthKGIpLHc8MSYmKGQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGYpKX07cmV0dXJuIGQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGYpLCgpPT5jYW5jZWxBbmltYXRpb25GcmFtZShkKX0sW3NdKSwoMCxEZS51c2VFZmZlY3QpKCgpPT57bGV0IGQ9bi5jdXJyZW50O2lmKCFkKXJldHVybjtsZXQgdT1kLmdldENvbnRleHQoIjJkIikscD13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8VDA7ZC53aWR0aD1TZSpwLGQuaGVpZ2h0PVNlKnAsdS5zY2FsZShwLHApLHUuY2xlYXJSZWN0KDAsMCxTZSxTZSk7bGV0IGY9QTAoKSx5PVNlLzIsdz1TZS8yK0lELGI9UkQsdj1NRDt1LmZpbGxTdHlsZT1mLmJnQ2FyZCx1LmJlZ2luUGF0aCgpLHUucm91bmRSZWN0KDAsMCxTZSxTZSxFMCksdS5maWxsKCksdS5zdHJva2VTdHlsZT1RcChmLmJvcmRlciwiMjgiKSx1LmxpbmVXaWR0aD0xO2ZvcihsZXQgUz1QRDtTPD1MRDtTKz16RCl1LmJlZ2luUGF0aCgpLHUuYXJjKHksdyxTLDAsTWF0aC5QSSoyKSx1LnN0cm9rZSgpO2xldCBoPWUubWFwKFM9Pih7bGFiZWw6Uy5kYXlMYWJlbCxkYXRlTGFiZWw6Uy5kYXRlTGFiZWwsdmFsOlMucmF0aW5nfSkpLGc9TWF0aC5tYXgoaC5sZW5ndGgsMSksbT1NYXRoLlBJKjIvZyx4PWgubGVuZ3RoPjE/RkQ6MDtpZihyLmN1cnJlbnQ9e2NlbnRlclg6eSxjZW50ZXJZOncsaW5uZXJSYWRpdXM6dixvdXRlclJhZGl1czpiLHNlZ21lbnRDb3VudDpoLmxlbmd0aCxzZWdtZW50QW5nbGU6bSxnYXBBbmdsZTp4fSxoLmZvckVhY2goKHtsYWJlbDpTLGRhdGVMYWJlbDpfLHZhbDpEfSxBKT0+e2xldCBUPS1NYXRoLlBJLzIrQSptK3gsTD1UKyhtLXgqMikqbyx6PWNhKEQpO3Uuc2hhZG93Q29sb3I9eix1LnNoYWRvd0JsdXI9VUQqbyx1LmJlZ2luUGF0aCgpLHUuYXJjKHksdyxiLFQsTCksdS5hcmMoeSx3LHYsTCxULCEwKSx1LmNsb3NlUGF0aCgpO2xldCBJPXUuY3JlYXRlUmFkaWFsR3JhZGllbnQoeSx3LHYseSx3LGIpO2lmKEkuYWRkQ29sb3JTdG9wKDAseisiOTkiKSxJLmFkZENvbG9yU3RvcCgxLHorImZmIiksdS5maWxsU3R5bGU9SSx1LmZpbGwoKSx1LnNoYWRvd0JsdXI9MCxvPncwKXtsZXQgTT1UKyhtLXgqMikvMixGPWIrJEQsVT15K01hdGguY29zKE0pKkYsTz13K01hdGguc2luKE0pKkY7dS5maWxsU3R5bGU9Zi50ZXh0U2Vjb25kYXJ5LHUuZ2xvYmFsQWxwaGE9KG8tdzApKldELHUuZm9udD0iYm9sZCA4cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsdS50ZXh0QWxpZ249ImNlbnRlciIsdS50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsdS5maWxsVGV4dChTLFUsTytCRCksdS5mb250PSI3cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsdS5maWxsU3R5bGU9Zi50ZXh0TXV0ZWQsdS5maWxsVGV4dChfLFUsTytIRCksdS5nbG9iYWxBbHBoYT0xfWlmKG8+YjApe2xldCBNPVQrKG0teCoyKS8yLEY9KGIrdikvMixVPXkrTWF0aC5jb3MoTSkqRixPPXcrTWF0aC5zaW4oTSkqRjt1LmZvbnQ9IjEzcHggc2VyaWYiLHUudGV4dEFsaWduPSJjZW50ZXIiLHUudGV4dEJhc2VsaW5lPSJtaWRkbGUiLHUuZ2xvYmFsQWxwaGE9TWF0aC5taW4oKG8tYjApKmpELDEpLHUuZmlsbFRleHQoRDAoRCksVSxPKSx1Lmdsb2JhbEFscGhhPTF9fSksdS5iZWdpblBhdGgoKSx1LmFyYyh5LHcsdi12MCwwLE1hdGguUEkqMiksdS5maWxsU3R5bGU9Zi5iZ1BhZ2UsdS5maWxsKCksaC5sZW5ndGg+MCl7bGV0IFM9KGgucmVkdWNlKChfLEQpPT5fK0QudmFsLDApL2gubGVuZ3RoKS50b0ZpeGVkKDEpO3UuZmlsbFN0eWxlPWNhKE1hdGgucm91bmQoTnVtYmVyKFMpKSksdS5mb250PWBib2xkICR7R0R9cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZmAsdS50ZXh0QWxpZ249ImNlbnRlciIsdS50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsdS5nbG9iYWxBbHBoYT1vLHUuZmlsbFRleHQoUyx5LHcrS0QpLHUuZmlsbFN0eWxlPWYudGV4dE11dGVkLHUuZm9udD0iYm9sZCA3cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZiIsdS5maWxsVGV4dCgiNy1EQVkgQVZHIix5LHcrWUQpLHUuZ2xvYmFsQWxwaGE9MX11LmZpbGxTdHlsZT1mLnRleHRNdXRlZCx1LmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLHUudGV4dEFsaWduPSJjZW50ZXIiLHUudGV4dEJhc2VsaW5lPSJhbHBoYWJldGljIix1LmZpbGxUZXh0KCJXIEUgRSBLICAgUiBJIE4gRyIseSxxRCl9LFtzLG9dKSx0KCJkaXYiLHtzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIixsaW5lSGVpZ2h0OjB9fSx0KCJjYW52YXMiLHtyZWY6bixjbGFzc05hbWU6Im1vb2Qtdml6LWNhbnZhcyIsb25Nb3VzZU1vdmU6ZD0+e2xldCB1PXIuY3VycmVudCxwPW4uY3VycmVudDtpZighdXx8IXUuc2VnbWVudENvdW50fHwhcCl7aS5oaWRlKCk7cmV0dXJufWxldCBmPXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseT0oZC5jbGllbnRYLWYubGVmdCkqKFNlL2Yud2lkdGgpLHc9KGQuY2xpZW50WS1mLnRvcCkqKFNlL2YuaGVpZ2h0KSxiPXktdS5jZW50ZXJYLHY9dy11LmNlbnRlclksaD1NYXRoLnNxcnQoYipiK3Yqdik7aWYoaDx1LmlubmVyUmFkaXVzLXYwfHxoPnUub3V0ZXJSYWRpdXMrVkQpe2kuaGlkZSgpO3JldHVybn1sZXQgZz1NYXRoLmF0YW4yKHYsYikrTWF0aC5QSS8yO2c8MCYmKGcrPU1hdGguUEkqMik7bGV0IG09TWF0aC5mbG9vcihnL3Uuc2VnbWVudEFuZ2xlKTtpZihtPj0wJiZtPHUuc2VnbWVudENvdW50KXtsZXQgeD1lW21dLFM9Zi5sZWZ0K3kvU2UqZi53aWR0aCxfPWYudG9wK3cvU2UqZi5oZWlnaHQ7aS5zaG93KF8wKHtmdWxsRGF0ZTp4LmZ1bGxEYXRlLGVudHJpZXM6eC5lbnRyaWVzfHxbeF19KSxTLF8pfWVsc2UgaS5oaWRlKCl9LG9uTW91c2VMZWF2ZTooKT0+aS5oaWRlKCl9KSl9ZnVuY3Rpb24gSV8oe21vb2REYXRhOmV9KXtsZXQgdD1EZS5jcmVhdGVFbGVtZW50LG49KDAsRGUudXNlUmVmKShudWxsKSxyPSgwLERlLnVzZVJlZikoW10pLFtvLGFdPSgwLERlLnVzZVN0YXRlKSgwKSxpPWdpKCkscz1KU09OLnN0cmluZ2lmeShlKTtyZXR1cm4oMCxEZS51c2VFZmZlY3QpKCgpPT57YSgwKTtsZXQgZCx1PW51bGwscD1FXyxmPXk9Pnt1fHwodT15KTtsZXQgdz1NYXRoLm1pbigoeS11KS9wLDEpO2EoMS1NYXRoLnBvdygxLXcsTjApKSx3PDEmJihkPXJlcXVlc3RBbmltYXRpb25GcmFtZShmKSl9O3JldHVybiBkPXJlcXVlc3RBbmltYXRpb25GcmFtZShmKSwoKT0+Y2FuY2VsQW5pbWF0aW9uRnJhbWUoZCl9LFtzXSksKDAsRGUudXNlRWZmZWN0KSgoKT0+e2xldCBkPW4uY3VycmVudDtpZighZClyZXR1cm47bGV0IHU9ZC5nZXRDb250ZXh0KCIyZCIpLHA9d2luZG93LmRldmljZVBpeGVsUmF0aW98fFQwO2Qud2lkdGg9U2UqcCxkLmhlaWdodD1TZSpwLHUuc2NhbGUocCxwKSx1LmNsZWFyUmVjdCgwLDAsU2UsU2UpO2xldCBmPUEwKCk7dS5iZWdpblBhdGgoKSx1LnJvdW5kUmVjdCgwLDAsU2UsU2UsRTApLHUuZmlsbFN0eWxlPWYuYmdDYXJkLHUuZmlsbCgpO2xldCB5PVFELHc9SkQsYj1YRCx2PVpELGg9U2UteS13LGc9U2UtYi12LG09YitnO2ZvcihsZXQgVD0tMjtUPD0yO1QrKyl7bGV0IEw9YitnLShUKzIpLzQqZzt1LnN0cm9rZVN0eWxlPVFwKGYuYm9yZGVyLCI1MCIpLHUubGluZVdpZHRoPTEsdS5iZWdpblBhdGgoKSx1Lm1vdmVUbyh5LEwpLHUubGluZVRvKFNlLXcsTCksdS5zdHJva2UoKSx1LmZpbGxTdHlsZT1mLnRleHRNdXRlZCx1LmZvbnQ9ImJvbGQgOHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLHUudGV4dEFsaWduPSJyaWdodCIsdS50ZXh0QmFzZWxpbmU9Im1pZGRsZSIsdS5maWxsVGV4dChUPjA/YCske1R9YDpULHktZV8sTCl9bGV0IHg9ZS5tYXAoVD0+KHtsYWJlbDpULmRheUxhYmVsLGRhdGVMYWJlbDpULmRhdGVMYWJlbCx2YWw6VC5yYXRpbmd9KSksUz0oVCxMKT0+TD09PTE/eStoLzI6TD09PTI/eStoKihUPT09MD9iXzprXyk6eStULyhMLTEpKmgsXz14Lm1hcCgoVCxMKT0+KHt4OlMoTCx4Lmxlbmd0aCkseTpiK2ctKFQudmFsKzIpLzQqZyx2YWw6VC52YWwsbGFiZWw6VC5sYWJlbCxkYXRlTGFiZWw6VC5kYXRlTGFiZWx9KSk7ci5jdXJyZW50PV87bGV0IEQ9Xy5tYXAoVD0+KHsuLi5ULHk6YitnLShULnZhbCsyKS80KmcqTWF0aC5taW4obyp0XywxKX0pKSxBPShULEwpPT57dS5iZWdpblBhdGgoKSx1Lm1vdmVUbyhUWzBdLngsVFswXS55KTtmb3IobGV0IHo9MDt6PFQubGVuZ3RoLTE7eisrKXtsZXQgST1UW3orMV0ueC1UW3pdLngsTT1UW3pdLngrSSpHbCxGPVRbeisxXS54LUkqR2w7dS5iZXppZXJDdXJ2ZVRvKE0sVFt6XS55LEYsVFt6KzFdLnksVFt6KzFdLngsVFt6KzFdLnkpfUwmJih1LmxpbmVUbyhUW1QubGVuZ3RoLTFdLngsbSksdS5saW5lVG8oVFswXS54LG0pLHUuY2xvc2VQYXRoKCkpfTtpZihELmxlbmd0aD49Mil7bGV0IFQ9dS5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLGIsMCxtKTtmb3IobGV0W0wsel1vZiBuXylULmFkZENvbG9yU3RvcChMLHopO0EoRCwhMCksdS5maWxsU3R5bGU9VCx1LmZpbGwoKSx1LmxpbmVXaWR0aD1yXyx1LmxpbmVDYXA9InJvdW5kIjtmb3IobGV0IEw9MDtMPEQubGVuZ3RoLTE7TCsrKXtsZXQgej1EW0xdLEk9RFtMKzFdLE09dS5jcmVhdGVMaW5lYXJHcmFkaWVudCh6Lngsei55LEkueCxJLnkpO00uYWRkQ29sb3JTdG9wKDAsY2Eoei52YWwpKSxNLmFkZENvbG9yU3RvcCgxLGNhKEkudmFsKSksdS5zdHJva2VTdHlsZT1NLHUuYmVnaW5QYXRoKCk7bGV0IEY9SS54LXoueCxVPXoueCtGKkdsLE89SS54LUYqR2w7dS5tb3ZlVG8oei54LHoueSksdS5iZXppZXJDdXJ2ZVRvKFUsei55LE8sSS55LEkueCxJLnkpLHUuc3Ryb2tlKCl9fWlmKG8+azAmJkQuZm9yRWFjaChUPT57bGV0IEw9TWF0aC5taW4oKG8tazApKnNfLDEpLHo9Y2EoVC52YWwpO3Uuc2hhZG93Q29sb3I9eix1LnNoYWRvd0JsdXI9aV8sdS5iZWdpblBhdGgoKSx1LmFyYyhULngsVC55LG9fLDAsTWF0aC5QSSoyKSx1LmZpbGxTdHlsZT16LHUuZ2xvYmFsQWxwaGE9TCx1LmZpbGwoKSx1LnNoYWRvd0JsdXI9MCx1LmJlZ2luUGF0aCgpLHUuYXJjKFQueCxULnksYV8sMCxNYXRoLlBJKjIpLHUuZmlsbFN0eWxlPWYuYmdDYXJkLHUuZmlsbCgpLHUuZ2xvYmFsQWxwaGE9MSx1LmZpbGxTdHlsZT1mLnRleHRTZWNvbmRhcnksdS5nbG9iYWxBbHBoYT1MKmxfLHUuZm9udD0iYm9sZCAxMHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLHUudGV4dEFsaWduPSJjZW50ZXIiLHUudGV4dEJhc2VsaW5lPSJhbHBoYWJldGljIix1LmZpbGxUZXh0KFQubGFiZWwsVC54LG0rY18pLHUuZm9udD0iOXB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYiLHUuZmlsbFRleHQoVC5kYXRlTGFiZWwsVC54LG0rdV8pLHUuZ2xvYmFsQWxwaGE9MSxvPngwJiYodS5nbG9iYWxBbHBoYT1NYXRoLm1pbigoby14MCkqZF8sMSksdS5mb250PSIxMXB4IHNlcmlmIix1LmZpbGxUZXh0KEQwKFQudmFsKSxULngsVC55K3BfKSx1Lmdsb2JhbEFscGhhPTEpfSksdS5maWxsU3R5bGU9Zi50ZXh0TXV0ZWQsdS5mb250PSJib2xkIDhweCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmIix1LnRleHRBbGlnbj0iY2VudGVyIix1LnRleHRCYXNlbGluZT0iYWxwaGFiZXRpYyIsdS5maWxsVGV4dCgiTSBPIE8gRCAgIFcgQSBWIEUiLFNlLzIsZl8pLHgubGVuZ3RoPjApe2xldCBUPSh4LnJlZHVjZSgoeixJKT0+eitJLnZhbCwwKS94Lmxlbmd0aCkudG9GaXhlZCgxKSxMPWNhKE1hdGgucm91bmQoTnVtYmVyKFQpKSk7dS5maWxsU3R5bGU9UXAoTCwiMjIiKSx1LmJlZ2luUGF0aCgpLHUucm91bmRSZWN0KFNlLW1fLDQsaF8sZ18seV8pLHUuZmlsbCgpLHUuZmlsbFN0eWxlPUwsdS5mb250PSJib2xkIDhweCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmIix1LnRleHRBbGlnbj0iY2VudGVyIix1LnRleHRCYXNlbGluZT0ibWlkZGxlIix1LmZpbGxUZXh0KGBBdmcgJHtUfWAsU2Utdl8sd18pfX0sW3Msb10pLHQoImRpdiIse3N0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLGxpbmVIZWlnaHQ6MH19LHQoImNhbnZhcyIse3JlZjpuLGNsYXNzTmFtZToibW9vZC12aXotY2FudmFzIixvbk1vdXNlTW92ZTpkPT57bGV0IHU9bi5jdXJyZW50O2lmKCF1KXJldHVybjtsZXQgcD11LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9KGQuY2xpZW50WC1wLmxlZnQpKihTZS9wLndpZHRoKSx5PShkLmNsaWVudFktcC50b3ApKihTZS9wLmhlaWdodCksdz1yLmN1cnJlbnQ7aWYoIXd8fCF3Lmxlbmd0aCl7aS5oaWRlKCk7cmV0dXJufWxldCBiPS0xLHY9eF87Zm9yKGxldCBoPTA7aDx3Lmxlbmd0aDtoKyspe2xldCBnPWYtd1toXS54LG09eS13W2hdLnkseD1NYXRoLnNxcnQoZypnK20qbSk7eDx2JiYodj14LGI9aCl9aWYoYj49MCl7bGV0IGg9d1tiXSxnPWVbYl0sbT1wLmxlZnQraC54L1NlKnAud2lkdGgseD1wLnRvcCtoLnkvU2UqcC5oZWlnaHQ7aS5zaG93KF8wKHtmdWxsRGF0ZTpnLmZ1bGxEYXRlLGVudHJpZXM6Zy5lbnRyaWVzfHxbZ119KSxtLHgpfWVsc2UgaS5oaWRlKCl9LG9uTW91c2VMZWF2ZTooKT0+aS5oaWRlKCl9KSl9ZnVuY3Rpb24gUl8oZSl7bGV0IHQ9WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxuPVsuLi5lfHxbXV0uc29ydCgoYSxpKT0+KGEudGltZXN0YW1wfHwwKS0oaS50aW1lc3RhbXB8fDApKTtpZihuLmxlbmd0aCljb25zb2xlLmxvZygiRm91bmQgZXhpc3RpbmcgcmF0aW5ncyIpO2Vsc2UgcmV0dXJuIGNvbnNvbGUubG9nKCJObyByYXRpbmdzIGZvdW5kLCByZXR1cm5pbmcgW10iKSxbXTtsZXQgcj1uZXcgTWFwO2ZvcihsZXQgYSBvZiBuKXtsZXQgaT1hLnRpbWVzdGFtcD9uZXcgRGF0ZShhLnRpbWVzdGFtcCoxZTMpOm5ldyBEYXRlLHM9YCR7aS5nZXRGdWxsWWVhcigpfS0ke2kuZ2V0TW9udGgoKSsxfS0ke2kuZ2V0RGF0ZSgpfWA7ci5oYXMocyl8fHIuc2V0KHMse2RheUxhYmVsOnRbaS5nZXREYXkoKV0sZGF0ZUxhYmVsOmAke2kuZ2V0TW9udGgoKSsxfS8ke2kuZ2V0RGF0ZSgpfWAsZGF0ZUtleTpzLGZ1bGxEYXRlOmkudG9Mb2NhbGVEYXRlU3RyaW5nKCJlbi1VUyIse3dlZWtkYXk6ImxvbmciLHllYXI6Im51bWVyaWMiLG1vbnRoOiJsb25nIixkYXk6Im51bWVyaWMifSksZW50cmllczpbXSxyYXRpbmdTdW06MCxyYXRpbmdDb3VudDowfSk7bGV0IGw9ci5nZXQocyk7bC5lbnRyaWVzLnB1c2goe3JhdGluZzphLnJhdGluZyx0aW1lOihhLnRpbWVzdGFtcD9uZXcgRGF0ZShhLnRpbWVzdGFtcCoxZTMpOm5ldyBEYXRlKS50b0xvY2FsZVRpbWVTdHJpbmcoImVuLVVTIix7aG91cjoibnVtZXJpYyIsbWludXRlOiIyLWRpZ2l0In0pLG5vdGVzOmEubm90ZXN8fGEubm90ZXx8bnVsbCx0aW1lc3RhbXA6YS50aW1lc3RhbXB9KSxsLnJhdGluZ1N1bSs9YS5yYXRpbmcsbC5yYXRpbmdDb3VudCs9MX1yZXR1cm5bLi4uci52YWx1ZXMoKV0uc2xpY2UoLVMwKS5tYXAoYT0+KHtyYXRpbmc6YS5yYXRpbmdTdW0vYS5yYXRpbmdDb3VudCxkYXlMYWJlbDphLmRheUxhYmVsLGRhdGVMYWJlbDphLmRhdGVMYWJlbCxkYXRlS2V5OmEuZGF0ZUtleSxmdWxsRGF0ZTphLmZ1bGxEYXRlLHRpbWU6YS5lbnRyaWVzW2EuZW50cmllcy5sZW5ndGgtMV0udGltZSx0aW1lc3RhbXA6YS5lbnRyaWVzW2EuZW50cmllcy5sZW5ndGgtMV0udGltZXN0YW1wLG5vdGVzOmEuZW50cmllc1thLmVudHJpZXMubGVuZ3RoLTFdLm5vdGVzLGVudHJpZXM6YS5lbnRyaWVzfSkpfWZ1bmN0aW9uIE1fKGUsdCxuLHIsbyxhKXtsZXQgaT1lO2lmKCEodHx8W10pLmxlbmd0aClyZXR1cm4gaSgiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLXN1bW1hcnkifSxpKCJzcGFuIixudWxsLCJBdmcgbW9vZCAoN2QpOiAiK24pKTtsZXQgcz1SXyh0KSxsPXI9PT0id2F2ZSI/aShJXyx7a2V5Om8sbW9vZERhdGE6c30pOmkoT18se2tleTpvLG1vb2REYXRhOnN9KTtyZXR1cm4gaSgiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLXZpei1zZWN0aW9uIn0saSgiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLXZpei1jYW52YXMtd3JhcCJ9LGwpLGkoImJ1dHRvbiIse2NsYXNzTmFtZToibW9vZC12aXotY29uZmlndXJlLWxpbmsiLG9uQ2xpY2s6YX0sIlx1MjY5OSBDb25maWd1cmUiKSl9ZnVuY3Rpb24gSnAoe2FwcDplLG1vb2RSYXRpbmdzOnQsb25Nb29kUmVjb3JkZWQ6bn0pe2xldCByPURlLmNyZWF0ZUVsZW1lbnQsW28sYV09KDAsRGUudXNlU3RhdGUpKG51bGwpLFtpLHNdPSgwLERlLnVzZVN0YXRlKSgiIiksW2wsY109KDAsRGUudXNlU3RhdGUpKCExKSxbZCx1XT0oMCxEZS51c2VTdGF0ZSkoITEpLGY9YWwoUGUoKSwibW9vZCIpWzBdfHwicmluZyIsW3ksd109KDAsRGUudXNlU3RhdGUpKGYpLFtiLHZdPSgwLERlLnVzZVN0YXRlKShmKSxbaCxnXT0oMCxEZS51c2VTdGF0ZSkoMCksW20seF09KDAsRGUudXNlU3RhdGUpKCExKTsoMCxEZS51c2VFZmZlY3QpKCgpPT57aWYoIWQpcmV0dXJuO0UoIlNldHRpbmcgdGltZW91dCB0byByZXNldCBtb29kIGNvbXBvbmVudCBhZnRlciBzdWJtaXNzaW9uIik7bGV0IEk9c2V0VGltZW91dCgoKT0+e3UoITEpLGEobnVsbCkscygiIil9LEFEKTtyZXR1cm4oKT0+Y2xlYXJUaW1lb3V0KEkpfSxbZF0pO2xldCBTPSgpPT57dih5KSx4KCEwKX0sXz0oKT0+e3coYiksZyhJPT5JKzEpLHgoITEpLGUuc2V0U2V0dGluZyhLbygibW9vZCIpLEpTT04uc3RyaW5naWZ5KFtiXSkpfSxEPSgpPT57dih5KSx4KCExKX0sQT0oKT0+e2EobnVsbCkscygiIil9LHthdmVyYWdlTW9vZDpUfT1BXyh0KSxMPU1fKHIsdCxULHksaCxTKSx6PW0/cihmbyx7dGl0bGU6Ik1vb2QgVmlzdWFsaXphdGlvbiIsb25TdWJtaXQ6XyxvbkNhbmNlbDpELHN1Ym1pdExhYmVsOiJBcHBseSJ9LHIoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkIn0scigiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQtbGFiZWwifSwiRGlzcGxheSBzdHlsZSIpLFtbInJpbmciLCJSaW5nIl0sWyJ3YXZlIiwiV2F2ZSJdXS5tYXAoKFtJLE1dKT0+cigibGFiZWwiLHtrZXk6SSxjbGFzc05hbWU6Im1vb2Qtdml6LWNvbmZpZy1vcHRpb24ifSxyKCJpbnB1dCIse3R5cGU6InJhZGlvIixuYW1lOiJtb29kLXZpei1tb2RlIix2YWx1ZTpJLGNoZWNrZWQ6Yj09PUksb25DaGFuZ2U6KCk9PnYoSSl9KSxNKSkpKTpudWxsO3JldHVybiBkP3Iob2Use3RpdGxlOnJlKCJtb29kIiksaWNvbjoiXHV7MUYzQUR9Iix3aWRnZXRJZDoibW9vZCJ9LHoscigiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLWNvbmZpcm1hdGlvbiJ9LHIoImRpdiIse2NsYXNzTmFtZToibW9vZC1jb25maXJtYXRpb24taWNvbiJ9LG8uZW1vamkpLHIoInAiLHtjbGFzc05hbWU6Im1vb2QtY29uZmlybWF0aW9uLXRleHQifSwiTW9vZCByYXRpbmcgcmVjb3JkZWQiKSksTCk6cihvZSx7dGl0bGU6cmUoIm1vb2QiKSxpY29uOiJcdXsxRjNBRH0iLHdpZGdldElkOiJtb29kIn0seixyKCJkaXYiLHtjbGFzc05hbWU6Im1vb2Qtc2VsZWN0b3IifSxLbC5tYXAoST0+cigiYnV0dG9uIix7a2V5OkkudmFsdWUsY2xhc3NOYW1lOiJtb29kLWJ0biIrKG8/LnZhbHVlPT09SS52YWx1ZT8iIG1vb2QtYnRuLS1zZWxlY3RlZCI6IiIpLHRpdGxlOkkubGFiZWwsb25DbGljazooKT0+X18oSSxsLGQsYSl9LHIoInNwYW4iLHtjbGFzc05hbWU6Im1vb2QtZW1vamkifSxJLmVtb2ppKSkpKSxvIT09bnVsbCYmcigiZGl2Iix7Y2xhc3NOYW1lOiJtb29kLWRldGFpbHMifSxyKCJsYWJlbCIse2NsYXNzTmFtZToibW9vZC1kZXRhaWxzLWxhYmVsIn0sIk1vcmUgZGV0YWlscyAob3B0aW9uYWwpIikscigidGV4dGFyZWEiLHtjbGFzc05hbWU6Im1vb2QtZGV0YWlscy10ZXh0YXJlYSIsdmFsdWU6aSxvbkNoYW5nZTpJPT5zKEkudGFyZ2V0LnZhbHVlKSxvbktleURvd246ST0+Q18oZSxJLG8saSxjLHUsbikscGxhY2Vob2xkZXI6IldoYXQncyBvbiB5b3VyIG1pbmQ/Iixyb3dzOk9EfSkpLG8hPT1udWxsJiZyKCJkaXYiLHtjbGFzc05hbWU6Im1vb2Qtc3VibWl0LXJvdyJ9LHIoImJ1dHRvbiIse2NsYXNzTmFtZToibW9vZC1jYW5jZWwtYnRuIixvbkNsaWNrOkEsZGlzYWJsZWQ6bH0sIkNhbmNlbCIpLHIoImJ1dHRvbiIse2NsYXNzTmFtZToibW9vZC1zdWJtaXQtYnRuIixvbkNsaWNrOigpPT5DMChlLG8saSxjLHUsbiksZGlzYWJsZWQ6bH0sbD8iUmVjb3JkaW5nLi4uIjoiU3VibWl0IikpLG89PT1udWxsJiZMKX12YXIgbHQ9cGUoZGUoKSk7dmFyIFlsPSJwZWFrLWhvdXJzIjtmdW5jdGlvbiBQXyhlKXtyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOjI0fSwodCxuKT0+cmEobixlKSl9ZnVuY3Rpb24gTzAoZSl7cmV0dXJuIGU/ZSBpbnN0YW5jZW9mIERhdGU/ZTp0eXBlb2YgZT09Im51bWJlciI/bmV3IERhdGUoZTwxZTEyP2UqMWUzOmUpOm5ldyBEYXRlKGUpOm51bGx9ZnVuY3Rpb24gTF8oZSl7bGV0IHQ9VmUoZSksbj10LmdldEZ1bGxZZWFyKCkscj10LmdldE1vbnRoKCksbz1uZXcgRGF0ZShuLHIsMSwwLDAsMCwwKSxhPW5ldyBEYXRlKG4scisxLDEsMCwwLDAsMCk7cmV0dXJue2Zyb206TWF0aC5mbG9vcihvLmdldFRpbWUoKS8xZTMpLHRvOk1hdGguZmxvb3IoYS5nZXRUaW1lKCkvMWUzKSxtb250aEtleTpgJHtufS0ke1N0cmluZyhyKzEpLnBhZFN0YXJ0KDIsIjAiKX1gfX1mdW5jdGlvbiB6XyhlKXtsZXQgdD1uZXcgQXJyYXkoMjQpLmZpbGwoMCksbj1uZXcgQXJyYXkoMjQpLmZpbGwoMCkscj0wO2ZvcihsZXQgaSBvZiBlKXtsZXQgcz1pLnZpY3RvcnlWYWx1ZXx8MSxsPU8wKGkuY3JlYXRlZEF0fHxpLnN0YXJ0QXQpO2wmJiFpc05hTihsKSYmKHRbbC5nZXRIb3VycygpXSs9cyxyKyspO2xldCBjPU8wKGkuY29tcGxldGVkQXQpO2MmJiFpc05hTihjKSYmKG5bYy5nZXRIb3VycygpXSs9cyl9bGV0IG89dC5pbmRleE9mKE1hdGgubWF4KC4uLnQpKSxhPW4uaW5kZXhPZihNYXRoLm1heCguLi5uKSk7cmV0dXJue2NvbXBsZXRlZEJ5SG91cjpuLGNyZWF0ZWRCeUhvdXI6dCxwZWFrQ29tcGxldGVIb3VySW5kZXg6YSxwZWFrQ3JlYXRlSG91ckluZGV4Om8sdG90YWxUYXNrczpyfX1mdW5jdGlvbiBGXyhlKXtsZXQgdD1nZXRDb21wdXRlZFN0eWxlKGUpO3JldHVybntiYXJDcmVhdGVkOnQuZ2V0UHJvcGVydHlWYWx1ZSgiLS1kYXNoYm9hcmQtY29sb3ItYmx1ZSIpLnRyaW0oKXx8IiM1YjdiYmYiLGJhckNvbXBsZXRlZDp0LmdldFByb3BlcnR5VmFsdWUoIi0tZGFzaGJvYXJkLWNvbG9yLWFjY2VudCIpLnRyaW0oKXx8IiNlODg1M2QiLGF4aXNUZXh0OnQuZ2V0UHJvcGVydHlWYWx1ZSgiLS1kYXNoYm9hcmQtY29sb3ItdGV4dC1zZWNvbmRhcnkiKS50cmltKCl8fCIjN2E4Njk5IixncmlkTGluZTp0LmdldFByb3BlcnR5VmFsdWUoIi0tZGFzaGJvYXJkLWNvbG9yLWJvcmRlciIpLnRyaW0oKXx8IiNkOGRkZTYifX1mdW5jdGlvbiBJMChlLHQsbixyKXtsZXQgbz1lLmdldENvbnRleHQoIjJkIiksYT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSxpPWUucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPWkud2lkdGgsbD1pLmhlaWdodDtpZihzPD0wfHxsPD0wKXJldHVybjtlLndpZHRoPXMqYSxlLmhlaWdodD1sKmEsZS5zdHlsZS53aWR0aD1gJHtzfXB4YCxlLnN0eWxlLmhlaWdodD1gJHtsfXB4YCxvLnNjYWxlKGEsYSk7bGV0IGM9Rl8oZSksZD00OCx1PTEyLHA9MTIsZj00MCx5PXMtZC11LHc9bC1wLWYsYj1NYXRoLm1heCguLi50LC4uLm4sMSksdj1NYXRoLmNlaWwoYi8xMCkqMTB8fDEwO28uY2xlYXJSZWN0KDAsMCxzLGwpO2xldCBoPTU7by5mb250PSIxMXB4IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIixvLnRleHRBbGlnbj0icmlnaHQiLG8udGV4dEJhc2VsaW5lPSJtaWRkbGUiO2ZvcihsZXQgRD0wO0Q8PWg7RCsrKXtsZXQgQT1NYXRoLnJvdW5kKHYvaCpEKSxUPXArdy13KkQvaDtvLmZpbGxTdHlsZT1jLmF4aXNUZXh0LG8uZmlsbFRleHQoYCR7QX1gLGQtOCxUKSxEPjAmJihvLnN0cm9rZVN0eWxlPWMuZ3JpZExpbmUsby5nbG9iYWxBbHBoYT0uNCxvLmxpbmVXaWR0aD0uNSxvLmJlZ2luUGF0aCgpLG8ubW92ZVRvKGQsVCksby5saW5lVG8oZCt5LFQpLG8uc3Ryb2tlKCksby5nbG9iYWxBbHBoYT0xKX1sZXQgZz0yNCxtPXkvZyx4PW0qLjMyLFM9bSouMDQ7Zm9yKGxldCBEPTA7RDxnO0QrKyl7bGV0IEE9ZCtEKm0rKG0teCoyLVMpLzIsVD10W0RdL3YqdyxMPW5bRF0vdip3O28uZmlsbFN0eWxlPWMuYmFyQ3JlYXRlZCxSMChvLEEscCt3LVQseCxULDIpLG8uZmlsbFN0eWxlPWMuYmFyQ29tcGxldGVkLFIwKG8sQSt4K1MscCt3LUwseCxMLDIpfW8uZmlsbFN0eWxlPWMuYXhpc1RleHQsby5mb250PSIxMHB4IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgc3lzdGVtLXVpLCBzYW5zLXNlcmlmIixvLnRleHRBbGlnbj0iY2VudGVyIixvLnRleHRCYXNlbGluZT0idG9wIjtsZXQgXz15PDMwMD80OjI7Zm9yKGxldCBEPTA7RDxnO0QrPV8pe2xldCBBPWQrRCptK20vMjtvLmZpbGxUZXh0KHJbRF0sQSxwK3crOCl9fWZ1bmN0aW9uIFIwKGUsdCxuLHIsbyxhKXtvPDF8fChhPU1hdGgubWluKGEsby8yLHIvMiksZS5iZWdpblBhdGgoKSxlLm1vdmVUbyh0K2EsbiksZS5saW5lVG8odCtyLWEsbiksZS5hcmNUbyh0K3Isbix0K3IsbithLGEpLGUubGluZVRvKHQrcixuK28pLGUubGluZVRvKHQsbitvKSxlLmxpbmVUbyh0LG4rYSksZS5hcmNUbyh0LG4sdCthLG4sYSksZS5jbG9zZVBhdGgoKSxlLmZpbGwoKSl9ZnVuY3Rpb24gVV8oZSx0KXtsZXQgbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9dC5jbGllbnRYLW4ubGVmdCxvPW4ud2lkdGgsYT00OCxzPW8tYS0xMixsPXItYTtyZXR1cm4gbDwwfHxsPnM/LTE6TWF0aC5mbG9vcihsL3MqMjQpfWZ1bmN0aW9uIFhwKGUsdCxuKXtyZXR1cm4gZSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1ldHJpYy1jYXJkIixrZXk6dH0sZSgiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1ldHJpYy1sYWJlbCJ9LHQpLGUoImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy1tZXRyaWMtdmFsdWUifSxuKSl9ZnVuY3Rpb24gTTAoZSx0LG4pe3JldHVybiBlKCJzcGFuIix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLWxlZ2VuZC1pdGVtIixrZXk6bn0sZSgic3BhbiIse2NsYXNzTmFtZTpgcGVhay1ob3Vycy1sZWdlbmQtc3dhdGNoICR7dH1gfSksbil9ZnVuY3Rpb24gWnAoe2FwcDplLGN1cnJlbnREYXRlOnQsc2VsZWN0ZWREYXRlOm4sdGltZUZvcm1hdDpyfSl7bGV0IG89bHQuY3JlYXRlRWxlbWVudCxhPSgwLGx0LnVzZVJlZikobnVsbCksW2ksc109KDAsbHQudXNlU3RhdGUpKG51bGwpLFtsLGNdPSgwLGx0LnVzZVN0YXRlKShbXSksZD0oMCxsdC51c2VSZWYpKG51bGwpLHU9bnx8dDsoMCxsdC51c2VFZmZlY3QpKCgpPT57aWYoIXV8fCFlKXJldHVybjtsZXR7ZnJvbTpELHRvOkEsbW9udGhLZXk6VH09TF8odSk7aWYoZC5jdXJyZW50PT09VClyZXR1cm47ZC5jdXJyZW50PVQ7bGV0IEw9ITE7cmV0dXJuIGUuZ2V0Q29tcGxldGVkVGFza3MoRCxBKS50aGVuKHo9PntMfHxjKEFycmF5LmlzQXJyYXkoeik/ejpbXSl9KS5jYXRjaCh6PT57RSgiW3BlYWstaG91cnNdIGZhaWxlZCB0byBmZXRjaCBtb250aCB0YXNrcyIseiksTHx8YyhbXSl9KSwoKT0+e0w9ITB9fSxbZSx1XSk7bGV0IHA9UF8ocikse2NvbXBsZXRlZEJ5SG91cjpmLGNyZWF0ZWRCeUhvdXI6eSxwZWFrQ29tcGxldGVIb3VySW5kZXg6dyxwZWFrQ3JlYXRlSG91ckluZGV4OmIsdG90YWxUYXNrczp2fT0oMCxsdC51c2VNZW1vKSgoKT0+el8obCksW2xdKSxoPXBbYl0sZz1wW3ddLHttb250aFN1YnRpdGxlOm0sZGF0ZVJhbmdlOnh9PSgwLGx0LnVzZU1lbW8pKCgpPT57aWYoIXUpcmV0dXJue21vbnRoU3VidGl0bGU6bnVsbCxkYXRlUmFuZ2U6bnVsbH07bGV0IEQ9VmUodSksQT1ELmdldEZ1bGxZZWFyKCksVD1ELmdldE1vbnRoKCk7cmV0dXJue21vbnRoU3VidGl0bGU6RC50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDoibG9uZyIseWVhcjoibnVtZXJpYyJ9KSxkYXRlUmFuZ2U6e3N0YXJ0Om5ldyBEYXRlKEEsVCwxKSxlbmQ6bmV3IERhdGUoQSxUKzEsMCl9fX0sW3VdKTsoMCxsdC51c2VFZmZlY3QpKCgpPT57aWYoIWEuY3VycmVudClyZXR1cm47STAoYS5jdXJyZW50LHksZixwKTtsZXQgRD0oKT0+e2EuY3VycmVudCYmSTAoYS5jdXJyZW50LHksZixwKX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLEQpLCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixEKX0sW2YseSxwXSk7bGV0IFM9KDAsbHQudXNlQ2FsbGJhY2spKEQ9PntsZXQgQT1VXyhhLmN1cnJlbnQsRCk7aWYoQTwwfHxBPjIzKXtzKG51bGwpO3JldHVybn1sZXQgVD1hLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cyh7eDpELmNsaWVudFgtVC5sZWZ0LHk6RC5jbGllbnRZLVQudG9wLTYwLGhvdXI6cFtBXSxjcmVhdGVkOnlbQV0sY29tcGxldGVkOmZbQV19KX0sW3ksZl0pLF89KDAsbHQudXNlQ2FsbGJhY2spKCgpPT5zKG51bGwpLFtdKTtyZXR1cm4gdj09PTA/byhvZSx7dGl0bGU6cmUoWWwpLGljb246Ilx1MjNGMCIsd2lkZ2V0SWQ6WWwsc3VidGl0bGU6bX0sbygiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLWVtcHR5In0sbygicCIsbnVsbCwiTm8gY29tcGxldGVkIHRhc2sgZGF0YSBhdmFpbGFibGUgeWV0LiIpKSk6byhvZSx7dGl0bGU6cmUoWWwpLGljb246Ilx1MjNGMCIsd2lkZ2V0SWQ6WWwsc3VidGl0bGU6bX0sbygiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLW1ldHJpY3MtZ3JpZCJ9LFhwKG8sIlRhc2tzIGFuYWx5emVkIix2KSxYcChvLCJQZWFrIGNyZWF0ZSBob3VyIixoKSxYcChvLCJQZWFrIGNvbXBsZXRlIGhvdXIiLGcpKSxvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtbGVnZW5kIn0sTTAobywicGVhay1ob3Vycy1sZWdlbmQtc3dhdGNoLS1jcmVhdGVkIiwiQ3JlYXRlZCB2YWx1ZSIpLE0wKG8sInBlYWstaG91cnMtbGVnZW5kLXN3YXRjaC0tY29tcGxldGVkIiwiQ29tcGxldGVkIHZhbHVlIikpLG8oImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy1jaGFydC1jb250YWluZXIifSxvKCJjYW52YXMiLHtyZWY6YSxjbGFzc05hbWU6InBlYWstaG91cnMtY2FudmFzIixvbk1vdXNlTW92ZTpTLG9uTW91c2VMZWF2ZTpffSksaSYmbygiZGl2Iix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLXRvb2x0aXAiLHN0eWxlOntsZWZ0OmkueCx0b3A6aS55LHRyYW5zZm9ybToidHJhbnNsYXRlWCgtNTAlKSJ9fSxvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1oZWFkZXIifSxpLmhvdXIpLG8oImRpdiIse2NsYXNzTmFtZToicGVhay1ob3Vycy10b29sdGlwLXJvdyJ9LG8oInNwYW4iLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1sYWJlbCBwZWFrLWhvdXJzLXRvb2x0aXAtbGFiZWwtLWNyZWF0ZWQifSwiQ3JlYXRlZDoiKSxgICR7aS5jcmVhdGVkfSBwdHNgKSxvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtdG9vbHRpcC1yb3cifSxvKCJzcGFuIix7Y2xhc3NOYW1lOiJwZWFrLWhvdXJzLXRvb2x0aXAtbGFiZWwgcGVhay1ob3Vycy10b29sdGlwLWxhYmVsLS1jb21wbGV0ZWQifSwiQ29tcGxldGVkOiIpLGAgJHtpLmNvbXBsZXRlZH0gcHRzYCkpKSx4JiZvKCJkaXYiLHtjbGFzc05hbWU6InBlYWstaG91cnMtZm9vdGVyIn0sbSkpfXZhciBycj1wZShkZSgpKTt2YXIgJF89W3t0ZXh0OiJUaGUgc2VjcmV0IG9mIGdldHRpbmcgYWhlYWQgaXMgZ2V0dGluZyBzdGFydGVkLiIsYXV0aG9yOiJNYXJrIFR3YWluIn0se3RleHQ6IllvdSBkb24ndCBoYXZlIHRvIGJlIGdyZWF0IHRvIHN0YXJ0LCBidXQgeW91IGhhdmUgdG8gc3RhcnQgdG8gYmUgZ3JlYXQuIixhdXRob3I6IlppZyBaaWdsYXIifSx7dGV4dDoiQWN0aW9uIGlzIHRoZSBmb3VuZGF0aW9uYWwga2V5IHRvIGFsbCBzdWNjZXNzLiIsYXV0aG9yOiJQYWJsbyBQaWNhc3NvIn0se3RleHQ6IkRvbmUgaXMgYmV0dGVyIHRoYW4gcGVyZmVjdC4iLGF1dGhvcjoiU2hlcnlsIFNhbmRiZXJnIn0se3RleHQ6IkFtYXRldXJzIHNpdCBhbmQgd2FpdCBmb3IgaW5zcGlyYXRpb247IHRoZSByZXN0IG9mIHVzIGp1c3QgZ2V0IHVwIGFuZCBnbyB0byB3b3JrLiIsYXV0aG9yOiJTdGVwaGVuIEtpbmcifSx7dGV4dDoiVGhlIHdheSB0byBnZXQgc3RhcnRlZCBpcyB0byBxdWl0IHRhbGtpbmcgYW5kIGJlZ2luIGRvaW5nLiIsYXV0aG9yOiJXYWx0IERpc25leSJ9LHt0ZXh0OiJGb2N1cyBvbiBiZWluZyBwcm9kdWN0aXZlIGluc3RlYWQgb2YgYnVzeS4iLGF1dGhvcjoiVGltIEZlcnJpc3MifSx7dGV4dDoiSXQncyBub3QgYWJvdXQgaGF2aW5nIHRpbWUuIEl0J3MgYWJvdXQgbWFraW5nIHRpbWUuIixhdXRob3I6IiJ9LHt0ZXh0OiJXb3JrIGV4cGFuZHMgdG8gZmlsbCB0aGUgdGltZSBhdmFpbGFibGUgZm9yIGl0cyBjb21wbGV0aW9uLiIsYXV0aG9yOiJDeXJpbCBOb3J0aGNvdGUgUGFya2luc29uIn0se3RleHQ6IlN0b3Agd2FpdGluZyBmb3IgdGhlIHJpZ2h0IHRpbWUuIFRoZSB0aW1lIHdpbGwgbmV2ZXIgYmUganVzdCByaWdodC4iLGF1dGhvcjoiTmFwb2xlb24gSGlsbCJ9LHt0ZXh0OiJNb3RpdmF0aW9uIGlzIHdoYXQgZ2V0cyB5b3Ugc3RhcnRlZC4gSGFiaXQgaXMgd2hhdCBrZWVwcyB5b3UgZ29pbmcuIixhdXRob3I6IkppbSBSeXVuIn0se3RleHQ6IklmIHlvdSBzcGVuZCB0b28gbXVjaCB0aW1lIHRoaW5raW5nIGFib3V0IGEgdGhpbmcsIHlvdSdsbCBuZXZlciBnZXQgaXQgZG9uZS4iLGF1dGhvcjoiQnJ1Y2UgTGVlIn0se3RleHQ6IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb3JkaW5hcnkgYW5kIGV4dHJhb3JkaW5hcnkgaXMgdGhhdCBsaXR0bGUgJ2V4dHJhJy4iLGF1dGhvcjoiIn0se3RleHQ6IkVmZmljaWVuY3kgaXMgZG9pbmcgdGhpbmdzIHJpZ2h0LiBFZmZlY3RpdmVuZXNzIGlzIGRvaW5nIHRoZSByaWdodCB0aGluZ3MuIixhdXRob3I6IlBldGVyIERydWNrZXIifSx7dGV4dDoiWW91IGFyZSBuZXZlciB0b28gb2xkIHRvIHNldCBhbm90aGVyIGdvYWwgb3IgdG8gZHJlYW0gYSBuZXcgZHJlYW0uIixhdXRob3I6IkMuUy4gTGV3aXMifSx7dGV4dDoiU21hbGwgZGFpbHkgaW1wcm92ZW1lbnRzIGFyZSB0aGUga2V5IHRvIHN0YWdnZXJpbmcgbG9uZy10ZXJtIHJlc3VsdHMuIixhdXRob3I6IlJvYmluIFNoYXJtYSJ9LHt0ZXh0OiJEcmVhbXMgZG9uJ3Qgd29yayB1bmxlc3MgeW91IGRvLiIsYXV0aG9yOiJKb2huIEMuIE1heHdlbGwifSx7dGV4dDoiVGhlIG1vc3QgZWZmZWN0aXZlIHdheSB0byBkbyBpdCBpcyB0byBkbyBpdC4iLGF1dGhvcjoiQW1lbGlhIEVhcmhhcnQifSx7dGV4dDoiVGFrZSB0aW1lIHRvIGRlbGliZXJhdGUsIGJ1dCB3aGVuIHRoZSB0aW1lIGZvciBhY3Rpb24gYXJyaXZlcywgc3RvcCB0aGlua2luZyBhbmQgZ28gaW4uIixhdXRob3I6Ik5hcG9sZW9uIEJvbmFwYXJ0ZSJ9LHt0ZXh0OiJTdHJpdmluZyBmb3IgZXhjZWxsZW5jZSBtb3RpdmF0ZXMgeW91OyBzdHJpdmluZyBmb3IgcGVyZmVjdGlvbiBpcyBkZW1vcmFsaXppbmcuIixhdXRob3I6IkhhcnJpZXQgQnJhaWtlciJ9LHt0ZXh0OiJUaGUgam91cm5leSBvZiBhIHRob3VzYW5kIG1pbGVzIGJlZ2lucyB3aXRoIGEgc2luZ2xlIHN0ZXAuIixhdXRob3I6IkxhbyBUenUifSx7dGV4dDoiQSB5ZWFyIGZyb20gbm93IHlvdSBtYXkgd2lzaCB5b3UgaGFkIHN0YXJ0ZWQgdG9kYXkuIixhdXRob3I6IkthcmVuIExhbWIifSx7dGV4dDoiVGhlIGJlZ2lubmluZyBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgcGFydCBvZiB0aGUgd29yay4iLGF1dGhvcjoiUGxhdG8ifSx7dGV4dDoiWW91IGRvbid0IG5lZWQgdG8gc2VlIHRoZSB3aG9sZSBzdGFpcmNhc2UsIGp1c3QgdGFrZSB0aGUgZmlyc3Qgc3RlcC4iLGF1dGhvcjoiTWFydGluIEx1dGhlciBLaW5nIEpyLiJ9LHt0ZXh0OiJTdGFydCB3aGVyZSB5b3UgYXJlLiBVc2Ugd2hhdCB5b3UgaGF2ZS4gRG8gd2hhdCB5b3UgY2FuLiIsYXV0aG9yOiJBcnRodXIgQXNoZSJ9LHt0ZXh0OiJUaGUgZmlyc3Qgc3RlcCBpcyB5b3UgaGF2ZSB0byBzYXkgdGhhdCB5b3UgY2FuLiIsYXV0aG9yOiJXaWxsIFNtaXRoIn0se3RleHQ6IkluIHRoZSBtaWRkbGUgb2YgZXZlcnkgZGlmZmljdWx0eSBsaWVzIG9wcG9ydHVuaXR5LiIsYXV0aG9yOiJBbGJlcnQgRWluc3RlaW4ifSx7dGV4dDoiRXZlbiB0aGUgbG9uZ2VzdCBqb3VybmV5IHN0YXJ0cyB3aXRoIHB1dHRpbmcgb25lIGZvb3QgaW4gZnJvbnQgb2YgdGhlIG90aGVyLiIsYXV0aG9yOiIifSx7dGV4dDoiWW91IGRvbid0IGhhdmUgdG8gYmUgcGVyZmVjdCB0byBzdGFydCwgYnV0IHlvdSBoYXZlIHRvIHN0YXJ0IHRvIGJlIHBlcmZlY3QuIixhdXRob3I6IiJ9LHt0ZXh0OiJDb3VyYWdlIGlzIG5vdCB0aGUgYWJzZW5jZSBvZiBmZWFyLCBidXQgdGhlIGp1ZGdtZW50IHRoYXQgc29tZXRoaW5nIGVsc2UgaXMgbW9yZSBpbXBvcnRhbnQuIixhdXRob3I6IkFtYnJvc2UgUmVkbW9vbiJ9LHt0ZXh0OiJXaGF0ZXZlciB5b3UgY2FuIGRvLCBvciBkcmVhbSB5b3UgY2FuIFx1MjAxNCBiZWdpbiBpdC4gQm9sZG5lc3MgaGFzIGdlbml1cywgcG93ZXIsIGFuZCBtYWdpYyBpbiBpdC4iLGF1dGhvcjoiSm9oYW5uIFdvbGZnYW5nIHZvbiBHb2V0aGUifSx7dGV4dDoiVGhlIGhhcmRlc3QgcGFydCBpcyBzdGFydGluZy4gT25jZSB5b3UgZ2V0IHRoYXQgb3V0IG9mIHRoZSB3YXksIHlvdSdsbCBmaW5kIHRoZSByZXN0IG9mIHRoZSBqb3VybmV5IG11Y2ggZWFzaWVyLiIsYXV0aG9yOiIifSx7dGV4dDoiSW5hY3Rpb24gYnJlZWRzIGRvdWJ0IGFuZCBmZWFyLiBBY3Rpb24gYnJlZWRzIGNvbmZpZGVuY2UgYW5kIGNvdXJhZ2UuIixhdXRob3I6IkRhbGUgQ2FybmVnaWUifSx7dGV4dDoiVGhlIGJlc3QgdGltZSB0byBwbGFudCBhIHRyZWUgd2FzIHR3ZW50eSB5ZWFycyBhZ28uIFRoZSBzZWNvbmQgYmVzdCB0aW1lIGlzIG5vdy4iLGF1dGhvcjoiQ2hpbmVzZSBQcm92ZXJiIn0se3RleHQ6IllvdSBkb24ndCBoYXZlIHRvIGJlIGZlYXJsZXNzLiBKdXN0IGRvbid0IGxldCBmZWFyIHN0b3AgeW91LiIsYXV0aG9yOiIifSx7dGV4dDoiUHJvZ3Jlc3MsIG5vdCBwZXJmZWN0aW9uLCBpcyB0aGUgZ29hbC4iLGF1dGhvcjoiIn0se3RleHQ6Ik5vdGhpbmcgd2lsbCB3b3JrIHVubGVzcyB5b3UgZG8uIixhdXRob3I6Ik1heWEgQW5nZWxvdSJ9LHt0ZXh0OiJMZWFwIGFuZCB0aGUgbmV0IHdpbGwgYXBwZWFyLiIsYXV0aG9yOiJKb2huIEJ1cnJvdWdocyJ9LHt0ZXh0OiJUaGUgZmlyc3Qgc3RlcCBiaW5kcyBvbmUgdG8gdGhlIHNlY29uZC4iLGF1dGhvcjoiRnJlbmNoIFByb3ZlcmIifSx7dGV4dDoiVGFrZSB0aGUgZmlyc3Qgc3RlcCBpbiBmYWl0aC4gWW91IGRvbid0IGhhdmUgdG8gc2VlIHRoZSB3aG9sZSBzdGFpcmNhc2UuIixhdXRob3I6Ik1hcnRpbiBMdXRoZXIgS2luZyBKci4ifSx7dGV4dDoiVG9kYXkgaXMgYSBuZXcgZGF5LiBEb24ndCBsZXQgeWVzdGVyZGF5J3MgZmFpbHVyZXMgaGF1bnQgaXQuIixhdXRob3I6IiJ9LHt0ZXh0OiJFdmVyeSBtb3JuaW5nIHdlIGFyZSBib3JuIGFnYWluLiBXaGF0IHdlIGRvIHRvZGF5IG1hdHRlcnMgbW9zdC4iLGF1dGhvcjoiQnVkZGhhIn0se3RleHQ6IldpdGggdGhlIG5ldyBkYXkgY29tZXMgbmV3IHN0cmVuZ3RoIGFuZCBuZXcgdGhvdWdodHMuIixhdXRob3I6IkVsZWFub3IgUm9vc2V2ZWx0In0se3RleHQ6IlRvZGF5IGlzIGFub3RoZXIgY2hhbmNlIHRvIGdldCBiZXR0ZXIuIixhdXRob3I6IiJ9LHt0ZXh0OiJZZXN0ZXJkYXkgaXMgbm90IG91cnMgdG8gcmVjb3ZlciwgYnV0IHRvbW9ycm93IGlzIG91cnMgdG8gd2luIG9yIGxvc2UuIixhdXRob3I6Ikx5bmRvbiBCLiBKb2huc29uIn0se3RleHQ6IlRoZSBzdW4gaXMgYSBkYWlseSByZW1pbmRlciB0aGF0IHdlIHRvbyBjYW4gcmlzZSBhZ2FpbiBmcm9tIHRoZSBkYXJrbmVzcy4iLGF1dGhvcjoiUy4gQWpuYSJ9LHt0ZXh0OiJFdmVyeSBkYXkgaXMgYSBzZWNvbmQgY2hhbmNlLiIsYXV0aG9yOiIifSx7dGV4dDoiVG9kYXkncyBhY2NvbXBsaXNobWVudHMgd2VyZSB5ZXN0ZXJkYXkncyBpbXBvc3NpYmlsaXRpZXMuIixhdXRob3I6IlJvYmVydCBILiBTY2h1bGxlciJ9LHt0ZXh0OiJFYWNoIG5ldyBkYXkgaXMgYSBibGFuayBwYWdlIGluIHRoZSBkaWFyeSBvZiB5b3VyIGxpZmUuIixhdXRob3I6IiJ9LHt0ZXh0OiJBbiBvcHRpbWlzdCBzZWVzIGFuIG9wcG9ydHVuaXR5IGluIGV2ZXJ5IGNhbGFtaXR5OyBhIHBlc3NpbWlzdCBzZWVzIGEgY2FsYW1pdHkgaW4gZXZlcnkgb3Bwb3J0dW5pdHkuIixhdXRob3I6IldpbnN0b24gQ2h1cmNoaWxsIn0se3RleHQ6Ik9wcG9ydHVuaXRpZXMgZG9uJ3QgaGFwcGVuLiBZb3UgY3JlYXRlIHRoZW0uIixhdXRob3I6IkNocmlzIEdyb3NzZXIifSx7dGV4dDoiVGhpcyBpcyBhIHdvbmRlcmZ1bCBkYXkuIEkndmUgbmV2ZXIgc2VlbiB0aGlzIG9uZSBiZWZvcmUuIixhdXRob3I6Ik1heWEgQW5nZWxvdSJ9LHt0ZXh0OiJZb3UgaGF2ZSBleGFjdGx5IG9uZSBsaWZlIGluIHdoaWNoIHRvIGRvIGV2ZXJ5dGhpbmcgeW91J2xsIGV2ZXIgZG8uIEFjdCBhY2NvcmRpbmdseS4iLGF1dGhvcjoiQ29saW4gV3JpZ2h0In0se3RleHQ6IkxpZmUgaXMgd2hhdCBoYXBwZW5zIHdoZW4geW91J3JlIGJ1c3kgbWFraW5nIG90aGVyIHBsYW5zLiIsYXV0aG9yOiJKb2huIExlbm5vbiJ9LHt0ZXh0OiJZb3VyIGxpZmUgZG9lcyBub3QgZ2V0IGJldHRlciBieSBjaGFuY2UsIGl0IGdldHMgYmV0dGVyIGJ5IGNoYW5nZS4iLGF1dGhvcjoiSmltIFJvaG4ifSx7dGV4dDoiRG9uJ3Qgd2F0Y2ggdGhlIGNsb2NrOyBkbyB3aGF0IGl0IGRvZXMuIEtlZXAgZ29pbmcuIixhdXRob3I6IlNhbSBMZXZlbnNvbiJ9LHt0ZXh0OiJCZWxpZXZlIHlvdSBjYW4gYW5kIHlvdSdyZSBoYWxmd2F5IHRoZXJlLiIsYXV0aG9yOiJUaGVvZG9yZSBSb29zZXZlbHQifSx7dGV4dDoiSXQgZG9lcyBub3QgbWF0dGVyIGhvdyBzbG93bHkgeW91IGdvIGFzIGxvbmcgYXMgeW91IGRvIG5vdCBzdG9wLiIsYXV0aG9yOiJDb25mdWNpdXMifSx7dGV4dDoiVGhlIG9ubHkgbGltaXQgdG8gb3VyIHJlYWxpemF0aW9uIG9mIHRvbW9ycm93IHdpbGwgYmUgb3VyIGRvdWJ0cyBvZiB0b2RheS4iLGF1dGhvcjoiRnJhbmtsaW4gRC4gUm9vc2V2ZWx0In0se3RleHQ6IlRoZSBmdXR1cmUgYmVsb25ncyB0byB0aG9zZSB3aG8gYmVsaWV2ZSBpbiB0aGUgYmVhdXR5IG9mIHRoZWlyIGRyZWFtcy4iLGF1dGhvcjoiRWxlYW5vciBSb29zZXZlbHQifSx7dGV4dDoiSWYgeW91J3JlIGdvaW5nIHRocm91Z2ggaGVsbCwga2VlcCBnb2luZy4iLGF1dGhvcjoiV2luc3RvbiBDaHVyY2hpbGwifSx7dGV4dDoiUGVyc2lzdGVuY2UgZ3VhcmFudGVlcyB0aGF0IHJlc3VsdHMgYXJlIGluZXZpdGFibGUuIixhdXRob3I6IlBhcmFtYWhhbnNhIFlvZ2FuYW5kYSJ9LHt0ZXh0OiJTdWNjZXNzIGlzIG5vdCBmaW5hbCwgZmFpbHVyZSBpcyBub3QgZmF0YWw6IGl0IGlzIHRoZSBjb3VyYWdlIHRvIGNvbnRpbnVlIHRoYXQgY291bnRzLiIsYXV0aG9yOiJXaW5zdG9uIENodXJjaGlsbCJ9LHt0ZXh0OiJZb3UgbWlzcyAxMDAlIG9mIHRoZSBzaG90cyB5b3UgZG9uJ3QgdGFrZS4iLGF1dGhvcjoiV2F5bmUgR3JldHpreSJ9LHt0ZXh0OiJJdCBhbHdheXMgc2VlbXMgaW1wb3NzaWJsZSB1bnRpbCBpdCdzIGRvbmUuIixhdXRob3I6Ik5lbHNvbiBNYW5kZWxhIn0se3RleHQ6IldlIG1heSBlbmNvdW50ZXIgbWFueSBkZWZlYXRzLCBidXQgd2UgbXVzdCBub3QgYmUgZGVmZWF0ZWQuIixhdXRob3I6Ik1heWEgQW5nZWxvdSJ9LHt0ZXh0OiJJIG5ldmVyIGRyZWFtZWQgYWJvdXQgc3VjY2Vzcy4gSSB3b3JrZWQgZm9yIGl0LiIsYXV0aG9yOiJFc3RceEU5ZSBMYXVkZXIifSx7dGV4dDoiVGhlIG9ubHkgd2F5IG91dCBpcyB0aHJvdWdoLiIsYXV0aG9yOiJSb2JlcnQgRnJvc3QifSx7dGV4dDoiSGFyZHNoaXBzIG9mdGVuIHByZXBhcmUgb3JkaW5hcnkgcGVvcGxlIGZvciBhbiBleHRyYW9yZGluYXJ5IGRlc3RpbnkuIixhdXRob3I6IkMuUy4gTGV3aXMifSx7dGV4dDoiQWN0IGFzIGlmIHdoYXQgeW91IGRvIG1ha2VzIGEgZGlmZmVyZW5jZS4gSXQgZG9lcy4iLGF1dGhvcjoiV2lsbGlhbSBKYW1lcyJ9LHt0ZXh0OiJJbiB0aGUgbWlkZGxlIG9mIGRpZmZpY3VsdHkgbGllcyBvcHBvcnR1bml0eS4iLGF1dGhvcjoiQWxiZXJ0IEVpbnN0ZWluIn0se3RleHQ6IllvdSBhcmUgYnJhdmVyIHRoYW4geW91IGJlbGlldmUsIHN0cm9uZ2VyIHRoYW4geW91IHNlZW0sIGFuZCBzbWFydGVyIHRoYW4geW91IHRoaW5rLiIsYXV0aG9yOiJBLkEuIE1pbG5lIn0se3RleHQ6IktlZXAgeW91ciBleWVzIG9uIHRoZSBzdGFycyBhbmQgeW91ciBmZWV0IG9uIHRoZSBncm91bmQuIixhdXRob3I6IlRoZW9kb3JlIFJvb3NldmVsdCJ9LHt0ZXh0OiJXaGF0IHlvdSBkbyB0b2RheSBjYW4gaW1wcm92ZSBhbGwgeW91ciB0b21vcnJvd3MuIixhdXRob3I6IlJhbHBoIE1hcnN0b24ifSx7dGV4dDoiRG9uJ3QgYmUgcHVzaGVkIGFyb3VuZCBieSB0aGUgZmVhcnMgaW4geW91ciBtaW5kLiBCZSBsZWQgYnkgdGhlIGRyZWFtcyBpbiB5b3VyIGhlYXJ0LiIsYXV0aG9yOiJSb3kgVC4gQmVubmV0dCJ9LHt0ZXh0OiJUaGUgb25seSBwZXJzb24geW91IHNob3VsZCB0cnkgdG8gYmUgYmV0dGVyIHRoYW4gaXMgd2hvIHlvdSB3ZXJlIHllc3RlcmRheS4iLGF1dGhvcjoiIn0se3RleHQ6IklmIHlvdSB3YW50IHRvIGFjaGlldmUgZ3JlYXRuZXNzLCBzdG9wIGFza2luZyBmb3IgcGVybWlzc2lvbi4iLGF1dGhvcjoiIn0se3RleHQ6IlRoaW5ncyB3b3JrIG91dCBiZXN0IGZvciB0aG9zZSB3aG8gbWFrZSB0aGUgYmVzdCBvZiBob3cgdGhpbmdzIHdvcmsgb3V0LiIsYXV0aG9yOiJKb2huIFdvb2RlbiJ9LHt0ZXh0OiJUbyBsaXZlIGEgY3JlYXRpdmUgbGlmZSwgd2UgbXVzdCBsb3NlIG91ciBmZWFyIG9mIGJlaW5nIHdyb25nLiIsYXV0aG9yOiJKb3NlcGggQ2hpbHRvbiBQZWFyY2UifSx7dGV4dDoiSWYgeW91IGFyZSBub3Qgd2lsbGluZyB0byByaXNrIHRoZSB1c3VhbCwgeW91IHdpbGwgaGF2ZSB0byBzZXR0bGUgZm9yIHRoZSBvcmRpbmFyeS4iLGF1dGhvcjoiSmltIFJvaG4ifSx7dGV4dDoiVHJ1c3QgeW91cnNlbGYuIFlvdSBrbm93IG1vcmUgdGhhbiB5b3UgdGhpbmsgeW91IGRvLiIsYXV0aG9yOiJCZW5qYW1pbiBTcG9jayJ9LHt0ZXh0OiJXaGF0IHNlZW1zIHRvIHVzIGFzIGJpdHRlciB0cmlhbHMgYXJlIG9mdGVuIGJsZXNzaW5ncyBpbiBkaXNndWlzZS4iLGF1dGhvcjoiT3NjYXIgV2lsZGUifSx7dGV4dDoiVGhlIG9ubHkgcGxhY2Ugd2hlcmUgc3VjY2VzcyBjb21lcyBiZWZvcmUgd29yayBpcyBpbiB0aGUgZGljdGlvbmFyeS4iLGF1dGhvcjoiVmlkYWwgU2Fzc29vbiJ9LHt0ZXh0OiJUb28gbWFueSBvZiB1cyBhcmUgbm90IGxpdmluZyBvdXIgZHJlYW1zIGJlY2F1c2Ugd2UgYXJlIGxpdmluZyBvdXIgZmVhcnMuIixhdXRob3I6IkxlcyBCcm93biJ9LHt0ZXh0OiJJIGZpbmQgdGhhdCB0aGUgaGFyZGVyIEkgd29yaywgdGhlIG1vcmUgbHVjayBJIHNlZW0gdG8gaGF2ZS4iLGF1dGhvcjoiVGhvbWFzIEplZmZlcnNvbiJ9LHt0ZXh0OiJTdWNjZXNzIHVzdWFsbHkgY29tZXMgdG8gdGhvc2Ugd2hvIGFyZSB0b28gYnVzeSB0byBiZSBsb29raW5nIGZvciBpdC4iLGF1dGhvcjoiSGVucnkgRGF2aWQgVGhvcmVhdSJ9LHt0ZXh0OiJJZiB5b3UgcmVhbGx5IGxvb2sgY2xvc2VseSwgbW9zdCBvdmVybmlnaHQgc3VjY2Vzc2VzIHRvb2sgYSBsb25nIHRpbWUuIixhdXRob3I6IlN0ZXZlIEpvYnMifSx7dGV4dDoiTmV2ZXIgZ2l2ZSB1cCBvbiBhIGRyZWFtIGp1c3QgYmVjYXVzZSBvZiB0aGUgdGltZSBpdCB3aWxsIHRha2UgdG8gYWNjb21wbGlzaCBpdC4iLGF1dGhvcjoiRWFybCBOaWdodGluZ2FsZSJ9LHt0ZXh0OiJZb3UndmUgZ290IHRvIGdldCB1cCBldmVyeSBtb3JuaW5nIHdpdGggZGV0ZXJtaW5hdGlvbiBpZiB5b3UncmUgZ29pbmcgdG8gZ28gdG8gYmVkIHdpdGggc2F0aXNmYWN0aW9uLiIsYXV0aG9yOiJHZW9yZ2UgTG9yaW1lciJ9LHt0ZXh0OiJUaGUgc2VjcmV0IG9mIHlvdXIgc3VjY2VzcyBpcyBkZXRlcm1pbmVkIGJ5IHlvdXIgZGFpbHkgYWdlbmRhLiIsYXV0aG9yOiJKb2huIEMuIE1heHdlbGwifV07ZnVuY3Rpb24gSWkoZT0yKXtyZXR1cm5bLi4uJF9dLnNvcnQoKCk9Pk1hdGgucmFuZG9tKCktLjUpLnNsaWNlKDAsZSl9ZnVuY3Rpb24gZWYoe2FwcDplLGdyaWRIZWlnaHRTaXplOnQscGxhbkNvbnRlbnQ6bixwcm92aWRlckFwaUtleTpyLHF1b3RlczpvfSl7bGV0IGE9cnIuY3JlYXRlRWxlbWVudCxpPSh0fHwxKT49Mj80OjIsW3MsbF09KDAscnIudXNlU3RhdGUpKG98fChuP1tdOklpKGkpKSksW2MsZF09KDAscnIudXNlU3RhdGUpKCFvJiYhIW4pLFt1XT0oMCxyci51c2VTdGF0ZSkoKCk9PmAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gKTsoMCxyci51c2VFZmZlY3QpKCgpPT57IW8mJm4mJihkKCEwKSxvdihlLG4se2FwaUtleTpyfSkudGhlbih5PT57bCh5JiZ5Lmxlbmd0aD95OklpKGkpKSxkKCExKX0pKX0sW10pLCgwLHJyLnVzZUVmZmVjdCkoKCk9PnshYyYmcy5sZW5ndGg8aSYmbChJaShpKSl9LFtpXSk7bGV0IGY9YSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJ3aWRnZXQtaGVhZGVyLWFjdGlvbiIsb25DbGljazooKT0+e2woSWkoaSkpfSx0aXRsZToiUmVzZWVkIHF1b3RlcyJ9LCJcdTIxQkIgUmVzZWVkIik7cmV0dXJuIGM/YShvZSx7dGl0bGU6cmUoInF1b3RlcyIpLGljb246Ilx1ezFGNEExfSIsd2lkZ2V0SWQ6InF1b3RlcyJ9LGEoImRpdiIse2NsYXNzTmFtZToicXVvdGVzLWxvYWRpbmcifSwiR2VuZXJhdGluZyBxdW90ZXMuLi4iKSk6YShvZSx7dGl0bGU6cmUoInF1b3RlcyIpLGljb246Ilx1ezFGNEExfSIsd2lkZ2V0SWQ6InF1b3RlcyIsaGVhZGVyQWN0aW9uczpmfSxhKCJkaXYiLHtjbGFzc05hbWU6InF1b3Rlcy1ncmlkIn0scy5zbGljZSgwLGkpLm1hcCgoeSx3KT0+YSgiZGl2Iix7a2V5OncsY2xhc3NOYW1lOiJxdW90ZS10aWxlIixzdHlsZTp7YmFja2dyb3VuZEltYWdlOiJsaW5lYXItZ3JhZGllbnQocmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDAuNikpLCB1cmwoIitXbCgic21hbGwiLHUsdykrIikifX0sYSgicCIse2NsYXNzTmFtZToicXVvdGUtdGV4dCJ9LCciJyt5LnRleHQrJyInKSx5LmF1dGhvcj9hKCJzcGFuIix7Y2xhc3NOYW1lOiJxdW90ZS1hdXRob3IifSwiXHUyMDE0ICIreS5hdXRob3IpOm51bGwpKSkpfXZhciBQMD1wZShkZSgpKTt2YXIgV189e2RhaWx5Sm90OiJodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzL2pvdHMiLGpvdXJuYWw6Imh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvam90cyIsY2FsZW5kYXI6Imh0dHBzOi8vd3d3LmFtcGxlbm90ZS5jb20vbm90ZXMvY2FsZW5kYXIifTthc3luYyBmdW5jdGlvbiBCXyhlKXtsZXQgdDt0cnl7dD1hd2FpdCBlLmdldFRhc2tEb21haW5zKCl9Y2F0Y2h7cmV0dXJufWxldCBuPShBcnJheS5pc0FycmF5KHQpP3Q6W10pLmZpbHRlcihvPT5vIT1udWxsKS5mbGF0TWFwKG89Pm8ubm90ZXN8fFtdKTtpZighbi5sZW5ndGgpcmV0dXJuO2xldCByPW5bTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKm4ubGVuZ3RoKV07cj8udXVpZCYmYXdhaXQgZS5uYXZpZ2F0ZShgaHR0cHM6Ly93d3cuYW1wbGVub3RlLmNvbS9ub3Rlcy8ke3IudXVpZH1gKX1mdW5jdGlvbiB0Zih7YXBwOmV9KXtsZXQgdD1QMC5jcmVhdGVFbGVtZW50LG49W3tsYWJlbDoiRGFpbHkgSm90IixpY29uOiJcdXsxRjRERH0iLGFjdGlvbjoiZGFpbHlKb3QifSx7bGFiZWw6IkpvdXJuYWwiLGljb246Ilx1ezFGNEQzfSIsYWN0aW9uOiJqb3VybmFsIn0se2xhYmVsOiJDYWxlbmRhciIsaWNvbjoiXHV7MUY0QzV9IixhY3Rpb246ImNhbGVuZGFyIn0se2xhYmVsOiJSYW5kb20gTm90ZSIsaWNvbjoiXHV7MUYzQjJ9IixhY3Rpb246InJhbmRvbU5vdGUifV0scj1hc3luYyBvPT57aWYobz09PSJyYW5kb21Ob3RlIil7YXdhaXQgQl8oZSk7cmV0dXJufWxldCBhPVdfW29dO2EmJmF3YWl0IGUubmF2aWdhdGUoYSl9O3JldHVybiB0KG9lLHt0aXRsZTpyZSgicXVpY2stYWN0aW9ucyIpLGljb246Ilx1MjZBMSIsd2lkZ2V0SWQ6InF1aWNrLWFjdGlvbnMifSx0KCJkaXYiLHtjbGFzc05hbWU6InFhLWdyaWQifSxuLm1hcChvPT50KCJidXR0b24iLHtrZXk6by5hY3Rpb24sY2xhc3NOYW1lOiJxYS1idXR0b24iLG9uQ2xpY2s6KCk9PnIoby5hY3Rpb24pfSx0KCJzcGFuIix7Y2xhc3NOYW1lOiJxYS1pY29uIn0sby5pY29uKSx0KCJzcGFuIix7Y2xhc3NOYW1lOiJxYS1sYWJlbCJ9LG8ubGFiZWwpKSkpKX12YXIgUm49cGUoZGUoKSk7dmFyIEhfPTcqMjQqNjAqNjAqMWUzLFUwPTMsal89NSxWXz01LCQwPTUwLEdfPTI1MCxuZj0yNTAsVzA9NyxLXz0xO2Z1bmN0aW9uIEIwKGUpe3JldHVybiBZXyhgJHtPZShuZXcgRGF0ZSl9LSR7ZX1gKX1hc3luYyBmdW5jdGlvbiBMMChlLHQsbj1uZXcgU2V0KXtpZighdClyZXR1cm5bXTtsZXQgcj1uZXcgU2V0LG89W107Zm9yIGF3YWl0KGxldCBhIG9mIGF3YWl0IGUuZmlsdGVyTm90ZXMoe2dyb3VwOiJ0YXNrTGlzdHMiLHRhc2tEb21haW5VVUlEOnR9LCJjaGFuZ2VkIikpaWYoIW4uaGFzKGE/LnV1aWQpJiZhPy51dWlkJiYhci5oYXMoYS51dWlkKSYmKHIuYWRkKGEudXVpZCksby5wdXNoKGEpLG8ubGVuZ3RoPj1HXykpcmV0dXJuIG87cmV0dXJuIG99YXN5bmMgZnVuY3Rpb24gSDAoZSx0LG4pe2xldCByPVZlKG4uZGF0ZUtleSksbz1KXyhuLFYwKHIpKTthd2FpdCBlLnJlcGxhY2VOb3RlQ29udGVudCh0LG8pfWFzeW5jIGZ1bmN0aW9uIGowKHthcHA6ZSxtYXhOb3Rlczp0PWpfLHNlZWQ6bix0YXNrRG9tYWluVVVJRDpyPW51bGx9KXtsZXQgbz1hd2FpdCBYXyhlKSxhPVFfKG8uc3RhdGUscixvLnN0YXRlLmRhdGVLZXkpLGk9YS5zZWxlY3RlZE5vdGVzO2lmKGEuc2VsZWN0aW9uU2VlZD09PW4mJmkubGVuZ3RoPj1NYXRoLm1pbihVMCx0KSlyZXR1cm4gejAoZSxpLnNsaWNlKDAsdCkpO2xldCBzPWF3YWl0IG5DKGUsYSxyKSxsPXFsKFsuLi5hLnN0YWxlQ2FuZGlkYXRlcywuLi5zLnN0YWxlQ2FuZGlkYXRlc10pLGM9YS5oaXN0b3J5QnlEYXksZD1sLmZpbHRlcih3PT4hWTAoYykuaGFzKHcudXVpZCkpO2wubGVuZ3RoPjAmJmQubGVuZ3RoPT09MCYmKGM9e30sZD1sKTtsZXQgdT1lQyhkLHQsbikscD1hd2FpdCB6MChlLHUpLGY9dEMocCkseT1mLm1hcCh3PT53LnV1aWQpLmZpbHRlcihCb29sZWFuKTthPXVhKHsuLi5hLGhpc3RvcnlCeURheTpGMChjLGEuZGF0ZUtleSx5LG5mKSxzZWxlY3Rpb25TZWVkOm4sc2VsZWN0ZWROb3RlczpmLHN0YWxlQ2FuZGlkYXRlczpsLHRhc2tEb21haW5VVUlEOnIsdmlzaXRlZEJ5RGF5OkYwKGEudmlzaXRlZEJ5RGF5LGEuZGF0ZUtleSxzLnZpc2l0ZWRVdWlkcyxuZil9LGEuZGF0ZUtleSk7dHJ5e2F3YWl0IEgwKGUsby5ub3RlSGFuZGxlLGEpfWNhdGNoKHcpe0UoIltSZWNlbnROb3Rlc10gRmFpbGVkIHRvIHBlcnNpc3QgcmVjZW50LW5vdGUgc3RhdGU6Iix3KX1yZXR1cm4gcH1mdW5jdGlvbiBZXyhlKXtsZXQgdD0wO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQ9KHQrZS5jaGFyQ29kZUF0KG4pKihuKzEpKSUxMDAwMDAzO3JldHVybiB0fWFzeW5jIGZ1bmN0aW9uIHowKGUsdCl7bGV0IG49QXJyYXkuaXNBcnJheSh0KT90OltdO3JldHVybiBQcm9taXNlLmFsbChuLm1hcChyPT5lLmZpbmROb3RlKHt1dWlkOnIudXVpZH0pLnRoZW4obz0+KHtsYXRlc3RUYXNrVGltZXN0YW1wOnIubGF0ZXN0VGFza1RpbWVzdGFtcCxub3RlSGFuZGxlOm98fHtuYW1lOnIubmFtZSx1dWlkOnIudXVpZH0sdGFza0NvdW50OnIudGFza0NvdW50fSkpLmNhdGNoKCgpPT4oe2xhdGVzdFRhc2tUaW1lc3RhbXA6ci5sYXRlc3RUYXNrVGltZXN0YW1wLG5vdGVIYW5kbGU6e25hbWU6ci5uYW1lLHV1aWQ6ci51dWlkfSx0YXNrQ291bnQ6ci50YXNrQ291bnR9KSkpKX1mdW5jdGlvbiBxXyhlKXtsZXQgdD1OdW1iZXIuaXNGaW5pdGUoZSk/TWF0aC5hYnMoTWF0aC5mbG9vcihlKSk6MTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdD0odCo5MzAxKzQ5Mjk3KSUyMzMyODAsdC8yMzMyODB9fWZ1bmN0aW9uIEYwKGUsdCxuLHIpe2xldCBvPVFsKGUsdCksYT1vW3RdfHxbXSxpPShBcnJheS5pc0FycmF5KG4pP246W10pLmZpbHRlcihsPT50eXBlb2YgbD09InN0cmluZyImJmwubGVuZ3RoPjApLHM9Wy4uLm5ldyBTZXQoWy4uLmEsLi4uaV0pXS5zbGljZSgtcik7cmV0dXJuIFFsKHsuLi5vLFt0XTpzfSx0KX1mdW5jdGlvbiBxbChlKXtsZXQgdD1uZXcgU2V0LG49W107Zm9yKGxldCByIG9mIEFycmF5LmlzQXJyYXkoZSk/ZTpbXSl7bGV0IG89cj8udXVpZHx8cj8ubm90ZUhhbmRsZT8udXVpZDtpZighKCFvfHx0LmhhcyhvKSkmJih0LmFkZChvKSxuLnB1c2goe2xhdGVzdFRhc2tUaW1lc3RhbXA6TnVtYmVyKHIubGF0ZXN0VGFza1RpbWVzdGFtcCl8fDAsbmFtZTpyLm5hbWV8fHIubm90ZUhhbmRsZT8ubmFtZXx8IlVudGl0bGVkIix0YXNrQ291bnQ6TnVtYmVyKHIudGFza0NvdW50KXx8MCx1dWlkOm99KSxuLmxlbmd0aD49JDApKWJyZWFrfXJldHVybiBufWZ1bmN0aW9uIFFsKGUsdCl7aWYoIWV8fHR5cGVvZiBlIT0ib2JqZWN0Inx8QXJyYXkuaXNBcnJheShlKSlyZXR1cm57fTtsZXQgbj1WZSh0KTtuLnNldERhdGUobi5nZXREYXRlKCktVzArMSk7bGV0IHI9T2Uobiksbz17fTtmb3IobGV0W2EsaV1vZiBPYmplY3QuZW50cmllcyhlKSl7aWYoIS9eXGR7NH0tXGR7Mn0tXGR7Mn0kLy50ZXN0KGEpfHxhPHIpY29udGludWU7bGV0IHM9QXJyYXkuaXNBcnJheShpKT9pLmZpbHRlcihsPT50eXBlb2YgbD09InN0cmluZyImJmwubGVuZ3RoPjApOltdO29bYV09Wy4uLm5ldyBTZXQocyldLnNsaWNlKC1uZil9cmV0dXJuIG99ZnVuY3Rpb24gdWEoZSx0KXtsZXQgbj1lJiZ0eXBlb2YgZT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGUpP2U6e307cmV0dXJue2RhdGVLZXk6dCxoaXN0b3J5QnlEYXk6UWwobi5oaXN0b3J5QnlEYXksdCksc2NoZW1hVmVyc2lvbjpLXyxzZWxlY3Rpb25TZWVkOk51bWJlci5pc0Zpbml0ZShuLnNlbGVjdGlvblNlZWQpP24uc2VsZWN0aW9uU2VlZDpudWxsLHNlbGVjdGVkTm90ZXM6cWwobi5zZWxlY3RlZE5vdGVzKSxzdGFsZUNhbmRpZGF0ZXM6cWwobi5zdGFsZUNhbmRpZGF0ZXMpLHRhc2tEb21haW5VVUlEOnR5cGVvZiBuLnRhc2tEb21haW5VVUlEPT0ic3RyaW5nIiYmbi50YXNrRG9tYWluVVVJRC5sZW5ndGg+MD9uLnRhc2tEb21haW5VVUlEOm51bGwsdmlzaXRlZEJ5RGF5OlFsKG4udmlzaXRlZEJ5RGF5LHQpfX1mdW5jdGlvbiBRXyhlLHQsbil7cmV0dXJuKGU/LnRhc2tEb21haW5VVUlEfHxudWxsKT09PSh0fHxudWxsKT9lOnVhKHtzZWxlY3Rpb25TZWVkOm51bGwsdGFza0RvbWFpblVVSUQ6dH0sbil9ZnVuY3Rpb24gVjAoZSl7cmV0dXJuIGUudG9Mb2NhbGVTdHJpbmcoW10se2RheToibnVtZXJpYyIsbW9udGg6ImxvbmciLHllYXI6Im51bWVyaWMifSl9ZnVuY3Rpb24gSl8oZSx0KXtyZXR1cm5bYCMgUmVjZW50IE5vdGVzIGRhdGEgZm9yICR7dH1gLCIiLCJUaGlzIGFyY2hpdmVkIG5vdGUgaXMgbWFpbnRhaW5lZCBieSB0aGUgZGFzaGJvYXJkIHBsdWdpbi4iLCIiLCJgYGBqc29uIixKU09OLnN0cmluZ2lmeShlLG51bGwsMiksImBgYCIsIiJdLmpvaW4oYApgKX1mdW5jdGlvbiBHMChlKXtyZXR1cm5gRGFzaGJvYXJkIHJlY2VudCBub3RlcyBmb3IgJHtWMChlKX1gfWZ1bmN0aW9uIEswKGUsdCl7aWYoIWV8fHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm4gdWEoe30sdCk7bGV0IG49ZS5tYXRjaCgvYGBganNvblxzKihbXHNcU10qPylgYGAvaSkscj1uP25bMV06ZTt0cnl7cmV0dXJuIHVhKEpTT04ucGFyc2UociksdCl9Y2F0Y2h7cmV0dXJuIHVhKHt9LHQpfX1hc3luYyBmdW5jdGlvbiBYXyhlKXtsZXQgdD1uZXcgRGF0ZSxuPU9lKHQpLHI9RzAodCksbz1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOnIsdGFnczpbUmVdfSk7aWYobz8udXVpZCl7bGV0IGw9YXdhaXQgZS5nZXROb3RlQ29udGVudCh7dXVpZDpvLnV1aWR9KTtyZXR1cm57bm90ZUhhbmRsZTpvLHN0YXRlOkswKGwsbil9fWxldCBhPWF3YWl0IFpfKGUsdCksaT11YSh7Li4uYSxzZWxlY3RlZE5vdGVzOltdfSxuKSxzPWF3YWl0IGUuY3JlYXRlTm90ZShyLFtSZV0se2FyY2hpdmU6ITB9KTtyZXR1cm4gbz17dXVpZDp0eXBlb2Ygcz09Im9iamVjdCI/cy51dWlkOnN9LGF3YWl0IEgwKGUsbyxpKSxFKGBbUmVjZW50Tm90ZXNdIENyZWF0ZWQgZGFpbHkgbm90ZSAiJHtyfSIgd2l0aCB1dWlkICR7by51dWlkfWApLHtub3RlSGFuZGxlOm8sc3RhdGU6aX19YXN5bmMgZnVuY3Rpb24gWl8oZSx0KXtmb3IobGV0IG49MTtuPD1XMDtuKyspe2xldCByPW5ldyBEYXRlKHQpO3Iuc2V0RGF0ZShyLmdldERhdGUoKS1uKTtsZXQgbz1hd2FpdCBlLmZpbmROb3RlKHtuYW1lOkcwKHIpLHRhZ3M6W1JlXX0pO2lmKCFvPy51dWlkKWNvbnRpbnVlO2xldCBhPWF3YWl0IGUuZ2V0Tm90ZUNvbnRlbnQoe3V1aWQ6by51dWlkfSk7cmV0dXJuIEswKGEsT2UodCkpfXJldHVybnt9fWZ1bmN0aW9uIGVDKGUsdCxuKXtsZXQgcj1xXyhuKSxvPVtdLGE9W107Zm9yKGxldCBpIG9mIGUpe2lmKG8ubGVuZ3RoPj10KWJyZWFrO2EubGVuZ3RoPFZfJiZyKCk8LjU/YS5wdXNoKGkpOm8ucHVzaChpKX1yZXR1cm4gby5sZW5ndGg+PVUwP286Wy4uLm8sLi4uYV0uc2xpY2UoMCx0KX1mdW5jdGlvbiB0QyhlKXtyZXR1cm4gcWwoKEFycmF5LmlzQXJyYXkoZSk/ZTpbXSkubWFwKHQ9Pih7bGF0ZXN0VGFza1RpbWVzdGFtcDp0LmxhdGVzdFRhc2tUaW1lc3RhbXAsbmFtZTp0Lm5vdGVIYW5kbGU/Lm5hbWV8fCJVbnRpdGxlZCIsdGFza0NvdW50OnQudGFza0NvdW50LHV1aWQ6dC5ub3RlSGFuZGxlPy51dWlkfSkpKX1hc3luYyBmdW5jdGlvbiBuQyhlLHQsbil7bGV0IHI9WTAodC52aXNpdGVkQnlEYXkpLG89YXdhaXQgTDAoZSxuLHIpLGE9cjtvLmxlbmd0aD09PTAmJnQuc3RhbGVDYW5kaWRhdGVzLmxlbmd0aD09PTAmJihhPW5ldyBTZXQsbz1hd2FpdCBMMChlLG4sYSkpO2xldCBpPVtdLHM9W10sbD1uZXcgU2V0KHQuc3RhbGVDYW5kaWRhdGVzLm1hcChjPT5jLnV1aWQpKTtmb3IobGV0IGMgb2YgbylpZighKCFjPy51dWlkfHxhLmhhcyhjLnV1aWQpKSl0cnl7bGV0IGQ9YXdhaXQgZS5nZXROb3RlVGFza3Moe3V1aWQ6Yy51dWlkfSx7aW5jbHVkZURvbmU6ITF9KTtpZihzLnB1c2goYy51dWlkKSwhQXJyYXkuaXNBcnJheShkKXx8ZC5sZW5ndGg9PT0wKWNvbnRpbnVlO2xldCB1PWQucmVkdWNlKChwLGYpPT57bGV0IHk9Zi5zdGFydEF0P2Yuc3RhcnRBdCoxZTM6MDtyZXR1cm4gTWF0aC5tYXgocCx5KX0sMCk7aWYodSE9PTAmJnU+PURhdGUubm93KCktSF8pY29udGludWU7aWYobC5oYXMoYy51dWlkKXx8KGkucHVzaCh7bGF0ZXN0VGFza1RpbWVzdGFtcDp1LG5hbWU6Yy5uYW1lLHRhc2tDb3VudDpkLmxlbmd0aCx1dWlkOmMudXVpZH0pLGwuYWRkKGMudXVpZCkpLHQuc3RhbGVDYW5kaWRhdGVzLmxlbmd0aCtpLmxlbmd0aD49JDApYnJlYWt9Y2F0Y2goZCl7RShgW1JlY2VudE5vdGVzXSBGYWlsZWQgdG8gZmV0Y2ggdGFza3MgZm9yIG5vdGUgJHtjLnV1aWR9OmAsZCl9cmV0dXJue3N0YWxlQ2FuZGlkYXRlczppLHZpc2l0ZWRVdWlkczpzfX1mdW5jdGlvbiBZMChlKXtsZXQgdD1uZXcgU2V0O2ZvcihsZXQgbiBvZiBPYmplY3QudmFsdWVzKGV8fHt9KSlBcnJheS5pc0FycmF5KG4pJiZuLmZvckVhY2gocj0+dC5hZGQocikpO3JldHVybiB0fXZhciByQz0zLG9DPTU7ZnVuY3Rpb24gcmYoe2FwcDplLGdyaWRIZWlnaHRTaXplOnQ9MSx0YXNrRG9tYWluVVVJRDpuPW51bGx9KXtsZXQgcj1Sbi5jcmVhdGVFbGVtZW50LFtvLGFdPSgwLFJuLnVzZVN0YXRlKSgwKSxbaSxzXT0oMCxSbi51c2VTdGF0ZSkobnVsbCksW2wsY109KDAsUm4udXNlU3RhdGUpKG51bGwpLGQ9dD49Mj8xMDpvQyx1PSgwLFJuLnVzZU1lbW8pKCgpPT5CMChvKSxbb10pOygwLFJuLnVzZUVmZmVjdCkoKCk9PntsZXQgdz0hMDtyZXR1cm4gcyhudWxsKSxjKG51bGwpLGowKHthcHA6ZSxtYXhOb3RlczpkLHNlZWQ6dSx0YXNrRG9tYWluVVVJRDpufSkudGhlbihiPT57dyYmKHMoYiksRSgiW1JlY2VudE5vdGVzXSBzdGFsZU5vdGVzOiIsYiwic2VlZDoiLHUsInJlc2VlZENvdW50OiIsbykpfSkuY2F0Y2goYj0+e3cmJihFKCJbUmVjZW50Tm90ZXNdIGZldGNoIGVycm9yOiIsYiksYyhiLm1lc3NhZ2V8fCJGYWlsZWQgdG8gbG9hZCBub3RlcyIpKX0pLCgpPT57dz0hMX19LFtlLGQsbyx1LG5dKTtsZXQgZj1yKCJidXR0b24iLHtjbGFzc05hbWU6IndpZGdldC1oZWFkZXItYWN0aW9uIix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PmEodz0+dysxKSx0aXRsZToiU2hvdyBhIGRpZmZlcmVudCBzZXQgb2Ygbm90ZXMifSwiXHUyMUJCIFJlc2VlZCIpLHk9KCk9Pmw/cigicCIse2NsYXNzTmFtZToibm90ZS1lcnJvciJ9LGBFcnJvcjogJHtsfWApOmk9PT1udWxsP3IoInAiLHtjbGFzc05hbWU6Im5vdGUtbG9hZGluZyJ9LCJMb2FkaW5nXHUyMDI2Iik6aS5sZW5ndGg8ckM/cigicCIse2NsYXNzTmFtZToibm90ZS1lbXB0eSJ9LCJObyBub3RlcyB3aXRoIHN0YWxlIHRhc2tzIGZvdW5kLiIpOnIoInVsIix7Y2xhc3NOYW1lOiJub3RlLWxpc3QifSxpLm1hcCgoe25vdGVIYW5kbGU6dyx0YXNrQ291bnQ6Yn0pPT5yKCJsaSIse2tleTp3LnV1aWQsY2xhc3NOYW1lOiJub3RlLWl0ZW0ifSxyKCJidXR0b24iLHtjbGFzc05hbWU6Im5vdGUtbGluayIsdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT5lLm5hdmlnYXRlKGBodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzLyR7dy51dWlkfWApLHRpdGxlOmBPcGVuICIke3cubmFtZXx8IlVudGl0bGVkIn0iYH0scigic3BhbiIse2NsYXNzTmFtZToibm90ZS1uYW1lIn0sdy5uYW1lfHwiVW50aXRsZWQiKSxyKCJzcGFuIix7Y2xhc3NOYW1lOiJub3RlLWNvdW50In0sYCR7Yn0gb3BlbiB0YXNrJHtiIT09MT8icyI6IiJ9YCkpLHIoImRpdiIse2NsYXNzTmFtZToibm90ZS1tZXRhZGF0YSJ9LHcuY2hhbmdlZD9gTGFzdCB1cGRhdGVkOiAke25ldyBEYXRlKHcuY2hhbmdlZCkudG9Mb2NhbGVEYXRlU3RyaW5nKCl9YDoiTm8gdXBkYXRlIGRhdGUiKSkpKTtyZXR1cm4gcihvZSx7aGVhZGVyQWN0aW9uczpmLGljb246Ilx1ezFGNEREfSIsdGl0bGU6cmUoInJlY2VudC1ub3RlcyIpLHdpZGdldElkOiJyZWNlbnQtbm90ZXMifSx5KCkpfXZhciBKbD1wZShkZSgpKTtmdW5jdGlvbiBvZih7YWN0aXZlVGFza0RvbWFpbjplLGFwcDp0LGRvbWFpbnM6bixvbkRvbWFpbkNoYW5nZTpyfSl7bGV0IG89SmwuY3JlYXRlRWxlbWVudCxbYSxpXT0oMCxKbC51c2VTdGF0ZSkoITEpLHM9YXN5bmMoKT0+e0UoIltUYXNrRG9tYWluc10gUmVmcmVzaCB0cmlnZ2VyZWQiKSxpKCEwKTt0cnl7bGV0IGQ9YXdhaXQgbnYodCk7RSgiW1Rhc2tEb21haW5zXSBSZWZyZXNoIHJlc3VsdCIsZCksZCYmciYmcihkLmRvbWFpbnMsZC5hY3RpdmVUYXNrRG9tYWluKX1jYXRjaChkKXt0aHJvdyBFKCJbVGFza0RvbWFpbnNdIFJlZnJlc2ggZmFpbGVkIixkKSxkfWZpbmFsbHl7aSghMSl9fSxsPWFzeW5jIGQ9PntpZihkPT09ZSlyZXR1cm47bGV0IHU9YXdhaXQgdHYodCxkKTt1JiZyJiZyKG51bGwsZCx1KX0sYz1hc3luYyBkPT57ZC5zdG9wUHJvcGFnYXRpb24oKSxhd2FpdCB0Lm5hdmlnYXRlKCJodHRwczovL3d3dy5hbXBsZW5vdGUuY29tL25vdGVzP3RhZz10YXNrX2NhbGVuZGFyIil9O3JldHVybiFufHxuLmxlbmd0aD09PTA/bygiZGl2Iix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbnMgdGFzay1kb21haW5zLS1lbXB0eSJ9LG8oImRpdiIse2NsYXNzTmFtZToidGFzay1kb21haW5zLWVtcHR5In0sJ1Zpc2l0ICJTZXR0aW5ncyIgPiAiVGFzayBDYWxlbmRhciIgdG8gY3JlYXRlIGEgdGFzayBkb21haW4sIGVuYWJsaW5nIERhc2hib2FyZC4nKSxvKCJidXR0b24iLHtjbGFzc05hbWU6InRhc2stZG9tYWlucy1yZWZyZXNoIixvbkNsaWNrOnMsZGlzYWJsZWQ6YSx0eXBlOiJidXR0b24ifSxhPyJSZWZyZXNoaW5nLi4uIjoiXHUyMUJCIFJlZnJlc2giKSk6bygiZGl2Iix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbnMifSxvKCJkaXYiLHtjbGFzc05hbWU6InRhc2stZG9tYWlucy1saXN0In0sbi5tYXAoZD0+bygiZGl2Iix7a2V5OmQudXVpZCxjbGFzc05hbWU6InRhc2stZG9tYWluLWl0ZW0iKyhkLnV1aWQ9PT1lPyIgYWN0aXZlIjoiIiksb25DbGljazooKT0+bChkLnV1aWQpfSxvKCJzcGFuIix7Y2xhc3NOYW1lOiJ0YXNrLWRvbWFpbi1uYW1lIn0sZC5uYW1lKSkpKSxvKCJidXR0b24iLHtjbGFzc05hbWU6InRhc2stZG9tYWlucy1yZWZyZXNoIixvbkNsaWNrOnMsZGlzYWJsZWQ6YX0sYT8iUmVmcmVzaGluZy4uLiI6Ilx1MjFCQiBSZWZyZXNoIFRhc2sgRG9tYWlucyIpKX12YXIgWGw9cGUoZGUoKSk7ZnVuY3Rpb24gcTAoZSl7bGV0IHQ9KDAsWGwudXNlUmVmKShudWxsKTt0LmN1cnJlbnQ9PT1udWxsJiYodC5jdXJyZW50PXBlcmZvcm1hbmNlLm5vdygpLEUoYFtkYXNoYm9hcmRdIFdpZGdldCAiJHtlfSIgbG9hZGluZy4uLmApKSwoMCxYbC51c2VFZmZlY3QpKCgpPT57dC5jdXJyZW50IT09bnVsbCYmKEUoYFtkYXNoYm9hcmRdIFdpZGdldCAiJHtlfSIgZmluaXNoZWQgbG9hZGluZyBpbiAkeyhwZXJmb3JtYW5jZS5ub3coKS10LmN1cnJlbnQpLnRvRml4ZWQoMSl9bXNgKSx0LmN1cnJlbnQ9bnVsbCl9LFtdKX12YXIgb249cGUoZGUoKSk7dmFyIGFDPVt7dmFsdWU6LTIsZW1vamk6Ilx1ezFGNjIyfSIsbGFiZWw6IkF3ZnVsIn0se3ZhbHVlOi0xLGVtb2ppOiJcdXsxRjYxRn0iLGxhYmVsOiJCYWQifSx7dmFsdWU6MCxlbW9qaToiXHV7MUY2MTB9IixsYWJlbDoiT2theSJ9LHt2YWx1ZToxLGVtb2ppOiJcdXsxRjY0Mn0iLGxhYmVsOiJHb29kIn0se3ZhbHVlOjIsZW1vamk6Ilx1ezFGNjA0fSIsbGFiZWw6IkdyZWF0In1dO2Z1bmN0aW9uIGlDKGUpe2lmKCFlfHxlLmxlbmd0aDw3KXJldHVybiIiO2xldCB0PVZlKGVbMF0uZGF0ZSksbj1WZShlWzZdLmRhdGUpLHI9bz0+by50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDoic2hvcnQiLGRheToibnVtZXJpYyJ9KTtyZXR1cm5gJHtyKHQpfSBcdTIwMTMgJHtyKG4pfWB9ZnVuY3Rpb24gUTAoZSx0KXtsZXQgbj1WZShlKTtyZXR1cm4gbi5zZXREYXRlKG4uZ2V0RGF0ZSgpK3QqNyksT2Uobil9ZnVuY3Rpb24gc0MoZSx0KXtsZXQgbj1ybihlLHQpLHI9cm4obmV3IERhdGUsdCk7cmV0dXJuIG4+PXJ9ZnVuY3Rpb24gbEMoZSx0KXtyZXR1cm4hQXJyYXkuaXNBcnJheShlKXx8ZS5sZW5ndGg9PT0wP1tdOiF0fHx0eXBlb2YgdCE9Im9iamVjdCI/ZTplLm1hcChuPT57bGV0IHI9T2Uobi5kYXRlKSxvPUFycmF5LmlzQXJyYXkodFtyXSk/dFtyXTpbXSxhPW8ucmVkdWNlKChpLHMpPT5pKyhzLnZpY3RvcnlWYWx1ZXx8MCksMCk7cmV0dXJuey4uLm4sdmFsdWU6YSx0YXNrQ291bnQ6by5sZW5ndGh9fSl9ZnVuY3Rpb24gY0MoZSx0LG4scil7bGV0IG89WnkoZSxyKTtyZXR1cm4hbnx8dHlwZW9mIG4hPSJvYmplY3QiP2xDKHQsbik6by5tYXAoYT0+e2xldCBpPUFycmF5LmlzQXJyYXkoblthLmRhdGVLZXldKT9uW2EuZGF0ZUtleV06W10scz1pLnJlZHVjZSgobCxjKT0+bCsoYy52aWN0b3J5VmFsdWV8fDApLDApO3JldHVybntkYXk6YS5kYXksZGF0ZTphLmRhdGUsdmFsdWU6cyx0YXNrQ291bnQ6aS5sZW5ndGh9fSl9YXN5bmMgZnVuY3Rpb24gdUMoZSx0LG4scil7bGV0IG89W3QsU3RyaW5nKG4pXTthd2FpdCBlLnNldFNldHRpbmcoS28oInZpY3RvcnktdmFsdWUiKSxKU09OLnN0cmluZ2lmeShvKSkscighMSl9ZnVuY3Rpb24gSjAoZSl7cmV0dXJuIGU9PW51bGw/ITA6ZT09PSJ0cnVlInx8ZT09PSEwfWZ1bmN0aW9uIGRDKGUsdCxuLHIpe3QoZVswXXx8IndlZWsiKSxuKEowKGVbMV0pKSxyKCExKX1mdW5jdGlvbiBwQyhlLHQsbil7bGV0IHI9ZS5jdXJyZW50O2lmKCFyKXJldHVybjtsZXQgbz1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9bi5jbGllbnRYLW8ubGVmdCxzPShvLndpZHRoLTgwKS83O2ZvcihsZXQgbD0wO2w8NztsKyspe2xldCBjPTQwK2wqcyxkPWMrcztpZihhPj1jJiZhPGQpe3QobCk7cmV0dXJufX10KG51bGwpfWZ1bmN0aW9uIGZDKGUsdCl7bGV0IG49ZS5jdXJyZW50O2lmKCFuKXJldHVybiAwO2xldCBvPShuLm9mZnNldFdpZHRoLTgwKS83O3JldHVybiA0MCt0Km8rbyouNX1mdW5jdGlvbiBtQyhlLHQsbixyKXtsZXQgbz1lLmN1cnJlbnQ7aWYoIW8pcmV0dXJuIDA7bGV0IGE9by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPW8ub2Zmc2V0SGVpZ2h0LTUwLGM9KG5bdF0/LnZhbHVlfHwwKS9yKnMqLjg1O3JldHVybiBhLnRvcCtzLWMrMTB9ZnVuY3Rpb24gaEMoZSx0LG4pe2lmKCFufHwhdFtlXSlyZXR1cm5bXTtsZXQgcj1PZSh0W2VdLmRhdGUpO3JldHVybihuW3JdfHxbXSkuc2xpY2UoKS5zb3J0KChvLGEpPT4oYS52aWN0b3J5VmFsdWV8fDApLShvLnZpY3RvcnlWYWx1ZXx8MCkpfWZ1bmN0aW9uIGdDKGUsdCl7aWYoIWV8fCFBcnJheS5pc0FycmF5KGUpfHwhdClyZXR1cm5bXTtsZXQgbj17fTtmb3IobGV0IHIgb2YgZSl7aWYoIXJ8fHIudGltZXN0YW1wPT1udWxsKWNvbnRpbnVlO2xldCBvPW5ldyBEYXRlKHIudGltZXN0YW1wKjFlMyksYT1PZShvKTsoIW5bYV18fHIudGltZXN0YW1wPm5bYV0udGltZXN0YW1wKSYmKG5bYV09cil9cmV0dXJuIHQubWFwKHI9PntsZXQgbz1PZShyLmRhdGUpO3JldHVybiBuW29dfHxudWxsfSl9ZnVuY3Rpb24geUMoZSx0LG4pe2lmKCF0fHwhdFtlXSlyZXR1cm4gbnVsbDtpZihuJiZuW2VdKXtsZXQgbz1uZXcgRGF0ZTtpZihvLnNldEhvdXJzKDIzLDU5LDU5LDk5OSksVmUobltlXS5kYXRlKT5vKXJldHVybiBudWxsfWxldCByPXRbZV0ucmF0aW5nO3JldHVybiBhQy5maW5kKG89Pm8udmFsdWU9PT1yKXx8bnVsbH1mdW5jdGlvbiB2QyhlLHQsbixyLG8sYSl7dC5mb3JFYWNoKChpLHMpPT57bGV0IGw9aS52YWx1ZS9uKm8qLjg1LGM9NDArcypyK3IqLjE1LGQ9by1sKzEwO2UuZmlsbFN0eWxlPWkudmFsdWU+MD8iIzYzNjZmMSI6IiNlNWU3ZWIiLGUuYmVnaW5QYXRoKCksZS5yb3VuZFJlY3QoYyxkLHIqLjcsbCxbNCw0LDAsMF0pLGUuZmlsbCgpLGUuZmlsbFN0eWxlPSIjNmI3MjgwIixlLmZvbnQ9IjExcHggc3lzdGVtLXVpIixlLnRleHRBbGlnbj0iY2VudGVyIixlLmZpbGxUZXh0KGkuZGF5LGMrciouMzUsYS0xNSk7bGV0IHA9VmUoaS5kYXRlKS50b0xvY2FsZURhdGVTdHJpbmcodm9pZCAwLHttb250aDoic2hvcnQiLGRheToibnVtZXJpYyJ9KTtlLmZpbGxTdHlsZT0iIzljYTNhZiIsZS5mb250PSI5cHggc3lzdGVtLXVpIixlLmZpbGxUZXh0KHAsYytyKi4zNSxhLTMpLGkudmFsdWU+MCYmKGUuZmlsbFN0eWxlPSIjZmZmZmZmIixlLmZvbnQ9ImJvbGQgMTBweCBzeXN0ZW0tdWkiLGUuZmlsbFRleHQod0MoaS52YWx1ZSksYytyKi4zNSxkKzE0KSl9KX1mdW5jdGlvbiB3QyhlKXtyZXR1cm4oTWF0aC5yb3VuZCgoZXx8MCkqMTApLzEwKS50b0ZpeGVkKDEpfWZ1bmN0aW9uIGJDKGUsdCxuLHIsbyl7bGV0IGE9bmV3IERhdGU7YS5zZXRIb3VycygyMyw1OSw1OSw5OTkpO2xldCBpPVtdO2lmKHQuZm9yRWFjaCgocyxsKT0+e2lmKCFzfHwhbltsXXx8VmUobltsXS5kYXRlKT5hKXJldHVybjtsZXQgZD1vLShzLnJhdGluZysyKS80Km8rMTAsdT00MCtsKnIrciouNTtpLnB1c2goe2luZGV4OmwseDp1LHk6ZH0pfSksaS5sZW5ndGghPT0wKXtlLnN0cm9rZVN0eWxlPSIjZjU5ZTBiIixlLmxpbmVXaWR0aD0yO2ZvcihsZXQgcz0xO3M8aS5sZW5ndGg7cysrKXtsZXQgbD1pW3MtMV0sYz1pW3NdO2Uuc2V0TGluZURhc2goYy5pbmRleD09PWwuaW5kZXgrMT9bXTpbMyw0XSksZS5iZWdpblBhdGgoKSxlLm1vdmVUbyhsLngsbC55KSxlLmxpbmVUbyhjLngsYy55KSxlLnN0cm9rZSgpfWUuc2V0TGluZURhc2goW10pLGkuZm9yRWFjaCgoe3g6cyx5Omx9KT0+e2UuZmlsbFN0eWxlPSIjZjU5ZTBiIixlLmJlZ2luUGF0aCgpLGUuYXJjKHMsbCwzLDAsTWF0aC5QSSoyKSxlLmZpbGwoKX0pfX1mdW5jdGlvbiBrQyhlLHQsbixyLG8pe2xldCBhPWUuY3VycmVudDtpZighYSlyZXR1cm47bGV0IGk9YS5nZXRDb250ZXh0KCIyZCIpLHM9YS53aWR0aD1hLm9mZnNldFdpZHRoKjIsbD1hLmhlaWdodD1hLm9mZnNldEhlaWdodCoyO2kuc2NhbGUoMiwyKTtsZXQgYz1zLzIsZD1sLzIsdT0oYy04MCkvNyxwPWQtNTA7aS5jbGVhclJlY3QoMCwwLGMsZCksdkMoaSx0LG4sdSxwLGQpLG8mJnImJnIuc29tZShmPT5mIT09bnVsbCkmJmJDKGkscix0LHUscCl9ZnVuY3Rpb24geEMoZSx0LG4scil7bGV0IG89aEMoZSx0LG4pLGE9eUMoZSxyLHQpLHM9W2A8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtdG9vbHRpcC1oZWFkZXIiPiR7dFtlXT9ldih0W2VdLmRhdGUpOiIifTwvZGl2PmBdO2lmKGEmJnMucHVzaChgPGRpdiBjbGFzcz0iZGFzaGJvYXJkLXRvb2x0aXAtc2VjdGlvbiI+JHthLmVtb2ppfSAke2EubGFiZWx9PC9kaXY+YCksby5sZW5ndGg+MClmb3IobGV0IGwgb2YgbylzLnB1c2goYDxkaXYgY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLXJvdyI+PHNwYW4gY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLXJvdy1sYWJlbCI+JHtvYShsLmNvbnRlbnQpfTwvc3Bhbj48c3BhbiBjbGFzcz0iZGFzaGJvYXJkLXRvb2x0aXAtcm93LXZhbHVlIj4ke2wudmljdG9yeVZhbHVlfHwwfSBwdHM8L3NwYW4+PC9kaXY+YCk7ZWxzZSBzLnB1c2goJzxkaXYgY2xhc3M9ImRhc2hib2FyZC10b29sdGlwLWVtcHR5Ij5ObyBjb21wbGV0ZWQgdGFza3M8L2Rpdj4nKTtyZXR1cm4gcy5qb2luKCIiKX1mdW5jdGlvbiBTQyhlLHQsbil7cmV0dXJuWyJ3ZWVrIiwibW9udGgiLCIzMGRheXMiXS5tYXAocj0+ZSgibGFiZWwiLHtrZXk6cn0sZSgiaW5wdXQiLHt0eXBlOiJyYWRpbyIsbmFtZToidnYtdGltZS1yYW5nZSIsdmFsdWU6cixjaGVja2VkOnQ9PT1yLG9uQ2hhbmdlOm4uYmluZChudWxsLHIpfSkscj09PSJ3ZWVrIj8iVGhpcyB3ZWVrIjpyPT09Im1vbnRoIj8iVGhpcyBtb250aCI6Ikxhc3QgMzAgZGF5cyIpKX1mdW5jdGlvbiBhZih7YXBwOmUsY29tcGxldGVkVGFza3NCeURhdGU6dCxkYWlseVZhbHVlczpuLG1vb2RSYXRpbmdzOnIsb25SZWZlcmVuY2VEYXRlQ2hhbmdlOm8scmVmZXJlbmNlRGF0ZTphLHdlZWtGb3JtYXQ6aSx3ZWVrbHlUb3RhbDpzfSl7bGV0IGw9b24uY3JlYXRlRWxlbWVudCxjPSgwLG9uLnVzZVJlZikobnVsbCksZD1rbChpKSx1PWNDKGEsbix0LGQpLHA9TWF0aC5tYXgoLi4udS5tYXAoVT0+VS52YWx1ZSksMSksZj11LnJlZHVjZSgoVSxPKT0+VSsoTy52YWx1ZXx8MCksMCkseT1NYXRoLnJvdW5kKGZ8fHN8fDApLHc9Z0Mocix1KSxbYix2XT0oMCxvbi51c2VTdGF0ZSkoITEpLFtoLGddPSgwLG9uLnVzZVN0YXRlKShudWxsKSxtPWFsKFBlKCksInZpY3RvcnktdmFsdWUiKSxbeCxTXT0oMCxvbi51c2VTdGF0ZSkobVswXXx8IndlZWsiKSxbXyxEXT0oMCxvbi51c2VTdGF0ZSkoSjAobVsxXSkpLEE9di5iaW5kKG51bGwsITApLFQ9dUMuYmluZChudWxsLGUseCxfLHYpLEw9ZEMuYmluZChudWxsLG0sUyxELHYpLHo9aUModSksST1naSh7aW50ZXJhY3RpdmU6ITB9KSxNPVU9PntJLmNhbmNlbFNjaGVkdWxlZEhpZGUoKSxwQyhjLGcsVSl9LEY9KCk9Pkkuc2NoZWR1bGVIaWRlKDMwMCwoKT0+ZyhudWxsKSk7cmV0dXJuKDAsb24udXNlRWZmZWN0KSgoKT0+e2tDKGMsdSxwLHcsXyl9LFt1LHAsdyxfXSksKDAsb24udXNlRWZmZWN0KSgoKT0+e2lmKGg9PT1udWxsKXtJLmhpZGUoKTtyZXR1cm59bGV0IFU9Yy5jdXJyZW50O2lmKCFVKXJldHVybjtsZXQgTz1VLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGo9ZkMoYyxoKSxYPU8ubGVmdCtqLE49bUMoYyxoLHUscCksaz1OLFI9d2luZG93LmlubmVySGVpZ2h0LU8uYm90dG9tLEI9eEMoaCx1LHQsdyk7Uj5rP0kuc2hvdyhCLFgsTy5ib3R0b20se3BsYWNlbWVudDoiYm90dG9tIixiZWxvd0NoYXJ0OiEwfSk6SS5zaG93KEIsWCxOLHtwbGFjZW1lbnQ6InRvcCJ9KX0sW2hdKSxsKG9lLHt0aXRsZTpyZSgidmljdG9yeS12YWx1ZSIpLGljb246Ilx1ezFGM0M2fSIsd2lkZ2V0SWQ6InZpY3RvcnktdmFsdWUiLGNvbmZpZ3VyYWJsZTohMCxvbkNvbmZpZ3VyZTpBfSxiP2woZm8se3RpdGxlOiJDb25maWd1cmUgVmljdG9yeSBWYWx1ZSIsb25TdWJtaXQ6VCxvbkNhbmNlbDpMfSxsKCJkaXYiLHtjbGFzc05hbWU6ImNvbmZpZy1maWVsZCJ9LGwoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkLWxhYmVsIn0sIlRpbWUgcmFuZ2UiKSxTQyhsLHgsUykpLGwoImRpdiIse2NsYXNzTmFtZToiY29uZmlnLWZpZWxkIn0sbCgiZGl2Iix7Y2xhc3NOYW1lOiJjb25maWctZmllbGQtbGFiZWwifSwiTW9vZCBvdmVybGF5IiksbCgibGFiZWwiLG51bGwsbCgiaW5wdXQiLHt0eXBlOiJjaGVja2JveCIsY2hlY2tlZDpfLG9uQ2hhbmdlOlU9PkQoVS50YXJnZXQuY2hlY2tlZCl9KSwiU2hvdyBtb29kIG92ZXJsYXkiKSkpOm51bGwsbCgiZGl2Iix7Y2xhc3NOYW1lOiJ2di1oZWFkZXIifSxsKCJzcGFuIix7Y2xhc3NOYW1lOiJ2di10b3RhbCJ9LHkpLGwoInNwYW4iLHtjbGFzc05hbWU6InZ2LWxhYmVsIn0sYHBvaW50cyAke3p9YCkpLGwoImRpdiIse2NsYXNzTmFtZToidnYtY2hhcnQtY29udGFpbmVyIn0sbCgiYnV0dG9uIix7Y2xhc3NOYW1lOiJ2di1uYXYtYXJyb3ciLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+byYmbyhRMChhLC0xKSksdGl0bGU6IlByZXZpb3VzIHdlZWsiLCJhcmlhLWxhYmVsIjoiUHJldmlvdXMgd2VlayJ9LCJcdTIwMzkiKSxsKCJkaXYiLHtjbGFzc05hbWU6InZ2LWNoYXJ0LXdyYXAifSxsKCJjYW52YXMiLHtyZWY6YyxjbGFzc05hbWU6InZ2LWNoYXJ0Iixvbk1vdXNlTW92ZTpNLG9uTW91c2VMZWF2ZTpGfSkpLGwoImJ1dHRvbiIse2NsYXNzTmFtZToidnYtbmF2LWFycm93Iix0eXBlOiJidXR0b24iLGRpc2FibGVkOnNDKGEsZCksb25DbGljazooKT0+byYmbyhRMChhLDEpKSx0aXRsZToiTmV4dCB3ZWVrIiwiYXJpYS1sYWJlbCI6Ik5leHQgd2VlayJ9LCJcdTIwM0EiKSkpfWZ1bmN0aW9uIEVDKGUpe2xldCB0PU51bWJlcihlPy5ncmlkV2lkdGhTaXplKT4wP051bWJlcihlLmdyaWRXaWR0aFNpemUpOjEsbj1OdW1iZXIoZT8uZ3JpZEhlaWdodFNpemUpPjA/TnVtYmVyKGUuZ3JpZEhlaWdodFNpemUpOjE7cmV0dXJuYGdyaWQtY2VsbCBob3Jpem9udGFsLSR7dH0tY2VsbCB2ZXJ0aWNhbC0ke259LWNlbGxgfWZ1bmN0aW9uIFRDKGUsdCxuLHIpe2xldCBvPWU/LndpZGdldElkLHtjbGFzc05hbWVzOmEsc3R5bGU6aX09WXcobixyLG8pO3JldHVybntjbGFzc05hbWU6W0VDKGUpLHQ/ImdyaWQtY2VsbC0tZHJhZy1hY3RpdmUiOiIiLHQmJnQ9PT1vPyJncmlkLWNlbGwtLWRyYWdnaW5nLXJlYWR5IjoiIix0JiZ0IT09bz8iZ3JpZC1jZWxsLS1kcmFnLXNoaWZ0IjoiIiwuLi5hXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpLCJkYXRhLXdpZGdldC1pZCI6byxzdHlsZTppfX12YXIgc2Y9Y2xhc3MgZXh0ZW5kcyBuZS5Db21wb25lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5zdGF0ZT17aGFzRXJyb3I6ITEsZXJyb3I6bnVsbH19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcih0KXtyZXR1cm57aGFzRXJyb3I6ITAsZXJyb3I6dH19Y29tcG9uZW50RGlkQ2F0Y2godCxuKXtFKGBbV2lkZ2V0RXJyb3JCb3VuZGFyeV0gV2lkZ2V0ICIke3RoaXMucHJvcHMud2lkZ2V0SWR9IiBjcmFzaGVkOmAsdCxuKX1yZW5kZXIoKXtyZXR1cm4gdGhpcy5zdGF0ZS5oYXNFcnJvcj8oMCxuZS5jcmVhdGVFbGVtZW50KSgiZGl2Iix7Y2xhc3NOYW1lOiJ3aWRnZXQtZXJyb3ItZmFsbGJhY2sifSwoMCxuZS5jcmVhdGVFbGVtZW50KSgicCIse2NsYXNzTmFtZToid2lkZ2V0LWVycm9yLWZhbGxiYWNrLXRpdGxlIn0sYFx1MjZBMCAke3RoaXMucHJvcHMud2lkZ2V0SWR9YCksKDAsbmUuY3JlYXRlRWxlbWVudCkoInAiLHtjbGFzc05hbWU6IndpZGdldC1lcnJvci1mYWxsYmFjay1tZXNzYWdlIn0sdGhpcy5zdGF0ZS5lcnJvcj8ubWVzc2FnZXx8IkFuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQiKSwoMCxuZS5jcmVhdGVFbGVtZW50KSgiYnV0dG9uIix7Y2xhc3NOYW1lOiJ3aWRnZXQtZXJyb3ItZmFsbGJhY2stcmV0cnkiLG9uQ2xpY2s6KCk9PnRoaXMuc2V0U3RhdGUoe2hhc0Vycm9yOiExLGVycm9yOm51bGx9KX0sIlJldHJ5IikpOnRoaXMucHJvcHMuY2hpbGRyZW59fTtmdW5jdGlvbiBQdChlLHQsbil7cmV0dXJuKDAsbmUubWVtbykoZnVuY3Rpb24obyl7cTAoZSk7bGV0e2NvbmZpZzphLGRyYWdnaW5nV2lkZ2V0SWQ6aSxmb2N1c2VkV2lkZ2V0SWQ6cyx3aWRnZXRGb2N1c1RyYW5zZm9ybTpsfT1vLGM9e2dyaWRIZWlnaHRTaXplOk51bWJlcihhPy5ncmlkSGVpZ2h0U2l6ZSk+MD9OdW1iZXIoYS5ncmlkSGVpZ2h0U2l6ZSk6MSxncmlkV2lkdGhTaXplOk51bWJlcihhPy5ncmlkV2lkdGhTaXplKT4wP051bWJlcihhLmdyaWRXaWR0aFNpemUpOjF9O3JldHVybigwLG5lLmNyZWF0ZUVsZW1lbnQpKCJkaXYiLFRDKGEsaSxzLGwpLCgwLG5lLmNyZWF0ZUVsZW1lbnQpKHNmLHt3aWRnZXRJZDplfSwoMCxuZS5jcmVhdGVFbGVtZW50KSh2cC5Qcm92aWRlcix7dmFsdWU6Y30sKDAsbmUuY3JlYXRlRWxlbWVudCkodCxuKG8pKSkpKX0pfWZ1bmN0aW9uIFJpKC4uLmUpe3JldHVybiB0PT57bGV0IG49e307Zm9yKGxldCByIG9mIGUpbltyXT10W3JdO3JldHVybiBufX12YXIgTkM9UHQoImFnZW5kYSIsa3AsKHthZ2VuZGFUYXNrczplLGFwcDp0LGNhbGVuZGFyRXZlbnRzOm4sY2FsZW5kYXJFdmVudHNMb2FkZWQ6cixjdXJyZW50RGF0ZTpvLHNlbGVjdGVkRGF0ZTphLHRpbWVGb3JtYXQ6aX0pPT4oe2FwcDp0LGNhbGVuZGFyRXZlbnRzOnI/bjpudWxsLGN1cnJlbnREYXRlOm8sc2VsZWN0ZWREYXRlOmEsdGFza3M6ZSx0aW1lRm9ybWF0Oml9KSksREM9UHQoImRheS1za2V0Y2giLEhwLCh7YWdlbmRhVGFza3M6ZSxhcHA6dCxjYWxlbmRhckV2ZW50czpuLGNhbGVuZGFyRXZlbnRzTG9hZGVkOnIsY3VycmVudERhdGU6byx0aW1lRm9ybWF0OmF9KT0+KHthZ2VuZGFUYXNrczplLGFwcDp0LGNhbGVuZGFyRXZlbnRzOnI/bjpudWxsLGN1cnJlbnREYXRlOm8sdGltZUZvcm1hdDphfSkpLF9DPVB0KCJjYWxlbmRhciIseHAsKHthcHA6ZSxjb21wbGV0ZWRUYXNrc0J5RGF0ZTp0LGNvbmZpZzpuLGN1cnJlbnREYXRlOnIsb25EYXRlU2VsZWN0Om8sb25PcGVuU2V0dGluZ3M6YSxvcGVuVGFza3M6aSxzZWxlY3RlZERhdGU6cyx3ZWVrRm9ybWF0Omx9KT0+KHthcHA6ZSxjb21wbGV0ZWRUYXNrc0J5RGF0ZTp0LGN1cnJlbnREYXRlOnIsZ3JpZEhlaWdodFNpemU6bj8uZ3JpZEhlaWdodFNpemUsZ3JpZFdpZHRoU2l6ZTpuPy5ncmlkV2lkdGhTaXplLG9uRGF0ZVNlbGVjdDpvLG9uT3BlblNldHRpbmdzOmEsb3BlblRhc2tzOmksc2VsZWN0ZWREYXRlOnMsd2Vla0Zvcm1hdDpsfSkpLENDPVB0KCJkZWJ1Zy1jb25zb2xlIixqcCwoKT0+KHt9KSksQUM9UHQoImRyZWFtLXRhc2siLFBwLCh7YXBwOmUsY29uZmlnOnQsb25PcGVuU2V0dGluZ3M6bixwcm92aWRlckFwaUtleTpyLHByb3ZpZGVyRW06b30pPT4oe2FwcDplLGdyaWRIZWlnaHRTaXplOk51bWJlcih0Py5ncmlkSGVpZ2h0U2l6ZSl8fDEsZ3JpZFdpZHRoU2l6ZTpOdW1iZXIodD8uZ3JpZFdpZHRoU2l6ZSl8fDIsb25PcGVuU2V0dGluZ3M6bixwcm92aWRlckFwaUtleTpyLHByb3ZpZGVyRW06b30pKSxPQz1QdCgibW9vZCIsSnAsUmkoImFwcCIsIm1vb2RSYXRpbmdzIiwib25Nb29kUmVjb3JkZWQiKSksSUM9UHQoInBlYWstaG91cnMiLFpwLFJpKCJhcHAiLCJjdXJyZW50RGF0ZSIsInNlbGVjdGVkRGF0ZSIsInRpbWVGb3JtYXQiKSksUkM9UHQoInBsYW5uaW5nIix3cCwoe2FwcDplLGNvbmZpZzp0LHF1YXJ0ZXJseVBsYW5zOm59KT0+KHthcHA6ZSxncmlkSGVpZ2h0U2l6ZTpOdW1iZXIodD8uZ3JpZEhlaWdodFNpemUpfHwxLHF1YXJ0ZXJseVBsYW5zOm59KSksTUM9UHQoInF1aWNrLWFjdGlvbnMiLHRmLFJpKCJhcHAiKSksUEM9UHQoInF1b3RlcyIsZWYsKHthcHA6ZSxjb25maWc6dCxwcm92aWRlckFwaUtleTpufSk9Pih7YXBwOmUsZ3JpZEhlaWdodFNpemU6TnVtYmVyKHQ/LmdyaWRIZWlnaHRTaXplKXx8MSxwbGFuQ29udGVudDpudWxsLHByb3ZpZGVyQXBpS2V5Om4scXVvdGVzOm51bGx9KSksTEM9UHQoInJlY2VudC1ub3RlcyIscmYsKHthcHA6ZSxjb25maWc6dCx0YXNrRG9tYWluVVVJRDpufSk9Pih7YXBwOmUsZ3JpZEhlaWdodFNpemU6TnVtYmVyKHQ/LmdyaWRIZWlnaHRTaXplKXx8MSx0YXNrRG9tYWluVVVJRDpufSkpLHpDPVB0KCJncmF2ZXlhcmQiLEZwLCh7YXBwOmUsY29uZmlnOnQsdGFza0RvbWFpblVVSUQ6bn0pPT4oe2FwcDplLGdyaWRIZWlnaHRTaXplOk51bWJlcih0Py5ncmlkSGVpZ2h0U2l6ZSl8fDEsZ3JpZFdpZHRoU2l6ZTpOdW1iZXIodD8uZ3JpZFdpZHRoU2l6ZSl8fDIsdGFza0RvbWFpblVVSUQ6bn0pKSxGQz1QdCgidmljdG9yeS12YWx1ZSIsYWYsUmkoImFwcCIsImNvbXBsZXRlZFRhc2tzQnlEYXRlIiwiZGFpbHlWYWx1ZXMiLCJtb29kUmF0aW5ncyIsIm9uUmVmZXJlbmNlRGF0ZUNoYW5nZSIsInJlZmVyZW5jZURhdGUiLCJ3ZWVrRm9ybWF0Iiwid2Vla2x5VG90YWwiKSksVUM9UHQoImxheW91dC1waWNrZXIiLFdwLFJpKCJhcHAiLCJjdXJyZW50TGF5b3V0Iiwib25MYXlvdXRBcHBseSIsIm9uU2VsZWN0ZWRQcm9maWxlQ2hhbmdlIikpLCRDPXthZ2VuZGE6TkMsY2FsZW5kYXI6X0MsImRheS1za2V0Y2giOkRDLCJkZWJ1Zy1jb25zb2xlIjpDQywiZHJlYW0tdGFzayI6QUMsZ3JhdmV5YXJkOnpDLCJsYXlvdXQtcGlja2VyIjpVQyxtb29kOk9DLCJwZWFrLWhvdXJzIjpJQyxwbGFubmluZzpSQywicXVpY2stYWN0aW9ucyI6TUMscXVvdGVzOlBDLCJyZWNlbnQtbm90ZXMiOkxDLCJ2aWN0b3J5LXZhbHVlIjpGQ307ZnVuY3Rpb24gV0MoZSx7aW5pdERhdGFGcmVzaFJlZjp0LGluaXRpYWxpemVEb21haW5UYXNrczpuLHNldENvbmZpZ1BhcmFtczpyLHNldEN1cnJlbnREYXRlOm8sc2V0RGFpbHlWaWN0b3J5VmFsdWVzOmEsc2V0TW9vZFJhdGluZ3M6aSxzZXRQbHVnaW5Ob3RlVVVJRDpzLHNldFF1YXJ0ZXJseVBsYW5zOmwsc2V0V2Vla2x5VmljdG9yeVZhbHVlOmN9KXtFZChlLnNldHRpbmdzPy5bRy5DT05TT0xFX0xPR0dJTkddKSxFKGBbZGFzaGJvYXJkXSBhcHBseURhc2hib2FyZERhdGEgXHUyMDE0IHRhc2tzOiR7ZS50YXNrcz8ubGVuZ3RoPz8wfSBtb29kUmF0aW5nczogJHtlLm1vb2RSYXRpbmdzPy5sZW5ndGg/PzB9YCksbihlKSxpKGUubW9vZFJhdGluZ3MpLGwoZS5xdWFydGVybHlQbGFucykscihlLnNldHRpbmdzKSxhKGUuZGFpbHlWaWN0b3J5VmFsdWVzKSxjKGUud2Vla2x5VmljdG9yeVZhbHVlKSxvKGUuY3VycmVudERhdGUpLGUucGx1Z2luTm90ZVVVSUQmJnMoZS5wbHVnaW5Ob3RlVVVJRCksdC5jdXJyZW50PSEwfWZ1bmN0aW9uIFgwKGUpe2xldCB0PW5ldyBEYXRlLG49cm4odCxlKTtyZXR1cm4gdC5nZXRUaW1lKCktbi5nZXRUaW1lKCk8MyoyNCo2MCo2MCoxZTN9ZnVuY3Rpb24gQkMoZSx0KXtsZXQgbj1uZXcgTWFwO2ZvcihsZXQgciBvZlsuLi5lfHxbXSwuLi50fHxbXV0pe2lmKCFyfHxyLnRpbWVzdGFtcD09bnVsbCljb250aW51ZTtsZXQgbz1yLnV1aWR8fGAke3IudGltZXN0YW1wfToke3IucmF0aW5nfToke3Iubm90ZXx8IiJ9YDtuLnNldChvLHIpfXJldHVybiBBcnJheS5mcm9tKG4udmFsdWVzKCkpLnNvcnQoKHIsbyk9PihyLnRpbWVzdGFtcHx8MCktKG8udGltZXN0YW1wfHwwKSl9YXN5bmMgZnVuY3Rpb24gSEMoZSx0LG4scil7bGV0IG89cm4odCxyKTtYMChyKSYmKG89bmV3IERhdGUobyksby5zZXREYXRlKG8uZ2V0RGF0ZSgpLTcpKTtsZXQgYT1NYXRoLmZsb29yKG8uZ2V0VGltZSgpLzFlMyk7dHJ5e2xldCBpPWF3YWl0IGUuZ2V0TW9vZFJhdGluZ3MoYSk7QXJyYXkuaXNBcnJheShpKSYmbihzPT5CQyhzLGkpKX1jYXRjaChpKXtFKCJmZXRjaE1vb2RSYXRpbmdzOiBmYWlsZWQgdG8gbG9hZCBtb29kIHJhdGluZ3MiLGkpfX1mdW5jdGlvbiBqQyhlLHQsbixyLG8sYSl7ZShyLG8sYSksYSYmKHQoYS5kYWlseVZpY3RvcnlWYWx1ZXMpLG4oYS53ZWVrbHlWaWN0b3J5VmFsdWUpKX1hc3luYyBmdW5jdGlvbiBWQyhlLHQsbixyLG89ITEsYT1udWxsKXtsZXQgaT1BcnJheS5pc0FycmF5KHQ/LltHLkRBU0hCT0FSRF9DT01QT05FTlRTXSk/dFtHLkRBU0hCT0FSRF9DT01QT05FTlRTXTpOcixzPXt9O298fGkuZm9yRWFjaChjPT57c1tjLndpZGdldElkXT1jfSk7bGV0IGw9ci5tYXAoYz0+e2xldCBkPXNbY10sdT1PdC5maW5kKGY9PmYud2lkZ2V0SWQ9PT1jKSxwPWE/LltjXTtyZXR1cm57d2lkZ2V0SWQ6YyxncmlkV2lkdGhTaXplOnA/LmdyaWRXaWR0aFNpemU/P2Q/LmdyaWRXaWR0aFNpemU/P3U/LmRlZmF1bHRHcmlkV2lkdGhTaXplPz8xLGdyaWRIZWlnaHRTaXplOnA/LmdyaWRIZWlnaHRTaXplPz9kPy5ncmlkSGVpZ2h0U2l6ZT8/MSxzZXR0aW5nczpkPy5zZXR0aW5nc3x8e319fSk7YXdhaXQgZS5zZXRTZXR0aW5nKEcuREFTSEJPQVJEX0NPTVBPTkVOVFMsSlNPTi5zdHJpbmdpZnkobCkpLGJsKEcuREFTSEJPQVJEX0NPTVBPTkVOVFMsbCksbihjPT4oey4uLmMsW0cuREFTSEJPQVJEX0NPTVBPTkVOVFNdOmx9KSl9YXN5bmMgZnVuY3Rpb24gR0MoZSx0LG4scixvLGEse2FwaUtleTppLGFwaUtleVByb3ZpZGVyOnMsYmFja2dyb3VuZEltYWdlVXJsOmwsYmFja2dyb3VuZE1vZGU6YyxsbG1Qcm92aWRlcjpkLHRpbWVGb3JtYXQ6dSx3ZWVrRm9ybWF0OnB9KXtFKCJbZGFzaGJvYXJkXSBoYW5kbGVTZXR0aW5nc1NhdmUgY2FsbGVkIHdpdGg6Iix7bGxtUHJvdmlkZXI6ZCxhcGlLZXlQcm92aWRlcjpzLGJhY2tncm91bmRNb2RlOmMsYmFja2dyb3VuZEltYWdlVXJsOmwhPW51bGw/IihzZXQpIjoiKHVuY2hhbmdlZCkiLHRpbWVGb3JtYXQ6dSx3ZWVrRm9ybWF0OnB9KTtsZXQgZj1BdChzfHxkKSx5PVtlLnNldFNldHRpbmcoRy5MTE1fUFJPVklERVJfTU9ERUwsZCksZS5zZXRTZXR0aW5nKEcuQkFDS0dST1VORF9JTUFHRV9VUkwsbHx8IiIpXTtmJiZpJiZ5LnB1c2goZS5zZXRTZXR0aW5nKGYsaSkpLGwmJmMmJnkucHVzaChlLnNldFNldHRpbmcoRy5CQUNLR1JPVU5EX0lNQUdFX01PREUsYykpLHQuY3VycmVudCYmKHV8fHApJiZ5LnB1c2godC5jdXJyZW50LnNhdmUoe3RpbWVGb3JtYXQ6dSx3ZWVrRm9ybWF0OnB9KSk7dHJ5e2F3YWl0IFByb21pc2UuYWxsKHkpLEUoIltkYXNoYm9hcmRdIHNldHRpbmdzIHNhdmUgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpfWNhdGNoKGIpe0UoIltkYXNoYm9hcmRdIHNldHRpbmdzIHNhdmUgRkFJTEVEOiIsYil9YmwoRy5MTE1fUFJPVklERVJfTU9ERUwsZCksZiYmYmwoZixpKTtsZXQgdz17W0cuTExNX1BST1ZJREVSX01PREVMXTpkLFtHLkJBQ0tHUk9VTkRfSU1BR0VfVVJMXTpsfHwiIixbRy5CQUNLR1JPVU5EX0lNQUdFX01PREVdOmw/Y3x8ImNvdmVyIjoiIn07ZiYmKHdbZl09aSksbihiPT4oey4uLmIsLi4ud30pKSx1JiZvKHUpLHAmJmEocCkscihidC5ERUZBVUxUKX1mdW5jdGlvbiBLQyhlLHQpe2Uobj0+Wy4uLm58fFtdLHRdKX1mdW5jdGlvbiBsZih7YXBwOmUsaW5pdFByb21pc2U6dH0pe2xldCBuPW5lLmNyZWF0ZUVsZW1lbnQse2FjdGl2ZVRhc2tEb21haW46cixidWlsZEFnZW5kYVRhc2tzQnlEYXRlOm8saW5pdGlhbGl6ZURvbWFpblRhc2tzOmEsb25Eb21haW5DaGFuZ2U6aSxvcGVuVGFza3M6cyx0YXNrRG9tYWluczpsfT1ZcCgpLHtjb21wbGV0ZWRUYXNrc0J5RGF0ZTpjLGZldGNoQ29tcGxldGVkVGFza3M6ZH09VnAoZSkse2NhbGVuZGFyRXZlbnRzOnUsY2FsZW5kYXJFdmVudHNMb2FkZWQ6cH09cXAoZSxyKSxbZix5XT0oMCxuZS51c2VTdGF0ZSkobnVsbCksW3csYl09KDAsbmUudXNlU3RhdGUpKG51bGwpLFt2LGhdPSgwLG5lLnVzZVN0YXRlKShudWxsKSxbZyxtXT0oMCxuZS51c2VTdGF0ZSkobnVsbCksW3gsU109KDAsbmUudXNlU3RhdGUpKGJ0LkRFRkFVTFQpLFtfLERdPSgwLG5lLnVzZVN0YXRlKShudWxsKSxbQSxUXT0oMCxuZS51c2VTdGF0ZSkobnVsbCksW0wsel09KDAsbmUudXNlU3RhdGUpKG51bGwpLFtJLE1dPSgwLG5lLnVzZVN0YXRlKShudWxsKSxbRixVXT0oMCxuZS51c2VTdGF0ZSkoIm1lcmlkaWFuIiksW08sal09KDAsbmUudXNlU3RhdGUpKCJzdW5kYXkiKSxbWCxOXT0oMCxuZS51c2VTdGF0ZSkobnVsbCksaz0oMCxuZS51c2VSZWYpKG51bGwpLFI9KDAsbmUudXNlUmVmKSghMSksQj1rbChPKTsoMCxuZS51c2VFZmZlY3QpKCgpPT57bGV0IHVlPURhdGUubm93KCk7RSgiW2Rhc2hib2FyZF0gYXdhaXRpbmcgaW5pdCBkYXRhIiksdC50aGVuKGFzeW5jIEVlPT57aWYoRShgW2Rhc2hib2FyZF0gaW5pdCBkYXRhIHJlY2VpdmVkIGluICR7RGF0ZS5ub3coKS11ZX1tc2ApLEVlPy5lcnJvciltKEVlLmVycm9yKTtlbHNle1F5KEVlKSxXQyhFZSx7aW5pdERhdGFGcmVzaFJlZjpSLGluaXRpYWxpemVEb21haW5UYXNrczphLHNldENvbmZpZ1BhcmFtczp5LHNldEN1cnJlbnREYXRlOmIsc2V0RGFpbHlWaWN0b3J5VmFsdWVzOmgsc2V0TW9vZFJhdGluZ3M6RCxzZXRQbHVnaW5Ob3RlVVVJRDpULHNldFF1YXJ0ZXJseVBsYW5zOnosc2V0V2Vla2x5VmljdG9yeVZhbHVlOk59KSxrLmN1cnJlbnQ9bmV3IERpKGUpO2xldCBjdD1EYXRlLm5vdygpO0UoIltkYXNoYm9hcmRdIGxvYWRpbmcgRGFzaGJvYXJkU2V0dGluZ05vdGUiKTtsZXR7dGltZUZvcm1hdDpWdCx3ZWVrRm9ybWF0OmFufT1hd2FpdCBrLmN1cnJlbnQubG9hZCgpO0UoYFtkYXNoYm9hcmRdIERhc2hib2FyZFNldHRpbmdOb3RlIGxvYWRlZCBpbiAke0RhdGUubm93KCktY3R9bXNgKSxWdCYmVShWdCksYW4mJmooYW4pfX0pLmNhdGNoKEVlPT5tKEVlLm1lc3NhZ2UpKX0sW10pO2xldCBIPSgwLG5lLnVzZU1lbW8pKCgpPT57aWYoSSlyZXR1cm4gSTtpZighdylyZXR1cm4gbnVsbDtpZihYMChCKSl7bGV0IHVlPXJuKHcsQiksRWU9bmV3IERhdGUodWUpO3JldHVybiBFZS5zZXREYXRlKEVlLmdldERhdGUoKS0xKSxPZShFZSl9cmV0dXJuIHd9LFt3LEksQl0pLHE9KDAsbmUudXNlQ2FsbGJhY2spKHVlPT5IQyhlLHVlLEQsQiksW2UsQl0pOygwLG5lLnVzZUVmZmVjdCkoKCk9PntsZXQgdWU9SXx8dzt1ZSYmKFIuY3VycmVudD9SLmN1cnJlbnQ9ITE6cSh1ZSksciYmKGQodWUsciksSCYmSCE9PXVlJiZkKEgscikpKX0sW3IsdyxkLHEsSSxIXSk7bGV0IEo9KDAsbmUudXNlQ2FsbGJhY2spKCh1ZSxFZSxjdCk9PmpDKGksaCxOLHVlLEVlLGN0KSxbaV0pLEs9KDAsbmUudXNlQ2FsbGJhY2spKCh1ZSxFZT0hMSxjdD1udWxsKT0+VkMoZSxmLHksdWUsRWUsY3QpLFtlLGZdKSxaPSgwLG5lLnVzZUNhbGxiYWNrKSh1ZT0+eShFZT0+KHsuLi5FZSxbRy5TRUxFQ1RFRF9MQVlPVVRfUFJPRklMRV06dWV9KSksW10pLGFlPSgwLG5lLnVzZUNhbGxiYWNrKShhc3luYyh1ZSxFZT0hMSxjdD1udWxsLFZ0PXZvaWQgMCk9Pnthd2FpdCAkcCh7YXBwOmUsaXNSZXNldDpFZSxvbkxheW91dFBlcnNpc3Q6SyxvblNlbGVjdGVkUHJvZmlsZUNoYW5nZTpaLHByb2ZpbGVJZDpWdCxzaXppbmc6Y3Qsd2lkZ2V0SWRzOnVlfSksUyhidC5ERUZBVUxUKX0sW2UsSyxaXSksbGU9KDAsbmUudXNlQ2FsbGJhY2spKHVlPT5HQyhlLGsseSxTLFUsaix1ZSksW2VdKSxjZT0oMCxuZS51c2VDYWxsYmFjaykodWU9PktDKEQsdWUpLFtdKTtScCh7YWN0aXZlVGFza0RvbWFpbjpyLGFwcDplLG9uRG9tYWluQ2hhbmdlOmksb3BlblRhc2tzOnN9KTtsZXQgZWU9KDAsbmUudXNlTWVtbykoKCk9Pnc/byh3KTp7fSxbbyx3XSkse2FjdGl2ZUNvbXBvbmVudHM6aWV9PUdwKHtjb25maWdQYXJhbXM6Zn0pLHtkcmFnZ2luZ1dpZGdldElkOlEsZGlzcGxheWVkQ29tcG9uZW50czpnZX09TXYoaWUsSykse2NsZWFyRm9jdXNlZFdpZGdldDpfZSxmb2N1c2VkV2lkZ2V0SWQ6QmUsaXNXaWRnZXRGb2N1c01vZGU6WGUsd2lkZ2V0Rm9jdXNUcmFuc2Zvcm1zOlN0fT1xdyhRLHgpLFVlPSgwLG5lLnVzZUNhbGxiYWNrKSgoKT0+UyhidC5TRVRUSU5HU19DT05GSUcpLFtdKTtpZihnKXJldHVybiBuKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1lcnJvciJ9LG4oImgyIixudWxsLCJEYXNoYm9hcmQgRXJyb3IiKSxuKCJwIixudWxsLGcpKTtpZighZilyZXR1cm4gbigiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtb3V0ZXItY29udGFpbmVyIn0sbigiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtbG9hZGluZyJ9LG4oImRpdiIse2NsYXNzTmFtZToic3Bpbm5lciJ9KSxuKCJwIixudWxsLCJMb2FkaW5nIGRhc2hib2FyZC4uLiIpKSk7bGV0IEV0PWY/LltHLkJBQ0tHUk9VTkRfSU1BR0VfVVJMXSxIdD1mPy5bRy5CQUNLR1JPVU5EX0lNQUdFX01PREVdfHwiY292ZXIiLGp0PUV0fHxXbCgibGFyZ2UiLE9lKHd8fG5ldyBEYXRlKSk7RXQmJkUoIltkYXNoYm9hcmRdIGJhY2tncm91bmQgaW1hZ2UgVVJMIGZyb20gc2V0dGluZ3M6IixFdCwibW9kZToiLEh0KTtsZXQgeG49anQ/KCgpPT57bGV0IHVlPUh0LnN0YXJ0c1dpdGgoInJlcGVhdCIpO3JldHVybntiYWNrZ3JvdW5kSW1hZ2U6YHVybCgke2p0fSlgLGJhY2tncm91bmRTaXplOnVlPyJhdXRvIjpIdCxiYWNrZ3JvdW5kUmVwZWF0OnVlP0h0OiJuby1yZXBlYXQiLGJhY2tncm91bmRQb3NpdGlvbjoiY2VudGVyIixiYWNrZ3JvdW5kQXR0YWNobWVudDoiZml4ZWQifX0pKCk6dm9pZCAwLE1uPVN0cmluZyhmW0cuREVCVUdfQ09OU09MRV18fCIiKS50cmltKCk9PT0idHJ1ZSJ8fGhufHx2aSgpLnBsdWdpblVVSUQ9PT0iNmRhMDM1NzQtMGY0Yi0xMWYxLWJhOWUtMTFiYTljNzE2ZjU5IjtNbj9FKGBbZGFzaGJvYXJkXSBEZWJ1ZyBjb25zb2xlIGVuYWJsZWQgKGNvbmZpZ1BhcmFtcyAke2ZbRy5ERUJVR19DT05TT0xFXX0gYXBwIHNldHRpbmcga2V5cyAke09iamVjdC5rZXlzKGUuc2V0dGluZ3MpfSwgJHt2aSgpLnBsdWdpblVVSUR9KSwgaW5jbHVkaW5nIGluIGxheW91dCBwb3B1cGApOkUoYFtkYXNoYm9hcmRdIERlYnVnIGNvbnNvbGUgZGlzYWJsZWQgKCR7Ry5ERUJVR19DT05TT0xFfSBpcyAnJHtmPy5bRy5ERUJVR19DT05TT0xFXX0nLCBwbHVnaW5VVUlEICR7dmkoKS5wbHVnaW5VVUlEfSwgY29udGV4dCAke0pTT04uc3RyaW5naWZ5KHZpKCkpfSksIGV4Y2x1ZGluZyBmcm9tIGxheW91dCBwb3B1cGApO2xldCBQbj1Nbj9bXTpbImRlYnVnLWNvbnNvbGUiXTtyZXR1cm4gbigiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtb3V0ZXItY29udGFpbmVyIixzdHlsZTp4bn0seD09PWJ0LkxBWU9VVF9DT05GSUc/bihTcCx7Y3VycmVudExheW91dDpBcnJheS5pc0FycmF5KGY/LltHLkRBU0hCT0FSRF9DT01QT05FTlRTXSk/ZltHLkRBU0hCT0FSRF9DT01QT05FTlRTXTpOcixleGNsdWRlV2lkZ2V0SWRzOlBuLG9uU2F2ZTphZSxvbkNhbmNlbDooKT0+UyhidC5ERUZBVUxUKSxzZWxlY3RlZExheW91dFByb2ZpbGU6Zj8uW0cuU0VMRUNURURfTEFZT1VUX1BST0ZJTEVdfHxudWxsfSk6bnVsbCx4PT09YnQuU0VUVElOR1NfQ09ORklHPyhFKCJbZGFzaGJvYXJkXSByZW5kZXJpbmcgRGFzaGJvYXJkU2V0dGluZ3NQb3B1cCwgYmdVcmw6IixmPy5bRy5CQUNLR1JPVU5EX0lNQUdFX1VSTF0pLG4oRHAse2FwcDplLGNvbmZpZ1BhcmFtczpmLG9uQ2FuY2VsOigpPT5TKGJ0LkRFRkFVTFQpLG9uU2F2ZTpsZSxwbHVnaW5Ob3RlVVVJRDpBLHRpbWVGb3JtYXQ6Rix3ZWVrRm9ybWF0Ok99KSk6bnVsbCxuKCJkaXYiLHtjbGFzc05hbWU6ImRhc2hib2FyZC1jb250ZW50In0sbigiZGl2Iix7Y2xhc3NOYW1lOiJkYXNoYm9hcmQtdG9vbGJhciJ9LG4ob2Yse2FjdGl2ZVRhc2tEb21haW46cixhcHA6ZSxkb21haW5zOmwsb25Eb21haW5DaGFuZ2U6Sn0pLG4oImRpdiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLXRvb2xiYXItYWN0aW9ucyJ9LG4oImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWNvbmZpZ3VyZS1idXR0b24iLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+e0UoIltkYXNoYm9hcmRdIG9wZW5pbmcgU2V0dGluZ3MgcG9wdXAiKSxTKGJ0LlNFVFRJTkdTX0NPTkZJRyl9LHRpdGxlOiJDb25maWd1cmUgTExNIHByb3ZpZGVyIGFuZCBBUEkga2V5IGZvciBBSS1wb3dlcmVkIGZlYXR1cmVzIn0sIlx1MjY5OVx1RkUwRiBTZXR0aW5ncyIpLG4oImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWNvbmZpZ3VyZS1idXR0b24iLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+UyhidC5MQVlPVVRfQ09ORklHKSx0aXRsZToiQ29uZmlndXJlIHdoaWNoIHdpZGdldHMgYXJlIHNob3duIGFuZCBpbiB3aGF0IG9yZGVyIn0sIlx1MjYzMCBMYXlvdXQiKSkpLG4oImRpdiIse2NsYXNzTmFtZTpgZGFzaGJvYXJkLWdyaWQtc2hlbGwke1hlPyIgZGFzaGJvYXJkLWdyaWQtc2hlbGwtLWZvY3VzZWQiOiIifWB9LFhlP24oImJ1dHRvbiIse2NsYXNzTmFtZToiZGFzaGJvYXJkLWdyaWQtZm9jdXMtYmFja2Ryb3AiLHR5cGU6ImJ1dHRvbiIsdGl0bGU6IlJldHVybiBhbGwgd2lkZ2V0cyB0byB0aGUgZGFzaGJvYXJkIGdyaWQiLCJhcmlhLWxhYmVsIjoiUmV0dXJuIGFsbCB3aWRnZXRzIHRvIHRoZSBkYXNoYm9hcmQgZ3JpZCIsb25DbGljazpfZX0pOm51bGwsbigiZGl2Iix7Y2xhc3NOYW1lOmBkYXNoYm9hcmQtZ3JpZCR7UT8iIGRhc2hib2FyZC1ncmlkLS1kcmFnZ2luZyI6IiJ9JHtYZT8iIGRhc2hib2FyZC1ncmlkLS1mb2N1c2VkIjoiIn1gfSwuLi5nZS5tYXAoKHVlLEVlKT0+e2xldCBjdD11ZT8ud2lkZ2V0SWR8fE5yW0VlXT8ud2lkZ2V0SWQsVnQ9JENbY3RdO2lmKCFWdClyZXR1cm4gbnVsbDtsZXQgYW49Zj8uW0cuTExNX1BST1ZJREVSX01PREVMXSxMcj1UcihhbiksbW89THI/QXQoTHIpOm51bGwsQz1tbyYmZj8uW21vXXx8IiIsWT1Mcnx8YW58fG51bGw7cmV0dXJuIG4oVnQse2tleTpjdCxhZ2VuZGFUYXNrczplZSxhcHA6ZSxjYWxlbmRhckV2ZW50czp1LGNhbGVuZGFyRXZlbnRzTG9hZGVkOnAsY29tcGxldGVkVGFza3NCeURhdGU6Yyxjb25maWc6dWUsY3VycmVudERhdGU6dyxkYWlseVZhbHVlczp2LGRyYWdnaW5nV2lkZ2V0SWQ6USxmb2N1c2VkV2lkZ2V0SWQ6QmUsbW9vZFJhdGluZ3M6XyxvbkRhdGVTZWxlY3Q6TSxjdXJyZW50TGF5b3V0OkFycmF5LmlzQXJyYXkoZj8uW0cuREFTSEJPQVJEX0NPTVBPTkVOVFNdKT9mW0cuREFTSEJPQVJEX0NPTVBPTkVOVFNdOk5yLG9uTGF5b3V0QXBwbHk6SyxvblNlbGVjdGVkUHJvZmlsZUNoYW5nZTpaLG9uTW9vZFJlY29yZGVkOmNlLG9uT3BlblNldHRpbmdzOlVlLG9uUmVmZXJlbmNlRGF0ZUNoYW5nZTpNLG9wZW5UYXNrczpzLHByb3ZpZGVyQXBpS2V5OkMscHJvdmlkZXJFbTpZLHF1YXJ0ZXJseVBsYW5zOkwscmVmZXJlbmNlRGF0ZTpILHNlbGVjdGVkRGF0ZTpJLHRhc2tEb21haW5VVUlEOnIsdGltZUZvcm1hdDpGLHdlZWtGb3JtYXQ6Tyx3ZWVrbHlUb3RhbDpYLHdpZGdldEZvY3VzVHJhbnNmb3JtOlN0W2N0XXx8bnVsbH0pfSkuZmlsdGVyKEJvb2xlYW4pKSkpKX12YXIgWUM9NDMwLHFDPSJkYXNoYm9hcmQtbGFyZ2UtcGhvbmUtdmlld3BvcnQiOyhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtsZXQgbj1NYXRoLm1pbihzY3JlZW4ud2lkdGgsc2NyZWVuLmhlaWdodCkscj13aW5kb3cubWF0Y2hNZWRpYSgiKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIikubWF0Y2hlcz9NYXRoLm1heChzY3JlZW4ud2lkdGgsc2NyZWVuLmhlaWdodCk6bjtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShxQyxyPD1ZQykscj49d2luZG93LmlubmVyV2lkdGgpe2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5tYXhXaWR0aD0iIixkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYPSIiLGRvY3VtZW50LmJvZHkuc3R5bGUubWF4V2lkdGg9IiIsZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvd1g9IiI7cmV0dXJufWxldCBvPXIrInB4Ijtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUubWF4V2lkdGg9byxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3dYPSJoaWRkZW4iLGRvY3VtZW50LmJvZHkuc3R5bGUubWF4V2lkdGg9byxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93WD0iaGlkZGVuIn10KCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdCl9KSgpO3ZhciBabCxjZjtobj8oWmw9X2QoKSxjZj1abC5pbml0KCkpOihabD1uZXcgUHJveHkoe30se2dldChlLHQpe2lmKHR5cGVvZiB0IT0ic3ltYm9sIilyZXR1cm4oLi4ubik9PndpbmRvdy5jYWxsQW1wbGVub3RlUGx1Z2luKHQsLi4ubil9fSksY2Y9d2luZG93LmNhbGxBbXBsZW5vdGVQbHVnaW4oImluaXQiKSk7KDAsZWIuY3JlYXRlUm9vdCkoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRhc2hib2FyZC1yb290IikpLnJlbmRlcigoMCxaMC5jcmVhdGVFbGVtZW50KShsZix7YXBwOlpsLGluaXRQcm9taXNlOmNmfSkpO30pKCk7Ci8qISBCdW5kbGVkIGxpY2Vuc2UgaW5mb3JtYXRpb246CgpyZWFjdC9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanM6CiAgKCoqCiAgICogQGxpY2Vuc2UgUmVhY3QKICAgKiByZWFjdC5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCgpzY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCgpyZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qczoKICAoKioKICAgKiBAbGljZW5zZSBSZWFjdAogICAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcwogICAqCiAgICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAgICoKICAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAgICopCiovCg==";
var compiledCSS = `[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{border-radius:6px;font-size:.75rem;line-height:1.4;outline:0;position:relative;transition-property:transform,visibility,opacity;white-space:normal}.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}.tippy-content{padding:8px 12px;position:relative;z-index:1}.tippy-arrow{color:var(--dashboard-color-tooltip-bg);height:16px;width:16px}.tippy-arrow:before{border-color:#0000;border-style:solid;content:"";position:absolute}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-top-color:initial;border-width:8px 8px 0;bottom:-7px;left:0;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:initial;border-width:0 8px 8px;left:0;top:-7px;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-left-color:initial;border-width:8px 0 8px 8px;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-right-color:initial;border-width:8px 8px 8px 0;left:-7px;transform-origin:center right}.tippy-box[data-theme~=dashboard]{background:var(--dashboard-color-tooltip-bg);box-shadow:0 4px 12px var(--dashboard-color-tooltip-shadow);color:var(--dashboard-color-tooltip-text);max-width:260px;min-width:180px}.tippy-box[data-theme~=dashboard]>.tippy-arrow{color:var(--dashboard-color-tooltip-bg)}.tippy-box[data-theme~=dashboard].below-chart>.tippy-content{max-height:40vh;overflow-y:auto}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-header{border-bottom:1px solid var(--dashboard-color-tooltip-border);font-weight:600;margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-section{border-bottom:1px solid var(--dashboard-color-tooltip-border);margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row{align-items:baseline;display:flex;gap:8px;justify-content:space-between;padding:2px 0}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-label p{display:inline;margin:0}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-row-value{color:var(--dashboard-color-tooltip-accent);flex-shrink:0;font-weight:600}.tippy-box[data-theme~=dashboard] .dashboard-tooltip-empty{color:var(--dashboard-color-tooltip-text-muted);font-style:italic}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-date{border-bottom:1px solid var(--dashboard-color-tooltip-border);font-weight:600;margin-bottom:4px;padding-bottom:4px}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-entry{align-items:baseline;display:flex;flex-wrap:wrap;gap:4px 6px;padding:2px 0}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-time{color:var(--dashboard-color-tooltip-text-muted);font-size:.7rem;min-width:52px}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-mood .mood-viz-label{color:var(--dashboard-color-tooltip-text-muted)}.tippy-box[data-theme~=dashboard] .mood-viz-tooltip-note{color:var(--dashboard-color-tooltip-text);flex-basis:100%;font-size:.7rem;font-style:italic;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-word}.widget .widget-body{overflow-y:auto}.widget .widget-heading-bar,.widget .widget-title{align-items:center;display:flex}.widget .widget-title__label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget .widget-header-action{text-decoration:none;white-space:nowrap}.widget .widget-header-action:hover{text-decoration:underline}.widget-planning .planning-quarters{display:flex;flex-wrap:wrap;gap:16px;margin-bottom:16px}.widget-planning .quarter-card{border:2px dashed var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex:1 1 140px;flex-direction:column;gap:4px;min-width:0;padding:12px 16px;transition:background .15s,border-color .15s}.widget-planning .quarter-card:hover{border-color:var(--dashboard-color-blue)}.widget-planning .quarter-card--has-plan{background:var(--dashboard-color-plan-created-bg);border-color:var(--dashboard-color-plan-created-border);border-style:solid}.widget-planning .quarter-card--has-plan:hover{border-color:var(--dashboard-color-plan-created-border);filter:brightness(.97)}.widget-planning .quarter-card .quarter-label{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700}.widget-planning .quarter-card .quarter-status-row{align-items:center;display:flex;gap:8px;justify-content:space-between}.widget-planning .quarter-card .quarter-status{color:var(--dashboard-color-text-secondary);font-size:.75rem}.widget-planning .quarter-card .quarter-plan-indicator{cursor:default;flex-shrink:0;font-size:.85rem;line-height:1}.widget-planning .month-tabs{display:flex;flex-wrap:wrap;gap:4px}.widget-planning .month-tab{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:1;font-size:.8rem;padding:8px 12px;transition:background .15s,color .15s}.widget-planning .month-tab:hover{background:var(--dashboard-color-blue-light)}.widget-planning .month-tab.active{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.widget-planning .month-content-area{border:1px solid var(--dashboard-color-border);border-radius:6px;margin-top:12px;overflow:hidden;padding:12px 16px}.widget-planning .month-content-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic}.widget-planning .month-content-header{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;margin-bottom:8px}.widget-planning .month-content-text{color:var(--dashboard-color-text);font-size:.8rem;line-height:1.4}.widget-planning .month-content-text p{margin:0 0 4px}.widget-planning .month-content-text ol,.widget-planning .month-content-text ul{margin:0 0 4px;padding-left:16px}.widget-planning .month-content-text li{margin:0;padding:0}.widget-planning .month-content-text strong{color:var(--dashboard-color-navy)}.widget-planning .month-content-text>:last-child{margin-bottom:0}.widget-planning .month-content-empty{text-align:center}.widget-planning .create-month-plan-link{background:none;border:2px dashed var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;font-size:.8rem;padding:8px 16px;transition:border-color .15s,color .15s}.widget-planning .create-month-plan-link:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-navy)}.widget-planning .planning-empty{color:var(--dashboard-color-text-muted);font-size:.85rem;font-style:italic;padding:16px 0;text-align:center}.widget-planning .weekly-plan-section{border-top:1px solid var(--dashboard-color-border);margin-top:16px;padding-top:12px}.widget-planning .weekly-plan-header{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;margin-bottom:8px}.widget-planning .weekly-plan-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic}.widget-planning .create-week-plan-link{background:none;border:2px dashed var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-link);cursor:pointer;font-size:.8rem;padding:8px 16px;transition:border-color .15s,color .15s;width:100%}.widget-planning .create-week-plan-link:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-navy)}.widget-planning .note-editor{display:flex;flex-direction:column;gap:8px;height:100%}.widget-planning .note-editor-loading{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:12px}.widget-planning .note-editor-toolbar{display:flex;gap:8px}.widget-planning .note-editor-btn{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:pointer;font-size:.8rem;padding:4px 12px;transition:background .15s}.widget-planning .note-editor-btn:hover{background:var(--dashboard-color-blue-light)}.widget-planning .note-editor-btn--save{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.widget-planning .note-editor-btn--save:hover{filter:brightness(.92)}.widget-planning .note-editor-btn--save:disabled{cursor:default;opacity:.6}.widget-planning .note-editor-textarea{border:1px solid var(--dashboard-color-border);border-radius:6px;flex:1;font-family:monospace;font-size:.8rem;line-height:1.5;min-height:180px;padding:12px;resize:vertical}.rich-footnote-wrap{display:inline}.rich-footnote-indicator{cursor:default;display:inline-block;font-size:.65em;margin-left:2px;opacity:.65;vertical-align:super}.rich-footnote-indicator:hover{opacity:1}.tippy-box[data-theme~=rich-footnote]{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:10px;box-shadow:0 4px 16px var(--dashboard-color-overlay-shadow);color:var(--dashboard-color-text);font-size:.85rem;line-height:1.5;max-width:420px;min-width:200px}.tippy-box[data-theme~=rich-footnote]>.tippy-arrow{color:var(--dashboard-color-bg-card)}.tippy-box[data-theme~=rich-footnote]>.tippy-content{padding:12px}.rich-footnote-popup{display:flex;flex-direction:column;gap:8px}.rich-footnote-popup-url{align-items:center;display:flex;gap:4px}.rich-footnote-popup-url svg{color:var(--dashboard-color-accent);flex-shrink:0}.rich-footnote-popup-url a{color:var(--dashboard-color-link);overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.rich-footnote-popup-url a:hover{text-decoration:underline}.rich-footnote-popup-text{color:var(--dashboard-color-text)}.rich-footnote-popup-media{border-radius:6px;overflow:hidden}.rich-footnote-popup-media img,.rich-footnote-popup-media video,.rich-footnote-popup-media iframe{display:block;max-width:100%;width:100%}.rich-footnote-popup-media iframe{aspect-ratio:16/9;border:0}.rich-footnote-popup-actions{border-top:1px solid var(--dashboard-color-border);display:flex;justify-content:flex-end;padding-top:8px}.rich-footnote-popup-close{background:none;border:none;color:var(--dashboard-color-accent);cursor:pointer;font-size:.8rem;font-weight:600;letter-spacing:.5px;padding:4px 8px}.rich-footnote-popup-close:hover{opacity:.8}.widget-agenda a{color:var(--dashboard-color-link);text-decoration:none}.widget-agenda a:hover{text-decoration:underline}.widget-agenda img{max-width:100%}.widget-agenda .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-agenda .agenda-list{display:flex;flex:1;flex-direction:column;gap:12px;min-height:0;overflow-x:hidden;overflow-y:auto;padding-right:4px}.widget-agenda .agenda-day{display:flex;flex-direction:column;gap:4px}.widget-agenda .agenda-date-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:700;letter-spacing:.02em;text-transform:uppercase}.widget-agenda .agenda-empty-day{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:4px 0}.widget-agenda .agenda-item{align-items:center;display:flex;gap:12px;padding:8px 0}.widget-agenda .agenda-item .agenda-indicator{border-radius:2px;flex-shrink:0;height:36px;width:4px}.widget-agenda .agenda-item .agenda-indicator.priority-critical{background-color:var(--dashboard-color-agenda-priority-critical)}.widget-agenda .agenda-item .agenda-indicator.priority-important{background-color:var(--dashboard-color-agenda-priority-important)}.widget-agenda .agenda-item .agenda-indicator.priority-urgent{background-color:var(--dashboard-color-agenda-priority-urgent)}.widget-agenda .agenda-item .agenda-indicator.priority-normal{background-color:var(--dashboard-color-agenda-priority-normal)}.widget-agenda .agenda-item .agenda-content{display:flex;flex:1;flex-direction:column;gap:4px}.widget-agenda .agenda-item .agenda-content .agenda-time{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600}.widget-agenda .agenda-item .agenda-content .agenda-text{color:var(--dashboard-color-text);font-size:.85rem;overflow:hidden;white-space:nowrap}.widget-agenda .agenda-item .agenda-content .agenda-note-link{background:#0000;border:0;color:var(--dashboard-color-link);cursor:pointer;font-size:.72rem;margin:0;padding:0;text-align:left;text-decoration:underline}.widget-agenda .agenda-item .agenda-duration{color:var(--dashboard-color-text-muted);font-size:.7rem}.widget-agenda .agenda-task-row{border-radius:6px;cursor:pointer;padding:8px;transition:background-color .12s ease}.widget-agenda .agenda-task-row:hover{background:var(--dashboard-color-bg-page)}.widget-agenda .agenda-empty{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-agenda .agenda-pagination{align-items:center;display:flex;gap:4px}.widget-agenda .agenda-page-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.65rem;line-height:1;padding:2px 4px}.widget-agenda .agenda-page-arrow:hover:not(:disabled){color:var(--dashboard-color-navy)}.widget-agenda .agenda-page-arrow:disabled{cursor:default;opacity:.3}.widget-agenda .agenda-page-indicator{color:var(--dashboard-color-text-muted);font-size:.7rem;white-space:nowrap}.widget-calendar.vertical-2-cell .cal-arrow{font-size:.9rem}.widget-calendar.vertical-2-cell .cal-month{font-size:1.1rem}.widget-calendar.vertical-2-cell .cal-header{font-size:.85rem}.widget-calendar.vertical-2-cell .cal-cell{padding-top:0}.widget-calendar.vertical-2-cell .cal-cell .cal-day{font-size:16px;top:0}.widget-calendar.vertical-2-cell .cal-cell .cal-dot{bottom:18%;height:6px;width:6px}.widget-calendar.horizontal-2-cell.vertical-1-cell .widget-body{display:flex;flex-direction:column;padding:8px 16px}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-nav{margin-bottom:8px}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-grid{flex:1}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-header{padding:2px 0}.widget-calendar.horizontal-2-cell.vertical-1-cell .cal-cell{aspect-ratio:auto;border-radius:12px}.widget-calendar .cal-nav{align-items:center;display:flex;justify-content:space-between;margin-bottom:12px}.widget-calendar .cal-arrow{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px}.widget-calendar .cal-arrow:hover{color:var(--dashboard-color-navy)}.widget-calendar .cal-month{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700}.widget-calendar .cal-grid{display:grid;gap:2px;grid-template-columns:repeat(7,1fr);text-align:center}.widget-calendar .cal-header{color:var(--dashboard-color-text-muted);font-size:.7rem;font-weight:600;padding:4px 0}.widget-calendar .cal-cell{align-items:center;aspect-ratio:1;border-radius:50%;cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:4px 0;position:relative;transition:background-color .12s ease}.widget-calendar .cal-cell:not(.empty):hover{background:var(--dashboard-color-blue-light)}.widget-calendar .cal-cell.empty{cursor:default;visibility:hidden}.widget-calendar .cal-cell.today{background:var(--dashboard-color-blue)}.widget-calendar .cal-cell.today .cal-day{color:var(--dashboard-color-text-on-accent);font-weight:700}.widget-calendar .cal-cell.today:hover{background:var(--dashboard-color-navy)}.widget-calendar .cal-cell.selected{outline:2px solid var(--dashboard-color-accent);outline-offset:0}.widget-calendar .cal-cell.today.selected{outline-color:var(--dashboard-color-accent)}.widget-calendar .cal-cell .cal-day{color:var(--dashboard-color-text);font-size:.8rem;position:relative;top:-2px}.widget-calendar .cal-cell .cal-dot{border-radius:50%;bottom:6px;height:4px;position:absolute;width:4px}@media (max-width: 430px){.widget-calendar .cal-cell{aspect-ratio:auto;min-height:32px}.widget-calendar .cal-cell .cal-dot{bottom:auto;margin-top:6px;position:static}}.dashboard-large-phone-viewport .widget-calendar .cal-cell{aspect-ratio:auto;min-height:32px}.dashboard-large-phone-viewport .widget-calendar .cal-cell .cal-dot{bottom:auto;margin-top:6px;position:static}.dashboard-layout-popup{display:flex;flex-direction:column;margin:16px;max-height:min(800px,100vh - 32px);max-width:min(800px,100vw - 32px);min-width:0;width:100%}.dashboard-layout-popup .dashboard-layout-popup-tabs{display:flex;gap:4px;margin-top:12px}.dashboard-layout-popup .dashboard-layout-popup-tab{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex:1;font-size:.8rem;padding:8px 12px;transition:background .15s ease,color .15s ease}.dashboard-layout-popup .dashboard-layout-popup-tab:hover{background:var(--dashboard-color-blue-light)}.dashboard-layout-popup .dashboard-layout-popup-tab.active{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent);font-weight:600}.dashboard-layout-popup .dashboard-layout-popup-body{display:flex;flex:1;flex-direction:column;gap:16px;overflow-y:auto;padding:16px}.dashboard-layout-popup .dashboard-layout-popup-section{border:2px dashed rgba(0,0,0,0);border-radius:10px;padding:4px;transition:border-color .15s ease,background .15s ease}.dashboard-layout-popup .dashboard-layout-popup-section--drag-over{background:var(--dashboard-color-blue-light);border-color:var(--dashboard-color-accent)}.dashboard-layout-popup .dashboard-layout-popup-section-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;margin-bottom:8px;padding-bottom:8px}.dashboard-layout-popup .dashboard-layout-popup-section-icon{flex-shrink:0;font-size:.9rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-section-title{color:var(--dashboard-color-text-secondary);font-size:.72rem;font-weight:700;letter-spacing:.05em;margin:0;text-transform:uppercase}.dashboard-layout-popup .dashboard-layout-popup-list{display:flex;flex-direction:column;gap:4px}.dashboard-layout-popup .dashboard-layout-popup-item{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:grab;display:flex;gap:8px;padding:8px 12px;transition:opacity .12s ease,box-shadow .12s ease,background .12s ease;-webkit-user-select:none;user-select:none}.dashboard-layout-popup .dashboard-layout-popup-item:active{cursor:grabbing}.dashboard-layout-popup .dashboard-layout-popup-item--dragging{opacity:.35}.dashboard-layout-popup .dashboard-layout-popup-item--drag-over{background:var(--dashboard-color-bg-card);box-shadow:0 -2px 0 var(--dashboard-color-accent)}.dashboard-layout-popup .dashboard-layout-popup-item-handle{color:var(--dashboard-color-text-muted);cursor:grab;flex-shrink:0;font-size:1rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-item-handle:active{cursor:grabbing}.dashboard-layout-popup .dashboard-layout-popup-item-icon{flex-shrink:0;font-size:1rem;line-height:1}.dashboard-layout-popup .dashboard-layout-popup-item-info{display:flex;flex:1;flex-direction:column;gap:1px;min-width:0;overflow:hidden}.dashboard-layout-popup .dashboard-layout-popup-item-name{color:var(--dashboard-color-text);font-size:.875rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-item-description{color:var(--dashboard-color-text-secondary);font-size:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-item-actions{display:flex;flex-shrink:0;gap:2px}.dashboard-layout-popup .dashboard-layout-popup-arrow-button{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;line-height:1;padding:3px 7px;transition:background .1s ease,color .1s ease}.dashboard-layout-popup .dashboard-layout-popup-arrow-button:hover:not(:disabled){background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.dashboard-layout-popup .dashboard-layout-popup-arrow-button:disabled{cursor:not-allowed;opacity:.3}.dashboard-layout-popup .dashboard-layout-popup-empty{color:var(--dashboard-color-text-muted);font-size:.8rem;font-style:italic;padding:12px 8px;text-align:center}.dashboard-layout-popup .dashboard-layout-popup-sizing{display:flex;flex-direction:column;gap:8px}.dashboard-layout-popup .dashboard-layout-popup-sizing-item{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;display:flex;align-items:center;gap:12px;padding:8px 12px}.dashboard-layout-popup .dashboard-layout-popup-sizing-item-header{align-items:center;display:flex;gap:8px;flex:1;min-width:0}.dashboard-layout-popup .dashboard-layout-popup-sizing-item-controls{display:flex;flex-shrink:0;gap:16px}.dashboard-layout-popup .dashboard-layout-popup-profile-select{margin-left:8px;padding:3px 6px}.dashboard-layout-popup .dashboard-layout-popup-sizing-field{align-items:center;display:flex;gap:4px}.dashboard-layout-popup .dashboard-layout-popup-sizing-label{color:var(--dashboard-color-text-secondary);font-size:.72rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;white-space:nowrap}.dashboard-layout-popup .dashboard-layout-popup-sizing-select{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;padding:4px 8px}.dashboard-layout-popup .config-popup-actions .config-popup-link{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;margin-right:auto;padding:0;text-decoration:underline}.dashboard-layout-popup .config-popup-actions .config-popup-link:hover{color:var(--dashboard-color-text)}.dashboard-toolbar{align-items:stretch;display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;margin-bottom:16px}.dashboard-toolbar .dashboard-toolbar-actions{align-items:center;display:flex;background-color:var(--dashboard-color-bg-card);border-radius:6px;border:1px solid var(--dashboard-color-border);color:var(--dashboard-color-text-secondary);flex-shrink:0;padding:5px 8px}.dashboard-toolbar .dashboard-configure-button{background-color:var(--dashboard-color-bg-card);border:1px solid rgba(0,0,0,0);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.8rem;font-weight:500;padding:4px 12px;transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap}.dashboard-toolbar .dashboard-configure-button:hover{background:var(--dashboard-color-bg-page);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text)}.config-popup-overlay{align-items:center;background:var(--dashboard-color-overlay-backdrop);display:flex;inset:0;justify-content:center;position:fixed;z-index:1000}.config-popup-container{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;box-shadow:0 8px 32px var(--dashboard-color-overlay-shadow);max-width:90%;min-width:320px;width:650px}.config-popup-container .explanation-paragraph{font-size:14px;margin:12px 0 20px}.config-popup-container .config-popup-header{border-bottom:1px solid var(--dashboard-color-border);padding:16px}.config-popup-container .config-popup-title{color:var(--dashboard-color-navy);font-size:.95rem;font-weight:700;margin:0}.config-popup-container .config-popup-body{padding:16px}.config-popup-container .config-popup-body label{align-items:center;color:var(--dashboard-color-text);cursor:pointer;display:flex;font-size:.85rem;gap:8px;padding:4px 0}.config-popup-container .config-popup-body input[type=radio],.config-popup-container .config-popup-body input[type=checkbox]{accent-color:var(--dashboard-color-accent)}.config-popup-container .config-popup-body .config-field{margin-bottom:12px}.config-popup-container .config-popup-body .config-field .config-line{margin-bottom:10px;margin-top:10px}.config-popup-container .config-popup-body .config-field:last-child{margin-bottom:0}.config-popup-container .config-popup-body .config-field-label{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:600;letter-spacing:.03em;margin-bottom:4px;text-transform:uppercase}.config-popup-container .config-popup-actions{border-top:1px solid var(--dashboard-color-border);display:flex;gap:8px;justify-content:flex-end;padding:12px 16px}.config-popup-container .config-popup-actions>button{padding-left:8px;padding-right:8px}.config-popup-container .config-popup-btn{border:1px solid var(--dashboard-color-border);border-radius:6px;cursor:pointer;font-size:.8rem;font-weight:600;padding:8px 16px}.config-popup-container .config-popup-btn--cancel{background:#0000;color:var(--dashboard-color-text-secondary)}.config-popup-container .config-popup-btn--cancel:hover{background:var(--dashboard-color-bg-page-hover)}.config-popup-container .config-popup-btn--submit{background:var(--dashboard-color-accent);border-color:var(--dashboard-color-accent);color:var(--dashboard-color-text-on-accent)}.config-popup-container .config-popup-btn--submit:hover{opacity:.9}.dashboard-settings-container .dashboard-settings-section{display:flex;flex-direction:column}.dashboard-settings-container .dashboard-settings-section.section:not(:first-child){border-top:1px solid var(--dashboard-color-border);margin-top:16px;padding-top:16px}.dashboard-settings-container .dashboard-settings-section-header{display:flex;flex-direction:column;gap:4px}.dashboard-settings-container .dashboard-settings-section-title{color:var(--dashboard-color-navy);font-size:.85rem;font-weight:700;letter-spacing:.02em;margin:0}.dashboard-settings-container .dashboard-settings-section-desc{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.5;margin:0}.dashboard-settings-container .dashboard-settings-select{-webkit-appearance:none;appearance:none;background:var(--dashboard-color-bg-page);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);cursor:pointer;font-size:.85rem;padding:8px 24px 8px 8px;transition:border-color .15s ease;width:100%}.dashboard-settings-container .dashboard-settings-select:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-dropzone{align-items:center;background:var(--dashboard-color-bg-page);border:2px dashed var(--dashboard-color-border);border-radius:6px;cursor:pointer;display:flex;flex-direction:column;gap:8px;justify-content:center;min-height:120px;padding:16px;text-align:center;transition:border-color .15s ease,background .15s ease}.dashboard-settings-container .dashboard-settings-dropzone:hover{border-color:var(--dashboard-color-accent)}.dashboard-settings-container .dashboard-settings-dropzone--active{background:#00000008;border-color:var(--dashboard-color-accent);border-style:solid}.dashboard-settings-container .dashboard-settings-dropzone--uploading{cursor:wait;opacity:.7}.dashboard-settings-container .dashboard-settings-dropzone-input{display:none}.dashboard-settings-container .dashboard-settings-dropzone-text{color:var(--dashboard-color-text-muted);font-size:.8rem}.dashboard-settings-container .dashboard-settings-dropzone-preview{align-items:center;display:flex;flex-direction:column;gap:8px}.dashboard-settings-container .dashboard-settings-dropzone-preview-img{border-radius:6px;max-height:80px;max-width:100%;object-fit:contain}.dashboard-settings-container .dashboard-settings-remove-image{color:var(--dashboard-color-danger);cursor:pointer;display:inline-block;font-size:.8rem;margin-top:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-remove-image:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-hint{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.45;margin:0 0 4px}.dashboard-settings-container .dashboard-settings-api-key-link{color:var(--dashboard-color-link);display:inline-block;font-size:.8rem;margin-bottom:4px;text-decoration:none}.dashboard-settings-container .dashboard-settings-api-key-link:hover{text-decoration:underline}.dashboard-settings-container .dashboard-settings-api-key-input-row{align-items:center;display:flex;gap:4px}.dashboard-settings-container .dashboard-settings-api-key-input{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);flex:1;font-family:monospace;font-size:.82rem;min-width:0;padding:8px;transition:border-color .15s ease}.dashboard-settings-container .dashboard-settings-api-key-input::placeholder{color:var(--dashboard-color-text-muted)}.dashboard-settings-container .dashboard-settings-api-key-input:focus{border-color:var(--dashboard-color-accent);outline:none}.dashboard-settings-container .dashboard-settings-api-key-toggle{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:.9rem;line-height:1;padding:8px;transition:background .1s ease,color .1s ease}.dashboard-settings-container .dashboard-settings-api-key-toggle:hover{background:var(--dashboard-color-bg-card);color:var(--dashboard-color-text)}.dashboard-outer-container .widget-dream-task .dream-task-header-actions{align-items:center;display:flex;gap:8px}.dashboard-outer-container .widget-dream-task .dream-task-list{display:flex;flex-direction:column;gap:12px}.dashboard-outer-container .widget-dream-task .dream-task-llm-attribution{color:var(--dashboard-color-text-secondary);font-size:.7rem;line-height:1.4;padding-top:8px}.dashboard-outer-container .widget-dream-task .widget-title{align-items:center;display:flex}@media (max-width: 430px){.dashboard-outer-container .widget-dream-task .widget-title .widget-title__subtitle{display:none}}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .widget-title .widget-title__subtitle{display:none}.dashboard-outer-container .widget-dream-task .dream-task-goals-summary{border-bottom:1px solid var(--dashboard-color-border);margin-bottom:8px;padding-bottom:12px}.dashboard-outer-container .widget-dream-task .dream-task-goals-text{color:var(--dashboard-color-text-secondary);font-size:.8rem;font-style:italic;line-height:1.5;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-card{border:1px solid var(--dashboard-color-border);border-radius:10px;opacity:1;padding:12px 16px;transition:border-color .15s ease,opacity .28s ease,transform .28s ease}.dashboard-outer-container .widget-dream-task .dream-task-card:hover{border-color:var(--dashboard-color-blue-light)}.dashboard-outer-container .widget-dream-task .dream-task-card--dismissing{opacity:0;pointer-events:none;transform:translateY(6px) scale(.98)}.dashboard-outer-container .widget-dream-task .dream-task-card-header{align-items:flex-start;display:flex;gap:8px;justify-content:space-between;margin-bottom:8px}.dashboard-outer-container .widget-dream-task .dream-task-card-title{color:var(--dashboard-color-navy);font-size:.9rem;font-weight:600;line-height:1.3}.dashboard-outer-container .widget-dream-task .dream-task-card-title--clickable{cursor:pointer}.dashboard-outer-container .widget-dream-task .dream-task-card-title--clickable:hover{color:var(--dashboard-color-blue);text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-rating{border-radius:6px;flex-shrink:0}.dashboard-outer-container .widget-dream-task .dream-task-rating--high{background:#22c55e1f;color:var(--dashboard-color-success)}.dashboard-outer-container .widget-dream-task .dream-task-rating--medium{background:#eab3081f;color:var(--dashboard-color-warning)}.dashboard-outer-container .widget-dream-task .dream-task-rating--low{background:#ef44441f;color:var(--dashboard-color-danger)}.dashboard-outer-container .widget-dream-task .dream-task-card--invented{border-left:2px solid var(--dashboard-color-blue-light)}.dashboard-outer-container .widget-dream-task .dream-task-new-badge{background:#4a9eff1f;border-radius:6px;color:var(--dashboard-color-blue);flex-shrink:0}.dashboard-outer-container .widget-dream-task .dream-task-source-note-badge{background:#7c3aed1a;border-radius:6px;color:var(--dashboard-color-navy);flex-shrink:0;font-size:11px;font-weight:600;max-width:11rem;overflow:hidden;padding:2px 4px;text-overflow:ellipsis;text-transform:none;white-space:nowrap}.dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-outer-container .widget-dream-task .dream-task-rating{font-size:11px;font-weight:700;padding:2px 4px;text-transform:uppercase;white-space:nowrap}@media (max-width: 430px){.dashboard-outer-container .widget-dream-task .dream-task-card-header{gap:4px;justify-content:flex-start}.dashboard-outer-container .widget-dream-task .dream-task-card-title{flex:1 0 100%;min-width:0;order:1}.dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-outer-container .widget-dream-task .dream-task-source-note-badge,.dashboard-outer-container .widget-dream-task .dream-task-rating{display:none}}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-card-header{gap:4px;justify-content:flex-start}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-card-title{flex:1 0 100%;min-width:0;order:1}.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-new-badge,.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-source-note-badge,.dashboard-large-phone-viewport .dashboard-outer-container .widget-dream-task .dream-task-rating{display:none}.dashboard-outer-container .widget-dream-task .dream-task-card-explanation{color:var(--dashboard-color-text-secondary);cursor:pointer;display:-webkit-box;font-size:.8rem;line-height:1.5;margin:0;overflow:hidden;text-overflow:ellipsis;line-clamp:3;-webkit-box-orient:vertical;-webkit-line-clamp:3}.dashboard-outer-container .widget-dream-task .dream-task-card-explanation--expanded{display:block;overflow:visible;text-overflow:clip;line-clamp:initial;-webkit-box-orient:initial;-webkit-line-clamp:initial}.dashboard-outer-container .widget-dream-task .dream-task-card-actions{align-items:center;display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}.dashboard-outer-container .widget-dream-task .dream-task-card-action{color:var(--dashboard-color-link);cursor:pointer;font-size:.75rem;font-weight:600;text-decoration:none}.dashboard-outer-container .widget-dream-task .dream-task-card-action:hover{text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-no-config{align-items:center;display:flex;flex-direction:column;gap:12px;padding:24px 16px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-no-config-text{color:var(--dashboard-color-text-secondary);font-size:.85rem;line-height:1.5;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-settings-link{color:var(--dashboard-color-link);font-weight:600;text-decoration:none}.dashboard-outer-container .widget-dream-task .dream-task-settings-link:hover{text-decoration:underline}.dashboard-outer-container .widget-dream-task .dream-task-loading{align-items:center;display:flex;flex-direction:column;gap:12px;padding:24px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-loading p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0}.dashboard-outer-container .widget-dream-task .dream-task-spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:24px;width:24px}.dashboard-outer-container .widget-dream-task .dream-task-error{padding:16px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-error p{color:var(--dashboard-color-danger);font-size:.85rem;margin:0 0 12px}.dashboard-outer-container .widget-dream-task .dream-task-empty{padding:16px;text-align:center}.dashboard-outer-container .widget-dream-task .dream-task-empty p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0 0 12px}.dashboard-outer-container .widget-dream-task .dream-task-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;padding:4px 12px}.dashboard-outer-container .widget-dream-task .dream-task-retry:hover{border-color:var(--dashboard-color-blue);color:var(--dashboard-color-blue)}.widget-graveyard .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-graveyard.horizontal-1-cell .widget-title__subtitle{display:none}.widget-graveyard .graveyard-meadow-wrapper{flex:1;min-height:0;overflow:hidden;position:relative}.widget-graveyard .graveyard-meadow-bg{border-radius:6px;height:100%;inset:0;object-fit:cover;position:absolute;transition:opacity .6s ease;width:100%}.widget-graveyard .graveyard-task-list{display:flex;flex-direction:column;gap:4px;list-style:none;max-height:100%;overflow-y:auto;padding:0;position:relative;z-index:1}.widget-graveyard .graveyard-task-item{background:var(--dashboard-color-bg-card);border-bottom:1px solid var(--dashboard-color-border);display:flex;flex-direction:column;gap:4px;padding:8px 12px}.widget-graveyard .graveyard-task-item:last-child{border-bottom:none}.widget-graveyard .graveyard-task-item--dismissing{pointer-events:none;visibility:hidden}.widget-graveyard .graveyard-task-header{align-items:baseline;display:flex;gap:8px;justify-content:space-between}.widget-graveyard .graveyard-task-title-wrap{flex:1;min-width:0}.widget-graveyard .graveyard-task-title{color:var(--dashboard-color-text);display:block;font-size:.85rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-graveyard .graveyard-task-title:focus{outline:1px solid var(--dashboard-color-link);outline-offset:2px}.widget-graveyard .graveyard-task-title-wrap:hover .graveyard-task-title,.widget-graveyard .graveyard-task-title-wrap:focus-within .graveyard-task-title{text-decoration:underline dotted}.widget-graveyard .graveyard-task-tooltip{display:flex;flex-direction:column;gap:8px;max-height:280px;overflow-y:auto;padding:12px}.widget-graveyard .graveyard-task-tooltip-meta{align-items:baseline;display:flex;flex-wrap:wrap;gap:4px 12px;justify-content:space-between}.widget-graveyard .graveyard-task-tooltip-note{color:var(--dashboard-color-tooltip-accent);font-size:.76rem;font-weight:600}.widget-graveyard .graveyard-task-tooltip-created{color:var(--dashboard-color-tooltip-text-muted);font-size:.72rem}.widget-graveyard .graveyard-task-tooltip-content{color:var(--dashboard-color-tooltip-text);font-size:.78rem;line-height:1.4}.widget-graveyard .graveyard-task-tooltip-content code{background:#ffffff14;border-radius:4px;padding:1px 4px}.widget-graveyard .graveyard-task-tooltip-footer{border-top:1px solid var(--dashboard-color-tooltip-border);padding-top:8px}.widget-graveyard .graveyard-task-score--muted{color:var(--dashboard-color-tooltip-text-muted)}.widget-graveyard .graveyard-task-score--cool{color:var(--dashboard-color-blue-light)}.widget-graveyard .graveyard-task-score--warm{color:var(--dashboard-color-warning)}.widget-graveyard .graveyard-task-score--hot{color:var(--dashboard-color-danger)}.widget-graveyard .graveyard-task-score-dot{background:currentColor;border-radius:999px;display:inline-block;height:9px;width:9px}.widget-graveyard .graveyard-task-age{color:var(--dashboard-color-text-muted);flex-shrink:0;font-size:.75rem;white-space:nowrap}.widget-graveyard .graveyard-task-actions{display:flex;gap:12px}.widget-graveyard .graveyard-task-actions>a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-graveyard .graveyard-task-action{color:var(--dashboard-color-text-secondary);font-size:.75rem;text-decoration:none}.widget-graveyard .graveyard-task-action:hover{text-decoration:underline}.widget-graveyard .graveyard-task-action--send:hover{color:var(--dashboard-color-danger)}.widget-graveyard .graveyard-task-action--keep:hover{color:var(--dashboard-color-link)}.widget-graveyard .graveyard-task-action--note:hover{color:var(--dashboard-color-blue)}.widget-graveyard.vertical-1-cell .graveyard-task-tooltip{max-height:220px}.widget-graveyard.horizontal-1-cell.vertical-1-cell .graveyard-task-header{align-items:flex-start}.widget-graveyard.horizontal-1-cell.vertical-1-cell .graveyard-task-age{font-size:.7rem}.widget-graveyard .graveyard-loading,.widget-graveyard .graveyard-empty{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:12px 0;text-align:center}.widget-graveyard .graveyard-error{display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px 0}.widget-graveyard .graveyard-error p{color:var(--dashboard-color-danger);font-size:.85rem;text-align:center}.widget-graveyard .graveyard-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.8rem;padding:4px 8px}.widget-graveyard .graveyard-retry:hover{border-color:var(--dashboard-color-border);color:var(--dashboard-color-text)}.widget-layout-picker .layout-picker-warning{background:color-mix(in srgb,var(--dashboard-color-warning) 15%,transparent);border:1px solid color-mix(in srgb,var(--dashboard-color-warning) 40%,transparent);border-radius:6px;color:var(--dashboard-color-text);font-size:.8rem;font-weight:600;margin-bottom:12px;padding:8px 12px}.widget-layout-picker .layout-picker-profiles{display:flex;flex-direction:column;gap:8px}.widget-layout-picker .layout-picker-profile-button{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:10px;color:var(--dashboard-color-text);cursor:pointer;padding:12px;text-align:left;transition:background .15s ease,border-color .15s ease;width:100%}.widget-layout-picker .layout-picker-profile-button:hover:not(:disabled){background:var(--dashboard-color-bg-page-hover);border-color:var(--dashboard-color-accent)}.widget-layout-picker .layout-picker-profile-button:disabled{cursor:not-allowed;opacity:.6}.widget-layout-picker .layout-picker-profile-button--applying{border-color:var(--dashboard-color-accent)}.widget-layout-picker .layout-picker-profile-button--current{border-color:color-mix(in srgb,var(--dashboard-color-accent) 50%,transparent)}.widget-layout-picker .layout-picker-profile-header{align-items:baseline;display:flex;flex-wrap:wrap;gap:4px 8px;margin-bottom:8px}.widget-layout-picker .layout-picker-profile-icon{flex-shrink:0;font-size:1.1rem;line-height:1}.widget-layout-picker .layout-picker-profile-name{flex:1;font-size:.95rem;font-weight:700;min-width:0}.widget-layout-picker .layout-picker-profile-action{color:var(--dashboard-color-accent);font-size:.72rem;font-weight:600}.widget-layout-picker .layout-picker-profile-action--current{color:var(--dashboard-color-text-muted)}.widget-layout-picker .layout-picker-profile-description{color:var(--dashboard-color-text-secondary);font-size:.8rem;line-height:1.45;margin:0}.widget-day-sketch .widget-body{display:flex;flex-direction:column;overflow:hidden;padding:0}.widget-day-sketch .day-sketch-notebook{background-color:#fffef5;background-image:repeating-linear-gradient(transparent,transparent 33px,#b8d4e8 33px,#b8d4e8 34px);background-attachment:local;background-position:0 0;background-size:100% 34px;border-left:3px solid #e88e8e;flex:1;margin-left:0;min-height:0;overflow-y:auto;padding:0 8px 0 0}.widget-day-sketch .day-sketch-line{align-items:center;display:flex;height:34px;padding-left:4px;position:relative}.widget-day-sketch .day-sketch-hour-label{color:#a0a0a0;flex-shrink:0;font-family:Segoe Script,Bradley Hand,Comic Sans MS,cursive,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.78rem;font-weight:700;letter-spacing:.02em;text-align:right;text-transform:lowercase;-webkit-user-select:none;user-select:none;width:64px;padding-right:8px}.widget-day-sketch .day-sketch-input{background:#0000;border:none;color:#333;flex:1;font-family:Segoe Script,Bradley Hand,Comic Sans MS,cursive,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.88rem;height:100%;line-height:34px;outline:none;padding:0 4px}.widget-day-sketch .day-sketch-input::placeholder{color:#0000}.widget-day-sketch .day-sketch-input:focus{background:#b8d4e81f}.widget-day-sketch .day-sketch-loading{align-items:center;color:var(--dashboard-color-text-muted);display:flex;font-size:.85rem;height:100%;justify-content:center;padding:24px}.widget-day-sketch .day-sketch-save-btn{background:none;border:1px solid var(--dashboard-color-blue);border-radius:6px;color:var(--dashboard-color-blue);cursor:pointer;font-size:.72rem;font-weight:600;padding:2px 8px;transition:background .15s ease,color .15s ease}.widget-day-sketch .day-sketch-save-btn:hover:not(:disabled){background:var(--dashboard-color-blue);color:var(--dashboard-color-text-on-accent)}.widget-day-sketch .day-sketch-save-btn--disabled{border-color:var(--dashboard-color-text-muted);color:var(--dashboard-color-text-muted);cursor:default;opacity:.5}@media (prefers-color-scheme: dark){.widget-day-sketch .day-sketch-notebook{background-color:#2a2923;background-image:repeating-linear-gradient(transparent,transparent 33px,#4a5568 33px,#4a5568 34px);border-left-color:#7c4444}.widget-day-sketch .day-sketch-hour-label{color:#6b7280}.widget-day-sketch .day-sketch-input{color:#e2e0d8}.widget-day-sketch .day-sketch-input:focus{background:#4a556826}}.widget-debug-console .widget-body{max-height:2000px;overflow-y:auto;padding:0}.widget-debug-console .debug-console{font-family:Courier New,Courier,monospace;font-size:11px;height:100%;max-height:100%;overflow-y:auto;padding:6px 8px}.widget-debug-console .debug-console__empty{color:var(--color-text-muted, #888);font-family:inherit;font-size:12px;padding:12px 4px}.widget-debug-console .debug-console__entry{align-items:baseline;border-bottom:1px solid var(--color-border, rgba(0, 0, 0, .06));display:flex;gap:8px;line-height:1.4;padding:2px 0}.widget-debug-console .debug-console__entry:last-child{border-bottom:none}.widget-debug-console .debug-console__timestamp{color:var(--color-text-secondary, #888);flex-shrink:0;font-size:10px;opacity:.75;-webkit-user-select:none;user-select:none}.widget-debug-console .debug-console__message{color:var(--color-text, #222);overflow-wrap:break-word;word-break:break-all}.widget-debug-console .debug-console__clear-button{background:none;border:1px solid var(--color-border, rgba(0, 0, 0, .2));border-radius:3px;color:var(--color-text-muted, #888);cursor:pointer;font-size:11px;line-height:1;padding:2px 6px}.widget-debug-console .debug-console__clear-button:hover{background:var(--color-hover, rgba(0, 0, 0, .06));color:var(--color-text, #222)}@keyframes mood-fadeout{0%{opacity:1}to{opacity:0}}.widget-mood .mood-selector{display:flex;gap:8px;justify-content:center;margin-bottom:16px}.widget-mood .mood-btn{align-items:center;background:none;border:2px solid rgba(0,0,0,0);border-radius:50%;cursor:pointer;display:flex;height:44px;justify-content:center;transition:border-color .15s,transform .15s;width:44px}.widget-mood .mood-btn:hover{border-color:var(--dashboard-color-blue);transform:scale(1.15)}.widget-mood .mood-btn--selected{border-color:var(--dashboard-color-blue);background:var(--dashboard-color-blue-light);transform:scale(1.15)}.widget-mood .mood-btn .mood-emoji{font-size:1.5rem}.widget-mood .mood-details{margin-bottom:12px}.widget-mood .mood-details-label{color:var(--dashboard-color-text-secondary);display:block;font-size:.8rem;margin-bottom:4px}.widget-mood .mood-details-textarea{background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:.85rem;padding:8px;resize:vertical;width:100%}.widget-mood .mood-details-textarea:focus{border-color:var(--dashboard-color-blue);outline:none}.widget-mood .mood-details-textarea::placeholder{color:var(--dashboard-color-text-muted)}.widget-mood .mood-submit-row{display:flex;gap:8px;margin-bottom:16px}.widget-mood .mood-submit-btn{background:var(--dashboard-color-blue);border:none;border-radius:6px;color:var(--dashboard-color-text-on-accent);cursor:pointer;flex:1;font-size:.85rem;font-weight:600;padding:8px 16px;transition:opacity .15s}.widget-mood .mood-submit-btn:hover:not(:disabled){opacity:.9}.widget-mood .mood-submit-btn:disabled{cursor:not-allowed;opacity:.6}.widget-mood .mood-cancel-btn{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.85rem;font-weight:600;padding:8px 16px;transition:border-color .15s,color .15s}.widget-mood .mood-cancel-btn:hover:not(:disabled){border-color:var(--dashboard-color-text-secondary);color:var(--dashboard-color-text)}.widget-mood .mood-cancel-btn:disabled{cursor:not-allowed;opacity:.6}.widget-mood .mood-confirmation{align-items:center;animation:mood-fadeout 1s ease-out 4s forwards;display:flex;flex-direction:column;gap:8px;margin-bottom:16px;padding:16px 0}.widget-mood .mood-confirmation-icon{font-size:2.5rem}.widget-mood .mood-confirmation-text{color:var(--dashboard-color-success);font-size:.9rem;font-weight:600}.widget-mood .mood-summary{color:var(--dashboard-color-text-secondary);font-size:.8rem;text-align:center}.widget-mood .mood-sparkline{align-items:flex-end;display:flex;gap:3px;height:24px;justify-content:center;margin-top:8px}.widget-mood .mood-dot{background:var(--dashboard-color-blue);border-radius:2px;min-height:4px;position:relative;width:4px}.widget-mood .mood-viz-section{align-items:center;display:flex;flex-direction:column;gap:4px;margin-top:8px}.widget-mood .mood-viz-canvas-wrap{border-radius:10px;line-height:0;overflow:visible;position:relative}.widget-mood .mood-viz-canvas{border-radius:10px;display:block;height:220px;width:220px}.widget-mood .mood-viz-configure-link{background:none;border:none;color:var(--dashboard-color-text-muted);cursor:pointer;font-size:.75rem;padding:4px 8px;transition:color .15s}.widget-mood .mood-viz-configure-link:hover{color:var(--dashboard-color-text-secondary)}.widget-mood .mood-viz-config-option{align-items:center;cursor:pointer;display:flex;font-size:.9rem;gap:8px;padding:4px 0}.widget-mood .mood-viz-config-option input[type=radio]{accent-color:var(--dashboard-color-blue);cursor:pointer}.widget-peak-hours .peak-hours-metrics-grid{display:grid;gap:12px;grid-template-columns:repeat(3,1fr);margin-bottom:16px}.widget-peak-hours .peak-hours-metric-card{background:var(--dashboard-color-bg-page);border-radius:10px;padding:12px 16px}.widget-peak-hours .peak-hours-metric-label{color:var(--dashboard-color-text-secondary);font-size:.8rem;margin-bottom:4px}.widget-peak-hours .peak-hours-metric-value{color:var(--dashboard-color-navy);font-size:1.25rem;font-weight:600}.widget-peak-hours .peak-hours-legend{color:var(--dashboard-color-text-secondary);display:flex;flex-wrap:wrap;font-size:.75rem;gap:16px;margin-bottom:8px}.widget-peak-hours .peak-hours-legend-item{align-items:center;display:flex;gap:4px}.widget-peak-hours .peak-hours-legend-swatch{border-radius:2px;display:inline-block;height:10px;width:10px}.widget-peak-hours .peak-hours-legend-swatch--created{background:var(--dashboard-color-blue)}.widget-peak-hours .peak-hours-legend-swatch--completed{background:var(--dashboard-color-accent)}.widget-peak-hours .peak-hours-chart-container{height:220px;position:relative;width:100%}.widget-peak-hours .peak-hours-canvas{display:block;height:100%;width:100%}.widget-peak-hours .peak-hours-tooltip{background:var(--dashboard-color-tooltip-bg);border:1px solid var(--dashboard-color-tooltip-border);border-radius:6px;box-shadow:0 2px 8px var(--dashboard-color-tooltip-shadow);color:var(--dashboard-color-tooltip-text);font-size:.75rem;padding:8px 12px;pointer-events:none;position:absolute;white-space:nowrap;z-index:10}.widget-peak-hours .peak-hours-tooltip-header{font-weight:600;margin-bottom:4px}.widget-peak-hours .peak-hours-tooltip-label--created{color:var(--dashboard-color-tooltip-accent)}.widget-peak-hours .peak-hours-tooltip-label--completed{color:var(--dashboard-color-accent)}.widget-peak-hours .peak-hours-footer{color:var(--dashboard-color-text-muted);font-size:.75rem;margin-top:12px;text-align:center}.widget-peak-hours .peak-hours-empty{padding:24px;text-align:center}.widget-peak-hours .peak-hours-empty p{color:var(--dashboard-color-text-secondary);font-size:.85rem;margin:0}.vertical-1-cell .widget-peak-hours .peak-hours-metrics-grid{gap:8px}.vertical-1-cell .widget-peak-hours .peak-hours-metric-card{padding:4px 8px}.vertical-1-cell .widget-peak-hours .peak-hours-metric-label{font-size:.7rem;margin-bottom:0}.vertical-1-cell .widget-peak-hours .peak-hours-metric-value{font-size:1rem}.vertical-1-cell .widget-peak-hours .peak-hours-legend{margin-bottom:4px}.vertical-1-cell .widget-peak-hours .peak-hours-chart-container{height:160px}.vertical-1-cell .widget-peak-hours .peak-hours-footer{margin-top:8px}.horizontal-2-cell .widget-peak-hours .peak-hours-chart-container{height:220px}.vertical-2-cell .widget-peak-hours .peak-hours-chart-container{height:380px}.horizontal-2-cell.vertical-2-cell .widget-peak-hours .peak-hours-chart-container{height:440px}.widget-quotes .widget-body{display:flex;flex-direction:column}.widget-quotes .quotes-grid{display:grid;flex:1;gap:16px;grid-template-columns:1fr 1fr}.widget-quotes .quote-tile{background-position:center;background-size:cover;border-radius:10px;color:var(--dashboard-color-text-on-accent);display:flex;flex-direction:column;justify-content:flex-end;min-height:150px;padding:24px 16px}.widget-quotes .quote-tile .quote-text{font-family:Georgia,Times New Roman,serif;font-size:.95rem;font-style:italic;line-height:1.5;margin:0 0 8px}.widget-quotes .quote-tile .quote-author{font-size:.75rem;opacity:.85}.widget-quotes .quotes-loading{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:24px 0;text-align:center}.widget-quick-actions .qa-grid{display:grid;gap:8px;grid-template-columns:1fr 1fr}.widget-quick-actions .qa-button{align-items:center;background:var(--dashboard-color-bg-page);border:1px solid var(--dashboard-color-border);border-radius:10px;cursor:pointer;display:flex;flex-direction:column;gap:8px;padding:16px 8px;transition:background .15s}.widget-quick-actions .qa-button:hover{background:var(--dashboard-color-bg-page-hover)}.widget-quick-actions .qa-button .qa-icon{font-size:1.4rem}.widget-quick-actions .qa-button .qa-label{color:var(--dashboard-color-text);font-size:.75rem;font-weight:500}.widget-recent-notes .widget-body{display:flex;flex-direction:column;overflow:hidden}.widget-recent-notes .note-list{display:flex;flex:1;flex-direction:column;gap:4px;list-style:none;min-height:0;overflow-y:auto}.widget-recent-notes .note-item:hover{background-color:var(--dashboard-color-bg-page)}.widget-recent-notes .note-link{align-items:center;background:none;border:none;border-radius:6px;color:inherit;cursor:pointer;display:flex;font-family:inherit;gap:8px;justify-content:space-between;padding:8px 12px;text-align:left;width:100%}.widget-recent-notes .note-name{color:var(--dashboard-color-text);flex:1;font-size:.85rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.widget-recent-notes .note-count,.widget-recent-notes .note-metadata{color:var(--dashboard-color-text-muted);flex-shrink:0;font-size:.75rem;white-space:nowrap}.widget-recent-notes .note-loading,.widget-recent-notes .note-empty,.widget-recent-notes .note-error{color:var(--dashboard-color-text-secondary);font-size:.85rem;padding:12px 0;text-align:center}.widget-recent-notes .note-error{color:var(--dashboard-color-danger)}.dashboard-toolbar .task-domains{align-items:center;background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:6px;display:flex;gap:12px;padding:8px 12px}.dashboard-toolbar .task-domains-list{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:8px}.dashboard-toolbar .task-domain-item{align-items:center;border:1px solid rgba(0,0,0,0);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;display:inline-flex;font-size:.8rem;font-weight:500;gap:4px;padding:4px 12px;transition:all .15s ease}.dashboard-toolbar .task-domain-item:hover{background:var(--dashboard-color-blue-light);color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domain-item.active{background:var(--dashboard-color-navy);border-color:var(--dashboard-color-navy);color:var(--dashboard-color-bg-card)}.dashboard-toolbar .task-domain-item.active .task-domain-settings{color:var(--dashboard-color-text-on-accent-muted)}.dashboard-toolbar .task-domain-item.active .task-domain-settings:hover{color:var(--dashboard-color-text-on-accent)}.dashboard-toolbar .task-domain-name{-webkit-user-select:none;user-select:none}.dashboard-toolbar .task-domain-settings{background:none;border:none;color:var(--dashboard-color-text-muted);cursor:pointer;font-size:.85rem;line-height:1;padding:0}.dashboard-toolbar .task-domain-settings:hover{color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domains-refresh{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px;white-space:nowrap}@media (max-width: 800px){.dashboard-toolbar .task-domains-refresh{display:none}}.dashboard-toolbar .task-domains-refresh:hover{color:var(--dashboard-color-navy)}.dashboard-toolbar .task-domains-refresh:disabled{cursor:default;opacity:.5}.dashboard-toolbar .task-domains-empty{color:var(--dashboard-color-text-muted);font-size:.8rem}.dashboard-toolbar .task-domains--empty .task-domains-empty{flex:1 1 100%;font-weight:500}.widget-victory-value .widget-body{display:flex;flex-direction:column;justify-content:space-between}.widget-victory-value .vv-header{align-items:baseline;display:flex;gap:8px;margin-bottom:8px}.widget-victory-value .vv-header .vv-total{color:var(--dashboard-color-navy);font-size:2rem;font-weight:700}.widget-victory-value .vv-header .vv-label{color:var(--dashboard-color-text-secondary);font-size:.8rem}.widget-victory-value .vv-date-range{color:var(--dashboard-color-text-secondary);font-size:.75rem;font-weight:400}.widget-victory-value .vv-chart-container{align-items:center;display:flex;gap:4px}.widget-victory-value .vv-chart-wrap{flex:1;min-width:0;position:relative}.widget-victory-value .vv-chart{border-radius:6px;display:block;width:100%}.widget-victory-value .vv-nav-arrow{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;flex-shrink:0;font-size:1.25rem;line-height:1;padding:4px 8px;transition:background .15s,color .15s}.widget-victory-value .vv-nav-arrow:hover:not(:disabled){background:var(--dashboard-color-bg-page-hover);color:var(--dashboard-color-navy)}.widget-victory-value .vv-nav-arrow:disabled{cursor:not-allowed;opacity:.3}.vertical-1-cell .widget-victory-value .vv-chart{height:180px}.horizontal-2-cell .widget-victory-value .vv-chart{height:260px}.vertical-2-cell .widget-victory-value .vv-chart{height:380px}.horizontal-2-cell.vertical-2-cell .widget-victory-value .vv-chart{height:460px}:root{--dashboard-color-accent: #e8853d;--dashboard-color-agenda-priority-critical: #e85353;--dashboard-color-agenda-priority-important: #e8853d;--dashboard-color-agenda-priority-normal: #7a8699;--dashboard-color-agenda-priority-urgent: #5b7bbf;--dashboard-color-bg-card: #ffffff;--dashboard-color-bg-page: #eef1f5;--dashboard-color-bg-page-hover: #e6ebf2;--dashboard-color-blue: #5b7bbf;--dashboard-color-blue-light: #e8edf5;--dashboard-color-border: #d8dde6;--dashboard-color-danger: #e85353;--dashboard-color-info: #5b7bbf;--dashboard-color-link: #5b7bbf;--dashboard-color-navy: #2c3e6b;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, .4);--dashboard-color-overlay-shadow: rgba(0, 0, 0, .15);--dashboard-color-success: #4caf80;--dashboard-color-text: #1e2a3a;--dashboard-color-text-muted: #a3aebb;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, .6);--dashboard-color-text-secondary: #7a8699;--dashboard-color-tooltip-accent: #5b7bbf;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, .15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, .3);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, .5);--dashboard-color-warning: #e8853d;--dashboard-color-plan-created-bg: rgba(76, 175, 128, .08);--dashboard-color-plan-created-border: #4caf80}@media (prefers-color-scheme: dark){:root{--dashboard-color-accent: #ffb36b;--dashboard-color-agenda-priority-critical: #ff7a7a;--dashboard-color-agenda-priority-important: #ffb36b;--dashboard-color-agenda-priority-normal: #a3b0c4;--dashboard-color-agenda-priority-urgent: #8fb2ff;--dashboard-color-bg-card: #1f2937;--dashboard-color-bg-page: #111827;--dashboard-color-bg-page-hover: #1a2436;--dashboard-color-blue: #8fb2ff;--dashboard-color-blue-light: #253553;--dashboard-color-border: #374151;--dashboard-color-danger: #ff7a7a;--dashboard-color-info: #8fb2ff;--dashboard-color-link: #60a5fa;--dashboard-color-navy: #c5d8ff;--dashboard-color-overlay-backdrop: rgba(0, 0, 0, .5);--dashboard-color-overlay-shadow: rgba(0, 0, 0, .4);--dashboard-color-success: #73d4a3;--dashboard-color-text: #e5ecf5;--dashboard-color-text-muted: #95a3b8;--dashboard-color-text-on-accent: #ffffff;--dashboard-color-text-on-accent-muted: rgba(255, 255, 255, .6);--dashboard-color-text-secondary: #b6c0cf;--dashboard-color-tooltip-accent: #a5b4fc;--dashboard-color-tooltip-bg: #1f2937;--dashboard-color-tooltip-border: rgba(255, 255, 255, .15);--dashboard-color-tooltip-shadow: rgba(0, 0, 0, .5);--dashboard-color-tooltip-text: #f9fafb;--dashboard-color-tooltip-text-muted: rgba(255, 255, 255, .5);--dashboard-color-warning: #ffb36b;--dashboard-color-plan-created-bg: rgba(115, 212, 163, .1);--dashboard-color-plan-created-border: #73d4a3}}html{overflow-y:scroll}html *,html *:before,html *:after{box-sizing:border-box;margin:0;padding:0}html body{-webkit-font-smoothing:antialiased;background:var(--dashboard-color-bg-page);color:var(--dashboard-color-text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif}.dashboard-outer-container{min-height:100vh;overflow-x:hidden;position:relative;width:100%}.dashboard-outer-container .dashboard-content{margin:0 auto;max-width:1200px;padding:24px;position:relative}.dashboard-outer-container .dashboard-content .dashboard-grid-shell{isolation:isolate;position:relative}.dashboard-outer-container .dashboard-content .dashboard-grid-shell--focused{z-index:2}.dashboard-outer-container .dashboard-content .dashboard-grid-focus-backdrop{background:rgba(var(--dashboard-color-bg-page),.18);border:none;cursor:zoom-out;inset:-12px;position:absolute;z-index:2}.dashboard-outer-container .dashboard-content .dashboard-grid{display:grid;gap:16px;grid-template-columns:repeat(4,1fr);position:relative}.dashboard-outer-container .dashboard-content .grid-cell{--drag-scale: 1;--flip-x: 0px;--flip-y: 0px;--focus-blur: 0px;--focus-opacity: 1;--focus-scale: 1;--focus-x: 0px;--focus-y: 0px;--grid-cell-base-opacity: .95;filter:blur(var(--focus-blur));min-width:0;opacity:calc(var(--grid-cell-base-opacity)*var(--focus-opacity));position:relative;transform:translate(var(--flip-x),var(--flip-y)) translate(var(--focus-x),var(--focus-y)) scale(var(--drag-scale)) scale(var(--focus-scale));transition:filter .32s ease,opacity .32s ease,transform .32s ease;will-change:transform}.dashboard-outer-container .dashboard-content .grid-cell:hover{--grid-cell-base-opacity: 1}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-2-cell{grid-column:span 2}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-3-cell{grid-column:span 3}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-4-cell{grid-column:span 4}.dashboard-outer-container .dashboard-content .grid-cell.vertical-1-cell{max-height:420px;min-height:320px}.dashboard-outer-container .dashboard-content .grid-cell.vertical-2-cell{grid-row:span 2;max-height:800px;min-height:600px}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--drag-active{cursor:grabbing}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--dragging-ready{animation:widget-wobble .35s ease-in-out infinite alternate;opacity:1;z-index:3}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--drag-shift{--drag-scale: .985}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--focus-mode{pointer-events:none}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--focused{--grid-cell-base-opacity: 1;pointer-events:auto;z-index:4}.dashboard-outer-container .dashboard-content .grid-cell.grid-cell--focus-hidden{z-index:1}@media (max-width: 800px){.dashboard-outer-container .dashboard-content{padding:12px}.dashboard-outer-container .dashboard-content .dashboard-grid{grid-template-columns:1fr}.dashboard-outer-container .dashboard-content .grid-cell.horizontal-2-cell,.dashboard-outer-container .dashboard-content .grid-cell.horizontal-3-cell,.dashboard-outer-container .dashboard-content .grid-cell.horizontal-4-cell{grid-column:span 1}.dashboard-outer-container .dashboard-content .grid-cell.vertical-1-cell,.dashboard-outer-container .dashboard-content .grid-cell.vertical-2-cell{grid-row:span 1;max-height:none;min-height:auto}}.dashboard-outer-container .widget{background:var(--dashboard-color-bg-card);border:1px solid var(--dashboard-color-border);border-radius:14px;display:flex;flex-direction:column;height:100%;max-width:100%;overflow:hidden}.dashboard-outer-container .widget-header{align-items:center;border-bottom:1px solid var(--dashboard-color-border);display:flex;gap:8px;padding:12px 16px}.dashboard-outer-container .widget-heading-bar{-webkit-user-select:none;user-select:none}.dashboard-outer-container .widget-heading-bar.widget-heading-bar--drag-ready{cursor:grabbing}.dashboard-outer-container .widget-heading-bar.widget-heading-bar--focusable .widget-icon-button:hover{transform:scale(1.06)}.dashboard-outer-container .widget-icon{font-size:1rem}.dashboard-outer-container .widget-icon-button{background:rgba(var(--dashboard-color-bg-page),.6);border:1px solid rgba(0,0,0,0);border-radius:999px;cursor:pointer;line-height:1;padding:4px;transition:background .2s ease,border-color .2s ease,transform .2s ease}.dashboard-outer-container .widget-icon-button:hover{background:rgba(var(--dashboard-color-blue),.12);border-color:rgba(var(--dashboard-color-blue),.28)}.dashboard-outer-container .widget-title{color:var(--dashboard-color-navy);display:flex;flex:1;font-size:.85rem;font-weight:700;gap:8px;letter-spacing:.03em;margin:0;text-transform:uppercase}.dashboard-outer-container .widget-title__subtitle{color:var(--dashboard-color-text-muted);font-size:.75rem;font-weight:400;letter-spacing:.01em;text-transform:none}.dashboard-outer-container .widget-configure,.dashboard-outer-container .widget-header-action{background:none;border:none;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;padding:4px 8px}.dashboard-outer-container .widget-configure:hover,.dashboard-outer-container .widget-header-action:hover{color:var(--dashboard-color-navy)}.dashboard-outer-container .widget-body{flex:1;padding:16px}.dashboard-outer-container .dashboard-loading{align-items:center;color:var(--dashboard-color-text-secondary);display:flex;flex-direction:column;gap:16px;height:100vh;justify-content:center;width:100%}.dashboard-outer-container .dashboard-loading .spinner{animation:spin .8s linear infinite;border:3px solid var(--dashboard-color-border);border-radius:50%;border-top-color:var(--dashboard-color-blue);height:32px;width:32px}.dashboard-outer-container .dashboard-error{color:var(--dashboard-color-danger);padding:40px;text-align:center}.dashboard-outer-container .dashboard-error p{color:var(--dashboard-color-text-secondary);margin-top:8px}.dashboard-outer-container .widget-error-fallback{align-items:center;background:var(--dashboard-color-bg-card);border:1px dashed var(--dashboard-color-danger);border-radius:10px;display:flex;flex-direction:column;gap:8px;height:100%;justify-content:center;padding:24px;text-align:center}.dashboard-outer-container .widget-error-fallback-title{color:var(--dashboard-color-danger);font-size:.9rem;font-weight:700}.dashboard-outer-container .widget-error-fallback-message{color:var(--dashboard-color-text-muted);font-size:.8rem;max-width:280px;word-break:break-word}.dashboard-outer-container .widget-error-fallback-retry{background:none;border:1px solid var(--dashboard-color-border);border-radius:6px;color:var(--dashboard-color-text-secondary);cursor:pointer;font-size:.75rem;margin-top:4px;padding:4px 12px;transition:color .15s ease,border-color .15s ease}.dashboard-outer-container .widget-error-fallback-retry:hover{border-color:var(--dashboard-color-navy);color:var(--dashboard-color-navy)}@keyframes spin{to{transform:rotate(360deg)}}@keyframes widget-wobble{0%{transform:rotate(-1.5deg)}to{transform:rotate(1.5deg)}}
`;
function buildEmbedHTML() {
return `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>${compiledCSS}</style>
</head>
<body>
<div id="dashboard-root"></div>
<script type="text/javascript" src="data:text/javascript;base64,${clientBase64}"><\/script>
</body>
</html>`;
}
var SETTING_KEYS = {
BACKGROUND_IMAGE_URL: "Background Image URL",
BACKGROUND_IMAGE_MODE: "Background Image Mode",
CONSOLE_LOGGING: "Console logging",
DASHBOARD_COMPONENTS: "dashboard_elements",
DEBUG_CONSOLE: "debug_console",
LLM_API_KEY_ANTHROPIC: "Anthropic API Key",
LLM_API_KEY_GEMINI: "Gemini API Key",
LLM_API_KEY_GROK: "Grok API Key",
LLM_API_KEY_OPENAI: "OpenAI API Key",
LLM_PROVIDER_MODEL: "LLM Provider",
FIRST_INSTALLED_AT: "dashboard_first_installed_at",
SELECTED_LAYOUT_PROFILE: "dashboard_selected_layout_profile",
TASK_DOMAINS: "dashboard_task_domains",
PLANNING_NOTE_TAG: "Tag to apply to planning notes"
};
var API_KEY_FROM_PROVIDER = {
anthropic: SETTING_KEYS.LLM_API_KEY_ANTHROPIC,
gemini: SETTING_KEYS.LLM_API_KEY_GEMINI,
grok: SETTING_KEYS.LLM_API_KEY_GROK,
openai: SETTING_KEYS.LLM_API_KEY_OPENAI
};
function widgetConfigKey(widgetId) {
return `dashboard_${widgetId}_config`;
}
var DASHBOARD_COMPONENTS = SETTING_KEYS.DASHBOARD_COMPONENTS;
var TASK_DOMAIN_STALE_MS = 24 * 60 * 60 * 1e3;
var WIDGET_REGISTRY = [
{
widgetId: "layout-picker",
name: "Layout Picker",
description: "One-click presets that rearrange your entire dashboard into a curated profile",
icon: "\u{1F5C2}\uFE0F",
defaultGridWidthSize: 2,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "planning",
name: "Quarterly Planning",
description: "Plan and track your quarterly goals and priorities",
icon: "\u{1F4CB}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "victory-value",
name: "Victory Value",
description: "Celebrate wins and track high-value task completions",
icon: "\u{1F3C6}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "dream-task",
name: "Goal Coach",
description: "Get task suggestions that blend quarterly/monthly goals with day-of-week preferences",
icon: "\u{1F52E}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "day-sketch",
name: "Day Sketcher",
description: "Notebook-paper day planner with hour-by-hour entries saved to a note",
icon: "\u{1F5D2}\uFE0F",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "agenda",
name: "Task Agenda",
description: "View and manage your prioritized task list",
icon: "\u{1F4CC}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "quotes",
name: "Inspiration Quotes",
description: "Rotating inspirational quotes to keep you motivated",
icon: "\u{1F4A1}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "graveyard",
name: "Task Retirement Center",
description: "Surface neglected tasks and retire them to an archived note",
icon: "\u{1F475}\uFE0F",
defaultGridWidthSize: 2,
introducedAt: "2026-05-09",
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "recent-notes",
name: "Revisit Candidate",
description: "Notes with open tasks that have not had a new task in over a week",
icon: "\u{1F4CC}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "mood",
name: "Mood Tracker",
visibleTitle: "How are you feeling?",
description: "Log your daily mood and visualize trends over time",
icon: "\u{1F3AD}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "calendar",
name: "Calendar",
description: "See upcoming events and appointments at a glance",
icon: "\u{1F4C5}",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "quick-actions",
name: "Quick Actions",
description: "Shortcuts for your most frequently used dashboard actions",
icon: "\u26A1",
defaultGridWidthSize: 1,
maxHorizontalTiles: 2,
maxVerticalTiles: 2
},
{
widgetId: "peak-hours",
name: "Peak Hours",
description: "Hourly distribution of task creation and completion activity",
icon: "\u23F0",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2
},
{
widgetId: "debug-console",
name: "Debug Console",
description: "Scrollable log viewer showing all logIfEnabled messages (developer tool)",
icon: "\u{1F41B}",
defaultGridWidthSize: 2,
maxHorizontalTiles: 4,
maxVerticalTiles: 2,
debugOnly: true
}
];
var DEFAULT_DASHBOARD_COMPONENTS = WIDGET_REGISTRY.filter((w) => !w.debugOnly).map((w) => ({
widgetId: w.widgetId,
gridWidthSize: w.defaultGridWidthSize,
gridHeightSize: 1,
settings: {}
}));
var FULL_MONTH_NAMES = [
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
];
function getCurrentQuarter() {
const now = new Date();
const year = now.getFullYear();
const month = now.getMonth();
const quarter = Math.floor(month / 3) + 1;
return { year, quarter, label: `Q${quarter} ${year}` };
}
function getNextQuarter() {
let { year, quarter } = getCurrentQuarter();
quarter++;
if (quarter > 4) {
quarter = 1;
year++;
}
return { year, quarter, label: `Q${quarter} ${year}` };
}
function dateFromDateInput(dateInput, { throwOnInvalid = true } = {}) {
const fail = () => {
if (!throwOnInvalid)
return null;
throw new TypeError(`Invalid date input: ${String(dateInput)}`);
};
if (dateInput == null || dateInput === "")
return fail();
if (dateInput instanceof Date) {
const date = new Date(dateInput);
return Number.isNaN(date.getTime()) ? fail() : date;
}
if (typeof dateInput === "number") {
if (!Number.isFinite(dateInput))
return fail();
const millis = Math.abs(dateInput) < 1e10 ? dateInput * 1e3 : dateInput;
const parsed2 = new Date(millis);
return Number.isNaN(parsed2.getTime()) ? fail() : parsed2;
}
if (typeof dateInput === "string") {
const trimmed = dateInput.trim();
if (!trimmed)
return fail();
if (/^\d{4}-\d{2}-\d{2}$/.test(dateInput)) {
const [year, month, day] = dateInput.split("-").map(Number);
return new Date(year, month - 1, day);
}
const numericValue = Number(trimmed);
if (!Number.isNaN(numericValue))
return dateFromDateInput(numericValue, { throwOnInvalid });
const parsed2 = new Date(trimmed);
return Number.isNaN(parsed2.getTime()) ? fail() : parsed2;
}
const parsed = new Date(dateInput);
return Number.isNaN(parsed.getTime()) ? fail() : parsed;
}
function weekStartFromDateInput(dateInput, weekStartDay = 1) {
const date = dateFromDateInput(dateInput);
const dayOfWeek = date.getDay();
const delta = (dayOfWeek - weekStartDay + 7) % 7;
const weekStart = new Date(date.getFullYear(), date.getMonth(), date.getDate() - delta);
weekStart.setHours(0, 0, 0, 0);
return weekStart;
}
function weekEndFromDateInput(dateInput, weekStartDay = 1) {
const weekStart = weekStartFromDateInput(dateInput, weekStartDay);
const weekEnd = new Date(weekStart);
weekEnd.setDate(weekEnd.getDate() + 6);
weekEnd.setHours(23, 59, 59, 999);
return weekEnd;
}
var _enabled = false;
var _entryId = 0;
var MAX_LOG_BUFFER = 200;
var _logBuffer = [];
var _listeners = new Set();
function setLoggingEnabled(settingValue) {
if (typeof settingValue === "boolean") {
_enabled = settingValue;
return;
}
const normalized = String(settingValue || "").trim().toLowerCase();
_enabled = ["true", "yes", "1", "on", "enabled"].includes(normalized);
}
function logIfEnabled(...args) {
if (_enabled) {
console.log(...args);
const entry = { id: ++_entryId, ts: Date.now(), args };
_logBuffer.push(entry);
if (_logBuffer.length > MAX_LOG_BUFFER)
_logBuffer.shift();
setTimeout(() => _listeners.forEach((fn) => fn(entry)), 0);
}
}
async function fetchDashboardData(app) {
setLoggingEnabled(app.settings[SETTING_KEYS.CONSOLE_LOGGING]);
const t0 = Date.now();
logIfEnabled("[fetchDashboardData] starting \u2014 launching domain + mood/plans/settings in parallel");
const now = new Date();
const weekStart = weekStartFromDateInput(now);
const weekEnd = weekEndFromDateInput(now);
const twoWeeksAgoUnixSeconds = Math.floor(Date.now() / 1e3) - 60 * 60 * 24 * 14;
const domainPromise = _resolveTaskDomains(app).catch((err) => {
logIfEnabled("[fetchDashboardData] _resolveTaskDomains failed:", err);
return { domains: [], selectedDomainUuid: null };
});
const tasksPromise = domainPromise.then((info) => {
logIfEnabled(`[fetchDashboardData] domain resolved in ${Date.now() - t0}ms, uuid=${info.selectedDomainUuid} \u2014 fetching tasks`);
return _fetchTasksForDomain(app, info.selectedDomainUuid);
});
const [taskDomainInfo, moodRatings, quarterlyPlans, settings, domainTasks] = await Promise.all([
domainPromise,
_safeMoodRatings(app, twoWeeksAgoUnixSeconds),
_findQuarterlyPlans(app),
_readDashboardSettings(app),
tasksPromise
]);
logIfEnabled(`[fetchDashboardData] all resolved in ${Date.now() - t0}ms \u2014 ${domainTasks.length} tasks, ${moodRatings?.length ?? 0} mood ratings`);
return {
activeTaskDomain: taskDomainInfo.selectedDomainUuid,
completedThisWeek: _filterCompletedInRange(domainTasks, weekStart, weekEnd),
context: { noteUUID: app.context?.noteUUID || null, pluginUUID: app.context?.pluginUUID || null },
currentDate: now.toISOString(),
dailyVictoryValues: _calculateDailyVictoryValues(domainTasks, weekStart),
moodRatings,
pluginNoteUUID: app.context?.noteUUID || null,
quarterlyPlans,
settings,
tasks: domainTasks,
todayTasks: _filterTodayTasks(domainTasks, now),
taskDomains: taskDomainInfo.domains,
weeklyVictoryValue: _calculateWeeklyVictoryValue(domainTasks, weekStart, weekEnd)
};
}
async function _resolveTaskDomains(app) {
const raw = app.settings[SETTING_KEYS.TASK_DOMAINS];
let stored = {};
try {
stored = raw ? JSON.parse(raw) : {};
} catch {
stored = {};
}
const isStale = !stored.lastRetrieved || Date.now() - stored.lastRetrieved > TASK_DOMAIN_STALE_MS;
const hasDomains = Array.isArray(stored.domains) && stored.domains.length > 0;
if (!hasDomains || isStale) {
logIfEnabled(`[_resolveTaskDomains] cache ${hasDomains ? "stale" : "empty"} \u2014 calling getTaskDomains()`);
const t0 = Date.now();
const freshDomains = await app.getTaskDomains();
logIfEnabled(`[_resolveTaskDomains] getTaskDomains() returned ${freshDomains?.length ?? 0} domains in ${Date.now() - t0}ms`);
stored.domains = (Array.isArray(freshDomains) ? freshDomains : []).filter((d) => d && d.uuid).map((d) => ({ name: d.name, uuid: d.uuid }));
stored.lastRetrieved = Date.now();
const selectedStillExists = stored.selectedDomainUuid && stored.domains.some((d) => d.uuid === stored.selectedDomainUuid);
if (!selectedStillExists) {
stored.selectedDomainUuid = _pickDefaultDomain(stored.domains);
}
await app.setSetting(SETTING_KEYS.TASK_DOMAINS, JSON.stringify(stored));
}
if (!stored.selectedDomainUuid && stored.domains.length > 0) {
stored.selectedDomainUuid = _pickDefaultDomain(stored.domains);
await app.setSetting(SETTING_KEYS.TASK_DOMAINS, JSON.stringify(stored));
}
return stored;
}
function _pickDefaultDomain(domains) {
if (!domains || domains.length === 0)
return null;
const work = domains.find((d) => d.name === "Work");
return work ? work.uuid : domains[0].uuid;
}
async function _fetchTasksForDomain(app, domainUuid) {
if (!domainUuid)
return [];
const t0 = Date.now();
const tasks = await app.getTaskDomainTasks(domainUuid);
const list = Array.isArray(tasks) ? tasks : [];
logIfEnabled(`[_fetchTasksForDomain] getTaskDomainTasks returned ${list.length} tasks in ${Date.now() - t0}ms`);
return list;
}
function _filterTodayTasks(tasks, now) {
const dayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime();
const dayEnd = dayStart + 864e5;
return tasks.filter(
(t) => !t.completedAt && !t.dismissedAt && _millisFromTimestamp(t.startAt) && _millisFromTimestamp(t.startAt) >= dayStart && _millisFromTimestamp(t.startAt) < dayEnd
).sort((a, b) => (_millisFromTimestamp(a.startAt) || 0) - (_millisFromTimestamp(b.startAt) || 0));
}
function _filterCompletedInRange(tasks, start, end) {
const startMs = start.getTime();
const endMs = end.getTime();
return tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= startMs && _millisFromTimestamp(t.completedAt) <= endMs
);
}
function _calculateWeeklyVictoryValue(tasks, weekStart, weekEnd) {
return _filterCompletedInRange(tasks, weekStart, weekEnd).reduce((sum, t) => sum + (t.victoryValue || 0), 0);
}
function _calculateDailyVictoryValues(tasks, weekStart) {
const days = Array.from({ length: 7 }, (_, i) => {
const dayStart = new Date(weekStart);
dayStart.setDate(dayStart.getDate() + i);
const dayEnd = new Date(dayStart);
dayEnd.setDate(dayEnd.getDate() + 1);
const dayTasks = tasks.filter(
(t) => _millisFromTimestamp(t.completedAt) && _millisFromTimestamp(t.completedAt) >= dayStart.getTime() && _millisFromTimestamp(t.completedAt) < dayEnd.getTime()
);
return {
day: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"][i],
date: dayStart.toISOString(),
value: dayTasks.reduce((sum, t) => sum + (t.victoryValue || 0), 0),
taskCount: dayTasks.length
};
});
return days;
}
async function _safeMoodRatings(app, fromUnixSeconds) {
const moodRatings = await app.getMoodRatings(fromUnixSeconds);
logIfEnabled("Mood ratings", moodRatings, "from", fromUnixSeconds);
return moodRatings;
}
async function _findQuarterlyPlans(app) {
const t0 = Date.now();
const current = getCurrentQuarter();
const next = getNextQuarter();
logIfEnabled(`[_findQuarterlyPlans] querying: "${current.label} Plan", "${next.label} Plan"`);
const [currentPlans, nextPlans] = await Promise.all([
app.filterNotes({ query: `${current.label} Plan` }),
app.filterNotes({ query: `${next.label} Plan` })
]);
logIfEnabled(`[_findQuarterlyPlans] filterNotes results \u2014 current:`, currentPlans, `next:`, nextPlans);
const currentNoteUUID = currentPlans.find((n) => n.name === `${current.label} Plan`)?.uuid;
const nextNoteUUID = nextPlans.find((n) => n.name === `${next.label} Plan`)?.uuid;
logIfEnabled(`[_findQuarterlyPlans] resolved UUIDs \u2014 current: ${currentNoteUUID}, next: ${nextNoteUUID}`);
const currentMonths = _quarterMonthNames(current.quarter);
const nextMonths = _quarterMonthNames(next.quarter);
const [currentHasAll, nextHasAll] = await Promise.all([
currentNoteUUID ? _hasAllMonthSections(app, currentNoteUUID, currentMonths) : Promise.resolve(false),
nextNoteUUID ? _hasAllMonthSections(app, nextNoteUUID, nextMonths) : Promise.resolve(false)
]);
logIfEnabled(`[_findQuarterlyPlans] hasAllMonthlyDetails \u2014 current: ${currentHasAll}, next: ${nextHasAll} (${Date.now() - t0}ms total)`);
return {
current: { ...current, noteUUID: currentNoteUUID, hasAllMonthlyDetails: currentHasAll },
next: { ...next, noteUUID: nextNoteUUID, hasAllMonthlyDetails: nextHasAll }
};
}
function _quarterMonthNames(quarter) {
const start = (quarter - 1) * 3;
return [0, 1, 2].map((i) => FULL_MONTH_NAMES[(start + i) % 12]);
}
async function _hasAllMonthSections(app, noteUUID, monthNames) {
try {
const sections = await app.getNoteSections({ uuid: noteUUID });
return monthNames.every(
(name) => sections.some((s) => s.heading?.text?.trim().toLowerCase() === name.toLowerCase())
);
} catch {
return false;
}
}
async function _readDashboardSettings(app) {
const keys = [
widgetConfigKey("victory-value"),
widgetConfigKey("calendar"),
widgetConfigKey("quotes"),
widgetConfigKey("mood"),
widgetConfigKey("recent-notes")
];
const settings = {};
for (const key of keys) {
try {
const val = app.settings[key];
settings[key] = val ? JSON.parse(val) : null;
} catch {
settings[key] = null;
}
}
settings[SETTING_KEYS.BACKGROUND_IMAGE_URL] = app.settings[SETTING_KEYS.BACKGROUND_IMAGE_URL] || "";
settings[SETTING_KEYS.BACKGROUND_IMAGE_MODE] = app.settings[SETTING_KEYS.BACKGROUND_IMAGE_MODE] || "cover";
settings[SETTING_KEYS.CONSOLE_LOGGING] = app.settings[SETTING_KEYS.CONSOLE_LOGGING] || "";
settings[SETTING_KEYS.LLM_PROVIDER_MODEL] = app.settings[SETTING_KEYS.LLM_PROVIDER_MODEL] || "";
settings[SETTING_KEYS.LLM_API_KEY_ANTHROPIC] = app.settings[SETTING_KEYS.LLM_API_KEY_ANTHROPIC] || "";
settings[SETTING_KEYS.LLM_API_KEY_GEMINI] = app.settings[SETTING_KEYS.LLM_API_KEY_GEMINI] || "";
settings[SETTING_KEYS.LLM_API_KEY_GROK] = app.settings[SETTING_KEYS.LLM_API_KEY_GROK] || "";
settings[SETTING_KEYS.LLM_API_KEY_OPENAI] = app.settings[SETTING_KEYS.LLM_API_KEY_OPENAI] || "";
let componentLayout = null;
try {
componentLayout = app.settings[SETTING_KEYS.DASHBOARD_COMPONENTS] ? JSON.parse(app.settings[SETTING_KEYS.DASHBOARD_COMPONENTS]) : null;
} catch {
componentLayout = null;
}
if (!Array.isArray(componentLayout) || componentLayout.length === 0) {
componentLayout = DEFAULT_DASHBOARD_COMPONENTS.map((component) => ({ ...component }));
await app.setSetting(SETTING_KEYS.DASHBOARD_COMPONENTS, JSON.stringify(componentLayout));
}
settings[SETTING_KEYS.DASHBOARD_COMPONENTS] = componentLayout;
return settings;
}
function _millisFromTimestamp(timestamp) {
if (timestamp == null)
return null;
if (typeof timestamp !== "number") {
const parsed = Number(timestamp);
if (!Number.isFinite(parsed))
return null;
return parsed < 1e10 ? parsed * 1e3 : parsed;
}
return timestamp < 1e10 ? timestamp * 1e3 : timestamp;
}
var plugin = {
constants: {},
appOption: {
"Open Dashboard": async function(app) {
await app.openSidebarEmbed(1.5);
},
"Open Dashboard (Full)": async function(app) {
await app.openEmbed();
}
},
async renderEmbed(app) {
console.debug("Rendering Dashboard plugin embed");
try {
return buildEmbedHTML();
} catch (error) {
console.error("Dashboard renderEmbed error:", error);
return `<div style="padding:20px;color:red;">Dashboard failed to load: ${error.message}</div>`;
}
},
async onEmbedCall(app, actionType, ...args) {
setLoggingEnabled(app.settings[SETTING_KEYS.CONSOLE_LOGGING]);
try {
switch (actionType) {
case "attachNoteMedia":
const noteHandle = { uuid: app.context.noteUUID };
logIfEnabled(`[plugin] attachNoteMedia called \u2014 uploading to plugin note ${noteHandle.uuid}`);
const result = await app.attachNoteMedia(noteHandle, args[1]);
logIfEnabled(`[plugin] attachNoteMedia result:`, result ? "(URL received)" : "(no URL)");
return result;
case "configure":
return await this._handleConfigure(app, args[0]);
case "init":
return await fetchDashboardData(app);
default:
if (typeof app[actionType] === "function") {
return await app[actionType](...args);
}
logIfEnabled(`Unknown embed action: ${actionType}`);
return null;
}
} catch (error) {
logIfEnabled(`onEmbedCall error (${actionType}):`, error);
return { error: error.message };
}
},
async _handleConfigure(app, widgetId) {
const configs = {
"victory-value": {
title: "Configure Victory Value",
inputs: [
{ label: "Time range", type: "radio", options: [
{ label: "This week", value: "week" },
{ label: "This month", value: "month" },
{ label: "Last 30 days", value: "30days" }
] },
{ label: "Show mood overlay", type: "checkbox", value: true }
]
},
"calendar": {
title: "Configure Calendar",
inputs: [
{ label: "Week starts on", type: "radio", options: [
{ label: "Sunday", value: "0" },
{ label: "Monday", value: "1" }
] }
]
},
"quotes": {
title: "Configure Quotes",
inputs: [
{ label: "Quote style", type: "radio", options: [
{ label: "Motivational", value: "motivational" },
{ label: "Philosophical", value: "philosophical" },
{ label: "From quarterly goals", value: "goals" }
] }
]
}
};
const config = configs[widgetId];
if (!config)
return null;
const result = await app.prompt(config.title, { inputs: config.inputs });
if (!result)
return null;
await app.setSetting(widgetConfigKey(widgetId), JSON.stringify(
Array.isArray(result) ? result : [result]
));
return result;
}
};
return plugin;
})()