UNPKG

mobile-pdf

Version:

A mobile-friendly PDF viewer based on pdfjs-dist.

4 lines 1.39 MB
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode(".zha_mobile_pdf_canvas_wrapper{margin-bottom:10px;box-shadow:0 2px 8px #0000001a}.zha_mobile_pdf_canvas_wrapper canvas{width:100%}")),document.head.appendChild(e)}}catch(a){console.error("vite-plugin-css-injected-by-js",a)}})(); import { GlobalWorkerOptions as L, getDocument as z } from "pdfjs-dist"; import { uid as s } from "uid"; const I = "data:text/javascript;base64,LyoqCiAqIEBsaWNzdGFydCBUaGUgZm9sbG93aW5nIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZQogKiBKYXZhU2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlCiAqCiAqIENvcHlyaWdodCAyMDI0IE1vemlsbGEgRm91bmRhdGlvbgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiBAbGljZW5kIFRoZSBhYm92ZSBpcyB0aGUgZW50aXJlIGxpY2Vuc2Ugbm90aWNlIGZvciB0aGUKICogSmF2YVNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZQogKi8KLyoqCiAqIHBkZmpzVmVyc2lvbiA9IDUuMy45MwogKiBwZGZqc0J1aWxkID0gY2JlZWYzMjMzCiAqLwpjb25zdCBlPSEoIm9iamVjdCIhPXR5cGVvZiBwcm9jZXNzfHxwcm9jZXNzKyIiIT0iW29iamVjdCBwcm9jZXNzXSJ8fHByb2Nlc3MudmVyc2lvbnMubnd8fHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24mJnByb2Nlc3MudHlwZSYmImJyb3dzZXIiIT09cHJvY2Vzcy50eXBlKSx0PVsuMDAxLDAsMCwuMDAxLDAsMF0sYT0xLjM1LHI9LjM1LGk9LjI1OTI1OTI1OTI1OTI1OTI0LG49MSxzPTIsbz00LGM9OCxsPTE2LGg9NjQsdT0xMjgsZD0yNTYsZj0icGRmanNfaW50ZXJuYWxfZWRpdG9yXyIsZz0zLHA9OSxtPTEzLGI9MTUseT0xMDEsdz17UFJJTlQ6NCxNT0RJRllfQ09OVEVOVFM6OCxDT1BZOjE2LE1PRElGWV9BTk5PVEFUSU9OUzozMixGSUxMX0lOVEVSQUNUSVZFX0ZPUk1TOjI1NixDT1BZX0ZPUl9BQ0NFU1NJQklMSVRZOjUxMixBU1NFTUJMRToxMDI0LFBSSU5UX0hJR0hfUVVBTElUWToyMDQ4fSx4PTAsUz00LGs9MSxDPTIsdj0zLEY9MSxUPTIsTz0zLE09NCxEPTUsUj02LE49NyxFPTgsTD05LGo9MTAsXz0xMSxVPTEyLFg9MTMscT0xNCxIPTE1LFc9MTYsej0xNywkPTIwLEc9Ikdyb3VwIixWPSJSIixLPTEsSj0yLFk9NCxaPTE2LFE9MzIsZWU9MTI4LHRlPTUxMixhZT0xLHJlPTIsaWU9NDA5NixuZT04MTkyLHNlPTMyNzY4LG9lPTY1NTM2LGNlPTEzMTA3MixsZT0xMDQ4NTc2LGhlPTIwOTcxNTIsdWU9ODM4ODYwOCxkZT0xNjc3NzIxNixmZT0xLGdlPTIscGU9MyxtZT00LGJlPTUseWU9e0U6Ik1vdXNlIEVudGVyIixYOiJNb3VzZSBFeGl0IixEOiJNb3VzZSBEb3duIixVOiJNb3VzZSBVcCIsRm86IkZvY3VzIixCbDoiQmx1ciIsUE86IlBhZ2VPcGVuIixQQzoiUGFnZUNsb3NlIixQVjoiUGFnZVZpc2libGUiLFBJOiJQYWdlSW52aXNpYmxlIixLOiJLZXlzdHJva2UiLEY6IkZvcm1hdCIsVjoiVmFsaWRhdGUiLEM6IkNhbGN1bGF0ZSJ9LHdlPXtXQzoiV2lsbENsb3NlIixXUzoiV2lsbFNhdmUiLERTOiJEaWRTYXZlIixXUDoiV2lsbFByaW50IixEUDoiRGlkUHJpbnQifSx4ZT17TzoiUGFnZU9wZW4iLEM6IlBhZ2VDbG9zZSJ9LFNlPTEsa2U9NSxBZT0xLENlPTIsdmU9MyxGZT00LEllPTUsVGU9NixPZT03LE1lPTgsRGU9OSxCZT0xMCxSZT0xMSxOZT0xMixFZT0xMyxQZT0xNCxMZT0xNSxqZT0xNixfZT0xNyxVZT0xOCxYZT0xOSxxZT0yMCxIZT0yMSxXZT0yMix6ZT0yMywkZT0yNCxHZT0yNSxWZT0yNixLZT0yNyxKZT0yOCxZZT0yOSxaZT0zMCxRZT0zMSxldD0zMix0dD0zMyxhdD0zNCxydD0zNSxpdD0zNixudD0zNyxzdD0zOCxvdD0zOSxjdD00MCxsdD00MSxodD00Mix1dD00MyxkdD00NCxmdD00NSxndD00NixwdD00NyxtdD00OCxidD00OSx5dD01MCx3dD01MSx4dD01MixTdD01MyxrdD01NCxBdD01NSxDdD01Nix2dD01NyxGdD01OCxJdD01OSxUdD02MCxPdD02MSxNdD02MixEdD02MyxCdD02NCxSdD02NSxOdD02NixFdD02NyxQdD02OCxMdD02OSxqdD03MCxfdD03MSxVdD03MixYdD03MyxxdD03NCxIdD03NSxXdD03Nix6dD03NywkdD04MCxHdD04MSxWdD04MyxLdD04NCxKdD04NSxZdD04NixadD04NyxRdD04OCxlYT04OSx0YT05MCxhYT05MSxyYT05MixpYT05MyxuYT05NCxzYT0wLG9hPTEsY2E9MixsYT0zLGhhPTEsdWE9MjtsZXQgZGE9U2U7ZnVuY3Rpb24gZ2V0VmVyYm9zaXR5TGV2ZWwoKXtyZXR1cm4gZGF9ZnVuY3Rpb24gaW5mbyhlKXtkYT49a2UmJmNvbnNvbGUubG9nKGBJbmZvOiAke2V9YCl9ZnVuY3Rpb24gd2FybihlKXtkYT49U2UmJmNvbnNvbGUubG9nKGBXYXJuaW5nOiAke2V9YCl9ZnVuY3Rpb24gdW5yZWFjaGFibGUoZSl7dGhyb3cgbmV3IEVycm9yKGUpfWZ1bmN0aW9uIGFzc2VydChlLHQpe2V8fHVucmVhY2hhYmxlKHQpfWZ1bmN0aW9uIGNyZWF0ZVZhbGlkQWJzb2x1dGVVcmwoZSx0PW51bGwsYT1udWxsKXtpZighZSlyZXR1cm4gbnVsbDtpZihhJiYic3RyaW5nIj09dHlwZW9mIGUpe2lmKGEuYWRkRGVmYXVsdFByb3RvY29sJiZlLnN0YXJ0c1dpdGgoInd3dy4iKSl7Y29uc3QgdD1lLm1hdGNoKC9cLi9nKTt0Py5sZW5ndGg+PTImJihlPWBodHRwOi8vJHtlfWApfWlmKGEudHJ5Q29udmVydEVuY29kaW5nKXRyeXtlPXN0cmluZ1RvVVRGOFN0cmluZyhlKX1jYXRjaHt9fWNvbnN0IHI9dD9VUkwucGFyc2UoZSx0KTpVUkwucGFyc2UoZSk7cmV0dXJuIGZ1bmN0aW9uIF9pc1ZhbGlkUHJvdG9jb2woZSl7c3dpdGNoKGU/LnByb3RvY29sKXtjYXNlImh0dHA6IjpjYXNlImh0dHBzOiI6Y2FzZSJmdHA6IjpjYXNlIm1haWx0bzoiOmNhc2UidGVsOiI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19KHIpP3I6bnVsbH1mdW5jdGlvbiBzaGFkb3coZSx0LGEscj0hMSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6YSxlbnVtZXJhYmxlOiFyLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMX0pO3JldHVybiBhfWNvbnN0IGZhPWZ1bmN0aW9uIEJhc2VFeGNlcHRpb25DbG9zdXJlKCl7ZnVuY3Rpb24gQmFzZUV4Y2VwdGlvbihlLHQpe3RoaXMubWVzc2FnZT1lO3RoaXMubmFtZT10fUJhc2VFeGNlcHRpb24ucHJvdG90eXBlPW5ldyBFcnJvcjtCYXNlRXhjZXB0aW9uLmNvbnN0cnVjdG9yPUJhc2VFeGNlcHRpb247cmV0dXJuIEJhc2VFeGNlcHRpb259KCk7Y2xhc3MgUGFzc3dvcmRFeGNlcHRpb24gZXh0ZW5kcyBmYXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsIlBhc3N3b3JkRXhjZXB0aW9uIik7dGhpcy5jb2RlPXR9fWNsYXNzIFVua25vd25FcnJvckV4Y2VwdGlvbiBleHRlbmRzIGZhe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSwiVW5rbm93bkVycm9yRXhjZXB0aW9uIik7dGhpcy5kZXRhaWxzPXR9fWNsYXNzIEludmFsaWRQREZFeGNlcHRpb24gZXh0ZW5kcyBmYXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJJbnZhbGlkUERGRXhjZXB0aW9uIil9fWNsYXNzIFJlc3BvbnNlRXhjZXB0aW9uIGV4dGVuZHMgZmF7Y29uc3RydWN0b3IoZSx0LGEpe3N1cGVyKGUsIlJlc3BvbnNlRXhjZXB0aW9uIik7dGhpcy5zdGF0dXM9dDt0aGlzLm1pc3Npbmc9YX19Y2xhc3MgRm9ybWF0RXJyb3IgZXh0ZW5kcyBmYXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJGb3JtYXRFcnJvciIpfX1jbGFzcyBBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIGZhe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIkFib3J0RXhjZXB0aW9uIil9fWZ1bmN0aW9uIGJ5dGVzVG9TdHJpbmcoZSl7Im9iamVjdCI9PXR5cGVvZiBlJiZ2b2lkIDAhPT1lPy5sZW5ndGh8fHVucmVhY2hhYmxlKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBieXRlc1RvU3RyaW5nIik7Y29uc3QgdD1lLmxlbmd0aCxhPTgxOTI7aWYodDxhKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZSk7Y29uc3Qgcj1bXTtmb3IobGV0IGk9MDtpPHQ7aSs9YSl7Y29uc3Qgbj1NYXRoLm1pbihpK2EsdCkscz1lLnN1YmFycmF5KGksbik7ci5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxzKSl9cmV0dXJuIHIuam9pbigiIil9ZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhlKXsic3RyaW5nIiE9dHlwZW9mIGUmJnVucmVhY2hhYmxlKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmdUb0J5dGVzIik7Y29uc3QgdD1lLmxlbmd0aCxhPW5ldyBVaW50OEFycmF5KHQpO2ZvcihsZXQgcj0wO3I8dDsrK3IpYVtyXT0yNTUmZS5jaGFyQ29kZUF0KHIpO3JldHVybiBhfWZ1bmN0aW9uIHN0cmluZzMyKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsMjU1JmUpfWZ1bmN0aW9uIG9iamVjdFNpemUoZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aH1jbGFzcyBGZWF0dXJlVGVzdHtzdGF0aWMgZ2V0IGlzTGl0dGxlRW5kaWFuKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJpc0xpdHRsZUVuZGlhbiIsZnVuY3Rpb24gaXNMaXR0bGVFbmRpYW4oKXtjb25zdCBlPW5ldyBVaW50OEFycmF5KDQpO2VbMF09MTtyZXR1cm4gMT09PW5ldyBVaW50MzJBcnJheShlLmJ1ZmZlciwwLDEpWzBdfSgpKX1zdGF0aWMgZ2V0IGlzRXZhbFN1cHBvcnRlZCgpe3JldHVybiBzaGFkb3codGhpcywiaXNFdmFsU3VwcG9ydGVkIixmdW5jdGlvbiBpc0V2YWxTdXBwb3J0ZWQoKXt0cnl7bmV3IEZ1bmN0aW9uKCIiKTtyZXR1cm4hMH1jYXRjaHtyZXR1cm4hMX19KCkpfXN0YXRpYyBnZXQgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0ZWQoKXtyZXR1cm4gc2hhZG93KHRoaXMsImlzT2Zmc2NyZWVuQ2FudmFzU3VwcG9ydGVkIiwidW5kZWZpbmVkIiE9dHlwZW9mIE9mZnNjcmVlbkNhbnZhcyl9c3RhdGljIGdldCBpc0ltYWdlRGVjb2RlclN1cHBvcnRlZCgpe3JldHVybiBzaGFkb3codGhpcywiaXNJbWFnZURlY29kZXJTdXBwb3J0ZWQiLCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VEZWNvZGVyKX1zdGF0aWMgZ2V0IHBsYXRmb3JtKCl7Y29uc3R7cGxhdGZvcm06ZSx1c2VyQWdlbnQ6dH09bmF2aWdhdG9yO3JldHVybiBzaGFkb3codGhpcywicGxhdGZvcm0iLHtpc0FuZHJvaWQ6dC5pbmNsdWRlcygiQW5kcm9pZCIpLGlzTGludXg6ZS5pbmNsdWRlcygiTGludXgiKSxpc01hYzplLmluY2x1ZGVzKCJNYWMiKSxpc1dpbmRvd3M6ZS5pbmNsdWRlcygiV2luIiksaXNGaXJlZm94OnQuaW5jbHVkZXMoIkZpcmVmb3giKX0pfXN0YXRpYyBnZXQgaXNDU1NSb3VuZFN1cHBvcnRlZCgpe3JldHVybiBzaGFkb3codGhpcywiaXNDU1NSb3VuZFN1cHBvcnRlZCIsZ2xvYmFsVGhpcy5DU1M/LnN1cHBvcnRzPy4oIndpZHRoOiByb3VuZCgxLjVweCwgMXB4KSIpKX19Y29uc3QgZ2E9QXJyYXkuZnJvbShBcnJheSgyNTYpLmtleXMoKSwoZT0+ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKSk7Y2xhc3MgVXRpbHtzdGF0aWMgbWFrZUhleENvbG9yKGUsdCxhKXtyZXR1cm5gIyR7Z2FbZV19JHtnYVt0XX0ke2dhW2FdfWB9c3RhdGljIHNjYWxlTWluTWF4KGUsdCl7bGV0IGE7aWYoZVswXSl7aWYoZVswXTwwKXthPXRbMF07dFswXT10WzJdO3RbMl09YX10WzBdKj1lWzBdO3RbMl0qPWVbMF07aWYoZVszXTwwKXthPXRbMV07dFsxXT10WzNdO3RbM109YX10WzFdKj1lWzNdO3RbM10qPWVbM119ZWxzZXthPXRbMF07dFswXT10WzFdO3RbMV09YTthPXRbMl07dFsyXT10WzNdO3RbM109YTtpZihlWzFdPDApe2E9dFsxXTt0WzFdPXRbM107dFszXT1hfXRbMV0qPWVbMV07dFszXSo9ZVsxXTtpZihlWzJdPDApe2E9dFswXTt0WzBdPXRbMl07dFsyXT1hfXRbMF0qPWVbMl07dFsyXSo9ZVsyXX10WzBdKz1lWzRdO3RbMV0rPWVbNV07dFsyXSs9ZVs0XTt0WzNdKz1lWzVdfXN0YXRpYyB0cmFuc2Zvcm0oZSx0KXtyZXR1cm5bZVswXSp0WzBdK2VbMl0qdFsxXSxlWzFdKnRbMF0rZVszXSp0WzFdLGVbMF0qdFsyXStlWzJdKnRbM10sZVsxXSp0WzJdK2VbM10qdFszXSxlWzBdKnRbNF0rZVsyXSp0WzVdK2VbNF0sZVsxXSp0WzRdK2VbM10qdFs1XStlWzVdXX1zdGF0aWMgYXBwbHlUcmFuc2Zvcm0oZSx0LGE9MCl7Y29uc3Qgcj1lW2FdLGk9ZVthKzFdO2VbYV09cip0WzBdK2kqdFsyXSt0WzRdO2VbYSsxXT1yKnRbMV0raSp0WzNdK3RbNV19c3RhdGljIGFwcGx5VHJhbnNmb3JtVG9CZXppZXIoZSx0LGE9MCl7Y29uc3Qgcj10WzBdLGk9dFsxXSxuPXRbMl0scz10WzNdLG89dFs0XSxjPXRbNV07Zm9yKGxldCB0PTA7dDw2O3QrPTIpe2NvbnN0IGw9ZVthK3RdLGg9ZVthK3QrMV07ZVthK3RdPWwqcitoKm4rbztlW2ErdCsxXT1sKmkraCpzK2N9fXN0YXRpYyBhcHBseUludmVyc2VUcmFuc2Zvcm0oZSx0KXtjb25zdCBhPWVbMF0scj1lWzFdLGk9dFswXSp0WzNdLXRbMV0qdFsyXTtlWzBdPShhKnRbM10tcip0WzJdK3RbMl0qdFs1XS10WzRdKnRbM10pL2k7ZVsxXT0oLWEqdFsxXStyKnRbMF0rdFs0XSp0WzFdLXRbNV0qdFswXSkvaX1zdGF0aWMgYXhpYWxBbGlnbmVkQm91bmRpbmdCb3goZSx0LGEpe2NvbnN0IHI9dFswXSxpPXRbMV0sbj10WzJdLHM9dFszXSxvPXRbNF0sYz10WzVdLGw9ZVswXSxoPWVbMV0sdT1lWzJdLGQ9ZVszXTtsZXQgZj1yKmwrbyxnPWYscD1yKnUrbyxtPXAsYj1zKmgrYyx5PWIsdz1zKmQrYyx4PXc7aWYoMCE9PWl8fDAhPT1uKXtjb25zdCBlPWkqbCx0PWkqdSxhPW4qaCxyPW4qZDtmKz1hO20rPWE7cCs9cjtnKz1yO2IrPWU7eCs9ZTt3Kz10O3krPXR9YVswXT1NYXRoLm1pbihhWzBdLGYscCxnLG0pO2FbMV09TWF0aC5taW4oYVsxXSxiLHcseSx4KTthWzJdPU1hdGgubWF4KGFbMl0sZixwLGcsbSk7YVszXT1NYXRoLm1heChhWzNdLGIsdyx5LHgpfXN0YXRpYyBpbnZlcnNlVHJhbnNmb3JtKGUpe2NvbnN0IHQ9ZVswXSplWzNdLWVbMV0qZVsyXTtyZXR1cm5bZVszXS90LC1lWzFdL3QsLWVbMl0vdCxlWzBdL3QsKGVbMl0qZVs1XS1lWzRdKmVbM10pL3QsKGVbNF0qZVsxXS1lWzVdKmVbMF0pL3RdfXN0YXRpYyBzaW5ndWxhclZhbHVlRGVjb21wb3NlMmRTY2FsZShlLHQpe2NvbnN0IGE9ZVswXSxyPWVbMV0saT1lWzJdLG49ZVszXSxzPWEqKjIrcioqMixvPWEqaStyKm4sYz1pKioyK24qKjIsbD0ocytjKS8yLGg9TWF0aC5zcXJ0KGwqKjItKHMqYy1vKioyKSk7dFswXT1NYXRoLnNxcnQobCtofHwxKTt0WzFdPU1hdGguc3FydChsLWh8fDEpfXN0YXRpYyBub3JtYWxpemVSZWN0KGUpe2NvbnN0IHQ9ZS5zbGljZSgwKTtpZihlWzBdPmVbMl0pe3RbMF09ZVsyXTt0WzJdPWVbMF19aWYoZVsxXT5lWzNdKXt0WzFdPWVbM107dFszXT1lWzFdfXJldHVybiB0fXN0YXRpYyBpbnRlcnNlY3QoZSx0KXtjb25zdCBhPU1hdGgubWF4KE1hdGgubWluKGVbMF0sZVsyXSksTWF0aC5taW4odFswXSx0WzJdKSkscj1NYXRoLm1pbihNYXRoLm1heChlWzBdLGVbMl0pLE1hdGgubWF4KHRbMF0sdFsyXSkpO2lmKGE+cilyZXR1cm4gbnVsbDtjb25zdCBpPU1hdGgubWF4KE1hdGgubWluKGVbMV0sZVszXSksTWF0aC5taW4odFsxXSx0WzNdKSksbj1NYXRoLm1pbihNYXRoLm1heChlWzFdLGVbM10pLE1hdGgubWF4KHRbMV0sdFszXSkpO3JldHVybiBpPm4/bnVsbDpbYSxpLHIsbl19c3RhdGljIHBvaW50Qm91bmRpbmdCb3goZSx0LGEpe2FbMF09TWF0aC5taW4oYVswXSxlKTthWzFdPU1hdGgubWluKGFbMV0sdCk7YVsyXT1NYXRoLm1heChhWzJdLGUpO2FbM109TWF0aC5tYXgoYVszXSx0KX1zdGF0aWMgcmVjdEJvdW5kaW5nQm94KGUsdCxhLHIsaSl7aVswXT1NYXRoLm1pbihpWzBdLGUsYSk7aVsxXT1NYXRoLm1pbihpWzFdLHQscik7aVsyXT1NYXRoLm1heChpWzJdLGUsYSk7aVszXT1NYXRoLm1heChpWzNdLHQscil9c3RhdGljI2UoZSx0LGEscixpLG4scyxvLGMsbCl7aWYoYzw9MHx8Yz49MSlyZXR1cm47Y29uc3QgaD0xLWMsdT1jKmMsZD11KmMsZj1oKihoKihoKmUrMypjKnQpKzMqdSphKStkKnIsZz1oKihoKihoKmkrMypjKm4pKzMqdSpzKStkKm87bFswXT1NYXRoLm1pbihsWzBdLGYpO2xbMV09TWF0aC5taW4obFsxXSxnKTtsWzJdPU1hdGgubWF4KGxbMl0sZik7bFszXT1NYXRoLm1heChsWzNdLGcpfXN0YXRpYyN0KGUsdCxhLHIsaSxuLHMsbyxjLGwsaCx1KXtpZihNYXRoLmFicyhjKTwxZS0xMil7TWF0aC5hYnMobCk+PTFlLTEyJiZ0aGlzLiNlKGUsdCxhLHIsaSxuLHMsbywtaC9sLHUpO3JldHVybn1jb25zdCBkPWwqKjItNCpoKmM7aWYoZDwwKXJldHVybjtjb25zdCBmPU1hdGguc3FydChkKSxnPTIqYzt0aGlzLiNlKGUsdCxhLHIsaSxuLHMsbywoLWwrZikvZyx1KTt0aGlzLiNlKGUsdCxhLHIsaSxuLHMsbywoLWwtZikvZyx1KX1zdGF0aWMgYmV6aWVyQm91bmRpbmdCb3goZSx0LGEscixpLG4scyxvLGMpe2NbMF09TWF0aC5taW4oY1swXSxlLHMpO2NbMV09TWF0aC5taW4oY1sxXSx0LG8pO2NbMl09TWF0aC5tYXgoY1syXSxlLHMpO2NbM109TWF0aC5tYXgoY1szXSx0LG8pO3RoaXMuI3QoZSxhLGkscyx0LHIsbixvLDMqKDMqKGEtaSktZStzKSw2KihlLTIqYStpKSwzKihhLWUpLGMpO3RoaXMuI3QoZSxhLGkscyx0LHIsbixvLDMqKDMqKHItbiktdCtvKSw2Kih0LTIqcituKSwzKihyLXQpLGMpfX1jb25zdCBwYT1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNzI4LDcxMSw3MTAsNzI5LDczMyw3MzEsNzMwLDczMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw4MjI2LDgyMjQsODIyNSw4MjMwLDgyMTIsODIxMSw0MDIsODI2MCw4MjQ5LDgyNTAsODcyMiw4MjQwLDgyMjIsODIyMCw4MjIxLDgyMTYsODIxNyw4MjE4LDg0ODIsNjQyNTcsNjQyNTgsMzIxLDMzOCwzNTIsMzc2LDM4MSwzMDUsMzIyLDMzOSwzNTMsMzgyLDAsODM2NF07ZnVuY3Rpb24gc3RyaW5nVG9QREZTdHJpbmcoZSx0PSExKXtpZihlWzBdPj0iw68iKXtsZXQgYTtpZigiw74iPT09ZVswXSYmIsO/Ij09PWVbMV0pe2E9InV0Zi0xNmJlIjtlLmxlbmd0aCUyPT0xJiYoZT1lLnNsaWNlKDAsLTEpKX1lbHNlIGlmKCLDvyI9PT1lWzBdJiYiw74iPT09ZVsxXSl7YT0idXRmLTE2bGUiO2UubGVuZ3RoJTI9PTEmJihlPWUuc2xpY2UoMCwtMSkpfWVsc2Uiw68iPT09ZVswXSYmIsK7Ij09PWVbMV0mJiLCvyI9PT1lWzJdJiYoYT0idXRmLTgiKTtpZihhKXRyeXtjb25zdCByPW5ldyBUZXh0RGVjb2RlcihhLHtmYXRhbDohMH0pLGk9c3RyaW5nVG9CeXRlcyhlKSxuPXIuZGVjb2RlKGkpO3JldHVybiB0fHwhbi5pbmNsdWRlcygiGyIpP246bi5yZXBsYWNlQWxsKC9ceDFiW15ceDFiXSooPzpceDFifCQpL2csIiIpfWNhdGNoKGUpe3dhcm4oYHN0cmluZ1RvUERGU3RyaW5nOiAiJHtlfSIuYCl9fWNvbnN0IGE9W107Zm9yKGxldCByPTAsaT1lLmxlbmd0aDtyPGk7cisrKXtjb25zdCBuPWUuY2hhckNvZGVBdChyKTtpZighdCYmMjc9PT1uKXtmb3IoOysrcjxpJiYyNyE9PWUuY2hhckNvZGVBdChyKTspO2NvbnRpbnVlfWNvbnN0IHM9cGFbbl07YS5wdXNoKHM/U3RyaW5nLmZyb21DaGFyQ29kZShzKTplLmNoYXJBdChyKSl9cmV0dXJuIGEuam9pbigiIil9ZnVuY3Rpb24gc3RyaW5nVG9VVEY4U3RyaW5nKGUpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGUpKX1mdW5jdGlvbiB1dGY4U3RyaW5nVG9TdHJpbmcoZSl7cmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSl9ZnVuY3Rpb24gaXNBcnJheUVxdWFsKGUsdCl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IGE9MCxyPWUubGVuZ3RoO2E8cjthKyspaWYoZVthXSE9PXRbYV0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZ2V0TW9kaWZpY2F0aW9uRGF0ZShlPW5ldyBEYXRlKXtyZXR1cm5bZS5nZXRVVENGdWxsWWVhcigpLnRvU3RyaW5nKCksKGUuZ2V0VVRDTW9udGgoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSxlLmdldFVUQ0RhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIjAiKSxlLmdldFVUQ0hvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIiksZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCIwIildLmpvaW4oIiIpfWxldCBtYT1udWxsLGJhPW51bGw7ZnVuY3Rpb24gTWF0aENsYW1wKGUsdCxhKXtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoZSx0KSxhKX1mdW5jdGlvbiB0b0hleFV0aWwoZSl7cmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLnRvSGV4P2UudG9IZXgoKTpBcnJheS5mcm9tKGUsKGU9PmdhW2VdKSkuam9pbigiIil9ImZ1bmN0aW9uIiE9dHlwZW9mIFByb21pc2UudHJ5JiYoUHJvbWlzZS50cnk9ZnVuY3Rpb24oZSwuLi50KXtyZXR1cm4gbmV3IFByb21pc2UoKGE9PnthKGUoLi4udCkpfSkpfSk7ImZ1bmN0aW9uIiE9dHlwZW9mIE1hdGguc3VtUHJlY2lzZSYmKE1hdGguc3VtUHJlY2lzZT1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZWR1Y2UoKChlLHQpPT5lK3QpLDApfSk7Y29uc3QgeWE9U3ltYm9sKCJDSVJDVUxBUl9SRUYiKSx3YT1TeW1ib2woIkVPRiIpO2xldCB4YT1PYmplY3QuY3JlYXRlKG51bGwpLFNhPU9iamVjdC5jcmVhdGUobnVsbCksa2E9T2JqZWN0LmNyZWF0ZShudWxsKTtjbGFzcyBOYW1le2NvbnN0cnVjdG9yKGUpe3RoaXMubmFtZT1lfXN0YXRpYyBnZXQoZSl7cmV0dXJuIFNhW2VdfHw9bmV3IE5hbWUoZSl9fWNsYXNzIENtZHtjb25zdHJ1Y3RvcihlKXt0aGlzLmNtZD1lfXN0YXRpYyBnZXQoZSl7cmV0dXJuIHhhW2VdfHw9bmV3IENtZChlKX19Y29uc3QgQWE9ZnVuY3Rpb24gbm9uU2VyaWFsaXphYmxlQ2xvc3VyZSgpe3JldHVybiBBYX07Y2xhc3MgRGljdHtjb25zdHJ1Y3RvcihlPW51bGwpe3RoaXMuX21hcD1uZXcgTWFwO3RoaXMueHJlZj1lO3RoaXMub2JqSWQ9bnVsbDt0aGlzLnN1cHByZXNzRW5jcnlwdGlvbj0hMTt0aGlzLl9fbm9uU2VyaWFsaXphYmxlX189QWF9YXNzaWduWHJlZihlKXt0aGlzLnhyZWY9ZX1nZXQgc2l6ZSgpe3JldHVybiB0aGlzLl9tYXAuc2l6ZX1nZXQoZSx0LGEpe2xldCByPXRoaXMuX21hcC5nZXQoZSk7aWYodm9pZCAwPT09ciYmdm9pZCAwIT09dCl7cj10aGlzLl9tYXAuZ2V0KHQpO3ZvaWQgMD09PXImJnZvaWQgMCE9PWEmJihyPXRoaXMuX21hcC5nZXQoYSkpfXJldHVybiByIGluc3RhbmNlb2YgUmVmJiZ0aGlzLnhyZWY/dGhpcy54cmVmLmZldGNoKHIsdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pOnJ9YXN5bmMgZ2V0QXN5bmMoZSx0LGEpe2xldCByPXRoaXMuX21hcC5nZXQoZSk7aWYodm9pZCAwPT09ciYmdm9pZCAwIT09dCl7cj10aGlzLl9tYXAuZ2V0KHQpO3ZvaWQgMD09PXImJnZvaWQgMCE9PWEmJihyPXRoaXMuX21hcC5nZXQoYSkpfXJldHVybiByIGluc3RhbmNlb2YgUmVmJiZ0aGlzLnhyZWY/dGhpcy54cmVmLmZldGNoQXN5bmMocix0aGlzLnN1cHByZXNzRW5jcnlwdGlvbik6cn1nZXRBcnJheShlLHQsYSl7bGV0IHI9dGhpcy5fbWFwLmdldChlKTtpZih2b2lkIDA9PT1yJiZ2b2lkIDAhPT10KXtyPXRoaXMuX21hcC5nZXQodCk7dm9pZCAwPT09ciYmdm9pZCAwIT09YSYmKHI9dGhpcy5fbWFwLmdldChhKSl9ciBpbnN0YW5jZW9mIFJlZiYmdGhpcy54cmVmJiYocj10aGlzLnhyZWYuZmV0Y2gocix0aGlzLnN1cHByZXNzRW5jcnlwdGlvbikpO2lmKEFycmF5LmlzQXJyYXkocikpe3I9ci5zbGljZSgpO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrKylyW2VdaW5zdGFuY2VvZiBSZWYmJnRoaXMueHJlZiYmKHJbZV09dGhpcy54cmVmLmZldGNoKHJbZV0sdGhpcy5zdXBwcmVzc0VuY3J5cHRpb24pKX1yZXR1cm4gcn1nZXRSYXcoZSl7cmV0dXJuIHRoaXMuX21hcC5nZXQoZSl9Z2V0S2V5cygpe3JldHVyblsuLi50aGlzLl9tYXAua2V5cygpXX1nZXRSYXdWYWx1ZXMoKXtyZXR1cm5bLi4udGhpcy5fbWFwLnZhbHVlcygpXX1zZXQoZSx0KXt0aGlzLl9tYXAuc2V0KGUsdCl9aGFzKGUpe3JldHVybiB0aGlzLl9tYXAuaGFzKGUpfSpbU3ltYm9sLml0ZXJhdG9yXSgpe2Zvcihjb25zdFtlLHRdb2YgdGhpcy5fbWFwKXlpZWxkW2UsdCBpbnN0YW5jZW9mIFJlZiYmdGhpcy54cmVmP3RoaXMueHJlZi5mZXRjaCh0LHRoaXMuc3VwcHJlc3NFbmNyeXB0aW9uKTp0XX1zdGF0aWMgZ2V0IGVtcHR5KCl7Y29uc3QgZT1uZXcgRGljdChudWxsKTtlLnNldD0oZSx0KT0+e3VucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgYHNldGAgb24gdGhlIGVtcHR5IGRpY3Rpb25hcnkuIil9O3JldHVybiBzaGFkb3codGhpcywiZW1wdHkiLGUpfXN0YXRpYyBtZXJnZSh7eHJlZjplLGRpY3RBcnJheTp0LG1lcmdlU3ViRGljdHM6YT0hMX0pe2NvbnN0IHI9bmV3IERpY3QoZSksaT1uZXcgTWFwO2Zvcihjb25zdCBlIG9mIHQpaWYoZSBpbnN0YW5jZW9mIERpY3QpZm9yKGNvbnN0W3Qscl1vZiBlLl9tYXApe2xldCBlPWkuZ2V0KHQpO2lmKHZvaWQgMD09PWUpe2U9W107aS5zZXQodCxlKX1lbHNlIGlmKCEoYSYmciBpbnN0YW5jZW9mIERpY3QpKWNvbnRpbnVlO2UucHVzaChyKX1mb3IoY29uc3RbdCxhXW9mIGkpe2lmKDE9PT1hLmxlbmd0aHx8IShhWzBdaW5zdGFuY2VvZiBEaWN0KSl7ci5fbWFwLnNldCh0LGFbMF0pO2NvbnRpbnVlfWNvbnN0IGk9bmV3IERpY3QoZSk7Zm9yKGNvbnN0IGUgb2YgYSlmb3IoY29uc3RbdCxhXW9mIGUuX21hcClpLl9tYXAuaGFzKHQpfHxpLl9tYXAuc2V0KHQsYSk7aS5zaXplPjAmJnIuX21hcC5zZXQodCxpKX1pLmNsZWFyKCk7cmV0dXJuIHIuc2l6ZT4wP3I6RGljdC5lbXB0eX1jbG9uZSgpe2NvbnN0IGU9bmV3IERpY3QodGhpcy54cmVmKTtmb3IoY29uc3QgdCBvZiB0aGlzLmdldEtleXMoKSllLnNldCh0LHRoaXMuZ2V0UmF3KHQpKTtyZXR1cm4gZX1kZWxldGUoZSl7ZGVsZXRlIHRoaXMuX21hcFtlXX19Y2xhc3MgUmVme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5udW09ZTt0aGlzLmdlbj10fXRvU3RyaW5nKCl7cmV0dXJuIDA9PT10aGlzLmdlbj9gJHt0aGlzLm51bX1SYDpgJHt0aGlzLm51bX1SJHt0aGlzLmdlbn1gfXN0YXRpYyBmcm9tU3RyaW5nKGUpe2NvbnN0IHQ9a2FbZV07aWYodClyZXR1cm4gdDtjb25zdCBhPS9eKFxkKylSKFxkKikkLy5leGVjKGUpO3JldHVybiBhJiYiMCIhPT1hWzFdP2thW2VdPW5ldyBSZWYocGFyc2VJbnQoYVsxXSksYVsyXT9wYXJzZUludChhWzJdKTowKTpudWxsfXN0YXRpYyBnZXQoZSx0KXtjb25zdCBhPTA9PT10P2Ake2V9UmA6YCR7ZX1SJHt0fWA7cmV0dXJuIGthW2FdfHw9bmV3IFJlZihlLHQpfX1jbGFzcyBSZWZTZXR7Y29uc3RydWN0b3IoZT1udWxsKXt0aGlzLl9zZXQ9bmV3IFNldChlPy5fc2V0KX1oYXMoZSl7cmV0dXJuIHRoaXMuX3NldC5oYXMoZS50b1N0cmluZygpKX1wdXQoZSl7dGhpcy5fc2V0LmFkZChlLnRvU3RyaW5nKCkpfXJlbW92ZShlKXt0aGlzLl9zZXQuZGVsZXRlKGUudG9TdHJpbmcoKSl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5fc2V0LnZhbHVlcygpfWNsZWFyKCl7dGhpcy5fc2V0LmNsZWFyKCl9fWNsYXNzIFJlZlNldENhY2hle2NvbnN0cnVjdG9yKCl7dGhpcy5fbWFwPW5ldyBNYXB9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5fbWFwLnNpemV9Z2V0KGUpe3JldHVybiB0aGlzLl9tYXAuZ2V0KGUudG9TdHJpbmcoKSl9aGFzKGUpe3JldHVybiB0aGlzLl9tYXAuaGFzKGUudG9TdHJpbmcoKSl9cHV0KGUsdCl7dGhpcy5fbWFwLnNldChlLnRvU3RyaW5nKCksdCl9cHV0QWxpYXMoZSx0KXt0aGlzLl9tYXAuc2V0KGUudG9TdHJpbmcoKSx0aGlzLmdldCh0KSl9W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gdGhpcy5fbWFwLnZhbHVlcygpfWNsZWFyKCl7dGhpcy5fbWFwLmNsZWFyKCl9KnZhbHVlcygpe3lpZWxkKnRoaXMuX21hcC52YWx1ZXMoKX0qaXRlbXMoKXtmb3IoY29uc3RbZSx0XW9mIHRoaXMuX21hcCl5aWVsZFtSZWYuZnJvbVN0cmluZyhlKSx0XX19ZnVuY3Rpb24gaXNOYW1lKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBOYW1lJiYodm9pZCAwPT09dHx8ZS5uYW1lPT09dCl9ZnVuY3Rpb24gaXNDbWQoZSx0KXtyZXR1cm4gZSBpbnN0YW5jZW9mIENtZCYmKHZvaWQgMD09PXR8fGUuY21kPT09dCl9ZnVuY3Rpb24gaXNEaWN0KGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBEaWN0JiYodm9pZCAwPT09dHx8aXNOYW1lKGUuZ2V0KCJUeXBlIiksdCkpfWZ1bmN0aW9uIGlzUmVmc0VxdWFsKGUsdCl7cmV0dXJuIGUubnVtPT09dC5udW0mJmUuZ2VuPT09dC5nZW59Y2xhc3MgQmFzZVN0cmVhbXtnZXQgbGVuZ3RoKCl7dW5yZWFjaGFibGUoIkFic3RyYWN0IGdldHRlciBgbGVuZ3RoYCBhY2Nlc3NlZCIpfWdldCBpc0VtcHR5KCl7dW5yZWFjaGFibGUoIkFic3RyYWN0IGdldHRlciBgaXNFbXB0eWAgYWNjZXNzZWQiKX1nZXQgaXNEYXRhTG9hZGVkKCl7cmV0dXJuIHNoYWRvdyh0aGlzLCJpc0RhdGFMb2FkZWQiLCEwKX1nZXRCeXRlKCl7dW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0Qnl0ZWAgY2FsbGVkIil9Z2V0Qnl0ZXMoZSl7dW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0Qnl0ZXNgIGNhbGxlZCIpfWFzeW5jIGdldEltYWdlRGF0YShlLHQpe3JldHVybiB0aGlzLmdldEJ5dGVzKGUsdCl9YXN5bmMgYXN5bmNHZXRCeXRlcygpe3VucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYGFzeW5jR2V0Qnl0ZXNgIGNhbGxlZCIpfWdldCBpc0FzeW5jKCl7cmV0dXJuITF9Z2V0IGlzQXN5bmNEZWNvZGVyKCl7cmV0dXJuITF9Z2V0IGNhbkFzeW5jRGVjb2RlSW1hZ2VGcm9tQnVmZmVyKCl7cmV0dXJuITF9YXN5bmMgZ2V0VHJhbnNmZXJhYmxlSW1hZ2UoKXtyZXR1cm4gbnVsbH1wZWVrQnl0ZSgpe2NvbnN0IGU9dGhpcy5nZXRCeXRlKCk7LTEhPT1lJiZ0aGlzLnBvcy0tO3JldHVybiBlfXBlZWtCeXRlcyhlKXtjb25zdCB0PXRoaXMuZ2V0Qnl0ZXMoZSk7dGhpcy5wb3MtPXQubGVuZ3RoO3JldHVybiB0fWdldFVpbnQxNigpe2NvbnN0IGU9dGhpcy5nZXRCeXRlKCksdD10aGlzLmdldEJ5dGUoKTtyZXR1cm4tMT09PWV8fC0xPT09dD8tMTooZTw8OCkrdH1nZXRJbnQzMigpe3JldHVybih0aGlzLmdldEJ5dGUoKTw8MjQpKyh0aGlzLmdldEJ5dGUoKTw8MTYpKyh0aGlzLmdldEJ5dGUoKTw8OCkrdGhpcy5nZXRCeXRlKCl9Z2V0Qnl0ZVJhbmdlKGUsdCl7dW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgZ2V0Qnl0ZVJhbmdlYCBjYWxsZWQiKX1nZXRTdHJpbmcoZSl7cmV0dXJuIGJ5dGVzVG9TdHJpbmcodGhpcy5nZXRCeXRlcyhlKSl9c2tpcChlKXt0aGlzLnBvcys9ZXx8MX1yZXNldCgpe3VucmVhY2hhYmxlKCJBYnN0cmFjdCBtZXRob2QgYHJlc2V0YCBjYWxsZWQiKX1tb3ZlU3RhcnQoKXt1bnJlYWNoYWJsZSgiQWJzdHJhY3QgbWV0aG9kIGBtb3ZlU3RhcnRgIGNhbGxlZCIpfW1ha2VTdWJTdHJlYW0oZSx0LGE9bnVsbCl7dW5yZWFjaGFibGUoIkFic3RyYWN0IG1ldGhvZCBgbWFrZVN1YlN0cmVhbWAgY2FsbGVkIil9Z2V0QmFzZVN0cmVhbXMoKXtyZXR1cm4gbnVsbH19Y29uc3QgQ2E9L15bMS05XVwuXGQkLyx2YT0yKiozMS0xLEZhPVsxLDAsMCwxLDAsMF0sSWE9WyJDb2xvclNwYWNlIiwiRXh0R1N0YXRlIiwiRm9udCIsIlBhdHRlcm4iLCJQcm9wZXJ0aWVzIiwiU2hhZGluZyIsIlhPYmplY3QiXSxUYT1bIkV4dEdTdGF0ZSIsIkZvbnQiLCJQcm9wZXJ0aWVzIiwiWE9iamVjdCJdO2Z1bmN0aW9uIGdldExvb2t1cFRhYmxlRmFjdG9yeShlKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24oKXtpZihlKXt0PU9iamVjdC5jcmVhdGUobnVsbCk7ZSh0KTtlPW51bGx9cmV0dXJuIHR9fWNsYXNzIE1pc3NpbmdEYXRhRXhjZXB0aW9uIGV4dGVuZHMgZmF7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihgTWlzc2luZyBkYXRhIFske2V9LCAke3R9KWAsIk1pc3NpbmdEYXRhRXhjZXB0aW9uIik7dGhpcy5iZWdpbj1lO3RoaXMuZW5kPXR9fWNsYXNzIFBhcnNlckVPRkV4Y2VwdGlvbiBleHRlbmRzIGZhe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsIlBhcnNlckVPRkV4Y2VwdGlvbiIpfX1jbGFzcyBYUmVmRW50cnlFeGNlcHRpb24gZXh0ZW5kcyBmYXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlLCJYUmVmRW50cnlFeGNlcHRpb24iKX19Y2xhc3MgWFJlZlBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgZmF7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSwiWFJlZlBhcnNlRXhjZXB0aW9uIil9fWZ1bmN0aW9uIGFycmF5QnVmZmVyc1RvQnl0ZXMoZSl7Y29uc3QgdD1lLmxlbmd0aDtpZigwPT09dClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7aWYoMT09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KGVbMF0pO2xldCBhPTA7Zm9yKGxldCByPTA7cjx0O3IrKylhKz1lW3JdLmJ5dGVMZW5ndGg7Y29uc3Qgcj1uZXcgVWludDhBcnJheShhKTtsZXQgaT0wO2ZvcihsZXQgYT0wO2E8dDthKyspe2NvbnN0IHQ9bmV3IFVpbnQ4QXJyYXkoZVthXSk7ci5zZXQodCxpKTtpKz10LmJ5dGVMZW5ndGh9cmV0dXJuIHJ9YXN5bmMgZnVuY3Rpb24gZmV0Y2hCaW5hcnlEYXRhKGUpe2NvbnN0IHQ9YXdhaXQgZmV0Y2goZSk7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZmlsZSAiJHtlfSIgd2l0aCAiJHt0LnN0YXR1c1RleHR9Ii5gKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgdC5hcnJheUJ1ZmZlcigpKX1mdW5jdGlvbiBnZXRJbmhlcml0YWJsZVByb3BlcnR5KHtkaWN0OmUsa2V5OnQsZ2V0QXJyYXk6YT0hMSxzdG9wV2hlbkZvdW5kOnI9ITB9KXtsZXQgaTtjb25zdCBuPW5ldyBSZWZTZXQ7Zm9yKDtlIGluc3RhbmNlb2YgRGljdCYmKCFlLm9iaklkfHwhbi5oYXMoZS5vYmpJZCkpOyl7ZS5vYmpJZCYmbi5wdXQoZS5vYmpJZCk7Y29uc3Qgcz1hP2UuZ2V0QXJyYXkodCk6ZS5nZXQodCk7aWYodm9pZCAwIT09cyl7aWYocilyZXR1cm4gczsoaXx8PVtdKS5wdXNoKHMpfWU9ZS5nZXQoIlBhcmVudCIpfXJldHVybiBpfWNvbnN0IE9hPVsiIiwiQyIsIkNDIiwiQ0NDIiwiQ0QiLCJEIiwiREMiLCJEQ0MiLCJEQ0NDIiwiQ00iLCIiLCJYIiwiWFgiLCJYWFgiLCJYTCIsIkwiLCJMWCIsIkxYWCIsIkxYWFgiLCJYQyIsIiIsIkkiLCJJSSIsIklJSSIsIklWIiwiViIsIlZJIiwiVklJIiwiVklJSSIsIklYIl07ZnVuY3Rpb24gdG9Sb21hbk51bWVyYWxzKGUsdD0hMSl7YXNzZXJ0KE51bWJlci5pc0ludGVnZXIoZSkmJmU+MCwiVGhlIG51bWJlciBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpO2NvbnN0IGE9Ik0iLnJlcGVhdChlLzFlM3wwKStPYVtlJTFlMy8xMDB8MF0rT2FbMTArKGUlMTAwLzEwfDApXStPYVsyMCtlJTEwXTtyZXR1cm4gdD9hLnRvTG93ZXJDYXNlKCk6YX1mdW5jdGlvbiBsb2cyKGUpe3JldHVybiBlPjA/TWF0aC5jZWlsKE1hdGgubG9nMihlKSk6MH1mdW5jdGlvbiByZWFkSW50OChlLHQpe3JldHVybiBlW3RdPDwyND4+MjR9ZnVuY3Rpb24gcmVhZEludDE2KGUsdCl7cmV0dXJuKGVbdF08PDI0fGVbdCsxXTw8MTYpPj4xNn1mdW5jdGlvbiByZWFkVWludDE2KGUsdCl7cmV0dXJuIGVbdF08PDh8ZVt0KzFdfWZ1bmN0aW9uIHJlYWRVaW50MzIoZSx0KXtyZXR1cm4oZVt0XTw8MjR8ZVt0KzFdPDwxNnxlW3QrMl08PDh8ZVt0KzNdKT4+PjB9ZnVuY3Rpb24gaXNXaGl0ZVNwYWNlKGUpe3JldHVybiAzMj09PWV8fDk9PT1lfHwxMz09PWV8fDEwPT09ZX1mdW5jdGlvbiBpc051bWJlckFycmF5KGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/KG51bGw9PT10fHxlLmxlbmd0aD09PXQpJiZlLmV2ZXJ5KChlPT4ibnVtYmVyIj09dHlwZW9mIGUpKTpBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJiEoZSBpbnN0YW5jZW9mIEJpZ0ludDY0QXJyYXl8fGUgaW5zdGFuY2VvZiBCaWdVaW50NjRBcnJheSkmJihudWxsPT09dHx8ZS5sZW5ndGg9PT10KX1mdW5jdGlvbiBsb29rdXBNYXRyaXgoZSx0KXtyZXR1cm4gaXNOdW1iZXJBcnJheShlLDYpP2U6dH1mdW5jdGlvbiBsb29rdXBSZWN0KGUsdCl7cmV0dXJuIGlzTnVtYmVyQXJyYXkoZSw0KT9lOnR9ZnVuY3Rpb24gbG9va3VwTm9ybWFsUmVjdChlLHQpe3JldHVybiBpc051bWJlckFycmF5KGUsNCk/VXRpbC5ub3JtYWxpemVSZWN0KGUpOnR9ZnVuY3Rpb24gcGFyc2VYRkFQYXRoKGUpe2NvbnN0IHQ9LyguKylcWyhcZCspXF0kLztyZXR1cm4gZS5zcGxpdCgiLiIpLm1hcCgoZT0+e2NvbnN0IGE9ZS5tYXRjaCh0KTtyZXR1cm4gYT97bmFtZTphWzFdLHBvczpwYXJzZUludChhWzJdLDEwKX06e25hbWU6ZSxwb3M6MH19KSl9ZnVuY3Rpb24gZXNjYXBlUERGTmFtZShlKXtjb25zdCB0PVtdO2xldCBhPTA7Zm9yKGxldCByPTAsaT1lLmxlbmd0aDtyPGk7cisrKXtjb25zdCBpPWUuY2hhckNvZGVBdChyKTtpZihpPDMzfHxpPjEyNnx8MzU9PT1pfHw0MD09PWl8fDQxPT09aXx8NjA9PT1pfHw2Mj09PWl8fDkxPT09aXx8OTM9PT1pfHwxMjM9PT1pfHwxMjU9PT1pfHw0Nz09PWl8fDM3PT09aSl7YTxyJiZ0LnB1c2goZS5zdWJzdHJpbmcoYSxyKSk7dC5wdXNoKGAjJHtpLnRvU3RyaW5nKDE2KX1gKTthPXIrMX19aWYoMD09PXQubGVuZ3RoKXJldHVybiBlO2E8ZS5sZW5ndGgmJnQucHVzaChlLnN1YnN0cmluZyhhLGUubGVuZ3RoKSk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gZXNjYXBlU3RyaW5nKGUpe3JldHVybiBlLnJlcGxhY2VBbGwoLyhbKClcXFxuXHJdKS9nLChlPT4iXG4iPT09ZT8iXFxuIjoiXHIiPT09ZT8iXFxyIjpgXFwke2V9YCkpfWZ1bmN0aW9uIF9jb2xsZWN0SlMoZSx0LGEscil7aWYoIWUpcmV0dXJuO2xldCBpPW51bGw7aWYoZSBpbnN0YW5jZW9mIFJlZil7aWYoci5oYXMoZSkpcmV0dXJuO2k9ZTtyLnB1dChpKTtlPXQuZmV0Y2goZSl9aWYoQXJyYXkuaXNBcnJheShlKSlmb3IoY29uc3QgaSBvZiBlKV9jb2xsZWN0SlMoaSx0LGEscik7ZWxzZSBpZihlIGluc3RhbmNlb2YgRGljdCl7aWYoaXNOYW1lKGUuZ2V0KCJTIiksIkphdmFTY3JpcHQiKSl7Y29uc3QgdD1lLmdldCgiSlMiKTtsZXQgcjt0IGluc3RhbmNlb2YgQmFzZVN0cmVhbT9yPXQuZ2V0U3RyaW5nKCk6InN0cmluZyI9PXR5cGVvZiB0JiYocj10KTtyJiY9c3RyaW5nVG9QREZTdHJpbmcociwhMCkucmVwbGFjZUFsbCgiXDAiLCIiKTtyJiZhLnB1c2gocil9X2NvbGxlY3RKUyhlLmdldFJhdygiTmV4dCIpLHQsYSxyKX1pJiZyLnJlbW92ZShpKX1mdW5jdGlvbiBjb2xsZWN0QWN0aW9ucyhlLHQsYSl7Y29uc3Qgcj1PYmplY3QuY3JlYXRlKG51bGwpLGk9Z2V0SW5oZXJpdGFibGVQcm9wZXJ0eSh7ZGljdDp0LGtleToiQUEiLHN0b3BXaGVuRm91bmQ6ITF9KTtpZihpKWZvcihsZXQgdD1pLmxlbmd0aC0xO3Q+PTA7dC0tKXtjb25zdCBuPWlbdF07aWYobiBpbnN0YW5jZW9mIERpY3QpZm9yKGNvbnN0IHQgb2Ygbi5nZXRLZXlzKCkpe2NvbnN0IGk9YVt0XTtpZighaSljb250aW51ZTtjb25zdCBzPVtdO19jb2xsZWN0SlMobi5nZXRSYXcodCksZSxzLG5ldyBSZWZTZXQpO3MubGVuZ3RoPjAmJihyW2ldPXMpfX1pZih0LmhhcygiQSIpKXtjb25zdCBhPVtdO19jb2xsZWN0SlModC5nZXQoIkEiKSxlLGEsbmV3IFJlZlNldCk7YS5sZW5ndGg+MCYmKHIuQWN0aW9uPWEpfXJldHVybiBvYmplY3RTaXplKHIpPjA/cjpudWxsfWNvbnN0IE1hPXs2MDoiJmx0OyIsNjI6IiZndDsiLDM4OiImYW1wOyIsMzQ6IiZxdW90OyIsMzk6IiZhcG9zOyJ9O2Z1bmN0aW9uKmNvZGVQb2ludEl0ZXIoZSl7Zm9yKGxldCB0PTAsYT1lLmxlbmd0aDt0PGE7dCsrKXtjb25zdCBhPWUuY29kZVBvaW50QXQodCk7YT41NTI5NSYmKGE8NTczNDR8fGE+NjU1MzMpJiZ0Kys7eWllbGQgYX19ZnVuY3Rpb24gZW5jb2RlVG9YbWxTdHJpbmcoZSl7Y29uc3QgdD1bXTtsZXQgYT0wO2ZvcihsZXQgcj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyl7Y29uc3QgaT1lLmNvZGVQb2ludEF0KHIpO2lmKDMyPD1pJiZpPD0xMjYpe2NvbnN0IG49TWFbaV07aWYobil7YTxyJiZ0LnB1c2goZS5zdWJzdHJpbmcoYSxyKSk7dC5wdXNoKG4pO2E9cisxfX1lbHNle2E8ciYmdC5wdXNoKGUuc3Vic3RyaW5nKGEscikpO3QucHVzaChgJiN4JHtpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfTtgKTtpPjU1Mjk1JiYoaTw1NzM0NHx8aT42NTUzMykmJnIrKzthPXIrMX19aWYoMD09PXQubGVuZ3RoKXJldHVybiBlO2E8ZS5sZW5ndGgmJnQucHVzaChlLnN1YnN0cmluZyhhLGUubGVuZ3RoKSk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gdmFsaWRhdGVGb250TmFtZShlLHQ9ITEpe2NvbnN0IGE9L14oInwnKS4qKCJ8JykkLy5leGVjKGUpO2lmKGEmJmFbMV09PT1hWzJdKXtpZihuZXcgUmVnRXhwKGBbXlxcXFxdJHthWzFdfWApLnRlc3QoZS5zbGljZSgxLC0xKSkpe3QmJndhcm4oYEZvbnRGYW1pbHkgY29udGFpbnMgdW5lc2NhcGVkICR7YVsxXX06ICR7ZX0uYCk7cmV0dXJuITF9fWVsc2UgZm9yKGNvbnN0IGEgb2YgZS5zcGxpdCgvWyBcdF0rLykpaWYoL14oXGR8KC0oXGR8LSkpKS8udGVzdChhKXx8IS9eW1x3LVxcXSskLy50ZXN0KGEpKXt0JiZ3YXJuKGBGb250RmFtaWx5IGNvbnRhaW5zIGludmFsaWQgPGN1c3RvbS1pZGVudD46ICR7ZX0uYCk7cmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gdmFsaWRhdGVDU1NGb250KGUpe2NvbnN0IHQ9bmV3IFNldChbIjEwMCIsIjIwMCIsIjMwMCIsIjQwMCIsIjUwMCIsIjYwMCIsIjcwMCIsIjgwMCIsIjkwMCIsIjEwMDAiLCJub3JtYWwiLCJib2xkIiwiYm9sZGVyIiwibGlnaHRlciJdKSx7Zm9udEZhbWlseTphLGZvbnRXZWlnaHQ6cixpdGFsaWNBbmdsZTppfT1lO2lmKCF2YWxpZGF0ZUZvbnROYW1lKGEsITApKXJldHVybiExO2NvbnN0IG49cj9yLnRvU3RyaW5nKCk6IiI7ZS5mb250V2VpZ2h0PXQuaGFzKG4pP246IjQwMCI7Y29uc3Qgcz1wYXJzZUZsb2F0KGkpO2UuaXRhbGljQW5nbGU9aXNOYU4ocyl8fHM8LTkwfHxzPjkwPyIxNCI6aS50b1N0cmluZygpO3JldHVybiEwfWZ1bmN0aW9uIHJlY292ZXJKc1VSTChlKXtjb25zdCB0PW5ldyBSZWdFeHAoIl5cXHMqKCIrWyJhcHAubGF1bmNoVVJMIiwid2luZG93Lm9wZW4iLCJ4ZmEuaG9zdC5nb3RvVVJMIl0uam9pbigifCIpLnJlcGxhY2VBbGwoIi4iLCJcXC4iKSsiKVxcKCg/Oid8XCIpKFteJ1wiXSopKD86J3xcIikoPzosXFxzKihcXHcrKVxcKXxcXCkpIiwiaSIpLmV4ZWMoZSk7cmV0dXJuIHQ/LlsyXT97dXJsOnRbMl0sbmV3V2luZG93OiJhcHAubGF1bmNoVVJMIj09PXRbMV0mJiJ0cnVlIj09PXRbM119Om51bGx9ZnVuY3Rpb24gbnVtYmVyVG9TdHJpbmcoZSl7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSlyZXR1cm4gZS50b1N0cmluZygpO2NvbnN0IHQ9TWF0aC5yb3VuZCgxMDAqZSk7cmV0dXJuIHQlMTAwPT0wPyh0LzEwMCkudG9TdHJpbmcoKTp0JTEwPT0wP2UudG9GaXhlZCgxKTplLnRvRml4ZWQoMil9ZnVuY3Rpb24gZ2V0TmV3QW5ub3RhdGlvbnNNYXAoZSl7aWYoIWUpcmV0dXJuIG51bGw7Y29uc3QgdD1uZXcgTWFwO2Zvcihjb25zdFthLHJdb2YgZSl7aWYoIWEuc3RhcnRzV2l0aChmKSljb250aW51ZTtsZXQgZT10LmdldChyLnBhZ2VJbmRleCk7aWYoIWUpe2U9W107dC5zZXQoci5wYWdlSW5kZXgsZSl9ZS5wdXNoKHIpfXJldHVybiB0LnNpemU+MD90Om51bGx9ZnVuY3Rpb24gc3RyaW5nVG9Bc2NpaU9yVVRGMTZCRShlKXtyZXR1cm4gZnVuY3Rpb24gaXNBc2NpaShlKXtyZXR1cm4vXltceDAwLVx4N0ZdKiQvLnRlc3QoZSl9KGUpP2U6c3RyaW5nVG9VVEYxNlN0cmluZyhlLCEwKX1mdW5jdGlvbiBzdHJpbmdUb1VURjE2SGV4U3RyaW5nKGUpe2NvbnN0IHQ9W107Zm9yKGxldCBhPTAscj1lLmxlbmd0aDthPHI7YSsrKXtjb25zdCByPWUuY2hhckNvZGVBdChhKTt0LnB1c2goZ2Fbcj4+OCYyNTVdLGdhWzI1NSZyXSl9cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gc3RyaW5nVG9VVEYxNlN0cmluZyhlLHQ9ITEpe2NvbnN0IGE9W107dCYmYS5wdXNoKCLDvsO/Iik7Zm9yKGxldCB0PTAscj1lLmxlbmd0aDt0PHI7dCsrKXtjb25zdCByPWUuY2hhckNvZGVBdCh0KTthLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShyPj44JjI1NSksU3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmcikpfXJldHVybiBhLmpvaW4oIiIpfWZ1bmN0aW9uIGdldFJvdGF0aW9uTWF0cml4KGUsdCxhKXtzd2l0Y2goZSl7Y2FzZSA5MDpyZXR1cm5bMCwxLC0xLDAsdCwwXTtjYXNlIDE4MDpyZXR1cm5bLTEsMCwwLC0xLHQsYV07Y2FzZSAyNzA6cmV0dXJuWzAsLTEsMSwwLDAsYV07ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcm90YXRpb24iKX19ZnVuY3Rpb24gZ2V0U2l6ZUluQnl0ZXMoZSl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmNlaWwoTWF0aC5sb2cyKDErZSkpLzgpfWNsYXNzIFFDTVN7c3RhdGljI2E9bnVsbDtzdGF0aWMgX21lbW9yeT1udWxsO3N0YXRpYyBfbXVzdEFkZEFscGhhPSExO3N0YXRpYyBfZGVzdEJ1ZmZlcj1udWxsO3N0YXRpYyBfZGVzdE9mZnNldD0wO3N0YXRpYyBfZGVzdExlbmd0aD0wO3N0YXRpYyBfY3NzQ29sb3I9IiI7c3RhdGljIF9tYWtlSGV4Q29sb3I9bnVsbDtzdGF0aWMgZ2V0IF9tZW1vcnlBcnJheSgpe2NvbnN0IGU9dGhpcy4jYTtyZXR1cm4gZT8uYnl0ZUxlbmd0aD9lOnRoaXMuI2E9bmV3IFVpbnQ4QXJyYXkodGhpcy5fbWVtb3J5LmJ1ZmZlcil9fWxldCBEYTtjb25zdCBCYT0idW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyP25ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtpZ25vcmVCT006ITAsZmF0YWw6ITB9KTp7ZGVjb2RlOigpPT57dGhyb3cgRXJyb3IoIlRleHREZWNvZGVyIG5vdCBhdmFpbGFibGUiKX19OyJ1bmRlZmluZWQiIT10eXBlb2YgVGV4dERlY29kZXImJkJhLmRlY29kZSgpO2xldCBSYT1udWxsO2Z1bmN0aW9uIGdldFVpbnQ4QXJyYXlNZW1vcnkwKCl7bnVsbCE9PVJhJiYwIT09UmEuYnl0ZUxlbmd0aHx8KFJhPW5ldyBVaW50OEFycmF5KERhLm1lbW9yeS5idWZmZXIpKTtyZXR1cm4gUmF9bGV0IE5hPTA7ZnVuY3Rpb24gcGFzc0FycmF5OFRvV2FzbTAoZSx0KXtjb25zdCBhPXQoMSplLmxlbmd0aCwxKT4+PjA7Z2V0VWludDhBcnJheU1lbW9yeTAoKS5zZXQoZSxhLzEpO05hPWUubGVuZ3RoO3JldHVybiBhfWNvbnN0IEVhPU9iamVjdC5mcmVlemUoe1JHQjg6MCwwOiJSR0I4IixSR0JBODoxLDE6IlJHQkE4IixCR1JBODoyLDI6IkJHUkE4IixHcmF5ODozLDM6IkdyYXk4IixHcmF5QTg6NCw0OiJHcmF5QTgiLENNWUs6NSw1OiJDTVlLIn0pLFBhPU9iamVjdC5mcmVlemUoe1BlcmNlcHR1YWw6MCwwOiJQZXJjZXB0dWFsIixSZWxhdGl2ZUNvbG9yaW1ldHJpYzoxLDE6IlJlbGF0aXZlQ29sb3JpbWV0cmljIixTYXR1cmF0aW9uOjIsMjoiU2F0dXJhdGlvbiIsQWJzb2x1dGVDb2xvcmltZXRyaWM6MywzOiJBYnNvbHV0ZUNvbG9yaW1ldHJpYyJ9KTtmdW5jdGlvbiBfX3diZ19nZXRfaW1wb3J0cygpe2NvbnN0IGU9e3diZzp7fX07ZS53YmcuX193YmdfY29weXJlc3VsdF9iMDhlZTdkMjczZjI5NWRkPWZ1bmN0aW9uKGUsdCl7IWZ1bmN0aW9uIGNvcHlfcmVzdWx0KGUsdCl7Y29uc3R7X211c3RBZGRBbHBoYTphLF9kZXN0QnVmZmVyOnIsX2Rlc3RPZmZzZXQ6aSxfZGVzdExlbmd0aDpuLF9tZW1vcnlBcnJheTpzfT1RQ01TO2lmKHQhPT1uKWlmKGEpZm9yKGxldCBhPWUsbj1lK3Qsbz1pO2E8bjthKz0zLG8rPTQpe3Jbb109c1thXTtyW28rMV09c1thKzFdO3JbbysyXT1zW2ErMl07cltvKzNdPTI1NX1lbHNlIGZvcihsZXQgYT1lLG49ZSt0LG89aTthPG47YSs9MyxvKz00KXtyW29dPXNbYV07cltvKzFdPXNbYSsxXTtyW28rMl09c1thKzJdfWVsc2Ugci5zZXQocy5zdWJhcnJheShlLGUrdCksaSl9KGU+Pj4wLHQ+Pj4wKX07ZS53YmcuX193YmdfY29weXJnYl9kNjBjZTE3YmIwNWQ5YjY3PWZ1bmN0aW9uKGUpeyFmdW5jdGlvbiBjb3B5X3JnYihlKXtjb25zdHtfZGVzdEJ1ZmZlcjp0LF9kZXN0T2Zmc2V0OmEsX21lbW9yeUFycmF5OnJ9PVFDTVM7dFthXT1yW2VdO3RbYSsxXT1yW2UrMV07dFthKzJdPXJbZSsyXX0oZT4+PjApfTtlLndiZy5fX3diZ19tYWtlY3NzUkdCXzg5M2JmMGNkOWZkYjMwMmQ9ZnVuY3Rpb24oZSl7IWZ1bmN0aW9uIG1ha2VfY3NzUkdCKGUpe2NvbnN0e19tZW1vcnlBcnJheTp0fT1RQ01TO1FDTVMuX2Nzc0NvbG9yPVFDTVMuX21ha2VIZXhDb2xvcih0W2VdLHRbZSsxXSx0W2UrMl0pfShlPj4+MCl9O2Uud2JnLl9fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGU9ZnVuY3Rpb24oKXtjb25zdCBlPURhLl9fd2JpbmRnZW5fZXhwb3J0XzAsdD1lLmdyb3coNCk7ZS5zZXQoMCx2b2lkIDApO2Uuc2V0KHQrMCx2b2lkIDApO2Uuc2V0KHQrMSxudWxsKTtlLnNldCh0KzIsITApO2Uuc2V0KHQrMywhMSl9O2Uud2JnLl9fd2JpbmRnZW5fdGhyb3c9ZnVuY3Rpb24oZSx0KXt0aHJvdyBuZXcgRXJyb3IoZnVuY3Rpb24gZ2V0U3RyaW5nRnJvbVdhc20wKGUsdCl7ZT4+Pj0wO3JldHVybiBCYS5kZWNvZGUoZ2V0VWludDhBcnJheU1lbW9yeTAoKS5zdWJhcnJheShlLGUrdCkpfShlLHQpKX07cmV0dXJuIGV9ZnVuY3Rpb24gX193YmdfZmluYWxpemVfaW5pdChlLHQpe0RhPWUuZXhwb3J0cztfX3diZ19pbml0Ll9fd2JpbmRnZW5fd2FzbV9tb2R1bGU9dDtSYT1udWxsO0RhLl9fd2JpbmRnZW5fc3RhcnQoKTtyZXR1cm4gRGF9YXN5bmMgZnVuY3Rpb24gX193YmdfaW5pdChlKXtpZih2b2lkIDAhPT1EYSlyZXR1cm4gRGE7dm9pZCAwIT09ZSYmKE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PU9iamVjdC5wcm90b3R5cGU/KHttb2R1bGVfb3JfcGF0aDplfT1lKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpO2NvbnN0IHQ9X193YmdfZ2V0X2ltcG9ydHMoKTsoInN0cmluZyI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgUmVxdWVzdCYmZSBpbnN0YW5jZW9mIFJlcXVlc3R8fCJmdW5jdGlvbiI9PXR5cGVvZiBVUkwmJmUgaW5zdGFuY2VvZiBVUkwpJiYoZT1mZXRjaChlKSk7Y29uc3R7aW5zdGFuY2U6YSxtb2R1bGU6cn09YXdhaXQgYXN5bmMgZnVuY3Rpb24gX193YmdfbG9hZChlLHQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBSZXNwb25zZSYmZSBpbnN0YW5jZW9mIFJlc3BvbnNlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcpdHJ5e3JldHVybiBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhlLHQpfWNhdGNoKHQpe2lmKCJhcHBsaWNhdGlvbi93YXNtIj09ZS5oZWFkZXJzLmdldCgiQ29udGVudC1UeXBlIikpdGhyb3cgdDtjb25zb2xlLndhcm4oImBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZ2AgZmFpbGVkIGJlY2F1c2UgeW91ciBzZXJ2ZXIgZG9lcyBub3Qgc2VydmUgV2FzbSB3aXRoIGBhcHBsaWNhdGlvbi93YXNtYCBNSU1FIHR5cGUuIEZhbGxpbmcgYmFjayB0byBgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVgIHdoaWNoIGlzIHNsb3dlci4gT3JpZ2luYWwgZXJyb3I6XG4iLHQpfWNvbnN0IGE9YXdhaXQgZS5hcnJheUJ1ZmZlcigpO3JldHVybiBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShhLHQpfXtjb25zdCBhPWF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGUsdCk7cmV0dXJuIGEgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5JbnN0YW5jZT97aW5zdGFuY2U6YSxtb2R1bGU6ZX06YX19KGF3YWl0IGUsdCk7cmV0dXJuIF9fd2JnX2ZpbmFsaXplX2luaXQoYSxyKX1jbGFzcyBDb2xvclNwYWNle3N0YXRpYyNyPW5ldyBVaW50OENsYW1wZWRBcnJheSgzKTtjb25zdHJ1Y3RvcihlLHQpe3RoaXMubmFtZT1lO3RoaXMubnVtQ29tcHM9dH1nZXRSZ2IoZSx0LGE9bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDMpKXt0aGlzLmdldFJnYkl0ZW0oZSx0LGEsMCk7cmV0dXJuIGF9Z2V0UmdiSGV4KGUsdCl7Y29uc3QgYT10aGlzLmdldFJnYihlLHQsQ29sb3JTcGFjZS4jcik7cmV0dXJuIFV0aWwubWFrZUhleENvbG9yKGFbMF0sYVsxXSxhWzJdKX1nZXRSZ2JJdGVtKGUsdCxhLHIpe3VucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JJdGVtIil9Z2V0UmdiQnVmZmVyKGUsdCxhLHIsaSxuLHMpe3VucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgQ29sb3JTcGFjZS5nZXRSZ2JCdWZmZXIiKX1nZXRPdXRwdXRMZW5ndGgoZSx0KXt1bnJlYWNoYWJsZSgiU2hvdWxkIG5vdCBjYWxsIENvbG9yU3BhY2UuZ2V0T3V0cHV0TGVuZ3RoIil9aXNQYXNzdGhyb3VnaChlKXtyZXR1cm4hMX1pc0RlZmF1bHREZWNvZGUoZSx0KXtyZXR1cm4gQ29sb3JTcGFjZS5pc0RlZmF1bHREZWNvZGUoZSx0aGlzLm51bUNvbXBzKX1maWxsUmdiKGUsdCxhLHIsaSxuLHMsbyxjKXtjb25zdCBsPXQqYTtsZXQgaD1udWxsO2NvbnN0IHU9MTw8cyxkPWEhPT1pfHx0IT09cjtpZih0aGlzLmlzUGFzc3Rocm91Z2gocykpaD1vO2Vsc2UgaWYoMT09PXRoaXMubnVtQ29tcHMmJmw+dSYmIkRldmljZUdyYXkiIT09dGhpcy5uYW1lJiYiRGV2aWNlUkdCIiE9PXRoaXMubmFtZSl7Y29uc3QgdD1zPD04P25ldyBVaW50OEFycmF5KHUpOm5ldyBVaW50MTZBcnJheSh1KTtmb3IobGV0IGU9MDtlPHU7ZSsrKXRbZV09ZTtjb25zdCBhPW5ldyBVaW50OENsYW1wZWRBcnJheSgzKnUpO3RoaXMuZ2V0UmdiQnVmZmVyKHQsMCx1LGEsMCxzLDApO2lmKGQpe2g9bmV3IFVpbnQ4QXJyYXkoMypsKTtsZXQgZT0wO2ZvcihsZXQgdD0wO3Q8bDsrK3Qpe2NvbnN0IHI9MypvW3RdO2hbZSsrXT1hW3JdO2hbZSsrXT1hW3IrMV07aFtlKytdPWFbcisyXX19ZWxzZXtsZXQgdD0wO2ZvcihsZXQgcj0wO3I8bDsrK3Ipe2NvbnN0IGk9MypvW3JdO2VbdCsrXT1hW2ldO2VbdCsrXT1hW2krMV07ZVt0KytdPWFbaSsyXTt0Kz1jfX19ZWxzZSBpZihkKXtoPW5ldyBVaW50OENsYW1wZWRBcnJheSgzKmwpO3RoaXMuZ2V0UmdiQnVmZmVyKG8sMCxsLGgsMCxzLDApfWVsc2UgdGhpcy5nZXRSZ2JCdWZmZXIobywwLHIqbixlLDAscyxjKTtpZihoKWlmKGQpIWZ1bmN0aW9uIHJlc2l6ZVJnYkltYWdlKGUsdCxhLHIsaSxuLHMpe3M9MSE9PXM/MDpzO2NvbnN0IG89YS9pLGM9ci9uO2xldCBsLGg9MDtjb25zdCB1PW5ldyBVaW50MTZBcnJheShpKSxkPTMqYTtmb3IobGV0IGU9MDtlPGk7ZSsrKXVbZV09MypNYXRoLmZsb29yKGUqbyk7Zm9yKGxldCBhPTA7YTxuO2ErKyl7Y29uc3Qgcj1NYXRoLmZsb29yKGEqYykqZDtmb3IobGV0IGE9MDthPGk7YSsrKXtsPXIrdVthXTt0W2grK109ZVtsKytdO3RbaCsrXT1lW2wrK107dFtoKytdPWVbbCsrXTtoKz1zfX19KGgsZSx0LGEscixpLGMpO2Vsc2V7bGV0IHQ9MCxhPTA7Zm9yKGxldCBpPTAscz1yKm47aTxzO2krKyl7ZVt0KytdPWhbYSsrXTtlW3QrK109aFthKytdO2VbdCsrXT1oW2ErK107dCs9Y319fWdldCB1c2VzWmVyb1RvT25lUmFuZ2UoKXtyZXR1cm4gc2hhZG93KHRoaXMsInVzZXNaZXJvVG9PbmVSYW5nZSIsITApfXN0YXRpYyBpc0RlZmF1bHREZWNvZGUoZSx0KXtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4hMDtpZigyKnQhPT1lLmxlbmd0aCl7d2FybigiVGhlIGRlY29kZSBtYXAgaXMgbm90IHRoZSBjb3JyZWN0IGxlbmd0aCIpO3JldHVybiEwfWZvcihsZXQgdD0wLGE9ZS5sZW5ndGg7dDxhO3QrPTIpaWYoMCE9PWVbdF18fDEhPT1lW3QrMV0pcmV0dXJuITE7cmV0dXJuITB9fWNsYXNzIEFsdGVybmF0ZUNTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIoIkFsdGVybmF0ZSIsZSk7dGhpcy5iYXNlPXQ7dGhpcy50aW50Rm49YTt0aGlzLnRtcEJ1Zj1uZXcgRmxvYXQzMkFycmF5KHQubnVtQ29tcHMpfWdldFJnYkl0ZW0oZSx0LGEscil7Y29uc3QgaT10aGlzLnRtcEJ1Zjt0aGlzLnRpbnRGbihlLHQsaSwwKTt0aGlzLmJhc2UuZ2V0UmdiSXRlbShpLDAsYSxyKX1nZXRSZ2JCdWZmZXIoZSx0LGEscixpLG4scyl7Y29uc3Qgbz10aGlzLnRpbnRGbixjPXRoaXMuYmFzZSxsPTEvKCgxPDxuKS0xKSxoPWMubnVtQ29tcHMsdT1jLnVzZXNaZXJvVG9PbmVSYW5nZSxkPShjLmlzUGFzc3Rocm91Z2goOCl8fCF1KSYmMD09PXM7bGV0IGY9ZD9pOjA7Y29uc3QgZz1kP3I6bmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGgqYSkscD10aGlzLm51bUNvbXBzLG09bmV3IEZsb2F0MzJBcnJheShwKSxiPW5ldyBGbG9hdDMyQXJyYXkoaCk7bGV0IHksdztmb3IoeT0wO3k8YTt5Kyspe2Zvcih3PTA7dzxwO3crKyltW3ddPWVbdCsrXSpsO28obSwwLGIsMCk7aWYodSlmb3Iodz0wO3c8aDt3KyspZ1tmKytdPTI1NSpiW3ddO2Vsc2V7Yy5nZXRSZ2JJdGVtKGIsMCxnLGYpO2YrPWh9fWR8fGMuZ2V0UmdiQnVmZmVyKGcsMCxhLHIsaSw4LHMpfWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGUqdGhpcy5iYXNlLm51bUNvbXBzL3RoaXMubnVtQ29tcHMsdCl9fWNsYXNzIFBhdHRlcm5DUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoZSl7c3VwZXIoIlBhdHRlcm4iLG51bGwpO3RoaXMuYmFzZT1lfWlzRGVmYXVsdERlY29kZShlLHQpe3VucmVhY2hhYmxlKCJTaG91bGQgbm90IGNhbGwgUGF0dGVybkNTLmlzRGVmYXVsdERlY29kZSIpfX1jbGFzcyBJbmRleGVkQ1MgZXh0ZW5kcyBDb2xvclNwYWNle2NvbnN0cnVjdG9yKGUsdCxhKXtzdXBlcigiSW5kZXhlZCIsMSk7dGhpcy5iYXNlPWU7dGhpcy5oaWdoVmFsPXQ7Y29uc3Qgcj1lLm51bUNvbXBzKih0KzEpO3RoaXMubG9va3VwPW5ldyBVaW50OEFycmF5KHIpO2lmKGEgaW5zdGFuY2VvZiBCYXNlU3RyZWFtKXtjb25zdCBlPWEuZ2V0Qnl0ZXMocik7dGhpcy5sb29rdXAuc2V0KGUpfWVsc2V7aWYoInN0cmluZyIhPXR5cGVvZiBhKXRocm93IG5ldyBGb3JtYXRFcnJvcihgSW5kZXhlZENTIC0gdW5yZWNvZ25pemVkIGxvb2t1cCB0YWJsZTogJHthfWApO2ZvcihsZXQgZT0wO2U8cjsrK2UpdGhpcy5sb29rdXBbZV09MjU1JmEuY2hhckNvZGVBdChlKX19Z2V0UmdiSXRlbShlLHQsYSxyKXtjb25zdHtiYXNlOmksaGlnaFZhbDpuLGxvb2t1cDpzfT10aGlzLG89TWF0aENsYW1wKE1hdGgucm91bmQoZVt0XSksMCxuKSppLm51bUNvbXBzO2kuZ2V0UmdiQnVmZmVyKHMsbywxLGEsciw4LDApfWdldFJnYkJ1ZmZlcihlLHQsYSxyLGksbixzKXtjb25zdHtiYXNlOm8saGlnaFZhbDpjLGxvb2t1cDpsfT10aGlzLHtudW1Db21wczpofT1vLHU9by5nZXRPdXRwdXRMZW5ndGgoaCxzKTtmb3IobGV0IG49MDtuPGE7KytuKXtjb25zdCBhPU1hdGhDbGFtcChNYXRoLnJvdW5kKGVbdCsrXSksMCxjKSpoO28uZ2V0UmdiQnVmZmVyKGwsYSwxLHIsaSw4LHMpO2krPXV9fWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiB0aGlzLmJhc2UuZ2V0T3V0cHV0TGVuZ3RoKGUqdGhpcy5iYXNlLm51bUNvbXBzLHQpfWlzRGVmYXVsdERlY29kZShlLHQpe2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiEwO2lmKDIhPT1lLmxlbmd0aCl7d2FybigiRGVjb2RlIG1hcCBsZW5ndGggaXMgbm90IGNvcnJlY3QiKTtyZXR1cm4hMH1pZighTnVtYmVyLmlzSW50ZWdlcih0KXx8dDwxKXt3YXJuKCJCaXRzIHBlciBjb21wb25lbnQgaXMgbm90IGNvcnJlY3QiKTtyZXR1cm4hMH1yZXR1cm4gMD09PWVbMF0mJmVbMV09PT0oMTw8dCktMX19Y2xhc3MgRGV2aWNlR3JheUNTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCJEZXZpY2VHcmF5IiwxKX1nZXRSZ2JJdGVtKGUsdCxhLHIpe2NvbnN0IGk9MjU1KmVbdF07YVtyXT1hW3IrMV09YVtyKzJdPWl9Z2V0UmdiQnVmZmVyKGUsdCxhLHIsaSxuLHMpe2NvbnN0IG89MjU1LygoMTw8biktMSk7bGV0IGM9dCxsPWk7Zm9yKGxldCB0PTA7dDxhOysrdCl7Y29uc3QgdD1vKmVbYysrXTtyW2wrK109dDtyW2wrK109dDtyW2wrK109dDtsKz1zfX1nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gZSooMyt0KX19Y2xhc3MgRGV2aWNlUmdiQ1MgZXh0ZW5kcyBDb2xvclNwYWNle2NvbnN0cnVjdG9yKCl7c3VwZXIoIkRldmljZVJHQiIsMyl9Z2V0UmdiSXRlbShlLHQsYSxyKXthW3JdPTI1NSplW3RdO2FbcisxXT0yNTUqZVt0KzFdO2FbcisyXT0yNTUqZVt0KzJdfWdldFJnYkJ1ZmZlcihlLHQsYSxyLGksbixzKXtpZig4PT09biYmMD09PXMpe3Iuc2V0KGUuc3ViYXJyYXkodCx0KzMqYSksaSk7cmV0dXJufWNvbnN0IG89MjU1LygoMTw8biktMSk7bGV0IGM9dCxsPWk7Zm9yKGxldCB0PTA7dDxhOysrdCl7cltsKytdPW8qZVtjKytdO3JbbCsrXT1vKmVbYysrXTtyW2wrK109byplW2MrK107bCs9c319Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCkvM3wwfWlzUGFzc3Rocm91Z2goZSl7cmV0dXJuIDg9PT1lfX1jbGFzcyBEZXZpY2VSZ2JhQ1MgZXh0ZW5kcyBDb2xvclNwYWNle2NvbnN0cnVjdG9yKCl7c3VwZXIoIkRldmljZVJHQkEiLDQpfWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiA0KmV9aXNQYXNzdGhyb3VnaChlKXtyZXR1cm4gOD09PWV9ZmlsbFJnYihlLHQsYSxyLGksbixzLG8sYyl7YSE9PWl8fHQhPT1yP2Z1bmN0aW9uIHJlc2l6ZVJnYmFJbWFnZShlLHQsYSxyLGksbixzKXtjb25zdCBvPWEvaSxjPXIvbjtsZXQgbD0wO2NvbnN0IGg9bmV3IFVpbnQxNkFycmF5KGkpO2lmKDE9PT1zKXtmb3IobGV0IGU9MDtlPGk7ZSsrKWhbZV09TWF0aC5mbG9vcihlKm8pO2NvbnN0IHI9bmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyKSxzPW5ldyBVaW50MzJBcnJheSh0LmJ1ZmZlciksdT1GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbj8xNjc3NzIxNTo0Mjk0OTY3MDQwO2ZvcihsZXQgZT0wO2U8bjtlKyspe2NvbnN0IHQ9ci5zdWJhcnJheShNYXRoLmZsb29yKGUqYykqYSk7Zm9yKGxldCBlPTA7ZTxpO2UrKylzW2wrK118PXRbaFtlXV0mdX19ZWxzZXtjb25zdCByPTQscz1hKnI7Zm9yKGxldCBlPTA7ZTxpO2UrKyloW2VdPU1hdGguZmxvb3IoZSpvKSpyO2ZvcihsZXQgYT0wO2E8bjthKyspe2NvbnN0IHI9ZS5zdWJhcnJheShNYXRoLmZsb29yKGEqYykqcyk7Zm9yKGxldCBlPTA7ZTxpO2UrKyl7Y29uc3QgYT1oW2VdO3RbbCsrXT1yW2FdO3RbbCsrXT1yW2ErMV07dFtsKytdPXJbYSsyXX19fX0obyxlLHQsYSxyLGksYyk6ZnVuY3Rpb24gY29weVJnYmFJbWFnZShlLHQsYSl7aWYoMT09PWEpe2NvbnN0IGE9bmV3IFVpbnQzMkFycmF5KGUuYnVmZmVyKSxyPW5ldyBVaW50MzJBcnJheSh0LmJ1ZmZlciksaT1GZWF0dXJlVGVzdC5pc0xpdHRsZUVuZGlhbj8xNjc3NzIxNTo0Mjk0OTY3MDQwO2ZvcihsZXQgZT0wLHQ9YS5sZW5ndGg7ZTx0O2UrKylyW2VdfD1hW2VdJml9ZWxzZXtsZXQgYT0wO2ZvcihsZXQgcj0wLGk9ZS5sZW5ndGg7cjxpO3IrPTQpe3RbYSsrXT1lW3JdO3RbYSsrXT1lW3IrMV07dFthKytdPWVbcisyXX19fShvLGUsYyl9fWNsYXNzIERldmljZUNteWtDUyBleHRlbmRzIENvbG9yU3BhY2V7Y29uc3RydWN0b3IoKXtzdXBlcigiRGV2aWNlQ01ZSyIsNCl9I2koZSx0LGEscixpKXtjb25zdCBuPWVbdF0qYSxzPWVbdCsxXSphLG89ZVt0KzJdKmEsYz1lW3QrM10qYTtyW2ldPTI1NStuKigtNC4zODczMzIzODQ2MDk5ODgqbis1NC40ODYxNTE5NDE4OTE3NipzKzE4LjgyMjkwNTAyMTY1MzAyKm8rMjEyLjI1NjYyNDUxNjM5NTg1KmMtMjg1LjIzMzEwMjYxMzcwMDQpK3MqKDEuNzE0OTc2MzQ3NzM2MjEzNCpzLTUuNjA5NjczNjkwNDA0NzMxNSpvKy0xNy44NzM4NzA4NjE0MTU0NDQqYy01LjQ5NzAwNjQyNzE5NjM2NikrbyooLTIuNTIxNzM0MDEzMTY4MzAzMypvLTIxLjI0ODkyMzMzNzM1MzA3MypjKzE3LjUxMTkyNzA4NDE4MTMpK2MqKC0yMS44NjEyMjE0NzQ2MzYwNSpjLTE4OS40ODE4MDgzNTkyMjc0Nyk7cltpKzFdPTI1NStuKig4Ljg0MTA0MTQyMjAzNjE0OSpuKzYwLjExODAyNzA0NTU5NzM2NipzKzYuODcxNDI1NTkyMDQ5MDA3Km8rMzEuMTU5MTAwMTMwMDU1OTIyKmMtNzkuMjk3MDg0NDgxNjU0OCkrcyooLTE1LjMxMDM2MTMwNjk2NzgxNypzKzE3LjU3NTI1MTI2MTEwOTQ4MipvKzEzMS4zNTI1MDkxMjQ5Mzk3NipjLTE5MC45NDUzMzAyNTg4OTUxKStvKig0LjQ0NDMzOTEwMjg1MjczOSpvKzkuODYzMjg2MTQ5MzQwNSpjLTI0Ljg2NzQxNTgyNTU1ODc4KStjKigtMjAuNzM3MzI1NDcxMTgxMDM0KmMtMTg3LjgwNDUzNzA5NzE5NTc4KTtyW2krMl09MjU1K24qKC44ODQyNTIyNDMwMDAzMjk2Km4rOC4wNzg2Nzc1MDMxMTI5MjgqcyszMC44OTk3ODMwOTcwMzcyOSpvLS4yMzg4MzIzODY4OTE3ODkzNCpjLTE0LjE4MzU3Njc5OTY3MzI4NikrcyooMTAuNDk1OTMyNzM0MzIwNzIqcys2My4wMjM3ODQ5NDc1NDA1MipvKzUwLjYwNjk1NzY1NjM2MDczNCpjLTExMi4yMzg4NDI1MzcxOTI0OCkrbyooLjAzMjk2MDQxMTE0ODczMjE3Km8rMTE1LjYwMzg0NDQ5NjQ2NjQxKmMtMTkzLjU4MjA5MzU2ODYxNTA1KStjKigtMjIuMzM4MTY4MDczMDk4ODYqYy0xODAuMTI2MTM5NzQ3MDgzNjcpfWdldFJnYkl0ZW0oZSx0LGEscil7dGhpcy4jaShlLHQsMSxhLHIpfWdldFJnYkJ1ZmZlcihlLHQsYSxyLGksbixzKXtjb25zdCBvPTEvKCgxPDxuKS0xKTtmb3IobGV0IG49MDtuPGE7bisrKXt0aGlzLiNpKGUsdCxvLHIsaSk7dCs9NDtpKz0zK3N9fWdldE91dHB1dExlbmd0aChlLHQpe3JldHVybiBlLzQqKDMrdCl8MH19Y2xhc3MgQ2FsR3JheUNTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIoIkNhbEdyYXkiLDEpO2lmKCFlKXRocm93IG5ldyBGb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbEdyYXkiKTtbdGhpcy5YVyx0aGlzLllXLHRoaXMuWlddPWU7W3RoaXMuWEIsdGhpcy5ZQix0aGlzLlpCXT10fHxbMCwwLDBdO3RoaXMuRz1hfHwxO2lmKHRoaXMuWFc8MHx8dGhpcy5aVzwwfHwxIT09dGhpcy5ZVyl0aHJvdyBuZXcgRm9ybWF0RXJyb3IoYEludmFsaWQgV2hpdGVQb2ludCBjb21wb25lbnRzIGZvciAke3RoaXMubmFtZX0sIG5vIGZhbGxiYWNrIGF2YWlsYWJsZWApO2lmKHRoaXMuWEI8MHx8dGhpcy5ZQjwwfHx0aGlzLlpCPDApe2luZm8oYEludmFsaWQgQmxhY2tQb2ludCBmb3IgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTt0aGlzLlhCPXRoaXMuWUI9dGhpcy5aQj0wfTA9PT10aGlzLlhCJiYwPT09dGhpcy5ZQiYmMD09PXRoaXMuWkJ8fHdhcm4oYCR7dGhpcy5uYW1lfSwgQmxhY2tQb2ludDogWEI6ICR7dGhpcy5YQn0sIFlCOiAke3RoaXMuWUJ9LCBaQjogJHt0aGlzLlpCfSwgb25seSBkZWZhdWx0IHZhbHVlcyBhcmUgc3VwcG9ydGVkLmApO2lmKHRoaXMuRzwxKXtpbmZvKGBJbnZhbGlkIEdhbW1hOiAke3RoaXMuR30gZm9yICR7dGhpcy5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQuYCk7dGhpcy5HPTF9fSNpKGUsdCxhLHIsaSl7Y29uc3Qgbj0oZVt0XSppKSoqdGhpcy5HLHM9dGhpcy5ZVypuLG89TWF0aC5tYXgoMjk1LjgqcyoqLjMzMzMzMzMzMzMzMzMzMzMtNDAuOCwwKTthW3JdPW87YVtyKzFdPW87YVtyKzJdPW99Z2V0UmdiSXRlbShlLHQsYSxyKXt0aGlzLiNpKGUsdCxhLHIsMSl9Z2V0UmdiQnVmZmVyKGUsdCxhLHIsaSxuLHMpe2NvbnN0IG89MS8oKDE8PG4pLTEpO2ZvcihsZXQgbj0wO248YTsrK24pe3RoaXMuI2koZSx0LHIsaSxvKTt0Kz0xO2krPTMrc319Z2V0T3V0cHV0TGVuZ3RoKGUsdCl7cmV0dXJuIGUqKDMrdCl9fWNsYXNzIENhbFJHQkNTIGV4dGVuZHMgQ29sb3JTcGFjZXtzdGF0aWMjbj1uZXcgRmxvYXQzMkFycmF5KFsuODk1MSwuMjY2NCwtLjE2MTQsLS43NTAyLDEuNzEzNSwuMDM2NywuMDM4OSwtLjA2ODUsMS4wMjk2XSk7c3RhdGljI3M9bmV3IEZsb2F0MzJBcnJheShbLjk4Njk5MjksLS4xNDcwNTQzLC4xNTk5NjI3LC40MzIzMDUzLC41MTgzNjAzLC4wNDkyOTEyLC0uMDA4NTI4NywuMDQwMDQyOCwuOTY4NDg2N10pO3N0YXRpYyNvPW5ldyBGbG9hdDMyQXJyYXkoWzMuMjQwNDU0MiwtMS41MzcxMzg1LC0uNDk4NTMxNCwtLjk2OTI2NiwxLjg3NjAxMDgsLjA0MTU1NiwuMDU1NjQzNCwtLjIwNDAyNTksMS4wNTcyMjUyXSk7c3RhdGljI2M9bmV3IEZsb2F0MzJBcnJheShbMSwxLDFdKTtzdGF0aWMjbD1uZXcgRmxvYXQzMkFycmF5KDMpO3N0YXRpYyNoPW5ldyBGbG9hdDMyQXJyYXkoMyk7c3RhdGljI3U9bmV3IEZsb2F0MzJBcnJheSgzKTtzdGF0aWMjZD0oMjQvMTE2KSoqMy84O2NvbnN0cnVjdG9yKGUsdCxhLHIpe3N1cGVyKCJDYWxSR0IiLDMpO2lmKCFlKXRocm93IG5ldyBGb3JtYXRFcnJvcigiV2hpdGVQb2ludCBtaXNzaW5nIC0gcmVxdWlyZWQgZm9yIGNvbG9yIHNwYWNlIENhbFJHQiIpO2NvbnN0W2ksbixzXT10aGlzLndoaXRlUG9pbnQ9ZSxbbyxjLGxdPXRoaXMuYmxhY2tQb2ludD10fHxuZXcgRmxvYXQzMkFycmF5KDMpO1t0aGlzLkdSLHRoaXMuR0csdGhpcy5HQl09YXx8bmV3IEZsb2F0MzJBcnJheShbMSwxLDFdKTtbdGhpcy5NWEEsdGhpcy5NWUEsdGhpcy5NWkEsdGhpcy5NWEIsdGhpcy5NWUIsdGhpcy5NWkIsdGhpcy5NWEMsdGhpcy5NWUMsdGhpcy5NWkNdPXJ8fG5ldyBGbG9hdDMyQXJyYXkoWzEsMCwwLDAsMSwwLDAsMCwxXSk7aWYoaTwwfHxzPDB8fDEhPT1uKXRocm93IG5ldyBGb3JtYXRFcnJvcihgSW52YWxpZCBXaGl0ZVBvaW50IGNvbXBvbmVudHMgZm9yICR7dGhpcy5uYW1lfSwgbm8gZmFsbGJhY2sgYXZhaWxhYmxlYCk7aWYobzwwfHxjPDB8fGw8MCl7aW5mbyhgSW52YWxpZCBCbGFja1BvaW50IGZvciAke3RoaXMubmFtZX0gWyR7b30sICR7Y30sICR7bH1dLCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTt0aGlzLmJsYWNrUG9pbnQ9bmV3IEZsb2F0MzJBcnJheSgzKX1pZih0aGlzLkdSPDB8fHRoaXMuR0c8MHx8dGhpcy5HQjwwKXtpbmZvKGBJbnZhbGlkIEdhbW1hIFske3RoaXMuR1J9LCAke3RoaXMuR0d9LCAke3RoaXMuR0J9XSBmb3IgJHt0aGlzLm5hbWV9LCBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdC5gKTt0aGlzLkdSPXRoaXMuR0c9dGhpcy5HQj0xfX0jZihlLHQsYSl7YVswXT1lWzBdKnRbMF0rZVsxXSp0WzFdK2VbMl0qdFsyXTthWzFdPWVbM10qdFswXStlWzRdKnRbMV0rZVs1XSp0WzJdO2FbMl09ZVs2XSp0WzBdK2VbN10qdFsxXStlWzhdKnRbMl19I2coZSx0LGEpe2FbMF09MSp0WzBdL2VbMF07YVsxXT0xKnRbMV0vZVsxXTthWzJdPTEqdFsyXS9lWzJdfSNwKGUsdCxhKXthWzBdPS45NTA0Nyp0WzBdL2VbMF07YVsxXT0xKnRbMV0vZVsxXTthWzJdPTEuMDg4ODMqdFsyXS9lWzJdfSNtKGUpe3JldHVybiBlPD0uMDAzMTMwOD9NYXRoQ2xhbXAoMTIuOTIqZSwwLDEpOmU+PS45OTU1NDUyNT8xOk1hdGhDbGFtcCgxLjA1NSplKiooMS8yLjQpLS4wNTUsMCwxKX0jYihlKXtyZXR1cm4gZTwwPy10aGlzLiNiKC1lKTplPjg/KChlKzE2KS8xMTYpKiozOmUqQ2FsUkdCQ1MuI2R9I3koZSx0LGEpe2lmKDA9PT1lWzBdJiYwPT09ZVsxXSYmMD09PWVbMl0pe2FbMF09dFswXTthWzFdPXRbMV07YVsyXT10WzJdO3JldHVybn1jb25zdCByPXRoaXMuI2IoMCksaT0oMS1yKS8oMS10aGlzLiNiKGVbMF0pKSxuPTEtaSxzPSgxLXIpLygxLXRoaXMuI2IoZVsxXSkpLG89MS1zLGM9KDEtcikvKDEtdGhpcy4jYihlWzJdKSksbD0xLWM7YVswXT10WzBdKmkrbjthWzFdPXRbMV0qcytvO2FbMl09dFsyXSpjK2x9I3coZSx0LGEpe2lmKDE9PT1lWzBdJiYxPT09ZVsyXSl7YVswXT10WzBdO2FbMV09dFsxXTthWzJdPXRbMl07cmV0dXJufWNvbnN0IHI9YTt0aGlzLiNmKENhbFJHQkNTLiNuLHQscik7Y29uc3QgaT1DYWxSR0JDUy4jbDt0aGlzLiNnKGUscixpKTt0aGlzLiNmKENhbFJHQkNTLiNzLGksYSl9I3goZSx0LGEpe2NvbnN0IHI9YTt0aGlzLiNmKENhbFJHQkNTLiNuLHQscik7Y29uc3QgaT1DYWxSR0JDUy4jbDt0aGlzLiNwKGUscixpKTt0aGlzLiNmKENhbFJHQkNTLiNzLGksYSl9I2koZSx0LGEscixpKXtjb25zdCBuPU1hdGhDbGFtcChlW3RdKmksMCwxKSxzPU1hdGhDbGFtcChlW3QrMV0qaSwwLDEpLG89TWF0aENsYW1wKGVbdCsyXSppLDAsMSksYz0xPT09bj8xOm4qKnRoaXMuR1IsbD0xPT09cz8xOnMqKnRoaXMuR0csaD0xPT09bz8xOm8qKnRoaXMuR0IsdT10aGlzLk1YQSpjK3RoaXMuTVhCKmwrdGhpcy5NWEMqaCxkPXRoaXMuTVlBKmMrdGhpcy5NWUIqbCt0aGlzLk1ZQypoLGY9dGhpcy5NWkEqYyt0aGlzLk1aQipsK3RoaXMuTVpDKmgsZz1DYWxSR0JDUy4jaDtnWzBdPXU7Z1sxXT1kO2dbMl09Zjtjb25zdCBwPUNhbFJHQkNTLiN1O3RoaXMuI3codGhpcy53aGl0ZVBvaW50LGcscCk7Y29uc3QgbT1DYWxSR0JDUy4jaDt0aGlzLiN5KHRoaXMuYmxhY2tQb2ludCxwLG0pO2NvbnN0IGI9Q2FsUkdCQ1MuI3U7dGhpcy4jeChDYWxSR0JDUy4jYyxtLGIpO2NvbnN0IHk9Q2FsUkdCQ1MuI2g7dGhpcy4jZihDYWxSR0JDUy4jbyxiLHkpO2Fbcl09MjU1KnRoaXMuI20oeVswXSk7YVtyKzFdPTI1NSp0aGlzLiNtKHlbMV0pO2FbcisyXT0yNTUqdGhpcy4jbSh5WzJdKX1nZXRSZ2JJdGVtKGUsdCxhLHIpe3RoaXMuI2koZSx0LGEsciwxKX1nZXRSZ2JCdWZmZXIoZSx0LGEscixpLG4scyl7Y29uc3Qgbz0xLygoMTw8biktMSk7Zm9yKGxldCBuPTA7bjxhOysrbil7dGhpcy4jaShlLHQscixpLG8pO3QrPTM7aSs9MytzfX1nZXRPdXRwdXRMZW5ndGgoZSx0KXtyZXR1cm4gZSooMyt0KS8zfDB9fWNsYXNzIExhYkNTIGV4dGVuZHMgQ29sb3JTcGFjZXtjb25zdHJ1Y3RvcihlLHQsYSl7c3VwZXIoIkxhYiIsMyk7aWYoIWUpdGhyb3cgbmV3IEZvcm1hdEVycm9yKCJXaGl0ZVBvaW50IG1pc3NpbmcgLSByZXF1aXJlZCBmb3IgY29sb3Igc3BhY2UgTGFiIik7W3RoaXMuWFcsdGhpcy5ZVyx0aGlzLlpXXT1lO1t0aGlzLmFtaW4sdGhpcy5hbWF4LHRoaXMuYm1pbix0aGlzLmJtYXhdPWF8fFstMTAwLDEwMCwtMTAwLDEwMF07W3Roa